From afbaf25abf1eee38560f71d920f0ab9afbdd7464 Mon Sep 17 00:00:00 2001 From: Bjerg Date: Tue, 22 Aug 2023 16:54:59 +0200 Subject: [PATCH 001/387] clients/reth: adding reth client definition (#717) Co-authored-by: Georgios Konstantopoulos Co-authored-by: Dan Cline <6798349+Rjected@users.noreply.github.com> Co-authored-by: Matthias Seitz --- clients/reth/Dockerfile | 28 +++++++ clients/reth/enode.sh | 8 ++ clients/reth/genesis.json | 15 ++++ clients/reth/mapper.jq | 59 ++++++++++++++ clients/reth/reth.sh | 162 ++++++++++++++++++++++++++++++++++++++ 5 files changed, 272 insertions(+) create mode 100644 clients/reth/Dockerfile create mode 100644 clients/reth/enode.sh create mode 100644 clients/reth/genesis.json create mode 100644 clients/reth/mapper.jq create mode 100644 clients/reth/reth.sh diff --git a/clients/reth/Dockerfile b/clients/reth/Dockerfile new file mode 100644 index 0000000000..27c0789474 --- /dev/null +++ b/clients/reth/Dockerfile @@ -0,0 +1,28 @@ +ARG baseimage=paradigmxyz/reth +ARG tag=main + +FROM $baseimage:$tag as builder + +# Install script tools. +RUN apt-get update -y +RUN apt-get install -y bash curl jq + +# Add genesis mapper script. +ADD genesis.json /genesis.json +ADD mapper.jq /mapper.jq + +# Add the startup script. +ADD reth.sh /reth.sh +RUN chmod +x /reth.sh + +# Add the enode URL retriever script. +ADD enode.sh /hive-bin/enode.sh +RUN chmod +x /hive-bin/enode.sh + +# Create version.txt +RUN /usr/local/bin/reth --version | sed -e 's/reth \(.*\)/\1/' > /version.txt + +# Export the usual networking ports to allow outside access to the node. +EXPOSE 8545 8546 30303 30303/udp + +ENTRYPOINT ["/reth.sh"] diff --git a/clients/reth/enode.sh b/clients/reth/enode.sh new file mode 100644 index 0000000000..489756f280 --- /dev/null +++ b/clients/reth/enode.sh @@ -0,0 +1,8 @@ +#!/bin/bash + +set -e + +TARGET_RESPONSE=$(curl -s -X POST -H "Content-Type: application/json" --data '{"jsonrpc":"2.0","method":"admin_nodeInfo","params":[],"id":1}' "127.0.0.1:8545" ) +TARGET_ENODE=$(echo ${TARGET_RESPONSE}| jq -r '.result.enode') + +echo "$TARGET_ENODE" diff --git a/clients/reth/genesis.json b/clients/reth/genesis.json new file mode 100644 index 0000000000..7ca6f39f73 --- /dev/null +++ b/clients/reth/genesis.json @@ -0,0 +1,15 @@ +{ + "coinbase" : "0x8888f1f195afa192cfee860698584c030f4c9db1", + "difficulty" : "0x020000", + "extraData" : "0x42", + "gasLimit" : "0x2fefd8", + "mixHash" : "0x2c85bcbce56429100b2108254bb56906257582aeafcbd682bc9af67a9f5aee46", + "nonce" : "0x78cc16f7b4f65485", + "parentHash" : "0x0000000000000000000000000000000000000000000000000000000000000000", + "timestamp" : "0x54c98c81", + "alloc" : { + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b": { + "balance" : "0x09184e72a000" + } + } +} diff --git a/clients/reth/mapper.jq b/clients/reth/mapper.jq new file mode 100644 index 0000000000..858223a2af --- /dev/null +++ b/clients/reth/mapper.jq @@ -0,0 +1,59 @@ +# Removes all empty keys and values in input. +def remove_empty: + . | walk( + if type == "object" then + with_entries( + select( + .value != null and + .value != "" and + .value != [] and + .key != null and + .key != "" + ) + ) + else . + end + ) +; + +# Converts decimal string to number. +def to_int: + if . == null then . else .|tonumber end +; + +# Converts "1" / "0" to boolean. +def to_bool: + if . == null then . else + if . == "1" then true else false end + end +; + +# Replace config in input. +. + { + "config": { + "ethash": (if env.HIVE_CLIQUE_PERIOD then null else {} end), + "clique": (if env.HIVE_CLIQUE_PERIOD == null then null else { + "period": env.HIVE_CLIQUE_PERIOD|to_int, + } end), + "chainId": (if env.HIVE_CHAIN_ID == null then 1 else env.HIVE_CHAIN_ID|to_int end), + "homesteadBlock": env.HIVE_FORK_HOMESTEAD|to_int, + "daoForkBlock": env.HIVE_FORK_DAO_BLOCK|to_int, + "daoForkSupport": env.HIVE_FORK_DAO_VOTE|to_bool, + "eip150Block": env.HIVE_FORK_TANGERINE|to_int, + "eip150Hash": env.HIVE_FORK_TANGERINE_HASH, + "eip155Block": env.HIVE_FORK_SPURIOUS|to_int, + "eip158Block": env.HIVE_FORK_SPURIOUS|to_int, + "byzantiumBlock": env.HIVE_FORK_BYZANTIUM|to_int, + "constantinopleBlock": env.HIVE_FORK_CONSTANTINOPLE|to_int, + "petersburgBlock": env.HIVE_FORK_PETERSBURG|to_int, + "istanbulBlock": env.HIVE_FORK_ISTANBUL|to_int, + "muirGlacierBlock": env.HIVE_FORK_MUIR_GLACIER|to_int, + "berlinBlock": env.HIVE_FORK_BERLIN|to_int, + "londonBlock": env.HIVE_FORK_LONDON|to_int, + "arrowGlacierBlock": env.HIVE_FORK_ARROW_GLACIER|to_int, + "grayGlacierBlock": env.HIVE_FORK_GRAY_GLACIER|to_int, + "terminalTotalDifficulty": env.HIVE_TERMINAL_TOTAL_DIFFICULTY|to_int, + "terminalTotalDifficultyPassed": env.HIVE_TERMINAL_TOTAL_DIFFICULTY_PASSED|to_bool, + "shanghaiTime": env.HIVE_SHANGHAI_TIMESTAMP|to_int, + }|remove_empty +} diff --git a/clients/reth/reth.sh b/clients/reth/reth.sh new file mode 100644 index 0000000000..1a4d092205 --- /dev/null +++ b/clients/reth/reth.sh @@ -0,0 +1,162 @@ +#!/bin/bash + +# Startup script to initialize and boot a reth instance. +# +# This script assumes the following files: +# - `reth` binary is located in the filesystem root +# - `genesis.json` file is located in the filesystem root (mandatory) +# - `chain.rlp` file is located in the filesystem root (optional) +# - `blocks` folder is located in the filesystem root (optional) +# +# This script can be configured using the following environment variables: +# +# - HIVE_BOOTNODE enode URL of the remote bootstrap node +# - HIVE_NETWORK_ID network ID number to use for the eth protocol +# - HIVE_FORK_HOMESTEAD block number of the homestead transition +# - HIVE_FORK_DAO_BLOCK block number of the DAO hard-fork transition +# - HIVE_FORK_TANGERINE block number of TangerineWhistle +# - HIVE_FORK_SPURIOUS block number of SpuriousDragon +# - HIVE_FORK_BYZANTIUM block number for Byzantium transition +# - HIVE_FORK_CONSTANTINOPLE block number for Constantinople transition +# - HIVE_FORK_PETERSBURG block number for ConstantinopleFix/Petersburg transition +# - HIVE_FORK_ISTANBUL block number for Istanbul transition +# - HIVE_FORK_MUIR_GLACIER block number for MuirGlacier transition +# - HIVE_LOGLEVEL client log level +# +# These flags are NOT supported by reth +# +# - HIVE_TESTNET whether testnet nonces (2^20) are needed +# - HIVE_GRAPHQL_ENABLED turns on GraphQL server +# - HIVE_CLIQUE_PRIVATEKEY private key for clique mining +# - HIVE_NODETYPE sync and pruning selector (archive, full, light) +# - HIVE_SKIP_POW If set, skip PoW verification during block import +# - HIVE_MINER address to credit with mining rewards +# - HIVE_MINER_EXTRA extra-data field to set for newly minted blocks + +# Immediately abort the script on any error encountered +set -ex + +# no ansi colors +export RUST_LOG_STYLE=never + +reth=/usr/local/bin/reth + +case "$HIVE_LOGLEVEL" in + 0|1) FLAGS="$FLAGS -v" ;; + 2) FLAGS="$FLAGS -vv" ;; + 3) FLAGS="$FLAGS -vvv" ;; + 4) FLAGS="$FLAGS -vvvv" ;; + 5) FLAGS="$FLAGS -vvvvv" ;; +esac + +# Create the data directory. +mkdir /reth-hive-datadir +FLAGS="$FLAGS --datadir /reth-hive-datadir" + +# TODO If a specific network ID is requested, use that +#if [ "$HIVE_NETWORK_ID" != "" ]; then +# FLAGS="$FLAGS --networkid $HIVE_NETWORK_ID" +#else +# FLAGS="$FLAGS --networkid 1337" +#fi + +# Configure the chain. +mv /genesis.json /genesis-input.json +jq -f /mapper.jq /genesis-input.json > /genesis.json + +# Dump genesis +echo "Supplied genesis state:" +cat /genesis.json + +echo "Command flags till now:" +echo $FLAGS + +# Initialize the local testchain with the genesis state +echo "Initializing database with genesis state..." +$reth init $FLAGS --chain /genesis.json + +# make sure we use the same genesis each time +FLAGS="$FLAGS --chain /genesis.json" + +# Don't immediately abort, some imports are meant to fail +set +ex + +# Load the test chain if present +echo "Loading initial blockchain..." +if [ -f /chain.rlp ]; then + RUST_LOG=info $reth import $FLAGS /chain.rlp +else + echo "Warning: chain.rlp not found." +fi + +# Load the remainder of the test chain +echo "Loading remaining individual blocks..." +if [ -d /blocks ]; then + echo "Loading remaining individual blocks..." + for file in $(ls /blocks | sort -n); do + echo "Importing " $file + $reth import $FLAGS /blocks/$file + done +else + echo "Warning: blocks folder not found." +fi + +# Only set boot nodes in online steps +# It doesn't make sense to dial out, use only a pre-set bootnode. +if [ "$HIVE_BOOTNODE" != "" ]; then + FLAGS="$FLAGS --bootnodes=$HIVE_BOOTNODE" +fi + +# Configure any mining operation +# TODO +#if [ "$HIVE_MINER" != "" ]; then +# FLAGS="$FLAGS --mine --miner.etherbase $HIVE_MINER" +#fi +#if [ "$HIVE_MINER_EXTRA" != "" ]; then +# FLAGS="$FLAGS --miner.extradata $HIVE_MINER_EXTRA" +#fi + +# Import clique signing key. +# TODO +#if [ "$HIVE_CLIQUE_PRIVATEKEY" != "" ]; then +# # Create password file. +# echo "Importing clique key..." +# echo "$HIVE_CLIQUE_PRIVATEKEY" > ./private_key.txt +# +# # Ensure password file is used when running geth in mining mode. +# if [ "$HIVE_MINER" != "" ]; then +# FLAGS="$FLAGS --miner.sigfile private_key.txt" +# fi +#fi + +# If clique is expected enable auto-mine +if [ -n "${HIVE_CLIQUE_PRIVATEKEY}" ] || [ -n "${HIVE_CLIQUE_PERIOD}" ]; then + FLAGS="$FLAGS --auto-mine" +fi + +# Configure RPC. +FLAGS="$FLAGS --http --http.addr=0.0.0.0 --http.api=admin,debug,eth,net,web3" +FLAGS="$FLAGS --ws --ws.addr=0.0.0.0 --ws.api=admin,debug,eth,net,web3" + +# Enable continuous sync if there is no CL (ttd == "") and mining is disabled +if [ -z "${HIVE_MINER}" ] && [ -z "${HIVE_CLIQUE_PRIVATEKEY}" ] && [ -z "${HIVE_TERMINAL_TOTAL_DIFFICULTY}" ]; then + # if there is no chain file then we need to sync with the continuous + # download mode + if [ ! -f /chain.rlp ]; then + FLAGS="$FLAGS --debug.continuous" + fi +fi + + +if [ "$HIVE_TERMINAL_TOTAL_DIFFICULTY" != "" ]; then + JWT_SECRET="7365637265747365637265747365637265747365637265747365637265747365" + echo -n $JWT_SECRET > /jwt.secret + FLAGS="$FLAGS --authrpc.addr=0.0.0.0 --authrpc.jwtsecret=/jwt.secret" +fi + +# Configure NAT +FLAGS="$FLAGS --nat none" + +# Launch the main client. +echo "Running reth with flags: $FLAGS" +RUST_LOG=info $reth node $FLAGS From e6bf19ee710a4de432006bb9c851b1c8680cdab5 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Tue, 22 Aug 2023 16:55:33 +0200 Subject: [PATCH 002/387] simulators/devp2p: enable discv5 test suite (#835) This adds support for running the discv5 test suite from go-ethereum's cmd/devp2p against EL and CL clients. --- simulators/devp2p/init/beacon/config.yaml | 76 +++++++++++++ simulators/devp2p/init/beacon/genesis.ssz | Bin 0 -> 2889907 bytes simulators/devp2p/main.go | 129 ++++++++++++++++++---- 3 files changed, 186 insertions(+), 19 deletions(-) create mode 100644 simulators/devp2p/init/beacon/config.yaml create mode 100644 simulators/devp2p/init/beacon/genesis.ssz diff --git a/simulators/devp2p/init/beacon/config.yaml b/simulators/devp2p/init/beacon/config.yaml new file mode 100644 index 0000000000..a4c1fef086 --- /dev/null +++ b/simulators/devp2p/init/beacon/config.yaml @@ -0,0 +1,76 @@ +# Extends the mainnet preset +PRESET_BASE: 'mainnet' +CONFIG_NAME: 'sepolia' + +# Genesis +# --------------------------------------------------------------- +MIN_GENESIS_ACTIVE_VALIDATOR_COUNT: 1300 +# Sunday, June 19, 2022 2:00:00 PM +UTC +MIN_GENESIS_TIME: 1655647200 +GENESIS_FORK_VERSION: 0x90000069 +GENESIS_DELAY: 86400 + + +# Forking +# --------------------------------------------------------------- +# Some forks are disabled for now: +# - These may be re-assigned to another fork-version later +# - Temporarily set to max uint64 value: 2**64 - 1 + +# Altair +ALTAIR_FORK_VERSION: 0x90000070 +ALTAIR_FORK_EPOCH: 50 + +# Merge +BELLATRIX_FORK_VERSION: 0x90000071 +BELLATRIX_FORK_EPOCH: 100 +TERMINAL_TOTAL_DIFFICULTY: 17000000000000000 +TERMINAL_BLOCK_HASH: 0x0000000000000000000000000000000000000000000000000000000000000000 +TERMINAL_BLOCK_HASH_ACTIVATION_EPOCH: 18446744073709551615 + +# Capella +CAPELLA_FORK_VERSION: 0x90000072 +CAPELLA_FORK_EPOCH: 56832 + +# Deneb +DENEB_FORK_VERSION: 0x04001020 +DENEB_FORK_EPOCH: 18446744073709551615 + +# Time parameters +# --------------------------------------------------------------- +# 12 seconds +SECONDS_PER_SLOT: 12 +# 14 (estimate from Eth1 mainnet) +SECONDS_PER_ETH1_BLOCK: 14 +# 2**8 (= 256) epochs ~27 hours +MIN_VALIDATOR_WITHDRAWABILITY_DELAY: 256 +# 2**8 (= 256) epochs ~27 hours +SHARD_COMMITTEE_PERIOD: 256 +# 2**11 (= 2,048) Eth1 blocks ~8 hours +ETH1_FOLLOW_DISTANCE: 2048 + + +# Validator cycle +# --------------------------------------------------------------- +# 2**2 (= 4) +INACTIVITY_SCORE_BIAS: 4 +# 2**4 (= 16) +INACTIVITY_SCORE_RECOVERY_RATE: 16 +# 2**4 * 10**9 (= 16,000,000,000) Gwei +EJECTION_BALANCE: 16000000000 +# 2**2 (= 4) +MIN_PER_EPOCH_CHURN_LIMIT: 4 +# 2**16 (= 65,536) +CHURN_LIMIT_QUOTIENT: 65536 + + +# Fork choice +# --------------------------------------------------------------- +# 40% +PROPOSER_SCORE_BOOST: 40 + +# Deposit contract +# --------------------------------------------------------------- +DEPOSIT_CHAIN_ID: 11155111 +DEPOSIT_NETWORK_ID: 11155111 +DEPOSIT_CONTRACT_ADDRESS: 0x7f02C3E3c98b133055B8B348B2Ac625669Ed295D diff --git a/simulators/devp2p/init/beacon/genesis.ssz b/simulators/devp2p/init/beacon/genesis.ssz new file mode 100644 index 0000000000000000000000000000000000000000..3edfc0a20e47c7e4d94c614ecfe082e083328bfc GIT binary patch literal 2889907 zcmeF)b*z;K+u-YkyE_ysl;Tp{DJ|}{arffx?(PnyxVuY>7I$|oQXGnuV)MQ;`7(3n zd^2bLG07w+*G_2Kv~XwrviExK`zqaS&}VI7>3Mim}0tzUgfC36Apnw7jD4>7> z3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36A zpnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim} z0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7j zD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUg zfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7> z3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36A zpnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim} z0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7j zD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUg zfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7> z3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36A zpnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim} z0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7j zD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUg zfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7> z3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36A zpnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim} z0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7j zD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUg zfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7> z3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36A zpnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim} z0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7j zD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUg zfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7> z3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36A zpnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim} z0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7j zD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUg zfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7> z3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36A zpnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim} z0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7j zD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUg 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 z

(x$PhE=M|BGjtlcUw;}_KZid!l1O&?!PF#p{bmlXb!x5pYlmhU7t|-etdX_>` zwW2XVKg`xQ*uV)2Ql_@whukuV7*yp-7@1Ha(|O2ghzl8Hspdx}ngE^1WcS&RJxiCs zat2K&wrrn?u&e%H6l-97WASYc{NrJPgs%1K1K%B!R(d_Fi z@cQq)6Y1D_#c|=eoe)}yhg$R`mGDP*{ll2qKQk-%;poL8r+L!-CYxm8H0-e+izug}0&{zUS z4mX=?39|wkoUT_mo9NL?Go;*!=j#0@<~Og)69ZhN9;%XJIlw#g<)%cfQqo9buh9E+ zZjR!0_zxN7&Copj{!Y2IM#u)}I`nT< zH1-OcQuzn+axlXWmfmRKBLaDhM>yb;uKgYpY-L^h=dg8b^tr>6YOe+9$-Dgnl)1= zOq}Cpu>TX=Q<~fqpRO^-Hh4y|qO~Iv{GTfTH$}0wbH?fSU%&ifshH58;=RXaNTiPN zP6q?RfmZTjB^H9Q?6N#cF-rD^yYDdoZX`EBsh{mV;YWo;g4_~;-e^6i(#iUN7=zz6 z1lYkRuFEDR*oEx|KMmKbC8f?!M6Qymv=ZGo#ncY?Yp2A|M*Y2YbY*UW=IZ># zpBl(nUc8!n-m>~^FPHDHQ64GYMLS+>5Fb;c%W6?@%M5xSH+v;}!$FdUlURl&PKv`e zw@@?qF&a&fQA2F)T>c}up(fe>dRNQ?I3%KcGZU}w4nKe9_zs-66l#%Z* zK&Gcz&Y$wH;J45}@Tab`7e3^40NBA5PM!Wa4z%j(pDN5$Hj6O6cy?)s(en?Z` zU&3|woX*|U+7G#0j99d%obb_uL_5UuBiO~C0P9`k{-LwcfFX2dgU$Sm&Ijv~zzqfO zP{l1W8P!}X(285B@`=A`)0#l7XH)FBP_U*IvBxQXNs}chAH})KWSN?7yTPOK<9QPb zm^80mXOjmAQ)tCd3*6$yhub}WDO>2a3S-F|ldqkZH77iKF@UcqFE=zP8Cs1jJrygE z%2qmm%)6;W=^==&BBUd2BO@=IG|*T7%;ja6q>ccaNh2*a2Yg9NltPd(tik?pW>3OQ z+K>Bb;1B7r<3$$~TA_!fCTPWp?L&1=jHG{WpN_m7pfDkH=G(_LH~b{KKgoveG280g zT9w%C+yuSOW)1#sHD=cbvfg@!tB1q?dy(3^pI?TxQ~Kwauh^_R#kcf?m-im&u14L%}J@4+;(*}t?hHiG^{q=HuHO4*#V_}cy1WY^%AW-%he@v+B4bnsxlCTY{>K#M$_7)yO#7W5|oiF4b zwBqnJrzpLmK8F3@7KCRvi8aXTl`FT~K@?M&N$njL&|6dVUQ zO_E&5Gl~4*!+l#X_##Uy7vr+kk;NG4v`|ZQ?BPL!Q(0SvKcg#J`(xrFZxa3dvVhLx z6cT>S`jR1^E2KMTXebK!)71OED$Q5F#b!6k0Ay+(2m-ZmNDfr(kkA2znmZn-bXLbpD91H3VwIFwn=>0D@WRnsM(XSl$ zJwkXvB@RVNF)}ND**Om0nMmLQq~^<6Xm^` zb1StNXAaA8{%1_434G^;RM6lO+${E(gWP?S1fv3@ou5&_n3YB;0!;d=o+6eq^7X|D z60E!MAa5Aw`gv77r#OQa4@~#z@+|N*}ygb0}giBplVi$blb1sRn zgp{!7;XKWEHw1#rTT870KeAXF-`I@xTP+efI3YeLaW9+Lm7lXBDc?*^x`6}&DdkW* zfHn)Yy2XoYN85zg_oyyHNte*V#(3KpeDv1O{u&7qwQL8YJ${swpYX008bVpx%5F_t z1&@@zvXl=4Sy^joxlZacJd&CMfddp!^c+S%mY<>paTGhw$6J}cq(ywsCP(*1cMKa? zHNOtp)XDR$4d|@dDg@;gciNbjm9-m|qQP#853tt(M`_6YX1&%bwu5T|X^dyGkZy4b zwm@3G$q)V|PmE7wIOR|*NVbjK;^DE)CK1mBX{`V>_;!WL=x9FwyO!R9>^D1EWTK6x zU24rVgo@GWLHHZAY|#qos#7aw>s&@gg!`$kZ>b#s(k3TO!I^WZ=FH!*&I+BlEew7U zGe{^B^xff>JjDMa6ahn`y=V$GY3foRk=jpBeXH#$WPHj9z1s}gC;v@Ic_`zu)+ef& zo5Fc-&TjU25%44mMc@2JlBR3wt=XuQW%BdqLaKPy+))j>F*BNJ320Lnr`Cv4A8YX1 z{;?powI-_G32r?S3fX6JPq{W)aiGM}7IHbEEf_R7Pq?5jKT-Jugt`cE9Q+EJeAL`S zy9pOh4JnY_yJka}l~1)ZLB$#Z4K5sL{b7I95x-CPw~Z5aruHv<|R zg<|Af@kAf1;H}c(F#(Ifv>&E;=YT+R@Z;pXIfSWDwCL0I^~HYIy~&57p7513z?r36 z?Y*($Q#`-Yp;Y5ifyrna+Le0!EomX{h|TRgXmH)&Ck*_le?8>hOhLzc7TFqtZSuQN zM1$c>7F^omZVt{i_q%dvKM1j0DN;kxc_RV7I-PHiKa!%o^VW!=dXtzvf4tZZa-B@B zAX@qp%<6*%$5AWIUe)1#H=z@T{QNJarOoBHpys27Na@huMCyRZFI4v0zKIMEV?NW^ zCLPkSsz6J@C?apVY2Cx^+=I@9{cAQ8WNNbHQQ8Qj)Ca0<4bb4ooWHy5(~D{x89p!T zpJOzuDyd-!$z=ZdhDa$N&5GQ&#JDIuH(;`e)yZ~sV3d6U?3)NqTw*QHMJXGV_t4Nv zLkAjY9r@WxOrV$PHpf&zgNv6AwH_bBR7hg06k|=>4X?CFFZIa!R8gE+{Y((c2o`j7?+pKZ5C6pOkaS^ulU8p? z3BD?#sE@L_Gtv4?(E0|?>loSTi<@Rbwz?4}i9hv1OM^Y(tMSLnIBZ77BEI=n=rG$a z!2UgNVVz*pS)$N{<>5yWJ|u5LAy(WD>2yW;)xg9l(2D&vM+F3)2od8HG+qQxo2tik ze(#}<&xd4cFczMsD};NXsl8|kmDQ32AB1376p8`J_;&tbb9mYr=z}TeW_=5;<8a^1 z$DsvCvKPzUatA?!3(Gn`#-81%l7H9fzLD~PzbM?()1>+%o?Xtpolo47owc=>5Abgc zsI3`=6R5`(0D-DqsRT@4Py@ZC)kj#_ipXh4^8|!dwue%pnpW@fL4#BIo7&$3I*!?F z%(DYta*6VjBH?`_?f5HFa!*}-H1&kE+TzR$UD-CBGzxxKOU(j@iMqeaES$5qx%i|b z4q^``H(89TR+qxRpZd6=o`Lr=TTp^+%;)FoSAm@UU`e5}Y=Uyn!zt++0i zaKL*d1}=x@;?OhyUl=wgPV-!YJ@qZiooI0O0ORtj{4oFXA?4rz0wW^~`zg@J5vojY zxsoAzv)g4E(nhx%^_q>T%K$)>)`k&%A^{Cfi_G3dW`DFG53SuYqAP~%2m{*KbwknG z%5h6oW(JlAZQ%6nSeT`jtS*zg|-p4-L4!}oL-;Byj10(7!}^#nwi|8Q1t=@~LL z)0rs!Jx1Tf#J65=WO?uvzt{3@UgAmf!)|@lZ{LdpuHE-=Wmy(%r_0@Mx%A=v_81Et z?K_7YW~Ke$a5-f`D=t{pN1`N~W7&dK#zi}zC(KySp~tp9&!Z>!r%Gj2RiP-Jy<)r) z%&ER5Hkp2?DGnSFTHKqDg-GcAL`$|#j`130&F*=t@2!3g6Xo}9f&>jtoEs6g9@=ma zDWT&0F17@-Z^?P}zOR%%Aeb^F2dhCtifx(8G*S}gc4!Kprim~N^zN{xOpKD2CbFNe zYUR5dvdj8s!FebFB}(3GsZepC!BJmDgi;BH&_z9_Rpcp8u+RliIu?@=%8f{WM4X#^ zX-VI&8zog4^ya_4x^ciL(*}C*pFXY9oNc!aYf!j8o1^)y$cPn|pad+(uxfw9YXS|< z7ZNxpy4A+8{eYtWF>mrzG@v7L?6D<(uEg$<+riaEDop6X_EeHpyx?0u9mID9VA<%e z^0@5fq0$2Hn*9eWx`dPji zGKXD~wNcQDLp^#<^B`gTHiT86X|vO0AUo{ahmyZ2kaCw0<>quFQ#rHqt=`fUB>oLA3XmFL2WL;*Sx}u0*oC}h# z*p~*@ja-F`h??qyzzt}hI_^UZ%!S(3+lm)FRbuR>(?ei$r?Ym!#aqN)kXDwQR%}Nl zGpKI);ohmLd{xbbN*y#f6g$c}yLy&H+Z7eZjP_Ok_{x(3^H$i^r&{86IoyVXrbEfa z_gzfgf8kk@*^i48$gRNWWTRv&?RL$oHK(OS9>h;BSiS|IN8x)%ZVSNIWtM8PuJwA5 zl(b+?rAMAvSCUKfcrMh$tZj`8+V5t(ey?=03H|q#RF{S*Fg>4+)dxTaJKm{naYW(iqv|UIcR}PFkI8OGQ)`416jq zg(iw<;fa;pNM@{zqO^~MIL2F@cR*yYHjMi}`kfMSbH<5_#oxnITnc-5hr9o2T$Q4Y zI$31w)=Q|`Kx{Ndg%GX|9HJv8`Z<1O`U?Yub0Z)^(rA8zjnh0W*)3W}{>?bz%zfk| zUA-(e)?yEOaixAFijOm377}tu@ZzSKJjpZpR76IJ{M_}4XCj}Eyi3a_1+`ij$?7Ne z$SC1=ZZklx5PkqwpNQncR{}WXsq$QbO1RH!A&ZEQp+}nXrQkcfN<}mjoSMuz|IQ{A z_t?;H^AGoi)VYq`O)zV~u+00>KvaIaIe>Ju#xN4ezh?eu3S>o#T`8}Al7XlH1PGGN zu8WMPl)|&-nK8B%T){ajfL5GfvTPvsxWKo8JwIW2x4{uf9|pl-$mdv~Bl-lF1UO)XRy!D$mubu1nO>&^_MT`y-YcAC5lWspc1JG)HYIn@M z>3#Qf`GV!$HwVAw3#mfOHBt*>W*3l8K!Z~t&uXtP>I)%iij_^CFtYq(MN$=a>4lUp zwyL=$+~x$z9ha4j@*vLJgV(a+jPQW8Mo)uf6F9@9KO*#DJ&jZaf8GDke3kh}|GIG? zO$h#C?weA}182fWp-ysBBeC2!Wc-#6t&nMgNgl5-Z2e@<_qpbGNTvMiSxUl3KNK^M zFF=P~F1g$D4##1f_%rR`c8AQ#(YlzRs!ox0=cg#D8_2bUPMdYdID+ z*GhK{MhUG2W4g%?Mbaa8+V>~OTlX6ukQ-%u=~9vaA7d1HM`qWOQ6p*hd}%Vf+k$cK zqn}@)=tL>U=`}b(gCnFY`Cv5pk_u*sh7g=G$<#N-)q}bl5yRoEg=Y41{s|IpI`W12 z_0P`2lp%%GWB?FPe8jYFy)1%I$KBWJWLFh-7;PWX?1;H9v(65>!H-^PwrUv@x2Ydf zG^5jA4!j>>2`=q6u+q~0<^dy}b<)d@tsnIzchH;@qhKA2*F6&!i1ob_VE$o+TSHfF z_=Aj&gGL}WV&io#;wi0*m)#$H45URuA&}b$Q@Hshd{8Smy-U^CHbk)Jdih0_GOx|$ zPoTZ1s;~jBVbjSnN7I1>K`I~<{NV}3DCYB%eP@bGt{Yc52^uS27;RD2QPIq_68HdH zF>@}>(4K;V&*|1e!+tZ-YDsjLgW`-pilug9O+%&h!`{c48&T!Vq6>shi9pJAKq@8A zsDkYLOeUHnRBX+=KgNf^xpAZ7;nOzOTyhk6Qr27OytbhCC~ZP{-^ zjWU*K@FzL^`bEtaJtX>>DP(C|alro{lK^m{hWl_*!sfI-akAk=n$XKYJsZh>L-r`y2G)N~~LP`qJ?AS8xx{)~8ov!lHQTCh3o~BHw;|td?maWUzRkqdiPY!)C{M ztTXuA(FmmbA9aeMk)|f)VL_uKc+?Z*m;XYIP92AmBJ*c|1V7R+xxuaWU_VQt;5B6+ z&|>?a-}=boyZ!|v!!HJbsOQp5Wq!%ycJ5|DOVe=o)>=|mpz|!wF8uvVd#sV0gquw@*CWfHA#!sTDQ@xW2*ICDA@g;J zU5pco#|VvL3Lnmw#MbQuK8+h+AXz{*w4~gO7HEl)jA%~^ zmH=ZdFA7E1mRHLrqdppZtTugpwJDW`+$Q6A!7I>>Js2lwu zc3-qtE*wdhOhDB_5yG7x`qYpOe>~C?k(AbsXV-reB!zwh351o6p4te z`z)>Ql=c`km!7RZ329+lj>IGjSE8VuQbrHmE$k8bnvLEF`l%0ad#2N`Z~NTPrWDQH zIPO8#XmrOOVaZ=Q(8NL@a{=B1sX}fJ`a*?)Q|WEtGk*w|z2hlVfG#b|%HR#r9s* zUy&M#!C%@+l!O(sWbwcJGo5WJGmi&G82J1kHGW2F6Sh^uq0>Q!^r%B@oz?3zH*GCh zuV;<{(5auYu>3iQKga06*Q<){Ta{h1=kx3ucCgFB7MS)^q1n*tyq_F-rm;=%>ON3iB$qlV;QOAJ<@M z++lZwaFAAlCr#+Tn}GjUr%hKk?`YXMDTqEz#K~{k9qv9M@7Adb}T z1z#s*8sj4s!TU?90c{IZt_d|-4{i7~^#!-OG3u^As80w>S`*)Q^Q&^eKYN%v(kfoS z&8DaOY^t4!p`X*hA5D3T%)N+(!nyzp?O2=pC!>+lW&fI)YnqnvbMY6Te=F1mK?tMH zPja@@SuNnxg~0rhMZlV5ZH%n-ot|v7=iCmW~znbr+W>4oa@P)l&;5ibn|bLg z@UhXa5q2)HY1PiN50>-mEdDE%PG~Z3gbPkl-CR5?XmAr&93q96#U?92@PX6JiiN6y zvbFmG(TaS_Z&1U`kX?F5I6Pf5A+=;-@sCaxHz&|80%ySDEpQUMz5$C+!$;=eDc6uX#!=n5r#Om5Pl&DCXdzk#L~RB_L)zvF$}_);$C zfAZJ>nWowd2;rE8u`m-x!4bXFGGrKKeB#%iGl_!U{cVx%(>@CRJofua=~AUI!Wn~) zlOQ+Ki*9`gZ>V5)_cdN7g%sk<0sE4xJQ~`6sg_ej#rxYgc~$^ZgSH%IuW4zM%21D9 zd=Fv*#wZWEIHy|G2aj!|rwX*9U7xiLtoyAR}WLWFBuWsh%8g^X}4A_rD zt`qtVZjdCgY6~NESh3IYyPia}S#GKF0IBDAOtp;+cnM5RNzWHAh7(p_*}hoWK&EL< zUZ4I3pD|B?41oDuK%G1w&~cQ0Z)-fvD?uCo;hK2%t)$@Q1wtiUjn4p&*e6fv76x|4 zUl$obJz{<0!|GF~Q!64s?<|R~r=mH_i2dwwJ<>lM^#goyLan`hLK5Bz3Wb13KqkNT zQH761O0KbcsIbV9%BP%`+TbOKM0&xVjM5c!|9O&WXIaJMWx z&bFJD+x^OZ>!HaehJiM9Ljf1PRqB?ks>%fHeJMjD4NSD%lIrg_Bi7p^+v{ZmWq23)=K!c0YHP$F> zQ;9O8Rm+QLQh#Huxc&SaW?sB(`txvem{#eXEbp^eLZkc5LGr|1$5JgYQ>%nB?EEjR zU`x6|a#0uP)-)^HZ6K2rmENEVi2y%{q~Wlg#0M^KJNdrOL-WVq7pIq~nx=`fk&Uj< zTaMe|?arSiJ`mdd@N1~>WS!9Ucfj-BM+ZGT!5q(Q$7CzpYXY$R7z2b7#mnExz+2s9&U3r-ql+1axkG0h&{xq=gI&+}4% zi64WIMSs)ddWz5M&)QE;{@;~#ZbBJSCX<_F z3Z}%X;!+j}$Qqg zup%Xsu=aafurV}mbFhTuhv>a`jOk@kvY|pw+yC+skGgPB4G^{CEX`)zOIaq;{0`1m z?Iu-FikTb0MDie>suQUJ@80HO3Y-^J#h?RQQB7$ib<_R$`2=%;S#7s{MyIFeVO-@g zsnm9pM0q|alwoK^){p?XZu#w;b@}(;A^5(Bm`yWf{an^Spqfq|{8uay^0DSY~^_#IB zH_2V;6sH_7_t2ZGbSjHj=6m+Um-9j3%Q5PMu48MFh2H9*Zq4o`ToI^;2~H0%auP{% z)Qp;}xq`kKz}%DTv%U8=rfbpM5DEZAh6Wlfrd}$YJYPQ#6jNA!q>1m?er)!FVnJEM zx1a>Qok~`!l1Vp+1qvn@#dO0y^{ZvdA^%t`{H|RQ+>bq(kDtCA@Ga-4C8f#+`l>87 zeFaE+iC#xu*>7j7!jmZ2fuT(M7ls>0K{CP4ZYmnB4ZcdT0p{xROk0u9^SJW1%6`us zvWFxNDT3w6s`~b#uV9u&+r2SG8S70YEkbSSAfAg6(6o4$FVd{oVaJDOPH4#evi+Jh z`xtv)v$N=0J5VhJT5-Xv;jstM5K(AhWI^@O<8Zy!)ZGEku`-WWRb6HGfIwINQj%rS zE>vbdpG9s6$rM09*0<2ySN5NjTojaX5lPkDsUuN~8m|6iFF}RC_6syP*}&d*5}M%_ zD&-DFPMX4%NDZbGy_u{A7Yn}-_afU`HzKf(O5Lb_LL);BubE5~c>QbaoV3f#9yq`G zCUpDj+}w?A7{1YoUx1QLHfeboG`PUJQqij|M{Zc`P57Py1<$c?0AqAFL&nUWGW9F} z(|OHThZm_iSch(ySW8W+U4Ovd`v{?Ri`1zUc+uzWNI9cM`_f->FZcQ}i(((X6%jNz z-zmDQRqn6+55pNs?t;(~kKyls)(Hjk-OWvMn=c?L){dZ1ZqX{Xgp1&lrE4U$02s$( zQ%sc76FguOF#tbGEXUAD{i`r*{tm zr)lb^bQfV>%jF)L-`P2r#)r(fYbh4^gn9tgL@x!y6|74q7>YKR6`R0#x=Vr8eC~P& z*F|&wCh!F)&D5yu5QMdDGtsaXIE*$bD;V5xKT;geB=-s{%!lPDonT`<7pApr8c(QN zmWP%D0d<3f4&@{7EOz^{-w_KMKW~r@_MN9s<>1?Lqx+;-Kr1etWZ2uZX&H6H#DIj^0JknGjTlVQ%0()>mk}@*)mu> z0UDh4$pl4S%3_7Cfa!X$&c(bu5YpyMy9D7rqkST}10m)dH;{vz#b({DLCl19L7NgN z@=NaDL`iF9o7MBOo2ByD_MXEvXMm6uujYH*C<1>!4*k(axuAm7qORe*48i+}Q419{ z8Rm!h>ww@4M`)G!p8F8RyLm!hWYad6ZWBu6ApDiOKPw*>G4umEH3wfV*=YwV}7Qzpt0~b0#pLeu3 z@|!UE$+*+~^Vu~lJiQ(OWLyd?ArGY3^2Glx)7De+I--$rxfCdwcJhjw*pLP9SEt%% zBB$I0#)~_4u>Y~X{5CC*P5y&nQPRD({ack^u<_gr+$`|{Jxe_CMSXJ-D-y8LmNnCW zc-^F*JbiC6?+-6D07J;Kq**Hz2T3^v2fiRQ)tEE_rOxj_>M#LX_4~~9U~2aS1oy_8 z?uMS;y;a`=h4IZ15-J;pB$Tz!@(|1nFg8u@{RL|OVCC55BavvQ4YwG*3K}C@Hb-xL zQ#)TeXjA*5S{}I96a7*uLOj&-KE8LW<8v}m%Y>+)I(zI*N_(akw=P7Oe~BML%b74u zU=ae;Ye%l?ljQnEf4ypIOY2;sA9+H}3-><-KEJ4xs}q6-N6x39H_+XMYgRcI#GGcW z>xu*nm=<7XXu;545)^$==2vt2J|`E9hkmT)f55;;0JKc#@o%9B2dGuvG$RUj&M7#a zmEG-)J!?R}`7l$d)V)js=*wP;K{ z;sHZop@!1N*@6xbKLLhs>QIrAHI%S!sA(i3DTL#%{%nE7pBfKOSxi8K3%h=Cw8RIc zof1@__XMTMR!uS_mg0Yo6&+F<7m7IX#2fRQf2rJ_3i@GEkUnhU0r=A7oi1Xt)IVHO z`Pdxt$KA68bz1#=>gr0L8o0C-2MvyF9P?@mwYUo(UDp)*@>LcysUT|*J(<yrGnsSgOKz+{kqXuc|X4BuEi+IjJpLe^mt`e$!YVBT^6rQ^aJmoqsv z?B%$|DBw)F;i_5h^U=Mz2pLk+xT4l2x!|eRpBK<;dZ)Aa0~%Z-9^@U81#{A+v-Bag z&V!`t=)Z2lEUxKOj8?i**(`qjL=qJ<2>C?1ZDp_f>0JomtNp7-M#|r6OvQ-(Vo?=G zdaN-`UB9m(a5O(FjUB=Frj|iMs-~}P85&ek(86LD!DP#=eO421xjS9a{)NdM)PhB? z({`8QpT8`EDzN1BUk^ExUs`@HtCF|64^GXbQ5g}%P7F(uoB^5SH^SJ({d3TY3%UYu z9X|U1J~<6yp5igXg!3KGcp?^J^odV%nU$$HcjxET^z2ZHz$=u`j7y%wr^OX3LhS2czqXQ& zivd3P5{S!tdb46^w(gZzsr$`&l{yadyN^0{fl)4}g#(f<+?e_(@kSUP#cc?oVA;W@ zFpwGyx9>5hm<9tUq$H?rg7#~8D8?0zDXwVDwN2Iw7qsHI=yu18$H3`H8aQ?s1M3fd zcHGbwBG3Tug^EQ{D{yepI7fxC?eQ|4ivuwao61Ew-B<9jB;%6GjCYI?j-`u-I zfqnO1u~`R9)G#oHJMCNUG2Df-FH6LP>EPH;TX|j|QGNqCDy;Pp9v?LL7m_HIRc^6{ z%d>oMpm9y1jNu?CHMbvPzJB4o())y1l3{sKAa z3{7LBud|Jx_;^pFMH(}(DX!(+l&lYa)Kv&|f_DUJ<8=@C<7uXRcke17aDni+lcOHiXkQ|o(7dn;EPiNYm zYUa|Cg!HZkt++0hRKL-9Ln}H`^`j@%C9X(8c4-GXiAJz~=Vz~n7sp+qRc2J%jC^V& z-=dtmR9!$_D%x4xCgc>d4(ZF|tynd!)s;sl~`%ZY@)Mci=_cKunTMEz93fU0GaBrkTf;9?9w3Q_wD$J-65*2sirv;?gV@zPZ8c zs9sMu*>l7z$yvr~@|mt-NBuC!g;EDF*OC4?_?#HmSF;p25yTpam$!{&!=9$p=|a7H z$O&udCeX>yRtamYc9I=O66R#%)@^* zcz_P!G5~A+7BL>EyrAo#YDZe_$a=JS>LD6=g&PoT02=%&#_W6MA7F|hC+H1PcC`Et z%-7cEeeQP6V0}7-jm8vRzEmDPI;l{@%pVNb_<@OlINx}T;*3}+a9_?|b7~EHN3@>7CIr>LLGAgOw4?Wa4mFxySd!QA^6Xw!fTj=L< z+==R#e7tDFUoCw{!y;JJ9I>mcdgbCOY+v#Y_lO;z8s)6HT?pC)EaFmYs%uPWyznP) zQCLvb3yS0m$<$MQ@3aM8AT4n~gJYkyE6DPhTZ)_Tu1+VCLikRc<`-uE!J&NRYi+1A zQdo5qUh?fEDxLf+?3F8mdI}7h5`H3`Z<=0_l8H_tzpWQf>X?4QEfy6Q+{>g!iUAES zGwwyR?;;=RTrDCIVl_FK`XKnG*K%8D8=hHyMA!^bsC1NF12F)xs`k}cC-bTrnESXX zKvo%Tib`8d;niwzSeb6H0PGO4gqdXwo#lcDSB?A>VRdDrfq?`ZY}K1NZ!ZTV>_-_X z@9N;xEy-_WzqnZUK7{>nRQKw6_87p)2lmxRvl^JND{-82D6~~b3mv!EpRR5Ryne5` zzNjS7fL2`0x;Kr|_%yBG#$BGC+V%Is)T=J<d zBk>I`QiBl?E7=k(D@o)qPWo)WT|?proF`39HS@;U0mPH${@dkKm0k<7__EAqVqr<8 z$L(shK?|M^zOV*Ppuq`w@JxZOS+gmq@N1`PgI5PbebB0{fd)jm<|A2F#W+#pebXXa z0G@b-o~$Ob>whod!1xLZ6if6a{i-9?s`iqr=~VA$6QcK6v^o$M6GH(F4j6UhmJUE_ zd11OWKiW5XP29ZGpOk(_DEL}@K7GL8@pr_OXr{anPdo44>>;pZ?@pg5@R`o3CN_&RexWUIWyql>WUp&RjEd&K)1N0?ijpbc;* zkzich$ecm#?3(H9`A}B*TcN(VQU@6;tUY_dz!fw&NePzOs4%j{@`+4dn*QV$k)~DF z-w#dsvCVl|$*Fi;3;F#zhsru1{W@w*@Anq<0UYYFYpGI!Z2rFV{zS4OJKe96K5!TT zXSKaMG)|48purJh1uK_;s)VYt^NPT8f1S?%C_4x4Fxn;zZ`7!X0X)$E-f)3V6*vDzj(#93)gN%4yz=r%28fnt`8kQ|ZToaZ^dzu{)gi zVmjrUR&Rq=w>{Q*EUcW;#qk_#tW~~vl}7QCrC57>q2=vFtGlY)5)OCMt6e@?%fX{cQV9eq?ZwXb0YRaQ7Iz8@uy7t9p81BtaWD~ z0k9ny4iJ)TI8y8g(`*IaR*!e+=yt@(bIq}SN@CQA01ZxxnF~|waVUK)Zt0|P^2}f< zE33SNx$ElkGq6z%)PyJIdT*Zhrs@L3XXt6g7YqPF@y@>51@AoMw$#G3EX1jzIYIk* zE1TL0=u>Z{x1r4ssbsgzrUwUge z3N^m=HLozwZy;)pg8py%i^;hCXTO9_DC_CTr=uy~YqzlgRrW2wMs)dp@elHDRWakW zt_@w0K1>v`+YsUj{UJOX?@KsnaCSbS#ExhfXOfwy?rscbE6@~7b(*}fT+&q{jw|RChO;n#Ztbt zuTI;#^GVa)LT}6Kz^TE9$&bfpUxnpvKR+Wka4|B4BNfSpu)A*P74jM z#C|hoQ`Jk)6Ua$-D2_~z)-E4P@F7ErY}J9uE?*DMZ17l4>t&@R$d~Zgp!?_|H zcUx)s7HxgZ&W6Fuf>O%zU0)*{dT7w#N)G2cMZnJ~ex#?NqW4qq6C8qM=wx4%iI_Qr z(mKlr2%1CMP2JlOu@Xb*yZ}!NfbUC;fkl;Ams<)$9L+n|tZNOVq=o#^dJr}=Osxv| zxVlb+%m-I4*SBZ`k?VYCdO9z6vo&V4#m4jB?@EabVTq5GAzZSc|##a%DXM)C* zge&EKOKrbf3cnCWO7SJpCtSq~vJ_opTmLAf zrba4K0ZZU-+7c3EvYDXLUb~7$ZF{*hMIdN*6Zg{Va^|(^@K){7%7XEoBclV1F6djs zXn~1gI{=IEk$K5rTWT_n^)ky#Ve-{J{*#KpIILKxzG5!ZK6u5+{%{V=?Ediu-2cLz zsJPae3?;--m#ahRjejVQ4`1c8wcNka!wLniNvo%NoQ?oZ8*#S_@Uk&sFkMt^oE z3I9#6K6(D%tb|lJim?p>EEogV8b->=lhJ0 z;4}0Uokua&*VH@ds$$WfLf(y1i>fV0TuU&*T%KG~#=hxnRMKi#UKhP^QOx=>l#dgNVq5RJyGVck| zJKrGf2&lB-AGJY)lhb-6cZgg(&It={>vTC*OI%&@-J>$59^FWx)f8Q47Cv-Ww`uiEDKdH4$|mGhUCHcv5A!Gr&b zGAzfEHNsty`jUtvuiK8PFmj`Bz4T36?5FN=Weun_`_N^L_HIP44!eG5`T(SDREJgl z-gaxNsYXssgM`dc5H>70)ygstHHA_;l?4s%IQ@bo@Oq^M3Ejv|WW9yodHptW5E1of zu``S}L*j7>chzW!e|dEkNurFeYTn!)C^Zi0`9iONuYqh{93xT2y{TA_%_q1I*K|2g z|4s_Ni!Y(>mF=blW-D(ys!YK0Ug4VlLp9#A+RJ*^k3Quxo*!!p(JsmgW_EG^tt9w8 ze<1|mQJ~+;dzwIGRJ=sQn)^u9*4!97mNJKTQqR(AkAp8|4|%hKL79#r<@X}*xRO9&@o%eY7<*ZJ31rIIZVrwnK+P^PQYbD*BP zKybPt)S9SfD|=sU(I0#3#Uf>&`vDr<++A^2mQkztfbipzrphuf9X13hy?E4RiQI%x z0g}4KSgL=xY6@F&fugoI&0y~i*h}lZoUHyFci(0#skH0Iw=%3{9j8GJ-C2XfefI$V zQnOTi{e1;{HvbuVQJpDubM>m9nqrw;D>s$F1`yy`W(+2f}+EUu$Gx!8sHN43FfwqHp>AGv?M8oX@`q-n+ z;$t`FgNeTqjNySw6NfOlQNxU#OOs^By)ffh*zTl!s_# zTVi)`Dg^ZSi%q=3bhZ2>uE_3)cLb@JaX#`NOffk))z(J!a|o%)#zQRC6D z1Bk~~JJ)D<#UdPSQLp=qpuuq+njDc2_m-k3~B80o&0P&&JYHccwUID)UQj&f!y zqMH_s&DRUg4^3*>BTnD!i8i%QP>|}5^t{lzb{G)J{94^qm*;j*&G}aG00d#SUyV?I z#cDjq##B|Re?0k6JY7!7t6%=bmCqi)1g$vf;FtTYmv3BSupcNM%)hZ(+t`_h3U@9CJtsG&LkQ+Uslxg&FM|i5}1ANZ1THb&vGzTr#JgZD`3#WaOe*j zT!QI&)kfsn7;GyqN{If8m@m{i7~@|`b`34f@lT!ZN`szpgqKhfy^l}{&`z2x0N{6I z>=koHSn0VG_D>2g6z%(oS78nx(O(qK52W6%;7jL<1ESn^M{^i{v&~q->(UUht(1i` z&eMmS`APclS55>R^mXx>S3dSaFF;Bk3fhJNif>Bg0*$fNhgmLZcps$EYO${eXYULa zRd=p&F6G8RD=t!p37Y=<)yQ?`#aQ92X2&Jv;o$F2a)jRm#+pKvk}&WUey{NOh&A;% zZ-0+Dey;(6&9YH{Ia1h#>6I1!e86fhPpPHo$+wLbJkT8cl?`5TVjHp0?I5(z(J0Mt z%HL6x&E|#;HzVWm#jod^GHq-NIoQ5mU@Bd?I?YI3fgp@ScRKY8><`w?WAhx# zC7V+-ialSWzMg*@39Q`80IfJ&#`Cl4nOJ9>+WL35tg{&Y?~!Gp*pKI|xzgM4KWl{= zZS&eL`oC7)i-_HozwuH4EY0h3ldLtiYuD_aEou*i;S^*(s)}GdC zh7`Km^Rkm)yg$-Uy5??o1zZYb>)VkIbQdEfayaUrC`{Z`jXs4605w#B*fSW!K@p`zxtDP zzRq$s(BM>=d6ZrW%rx0g?L>LmRdt^UaH%R_3an#j;2W=eewNs>|I!F#=ZTe&LJv>R zr& z*i@U`3d&s`j?SN4puwqqg5sv;h3zl5`;+)X8kBbtk_f!qJ!BtA#XZ^B{-Wak8W6if zJfy&5`ENlGSMDxw+CJH1vi!@5)0}Jxp8kVC5O%o`z0StlSG0GXt9r{V6kr}R>=uQ1OLA@vHr zxjpH6)$PlA$qTv6lELwejCEoGV80^rkTf8|^G}exH!zRa`=RAYW181ptmTqWbpxOj zW2lVkzezp%N2fS$mH;2Us;!Yba#5ww-mZO(6$M&xJ*=L^!429FW}aj-+5(+#4^e?x z<}?Qumw+sNj!L~=J_2q3pEZrua5YzJh+2yeKoDUjgW7SDrt#624c7LLg`^v%o3aC) zVKyiSC3ya`purV3n;SQh3K)dRE4zDTW|sy6A{RFFU0<9onPslN9h8YVW=qL!Q#+iok<|4b|L9?1lV2Mxt*g z;~8YhWO=40hFWoU7kryIrG~J->0`eryz9uSFf5=$`h;;eYayE9mQ|O_k zRo$#K=P;2f!t-d?;X8nDZjT^vM*1=_7b%p2tx+-+=|;DwAWkj*V4!^5Y>`dZCsH+s zHui}h;U~!s*1lRsa|d9M*(p6Cb{Ol95wvr1*OlDW>f%KnK1mP&RCaRtk0v?1I)m8koqn40=c83tuC{>-KtJofL zf{%DDA%Dc{C#lUOimg?4Ab&Kyu?Z zp~inVyi*eeH-il=u%t&su zmh9Z8TWBW^9PF=bjhIh0bSuxG!4cXiy6Vys5JJPkRX9Cu&!RC;sPj@kME*^5mi?0^ zQXs5K4NWF%&)+$8RZTvqIt2Q=-pvnajB1n5w?j7&Rd(d0tVaB{9NIb&^mB-zhCqXx z;zS4j(mebyw-@dbNNP7dW3GjgrO0H75}Rf{v11Qo5bi;vNkt|oV`tK{5WP|We4!4d zS7d?GtN!HT=7@sc0=|Ie!0v-XIolMz14Z!V7*Q3!IsBv9l^_kR9Jv?KMaF;T5OzXR z6;%GH6r!}Bq5u7-V(JrTkMG~xdcwYjwgF)I$FXg>{=^b`15f@ich9myZni$QdOp8VC%LkNK0>W> z^ZmsxaDU#%=>JPYuCo_);~O>1B~ntWVg&g$oil5~p+`*! z<0tbAMU3J8oHVbNoYVG=&QyOA;nCN}=j!ER6U;@8kNChr#slq_?h-7Q4Gk}J<-Z%f z|FqvfIOOt?^3=GGc^828aacBCe*Ps!>U6WMupY>QiX@K@*8B^tn{a4qW=c@ zJ4BiVP6#}5l9lGep8y>O`B8;}$aH3x=8{`^Q3Oh|MIt{g?O^+$xc)W54TA`&YR3Vb4(LKgM;=y*6g&m4ok{Um@?!RSrzrXkmco#ZiN+7lmH;K6&IPpa}BQl?1{n} zwUQhJ)$e+x#soiFOr#X7-5AI|cR=0x8uFeKP|VIF-kv2@5(8mdh@#{B=ghI%1PRHa zNHe1>#O9y+6v>znh}=+-!5`XE;2rw2&T92TI1PlZexc}MHc-r+y3!;?irLZzD<&npprU@^1**4AWE4FdRTmG$52w$rH?`$gM5 zzSQuVfd&_KZePM`QhnJ7N{v(0&=t(4Q=1j%#=}~xphX(&4dY1V2uaRYu1c(4$9+u- z?STaf5ghMyi_h6YT9u39sf7J8tosGc)S0*C4k&KjbOk|!!zEA;U&8GxyE4yiVs=IK z4|kp(%CrjWu-dkao$^xTQq(eAgb)3q|J50bm*%_M0P~H9L}f0OFRYAzNF=PxTZgc> z-o0z?1J${0pP0jbf(B=P_b~Rm`YPA5aK$>mM$gJ`OT~!bn}HSh_!@Jci2^K0q>MNu zI&x1n9CLsFojwj2a9pwAMB3m{5tEt{e5W9Zah(#>_vpD~{n%B&x}pji+<0zW|`bu zc2ZBPZny1AdWoIbI;5M_?(40%ac zd37NTZ@ft9cu=N1M!xv5oJb8=XivEm$GFC2!Pvm6__i(k$Gn=j^uSlAqwPU?n*+R$ zYZ$%hm6ZLd@LC>(gBtGMdvCDy@@8epFxWx^r<1E{kb z+vIG**>fitqVb%uq#pvF=+=-SG_zF?5eIuLK`XA0-Y1HCxiQizgH4Q4k;+UkkAi57 z!o>U7vyHQsdwS-q5yDo%u<7Dhp7H`mJ3t6z<^IT@h~7)_D26-LewFF+*vq;)INdgG zNzYySz%K+ET-NByGUNS&MMwqbtGn}ZmS@hp9ckyNUDCJ%o9PfNbz9grJ*4<1D+7Xl z`hDuO1>ncp;0$+`0&7$-8a#)~N#`^3K?*~Z+`CQkF(v6M_~{rmkew_ET^_flsA&ly zA(VC1=2CM1L=Lr(ELOZ|6mtchuEzV^8~sLX^FC9dIucp~Pdd+~jJ%Vq=Ouy_6ffVE z7w@`DuAtJS&jAsnR~qo2QykQbB!Aw{ku~jS5{Y)l*)?#iK`&q<+>RXLW+m z$*|@0NFw&hAY8a;ULaM?Dcm&Mtjct^KJD=^AFs}=$t_Q;o*|Wr18*)Hd^255HdG9~ zV+!rc+F_tHs!#Wo%}uJd9iL58T?1tGp6i~t+}^HjI}R&D0-xUjs_%Dzzk19lm?%Fo zTzCbBpO?+FTO)SW)SV#O0dGXVQ49Pci_FvtrE;&@BR#lJUNk=V#~${g<)d(o*BFLf z{{M*Jr~!)93L0D7>5-OEOAMnqMBpp$ZlW79>-iM5J2Rub<~1FYB{cCwiQFyR%C9SI z@atI;iISj{vV(Ak@7mIQMVfeDPZ#$QDp5Aa$~gRtPFDWmQEXIPwKchtTsvw&`iu4h zUENhfj7%T@MASV?jOC=6n5x9>Lj!O;ntdMLLT}&`prPzMj2L}P{?-vnP^Y+8h1m|~y!NP#Z~$r&pjRG`0Ok0_&l^NLugd9M>} z?MqeWb2~En(g6B%D%CvbKpgQJquQhASu8{_F5GN4R~9-ShF<9B)MS#k!rU50xX`^w zo01>nRTQN$2io}h8t4!RbBd{@!~sG^A0@p5_Yyso3)m;2s|P+J(BL447vqIVnae?> z{@hDeJbyy!f-iydq?O{9%_bB}!gc!?Mc?lBgpo+_fee>uh%bOs{f7V+VUDAZDbru? zQA)BGvM?$wOvB{vWU|}_o59!m)L?KH|CZx?9_HLx<=!M!D2@#Mp(RXapHDfVreWY6 z=@HV(cSRxjU~Lfjpq^8~3@pL+aJ#AC4!4t6A5!5fD-OPr{|rGtw405b*w=srKSHUP z?E#<6z$%-kDLY^UN~?>vm!8Ue3wo|1=!4rXf05OHjmh0hEV8%oX`Htbl4o+jW^w-t z%_DAh9rot(`gTJ7cbI|P!`OMmu-%n!2=L$=CadjU_^9r_+X?I(zeUR0xRrOQ)VOH4 zxfBPN?0Su!ge)d)DAnE}F5dm^Goco&YXq_&)-pR65~J9MvFSUW(QKFDEDJBhMMiR& z+0pC%qJZ{s=LjME5baNsa+&?SXH*YXY@5+RshocMm>P}LgoOpMm5m-HRPl>-S%)OZ zsmW|f;DgOJd~+MB6@~X7i@LR)Dgs2^6WiD4rM(*TH#xU5yu+gi`Oexm#Q#aemDn?gBjhYe(GL) z^p4?z*2vu^cX_^*Y~6*(TwIaiivgbzXrj$&eq(j&mTjEt$=muz93mX+~<4&v|8(;Lrf+P59>t=_Hhe*-_TSD*C2 zVMsRlC|6i^i)KC5=6@oWdf`7?ELai9cf^ciVT)sKqLpf_9+?Kn<>nD7j+B`~>(kgC z#Vi0_(hfnHVL~8@S%C5HB6w4m2m85|rZs-b5%;(ZC`j~ww(+7fVk)76RccA;z}k6J z9sO93f*#}a;U<>+hU4WP@XpxY-q3*WX7qs{Plrp*9~B*QX@n9yNS6q)G~q1-ZR*B+ zKSj5F-HPYJz&G|iF=PitZg!m05Tz>@p#d!g1P%B0UsJwWqcy%+=-GQ%@C86x)7lM; z|6MaP`(olclVe1AGphghiFGv9`VCiG5AZ&&S)+{Ewq7bN(?h=7Fz{Dzr%OBVIwkF0 z>WDPYu;f+i`mBeV;~<~Tui`Gzg~gQ!EJZ6=ocMwVb@Jn9^VvF?>r-@ASc;=SJAw%2Jj>FE`}1GS=m7v!1g-IeF2@ zJpy7WHqjqORXm7TgEHkjH-eD+L*+g(=LaF+5XDvZI)XNJMPNp~)jMxXJ-g9n(C1s3 z1;+Hx9HavQq6F!v3MJYht(c1;Rk8j3g8w`v$R&;=fx#!9(&?mml0SB9H`7!P=2&j> zS7YOp^c$mt`@C&ApuveKGH8+zUOpyFFY?!$7A8S^2Pvq8IybOQv+kJRHe)bO3>k#s z8|VnEx-dTyC36GJd1oi;R6^S>zdTx~N;DrmHK@N0anJ@wM&+(%api&rcShR&BzDSa za=?%-M)gvyh>qcq3v0-X-^(WTMpOtngXNum<@`zLtiIt;=;7x6-%miDK{zCv?L>jM zCP&1TmfKG3V5aehUkPE;k^OQZ_#X3y2!dvku;HVrHZ`ZveB4^f5%;QN4x_-?0P}Iz zi+r=b5~z!U#Puca>si{BDWoLeMPKogdk79!2<2CXDg0#kiH$dhI=`;|`J$Gg5jXH> zr`DA^mWsT6xb>z_6drOb<74ChP8_%JqRbN>yKjPVTLfj!@`T71(n*$O3-Rn(5P)z~ zm@WDDN~=9O$D(=4=f~7xJCf?}*ZCTcT4|r&!H;aH@q-D@ruz)JbN*IO#ZH5^kvB9-rZQ>s;5y-s$UHpMGBl@~Iz)KgU8_6gu=Or3s#<#yZ>nE8}!K zgrECVrZZLy+Q(6K-bL&P(PmgXdLcg18M%^4%UdPZ?Iyhwccxsp55AOz0iQ~>!DQCWq)T<$8QKj|plkHDvf(-QE$M#2O7ZnC zWscux;R`k9?;a8=#2Wv{xVxfLIGQGB)~O?!l$b@PDZViIi@v>U0%jGQkiXw1JO!%G zK4Hi_I+GON*Az7;CoKa~Tm)&)7gu^dp7ug}hit8uay72$-+u+*}+aDfVEcOJ&$JHFH<@rydpEzR__W|M8P@*u+ z`m!V54{w|U(V|h8MvkbJurD{21h>~>t)Rit@n@{(2Tn`L)ONub^j;K6q16R6RUZ^Bt+Fk4%BPu>-;-0m zKe!Ns1~-|qxY*O5(&+6kuy4;6!A)HWB%8tOw2V<%{qUo#>uZnVV-NXnT~*DWO1jUZ zCv$+ndxli&ym`p@Yn_AS%%B$jTc)FFf!(hq!L(+Hr5MoQ5@^Jrxo(s?ZIUDZ-c`HW`@&LIl^Kj?L}zH2M=1?dweXb{YoC02!77%*3Y0o+G$l=Ub(qDbXu_ zJ2jA%e@NHrW#>sD2Mw3wsytwfOlmyCcxy8s38SVAcaAT zY8#=ENkt*N-&}n6l+>=GEzHaq2U>Abyaz>wO5WZGyaoZk4i=Qa)&W_0#L8fx?BL?_ z*J+(+m7N#28$ibQG_rX0*3A?6>K@svw)io$b|F10EJ%mrkl~?(ahz+R8rg$0Z&?a7 zIJQypNQS|u&l1VyjK$|&47ROwIf_f^@tc^%UoXWn+*A!d`N!|XUXumuKmsGiH-L9D zL6x4?_b!WA2Iq<2Q+CMuQtC$X6Z}@)*T2;o;A5_IZ<6-LFmVaJNUbDCJ_h_S%qj?5 z!yuhePj?0+FG zG*tnINB{xBFv}O2YfYXmac500VOKFFe4Y@tVmXM|lYwwPc+lWx3cW3(jf3xNaW2!= zhug_&jaZ6r-CY3$lO(uHb0ZH%l~8E!Hu$rmITA7LdbrnsKrin%k?MF>d;McE^%o`4Rg7=Y z$+AZUT4%?q&E-_^$t*C=_>i#u@8J-0ibY$;52= zOYkYhB4htf@)aEqIf@Z3;;?kiw_CZvUa2(z8n>lG+dm{ZNFBogdDKD}R zfL%d;QrmXWnMp({4_H8h_YJ_u2x1c$MmOWp>GKN&tvISR7mf94i&`Y`_MsM4Eyu>P zePhP;^d@k(II%saq~S^%Uk~{*qibVn+JoR%zX~ua_rvysGXVrk@m9fZ7JFF^V{HI{ z5AlbVw2(Wxbq6#!H2%wl%KfT-!Gb9hG(*SVVB=e_0^3$&wm5a*^uZ;;x9Euxcc&_? zT3Q@aKjXjbY}l1yR(L$cpY~(U!(F^d{on3f6}CI#^K%VKZyd#Vput66)G3A{_`YJ~ zKdiq+rnNaM-n?48lr-U>Oijj~%U2p?+C5!R#~zo;)@Sed47dYgH~Mcsk=W!Ba1MM& zv&`37D60aoe>qDwncm@^>Rf^bhkjck_RblUih$F$IzDxe93RifbHeK1H~g_z8s@XY z5d`xzdmoz7d>Ses_Y}K61?&}4bIaG+KqKFc`Q{m3=12zFvUZ1r1L4 zxA#Ib`DokgW##L}uX=dPfxIz6FbUXIlB|kc%dT;;HfTkp-KoKG3}IoB{~iSFc&=5k z;yD8j;}7`C>_w@Jl@m`r1IC(MPbng@#KBjhCeYIor^(S;3U{{pRMUpK&%N>4?jlRF zvHegp{WJ2WM}-`i?^k@l2{$S$4vi;S0(gaAqegyDd%q->9U*lUmvwyCk+S|~vo+a7 zX49_A0a|g1{d#k_+3>oicWsdnCwndRZscF&NLb9#G+P+8SbYrxoRL4VwH=uKD*^9;ix=(?^f z6(hRUiI{hi%vb%83bf)VwaZ7AvhmjQiU5fO^qzzxL;c2EJr}}&W8BYIti{AakX~g+ zw(MruZ)Um~lIsva8TkkW0Fh$6mxYw6n})Q?Bcnj5J6_%NNH#dIa5MuNTvDTH#PNZ_ zEch%yzQ^nwk`ngbrgGyqe%+Bxxg6^pyCw|dNeXVegNgYg95;p!DxgUsjCl7=3)ciD z!0Y=(6V62byu?d|3|H!gLQ|Cs_y{ENoR-IUPOJrs$SBGmNs#3s%X&biehIn(g{bA; zzvh;O!8&dI>KfDQ;^iArLrx3;JG$>qR~5S2T2^9){>W7JfD~EQw^QtRo z#g!dm(}A)+TV1)oZKodZdh0e9zpkW51c})41L|LJ(bp27b`kd(qzQ;>DkURV+yJK2 zs!AhD`vo2TlNl>{=i_T>1JVqfkJM!2Yw}&y)u6!{O%n{^vz--?j!WVMr+MGuuBeHR z?r;hftxK~bX}N1cZ7_E?B=05S)q@b^j>d0*U?b!#e4qqp5xNlmO?{z#;f0QH3G*l9 z2=ul$V%Y;|aKzk|vi+ypm}hr*P5dgvo@fi#_G^8vr;~;8!x!oSgU78mjZ|L z{Ti6ip8#1tAnqIq}dMVr|U4RCc?QXeE z98m=bUhh9t)rpEu&=rbbG0dp-UsPjfJ^%TOFSpniXz**H&)hE(4Y~9)Fz{RmtIhEl z;>&K)XE}43&v~>=rj%A(0s>R|e?A6*?^~?A(V}M@`qPbtFK8$tQUT%e!T;w*9C~-Y z(NpRfa*ajS^ruuh*~v0y$rhUs`a5KxgD$Q|5k*G$)+}B@J(*E^Posg{D0*@fg3GxZ zp5QZR#o64{+f73>zL}i@L3qrV?cSdKWbJ3OyS=55#?`o)RD_GWp7YbjsVafQO`41E z5kRVr(s%cu^V=_fT1XaCKRt2%AQg$@ZwZIFgk8O-1^;(ypPG@3D=)f|;TknV;vD~2 z!#S-Vxkam$gY<>b<-7-;7PGf6iAMTtZ;mS{K2f0-(8avB^8Ln=Gn0J4@e-HvJ4R=n zkqK7O(YkX)!kzFpXvHXckxg?vw z%u&AXe$XdDqiOr!d#0nGzV!%+mUZqG&eM6Fi37>?1gK(2;&{By|1~}nQ#?bfAaVZp zfaew$Wq%+v#7!7yVR4RsuXPsq%9q5XBYO42XayBi<8)_}BQ*#(bWWQ$g{1lOcCW77 z;_7(@+wc3i^2k;Sm2mXX5qJQs{||&iB|oTh11xbI-b{Hkp@bMM^U;)52jA#r1$@wo zn`X-Ha6a%wkl5+T_c5U7j*~)dYIk?0v#W;wGenha2#T+QPOKoui4YPzsEwqx2cQcS zI}T*EeTL}sR}5TF$FgMbaEy+emJ89knR?lJL4)HQC;r=srSuW#x5`6G!2u*1vrk3-eX##gYoE zK1b`m0=0yN)tAKi1M&S{+b>9FES=T~5Cw$@dqM<=>R1Ed3s8bhFNzat2TYC#x*kRB zw9j_t#45YEG-3VMf`>erxjhYck>mBUkXBfJuE)AuBRT`4T;;|>t`J@{#bX<&vO}u> zBF^@grS76R6nN>}Bf4Ir;g1&g$x3)VYxZHbRBlg`V&G&rXj8X^X7n5_ zF?=0I__gG$`9o(%Z7`LI;iF%q99l?sC?@YQlH=IgkC;egJYf~xOL8*+E^9x+@(oGg zwy+)s4RaEeRsPTmp1e^U-{?-S$qjsSd+Pq08=UmiMeWxF#KfH7E@|~os8Pns4uS%+ zg3b;wbBk%UtZqVGcj_6ntKzZ$P5MQXX6B6#fS|CuWkmjYs{qL=m=mE`yAQak*)Zrm zHG@_hQy360c}*z)0#7yuBno){OW{=QdG@sKYawSL;r`ue+?QG4P>&nr-qm77F0$(}^&?=#c%FH_x=;-T4bCvpv=++yPGlKwkQ1uJTX|%X zs78!otAf!n+eM7irvBP@V~j`FA&qKe9^SO2(*`uO!bFbK{c-H7s}!F^LA(vDx)Lud zpOd=a*ctFb1D|e+M!h3yPiLgs>bJGkD^V?3&mP6%UeZO1=&*`yQS*w1GBt{lzZ<*Q(RaYw?USx2e#n0-o?ULq=3wa|$CFBE?^N>n1#xE(^0Oh?pdbzgUdzssHiG`Mn` zkNP-4@jJK5%)`aG30B|q-Ox(xuB-6_5#dN}t~JZppI@PcxdJ%%N<%ky?hXLi;#@@T zNF?j-6BB#M&XZBg2f?m%SF9q@B^D!)s18%FKg(_DWhV34CRQ{{?D|(+dGxU|B^Pj$mGu z9yS2K#Mp=XF~q}0Hkz~va_%=2Zmi02%T^-)GZ_b z;K(fn4g9PV4fxv*2^t(OwEv4@{X!YvoTMiSv67@eHFF*FxtG(7^;v7*Gh<3BR)5hkCX=;OLk|9} zPB^=OabmdEl1JC^b*Z%1tGoOlNsxP1Czxsia-p=aG4GoL#m&(Bi@JE=hgl$bS(}B0r?wfT9&;IIbm}nuN zY#%UTk)A71&#rtFUaS=Au!!0}qJ$U^BPfXgxGLLqm+_p~4rpKW9VKsT_|rZ+pn4gw z0UtRluq?nAl690!@H&s|W3UKM-Hvd}xNKUU8bk+6q_E~aQK}+Pc)3A5nP3OM-cw^K z28HDWxB!LN7#hj?eD%#H=R<4Wj4w;xI22xrpM*6#l4LjBlR&>*2~PVF{xob!L`J-{ zYYcrY^2|`YW%u(Rjw+nZU~$9<6pMJrh&I!)LQ3LTu2ugz0T#7BdTSWIix|8~^~awg ziep;`VZuwa5Qu{Cp@kuML4$+B#}IANYh(0|D|Tf)E!e1rWoW|aOPgKc)NAnazb~Fv zv4&0R6vFfN#kaf1;>7~DC_SE^Iln9Y=BD~3C-~R2<&EO`{9cBHhU{G}ixzz7Q|@nY zpc&2?*7PF^Zc#N&nId+?lH2|~Y<{h^xSJ}`Uc42DqqX}k{S4~&HVS^krp!i))U$;9kni1Xx)Mqj}yu1 z>aq&7sl(m$etb^Zc-7cKd&l_vh%CT~P&_`niW>vP8h2YMa(A6U_vDJmY(_068~qOo zKmuT3I~P+X=WrynX}lZ6eD`R)YFmZWwO}89uT39pJAej2z7mxGW;qos7Z_S9HhSME$Z{=N zsT0Ga1ExISND6yEgB$#YGS!lVoL;9wIbH(m?$#bUhhVY4b+QHP_16UF$_$<~CCkj4 z@Y1jATaJH&qyu8~ZdYDKLWb2R#OhX+iSZ1a_AFhIQxqn0dT`7~{6K^2zfrc!pT3$I z&HRwizmN;p^UyqrEty5@l^$c|qZInhxJmR2zDmZI>{mFnw-y68@Wu2J(T6}-BTR90 zyk}8~X_#7!Ho$DeLCI`yV8G%TG`Mk@0vB^1S*=F#Jd|S@_v`L{FE1))tTECb!{iL2 z>pIgr3nDc(?sBLf@Td4I9?wAD7Y{j%F*ZkNnfkXcPT#11`xzFisQ7q2z^sVxnTUf1 z2mgxwn^P6$UaTACCqQPABo+bxJ&&A>-ynIKb3By5{W5(QZ&cPVcxquTzc^up5NNDh zIaE@hiA2?)`4>Yxjs+ZAChrQtH;eWJ7)wH-fd;2pH2nIsfZ-~DIEcs$H`k5E9z}?5 zPATdE`Kl{i_LcfUTHa9D&i^ags}*n+tLK7)bFAZ9{5kGRM4~yeu`dv&)e4bKQtd;5ehG}@i@9pD(SfgYdc1*q zsYi}Ktx@^&@>1@r=ED6!gX299^}bS}?8K?hIeqVzbgo!BjETig(wHSpkl<|570cXF z_tbYi+Uiyzss2TkH44BmTi5ps#_Cizq@Xm22}-?Z!z<-*VfhOm!nk||0;9P_(O&X?JyAVVe0LMi4$;9tx7Ps?NB zxdi{O;TC^s!o1sePuBeR&~qI%*AeS!K!YPQ5v`?O9nBy9*iAvt&tiyOAtjfA6rS2dv zt~Lh^E}}r(3Z0e8bCH3S|D*P$J0xg+Q`_IqbO{!-AcMNcL#(xXCin8@$MM4{Z~Q>r z5%90>1Y4!{?KT}vqfI@QnQ&WjyTV~{-HFb0W_gb~0W`RD=ly?_omE#H4UmQ#x8M%J z-627OI|K;s65I*y9vp(ZySqCCcY?dS1r6@|UGLe8-uVO1d8=o7$_xEEl3S(tCL-MY zJ<%qo=^_6B>Xj-Y0rr%^T<^wTcvVRqH!Fv5B>=g#Z2hJ0pr3Tm@slz@P+D zzm=o-S{)kX-+3m;{4ns_F`~LUD*mifhV|#AaY-|j_gaMXu~EaFtTM_VD(8A1+rtgW zm9uYL#){P=M8GrBS^*cnXBQ-~Cg}ur9;cTziQt) z=P^DcR^IyYYt=UK=f6KqYOu15jwE_ixU+k zKyP#c#p8VK50JK+tkGqhqo;D!j`gmf;khPkAo$z_e`=uqms0Y_1GM7Ar{KtDO-8*Y z#rfrAlKx$l%}0xc8ik5+|Sew{bqWhq3Y3#Cw9z0ck~ z`g^7`rK*8=xROuCoqs5#Pa61d^?zdlFsobi&M+(XI@;8tp+BdBcQKJCynkqxj^`!_ z9z}?`;^4Ci4B>LR%J2=;-T_))6xDN>8;RL+4bdz$t?4o`3zR2BalbF}uGSq&V1ia$ ze)cW+y$>_~majV$`RoI&$!3^`TInyX8c9w=ZuPFO*|ko~>k%(ixV`1Q#oiWJKv(BM z8TV`uic-4gAH>>v5JpK&|gu*a)CSB2xkE(d?Z1`#a_-kOzrxd!Zfuj}q5_BkpF-aWF&%j~!j8marJ%Tl za1*p+?~2#&x^}JdjsLCR5z=&o1OAWC`~Uis*5nvl3^`dMQuJ%)y*aN-$}!d+|FnDy zVflNha&X1Rh{t6x-V!s|{@;=D{p1Z|;6_7-wQgZ=<5;`Rbu%#j%(SA$o0Lu3L2iY)SIy+<0ekh^o#MQ)q=6P z_YeTa6h_#uk@OdIdNI3+txo^N4VH6X5A+qun=00f6M4|!k{+{GR*EJRQiVh4mx_`^ zqN|^ERk&SE)e_>LxpgOemX}XSQK!Obnl5Fl^NVvjfgc#&0XOkHj_8m|k)sU~RCx*B zX6kKy9_D_}7f+Djf5*vvww@@PNQ&)s<27Oll^qFUu;udCgk*_o+AgM{&CSqW3)tH|?CME_uCB#~6HdX|IZ!5w1EY1xY-b{h}og2074*Yfp%OHLm9T z@VdT+!I)VkOzYF1OfyPb?AVASgJ6(1sciYg&|5`EXoWuzRXz0S6W|w&CpQLlu1M*- zXHz9Lr9CO~C-q8rH31p{et%yUd`2Lk^p7Fo`RH)l-}_B@pKZ^ZX2c4%O+TByi^j@mGB+q_FEPAK^)OMu_f>k z>F947f=_&UZN_=NmxH}0l^1|Cih+i|va@(|_8l}hlGeuPPFjGncdxgVu)2A$m?+^( z-uohLgvP1$@v1?>$(? zSl%cA{X1Uv`B+CS_*wlaY#7Ca767 ztHT9top{AqKP^^5R2snku3?&ci2@Sa*C>8?2b&{CqCAe+B7C#c8k>rGH5D|t1#Ke) zZ@x6i<0m`Gm4KM^P`Co487-}r)u-oxj+@UP{csT_v#J6zhKyId0~BDmfpJGES>mV! zao80t6S^fhjb3{NGS=7$ZRi6k0W=jt(BNOGP58VsRL8Bg59_8;^cHU)lmcC>4QT@3 zdOMvCv}-i&taoIeS$fIU!c7IXbYcKLidU-m&mE4DXkOKCx{RKeE>5dkD2?l)YiC^O~a~=%cy$Q!feg716$(Rl4VOxQ#*2d08%_-QWBu@r?HObCRH1x?$2i z0kT!isF&C|vXo*m7y6i3G?TpLNWT(h#2uZ*bhr`PfmU3rwmd^a-fqL|T;CGZBq8#o zh*W$42U;<6<(&xGbmC@J!8# z-_j7a#GQ_u(Yy^BoIu#lVR8wPgkSZlN+3zF_U{*b`ag%Rx?wphyip0(ubNuQmmu-CrnnvH!j?{h+;W17e$8AVt~?q2YO z*T_;kA-PKSMS3LrJ- z8Yiif2lIX~vJq|7nFm1IAy1!g!*688p}r z_j%G_S>pHh1pj-MT6loH1zg4JalKNX(#N+sVT};!hjndk*oLBp%)DnZ<_AdNDpE*k zMy0Ht{P{y1*I3&Vk7*P%qMJoi7#)3EsQ(LSa5H1Pzh^{8=dOCrx054hmDNmIfm@E( z=8ggt{S!5xO)o&55Jy5qv zsA|Ce2{btWajoA!CX}Co4QNV$uBp+vmc6|@xC`LH9rvWjGhhhn%e>?xw&9!o`A<`b z(SQ_?atV#8>_M^_a`<7kVPAti8kgZ?IX`+Q@b`*m^&|ME-=u07$8GCLBx^U{8+EBB zb*}1O-o$r?db5H+p~o}j0y&DaX@O+;iosW|)u`b_0pNAzu{cKjyQT1e*i|nhlC?Hf z*SzJ|v`D6@RlAw10nmyoyKTsMD7BAl;fl0_90x+kGg70KzBRiOMjf`KLtK<9NM`99 z2iSbOv(k@jy|kSMCJUjLjQoIv$I&&1%iaeF>rv!tyjWX{4|Qcc0ugGU!O1p_Dgw~F zp-a9ict&D&u|#huAIi%^zU4=tAsonxLRu$r&1U{_^&EOYXnzqPLjzcXK4(AQqHx{j z^DX-u?id(k{W4@WINd{~*+*nv0`JgAMH`()%aizy8$84}+1r2M!+o5Y`JwZp0L6@O zu1=}rLyw8B+0U8vNjmJMJBrof|Q~ zT5-Wrpc$rB>cYMnRK2OTbN069N1Uw;ww72J86Zunrw$UG<*&)NA3w%*H z5NEJ6+f&B_KQ&OR>4vR!2|L3U>aRYy_qzg_7tX(Q;5R)kL#P-=Lx1 zgV7(5%ZQ6ZE#6Y@w!|#Wl!#OI&(1nmd?jYV=7om1gG^WEe}OXS4x|2+;3irB|8^Kg zF>?8<5=7rXBNbH&V<$``o`MDkX0ERB4Cwu%=Vg%@z>9lZNRUEoSZ60QsrWKPHC!J? zc5<=XFPcP0^}jMaWPpx#YuYrER!wk>66qaCksT070$)IB=E_X+Uly8?3z8!;pg}^i?>Ev z=4>-Y!?F6(7qxvZ_n_mY>6RSxcuO?6i$dmy->MTCfK%hC^yLxT1oe}oKwlUxoZS~e zj34p-*%4$dANp%$K`TzAJCRoWBsX`ur22Fs8fZz*UozH^upjj8!VaZ)rCKy3CKzg`hN+)Z`X)amji>-=me>H476c? zp;!g`-?nw+m+5~%bvP#(H=${|T7p*WSE*gKQBj3)l`%MD?wa9Fw7Oaqlt~r}I~nR3 zd&GOr?%;$3#~I?~H_(%mbvk(p1Sa1?nu={Mhg4Yce?LI{K;q?KDB{*LOvc%AgGmLv#pfpHJ+B&b_e&BTqE%64OdV6ZxW0v*X z`htyE7*`@CXvNW33>ymNdn?0RngD+T4w|U7P7yNG8@2vvnO+iYRZHWX=ys!vA)Ku% zCtp~uWG3*e>!$Tt8P%T&W(PAR?~anJg?{BN)KJTIA#@<{2p%-Jv8?O-A)*F9Q@vZ( zm#im~phK!}QEo5=<+-aVvkCsYD#{pOKl(9H5^aX3xZ?W*J%{P81DMq)&HLcZ z*zW-W_c-wLw()z#XM^BP#OuKO0XMoQ9ngvs-dEU04##tX)>D4QEi!8zhF`Q}l_cyF@XeCCLxUi%7IYxS1nR?vUbN-ht-#= zPN?t$&|tqhA?V5ncEUu;}R{zmln#tLq2*IJUw0;Xr8ngclbvlD%4tsl1~_}P)1 zgmY)rriD%$Q7`miK!eK>=g96}VN63Bo^(?;A3di+g_`@fpgI0#mY^Ve!x4yikU#AA z3>@=hIAm#uXb}TWtiLIUe!D7qy#!3$4KNh+P5GT{C{01cKBt~T=8J&_C(PyU=Fj{} zh{l>$aCERE7<>tpmVyz|GBOpwg=bU$MT2iIcWWDmRQ4gyUBzF38~E8QvBnw?xzg__}bk=mVhA%h!n8v5gqN?zF4cX6bs2WqdNT&w{d4cZ{ z$R9N3c93=SCM^=`IA1a&B%L%%G$XVYW1c?IT`{AmQjJgQl@~kqZ*x^#8?3z00gkJK zCRarSP%*fS%@8`(N-G6Sn%Q&~`v&)_W-n8~hpG9mS%lgKGh3|-KP1j4d!o6-uXR>5 zQ)M3Q#X8H)KlR+FqnXbfxu-X`J^u3_`GN!tk=?!QG8qtbO_GHV=p!Ndx|e@w&os9iReO(Mf%`bF8NOsd|zhl$>PeSXpC;-T&;UG z-J`f<)|3;5RVA+$LkEsgwVtW`J`bn4Tzpu$2L8Svrq~PM7P}%B2oZLIG`oLt-QY}O z%wkE$_h*|*#(_7ii52`zTTHiH{k2)f0;{MP-WU(LmLt{I5DQAWB&0cQ9Lxu8Ml1)u zrJ<`MXN{;O247W|W+2vC6+Uo3mvZ3`N?$D$>4{Hok2#b*@A=5mzvs?~VbDLPsJ;mE z>dmG$h&X7d43>s84hcJrTZ235rw}$-JG}+$;?^V+7Z`@^dJBMd_P@3wfSTSHXA;$g zu&%#47!o6=NPqPszP0j$@zY6(Vw?(i52Q*=6N#A`+og)HIR^!)#8_hevMvzSBI$8B z$~@N5XjDRSkiP912^C5Ufl5lsg%!ZXWK%(-SGP*{v_WN?`dzO?g(_rr@yCD|J(B<} z7knhqpn9)J!L;>X;$bQ^;O53Y+`uBn-F@Vrf5knnM`P{vmp2mnKaoi1GSZa>Q|$2E zz~!yzP8dJMlu)8f&YHX?9*M8f0iC7=YHUD=8+y4aXj8}c)WV(5pcH*$6;$?1JKKHX zf6$#oL%h9#G>U9G6x7zt4Wq&e{W`m+eEB`k9+x!4! z*}!cJXRfSL+I<}~xLMvtxzSwhAvzeYw*O#cU-}e#pgoM(vmDsTCjunv z2{VTv+=YHLEGJJpfhTMApOOdAii;sWy?sdhc{;(&hb*o9v3xJQ%f|a7QFYeLHTDrM zOcxGL!{o}x7+yFzinPJ4P=VFLS1NXvE zO|j@Smf~~|WKml8<+5m~ufnxr;Wz&zjct=hK!dA&8hY5ZrAsI4Bs*N7Qp4zx@8PiA zUk+v*UfNi4XhkA-1OytE+HgPg{3P?!YZ3z#(En1%1*K4^Xa<<3qn zYc>&4+v3k024x+grG?p{EHT$At5G+o>E3VA)D6Q@-%S0*C%$%?N ztrdOt5|(IYN9gre4?CFXz*s3ubdH4X>=OsA8mtUjmKXpv_HAx0fh8Myb4=BzQ0c)= zvp4%mNhU}9RPF#8I}o(uG9;9{^7VEpwzra=gncB*cbb!5bV#~a7&Jw-TKi|YAEjIR zA8?l9(xW^vYg+YLfhn0`;yn_bShR3OR)U4#)9&X8P`Kc#WW{t>WuOILA#~RFDDdmxLcK-3`VP z7rywydq{B$TyKn97Y|{s?QICEwu1M${NMLBP$Y#BMwZi-3?30*KaXTp1)sRHsuJ#@ z!e16Oe5*wGwmEX)urof3{f?ndqXmr3U^@7`Rio~xU6o2<6Qznk3@`6V zaBOrOk3qVOf={sJC^`0{_5=7GGlHh%2F~tw*BCOcrB7a8yq!iry{^Kle0gk8JE&)+ z!d;XiPdb|bq@N1p^Y~l;rlR((nyvGw7QG^7ie zzz<9CD4!O zEZKE})D|Q?b1ooEo3MYRX*c`PO33QzFEFFheg0EfQdREletUDA?gxSRP3zL^7vnid zb%YB1Xwcy3+nIxraFP?dG0u~yx#U-j&#l5?Un?{Q``phsp3xqt1g=6y5athk{2E(! z3Mz4d9?FVGXd`7l?HMaK#Z3=~e@Asil%WwtDytrl{8HeHn)OktzjO^N@vU|ZOfZaZ zdn3*)n|sMKeLg=!H{a|DAFs7ANbsUZIc_Pau8m9>Hvw}LiXmY-uqpM6477j4r*X3G za8?zeR=9lA)!9->DnTnQw_*FavYR@GA^ML)eE(n?FHk-`YPAqDUqNshhk1$m@x=f> zEO#Mj)~TtNI2hI&m~@-dRyCFKBdbFwR*GK!^)Kk|M{>?%WyLCFcI4_G(BQhB*x7HH z2p0`x#=klKK>xFL|4yY*6DAV8r}}VIlk5$LwLd(oY3N_TUU*SR89e~3!sFMhhR7~_ zgK~>%t*rG6Q^w8@Pkv_<7ha?jn|1>Yj;*QqF*C9@^S%qoAnC;(^P62RyK-6`2it+G zRgJ3I%WOY}%-l;Q=QPAndu!T=7$~4A8~Mm`iN56_B8cM)QNq`T5muL;DHr`?;`qQA zyq8&imCo2AGafRnixDUb^NA~$d(o0(6pQM^IVJYFv2{vUazDe2u^wE^-}=yXH6l&G zhw+a3;p=J<|GctiWV$qcT`nV|QV_-%DpnrVjpjaR#ZjhYQag;h6af++|9(x6W#Ka- zrQ^5RG?0ol{$19bXY$^u7qZ5I%I8fO>xk)!Ag zS)TFOra-|9{pm+4AL@p#69QUsV@kvxYxM+&e+u+g^?57FfSa<+^4|kV+(x3QnXX-y zOWHcLAjCR{%?YSC^4~$-|81jRfyA-Mdsf;GkrOtzOu#SLN2!3O{n*DvhPd>83>sV; zvXzfp7FV@B*y&b&Et-)wIp{~RMVYpkn#_bMy#MD@$?+yBYG4G4V`U`EdPgy^Ueu$z z#(K&yH0`PbG5m)}Uqof-*I68aJJC_OjT1Cza2(gKwM@0tA4jLFSqqAY@8cb>N%r&< zM#P&7@2glAfgS~tt5ytmM3ure9RtnN#lUu<(78#itt#@N%|pcpE*YzVH%TtDd!EM0 za*D%Z@Qy&?;*sQpYy1}*+&3jX|FU*>WEI@L!QDGHmMFbj=BIFW9g@2b-_q}mZ1t`@ zJpcp1E;=R_30r+V&4H$@mt^*?x|G_NPX*md%GwVq;hQ;V#krnpmi6*sZ*_^>t?34&z4hNlh)!T-DkP;b2hbRQ1}&V!(#)hUpvYxXiH4d)eJOy<(pg zj9a|OW6O+ip)Ez_ENE~s5o3UptF0?4ki=N=siSVUO3!Iy`V4F4xsuMw#kph25 z;pfA-#W~BCy_8=7|4}^jos4x<8trX1S>(6jTOZ0W**{QcIRQeIziYuq5=qc2WIKGR z(ug5i^IJ3SLvd*L#Tzi%B zIqMNq@t1n1>k{_d^wzknmD{J(^|Y6dX3n)xTW6rbm9%emCHl4@9gPb&awMZt8I&F8 z?)dh%sqYsgLi|Hjz2!E)7x_p+6iRE}qb+g|01LfYsr%epQ`CpA#gBs|kn)PnOqGG~U z`q`xnEkxN#wK1X&UA*Rj_dr@OX}h%&Ezm6$m&i*GyF~9|MX*97$gxpbS%xuU9i1?di=&A(OE67{?r}*T#2Avh(SU-ANJFxxjm0k>; zVUF$L6h{tbkHyH*r&xKRb2rb74v&8j{7`Hz@6`()b<@X*i}8eyT3<~jUY~x%?vsCp zf3id@I;`b^PAwAH{GR>(_4VXP;LBPU(2J$k!{9R!G^6m9lwDen-S2hzXk_`9sU|(n z8$LgH_crP>9=S%MU#D;|Q|-HoIT3?3Wflzr4QJK9e_iHoS>J2YHms%k=z0*LoH9E# zb^@UA+6=$sOvSpegE~4|5JjD)L?hXB!hmw9IT)H!!~^=vmD9mVCz0={_5-yODSX|q z!e!ZEM8CUcNh2P5+Fyy**1>hR(Vy<1>{oaf^UiXt5#WQ1-|3(=_hC`&0f*1uNc~V} zBBP2!l(;TxeB1mv7Bsk4Mc+XO*{ZLo7_gq?6W}mdu2^syU=mJUDbbAD$-02y*(bZA zA^1CJAsQc%E#m{&5s(i23K=Oc9!TalA1T58pk#PTjXR%O>#d+YnFYS1Jn#)mC3af; zd28qq?OVnuT>rhR#A++w+bgWqFX98jqqpyxjCi%mH>kqz>pw}aJ_1~gx>%Q6;Turg zFxRA?brx>#h3aUgkLpGW`lINmzk*i$>)f-O;1{+~Py|8&7WSt#=d?W?A(j^{xYN9p zb))|7|IoZD$9Q_bn`{|tb9 zxIfDICy6bg9z2csddN)pdwmD358FlW%)TuV|Bvk$L9~-LOHA1g*=gqieHSkLLB^R9 z5E0H(Dk|wEusF!$l!x;Gd(#qpbK+&9idGu)8ji2tdpjC9&wrzP1qyN z7@KiRdzEAmXvLNE=V=C%Qhs>I9-lwqjr9 zfR`AR(82i^QT?)84SR3A37vYyn;L{G>wzG z!UAlOzrqH}!EWdx;~ehf;DiSl1uH)64w!k*675W z&C*j8X)8@TvK0#OX`CP?fHp~Id9w~RZs!t+!FZuUR@%909`k$zTj)q4i!h}p+9;HA( z;|7dTLmUG6m6E_)#%Gi9+^wtUue>`pd3O{3<;pL8GzwR){jHV{qh-7ML9*gG`;#iJE&e(ch1 z<0%5U%zywE)?QwpAc0Rc-DkB9|0hehyt7wze%dOPu{=gC@ZH7{?Y&b+LdztK-nMwG zY(Fo;$rVK-WzXT)M)$Sos0U_NVGOynOQ;yeGJ;@D$E+KGmt3+BG9j#wkJ{4`nJxqmRy~p+Q3lD?Tda ziC$p~dn?i{W4M~QRXsrSY~f2d^#vO~E+mI|Pc5>CFm}btSJ*L?=TNGY_$AQbfGY%S ziROYvMSX;!$tp~{jmi9v`MM)HFsI9i#k0ZZmkM9(v6MW$kNerL4%{^+EkFLQZ=)NXV@UaL=C%|sXi}F2x~&9 z8%eN#$C;4t(CRRMoHkUP$G~E9m8Alv6Q6#1UL`ph+T{KzJWqDZ&u?sozI;NvE->?e zTp0un4sM1Wm>sAnW~}4iY!YV}LY}QHjR@i{?qhL*b8CPYJ4Si~e`IkPDveBE@4-X77U&1??|=4o-gQyw%sj%~kFn>rj)g;> zI&2B8zt~K>e+A#q^>Ztm_xdDcE(*GlKblvxd7t0lM*Ly8Fki)?Mc%66HX3(1fJMWv zUF-!G+dy%D0EowQ=Bd$9=oYQgO{=syk}9~jA5?G%rSIRwSBww%FO>sw8n>92FB9i( zkW&*k-Kn-r3sp>VFre+r;|n_T)A+_$j{R0f7CYf5|35Kx{qZ!=trb8)rJqt@Fw`E} z+Du9veI2{H(tDYQiwjH~lj|V0F8C`c2_#!99jl+Him0mXazAwtQ;wID1hB0idDrj! z_?}Wf~IWZ+W292efAdBb5TitgQIP{!q8h!bf55d`w%mAj*l>K zBlj>xzCkbkQ~)`O{@=@Gd&3VBqF56Gd14HK%flG7se_cergM!pk;7|6L<3YAf^xfO zLf1$nUN>SUn9>h-%p<*Fw-O zllA|*L``f16l$=+>&b@%ui_CQfewiW!o+^MWsnl4iFH+;YOs{=n3VAf~n@)LDst*pcU7g z|A8K!%APfT9CZ-lOx3|@GiP1s;rWWh`j-rE@CQW3>&VLZLDv$Q)^AAl&wKnpn|1rQ z2C)X$>#d{4YFVbG;P(rx+3qQa|5*6;ZQbg@je9zX$8EU!lMEi+gqGHqN!#|=cot~wK_|md^#lv%}{8arb{kd~D z_=&N>KtAop2m%zxFT1^Zh3}bqw=447^h(@fyPInBx2>2dpuzPRWm6?oCYKD6wIySz zT_q^4GMMUmug7c62M(ym#z`Ihr-ZU1g_qWtF09R8jza)`gffNw>9qTAteU!Wu~o4S zM}Zwo#*8=`hhnel=HSb?Nm(rj?+hL3iZI{x+l+K@l>_^xV0s{mdZ(jaEIVV>>=$-@ zS^mz5EKBU56)ODL1pcJ?BFX?otEaMXBT_#PO_?`k1Ewm=;5h`P97BGVf>vB~`QOFp zXD*Fj;jn+tBLa(WwG;TD;k4S%6o85!ILkt^LdmuU$>)S@95K$wk6dJcj0(-g9+8&{ z#BG|-0n%lKn5IUWs}{Su0n5{Qu74Y7a1QBtHxO^&<$3-zZ@ia@-Bl`GOjG{U+ky031&BYMUy{$Chd!-BnO8Pg_; zUeMt9>;`?mv2zk}*INJb^l&(bVRh=;Dr2s%_Vg{@i%?QiLW*}G9M_#lA3i9@U_$f& zSjQF~&cO4)P$_8(`LGP%tjXtBeAXXxH(NxH+B@!`!O`Bowbbux3beg4Lq3N`-+3J; z`!Ek$+$u1;PXA^NO>=kg%Mc$5sdH~wPZHtf!UhrolY$xh67F1`PCi5k0{;XvrmfVkqA%ab%MnZ$Y8_^>2ofJ1?ry#r zeczGk1P!h*dU1{*;2juyN7Y5rf-5ZhiD^_zH@C$JVKTIarhdv*vjl(qYK5D{NNn0Z zh=2kF$whG>k*`99W!cMLQlQyvw^hBwIxDH&6Cs>aJXwJT=Lq2(Z}TjPyYRhnA1{9971XeefXkQCZ{woCz$T%!Gt*uPy(nqaSws zvTZMQUZeD0nP&ppZxn$38m6raR0C+1arm9&MAGjf^DYx#Ly3!v<^S_SLHgB=~kbj(DDa{0N+F9G?pW+y};HG{AFrcO+5=*p| zbGhC58BRl>EJ~zUoSrt-U0S-Q80NrlPWbQKJFiImA$7&1O>#v{Pgq1nz>zWmRU_hY zHp-Z!hXu2x9%ZPQ*Pnp1;Izi_epukOvvSC|k9(`1H512zi~YYFwIe5JD9U8mEem4| z*Wh0u@sRDp_re=xdJHzaqgXUWlPS%o4EIT%UNDIlc^V>)6glJ<82{L*-#xt80u3)c z0436IQO9~zQuPi8+QE#5@3hgKg*05a*7u2}FYn)PL7O^f4x8GkB|lEB(-?&oMQCUQ zaeHfVX-k2P!i#J;##m2tdv)Yol!p3B4)brA;Yui=cCuU8G=pSix#4?XLup2NNKLY@ zk#(@$O-#QQlM6m=TqvwCO`tZcnHzBtvBOJVA-6);YKNwoj*LWNk|fx|qjnhEsx4LM zr@F5E!}xRG9iWHCi%&^A=oUn@=Q_t|>(fU#jdu5wZ{uN2;L^M`7PR7k;*=W?dBe4q zMz%Slnpf!%Ysr$)R5&y`7%3`+&m#yMb_w_ zb;64XtNZ4}!+!BR5%x=oH-KLxQmg7=?@3%n9H|U%-Hb)XXV(B12O9qea^tCSOwizx zn)WP`a2WWZg~Kn@E~fl6&osMN-N&(ciTepDH-)R?-ySj?XXitnd80MHV1Ee$tSqjd zeRcgAHVFz`tq*i8o&*S`IOY0Is-Z(n3p-UogBuWes~F&W_-jy8`5UrGMSiFL*4Kr;KK&s%

R<?me59^E5)-{#{9WyWilX9H2fNPkFP$;e0Y=J@u zd+_3LLxl}zbTJoMRu38+L`OeO_?J`+nyT`Z!bm1xzQMXn7p{}c0S8->uV)vKS9HhwK&P9_kQ~^P>696JR<7FXIk8PD9?Agvkh-Mt* zH*r=8_h)Fog2(k8kzV=~sTZaU;7dp<8eJs3l=20I>m`!DOf&+UmxO_X(i9RJ-u z3+!HN7FcD9Nwc?H5wVVdua)`guO49Y%9V_X1#}nwU^gVAvxzI)I(b}S+q7!q6UivY zf~=>CShjDn0}T%AzCfaDMfc0e`-7PvJ08Vhmv6cs6j>P)CL{UBPotqffhQ*~{wm~( z-jvg^ELaUl`0Cewt1W+PwkSQjtG4#?+8=($JN{Rbv0%|tEe;zrxLA*FeF;OHMEKN8|WgY%Ss zrMZ6zTj;dL+M$qvG^L=-ADB=NJTL(JsCs?}Ez|T;$wA z(LbJ9&Yr1f$$~wa&a>aB!&gci-1ZMdfPbZ?`y|!;c1Zu*C(e&>koL%fhV1w5NF+T ziwpaJV3S(U?J~-t&>n*lfH>O(T%ua>nW&)r)4M_UY)|omqV*9DKKkg-DwIbB^*%2S z8eE;bES1#klX=L-4DW%r-%RDy`o{AC_eHO#oY=CIa!E>h^Zavk-d^2I$4feiaUXyv z#&DOR%}dOzA;qZ1_*bHcwz^hSReo6#$(oejjsZNFsfR~1BS0qYs!>|L$hmtp?g(zQ zzH6B3zl<&+Z|`<5=H#RBcsSb6r35J3Y{v%x*OfOgh^qw_8NrHQ>so@x^!T_6hjUrr zL#U#xpfC8bqvpSsQeDvrOiO)U!aeohZv@0Sx4cSkdM4W+O1cFD2fh&?N5y=U+EB6p zswz<9SO60)!FgUU9573Hppnaf*(-J9zL=B>> zyz++17AscxvV&ZS2Sx--QU(=|>P~pA+%qHQ6#TYEs5eMr%7tF3fXJnYSszIc+iS#0{SPO zRaITuxtd8>m1)VxWQg%oc6Dk{pMQ>G?F6yK_gI>#3A-uJ70Vi`i>$mJ z1*fpHCULBH${EPxs>TmU*p+jF!oC)u!T#jKt$6IWkLxbz-;u{T=ZpQA5+oPyo!DF@i`-PRgH(c)QI+?75ufqAmVJ=qiF-jHZNd zx}d>Pet(l=9yaR9vN5~K;P;4{J8Y|Pg|ft6{470Bd8-2&FDwkRn?{ zKTyH*KA~RAIVK#$(nfe)wClVMS)01Px30K+Zv!mPV`QILOp0Ck0|x2NJ}twC)Tr+!!2_s zcxb#doO%`mdM%NM`-N(_f5K!U9~VRkPCjY!hOt&tY0RBxdlP~GllXOna&jivulA6q zL*~+na7#}mG56iI81-xEE@EC5$Gh4`Ma1npIY}F7)XzxStLuQ;2F`K}X*C9dUl1y1 zRTAnZeqr>V4P$ffr|oJ|eDH0~p{m~kjH61uD*~2a|M)Fav86ys)WOgAJr{(nVCTTg z&n@S`#7>WzmCX*ga|X@p0lx%~MJ2fq%St18-q;sM62}zTec|l5r$!_h?pZ|sA3@t| zFKK$$*JMN?+1(|mL2dNkN#$BNiUCu)3zD8ZAB_0;Z9lY}KZ~NSH#Yu`cnATI5d}4| zO7&0lw3c~mb)@|}YO?!g%-SRvSjucx6Tp}F0!=!@k2^CM4RGeF#7<4|dJx9as&;0C z4~x!XthuAEv}}9AhihlK{Q@bmU=n580CPRh+(k|#OOwmYS^f}V20?unufk~bsZ?DdHzXWxgM+Okx{S$>!MI9L zx22^E)8aWvIFIp+SPdC4`wAwnTzq{$jIkD0 z0H{AZ>%DMA)>brmHEVYsU8si>)YE6Vnc)UD=sso31`W1i-eXGv4CB0Vp2NkZ27&!992YY|1)k8eY$Vl3?{h2kynl**Neu7r#a1S7dk&vxo==AS)@Y zZotkopwNS()^>0(|KoO8(7Y{lyjz3y->W)!aDm4jVJN(?n49Ftd`4ZBegr0K<^vRg)Z(k<;BEIW{0dl zQfHh39;mpw?+=6A1OyY=0>>||S0*S|aP0MxRh!y)DgQOm!8XckK4)Cw1dzWwc%<8@ zkY&2m6KFR!n`7~gHLJ#6Tkc_x=D@T;@$7RrN08qMboW&V0Psku3hdLg&nr$B;ERQns7J5;t%$%ZUYJ4R-cC%j; zA}X@w`8QX>DH2<^6IPLpZ8)vz2x&aC`qAL1sXE^gk_&}lh@OK6S5;%5t$Nw9tE;-l zj7T-1!JkhsqAcNrn8S-abG7PC2W(ih$sQ0zn=60c-F2|u0@rwv_HQODU--XLDUuDg z>Z0?&Xu3FpRYfQKo%r|~12niW?*j}I{i21fH)hzG4^>ldXs-vW@M~~l?qA%Pjm;C) zu~y+U5!~qEGt`ZX{nH5GD;h7MEW^h?OQX1)%TP;0)0)Pdhq6gJd>GUDpUx}L;QC0N z=SpEjS-h|7!dV_J-CW-)PzA6naxoMG0fV7XiD5iWAd(xAt2L7wwN#ppI2hQYgYFpGlM(;aLdGEckaan!? z3H`j|dW03PzCACzadUMv7m z^LPqaiHx=2oXW5NqUTa)MvyEmRt8-=(kZ=_=hkV0U`c=nyI%KA-CRhtt!ljLGqWnQ za?iurZF_x9PViNca$z?16aED>u9K?!F!e!KgL1qPfEMVfmu`F~66RHoJ=xJJ8-LFD zyO*kFtw>-h1=bDz^iK=lL!IVOi`UdwMz*3ZW4n!k#G0`g`bMM7_*ststlK^YsIJ6W zj!88M1*M(EYb^r5iR#sIMR~B<_pnWd=86uj&EnLnc*4n*=q{%rmEiaKv_^^f$kx5~ z$-Do!+}(X7Ak?UmLlnCGw1+XxaQ=A3Q1dXxR~`F-9PKSa+Bk>!UrqHkwaa*L=%)L# z%u4$6Ecu@^bb_!PQ$wu@+z1)tW6(?8lCkYx{f!g}ep^DPt=}pnbw2;oa*)}q2 zS$L)$(W!9!EVM&01i@Ok=e3dR5ppr;S;Zg)1pYR5&SLM#u8#=c z#oi+eK`uaHZ@j{xl&wEktNMrqP8>dqpjg3CtTpZLr#f>G!vmf8qhGL(D(oVo3*V7& z1j~)mApX@i#!8KAfi~VT*khE=z^`@v)l#~p_Z9IqdyhL^fq($HyAhIolwggj;J>9j zw;37-YwqUz$7)HPh#Wg2SM=FsdAD^D?_)&o1qX&bAH*{# zZTkj3!{uZD^TX1#yp(D&l?hzH?A`U>1%Ks#s=-kDQ;ISp6un9Zqc>r?JXfMIKetVi zYZ!YygPuMOIn9VB>dJ6)IcUsG>A<2c1

fY1D@elP`1krZY5uMAyI2PiKBPh<`oM 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 Date: Thu, 24 Aug 2023 16:33:08 +0200 Subject: [PATCH 003/387] Update besu branch back to main (#836) update besu branch back to main --- configs/cancun.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/configs/cancun.yaml b/configs/cancun.yaml index 59ce802487..784a37f222 100644 --- a/configs/cancun.yaml +++ b/configs/cancun.yaml @@ -2,8 +2,8 @@ nametag: cancun-git dockerfile: git build_args: - github: pinges/besu - tag: EIP4788 + github: hyperledger/besu + tag: main - client: erigon nametag: cancun-git From 6ba02c55a3cfecf5d86852140a790bac928c52f0 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Fri, 25 Aug 2023 17:43:34 +0000 Subject: [PATCH 004/387] cmd/hiveview: limit log bytes in suite view It was already limited to a certain number of lines, but that's not enough when the test outputs very long lines. --- cmd/hiveview/assets/lib/app-suite.js | 5 ++++- cmd/hiveview/assets/lib/testlog.js | 12 ++++++++---- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/cmd/hiveview/assets/lib/app-suite.js b/cmd/hiveview/assets/lib/app-suite.js index 949d082006..fff1f5532c 100644 --- a/cmd/hiveview/assets/lib/app-suite.js +++ b/cmd/hiveview/assets/lib/app-suite.js @@ -378,9 +378,12 @@ function formatTestDetails(suiteData, row) { let spinner = $('

'); $(container).append(spinner); + const testlogMaxLines = 25; + const testlogMaxBytes = 2097152; + let url = routes.resultsRoot + suiteData.testDetailsLog; let loader = new testlog.Loader(url, d.summaryResult.log); - loader.headAndTailLines(25).then(function (log) { + loader.headAndTailLines(testlogMaxLines, testlogMaxBytes).then(function (log) { spinner.remove(); formatTestLog(suiteData, d.testIndex, log, container); }).catch(function (error) { diff --git a/cmd/hiveview/assets/lib/testlog.js b/cmd/hiveview/assets/lib/testlog.js index 03c315dcbc..d423ddd790 100644 --- a/cmd/hiveview/assets/lib/testlog.js +++ b/cmd/hiveview/assets/lib/testlog.js @@ -56,7 +56,7 @@ function countLines(text) { } const NEWLINE = 10; -const LOADER_CHUNK_SIZE = 32768; +const LOADER_CHUNK_SIZE = 262144; // Loader provides incremental access to log files. export class Loader { @@ -99,7 +99,7 @@ export class Loader { // headAndTailLines returns up to n lines from the beginning and // end of the log. - async headAndTailLines(n) { + async headAndTailLines(n, maxBytes) { var head = []; var headEndPosition = 0; var tail = []; @@ -108,7 +108,8 @@ export class Loader { let eofReached = await this.iterLines(function (line, offset) { headEndPosition = offset; head.push(line); - return head.length < n; + let tooMuchData = maxBytes && offset > maxBytes && head.length > 0; + return head.length < n && !tooMuchData; }); if (eofReached || head.length < n) { return {head, tail}; @@ -117,13 +118,16 @@ export class Loader { // Now read from tail. This stops when the read enters the // region already covered by the head. let linkWithHead = false; + const totalSize = this.length; await this._iterTailLines(function (line, offset) { if (offset < headEndPosition) { linkWithHead = true; return false; } tail.unshift(line); - return tail.length < n; + let tailSize = totalSize - offset; + let tooMuchData = maxBytes && tailSize > maxBytes && tail.length > 0; + return tail.length < n && !tooMuchData; }); if (linkWithHead) { head = head.concat(tail); From f369645b53810a168d50445ccf71830554dfff89 Mon Sep 17 00:00:00 2001 From: Mario Vega Date: Thu, 31 Aug 2023 10:21:00 -0600 Subject: [PATCH 005/387] simulators/ethereum/engine: Fix ForkID Tests (#837) * simulators/ethereum/pyspec: go.mod: geth update * simulators/ethereum/engine: go.mod: geth update * simulators/ethereum/engine: ForkID: check no disconnect * simulators/ethereum/pyspec: fix genesis * Incorrect comment. --- simulators/ethereum/engine/devp2p/conn.go | 6 +- simulators/ethereum/engine/globals/globals.go | 3 - simulators/ethereum/engine/go.mod | 12 +- simulators/ethereum/engine/go.sum | 28 ++- simulators/ethereum/engine/helper/payload.go | 56 ++--- .../ethereum/engine/suites/cancun/steps.go | 31 ++- .../ethereum/engine/suites/cancun/tests.go | 28 ++- simulators/ethereum/engine/types/types.go | 2 +- simulators/ethereum/go.work.sum | 227 +++++++++++++++++- simulators/ethereum/pyspec/go.mod | 12 +- simulators/ethereum/pyspec/go.sum | 26 +- simulators/ethereum/pyspec/runner.go | 18 +- 12 files changed, 367 insertions(+), 82 deletions(-) diff --git a/simulators/ethereum/engine/devp2p/conn.go b/simulators/ethereum/engine/devp2p/conn.go index 0388c0cc02..41a9ab9d5b 100644 --- a/simulators/ethereum/engine/devp2p/conn.go +++ b/simulators/ethereum/engine/devp2p/conn.go @@ -346,7 +346,7 @@ func (c *Conn) negotiateEthProtocol(caps []p2p.Cap) { func (c *Conn) statusExchange(status *Status) (Message, error) { defer c.SetDeadline(time.Time{}) c.SetDeadline(time.Now().Add(20 * time.Second)) - + localForkID := c.consensusEngine.ForkID() // read status message from client var message Message loop: @@ -364,7 +364,7 @@ loop: if have, want := msg.TD.Cmp(c.consensusEngine.ChainTotalDifficulty), 0; have != want { return nil, fmt.Errorf("wrong TD in status: have %d want %d", have, want) } - if have, want := msg.ForkID, c.consensusEngine.ForkID(); !reflect.DeepEqual(have, want) { + if have, want := msg.ForkID, localForkID; !reflect.DeepEqual(have, want) { return nil, fmt.Errorf("wrong fork ID in status: have (hash=%#x, next=%d), want (hash=%#x, next=%d)", have.Hash, have.Next, want.Hash, want.Next) } if have, want := msg.ProtocolVersion, c.ourHighestProtoVersion; have != uint32(want) { @@ -393,7 +393,7 @@ loop: TD: c.consensusEngine.ChainTotalDifficulty, Head: c.consensusEngine.LatestHeader.Hash(), Genesis: c.consensusEngine.GenesisBlock().Hash(), - ForkID: c.consensusEngine.ForkID(), + ForkID: localForkID, } } if _, err := c.Write(status); err != nil { diff --git a/simulators/ethereum/engine/globals/globals.go b/simulators/ethereum/engine/globals/globals.go index 0ca476b185..ecd5fbdb4e 100644 --- a/simulators/ethereum/engine/globals/globals.go +++ b/simulators/ethereum/engine/globals/globals.go @@ -168,9 +168,6 @@ func (f *ForkConfig) ConfigGenesis(genesis *core.Genesis) error { if genesis.ExcessBlobGas == nil { genesis.ExcessBlobGas = new(uint64) } - if genesis.BeaconRoot == nil { - genesis.BeaconRoot = new(common.Hash) - } } } return nil diff --git a/simulators/ethereum/engine/go.mod b/simulators/ethereum/engine/go.mod index 829274e47d..ccbdc2fe7c 100644 --- a/simulators/ethereum/engine/go.mod +++ b/simulators/ethereum/engine/go.mod @@ -10,11 +10,12 @@ require ( github.com/golang-jwt/jwt/v4 v4.4.3 github.com/holiman/uint256 v1.2.3 github.com/pkg/errors v0.9.1 - golang.org/x/exp v0.0.0-20230515195305-f3d0a9c9a5cc + golang.org/x/exp v0.0.0-20230810033253-352e893a4cad ) require ( github.com/DataDog/zstd v1.5.2 // indirect + github.com/Microsoft/go-winio v0.6.1 // indirect github.com/VictoriaMetrics/fastcache v1.12.0 // indirect github.com/apapsch/go-jsonmerge/v2 v2.0.0 // indirect github.com/beorn7/perks v1.0.1 // indirect @@ -24,7 +25,7 @@ require ( github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/cockroachdb/errors v1.9.1 // indirect github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect - github.com/cockroachdb/pebble v0.0.0-20230209160836-829675f94811 // indirect + github.com/cockroachdb/pebble v0.0.0-20230821143352-55b44ac08de8 // indirect github.com/cockroachdb/redact v1.1.3 // indirect github.com/consensys/bavard v0.1.13 // indirect github.com/consensys/gnark-crypto v0.11.0 // indirect @@ -32,7 +33,7 @@ require ( github.com/deckarep/golang-set/v2 v2.1.0 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 // indirect github.com/deepmap/oapi-codegen v1.12.4 // indirect - github.com/ethereum/c-kzg-4844 v0.3.0 // indirect + github.com/ethereum/c-kzg-4844 v0.3.1 // indirect github.com/fjl/memsize v0.0.1 // indirect github.com/fsnotify/fsnotify v1.6.0 // indirect github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08 // indirect @@ -85,15 +86,16 @@ require ( github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 // indirect github.com/yusufpapurcu/wmi v1.2.2 // indirect golang.org/x/crypto v0.9.0 // indirect + golang.org/x/mod v0.11.0 // indirect golang.org/x/net v0.10.0 // indirect golang.org/x/sync v0.3.0 // indirect golang.org/x/sys v0.9.0 // indirect golang.org/x/text v0.9.0 // indirect golang.org/x/time v0.3.0 // indirect + golang.org/x/tools v0.9.1 // indirect google.golang.org/protobuf v1.28.1 // indirect gopkg.in/natefinch/lumberjack.v2 v2.0.0 // indirect - gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce // indirect rsc.io/tmplfunc v0.0.3 // indirect ) -replace github.com/ethereum/go-ethereum => github.com/lightclient/go-ethereum v1.10.10-0.20230811210943-0cee617571f0 +replace github.com/ethereum/go-ethereum => github.com/lightclient/go-ethereum v1.10.10-0.20230829211949-79f3c2d9c96b diff --git a/simulators/ethereum/engine/go.sum b/simulators/ethereum/engine/go.sum index dede867a82..f9ca0de395 100644 --- a/simulators/ethereum/engine/go.sum +++ b/simulators/ethereum/engine/go.sum @@ -7,6 +7,8 @@ github.com/CloudyKit/jet/v3 v3.0.0/go.mod h1:HKQPgSJmdK8hdoAbKUUWajkHyHo4RaU5rMd github.com/DataDog/zstd v1.5.2 h1:vUG4lAyuPCXO0TLbXvPv7EB7cNK1QV/luu55UHLrrn8= github.com/DataDog/zstd v1.5.2/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= github.com/Joker/hpp v1.0.0/go.mod h1:8x5n+M1Hp5hC0g8okX3sR3vFQwynaX/UgSOM9MeBKzY= +github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= +github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= github.com/RaveNoX/go-jsoncommentstrip v1.0.0/go.mod h1:78ihd09MekBnJnxpICcwzCMzGrKSKYe4AqU6PDYYpjk= github.com/Shopify/goreferrer v0.0.0-20181106222321-ec9c9a553398/go.mod h1:a1uqRtAwp2Xwc6WNPJEufxJ7fx3npB4UV/JOLmbu5I0= github.com/VictoriaMetrics/fastcache v1.12.0 h1:vnVi/y9yKDcD9akmc4NqAoqgQhJrOwUF+j9LTgn4QDE= @@ -37,15 +39,15 @@ github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5P github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cockroachdb/datadriven v1.0.2 h1:H9MtNqVoVhvd9nCBwOyDjUEdZCREqbIdCJD93PBm/jA= github.com/cockroachdb/datadriven v1.0.2/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= +github.com/cockroachdb/datadriven v1.0.3-0.20230801171734-e384cf455877 h1:1MLK4YpFtIEo3ZtMA5C795Wtv5VuUnrXX7mQG+aHg6o= github.com/cockroachdb/errors v1.9.1 h1:yFVvsI0VxmRShfawbt/laCIDy/mtTqqnvoNgiy5bEV8= github.com/cockroachdb/errors v1.9.1/go.mod h1:2sxOtL2WIc096WSZqZ5h8fa17rdDq9HZOZLBCor4mBk= github.com/cockroachdb/logtags v0.0.0-20211118104740-dabe8e521a4f/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= -github.com/cockroachdb/pebble v0.0.0-20230209160836-829675f94811 h1:ytcWPaNPhNoGMWEhDvS3zToKcDpRsLuRolQJBVGdozk= -github.com/cockroachdb/pebble v0.0.0-20230209160836-829675f94811/go.mod h1:Nb5lgvnQ2+oGlE/EyZy4+2/CxRh9KfvCXnag1vtpxVM= +github.com/cockroachdb/pebble v0.0.0-20230821143352-55b44ac08de8 h1:2fNOyQqrHSjFdqnKqSLj9W7eGTcqKujJPA8vAuT1zN8= +github.com/cockroachdb/pebble v0.0.0-20230821143352-55b44ac08de8/go.mod h1:bynZ3gvVyhlvjLI7PT6dmZ7g76xzJ7HpxfjgkzCGz6s= github.com/cockroachdb/redact v1.1.3 h1:AKZds10rFSIj7qADf0g46UixK8NNLwWTNdCIGS5wfSQ= github.com/cockroachdb/redact v1.1.3/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0/go.mod h1:4Zcjuz89kmFXt9morQgcfYZAYZ5n8WHjt81YYWIwtTM= @@ -74,7 +76,7 @@ github.com/deepmap/oapi-codegen v1.12.4 h1:pPmn6qI9MuOtCz82WY2Xaw46EQjgvxednXXrP github.com/deepmap/oapi-codegen v1.12.4/go.mod h1:3lgHGMu6myQ2vqbbTXH2H1o4eXFTGnFiDaOaKKl5yas= github.com/dgraph-io/badger v1.6.0/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6psNgSztDR4= github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= -github.com/docker/docker v20.10.17+incompatible h1:JYCuMrWaVNophQTOrMMoSwudOVEfcegoZZrleKc1xwE= +github.com/docker/docker v24.0.5+incompatible h1:WmgcE4fxyI6EEXxBRxsHnZXrO1pQ3smi0k/jho4HLeY= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385/go.mod h1:0vRUJqYpeSZifjYj7uP3BG/gKcuzL9xWVV/Y+cK33KM= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= @@ -82,8 +84,8 @@ github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.m github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/etcd-io/bbolt v1.3.3/go.mod h1:ZF2nL25h33cCyBtcyWeZ2/I3HQOfTP+0PIEvHjkjCrw= -github.com/ethereum/c-kzg-4844 v0.3.0 h1:3Y3hD6l5i0dEYsBL50C+Om644kve3pNqoAcvE26o9zI= -github.com/ethereum/c-kzg-4844 v0.3.0/go.mod h1:WI2Nd82DMZAAZI1wV2neKGost9EKjvbpQR9OqE5Qqa8= +github.com/ethereum/c-kzg-4844 v0.3.1 h1:sR65+68+WdnMKxseNWxSJuAv2tsUrihTpVBTfM/U5Zg= +github.com/ethereum/c-kzg-4844 v0.3.1/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= github.com/ethereum/hive v0.0.0-20230313141339-8e3200bfc09e h1:3g9cqRqpbZ92tSlGL4PfFoq435axKw6HiZ1Gz3fOkfk= github.com/ethereum/hive v0.0.0-20230313141339-8e3200bfc09e/go.mod h1:PlpDuxHg6q1jU0K8Ouf+RXlHguignJ7k8Eyukc9RCPQ= github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072/go.mod h1:duJ4Jxv5lDcvg4QuQr0oowTf7dz4/CR8NtyCooz9HL8= @@ -232,8 +234,8 @@ github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0 github.com/labstack/echo/v4 v4.5.0/go.mod h1:czIriw4a0C1dFun+ObrXp7ok03xON0N1awStJ6ArI7Y= github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c= -github.com/lightclient/go-ethereum v1.10.10-0.20230811210943-0cee617571f0 h1:TDi8DB9gLSiWJ7mnsdAFDE5zBcY/qYBfvfLGCYepPGA= -github.com/lightclient/go-ethereum v1.10.10-0.20230811210943-0cee617571f0/go.mod h1:B/cPTafll0UGQ1m2ceGgP0JTNKL+pxPebUEptS4mXYQ= +github.com/lightclient/go-ethereum v1.10.10-0.20230829211949-79f3c2d9c96b h1:dglsK4NuDRreW5+/0EoTFxCiZwkRZay/aDoOul2lca0= +github.com/lightclient/go-ethereum v1.10.10-0.20230829211949-79f3c2d9c96b/go.mod h1:UWQqzN9473khWbdvlh2QjYXX0ykhKT1OuPYus9Hgv+o= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= @@ -401,8 +403,8 @@ golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5y golang.org/x/crypto v0.9.0 h1:LF6fAI+IutBocDJ2OT0Q1g8plpYljMZ4+lty+dsqw3g= golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20230515195305-f3d0a9c9a5cc h1:mCRnTeVUjcrhlRmO0VK8a6k6Rrf6TF9htwo2pJVSjIU= -golang.org/x/exp v0.0.0-20230515195305-f3d0a9c9a5cc/go.mod h1:V1LtkGg67GoY2N1AnLN78QLrzxkLyJw7RJb1gzOOz9w= +golang.org/x/exp v0.0.0-20230810033253-352e893a4cad h1:g0bG7Z4uG+OgH2QDODnjp6ggkk1bJDsINcuWmJN1iJU= +golang.org/x/exp v0.0.0-20230810033253-352e893a4cad/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= @@ -411,6 +413,8 @@ golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzB golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.11.0 h1:bUO06HqtnRcc/7l71XBe4WcqTZ+3AH1J59zWDDwLKgU= +golang.org/x/mod v0.11.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -510,6 +514,8 @@ golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roY golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.9.1 h1:8WMNJAz3zrtPmnYC7ISf5dEn3MT0gY7jBJfw27yrrLo= +golang.org/x/tools v0.9.1/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -554,8 +560,6 @@ gopkg.in/ini.v1 v1.51.1/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8= gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= -gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce h1:+JknDZhAj8YMt7GC73Ei8pv4MzjDUNPHgQWJdtMAaDU= -gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:5AcXVHNjg+BDxry382+8OKon8SEWiKktQR07RKPsv1c= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/simulators/ethereum/engine/helper/payload.go b/simulators/ethereum/engine/helper/payload.go index 46d0a5a26e..09d2048be1 100644 --- a/simulators/ethereum/engine/helper/payload.go +++ b/simulators/ethereum/engine/helper/payload.go @@ -19,28 +19,28 @@ type PayloadCustomizer interface { } type CustomPayloadData struct { - ParentHash *common.Hash - FeeRecipient *common.Address - StateRoot *common.Hash - ReceiptsRoot *common.Hash - LogsBloom *[]byte - PrevRandao *common.Hash - Number *uint64 - GasLimit *uint64 - GasUsed *uint64 - Timestamp *uint64 - ExtraData *[]byte - BaseFeePerGas *big.Int - BlockHash *common.Hash - Transactions *[][]byte - Withdrawals types.Withdrawals - RemoveWithdrawals bool - BlobGasUsed *uint64 - RemoveBlobGasUsed bool - ExcessBlobGas *uint64 - RemoveExcessBlobGas bool - BeaconRoot *common.Hash - RemoveBeaconRoot bool + ParentHash *common.Hash + FeeRecipient *common.Address + StateRoot *common.Hash + ReceiptsRoot *common.Hash + LogsBloom *[]byte + PrevRandao *common.Hash + Number *uint64 + GasLimit *uint64 + GasUsed *uint64 + Timestamp *uint64 + ExtraData *[]byte + BaseFeePerGas *big.Int + BlockHash *common.Hash + Transactions *[][]byte + Withdrawals types.Withdrawals + RemoveWithdrawals bool + BlobGasUsed *uint64 + RemoveBlobGasUsed bool + ExcessBlobGas *uint64 + RemoveExcessBlobGas bool + ParentBeaconRoot *common.Hash + RemoveParentBeaconRoot bool } var _ PayloadCustomizer = (*CustomPayloadData)(nil) @@ -136,12 +136,12 @@ func (customData *CustomPayloadData) CustomizePayload(basePayload *typ.Executabl } else if basePayload.ExcessBlobGas != nil { customPayloadHeader.ExcessBlobGas = basePayload.ExcessBlobGas } - if customData.RemoveBeaconRoot { - customPayloadHeader.BeaconRoot = nil - } else if customData.BeaconRoot != nil { - customPayloadHeader.BeaconRoot = customData.BeaconRoot + if customData.RemoveParentBeaconRoot { + customPayloadHeader.ParentBeaconRoot = nil + } else if customData.ParentBeaconRoot != nil { + customPayloadHeader.ParentBeaconRoot = customData.ParentBeaconRoot } else if baseBeaconRoot != nil { - customPayloadHeader.BeaconRoot = baseBeaconRoot + customPayloadHeader.ParentBeaconRoot = baseBeaconRoot } // Return the new payload @@ -170,7 +170,7 @@ func (customData *CustomPayloadData) CustomizePayload(basePayload *typ.Executabl } else if basePayload.Withdrawals != nil { result.Withdrawals = basePayload.Withdrawals } - return result, customPayloadHeader.BeaconRoot, nil + return result, customPayloadHeader.ParentBeaconRoot, nil } func CustomizePayloadTransactions(basePayload *typ.ExecutableData, baseBeaconRoot *common.Hash, customTransactions types.Transactions) (*typ.ExecutableData, *common.Hash, error) { diff --git a/simulators/ethereum/engine/suites/cancun/steps.go b/simulators/ethereum/engine/suites/cancun/steps.go index addbf8c0c6..30b0568e99 100644 --- a/simulators/ethereum/engine/suites/cancun/steps.go +++ b/simulators/ethereum/engine/suites/cancun/steps.go @@ -61,7 +61,7 @@ func (step ParallelSteps) Execute(t *CancunTestContext) error { } func (step ParallelSteps) Description() string { - desc := fmt.Sprintf("ParallelSteps: running steps in parallel:\n") + desc := "ParallelSteps: running steps in parallel:\n" for i, step := range step.Steps { desc += fmt.Sprintf("%d: %s\n", i, step.Description()) } @@ -670,6 +670,33 @@ func (step DevP2PClientPeering) Execute(t *CancunTestContext) error { } defer conn.Close() t.Logf("INFO: Connected to client %d, remote public key: %s", step.ClientIndex, conn.RemoteKey()) + + // Sleep + time.Sleep(1 * time.Second) + + // Timeout value for all requests + timeout := 20 * time.Second + + // Send a ping request to verify that we are not immediately disconnected + pingReq := &devp2p.Ping{} + if size, err := conn.Write(pingReq); err != nil { + return errors.Wrap(err, "could not write to conn") + } else { + t.Logf("INFO: Wrote %d bytes to conn", size) + } + + // Finally wait for the pong response + msg, err := conn.WaitForResponse(timeout, 0) + if err != nil { + return errors.Wrap(err, "error waiting for response") + } + switch msg := msg.(type) { + case *devp2p.Pong: + t.Logf("INFO: Received pong response: %v", msg) + default: + return fmt.Errorf("unexpected message type: %T", msg) + } + return nil } @@ -794,7 +821,7 @@ func (step DevP2PRequestPooledTransactionHash) Execute(t *CancunTestContext) err return fmt.Errorf("expected size %d, got %d", len(expBytes), len(txBytes)) } - if bytes.Compare(expBytes, txBytes) != 0 { + if !bytes.Equal(expBytes, txBytes) { return fmt.Errorf("expected tx %#x, got %#x", expBytes, txBytes) } diff --git a/simulators/ethereum/engine/suites/cancun/tests.go b/simulators/ethereum/engine/suites/cancun/tests.go index bfb3235136..eb3e679ef2 100644 --- a/simulators/ethereum/engine/suites/cancun/tests.go +++ b/simulators/ethereum/engine/suites/cancun/tests.go @@ -671,7 +671,7 @@ var Tests = []test.SpecInterface{ ExpectedIncludedBlobCount: 0, Version: 3, PayloadCustomizer: &helper.CustomPayloadData{ - BeaconRoot: &(common.Hash{}), + ParentBeaconRoot: &(common.Hash{}), }, ExpectedError: INVALID_PARAMS_ERROR, ExpectationDescription: fmt.Sprintf(` @@ -702,9 +702,9 @@ var Tests = []test.SpecInterface{ Blobs: []helper.BlobID{}, }, PayloadCustomizer: &helper.CustomPayloadData{ - ExcessBlobGas: pUint64(0), - BlobGasUsed: pUint64(0), - BeaconRoot: &(common.Hash{}), + ExcessBlobGas: pUint64(0), + BlobGasUsed: pUint64(0), + ParentBeaconRoot: &(common.Hash{}), }, ExpectedError: UNSUPPORTED_FORK_ERROR, ExpectationDescription: fmt.Sprintf(` @@ -788,7 +788,7 @@ var Tests = []test.SpecInterface{ ExpectedIncludedBlobCount: 0, Version: 3, PayloadCustomizer: &helper.CustomPayloadData{ - RemoveBeaconRoot: true, + RemoveParentBeaconRoot: true, }, ExpectedError: INVALID_PARAMS_ERROR, ExpectationDescription: fmt.Sprintf(` @@ -1420,6 +1420,24 @@ var Tests = []test.SpecInterface{ }, }, + &CancunForkSpec{ + GenesisTimestamp: 1, + ShanghaiTimestamp: 0, + CancunTimestamp: 1, + + CancunBaseSpec: CancunBaseSpec{ + Spec: test.Spec{ + Name: "ForkID, genesis at 1, shanghai at 0, cancun at 1", + About: ` + Attemp to peer client with the following configuration at height 0: + - genesis timestamp 1 + - shanghai fork at timestamp 0 + - cancun fork at timestamp 1 + `, + }, + }, + }, + &CancunForkSpec{ GenesisTimestamp: 0, ShanghaiTimestamp: 0, diff --git a/simulators/ethereum/engine/types/types.go b/simulators/ethereum/engine/types/types.go index 09dc82cd22..9b798f1b13 100644 --- a/simulators/ethereum/engine/types/types.go +++ b/simulators/ethereum/engine/types/types.go @@ -221,7 +221,7 @@ func ExecutableDataToBlock(ed ExecutableData, versionedHashes []common.Hash, bea func BlockToExecutableData(block *types.Block, fees *big.Int) ExecutableData { // TODO (DEVNET 8): Add blobs - gethEnvelope := geth_beacon.BlockToExecutableData(block, fees, nil, nil, nil) + gethEnvelope := geth_beacon.BlockToExecutableData(block, fees, nil) ed, err := FromBeaconExecutableData(gethEnvelope.ExecutionPayload) if err != nil { panic(err) diff --git a/simulators/ethereum/go.work.sum b/simulators/ethereum/go.work.sum index ed0a274a35..bfb31c436f 100644 --- a/simulators/ethereum/go.work.sum +++ b/simulators/ethereum/go.work.sum @@ -1,5 +1,6 @@ bazil.org/fuse v0.0.0-20160811212531-371fbbdaa898 h1:SC+c6A1qTFstO9qmB86mPV2IpYme/2ZoEQ0hrP+wo+Q= bazil.org/fuse v0.0.0-20160811212531-371fbbdaa898/go.mod h1:Xbm+BRKSBEpa4q4hTSxohYNQpsxXPbPry4JJWOB3LB8= +cloud.google.com/go v0.0.0-20170206221025-ce650573d812/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= cloud.google.com/go v0.43.0/go.mod h1:BOSR3VbTLkk6FDC/TcffxP4NF/FFBGA5ku+jvKOP7pg= @@ -26,6 +27,7 @@ cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUM cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= cloud.google.com/go/bigtable v1.2.0 h1:F4cCmA4nuV84V5zYQ3MKY+M1Cw1avHDuf3S/LcZPA9c= +cloud.google.com/go/compute/metadata v0.2.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= cloud.google.com/go/datastore v1.0.0 h1:Kt+gOPPp2LEPWp8CSfxhsM8ik9CcyE/gYu+0r+RnZvM= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0 h1:/May9ojXjRkPBNVrq+oWLqmWCkr4OU5uRY29bu0mRyQ= @@ -46,6 +48,7 @@ cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9 collectd.org v0.3.0 h1:iNBHGw1VvPJxH2B6RiFWFZ+vsjo1lCdRszBeOuwGi00= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9 h1:VpgP7xuJadIUuKccphEpTJnWhS2jkQyMt6Y7pJCD7fY= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +gioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8= github.com/AdaLogics/go-fuzz-headers v0.0.0-20210715213245-6c3934b029d8 h1:V8krnnfGj4pV65YLUm3C0/8bl7V5Nry2Pwvy3ru/wLc= github.com/AdaLogics/go-fuzz-headers v0.0.0-20210715213245-6c3934b029d8/go.mod h1:CzsSbkDixRphAF5hS6wbMKq0eI6ccJRb7/A0M6JBnwg= github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9 h1:HD8gA2tkByhMAwYaFAX9w2l7vxvBQ5NMoxDrkhqhtn4= @@ -77,17 +80,23 @@ github.com/Azure/go-autorest/logger v0.2.0 h1:e4RVHVZKC5p6UANLJHkM4OfR1UKZPj8Wt8 github.com/Azure/go-autorest/logger v0.2.0/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= github.com/Azure/go-autorest/tracing v0.6.0 h1:TYi4+3m5t6K48TGI9AUdb+IzbnSxvnvUMfuitfgcfuo= github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= +github.com/BurntSushi/toml v1.2.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= github.com/BurntSushi/toml v1.2.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802 h1:1BDTz0u9nC3//pOCMdNH+CiXJVYJh5UQNCOBG7jbELc= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/CloudyKit/fastprinter v0.0.0-20170127035650-74b38d55f37a/go.mod h1:EFZQ978U7x8IRnstaskI3IysnWY5Ao3QgZUKOXlsAdw= github.com/CloudyKit/fastprinter v0.0.0-20200109182630-33d98a066a53 h1:sR+/8Yb4slttB4vD+b9btVEnWgL3Q00OBTzVT8B9C0c= +github.com/CloudyKit/jet v2.1.3-0.20180809161101-62edd43e4f88+incompatible/go.mod h1:HPYO+50pSWkPoj9Q/eq0aRGByCL6ScRlUmiEX5Zgm+w= github.com/CloudyKit/jet/v3 v3.0.0 h1:1PwO5w5VCtlUUl+KTOBsTGZlhjWkcybsGaAau52tOy8= github.com/CloudyKit/jet/v6 v6.1.0 h1:hvO96X345XagdH1fAoBjpBYG4a1ghhL/QzalkduPuXk= github.com/CloudyKit/jet/v6 v6.1.0/go.mod h1:d3ypHeIRNo2+XyqnGA8s+aphtcVpjP5hPwP/Lzo7Ro4= github.com/DATA-DOG/go-sqlmock v1.3.3 h1:CWUqKXe0s8A2z6qCgkP4Kru7wC11YoAnoupUKFDnH08= +github.com/DataDog/zstd v1.4.5/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo= +github.com/GoogleCloudPlatform/cloudsql-proxy v0.0.0-20190129172621-c8b1d7a94ddf/go.mod h1:aJ4qN3TfrelA6NZ6AXsXRfmEVaYin3EDbSPJrKS8OXo= github.com/HdrHistogram/hdrhistogram-go v1.1.2 h1:5IcZpTvzydCQeHzK4Ef/D5rrSqwxob0t8PQPMybUNFM= github.com/HdrHistogram/hdrhistogram-go v1.1.2/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo= github.com/Joker/hpp v1.0.0 h1:65+iuJYdRXv/XyN62C1uEmmOx3432rNG/rKlX6V7Kkc= +github.com/Joker/jade v1.0.1-0.20190614124447-d475f43051e7/go.mod h1:6E6s8o2AE4KhCrqr6GRJjdC/gNfTdxkIXvuGZZda2VM= github.com/MariusVanDerWijden/go-ethereum v1.8.22-0.20230621084717-62fbdf5a95dc h1:QdOMSeSuN8LUchUJOMo8H+FqKah5mhku0/4GFerNiVY= github.com/MariusVanDerWijden/go-ethereum v1.8.22-0.20230621084717-62fbdf5a95dc/go.mod h1:gBJi25HIQ0kgf76prZGagCKFeKKjBu5Q2XX1KMaIxug= github.com/Microsoft/go-winio v0.4.11/go.mod h1:VhR8bwka0BXejwEJY73c50VrPtXAaKcyvVC4A4RozmA= @@ -131,7 +140,10 @@ github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6 h1:fLjPD/aNc3UIO github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= github.com/StackExchange/wmi v0.0.0-20210224194228-fe8f1750fd46/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= github.com/VictoriaMetrics/fastcache v1.6.0/go.mod h1:0qHz5QP0GMX4pfmMA/zt5RgfNuXJrTP0zS7DqpHGGTw= +github.com/aclements/go-gg v0.0.0-20170118225347-6dbb4e4fefb0/go.mod h1:55qNq4vcpkIuHowELi5C8e+1yUHtoLoOUR9QU5j7Tes= +github.com/aclements/go-moremath v0.0.0-20210112150236-f10218a38794/go.mod h1:7e+I0LQFUI9AXWxOfsQROs9xPhoJtbsyWcjJqDd4KPY= github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= +github.com/ajstarks/svgo v0.0.0-20210923152817-c3b6e2f0c527/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= @@ -162,7 +174,10 @@ github.com/bits-and-blooms/bitset v1.2.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edY github.com/bits-and-blooms/bitset v1.5.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= github.com/blang/semver v3.1.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= +github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= +github.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= +github.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= github.com/bshuster-repo/logrus-logstash-hook v0.4.1/go.mod h1:zsTqEiSzDgAa/8GZR7E1qaXrhYNDKBYy5/dWPTIflbk= github.com/btcsuite/btcd/btcec/v2 v2.2.0/go.mod h1:U7MHm051Al6XmscBQ0BoNydpOTsFAn707034b5nY8zU= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= @@ -178,6 +193,7 @@ github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XL github.com/checkpoint-restore/go-criu/v4 v4.1.0/go.mod h1:xUQBLp4RLc5zJtWY++yjOoMoB5lihDt7fai+75m+rGw= github.com/checkpoint-restore/go-criu/v5 v5.0.0/go.mod h1:cfwC0EG7HMUenopBsUf9d89JlCLQIfgVcNsNN0t6T2M= github.com/checkpoint-restore/go-criu/v5 v5.3.0/go.mod h1:E/eQpaFtUKGOOSEBZgmKAcn+zUUwWxqcaKZlF54wK8E= +github.com/cheekybits/is v0.0.0-20150225183255-68e9c0620927/go.mod h1:h/aW8ynjgkuj+NQRlZcDbAbM1ORAbXjXX77sX7T289U= github.com/chzyer/logex v1.2.0/go.mod h1:9+9sk7u7pGNWYMkh0hdiL++6OeibzJccyQU4p4MedaY= github.com/chzyer/readline v1.5.0/go.mod h1:x22KAscuvRqlLoK9CsoYsmxoXZMMFVyOl86cAH8qUic= github.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= @@ -189,8 +205,18 @@ github.com/cilium/ebpf v0.6.2/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJ github.com/cilium/ebpf v0.7.0/go.mod h1:/oI2+1shJiTGAMgl6/RgJr36Eo1jzrRcAWbcXO2usCA= github.com/cloudflare/cloudflare-go v0.14.0/go.mod h1:EnwdgGMaFOruiPZRFSgn+TsQ3hQ7C/YWzIGLeu5c304= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= +github.com/cockroachdb/datadriven v1.0.0/go.mod h1:5Ib8Meh+jk1RlHIXej6Pzevx/NLlNvQB9pmSBZErGA4= +github.com/cockroachdb/datadriven v1.0.3-0.20230801171734-e384cf455877/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= +github.com/cockroachdb/errors v1.6.1/go.mod h1:tm6FTP5G81vwJ5lC0SizQo374JNCOPrHyXGitRJoDqM= +github.com/cockroachdb/errors v1.8.1/go.mod h1:qGwQn6JmZ+oMjuLwjWzUNqblqk0xl4CVV3SQbGwK7Ac= +github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI= +github.com/cockroachdb/redact v1.0.8/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= github.com/cockroachdb/sentry-go v0.6.1-cockroachdb.2/go.mod h1:8BT+cPK6xvFOcRlk0R8eg+OTkcqI6baNH4xAkpiYVvQ= github.com/consensys/gnark-crypto v0.10.0/go.mod h1:Iq/P3HHl0ElSjsg2E1gsMwhAyxnxoKK5nVyZKd+/KhU= github.com/containerd/aufs v0.0.0-20200908144142-dab0cbea06f4/go.mod h1:nukgQABAEopAHvB6j7cnP5zJ+/3aVcE7hCYqvIwAHyE= @@ -312,9 +338,13 @@ github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeC github.com/deepmap/oapi-codegen v1.6.0/go.mod h1:ryDa9AgbELGeB+YEXE1dR53yAjHwFvE9iAUlWl9Al3M= github.com/deepmap/oapi-codegen v1.8.2/go.mod h1:YLgSKSDv/bZQB7N4ws6luhozi3cEdRktEqrX88CvjIw= github.com/denverdino/aliyungo v0.0.0-20190125010748-a747050bb1ba/go.mod h1:dV8lFg6daOBZbT6/BDGIz6Y3WFGn8juu6G+CQ6LHtl0= +github.com/dgraph-io/badger/v2 v2.2007.4/go.mod h1:vSw/ax2qojzbN6eXHIx6KPKtCSHJN/Uz0X0VPruTIhk= +github.com/dgraph-io/ristretto v0.0.3-0.20200630154024-f66de99634de/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= github.com/dgrijalva/jwt-go v0.0.0-20170104182250-a601269ab70c/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= +github.com/djherbis/atime v1.1.0/go.mod h1:28OF6Y8s3NQWwacXc5eZTsEsiMzp7LF8MbXE+XJPdBE= github.com/dlclark/regexp2 v1.4.1-0.20201116162257-a2a8dda75c91/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= github.com/dlclark/regexp2 v1.7.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E= @@ -327,6 +357,7 @@ github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4Kfc github.com/docker/docker v1.4.2-0.20190924003213-a8608b5b67c7/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/docker v1.6.2/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/docker v20.10.17+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v24.0.5+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/docker-credential-helpers v0.6.3/go.mod h1:WRaJzqw3CTB9bk10avuGsjVBZsD05qeibJ1/TYlvc0Y= github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= github.com/docker/go-events v0.0.0-20170721190031-9461782956ad/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA= @@ -340,6 +371,7 @@ github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3 github.com/dop251/goja v0.0.0-20211022113120-dc8c55024d06/go.mod h1:R9ET47fwRVRPZnOGvHxxhuZcbrMCuiqOz3Rlrh4KSnk= github.com/dop251/goja v0.0.0-20230122112309-96b1610dd4f7/go.mod h1:yRkwfj0CBpOGre+TwBsqPV0IH0Pk73e4PXJOeNDboGs= github.com/dop251/goja v0.0.0-20230605162241-28ee0ee714f3/go.mod h1:QMWlm50DNe14hD7t24KEqZuUdC9sOTy8W6XbCU1mlw4= +github.com/dop251/goja v0.0.0-20230806174421-c933cf95e127/go.mod h1:QMWlm50DNe14hD7t24KEqZuUdC9sOTy8W6XbCU1mlw4= github.com/dop251/goja_nodejs v0.0.0-20210225215109-d91c329300e7/go.mod h1:hn7BA7c8pLvoGndExHudxTDKZ84Pyvv+90pbBjbTz0Y= github.com/dop251/goja_nodejs v0.0.0-20211022123610-8dd9abb0616d/go.mod h1:DngW8aVqWbuLRMHItjPUyqdj+HWPvnQe8V8y1nDpIbM= github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= @@ -350,6 +382,7 @@ github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= +github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= github.com/ethereum/c-kzg-4844 v0.2.0/go.mod h1:WI2Nd82DMZAAZI1wV2neKGost9EKjvbpQR9OqE5Qqa8= github.com/ethereum/go-ethereum v1.12.0/go.mod h1:/oo2X/dZLJjf2mJ6YT9wcWxa4nNJDBKDBU6sFIpx1Gs= github.com/ethereum/go-ethereum v1.12.1-0.20230724161334-2274a03e339f h1:b/1ztbo5mQzQuuyO8A3mVAHOjgiIf7wE8B9/r1Ul4OQ= @@ -361,7 +394,10 @@ github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5Kwzbycv github.com/fjl/gencodec v0.0.0-20230517082657-f9840df7b83e h1:bBLctRc7kr01YGvaDfgLbTwjFNW5jdp5y5rj8XXBHfY= github.com/fjl/gencodec v0.0.0-20230517082657-f9840df7b83e/go.mod h1:AzA8Lj6YtixmJWL+wkKoBGsLWy9gFrAzi4g+5bCKwpY= github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= +github.com/flosch/pongo2 v0.0.0-20190707114632-bbf5a6c351f4/go.mod h1:T9YF2M40nIgbVgp3rreNmTged+9HrbNTIQf1PsaIiTA= github.com/flosch/pongo2/v4 v4.0.2/go.mod h1:B5ObFANs/36VwxxlgKpdchIJHMvHB562PW+BWPhwZD8= +github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= +github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= github.com/fsouza/go-dockerclient v1.8.1/go.mod h1:zmA2ogSxRnXmbZcy0Aq7yhRoCdP/bDns/qghCK9SWtM= @@ -383,15 +419,25 @@ github.com/gin-gonic/gin v1.8.1/go.mod h1:ji8BvRH1azfM+SYow9zQ6SZMvR8qOMZHmsCuWR github.com/go-chi/chi/v5 v5.0.0/go.mod h1:BBug9lr0cqtdAhsu6R4AAdvufI0/XBzAQSsUqJpoZOs= github.com/go-chi/chi/v5 v5.0.7/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= +github.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g= +github.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks= +github.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= +github.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= +github.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-ini/ini v1.25.4/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= +github.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= +github.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U= +github.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= +github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= @@ -409,12 +455,18 @@ github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87/go.mod h1:DXUve3Dp github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-openapi/swag v0.21.1/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= +github.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M= github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= github.com/go-playground/locales v0.14.0/go.mod h1:sawfccIbzZTqEDETgFXqTho0QybSa7l++s0DH+LDiLs= github.com/go-playground/universal-translator v0.18.0/go.mod h1:UvRDBj+xPUEGrFYl+lu/H90nyDXpg0fqeB/AQUGNTVA= github.com/go-playground/validator/v10 v10.11.1/go.mod h1:i+3WkQ1FvaUjjxh1kSvIA4dMGDBiPU55YFDl0WbKdWU= +github.com/go-redis/redis/v8 v8.11.5/go.mod h1:gREzHqY1hg6oD9ngVRbLStwAWKhA0FEgq8Jd4h5lpwo= github.com/go-sourcemap/sourcemap v2.1.3+incompatible/go.mod h1:F8jJfvm2KbVjc5NqelyYJmf/v5J0dwNLS2mL4sNA1Jg= +github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/gobwas/httphead v0.1.0/go.mod h1:O/RXo79gxV8G+RqlR/otEwx4Q36zl9rqC5u12GKvMCM= +github.com/gobwas/pool v0.2.1/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= +github.com/gobwas/ws v1.1.0/go.mod h1:nzvNcVha5eUziGrbxFCo6qFIojQHjJV5cLYIbezhfL0= github.com/goccy/go-json v0.9.7/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= github.com/goccy/go-json v0.9.11/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= github.com/godbus/dbus v0.0.0-20151105175453-c7fdd8b5cd55/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= @@ -432,6 +484,7 @@ github.com/gogo/protobuf v1.3.0/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXP github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY= github.com/golang-jwt/jwt/v4 v4.3.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= +github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -443,12 +496,18 @@ github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFU github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golangci/lint-1 v0.0.0-20181222135242-d2cdd8c08219/go.mod h1:/X8TswGSh1pIozq4ZwCfxS0WA5JGXguxk94ar/4c87Y= +github.com/gonum/blas v0.0.0-20181208220705-f22b278b28ac/go.mod h1:P32wAyui1PQ58Oce/KYkOqQv8cVw1zAapXOl+dRFGbc= +github.com/gonum/floats v0.0.0-20181209220543-c233463c7e82/go.mod h1:PxC8OnwL11+aosOB5+iEPoV3picfs8tUpkVd0pDo+Kg= +github.com/gonum/internal v0.0.0-20181124074243-f884aa714029/go.mod h1:Pu4dmpkhSyOzRwuXkOgAvijx4o+4YMUJJo9OvPYMkks= +github.com/gonum/lapack v0.0.0-20181123203213-e4cdc5a0bff9/go.mod h1:XA3DeT6rxh2EAE789SSiSJNqxPaC0aE9J8NTOI0Jo/A= +github.com/gonum/matrix v0.0.0-20181209220409-c518dec07be9/go.mod h1:0EXg4mc1CNP0HCqCz+K4ts155PXIlUywf0wqN+GfPZw= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= @@ -460,29 +519,36 @@ github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-containerregistry v0.5.1/go.mod h1:Ct15B4yir3PLOP5jsy0GNeYVaIZs/MK/Jz5any1wFW0= +github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.1.1-0.20200604201612-c04b05f3adfa/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20230207041349-798e818bf904/go.mod h1:uglQLonpP8qtYCYyzA+8c/9qtqgA3qsXGYqCPKARAFg= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/safehtml v0.0.2/go.mod h1:L4KWwDsUJdECRAEpZoBn3O64bQaywRscowZjJAzjHnU= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/gax-go v0.0.0-20161107002406-da06d194a00e/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= +github.com/gopherjs/gopherjs v1.17.2/go.mod h1:pRRIvn/QzFLrKfvEz3qUuEhtE/zLCWfreZ6J5gM2i+k= github.com/gorilla/css v1.0.0/go.mod h1:Dn721qIggHpt4+EFCcTLTU/vk5ySda2ReITrtgBl60c= github.com/gorilla/handlers v0.0.0-20150720190736-60c7bfde3e33/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= github.com/gorilla/mux v1.7.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= +github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= @@ -494,6 +560,7 @@ github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgf github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= +github.com/guptarohit/asciigraph v0.5.5/go.mod h1:dYl5wwK4gNsnFf9Zp+l06rFiDZ5YtXM6x7SRWZ3KGag= github.com/hashicorp/errwrap v0.0.0-20141028054710-7554cd9344ce/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/go-bexpr v0.1.10/go.mod h1:oxlubA2vC/gFVfX1A6JGp7ls7uCDlfJn732ehYYg+g0= @@ -507,6 +574,7 @@ github.com/holiman/uint256 v1.2.0/go.mod h1:y4ga/t+u+Xwd7CpDgZESaRcWy0I7XMlTMA25 github.com/holiman/uint256 v1.2.2-0.20230321075855-87b91420868c/go.mod h1:SC8Ryt4n+UBbPbIBKaG9zbbDlp4jOru9xFZmPzLUTxw= github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= github.com/huin/goutil v0.0.0-20170803182201-1ca381bf3150 h1:vlNjIqmUZ9CMAWsbURYl3a6wZbw7q5RHVvlXTNS/Bs8= +github.com/hydrogen18/memlistener v0.0.0-20141126152155-54553eb933fb/go.mod h1:qEIFzExnS6016fRpRfxrExeVn2gbClQA99gQhnIcdhE= github.com/hydrogen18/memlistener v0.0.0-20200120041712-dcc25e7acd91 h1:KyZDvZ/GGn+r+Y3DKZ7UOQ/TP4xV6HNkrwiVMB1GnNY= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w= @@ -520,6 +588,9 @@ github.com/influxdata/influxdb-client-go/v2 v2.4.0/go.mod h1:vLNHdxTJkIf2mSLvGrp github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo= github.com/influxdata/line-protocol v0.0.0-20210311194329-9aa0e372d097/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo= github.com/invopop/yaml v0.1.0/go.mod h1:2XuRLgs/ouIrW3XNzuNj7J3Nvu/Dig5MXvbCEdiBN3Q= +github.com/iris-contrib/httpexpect/v2 v2.3.1/go.mod h1:ICTf89VBKSD3KB0fsyyHviKF8G8hyepP0dOXJPWz3T0= +github.com/iris-contrib/i18n v0.0.0-20171121225848-987a633949d0/go.mod h1:pMCz62A0xJL6I+umB2YTlFRwWXaDFA0jy+5HzGiJjqI= +github.com/iris-contrib/jade v1.1.4/go.mod h1:EDqR+ur9piDl6DUgs6qRrlfzmlx/D5UybogqrXvJTBE= github.com/iris-contrib/schema v0.0.6/go.mod h1:iYszG0IOsuIsfzjymw1kMzTL8YQcCWlm65f3wX8J5iA= github.com/j-keck/arping v0.0.0-20160618110441-2cf9dc699c56/go.mod h1:ymszkNOg6tORTn+6F6j+Jc8TOr5osrynvN6ivFWZ2GA= github.com/jedisct1/go-minisign v0.0.0-20190909160543-45766022959e/go.mod h1:G1CVv03EnqU1wYL2dFwXxW2An0az9JTl/ZsqXQeBlkU= @@ -533,22 +604,40 @@ github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFF github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= +github.com/juju/errors v0.0.0-20181118221551-089d3ea4e4d5/go.mod h1:W54LbzXuIE0boCoNJfwqpmkKJ1O4TCTZMetAt6jGk7Q= +github.com/juju/loggo v0.0.0-20180524022052-584905176618/go.mod h1:vgyd7OREkbtVEN/8IXZe5Ooef3LQePvuBm9UWj6ZL8U= +github.com/juju/testing v0.0.0-20180920084828-472a3e8b2073/go.mod h1:63prj8cnj0tU0S9OHjGJn+b1h0ZghCndfnbQolrYTwA= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= +github.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= +github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= github.com/karalabe/usb v0.0.2/go.mod h1:Od972xHfMJowv7NGVDiWVxk2zxnWgjLlJzE+F4F7AGU= github.com/karalabe/usb v0.0.3-0.20230711191512-61db3e06439c/go.mod h1:Od972xHfMJowv7NGVDiWVxk2zxnWgjLlJzE+F4F7AGU= github.com/kataras/blocks v0.0.7/go.mod h1:UJIU97CluDo0f+zEjbnbkeMRlvYORtmc1304EeyXf4I= +github.com/kataras/golog v0.0.9/go.mod h1:12HJgwBIZFNGL0EJnMRhmvGA0PQGx8VFwrZtM4CqbAk= +github.com/kataras/golog v0.1.7/go.mod h1:jOSQ+C5fUqsNSwurB/oAHq1IFSb0KI3l6GMa7xB6dZA= +github.com/kataras/iris/v12 v12.0.1/go.mod h1:udK4vLQKkdDqMGJJVd/msuMtN6hpYJhg/lSzuxjhO+U= +github.com/kataras/iris/v12 v12.2.0-beta5/go.mod h1:q26aoWJ0Knx/00iPKg5iizDK7oQQSPjbD8np0XDh6dc= +github.com/kataras/jwt v0.1.8/go.mod h1:Q5j2IkcIHnfwy+oNY3TVWuEBJNw0ADgCcXK9CaZwV4o= +github.com/kataras/neffos v0.0.10/go.mod h1:ZYmJC07hQPW67eKuzlfY7SO3bC0mw83A3j6im82hfqw= +github.com/kataras/neffos v0.0.20/go.mod h1:srdvC/Uo8mgrApWW0AYtiiLgMbyNPf69qPsd2FhE6MQ= +github.com/kataras/pio v0.0.0-20190103105442-ea782b38602d/go.mod h1:NV88laa9UiiDuX9AhMbDPkGYSPugBOV6yTZB1l2K9Z0= +github.com/kataras/pio v0.0.10/go.mod h1:gS3ui9xSD+lAUpbYnjOGiQyY7sUMJO+EHpiRzhtZ5no= github.com/kataras/pio v0.0.11/go.mod h1:38hH6SWH6m4DKSYmRhlrCJ5WItwWgCVrTNU62XZyUvI= github.com/kataras/sitemap v0.0.6/go.mod h1:dW4dOCNs896OR1HmG+dMLdT7JjDk7mYBzoIRwuj5jA4= github.com/kataras/tunnel v0.0.4/go.mod h1:9FkU4LaeifdMWqZu7o20ojmW4B7hdhv2CMLwfnHGpYw= github.com/kilic/bls12-381 v0.1.0/go.mod h1:vDTTHJONJ6G+P2R74EhnyotQDTliQDnFEwhdmfzw1ig= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= +github.com/klauspost/compress v1.9.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= github.com/klauspost/compress v1.11.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.11.13/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= +github.com/klauspost/compress v1.15.0/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= +github.com/klauspost/compress v1.15.11/go.mod h1:QPwzmACJjUTFsnSHH934V6woptycfrDDJnH7hvFVbGM= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= @@ -557,8 +646,11 @@ github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfn github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= +github.com/labstack/echo/v4 v4.1.11/go.mod h1:i541M3Fj6f76NZtHSj7TXnyM8n2gaodfvfxNnFqi74g= github.com/labstack/echo/v4 v4.2.1/go.mod h1:AA49e0DZ8kk5jTOOCKNuPR6oTnBS0dYiM4FW1e6jwpg= +github.com/labstack/echo/v4 v4.9.0/go.mod h1:xkCDAdFCIf8jsFQ5NnbK7oqaF/yU1A1X20Ltm0OvSks= github.com/labstack/echo/v4 v4.9.1/go.mod h1:Pop5HLc+xoc4qhTZ1ip6C0RtP7Z+4VzRLWZZFKqbbjo= +github.com/labstack/gommon v0.3.1/go.mod h1:uW6kP17uPlLJsD3ijUYn3/M5bAxtlZhMI6m3MFxTMTM= github.com/labstack/gommon v0.4.0/go.mod h1:uW6kP17uPlLJsD3ijUYn3/M5bAxtlZhMI6m3MFxTMTM= github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY= @@ -571,6 +663,8 @@ github.com/lestrrat-go/option v1.0.0/go.mod h1:5ZHFbivi4xwXxhxY9XHDe2FHo6/Z7WWmt github.com/lightclient/go-ethereum v1.10.10-0.20230811210943-0cee617571f0 h1:TDi8DB9gLSiWJ7mnsdAFDE5zBcY/qYBfvfLGCYepPGA= github.com/lightclient/go-ethereum v1.10.10-0.20230811210943-0cee617571f0/go.mod h1:B/cPTafll0UGQ1m2ceGgP0JTNKL+pxPebUEptS4mXYQ= github.com/linuxkit/virtsock v0.0.0-20201010232012-f8cee7dfc7a3/go.mod h1:3r6x7q95whyfWQpmGZTu3gk3v2YkMi05HEzl7Tf7YEo= +github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= +github.com/mailgun/raymond/v2 v2.0.46/go.mod h1:lsgvL50kgt1ylcFJYZiULi5fjPBkkhNfj4KA0W54Z18= github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= @@ -580,20 +674,28 @@ github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJ github.com/marstr/guid v1.1.0/go.mod h1:74gB1z2wpxxInTG6yaqA7KrtM0NZ+RbrcqDvYHefzho= github.com/matryer/moq v0.0.0-20190312154309-6cfb0558e1bd/go.mod h1:9ELz6aaclSIGnZBoaSLZ3NAl1VTufbOrXBPvtcy6WiQ= github.com/matryer/moq v0.2.7/go.mod h1:kITsx543GOENm48TUAQyJ9+SAvFSr7iGQXPoth/VUBk= +github.com/matryer/try v0.0.0-20161228173917-9ac251b645a2/go.mod h1:0KeJpeMD6o+O4hW7qJOT7vyQPKrWmj26uf5wMc/IiIs= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.7/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-shellwords v1.0.3/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o= github.com/mattn/go-shellwords v1.0.6/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o= +github.com/mattn/go-sqlite3 v1.14.5/go.mod h1:WVKg1VTActs4Qso6iwGbiFih2UIHo0ENGwNd0Lj+XmI= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= github.com/maxbrunsfeld/counterfeiter/v6 v6.2.2/go.mod h1:eD9eIE7cdwcMi9rYluz88Jz2VyhSmden33/aXg4oVIY= +github.com/mediocregopher/mediocre-go-lib v0.0.0-20181029021733-cb65787f37ed/go.mod h1:dSsfyI2zABAdhcbvkXqgxOxrCsbYeHCPgrZkku60dSg= +github.com/mediocregopher/radix/v3 v3.3.0/go.mod h1:EmfVyvspXz1uZEyPBMyGK+kjWiKQGvsUt6O3Pj+LDCQ= +github.com/mediocregopher/radix/v3 v3.8.0/go.mod h1:8FL3F6UQRXHXIBSPUs5h0RybMF8i4n7wVopoX3x7Bv8= +github.com/microcosm-cc/bluemonday v1.0.21/go.mod h1:ytNkv4RrDrLJ2pqlsSI46O6IVXmZOBBD4SaJyDwwTkM= github.com/miekg/pkcs11 v1.0.3/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= +github.com/minio/highwayhash v1.0.2/go.mod h1:BQskDq+xkJ12lmlUUi7U0M5Swg3EWR+dLTk+kldvVxY= github.com/mistifyio/go-zfs v2.1.2-0.20190413222219-f784269be439+incompatible/go.mod h1:8AuVvqP/mXw1px98n46wfvcGfQ4ci2FwoAjKYxuo3Z4= github.com/mitchellh/osext v0.0.0-20151018003038-5e2d6d41470f/go.mod h1:OkQIRizQZAeMln+1tSwduZz7+Af5oFlKirV/MSYes2A= github.com/mitchellh/pointerstructure v1.2.0/go.mod h1:BRAsLI5zgXmw97Lf6s25bs8ohIXc3tViBH44KcwB2g4= github.com/moby/locker v1.0.1/go.mod h1:S7SDdo5zpBK84bzzVlKr2V0hz+7x9hWbYC/kq7oQppc= +github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= github.com/moby/sys/mount v0.3.3/go.mod h1:PBaEorSNTLG5t/+4EgukEQVlAvVEc6ZjTySwKdqp5K0= github.com/moby/sys/mountinfo v0.4.0/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2JI+6q0qou+A= github.com/moby/sys/mountinfo v0.4.1/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2JI+6q0qou+A= @@ -614,6 +716,11 @@ github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRW github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= github.com/naoina/go-stringutil v0.1.0/go.mod h1:XJ2SJL9jCtBh+P9q5btrd/Ylo8XwT/h1USek5+NqSA0= github.com/naoina/toml v0.1.2-0.20170918210437-9fafd6967416/go.mod h1:NBIhNtsFMo3G2szEBne+bO4gS192HuIYRqfvOWb4i1E= +github.com/nats-io/jwt/v2 v2.3.0/go.mod h1:0tqz9Hlu6bCBFLWAASKhE5vUA4c24L9KPUUgvwumE/k= +github.com/nats-io/nats.go v1.8.1/go.mod h1:BrFz9vVn0fU3AcH9Vn4Kd7W0NpJ651tD5omQ3M8LwxM= +github.com/nats-io/nats.go v1.16.0/go.mod h1:BPko4oXsySz4aSWeFgOHLZs3G4Jq4ZAyE6/zMCxRT6w= +github.com/nats-io/nkeys v0.0.2/go.mod h1:dab7URMsZm6Z/jp9Z5UGa87Uutgc2mVpXLC4B7TDb/4= +github.com/nats-io/nkeys v0.3.0/go.mod h1:gvUNGjVcM2IPr5rCsRsC6Wb3Hr2CQAm08dsxtV6A5y4= github.com/ncw/swift v1.0.47/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= @@ -624,6 +731,7 @@ github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+W github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg= +github.com/onsi/ginkgo v1.13.0/go.mod h1:+REjRxOmWfHCjfv9TTWB1jD1Frx4XydAD3zm1lskyM0= github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= github.com/onsi/gomega v0.0.0-20151007035656-2152b45fa28a/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= @@ -662,25 +770,37 @@ github.com/pelletier/go-toml v1.8.1/go.mod h1:T2/BmBdy8dvIRq1a/8aqjN41wvWlN4lrap github.com/pelletier/go-toml/v2 v2.0.5/go.mod h1:OMHamSCAODeSsVrwwvcJOaoN0LIUIaFVNZzmWyNfXas= github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= github.com/peterh/liner v1.1.1-0.20190123174540-a2c9a5303de7/go.mod h1:CRroGNssyjTd/qIG2FyxByd2S8JEAZXBl4qUrZf8GS0= +github.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY= +github.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= +github.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1-0.20171018195549-f15c970de5b7/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= +github.com/prashantv/gostub v1.1.0/go.mod h1:A5zLQHz7ieHGG7is6LLXLz7I8+3LZzsrV0P1IAHhP5U= github.com/prometheus/client_golang v0.0.0-20180209125602-c332b6f63c06/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= +github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= +github.com/prometheus/client_golang v1.12.0/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= +github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= github.com/prometheus/client_model v0.0.0-20171117100541-99fa1f4be8e5/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.2.1-0.20210607210712-147c58e9608a/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= github.com/prometheus/common v0.0.0-20180110214958-89604d197083/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= +github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= +github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= +github.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA= github.com/prometheus/procfs v0.0.0-20180125133057-cb4147076ac7/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= @@ -692,6 +812,8 @@ github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+Gx github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= +github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= +github.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= github.com/protolambda/bls12-381-util v0.0.0-20220416220906-d8552aa452c7/go.mod h1:IToEjHuttnUzwZI5KBSM/LOOW3qLbbrHOEfp3SbECGY= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= @@ -700,12 +822,17 @@ github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFR github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w= +github.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk= github.com/safchain/ethtool v0.0.0-20190326074333-42ed695e3de8/go.mod h1:Z0q5wiBQGYcxhMZ6gUqHn6pYNLypFAvaL3UvgZLR0U4= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= +github.com/sclevine/agouti v3.0.0+incompatible/go.mod h1:b4WX9W9L1sfQKXeJf1mUTLZKJ48R1S7H23Ji7oFO5Bw= github.com/sclevine/spec v1.2.0/go.mod h1:W4J29eT/Kzv7/b9IWLB055Z+qvVC9vt0Arko24q7p+U= github.com/seccomp/libseccomp-golang v0.9.1/go.mod h1:GbW5+tmTXfcxTToHLXlScSlAvWlF4P2Ca7zGrPiEpWo= github.com/seccomp/libseccomp-golang v0.9.2-0.20220502022130-f33da4d89646/go.mod h1:JA8cRccbGaA1s33RQf7Y1+q9gHmZX1yB/z9WDN1C6fg= +github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= +github.com/shirou/gopsutil/v3 v3.22.8/go.mod h1:s648gW4IywYzUfE/KjXxUsqrqx/T2xO5VqOXxONeRfI= github.com/sirupsen/logrus v1.0.4-0.20170822132746-89742aefa4b2/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= github.com/sirupsen/logrus v1.0.6/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= @@ -715,6 +842,7 @@ github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrf github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/smartystreets/assertions v1.13.0/go.mod h1:wDmR7qL282YbGsPy6H/yAsesrxfxaaSlJazyFLYVFx8= github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= @@ -734,7 +862,6 @@ github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+ github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= github.com/stretchr/testify v0.0.0-20180303142811-b89eecf5ca5d/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/supranational/blst v0.3.11/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= github.com/syndtr/gocapability v0.0.0-20170704070218-db04d3cc01c8/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= github.com/syndtr/gocapability v0.0.0-20180916011248-d98352740cb2/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= @@ -742,6 +869,7 @@ github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45 github.com/tchap/go-patricia v2.2.6+incompatible/go.mod h1:bmLyhP68RS6kStMGxByiQ23RP/odRBOTVjwp2cDyi6I= github.com/tdewolff/minify/v2 v2.12.4/go.mod h1:h+SRvSIX3kwgwTFOpSckvSxgax3uy8kZTSF1Ojrr3bk= github.com/tdewolff/parse/v2 v2.6.4/go.mod h1:woz0cgbLwFdtbjJu8PIKxhW05KplTFQkOdX78o+Jgrs= +github.com/tdewolff/test v1.0.7/go.mod h1:6DAvZliBAAnD7rhVgwaM7DE5/d9NMOAJ09SqYqeK4QE= github.com/tklauser/go-sysconf v0.3.5/go.mod h1:MkWzOF4RMCshBAMXuhXJs64Rte09mITnppBXY/rYEFI= github.com/tklauser/numcpus v0.2.2/go.mod h1:x3qojaO3uyYt0i56EW/VUYs7uBvdl2fkfZFu0T9wgjM= github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= @@ -756,6 +884,7 @@ github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtX github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/XcUArI= github.com/valyala/fasthttp v1.40.0/go.mod h1:t/G+3rLek+CyY9bnIE+YlMRddxVAAGjhxndDB4i4C0I= github.com/valyala/fasttemplate v1.2.2/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= +github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc= github.com/vishvananda/netlink v0.0.0-20181108222139-023a6dafdcdf/go.mod h1:+SR5DhBJrl6ZM7CoCKvpw5BKroDKQ+PJqOg65H/2ktk= github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE= github.com/vishvananda/netlink v1.1.1-0.20201029203352-d40f9887b852/go.mod h1:twkDnbuQxJYemMlGd4JFIcuhgX83tXhKS2B/PRMpOho= @@ -769,6 +898,8 @@ github.com/willf/bitset v1.1.11/go.mod h1:83CECat5yLh5zVOf4P1ErAgKA5UDvKtgyUABdr github.com/xeipuuv/gojsonschema v0.0.0-20180618132009-1d523034197f/go.mod h1:5yf86TLmAcydyeJq5YvxkGPE2fm/u4myDekKRoLuqhs= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/yosssi/ace v0.0.5/go.mod h1:ALfIzm2vT7t5ZE7uoIZqF3TQ7SAOyupFZnkrF5id+K0= +github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/yvasiyarov/go-metrics v0.0.0-20140926110328-57bccd1ccd43/go.mod h1:aX5oPXxHm3bOH+xeAttToC8pqch2ScQN/JoXYupl6xs= @@ -784,6 +915,7 @@ go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= @@ -803,21 +935,39 @@ golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= +golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220427172511-eb4f295cb31f/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220926161630-eccd6366d1be/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= +golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE= golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= +golang.org/x/exp v0.0.0-20200513190911-00229845015e/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw= +golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1/go.mod h1:V1LtkGg67GoY2N1AnLN78QLrzxkLyJw7RJb1gzOOz9w= +golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= +golang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= @@ -855,6 +1005,10 @@ golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= @@ -864,18 +1018,28 @@ golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwY golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210220033124-5f55cee0dc0d/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210610132358-84b48f89b13b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210825183410-e898025ed96a/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20221002022538-bcab6841153b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= +golang.org/x/net v0.3.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= +golang.org/x/net v0.4.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/oauth2 v0.0.0-20170207211851-4464e7848382/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.3.0/go.mod h1:rQrIauxkUhJ6CuwEXwymO2/eh4xz2ZWF1nBkcxS+tGk= +golang.org/x/perf v0.0.0-20230113213139-801c7ef9e5c5/go.mod h1:UBKtEnL8aqnd+0JHqZ+2qoMDwtuy6cYhhKNoHLBiTQc= golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -915,11 +1079,17 @@ golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200217220822-9197077df867/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200728102440-3e129f6d46b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200817155316-9781c653f443/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200826173525-f9321e4c35a6/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -932,10 +1102,13 @@ golang.org/x/sys v0.0.0-20201112073958-5cba982894dd/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20201117170446-d9b008d0a637/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201202213521-69691e467435/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210316164454-77fc1eacc6aa/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210426230700-d19ff857e887/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210906170528-6f6e22806c34/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -944,10 +1117,14 @@ golang.org/x/sys v0.0.0-20211020174200-9d6173849985/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211103235746-7861aae1554b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211116061358-0a5406a5449c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220928140112-f11e5e49a4ec/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= @@ -956,6 +1133,7 @@ golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3 golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -964,9 +1142,12 @@ golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1/go.mod h1:tRJNPiyCQ0inRvYxb golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20220411224347-583f2d630306/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20220922220347-f3bd1da661af/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181011042414-1f849cf54d09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= @@ -979,6 +1160,7 @@ golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgw golang.org/x/tools v0.0.0-20190706070813-72ffa07ba3db/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI= golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -992,10 +1174,19 @@ golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapK golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200616133436-c1934b75d054/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200916195026-c9a70fc28ce3/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= @@ -1003,10 +1194,16 @@ golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc golang.org/x/tools v0.2.0/go.mod h1:y4OqIKeOV/fWJetJ8bXPU1sEVniLMIyDAZWeHdV+NTA= golang.org/x/tools v0.3.0/go.mod h1:/rWhSS2+zyEVwoJf8YAX6L2f0ntZ7Kn/mGgAWcipA5k= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.9.1 h1:8WMNJAz3zrtPmnYC7ISf5dEn3MT0gY7jBJfw27yrrLo= -golang.org/x/tools v0.9.1/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc= golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= +gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0= +gonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0= +gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= +gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= +gonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY= +gonum.org/v1/plot v0.10.0/go.mod h1:JWIHJ7U20drSQb/aDpTetJzfC1KlAPldJLpkSy88dvQ= google.golang.org/api v0.0.0-20160322025152-9bf6e6e569ff/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= +google.golang.org/api v0.0.0-20170206182103-3d017632ea10/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= @@ -1016,8 +1213,13 @@ google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsb google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= +google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= @@ -1041,13 +1243,23 @@ google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvx google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= google.golang.org/genproto v0.0.0-20200527145253-8367513e4ece/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= +google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= +google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201110150050-8816d57aaa9a/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20220502173005-c8bf987b8c21/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= google.golang.org/grpc v0.0.0-20160317175043-d3ddb4469d5a/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= +google.golang.org/grpc v0.0.0-20170208002647-2a6bf6142e96/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= @@ -1055,19 +1267,24 @@ google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyac google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA= google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= +google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= google.golang.org/grpc v1.47.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v1.0.0-20141024133853-64131543e789/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo= @@ -1088,10 +1305,12 @@ gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8= +gotest.tools/v3 v3.5.0/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= k8s.io/api v0.20.1/go.mod h1:KqwcCVogGxQY3nBlRpwt+wpAMF/KjaCc7RpywacvqUo= k8s.io/api v0.20.4/go.mod h1:++lNL1AJMkDymriNniQsWRkMDzRaX2Y/POTUi8yvqYQ= k8s.io/api v0.20.6/go.mod h1:X9e8Qag6JV/bL5G6bU8sdVRltWKmdHsFUGS3eVndqE8= @@ -1122,7 +1341,9 @@ k8s.io/kube-openapi v0.0.0-20200805222855-6aeccd4b50c6/go.mod h1:UuqjUnNftUyPE5H k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd/go.mod h1:WOJ3KddDSol4tAGcJo0Tvi+dK12EcqSLqcWsryKMpfM= k8s.io/kubernetes v1.13.0/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk= k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +moul.io/http2curl v1.0.0/go.mod h1:f6cULg+e4Md/oW1cYmwW4IWQOVl2lGbmCNGOHvzX2kE= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.14/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= diff --git a/simulators/ethereum/pyspec/go.mod b/simulators/ethereum/pyspec/go.mod index 44d06e9368..d1f139f865 100644 --- a/simulators/ethereum/pyspec/go.mod +++ b/simulators/ethereum/pyspec/go.mod @@ -10,6 +10,7 @@ require ( require ( github.com/DataDog/zstd v1.5.2 // indirect + github.com/Microsoft/go-winio v0.6.1 // indirect github.com/VictoriaMetrics/fastcache v1.12.0 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/bits-and-blooms/bitset v1.7.0 // indirect @@ -17,14 +18,14 @@ require ( github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/cockroachdb/errors v1.9.1 // indirect github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect - github.com/cockroachdb/pebble v0.0.0-20230209160836-829675f94811 // indirect + github.com/cockroachdb/pebble v0.0.0-20230821143352-55b44ac08de8 // indirect github.com/cockroachdb/redact v1.1.3 // indirect github.com/consensys/bavard v0.1.13 // indirect github.com/consensys/gnark-crypto v0.11.0 // indirect github.com/crate-crypto/go-kzg-4844 v0.3.0 // indirect github.com/deckarep/golang-set/v2 v2.1.0 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 // indirect - github.com/ethereum/c-kzg-4844 v0.3.0 // indirect + github.com/ethereum/c-kzg-4844 v0.3.1 // indirect github.com/getsentry/sentry-go v0.18.0 // indirect github.com/go-ole/go-ole v1.2.6 // indirect github.com/go-stack/stack v1.8.1 // indirect @@ -57,13 +58,14 @@ require ( github.com/tklauser/numcpus v0.6.0 // indirect github.com/yusufpapurcu/wmi v1.2.2 // indirect golang.org/x/crypto v0.9.0 // indirect - golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1 // indirect + golang.org/x/exp v0.0.0-20230810033253-352e893a4cad // indirect + golang.org/x/mod v0.11.0 // indirect golang.org/x/sync v0.3.0 // indirect golang.org/x/sys v0.9.0 // indirect golang.org/x/text v0.9.0 // indirect + golang.org/x/tools v0.9.1 // indirect google.golang.org/protobuf v1.28.1 // indirect - gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce // indirect rsc.io/tmplfunc v0.0.3 // indirect ) -replace github.com/ethereum/go-ethereum => github.com/lightclient/go-ethereum v1.10.10-0.20230811210943-0cee617571f0 +replace github.com/ethereum/go-ethereum => github.com/lightclient/go-ethereum v1.10.10-0.20230829211949-79f3c2d9c96b diff --git a/simulators/ethereum/pyspec/go.sum b/simulators/ethereum/pyspec/go.sum index a58e2ab2af..51fff102ea 100644 --- a/simulators/ethereum/pyspec/go.sum +++ b/simulators/ethereum/pyspec/go.sum @@ -6,6 +6,8 @@ github.com/CloudyKit/jet/v3 v3.0.0/go.mod h1:HKQPgSJmdK8hdoAbKUUWajkHyHo4RaU5rMd github.com/DataDog/zstd v1.5.2 h1:vUG4lAyuPCXO0TLbXvPv7EB7cNK1QV/luu55UHLrrn8= github.com/DataDog/zstd v1.5.2/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= github.com/Joker/hpp v1.0.0/go.mod h1:8x5n+M1Hp5hC0g8okX3sR3vFQwynaX/UgSOM9MeBKzY= +github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= +github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= github.com/Shopify/goreferrer v0.0.0-20181106222321-ec9c9a553398/go.mod h1:a1uqRtAwp2Xwc6WNPJEufxJ7fx3npB4UV/JOLmbu5I0= github.com/VictoriaMetrics/fastcache v1.12.0 h1:vnVi/y9yKDcD9akmc4NqAoqgQhJrOwUF+j9LTgn4QDE= github.com/VictoriaMetrics/fastcache v1.12.0/go.mod h1:tjiYeEfYXCqacuvYw/7UoDIeJaNxq6132xHICNP77w8= @@ -30,15 +32,15 @@ github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5P github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cockroachdb/datadriven v1.0.2 h1:H9MtNqVoVhvd9nCBwOyDjUEdZCREqbIdCJD93PBm/jA= github.com/cockroachdb/datadriven v1.0.2/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= +github.com/cockroachdb/datadriven v1.0.3-0.20230801171734-e384cf455877 h1:1MLK4YpFtIEo3ZtMA5C795Wtv5VuUnrXX7mQG+aHg6o= github.com/cockroachdb/errors v1.9.1 h1:yFVvsI0VxmRShfawbt/laCIDy/mtTqqnvoNgiy5bEV8= github.com/cockroachdb/errors v1.9.1/go.mod h1:2sxOtL2WIc096WSZqZ5h8fa17rdDq9HZOZLBCor4mBk= github.com/cockroachdb/logtags v0.0.0-20211118104740-dabe8e521a4f/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= -github.com/cockroachdb/pebble v0.0.0-20230209160836-829675f94811 h1:ytcWPaNPhNoGMWEhDvS3zToKcDpRsLuRolQJBVGdozk= -github.com/cockroachdb/pebble v0.0.0-20230209160836-829675f94811/go.mod h1:Nb5lgvnQ2+oGlE/EyZy4+2/CxRh9KfvCXnag1vtpxVM= +github.com/cockroachdb/pebble v0.0.0-20230821143352-55b44ac08de8 h1:2fNOyQqrHSjFdqnKqSLj9W7eGTcqKujJPA8vAuT1zN8= +github.com/cockroachdb/pebble v0.0.0-20230821143352-55b44ac08de8/go.mod h1:bynZ3gvVyhlvjLI7PT6dmZ7g76xzJ7HpxfjgkzCGz6s= github.com/cockroachdb/redact v1.1.3 h1:AKZds10rFSIj7qADf0g46UixK8NNLwWTNdCIGS5wfSQ= github.com/cockroachdb/redact v1.1.3/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0/go.mod h1:4Zcjuz89kmFXt9morQgcfYZAYZ5n8WHjt81YYWIwtTM= @@ -72,8 +74,8 @@ github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.m github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/etcd-io/bbolt v1.3.3/go.mod h1:ZF2nL25h33cCyBtcyWeZ2/I3HQOfTP+0PIEvHjkjCrw= -github.com/ethereum/c-kzg-4844 v0.3.0 h1:3Y3hD6l5i0dEYsBL50C+Om644kve3pNqoAcvE26o9zI= -github.com/ethereum/c-kzg-4844 v0.3.0/go.mod h1:WI2Nd82DMZAAZI1wV2neKGost9EKjvbpQR9OqE5Qqa8= +github.com/ethereum/c-kzg-4844 v0.3.1 h1:sR65+68+WdnMKxseNWxSJuAv2tsUrihTpVBTfM/U5Zg= +github.com/ethereum/c-kzg-4844 v0.3.1/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= github.com/ethereum/hive v0.0.0-20230616141546-33068992107d h1:LHq8wfx+J+YqdTJ6e6dgIoqiXG4WIysuhSZ1jig1LIk= github.com/ethereum/hive v0.0.0-20230616141546-33068992107d/go.mod h1:2RR3SFHSGGSh7UTvIsw4fDDqjkkr7HrWPyDaMoe6Ehw= github.com/ethereum/hive/simulators/ethereum/engine v0.0.0-20230616141546-33068992107d h1:akwfB80JUROiS8dqEcf/Umgewizy68P/P2YQceEAhzw= @@ -201,8 +203,8 @@ github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0 github.com/labstack/echo/v4 v4.5.0/go.mod h1:czIriw4a0C1dFun+ObrXp7ok03xON0N1awStJ6ArI7Y= github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c= -github.com/lightclient/go-ethereum v1.10.10-0.20230811210943-0cee617571f0 h1:TDi8DB9gLSiWJ7mnsdAFDE5zBcY/qYBfvfLGCYepPGA= -github.com/lightclient/go-ethereum v1.10.10-0.20230811210943-0cee617571f0/go.mod h1:B/cPTafll0UGQ1m2ceGgP0JTNKL+pxPebUEptS4mXYQ= +github.com/lightclient/go-ethereum v1.10.10-0.20230829211949-79f3c2d9c96b h1:dglsK4NuDRreW5+/0EoTFxCiZwkRZay/aDoOul2lca0= +github.com/lightclient/go-ethereum v1.10.10-0.20230829211949-79f3c2d9c96b/go.mod h1:UWQqzN9473khWbdvlh2QjYXX0ykhKT1OuPYus9Hgv+o= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= @@ -352,8 +354,8 @@ golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5y golang.org/x/crypto v0.9.0 h1:LF6fAI+IutBocDJ2OT0Q1g8plpYljMZ4+lty+dsqw3g= golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1 h1:k/i9J1pBpvlfR+9QsetwPyERsqu1GIbi967PQMq3Ivc= -golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1/go.mod h1:V1LtkGg67GoY2N1AnLN78QLrzxkLyJw7RJb1gzOOz9w= +golang.org/x/exp v0.0.0-20230810033253-352e893a4cad h1:g0bG7Z4uG+OgH2QDODnjp6ggkk1bJDsINcuWmJN1iJU= +golang.org/x/exp v0.0.0-20230810033253-352e893a4cad/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= @@ -362,6 +364,8 @@ golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzB golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.11.0 h1:bUO06HqtnRcc/7l71XBe4WcqTZ+3AH1J59zWDDwLKgU= +golang.org/x/mod v0.11.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -456,6 +460,8 @@ golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roY golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.9.1 h1:8WMNJAz3zrtPmnYC7ISf5dEn3MT0gY7jBJfw27yrrLo= +golang.org/x/tools v0.9.1/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -499,8 +505,6 @@ gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1 h1:iiHuQZCN gopkg.in/ini.v1 v1.51.1/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8= -gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce h1:+JknDZhAj8YMt7GC73Ei8pv4MzjDUNPHgQWJdtMAaDU= -gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:5AcXVHNjg+BDxry382+8OKon8SEWiKktQR07RKPsv1c= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/simulators/ethereum/pyspec/runner.go b/simulators/ethereum/pyspec/runner.go index b5083ae8bc..6dc99d7eaa 100644 --- a/simulators/ethereum/pyspec/runner.go +++ b/simulators/ethereum/pyspec/runner.go @@ -1,6 +1,7 @@ package main import ( + "bytes" "context" "errors" "fmt" @@ -245,7 +246,11 @@ func (tc *testcase) updateEnv(env hivesim.Params) { // extractFixtureFields extracts the genesis, post allocation and payload // fields from the given fixture test and stores them in the testcase struct. func (tc *testcase) extractFixtureFields(fixture fixtureJSON) error { - tc.genesis = extractGenesis(fixture) + var err error + tc.genesis, err = extractGenesis(fixture) + if err != nil { + return err + } tc.postAlloc = &fixture.Post var engineNewPayloads []*engineNewPayload for _, bl := range fixture.Blocks { @@ -260,7 +265,13 @@ func (tc *testcase) extractFixtureFields(fixture fixtureJSON) error { // extractGenesis extracts the genesis block information from the given fixture // and returns a core.Genesis struct containing the extracted information. -func extractGenesis(fixture fixtureJSON) *core.Genesis { +func extractGenesis(fixture fixtureJSON) (*core.Genesis, error) { + if fixture.Genesis.BeaconRoot != nil { + emptyHash := common.Hash{} + if !bytes.Equal(fixture.Genesis.BeaconRoot[:], emptyHash[:]) { + return nil, errors.New("beacon root in genesis is not empty") + } + } genesis := &core.Genesis{ Config: tests.Forks[fixture.Network], Coinbase: fixture.Genesis.Coinbase, @@ -273,10 +284,9 @@ func extractGenesis(fixture fixtureJSON) *core.Genesis { BaseFee: fixture.Genesis.BaseFee, BlobGasUsed: fixture.Genesis.BlobGasUsed, ExcessBlobGas: fixture.Genesis.ExcessBlobGas, - BeaconRoot: fixture.Genesis.BeaconRoot, Alloc: fixture.Pre, } - return genesis + return genesis, nil } // checkRPCErrors checks for RPC errors and compares error codes if expected. From 5d3adb87a4ff5e5c2e846d85c63d27db80a2f15e Mon Sep 17 00:00:00 2001 From: Mario Vega Date: Fri, 1 Sep 2023 15:54:31 -0600 Subject: [PATCH 006/387] simulators/ethereum/engine: Add incorrect engine versions tests (#834) * simulators/ethereum/engine: use customizer interfaces * simulators/ethereum/engine: Expect generic methods * simulators/ethereum/engine: GetPayload generic methods * simulators/ethereum/engine: CLMock add callback on payload attributes * simulators/ethereum/engine: GetPayload customizers * simulators/ethereum/engine: Add tests for incorrect FcU and GetPayload versions * simulators/ethereum/engine: Add time delta modifier * simulators/ethereum/engine: Fix Cancun time increments * simulators/ethereum/engine: Add multiple FcU payload requests on different forks test * simulators/ethereum/engine: CLMock: add payload id history * simulators/ethereum/engine: Add payload id check on beacon root change * simulators/ethereum/engine: Fix test starting directly on Cancun --- simulators/ethereum/engine/client/engine.go | 3 +- .../ethereum/engine/client/node/node.go | 10 + simulators/ethereum/engine/clmock/clmock.go | 61 +- simulators/ethereum/engine/globals/globals.go | 9 +- .../helper/{payload.go => customizer.go} | 315 +++++++++ .../ethereum/engine/suites/cancun/config.go | 5 +- .../ethereum/engine/suites/cancun/steps.go | 279 ++++++-- .../ethereum/engine/suites/cancun/tests.go | 616 ++++++++++++++---- simulators/ethereum/engine/test/expect.go | 45 +- 9 files changed, 1113 insertions(+), 230 deletions(-) rename simulators/ethereum/engine/helper/{payload.go => customizer.go} (54%) diff --git a/simulators/ethereum/engine/client/engine.go b/simulators/ethereum/engine/client/engine.go index 765e2ecad6..b4df3560ed 100644 --- a/simulators/ethereum/engine/client/engine.go +++ b/simulators/ethereum/engine/client/engine.go @@ -37,6 +37,7 @@ type Engine interface { GetPayloadV1(ctx context.Context, payloadId *api.PayloadID) (typ.ExecutableData, error) GetPayloadV2(ctx context.Context, payloadId *api.PayloadID) (typ.ExecutableData, *big.Int, error) GetPayloadV3(ctx context.Context, payloadId *api.PayloadID) (typ.ExecutableData, *big.Int, *typ.BlobsBundle, *bool, error) + GetPayload(ctx context.Context, version int, payloadId *api.PayloadID) (typ.ExecutableData, *big.Int, *typ.BlobsBundle, *bool, error) NewPayload(ctx context.Context, version int, payload interface{}, versionedHashes *[]common.Hash, beaconRoot *common.Hash) (api.PayloadStatusV1, error) NewPayloadV1(ctx context.Context, payload *typ.ExecutableDataV1) (api.PayloadStatusV1, error) @@ -85,6 +86,6 @@ var ( Pending = big.NewInt(-2) Finalized = big.NewInt(-3) Safe = big.NewInt(-4) - LatestForkchoiceUpdatedVersion = 2 + LatestForkchoiceUpdatedVersion = 3 LatestNewPayloadVersion = 3 ) diff --git a/simulators/ethereum/engine/client/node/node.go b/simulators/ethereum/engine/client/node/node.go index 4d891945a6..354af59079 100644 --- a/simulators/ethereum/engine/client/node/node.go +++ b/simulators/ethereum/engine/client/node/node.go @@ -569,6 +569,16 @@ func (n *GethNode) GetPayloadV3(ctx context.Context, payloadId *beacon.PayloadID return ed, p.BlockValue, nil, &p.Override, err } +func (n *GethNode) GetPayload(ctx context.Context, version int, payloadId *beacon.PayloadID) (typ.ExecutableData, *big.Int, *typ.BlobsBundle, *bool, error) { + p, err := n.api.GetPayloadV3(*payloadId) + if p == nil || err != nil { + return typ.ExecutableData{}, nil, nil, nil, err + } + ed, err := typ.FromBeaconExecutableData(p.ExecutionPayload) + // TODO: Convert and return the blobs bundle + return ed, p.BlockValue, nil, &p.Override, err +} + func (n *GethNode) GetPayloadBodiesByRangeV1(ctx context.Context, start uint64, count uint64) ([]*typ.ExecutionPayloadBodyV1, error) { return nil, fmt.Errorf("not implemented") } diff --git a/simulators/ethereum/engine/clmock/clmock.go b/simulators/ethereum/engine/clmock/clmock.go index 8a264efc05..3ebf135c44 100644 --- a/simulators/ethereum/engine/clmock/clmock.go +++ b/simulators/ethereum/engine/clmock/clmock.go @@ -5,7 +5,6 @@ import ( "crypto/sha256" "encoding/binary" "encoding/json" - "errors" "fmt" "math/big" "math/rand" @@ -23,6 +22,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/hive/hivesim" + "github.com/pkg/errors" ) var ( @@ -89,6 +89,9 @@ type CLMocker struct { // Chain History HeaderHistory map[uint64]*types.Header + // Payload ID History + PayloadIDHistory map[api.PayloadID]interface{} + // PoS Chain History Information PrevRandaoHistory map[uint64]common.Hash ExecutedPayloadHistory ExecutableDataHistory @@ -147,6 +150,7 @@ func NewCLMocker(t *hivesim.T, genesis *core.Genesis, slotsToSafe, slotsToFinali SlotsToFinalized: slotsToFinalized, SafeSlotsToImportOptimistically: safeSlotsToImportOptimistically, PayloadProductionClientDelay: DefaultPayloadProductionClientDelay, + PayloadIDHistory: make(map[api.PayloadID]interface{}), LatestHeader: nil, FirstPoSBlockNumber: nil, LatestHeadNumber: nil, @@ -392,7 +396,7 @@ func TimestampToBeaconRoot(timestamp uint64) common.Hash { return beaconRoot } -func (cl *CLMocker) RequestNextPayload() { +func (cl *CLMocker) GeneratePayloadAttributes() { // Generate a random value for the PrevRandao field nextPrevRandao := common.Hash{} rand.Read(nextPrevRandao[:]) @@ -415,10 +419,23 @@ func (cl *CLMocker) RequestNextPayload() { // Save random value cl.PrevRandaoHistory[cl.LatestHeader.Number.Uint64()+1] = nextPrevRandao +} + +func (cl *CLMocker) AddPayloadID(newPayloadID *api.PayloadID) error { + if newPayloadID == nil { + return errors.New("nil payload ID") + } + if _, ok := cl.PayloadIDHistory[*newPayloadID]; ok { + return fmt.Errorf("Reused payload ID: %v", *newPayloadID) + } + cl.PayloadIDHistory[*newPayloadID] = nil + return nil +} +func (cl *CLMocker) RequestNextPayload() { ctx, cancel := context.WithTimeout(cl.TestContext, globals.RPCTimeout) defer cancel() - fcUVersion := cl.ForkchoiceUpdatedVersion(cl.LatestPayloadAttributes.Timestamp) + fcUVersion := cl.ForkchoiceUpdatedVersion(cl.LatestHeader.Time, &cl.LatestPayloadAttributes.Timestamp) resp, err := cl.NextBlockProducer.ForkchoiceUpdated(ctx, fcUVersion, &cl.LatestForkchoice, &cl.LatestPayloadAttributes) if err != nil { cl.Fatalf("CLMocker: Could not send forkchoiceUpdatedV%d (%v): %v", fcUVersion, cl.NextBlockProducer.ID(), err) @@ -429,6 +446,9 @@ func (cl *CLMocker) RequestNextPayload() { if resp.PayloadStatus.LatestValidHash == nil || *resp.PayloadStatus.LatestValidHash != cl.LatestForkchoice.HeadBlockHash { cl.Fatalf("CLMocker: Unexpected forkchoiceUpdated LatestValidHash Response from Payload builder: %v != %v", resp.PayloadStatus.LatestValidHash, cl.LatestForkchoice.HeadBlockHash) } + if err = cl.AddPayloadID(resp.PayloadID); err != nil { + cl.Fatalf("CLMocker: Payload ID failure: %v", err) + } cl.NextPayloadID = resp.PayloadID } @@ -436,16 +456,8 @@ func (cl *CLMocker) GetNextPayload() { var err error ctx, cancel := context.WithTimeout(cl.TestContext, globals.RPCTimeout) defer cancel() - if cl.IsCancun(cl.LatestPayloadAttributes.Timestamp) { - cl.LatestPayloadBuilt, cl.LatestBlockValue, cl.LatestBlobBundle, cl.LatestShouldOverrideBuilder, err = cl.NextBlockProducer.GetPayloadV3(ctx, cl.NextPayloadID) - } else if cl.IsShanghai(cl.LatestPayloadAttributes.Timestamp) { - cl.LatestPayloadBuilt, cl.LatestBlockValue, err = cl.NextBlockProducer.GetPayloadV2(ctx, cl.NextPayloadID) - cl.LatestBlobBundle = nil - } else { - cl.LatestPayloadBuilt, err = cl.NextBlockProducer.GetPayloadV1(ctx, cl.NextPayloadID) - cl.LatestBlockValue = nil - cl.LatestBlobBundle = nil - } + version := cl.ForkConfig.GetPayloadVersion(cl.LatestPayloadAttributes.Timestamp) + cl.LatestPayloadBuilt, cl.LatestBlockValue, cl.LatestBlobBundle, cl.LatestShouldOverrideBuilder, err = cl.NextBlockProducer.GetPayload(ctx, version, cl.NextPayloadID) if err != nil { cl.Fatalf("CLMocker: Could not getPayload (%v, %v): %v", cl.NextBlockProducer.ID(), cl.NextPayloadID, err) } @@ -519,7 +531,7 @@ func (cl *CLMocker) broadcastNextNewPayload() { } func (cl *CLMocker) broadcastLatestForkchoice() { - version := cl.ForkchoiceUpdatedVersion(cl.LatestExecutedPayload.Timestamp) + version := cl.ForkchoiceUpdatedVersion(cl.LatestExecutedPayload.Timestamp, nil) for _, resp := range cl.BroadcastForkchoiceUpdated(&cl.LatestForkchoice, nil, version) { if resp.Error != nil { cl.Logf("CLMocker: BroadcastForkchoiceUpdated Error (%v): %v\n", resp.Container, resp.Error) @@ -543,13 +555,14 @@ func (cl *CLMocker) broadcastLatestForkchoice() { } type BlockProcessCallbacks struct { - OnPayloadProducerSelected func() - OnRequestNextPayload func() - OnGetPayload func() - OnNewPayloadBroadcast func() - OnForkchoiceBroadcast func() - OnSafeBlockChange func() - OnFinalizedBlockChange func() + OnPayloadProducerSelected func() + OnPayloadAttributesGenerated func() + OnRequestNextPayload func() + OnGetPayload func() + OnNewPayloadBroadcast func() + OnForkchoiceBroadcast func() + OnSafeBlockChange func() + OnFinalizedBlockChange func() } func (cl *CLMocker) ProduceSingleBlock(callbacks BlockProcessCallbacks) { @@ -576,6 +589,12 @@ func (cl *CLMocker) ProduceSingleBlock(callbacks BlockProcessCallbacks) { callbacks.OnPayloadProducerSelected() } + cl.GeneratePayloadAttributes() + + if callbacks.OnPayloadAttributesGenerated != nil { + callbacks.OnPayloadAttributesGenerated() + } + cl.RequestNextPayload() cl.SetNextWithdrawals(nil) diff --git a/simulators/ethereum/engine/globals/globals.go b/simulators/ethereum/engine/globals/globals.go index ecd5fbdb4e..8a99c4e953 100644 --- a/simulators/ethereum/engine/globals/globals.go +++ b/simulators/ethereum/engine/globals/globals.go @@ -181,7 +181,14 @@ func (f *ForkConfig) IsCancun(blockTimestamp uint64) bool { return f.CancunTimestamp != nil && new(big.Int).SetUint64(blockTimestamp).Cmp(f.CancunTimestamp) >= 0 } -func (f *ForkConfig) ForkchoiceUpdatedVersion(timestamp uint64) int { +func (f *ForkConfig) ForkchoiceUpdatedVersion(headTimestamp uint64, payloadAttributesTimestamp *uint64) int { + // If the payload attributes timestamp is nil, use the head timestamp + // to calculate the FcU version. + timestamp := headTimestamp + if payloadAttributesTimestamp != nil { + timestamp = *payloadAttributesTimestamp + } + if f.IsCancun(timestamp) { return 3 } else if f.IsShanghai(timestamp) { diff --git a/simulators/ethereum/engine/helper/payload.go b/simulators/ethereum/engine/helper/customizer.go similarity index 54% rename from simulators/ethereum/engine/helper/payload.go rename to simulators/ethereum/engine/helper/customizer.go index 09d2048be1..1a200b316e 100644 --- a/simulators/ethereum/engine/helper/payload.go +++ b/simulators/ethereum/engine/helper/customizer.go @@ -6,6 +6,7 @@ import ( "math/rand" "strings" + api "github.com/ethereum/go-ethereum/beacon/engine" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/core/types" @@ -14,8 +15,234 @@ import ( typ "github.com/ethereum/hive/simulators/ethereum/engine/types" ) +type GetPayloadCustomizer interface { + GetPayloadID(basePayloadID *api.PayloadID) (*api.PayloadID, error) + GetVersion(forkConfig *globals.ForkConfig, requestedTimestamp uint64) (int, error) + GetExpectedError() (*int, error) +} + +type BaseGetPayloadCustomizer struct { + CustomPayloadID *api.PayloadID + ExpectedError *int +} + +var _ GetPayloadCustomizer = (*BaseGetPayloadCustomizer)(nil) + +func (customizer *BaseGetPayloadCustomizer) GetPayloadID(basePayloadID *api.PayloadID) (*api.PayloadID, error) { + if customizer.CustomPayloadID != nil { + return customizer.CustomPayloadID, nil + } + return basePayloadID, nil +} + +func (customizer *BaseGetPayloadCustomizer) GetVersion(forkConfig *globals.ForkConfig, requestedTimestamp uint64) (int, error) { + return forkConfig.GetPayloadVersion(requestedTimestamp), nil +} + +func (customizer *BaseGetPayloadCustomizer) GetExpectedError() (*int, error) { + return customizer.ExpectedError, nil +} + +type UpgradeGetPayloadVersion struct { + GetPayloadCustomizer +} + +var _ GetPayloadCustomizer = (*UpgradeGetPayloadVersion)(nil) + +func (customizer *UpgradeGetPayloadVersion) GetVersion(forkConfig *globals.ForkConfig, requestedTimestamp uint64) (int, error) { + if customizer.GetPayloadCustomizer == nil { + return 0, fmt.Errorf("base customizer not set") + } + baseVersion, err := customizer.GetPayloadCustomizer.GetVersion(forkConfig, requestedTimestamp) + if err != nil { + return 0, err + } + return baseVersion + 1, nil +} + +type DowngradeGetPayloadVersion struct { + GetPayloadCustomizer +} + +var _ GetPayloadCustomizer = (*DowngradeGetPayloadVersion)(nil) + +func (customizer *DowngradeGetPayloadVersion) GetVersion(forkConfig *globals.ForkConfig, requestedTimestamp uint64) (int, error) { + if customizer.GetPayloadCustomizer == nil { + return 0, fmt.Errorf("base customizer not set") + } + baseVersion, err := customizer.GetPayloadCustomizer.GetVersion(forkConfig, requestedTimestamp) + if err != nil { + return 0, err + } + if baseVersion == 1 { + return 1, fmt.Errorf("cannot downgrade version 1") + } + return baseVersion - 1, nil +} + +type PayloadAttributesCustomizer interface { + GetPayloadAttributes(basePayloadAttributes *typ.PayloadAttributes) (*typ.PayloadAttributes, error) +} + +type ForkchoiceUpdatedCustomizer interface { + PayloadAttributesCustomizer + GetForkchoiceState(baseForkchoiceUpdate api.ForkchoiceStateV1) (api.ForkchoiceStateV1, error) + GetVersion(forkConfig *globals.ForkConfig, headTimestamp uint64, basePayloadAttributes *typ.PayloadAttributes) (int, error) + GetExpectedError() (*int, error) + GetExpectInvalidStatus() bool +} + +type BasePayloadAttributesCustomizer struct { + Timestamp *uint64 + Random *common.Hash + SuggestedFeeRecipient *common.Address + Withdrawals *[]*types.Withdrawal + RemoveWithdrawals bool + BeaconRoot *common.Hash + RemoveBeaconRoot bool +} + +var _ PayloadAttributesCustomizer = (*BasePayloadAttributesCustomizer)(nil) + +func (customData *BasePayloadAttributesCustomizer) GetPayloadAttributes(basePayloadAttributes *typ.PayloadAttributes) (*typ.PayloadAttributes, error) { + customPayloadAttributes := &typ.PayloadAttributes{ + Timestamp: basePayloadAttributes.Timestamp, + Random: basePayloadAttributes.Random, + SuggestedFeeRecipient: basePayloadAttributes.SuggestedFeeRecipient, + Withdrawals: basePayloadAttributes.Withdrawals, + BeaconRoot: basePayloadAttributes.BeaconRoot, + } + if customData.Timestamp != nil { + customPayloadAttributes.Timestamp = *customData.Timestamp + } + if customData.Random != nil { + customPayloadAttributes.Random = *customData.Random + } + if customData.SuggestedFeeRecipient != nil { + customPayloadAttributes.SuggestedFeeRecipient = *customData.SuggestedFeeRecipient + } + if customData.RemoveWithdrawals { + customPayloadAttributes.Withdrawals = nil + } else if customData.Withdrawals != nil { + customPayloadAttributes.Withdrawals = *customData.Withdrawals + } + if customData.RemoveBeaconRoot { + customPayloadAttributes.BeaconRoot = nil + } else if customData.BeaconRoot != nil { + customPayloadAttributes.BeaconRoot = customData.BeaconRoot + } + return customPayloadAttributes, nil +} + +type TimestampDeltaPayloadAttributesCustomizer struct { + PayloadAttributesCustomizer + TimestampDelta int64 +} + +var _ PayloadAttributesCustomizer = (*TimestampDeltaPayloadAttributesCustomizer)(nil) + +func (customData *TimestampDeltaPayloadAttributesCustomizer) GetPayloadAttributes(basePayloadAttributes *typ.PayloadAttributes) (*typ.PayloadAttributes, error) { + customPayloadAttributes, err := customData.PayloadAttributesCustomizer.GetPayloadAttributes(basePayloadAttributes) + if err != nil { + return nil, err + } + customPayloadAttributes.Timestamp = uint64(int64(customPayloadAttributes.Timestamp) + customData.TimestampDelta) + return customPayloadAttributes, nil +} + +// Customizer that makes no modifications to the forkchoice directive call. +// Used as base to other customizers. +type BaseForkchoiceUpdatedCustomizer struct { + PayloadAttributesCustomizer + ExpectedError *int + ExpectInvalidStatus bool +} + +func (customizer *BaseForkchoiceUpdatedCustomizer) GetPayloadAttributes(basePayloadAttributes *typ.PayloadAttributes) (*typ.PayloadAttributes, error) { + if customizer.PayloadAttributesCustomizer != nil { + return customizer.PayloadAttributesCustomizer.GetPayloadAttributes(basePayloadAttributes) + } + return basePayloadAttributes, nil +} + +func (customizer *BaseForkchoiceUpdatedCustomizer) GetForkchoiceState(baseForkchoiceUpdate api.ForkchoiceStateV1) (api.ForkchoiceStateV1, error) { + return baseForkchoiceUpdate, nil +} + +func (customizer *BaseForkchoiceUpdatedCustomizer) GetVersion(forkConfig *globals.ForkConfig, headTimestamp uint64, basePayloadAttributes *typ.PayloadAttributes) (int, error) { + // We use the version meant for the head block unless there are payload attributes + // in which case we use the version meant for the new payload requested. + var payloadAttributesTimestamp *uint64 + if basePayloadAttributes != nil { + payloadAttributesTimestamp = &basePayloadAttributes.Timestamp + } + return forkConfig.ForkchoiceUpdatedVersion(headTimestamp, payloadAttributesTimestamp), nil +} + +func (customizer *BaseForkchoiceUpdatedCustomizer) GetExpectedError() (*int, error) { + return customizer.ExpectedError, nil +} + +func (customizer *BaseForkchoiceUpdatedCustomizer) GetExpectInvalidStatus() bool { + return customizer.ExpectInvalidStatus +} + +var _ ForkchoiceUpdatedCustomizer = (*BaseForkchoiceUpdatedCustomizer)(nil) + +// Customizer that upgrades the version of the forkchoice directive call to the next version. +type UpgradeForkchoiceUpdatedVersion struct { + ForkchoiceUpdatedCustomizer +} + +var _ ForkchoiceUpdatedCustomizer = (*UpgradeForkchoiceUpdatedVersion)(nil) + +func (customizer *UpgradeForkchoiceUpdatedVersion) GetVersion(forkConfig *globals.ForkConfig, headTimestamp uint64, basePayloadAttributes *typ.PayloadAttributes) (int, error) { + if customizer.ForkchoiceUpdatedCustomizer == nil { + return 0, fmt.Errorf("base customizer not set") + } + baseVersion, err := customizer.ForkchoiceUpdatedCustomizer.GetVersion(forkConfig, headTimestamp, basePayloadAttributes) + if err != nil { + return 0, err + } + return baseVersion + 1, nil +} + +// Customizer that downgrades the version of the forkchoice directive call to the previous version. +type DowngradeForkchoiceUpdatedVersion struct { + ForkchoiceUpdatedCustomizer +} + +var _ ForkchoiceUpdatedCustomizer = (*DowngradeForkchoiceUpdatedVersion)(nil) + +func (customizer *DowngradeForkchoiceUpdatedVersion) GetVersion(forkConfig *globals.ForkConfig, headTimestamp uint64, basePayloadAttributes *typ.PayloadAttributes) (int, error) { + if customizer.ForkchoiceUpdatedCustomizer == nil { + return 0, fmt.Errorf("base customizer not set") + } + baseVersion, err := customizer.ForkchoiceUpdatedCustomizer.GetVersion(forkConfig, headTimestamp, basePayloadAttributes) + if err != nil { + return 0, err + } + if baseVersion == 1 { + return 1, fmt.Errorf("cannot downgrade version 1") + } + return baseVersion - 1, nil +} + type PayloadCustomizer interface { CustomizePayload(basePayload *typ.ExecutableData, baseBeaconRoot *common.Hash) (modifiedPayload *typ.ExecutableData, modifiedBeaconRoot *common.Hash, err error) + GetTimestamp(basePayload *typ.ExecutableData) (uint64, error) +} + +type VersionedHashesCustomizer interface { + GetVersionedHashes(baseVesionedHashes *[]common.Hash) (*[]common.Hash, error) +} + +type NewPayloadCustomizer interface { + PayloadCustomizer + VersionedHashesCustomizer + GetVersion(forkConfig *globals.ForkConfig, basePayload *typ.ExecutableData) (int, error) + GetExpectedError() (*int, error) + GetExpectInvalidStatus() bool } type CustomPayloadData struct { @@ -45,6 +272,13 @@ type CustomPayloadData struct { var _ PayloadCustomizer = (*CustomPayloadData)(nil) +func (customData *CustomPayloadData) GetTimestamp(basePayload *typ.ExecutableData) (uint64, error) { + if customData.Timestamp != nil { + return *customData.Timestamp, nil + } + return basePayload.Timestamp, nil +} + // Construct a customized payload by taking an existing payload as base and mixing it CustomPayloadData // BlockHash is calculated automatically. func (customData *CustomPayloadData) CustomizePayload(basePayload *typ.ExecutableData, baseBeaconRoot *common.Hash) (*typ.ExecutableData, *common.Hash, error) { @@ -173,6 +407,87 @@ func (customData *CustomPayloadData) CustomizePayload(basePayload *typ.Executabl return result, customPayloadHeader.ParentBeaconRoot, nil } +// Base new payload directive call customizer. +// Used as base to other customizers. +type BaseNewPayloadVersionCustomizer struct { + PayloadCustomizer + VersionedHashesCustomizer + ExpectedError *int + ExpectInvalidStatus bool +} + +var _ NewPayloadCustomizer = (*BaseNewPayloadVersionCustomizer)(nil) + +func (customNewPayload *BaseNewPayloadVersionCustomizer) CustomizePayload(basePayload *typ.ExecutableData, baseBeaconRoot *common.Hash) (*typ.ExecutableData, *common.Hash, error) { + if customNewPayload.PayloadCustomizer == nil { + return basePayload, baseBeaconRoot, nil + } + return customNewPayload.PayloadCustomizer.CustomizePayload(basePayload, baseBeaconRoot) +} + +func (customNewPayload *BaseNewPayloadVersionCustomizer) GetVersionedHashes(baseVersionedHashes *[]common.Hash) (*[]common.Hash, error) { + if customNewPayload.VersionedHashesCustomizer != nil { + return customNewPayload.VersionedHashesCustomizer.GetVersionedHashes(baseVersionedHashes) + } + return baseVersionedHashes, nil +} + +func (customNewPayload *BaseNewPayloadVersionCustomizer) GetVersion(forkConfig *globals.ForkConfig, basePayload *typ.ExecutableData) (int, error) { + var ( + timestamp = basePayload.Timestamp + err error + ) + if customNewPayload.PayloadCustomizer != nil { + timestamp, err = customNewPayload.PayloadCustomizer.GetTimestamp(basePayload) + if err != nil { + return 0, err + } + } + + return forkConfig.NewPayloadVersion(timestamp), nil +} + +func (customNewPayload *BaseNewPayloadVersionCustomizer) GetExpectedError() (*int, error) { + return customNewPayload.ExpectedError, nil +} + +func (customNewPayload *BaseNewPayloadVersionCustomizer) GetExpectInvalidStatus() bool { + return customNewPayload.ExpectInvalidStatus +} + +// Customizer that upgrades the version of the payload to the next version. +type UpgradeNewPayloadVersion struct { + NewPayloadCustomizer +} + +var _ NewPayloadCustomizer = (*UpgradeNewPayloadVersion)(nil) + +func (customNewPayload *UpgradeNewPayloadVersion) GetVersion(forkConfig *globals.ForkConfig, basePayload *typ.ExecutableData) (int, error) { + if customNewPayload.NewPayloadCustomizer == nil { + return 0, fmt.Errorf("base customizer not set") + } + version, err := customNewPayload.NewPayloadCustomizer.GetVersion(forkConfig, basePayload) + return version + 1, err +} + +// Customizer that downgrades the version of the payload to the previous version. +type DowngradeNewPayloadVersion struct { + NewPayloadCustomizer +} + +var _ NewPayloadCustomizer = (*DowngradeNewPayloadVersion)(nil) + +func (customNewPayload *DowngradeNewPayloadVersion) GetVersion(forkConfig *globals.ForkConfig, basePayload *typ.ExecutableData) (int, error) { + if customNewPayload.NewPayloadCustomizer == nil { + return 0, fmt.Errorf("base customizer not set") + } + version, err := customNewPayload.NewPayloadCustomizer.GetVersion(forkConfig, basePayload) + if version == 1 { + return 1, fmt.Errorf("cannot downgrade version 1") + } + return version - 1, err +} + func CustomizePayloadTransactions(basePayload *typ.ExecutableData, baseBeaconRoot *common.Hash, customTransactions types.Transactions) (*typ.ExecutableData, *common.Hash, error) { byteTxs := make([][]byte, 0) for _, tx := range customTransactions { diff --git a/simulators/ethereum/engine/suites/cancun/config.go b/simulators/ethereum/engine/suites/cancun/config.go index 02f34a83c9..6b7e993ae4 100644 --- a/simulators/ethereum/engine/suites/cancun/config.go +++ b/simulators/ethereum/engine/suites/cancun/config.go @@ -49,7 +49,10 @@ func (cs *CancunBaseSpec) GetForkConfig() globals.ForkConfig { // Get the per-block timestamp increments configured for this test func (cs *CancunBaseSpec) GetBlockTimeIncrements() uint64 { - return 1 + if cs.TimeIncrements == 0 { + return 1 + } + return cs.TimeIncrements } // Timestamp delta between genesis and the withdrawals fork diff --git a/simulators/ethereum/engine/suites/cancun/steps.go b/simulators/ethereum/engine/suites/cancun/steps.go index 30b0568e99..2951140ee9 100644 --- a/simulators/ethereum/engine/suites/cancun/steps.go +++ b/simulators/ethereum/engine/suites/cancun/steps.go @@ -8,6 +8,7 @@ import ( "sync" "time" + api "github.com/ethereum/go-ethereum/beacon/engine" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/hive/simulators/ethereum/engine/client" @@ -124,16 +125,16 @@ type NewPayloads struct { ExpectedBlobs []helper.BlobID // Delay between FcU and GetPayload calls GetPayloadDelay uint64 - // Extra modifications on NewPayload to the versioned hashes - VersionedHashes *VersionedHashes + // GetPayload modifier when requesting the new Payload + GetPayloadCustomizer helper.GetPayloadCustomizer + // ForkchoiceUpdate modifier when requesting the new Payload + FcUOnPayloadRequest helper.ForkchoiceUpdatedCustomizer // Extra modifications on NewPayload to potentially generate an invalid payload - PayloadCustomizer helper.PayloadCustomizer - // Version to use to call NewPayload - Version int + NewPayloadCustomizer helper.NewPayloadCustomizer + // ForkchoiceUpdate modifier when setting the new payload as head + FcUOnHeadSet helper.ForkchoiceUpdatedCustomizer // Expected responses on the NewPayload call - ExpectedError *int ExpectationDescription string - ExpectedStatus test.PayloadStatus } type VersionedHashes struct { @@ -141,7 +142,7 @@ type VersionedHashes struct { HashVersions []byte } -func (v *VersionedHashes) VersionedHashes() (*[]common.Hash, error) { +func (v *VersionedHashes) GetVersionedHashes(*[]common.Hash) (*[]common.Hash, error) { if v.Blobs == nil { return nil, nil } @@ -403,6 +404,85 @@ func (step NewPayloads) Execute(t *CancunTestContext) error { ) for p := uint64(0); p < payloadCount; p++ { t.CLMock.ProduceSingleBlock(clmock.BlockProcessCallbacks{ + OnPayloadAttributesGenerated: func() { + if step.FcUOnPayloadRequest != nil { + var ( + payloadAttributes *typ.PayloadAttributes = &t.CLMock.LatestPayloadAttributes + forkchoiceState api.ForkchoiceStateV1 = t.CLMock.LatestForkchoice + version int + expectedError *int + expectedStatus test.PayloadStatus = test.Valid + err error + ) + payloadAttributes, err = step.FcUOnPayloadRequest.GetPayloadAttributes(payloadAttributes) + if err != nil { + t.Fatalf("FAIL: Error getting custom payload attributes (payload %d/%d): %v", p+1, payloadCount, err) + } + version, err = step.FcUOnPayloadRequest.GetVersion(t.Env.ForkConfig, t.CLMock.LatestHeader.Time, payloadAttributes) + if err != nil { + t.Fatalf("FAIL: Error getting custom fcU version (payload %d/%d): %v", p+1, payloadCount, err) + } + expectedError, err = step.FcUOnPayloadRequest.GetExpectedError() + if err != nil { + t.Fatalf("FAIL: Error getting custom expected error (payload %d/%d): %v", p+1, payloadCount, err) + } + if step.FcUOnPayloadRequest.GetExpectInvalidStatus() { + expectedStatus = test.Invalid + } + + r := t.TestEngine.TestEngineForkchoiceUpdated(&forkchoiceState, payloadAttributes, version) + r.ExpectationDescription = step.ExpectationDescription + if expectedError != nil { + r.ExpectErrorCode(*expectedError) + } else { + r.ExpectNoError() + r.ExpectPayloadStatus(expectedStatus) + } + if r.Response.PayloadID != nil { + t.CLMock.AddPayloadID(r.Response.PayloadID) + } + } + }, + OnRequestNextPayload: func() { + // Get the next payload + if step.GetPayloadCustomizer != nil { + var ( + payloadAttributes = &t.CLMock.LatestPayloadAttributes + payloadID = t.CLMock.NextPayloadID + version int + r *test.GetPayloadResponseExpectObject + expectedError *int + err error + ) + + // We are going to sleep twice because there is no way to skip the CL Mock's sleep + time.Sleep(time.Duration(step.GetPayloadDelay) * time.Second) + + payloadID, err = step.GetPayloadCustomizer.GetPayloadID(payloadID) + if err != nil { + t.Fatalf("FAIL: Error getting custom payload ID (payload %d/%d): %v", p+1, payloadCount, err) + } + + version, err = step.GetPayloadCustomizer.GetVersion(t.Env.ForkConfig, payloadAttributes.Timestamp) + if err != nil { + t.Fatalf("FAIL: Error getting custom get-payload version (payload %d/%d): %v", p+1, payloadCount, err) + } + + expectedError, err = step.GetPayloadCustomizer.GetExpectedError() + if err != nil { + t.Fatalf("FAIL: Error getting custom expected error (payload %d/%d): %v", p+1, payloadCount, err) + } + + r = t.TestEngine.TestEngineGetPayload(payloadID, version) + r.ExpectationDescription = step.ExpectationDescription + if expectedError != nil { + r.ExpectErrorCode(*expectedError) + } else { + r.ExpectNoError() + } + } + + }, OnGetPayload: func() { // Get the latest blob bundle var ( @@ -428,52 +508,92 @@ func (step NewPayloads) Execute(t *CancunTestContext) error { } }, OnNewPayloadBroadcast: func() { - // Send a test NewPayload directive with either a modified payload or modifed versioned hashes - var ( - payload = &t.CLMock.LatestPayloadBuilt - versionedHashes *[]common.Hash = nil - beaconRoot *common.Hash = t.CLMock.LatestPayloadAttributes.BeaconRoot - r *test.NewPayloadResponseExpectObject - err error - ) - if step.VersionedHashes != nil { - // Send a new payload with the modified versioned hashes - versionedHashes, err = step.VersionedHashes.VersionedHashes() - if err != nil { - t.Fatalf("FAIL: Error getting modified versioned hashes (payload %d/%d): %v", p+1, payloadCount, err) - } - } else { + if step.NewPayloadCustomizer != nil { + // Send a test NewPayload directive with either a modified payload or modifed versioned hashes + var ( + payload = &t.CLMock.LatestPayloadBuilt + version = t.Env.ForkConfig.NewPayloadVersion(payload.Timestamp) + versionedHashes *[]common.Hash = nil + beaconRoot *common.Hash = t.CLMock.LatestPayloadAttributes.BeaconRoot + r *test.NewPayloadResponseExpectObject + expectedError *int + expectedStatus test.PayloadStatus = test.Valid + err error + ) + if t.CLMock.LatestBlobBundle != nil { versionedHashes, err = t.CLMock.LatestBlobBundle.VersionedHashes(BLOB_COMMITMENT_VERSION_KZG) if err != nil { t.Fatalf("FAIL: Error getting versioned hashes (payload %d/%d): %v", p+1, payloadCount, err) } } - } - if step.PayloadCustomizer != nil { // Send a custom new payload - payload, beaconRoot, err = step.PayloadCustomizer.CustomizePayload(payload, beaconRoot) + version, err = step.NewPayloadCustomizer.GetVersion(t.Env.ForkConfig, payload) + if err != nil { + t.Fatalf("FAIL: Error getting custom payload version (payload %d/%d): %v", p+1, payloadCount, err) + } + payload, beaconRoot, err = step.NewPayloadCustomizer.CustomizePayload(payload, beaconRoot) if err != nil { t.Fatalf("FAIL: Error customizing payload (payload %d/%d): %v", p+1, payloadCount, err) } + versionedHashes, err = step.NewPayloadCustomizer.GetVersionedHashes(versionedHashes) + if err != nil { + t.Fatalf("FAIL: Error getting custom versioned hashes (payload %d/%d): %v", p+1, payloadCount, err) + } + expectedError, err = step.NewPayloadCustomizer.GetExpectedError() + if err != nil { + t.Fatalf("FAIL: Error getting custom expected error (payload %d/%d): %v", p+1, payloadCount, err) + } + if step.NewPayloadCustomizer.GetExpectInvalidStatus() { + expectedStatus = test.Invalid + } + r = t.TestEngine.TestEngineNewPayload(payload, versionedHashes, beaconRoot, version) + r.ExpectationDescription = step.ExpectationDescription + if expectedError != nil { + r.ExpectErrorCode(*expectedError) + } else { + r.ExpectNoError() + r.ExpectStatus(expectedStatus) + } } - version := step.Version - if version == 0 { - version = t.Env.ForkConfig.NewPayloadVersion(payload.Timestamp) - } - r = t.TestEngine.TestEngineNewPayload(payload, versionedHashes, beaconRoot, version) - r.ExpectationDescription = step.ExpectationDescription - if step.ExpectedError != nil { - r.ExpectErrorCode(*step.ExpectedError) - } else { - r.ExpectNoError() - if step.ExpectedStatus != "" { - r.ExpectStatus(step.ExpectedStatus) + if step.FcUOnHeadSet != nil { + var ( + payloadAttributes *typ.PayloadAttributes = nil + forkchoiceState api.ForkchoiceStateV1 = t.CLMock.LatestForkchoice + version int + expectedError *int + expectedStatus test.PayloadStatus = test.Valid + err error + ) + payloadAttributes, err = step.FcUOnHeadSet.GetPayloadAttributes(payloadAttributes) + if err != nil { + t.Fatalf("FAIL: Error getting custom payload attributes (payload %d/%d): %v", p+1, payloadCount, err) + } + version, err = step.FcUOnHeadSet.GetVersion(t.Env.ForkConfig, t.CLMock.LatestHeader.Time, payloadAttributes) + if err != nil { + t.Fatalf("FAIL: Error getting custom fcU version (payload %d/%d): %v", p+1, payloadCount, err) + } + expectedError, err = step.FcUOnHeadSet.GetExpectedError() + if err != nil { + t.Fatalf("FAIL: Error getting custom expected error (payload %d/%d): %v", p+1, payloadCount, err) + } + if step.FcUOnHeadSet.GetExpectInvalidStatus() { + expectedStatus = test.Invalid + } + + r := t.TestEngine.TestEngineForkchoiceUpdated(&forkchoiceState, payloadAttributes, version) + r.ExpectationDescription = step.ExpectationDescription + if expectedError != nil { + r.ExpectErrorCode(*expectedError) + } else { + r.ExpectNoError() + r.ExpectPayloadStatus(expectedStatus) } } + }, OnForkchoiceBroadcast: func() { // Verify the transaction receipts on incorporated transactions @@ -499,9 +619,12 @@ func (step NewPayloads) Execute(t *CancunTestContext) error { } func (step NewPayloads) Description() string { - if step.VersionedHashes != nil { - return fmt.Sprintf("NewPayloads: %d payloads, %d blobs expected, %s", step.GetPayloadCount(), step.ExpectedIncludedBlobCount, step.VersionedHashes.Description()) - } + /* + TODO: Figure out if we need this. + if step.VersionedHashes != nil { + return fmt.Sprintf("NewPayloads: %d payloads, %d blobs expected, %s", step.GetPayloadCount(), step.ExpectedIncludedBlobCount, step.VersionedHashes.Description()) + } + */ return fmt.Sprintf("NewPayloads: %d payloads, %d blobs expected", step.GetPayloadCount(), step.ExpectedIncludedBlobCount) } @@ -598,56 +721,74 @@ func (step SendBlobTransactions) Description() string { // Send a modified version of the latest payload produced using NewPayloadV3 type SendModifiedLatestPayload struct { - ClientID uint64 - // Versioned hashes modification - VersionedHashes *VersionedHashes - // Other modifications - PayloadCustomizer helper.PayloadCustomizer - // Expected responses on the NewPayload call - ExpectedError *int - ExpectedStatus test.PayloadStatus + ClientID uint64 + NewPayloadCustomizer helper.NewPayloadCustomizer } func (step SendModifiedLatestPayload) Execute(t *CancunTestContext) error { // Get the latest payload var ( - payload = &t.CLMock.LatestPayloadBuilt - beaconRoot = t.CLMock.LatestPayloadAttributes.BeaconRoot + payload = &t.CLMock.LatestPayloadBuilt + beaconRoot = t.CLMock.LatestPayloadAttributes.BeaconRoot + version int = t.Env.ForkConfig.NewPayloadVersion(payload.Timestamp) + versionedHashes *[]common.Hash = nil + expectedError *int = nil + expectedStatus test.PayloadStatus = test.Valid + err error = nil ) if payload == nil { - return fmt.Errorf("no payload available") + return fmt.Errorf("TEST-FAIL: no payload available") + } + if t.CLMock.LatestBlobBundle == nil { + return fmt.Errorf("TEST-FAIL: no blob bundle available") + } + if step.NewPayloadCustomizer == nil { + return fmt.Errorf("TEST-FAIL: no payload customizer available") } - // Modify the versioned hashes - versionedHashes, err := step.VersionedHashes.VersionedHashes() + + // Send a custom new payload + version, err = step.NewPayloadCustomizer.GetVersion(t.Env.ForkConfig, payload) if err != nil { - return fmt.Errorf("error getting modified versioned hashes: %v", err) + t.Fatalf("FAIL: Error getting custom payload version: %v", err) } - // Modify the payload - if step.PayloadCustomizer != nil { - payload, beaconRoot, err = step.PayloadCustomizer.CustomizePayload(payload, beaconRoot) - if err != nil { - return fmt.Errorf("error modifying payload: %v", err) - } + payload, beaconRoot, err = step.NewPayloadCustomizer.CustomizePayload(payload, beaconRoot) + if err != nil { + t.Fatalf("FAIL: Error customizing payload: %v", err) } + versionedHashes, err = step.NewPayloadCustomizer.GetVersionedHashes(versionedHashes) + if err != nil { + t.Fatalf("FAIL: Error getting custom versioned hashes: %v", err) + } + expectedError, err = step.NewPayloadCustomizer.GetExpectedError() + if err != nil { + t.Fatalf("FAIL: Error getting custom expected error: %v", err) + } + if step.NewPayloadCustomizer.GetExpectInvalidStatus() { + expectedStatus = test.Invalid + } + // Send the payload if step.ClientID >= uint64(len(t.TestEngines)) { return fmt.Errorf("invalid client index %d", step.ClientID) } testEngine := t.TestEngines[step.ClientID] - r := testEngine.TestEngineNewPayloadV3(payload, versionedHashes, beaconRoot) - if step.ExpectedError != nil { - r.ExpectErrorCode(*step.ExpectedError) + r := testEngine.TestEngineNewPayload(payload, versionedHashes, beaconRoot, version) + if expectedError != nil { + r.ExpectErrorCode(*expectedError) } else { - r.ExpectStatus(step.ExpectedStatus) + r.ExpectStatus(expectedStatus) } return nil } func (step SendModifiedLatestPayload) Description() string { - desc := fmt.Sprintf("SendModifiedLatestPayload: client %d, expected status %s, ", step.ClientID, step.ExpectedStatus) - if step.VersionedHashes != nil { - desc += step.VersionedHashes.Description() - } + desc := fmt.Sprintf("SendModifiedLatestPayload: client %d, expected invalid=%T, ", step.ClientID, step.NewPayloadCustomizer.GetExpectInvalidStatus()) + /* + TODO: Figure out if we need this. + if step.VersionedHashes != nil { + desc += step.VersionedHashes.Description() + } + */ return desc } diff --git a/simulators/ethereum/engine/suites/cancun/tests.go b/simulators/ethereum/engine/suites/cancun/tests.go index eb3e679ef2..87f79eb38c 100644 --- a/simulators/ethereum/engine/suites/cancun/tests.go +++ b/simulators/ethereum/engine/suites/cancun/tests.go @@ -537,6 +537,278 @@ var Tests = []test.SpecInterface{ }, }, + // ForkchoiceUpdatedV3 before cancun + &CancunBaseSpec{ + Spec: test.Spec{ + Name: "ForkchoiceUpdatedV3 Set Head to Shanghai Payload, Nil Payload Attributes", + About: ` + Test sending ForkchoiceUpdatedV3 to set the head of the chain to a Shanghai payload: + - Send NewPayloadV2 with Shanghai payload on block 1 + - Use ForkchoiceUpdatedV3 to set the head to the payload, with nil payload attributes + + Verify that client returns no error. + `, + }, + + CancunForkHeight: 2, + + TestSequence: TestSequence{ + NewPayloads{ + FcUOnHeadSet: &helper.UpgradeForkchoiceUpdatedVersion{ + ForkchoiceUpdatedCustomizer: &helper.BaseForkchoiceUpdatedCustomizer{}, + }, + ExpectationDescription: ` + ForkchoiceUpdatedV3 before Cancun returns no error without payload attributes + `, + }, + }, + }, + + &CancunBaseSpec{ + Spec: test.Spec{ + Name: "ForkchoiceUpdatedV3 To Request Shanghai Payload, Nil Beacon Root", + About: ` + Test sending ForkchoiceUpdatedV3 to request a Shanghai payload: + - Payload Attributes uses Shanghai timestamp + - Payload Attributes' Beacon Root is nil + + Verify that client returns INVALID_PARAMS_ERROR. + `, + }, + + CancunForkHeight: 2, + + TestSequence: TestSequence{ + NewPayloads{ + FcUOnPayloadRequest: &helper.UpgradeForkchoiceUpdatedVersion{ + ForkchoiceUpdatedCustomizer: &helper.BaseForkchoiceUpdatedCustomizer{ + ExpectedError: INVALID_PARAMS_ERROR, + }, + }, + ExpectationDescription: fmt.Sprintf(` + ForkchoiceUpdatedV3 before Cancun with any nil field must return INVALID_PARAMS_ERROR (code %d) + `, *INVALID_PARAMS_ERROR), + }, + }, + }, + + &CancunBaseSpec{ + Spec: test.Spec{ + Name: "ForkchoiceUpdatedV3 To Request Shanghai Payload, Zero Beacon Root", + About: ` + Test sending ForkchoiceUpdatedV3 to request a Shanghai payload: + - Payload Attributes uses Shanghai timestamp + - Payload Attributes' Beacon Root zero + + Verify that client returns UNSUPPORTED_FORK_ERROR. + `, + }, + + CancunForkHeight: 2, + + TestSequence: TestSequence{ + NewPayloads{ + FcUOnPayloadRequest: &helper.UpgradeForkchoiceUpdatedVersion{ + ForkchoiceUpdatedCustomizer: &helper.BaseForkchoiceUpdatedCustomizer{ + PayloadAttributesCustomizer: &helper.BasePayloadAttributesCustomizer{ + BeaconRoot: &(common.Hash{}), + }, + ExpectedError: UNSUPPORTED_FORK_ERROR, + }, + }, + ExpectationDescription: fmt.Sprintf(` + ForkchoiceUpdatedV3 before Cancun with beacon root must return UNSUPPORTED_FORK_ERROR (code %d) + `, *UNSUPPORTED_FORK_ERROR), + }, + }, + }, + + // ForkchoiceUpdatedV2 before cancun with beacon root + &CancunBaseSpec{ + Spec: test.Spec{ + Name: "ForkchoiceUpdatedV2 To Request Shanghai Payload, Zero Beacon Root", + About: ` + Test sending ForkchoiceUpdatedV2 to request a Cancun payload: + - Payload Attributes uses Shanghai timestamp + - Payload Attributes' Beacon Root zero + + Verify that client returns INVALID_PARAMS_ERROR. + `, + }, + + CancunForkHeight: 1, + + TestSequence: TestSequence{ + NewPayloads{ + FcUOnPayloadRequest: &helper.DowngradeForkchoiceUpdatedVersion{ + ForkchoiceUpdatedCustomizer: &helper.BaseForkchoiceUpdatedCustomizer{ + PayloadAttributesCustomizer: &helper.BasePayloadAttributesCustomizer{ + BeaconRoot: &(common.Hash{}), + }, + ExpectedError: INVALID_PARAMS_ERROR, + }, + }, + ExpectationDescription: fmt.Sprintf(` + ForkchoiceUpdatedV2 before Cancun with beacon root field must return INVALID_PARAMS_ERROR (code %d) + `, *INVALID_PARAMS_ERROR), + }, + }, + }, + + // ForkchoiceUpdatedV2 after cancun + &CancunBaseSpec{ + Spec: test.Spec{ + Name: "ForkchoiceUpdatedV2 To Request Cancun Payload, Zero Beacon Root", + About: ` + Test sending ForkchoiceUpdatedV2 to request a Cancun payload: + - Payload Attributes uses Cancun timestamp + - Payload Attributes' Beacon Root zero + + Verify that client returns INVALID_PARAMS_ERROR. + `, + }, + + CancunForkHeight: 1, + + TestSequence: TestSequence{ + NewPayloads{ + FcUOnPayloadRequest: &helper.DowngradeForkchoiceUpdatedVersion{ + ForkchoiceUpdatedCustomizer: &helper.BaseForkchoiceUpdatedCustomizer{ + ExpectedError: INVALID_PARAMS_ERROR, + }, + }, + ExpectationDescription: fmt.Sprintf(` + ForkchoiceUpdatedV2 after Cancun with beacon root field must return INVALID_PARAMS_ERROR (code %d) + `, *INVALID_PARAMS_ERROR), + }, + }, + }, + &CancunBaseSpec{ + Spec: test.Spec{ + Name: "ForkchoiceUpdatedV2 To Request Cancun Payload, Nil Beacon Root", + About: ` + Test sending ForkchoiceUpdatedV2 to request a Cancun payload: + - Payload Attributes uses Cancun timestamp + - Payload Attributes' Beacon Root nil (not provided) + + Verify that client returns UNSUPPORTED_FORK_ERROR. + `, + }, + + CancunForkHeight: 1, + + TestSequence: TestSequence{ + NewPayloads{ + FcUOnPayloadRequest: &helper.DowngradeForkchoiceUpdatedVersion{ + ForkchoiceUpdatedCustomizer: &helper.BaseForkchoiceUpdatedCustomizer{ + PayloadAttributesCustomizer: &helper.BasePayloadAttributesCustomizer{ + RemoveBeaconRoot: true, + }, + ExpectedError: UNSUPPORTED_FORK_ERROR, + }, + }, + ExpectationDescription: fmt.Sprintf(` + ForkchoiceUpdatedV2 after Cancun must return UNSUPPORTED_FORK_ERROR (code %d) + `, *UNSUPPORTED_FORK_ERROR), + }, + }, + }, + + // ForkchoiceUpdatedV3 with modified BeaconRoot Attribute + &CancunBaseSpec{ + Spec: test.Spec{ + Name: "ForkchoiceUpdatedV3 Modifies Payload ID on Different Beacon Root", + About: ` + Test requesting a Cancun Payload using ForkchoiceUpdatedV3 twice with the beacon root + payload attribute as the only change between requests and verify that the payload ID is + different. + `, + }, + + CancunForkHeight: 0, + + TestSequence: TestSequence{ + SendBlobTransactions{ + TransactionCount: 1, + BlobsPerTransaction: MAX_BLOBS_PER_BLOCK, + BlobTransactionMaxBlobGasCost: big.NewInt(100), + }, + NewPayloads{ + ExpectedIncludedBlobCount: MAX_BLOBS_PER_BLOCK, + FcUOnPayloadRequest: &helper.BaseForkchoiceUpdatedCustomizer{ + PayloadAttributesCustomizer: &helper.BasePayloadAttributesCustomizer{ + BeaconRoot: &(common.Hash{}), + }, + }, + }, + SendBlobTransactions{ + TransactionCount: 1, + BlobsPerTransaction: MAX_BLOBS_PER_BLOCK, + BlobTransactionMaxBlobGasCost: big.NewInt(100), + }, + NewPayloads{ + ExpectedIncludedBlobCount: MAX_BLOBS_PER_BLOCK, + FcUOnPayloadRequest: &helper.BaseForkchoiceUpdatedCustomizer{ + PayloadAttributesCustomizer: &helper.BasePayloadAttributesCustomizer{ + BeaconRoot: &(common.Hash{1}), + }, + }, + }, + }, + }, + + // GetPayloadV3 Before Cancun, Negative Tests + &CancunBaseSpec{ + Spec: test.Spec{ + Name: "GetPayloadV3 To Request Shanghai Payload", + About: ` + Test requesting a Shanghai PayloadID using GetPayloadV3. + Verify that client returns UNSUPPORTED_FORK_ERROR. + `, + }, + + CancunForkHeight: 2, + + TestSequence: TestSequence{ + NewPayloads{ + GetPayloadCustomizer: &helper.UpgradeGetPayloadVersion{ + GetPayloadCustomizer: &helper.BaseGetPayloadCustomizer{ + ExpectedError: UNSUPPORTED_FORK_ERROR, + }, + }, + ExpectationDescription: fmt.Sprintf(` + GetPayloadV3 To Request Shanghai Payload must return UNSUPPORTED_FORK_ERROR (code %d) + `, *UNSUPPORTED_FORK_ERROR), + }, + }, + }, + + // GetPayloadV2 After Cancun, Negative Tests + &CancunBaseSpec{ + Spec: test.Spec{ + Name: "GetPayloadV2 To Request Cancun Payload", + About: ` + Test requesting a Cancun PayloadID using GetPayloadV2. + Verify that client returns UNSUPPORTED_FORK_ERROR. + `, + }, + + CancunForkHeight: 1, + + TestSequence: TestSequence{ + NewPayloads{ + GetPayloadCustomizer: &helper.DowngradeGetPayloadVersion{ + GetPayloadCustomizer: &helper.BaseGetPayloadCustomizer{ + ExpectedError: UNSUPPORTED_FORK_ERROR, + }, + }, + ExpectationDescription: fmt.Sprintf(` + GetPayloadV2 To Request Cancun Payload must return UNSUPPORTED_FORK_ERROR (code %d) + `, *UNSUPPORTED_FORK_ERROR), + }, + }, + }, + // NewPayloadV3 Before Cancun, Negative Tests &CancunBaseSpec{ Spec: test.Spec{ @@ -556,15 +828,17 @@ var Tests = []test.SpecInterface{ TestSequence: TestSequence{ NewPayloads{ - ExpectedIncludedBlobCount: 0, - Version: 3, - VersionedHashes: &VersionedHashes{ - Blobs: nil, + NewPayloadCustomizer: &helper.UpgradeNewPayloadVersion{ + NewPayloadCustomizer: &helper.BaseNewPayloadVersionCustomizer{ + VersionedHashesCustomizer: &VersionedHashes{ + Blobs: nil, + }, + ExpectedError: INVALID_PARAMS_ERROR, + }, }, - ExpectedError: INVALID_PARAMS_ERROR, ExpectationDescription: fmt.Sprintf(` NewPayloadV3 before Cancun with any nil field must return INVALID_PARAMS_ERROR (code %d) - `, INVALID_PARAMS_ERROR), + `, *INVALID_PARAMS_ERROR), }, }, }, @@ -584,15 +858,17 @@ var Tests = []test.SpecInterface{ TestSequence: TestSequence{ NewPayloads{ - ExpectedIncludedBlobCount: 0, - Version: 3, - PayloadCustomizer: &helper.CustomPayloadData{ - BlobGasUsed: pUint64(0), + NewPayloadCustomizer: &helper.UpgradeNewPayloadVersion{ + NewPayloadCustomizer: &helper.BaseNewPayloadVersionCustomizer{ + PayloadCustomizer: &helper.CustomPayloadData{ + BlobGasUsed: pUint64(0), + }, + ExpectedError: INVALID_PARAMS_ERROR, + }, }, - ExpectedError: INVALID_PARAMS_ERROR, ExpectationDescription: fmt.Sprintf(` NewPayloadV3 before Cancun with any nil field must return INVALID_PARAMS_ERROR (code %d) - `, INVALID_PARAMS_ERROR), + `, *INVALID_PARAMS_ERROR), }, }, }, @@ -612,15 +888,17 @@ var Tests = []test.SpecInterface{ TestSequence: TestSequence{ NewPayloads{ - ExpectedIncludedBlobCount: 0, - Version: 3, - PayloadCustomizer: &helper.CustomPayloadData{ - ExcessBlobGas: pUint64(0), + NewPayloadCustomizer: &helper.UpgradeNewPayloadVersion{ + NewPayloadCustomizer: &helper.BaseNewPayloadVersionCustomizer{ + PayloadCustomizer: &helper.CustomPayloadData{ + ExcessBlobGas: pUint64(0), + }, + ExpectedError: INVALID_PARAMS_ERROR, + }, }, - ExpectedError: INVALID_PARAMS_ERROR, ExpectationDescription: fmt.Sprintf(` NewPayloadV3 before Cancun with any nil field must return INVALID_PARAMS_ERROR (code %d) - `, INVALID_PARAMS_ERROR), + `, *INVALID_PARAMS_ERROR), }, }, }, @@ -640,15 +918,17 @@ var Tests = []test.SpecInterface{ TestSequence: TestSequence{ NewPayloads{ - ExpectedIncludedBlobCount: 0, - Version: 3, - VersionedHashes: &VersionedHashes{ - Blobs: []helper.BlobID{}, + NewPayloadCustomizer: &helper.UpgradeNewPayloadVersion{ + NewPayloadCustomizer: &helper.BaseNewPayloadVersionCustomizer{ + VersionedHashesCustomizer: &VersionedHashes{ + Blobs: []helper.BlobID{}, + }, + ExpectedError: INVALID_PARAMS_ERROR, + }, }, - ExpectedError: INVALID_PARAMS_ERROR, ExpectationDescription: fmt.Sprintf(` NewPayloadV3 before Cancun with any nil field must return INVALID_PARAMS_ERROR (code %d) - `, INVALID_PARAMS_ERROR), + `, *INVALID_PARAMS_ERROR), }, }, }, @@ -668,15 +948,17 @@ var Tests = []test.SpecInterface{ TestSequence: TestSequence{ NewPayloads{ - ExpectedIncludedBlobCount: 0, - Version: 3, - PayloadCustomizer: &helper.CustomPayloadData{ - ParentBeaconRoot: &(common.Hash{}), + NewPayloadCustomizer: &helper.UpgradeNewPayloadVersion{ + NewPayloadCustomizer: &helper.BaseNewPayloadVersionCustomizer{ + PayloadCustomizer: &helper.CustomPayloadData{ + ParentBeaconRoot: &(common.Hash{}), + }, + ExpectedError: INVALID_PARAMS_ERROR, + }, }, - ExpectedError: INVALID_PARAMS_ERROR, ExpectationDescription: fmt.Sprintf(` NewPayloadV3 before Cancun with any nil field must return INVALID_PARAMS_ERROR (code %d) - `, INVALID_PARAMS_ERROR), + `, *INVALID_PARAMS_ERROR), }, }, }, @@ -696,20 +978,22 @@ var Tests = []test.SpecInterface{ TestSequence: TestSequence{ NewPayloads{ - ExpectedIncludedBlobCount: 0, - Version: 3, - VersionedHashes: &VersionedHashes{ - Blobs: []helper.BlobID{}, - }, - PayloadCustomizer: &helper.CustomPayloadData{ - ExcessBlobGas: pUint64(0), - BlobGasUsed: pUint64(0), - ParentBeaconRoot: &(common.Hash{}), + NewPayloadCustomizer: &helper.UpgradeNewPayloadVersion{ + NewPayloadCustomizer: &helper.BaseNewPayloadVersionCustomizer{ + PayloadCustomizer: &helper.CustomPayloadData{ + ExcessBlobGas: pUint64(0), + BlobGasUsed: pUint64(0), + ParentBeaconRoot: &(common.Hash{}), + }, + VersionedHashesCustomizer: &VersionedHashes{ + Blobs: []helper.BlobID{}, + }, + ExpectedError: UNSUPPORTED_FORK_ERROR, + }, }, - ExpectedError: UNSUPPORTED_FORK_ERROR, ExpectationDescription: fmt.Sprintf(` NewPayloadV3 before Cancun with no nil fields must return UNSUPPORTED_FORK_ERROR (code %d) - `, UNSUPPORTED_FORK_ERROR), + `, *UNSUPPORTED_FORK_ERROR), }, }, }, @@ -731,15 +1015,15 @@ var Tests = []test.SpecInterface{ TestSequence: TestSequence{ NewPayloads{ - ExpectedIncludedBlobCount: 0, - Version: 3, - PayloadCustomizer: &helper.CustomPayloadData{ - RemoveExcessBlobGas: true, + NewPayloadCustomizer: &helper.BaseNewPayloadVersionCustomizer{ + PayloadCustomizer: &helper.CustomPayloadData{ + RemoveExcessBlobGas: true, + }, + ExpectedError: INVALID_PARAMS_ERROR, }, - ExpectedError: INVALID_PARAMS_ERROR, ExpectationDescription: fmt.Sprintf(` NewPayloadV3 after Cancun with nil ExcessBlobGas must return INVALID_PARAMS_ERROR (code %d) - `, INVALID_PARAMS_ERROR), + `, *INVALID_PARAMS_ERROR), }, }, }, @@ -758,15 +1042,15 @@ var Tests = []test.SpecInterface{ TestSequence: TestSequence{ NewPayloads{ - ExpectedIncludedBlobCount: 0, - Version: 3, - PayloadCustomizer: &helper.CustomPayloadData{ - RemoveBlobGasUsed: true, + NewPayloadCustomizer: &helper.BaseNewPayloadVersionCustomizer{ + PayloadCustomizer: &helper.CustomPayloadData{ + RemoveBlobGasUsed: true, + }, + ExpectedError: INVALID_PARAMS_ERROR, }, - ExpectedError: INVALID_PARAMS_ERROR, ExpectationDescription: fmt.Sprintf(` NewPayloadV3 after Cancun with nil BlobGasUsed must return INVALID_PARAMS_ERROR (code %d) - `, INVALID_PARAMS_ERROR), + `, *INVALID_PARAMS_ERROR), }, }, }, @@ -785,15 +1069,57 @@ var Tests = []test.SpecInterface{ TestSequence: TestSequence{ NewPayloads{ - ExpectedIncludedBlobCount: 0, - Version: 3, - PayloadCustomizer: &helper.CustomPayloadData{ - RemoveParentBeaconRoot: true, + NewPayloadCustomizer: &helper.BaseNewPayloadVersionCustomizer{ + PayloadCustomizer: &helper.CustomPayloadData{ + RemoveParentBeaconRoot: true, + }, + ExpectedError: INVALID_PARAMS_ERROR, }, - ExpectedError: INVALID_PARAMS_ERROR, ExpectationDescription: fmt.Sprintf(` NewPayloadV3 after Cancun with nil parentBeaconBlockRoot must return INVALID_PARAMS_ERROR (code %d) - `, INVALID_PARAMS_ERROR), + `, *INVALID_PARAMS_ERROR), + }, + }, + }, + + // Fork time tests + &CancunBaseSpec{ + Spec: test.Spec{ + Name: "ForkchoiceUpdatedV2 then ForkchoiceUpdatedV3 Valid Payload Building Requests", + About: ` + Test requesting a Shanghai ForkchoiceUpdatedV2 payload followed by a Cancun ForkchoiceUpdatedV3 request. + Verify that client correctly returns the Cancun payload. + `, + }, + + // We request two blocks from the client, first on shanghai and then on cancun, both with + // the same parent. + // Client must respond correctly to later request. + CancunForkHeight: 1, + TimeIncrements: 2, + + TestSequence: TestSequence{ + // First, we send a couple of blob transactions on genesis, + // with enough data gas cost to make sure they are included in the first block. + SendBlobTransactions{ + TransactionCount: TARGET_BLOBS_PER_BLOCK, + BlobTransactionMaxBlobGasCost: big.NewInt(1), + }, + NewPayloads{ + ExpectedIncludedBlobCount: TARGET_BLOBS_PER_BLOCK, + // This customizer only simulates requesting a Shanghai payload 1 second before cancun. + // CL Mock will still request the Cancun payload afterwards + FcUOnPayloadRequest: &helper.BaseForkchoiceUpdatedCustomizer{ + PayloadAttributesCustomizer: &helper.TimestampDeltaPayloadAttributesCustomizer{ + PayloadAttributesCustomizer: &helper.BasePayloadAttributesCustomizer{ + RemoveBeaconRoot: true, + }, + TimestampDelta: -1, + }, + }, + ExpectationDescription: ` + ForkchoiceUpdatedV3 must construct transaction with blob payloads even if a ForkchoiceUpdatedV2 was previously requested + `, }, }, }, @@ -816,10 +1142,12 @@ var Tests = []test.SpecInterface{ NewPayloads{ ExpectedIncludedBlobCount: TARGET_BLOBS_PER_BLOCK, ExpectedBlobs: helper.GetBlobList(0, TARGET_BLOBS_PER_BLOCK), - VersionedHashes: &VersionedHashes{ - Blobs: helper.GetBlobList(0, TARGET_BLOBS_PER_BLOCK-1), + NewPayloadCustomizer: &helper.BaseNewPayloadVersionCustomizer{ + VersionedHashesCustomizer: &VersionedHashes{ + Blobs: helper.GetBlobList(0, TARGET_BLOBS_PER_BLOCK-1), + }, + ExpectInvalidStatus: true, }, - ExpectedStatus: test.Invalid, ExpectationDescription: ` NewPayloadV3 with incorrect list of versioned hashes must return INVALID status `, @@ -845,10 +1173,12 @@ var Tests = []test.SpecInterface{ NewPayloads{ ExpectedIncludedBlobCount: TARGET_BLOBS_PER_BLOCK, ExpectedBlobs: helper.GetBlobList(0, TARGET_BLOBS_PER_BLOCK), - VersionedHashes: &VersionedHashes{ - Blobs: helper.GetBlobList(0, TARGET_BLOBS_PER_BLOCK+1), + NewPayloadCustomizer: &helper.BaseNewPayloadVersionCustomizer{ + VersionedHashesCustomizer: &VersionedHashes{ + Blobs: helper.GetBlobList(0, TARGET_BLOBS_PER_BLOCK+1), + }, + ExpectInvalidStatus: true, }, - ExpectedStatus: test.Invalid, ExpectationDescription: ` NewPayloadV3 with incorrect list of versioned hashes must return INVALID status `, @@ -872,10 +1202,12 @@ var Tests = []test.SpecInterface{ NewPayloads{ ExpectedIncludedBlobCount: TARGET_BLOBS_PER_BLOCK, ExpectedBlobs: helper.GetBlobList(0, TARGET_BLOBS_PER_BLOCK), - VersionedHashes: &VersionedHashes{ - Blobs: helper.GetBlobListByIndex(helper.BlobID(TARGET_BLOBS_PER_BLOCK-1), 0), + NewPayloadCustomizer: &helper.BaseNewPayloadVersionCustomizer{ + VersionedHashesCustomizer: &VersionedHashes{ + Blobs: helper.GetBlobListByIndex(helper.BlobID(TARGET_BLOBS_PER_BLOCK-1), 0), + }, + ExpectInvalidStatus: true, }, - ExpectedStatus: test.Invalid, ExpectationDescription: ` NewPayloadV3 with incorrect list of versioned hashes must return INVALID status `, @@ -899,10 +1231,12 @@ var Tests = []test.SpecInterface{ NewPayloads{ ExpectedIncludedBlobCount: TARGET_BLOBS_PER_BLOCK, ExpectedBlobs: helper.GetBlobList(0, TARGET_BLOBS_PER_BLOCK), - VersionedHashes: &VersionedHashes{ - Blobs: append(helper.GetBlobList(0, TARGET_BLOBS_PER_BLOCK), helper.BlobID(TARGET_BLOBS_PER_BLOCK-1)), + NewPayloadCustomizer: &helper.BaseNewPayloadVersionCustomizer{ + VersionedHashesCustomizer: &VersionedHashes{ + Blobs: append(helper.GetBlobList(0, TARGET_BLOBS_PER_BLOCK), helper.BlobID(TARGET_BLOBS_PER_BLOCK-1)), + }, + ExpectInvalidStatus: true, }, - ExpectedStatus: test.Invalid, ExpectationDescription: ` NewPayloadV3 with incorrect list of versioned hashes must return INVALID status `, @@ -926,10 +1260,12 @@ var Tests = []test.SpecInterface{ NewPayloads{ ExpectedIncludedBlobCount: TARGET_BLOBS_PER_BLOCK, ExpectedBlobs: helper.GetBlobList(0, TARGET_BLOBS_PER_BLOCK), - VersionedHashes: &VersionedHashes{ - Blobs: append(helper.GetBlobList(0, TARGET_BLOBS_PER_BLOCK-1), helper.BlobID(TARGET_BLOBS_PER_BLOCK)), + NewPayloadCustomizer: &helper.BaseNewPayloadVersionCustomizer{ + VersionedHashesCustomizer: &VersionedHashes{ + Blobs: append(helper.GetBlobList(0, TARGET_BLOBS_PER_BLOCK-1), helper.BlobID(TARGET_BLOBS_PER_BLOCK)), + }, + ExpectInvalidStatus: true, }, - ExpectedStatus: test.Invalid, ExpectationDescription: ` NewPayloadV3 with incorrect hash in list of versioned hashes must return INVALID status `, @@ -952,11 +1288,13 @@ var Tests = []test.SpecInterface{ NewPayloads{ ExpectedIncludedBlobCount: TARGET_BLOBS_PER_BLOCK, ExpectedBlobs: helper.GetBlobList(0, TARGET_BLOBS_PER_BLOCK), - VersionedHashes: &VersionedHashes{ - Blobs: helper.GetBlobList(0, TARGET_BLOBS_PER_BLOCK), - HashVersions: []byte{BLOB_COMMITMENT_VERSION_KZG, BLOB_COMMITMENT_VERSION_KZG + 1}, + NewPayloadCustomizer: &helper.BaseNewPayloadVersionCustomizer{ + VersionedHashesCustomizer: &VersionedHashes{ + Blobs: helper.GetBlobList(0, TARGET_BLOBS_PER_BLOCK), + HashVersions: []byte{BLOB_COMMITMENT_VERSION_KZG, BLOB_COMMITMENT_VERSION_KZG + 1}, + }, + ExpectInvalidStatus: true, }, - ExpectedStatus: test.Invalid, ExpectationDescription: ` NewPayloadV3 with incorrect version in list of versioned hashes must return INVALID status `, @@ -980,10 +1318,12 @@ var Tests = []test.SpecInterface{ NewPayloads{ ExpectedIncludedBlobCount: TARGET_BLOBS_PER_BLOCK, ExpectedBlobs: helper.GetBlobList(0, TARGET_BLOBS_PER_BLOCK), - VersionedHashes: &VersionedHashes{ - Blobs: nil, + NewPayloadCustomizer: &helper.BaseNewPayloadVersionCustomizer{ + VersionedHashesCustomizer: &VersionedHashes{ + Blobs: nil, + }, + ExpectedError: INVALID_PARAMS_ERROR, }, - ExpectedError: INVALID_PARAMS_ERROR, ExpectationDescription: ` NewPayloadV3 after Cancun with nil VersionedHashes must return INVALID_PARAMS_ERROR (code -32602) `, @@ -1007,10 +1347,12 @@ var Tests = []test.SpecInterface{ NewPayloads{ ExpectedIncludedBlobCount: TARGET_BLOBS_PER_BLOCK, ExpectedBlobs: helper.GetBlobList(0, TARGET_BLOBS_PER_BLOCK), - VersionedHashes: &VersionedHashes{ - Blobs: []helper.BlobID{}, + NewPayloadCustomizer: &helper.BaseNewPayloadVersionCustomizer{ + VersionedHashesCustomizer: &VersionedHashes{ + Blobs: []helper.BlobID{}, + }, + ExpectInvalidStatus: true, }, - ExpectedStatus: test.Invalid, ExpectationDescription: ` NewPayloadV3 with incorrect list of versioned hashes must return INVALID status `, @@ -1028,12 +1370,13 @@ var Tests = []test.SpecInterface{ }, TestSequence: TestSequence{ NewPayloads{ - ExpectedIncludedBlobCount: 0, - ExpectedBlobs: []helper.BlobID{}, - VersionedHashes: &VersionedHashes{ - Blobs: []helper.BlobID{0}, + ExpectedBlobs: []helper.BlobID{}, + NewPayloadCustomizer: &helper.BaseNewPayloadVersionCustomizer{ + VersionedHashesCustomizer: &VersionedHashes{ + Blobs: []helper.BlobID{0}, + }, + ExpectInvalidStatus: true, }, - ExpectedStatus: test.Invalid, ExpectationDescription: ` NewPayloadV3 with incorrect list of versioned hashes must return INVALID status `, @@ -1069,10 +1412,12 @@ var Tests = []test.SpecInterface{ }, SendModifiedLatestPayload{ ClientID: 1, - VersionedHashes: &VersionedHashes{ - Blobs: helper.GetBlobList(0, TARGET_BLOBS_PER_BLOCK-1), + NewPayloadCustomizer: &helper.BaseNewPayloadVersionCustomizer{ + VersionedHashesCustomizer: &VersionedHashes{ + Blobs: helper.GetBlobList(0, TARGET_BLOBS_PER_BLOCK-1), + }, + ExpectInvalidStatus: true, }, - ExpectedStatus: test.Invalid, }, }, }, @@ -1105,10 +1450,12 @@ var Tests = []test.SpecInterface{ }, SendModifiedLatestPayload{ ClientID: 1, - VersionedHashes: &VersionedHashes{ - Blobs: helper.GetBlobList(0, TARGET_BLOBS_PER_BLOCK+1), + NewPayloadCustomizer: &helper.BaseNewPayloadVersionCustomizer{ + VersionedHashesCustomizer: &VersionedHashes{ + Blobs: helper.GetBlobList(0, TARGET_BLOBS_PER_BLOCK+1), + }, + ExpectInvalidStatus: true, }, - ExpectedStatus: test.Invalid, }, }, }, @@ -1138,10 +1485,12 @@ var Tests = []test.SpecInterface{ }, SendModifiedLatestPayload{ ClientID: 1, - VersionedHashes: &VersionedHashes{ - Blobs: helper.GetBlobListByIndex(helper.BlobID(TARGET_BLOBS_PER_BLOCK-1), 0), + NewPayloadCustomizer: &helper.BaseNewPayloadVersionCustomizer{ + VersionedHashesCustomizer: &VersionedHashes{ + Blobs: helper.GetBlobListByIndex(helper.BlobID(TARGET_BLOBS_PER_BLOCK-1), 0), + }, + ExpectInvalidStatus: true, }, - ExpectedStatus: test.Invalid, }, }, }, @@ -1172,10 +1521,12 @@ var Tests = []test.SpecInterface{ }, SendModifiedLatestPayload{ ClientID: 1, - VersionedHashes: &VersionedHashes{ - Blobs: append(helper.GetBlobList(0, TARGET_BLOBS_PER_BLOCK), helper.BlobID(TARGET_BLOBS_PER_BLOCK-1)), + NewPayloadCustomizer: &helper.BaseNewPayloadVersionCustomizer{ + VersionedHashesCustomizer: &VersionedHashes{ + Blobs: append(helper.GetBlobList(0, TARGET_BLOBS_PER_BLOCK), helper.BlobID(TARGET_BLOBS_PER_BLOCK-1)), + }, + ExpectInvalidStatus: true, }, - ExpectedStatus: test.Invalid, }, }, }, @@ -1206,10 +1557,12 @@ var Tests = []test.SpecInterface{ }, SendModifiedLatestPayload{ ClientID: 1, - VersionedHashes: &VersionedHashes{ - Blobs: append(helper.GetBlobList(0, TARGET_BLOBS_PER_BLOCK-1), helper.BlobID(TARGET_BLOBS_PER_BLOCK)), + NewPayloadCustomizer: &helper.BaseNewPayloadVersionCustomizer{ + VersionedHashesCustomizer: &VersionedHashes{ + Blobs: append(helper.GetBlobList(0, TARGET_BLOBS_PER_BLOCK-1), helper.BlobID(TARGET_BLOBS_PER_BLOCK)), + }, + ExpectInvalidStatus: true, }, - ExpectedStatus: test.Invalid, }, }, }, @@ -1239,11 +1592,13 @@ var Tests = []test.SpecInterface{ }, SendModifiedLatestPayload{ ClientID: 1, - VersionedHashes: &VersionedHashes{ - Blobs: helper.GetBlobList(0, TARGET_BLOBS_PER_BLOCK), - HashVersions: []byte{BLOB_COMMITMENT_VERSION_KZG, BLOB_COMMITMENT_VERSION_KZG + 1}, + NewPayloadCustomizer: &helper.BaseNewPayloadVersionCustomizer{ + VersionedHashesCustomizer: &VersionedHashes{ + Blobs: helper.GetBlobList(0, TARGET_BLOBS_PER_BLOCK), + HashVersions: []byte{BLOB_COMMITMENT_VERSION_KZG, BLOB_COMMITMENT_VERSION_KZG + 1}, + }, + ExpectInvalidStatus: true, }, - ExpectedStatus: test.Invalid, }, }, }, @@ -1274,10 +1629,12 @@ var Tests = []test.SpecInterface{ }, SendModifiedLatestPayload{ ClientID: 1, - VersionedHashes: &VersionedHashes{ - Blobs: nil, + NewPayloadCustomizer: &helper.BaseNewPayloadVersionCustomizer{ + VersionedHashesCustomizer: &VersionedHashes{ + Blobs: nil, + }, + ExpectedError: INVALID_PARAMS_ERROR, }, - ExpectedError: INVALID_PARAMS_ERROR, }, }, }, @@ -1308,10 +1665,12 @@ var Tests = []test.SpecInterface{ }, SendModifiedLatestPayload{ ClientID: 1, - VersionedHashes: &VersionedHashes{ - Blobs: []helper.BlobID{}, + NewPayloadCustomizer: &helper.BaseNewPayloadVersionCustomizer{ + VersionedHashesCustomizer: &VersionedHashes{ + Blobs: []helper.BlobID{}, + }, + ExpectInvalidStatus: true, }, - ExpectedStatus: test.Invalid, }, }, }, @@ -1327,8 +1686,7 @@ var Tests = []test.SpecInterface{ TestSequence: TestSequence{ NewPayloads{}, // Send new payload so the parent is unknown to the secondary client NewPayloads{ - ExpectedIncludedBlobCount: 0, - ExpectedBlobs: []helper.BlobID{}, + ExpectedBlobs: []helper.BlobID{}, }, LaunchClients{ @@ -1338,10 +1696,12 @@ var Tests = []test.SpecInterface{ }, SendModifiedLatestPayload{ ClientID: 1, - VersionedHashes: &VersionedHashes{ - Blobs: []helper.BlobID{0}, + NewPayloadCustomizer: &helper.BaseNewPayloadVersionCustomizer{ + VersionedHashesCustomizer: &VersionedHashes{ + Blobs: []helper.BlobID{0}, + }, + ExpectInvalidStatus: true, }, - ExpectedStatus: test.Invalid, }, }, }, @@ -1359,9 +1719,11 @@ var Tests = []test.SpecInterface{ }, TestSequence: TestSequence{ NewPayloads{ - ExpectedIncludedBlobCount: 0, - PayloadCustomizer: &helper.CustomPayloadData{ - BlobGasUsed: pUint64(1), + NewPayloadCustomizer: &helper.BaseNewPayloadVersionCustomizer{ + PayloadCustomizer: &helper.CustomPayloadData{ + BlobGasUsed: pUint64(1), + }, + ExpectInvalidStatus: true, }, }, }, @@ -1376,9 +1738,11 @@ var Tests = []test.SpecInterface{ }, TestSequence: TestSequence{ NewPayloads{ - ExpectedIncludedBlobCount: 0, - PayloadCustomizer: &helper.CustomPayloadData{ - BlobGasUsed: pUint64(GAS_PER_BLOB), + NewPayloadCustomizer: &helper.BaseNewPayloadVersionCustomizer{ + PayloadCustomizer: &helper.CustomPayloadData{ + BlobGasUsed: pUint64(GAS_PER_BLOB), + }, + ExpectInvalidStatus: true, }, }, }, @@ -1521,7 +1885,7 @@ var Tests = []test.SpecInterface{ TestSequence: TestSequence{ // Get past the genesis NewPayloads{ - ExpectedIncludedBlobCount: 0, + PayloadCount: 1, }, // Send multiple transactions with multiple blobs each SendBlobTransactions{ diff --git a/simulators/ethereum/engine/test/expect.go b/simulators/ethereum/engine/test/expect.go index 3131713644..fe1de650a8 100644 --- a/simulators/ethereum/engine/test/expect.go +++ b/simulators/ethereum/engine/test/expect.go @@ -125,10 +125,19 @@ func (tec *TestEngineClient) TestEngineForkchoiceUpdated(fcState *api.Forkchoice if version == -1 { version = client.LatestForkchoiceUpdatedVersion } - if version == 2 { - return tec.TestEngineForkchoiceUpdatedV2(fcState, pAttributes) + ctx, cancel := context.WithTimeout(tec.TestContext, globals.RPCTimeout) + defer cancel() + resp, err := tec.Engine.ForkchoiceUpdated(ctx, version, fcState, pAttributes) + ret := &ForkchoiceResponseExpectObject{ + ExpectEnv: &ExpectEnv{Env: tec.Env}, + Response: resp, + Version: version, + Error: err, + } + if err, ok := err.(rpc.Error); ok { + ret.ErrorCode = err.ErrorCode() } - return tec.TestEngineForkchoiceUpdatedV1(fcState, pAttributes) + return ret } func (exp *ForkchoiceResponseExpectObject) ExpectNoError() { @@ -338,11 +347,13 @@ func (exp *NewPayloadResponseExpectObject) ExpectLatestValidHash(lvh *common.Has // GetPayload type GetPayloadResponseExpectObject struct { *ExpectEnv - Payload typ.ExecutableData - BlockValue *big.Int - Version int - Error error - ErrorCode int + Payload typ.ExecutableData + BlockValue *big.Int + BlobsBundle *typ.BlobsBundle + ShouldOverrideBuilder *bool + Version int + Error error + ErrorCode int } func (tec *TestEngineClient) TestEngineGetPayloadV1(payloadID *api.PayloadID) *GetPayloadResponseExpectObject { @@ -380,10 +391,22 @@ func (tec *TestEngineClient) TestEngineGetPayloadV2(payloadID *api.PayloadID) *G } func (tec *TestEngineClient) TestEngineGetPayload(payloadID *api.PayloadID, version int) *GetPayloadResponseExpectObject { - if version == 2 { - return tec.TestEngineGetPayloadV2(payloadID) + ctx, cancel := context.WithTimeout(tec.TestContext, globals.RPCTimeout) + defer cancel() + payload, blockValue, blobBundle, shouldOverride, err := tec.Engine.GetPayload(ctx, version, payloadID) + ret := &GetPayloadResponseExpectObject{ + ExpectEnv: &ExpectEnv{Env: tec.Env}, + Payload: payload, + Version: version, + BlockValue: blockValue, + BlobsBundle: blobBundle, + ShouldOverrideBuilder: shouldOverride, + Error: err, } - return tec.TestEngineGetPayloadV1(payloadID) + if err, ok := err.(rpc.Error); ok { + ret.ErrorCode = err.ErrorCode() + } + return ret } func (exp *GetPayloadResponseExpectObject) ExpectNoError() { From 15e4265499e9e0425d7f3ea263bc3445bb102851 Mon Sep 17 00:00:00 2001 From: Mario Vega Date: Tue, 5 Sep 2023 11:10:43 -0600 Subject: [PATCH 007/387] configs/cancun: Besu update (#841) configs: Besu cancun branch update --- configs/cancun.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/configs/cancun.yaml b/configs/cancun.yaml index 784a37f222..71f65ae8b4 100644 --- a/configs/cancun.yaml +++ b/configs/cancun.yaml @@ -2,8 +2,8 @@ nametag: cancun-git dockerfile: git build_args: - github: hyperledger/besu - tag: main + github: Gabriel-Trintinalia/besu + tag: add-decode-type-to-transaction-decoder - client: erigon nametag: cancun-git From f711a7341cf8219d547f750570d778854f0db2b6 Mon Sep 17 00:00:00 2001 From: Dan Cline <6798349+Rjected@users.noreply.github.com> Date: Thu, 7 Sep 2023 17:38:50 -0400 Subject: [PATCH 008/387] clients/reth: add cancun fork in mapper (#842) --- clients/reth/mapper.jq | 1 + clients/reth/reth.sh | 2 ++ 2 files changed, 3 insertions(+) diff --git a/clients/reth/mapper.jq b/clients/reth/mapper.jq index 858223a2af..5fa2cb40ff 100644 --- a/clients/reth/mapper.jq +++ b/clients/reth/mapper.jq @@ -55,5 +55,6 @@ def to_bool: "terminalTotalDifficulty": env.HIVE_TERMINAL_TOTAL_DIFFICULTY|to_int, "terminalTotalDifficultyPassed": env.HIVE_TERMINAL_TOTAL_DIFFICULTY_PASSED|to_bool, "shanghaiTime": env.HIVE_SHANGHAI_TIMESTAMP|to_int, + "cancunTime": env.HIVE_CANCUN_TIMESTAMP|to_int, }|remove_empty } diff --git a/clients/reth/reth.sh b/clients/reth/reth.sh index 1a4d092205..a643f4acc0 100644 --- a/clients/reth/reth.sh +++ b/clients/reth/reth.sh @@ -21,6 +21,8 @@ # - HIVE_FORK_PETERSBURG block number for ConstantinopleFix/Petersburg transition # - HIVE_FORK_ISTANBUL block number for Istanbul transition # - HIVE_FORK_MUIR_GLACIER block number for MuirGlacier transition +# - HIVE_SHANGHAI_TIMESTAMP timestamp for Shanghai transition +# - HIVE_CANCUN_TIMESTAMP timestamp for Cancun transition # - HIVE_LOGLEVEL client log level # # These flags are NOT supported by reth From 8726b18d345ab4ce6bbb74f43767d600c2fa6687 Mon Sep 17 00:00:00 2001 From: Mario Vega Date: Fri, 8 Sep 2023 10:20:06 -0600 Subject: [PATCH 009/387] clients/erigon: Fix `Dockerfile.git` (#861) clients/erigon: fix git dockerfile --- clients/erigon/Dockerfile.git | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clients/erigon/Dockerfile.git b/clients/erigon/Dockerfile.git index 88429771a3..a5861a8a8b 100644 --- a/clients/erigon/Dockerfile.git +++ b/clients/erigon/Dockerfile.git @@ -19,7 +19,7 @@ FROM alpine:latest # Copy compiled binary from builder COPY --from=builder /usr/local/bin/erigon /usr/local/bin/ -RUN apk add --no-cache bash gcc jq libstdc++ +RUN apk add --no-cache bash curl gcc jq libstdc++ # Create version.txt RUN erigon --version | sed -e 's/erigon version \(.*\)/\1/' > /version.txt From 37f9cfe133e36f982c261adf058142e3a23bdf0f Mon Sep 17 00:00:00 2001 From: Mario Vega Date: Tue, 12 Sep 2023 16:22:43 -0600 Subject: [PATCH 010/387] simulators/ethereum/engine: Refactor Legacy Engine API Tests (#840) * Refactor previous tests to run on new forks * Fix configuration on Cancun * Fix spec fork time * Run all tests using blob transactions when possible * Allow blob transaction modifications * Add more Cancun invalid field tests * Update expected invalid detection on versioned hashes * Use multiple source accounts for test transactions by default * Get full block only when necessary * Fixes on some of the tests * Update suggested fee recipient tests * Update prev-randao tests * NewPayload Tests Refactor * Refactor last re-org tests * Simplify ForkID tests * Incorrect comment * Fix pyspec * More Versioned Hashes Tests --- simulators/ethereum/engine/chains/README.md | 98 - .../chains/blocks_1024_td_135112316.rlp | Bin 2145594 -> 0 bytes .../engine/chains/blocks_10_td_1971072_1.rlp | Bin 7220 -> 0 bytes .../engine/chains/blocks_10_td_1971072_2.rlp | Bin 7220 -> 0 bytes .../engine/chains/blocks_10_td_1971072_3.rlp | Bin 7220 -> 0 bytes .../engine/chains/blocks_10_td_1971072_4.rlp | Bin 7220 -> 0 bytes .../engine/chains/blocks_10_td_1971072_5.rlp | Bin 7220 -> 0 bytes .../engine/chains/blocks_1_td_196416.rlp | Bin 1630 -> 0 bytes .../engine/chains/blocks_1_td_196608.rlp | Bin 620 -> 0 bytes .../engine/chains/blocks_1_td_196704.rlp | Bin 620 -> 0 bytes .../engine/chains/blocks_2_td_393120.rlp | Bin 1240 -> 0 bytes .../engine/chains/blocks_2_td_393504.rlp | Bin 1240 -> 0 bytes simulators/ethereum/engine/client/engine.go | 17 +- .../engine/client/hive_rpc/hive_rpc.go | 49 +- .../ethereum/engine/client/node/node.go | 107 +- simulators/ethereum/engine/clmock/clmock.go | 126 +- .../engine/config/cancun/constants.go | 31 + .../ethereum/engine/config/cancun/genesis.go | 77 + simulators/ethereum/engine/config/fork.go | 82 + simulators/ethereum/engine/config/genesis.go | 30 + simulators/ethereum/engine/globals/errors.go | 21 + simulators/ethereum/engine/globals/globals.go | 163 +- simulators/ethereum/engine/helper/blobs.go | 17 +- .../ethereum/engine/helper/customizer.go | 372 +- simulators/ethereum/engine/helper/helper.go | 8 + simulators/ethereum/engine/helper/tx.go | 384 +- simulators/ethereum/engine/main.go | 28 +- .../ethereum/engine/suites/auth/tests.go | 162 +- .../ethereum/engine/suites/cancun/config.go | 157 +- .../ethereum/engine/suites/cancun/helpers.go | 15 +- .../ethereum/engine/suites/cancun/steps.go | 129 +- .../ethereum/engine/suites/cancun/tests.go | 897 +++-- .../ethereum/engine/suites/engine/bad_hash.go | 194 + .../ethereum/engine/suites/engine/fork_id.go | 77 + .../engine/suites/engine/forkchoice.go | 174 + .../engine/suites/engine/invalid_ancestor.go | 495 +++ .../engine/suites/engine/invalid_payload.go | 450 +++ .../suites/engine/payload_attributes.go | 88 + .../engine/suites/engine/payload_execution.go | 547 +++ .../engine/suites/engine/payload_id.go | 95 + .../engine/suites/engine/prev_randao.go | 90 + .../ethereum/engine/suites/engine/reorg.go | 740 ++++ .../ethereum/engine/suites/engine/rpc.go | 118 + .../suites/engine/suggested_fee_recipient.go | 97 + .../ethereum/engine/suites/engine/tests.go | 3357 ++--------------- .../engine/suites/engine/versioning.go | 131 + .../suites/exchange_capabilities/tests.go | 101 +- .../ethereum/engine/suites/sync/tests.go | 6 +- .../engine/suites/withdrawals/tests.go | 213 +- simulators/ethereum/engine/test/env.go | 15 +- simulators/ethereum/engine/test/expect.go | 95 +- simulators/ethereum/engine/test/spec.go | 158 +- simulators/ethereum/engine/types/blobs.go | 29 + simulators/ethereum/engine/types/types.go | 27 +- simulators/ethereum/go.work.sum | 36 + simulators/ethereum/pyspec/runner.go | 9 +- simulators/ethereum/pyspec/types.go | 12 + 57 files changed, 5707 insertions(+), 4617 deletions(-) delete mode 100644 simulators/ethereum/engine/chains/README.md delete mode 100644 simulators/ethereum/engine/chains/blocks_1024_td_135112316.rlp delete mode 100644 simulators/ethereum/engine/chains/blocks_10_td_1971072_1.rlp delete mode 100644 simulators/ethereum/engine/chains/blocks_10_td_1971072_2.rlp delete mode 100644 simulators/ethereum/engine/chains/blocks_10_td_1971072_3.rlp delete mode 100644 simulators/ethereum/engine/chains/blocks_10_td_1971072_4.rlp delete mode 100644 simulators/ethereum/engine/chains/blocks_10_td_1971072_5.rlp delete mode 100644 simulators/ethereum/engine/chains/blocks_1_td_196416.rlp delete mode 100644 simulators/ethereum/engine/chains/blocks_1_td_196608.rlp delete mode 100644 simulators/ethereum/engine/chains/blocks_1_td_196704.rlp delete mode 100644 simulators/ethereum/engine/chains/blocks_2_td_393120.rlp delete mode 100644 simulators/ethereum/engine/chains/blocks_2_td_393504.rlp create mode 100644 simulators/ethereum/engine/config/cancun/constants.go create mode 100644 simulators/ethereum/engine/config/cancun/genesis.go create mode 100644 simulators/ethereum/engine/config/fork.go create mode 100644 simulators/ethereum/engine/config/genesis.go create mode 100644 simulators/ethereum/engine/globals/errors.go create mode 100644 simulators/ethereum/engine/suites/engine/bad_hash.go create mode 100644 simulators/ethereum/engine/suites/engine/fork_id.go create mode 100644 simulators/ethereum/engine/suites/engine/forkchoice.go create mode 100644 simulators/ethereum/engine/suites/engine/invalid_ancestor.go create mode 100644 simulators/ethereum/engine/suites/engine/invalid_payload.go create mode 100644 simulators/ethereum/engine/suites/engine/payload_attributes.go create mode 100644 simulators/ethereum/engine/suites/engine/payload_execution.go create mode 100644 simulators/ethereum/engine/suites/engine/payload_id.go create mode 100644 simulators/ethereum/engine/suites/engine/prev_randao.go create mode 100644 simulators/ethereum/engine/suites/engine/reorg.go create mode 100644 simulators/ethereum/engine/suites/engine/rpc.go create mode 100644 simulators/ethereum/engine/suites/engine/suggested_fee_recipient.go create mode 100644 simulators/ethereum/engine/suites/engine/versioning.go diff --git a/simulators/ethereum/engine/chains/README.md b/simulators/ethereum/engine/chains/README.md deleted file mode 100644 index eb05de4ad9..0000000000 --- a/simulators/ethereum/engine/chains/README.md +++ /dev/null @@ -1,98 +0,0 @@ -# Proof of Work Pre-computed Chains - -Chains Included: - -- blocks_1_td_196608.rlp - Block 1, 548b3a20d40c9b29fe6bf89b86bc3e1d52c1fadd60d1590627f486b6cd56635c, difficulty: 196608, Tx: 1 - Chain Total Difficulty 196608 - -- blocks_1_td_196704.rlp - Block 1, 509261eb35ed0e4c07645c6f4403a347bd8245e51a1dee314e15e91fbca8c0a7, difficulty: 196704, Tx: 1 - Chain Total Difficulty 196704 - -- blocks_2_td_393120.rlp - Block 1, 548b3a20d40c9b29fe6bf89b86bc3e1d52c1fadd60d1590627f486b6cd56635c, difficulty: 196608, Tx: 1 - Block 2, 2d4f65a26a8d5ca4f8000010b4741652decb89c8ccf19119b5d9f58846efbbd4, difficulty: 196512, Tx: 1 - Chain Total Difficulty 393120 - -- blocks_2_td_393504.rlp - Block 1, 509261eb35ed0e4c07645c6f4403a347bd8245e51a1dee314e15e91fbca8c0a7, difficulty: 196704, Tx: 1 - Block 2, b22fd8a8b1841e6b020a8626180cdb5e395c7b4eceb53a691f8c3e67557aac33, difficulty: 196800, Tx: 1 - Chain Total Difficulty 393504 - -- blocks_1024_td_135112316.rlp - Block 1, 2a9b7a5a209a58f672fa23a3ad9c831958d37dd74a960f69c0075b5c92be457e, difficulty: 196416, Tx: 0 - (Details of every block use `hivechain print`) - Chain Total Difficulty 135112316 - -- blocks_1_td_196416.rlp - Block 1, 2a9b7a5a209a58f672fa23a3ad9c831958d37dd74a960f69c0075b5c92be457e, difficulty: 196416, Tx: 0 - Chain Total Difficulty 196416 - -- blocks_10_td_1971072_1.rlp - Block 1, de3a2a51b26b591495ace78793dc6a44288f912db59a04d155994237370fd318, difficulty: 196704, Tx: 2 - Block 2, b97614ff71ad6c28145be39fde22d1b0410e4d072c425038f111530edee9af53, difficulty: 196800, Tx: 2 - Block 3, c808dd0a22812c618d2ec50532a5a3bb5871043056784bc3148ad4379289ed04, difficulty: 196896, Tx: 2 - Block 4, 1c29067fa2a5a6e23e635a4ca4a1420f80235f2141b69750a8fb3268559e5d12, difficulty: 196992, Tx: 2 - Block 5, fffbc0a1c906855660d539d6c04da8eb8fe4e28acc5bcc9bb54560375b17653e, difficulty: 197088, Tx: 2 - Block 6, f45296743964bde4a2f9141d322e7313a8a2472b2f2b518aa57917e62f97b94a, difficulty: 197184, Tx: 2 - Block 7, ee11efa0870fc0950f44fc2767bec30829b17c308b7bdc47ab0d495af33d4d07, difficulty: 197280, Tx: 2 - Block 8, 092d3f12996ca51ec93d43d2aedbdb578e3a3735492ca740e0df5bde73f5a042, difficulty: 197376, Tx: 2 - Block 9, 2d30b49532c6ad67fe7751bb6c0893c8349f96c344167fd9db583c1ec4d27f72, difficulty: 197376, Tx: 2 - Block 10, 0eb132b42bd47de3ffe0486bf568a476ee1ba17c37a3cd061f44c030ab61c4bd, difficulty: 197376, Tx: 2 - Chain Total Difficulty 1971072 - -- blocks_10_td_1971072_2.rlp - Block 1, f5b50675ee55ae3605bdc558dc988eab60bcfe5b9c8868aee03c4db101cbf4eb, difficulty: 196704, Tx: 2 - Block 2, 0d3e37982030a5c641d91b77673d5c4193c3aafeaf68cddfcd796b84b1b89c92, difficulty: 196800, Tx: 2 - Block 3, 3e7f66616b80d612ff2044202d5d12ada55cbb7ab4c59f5738bfcbf1a903ccc8, difficulty: 196896, Tx: 2 - Block 4, fe33be274a100ff275407210cc6e5c07e3b936caf5f5b75e2415f92720277947, difficulty: 196992, Tx: 2 - Block 5, 37eaab4452fbe6f4d36190f8676be2f7711e57475d18000dba23db69f5f75ad6, difficulty: 197088, Tx: 2 - Block 6, d0112b28eb45ccd7c8387890098992943737ca85d5561ac8810ac5a2b456deb3, difficulty: 197184, Tx: 2 - Block 7, 63ae8245a99aa3cade137089646ae9be583859ec599a75ef4389912c3524b96b, difficulty: 197280, Tx: 2 - Block 8, d8c134a27c8fe2130ae84be2ffa65ae958155148f9d7acaf41fab2a78b47a0dc, difficulty: 197376, Tx: 2 - Block 9, 9aabc2ab99f7a67245ff72e5f28c61bdfc16e00d860a96592c233e3b6367dc03, difficulty: 197376, Tx: 2 - Block 10, 55ab665e11fc9395d042f0039d0d4f351b968e289dcdf62755caa5515addf5a2, difficulty: 197376, Tx: 2 - Chain Total Difficulty 1971072 - -- blocks_10_td_1971072_3.rlp - Block 1, e1ecffd3ace7657f8e236dbfa64069f9e178ffe464a7d09ba693f5d4858600d7, difficulty: 196704, Tx: 2 - Block 2, 16ab63f8431d2aa266a4bc397c958e73eee87017ff5b14e9ed6eb126dc0e62f6, difficulty: 196800, Tx: 2 - Block 3, e4c801ef8dfb13fb17522d238d343ed3536ce1ee1f7f3f6ebf9a9285f8f43fbb, difficulty: 196896, Tx: 2 - Block 4, 2b07cfbfe868bf268ce0f7df7651887ad2d507be9e4f71161c0f7b25642b2540, difficulty: 196992, Tx: 2 - Block 5, 3e79d8e7efb50830d01850d3936ffa22154691e1c5d0407c0e99cd3d419733a9, difficulty: 197088, Tx: 2 - Block 6, dbee50a39659a935e977433594ac572dbb0576dcd6c319f142803a9e220a8f7d, difficulty: 197184, Tx: 2 - Block 7, 90ecdff850685248ed16db8dae923b0e33023a229158003d647fb640255d268c, difficulty: 197280, Tx: 2 - Block 8, 46ff0b8e2ad915b4e1b9035b57cd556c726b1f25313cd1c20b939a073c8e0cf3, difficulty: 197376, Tx: 2 - Block 9, 6c93230c31d837220100d5ab295b6c3433b48b32f5ac3b4ba9cb98e2ef8c728f, difficulty: 197376, Tx: 2 - Block 10, fc11761cd3e009f408cfe396d1492496f2b758c69a29a755148c03b734859431, difficulty: 197376, Tx: 2 - Chain Total Difficulty 1971072 - -- blocks_10_td_1971072_4.rlp - Block 1, 218ae446091aa23cff5bd42399783842c3679d47379f323f91ab01e16fc419b0, difficulty: 196704, Tx: 2 - Block 2, 98ab26945e4b884c11f6efde04952479ef857f8d0a888b340c1276c52b45f77a, difficulty: 196800, Tx: 2 - Block 3, 479d43266fdf45e16e73fec777d359b5264de9547bd90420b9f34b298d1f87f7, difficulty: 196896, Tx: 2 - Block 4, 9d965795ee0e2bab2764d74be40e13bdc5799e89412330c294ed3a7bf83890d0, difficulty: 196992, Tx: 2 - Block 5, 02934887ade02dfb1447287df9678050fd2a4b75209a8e9240d714403a37f830, difficulty: 197088, Tx: 2 - Block 6, e6c78538577071ecc8e614c1ebff6c3f1edf42dae445256597c0a9802950f41f, difficulty: 197184, Tx: 2 - Block 7, d1cc9a185a3945775045ded54674a2e1e5cde0de342234d468c917b015245eb3, difficulty: 197280, Tx: 2 - Block 8, 451adf40b85dc9c39a9ad95594dd762e506d9fc6eaba7ff80d6466dfe5d66cf4, difficulty: 197376, Tx: 2 - Block 9, 03e79ac09bb66810bdb3eaf0366d44aca92a338b31bf3ef7d34cc7930cb52839, difficulty: 197376, Tx: 2 - Block 10, bc4ba3ed16e2fe3ae7f016788007044730a5fc4c5779d0dc06d63165fc9b1897, difficulty: 197376, Tx: 2 - Chain Total Difficulty 1971072 - -- blocks_10_td_1971072_5.rlp - Block 1, ae0f4bc591d55871c692c7d29f71fa274084648fd0ec1fac6d8f59e1e5b5b44e, difficulty: 196704, Tx: 2 - Block 2, 0cb80cafec0062f8806ec30e62ae8b6dfa3c2e9a3004b17fc6b624bdbcae6f2c, difficulty: 196800, Tx: 2 - Block 3, 0b52d79e6dd0d58c182866ff18656ab31e275dff8aa76f7f3782d2003348e42a, difficulty: 196896, Tx: 2 - Block 4, cfc68655021271c2d6e0decfc959aff0de2ae2602ee682f1064355003206caf4, difficulty: 196992, Tx: 2 - Block 5, 56e5850869e273bf3a05ab62e5121abcf0f2a0fee29ca60020bbfcfca4f8e69d, difficulty: 197088, Tx: 2 - Block 6, 76870baeff8d9d5fa018049970e977666e90ff53dabc6214e1e833a2fced28c6, difficulty: 197184, Tx: 2 - Block 7, 426270f8917ffb393227d46e8cb4581171227b7dffca19f04f47d0b54ed0d3d6, difficulty: 197280, Tx: 2 - Block 8, a935304ff29b2c5ad8b6527b5dc2b96d65cd5f5337abeec3cfeb6b9d060d0861, difficulty: 197376, Tx: 2 - Block 9, e817b97653bdbec402ea9c2ff0bbd1ce03e241b4e6431389b7cfd458a80be6b5, difficulty: 197376, Tx: 2 - Block 10, 8476e7bff6b7f650f71d50639436907265e796d3d04d73c83e30bc734696072d, difficulty: 197376, Tx: 2 - Chain Total Difficulty 1971072 - -Chains were generated using the following command: - `hivechain generate -genesis ./init/genesis.json -mine -length 2|1`. \ No newline at end of file diff --git a/simulators/ethereum/engine/chains/blocks_1024_td_135112316.rlp b/simulators/ethereum/engine/chains/blocks_1024_td_135112316.rlp deleted file mode 100644 index ae6648a4e492d729e3f010cdffd82f887f1225b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2145594 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"gqI7ow>(teX)_HH6J(5i<$^9OBM4U2J96z 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

t1 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�yljl=B-48MptdPesCnhl^q(%PmN^6q&D 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 diff --git a/simulators/ethereum/engine/chains/blocks_10_td_1971072_2.rlp b/simulators/ethereum/engine/chains/blocks_10_td_1971072_2.rlp deleted file mode 100644 index 3a977d96478b517994cff6685fd2dbf2b966394e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7220 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 diff --git a/simulators/ethereum/engine/chains/blocks_10_td_1971072_5.rlp b/simulators/ethereum/engine/chains/blocks_10_td_1971072_5.rlp deleted file mode 100644 index 0019014ca6ba5a5105cfed9273fa7a2a5dbbf113..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7220 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 diff --git a/simulators/ethereum/engine/chains/blocks_1_td_196416.rlp b/simulators/ethereum/engine/chains/blocks_1_td_196416.rlp deleted file mode 100644 index e162948a64fd5286cf9d09d7fde03b49c301623f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1630 zcmd_n`#aMM90%~tJ;uc5G8wCbvxGJ&q-<%}i4GlezZ`uDB~7$6rL_q;QJ70~_%4?x zl3UMsq$DaFq=nN8nN!-xZKCtVBj?%qVL$aB^!e%YynlH;pZ8}~C1@4C0Y=TdO=&4{ z;{j;_+#RVX=e=`>Ekelb3q|Md1*Q{8G|;%;Q}Vt$gn92OKdQNZ7&D|pG2&(>>MrsQ zZIFiZ+_;#iegriP`8%UczwW!YCq}4ra z^J_TvM_qpMn2R-_R|A6pxEy)ya~f4KCO+)26rB?JhV)dMv>6F!5x^Wywbm@L!FQ^8 zZ7JHgar%CRt4s4a=j3Z1RKw*{2u&~qjo9fwT10mN>}syuHXF=DYrzu<|dEt%CbEXL`HUqtS%$(B$B#!o70l}%$~s;?H8{qPUXW%`ItQS#}vW~*aB#7ibcA8 zTdz!?r_Jr(Pr5vh<{#TT59V=E9Tk#=pAP#ecb?vzI8z0u%H%zbQqHqvsJ4 z+HcoJ%$9LODV*|}1xt5U`=}A;3k0aikpRA*hg2F^D_ykm$SQIZaue%0vd2f+u`T+0 zMB#Kop~jOlK8!BAYz^Cthn(2XkL1*@IA3tjjaQ-=dOH=#Sg7a%hm=>@mp4zMnl3Gx ztg|K!mj@wWiyV1=J@kR^rbGW^=Z8kRgwX(>JMIkZ^Ir?)9fi3d z1xkx1235&VUktehf|{J|u{O26Xc647w$wYb6~DZ9*ThD9QaV^7p7otYLV&s)@#;Me zzdolXE@!M^EcX49mGUJuN`|Zl*j%r{r{0GI=gM|P9 diff --git a/simulators/ethereum/engine/chains/blocks_1_td_196608.rlp b/simulators/ethereum/engine/chains/blocks_1_td_196608.rlp deleted file mode 100644 index 2c6c47be89c46906c3f741941e1481bd9698dc4a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 620 zcmey#l=+kK&w}(7CA+^Ma16ht&4iBV^igf($!JzMh>A1WY74%xOY6Z zYIW<@^lfLZNL?0km7da7BK%>Y(_e=xlijB1ype)!+>FVveq+TN6XtKgqo= t5t{0;Eo}jZmcByG`yw%)XhY$)Ud_w}`VT)yTl0Q%UYD+)x4BC2001L-n&|)l diff --git a/simulators/ethereum/engine/chains/blocks_1_td_196704.rlp b/simulators/ethereum/engine/chains/blocks_1_td_196704.rlp deleted file mode 100644 index 772bf39d2c723cd29024429c5283c14f9ef8cea8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 620 zcmey#l=+kK&w}(7CA+^Ma16ht&4iBV^igf($!JzMh>A1WY74%xOY6Z zYIW<@^lfLZNL?0km7da7BK%>Y(_e=xlijB50YKKL-SQz=wjK>2~3+R7WmmD zbj{Zjntx`elKHWY5_)y!O=|L}vfHSag)b?N$fo2vv5003K&nEU_$ diff --git a/simulators/ethereum/engine/chains/blocks_2_td_393120.rlp b/simulators/ethereum/engine/chains/blocks_2_td_393120.rlp deleted file mode 100644 index 82c0f4914b4ea2430248c0bf9a6fd3a216256836..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1240 zcmey#l=+kK&w}(7CA+^Ma16ht&4iBV^igf($!JzMh>A1WY74%xOY6Z zYIW<@^lfLZNL?0km7da7BK%>Y(_e=xlijB1ype)!+>FVveq+TN6XtKgqo= z5t{0;Eo}jZmcByG`yw%)XhY$)Ud_w}`VT)yTl0Q%UYD+)x4BC2z)wh83+c8}xWY4A z^I!Il*=>95WP=X=x|?t@l1=?f+qSb|$uVT6wLFt$8(ltK%$L77KdhjE;jzk@`r3(W zx!c|au3et{W#ya&Y}K8P>U%z~ZxChr+ShxjXV1?Zj;R(kwv%HSUTM4*6&y`#g!4@^ z)Bgob@U#}xu;Bhj-UrsrPa8z`2R=8E`y~~jr*ri}%BlSAamV()*gQj^gMX7IkK77r zjuzbuek(y~jgeqlGh9%A(nvr1lwR{Cp0}q8zpndsy!)6Kue?QbsLsjFCe!L97jSEA l;9T_E>G+Jp1X`rk_~?ZXX<{wJYcx008O{JCOhY diff --git a/simulators/ethereum/engine/chains/blocks_2_td_393504.rlp b/simulators/ethereum/engine/chains/blocks_2_td_393504.rlp deleted file mode 100644 index d3c1ef1c2f660fe0ba3a94b05b1f7734b8d85e1b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1240 zcmey#l=+kK&w}(7CA+^Ma16ht&4iBV^igf($!JzMh>A1WY74%xOY6Z zYIW<@^lfLZNL?0km7da7BK%>Y(_e=xlijB50YKKL-SQz=wjK>2~3+R7WmmD zbj{Zjntx`elKHWY5_)y!O=|L}vfHSag)b?N$fo2vv5{Dh>nfJuq3P2ckQ zu&2c2yD%?y-`nK+R7&=pp`YkW`8_KREGILqefEBl_vzJ2tF7nfN;WS4!Meuee%A+; zlZ=l{zuuLb(YSsATXm_8&nyAA502B?6?6^&0KwKbxc~qF diff --git a/simulators/ethereum/engine/client/engine.go b/simulators/ethereum/engine/client/engine.go index b4df3560ed..a330511c6c 100644 --- a/simulators/ethereum/engine/client/engine.go +++ b/simulators/ethereum/engine/client/engine.go @@ -19,6 +19,7 @@ type Eth interface { BlockNumber(ctx context.Context) (uint64, error) BlockByHash(ctx context.Context, hash common.Hash) (*types.Block, error) HeaderByNumber(ctx context.Context, number *big.Int) (*types.Header, error) + HeaderByHash(ctx context.Context, hash common.Hash) (*types.Header, error) SendTransaction(ctx context.Context, tx typ.Transaction) error SendTransactions(ctx context.Context, txs ...typ.Transaction) []error StorageAt(ctx context.Context, account common.Address, key common.Hash, blockNumber *big.Int) ([]byte, error) @@ -39,10 +40,10 @@ type Engine interface { GetPayloadV3(ctx context.Context, payloadId *api.PayloadID) (typ.ExecutableData, *big.Int, *typ.BlobsBundle, *bool, error) GetPayload(ctx context.Context, version int, payloadId *api.PayloadID) (typ.ExecutableData, *big.Int, *typ.BlobsBundle, *bool, error) - NewPayload(ctx context.Context, version int, payload interface{}, versionedHashes *[]common.Hash, beaconRoot *common.Hash) (api.PayloadStatusV1, error) - NewPayloadV1(ctx context.Context, payload *typ.ExecutableDataV1) (api.PayloadStatusV1, error) + NewPayload(ctx context.Context, version int, payload *typ.ExecutableData) (api.PayloadStatusV1, error) + NewPayloadV1(ctx context.Context, payload *typ.ExecutableData) (api.PayloadStatusV1, error) NewPayloadV2(ctx context.Context, payload *typ.ExecutableData) (api.PayloadStatusV1, error) - NewPayloadV3(ctx context.Context, payload *typ.ExecutableData, versionedHashes *[]common.Hash, beaconRoot *common.Hash) (api.PayloadStatusV1, error) + NewPayloadV3(ctx context.Context, payload *typ.ExecutableData) (api.PayloadStatusV1, error) GetPayloadBodiesByRangeV1(ctx context.Context, start uint64, count uint64) ([]*typ.ExecutionPayloadBodyV1, error) GetPayloadBodiesByHashV1(ctx context.Context, hashes []common.Hash) ([]*typ.ExecutionPayloadBodyV1, error) @@ -54,6 +55,12 @@ type Engine interface { LatestNewPayloadResponse() (payloadResponse *api.PayloadStatusV1) } +type EngineAPIVersionResolver interface { + ForkchoiceUpdatedVersion(headTimestamp uint64, payloadAttributesTimestamp *uint64) int + NewPayloadVersion(timestamp uint64) int + GetPayloadVersion(timestamp uint64) int +} + type EngineClient interface { // General Methods ID() string @@ -61,8 +68,8 @@ type EngineClient interface { EnodeURL() (string, error) // Local Test Account Management - GetLastAccountNonce(testCtx context.Context, account common.Address) (uint64, error) - GetNextAccountNonce(testCtx context.Context, account common.Address) (uint64, error) + GetLastAccountNonce(testCtx context.Context, account common.Address, head *types.Header) (uint64, error) + GetNextAccountNonce(testCtx context.Context, account common.Address, head *types.Header) (uint64, error) UpdateNonce(testCtx context.Context, account common.Address, newNonce uint64) error // TTD Methods diff --git a/simulators/ethereum/engine/client/hive_rpc/hive_rpc.go b/simulators/ethereum/engine/client/hive_rpc/hive_rpc.go index 760cf5e39b..d055d1d346 100644 --- a/simulators/ethereum/engine/client/hive_rpc/hive_rpc.go +++ b/simulators/ethereum/engine/client/hive_rpc/hive_rpc.go @@ -454,13 +454,13 @@ func (ec *HiveRPCEngineClient) GetBlobsBundleV1(ctx context.Context, payloadId * } // New Payload API Call Methods -func (ec *HiveRPCEngineClient) NewPayload(ctx context.Context, version int, payload interface{}, versionedHashes *[]common.Hash, beaconRoot *common.Hash) (result api.PayloadStatusV1, err error) { +func (ec *HiveRPCEngineClient) NewPayload(ctx context.Context, version int, payload *typ.ExecutableData) (result api.PayloadStatusV1, err error) { if err := ec.PrepareDefaultAuthCallToken(); err != nil { return result, err } if version >= 3 { - err = ec.c.CallContext(ctx, &result, fmt.Sprintf("engine_newPayloadV%d", version), payload, versionedHashes, beaconRoot) + err = ec.c.CallContext(ctx, &result, fmt.Sprintf("engine_newPayloadV%d", version), payload, payload.VersionedHashes, payload.ParentBeaconBlockRoot) } else { err = ec.c.CallContext(ctx, &result, fmt.Sprintf("engine_newPayloadV%d", version), payload) } @@ -468,20 +468,19 @@ func (ec *HiveRPCEngineClient) NewPayload(ctx context.Context, version int, payl return result, err } -func (ec *HiveRPCEngineClient) NewPayloadV1(ctx context.Context, payload *typ.ExecutableDataV1) (api.PayloadStatusV1, error) { - ed := payload.ToExecutableData() - ec.latestPayloadSent = &ed - return ec.NewPayload(ctx, 1, payload, nil, nil) +func (ec *HiveRPCEngineClient) NewPayloadV1(ctx context.Context, payload *typ.ExecutableData) (api.PayloadStatusV1, error) { + ec.latestPayloadSent = payload + return ec.NewPayload(ctx, 1, payload) } func (ec *HiveRPCEngineClient) NewPayloadV2(ctx context.Context, payload *typ.ExecutableData) (api.PayloadStatusV1, error) { ec.latestPayloadSent = payload - return ec.NewPayload(ctx, 2, payload, nil, nil) + return ec.NewPayload(ctx, 2, payload) } -func (ec *HiveRPCEngineClient) NewPayloadV3(ctx context.Context, payload *typ.ExecutableData, versionedHashes *[]common.Hash, beaconRoot *common.Hash) (api.PayloadStatusV1, error) { +func (ec *HiveRPCEngineClient) NewPayloadV3(ctx context.Context, payload *typ.ExecutableData) (api.PayloadStatusV1, error) { ec.latestPayloadSent = payload - return ec.NewPayload(ctx, 3, payload, versionedHashes, beaconRoot) + return ec.NewPayload(ctx, 3, payload) } // Exchange Transition Configuration API Call Methods @@ -501,13 +500,16 @@ func (ec *HiveRPCEngineClient) ExchangeCapabilities(ctx context.Context, clCapab } // Account Nonce -func (ec *HiveRPCEngineClient) GetLastAccountNonce(testCtx context.Context, account common.Address) (uint64, error) { +func (ec *HiveRPCEngineClient) GetLastAccountNonce(testCtx context.Context, account common.Address, head *types.Header) (uint64, error) { // First get the current head of the client where we will send the tx - ctx, cancel := context.WithTimeout(testCtx, globals.RPCTimeout) - defer cancel() - head, err := ec.HeaderByNumber(ctx, nil) - if err != nil { - return 0, err + if head == nil { + ctx, cancel := context.WithTimeout(testCtx, globals.RPCTimeout) + defer cancel() + var err error + head, err = ec.HeaderByNumber(ctx, nil) + if err != nil { + return 0, err + } } // Then check if we have any info about this account, and when it was last updated @@ -520,13 +522,16 @@ func (ec *HiveRPCEngineClient) GetLastAccountNonce(testCtx context.Context, acco return 0, fmt.Errorf("no previous nonce for account %s", account.String()) } -func (ec *HiveRPCEngineClient) GetNextAccountNonce(testCtx context.Context, account common.Address) (uint64, error) { +func (ec *HiveRPCEngineClient) GetNextAccountNonce(testCtx context.Context, account common.Address, head *types.Header) (uint64, error) { // First get the current head of the client where we will send the tx - ctx, cancel := context.WithTimeout(testCtx, globals.RPCTimeout) - defer cancel() - head, err := ec.HeaderByNumber(ctx, nil) - if err != nil { - return 0, err + if head == nil { + ctx, cancel := context.WithTimeout(testCtx, globals.RPCTimeout) + defer cancel() + var err error + head, err = ec.HeaderByNumber(ctx, nil) + if err != nil { + return 0, err + } } // Then check if we have any info about this account, and when it was last updated if accTxInfo, ok := ec.accTxInfoMap[account]; ok && accTxInfo != nil && (accTxInfo.PreviousBlock == head.Hash() || accTxInfo.PreviousBlock == head.ParentHash) { @@ -537,7 +542,7 @@ func (ec *HiveRPCEngineClient) GetNextAccountNonce(testCtx context.Context, acco return accTxInfo.PreviousNonce, nil } // We don't have info about this account, or is outdated, or we re-org'd, we must request the nonce - ctx, cancel = context.WithTimeout(testCtx, globals.RPCTimeout) + ctx, cancel := context.WithTimeout(testCtx, globals.RPCTimeout) defer cancel() nonce, err := ec.NonceAt(ctx, account, head.Number) if err != nil { diff --git a/simulators/ethereum/engine/client/node/node.go b/simulators/ethereum/engine/client/node/node.go index 354af59079..0896da2d16 100644 --- a/simulators/ethereum/engine/client/node/node.go +++ b/simulators/ethereum/engine/client/node/node.go @@ -432,38 +432,21 @@ func (n *GethNode) SetBlock(block *types.Block, parentNumber uint64, parentRoot } // Engine API -func (n *GethNode) NewPayload(ctx context.Context, version int, pl interface{}, vh *[]common.Hash, beaconRoot *common.Hash) (beacon.PayloadStatusV1, error) { +func (n *GethNode) NewPayload(ctx context.Context, version int, pl *typ.ExecutableData) (beacon.PayloadStatusV1, error) { switch version { case 1: - if c, ok := pl.(*typ.ExecutableDataV1); ok { - return n.NewPayloadV1(ctx, c) - } else if c, ok := pl.(*typ.ExecutableData); ok { - edv1 := new(typ.ExecutableDataV1) - edv1.FromExecutableData(c) - return n.NewPayloadV1(ctx, edv1) - } else { - return beacon.PayloadStatusV1{}, fmt.Errorf("wrong type %T", pl) - } + return n.NewPayloadV1(ctx, pl) case 2: - if c, ok := pl.(*typ.ExecutableData); ok { - return n.NewPayloadV2(ctx, c) - } else { - return beacon.PayloadStatusV1{}, fmt.Errorf("wrong type %T", pl) - } + return n.NewPayloadV2(ctx, pl) case 3: - if c, ok := pl.(*typ.ExecutableData); ok { - return n.NewPayloadV3(ctx, c, vh, beaconRoot) - } else { - return beacon.PayloadStatusV1{}, fmt.Errorf("wrong type %T", pl) - } + return n.NewPayloadV3(ctx, pl) } return beacon.PayloadStatusV1{}, fmt.Errorf("unknown version %d", version) } -func (n *GethNode) NewPayloadV1(ctx context.Context, pl *typ.ExecutableDataV1) (beacon.PayloadStatusV1, error) { - ed := pl.ToExecutableData() - n.latestPayloadSent = &ed - edConverted, err := typ.ToBeaconExecutableData(&ed) +func (n *GethNode) NewPayloadV1(ctx context.Context, pl *typ.ExecutableData) (beacon.PayloadStatusV1, error) { + n.latestPayloadSent = pl + edConverted, err := typ.ToBeaconExecutableData(pl) if err != nil { return beacon.PayloadStatusV1{}, err } @@ -483,13 +466,16 @@ func (n *GethNode) NewPayloadV2(ctx context.Context, pl *typ.ExecutableData) (be return resp, err } -func (n *GethNode) NewPayloadV3(ctx context.Context, pl *typ.ExecutableData, versionedHashes *[]common.Hash, beaconRoot *common.Hash) (beacon.PayloadStatusV1, error) { +func (n *GethNode) NewPayloadV3(ctx context.Context, pl *typ.ExecutableData) (beacon.PayloadStatusV1, error) { n.latestPayloadSent = pl ed, err := typ.ToBeaconExecutableData(pl) if err != nil { return beacon.PayloadStatusV1{}, err } - resp, err := n.api.NewPayloadV3(ed, *versionedHashes, beaconRoot) + if pl.VersionedHashes == nil { + return beacon.PayloadStatusV1{}, fmt.Errorf("versioned hashes are nil") + } + resp, err := n.api.NewPayloadV3(ed, *pl.VersionedHashes, pl.ParentBeaconBlockRoot) n.latestPayloadStatusReponse = &resp return resp, err } @@ -500,6 +486,8 @@ func (n *GethNode) ForkchoiceUpdated(ctx context.Context, version int, fcs *beac return n.ForkchoiceUpdatedV1(ctx, fcs, payload) case 2: return n.ForkchoiceUpdatedV2(ctx, fcs, payload) + case 3: + return n.ForkchoiceUpdatedV3(ctx, fcs, payload) default: return beacon.ForkChoiceResponse{}, fmt.Errorf("unknown version %d", version) } @@ -565,18 +553,27 @@ func (n *GethNode) GetPayloadV3(ctx context.Context, payloadId *beacon.PayloadID return typ.ExecutableData{}, nil, nil, nil, err } ed, err := typ.FromBeaconExecutableData(p.ExecutionPayload) - // TODO: Convert and return the blobs bundle - return ed, p.BlockValue, nil, &p.Override, err + blobsBundle := &typ.BlobsBundle{} + if err := blobsBundle.FromBeaconBlobsBundle(p.BlobsBundle); err != nil { + return typ.ExecutableData{}, nil, nil, nil, err + } + return ed, p.BlockValue, blobsBundle, &p.Override, err } func (n *GethNode) GetPayload(ctx context.Context, version int, payloadId *beacon.PayloadID) (typ.ExecutableData, *big.Int, *typ.BlobsBundle, *bool, error) { - p, err := n.api.GetPayloadV3(*payloadId) - if p == nil || err != nil { - return typ.ExecutableData{}, nil, nil, nil, err + + switch version { + case 1: + ed, err := n.GetPayloadV1(ctx, payloadId) + return ed, nil, nil, nil, err + case 2: + ed, value, err := n.GetPayloadV2(ctx, payloadId) + return ed, value, nil, nil, err + case 3: + return n.GetPayloadV3(ctx, payloadId) + default: + return typ.ExecutableData{}, nil, nil, nil, fmt.Errorf("unknown version %d", version) } - ed, err := typ.FromBeaconExecutableData(p.ExecutionPayload) - // TODO: Convert and return the blobs bundle - return ed, p.BlockValue, nil, &p.Override, err } func (n *GethNode) GetPayloadBodiesByRangeV1(ctx context.Context, start uint64, count uint64) ([]*typ.ExecutionPayloadBodyV1, error) { @@ -634,6 +631,17 @@ func (n *GethNode) HeaderByNumber(ctx context.Context, number *big.Int) (*types. return b.Header(), err } +func (n *GethNode) HeaderByHash(ctx context.Context, hash common.Hash) (*types.Header, error) { + b, err := n.eth.APIBackend.BlockByHash(ctx, hash) + if err != nil { + return nil, err + } + if b == nil { + return nil, fmt.Errorf("Header not found (%v)", hash) + } + return b.Header(), err +} + func (n *GethNode) SendTransaction(ctx context.Context, tx typ.Transaction) error { if v, ok := tx.(*types.Transaction); ok { return n.eth.APIBackend.SendTx(ctx, v) @@ -734,15 +742,19 @@ func (n *GethNode) ID() string { return n.node.Config().Name } -func (n *GethNode) GetLastAccountNonce(testCtx context.Context, account common.Address) (uint64, error) { +func (n *GethNode) GetLastAccountNonce(testCtx context.Context, account common.Address, head *types.Header) (uint64, error) { + // First get the current head of the client where we will send the tx - head, err := n.eth.APIBackend.BlockByNumber(testCtx, rpc.LatestBlockNumber) - if err != nil { - return 0, err + if head == nil { + block, err := n.eth.APIBackend.BlockByNumber(testCtx, rpc.LatestBlockNumber) + if err != nil { + return 0, err + } + head = block.Header() } // Then check if we have any info about this account, and when it was last updated - if accTxInfo, ok := n.accTxInfoMap[account]; ok && accTxInfo != nil && (accTxInfo.PreviousBlock == head.Hash() || accTxInfo.PreviousBlock == head.ParentHash()) { + if accTxInfo, ok := n.accTxInfoMap[account]; ok && accTxInfo != nil && (accTxInfo.PreviousBlock == head.Hash() || accTxInfo.PreviousBlock == head.ParentHash) { // We have info about this account and is up to date (or up to date until the very last block). // Return the previous nonce return accTxInfo.PreviousNonce, nil @@ -751,14 +763,17 @@ func (n *GethNode) GetLastAccountNonce(testCtx context.Context, account common.A return 0, fmt.Errorf("no previous nonce for account %s", account.String()) } -func (n *GethNode) GetNextAccountNonce(testCtx context.Context, account common.Address) (uint64, error) { - // First get the current head of the client where we will send the tx - head, err := n.eth.APIBackend.BlockByNumber(testCtx, rpc.LatestBlockNumber) - if err != nil { - return 0, err +func (n *GethNode) GetNextAccountNonce(testCtx context.Context, account common.Address, head *types.Header) (uint64, error) { + if head == nil { + // First get the current head of the client where we will send the tx + block, err := n.eth.APIBackend.BlockByNumber(testCtx, rpc.LatestBlockNumber) + if err != nil { + return 0, err + } + head = block.Header() } // Check if we have any info about this account, and when it was last updated - if accTxInfo, ok := n.accTxInfoMap[account]; ok && accTxInfo != nil && (accTxInfo.PreviousBlock == head.Hash() || accTxInfo.PreviousBlock == head.ParentHash()) { + if accTxInfo, ok := n.accTxInfoMap[account]; ok && accTxInfo != nil && (accTxInfo.PreviousBlock == head.Hash() || accTxInfo.PreviousBlock == head.ParentHash) { // We have info about this account and is up to date (or up to date until the very last block). // Increase the nonce and return it accTxInfo.PreviousBlock = head.Hash() @@ -766,7 +781,7 @@ func (n *GethNode) GetNextAccountNonce(testCtx context.Context, account common.A return accTxInfo.PreviousNonce, nil } // We don't have info about this account, or is outdated, or we re-org'd, we must request the nonce - nonce, err := n.NonceAt(testCtx, account, head.Number()) + nonce, err := n.NonceAt(testCtx, account, head.Number) if err != nil { return 0, err } diff --git a/simulators/ethereum/engine/clmock/clmock.go b/simulators/ethereum/engine/clmock/clmock.go index 3ebf135c44..4da0b0e553 100644 --- a/simulators/ethereum/engine/clmock/clmock.go +++ b/simulators/ethereum/engine/clmock/clmock.go @@ -15,6 +15,8 @@ import ( "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/core/forkid" "github.com/ethereum/hive/simulators/ethereum/engine/client" + "github.com/ethereum/hive/simulators/ethereum/engine/config" + "github.com/ethereum/hive/simulators/ethereum/engine/config/cancun" "github.com/ethereum/hive/simulators/ethereum/engine/globals" "github.com/ethereum/hive/simulators/ethereum/engine/helper" typ "github.com/ethereum/hive/simulators/ethereum/engine/types" @@ -26,15 +28,14 @@ import ( ) var ( - DefaultSlotsToSafe = big.NewInt(1) - DefaultSlotsToFinalized = big.NewInt(2) + DefaultSafeSlotsToImportOptimistically = big.NewInt(0) + DefaultSlotsToSafe = big.NewInt(1) + DefaultSlotsToFinalized = big.NewInt(2) + DefaultBlockTimestampIncrement = big.NewInt(1) // Time delay between ForkchoiceUpdated and GetPayload to allow the clients // to produce a new Payload DefaultPayloadProductionClientDelay = time.Second - - // Fork specific constants - BLOB_COMMITMENT_VERSION_KZG = byte(0x01) ) type ExecutableDataHistory map[uint64]*typ.ExecutableData @@ -116,7 +117,7 @@ type CLMocker struct { ChainTotalDifficulty *big.Int // Fork configuration - *globals.ForkConfig + *config.ForkConfig Genesis *core.Genesis NextWithdrawals types.Withdrawals @@ -126,43 +127,38 @@ type CLMocker struct { TimeoutContext context.Context } -func NewCLMocker(t *hivesim.T, genesis *core.Genesis, slotsToSafe, slotsToFinalized, safeSlotsToImportOptimistically *big.Int, forkConfig globals.ForkConfig) *CLMocker { +func NewCLMocker(t *hivesim.T, genesis *core.Genesis, forkConfig *config.ForkConfig) *CLMocker { // Init random seed for different purposes seed := time.Now().Unix() t.Logf("Randomness seed: %v\n", seed) rand.Seed(seed) - if slotsToSafe == nil { - // Use default - slotsToSafe = DefaultSlotsToSafe - } - if slotsToFinalized == nil { - // Use default - slotsToFinalized = DefaultSlotsToFinalized - } // Create the new CL mocker newCLMocker := &CLMocker{ - T: t, - EngineClients: make([]client.EngineClient, 0), - PrevRandaoHistory: map[uint64]common.Hash{}, - ExecutedPayloadHistory: ExecutableDataHistory{}, - SlotsToSafe: slotsToSafe, - SlotsToFinalized: slotsToFinalized, - SafeSlotsToImportOptimistically: safeSlotsToImportOptimistically, + T: t, + EngineClients: make([]client.EngineClient, 0), + PrevRandaoHistory: map[uint64]common.Hash{}, + ExecutedPayloadHistory: ExecutableDataHistory{}, + + SlotsToSafe: DefaultSlotsToSafe, + SlotsToFinalized: DefaultSlotsToFinalized, + SafeSlotsToImportOptimistically: DefaultSafeSlotsToImportOptimistically, PayloadProductionClientDelay: DefaultPayloadProductionClientDelay, - PayloadIDHistory: make(map[api.PayloadID]interface{}), - LatestHeader: nil, - FirstPoSBlockNumber: nil, - LatestHeadNumber: nil, - TTDReached: false, - NextFeeRecipient: common.Address{}, + BlockTimestampIncrement: DefaultBlockTimestampIncrement, + + PayloadIDHistory: make(map[api.PayloadID]interface{}), + LatestHeader: nil, + FirstPoSBlockNumber: nil, + LatestHeadNumber: nil, + TTDReached: false, + NextFeeRecipient: common.Address{}, LatestForkchoice: api.ForkchoiceStateV1{ HeadBlockHash: common.Hash{}, SafeBlockHash: common.Hash{}, FinalizedBlockHash: common.Hash{}, }, ChainTotalDifficulty: genesis.Difficulty, - ForkConfig: &forkConfig, + ForkConfig: forkConfig, Genesis: genesis, TestContext: context.Background(), } @@ -226,6 +222,7 @@ func (cl *CLMocker) IsOptimisticallySyncing() bool { return diff.Cmp(cl.SafeSlotsToImportOptimistically) >= 0 } +// Chain State Information func (cl *CLMocker) ForkID() forkid.ID { return forkid.NewID(cl.Genesis.Config, cl.GenesisBlock(), cl.LatestHeader.Number.Uint64(), cl.LatestHeader.Time) } @@ -325,9 +322,6 @@ func (cl *CLMocker) IsBlockPoS(bn *big.Int) bool { // Return the per-block timestamp value increment func (cl *CLMocker) GetTimestampIncrement() uint64 { - if cl.BlockTimestampIncrement == nil { - return 1 - } return cl.BlockTimestampIncrement.Uint64() } @@ -384,6 +378,33 @@ func (cl *CLMocker) SetNextWithdrawals(nextWithdrawals types.Withdrawals) { cl.NextWithdrawals = nextWithdrawals } +func (cl *CLMocker) MakeNextWithdrawals() types.Withdrawals { + withdrawalCount := uint64(10) + withdrawalIndex := uint64(0) + + if cl.LatestPayloadBuilt.Withdrawals != nil { + for _, w := range cl.LatestPayloadBuilt.Withdrawals { + if w.Index > withdrawalIndex { + withdrawalIndex = w.Index + } + } + } + + withdrawals := make(types.Withdrawals, withdrawalCount) + + for i := uint64(0); i < withdrawalCount; i++ { + withdrawalIndex += 1 + withdrawals[i] = &types.Withdrawal{ + Index: withdrawalIndex, + Validator: i, + Address: common.Address{byte(i)}, + Amount: 100, + } + } + + return withdrawals +} + func TimestampToBeaconRoot(timestamp uint64) common.Hash { // Generates a deterministic hash from the timestamp beaconRoot := common.Hash{} @@ -426,7 +447,7 @@ func (cl *CLMocker) AddPayloadID(newPayloadID *api.PayloadID) error { return errors.New("nil payload ID") } if _, ok := cl.PayloadIDHistory[*newPayloadID]; ok { - return fmt.Errorf("Reused payload ID: %v", *newPayloadID) + return fmt.Errorf("reused payload ID: %v", *newPayloadID) } cl.PayloadIDHistory[*newPayloadID] = nil return nil @@ -435,7 +456,7 @@ func (cl *CLMocker) AddPayloadID(newPayloadID *api.PayloadID) error { func (cl *CLMocker) RequestNextPayload() { ctx, cancel := context.WithTimeout(cl.TestContext, globals.RPCTimeout) defer cancel() - fcUVersion := cl.ForkchoiceUpdatedVersion(cl.LatestHeader.Time, &cl.LatestPayloadAttributes.Timestamp) + fcUVersion := cl.ForkConfig.ForkchoiceUpdatedVersion(cl.LatestHeader.Time, &cl.LatestPayloadAttributes.Timestamp) resp, err := cl.NextBlockProducer.ForkchoiceUpdated(ctx, fcUVersion, &cl.LatestForkchoice, &cl.LatestPayloadAttributes) if err != nil { cl.Fatalf("CLMocker: Could not send forkchoiceUpdatedV%d (%v): %v", fcUVersion, cl.NextBlockProducer.ID(), err) @@ -458,6 +479,7 @@ func (cl *CLMocker) GetNextPayload() { defer cancel() version := cl.ForkConfig.GetPayloadVersion(cl.LatestPayloadAttributes.Timestamp) cl.LatestPayloadBuilt, cl.LatestBlockValue, cl.LatestBlobBundle, cl.LatestShouldOverrideBuilder, err = cl.NextBlockProducer.GetPayload(ctx, version, cl.NextPayloadID) + if err != nil { cl.Fatalf("CLMocker: Could not getPayload (%v, %v): %v", cl.NextBlockProducer.ID(), cl.NextPayloadID, err) } @@ -476,23 +498,28 @@ func (cl *CLMocker) GetNextPayload() { if cl.LatestPayloadBuilt.Number != cl.LatestHeader.Number.Uint64()+1 { cl.Fatalf("CLMocker: Incorrect Number on payload built: %v != %v", cl.LatestPayloadBuilt.Number, cl.LatestHeader.Number.Uint64()+1) } -} -func (cl *CLMocker) broadcastNextNewPayload() { - // Check if we have blobs to include in the broadcast - var versionedHashes *[]common.Hash - if cl.LatestBlobBundle != nil { + if cl.IsCancun(cl.LatestPayloadBuilt.Timestamp) { + // Check if we have blobs to include in the broadcast + if cl.LatestBlobBundle == nil { + cl.Fatalf("CLMocker: No blob bundle on cancun") + } // Broadcast the blob bundle to all clients - var err error - versionedHashes, err = cl.LatestBlobBundle.VersionedHashes(BLOB_COMMITMENT_VERSION_KZG) + cl.LatestPayloadBuilt.VersionedHashes, err = cl.LatestBlobBundle.VersionedHashes(cancun.BLOB_COMMITMENT_VERSION_KZG) if err != nil { cl.Fatalf("CLMocker: Could not get versioned hashes from blob bundle: %v", err) } + cl.LatestPayloadBuilt.ParentBeaconBlockRoot = cl.LatestPayloadAttributes.BeaconRoot } + cl.LatestPayloadBuilt.PayloadAttributes = cl.LatestPayloadAttributes +} + +func (cl *CLMocker) broadcastNextNewPayload() { + // Broadcast the executePayload to all clients - version := cl.NewPayloadVersion(cl.LatestPayloadBuilt.Timestamp) + version := cl.ForkConfig.NewPayloadVersion(cl.LatestPayloadBuilt.Timestamp) validations := 0 - for _, resp := range cl.BroadcastNewPayload(&cl.LatestPayloadBuilt, versionedHashes, cl.LatestPayloadAttributes.BeaconRoot, version) { + for _, resp := range cl.BroadcastNewPayload(&cl.LatestPayloadBuilt, version) { if resp.Error != nil { cl.Logf("CLMocker: BroadcastNewPayload Error (%v): %v\n", resp.Container, resp.Error) } else { @@ -531,7 +558,7 @@ func (cl *CLMocker) broadcastNextNewPayload() { } func (cl *CLMocker) broadcastLatestForkchoice() { - version := cl.ForkchoiceUpdatedVersion(cl.LatestExecutedPayload.Timestamp, nil) + version := cl.ForkConfig.ForkchoiceUpdatedVersion(cl.LatestExecutedPayload.Timestamp, nil) for _, resp := range cl.BroadcastForkchoiceUpdated(&cl.LatestForkchoice, nil, version) { if resp.Error != nil { cl.Logf("CLMocker: BroadcastForkchoiceUpdated Error (%v): %v\n", resp.Container, resp.Error) @@ -582,7 +609,7 @@ func (cl *CLMocker) ProduceSingleBlock(callbacks BlockProcessCallbacks) { // Check if next withdrawals necessary, test can override this value on // `OnPayloadProducerSelected` callback if cl.NextWithdrawals == nil { - cl.SetNextWithdrawals(make(types.Withdrawals, 0)) + cl.SetNextWithdrawals(cl.MakeNextWithdrawals()) } if callbacks.OnPayloadProducerSelected != nil { @@ -660,9 +687,11 @@ func (cl *CLMocker) ProduceSingleBlock(callbacks BlockProcessCallbacks) { defer cancel() newHeader, err := ec.HeaderByNumber(ctx, cl.LatestHeadNumber) if err != nil { + cl.Logf("CLMocker: Client %v did not accept the new payload: %v", ec.ID(), err) continue } if newHeader.Hash() != cl.LatestPayloadBuilt.BlockHash { + cl.Logf("CLMocker: Client %v produced a new header with incorrect hash: %v != %v", ec.ID(), newHeader.Hash(), cl.LatestPayloadBuilt.BlockHash) continue } // Check that the new finalized header has the correct properties @@ -691,6 +720,7 @@ func (cl *CLMocker) ProduceSingleBlock(callbacks BlockProcessCallbacks) { cl.Fatalf("CLMocker: None of the clients accepted the newly constructed payload") } cl.HeaderHistory[cl.LatestHeadNumber.Uint64()] = cl.LatestHeader + cl.Logf("CLMocker: New block produced: number=%d, hash=%x", cl.LatestHeader.Number, cl.LatestHeader.Hash()) } // Loop produce PoS blocks by using the Engine API @@ -707,13 +737,13 @@ type ExecutePayloadOutcome struct { Error error } -func (cl *CLMocker) BroadcastNewPayload(payload *typ.ExecutableData, versionedHashes *[]common.Hash, beaconRoot *common.Hash, version int) []ExecutePayloadOutcome { +func (cl *CLMocker) BroadcastNewPayload(ed *typ.ExecutableData, version int) []ExecutePayloadOutcome { responses := make([]ExecutePayloadOutcome, len(cl.EngineClients)) for i, ec := range cl.EngineClients { responses[i].Container = ec.ID() ctx, cancel := context.WithTimeout(cl.TestContext, globals.RPCTimeout) defer cancel() - execPayloadResp, err := ec.NewPayload(ctx, version, payload, versionedHashes, beaconRoot) + execPayloadResp, err := ec.NewPayload(ctx, version, ed) if err != nil { cl.Errorf("CLMocker: Could not ExecutePayloadV1: %v", err) responses[i].Error = err @@ -741,7 +771,7 @@ func (cl *CLMocker) BroadcastForkchoiceUpdated(fcstate *api.ForkchoiceStateV1, p defer cancel() fcUpdatedResp, err := ec.ForkchoiceUpdated(ctx, version, fcstate, payloadAttr) if err != nil { - cl.Errorf("CLMocker: Could not ForkchoiceUpdatedV1: %v", err) + cl.Errorf("CLMocker: Could not ForkchoiceUpdated: %v", err) responses[i].Error = err } else { responses[i].ForkchoiceResponse = &fcUpdatedResp diff --git a/simulators/ethereum/engine/config/cancun/constants.go b/simulators/ethereum/engine/config/cancun/constants.go new file mode 100644 index 0000000000..e829b1b470 --- /dev/null +++ b/simulators/ethereum/engine/config/cancun/constants.go @@ -0,0 +1,31 @@ +package cancun + +import ( + "math/big" + + "github.com/ethereum/go-ethereum/common" +) + +var ( + // EIP 4844 + GAS_PER_BLOB = uint64(0x20000) + + MIN_DATA_GASPRICE = uint64(1) + MAX_BLOB_GAS_PER_BLOCK = uint64(786432) + TARGET_BLOB_GAS_PER_BLOCK = uint64(393216) + + TARGET_BLOBS_PER_BLOCK = uint64(TARGET_BLOB_GAS_PER_BLOCK / GAS_PER_BLOB) + MAX_BLOBS_PER_BLOCK = uint64(MAX_BLOB_GAS_PER_BLOCK / GAS_PER_BLOB) + + BLOB_GASPRICE_UPDATE_FRACTION = uint64(3338477) + + BLOB_COMMITMENT_VERSION_KZG = byte(0x01) + + // EIP 4788 + HISTORY_STORAGE_ADDRESS = common.HexToAddress("0x000000000000000000000000000000000000000b") + HISTORICAL_ROOTS_MODULUS = uint64(98304) + + // Test constants + DATAHASH_START_ADDRESS = big.NewInt(0x20000) + DATAHASH_ADDRESS_COUNT = 1000 +) diff --git a/simulators/ethereum/engine/config/cancun/genesis.go b/simulators/ethereum/engine/config/cancun/genesis.go new file mode 100644 index 0000000000..2d32207d6d --- /dev/null +++ b/simulators/ethereum/engine/config/cancun/genesis.go @@ -0,0 +1,77 @@ +package cancun + +import ( + "fmt" + "math/big" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core" +) + +// ConfigGenesis configures the genesis block for the Cancun fork. +func ConfigGenesis(genesis *core.Genesis, forkTimestamp uint64) error { + if genesis.Config.ShanghaiTime == nil { + return fmt.Errorf("cancun fork requires shanghai fork") + } + genesis.Config.CancunTime = &forkTimestamp + if *genesis.Config.ShanghaiTime > forkTimestamp { + return fmt.Errorf("cancun fork must be after shanghai fork") + } + if genesis.Timestamp >= forkTimestamp { + if genesis.BlobGasUsed == nil { + genesis.BlobGasUsed = new(uint64) + } + if genesis.ExcessBlobGas == nil { + genesis.ExcessBlobGas = new(uint64) + } + } + + // Add bytecode pre deploy to the EIP-4788 address. + genesis.Alloc[HISTORY_STORAGE_ADDRESS] = core.GenesisAccount{ + Balance: common.Big0, + Nonce: 1, + Code: common.Hex2Bytes("3373fffffffffffffffffffffffffffffffffffffffe14604457602036146024575f5ffd5b620180005f350680545f35146037575f5ffd5b6201800001545f5260205ff35b42620180004206555f3562018000420662018000015500"), + } + + return nil +} + +// Configure specific test genesis accounts related to Cancun funtionality. +func ConfigTestAccounts(genesis *core.Genesis) error { + // Add accounts that use the DATAHASH opcode + datahashCode := []byte{ + 0x5F, // PUSH0 + 0x80, // DUP1 + 0x49, // DATAHASH + 0x55, // SSTORE + 0x60, // PUSH1(0x01) + 0x01, + 0x80, // DUP1 + 0x49, // DATAHASH + 0x55, // SSTORE + 0x60, // PUSH1(0x02) + 0x02, + 0x80, // DUP1 + 0x49, // DATAHASH + 0x55, // SSTORE + 0x60, // PUSH1(0x03) + 0x03, + 0x80, // DUP1 + 0x49, // DATAHASH + 0x55, // SSTORE + } + + for i := 0; i < DATAHASH_ADDRESS_COUNT; i++ { + address := common.BigToAddress(big.NewInt(0).Add(DATAHASH_START_ADDRESS, big.NewInt(int64(i)))) + // check first if the address is already in the genesis + if _, ok := genesis.Alloc[address]; ok { + panic(fmt.Errorf("reused address %s during genesis configuration for cancun", address.Hex())) + } + genesis.Alloc[address] = core.GenesisAccount{ + Code: datahashCode, + Balance: common.Big0, + } + } + + return nil +} diff --git a/simulators/ethereum/engine/config/fork.go b/simulators/ethereum/engine/config/fork.go new file mode 100644 index 0000000000..806aa825f8 --- /dev/null +++ b/simulators/ethereum/engine/config/fork.go @@ -0,0 +1,82 @@ +package config + +import ( + "math/big" + + "github.com/ethereum/go-ethereum/core/types" +) + +type Fork string + +const ( + NA Fork = "" + Paris Fork = "Paris" + Shanghai Fork = "Shanghai" + Cancun Fork = "Cancun" +) + +func (f Fork) PreviousFork() Fork { + switch f { + case Shanghai: + return Paris + case Cancun: + return Shanghai + default: + return NA + } +} + +type ForkConfig struct { + ShanghaiTimestamp *big.Int + CancunTimestamp *big.Int +} + +func (f *ForkConfig) IsShanghai(blockTimestamp uint64) bool { + return f.ShanghaiTimestamp != nil && new(big.Int).SetUint64(blockTimestamp).Cmp(f.ShanghaiTimestamp) >= 0 +} + +func (f *ForkConfig) IsCancun(blockTimestamp uint64) bool { + return f.CancunTimestamp != nil && new(big.Int).SetUint64(blockTimestamp).Cmp(f.CancunTimestamp) >= 0 +} + +func (f *ForkConfig) ForkchoiceUpdatedVersion(headTimestamp uint64, payloadAttributesTimestamp *uint64) int { + // If the payload attributes timestamp is nil, use the head timestamp + // to calculate the FcU version. + timestamp := headTimestamp + if payloadAttributesTimestamp != nil { + timestamp = *payloadAttributesTimestamp + } + + if f.IsCancun(timestamp) { + return 3 + } else if f.IsShanghai(timestamp) { + return 2 + } + return 1 +} + +func (f *ForkConfig) NewPayloadVersion(timestamp uint64) int { + if f.IsCancun(timestamp) { + return 3 + } else if f.IsShanghai(timestamp) { + return 2 + } + return 1 +} + +func (f *ForkConfig) GetPayloadVersion(timestamp uint64) int { + if f.IsCancun(timestamp) { + return 3 + } else if f.IsShanghai(timestamp) { + return 2 + } + return 1 +} + +func (f *ForkConfig) GetSupportedTransactionTypes(timestamp uint64) []int { + if f.IsCancun(timestamp) { + // Put the blob type at the start to try to guarantee at least one blob tx makes it into the test + return []int{types.BlobTxType, types.LegacyTxType /* types.AccessListTxType,*/, types.DynamicFeeTxType} + } + return []int{types.LegacyTxType /* types.AccessListTxType,*/, types.DynamicFeeTxType} +} diff --git a/simulators/ethereum/engine/config/genesis.go b/simulators/ethereum/engine/config/genesis.go new file mode 100644 index 0000000000..7fe0645900 --- /dev/null +++ b/simulators/ethereum/engine/config/genesis.go @@ -0,0 +1,30 @@ +package config + +import ( + "fmt" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/hive/simulators/ethereum/engine/config/cancun" +) + +func (f *ForkConfig) ConfigGenesis(genesis *core.Genesis) error { + if f.ShanghaiTimestamp != nil { + shanghaiTime := f.ShanghaiTimestamp.Uint64() + genesis.Config.ShanghaiTime = &shanghaiTime + + if genesis.Timestamp >= shanghaiTime { + // Remove PoW altogether + genesis.Difficulty = common.Big0 + genesis.Config.TerminalTotalDifficulty = common.Big0 + genesis.Config.Clique = nil + genesis.ExtraData = []byte{} + } + } + if f.CancunTimestamp != nil { + if err := cancun.ConfigGenesis(genesis, f.CancunTimestamp.Uint64()); err != nil { + return fmt.Errorf("failed to configure cancun fork: %v", err) + } + } + return nil +} diff --git a/simulators/ethereum/engine/globals/errors.go b/simulators/ethereum/engine/globals/errors.go new file mode 100644 index 0000000000..b13b624bba --- /dev/null +++ b/simulators/ethereum/engine/globals/errors.go @@ -0,0 +1,21 @@ +package globals + +var ( + // Engine API errors + SERVER_ERROR = pInt(-32000) + INVALID_REQUEST = pInt(-32600) + METHOD_NOT_FOUND = pInt(-32601) + INVALID_PARAMS_ERROR = pInt(-32602) + INTERNAL_ERROR = pInt(-32603) + INVALID_JSON = pInt(-32700) + + UNKNOWN_PAYLOAD = pInt(-38001) + INVALID_FORKCHOICE_STATE = pInt(-38002) + INVALID_PAYLOAD_ATTRIBUTES = pInt(-38003) + TOO_LARGE_REQUEST = pInt(-38004) + UNSUPPORTED_FORK_ERROR = pInt(-38005) +) + +func pInt(v int) *int { + return &v +} diff --git a/simulators/ethereum/engine/globals/globals.go b/simulators/ethereum/engine/globals/globals.go index 8a99c4e953..2fa21b9eec 100644 --- a/simulators/ethereum/engine/globals/globals.go +++ b/simulators/ethereum/engine/globals/globals.go @@ -2,41 +2,38 @@ package globals import ( "crypto/ecdsa" - "fmt" + "crypto/sha256" + "encoding/binary" "math/big" "time" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/params" "github.com/ethereum/hive/hivesim" ) type TestAccount struct { - KeyHex string - Address *common.Address - Key *ecdsa.PrivateKey + key *ecdsa.PrivateKey + address *common.Address + index uint64 } func (a *TestAccount) GetKey() *ecdsa.PrivateKey { - if a.Key == nil { - key, err := crypto.HexToECDSA(a.KeyHex) - if err != nil { - panic(err) - } - a.Key = key - } - return a.Key + return a.key } func (a *TestAccount) GetAddress() common.Address { - if a.Address == nil { - key := a.GetKey() + if a.address == nil { + key := a.key addr := crypto.PubkeyToAddress(key.PublicKey) - a.Address = &addr + a.address = &addr } - return *a.Address + return *a.address +} + +func (a *TestAccount) GetIndex() uint64 { + return a.index } var ( @@ -45,8 +42,9 @@ var ( ChainID = big.NewInt(7) GasPrice = big.NewInt(30 * params.GWei) GasTipPrice = big.NewInt(1 * params.GWei) + BlobGasPrice = big.NewInt(1 * params.GWei) NetworkID = big.NewInt(7) - GenesisTimestamp = int64(0x1234) + GenesisTimestamp = uint64(0x1234) // RPC Timeout for every call RPCTimeout = 10 * time.Second @@ -59,43 +57,9 @@ var ( DefaultJwtTokenSecretBytes = []byte("secretsecretsecretsecretsecretse") // secretsecretsecretsecretsecretse MaxTimeDriftSeconds = int64(60) - // This is the account that sends vault funding transactions. - VaultAccountAddress = common.HexToAddress("0xcf49fda3be353c69b41ed96333cd24302da4556f") - VaultKey, _ = crypto.HexToECDSA("63b508a03c3b5937ceb903af8b1b0c191012ef6eb7e9c3fb7afa94e5d214d376") - - // Accounts used for testing, including the vault account - TestAccounts = []*TestAccount{ - { - KeyHex: "63b508a03c3b5937ceb903af8b1b0c191012ef6eb7e9c3fb7afa94e5d214d376", - }, - { - KeyHex: "073786d6a43474fda30a10eb7b5c3a47a81dd1e2bf72cfb7f66d868ff4f9827c", - }, - { - KeyHex: "c99aa79d5b71da1ddbb020d9ca8c98fffb83b8317f4e06d9960e1ed102eaae73", - }, - { - KeyHex: "fcb29daf153be371a3cbaaf58ecd0c675b0ae83ca3ea61c33f71be795b007df1", - }, - { - KeyHex: "eac70caf07cca9ad271c9d80523b7e320013bd1d6bc941ef2b6eb51979323e62", - }, - { - KeyHex: "06ce09a48d7034b06b1c290ff88f26351d3d21001e82df46aaae9d2f6338b50d", - }, - { - KeyHex: "03f9ae8a83bbcbbbdc979ea4f22b040d82c5a32785488df63ec3066c8d89078a", - }, - { - KeyHex: "39731ae349b81dd5e7ad9f1e97e63883f4e469e46c5ce6aa6a1b6229a68a2c23", - }, - { - KeyHex: "f298d89779b49d5431162a40492b641f9c09d319fb0bdeffd94ad4b8919d9ccf", - }, - { - KeyHex: "c2a53ab2068f63f2fad05fa6b3b23ae997ceb68a4b7acac17c2354aeffb624a8", - }, - } + // Accounts used for testing + TestAccountCount = uint64(1000) + TestAccounts []*TestAccount // Global test case timeout DefaultTestCaseTimeout = time.Second * 60 @@ -133,84 +97,17 @@ var ( } ) -// Global types -type ForkConfig struct { - ShanghaiTimestamp *big.Int - CancunTimestamp *big.Int -} - -func (f *ForkConfig) ConfigGenesis(genesis *core.Genesis) error { - if f.ShanghaiTimestamp != nil { - shanghaiTime := f.ShanghaiTimestamp.Uint64() - genesis.Config.ShanghaiTime = &shanghaiTime - - if genesis.Timestamp >= shanghaiTime { - // Remove PoW altogether - genesis.Difficulty = common.Big0 - genesis.Config.TerminalTotalDifficulty = common.Big0 - genesis.Config.Clique = nil - genesis.ExtraData = []byte{} - } - } - if f.CancunTimestamp != nil { - if genesis.Config.ShanghaiTime == nil { - return fmt.Errorf("Cancun fork requires Shanghai fork") - } - cancunTime := f.CancunTimestamp.Uint64() - genesis.Config.CancunTime = &cancunTime - if *genesis.Config.ShanghaiTime > cancunTime { - return fmt.Errorf("Cancun fork must be after Shanghai fork") - } - if genesis.Timestamp >= cancunTime { - if genesis.BlobGasUsed == nil { - genesis.BlobGasUsed = new(uint64) - } - if genesis.ExcessBlobGas == nil { - genesis.ExcessBlobGas = new(uint64) - } +func init() { + // Fill the test accounts with deterministic addresses + TestAccounts = make([]*TestAccount, TestAccountCount) + for i := uint64(0); i < TestAccountCount; i++ { + bs := make([]byte, 8) + binary.BigEndian.PutUint64(bs, uint64(i)) + b := sha256.Sum256(bs) + k, err := crypto.ToECDSA(b[:]) + if err != nil { + panic(err) } + TestAccounts[i] = &TestAccount{key: k, index: i} } - return nil -} - -func (f *ForkConfig) IsShanghai(blockTimestamp uint64) bool { - return f.ShanghaiTimestamp != nil && new(big.Int).SetUint64(blockTimestamp).Cmp(f.ShanghaiTimestamp) >= 0 -} - -func (f *ForkConfig) IsCancun(blockTimestamp uint64) bool { - return f.CancunTimestamp != nil && new(big.Int).SetUint64(blockTimestamp).Cmp(f.CancunTimestamp) >= 0 -} - -func (f *ForkConfig) ForkchoiceUpdatedVersion(headTimestamp uint64, payloadAttributesTimestamp *uint64) int { - // If the payload attributes timestamp is nil, use the head timestamp - // to calculate the FcU version. - timestamp := headTimestamp - if payloadAttributesTimestamp != nil { - timestamp = *payloadAttributesTimestamp - } - - if f.IsCancun(timestamp) { - return 3 - } else if f.IsShanghai(timestamp) { - return 2 - } - return 1 -} - -func (f *ForkConfig) NewPayloadVersion(timestamp uint64) int { - if f.IsCancun(timestamp) { - return 3 - } else if f.IsShanghai(timestamp) { - return 2 - } - return 1 -} - -func (f *ForkConfig) GetPayloadVersion(timestamp uint64) int { - if f.IsCancun(timestamp) { - return 3 - } else if f.IsShanghai(timestamp) { - return 2 - } - return 1 } diff --git a/simulators/ethereum/engine/helper/blobs.go b/simulators/ethereum/engine/helper/blobs.go index c2d8f13aa0..9f89d5c044 100644 --- a/simulators/ethereum/engine/helper/blobs.go +++ b/simulators/ethereum/engine/helper/blobs.go @@ -2,7 +2,6 @@ package helper import ( "bytes" - "crypto/ecdsa" "crypto/sha256" "encoding/binary" "fmt" @@ -15,7 +14,6 @@ import ( gokzg4844 "github.com/crate-crypto/go-kzg-4844" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/hive/simulators/ethereum/engine/globals" typ "github.com/ethereum/hive/simulators/ethereum/engine/types" ) @@ -90,7 +88,6 @@ type BlobTransactionCreator struct { BlobCount uint64 Value *big.Int Data []byte - PrivateKey *ecdsa.PrivateKey } func (blobId BlobID) VerifyBlob(blob *typ.Blob) (bool, error) { @@ -250,14 +247,7 @@ func BlobDataGenerator(startBlobId BlobID, blobCount uint64) ([]common.Hash, *ty return hashes, &blobData, nil } -func (tc *BlobTransactionCreator) GetSourceAddress() common.Address { - if tc.PrivateKey == nil { - return globals.VaultAccountAddress - } - return crypto.PubkeyToAddress(tc.PrivateKey.PublicKey) -} - -func (tc *BlobTransactionCreator) MakeTransaction(nonce uint64) (typ.Transaction, error) { +func (tc *BlobTransactionCreator) MakeTransaction(sender SenderAccount, nonce uint64, blockTimestamp uint64) (typ.Transaction, error) { // Need tx wrap data that will pass blob verification hashes, blobData, err := BlobDataGenerator(tc.BlobID, tc.BlobCount) if err != nil { @@ -308,10 +298,7 @@ func (tc *BlobTransactionCreator) MakeTransaction(nonce uint64) (typ.Transaction BlobHashes: hashes, } - key := tc.PrivateKey - if key == nil { - key = globals.VaultKey - } + key := sender.GetKey() signedTx, err := types.SignNewTx(key, types.NewCancunSigner(globals.ChainID), sbtx) if err != nil { diff --git a/simulators/ethereum/engine/helper/customizer.go b/simulators/ethereum/engine/helper/customizer.go index 1a200b316e..b2be55f56c 100644 --- a/simulators/ethereum/engine/helper/customizer.go +++ b/simulators/ethereum/engine/helper/customizer.go @@ -11,23 +11,35 @@ import ( "github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/trie" + "github.com/ethereum/hive/simulators/ethereum/engine/client" + "github.com/ethereum/hive/simulators/ethereum/engine/config/cancun" "github.com/ethereum/hive/simulators/ethereum/engine/globals" typ "github.com/ethereum/hive/simulators/ethereum/engine/types" ) +type EngineAPIVersionResolver interface { + client.EngineAPIVersionResolver + SetEngineAPIVersionResolver(client.EngineAPIVersionResolver) +} + type GetPayloadCustomizer interface { + EngineAPIVersionResolver GetPayloadID(basePayloadID *api.PayloadID) (*api.PayloadID, error) - GetVersion(forkConfig *globals.ForkConfig, requestedTimestamp uint64) (int, error) GetExpectedError() (*int, error) } type BaseGetPayloadCustomizer struct { + client.EngineAPIVersionResolver CustomPayloadID *api.PayloadID ExpectedError *int } var _ GetPayloadCustomizer = (*BaseGetPayloadCustomizer)(nil) +func (customizer *BaseGetPayloadCustomizer) SetEngineAPIVersionResolver(v client.EngineAPIVersionResolver) { + customizer.EngineAPIVersionResolver = v +} + func (customizer *BaseGetPayloadCustomizer) GetPayloadID(basePayloadID *api.PayloadID) (*api.PayloadID, error) { if customizer.CustomPayloadID != nil { return customizer.CustomPayloadID, nil @@ -35,10 +47,6 @@ func (customizer *BaseGetPayloadCustomizer) GetPayloadID(basePayloadID *api.Payl return basePayloadID, nil } -func (customizer *BaseGetPayloadCustomizer) GetVersion(forkConfig *globals.ForkConfig, requestedTimestamp uint64) (int, error) { - return forkConfig.GetPayloadVersion(requestedTimestamp), nil -} - func (customizer *BaseGetPayloadCustomizer) GetExpectedError() (*int, error) { return customizer.ExpectedError, nil } @@ -49,15 +57,8 @@ type UpgradeGetPayloadVersion struct { var _ GetPayloadCustomizer = (*UpgradeGetPayloadVersion)(nil) -func (customizer *UpgradeGetPayloadVersion) GetVersion(forkConfig *globals.ForkConfig, requestedTimestamp uint64) (int, error) { - if customizer.GetPayloadCustomizer == nil { - return 0, fmt.Errorf("base customizer not set") - } - baseVersion, err := customizer.GetPayloadCustomizer.GetVersion(forkConfig, requestedTimestamp) - if err != nil { - return 0, err - } - return baseVersion + 1, nil +func (customizer *UpgradeGetPayloadVersion) GetPayloadVersion(timestamp uint64) int { + return customizer.GetPayloadCustomizer.GetPayloadVersion(timestamp) + 1 } type DowngradeGetPayloadVersion struct { @@ -66,18 +67,12 @@ type DowngradeGetPayloadVersion struct { var _ GetPayloadCustomizer = (*DowngradeGetPayloadVersion)(nil) -func (customizer *DowngradeGetPayloadVersion) GetVersion(forkConfig *globals.ForkConfig, requestedTimestamp uint64) (int, error) { - if customizer.GetPayloadCustomizer == nil { - return 0, fmt.Errorf("base customizer not set") - } - baseVersion, err := customizer.GetPayloadCustomizer.GetVersion(forkConfig, requestedTimestamp) - if err != nil { - return 0, err - } - if baseVersion == 1 { - return 1, fmt.Errorf("cannot downgrade version 1") +func (customizer *DowngradeGetPayloadVersion) GetPayloadVersion(timestamp uint64) int { + version := customizer.GetPayloadCustomizer.GetPayloadVersion(timestamp) + if version == 1 { + panic("cannot downgrade version 1") } - return baseVersion - 1, nil + return version - 1 } type PayloadAttributesCustomizer interface { @@ -85,9 +80,9 @@ type PayloadAttributesCustomizer interface { } type ForkchoiceUpdatedCustomizer interface { + EngineAPIVersionResolver PayloadAttributesCustomizer GetForkchoiceState(baseForkchoiceUpdate api.ForkchoiceStateV1) (api.ForkchoiceStateV1, error) - GetVersion(forkConfig *globals.ForkConfig, headTimestamp uint64, basePayloadAttributes *typ.PayloadAttributes) (int, error) GetExpectedError() (*int, error) GetExpectInvalidStatus() bool } @@ -153,6 +148,7 @@ func (customData *TimestampDeltaPayloadAttributesCustomizer) GetPayloadAttribute // Customizer that makes no modifications to the forkchoice directive call. // Used as base to other customizers. type BaseForkchoiceUpdatedCustomizer struct { + client.EngineAPIVersionResolver PayloadAttributesCustomizer ExpectedError *int ExpectInvalidStatus bool @@ -169,14 +165,9 @@ func (customizer *BaseForkchoiceUpdatedCustomizer) GetForkchoiceState(baseForkch return baseForkchoiceUpdate, nil } -func (customizer *BaseForkchoiceUpdatedCustomizer) GetVersion(forkConfig *globals.ForkConfig, headTimestamp uint64, basePayloadAttributes *typ.PayloadAttributes) (int, error) { - // We use the version meant for the head block unless there are payload attributes - // in which case we use the version meant for the new payload requested. - var payloadAttributesTimestamp *uint64 - if basePayloadAttributes != nil { - payloadAttributesTimestamp = &basePayloadAttributes.Timestamp - } - return forkConfig.ForkchoiceUpdatedVersion(headTimestamp, payloadAttributesTimestamp), nil +func (customizer *BaseForkchoiceUpdatedCustomizer) SetEngineAPIVersionResolver(v client.EngineAPIVersionResolver) { + // No-Op + customizer.EngineAPIVersionResolver = v } func (customizer *BaseForkchoiceUpdatedCustomizer) GetExpectedError() (*int, error) { @@ -196,15 +187,8 @@ type UpgradeForkchoiceUpdatedVersion struct { var _ ForkchoiceUpdatedCustomizer = (*UpgradeForkchoiceUpdatedVersion)(nil) -func (customizer *UpgradeForkchoiceUpdatedVersion) GetVersion(forkConfig *globals.ForkConfig, headTimestamp uint64, basePayloadAttributes *typ.PayloadAttributes) (int, error) { - if customizer.ForkchoiceUpdatedCustomizer == nil { - return 0, fmt.Errorf("base customizer not set") - } - baseVersion, err := customizer.ForkchoiceUpdatedCustomizer.GetVersion(forkConfig, headTimestamp, basePayloadAttributes) - if err != nil { - return 0, err - } - return baseVersion + 1, nil +func (customizer *UpgradeForkchoiceUpdatedVersion) ForkchoiceUpdatedVersion(headTimestamp uint64, payloadAttributesTimestamp *uint64) int { + return customizer.ForkchoiceUpdatedCustomizer.ForkchoiceUpdatedVersion(headTimestamp, payloadAttributesTimestamp) + 1 } // Customizer that downgrades the version of the forkchoice directive call to the previous version. @@ -212,24 +196,18 @@ type DowngradeForkchoiceUpdatedVersion struct { ForkchoiceUpdatedCustomizer } -var _ ForkchoiceUpdatedCustomizer = (*DowngradeForkchoiceUpdatedVersion)(nil) - -func (customizer *DowngradeForkchoiceUpdatedVersion) GetVersion(forkConfig *globals.ForkConfig, headTimestamp uint64, basePayloadAttributes *typ.PayloadAttributes) (int, error) { - if customizer.ForkchoiceUpdatedCustomizer == nil { - return 0, fmt.Errorf("base customizer not set") - } - baseVersion, err := customizer.ForkchoiceUpdatedCustomizer.GetVersion(forkConfig, headTimestamp, basePayloadAttributes) - if err != nil { - return 0, err - } - if baseVersion == 1 { - return 1, fmt.Errorf("cannot downgrade version 1") +func (customizer *DowngradeForkchoiceUpdatedVersion) ForkchoiceUpdatedVersion(headTimestamp uint64, payloadAttributesTimestamp *uint64) int { + version := customizer.ForkchoiceUpdatedCustomizer.ForkchoiceUpdatedVersion(headTimestamp, payloadAttributesTimestamp) + if version == 1 { + panic("cannot downgrade version 1") } - return baseVersion - 1, nil + return version - 1 } +var _ ForkchoiceUpdatedCustomizer = (*DowngradeForkchoiceUpdatedVersion)(nil) + type PayloadCustomizer interface { - CustomizePayload(basePayload *typ.ExecutableData, baseBeaconRoot *common.Hash) (modifiedPayload *typ.ExecutableData, modifiedBeaconRoot *common.Hash, err error) + CustomizePayload(basePayload *typ.ExecutableData) (*typ.ExecutableData, error) GetTimestamp(basePayload *typ.ExecutableData) (uint64, error) } @@ -237,37 +215,106 @@ type VersionedHashesCustomizer interface { GetVersionedHashes(baseVesionedHashes *[]common.Hash) (*[]common.Hash, error) } +type IncreaseVersionVersionedHashes struct{} + +func (customizer *IncreaseVersionVersionedHashes) GetVersionedHashes(baseVesionedHashes *[]common.Hash) (*[]common.Hash, error) { + if baseVesionedHashes == nil { + return nil, fmt.Errorf("no versioned hashes available for modification") + } + if len(*baseVesionedHashes) == 0 { + return nil, fmt.Errorf("no versioned hashes available for modification") + } + result := make([]common.Hash, len(*baseVesionedHashes)) + for i, h := range *baseVesionedHashes { + result[i] = h + result[i][0] = result[i][0] + 1 + } + return &result, nil +} + +type CorruptVersionedHashes struct{} + +func (customizer *CorruptVersionedHashes) GetVersionedHashes(baseVesionedHashes *[]common.Hash) (*[]common.Hash, error) { + if baseVesionedHashes == nil { + return nil, fmt.Errorf("no versioned hashes available for modification") + } + if len(*baseVesionedHashes) == 0 { + return nil, fmt.Errorf("no versioned hashes available for modification") + } + result := make([]common.Hash, len(*baseVesionedHashes)) + for i, h := range *baseVesionedHashes { + result[i] = h + result[i][len(h)-1] = result[i][len(h)-1] + 1 + } + return &result, nil +} + +type RemoveVersionedHash struct{} + +func (customizer *RemoveVersionedHash) GetVersionedHashes(baseVesionedHashes *[]common.Hash) (*[]common.Hash, error) { + if baseVesionedHashes == nil { + return nil, fmt.Errorf("no versioned hashes available for modification") + } + if len(*baseVesionedHashes) == 0 { + return nil, fmt.Errorf("no versioned hashes available for modification") + } + result := make([]common.Hash, len(*baseVesionedHashes)-1) + for i, h := range *baseVesionedHashes { + if i < len(*baseVesionedHashes)-1 { + result[i] = h + result[i][len(h)-1] = result[i][len(h)-1] + 1 + } + } + return &result, nil +} + +type ExtraVersionedHash struct{} + +func (customizer *ExtraVersionedHash) GetVersionedHashes(baseVesionedHashes *[]common.Hash) (*[]common.Hash, error) { + if baseVesionedHashes == nil { + return nil, fmt.Errorf("no versioned hashes available for modification") + } + result := make([]common.Hash, len(*baseVesionedHashes)+1) + copy(result, *baseVesionedHashes) + extraHash := common.Hash{} + rand.Read(extraHash[:]) + extraHash[0] = cancun.BLOB_COMMITMENT_VERSION_KZG + result[len(result)-1] = extraHash + + return &result, nil +} + type NewPayloadCustomizer interface { + EngineAPIVersionResolver PayloadCustomizer - VersionedHashesCustomizer - GetVersion(forkConfig *globals.ForkConfig, basePayload *typ.ExecutableData) (int, error) GetExpectedError() (*int, error) GetExpectInvalidStatus() bool } type CustomPayloadData struct { - ParentHash *common.Hash - FeeRecipient *common.Address - StateRoot *common.Hash - ReceiptsRoot *common.Hash - LogsBloom *[]byte - PrevRandao *common.Hash - Number *uint64 - GasLimit *uint64 - GasUsed *uint64 - Timestamp *uint64 - ExtraData *[]byte - BaseFeePerGas *big.Int - BlockHash *common.Hash - Transactions *[][]byte - Withdrawals types.Withdrawals - RemoveWithdrawals bool - BlobGasUsed *uint64 - RemoveBlobGasUsed bool - ExcessBlobGas *uint64 - RemoveExcessBlobGas bool - ParentBeaconRoot *common.Hash - RemoveParentBeaconRoot bool + ParentHash *common.Hash + FeeRecipient *common.Address + StateRoot *common.Hash + ReceiptsRoot *common.Hash + LogsBloom *[]byte + PrevRandao *common.Hash + Number *uint64 + GasLimit *uint64 + GasUsed *uint64 + Timestamp *uint64 + ExtraData *[]byte + BaseFeePerGas *big.Int + BlockHash *common.Hash + Transactions *[][]byte + Withdrawals types.Withdrawals + RemoveWithdrawals bool + BlobGasUsed *uint64 + RemoveBlobGasUsed bool + ExcessBlobGas *uint64 + RemoveExcessBlobGas bool + ParentBeaconRoot *common.Hash + RemoveParentBeaconRoot bool + VersionedHashesCustomizer VersionedHashesCustomizer } var _ PayloadCustomizer = (*CustomPayloadData)(nil) @@ -281,14 +328,14 @@ func (customData *CustomPayloadData) GetTimestamp(basePayload *typ.ExecutableDat // Construct a customized payload by taking an existing payload as base and mixing it CustomPayloadData // BlockHash is calculated automatically. -func (customData *CustomPayloadData) CustomizePayload(basePayload *typ.ExecutableData, baseBeaconRoot *common.Hash) (*typ.ExecutableData, *common.Hash, error) { +func (customData *CustomPayloadData) CustomizePayload(basePayload *typ.ExecutableData) (*typ.ExecutableData, error) { txs := basePayload.Transactions if customData.Transactions != nil { txs = *customData.Transactions } txsHash, err := calcTxsHash(txs) if err != nil { - return nil, nil, err + return nil, err } fmt.Printf("txsHash: %v\n", txsHash) // Start by filling the header with the basePayload information @@ -374,8 +421,8 @@ func (customData *CustomPayloadData) CustomizePayload(basePayload *typ.Executabl customPayloadHeader.ParentBeaconRoot = nil } else if customData.ParentBeaconRoot != nil { customPayloadHeader.ParentBeaconRoot = customData.ParentBeaconRoot - } else if baseBeaconRoot != nil { - customPayloadHeader.ParentBeaconRoot = baseBeaconRoot + } else if basePayload.ParentBeaconBlockRoot != nil { + customPayloadHeader.ParentBeaconRoot = basePayload.ParentBeaconBlockRoot } // Return the new payload @@ -396,7 +443,12 @@ func (customData *CustomPayloadData) CustomizePayload(basePayload *typ.Executabl Transactions: txs, BlobGasUsed: customPayloadHeader.BlobGasUsed, ExcessBlobGas: customPayloadHeader.ExcessBlobGas, + + // Metadata + ParentBeaconBlockRoot: customPayloadHeader.ParentBeaconRoot, + PayloadAttributes: basePayload.PayloadAttributes, } + if customData.RemoveWithdrawals { result.Withdrawals = nil } else if customData.Withdrawals != nil { @@ -404,47 +456,39 @@ func (customData *CustomPayloadData) CustomizePayload(basePayload *typ.Executabl } else if basePayload.Withdrawals != nil { result.Withdrawals = basePayload.Withdrawals } - return result, customPayloadHeader.ParentBeaconRoot, nil + + if customData.VersionedHashesCustomizer != nil { + result.VersionedHashes, err = customData.VersionedHashesCustomizer.GetVersionedHashes(basePayload.VersionedHashes) + if err != nil { + return nil, err + } + } else { + result.VersionedHashes = basePayload.VersionedHashes + } + + return result, nil } // Base new payload directive call customizer. // Used as base to other customizers. type BaseNewPayloadVersionCustomizer struct { + client.EngineAPIVersionResolver PayloadCustomizer - VersionedHashesCustomizer ExpectedError *int ExpectInvalidStatus bool } var _ NewPayloadCustomizer = (*BaseNewPayloadVersionCustomizer)(nil) -func (customNewPayload *BaseNewPayloadVersionCustomizer) CustomizePayload(basePayload *typ.ExecutableData, baseBeaconRoot *common.Hash) (*typ.ExecutableData, *common.Hash, error) { - if customNewPayload.PayloadCustomizer == nil { - return basePayload, baseBeaconRoot, nil - } - return customNewPayload.PayloadCustomizer.CustomizePayload(basePayload, baseBeaconRoot) -} - -func (customNewPayload *BaseNewPayloadVersionCustomizer) GetVersionedHashes(baseVersionedHashes *[]common.Hash) (*[]common.Hash, error) { - if customNewPayload.VersionedHashesCustomizer != nil { - return customNewPayload.VersionedHashesCustomizer.GetVersionedHashes(baseVersionedHashes) - } - return baseVersionedHashes, nil +func (customizer *BaseNewPayloadVersionCustomizer) SetEngineAPIVersionResolver(v client.EngineAPIVersionResolver) { + customizer.EngineAPIVersionResolver = v } -func (customNewPayload *BaseNewPayloadVersionCustomizer) GetVersion(forkConfig *globals.ForkConfig, basePayload *typ.ExecutableData) (int, error) { - var ( - timestamp = basePayload.Timestamp - err error - ) - if customNewPayload.PayloadCustomizer != nil { - timestamp, err = customNewPayload.PayloadCustomizer.GetTimestamp(basePayload) - if err != nil { - return 0, err - } +func (customNewPayload *BaseNewPayloadVersionCustomizer) CustomizePayload(basePayload *typ.ExecutableData) (*typ.ExecutableData, error) { + if customNewPayload.PayloadCustomizer == nil { + return basePayload, nil } - - return forkConfig.NewPayloadVersion(timestamp), nil + return customNewPayload.PayloadCustomizer.CustomizePayload(basePayload) } func (customNewPayload *BaseNewPayloadVersionCustomizer) GetExpectedError() (*int, error) { @@ -462,12 +506,8 @@ type UpgradeNewPayloadVersion struct { var _ NewPayloadCustomizer = (*UpgradeNewPayloadVersion)(nil) -func (customNewPayload *UpgradeNewPayloadVersion) GetVersion(forkConfig *globals.ForkConfig, basePayload *typ.ExecutableData) (int, error) { - if customNewPayload.NewPayloadCustomizer == nil { - return 0, fmt.Errorf("base customizer not set") - } - version, err := customNewPayload.NewPayloadCustomizer.GetVersion(forkConfig, basePayload) - return version + 1, err +func (customNewPayload *UpgradeNewPayloadVersion) NewPayloadVersion(timestamp uint64) int { + return customNewPayload.NewPayloadCustomizer.NewPayloadVersion(timestamp) + 1 } // Customizer that downgrades the version of the payload to the previous version. @@ -477,29 +517,26 @@ type DowngradeNewPayloadVersion struct { var _ NewPayloadCustomizer = (*DowngradeNewPayloadVersion)(nil) -func (customNewPayload *DowngradeNewPayloadVersion) GetVersion(forkConfig *globals.ForkConfig, basePayload *typ.ExecutableData) (int, error) { - if customNewPayload.NewPayloadCustomizer == nil { - return 0, fmt.Errorf("base customizer not set") - } - version, err := customNewPayload.NewPayloadCustomizer.GetVersion(forkConfig, basePayload) +func (customNewPayload *DowngradeNewPayloadVersion) NewPayloadVersion(timestamp uint64) int { + version := customNewPayload.NewPayloadCustomizer.NewPayloadVersion(timestamp) if version == 1 { - return 1, fmt.Errorf("cannot downgrade version 1") + panic("cannot downgrade version 1") } - return version - 1, err + return version - 1 } -func CustomizePayloadTransactions(basePayload *typ.ExecutableData, baseBeaconRoot *common.Hash, customTransactions types.Transactions) (*typ.ExecutableData, *common.Hash, error) { +func CustomizePayloadTransactions(basePayload *typ.ExecutableData, customTransactions types.Transactions) (*typ.ExecutableData, error) { byteTxs := make([][]byte, 0) for _, tx := range customTransactions { bytes, err := tx.MarshalBinary() if err != nil { - return nil, nil, err + return nil, err } byteTxs = append(byteTxs, bytes) } return (&CustomPayloadData{ Transactions: &byteTxs, - }).CustomizePayload(basePayload, baseBeaconRoot) + }).CustomizePayload(basePayload) } func (customData *CustomPayloadData) String() string { @@ -551,7 +588,7 @@ func (customData *CustomPayloadData) String() string { // This function generates an invalid payload by taking a base payload and modifying the specified field such that it ends up being invalid. // One small consideration is that the payload needs to contain transactions and specially transactions using the PREVRANDAO opcode for all the fields to be compatible with this function. -func GenerateInvalidPayload(basePayload *typ.ExecutableData, baseBeaconRoot *common.Hash, payloadField InvalidPayloadBlockField) (*typ.ExecutableData, *common.Hash, error) { +func GenerateInvalidPayload(basePayload *typ.ExecutableData, payloadField InvalidPayloadBlockField) (*typ.ExecutableData, error) { var customPayloadMod *CustomPayloadData switch payloadField { @@ -601,6 +638,71 @@ func GenerateInvalidPayload(basePayload *typ.ExecutableData, baseBeaconRoot *com customPayloadMod = &CustomPayloadData{ PrevRandao: &modPrevRandao, } + case InvalidParentBeaconBlockRoot: + if basePayload.ParentBeaconBlockRoot == nil { + return nil, fmt.Errorf("no parent beacon block root available for modification") + } + modParentBeaconBlockRoot := *basePayload.ParentBeaconBlockRoot + modParentBeaconBlockRoot[0] = byte(255 - modParentBeaconBlockRoot[0]) + customPayloadMod = &CustomPayloadData{ + ParentBeaconRoot: &modParentBeaconBlockRoot, + } + case InvalidBlobGasUsed: + if basePayload.BlobGasUsed == nil { + return nil, fmt.Errorf("no blob gas used available for modification") + } + modBlobGasUsed := *basePayload.BlobGasUsed + 1 + customPayloadMod = &CustomPayloadData{ + BlobGasUsed: &modBlobGasUsed, + } + case InvalidBlobCountGasUsed: + if basePayload.BlobGasUsed == nil { + return nil, fmt.Errorf("no blob gas used available for modification") + } + modBlobGasUsed := *basePayload.BlobGasUsed + cancun.GAS_PER_BLOB + customPayloadMod = &CustomPayloadData{ + BlobGasUsed: &modBlobGasUsed, + } + case InvalidExcessBlobGas: + if basePayload.ExcessBlobGas == nil { + return nil, fmt.Errorf("no excess blob gas available for modification") + } + modExcessBlobGas := *basePayload.ExcessBlobGas + 1 + customPayloadMod = &CustomPayloadData{ + ExcessBlobGas: &modExcessBlobGas, + } + case InvalidVersionedHashesVersion: + if basePayload.VersionedHashes == nil { + return nil, fmt.Errorf("no versioned hashes available for modification") + } + customPayloadMod = &CustomPayloadData{ + VersionedHashesCustomizer: &IncreaseVersionVersionedHashes{}, + } + case InvalidVersionedHashes: + if basePayload.VersionedHashes == nil { + return nil, fmt.Errorf("no versioned hashes available for modification") + } + customPayloadMod = &CustomPayloadData{ + VersionedHashesCustomizer: &CorruptVersionedHashes{}, + } + case IncompleteVersionedHashes: + if basePayload.VersionedHashes == nil { + return nil, fmt.Errorf("no versioned hashes available for modification") + } + customPayloadMod = &CustomPayloadData{ + VersionedHashesCustomizer: &RemoveVersionedHash{}, + } + case ExtraVersionedHashes: + if basePayload.VersionedHashes == nil { + return nil, fmt.Errorf("no versioned hashes available for modification") + } + customPayloadMod = &CustomPayloadData{ + VersionedHashesCustomizer: &ExtraVersionedHash{}, + } + case InvalidWithdrawals: + // These options are not supported yet. + // TODO: Implement + return nil, fmt.Errorf("invalid payload field %v not supported yet", payloadField) case RemoveTransaction: emptyTxs := make([][]byte, 0) customPayloadMod = &CustomPayloadData{ @@ -615,11 +717,11 @@ func GenerateInvalidPayload(basePayload *typ.ExecutableData, baseBeaconRoot *com InvalidTransactionChainID: if len(basePayload.Transactions) == 0 { - return nil, nil, fmt.Errorf("no transactions available for modification") + return nil, fmt.Errorf("no transactions available for modification") } var baseTx types.Transaction if err := baseTx.UnmarshalBinary(basePayload.Transactions[0]); err != nil { - return nil, nil, err + return nil, err } var customTxData CustomTransactionData switch payloadField { @@ -648,14 +750,14 @@ func GenerateInvalidPayload(basePayload *typ.ExecutableData, baseBeaconRoot *com customTxData.ChainID = customChainID } - modifiedTx, err := customizeTransaction(&baseTx, globals.VaultKey, &customTxData) + modifiedTx, err := CustomizeTransaction(&baseTx, globals.TestAccounts[0], &customTxData) if err != nil { - return nil, nil, err + return nil, err } modifiedTxBytes, err := modifiedTx.MarshalBinary() if err != nil { - return nil, nil, err + return nil, err } modifiedTransactions := [][]byte{ modifiedTxBytes, @@ -667,10 +769,10 @@ func GenerateInvalidPayload(basePayload *typ.ExecutableData, baseBeaconRoot *com if customPayloadMod == nil { copyPayload := *basePayload - return ©Payload, nil, nil + return ©Payload, nil } - return customPayloadMod.CustomizePayload(basePayload, baseBeaconRoot) + return customPayloadMod.CustomizePayload(basePayload) } /* diff --git a/simulators/ethereum/engine/helper/helper.go b/simulators/ethereum/engine/helper/helper.go index 7a2125e7eb..0904fced5d 100644 --- a/simulators/ethereum/engine/helper/helper.go +++ b/simulators/ethereum/engine/helper/helper.go @@ -85,6 +85,14 @@ const ( InvalidPrevRandao = "PrevRandao" InvalidOmmers = "Ommers" InvalidWithdrawals = "Withdrawals" + InvalidBlobGasUsed = "BlobGasUsed" + InvalidBlobCountGasUsed = "Blob Count on BlobGasUsed" + InvalidExcessBlobGas = "ExcessBlobGas" + InvalidParentBeaconBlockRoot = "ParentBeaconBlockRoot" + InvalidVersionedHashes = "VersionedHashes" + InvalidVersionedHashesVersion = "VersionedHashes Version" + IncompleteVersionedHashes = "Incomplete VersionedHashes" + ExtraVersionedHashes = "Extra VersionedHashes" RemoveTransaction = "Incomplete Transactions" InvalidTransactionSignature = "Transaction Signature" InvalidTransactionNonce = "Transaction Nonce" diff --git a/simulators/ethereum/engine/helper/tx.go b/simulators/ethereum/engine/helper/tx.go index 3521d9f301..5f1b66c5bc 100644 --- a/simulators/ethereum/engine/helper/tx.go +++ b/simulators/ethereum/engine/helper/tx.go @@ -7,15 +7,19 @@ import ( "fmt" "math/big" "strings" + "sync" "time" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/crypto/kzg4844" "github.com/ethereum/go-ethereum/trie" "github.com/ethereum/hive/simulators/ethereum/engine/client" + "github.com/ethereum/hive/simulators/ethereum/engine/config" + "github.com/ethereum/hive/simulators/ethereum/engine/config/cancun" "github.com/ethereum/hive/simulators/ethereum/engine/globals" typ "github.com/ethereum/hive/simulators/ethereum/engine/types" + "github.com/holiman/uint256" "github.com/pkg/errors" ) @@ -45,7 +49,7 @@ type CustomTransactionData struct { Signature *SignatureValues } -func customizeTransaction(baseTransaction *types.Transaction, pk *ecdsa.PrivateKey, customData *CustomTransactionData) (*types.Transaction, error) { +func CustomizeTransaction(baseTransaction *types.Transaction, sender SenderAccount, customData *CustomTransactionData) (*types.Transaction, error) { // Create a modified transaction base, from the base transaction and customData mix var ( modifiedTxData types.TxData @@ -142,6 +146,58 @@ func customizeTransaction(baseTransaction *types.Transaction, pk *ecdsa.PrivateK } modifiedTxData = modifiedDynamicFeeTxBase + case types.BlobTxType: + modifiedBlobTxBase := &types.BlobTx{} + + if customData.Nonce != nil { + modifiedBlobTxBase.Nonce = *customData.Nonce + } else { + modifiedBlobTxBase.Nonce = baseTransaction.Nonce() + } + if customData.GasPriceOrGasFeeCap != nil { + modifiedBlobTxBase.GasFeeCap = uint256.MustFromBig(customData.GasPriceOrGasFeeCap) + } else { + modifiedBlobTxBase.GasFeeCap = uint256.MustFromBig(baseTransaction.GasFeeCap()) + } + if customData.GasTipCap != nil { + modifiedBlobTxBase.GasTipCap = uint256.MustFromBig(customData.GasTipCap) + } else { + modifiedBlobTxBase.GasTipCap = uint256.MustFromBig(baseTransaction.GasTipCap()) + } + if customData.Gas != nil { + modifiedBlobTxBase.Gas = *customData.Gas + } else { + modifiedBlobTxBase.Gas = baseTransaction.Gas() + } + to := customData.To + if to == nil { + to = baseTransaction.To() + } + if to == nil { + to = &common.Address{} + } + modifiedBlobTxBase.To = *to + if customData.Value != nil { + modifiedBlobTxBase.Value = uint256.MustFromBig(customData.Value) + } else { + modifiedBlobTxBase.Value = uint256.MustFromBig(baseTransaction.Value()) + } + if customData.Data != nil { + modifiedBlobTxBase.Data = *customData.Data + } else { + modifiedBlobTxBase.Data = baseTransaction.Data() + } + modifiedBlobTxBase.AccessList = baseTransaction.AccessList() + modifiedBlobTxBase.BlobFeeCap = uint256.MustFromBig(baseTransaction.BlobGasFeeCap()) + modifiedBlobTxBase.BlobHashes = baseTransaction.BlobHashes() + modifiedBlobTxBase.Sidecar = baseTransaction.BlobTxSidecar() + if customData.Signature != nil { + modifiedBlobTxBase.V = uint256.MustFromBig(customData.Signature.V) + modifiedBlobTxBase.R = uint256.MustFromBig(customData.Signature.R) + modifiedBlobTxBase.S = uint256.MustFromBig(customData.Signature.S) + } + + modifiedTxData = modifiedBlobTxBase } @@ -152,9 +208,9 @@ func customizeTransaction(baseTransaction *types.Transaction, pk *ecdsa.PrivateK // Use the default value if an invaild chain ID was not specified customData.ChainID = globals.ChainID } - signer := types.NewLondonSigner(customData.ChainID) + signer := types.NewCancunSigner(customData.ChainID) var err error - if modifiedTx, err = types.SignTx(modifiedTx, signer, pk); err != nil { + if modifiedTx, err = types.SignTx(modifiedTx, signer, sender.GetKey()); err != nil { return nil, err } } @@ -174,53 +230,63 @@ func calcTxsHash(txsBytes [][]byte) (common.Hash, error) { return types.DeriveSha(types.Transactions(txs), trie.NewStackTrie(nil)), nil } -type TestTransactionType int +type TestTransactionType string const ( - UnspecifiedTransactionType TestTransactionType = iota - LegacyTxOnly - DynamicFeeTxOnly + UnspecifiedTransactionType TestTransactionType = "" + LegacyTxOnly TestTransactionType = "LegacyTransactions" + DynamicFeeTxOnly TestTransactionType = "DynamicFeeTransactions" + BlobTxOnly TestTransactionType = "BlobTransactions" ) +type SenderAccount interface { + GetKey() *ecdsa.PrivateKey + GetAddress() common.Address + GetIndex() uint64 +} + type TransactionCreator interface { - MakeTransaction(nonce uint64) (typ.Transaction, error) - GetSourceAddress() common.Address + MakeTransaction(sender SenderAccount, nonce uint64, blockTimestamp uint64) (typ.Transaction, error) } type BaseTransactionCreator struct { Recipient *common.Address + GasFee *big.Int + GasTip *big.Int GasLimit uint64 + BlobGasFee *big.Int + BlobCount *big.Int Amount *big.Int Payload []byte + AccessList types.AccessList TxType TestTransactionType - PrivateKey *ecdsa.PrivateKey + ForkConfig *config.ForkConfig } -func (tc *BaseTransactionCreator) GetSourceAddress() common.Address { - if tc.PrivateKey == nil { - return globals.VaultAccountAddress - } - return crypto.PubkeyToAddress(tc.PrivateKey.PublicKey) -} - -func (tc *BaseTransactionCreator) MakeTransaction(nonce uint64) (typ.Transaction, error) { +func (tc *BaseTransactionCreator) MakeTransaction(sender SenderAccount, nonce uint64, blockTimestamp uint64) (typ.Transaction, error) { var newTxData types.TxData + // Determine the type of transaction to use var txTypeToUse int switch tc.TxType { case UnspecifiedTransactionType: // Test case has no specific type of transaction to use. - // Select the type of tx based on the nonce. - switch nonce % 2 { - case 0: + // Select the type of tx based on the nonce and the account index. + if tc.ForkConfig == nil { + return nil, fmt.Errorf("fork config is nil") + } + forkSupportedTransactionTypes := tc.ForkConfig.GetSupportedTransactionTypes(blockTimestamp) + txTypeToUse = forkSupportedTransactionTypes[int(sender.GetIndex()+nonce)%len(forkSupportedTransactionTypes)] + if txTypeToUse == types.BlobTxType && tc.Recipient == nil { + // Blob txs require a recipient, revert to legacy tx txTypeToUse = types.LegacyTxType - case 1: - txTypeToUse = types.DynamicFeeTxType } case LegacyTxOnly: txTypeToUse = types.LegacyTxType case DynamicFeeTxOnly: txTypeToUse = types.DynamicFeeTxType + case BlobTxOnly: + txTypeToUse = types.BlobTxType } // Build the transaction depending on the specified type @@ -235,8 +301,20 @@ func (tc *BaseTransactionCreator) MakeTransaction(nonce uint64) (typ.Transaction Data: tc.Payload, } case types.DynamicFeeTxType: - gasFeeCap := new(big.Int).Set(globals.GasPrice) - gasTipCap := new(big.Int).Set(globals.GasTipPrice) + var ( + gasFeeCap *big.Int + gasTipCap *big.Int + ) + if tc.GasFee != nil { + gasFeeCap = tc.GasFee + } else { + gasFeeCap = new(big.Int).Set(globals.GasPrice) + } + if tc.GasTip != nil { + gasTipCap = tc.GasTip + } else { + gasTipCap = new(big.Int).Set(globals.GasTipPrice) + } newTxData = &types.DynamicFeeTx{ Nonce: nonce, Gas: tc.GasLimit, @@ -246,14 +324,79 @@ func (tc *BaseTransactionCreator) MakeTransaction(nonce uint64) (typ.Transaction Value: tc.Amount, Data: tc.Payload, } + case types.BlobTxType: + if tc.Recipient == nil { + return nil, errors.New("nil to address for blob transaction") + } + var ( + to = *tc.Recipient + chainID = uint256.MustFromBig(globals.ChainID) + gasFeeCap *uint256.Int + gasTipCap *uint256.Int + value *uint256.Int + blobGasFee *uint256.Int + blobCount uint64 + ) + if tc.GasFee != nil { + gasFeeCap = uint256.MustFromBig(tc.GasFee) + } else { + gasFeeCap = uint256.MustFromBig(globals.GasPrice) + } + if tc.GasTip != nil { + gasTipCap = uint256.MustFromBig(tc.GasTip) + } else { + gasTipCap = uint256.MustFromBig(globals.GasTipPrice) + } + if tc.Amount != nil { + value = uint256.MustFromBig(tc.Amount) + } + if tc.BlobGasFee != nil { + blobGasFee = uint256.MustFromBig(tc.BlobGasFee) + } else { + blobGasFee = uint256.MustFromBig(globals.BlobGasPrice) + } + if tc.BlobCount != nil { + blobCount = tc.BlobCount.Uint64() + } else { + blobCount = cancun.MAX_BLOBS_PER_BLOCK + } + + // Need tx wrap data that will pass blob verification + hashes, blobData, err := BlobDataGenerator(BlobID(nonce), blobCount) + if err != nil { + return nil, err + } + sidecar := &types.BlobTxSidecar{} + if blobData != nil { + sidecar.Blobs = make([]kzg4844.Blob, len(blobData.Blobs)) + sidecar.Commitments = make([]kzg4844.Commitment, len(blobData.Commitments)) + sidecar.Proofs = make([]kzg4844.Proof, len(blobData.Proofs)) + for i := range blobData.Blobs { + sidecar.Blobs[i] = kzg4844.Blob(blobData.Blobs[i]) + sidecar.Commitments[i] = kzg4844.Commitment(blobData.Commitments[i]) + sidecar.Proofs[i] = kzg4844.Proof(blobData.Proofs[i]) + } + } + + newTxData = &types.BlobTx{ + ChainID: chainID, + Nonce: nonce, + GasTipCap: gasTipCap, + GasFeeCap: gasFeeCap, + Gas: tc.GasLimit, + To: to, + Value: value, + Data: tc.Payload, + AccessList: tc.AccessList, + BlobFeeCap: blobGasFee, + BlobHashes: hashes, + Sidecar: sidecar, + } } tx := types.NewTx(newTxData) - key := tc.PrivateKey - if key == nil { - key = globals.VaultKey - } - return types.SignTx(tx, types.NewLondonSigner(globals.ChainID), key) + key := sender.GetKey() + return types.SignTx(tx, types.NewCancunSigner(globals.ChainID), key) } // Create a contract filled with zeros without going over the specified GasLimit @@ -261,7 +404,7 @@ type BigContractTransactionCreator struct { BaseTransactionCreator } -func (tc *BigContractTransactionCreator) MakeTransaction(nonce uint64) (typ.Transaction, error) { +func (tc *BigContractTransactionCreator) MakeTransaction(sender SenderAccount, nonce uint64, blockTimestamp uint64) (typ.Transaction, error) { // Total GAS: Gtransaction == 21000, Gcreate == 32000, Gcodedeposit == 200 contractLength := uint64(0) if tc.GasLimit > (21000 + 32000) { @@ -283,7 +426,7 @@ func (tc *BigContractTransactionCreator) MakeTransaction(nonce uint64) (typ.Tran if tc.Recipient != nil { panic("invalid configuration for big contract tx creator") } - return tc.BaseTransactionCreator.MakeTransaction(nonce) + return tc.BaseTransactionCreator.MakeTransaction(sender, nonce, blockTimestamp) } // Create a tx with the specified initcode length (all zeros) @@ -294,7 +437,7 @@ type BigInitcodeTransactionCreator struct { Initcode []byte } -func (tc *BigInitcodeTransactionCreator) MakeTransaction(nonce uint64) (typ.Transaction, error) { +func (tc *BigInitcodeTransactionCreator) MakeTransaction(sender SenderAccount, nonce uint64, blockTimestamp uint64) (typ.Transaction, error) { // This method caches the payload with the crafted initcode after first execution. if tc.Payload == nil { // Prepare initcode payload @@ -317,7 +460,7 @@ func (tc *BigInitcodeTransactionCreator) MakeTransaction(nonce uint64) (typ.Tran if tc.Recipient != nil { panic("invalid configuration for big contract tx creator") } - return tc.BaseTransactionCreator.MakeTransaction(nonce) + return tc.BaseTransactionCreator.MakeTransaction(sender, nonce, blockTimestamp) } // Determines if the error we got from sending the raw tx is because the client @@ -328,12 +471,63 @@ func SentTxAlreadyKnown(err error) bool { strings.Contains(err.Error(), "AlreadyKnown") } -func SendNextTransaction(testCtx context.Context, node client.EngineClient, txCreator TransactionCreator) (typ.Transaction, error) { - nonce, err := node.GetNextAccountNonce(testCtx, txCreator.GetSourceAddress()) +type TransactionSender struct { + Accounts []SenderAccount + nonceMap map[common.Address]uint64 + nonceMapLock sync.Mutex + transactionsSent int +} + +func NewTransactionSender(accounts []*globals.TestAccount, disableInternalNonceCounter bool) *TransactionSender { + sender := &TransactionSender{ + Accounts: make([]SenderAccount, len(accounts)), + } + for i, account := range accounts { + sender.Accounts[i] = account + } + if !disableInternalNonceCounter { + sender.nonceMap = make(map[common.Address]uint64) + } + return sender +} + +func (txSender *TransactionSender) GetNextNonce(ctx context.Context, node client.EngineClient, sender SenderAccount, header *types.Header) (uint64, error) { + var err error + nonce := uint64(0) + if txSender.nonceMap != nil { + txSender.nonceMapLock.Lock() + defer txSender.nonceMapLock.Unlock() + nonce = txSender.nonceMap[sender.GetAddress()] + txSender.nonceMap[sender.GetAddress()] = nonce + 1 + } else { + nonce, err = node.GetNextAccountNonce(ctx, sender.GetAddress(), header) + if err != nil { + return 0, err + } + } + return nonce, nil +} + +func (txSender *TransactionSender) GetLastNonce(ctx context.Context, node client.EngineClient, sender SenderAccount, header *types.Header) (uint64, error) { + if txSender.nonceMap != nil { + txSender.nonceMapLock.Lock() + defer txSender.nonceMapLock.Unlock() + return txSender.nonceMap[sender.GetAddress()], nil + } else { + return node.GetLastAccountNonce(ctx, sender.GetAddress(), header) + } +} + +func (txSender *TransactionSender) SendTransaction(testCtx context.Context, account SenderAccount, node client.EngineClient, txCreator TransactionCreator) (typ.Transaction, error) { + header, err := node.HeaderByNumber(testCtx, nil) + if err != nil { + return nil, errors.Wrap(err, "error getting header") + } + nonce, err := txSender.GetNextNonce(testCtx, node, account, header) if err != nil { return nil, errors.Wrap(err, "error getting next account nonce") } - tx, err := txCreator.MakeTransaction(nonce) + tx, err := txCreator.MakeTransaction(account, nonce, header.Time) if err != nil { return nil, errors.Wrap(err, "error crafting transaction") } @@ -341,10 +535,8 @@ func SendNextTransaction(testCtx context.Context, node client.EngineClient, txCr ctx, cancel := context.WithTimeout(testCtx, globals.RPCTimeout) defer cancel() err := node.SendTransaction(ctx, tx) - if err == nil { - return tx, nil - } else if SentTxAlreadyKnown(err) { - return tx, nil + if err == nil || SentTxAlreadyKnown(err) { + break } select { case <-time.After(time.Second): @@ -352,21 +544,100 @@ func SendNextTransaction(testCtx context.Context, node client.EngineClient, txCr return nil, errors.Wrapf(testCtx.Err(), "timeout retrying SendTransaction, last error: %v", err) } } + return tx, nil +} + +func (txSender *TransactionSender) SendNextTransaction(testCtx context.Context, node client.EngineClient, txCreator TransactionCreator) (typ.Transaction, error) { + nextAccount := txSender.Accounts[txSender.transactionsSent%len(txSender.Accounts)] + tx, err := txSender.SendTransaction(testCtx, nextAccount, node, txCreator) + if err != nil { + return nil, err + } + txSender.transactionsSent += 1 + return tx, nil } -func SendNextTransactions(testCtx context.Context, node client.EngineClient, txCreator TransactionCreator, txCount uint64) ([]typ.Transaction, error) { +func (txSender *TransactionSender) SendNextTransactions(testCtx context.Context, node client.EngineClient, txCreator TransactionCreator, txCount uint64) ([]typ.Transaction, error) { var err error - nonce, err := node.GetNextAccountNonce(testCtx, txCreator.GetSourceAddress()) + header, err := node.HeaderByNumber(testCtx, nil) if err != nil { - return nil, errors.Wrap(err, "error getting next account nonce") + return nil, errors.Wrap(err, "error getting header") + } + + txs := make([]typ.Transaction, txCount) + + wg := sync.WaitGroup{} + wgDone := make(chan interface{}) + errs := make(chan error, txCount) + for i := range txs { + wg.Add(1) + i := i + sender := txSender.Accounts[txSender.transactionsSent%len(txSender.Accounts)] + go func(sender SenderAccount) { + defer wg.Done() + nonce, err := txSender.GetNextNonce(testCtx, node, sender, header) + if err != nil { + errs <- errors.Wrap(err, "error getting next account nonce") + return + } + + txs[i], err = txCreator.MakeTransaction(sender, nonce, header.Time) + if err != nil { + errs <- errors.Wrap(err, "error crafting transaction") + } + for { + ctx, cancel := context.WithTimeout(testCtx, globals.RPCTimeout) + defer cancel() + err := node.SendTransaction(ctx, txs[i]) + if err == nil { + break + } else if SentTxAlreadyKnown(err) { + break + } + select { + case <-time.After(time.Second): + case <-testCtx.Done(): + errs <- errors.Wrapf(testCtx.Err(), "timeout retrying SendTransaction (%d), last error: %v", i, err) + return + } + } + }(sender) + txSender.transactionsSent += 1 + } + go func() { + wg.Wait() + close(wgDone) + }() + select { + case <-wgDone: + return txs, nil + case err := <-errs: + return nil, errors.Wrap(err, "error sending transaction") + case <-testCtx.Done(): + return txs, errors.Wrapf(testCtx.Err(), "timeout waiting for SendTransactions") + } +} + +func (txSender *TransactionSender) SendNextTransactionsBatch(testCtx context.Context, node client.EngineClient, txCreator TransactionCreator, txCount uint64) ([]typ.Transaction, error) { + var err error + header, err := node.HeaderByNumber(testCtx, nil) + if err != nil { + return nil, errors.Wrap(err, "error getting header") } + txs := make([]typ.Transaction, txCount) + for i := range txs { - txs[i], err = txCreator.MakeTransaction(nonce) + nextAccount := txSender.Accounts[txSender.transactionsSent%len(txSender.Accounts)] + nonce, err := txSender.GetNextNonce(testCtx, node, nextAccount, header) + if err != nil { + return nil, errors.Wrap(err, "error getting next account nonce") + } + txs[i], err = txCreator.MakeTransaction(nextAccount, nonce, header.Time) if err != nil { return nil, errors.Wrap(err, "error crafting transaction") } - nonce++ + txSender.transactionsSent += 1 } ctx, cancel := context.WithTimeout(testCtx, globals.RPCTimeout) defer cancel() @@ -376,16 +647,19 @@ func SendNextTransactions(testCtx context.Context, node client.EngineClient, txC return txs, errors.Wrap(err, "error on SendTransactions") } } - node.UpdateNonce(testCtx, txCreator.GetSourceAddress(), nonce+txCount) return txs, nil } -func ReplaceLastTransaction(testCtx context.Context, node client.EngineClient, txCreator TransactionCreator) (typ.Transaction, error) { - nonce, err := node.GetLastAccountNonce(testCtx, txCreator.GetSourceAddress()) +func (txSender *TransactionSender) ReplaceTransaction(testCtx context.Context, account SenderAccount, node client.EngineClient, txCreator TransactionCreator) (typ.Transaction, error) { + header, err := node.HeaderByNumber(testCtx, nil) + if err != nil { + return nil, errors.Wrap(err, "error getting header") + } + nonce, err := txSender.GetLastNonce(testCtx, node, account, header) if err != nil { return nil, errors.Wrap(err, "error getting last account nonce") } - tx, err := txCreator.MakeTransaction(nonce) + tx, err := txCreator.MakeTransaction(account, nonce, header.Time) if err != nil { return nil, errors.Wrap(err, "error crafting transaction") } @@ -405,3 +679,11 @@ func ReplaceLastTransaction(testCtx context.Context, node client.EngineClient, t } } } + +func (txSender *TransactionSender) ReplaceLastTransaction(testCtx context.Context, node client.EngineClient, txCreator TransactionCreator) (typ.Transaction, error) { + if txSender.transactionsSent == 0 { + return nil, errors.New("no transactions sent yet") + } + lastSender := txSender.Accounts[(txSender.transactionsSent-1)%len(txSender.Accounts)] + return txSender.ReplaceTransaction(testCtx, lastSender, node, txCreator) +} diff --git a/simulators/ethereum/engine/main.go b/simulators/ethereum/engine/main.go index 1af733828f..4790a8e98b 100644 --- a/simulators/ethereum/engine/main.go +++ b/simulators/ethereum/engine/main.go @@ -54,8 +54,8 @@ func main() { simulator := hivesim.New() - addTestsToSuite(simulator, &engine, specToInterface(suite_engine.Tests), "full") - addTestsToSuite(simulator, &auth, specToInterface(suite_auth.Tests), "full") + addTestsToSuite(simulator, &engine, suite_engine.Tests, "full") + addTestsToSuite(simulator, &auth, suite_auth.Tests, "full") addTestsToSuite(simulator, &excap, suite_ex_cap.Tests, "full") //suite_sync.AddSyncTestsToSuite(simulator, &sync, suite_sync.Tests) addTestsToSuite(simulator, &withdrawals, suite_withdrawals.Tests, "full") @@ -70,22 +70,19 @@ func main() { hivesim.MustRunSuite(simulator, cancun) } -func specToInterface(src []test.Spec) []test.SpecInterface { - res := make([]test.SpecInterface, len(src)) - for i := 0; i < len(src); i++ { - res[i] = src[i] - } - return res -} - // Add test cases to a given test suite -func addTestsToSuite(sim *hivesim.Simulation, suite *hivesim.Suite, tests []test.SpecInterface, nodeType string) { +func addTestsToSuite(sim *hivesim.Simulation, suite *hivesim.Suite, tests []test.Spec, nodeType string) { for _, currentTest := range tests { currentTest := currentTest - + currentTestName := fmt.Sprintf("%s (%s)", currentTest.GetName(), currentTest.GetMainFork()) // Load the genesis file specified and dynamically bundle it. genesis := currentTest.GetGenesis() forkConfig := currentTest.GetForkConfig() + if forkConfig == nil { + // Test cannot be configured as is for current fork, skip + fmt.Printf("skipping test \"%s\" because fork configuration is not possible\n", currentTestName) + continue + } forkConfig.ConfigGenesis(genesis) genesisStartOption, err := helper.GenesisStartOption(genesis) if err != nil { @@ -136,7 +133,7 @@ func addTestsToSuite(sim *hivesim.Simulation, suite *hivesim.Suite, tests []test if clientTypes, err := sim.ClientTypes(); err == nil { for _, clientType := range clientTypes { suite.Add(hivesim.TestSpec{ - Name: fmt.Sprintf("%s (%s)", currentTest.GetName(), clientType.Name), + Name: fmt.Sprintf("%s (%s)", currentTestName, clientType.Name), Description: currentTest.GetAbout(), Run: func(t *hivesim.T) { // Start the client with given options @@ -146,9 +143,9 @@ func addTestsToSuite(sim *hivesim.Simulation, suite *hivesim.Suite, tests []test genesisStartOption, hivesim.WithStaticFiles(testFiles), ) - t.Logf("Start test (%s): %s", c.Type, currentTest.GetName()) + t.Logf("Start test (%s): %s", c.Type, currentTestName) defer func() { - t.Logf("End test (%s): %s", c.Type, currentTest.GetName()) + t.Logf("End test (%s): %s", c.Type, currentTestName) }() timeout := globals.DefaultTestCaseTimeout // If a test.Spec specifies a timeout, use that instead @@ -163,7 +160,6 @@ func addTestsToSuite(sim *hivesim.Simulation, suite *hivesim.Suite, tests []test t, c, genesis, - &forkConfig, newParams, testFiles, ) diff --git a/simulators/ethereum/engine/suites/auth/tests.go b/simulators/ethereum/engine/suites/auth/tests.go index d3e563d554..ac9ae537a2 100644 --- a/simulators/ethereum/engine/suites/auth/tests.go +++ b/simulators/ethereum/engine/suites/auth/tests.go @@ -4,64 +4,72 @@ import ( "context" "time" + api "github.com/ethereum/go-ethereum/beacon/engine" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" - api "github.com/ethereum/go-ethereum/beacon/engine" + "github.com/ethereum/hive/simulators/ethereum/engine/config" "github.com/ethereum/hive/simulators/ethereum/engine/globals" "github.com/ethereum/hive/simulators/ethereum/engine/test" ) // JWT Authentication Tests -type AuthTestSpec struct { - Name string - TimeDriftSeconds int64 - CustomAuthSecretBytes []byte - AuthOk bool - RetryAttempts int64 -} -var authTestSpecs = []AuthTestSpec{ - { - Name: "JWT Authentication: No time drift, correct secret", +var Tests = []test.Spec{ + AuthTestSpec{ + BaseSpec: test.BaseSpec{ + Name: "JWT Authentication: No time drift, correct secret", + }, TimeDriftSeconds: 0, CustomAuthSecretBytes: nil, AuthOk: true, }, - { - Name: "JWT Authentication: No time drift, incorrect secret (shorter)", + AuthTestSpec{ + BaseSpec: test.BaseSpec{ + Name: "JWT Authentication: No time drift, incorrect secret (shorter)", + }, TimeDriftSeconds: 0, CustomAuthSecretBytes: []byte("secretsecretsecretsecretsecrets"), AuthOk: false, }, - { - Name: "JWT Authentication: No time drift, incorrect secret (longer)", + AuthTestSpec{ + BaseSpec: test.BaseSpec{ + Name: "JWT Authentication: No time drift, incorrect secret (longer)", + }, TimeDriftSeconds: 0, CustomAuthSecretBytes: append([]byte{0}, []byte("secretsecretsecretsecretsecretse")...), AuthOk: false, }, - { - Name: "JWT Authentication: Negative time drift, exceeding limit, correct secret", + AuthTestSpec{ + BaseSpec: test.BaseSpec{ + Name: "JWT Authentication: Negative time drift, exceeding limit, correct secret", + }, TimeDriftSeconds: -1 - globals.MaxTimeDriftSeconds, CustomAuthSecretBytes: nil, AuthOk: false, RetryAttempts: 5, }, - { - Name: "JWT Authentication: Negative time drift, within limit, correct secret", + AuthTestSpec{ + BaseSpec: test.BaseSpec{ + Name: "JWT Authentication: Negative time drift, within limit, correct secret", + }, TimeDriftSeconds: 1 - globals.MaxTimeDriftSeconds, CustomAuthSecretBytes: nil, AuthOk: true, RetryAttempts: 5, }, - { - Name: "JWT Authentication: Positive time drift, exceeding limit, correct secret", + AuthTestSpec{ + BaseSpec: test.BaseSpec{ + Name: "JWT Authentication: Positive time drift, exceeding limit, correct secret", + }, TimeDriftSeconds: globals.MaxTimeDriftSeconds + 1, CustomAuthSecretBytes: nil, AuthOk: false, RetryAttempts: 5, }, - { - Name: "JWT Authentication: Positive time drift, within limit, correct secret", + AuthTestSpec{ + BaseSpec: test.BaseSpec{ + Name: "JWT Authentication: Positive time drift, within limit, correct secret", + }, TimeDriftSeconds: globals.MaxTimeDriftSeconds - 1, CustomAuthSecretBytes: nil, AuthOk: true, @@ -69,63 +77,63 @@ var authTestSpecs = []AuthTestSpec{ }, } -var Tests = func() []test.Spec { - testSpecs := make([]test.Spec, 0) - for _, authTest := range authTestSpecs { - testSpecs = append(testSpecs, GenerateAuthTestSpec(authTest)) - } - return testSpecs -}() +type AuthTestSpec struct { + test.BaseSpec + TimeDriftSeconds int64 + CustomAuthSecretBytes []byte + AuthOk bool + RetryAttempts int64 +} -func GenerateAuthTestSpec(authTestSpec AuthTestSpec) test.Spec { - runFunc := func(t *test.Env) { - // Default values - var ( - // All test cases send a simple TransitionConfigurationV1 to check the Authentication mechanism (JWT) - tConf = api.TransitionConfigurationV1{ - TerminalTotalDifficulty: (*hexutil.Big)(t.MainTTD()), - TerminalBlockHash: common.Hash{}, - TerminalBlockNumber: 0, - } - testSecret = authTestSpec.CustomAuthSecretBytes - // Time drift test cases are reattempted in order to mitigate false negatives - retryAttemptsLeft = authTestSpec.RetryAttempts - ) +func (authTestSpec AuthTestSpec) Execute(t *test.Env) { + // Default values + var ( + // All test cases send a simple TransitionConfigurationV1 to check the Authentication mechanism (JWT) + tConf = api.TransitionConfigurationV1{ + TerminalTotalDifficulty: (*hexutil.Big)(t.MainTTD()), + TerminalBlockHash: common.Hash{}, + TerminalBlockNumber: 0, + } + testSecret = authTestSpec.CustomAuthSecretBytes + // Time drift test cases are reattempted in order to mitigate false negatives + retryAttemptsLeft = authTestSpec.RetryAttempts + ) - for { - var testTime = time.Now() - if testSecret == nil { - testSecret = globals.DefaultJwtTokenSecretBytes - } - if authTestSpec.TimeDriftSeconds != 0 { - testTime = testTime.Add(time.Second * time.Duration(authTestSpec.TimeDriftSeconds)) - } - if err := t.HiveEngine.PrepareAuthCallToken(testSecret, testTime); err != nil { - t.Fatalf("FAIL (%s): Unable to prepare the auth token: %v", t.TestName, err) - } - ctx, cancel := context.WithTimeout(t.TestContext, globals.RPCTimeout) - defer cancel() - _, err := t.HiveEngine.ExchangeTransitionConfigurationV1(ctx, &tConf) - if (authTestSpec.AuthOk && err == nil) || (!authTestSpec.AuthOk && err != nil) { - // Test passed - return - } - if retryAttemptsLeft == 0 { - if err != nil { - // Test failed because unexpected error - t.Fatalf("FAIL (%s): Authentication was supposed to pass authentication but failed: %v", t.TestName, err) - } else { - // Test failed because unexpected success - t.Fatalf("FAIL (%s): Authentication was supposed to fail authentication but passed", t.TestName) - } + for { + var testTime = time.Now() + if testSecret == nil { + testSecret = globals.DefaultJwtTokenSecretBytes + } + if authTestSpec.TimeDriftSeconds != 0 { + testTime = testTime.Add(time.Second * time.Duration(authTestSpec.TimeDriftSeconds)) + } + if err := t.HiveEngine.PrepareAuthCallToken(testSecret, testTime); err != nil { + t.Fatalf("FAIL (%s): Unable to prepare the auth token: %v", t.TestName, err) + } + ctx, cancel := context.WithTimeout(t.TestContext, globals.RPCTimeout) + defer cancel() + _, err := t.HiveEngine.ExchangeTransitionConfigurationV1(ctx, &tConf) + if (authTestSpec.AuthOk && err == nil) || (!authTestSpec.AuthOk && err != nil) { + // Test passed + return + } + if retryAttemptsLeft == 0 { + if err != nil { + // Test failed because unexpected error + t.Fatalf("FAIL (%s): Authentication was supposed to pass authentication but failed: %v", t.TestName, err) + } else { + // Test failed because unexpected success + t.Fatalf("FAIL (%s): Authentication was supposed to fail authentication but passed", t.TestName) } - retryAttemptsLeft-- - // Wait at least a second before trying again - time.Sleep(time.Second) } + retryAttemptsLeft-- + // Wait at least a second before trying again + time.Sleep(time.Second) } - return test.Spec{ - Name: authTestSpec.Name, - Run: runFunc, - } +} + +func (s AuthTestSpec) WithMainFork(fork config.Fork) test.Spec { + specCopy := s + specCopy.MainFork = fork + return specCopy } diff --git a/simulators/ethereum/engine/suites/cancun/config.go b/simulators/ethereum/engine/suites/cancun/config.go index 6b7e993ae4..688671e5d9 100644 --- a/simulators/ethereum/engine/suites/cancun/config.go +++ b/simulators/ethereum/engine/suites/cancun/config.go @@ -1,123 +1,19 @@ package suite_cancun import ( - "math/big" "time" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core" - "github.com/ethereum/hive/simulators/ethereum/engine/clmock" - "github.com/ethereum/hive/simulators/ethereum/engine/globals" "github.com/ethereum/hive/simulators/ethereum/engine/test" ) // Contains the base spec for all cancun tests. type CancunBaseSpec struct { - test.Spec - TimeIncrements uint64 // Timestamp increments per block throughout the test - GetPayloadDelay uint64 // Delay between FcU and GetPayload calls - CancunForkHeight uint64 // Withdrawals activation fork height - GenesisTimestamp *uint64 + test.BaseSpec + GetPayloadDelay uint64 // Delay between FcU and GetPayload calls TestSequence } -// Timestamp delta between genesis and the withdrawals fork -func (cs *CancunBaseSpec) GetCancunGenesisTimeDelta() uint64 { - return cs.CancunForkHeight * cs.GetBlockTimeIncrements() -} - -func (cs *CancunBaseSpec) GetGenesisTimestamp() uint64 { - if cs.GenesisTimestamp != nil { - return *cs.GenesisTimestamp - } - return uint64(globals.GenesisTimestamp) -} - -// Calculates Cancun fork timestamp given the amount of blocks that need to be -// produced beforehand. -func (cs *CancunBaseSpec) GetCancunForkTime() uint64 { - return cs.GetGenesisTimestamp() + cs.GetCancunGenesisTimeDelta() -} - -// Generates the fork config, including cancun fork timestamp. -func (cs *CancunBaseSpec) GetForkConfig() globals.ForkConfig { - return globals.ForkConfig{ - ShanghaiTimestamp: big.NewInt(0), // No test starts before Shanghai - CancunTimestamp: new(big.Int).SetUint64(cs.GetCancunForkTime()), - } -} - -// Get the per-block timestamp increments configured for this test -func (cs *CancunBaseSpec) GetBlockTimeIncrements() uint64 { - if cs.TimeIncrements == 0 { - return 1 - } - return cs.TimeIncrements -} - -// Timestamp delta between genesis and the withdrawals fork -func (cs *CancunBaseSpec) GetBlobsGenesisTimeDelta() uint64 { - return cs.CancunForkHeight * cs.GetBlockTimeIncrements() -} - -// Calculates Cancun fork timestamp given the amount of blocks that need to be -// produced beforehand. -func (cs *CancunBaseSpec) GetBlobsForkTime() uint64 { - return cs.GetGenesisTimestamp() + cs.GetBlobsGenesisTimeDelta() -} - -// Append the accounts we are going to withdraw to, which should also include -// bytecode for testing purposes. -func (cs *CancunBaseSpec) GetGenesis() *core.Genesis { - genesis := cs.Spec.GetGenesis() - - // Add accounts that use the DATAHASH opcode - datahashCode := []byte{ - 0x5F, // PUSH0 - 0x80, // DUP1 - 0x49, // DATAHASH - 0x55, // SSTORE - 0x60, // PUSH1(0x01) - 0x01, - 0x80, // DUP1 - 0x49, // DATAHASH - 0x55, // SSTORE - 0x60, // PUSH1(0x02) - 0x02, - 0x80, // DUP1 - 0x49, // DATAHASH - 0x55, // SSTORE - 0x60, // PUSH1(0x03) - 0x03, - 0x80, // DUP1 - 0x49, // DATAHASH - 0x55, // SSTORE - } - - for i := 0; i < DATAHASH_ADDRESS_COUNT; i++ { - address := big.NewInt(0).Add(DATAHASH_START_ADDRESS, big.NewInt(int64(i))) - genesis.Alloc[common.BigToAddress(address)] = core.GenesisAccount{ - Code: datahashCode, - Balance: common.Big0, - } - } - - // Add bytecode pre deploy to the EIP-4788 address. - genesis.Alloc[HISTORY_STORAGE_ADDRESS] = core.GenesisAccount{ - Balance: common.Big0, - Nonce: 1, - Code: common.Hex2Bytes("3373fffffffffffffffffffffffffffffffffffffffe14604457602036146024575f5ffd5b620180005f350680545f35146037575f5ffd5b6201800001545f5260205ff35b42620180004206555f3562018000420662018000015500"), - } - - return genesis -} - -// Changes the CL Mocker default time increments of 1 to the value specified -// in the test spec. -func (cs *CancunBaseSpec) ConfigureCLMock(cl *clmock.CLMocker) { - cl.BlockTimestampIncrement = big.NewInt(int64(cs.GetBlockTimeIncrements())) -} - // Base test case execution procedure for blobs tests. func (cs *CancunBaseSpec) Execute(t *test.Env) { @@ -142,52 +38,3 @@ func (cs *CancunBaseSpec) Execute(t *test.Env) { } } - -type CancunForkSpec struct { - CancunBaseSpec - GenesisTimestamp uint64 - ShanghaiTimestamp uint64 - CancunTimestamp uint64 - - ProduceBlocksBeforePeering uint64 -} - -func (cs *CancunForkSpec) GetGenesisTimestamp() uint64 { - return cs.GenesisTimestamp -} - -// Get Cancun fork timestamp. -func (cs *CancunForkSpec) GetCancunForkTime() uint64 { - return cs.CancunTimestamp -} - -// Generates the fork config, including cancun fork timestamp. -func (cs *CancunForkSpec) GetForkConfig() globals.ForkConfig { - return globals.ForkConfig{ - ShanghaiTimestamp: new(big.Int).SetUint64(cs.ShanghaiTimestamp), - CancunTimestamp: new(big.Int).SetUint64(cs.CancunTimestamp), - } -} - -// Genesis generation. -func (cs *CancunForkSpec) GetGenesis() *core.Genesis { - // Calculate the cancun fork height - cs.CancunForkHeight = (cs.CancunTimestamp - cs.GenesisTimestamp) / cs.GetBlockTimeIncrements() - genesis := cs.CancunBaseSpec.GetGenesis() - genesis.Timestamp = cs.GenesisTimestamp - return genesis -} - -func (cs *CancunForkSpec) Execute(t *test.Env) { - // Add steps to check the sequence - cs.TestSequence = TestSequence{ - NewPayloads{ - PayloadCount: cs.ProduceBlocksBeforePeering, - }, - DevP2PClientPeering{ - ClientIndex: 0, - }, - } - - cs.CancunBaseSpec.Execute(t) -} diff --git a/simulators/ethereum/engine/suites/cancun/helpers.go b/simulators/ethereum/engine/suites/cancun/helpers.go index a19a76487b..2f76ddf195 100644 --- a/simulators/ethereum/engine/suites/cancun/helpers.go +++ b/simulators/ethereum/engine/suites/cancun/helpers.go @@ -11,6 +11,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/hive/simulators/ethereum/engine/client" + "github.com/ethereum/hive/simulators/ethereum/engine/config/cancun" "github.com/ethereum/hive/simulators/ethereum/engine/helper" typ "github.com/ethereum/hive/simulators/ethereum/engine/types" ) @@ -31,7 +32,7 @@ func FakeExponential(factor, numerator, denominator uint64) uint64 { } func GetBlobGasPrice(excessBlobGas uint64) uint64 { - return FakeExponential(MIN_DATA_GASPRICE, excessBlobGas, BLOB_GASPRICE_UPDATE_FRACTION) + return FakeExponential(cancun.MIN_DATA_GASPRICE, excessBlobGas, cancun.BLOB_GASPRICE_UPDATE_FRACTION) } func GetMinExcessBlobGasForBlobGasPrice(data_gas_price uint64) uint64 { @@ -40,7 +41,7 @@ func GetMinExcessBlobGasForBlobGasPrice(data_gas_price uint64) uint64 { current_data_gas_price = uint64(1) ) for current_data_gas_price < data_gas_price { - current_excess_data_gas += GAS_PER_BLOB + current_excess_data_gas += cancun.GAS_PER_BLOB current_data_gas_price = GetBlobGasPrice(current_excess_data_gas) } @@ -48,14 +49,14 @@ func GetMinExcessBlobGasForBlobGasPrice(data_gas_price uint64) uint64 { } func GetMinExcessBlobsForBlobGasPrice(data_gas_price uint64) uint64 { - return GetMinExcessBlobGasForBlobGasPrice(data_gas_price) / GAS_PER_BLOB + return GetMinExcessBlobGasForBlobGasPrice(data_gas_price) / cancun.GAS_PER_BLOB } func CalcExcessBlobGas(parentExcessBlobGas, parentBlobGasUsed uint64) uint64 { - if (parentExcessBlobGas + parentBlobGasUsed) < TARGET_BLOB_GAS_PER_BLOCK { + if (parentExcessBlobGas + parentBlobGasUsed) < cancun.TARGET_BLOB_GAS_PER_BLOCK { return 0 } else { - return (parentExcessBlobGas + parentBlobGasUsed) - TARGET_BLOB_GAS_PER_BLOCK + return (parentExcessBlobGas + parentBlobGasUsed) - cancun.TARGET_BLOB_GAS_PER_BLOCK } } @@ -131,8 +132,8 @@ func VerifyTransactionFromNode(ctx context.Context, eth client.Eth, tx typ.Trans func BeaconRootStorageIndexes(timestamp uint64) (common.Hash, common.Hash) { // Calculate keys - timestampReduced := timestamp % HISTORICAL_ROOTS_MODULUS - timestampExtended := timestampReduced + HISTORICAL_ROOTS_MODULUS + timestampReduced := timestamp % cancun.HISTORICAL_ROOTS_MODULUS + timestampExtended := timestampReduced + cancun.HISTORICAL_ROOTS_MODULUS return common.BigToHash(new(big.Int).SetUint64(timestampReduced)), common.BigToHash(new(big.Int).SetUint64(timestampExtended)) } diff --git a/simulators/ethereum/engine/suites/cancun/steps.go b/simulators/ethereum/engine/suites/cancun/steps.go index 2951140ee9..1754154432 100644 --- a/simulators/ethereum/engine/suites/cancun/steps.go +++ b/simulators/ethereum/engine/suites/cancun/steps.go @@ -13,6 +13,8 @@ import ( "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/hive/simulators/ethereum/engine/client" "github.com/ethereum/hive/simulators/ethereum/engine/clmock" + "github.com/ethereum/hive/simulators/ethereum/engine/config" + "github.com/ethereum/hive/simulators/ethereum/engine/config/cancun" "github.com/ethereum/hive/simulators/ethereum/engine/devp2p" "github.com/ethereum/hive/simulators/ethereum/engine/globals" "github.com/ethereum/hive/simulators/ethereum/engine/helper" @@ -259,7 +261,7 @@ func VerifyBeaconRootStorage(ctx context.Context, testEngine *test.TestEngineCli // Read the storage keys from the stateful precompile that stores the beacon roots and verify // that the beacon root is the same as the one in the payload blockNumber := new(big.Int).SetUint64(payload.Number) - precompileAddress := HISTORY_STORAGE_ADDRESS + precompileAddress := cancun.HISTORY_STORAGE_ADDRESS timestampKey, beaconRootKey := BeaconRootStorageIndexes(payload.Timestamp) @@ -274,7 +276,7 @@ func VerifyBeaconRootStorage(ctx context.Context, testEngine *test.TestEngineCli return nil } -func (step NewPayloads) VerifyPayload(ctx context.Context, forkConfig *globals.ForkConfig, testEngine *test.TestEngineClient, blobTxsInPayload []*typ.TransactionWithBlobData, shouldOverrideBuilder *bool, payload *typ.ExecutableData, previousPayload *typ.ExecutableData) error { +func (step NewPayloads) VerifyPayload(ctx context.Context, forkConfig *config.ForkConfig, testEngine *test.TestEngineClient, blobTxsInPayload []*typ.TransactionWithBlobData, shouldOverrideBuilder *bool, payload *typ.ExecutableData, previousPayload *typ.ExecutableData) error { var ( parentExcessBlobGas = uint64(0) parentBlobGasUsed = uint64(0) @@ -313,7 +315,7 @@ func (step NewPayloads) VerifyPayload(ctx context.Context, forkConfig *globals.F // Retrieve receipt from client r := testEngine.TestTransactionReceipt(tx.Hash()) - expectedBlobGasUsed := blobCount * GAS_PER_BLOB + expectedBlobGasUsed := blobCount * cancun.GAS_PER_BLOB r.ExpectBlobGasUsed(expectedBlobGasUsed) r.ExpectBlobGasPrice(expectedBlobGasPrice) } @@ -409,19 +411,17 @@ func (step NewPayloads) Execute(t *CancunTestContext) error { var ( payloadAttributes *typ.PayloadAttributes = &t.CLMock.LatestPayloadAttributes forkchoiceState api.ForkchoiceStateV1 = t.CLMock.LatestForkchoice - version int expectedError *int expectedStatus test.PayloadStatus = test.Valid err error ) + step.FcUOnPayloadRequest.SetEngineAPIVersionResolver(t.ForkConfig) + testEngine := t.TestEngine.WithEngineAPIVersionResolver(step.FcUOnPayloadRequest) + payloadAttributes, err = step.FcUOnPayloadRequest.GetPayloadAttributes(payloadAttributes) if err != nil { t.Fatalf("FAIL: Error getting custom payload attributes (payload %d/%d): %v", p+1, payloadCount, err) } - version, err = step.FcUOnPayloadRequest.GetVersion(t.Env.ForkConfig, t.CLMock.LatestHeader.Time, payloadAttributes) - if err != nil { - t.Fatalf("FAIL: Error getting custom fcU version (payload %d/%d): %v", p+1, payloadCount, err) - } expectedError, err = step.FcUOnPayloadRequest.GetExpectedError() if err != nil { t.Fatalf("FAIL: Error getting custom expected error (payload %d/%d): %v", p+1, payloadCount, err) @@ -430,7 +430,7 @@ func (step NewPayloads) Execute(t *CancunTestContext) error { expectedStatus = test.Invalid } - r := t.TestEngine.TestEngineForkchoiceUpdated(&forkchoiceState, payloadAttributes, version) + r := testEngine.TestEngineForkchoiceUpdated(&forkchoiceState, payloadAttributes, t.CLMock.LatestHeader.Time) r.ExpectationDescription = step.ExpectationDescription if expectedError != nil { r.ExpectErrorCode(*expectedError) @@ -449,12 +449,13 @@ func (step NewPayloads) Execute(t *CancunTestContext) error { var ( payloadAttributes = &t.CLMock.LatestPayloadAttributes payloadID = t.CLMock.NextPayloadID - version int - r *test.GetPayloadResponseExpectObject expectedError *int err error ) + step.GetPayloadCustomizer.SetEngineAPIVersionResolver(t.ForkConfig) + testEngine := t.TestEngine.WithEngineAPIVersionResolver(step.GetPayloadCustomizer) + // We are going to sleep twice because there is no way to skip the CL Mock's sleep time.Sleep(time.Duration(step.GetPayloadDelay) * time.Second) @@ -463,17 +464,12 @@ func (step NewPayloads) Execute(t *CancunTestContext) error { t.Fatalf("FAIL: Error getting custom payload ID (payload %d/%d): %v", p+1, payloadCount, err) } - version, err = step.GetPayloadCustomizer.GetVersion(t.Env.ForkConfig, payloadAttributes.Timestamp) - if err != nil { - t.Fatalf("FAIL: Error getting custom get-payload version (payload %d/%d): %v", p+1, payloadCount, err) - } - expectedError, err = step.GetPayloadCustomizer.GetExpectedError() if err != nil { t.Fatalf("FAIL: Error getting custom expected error (payload %d/%d): %v", p+1, payloadCount, err) } - r = t.TestEngine.TestEngineGetPayload(payloadID, version) + r := testEngine.TestEngineGetPayload(payloadID, payloadAttributes) r.ExpectationDescription = step.ExpectationDescription if expectedError != nil { r.ExpectErrorCode(*expectedError) @@ -511,36 +507,21 @@ func (step NewPayloads) Execute(t *CancunTestContext) error { if step.NewPayloadCustomizer != nil { // Send a test NewPayload directive with either a modified payload or modifed versioned hashes var ( - payload = &t.CLMock.LatestPayloadBuilt - version = t.Env.ForkConfig.NewPayloadVersion(payload.Timestamp) - versionedHashes *[]common.Hash = nil - beaconRoot *common.Hash = t.CLMock.LatestPayloadAttributes.BeaconRoot - r *test.NewPayloadResponseExpectObject - expectedError *int - expectedStatus test.PayloadStatus = test.Valid - err error + payload = &t.CLMock.LatestPayloadBuilt + r *test.NewPayloadResponseExpectObject + expectedError *int + expectedStatus test.PayloadStatus = test.Valid + err error ) - if t.CLMock.LatestBlobBundle != nil { - versionedHashes, err = t.CLMock.LatestBlobBundle.VersionedHashes(BLOB_COMMITMENT_VERSION_KZG) - if err != nil { - t.Fatalf("FAIL: Error getting versioned hashes (payload %d/%d): %v", p+1, payloadCount, err) - } - } - // Send a custom new payload - version, err = step.NewPayloadCustomizer.GetVersion(t.Env.ForkConfig, payload) - if err != nil { - t.Fatalf("FAIL: Error getting custom payload version (payload %d/%d): %v", p+1, payloadCount, err) - } - payload, beaconRoot, err = step.NewPayloadCustomizer.CustomizePayload(payload, beaconRoot) + step.NewPayloadCustomizer.SetEngineAPIVersionResolver(t.ForkConfig) + testEngine := t.TestEngine.WithEngineAPIVersionResolver(step.NewPayloadCustomizer) + + payload, err = step.NewPayloadCustomizer.CustomizePayload(payload) if err != nil { t.Fatalf("FAIL: Error customizing payload (payload %d/%d): %v", p+1, payloadCount, err) } - versionedHashes, err = step.NewPayloadCustomizer.GetVersionedHashes(versionedHashes) - if err != nil { - t.Fatalf("FAIL: Error getting custom versioned hashes (payload %d/%d): %v", p+1, payloadCount, err) - } expectedError, err = step.NewPayloadCustomizer.GetExpectedError() if err != nil { t.Fatalf("FAIL: Error getting custom expected error (payload %d/%d): %v", p+1, payloadCount, err) @@ -549,7 +530,7 @@ func (step NewPayloads) Execute(t *CancunTestContext) error { expectedStatus = test.Invalid } - r = t.TestEngine.TestEngineNewPayload(payload, versionedHashes, beaconRoot, version) + r = testEngine.TestEngineNewPayload(payload) r.ExpectationDescription = step.ExpectationDescription if expectedError != nil { r.ExpectErrorCode(*expectedError) @@ -561,21 +542,13 @@ func (step NewPayloads) Execute(t *CancunTestContext) error { if step.FcUOnHeadSet != nil { var ( - payloadAttributes *typ.PayloadAttributes = nil - forkchoiceState api.ForkchoiceStateV1 = t.CLMock.LatestForkchoice - version int - expectedError *int - expectedStatus test.PayloadStatus = test.Valid - err error + forkchoiceState api.ForkchoiceStateV1 = t.CLMock.LatestForkchoice + expectedError *int + expectedStatus test.PayloadStatus = test.Valid + err error ) - payloadAttributes, err = step.FcUOnHeadSet.GetPayloadAttributes(payloadAttributes) - if err != nil { - t.Fatalf("FAIL: Error getting custom payload attributes (payload %d/%d): %v", p+1, payloadCount, err) - } - version, err = step.FcUOnHeadSet.GetVersion(t.Env.ForkConfig, t.CLMock.LatestHeader.Time, payloadAttributes) - if err != nil { - t.Fatalf("FAIL: Error getting custom fcU version (payload %d/%d): %v", p+1, payloadCount, err) - } + step.FcUOnHeadSet.SetEngineAPIVersionResolver(t.ForkConfig) + testEngine := t.TestEngine.WithEngineAPIVersionResolver(step.FcUOnHeadSet) expectedError, err = step.FcUOnHeadSet.GetExpectedError() if err != nil { t.Fatalf("FAIL: Error getting custom expected error (payload %d/%d): %v", p+1, payloadCount, err) @@ -584,7 +557,9 @@ func (step NewPayloads) Execute(t *CancunTestContext) error { expectedStatus = test.Invalid } - r := t.TestEngine.TestEngineForkchoiceUpdated(&forkchoiceState, payloadAttributes, version) + forkchoiceState.HeadBlockHash = t.CLMock.LatestPayloadBuilt.BlockHash + + r := testEngine.TestEngineForkchoiceUpdated(&forkchoiceState, nil, t.CLMock.LatestPayloadBuilt.Timestamp) r.ExpectationDescription = step.ExpectationDescription if expectedError != nil { r.ExpectErrorCode(*expectedError) @@ -660,7 +635,7 @@ func (step SendBlobTransactions) GetBlobsPerTransaction() uint64 { func (step SendBlobTransactions) Execute(t *CancunTestContext) error { // Send a blob transaction - addr := common.BigToAddress(DATAHASH_START_ADDRESS) + addr := common.BigToAddress(cancun.DATAHASH_START_ADDRESS) blobCountPerTx := step.GetBlobsPerTransaction() var engine client.EngineClient if step.ClientIndex >= uint64(len(t.Engines)) { @@ -678,23 +653,17 @@ func (step SendBlobTransactions) Execute(t *CancunTestContext) error { BlobCount: blobCountPerTx, BlobID: t.CurrentBlobID, } - if step.AccountIndex != 0 { - if step.AccountIndex >= uint64(len(globals.TestAccounts)) { - return fmt.Errorf("invalid account index %d", step.AccountIndex) - } - key := globals.TestAccounts[step.AccountIndex].GetKey() - blobTxCreator.PrivateKey = key - } + sender := globals.TestAccounts[step.AccountIndex] var ( blobTx typ.Transaction err error ) if step.ReplaceTransactions { - blobTx, err = helper.ReplaceLastTransaction(t.TestContext, engine, + blobTx, err = t.ReplaceTransaction(t.TestContext, sender, engine, blobTxCreator, ) } else { - blobTx, err = helper.SendNextTransaction(t.TestContext, engine, + blobTx, err = t.SendTransaction(t.TestContext, sender, engine, blobTxCreator, ) } @@ -728,13 +697,10 @@ type SendModifiedLatestPayload struct { func (step SendModifiedLatestPayload) Execute(t *CancunTestContext) error { // Get the latest payload var ( - payload = &t.CLMock.LatestPayloadBuilt - beaconRoot = t.CLMock.LatestPayloadAttributes.BeaconRoot - version int = t.Env.ForkConfig.NewPayloadVersion(payload.Timestamp) - versionedHashes *[]common.Hash = nil - expectedError *int = nil - expectedStatus test.PayloadStatus = test.Valid - err error = nil + payload = &t.CLMock.LatestPayloadBuilt + expectedError *int = nil + expectedStatus test.PayloadStatus = test.Valid + err error = nil ) if payload == nil { return fmt.Errorf("TEST-FAIL: no payload available") @@ -747,18 +713,11 @@ func (step SendModifiedLatestPayload) Execute(t *CancunTestContext) error { } // Send a custom new payload - version, err = step.NewPayloadCustomizer.GetVersion(t.Env.ForkConfig, payload) - if err != nil { - t.Fatalf("FAIL: Error getting custom payload version: %v", err) - } - payload, beaconRoot, err = step.NewPayloadCustomizer.CustomizePayload(payload, beaconRoot) + step.NewPayloadCustomizer.SetEngineAPIVersionResolver(t.ForkConfig) + payload, err = step.NewPayloadCustomizer.CustomizePayload(payload) if err != nil { t.Fatalf("FAIL: Error customizing payload: %v", err) } - versionedHashes, err = step.NewPayloadCustomizer.GetVersionedHashes(versionedHashes) - if err != nil { - t.Fatalf("FAIL: Error getting custom versioned hashes: %v", err) - } expectedError, err = step.NewPayloadCustomizer.GetExpectedError() if err != nil { t.Fatalf("FAIL: Error getting custom expected error: %v", err) @@ -771,8 +730,8 @@ func (step SendModifiedLatestPayload) Execute(t *CancunTestContext) error { if step.ClientID >= uint64(len(t.TestEngines)) { return fmt.Errorf("invalid client index %d", step.ClientID) } - testEngine := t.TestEngines[step.ClientID] - r := testEngine.TestEngineNewPayload(payload, versionedHashes, beaconRoot, version) + testEngine := t.TestEngines[step.ClientID].WithEngineAPIVersionResolver(step.NewPayloadCustomizer) + r := testEngine.TestEngineNewPayload(payload) if expectedError != nil { r.ExpectErrorCode(*expectedError) } else { diff --git a/simulators/ethereum/engine/suites/cancun/tests.go b/simulators/ethereum/engine/suites/cancun/tests.go index 87f79eb38c..681b93b605 100644 --- a/simulators/ethereum/engine/suites/cancun/tests.go +++ b/simulators/ethereum/engine/suites/cancun/tests.go @@ -7,37 +7,14 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/hive/simulators/ethereum/engine/client/hive_rpc" + "github.com/ethereum/hive/simulators/ethereum/engine/config" + "github.com/ethereum/hive/simulators/ethereum/engine/config/cancun" + "github.com/ethereum/hive/simulators/ethereum/engine/globals" "github.com/ethereum/hive/simulators/ethereum/engine/helper" + suite_engine "github.com/ethereum/hive/simulators/ethereum/engine/suites/engine" "github.com/ethereum/hive/simulators/ethereum/engine/test" ) -var ( - DATAHASH_START_ADDRESS = big.NewInt(0x100) - DATAHASH_ADDRESS_COUNT = 1000 - - // EIP 4844 specific constants - GAS_PER_BLOB = uint64(0x20000) - - MIN_DATA_GASPRICE = uint64(1) - MAX_BLOB_GAS_PER_BLOCK = uint64(786432) - TARGET_BLOB_GAS_PER_BLOCK = uint64(393216) - - TARGET_BLOBS_PER_BLOCK = uint64(TARGET_BLOB_GAS_PER_BLOCK / GAS_PER_BLOB) - MAX_BLOBS_PER_BLOCK = uint64(MAX_BLOB_GAS_PER_BLOCK / GAS_PER_BLOB) - - BLOB_GASPRICE_UPDATE_FRACTION = uint64(3338477) - - BLOB_COMMITMENT_VERSION_KZG = byte(0x01) - - // EIP 4788 specific constants - HISTORY_STORAGE_ADDRESS = common.HexToAddress("0x000000000000000000000000000000000000000b") - HISTORICAL_ROOTS_MODULUS = uint64(98304) - - // Engine API errors - INVALID_PARAMS_ERROR = pInt(-32602) - UNSUPPORTED_FORK_ERROR = pInt(-38005) -) - // Precalculate the first data gas cost increase var ( DATA_GAS_COST_INCREMENT_EXCEED_BLOBS = GetMinExcessBlobsForBlobGasPrice(2) @@ -47,18 +24,14 @@ func pUint64(v uint64) *uint64 { return &v } -func pInt(v int) *int { - return &v -} - // Execution specification reference: // https://github.com/ethereum/execution-apis/blob/main/src/engine/cancun.md // List of all blob tests -var Tests = []test.SpecInterface{ +var Tests = []test.Spec{ &CancunBaseSpec{ - Spec: test.Spec{ + BaseSpec: test.BaseSpec{ Name: "Blob Transactions On Block 1, Shanghai Genesis", About: ` Tests the Cancun fork since Block 1. @@ -75,11 +48,11 @@ var Tests = []test.SpecInterface{ - Beacon root in eth_getBlockByNumber - Blob fields in transaction receipts from eth_getTransactionReceipt `, + MainFork: config.Cancun, + // We fork after genesis + ForkHeight: 1, }, - // We fork on genesis - CancunForkHeight: 1, - TestSequence: TestSequence{ // We are starting at Shanghai genesis so send a couple payloads to reach the fork NewPayloads{}, @@ -87,7 +60,7 @@ var Tests = []test.SpecInterface{ // First, we send a couple of blob transactions on genesis, // with enough data gas cost to make sure they are included in the first block. SendBlobTransactions{ - TransactionCount: TARGET_BLOBS_PER_BLOCK, + TransactionCount: cancun.TARGET_BLOBS_PER_BLOCK, BlobTransactionMaxBlobGasCost: big.NewInt(1), }, @@ -95,22 +68,22 @@ var Tests = []test.SpecInterface{ // are included in the payload. // We also verify that the blob transactions are included in the blobs bundle. NewPayloads{ - ExpectedIncludedBlobCount: TARGET_BLOBS_PER_BLOCK, - ExpectedBlobs: helper.GetBlobList(0, TARGET_BLOBS_PER_BLOCK), + ExpectedIncludedBlobCount: cancun.TARGET_BLOBS_PER_BLOCK, + ExpectedBlobs: helper.GetBlobList(0, cancun.TARGET_BLOBS_PER_BLOCK), }, // Try to increase the data gas cost of the blob transactions // by maxing out the number of blobs for the next payloads. SendBlobTransactions{ - TransactionCount: DATA_GAS_COST_INCREMENT_EXCEED_BLOBS/(MAX_BLOBS_PER_BLOCK-TARGET_BLOBS_PER_BLOCK) + 1, - BlobsPerTransaction: MAX_BLOBS_PER_BLOCK, + TransactionCount: DATA_GAS_COST_INCREMENT_EXCEED_BLOBS/(cancun.MAX_BLOBS_PER_BLOCK-cancun.TARGET_BLOBS_PER_BLOCK) + 1, + BlobsPerTransaction: cancun.MAX_BLOBS_PER_BLOCK, BlobTransactionMaxBlobGasCost: big.NewInt(1), }, // Next payloads will have max data blobs each NewPayloads{ - PayloadCount: DATA_GAS_COST_INCREMENT_EXCEED_BLOBS / (MAX_BLOBS_PER_BLOCK - TARGET_BLOBS_PER_BLOCK), - ExpectedIncludedBlobCount: MAX_BLOBS_PER_BLOCK, + PayloadCount: DATA_GAS_COST_INCREMENT_EXCEED_BLOBS / (cancun.MAX_BLOBS_PER_BLOCK - cancun.TARGET_BLOBS_PER_BLOCK), + ExpectedIncludedBlobCount: cancun.MAX_BLOBS_PER_BLOCK, }, // But there will be an empty payload, since the data gas cost increased @@ -121,14 +94,14 @@ var Tests = []test.SpecInterface{ // But it will be included in the next payload NewPayloads{ - ExpectedIncludedBlobCount: MAX_BLOBS_PER_BLOCK, + ExpectedIncludedBlobCount: cancun.MAX_BLOBS_PER_BLOCK, }, }, }, &CancunBaseSpec{ - Spec: test.Spec{ + BaseSpec: test.BaseSpec{ Name: "Blob Transactions On Block 1, Cancun Genesis", About: ` Tests the Cancun fork since genesis. @@ -136,17 +109,15 @@ var Tests = []test.SpecInterface{ Verifications performed: * See Blob Transactions On Block 1, Shanghai Genesis `, + MainFork: config.Cancun, }, - // We fork on genesis - CancunForkHeight: 0, - TestSequence: TestSequence{ NewPayloads{}, // Create a single empty payload to push the client through the fork. // First, we send a couple of blob transactions on genesis, // with enough data gas cost to make sure they are included in the first block. SendBlobTransactions{ - TransactionCount: TARGET_BLOBS_PER_BLOCK, + TransactionCount: cancun.TARGET_BLOBS_PER_BLOCK, BlobTransactionMaxBlobGasCost: big.NewInt(1), }, @@ -154,22 +125,22 @@ var Tests = []test.SpecInterface{ // are included in the payload. // We also verify that the blob transactions are included in the blobs bundle. NewPayloads{ - ExpectedIncludedBlobCount: TARGET_BLOBS_PER_BLOCK, - ExpectedBlobs: helper.GetBlobList(0, TARGET_BLOBS_PER_BLOCK), + ExpectedIncludedBlobCount: cancun.TARGET_BLOBS_PER_BLOCK, + ExpectedBlobs: helper.GetBlobList(0, cancun.TARGET_BLOBS_PER_BLOCK), }, // Try to increase the data gas cost of the blob transactions // by maxing out the number of blobs for the next payloads. SendBlobTransactions{ - TransactionCount: DATA_GAS_COST_INCREMENT_EXCEED_BLOBS/(MAX_BLOBS_PER_BLOCK-TARGET_BLOBS_PER_BLOCK) + 1, - BlobsPerTransaction: MAX_BLOBS_PER_BLOCK, + TransactionCount: DATA_GAS_COST_INCREMENT_EXCEED_BLOBS/(cancun.MAX_BLOBS_PER_BLOCK-cancun.TARGET_BLOBS_PER_BLOCK) + 1, + BlobsPerTransaction: cancun.MAX_BLOBS_PER_BLOCK, BlobTransactionMaxBlobGasCost: big.NewInt(1), }, // Next payloads will have max data blobs each NewPayloads{ - PayloadCount: DATA_GAS_COST_INCREMENT_EXCEED_BLOBS / (MAX_BLOBS_PER_BLOCK - TARGET_BLOBS_PER_BLOCK), - ExpectedIncludedBlobCount: MAX_BLOBS_PER_BLOCK, + PayloadCount: DATA_GAS_COST_INCREMENT_EXCEED_BLOBS / (cancun.MAX_BLOBS_PER_BLOCK - cancun.TARGET_BLOBS_PER_BLOCK), + ExpectedIncludedBlobCount: cancun.MAX_BLOBS_PER_BLOCK, }, // But there will be an empty payload, since the data gas cost increased @@ -180,16 +151,16 @@ var Tests = []test.SpecInterface{ // But it will be included in the next payload NewPayloads{ - ExpectedIncludedBlobCount: MAX_BLOBS_PER_BLOCK, + ExpectedIncludedBlobCount: cancun.MAX_BLOBS_PER_BLOCK, }, }, }, &CancunBaseSpec{ - Spec: test.Spec{ + BaseSpec: test.BaseSpec{ Name: "Blob Transaction Ordering, Single Account", About: ` - Send N blob transactions with MAX_BLOBS_PER_BLOCK-1 blobs each, + Send N blob transactions with cancun.MAX_BLOBS_PER_BLOCK-1 blobs each, using account A. Using same account, and an increased nonce from the previously sent transactions, send N blob transactions with 1 blob each. @@ -199,44 +170,42 @@ var Tests = []test.SpecInterface{ All transactions have sufficient data gas price to be included any of the payloads. `, + MainFork: config.Cancun, }, - // We fork on genesis - CancunForkHeight: 0, - TestSequence: TestSequence{ - // First send the MAX_BLOBS_PER_BLOCK-1 blob transactions. + // First send the cancun.MAX_BLOBS_PER_BLOCK-1 blob transactions. SendBlobTransactions{ TransactionCount: 5, - BlobsPerTransaction: MAX_BLOBS_PER_BLOCK - 1, + BlobsPerTransaction: cancun.MAX_BLOBS_PER_BLOCK - 1, BlobTransactionMaxBlobGasCost: big.NewInt(100), }, // Then send the single-blob transactions SendBlobTransactions{ - TransactionCount: MAX_BLOBS_PER_BLOCK + 1, + TransactionCount: cancun.MAX_BLOBS_PER_BLOCK + 1, BlobsPerTransaction: 1, BlobTransactionMaxBlobGasCost: big.NewInt(100), }, - // First four payloads have MAX_BLOBS_PER_BLOCK-1 blobs each + // First four payloads have cancun.MAX_BLOBS_PER_BLOCK-1 blobs each NewPayloads{ PayloadCount: 4, - ExpectedIncludedBlobCount: MAX_BLOBS_PER_BLOCK - 1, + ExpectedIncludedBlobCount: cancun.MAX_BLOBS_PER_BLOCK - 1, }, // The rest of the payloads have full blobs NewPayloads{ PayloadCount: 2, - ExpectedIncludedBlobCount: MAX_BLOBS_PER_BLOCK, + ExpectedIncludedBlobCount: cancun.MAX_BLOBS_PER_BLOCK, }, }, }, &CancunBaseSpec{ - Spec: test.Spec{ + BaseSpec: test.BaseSpec{ Name: "Blob Transaction Ordering, Single Account 2", About: ` - Send N blob transactions with MAX_BLOBS_PER_BLOCK-1 blobs each, + Send N blob transactions with cancun.MAX_BLOBS_PER_BLOCK-1 blobs each, using account A. Using same account, and an increased nonce from the previously sent transactions, send a single 2-blob transaction, and send N blob @@ -247,16 +216,14 @@ var Tests = []test.SpecInterface{ All transactions have sufficient data gas price to be included any of the payloads. `, + MainFork: config.Cancun, }, - // We fork on genesis - CancunForkHeight: 0, - TestSequence: TestSequence{ - // First send the MAX_BLOBS_PER_BLOCK-1 blob transactions. + // First send the cancun.MAX_BLOBS_PER_BLOCK-1 blob transactions. SendBlobTransactions{ TransactionCount: 5, - BlobsPerTransaction: MAX_BLOBS_PER_BLOCK - 1, + BlobsPerTransaction: cancun.MAX_BLOBS_PER_BLOCK - 1, BlobTransactionMaxBlobGasCost: big.NewInt(100), }, @@ -269,31 +236,31 @@ var Tests = []test.SpecInterface{ // Then send the single-blob transactions SendBlobTransactions{ - TransactionCount: MAX_BLOBS_PER_BLOCK - 2, + TransactionCount: cancun.MAX_BLOBS_PER_BLOCK - 2, BlobsPerTransaction: 1, BlobTransactionMaxBlobGasCost: big.NewInt(100), }, - // First five payloads have MAX_BLOBS_PER_BLOCK-1 blobs each + // First five payloads have cancun.MAX_BLOBS_PER_BLOCK-1 blobs each NewPayloads{ PayloadCount: 5, - ExpectedIncludedBlobCount: MAX_BLOBS_PER_BLOCK - 1, + ExpectedIncludedBlobCount: cancun.MAX_BLOBS_PER_BLOCK - 1, }, // The rest of the payloads have full blobs NewPayloads{ PayloadCount: 1, - ExpectedIncludedBlobCount: MAX_BLOBS_PER_BLOCK, + ExpectedIncludedBlobCount: cancun.MAX_BLOBS_PER_BLOCK, }, }, }, &CancunBaseSpec{ - Spec: test.Spec{ + BaseSpec: test.BaseSpec{ Name: "Blob Transaction Ordering, Multiple Accounts", About: ` - Send N blob transactions with MAX_BLOBS_PER_BLOCK-1 blobs each, + Send N blob transactions with cancun.MAX_BLOBS_PER_BLOCK-1 blobs each, using account A. Send N blob transactions with 1 blob each from account B. Verify that the payloads are created with the correct ordering: @@ -301,17 +268,15 @@ var Tests = []test.SpecInterface{ All transactions have sufficient data gas price to be included any of the payloads. `, + MainFork: config.Cancun, }, - // We fork on genesis - CancunForkHeight: 0, - TestSequence: TestSequence{ - // First send the MAX_BLOBS_PER_BLOCK-1 blob transactions from + // First send the cancun.MAX_BLOBS_PER_BLOCK-1 blob transactions from // account A. SendBlobTransactions{ TransactionCount: 5, - BlobsPerTransaction: MAX_BLOBS_PER_BLOCK - 1, + BlobsPerTransaction: cancun.MAX_BLOBS_PER_BLOCK - 1, BlobTransactionMaxBlobGasCost: big.NewInt(100), AccountIndex: 0, }, @@ -326,17 +291,17 @@ var Tests = []test.SpecInterface{ // All payloads have full blobs NewPayloads{ PayloadCount: 5, - ExpectedIncludedBlobCount: MAX_BLOBS_PER_BLOCK, + ExpectedIncludedBlobCount: cancun.MAX_BLOBS_PER_BLOCK, }, }, }, &CancunBaseSpec{ - Spec: test.Spec{ + BaseSpec: test.BaseSpec{ Name: "Blob Transaction Ordering, Multiple Clients", About: ` - Send N blob transactions with MAX_BLOBS_PER_BLOCK-1 blobs each, + Send N blob transactions with cancun.MAX_BLOBS_PER_BLOCK-1 blobs each, using account A, to client A. Send N blob transactions with 1 blob each from account B, to client B. @@ -345,11 +310,9 @@ var Tests = []test.SpecInterface{ All transactions have sufficient data gas price to be included any of the payloads. `, + MainFork: config.Cancun, }, - // We fork on genesis - CancunForkHeight: 0, - TestSequence: TestSequence{ // Start a secondary client to also receive blob transactions LaunchClients{ @@ -367,11 +330,11 @@ var Tests = []test.SpecInterface{ ExpectedIncludedBlobCount: 0, }, - // First send the MAX_BLOBS_PER_BLOCK-1 blob transactions from + // First send the cancun.MAX_BLOBS_PER_BLOCK-1 blob transactions from // account A, to client A. SendBlobTransactions{ TransactionCount: 5, - BlobsPerTransaction: MAX_BLOBS_PER_BLOCK - 1, + BlobsPerTransaction: cancun.MAX_BLOBS_PER_BLOCK - 1, BlobTransactionMaxBlobGasCost: big.NewInt(120), AccountIndex: 0, ClientIndex: 0, @@ -389,7 +352,7 @@ var Tests = []test.SpecInterface{ // All payloads have full blobs NewPayloads{ PayloadCount: 5, - ExpectedIncludedBlobCount: MAX_BLOBS_PER_BLOCK, + ExpectedIncludedBlobCount: cancun.MAX_BLOBS_PER_BLOCK, // Wait a bit more on before requesting the built payload from the client GetPayloadDelay: 2, }, @@ -398,17 +361,15 @@ var Tests = []test.SpecInterface{ &CancunBaseSpec{ - Spec: test.Spec{ + BaseSpec: test.BaseSpec{ Name: "Replace Blob Transactions", About: ` Test sending multiple blob transactions with the same nonce, but higher gas tip so the transaction is replaced. `, + MainFork: config.Cancun, }, - // We fork on genesis - CancunForkHeight: 0, - TestSequence: TestSequence{ // Send multiple blob transactions with the same nonce. SendBlobTransactions{ // Blob ID 0 @@ -450,96 +411,94 @@ var Tests = []test.SpecInterface{ &CancunBaseSpec{ - Spec: test.Spec{ + BaseSpec: test.BaseSpec{ Name: "Parallel Blob Transactions", About: ` Test sending multiple blob transactions in parallel from different accounts. Verify that a payload is created with the maximum number of blobs. `, + MainFork: config.Cancun, }, - // We fork on genesis - CancunForkHeight: 0, - TestSequence: TestSequence{ // Send multiple blob transactions with the same nonce. ParallelSteps{ Steps: []TestStep{ SendBlobTransactions{ TransactionCount: 5, - BlobsPerTransaction: MAX_BLOBS_PER_BLOCK, + BlobsPerTransaction: cancun.MAX_BLOBS_PER_BLOCK, BlobTransactionMaxBlobGasCost: big.NewInt(100), AccountIndex: 0, }, SendBlobTransactions{ TransactionCount: 5, - BlobsPerTransaction: MAX_BLOBS_PER_BLOCK, + BlobsPerTransaction: cancun.MAX_BLOBS_PER_BLOCK, BlobTransactionMaxBlobGasCost: big.NewInt(100), AccountIndex: 1, }, SendBlobTransactions{ TransactionCount: 5, - BlobsPerTransaction: MAX_BLOBS_PER_BLOCK, + BlobsPerTransaction: cancun.MAX_BLOBS_PER_BLOCK, BlobTransactionMaxBlobGasCost: big.NewInt(100), AccountIndex: 2, }, SendBlobTransactions{ TransactionCount: 5, - BlobsPerTransaction: MAX_BLOBS_PER_BLOCK, + BlobsPerTransaction: cancun.MAX_BLOBS_PER_BLOCK, BlobTransactionMaxBlobGasCost: big.NewInt(100), AccountIndex: 3, }, SendBlobTransactions{ TransactionCount: 5, - BlobsPerTransaction: MAX_BLOBS_PER_BLOCK, + BlobsPerTransaction: cancun.MAX_BLOBS_PER_BLOCK, BlobTransactionMaxBlobGasCost: big.NewInt(100), AccountIndex: 4, }, SendBlobTransactions{ TransactionCount: 5, - BlobsPerTransaction: MAX_BLOBS_PER_BLOCK, + BlobsPerTransaction: cancun.MAX_BLOBS_PER_BLOCK, BlobTransactionMaxBlobGasCost: big.NewInt(100), AccountIndex: 5, }, SendBlobTransactions{ TransactionCount: 5, - BlobsPerTransaction: MAX_BLOBS_PER_BLOCK, + BlobsPerTransaction: cancun.MAX_BLOBS_PER_BLOCK, BlobTransactionMaxBlobGasCost: big.NewInt(100), AccountIndex: 6, }, SendBlobTransactions{ TransactionCount: 5, - BlobsPerTransaction: MAX_BLOBS_PER_BLOCK, + BlobsPerTransaction: cancun.MAX_BLOBS_PER_BLOCK, BlobTransactionMaxBlobGasCost: big.NewInt(100), AccountIndex: 7, }, SendBlobTransactions{ TransactionCount: 5, - BlobsPerTransaction: MAX_BLOBS_PER_BLOCK, + BlobsPerTransaction: cancun.MAX_BLOBS_PER_BLOCK, BlobTransactionMaxBlobGasCost: big.NewInt(100), AccountIndex: 8, }, SendBlobTransactions{ TransactionCount: 5, - BlobsPerTransaction: MAX_BLOBS_PER_BLOCK, + BlobsPerTransaction: cancun.MAX_BLOBS_PER_BLOCK, BlobTransactionMaxBlobGasCost: big.NewInt(100), AccountIndex: 9, }, }, }, - // We create the first payload, which is guaranteed to have the first MAX_BLOBS_PER_BLOCK blobs. + // We create the first payload, which is guaranteed to have the first cancun.MAX_BLOBS_PER_BLOCK blobs. NewPayloads{ - ExpectedIncludedBlobCount: MAX_BLOBS_PER_BLOCK, - ExpectedBlobs: helper.GetBlobList(0, MAX_BLOBS_PER_BLOCK), + ExpectedIncludedBlobCount: cancun.MAX_BLOBS_PER_BLOCK, + ExpectedBlobs: helper.GetBlobList(0, cancun.MAX_BLOBS_PER_BLOCK), }, }, }, // ForkchoiceUpdatedV3 before cancun &CancunBaseSpec{ - Spec: test.Spec{ + BaseSpec: test.BaseSpec{ Name: "ForkchoiceUpdatedV3 Set Head to Shanghai Payload, Nil Payload Attributes", About: ` Test sending ForkchoiceUpdatedV3 to set the head of the chain to a Shanghai payload: @@ -548,10 +507,10 @@ var Tests = []test.SpecInterface{ Verify that client returns no error. `, + MainFork: config.Cancun, + ForkHeight: 2, }, - CancunForkHeight: 2, - TestSequence: TestSequence{ NewPayloads{ FcUOnHeadSet: &helper.UpgradeForkchoiceUpdatedVersion{ @@ -565,7 +524,7 @@ var Tests = []test.SpecInterface{ }, &CancunBaseSpec{ - Spec: test.Spec{ + BaseSpec: test.BaseSpec{ Name: "ForkchoiceUpdatedV3 To Request Shanghai Payload, Nil Beacon Root", About: ` Test sending ForkchoiceUpdatedV3 to request a Shanghai payload: @@ -574,26 +533,26 @@ var Tests = []test.SpecInterface{ Verify that client returns INVALID_PARAMS_ERROR. `, + MainFork: config.Cancun, + ForkHeight: 2, }, - CancunForkHeight: 2, - TestSequence: TestSequence{ NewPayloads{ FcUOnPayloadRequest: &helper.UpgradeForkchoiceUpdatedVersion{ ForkchoiceUpdatedCustomizer: &helper.BaseForkchoiceUpdatedCustomizer{ - ExpectedError: INVALID_PARAMS_ERROR, + ExpectedError: globals.INVALID_PARAMS_ERROR, }, }, ExpectationDescription: fmt.Sprintf(` ForkchoiceUpdatedV3 before Cancun with any nil field must return INVALID_PARAMS_ERROR (code %d) - `, *INVALID_PARAMS_ERROR), + `, *globals.INVALID_PARAMS_ERROR), }, }, }, &CancunBaseSpec{ - Spec: test.Spec{ + BaseSpec: test.BaseSpec{ Name: "ForkchoiceUpdatedV3 To Request Shanghai Payload, Zero Beacon Root", About: ` Test sending ForkchoiceUpdatedV3 to request a Shanghai payload: @@ -602,10 +561,10 @@ var Tests = []test.SpecInterface{ Verify that client returns UNSUPPORTED_FORK_ERROR. `, + MainFork: config.Cancun, + ForkHeight: 2, }, - CancunForkHeight: 2, - TestSequence: TestSequence{ NewPayloads{ FcUOnPayloadRequest: &helper.UpgradeForkchoiceUpdatedVersion{ @@ -613,19 +572,19 @@ var Tests = []test.SpecInterface{ PayloadAttributesCustomizer: &helper.BasePayloadAttributesCustomizer{ BeaconRoot: &(common.Hash{}), }, - ExpectedError: UNSUPPORTED_FORK_ERROR, + ExpectedError: globals.UNSUPPORTED_FORK_ERROR, }, }, ExpectationDescription: fmt.Sprintf(` ForkchoiceUpdatedV3 before Cancun with beacon root must return UNSUPPORTED_FORK_ERROR (code %d) - `, *UNSUPPORTED_FORK_ERROR), + `, *globals.UNSUPPORTED_FORK_ERROR), }, }, }, // ForkchoiceUpdatedV2 before cancun with beacon root &CancunBaseSpec{ - Spec: test.Spec{ + BaseSpec: test.BaseSpec{ Name: "ForkchoiceUpdatedV2 To Request Shanghai Payload, Zero Beacon Root", About: ` Test sending ForkchoiceUpdatedV2 to request a Cancun payload: @@ -634,10 +593,10 @@ var Tests = []test.SpecInterface{ Verify that client returns INVALID_PARAMS_ERROR. `, + MainFork: config.Cancun, + ForkHeight: 1, }, - CancunForkHeight: 1, - TestSequence: TestSequence{ NewPayloads{ FcUOnPayloadRequest: &helper.DowngradeForkchoiceUpdatedVersion{ @@ -645,19 +604,19 @@ var Tests = []test.SpecInterface{ PayloadAttributesCustomizer: &helper.BasePayloadAttributesCustomizer{ BeaconRoot: &(common.Hash{}), }, - ExpectedError: INVALID_PARAMS_ERROR, + ExpectedError: globals.INVALID_PARAMS_ERROR, }, }, ExpectationDescription: fmt.Sprintf(` ForkchoiceUpdatedV2 before Cancun with beacon root field must return INVALID_PARAMS_ERROR (code %d) - `, *INVALID_PARAMS_ERROR), + `, *globals.INVALID_PARAMS_ERROR), }, }, }, // ForkchoiceUpdatedV2 after cancun &CancunBaseSpec{ - Spec: test.Spec{ + BaseSpec: test.BaseSpec{ Name: "ForkchoiceUpdatedV2 To Request Cancun Payload, Zero Beacon Root", About: ` Test sending ForkchoiceUpdatedV2 to request a Cancun payload: @@ -666,25 +625,25 @@ var Tests = []test.SpecInterface{ Verify that client returns INVALID_PARAMS_ERROR. `, + MainFork: config.Cancun, + ForkHeight: 1, }, - CancunForkHeight: 1, - TestSequence: TestSequence{ NewPayloads{ FcUOnPayloadRequest: &helper.DowngradeForkchoiceUpdatedVersion{ ForkchoiceUpdatedCustomizer: &helper.BaseForkchoiceUpdatedCustomizer{ - ExpectedError: INVALID_PARAMS_ERROR, + ExpectedError: globals.INVALID_PARAMS_ERROR, }, }, ExpectationDescription: fmt.Sprintf(` ForkchoiceUpdatedV2 after Cancun with beacon root field must return INVALID_PARAMS_ERROR (code %d) - `, *INVALID_PARAMS_ERROR), + `, *globals.INVALID_PARAMS_ERROR), }, }, }, &CancunBaseSpec{ - Spec: test.Spec{ + BaseSpec: test.BaseSpec{ Name: "ForkchoiceUpdatedV2 To Request Cancun Payload, Nil Beacon Root", About: ` Test sending ForkchoiceUpdatedV2 to request a Cancun payload: @@ -693,10 +652,10 @@ var Tests = []test.SpecInterface{ Verify that client returns UNSUPPORTED_FORK_ERROR. `, + MainFork: config.Cancun, + ForkHeight: 1, }, - CancunForkHeight: 1, - TestSequence: TestSequence{ NewPayloads{ FcUOnPayloadRequest: &helper.DowngradeForkchoiceUpdatedVersion{ @@ -704,37 +663,36 @@ var Tests = []test.SpecInterface{ PayloadAttributesCustomizer: &helper.BasePayloadAttributesCustomizer{ RemoveBeaconRoot: true, }, - ExpectedError: UNSUPPORTED_FORK_ERROR, + ExpectedError: globals.UNSUPPORTED_FORK_ERROR, }, }, ExpectationDescription: fmt.Sprintf(` ForkchoiceUpdatedV2 after Cancun must return UNSUPPORTED_FORK_ERROR (code %d) - `, *UNSUPPORTED_FORK_ERROR), + `, *globals.UNSUPPORTED_FORK_ERROR), }, }, }, // ForkchoiceUpdatedV3 with modified BeaconRoot Attribute &CancunBaseSpec{ - Spec: test.Spec{ + BaseSpec: test.BaseSpec{ Name: "ForkchoiceUpdatedV3 Modifies Payload ID on Different Beacon Root", About: ` Test requesting a Cancun Payload using ForkchoiceUpdatedV3 twice with the beacon root payload attribute as the only change between requests and verify that the payload ID is different. `, + MainFork: config.Cancun, }, - CancunForkHeight: 0, - TestSequence: TestSequence{ SendBlobTransactions{ TransactionCount: 1, - BlobsPerTransaction: MAX_BLOBS_PER_BLOCK, + BlobsPerTransaction: cancun.MAX_BLOBS_PER_BLOCK, BlobTransactionMaxBlobGasCost: big.NewInt(100), }, NewPayloads{ - ExpectedIncludedBlobCount: MAX_BLOBS_PER_BLOCK, + ExpectedIncludedBlobCount: cancun.MAX_BLOBS_PER_BLOCK, FcUOnPayloadRequest: &helper.BaseForkchoiceUpdatedCustomizer{ PayloadAttributesCustomizer: &helper.BasePayloadAttributesCustomizer{ BeaconRoot: &(common.Hash{}), @@ -743,11 +701,11 @@ var Tests = []test.SpecInterface{ }, SendBlobTransactions{ TransactionCount: 1, - BlobsPerTransaction: MAX_BLOBS_PER_BLOCK, + BlobsPerTransaction: cancun.MAX_BLOBS_PER_BLOCK, BlobTransactionMaxBlobGasCost: big.NewInt(100), }, NewPayloads{ - ExpectedIncludedBlobCount: MAX_BLOBS_PER_BLOCK, + ExpectedIncludedBlobCount: cancun.MAX_BLOBS_PER_BLOCK, FcUOnPayloadRequest: &helper.BaseForkchoiceUpdatedCustomizer{ PayloadAttributesCustomizer: &helper.BasePayloadAttributesCustomizer{ BeaconRoot: &(common.Hash{1}), @@ -759,59 +717,59 @@ var Tests = []test.SpecInterface{ // GetPayloadV3 Before Cancun, Negative Tests &CancunBaseSpec{ - Spec: test.Spec{ + BaseSpec: test.BaseSpec{ Name: "GetPayloadV3 To Request Shanghai Payload", About: ` Test requesting a Shanghai PayloadID using GetPayloadV3. Verify that client returns UNSUPPORTED_FORK_ERROR. `, + MainFork: config.Cancun, + ForkHeight: 2, }, - CancunForkHeight: 2, - TestSequence: TestSequence{ NewPayloads{ GetPayloadCustomizer: &helper.UpgradeGetPayloadVersion{ GetPayloadCustomizer: &helper.BaseGetPayloadCustomizer{ - ExpectedError: UNSUPPORTED_FORK_ERROR, + ExpectedError: globals.UNSUPPORTED_FORK_ERROR, }, }, ExpectationDescription: fmt.Sprintf(` GetPayloadV3 To Request Shanghai Payload must return UNSUPPORTED_FORK_ERROR (code %d) - `, *UNSUPPORTED_FORK_ERROR), + `, *globals.UNSUPPORTED_FORK_ERROR), }, }, }, // GetPayloadV2 After Cancun, Negative Tests &CancunBaseSpec{ - Spec: test.Spec{ + BaseSpec: test.BaseSpec{ Name: "GetPayloadV2 To Request Cancun Payload", About: ` Test requesting a Cancun PayloadID using GetPayloadV2. Verify that client returns UNSUPPORTED_FORK_ERROR. `, + MainFork: config.Cancun, + ForkHeight: 1, }, - CancunForkHeight: 1, - TestSequence: TestSequence{ NewPayloads{ GetPayloadCustomizer: &helper.DowngradeGetPayloadVersion{ GetPayloadCustomizer: &helper.BaseGetPayloadCustomizer{ - ExpectedError: UNSUPPORTED_FORK_ERROR, + ExpectedError: globals.UNSUPPORTED_FORK_ERROR, }, }, ExpectationDescription: fmt.Sprintf(` GetPayloadV2 To Request Cancun Payload must return UNSUPPORTED_FORK_ERROR (code %d) - `, *UNSUPPORTED_FORK_ERROR), + `, *globals.UNSUPPORTED_FORK_ERROR), }, }, }, // NewPayloadV3 Before Cancun, Negative Tests &CancunBaseSpec{ - Spec: test.Spec{ + BaseSpec: test.BaseSpec{ Name: "NewPayloadV3 Before Cancun, Nil Data Fields, Nil Versioned Hashes, Nil Beacon Root", About: ` Test sending NewPayloadV3 Before Cancun with: @@ -822,28 +780,30 @@ var Tests = []test.SpecInterface{ Verify that client returns INVALID_PARAMS_ERROR `, + MainFork: config.Cancun, + ForkHeight: 2, }, - CancunForkHeight: 2, - TestSequence: TestSequence{ NewPayloads{ NewPayloadCustomizer: &helper.UpgradeNewPayloadVersion{ NewPayloadCustomizer: &helper.BaseNewPayloadVersionCustomizer{ - VersionedHashesCustomizer: &VersionedHashes{ - Blobs: nil, + PayloadCustomizer: &helper.CustomPayloadData{ + VersionedHashesCustomizer: &VersionedHashes{ + Blobs: nil, + }, }, - ExpectedError: INVALID_PARAMS_ERROR, + ExpectedError: globals.INVALID_PARAMS_ERROR, }, }, ExpectationDescription: fmt.Sprintf(` NewPayloadV3 before Cancun with any nil field must return INVALID_PARAMS_ERROR (code %d) - `, *INVALID_PARAMS_ERROR), + `, *globals.INVALID_PARAMS_ERROR), }, }, }, &CancunBaseSpec{ - Spec: test.Spec{ + BaseSpec: test.BaseSpec{ Name: "NewPayloadV3 Before Cancun, Nil ExcessBlobGas, 0x00 BlobGasUsed, Nil Versioned Hashes, Nil Beacon Root", About: ` Test sending NewPayloadV3 Before Cancun with: @@ -852,10 +812,10 @@ var Tests = []test.SpecInterface{ - nil Versioned Hashes Array - nil Beacon Root `, + MainFork: config.Cancun, + ForkHeight: 2, }, - CancunForkHeight: 2, - TestSequence: TestSequence{ NewPayloads{ NewPayloadCustomizer: &helper.UpgradeNewPayloadVersion{ @@ -863,17 +823,17 @@ var Tests = []test.SpecInterface{ PayloadCustomizer: &helper.CustomPayloadData{ BlobGasUsed: pUint64(0), }, - ExpectedError: INVALID_PARAMS_ERROR, + ExpectedError: globals.INVALID_PARAMS_ERROR, }, }, ExpectationDescription: fmt.Sprintf(` NewPayloadV3 before Cancun with any nil field must return INVALID_PARAMS_ERROR (code %d) - `, *INVALID_PARAMS_ERROR), + `, *globals.INVALID_PARAMS_ERROR), }, }, }, &CancunBaseSpec{ - Spec: test.Spec{ + BaseSpec: test.BaseSpec{ Name: "NewPayloadV3 Before Cancun, 0x00 ExcessBlobGas, Nil BlobGasUsed, Nil Versioned Hashes, Nil Beacon Root", About: ` Test sending NewPayloadV3 Before Cancun with: @@ -882,10 +842,10 @@ var Tests = []test.SpecInterface{ - nil Versioned Hashes Array - nil Beacon Root `, + MainFork: config.Cancun, + ForkHeight: 2, }, - CancunForkHeight: 2, - TestSequence: TestSequence{ NewPayloads{ NewPayloadCustomizer: &helper.UpgradeNewPayloadVersion{ @@ -893,17 +853,17 @@ var Tests = []test.SpecInterface{ PayloadCustomizer: &helper.CustomPayloadData{ ExcessBlobGas: pUint64(0), }, - ExpectedError: INVALID_PARAMS_ERROR, + ExpectedError: globals.INVALID_PARAMS_ERROR, }, }, ExpectationDescription: fmt.Sprintf(` NewPayloadV3 before Cancun with any nil field must return INVALID_PARAMS_ERROR (code %d) - `, *INVALID_PARAMS_ERROR), + `, *globals.INVALID_PARAMS_ERROR), }, }, }, &CancunBaseSpec{ - Spec: test.Spec{ + BaseSpec: test.BaseSpec{ Name: "NewPayloadV3 Before Cancun, Nil Data Fields, Empty Array Versioned Hashes, Nil Beacon Root", About: ` Test sending NewPayloadV3 Before Cancun with: @@ -912,28 +872,30 @@ var Tests = []test.SpecInterface{ - Empty Versioned Hashes Array - nil Beacon Root `, + MainFork: config.Cancun, + ForkHeight: 2, }, - CancunForkHeight: 2, - TestSequence: TestSequence{ NewPayloads{ NewPayloadCustomizer: &helper.UpgradeNewPayloadVersion{ NewPayloadCustomizer: &helper.BaseNewPayloadVersionCustomizer{ - VersionedHashesCustomizer: &VersionedHashes{ - Blobs: []helper.BlobID{}, + PayloadCustomizer: &helper.CustomPayloadData{ + VersionedHashesCustomizer: &VersionedHashes{ + Blobs: []helper.BlobID{}, + }, }, - ExpectedError: INVALID_PARAMS_ERROR, + ExpectedError: globals.INVALID_PARAMS_ERROR, }, }, ExpectationDescription: fmt.Sprintf(` NewPayloadV3 before Cancun with any nil field must return INVALID_PARAMS_ERROR (code %d) - `, *INVALID_PARAMS_ERROR), + `, *globals.INVALID_PARAMS_ERROR), }, }, }, &CancunBaseSpec{ - Spec: test.Spec{ + BaseSpec: test.BaseSpec{ Name: "NewPayloadV3 Before Cancun, Nil Data Fields, Nil Versioned Hashes, Zero Beacon Root", About: ` Test sending NewPayloadV3 Before Cancun with: @@ -942,10 +904,10 @@ var Tests = []test.SpecInterface{ - nil Versioned Hashes Array - Zero Beacon Root `, + MainFork: config.Cancun, + ForkHeight: 2, }, - CancunForkHeight: 2, - TestSequence: TestSequence{ NewPayloads{ NewPayloadCustomizer: &helper.UpgradeNewPayloadVersion{ @@ -953,17 +915,17 @@ var Tests = []test.SpecInterface{ PayloadCustomizer: &helper.CustomPayloadData{ ParentBeaconRoot: &(common.Hash{}), }, - ExpectedError: INVALID_PARAMS_ERROR, + ExpectedError: globals.INVALID_PARAMS_ERROR, }, }, ExpectationDescription: fmt.Sprintf(` NewPayloadV3 before Cancun with any nil field must return INVALID_PARAMS_ERROR (code %d) - `, *INVALID_PARAMS_ERROR), + `, *globals.INVALID_PARAMS_ERROR), }, }, }, &CancunBaseSpec{ - Spec: test.Spec{ + BaseSpec: test.BaseSpec{ Name: "NewPayloadV3 Before Cancun, 0x00 Data Fields, Empty Array Versioned Hashes, Zero Beacon Root", About: ` Test sending NewPayloadV3 Before Cancun with: @@ -972,10 +934,10 @@ var Tests = []test.SpecInterface{ - Empty Versioned Hashes Array - Zero Beacon Root `, + MainFork: config.Cancun, + ForkHeight: 2, }, - CancunForkHeight: 2, - TestSequence: TestSequence{ NewPayloads{ NewPayloadCustomizer: &helper.UpgradeNewPayloadVersion{ @@ -984,23 +946,23 @@ var Tests = []test.SpecInterface{ ExcessBlobGas: pUint64(0), BlobGasUsed: pUint64(0), ParentBeaconRoot: &(common.Hash{}), + VersionedHashesCustomizer: &VersionedHashes{ + Blobs: []helper.BlobID{}, + }, }, - VersionedHashesCustomizer: &VersionedHashes{ - Blobs: []helper.BlobID{}, - }, - ExpectedError: UNSUPPORTED_FORK_ERROR, + ExpectedError: globals.UNSUPPORTED_FORK_ERROR, }, }, ExpectationDescription: fmt.Sprintf(` NewPayloadV3 before Cancun with no nil fields must return UNSUPPORTED_FORK_ERROR (code %d) - `, *UNSUPPORTED_FORK_ERROR), + `, *globals.UNSUPPORTED_FORK_ERROR), }, }, }, // NewPayloadV3 After Cancun, Negative Tests &CancunBaseSpec{ - Spec: test.Spec{ + BaseSpec: test.BaseSpec{ Name: "NewPayloadV3 After Cancun, Nil ExcessBlobGas, 0x00 BlobGasUsed, Empty Array Versioned Hashes, Zero Beacon Root", About: ` Test sending NewPayloadV3 After Cancun with: @@ -1009,26 +971,26 @@ var Tests = []test.SpecInterface{ - Empty Versioned Hashes Array - Zero Beacon Root `, + MainFork: config.Cancun, + ForkHeight: 1, }, - CancunForkHeight: 1, - TestSequence: TestSequence{ NewPayloads{ NewPayloadCustomizer: &helper.BaseNewPayloadVersionCustomizer{ PayloadCustomizer: &helper.CustomPayloadData{ RemoveExcessBlobGas: true, }, - ExpectedError: INVALID_PARAMS_ERROR, + ExpectedError: globals.INVALID_PARAMS_ERROR, }, ExpectationDescription: fmt.Sprintf(` NewPayloadV3 after Cancun with nil ExcessBlobGas must return INVALID_PARAMS_ERROR (code %d) - `, *INVALID_PARAMS_ERROR), + `, *globals.INVALID_PARAMS_ERROR), }, }, }, &CancunBaseSpec{ - Spec: test.Spec{ + BaseSpec: test.BaseSpec{ Name: "NewPayloadV3 After Cancun, 0x00 ExcessBlobGas, Nil BlobGasUsed, Empty Array Versioned Hashes", About: ` Test sending NewPayloadV3 After Cancun with: @@ -1036,26 +998,26 @@ var Tests = []test.SpecInterface{ - nil BlobGasUsed - Empty Versioned Hashes Array `, + MainFork: config.Cancun, + ForkHeight: 1, }, - CancunForkHeight: 1, - TestSequence: TestSequence{ NewPayloads{ NewPayloadCustomizer: &helper.BaseNewPayloadVersionCustomizer{ PayloadCustomizer: &helper.CustomPayloadData{ RemoveBlobGasUsed: true, }, - ExpectedError: INVALID_PARAMS_ERROR, + ExpectedError: globals.INVALID_PARAMS_ERROR, }, ExpectationDescription: fmt.Sprintf(` NewPayloadV3 after Cancun with nil BlobGasUsed must return INVALID_PARAMS_ERROR (code %d) - `, *INVALID_PARAMS_ERROR), + `, *globals.INVALID_PARAMS_ERROR), }, }, }, &CancunBaseSpec{ - Spec: test.Spec{ + BaseSpec: test.BaseSpec{ Name: "NewPayloadV3 After Cancun, 0x00 Blob Fields, Empty Array Versioned Hashes, Nil Beacon Root", About: ` Test sending NewPayloadV3 After Cancun with: @@ -1063,50 +1025,50 @@ var Tests = []test.SpecInterface{ - nil BlobGasUsed - Empty Versioned Hashes Array `, + MainFork: config.Cancun, + ForkHeight: 1, }, - CancunForkHeight: 1, - TestSequence: TestSequence{ NewPayloads{ NewPayloadCustomizer: &helper.BaseNewPayloadVersionCustomizer{ PayloadCustomizer: &helper.CustomPayloadData{ RemoveParentBeaconRoot: true, }, - ExpectedError: INVALID_PARAMS_ERROR, + ExpectedError: globals.INVALID_PARAMS_ERROR, }, ExpectationDescription: fmt.Sprintf(` NewPayloadV3 after Cancun with nil parentBeaconBlockRoot must return INVALID_PARAMS_ERROR (code %d) - `, *INVALID_PARAMS_ERROR), + `, *globals.INVALID_PARAMS_ERROR), }, }, }, // Fork time tests &CancunBaseSpec{ - Spec: test.Spec{ + BaseSpec: test.BaseSpec{ Name: "ForkchoiceUpdatedV2 then ForkchoiceUpdatedV3 Valid Payload Building Requests", About: ` Test requesting a Shanghai ForkchoiceUpdatedV2 payload followed by a Cancun ForkchoiceUpdatedV3 request. Verify that client correctly returns the Cancun payload. `, + MainFork: config.Cancun, + // We request two blocks from the client, first on shanghai and then on cancun, both with + // the same parent. + // Client must respond correctly to later request. + ForkHeight: 1, + BlockTimestampIncrement: 2, }, - // We request two blocks from the client, first on shanghai and then on cancun, both with - // the same parent. - // Client must respond correctly to later request. - CancunForkHeight: 1, - TimeIncrements: 2, - TestSequence: TestSequence{ // First, we send a couple of blob transactions on genesis, // with enough data gas cost to make sure they are included in the first block. SendBlobTransactions{ - TransactionCount: TARGET_BLOBS_PER_BLOCK, + TransactionCount: cancun.TARGET_BLOBS_PER_BLOCK, BlobTransactionMaxBlobGasCost: big.NewInt(1), }, NewPayloads{ - ExpectedIncludedBlobCount: TARGET_BLOBS_PER_BLOCK, + ExpectedIncludedBlobCount: cancun.TARGET_BLOBS_PER_BLOCK, // This customizer only simulates requesting a Shanghai payload 1 second before cancun. // CL Mock will still request the Cancun payload afterwards FcUOnPayloadRequest: &helper.BaseForkchoiceUpdatedCustomizer{ @@ -1127,24 +1089,27 @@ var Tests = []test.SpecInterface{ // Test versioned hashes in Engine API NewPayloadV3 &CancunBaseSpec{ - Spec: test.Spec{ + BaseSpec: test.BaseSpec{ Name: "NewPayloadV3 Versioned Hashes, Missing Hash", About: ` Tests VersionedHashes in Engine API NewPayloadV3 where the array is missing one of the hashes. `, + MainFork: config.Cancun, }, TestSequence: TestSequence{ SendBlobTransactions{ - TransactionCount: TARGET_BLOBS_PER_BLOCK, + TransactionCount: cancun.TARGET_BLOBS_PER_BLOCK, BlobTransactionMaxBlobGasCost: big.NewInt(1), }, NewPayloads{ - ExpectedIncludedBlobCount: TARGET_BLOBS_PER_BLOCK, - ExpectedBlobs: helper.GetBlobList(0, TARGET_BLOBS_PER_BLOCK), + ExpectedIncludedBlobCount: cancun.TARGET_BLOBS_PER_BLOCK, + ExpectedBlobs: helper.GetBlobList(0, cancun.TARGET_BLOBS_PER_BLOCK), NewPayloadCustomizer: &helper.BaseNewPayloadVersionCustomizer{ - VersionedHashesCustomizer: &VersionedHashes{ - Blobs: helper.GetBlobList(0, TARGET_BLOBS_PER_BLOCK-1), + PayloadCustomizer: &helper.CustomPayloadData{ + VersionedHashesCustomizer: &VersionedHashes{ + Blobs: helper.GetBlobList(0, cancun.TARGET_BLOBS_PER_BLOCK-1), + }, }, ExpectInvalidStatus: true, }, @@ -1156,26 +1121,29 @@ var Tests = []test.SpecInterface{ }, &CancunBaseSpec{ - Spec: test.Spec{ + BaseSpec: test.BaseSpec{ Name: "NewPayloadV3 Versioned Hashes, Extra Hash", About: ` Tests VersionedHashes in Engine API NewPayloadV3 where the array is has an extra hash for a blob that is not in the payload. `, + MainFork: config.Cancun, }, // TODO: It could be worth it to also test this with a blob that is in the // mempool but was not included in the payload. TestSequence: TestSequence{ SendBlobTransactions{ - TransactionCount: TARGET_BLOBS_PER_BLOCK, + TransactionCount: cancun.TARGET_BLOBS_PER_BLOCK, BlobTransactionMaxBlobGasCost: big.NewInt(1), }, NewPayloads{ - ExpectedIncludedBlobCount: TARGET_BLOBS_PER_BLOCK, - ExpectedBlobs: helper.GetBlobList(0, TARGET_BLOBS_PER_BLOCK), + ExpectedIncludedBlobCount: cancun.TARGET_BLOBS_PER_BLOCK, + ExpectedBlobs: helper.GetBlobList(0, cancun.TARGET_BLOBS_PER_BLOCK), NewPayloadCustomizer: &helper.BaseNewPayloadVersionCustomizer{ - VersionedHashesCustomizer: &VersionedHashes{ - Blobs: helper.GetBlobList(0, TARGET_BLOBS_PER_BLOCK+1), + PayloadCustomizer: &helper.CustomPayloadData{ + VersionedHashesCustomizer: &VersionedHashes{ + Blobs: helper.GetBlobList(0, cancun.TARGET_BLOBS_PER_BLOCK+1), + }, }, ExpectInvalidStatus: true, }, @@ -1187,24 +1155,27 @@ var Tests = []test.SpecInterface{ }, &CancunBaseSpec{ - Spec: test.Spec{ + BaseSpec: test.BaseSpec{ Name: "NewPayloadV3 Versioned Hashes, Out of Order", About: ` Tests VersionedHashes in Engine API NewPayloadV3 where the array is out of order. `, + MainFork: config.Cancun, }, TestSequence: TestSequence{ SendBlobTransactions{ - TransactionCount: TARGET_BLOBS_PER_BLOCK, + TransactionCount: cancun.TARGET_BLOBS_PER_BLOCK, BlobTransactionMaxBlobGasCost: big.NewInt(1), }, NewPayloads{ - ExpectedIncludedBlobCount: TARGET_BLOBS_PER_BLOCK, - ExpectedBlobs: helper.GetBlobList(0, TARGET_BLOBS_PER_BLOCK), + ExpectedIncludedBlobCount: cancun.TARGET_BLOBS_PER_BLOCK, + ExpectedBlobs: helper.GetBlobList(0, cancun.TARGET_BLOBS_PER_BLOCK), NewPayloadCustomizer: &helper.BaseNewPayloadVersionCustomizer{ - VersionedHashesCustomizer: &VersionedHashes{ - Blobs: helper.GetBlobListByIndex(helper.BlobID(TARGET_BLOBS_PER_BLOCK-1), 0), + PayloadCustomizer: &helper.CustomPayloadData{ + VersionedHashesCustomizer: &VersionedHashes{ + Blobs: helper.GetBlobListByIndex(helper.BlobID(cancun.TARGET_BLOBS_PER_BLOCK-1), 0), + }, }, ExpectInvalidStatus: true, }, @@ -1216,24 +1187,27 @@ var Tests = []test.SpecInterface{ }, &CancunBaseSpec{ - Spec: test.Spec{ + BaseSpec: test.BaseSpec{ Name: "NewPayloadV3 Versioned Hashes, Repeated Hash", About: ` Tests VersionedHashes in Engine API NewPayloadV3 where the array has a blob that is repeated in the array. `, + MainFork: config.Cancun, }, TestSequence: TestSequence{ SendBlobTransactions{ - TransactionCount: TARGET_BLOBS_PER_BLOCK, + TransactionCount: cancun.TARGET_BLOBS_PER_BLOCK, BlobTransactionMaxBlobGasCost: big.NewInt(1), }, NewPayloads{ - ExpectedIncludedBlobCount: TARGET_BLOBS_PER_BLOCK, - ExpectedBlobs: helper.GetBlobList(0, TARGET_BLOBS_PER_BLOCK), + ExpectedIncludedBlobCount: cancun.TARGET_BLOBS_PER_BLOCK, + ExpectedBlobs: helper.GetBlobList(0, cancun.TARGET_BLOBS_PER_BLOCK), NewPayloadCustomizer: &helper.BaseNewPayloadVersionCustomizer{ - VersionedHashesCustomizer: &VersionedHashes{ - Blobs: append(helper.GetBlobList(0, TARGET_BLOBS_PER_BLOCK), helper.BlobID(TARGET_BLOBS_PER_BLOCK-1)), + PayloadCustomizer: &helper.CustomPayloadData{ + VersionedHashesCustomizer: &VersionedHashes{ + Blobs: append(helper.GetBlobList(0, cancun.TARGET_BLOBS_PER_BLOCK), helper.BlobID(cancun.TARGET_BLOBS_PER_BLOCK-1)), + }, }, ExpectInvalidStatus: true, }, @@ -1245,24 +1219,27 @@ var Tests = []test.SpecInterface{ }, &CancunBaseSpec{ - Spec: test.Spec{ + BaseSpec: test.BaseSpec{ Name: "NewPayloadV3 Versioned Hashes, Incorrect Hash", About: ` Tests VersionedHashes in Engine API NewPayloadV3 where the array has a blob hash that does not belong to any blob contained in the payload. `, + MainFork: config.Cancun, }, TestSequence: TestSequence{ SendBlobTransactions{ - TransactionCount: TARGET_BLOBS_PER_BLOCK, + TransactionCount: cancun.TARGET_BLOBS_PER_BLOCK, BlobTransactionMaxBlobGasCost: big.NewInt(1), }, NewPayloads{ - ExpectedIncludedBlobCount: TARGET_BLOBS_PER_BLOCK, - ExpectedBlobs: helper.GetBlobList(0, TARGET_BLOBS_PER_BLOCK), + ExpectedIncludedBlobCount: cancun.TARGET_BLOBS_PER_BLOCK, + ExpectedBlobs: helper.GetBlobList(0, cancun.TARGET_BLOBS_PER_BLOCK), NewPayloadCustomizer: &helper.BaseNewPayloadVersionCustomizer{ - VersionedHashesCustomizer: &VersionedHashes{ - Blobs: append(helper.GetBlobList(0, TARGET_BLOBS_PER_BLOCK-1), helper.BlobID(TARGET_BLOBS_PER_BLOCK)), + PayloadCustomizer: &helper.CustomPayloadData{ + VersionedHashesCustomizer: &VersionedHashes{ + Blobs: append(helper.GetBlobList(0, cancun.TARGET_BLOBS_PER_BLOCK-1), helper.BlobID(cancun.TARGET_BLOBS_PER_BLOCK)), + }, }, ExpectInvalidStatus: true, }, @@ -1273,25 +1250,28 @@ var Tests = []test.SpecInterface{ }, }, &CancunBaseSpec{ - Spec: test.Spec{ + BaseSpec: test.BaseSpec{ Name: "NewPayloadV3 Versioned Hashes, Incorrect Version", About: ` Tests VersionedHashes in Engine API NewPayloadV3 where the array has a single blob that has an incorrect version. `, + MainFork: config.Cancun, }, TestSequence: TestSequence{ SendBlobTransactions{ - TransactionCount: TARGET_BLOBS_PER_BLOCK, + TransactionCount: cancun.TARGET_BLOBS_PER_BLOCK, BlobTransactionMaxBlobGasCost: big.NewInt(1), }, NewPayloads{ - ExpectedIncludedBlobCount: TARGET_BLOBS_PER_BLOCK, - ExpectedBlobs: helper.GetBlobList(0, TARGET_BLOBS_PER_BLOCK), + ExpectedIncludedBlobCount: cancun.TARGET_BLOBS_PER_BLOCK, + ExpectedBlobs: helper.GetBlobList(0, cancun.TARGET_BLOBS_PER_BLOCK), NewPayloadCustomizer: &helper.BaseNewPayloadVersionCustomizer{ - VersionedHashesCustomizer: &VersionedHashes{ - Blobs: helper.GetBlobList(0, TARGET_BLOBS_PER_BLOCK), - HashVersions: []byte{BLOB_COMMITMENT_VERSION_KZG, BLOB_COMMITMENT_VERSION_KZG + 1}, + PayloadCustomizer: &helper.CustomPayloadData{ + VersionedHashesCustomizer: &VersionedHashes{ + Blobs: helper.GetBlobList(0, cancun.TARGET_BLOBS_PER_BLOCK), + HashVersions: []byte{cancun.BLOB_COMMITMENT_VERSION_KZG, cancun.BLOB_COMMITMENT_VERSION_KZG + 1}, + }, }, ExpectInvalidStatus: true, }, @@ -1303,26 +1283,29 @@ var Tests = []test.SpecInterface{ }, &CancunBaseSpec{ - Spec: test.Spec{ + BaseSpec: test.BaseSpec{ Name: "NewPayloadV3 Versioned Hashes, Nil Hashes", About: ` Tests VersionedHashes in Engine API NewPayloadV3 where the array is nil, even though the fork has already happened. `, + MainFork: config.Cancun, }, TestSequence: TestSequence{ SendBlobTransactions{ - TransactionCount: TARGET_BLOBS_PER_BLOCK, + TransactionCount: cancun.TARGET_BLOBS_PER_BLOCK, BlobTransactionMaxBlobGasCost: big.NewInt(1), }, NewPayloads{ - ExpectedIncludedBlobCount: TARGET_BLOBS_PER_BLOCK, - ExpectedBlobs: helper.GetBlobList(0, TARGET_BLOBS_PER_BLOCK), + ExpectedIncludedBlobCount: cancun.TARGET_BLOBS_PER_BLOCK, + ExpectedBlobs: helper.GetBlobList(0, cancun.TARGET_BLOBS_PER_BLOCK), NewPayloadCustomizer: &helper.BaseNewPayloadVersionCustomizer{ - VersionedHashesCustomizer: &VersionedHashes{ - Blobs: nil, + PayloadCustomizer: &helper.CustomPayloadData{ + VersionedHashesCustomizer: &VersionedHashes{ + Blobs: nil, + }, }, - ExpectedError: INVALID_PARAMS_ERROR, + ExpectedError: globals.INVALID_PARAMS_ERROR, }, ExpectationDescription: ` NewPayloadV3 after Cancun with nil VersionedHashes must return INVALID_PARAMS_ERROR (code -32602) @@ -1332,24 +1315,27 @@ var Tests = []test.SpecInterface{ }, &CancunBaseSpec{ - Spec: test.Spec{ + BaseSpec: test.BaseSpec{ Name: "NewPayloadV3 Versioned Hashes, Empty Hashes", About: ` Tests VersionedHashes in Engine API NewPayloadV3 where the array is empty, even though there are blobs in the payload. `, + MainFork: config.Cancun, }, TestSequence: TestSequence{ SendBlobTransactions{ - TransactionCount: TARGET_BLOBS_PER_BLOCK, + TransactionCount: cancun.TARGET_BLOBS_PER_BLOCK, BlobTransactionMaxBlobGasCost: big.NewInt(1), }, NewPayloads{ - ExpectedIncludedBlobCount: TARGET_BLOBS_PER_BLOCK, - ExpectedBlobs: helper.GetBlobList(0, TARGET_BLOBS_PER_BLOCK), + ExpectedIncludedBlobCount: cancun.TARGET_BLOBS_PER_BLOCK, + ExpectedBlobs: helper.GetBlobList(0, cancun.TARGET_BLOBS_PER_BLOCK), NewPayloadCustomizer: &helper.BaseNewPayloadVersionCustomizer{ - VersionedHashesCustomizer: &VersionedHashes{ - Blobs: []helper.BlobID{}, + PayloadCustomizer: &helper.CustomPayloadData{ + VersionedHashesCustomizer: &VersionedHashes{ + Blobs: []helper.BlobID{}, + }, }, ExpectInvalidStatus: true, }, @@ -1361,19 +1347,22 @@ var Tests = []test.SpecInterface{ }, &CancunBaseSpec{ - Spec: test.Spec{ + BaseSpec: test.BaseSpec{ Name: "NewPayloadV3 Versioned Hashes, Non-Empty Hashes", About: ` Tests VersionedHashes in Engine API NewPayloadV3 where the array is contains hashes, even though there are no blobs in the payload. `, + MainFork: config.Cancun, }, TestSequence: TestSequence{ NewPayloads{ ExpectedBlobs: []helper.BlobID{}, NewPayloadCustomizer: &helper.BaseNewPayloadVersionCustomizer{ - VersionedHashesCustomizer: &VersionedHashes{ - Blobs: []helper.BlobID{0}, + PayloadCustomizer: &helper.CustomPayloadData{ + VersionedHashesCustomizer: &VersionedHashes{ + Blobs: []helper.BlobID{0}, + }, }, ExpectInvalidStatus: true, }, @@ -1387,22 +1376,23 @@ var Tests = []test.SpecInterface{ // Test versioned hashes in Engine API NewPayloadV3 on syncing clients &CancunBaseSpec{ - Spec: test.Spec{ + BaseSpec: test.BaseSpec{ Name: "NewPayloadV3 Versioned Hashes, Missing Hash (Syncing)", About: ` Tests VersionedHashes in Engine API NewPayloadV3 where the array is missing one of the hashes. `, + MainFork: config.Cancun, }, TestSequence: TestSequence{ NewPayloads{}, // Send new payload so the parent is unknown to the secondary client SendBlobTransactions{ - TransactionCount: TARGET_BLOBS_PER_BLOCK, + TransactionCount: cancun.TARGET_BLOBS_PER_BLOCK, BlobTransactionMaxBlobGasCost: big.NewInt(1), }, NewPayloads{ - ExpectedIncludedBlobCount: TARGET_BLOBS_PER_BLOCK, - ExpectedBlobs: helper.GetBlobList(0, TARGET_BLOBS_PER_BLOCK), + ExpectedIncludedBlobCount: cancun.TARGET_BLOBS_PER_BLOCK, + ExpectedBlobs: helper.GetBlobList(0, cancun.TARGET_BLOBS_PER_BLOCK), }, LaunchClients{ @@ -1413,8 +1403,10 @@ var Tests = []test.SpecInterface{ SendModifiedLatestPayload{ ClientID: 1, NewPayloadCustomizer: &helper.BaseNewPayloadVersionCustomizer{ - VersionedHashesCustomizer: &VersionedHashes{ - Blobs: helper.GetBlobList(0, TARGET_BLOBS_PER_BLOCK-1), + PayloadCustomizer: &helper.CustomPayloadData{ + VersionedHashesCustomizer: &VersionedHashes{ + Blobs: helper.GetBlobList(0, cancun.TARGET_BLOBS_PER_BLOCK-1), + }, }, ExpectInvalidStatus: true, }, @@ -1423,24 +1415,25 @@ var Tests = []test.SpecInterface{ }, &CancunBaseSpec{ - Spec: test.Spec{ + BaseSpec: test.BaseSpec{ Name: "NewPayloadV3 Versioned Hashes, Extra Hash (Syncing)", About: ` Tests VersionedHashes in Engine API NewPayloadV3 where the array is has an extra hash for a blob that is not in the payload. `, + MainFork: config.Cancun, }, // TODO: It could be worth it to also test this with a blob that is in the // mempool but was not included in the payload. TestSequence: TestSequence{ NewPayloads{}, // Send new payload so the parent is unknown to the secondary client SendBlobTransactions{ - TransactionCount: TARGET_BLOBS_PER_BLOCK, + TransactionCount: cancun.TARGET_BLOBS_PER_BLOCK, BlobTransactionMaxBlobGasCost: big.NewInt(1), }, NewPayloads{ - ExpectedIncludedBlobCount: TARGET_BLOBS_PER_BLOCK, - ExpectedBlobs: helper.GetBlobList(0, TARGET_BLOBS_PER_BLOCK), + ExpectedIncludedBlobCount: cancun.TARGET_BLOBS_PER_BLOCK, + ExpectedBlobs: helper.GetBlobList(0, cancun.TARGET_BLOBS_PER_BLOCK), }, LaunchClients{ @@ -1451,8 +1444,10 @@ var Tests = []test.SpecInterface{ SendModifiedLatestPayload{ ClientID: 1, NewPayloadCustomizer: &helper.BaseNewPayloadVersionCustomizer{ - VersionedHashesCustomizer: &VersionedHashes{ - Blobs: helper.GetBlobList(0, TARGET_BLOBS_PER_BLOCK+1), + PayloadCustomizer: &helper.CustomPayloadData{ + VersionedHashesCustomizer: &VersionedHashes{ + Blobs: helper.GetBlobList(0, cancun.TARGET_BLOBS_PER_BLOCK+1), + }, }, ExpectInvalidStatus: true, }, @@ -1461,22 +1456,23 @@ var Tests = []test.SpecInterface{ }, &CancunBaseSpec{ - Spec: test.Spec{ + BaseSpec: test.BaseSpec{ Name: "NewPayloadV3 Versioned Hashes, Out of Order (Syncing)", About: ` Tests VersionedHashes in Engine API NewPayloadV3 where the array is out of order. `, + MainFork: config.Cancun, }, TestSequence: TestSequence{ NewPayloads{}, // Send new payload so the parent is unknown to the secondary client SendBlobTransactions{ - TransactionCount: TARGET_BLOBS_PER_BLOCK, + TransactionCount: cancun.TARGET_BLOBS_PER_BLOCK, BlobTransactionMaxBlobGasCost: big.NewInt(1), }, NewPayloads{ - ExpectedIncludedBlobCount: TARGET_BLOBS_PER_BLOCK, - ExpectedBlobs: helper.GetBlobList(0, TARGET_BLOBS_PER_BLOCK), + ExpectedIncludedBlobCount: cancun.TARGET_BLOBS_PER_BLOCK, + ExpectedBlobs: helper.GetBlobList(0, cancun.TARGET_BLOBS_PER_BLOCK), }, LaunchClients{ EngineStarter: hive_rpc.HiveRPCEngineStarter{}, @@ -1486,8 +1482,10 @@ var Tests = []test.SpecInterface{ SendModifiedLatestPayload{ ClientID: 1, NewPayloadCustomizer: &helper.BaseNewPayloadVersionCustomizer{ - VersionedHashesCustomizer: &VersionedHashes{ - Blobs: helper.GetBlobListByIndex(helper.BlobID(TARGET_BLOBS_PER_BLOCK-1), 0), + PayloadCustomizer: &helper.CustomPayloadData{ + VersionedHashesCustomizer: &VersionedHashes{ + Blobs: helper.GetBlobListByIndex(helper.BlobID(cancun.TARGET_BLOBS_PER_BLOCK-1), 0), + }, }, ExpectInvalidStatus: true, }, @@ -1496,22 +1494,23 @@ var Tests = []test.SpecInterface{ }, &CancunBaseSpec{ - Spec: test.Spec{ + BaseSpec: test.BaseSpec{ Name: "NewPayloadV3 Versioned Hashes, Repeated Hash (Syncing)", About: ` Tests VersionedHashes in Engine API NewPayloadV3 where the array has a blob that is repeated in the array. `, + MainFork: config.Cancun, }, TestSequence: TestSequence{ NewPayloads{}, // Send new payload so the parent is unknown to the secondary client SendBlobTransactions{ - TransactionCount: TARGET_BLOBS_PER_BLOCK, + TransactionCount: cancun.TARGET_BLOBS_PER_BLOCK, BlobTransactionMaxBlobGasCost: big.NewInt(1), }, NewPayloads{ - ExpectedIncludedBlobCount: TARGET_BLOBS_PER_BLOCK, - ExpectedBlobs: helper.GetBlobList(0, TARGET_BLOBS_PER_BLOCK), + ExpectedIncludedBlobCount: cancun.TARGET_BLOBS_PER_BLOCK, + ExpectedBlobs: helper.GetBlobList(0, cancun.TARGET_BLOBS_PER_BLOCK), }, LaunchClients{ @@ -1522,8 +1521,10 @@ var Tests = []test.SpecInterface{ SendModifiedLatestPayload{ ClientID: 1, NewPayloadCustomizer: &helper.BaseNewPayloadVersionCustomizer{ - VersionedHashesCustomizer: &VersionedHashes{ - Blobs: append(helper.GetBlobList(0, TARGET_BLOBS_PER_BLOCK), helper.BlobID(TARGET_BLOBS_PER_BLOCK-1)), + PayloadCustomizer: &helper.CustomPayloadData{ + VersionedHashesCustomizer: &VersionedHashes{ + Blobs: append(helper.GetBlobList(0, cancun.TARGET_BLOBS_PER_BLOCK), helper.BlobID(cancun.TARGET_BLOBS_PER_BLOCK-1)), + }, }, ExpectInvalidStatus: true, }, @@ -1532,22 +1533,23 @@ var Tests = []test.SpecInterface{ }, &CancunBaseSpec{ - Spec: test.Spec{ + BaseSpec: test.BaseSpec{ Name: "NewPayloadV3 Versioned Hashes, Incorrect Hash (Syncing)", About: ` Tests VersionedHashes in Engine API NewPayloadV3 where the array has a blob that is repeated in the array. `, + MainFork: config.Cancun, }, TestSequence: TestSequence{ NewPayloads{}, // Send new payload so the parent is unknown to the secondary client SendBlobTransactions{ - TransactionCount: TARGET_BLOBS_PER_BLOCK, + TransactionCount: cancun.TARGET_BLOBS_PER_BLOCK, BlobTransactionMaxBlobGasCost: big.NewInt(1), }, NewPayloads{ - ExpectedIncludedBlobCount: TARGET_BLOBS_PER_BLOCK, - ExpectedBlobs: helper.GetBlobList(0, TARGET_BLOBS_PER_BLOCK), + ExpectedIncludedBlobCount: cancun.TARGET_BLOBS_PER_BLOCK, + ExpectedBlobs: helper.GetBlobList(0, cancun.TARGET_BLOBS_PER_BLOCK), }, LaunchClients{ @@ -1558,8 +1560,10 @@ var Tests = []test.SpecInterface{ SendModifiedLatestPayload{ ClientID: 1, NewPayloadCustomizer: &helper.BaseNewPayloadVersionCustomizer{ - VersionedHashesCustomizer: &VersionedHashes{ - Blobs: append(helper.GetBlobList(0, TARGET_BLOBS_PER_BLOCK-1), helper.BlobID(TARGET_BLOBS_PER_BLOCK)), + PayloadCustomizer: &helper.CustomPayloadData{ + VersionedHashesCustomizer: &VersionedHashes{ + Blobs: append(helper.GetBlobList(0, cancun.TARGET_BLOBS_PER_BLOCK-1), helper.BlobID(cancun.TARGET_BLOBS_PER_BLOCK)), + }, }, ExpectInvalidStatus: true, }, @@ -1567,22 +1571,23 @@ var Tests = []test.SpecInterface{ }, }, &CancunBaseSpec{ - Spec: test.Spec{ + BaseSpec: test.BaseSpec{ Name: "NewPayloadV3 Versioned Hashes, Incorrect Version (Syncing)", About: ` Tests VersionedHashes in Engine API NewPayloadV3 where the array has a single blob that has an incorrect version. `, + MainFork: config.Cancun, }, TestSequence: TestSequence{ NewPayloads{}, // Send new payload so the parent is unknown to the secondary client SendBlobTransactions{ - TransactionCount: TARGET_BLOBS_PER_BLOCK, + TransactionCount: cancun.TARGET_BLOBS_PER_BLOCK, BlobTransactionMaxBlobGasCost: big.NewInt(1), }, NewPayloads{ - ExpectedIncludedBlobCount: TARGET_BLOBS_PER_BLOCK, - ExpectedBlobs: helper.GetBlobList(0, TARGET_BLOBS_PER_BLOCK), + ExpectedIncludedBlobCount: cancun.TARGET_BLOBS_PER_BLOCK, + ExpectedBlobs: helper.GetBlobList(0, cancun.TARGET_BLOBS_PER_BLOCK), }, LaunchClients{ @@ -1593,9 +1598,11 @@ var Tests = []test.SpecInterface{ SendModifiedLatestPayload{ ClientID: 1, NewPayloadCustomizer: &helper.BaseNewPayloadVersionCustomizer{ - VersionedHashesCustomizer: &VersionedHashes{ - Blobs: helper.GetBlobList(0, TARGET_BLOBS_PER_BLOCK), - HashVersions: []byte{BLOB_COMMITMENT_VERSION_KZG, BLOB_COMMITMENT_VERSION_KZG + 1}, + PayloadCustomizer: &helper.CustomPayloadData{ + VersionedHashesCustomizer: &VersionedHashes{ + Blobs: helper.GetBlobList(0, cancun.TARGET_BLOBS_PER_BLOCK), + HashVersions: []byte{cancun.BLOB_COMMITMENT_VERSION_KZG, cancun.BLOB_COMMITMENT_VERSION_KZG + 1}, + }, }, ExpectInvalidStatus: true, }, @@ -1604,22 +1611,23 @@ var Tests = []test.SpecInterface{ }, &CancunBaseSpec{ - Spec: test.Spec{ + BaseSpec: test.BaseSpec{ Name: "NewPayloadV3 Versioned Hashes, Nil Hashes (Syncing)", About: ` Tests VersionedHashes in Engine API NewPayloadV3 where the array is nil, even though the fork has already happened. `, + MainFork: config.Cancun, }, TestSequence: TestSequence{ NewPayloads{}, // Send new payload so the parent is unknown to the secondary client SendBlobTransactions{ - TransactionCount: TARGET_BLOBS_PER_BLOCK, + TransactionCount: cancun.TARGET_BLOBS_PER_BLOCK, BlobTransactionMaxBlobGasCost: big.NewInt(1), }, NewPayloads{ - ExpectedIncludedBlobCount: TARGET_BLOBS_PER_BLOCK, - ExpectedBlobs: helper.GetBlobList(0, TARGET_BLOBS_PER_BLOCK), + ExpectedIncludedBlobCount: cancun.TARGET_BLOBS_PER_BLOCK, + ExpectedBlobs: helper.GetBlobList(0, cancun.TARGET_BLOBS_PER_BLOCK), }, LaunchClients{ @@ -1630,32 +1638,35 @@ var Tests = []test.SpecInterface{ SendModifiedLatestPayload{ ClientID: 1, NewPayloadCustomizer: &helper.BaseNewPayloadVersionCustomizer{ - VersionedHashesCustomizer: &VersionedHashes{ - Blobs: nil, + PayloadCustomizer: &helper.CustomPayloadData{ + VersionedHashesCustomizer: &VersionedHashes{ + Blobs: nil, + }, }, - ExpectedError: INVALID_PARAMS_ERROR, + ExpectedError: globals.INVALID_PARAMS_ERROR, }, }, }, }, &CancunBaseSpec{ - Spec: test.Spec{ + BaseSpec: test.BaseSpec{ Name: "NewPayloadV3 Versioned Hashes, Empty Hashes (Syncing)", About: ` Tests VersionedHashes in Engine API NewPayloadV3 where the array is empty, even though there are blobs in the payload. `, + MainFork: config.Cancun, }, TestSequence: TestSequence{ NewPayloads{}, // Send new payload so the parent is unknown to the secondary client SendBlobTransactions{ - TransactionCount: TARGET_BLOBS_PER_BLOCK, + TransactionCount: cancun.TARGET_BLOBS_PER_BLOCK, BlobTransactionMaxBlobGasCost: big.NewInt(1), }, NewPayloads{ - ExpectedIncludedBlobCount: TARGET_BLOBS_PER_BLOCK, - ExpectedBlobs: helper.GetBlobList(0, TARGET_BLOBS_PER_BLOCK), + ExpectedIncludedBlobCount: cancun.TARGET_BLOBS_PER_BLOCK, + ExpectedBlobs: helper.GetBlobList(0, cancun.TARGET_BLOBS_PER_BLOCK), }, LaunchClients{ @@ -1666,8 +1677,10 @@ var Tests = []test.SpecInterface{ SendModifiedLatestPayload{ ClientID: 1, NewPayloadCustomizer: &helper.BaseNewPayloadVersionCustomizer{ - VersionedHashesCustomizer: &VersionedHashes{ - Blobs: []helper.BlobID{}, + PayloadCustomizer: &helper.CustomPayloadData{ + VersionedHashesCustomizer: &VersionedHashes{ + Blobs: []helper.BlobID{}, + }, }, ExpectInvalidStatus: true, }, @@ -1676,12 +1689,13 @@ var Tests = []test.SpecInterface{ }, &CancunBaseSpec{ - Spec: test.Spec{ + BaseSpec: test.BaseSpec{ Name: "NewPayloadV3 Versioned Hashes, Non-Empty Hashes (Syncing)", About: ` Tests VersionedHashes in Engine API NewPayloadV3 where the array is contains hashes, even though there are no blobs in the payload. `, + MainFork: config.Cancun, }, TestSequence: TestSequence{ NewPayloads{}, // Send new payload so the parent is unknown to the secondary client @@ -1697,8 +1711,10 @@ var Tests = []test.SpecInterface{ SendModifiedLatestPayload{ ClientID: 1, NewPayloadCustomizer: &helper.BaseNewPayloadVersionCustomizer{ - VersionedHashesCustomizer: &VersionedHashes{ - Blobs: []helper.BlobID{0}, + PayloadCustomizer: &helper.CustomPayloadData{ + VersionedHashesCustomizer: &VersionedHashes{ + Blobs: []helper.BlobID{0}, + }, }, ExpectInvalidStatus: true, }, @@ -1710,12 +1726,12 @@ var Tests = []test.SpecInterface{ // Most cases are contained in https://github.com/ethereum/execution-spec-tests/tree/main/tests/cancun/eip4844_blobs // and can be executed using `pyspec` simulator. &CancunBaseSpec{ - - Spec: test.Spec{ + BaseSpec: test.BaseSpec{ Name: "Incorrect BlobGasUsed: Non-Zero on Zero Blobs", About: ` Send a payload with zero blobs, but non-zero BlobGasUsed. `, + MainFork: config.Cancun, }, TestSequence: TestSequence{ NewPayloads{ @@ -1730,17 +1746,18 @@ var Tests = []test.SpecInterface{ }, &CancunBaseSpec{ - Spec: test.Spec{ + BaseSpec: test.BaseSpec{ Name: "Incorrect BlobGasUsed: GAS_PER_BLOB on Zero Blobs", About: ` Send a payload with zero blobs, but non-zero BlobGasUsed. `, + MainFork: config.Cancun, }, TestSequence: TestSequence{ NewPayloads{ NewPayloadCustomizer: &helper.BaseNewPayloadVersionCustomizer{ PayloadCustomizer: &helper.CustomPayloadData{ - BlobGasUsed: pUint64(GAS_PER_BLOB), + BlobGasUsed: pUint64(cancun.GAS_PER_BLOB), }, ExpectInvalidStatus: true, }, @@ -1748,139 +1765,14 @@ var Tests = []test.SpecInterface{ }, }, - // ForkID tests - &CancunForkSpec{ - GenesisTimestamp: 0, - ShanghaiTimestamp: 0, - CancunTimestamp: 0, - - CancunBaseSpec: CancunBaseSpec{ - Spec: test.Spec{ - Name: "ForkID, genesis at 0, shanghai at 0, cancun at 0", - About: ` - Attemp to peer client with the following configuration at height 0: - - genesis timestamp 0 - - shanghai fork at timestamp 0 - - cancun fork at timestamp 0 - `, - }, - }, - }, - &CancunForkSpec{ - GenesisTimestamp: 0, - ShanghaiTimestamp: 0, - CancunTimestamp: 1, - - CancunBaseSpec: CancunBaseSpec{ - Spec: test.Spec{ - Name: "ForkID, genesis at 0, shanghai at 0, cancun at 1", - About: ` - Attemp to peer client with the following configuration at height 0: - - genesis timestamp 0 - - shanghai fork at timestamp 0 - - cancun fork at timestamp 1 - `, - }, - }, - }, - - &CancunForkSpec{ - GenesisTimestamp: 1, - ShanghaiTimestamp: 0, - CancunTimestamp: 1, - - CancunBaseSpec: CancunBaseSpec{ - Spec: test.Spec{ - Name: "ForkID, genesis at 1, shanghai at 0, cancun at 1", - About: ` - Attemp to peer client with the following configuration at height 0: - - genesis timestamp 1 - - shanghai fork at timestamp 0 - - cancun fork at timestamp 1 - `, - }, - }, - }, - - &CancunForkSpec{ - GenesisTimestamp: 0, - ShanghaiTimestamp: 0, - CancunTimestamp: 1, - ProduceBlocksBeforePeering: 1, - - CancunBaseSpec: CancunBaseSpec{ - Spec: test.Spec{ - Name: "ForkID, genesis at 0, shanghai at 0, cancun at 1, transition", - About: ` - Attemp to peer client with the following configuration at height 1: - - genesis timestamp 0 - - shanghai fork at timestamp 0 - - cancun fork at timestamp 1 - `, - }, - }, - }, - - &CancunForkSpec{ - GenesisTimestamp: 1, - ShanghaiTimestamp: 1, - CancunTimestamp: 1, - - CancunBaseSpec: CancunBaseSpec{ - Spec: test.Spec{ - Name: "ForkID, genesis at 1, shanghai at 1, cancun at 1", - About: ` - Attemp to peer client with the following configuration at height 0: - - genesis timestamp 1 - - shanghai fork at timestamp 1 - - cancun fork at timestamp 1 - `, - }, - }, - }, - &CancunForkSpec{ - GenesisTimestamp: 1, - ShanghaiTimestamp: 1, - CancunTimestamp: 2, - - CancunBaseSpec: CancunBaseSpec{ - Spec: test.Spec{ - Name: "ForkID, genesis at 1, shanghai at 1, cancun at 2", - About: ` - Attemp to peer client with the following configuration at height 0: - - genesis timestamp 1 - - shanghai fork at timestamp 1 - - cancun fork at timestamp 2 - `, - }, - }, - }, - &CancunForkSpec{ - GenesisTimestamp: 1, - ShanghaiTimestamp: 1, - CancunTimestamp: 2, - ProduceBlocksBeforePeering: 1, - - CancunBaseSpec: CancunBaseSpec{ - Spec: test.Spec{ - Name: "ForkID, genesis at 1, shanghai at 1, cancun at 2, transition", - About: ` - Attemp to peer client with the following configuration at height 1: - - genesis timestamp 1 - - shanghai fork at timestamp 1 - - cancun fork at timestamp 2 - `, - }, - }, - }, - // DevP2P tests &CancunBaseSpec{ - Spec: test.Spec{ + BaseSpec: test.BaseSpec{ Name: "Request Blob Pooled Transactions", About: ` Requests blob pooled transactions and verify correct encoding. `, + MainFork: config.Cancun, }, TestSequence: TestSequence{ // Get past the genesis @@ -1900,3 +1792,92 @@ var Tests = []test.SpecInterface{ }, }, } + +var EngineAPITests []test.Spec + +func init() { + // Append all engine api tests with Cancun as main fork + for _, test := range suite_engine.Tests { + Tests = append(Tests, test.WithMainFork(config.Cancun)) + } + + // Cancun specific variants for pre-existing tests + baseSpec := test.BaseSpec{ + MainFork: config.Cancun, + } + onlyBlobTxsSpec := test.BaseSpec{ + MainFork: config.Cancun, + TestTransactionType: helper.BlobTxOnly, + } + + // Payload Attributes + for _, t := range []suite_engine.InvalidPayloadAttributesTest{ + { + BaseSpec: baseSpec, + Description: "Missing BeaconRoot", + Customizer: &helper.BasePayloadAttributesCustomizer{ + RemoveBeaconRoot: true, + }, + // Error is expected on syncing because V3 checks all fields to be present + ErrorOnSync: true, + }, + } { + Tests = append(Tests, t) + t.Syncing = true + Tests = append(Tests, t) + } + + // Invalid Payload Tests + for _, invalidField := range []helper.InvalidPayloadBlockField{ + helper.InvalidParentBeaconBlockRoot, + helper.InvalidBlobGasUsed, + helper.InvalidBlobCountGasUsed, + helper.InvalidExcessBlobGas, + helper.InvalidVersionedHashes, + helper.InvalidVersionedHashesVersion, + helper.IncompleteVersionedHashes, + helper.ExtraVersionedHashes, + } { + for _, syncing := range []bool{false, true} { + // Invalidity of payload can be detected even when syncing because the + // blob gas only depends on the transactions contained. + invalidDetectedOnSync := (invalidField == helper.InvalidBlobGasUsed || + invalidField == helper.InvalidBlobCountGasUsed || + invalidField == helper.InvalidVersionedHashes || + invalidField == helper.InvalidVersionedHashesVersion) + + Tests = append(Tests, suite_engine.InvalidPayloadTestCase{ + BaseSpec: onlyBlobTxsSpec, + InvalidField: invalidField, + Syncing: syncing, + InvalidDetectedOnSync: invalidDetectedOnSync, + }) + } + } + + // Invalid Transaction ChainID Tests + Tests = append(Tests, + suite_engine.InvalidTxChainIDTest{ + BaseSpec: onlyBlobTxsSpec, + }, + ) + + Tests = append(Tests, suite_engine.PayloadBuildAfterInvalidPayloadTest{ + BaseSpec: onlyBlobTxsSpec, + InvalidField: helper.InvalidParentBeaconBlockRoot, + }) + + // Suggested Fee Recipient Tests (New Transaction Type) + Tests = append(Tests, + suite_engine.SuggestedFeeRecipientTest{ + BaseSpec: onlyBlobTxsSpec, + TransactionCount: 1, // Only one blob tx gets through due to blob gas limit + }, + ) + // Prev Randao Tests (New Transaction Type) + Tests = append(Tests, + suite_engine.PrevRandaoTransactionTest{ + BaseSpec: onlyBlobTxsSpec, + }, + ) +} diff --git a/simulators/ethereum/engine/suites/engine/bad_hash.go b/simulators/ethereum/engine/suites/engine/bad_hash.go new file mode 100644 index 0000000000..a9a2008996 --- /dev/null +++ b/simulators/ethereum/engine/suites/engine/bad_hash.go @@ -0,0 +1,194 @@ +package suite_engine + +import ( + "fmt" + "math/rand" + + api "github.com/ethereum/go-ethereum/beacon/engine" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/hive/simulators/ethereum/engine/clmock" + "github.com/ethereum/hive/simulators/ethereum/engine/config" + "github.com/ethereum/hive/simulators/ethereum/engine/helper" + "github.com/ethereum/hive/simulators/ethereum/engine/test" + typ "github.com/ethereum/hive/simulators/ethereum/engine/types" +) + +// Corrupt the hash of a valid payload, client should reject the payload. +// All possible scenarios: +// (fcU) +// ┌────────┠┌────────────────────────┠+// │ HEAD │◄───────┤ Bad Hash (!Sync,!Side) │ +// └────┬───┘ └────────────────────────┘ +// │ +// │ +// ┌────▼───┠┌────────────────────────┠+// │ HEAD-1 │◄───────┤ Bad Hash (!Sync, Side) │ +// └────┬───┘ └────────────────────────┘ +// │ +// +// +// (fcU) +// ******************** ┌───────────────────────┠+// * (Unknown) HEAD *◄─┤ Bad Hash (Sync,!Side) │ +// ******************** └───────────────────────┘ +// │ +// │ +// ┌────▼───┠┌───────────────────────┠+// │ HEAD-1 │◄───────────┤ Bad Hash (Sync, Side) │ +// └────┬───┘ └───────────────────────┘ +// │ +// + +type BadHashOnNewPayload struct { + test.BaseSpec + Syncing bool + Sidechain bool +} + +func (s BadHashOnNewPayload) WithMainFork(fork config.Fork) test.Spec { + specCopy := s + specCopy.MainFork = fork + return specCopy +} + +func (b BadHashOnNewPayload) GetName() string { + return fmt.Sprintf("Bad Hash on NewPayload (Syncing=%v, Sidechain=%v)", b.Syncing, b.Sidechain) +} + +func (b BadHashOnNewPayload) Execute(t *test.Env) { + // Wait until TTD is reached by this client + t.CLMock.WaitForTTD() + + // Produce blocks before starting the test + t.CLMock.ProduceBlocks(5, clmock.BlockProcessCallbacks{}) + + var ( + alteredPayload typ.ExecutableData + invalidPayloadHash common.Hash + ) + + t.CLMock.ProduceSingleBlock(clmock.BlockProcessCallbacks{ + // Run test after the new payload has been obtained + OnGetPayload: func() { + // Alter hash on the payload and send it to client, should produce an error + alteredPayload = t.CLMock.LatestPayloadBuilt + invalidPayloadHash = alteredPayload.BlockHash + invalidPayloadHash[common.HashLength-1] = byte(255 - invalidPayloadHash[common.HashLength-1]) + alteredPayload.BlockHash = invalidPayloadHash + + if !b.Syncing && b.Sidechain { + // We alter the payload by setting the parent to a known past block in the + // canonical chain, which makes this payload a side chain payload, and also an invalid block hash + // (because we did not update the block hash appropriately) + alteredPayload.ParentHash = t.CLMock.LatestHeader.ParentHash + } else if b.Syncing { + // We need to send an fcU to put the client in SYNCING state. + randomHeadBlock := common.Hash{} + rand.Read(randomHeadBlock[:]) + fcU := api.ForkchoiceStateV1{ + HeadBlockHash: randomHeadBlock, + SafeBlockHash: t.CLMock.LatestHeader.Hash(), + FinalizedBlockHash: t.CLMock.LatestHeader.Hash(), + } + r := t.TestEngine.TestEngineForkchoiceUpdated(&fcU, nil, 0) + r.ExpectPayloadStatus(test.Syncing) + + if b.Sidechain { + // Syncing and sidechain, the caonincal head is an unknown payload to us, + // but this specific bad hash payload is in theory part of a side chain. + // Therefore the parent we use is the head hash. + alteredPayload.ParentHash = t.CLMock.LatestHeader.Hash() + } else { + // The invalid bad-hash payload points to the unknown head, but we know it is + // indeed canonical because the head was set using forkchoiceUpdated. + alteredPayload.ParentHash = randomHeadBlock + } + } + + // Execution specification:: + // - {status: INVALID_BLOCK_HASH, latestValidHash: null, validationError: null} if the blockHash validation has failed + // Starting from Shanghai, INVALID should be returned instead (https://github.com/ethereum/execution-apis/pull/338) + r := t.TestEngine.TestEngineNewPayload(&alteredPayload) + if r.Version >= 2 { + r.ExpectStatus(test.Invalid) + } else { + r.ExpectStatusEither(test.InvalidBlockHash, test.Invalid) + } + r.ExpectLatestValidHash(nil) + }, + }) + + // Lastly, attempt to build on top of the invalid payload + t.CLMock.ProduceSingleBlock(clmock.BlockProcessCallbacks{ + // Run test after the new payload has been obtained + OnGetPayload: func() { + customizer := &helper.CustomPayloadData{ + ParentHash: &alteredPayload.BlockHash, + } + alteredPayload, err := customizer.CustomizePayload(&t.CLMock.LatestPayloadBuilt) + if err != nil { + t.Fatalf("FAIL (%s): Unable to modify payload: %v", t.TestName, err) + } + + // Response status can be ACCEPTED (since parent payload could have been thrown out by the client) + // or INVALID (client still has the payload and can verify that this payload is incorrectly building on top of it), + // but a VALID response is incorrect. + r := t.TestEngine.TestEngineNewPayload(alteredPayload) + r.ExpectStatusEither(test.Accepted, test.Invalid, test.Syncing) + + }, + }) +} + +type ParentHashOnNewPayload struct { + test.BaseSpec + Syncing bool +} + +func (s ParentHashOnNewPayload) WithMainFork(fork config.Fork) test.Spec { + specCopy := s + specCopy.MainFork = fork + return specCopy +} + +func (p ParentHashOnNewPayload) GetName() string { + name := "ParentHash==BlockHash on NewPayload" + if p.Syncing { + name += " (Syncing)" + } + return name +} + +// Copy the parentHash into the blockHash, client should reject the payload +// (from Kintsugi Incident Report: https://notes.ethereum.org/@ExXcnR0-SJGthjz1dwkA1A/BkkdHWXTY) +func (b ParentHashOnNewPayload) Execute(t *test.Env) { + // Wait until TTD is reached by this client + t.CLMock.WaitForTTD() + + // Produce blocks before starting the test + t.CLMock.ProduceBlocks(5, clmock.BlockProcessCallbacks{}) + + t.CLMock.ProduceSingleBlock(clmock.BlockProcessCallbacks{ + // Run test after the new payload has been obtained + OnGetPayload: func() { + // Alter hash on the payload and send it to client, should produce an error + alteredPayload := t.CLMock.LatestPayloadBuilt + if b.Syncing { + // Parent hash is unknown but also (incorrectly) set as the block hash + rand.Read(alteredPayload.ParentHash[:]) + } + alteredPayload.BlockHash = alteredPayload.ParentHash + // Execution specification:: + // - {status: INVALID_BLOCK_HASH, latestValidHash: null, validationError: null} if the blockHash validation has failed + // Starting from Shanghai, INVALID should be returned instead (https://github.com/ethereum/execution-apis/pull/338) + r := t.TestEngine.TestEngineNewPayload(&alteredPayload) + if r.Version >= 2 { + r.ExpectStatus(test.Invalid) + } else { + r.ExpectStatusEither(test.Invalid, test.InvalidBlockHash) + } + r.ExpectLatestValidHash(nil) + }, + }) + +} diff --git a/simulators/ethereum/engine/suites/engine/fork_id.go b/simulators/ethereum/engine/suites/engine/fork_id.go new file mode 100644 index 0000000000..d862c22064 --- /dev/null +++ b/simulators/ethereum/engine/suites/engine/fork_id.go @@ -0,0 +1,77 @@ +package suite_engine + +import ( + "fmt" + "time" + + "github.com/ethereum/hive/simulators/ethereum/engine/clmock" + "github.com/ethereum/hive/simulators/ethereum/engine/config" + "github.com/ethereum/hive/simulators/ethereum/engine/devp2p" + "github.com/ethereum/hive/simulators/ethereum/engine/test" +) + +type ForkIDSpec struct { + test.BaseSpec + ProduceBlocksBeforePeering int +} + +func (s ForkIDSpec) WithMainFork(fork config.Fork) test.Spec { + specCopy := s + specCopy.MainFork = fork + return specCopy +} + +func (ft ForkIDSpec) GetName() string { + name := fmt.Sprintf("Fork ID: Genesis at %d, %s at %d", ft.GetGenesisTimestamp(), ft.MainFork, ft.ForkTime) + if ft.PreviousForkTime != 0 { + name += fmt.Sprintf(", %s at %d", ft.MainFork.PreviousFork(), ft.PreviousForkTime) + } + if ft.ProduceBlocksBeforePeering > 0 { + name += fmt.Sprintf(", Produce %d blocks before peering", ft.ProduceBlocksBeforePeering) + } + return name +} + +func (ft ForkIDSpec) Execute(t *test.Env) { + // Wait until TTD is reached by this client + t.CLMock.WaitForTTD() + + // Produce blocks before starting the test if required + t.CLMock.ProduceBlocks(ft.ProduceBlocksBeforePeering, clmock.BlockProcessCallbacks{}) + + // Get client index's enode + engine := t.Engine + conn, err := devp2p.PeerEngineClient(engine, t.CLMock) + if err != nil { + t.Fatalf("FAIL: Error peering engine client: %v", err) + } + defer conn.Close() + t.Logf("INFO: Connected to client, remote public key: %s", conn.RemoteKey()) + + // Sleep + time.Sleep(1 * time.Second) + + // Timeout value for all requests + timeout := 20 * time.Second + + // Send a ping request to verify that we are not immediately disconnected + pingReq := &devp2p.Ping{} + if size, err := conn.Write(pingReq); err != nil { + t.Fatalf("FAIL: Could not write to connection: %v", err) + } else { + t.Logf("INFO: Wrote %d bytes to conn", size) + } + + // Finally wait for the pong response + msg, err := conn.WaitForResponse(timeout, 0) + if err != nil { + t.Fatalf("FAIL: Error waiting for response: %v", err) + } + switch msg := msg.(type) { + case *devp2p.Pong: + t.Logf("INFO: Received pong response: %v", msg) + default: + t.Fatalf("FAIL: Unexpected message type: %v", err) + } + +} diff --git a/simulators/ethereum/engine/suites/engine/forkchoice.go b/simulators/ethereum/engine/suites/engine/forkchoice.go new file mode 100644 index 0000000000..e5f40c0674 --- /dev/null +++ b/simulators/ethereum/engine/suites/engine/forkchoice.go @@ -0,0 +1,174 @@ +package suite_engine + +import ( + "fmt" + "math/rand" + + api "github.com/ethereum/go-ethereum/beacon/engine" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/hive/simulators/ethereum/engine/clmock" + "github.com/ethereum/hive/simulators/ethereum/engine/config" + "github.com/ethereum/hive/simulators/ethereum/engine/helper" + "github.com/ethereum/hive/simulators/ethereum/engine/test" + typ "github.com/ethereum/hive/simulators/ethereum/engine/types" +) + +type ForkchoiceStateField string + +const ( + HeadBlockHash ForkchoiceStateField = "Head" + SafeBlockHash ForkchoiceStateField = "Safe" + FinalizedBlockHash ForkchoiceStateField = "Finalized" +) + +type InconsistentForkchoiceTest struct { + test.BaseSpec + Field ForkchoiceStateField +} + +func (s InconsistentForkchoiceTest) WithMainFork(fork config.Fork) test.Spec { + specCopy := s + specCopy.MainFork = fork + return specCopy +} + +func (tc InconsistentForkchoiceTest) GetName() string { + return fmt.Sprintf("Inconsistent %s in ForkchoiceState", tc.Field) +} + +// Send an inconsistent ForkchoiceState with a known payload that belongs to a side chain as head, safe or finalized. +func (tc InconsistentForkchoiceTest) Execute(t *test.Env) { + // Wait until TTD is reached by this client + t.CLMock.WaitForTTD() + + canonicalPayloads := make([]*typ.ExecutableData, 0) + alternativePayloads := make([]*typ.ExecutableData, 0) + // Produce blocks before starting the test + t.CLMock.ProduceBlocks(3, clmock.BlockProcessCallbacks{ + OnGetPayload: func() { + // Generate and send an alternative side chain + customData := helper.CustomPayloadData{} + customData.ExtraData = &([]byte{0x01}) + if len(alternativePayloads) > 0 { + customData.ParentHash = &alternativePayloads[len(alternativePayloads)-1].BlockHash + } + alternativePayload, err := customData.CustomizePayload(&t.CLMock.LatestPayloadBuilt) + if err != nil { + t.Fatalf("FAIL (%s): Unable to construct alternative payload: %v", t.TestName, err) + } + alternativePayloads = append(alternativePayloads, alternativePayload) + latestCanonicalPayload := t.CLMock.LatestPayloadBuilt + canonicalPayloads = append(canonicalPayloads, &latestCanonicalPayload) + + // Send the alternative payload + r := t.TestEngine.TestEngineNewPayload(alternativePayload) + r.ExpectStatusEither(test.Valid, test.Accepted) + }, + }) + // Send the invalid ForkchoiceStates + inconsistentFcU := api.ForkchoiceStateV1{ + HeadBlockHash: canonicalPayloads[len(alternativePayloads)-1].BlockHash, + SafeBlockHash: canonicalPayloads[len(alternativePayloads)-2].BlockHash, + FinalizedBlockHash: canonicalPayloads[len(alternativePayloads)-3].BlockHash, + } + switch tc.Field { + case HeadBlockHash: + inconsistentFcU.HeadBlockHash = alternativePayloads[len(alternativePayloads)-1].BlockHash + case SafeBlockHash: + inconsistentFcU.SafeBlockHash = alternativePayloads[len(canonicalPayloads)-2].BlockHash + case FinalizedBlockHash: + inconsistentFcU.FinalizedBlockHash = alternativePayloads[len(canonicalPayloads)-3].BlockHash + } + r := t.TestEngine.TestEngineForkchoiceUpdated(&inconsistentFcU, nil, t.CLMock.LatestPayloadBuilt.Timestamp) + r.ExpectError() + + // Return to the canonical chain + r = t.TestEngine.TestEngineForkchoiceUpdated(&t.CLMock.LatestForkchoice, nil, t.CLMock.LatestPayloadBuilt.Timestamp) + r.ExpectPayloadStatus(test.Valid) +} + +type ForkchoiceUpdatedUnknownBlockHashTest struct { + test.BaseSpec + Field ForkchoiceStateField +} + +func (s ForkchoiceUpdatedUnknownBlockHashTest) WithMainFork(fork config.Fork) test.Spec { + specCopy := s + specCopy.MainFork = fork + return specCopy +} + +func (tc ForkchoiceUpdatedUnknownBlockHashTest) GetName() string { + return fmt.Sprintf("Unknown %sBlockHash", tc.Field) +} + +// Send an inconsistent ForkchoiceState with a known payload that belongs to a side chain as head, safe or finalized. +func (tc ForkchoiceUpdatedUnknownBlockHashTest) Execute(t *test.Env) { + // Wait until TTD is reached by this client + t.CLMock.WaitForTTD() + + // Produce blocks before starting the test + t.CLMock.ProduceBlocks(5, clmock.BlockProcessCallbacks{}) + + // Generate a random block hash + randomBlockHash := common.Hash{} + rand.Read(randomBlockHash[:]) + + if tc.Field == HeadBlockHash { + + forkchoiceStateUnknownHeadHash := api.ForkchoiceStateV1{ + HeadBlockHash: randomBlockHash, + SafeBlockHash: t.CLMock.LatestForkchoice.SafeBlockHash, + FinalizedBlockHash: t.CLMock.LatestForkchoice.FinalizedBlockHash, + } + + t.Logf("INFO (%v) forkchoiceStateUnknownHeadHash: %v\n", t.TestName, forkchoiceStateUnknownHeadHash) + + // Execution specification:: + // - {payloadStatus: {status: SYNCING, latestValidHash: null, validationError: null}, payloadId: null} + // if forkchoiceState.headBlockHash references an unknown payload or a payload that can't be validated + // because requisite data for the validation is missing + r := t.TestEngine.TestEngineForkchoiceUpdated(&forkchoiceStateUnknownHeadHash, nil, t.CLMock.LatestExecutedPayload.Timestamp) + r.ExpectPayloadStatus(test.Syncing) + + payloadAttributes := t.CLMock.LatestPayloadAttributes + payloadAttributes.Timestamp += 1 + + // Test again using PayloadAttributes, should also return SYNCING and no PayloadID + r = t.TestEngine.TestEngineForkchoiceUpdated(&forkchoiceStateUnknownHeadHash, + &payloadAttributes, t.CLMock.LatestExecutedPayload.Timestamp) + r.ExpectPayloadStatus(test.Syncing) + r.ExpectPayloadID(nil) + } else { + t.CLMock.ProduceSingleBlock(clmock.BlockProcessCallbacks{ + // Run test after a new payload has been broadcast + OnNewPayloadBroadcast: func() { + + forkchoiceStateRandomHash := api.ForkchoiceStateV1{ + HeadBlockHash: t.CLMock.LatestExecutedPayload.BlockHash, + SafeBlockHash: t.CLMock.LatestForkchoice.SafeBlockHash, + FinalizedBlockHash: t.CLMock.LatestForkchoice.FinalizedBlockHash, + } + + if tc.Field == SafeBlockHash { + forkchoiceStateRandomHash.SafeBlockHash = randomBlockHash + } else if tc.Field == FinalizedBlockHash { + forkchoiceStateRandomHash.FinalizedBlockHash = randomBlockHash + } + + r := t.TestEngine.TestEngineForkchoiceUpdated(&forkchoiceStateRandomHash, nil, t.CLMock.LatestExecutedPayload.Timestamp) + r.ExpectError() + + payloadAttributes := t.CLMock.LatestPayloadAttributes + payloadAttributes.Random = common.Hash{} + payloadAttributes.SuggestedFeeRecipient = common.Address{} + + // Test again using PayloadAttributes, should also return INVALID and no PayloadID + r = t.TestEngine.TestEngineForkchoiceUpdated(&forkchoiceStateRandomHash, + &payloadAttributes, t.CLMock.LatestExecutedPayload.Timestamp) + r.ExpectError() + + }, + }) + } +} diff --git a/simulators/ethereum/engine/suites/engine/invalid_ancestor.go b/simulators/ethereum/engine/suites/engine/invalid_ancestor.go new file mode 100644 index 0000000000..2f473904e7 --- /dev/null +++ b/simulators/ethereum/engine/suites/engine/invalid_ancestor.go @@ -0,0 +1,495 @@ +package suite_engine + +import ( + "context" + "encoding/json" + "fmt" + "math/big" + "time" + + api "github.com/ethereum/go-ethereum/beacon/engine" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/hive/simulators/ethereum/engine/client/node" + "github.com/ethereum/hive/simulators/ethereum/engine/clmock" + "github.com/ethereum/hive/simulators/ethereum/engine/config" + "github.com/ethereum/hive/simulators/ethereum/engine/globals" + "github.com/ethereum/hive/simulators/ethereum/engine/helper" + "github.com/ethereum/hive/simulators/ethereum/engine/test" + typ "github.com/ethereum/hive/simulators/ethereum/engine/types" +) + +// Attempt to re-org to a chain which at some point contains an unknown payload which is also invalid. +// Then reveal the invalid payload and expect that the client rejects it and rejects forkchoice updated calls to this chain. +// The InvalidIndex parameter determines how many payloads apart is the common ancestor from the block that invalidates the chain, +// with a value of 1 meaning that the immediate payload after the common ancestor will be invalid. + +type InvalidMissingAncestorReOrgTest struct { + test.BaseSpec + SidechainLength int + InvalidIndex int + InvalidField helper.InvalidPayloadBlockField + EmptyTransactions bool +} + +func (s InvalidMissingAncestorReOrgTest) WithMainFork(fork config.Fork) test.Spec { + specCopy := s + specCopy.MainFork = fork + return specCopy +} + +func (tc InvalidMissingAncestorReOrgTest) GetName() string { + return fmt.Sprintf("Invalid Missing Ancestor ReOrg, Invalid %s, Invalid P%d'", tc.InvalidField, tc.InvalidIndex) +} + +func (tc InvalidMissingAncestorReOrgTest) Execute(t *test.Env) { + + // Wait until TTD is reached by this client + t.CLMock.WaitForTTD() + + // Produce blocks before starting the test + t.CLMock.ProduceBlocks(5, clmock.BlockProcessCallbacks{}) + + // Save the common ancestor + cA := t.CLMock.LatestPayloadBuilt + + // Slice to save the side B chain + altChainPayloads := make([]*typ.ExecutableData, 0) + + // Append the common ancestor + altChainPayloads = append(altChainPayloads, &cA) + + // Produce blocks but at the same time create an side chain which contains an invalid payload at some point (INV_P) + // CommonAncestor◄─▲── P1 ◄─ P2 ◄─ P3 ◄─ ... ◄─ Pn + // │ + // └── P1' ◄─ P2' ◄─ ... ◄─ INV_P ◄─ ... ◄─ Pn' + t.CLMock.ProduceBlocks(tc.SidechainLength, clmock.BlockProcessCallbacks{ + + OnPayloadProducerSelected: func() { + // Function to send at least one transaction each block produced. + // Empty Txs Payload with invalid stateRoot discovered an issue in geth sync, hence this is customizable. + if !tc.EmptyTransactions { + // Send the transaction to the globals.PrevRandaoContractAddr + _, err := t.SendNextTransaction( + t.TestContext, + t.CLMock.NextBlockProducer, + &helper.BaseTransactionCreator{ + Recipient: &globals.PrevRandaoContractAddr, + Amount: big1, + Payload: nil, + TxType: t.TestTransactionType, + GasLimit: 75000, + ForkConfig: t.ForkConfig, + }, + ) + if err != nil { + t.Fatalf("FAIL (%s): Error trying to send transaction: %v", t.TestName, err) + } + } + }, + OnGetPayload: func() { + var ( + sidePayload *typ.ExecutableData + err error + ) + // Insert extraData to ensure we deviate from the main payload, which contains empty extradata + customizer := &helper.CustomPayloadData{ + ParentHash: &altChainPayloads[len(altChainPayloads)-1].BlockHash, + ExtraData: &([]byte{0x01}), + } + sidePayload, err = customizer.CustomizePayload(&t.CLMock.LatestPayloadBuilt) + if err != nil { + t.Fatalf("FAIL (%s): Unable to customize payload: %v", t.TestName, err) + } + if len(altChainPayloads) == tc.InvalidIndex { + sidePayload, err = helper.GenerateInvalidPayload(sidePayload, tc.InvalidField) + if err != nil { + t.Fatalf("FAIL (%s): Unable to customize payload: %v", t.TestName, err) + } + } + altChainPayloads = append(altChainPayloads, sidePayload) + }, + }) + t.CLMock.ProduceSingleBlock(clmock.BlockProcessCallbacks{ + // Note: We perform the test in the middle of payload creation by the CL Mock, in order to be able to + // re-org back into this chain and use the new payload without issues. + OnGetPayload: func() { + + // Now let's send the side chain to the client using newPayload/sync + for i := 1; i <= tc.SidechainLength; i++ { + // Send the payload + payloadValidStr := "VALID" + if i == tc.InvalidIndex { + payloadValidStr = "INVALID" + } else if i > tc.InvalidIndex { + payloadValidStr = "VALID with INVALID ancestor" + } + t.Logf("INFO (%s): Invalid chain payload %d (%s): %v", t.TestName, i, payloadValidStr, altChainPayloads[i].BlockHash) + + r := t.TestEngine.TestEngineNewPayload(altChainPayloads[i]) + p := t.TestEngine.TestEngineForkchoiceUpdated(&api.ForkchoiceStateV1{ + HeadBlockHash: altChainPayloads[i].BlockHash, + SafeBlockHash: altChainPayloads[i].BlockHash, + FinalizedBlockHash: common.Hash{}, + }, nil, altChainPayloads[i].Timestamp) + if i == tc.InvalidIndex { + // If this is the first payload after the common ancestor, and this is the payload we invalidated, + // then we have all the information to determine that this payload is invalid. + r.ExpectStatus(test.Invalid) + r.ExpectLatestValidHash(&altChainPayloads[i-1].BlockHash) + } else if i > tc.InvalidIndex { + // We have already sent the invalid payload, but the client could've discarded it. + // In reality the CL will not get to this point because it will have already received the `INVALID` + // response from the previous payload. + // The node might save the parent as invalid, thus returning INVALID + r.ExpectStatusEither(test.Accepted, test.Syncing, test.Invalid) + if r.Status.Status == test.Accepted || r.Status.Status == test.Syncing { + r.ExpectLatestValidHash(nil) + } else if r.Status.Status == test.Invalid { + r.ExpectLatestValidHash(&altChainPayloads[tc.InvalidIndex-1].BlockHash) + } + } else { + // This is one of the payloads before the invalid one, therefore is valid. + r.ExpectStatus(test.Valid) + p.ExpectPayloadStatus(test.Valid) + p.ExpectLatestValidHash(&altChainPayloads[i].BlockHash) + } + + } + + // Resend the latest correct fcU + r := t.TestEngine.TestEngineForkchoiceUpdated(&t.CLMock.LatestForkchoice, nil, t.CLMock.LatestPayloadBuilt.Timestamp) + r.ExpectNoError() + // After this point, the CL Mock will send the next payload of the canonical chain + }, + }) +} + +// Attempt to re-org to a chain which at some point contains an unknown payload which is also invalid. +// Then reveal the invalid payload and expect that the client rejects it and rejects forkchoice updated calls to this chain. +type InvalidMissingAncestorReOrgSyncTest struct { + test.BaseSpec + // Index of the payload to invalidate, starting with 0 being the common ancestor. + // Value must be greater than 0. + InvalidIndex int + // Field of the payload to invalidate (see helper module) + InvalidField helper.InvalidPayloadBlockField + // Whether to create payloads with empty transactions or not: + // Used to test scenarios where the stateRoot is invalidated but its invalidation + // goes unnoticed by the client because of the lack of transactions. + EmptyTransactions bool + // Height of the common ancestor in the proof-of-stake chain. + // Value of 0 means the common ancestor is the terminal proof-of-work block. + CommonAncestorHeight *big.Int + // Amount of payloads to produce between the common ancestor and the head of the + // proof-of-stake chain. + DeviatingPayloadCount *big.Int + // Whether the syncing client must re-org from a canonical chain. + // If set to true, the client is driven through a valid canonical chain first, + // and then the client is prompted to re-org to the invalid chain. + // If set to false, the client is prompted to sync from the genesis + // or start chain (if specified). + ReOrgFromCanonical bool +} + +func (s InvalidMissingAncestorReOrgSyncTest) WithMainFork(fork config.Fork) test.Spec { + specCopy := s + specCopy.MainFork = fork + return specCopy +} + +func (tc InvalidMissingAncestorReOrgSyncTest) GetName() string { + name := fmt.Sprintf("Invalid Missing Ancestor ReOrg, Invalid %s, ", tc.InvalidField) + if tc.EmptyTransactions { + name += "Empty Txs, " + } + name += fmt.Sprintf("Invalid P%d', Reveal using sync", tc.InvalidIndex) + if tc.ReOrgFromCanonical { + name += " (ReOrg from Canonical)" + } + return name +} + +func (tc InvalidMissingAncestorReOrgSyncTest) Execute(t *test.Env) { + var ( + err error + secondaryClient *node.GethNode + ) + // To allow having the invalid payload delivered via P2P, we need a second client to serve the payload + starter := node.GethNodeEngineStarter{ + Config: node.GethNodeTestConfiguration{}, + } + if tc.ReOrgFromCanonical { + // If we are doing a re-org from canonical, we can add both nodes as peers from the start + secondaryClient, err = starter.StartGethNode(t.T, t.TestContext, t.Genesis, t.ClientParams, t.ClientFiles, t.Engine) + } else { + secondaryClient, err = starter.StartGethNode(t.T, t.TestContext, t.Genesis, t.ClientParams, t.ClientFiles) + } + if err != nil { + t.Fatalf("FAIL (%s): Unable to spawn a secondary client: %v", t.TestName, err) + } + + t.CLMock.AddEngineClient(secondaryClient) + secondaryTestClient := test.NewTestEngineClient(t, secondaryClient) + + if !tc.ReOrgFromCanonical { + // Remove the original client so that it does not receive the payloads created on the canonical chain + t.CLMock.RemoveEngineClient(t.Engine) + } + + // Wait until TTD is reached by this client + t.CLMock.WaitForTTD() + + // Produce blocks before starting the test + // Default is to produce 5 PoS blocks before the common ancestor + cAHeight := 5 + if tc.CommonAncestorHeight != nil { + cAHeight = int(tc.CommonAncestorHeight.Int64()) + } + + // Save the common ancestor + if cAHeight == 0 { + t.Fatalf("FAIL (%s): Invalid common ancestor height: %d", t.TestName, cAHeight) + } else { + t.CLMock.ProduceBlocks(cAHeight, clmock.BlockProcessCallbacks{}) + } + + // Amount of blocks to deviate starting from the common ancestor + // Default is to deviate 10 payloads from the common ancestor + n := 10 + if tc.DeviatingPayloadCount != nil { + n = int(tc.DeviatingPayloadCount.Int64()) + } + + // Slice to save the side B chain + altChainPayloads := make([]*typ.ExecutableData, 0) + + // Append the common ancestor + cA := t.CLMock.LatestPayloadBuilt + altChainPayloads = append(altChainPayloads, &cA) + + // Produce blocks but at the same time create an side chain which contains an invalid payload at some point (INV_P) + // CommonAncestor◄─▲── P1 ◄─ P2 ◄─ P3 ◄─ ... ◄─ Pn + // │ + // └── P1' ◄─ P2' ◄─ ... ◄─ INV_P ◄─ ... ◄─ Pn' + t.Log("INFO: Starting canonical chain production") + t.CLMock.ProduceBlocks(n, clmock.BlockProcessCallbacks{ + + OnPayloadProducerSelected: func() { + // Function to send at least one transaction each block produced. + // Empty Txs Payload with invalid stateRoot discovered an issue in geth sync, hence this is customizable. + if !tc.EmptyTransactions { + // Send the transaction to the globals.PrevRandaoContractAddr + _, err := t.SendNextTransaction( + t.TestContext, + t.CLMock.NextBlockProducer, + &helper.BaseTransactionCreator{ + Recipient: &globals.PrevRandaoContractAddr, + Amount: big1, + Payload: nil, + TxType: t.TestTransactionType, + GasLimit: 75000, + ForkConfig: t.ForkConfig, + }, + ) + if err != nil { + t.Fatalf("FAIL (%s): Error trying to send transaction: %v", t.TestName, err) + } + } + }, + OnGetPayload: func() { + var ( + sidePayload *typ.ExecutableData + err error + ) + // Insert extraData to ensure we deviate from the main payload, which contains empty extradata + pHash := altChainPayloads[len(altChainPayloads)-1].BlockHash + customizer := &helper.CustomPayloadData{ + ParentHash: &pHash, + ExtraData: &([]byte{0x01}), + } + sidePayload, err = customizer.CustomizePayload(&t.CLMock.LatestPayloadBuilt) + if err != nil { + t.Fatalf("FAIL (%s): Unable to customize payload: %v", t.TestName, err) + } + if len(altChainPayloads) == tc.InvalidIndex { + sidePayload, err = helper.GenerateInvalidPayload(sidePayload, tc.InvalidField) + if err != nil { + t.Fatalf("FAIL (%s): Unable to customize payload: %v", t.TestName, err) + } + } + altChainPayloads = append(altChainPayloads, sidePayload) + + // TODO: This could be useful to try to produce an invalid block that has some invalid field not included in the ExecutableData + sideBlock, err := typ.ExecutableDataToBlock(*sidePayload) + if err != nil { + t.Fatalf("FAIL (%s): Error converting payload to block: %v", t.TestName, err) + } + if len(altChainPayloads) == tc.InvalidIndex { + var uncle *types.Block + if tc.InvalidField == helper.InvalidOmmers { + if unclePayload, ok := t.CLMock.ExecutedPayloadHistory[sideBlock.NumberU64()-1]; ok && unclePayload != nil { + // Uncle is a PoS payload + uncle, err = typ.ExecutableDataToBlock(*unclePayload) + if err != nil { + t.Fatalf("FAIL (%s): Unable to get uncle block: %v", t.TestName, err) + } + } else { + panic("FAIL: Unable to get uncle block") + } + } + // Invalidate fields not available in the ExecutableData + sideBlock, err = helper.GenerateInvalidPayloadBlock(sideBlock, uncle, tc.InvalidField) + if err != nil { + t.Fatalf("FAIL (%s): Unable to customize payload block: %v", t.TestName, err) + } + } + }, + }) + t.Log("INFO: Starting side chain production") + t.CLMock.ProduceSingleBlock(clmock.BlockProcessCallbacks{ + // Note: We perform the test in the middle of payload creation by the CL Mock, in order to be able to + // re-org back into this chain and use the new payload without issues. + OnGetPayload: func() { + + // Now let's send the side chain to the client using newPayload/sync + for i := 1; i < n; i++ { + // Send the payload + payloadValidStr := "VALID" + if i == tc.InvalidIndex { + payloadValidStr = "INVALID" + } else if i > tc.InvalidIndex { + payloadValidStr = "VALID with INVALID ancestor" + } + payloadJs, _ := json.MarshalIndent(altChainPayloads[i], "", " ") + t.Logf("INFO (%s): Invalid chain payload %d (%s):\n%s", t.TestName, i, payloadValidStr, payloadJs) + + if i < tc.InvalidIndex { + p := altChainPayloads[i] + r := secondaryTestClient.TestEngineNewPayload(p) + r.ExpectationDescription = "Sent modified payload to secondary client, expected to be accepted" + r.ExpectStatusEither(test.Valid, test.Accepted) + + s := secondaryTestClient.TestEngineForkchoiceUpdated(&api.ForkchoiceStateV1{ + HeadBlockHash: p.BlockHash, + SafeBlockHash: cA.BlockHash, + FinalizedBlockHash: common.Hash{}, + }, nil, p.Timestamp) + s.ExpectationDescription = "Sent modified payload forkchoice updated to secondary client, expected to be accepted" + s.ExpectAnyPayloadStatus(test.Valid, test.Syncing) + + } else { + invalidBlock, err := typ.ExecutableDataToBlock(*altChainPayloads[i]) + if err != nil { + t.Fatalf("FAIL (%s): TEST ISSUE - Failed to create block from payload: %v", t.TestName, err) + } + + if err := secondaryClient.SetBlock(invalidBlock, altChainPayloads[i-1].Number, altChainPayloads[i-1].StateRoot); err != nil { + t.Fatalf("FAIL (%s): TEST ISSUE - Failed to set invalid block: %v", t.TestName, err) + } + t.Logf("INFO (%s): Invalid block successfully set %d (%s): %v", t.TestName, i, payloadValidStr, invalidBlock.Hash()) + } + } + // Check that the second node has the correct head + ctx, cancel := context.WithTimeout(t.TestContext, globals.RPCTimeout) + defer cancel() + head, err := secondaryClient.HeaderByNumber(ctx, nil) + if err != nil { + t.Fatalf("FAIL (%s): TEST ISSUE - Secondary Node unable to reatrieve latest header: %v", t.TestName, err) + + } + if head.Hash() != altChainPayloads[n-1].BlockHash { + t.Fatalf("FAIL (%s): TEST ISSUE - Secondary Node has invalid blockhash got %v want %v gotNum %v wantNum %d", t.TestName, head.Hash(), altChainPayloads[n-1].BlockHash, head.Number, altChainPayloads[n].Number) + } else { + t.Logf("INFO (%s): Secondary Node has correct block", t.TestName) + } + + if !tc.ReOrgFromCanonical { + // Add the main client as a peer of the secondary client so it is able to sync + secondaryClient.AddPeer(t.Engine) + + ctx, cancel := context.WithTimeout(t.TimeoutContext, globals.RPCTimeout) + defer cancel() + l, err := t.Eth.BlockByNumber(ctx, nil) + if err != nil { + t.Fatalf("FAIL (%s): Unable to query main client for latest block: %v", t.TestName, err) + } + t.Logf("INFO (%s): Latest block on main client before sync: hash=%v, number=%d", t.TestName, l.Hash(), l.Number()) + } + // If we are syncing through p2p, we need to keep polling until the client syncs the missing payloads + for { + r := t.TestEngine.TestEngineNewPayload(altChainPayloads[n]) + t.Logf("INFO (%s): Response from main client: %v", t.TestName, r.Status) + s := t.TestEngine.TestEngineForkchoiceUpdated(&api.ForkchoiceStateV1{ + HeadBlockHash: altChainPayloads[n].BlockHash, + SafeBlockHash: altChainPayloads[n].BlockHash, + FinalizedBlockHash: common.Hash{}, + }, nil, altChainPayloads[n].Timestamp) + t.Logf("INFO (%s): Response from main client fcu: %v", t.TestName, s.Response.PayloadStatus) + + if r.Status.Status == test.Invalid { + // We also expect that the client properly returns the LatestValidHash of the block on the + // side chain that is immediately prior to the invalid payload (or zero if parent is PoW) + var lvh common.Hash + if cAHeight != 0 || tc.InvalidIndex != 1 { + // Parent is NOT Proof of Work + lvh = altChainPayloads[tc.InvalidIndex-1].BlockHash + } + r.ExpectLatestValidHash(&lvh) + // Response on ForkchoiceUpdated should be the same + s.ExpectPayloadStatus(test.Invalid) + s.ExpectLatestValidHash(&lvh) + break + } else if test.PayloadStatus(r.Status.Status) == test.Valid { + ctx, cancel := context.WithTimeout(t.TestContext, globals.RPCTimeout) + defer cancel() + latestBlock, err := t.Eth.BlockByNumber(ctx, nil) + if err != nil { + t.Fatalf("FAIL (%s): Unable to get latest block: %v", t.TestName, err) + } + + // Print last n blocks, for debugging + k := latestBlock.Number().Int64() - int64(n) + if k < 0 { + k = 0 + } + for ; k <= latestBlock.Number().Int64(); k++ { + ctx, cancel = context.WithTimeout(t.TestContext, globals.RPCTimeout) + defer cancel() + latestBlock, err := t.Eth.BlockByNumber(ctx, big.NewInt(k)) + if err != nil { + t.Fatalf("FAIL (%s): Unable to get block %d: %v", t.TestName, k, err) + } + js, _ := json.MarshalIndent(latestBlock.Header(), "", " ") + t.Logf("INFO (%s): Block %d: %s", t.TestName, k, js) + } + + t.Fatalf("FAIL (%s): Client returned VALID on an invalid chain: %v", t.TestName, r.Status) + } + + select { + case <-time.After(time.Second): + continue + case <-t.TimeoutContext.Done(): + t.Fatalf("FAIL (%s): Timeout waiting for main client to detect invalid chain", t.TestName) + } + } + + if !tc.ReOrgFromCanonical { + // We need to send the canonical chain to the main client here + for i := t.CLMock.FirstPoSBlockNumber.Uint64(); i <= t.CLMock.LatestExecutedPayload.Number; i++ { + if payload, ok := t.CLMock.ExecutedPayloadHistory[i]; ok { + r := t.TestEngine.TestEngineNewPayload(payload) + r.ExpectStatus(test.Valid) + } + } + } + + // Resend the latest correct fcU + r := t.TestEngine.TestEngineForkchoiceUpdated(&t.CLMock.LatestForkchoice, nil, t.CLMock.LatestPayloadBuilt.Timestamp) + r.ExpectNoError() + // After this point, the CL Mock will send the next payload of the canonical chain + }, + }) + +} diff --git a/simulators/ethereum/engine/suites/engine/invalid_payload.go b/simulators/ethereum/engine/suites/engine/invalid_payload.go new file mode 100644 index 0000000000..781c4134d4 --- /dev/null +++ b/simulators/ethereum/engine/suites/engine/invalid_payload.go @@ -0,0 +1,450 @@ +package suite_engine + +import ( + "context" + "encoding/json" + "fmt" + "math/big" + "time" + + api "github.com/ethereum/go-ethereum/beacon/engine" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/hive/simulators/ethereum/engine/client/hive_rpc" + "github.com/ethereum/hive/simulators/ethereum/engine/clmock" + "github.com/ethereum/hive/simulators/ethereum/engine/config" + "github.com/ethereum/hive/simulators/ethereum/engine/globals" + "github.com/ethereum/hive/simulators/ethereum/engine/helper" + "github.com/ethereum/hive/simulators/ethereum/engine/test" + typ "github.com/ethereum/hive/simulators/ethereum/engine/types" +) + +// Generate test cases for each field of NewPayload, where the payload contains a single invalid field and a valid hash. +type InvalidPayloadTestCase struct { + test.BaseSpec + // InvalidField is the field that will be modified to create an invalid payload + InvalidField helper.InvalidPayloadBlockField + // Syncing is true if the client is expected to be in SYNCING mode after receiving the invalid payload + Syncing bool + // EmptyTransactions is true if the payload should not contain any transactions + EmptyTransactions bool + // If true, the payload can be detected to be invalid even when syncing + InvalidDetectedOnSync bool +} + +func (s InvalidPayloadTestCase) WithMainFork(fork config.Fork) test.Spec { + specCopy := s + specCopy.MainFork = fork + return specCopy +} + +func (i InvalidPayloadTestCase) GetName() string { + name := fmt.Sprintf("Invalid %s NewPayload", i.InvalidField) + if i.Syncing { + name += " - Syncing" + } + if i.EmptyTransactions { + name += " - Empty Transactions" + } + if i.BaseSpec.TestTransactionType == helper.DynamicFeeTxOnly { + name += fmt.Sprintf(" - %s", i.BaseSpec.TestTransactionType) + } + return name +} + +func (tc InvalidPayloadTestCase) Execute(t *test.Env) { + if tc.Syncing { + // To allow sending the primary engine client into SYNCING state, we need a secondary client to guide the payload creation + secondaryClient, err := hive_rpc.HiveRPCEngineStarter{}.StartClient(t.T, t.TestContext, t.Genesis, t.ClientParams, t.ClientFiles) + if err != nil { + t.Fatalf("FAIL (%s): Unable to spawn a secondary client: %v", t.TestName, err) + } + t.CLMock.AddEngineClient(secondaryClient) + } + + // Wait until TTD is reached by all clients + t.CLMock.WaitForTTD() + + txFunc := func() { + if !tc.EmptyTransactions { + // Function to send at least one transaction each block produced + // Send the transaction to the globals.PrevRandaoContractAddr + _, err := t.SendNextTransaction( + t.TestContext, + t.CLMock.NextBlockProducer, + &helper.BaseTransactionCreator{ + Recipient: &globals.PrevRandaoContractAddr, + Amount: big1, + Payload: nil, + TxType: t.TestTransactionType, + GasLimit: 75000, + ForkConfig: t.ForkConfig, + }, + ) + if err != nil { + t.Fatalf("FAIL (%s): Error trying to send transaction: %v", t.TestName, err) + } + } + } + + // Produce blocks before starting the test + t.CLMock.ProduceBlocks(5, clmock.BlockProcessCallbacks{ + // Make sure at least one transaction is included in each block + OnPayloadProducerSelected: txFunc, + }) + + if tc.Syncing { + // Disconnect the main engine client from the CL Mocker and produce a block + t.CLMock.RemoveEngineClient(t.Engine) + t.CLMock.ProduceSingleBlock(clmock.BlockProcessCallbacks{ + OnPayloadProducerSelected: txFunc, + }) + + // This block is now unknown to the main client, sending an fcU will set it to tc.Syncing mode + r := t.TestEngine.TestEngineForkchoiceUpdated(&t.CLMock.LatestForkchoice, nil, t.CLMock.LatestPayloadBuilt.Timestamp) + r.ExpectPayloadStatus(test.Syncing) + } + + var ( + alteredPayload *typ.ExecutableData + invalidDetectedOnSync bool = tc.InvalidDetectedOnSync + err error + ) + + t.CLMock.ProduceSingleBlock(clmock.BlockProcessCallbacks{ + // Make sure at least one transaction is included in the payload + OnPayloadProducerSelected: txFunc, + // Run test after the new payload has been obtained + OnGetPayload: func() { + // Alter the payload while maintaining a valid hash and send it to the client, should produce an error + + // We need at least one transaction for most test cases to work + if !tc.EmptyTransactions && len(t.CLMock.LatestPayloadBuilt.Transactions) == 0 { + // But if the payload has no transactions, the test is invalid + t.Fatalf("FAIL (%s): No transactions in the base payload", t.TestName) + } + + alteredPayload, err = helper.GenerateInvalidPayload(&t.CLMock.LatestPayloadBuilt, tc.InvalidField) + if err != nil { + t.Fatalf("FAIL (%s): Unable to modify payload (%v): %v", t.TestName, tc.InvalidField, err) + } + + if t.CLMock.LatestPayloadBuilt.VersionedHashes != nil && len(*t.CLMock.LatestPayloadBuilt.VersionedHashes) > 0 && tc.InvalidField == helper.RemoveTransaction { + // If the payload has versioned hashes, and we removed any transaction, it's highly likely the client will + // be able to detect the invalid payload even when syncing because of the blob gas used. + invalidDetectedOnSync = true + } + + // Depending on the field we modified, we expect a different status + r := t.TestEngine.TestEngineNewPayload(alteredPayload) + if tc.Syncing || tc.InvalidField == helper.InvalidParentHash { + // Execution specification:: + // {status: ACCEPTED, latestValidHash: null, validationError: null} if the following conditions are met: + // - the blockHash of the payload is valid + // - the payload doesn't extend the canonical chain + // - the payload hasn't been fully validated + // {status: SYNCING, latestValidHash: null, validationError: null} + // if the payload extends the canonical chain and requisite data for its validation is missing + // (the client can assume the payload extends the canonical because the linking payload could be missing) + if invalidDetectedOnSync { + // For some fields, the client can detect the invalid payload even when it doesn't have the parent + r.ExpectStatusEither(test.Invalid) + } else { + r.ExpectStatusEither(test.Accepted, test.Syncing) + r.ExpectLatestValidHash(nil) + } + } else { + r.ExpectStatus(test.Invalid) + r.ExpectLatestValidHash(&alteredPayload.ParentHash) + } + + // Send the forkchoiceUpdated with a reference to the invalid payload. + fcState := api.ForkchoiceStateV1{ + HeadBlockHash: alteredPayload.BlockHash, + SafeBlockHash: alteredPayload.BlockHash, + FinalizedBlockHash: alteredPayload.BlockHash, + } + payloadAttrbutes := t.CLMock.LatestPayloadAttributes + payloadAttrbutes.Timestamp = alteredPayload.Timestamp + 1 + payloadAttrbutes.Random = common.Hash{} + payloadAttrbutes.SuggestedFeeRecipient = common.Address{} + + // Execution specification: + // {payloadStatus: {status: INVALID, latestValidHash: null, validationError: errorMessage | null}, payloadId: null} + // obtained from the Payload validation process if the payload is deemed INVALID + s := t.TestEngine.TestEngineForkchoiceUpdated(&fcState, &payloadAttrbutes, alteredPayload.Timestamp) + if !tc.Syncing { + // Execution specification: + // {payloadStatus: {status: INVALID, latestValidHash: null, validationError: errorMessage | null}, payloadId: null} + // obtained from the Payload validation process if the payload is deemed INVALID + // Note: SYNCING/ACCEPTED is acceptable here as long as the block produced after this test is produced successfully + s.ExpectAnyPayloadStatus(test.Syncing, test.Accepted, test.Invalid) + } else { + // At this moment the response should be SYNCING + s.ExpectPayloadStatus(test.Syncing) + + // When we send the previous payload, the client must now be capable of determining that the invalid payload is actually invalid + p := t.TestEngine.TestEngineNewPayload(&t.CLMock.LatestExecutedPayload) + p.ExpectStatus(test.Valid) + p.ExpectLatestValidHash(&t.CLMock.LatestExecutedPayload.BlockHash) + + /* + // Another option here could be to send an fcU to the previous payload, + // but this does not seem like something the CL would do. + s := t.TestEngine.TestEngineForkchoiceUpdated(&api.ForkchoiceStateV1{ + HeadBlockHash: previousPayload.BlockHash, + SafeBlockHash: previousPayload.BlockHash, + FinalizedBlockHash: previousPayload.BlockHash, + }, nil) + s.ExpectPayloadStatus(Valid) + */ + + q := t.TestEngine.TestEngineNewPayload(alteredPayload) + if tc.InvalidField == helper.InvalidParentHash { + // There is no invalid parentHash, if this value is incorrect, + // it is assumed that the block is missing and we need to sync. + // ACCEPTED also valid since the CLs normally use these interchangeably + q.ExpectStatusEither(test.Syncing, test.Accepted) + q.ExpectLatestValidHash(nil) + } else if tc.InvalidField == helper.InvalidNumber { + // A payload with an invalid number can force us to start a sync cycle + // as we don't know if that block might be a valid future block. + q.ExpectStatusEither(test.Invalid, test.Syncing) + if q.Status.Status == test.Invalid { + q.ExpectLatestValidHash(&t.CLMock.LatestExecutedPayload.BlockHash) + } else { + q.ExpectLatestValidHash(nil) + } + } else { + // Otherwise the response should be INVALID. + q.ExpectStatus(test.Invalid) + q.ExpectLatestValidHash(&t.CLMock.LatestExecutedPayload.BlockHash) + } + + // Try sending the fcU again, this time we should get the proper invalid response. + // At this moment the response should be INVALID + if tc.InvalidField != helper.InvalidParentHash { + s := t.TestEngine.TestEngineForkchoiceUpdated(&fcState, nil, alteredPayload.Timestamp) + // Note: SYNCING is acceptable here as long as the block produced after this test is produced successfully + s.ExpectAnyPayloadStatus(test.Syncing, test.Invalid) + } + } + + // Finally, attempt to fetch the invalid payload using the JSON-RPC endpoint + p := t.TestEngine.TestHeaderByHash(alteredPayload.BlockHash) + p.ExpectError() + }, + }) + + if tc.Syncing { + // Send the valid payload and its corresponding forkchoiceUpdated + r := t.TestEngine.TestEngineNewPayload(&t.CLMock.LatestExecutedPayload) + r.ExpectStatus(test.Valid) + r.ExpectLatestValidHash(&t.CLMock.LatestExecutedPayload.BlockHash) + + s := t.TestEngine.TestEngineForkchoiceUpdated(&t.CLMock.LatestForkchoice, nil, t.CLMock.LatestExecutedPayload.Timestamp) + s.ExpectPayloadStatus(test.Valid) + s.ExpectLatestValidHash(&t.CLMock.LatestExecutedPayload.BlockHash) + + // Add main client again to the CL Mocker + t.CLMock.AddEngineClient(t.Engine) + } + + // Lastly, attempt to build on top of the invalid payload + t.CLMock.ProduceSingleBlock(clmock.BlockProcessCallbacks{ + // Run test after the new payload has been obtained + OnGetPayload: func() { + followUpAlteredPayload, err := (&helper.CustomPayloadData{ + ParentHash: &alteredPayload.BlockHash, + }).CustomizePayload(&t.CLMock.LatestPayloadBuilt) + if err != nil { + t.Fatalf("FAIL (%s): Unable to modify payload: %v", t.TestName, err) + } + + t.Logf("INFO (%s): Sending customized NewPayload: ParentHash %v -> %v", t.TestName, t.CLMock.LatestPayloadBuilt.ParentHash, alteredPayload.BlockHash) + // Response status can be ACCEPTED (since parent payload could have been thrown out by the client) + // or SYNCING (parent payload is thrown out and also client assumes that the parent is part of canonical chain) + // or INVALID (client still has the payload and can verify that this payload is incorrectly building on top of it), + // but a VALID response is incorrect. + r := t.TestEngine.TestEngineNewPayload(followUpAlteredPayload) + r.ExpectStatusEither(test.Accepted, test.Invalid, test.Syncing) + if r.Status.Status == test.Accepted || r.Status.Status == test.Syncing { + r.ExpectLatestValidHash(nil) + } else if r.Status.Status == test.Invalid { + r.ExpectLatestValidHash(&alteredPayload.ParentHash) + } + }, + }) +} + +// Build on top of the latest valid payload after an invalid payload had been received: +// P <- INV_P, newPayload(INV_P), fcU(head: P, payloadAttributes: attrs) + getPayload(…) +type PayloadBuildAfterInvalidPayloadTest struct { + test.BaseSpec + InvalidField helper.InvalidPayloadBlockField +} + +func (s PayloadBuildAfterInvalidPayloadTest) WithMainFork(fork config.Fork) test.Spec { + specCopy := s + specCopy.MainFork = fork + return specCopy +} + +func (i PayloadBuildAfterInvalidPayloadTest) GetName() string { + name := fmt.Sprintf("Payload Build after New Invalid Payload: Invalid %s", i.InvalidField) + return name +} + +func (tc PayloadBuildAfterInvalidPayloadTest) Execute(t *test.Env) { + // Add a second client to build the invalid payload + secondaryEngine, err := hive_rpc.HiveRPCEngineStarter{}.StartClient(t.T, t.TestContext, t.Genesis, t.ClientParams, t.ClientFiles) + + if err != nil { + t.Fatalf("FAIL (%s): Unable to spawn a secondary client: %v", t.TestName, err) + } + secondaryEngineTest := test.NewTestEngineClient(t, secondaryEngine) + t.CLMock.AddEngineClient(secondaryEngine) + + // Wait until TTD is reached by this client + t.CLMock.WaitForTTD() + + // Produce blocks before starting the test + t.CLMock.ProduceBlocks(5, clmock.BlockProcessCallbacks{}) + + // Produce another block, but at the same time send an invalid payload from the other client + t.CLMock.ProduceSingleBlock(clmock.BlockProcessCallbacks{ + OnPayloadAttributesGenerated: func() { + // We are going to use the client that was not selected + // by the CLMocker to produce the invalid payload + invalidPayloadProducer := t.TestEngine + if t.CLMock.NextBlockProducer == invalidPayloadProducer.Engine { + invalidPayloadProducer = secondaryEngineTest + } + var inv_p *typ.ExecutableData + + { + // Get a payload from the invalid payload producer and invalidate it + var ( + prevRandao = common.Hash{} + suggestedFeeRecipient = common.Address{} + ) + payloadAttributes, err := (&helper.BasePayloadAttributesCustomizer{ + Random: &prevRandao, + SuggestedFeeRecipient: &suggestedFeeRecipient, + }).GetPayloadAttributes(&t.CLMock.LatestPayloadAttributes) + if err != nil { + t.Fatalf("FAIL (%s): Unable to customize payload attributes: %v", t.TestName, err) + } + + r := invalidPayloadProducer.TestEngineForkchoiceUpdated(&t.CLMock.LatestForkchoice, payloadAttributes, t.CLMock.LatestHeader.Time) + r.ExpectPayloadStatus(test.Valid) + // Wait for the payload to be produced by the EL + time.Sleep(time.Second) + + s := invalidPayloadProducer.TestEngineGetPayload( + r.Response.PayloadID, + payloadAttributes, + ) + s.ExpectNoError() + + inv_p, err = helper.GenerateInvalidPayload(&s.Payload, helper.InvalidStateRoot) + if err != nil { + t.Fatalf("FAIL (%s): Unable to invalidate payload: %v", t.TestName, err) + } + } + + // Broadcast the invalid payload + r := t.TestEngine.TestEngineNewPayload(inv_p) + r.ExpectStatus(test.Invalid) + r.ExpectLatestValidHash(&t.CLMock.LatestForkchoice.HeadBlockHash) + s := secondaryEngineTest.TestEngineNewPayload(inv_p) + s.ExpectStatus(test.Invalid) + s.ExpectLatestValidHash(&t.CLMock.LatestForkchoice.HeadBlockHash) + + // Let the block production continue. + // At this point the selected payload producer will + // try to continue creating a valid payload. + }, + }) +} + +type InvalidTxChainIDTest struct { + test.BaseSpec +} + +func (s InvalidTxChainIDTest) WithMainFork(fork config.Fork) test.Spec { + specCopy := s + specCopy.MainFork = fork + return specCopy +} + +func (s InvalidTxChainIDTest) GetName() string { + name := fmt.Sprintf("Build Payload with Invalid ChainID Transaction (%s)", s.TestTransactionType) + return name +} + +// Attempt to produce a payload after a transaction with an invalid Chain ID was sent to the client +// using `eth_sendRawTransaction`. +func (spec InvalidTxChainIDTest) Execute(t *test.Env) { + // Wait until TTD is reached by this client + t.CLMock.WaitForTTD() + + // Produce blocks before starting the test + t.CLMock.ProduceBlocks(5, clmock.BlockProcessCallbacks{}) + + // Send a transaction with an incorrect ChainID. + // Transaction must be not be included in payload creation. + var invalidChainIDTx *types.Transaction + t.CLMock.ProduceSingleBlock(clmock.BlockProcessCallbacks{ + // Run test after a new payload has been broadcast + OnPayloadAttributesGenerated: func() { + txCreator := helper.BaseTransactionCreator{ + Recipient: &globals.PrevRandaoContractAddr, + Amount: big1, + Payload: nil, + TxType: t.TestTransactionType, + GasLimit: 75000, + ForkConfig: t.ForkConfig, + } + sender := globals.TestAccounts[0] + + ctx, cancel := context.WithTimeout(t.TestContext, globals.RPCTimeout) + defer cancel() + nonce, err := t.CLMock.NextBlockProducer.NonceAt(ctx, sender.GetAddress(), nil) + if err != nil { + t.Fatalf("FAIL(%s): Unable to get address nonce: %v", t.TestName, err) + } + + tx, err := txCreator.MakeTransaction(sender, nonce, t.CLMock.LatestPayloadAttributes.Timestamp) + if err != nil { + t.Fatalf("FAIL(%s): Unable to create transaction: %v", t.TestName, err) + } + + txCast, ok := tx.(*types.Transaction) + if !ok { + t.Fatalf("FAIL(%s): Unable to cast transaction to types.Transaction", t.TestName) + } + + txCustomizerData := &helper.CustomTransactionData{ + ChainID: new(big.Int).Add(globals.ChainID, big1), + } + invalidChainIDTx, err = helper.CustomizeTransaction(txCast, sender, txCustomizerData) + if err != nil { + t.Fatalf("FAIL(%s): Unable to customize transaction: %v", t.TestName, err) + } + + ctx, cancel = context.WithTimeout(t.TestContext, globals.RPCTimeout) + defer cancel() + err = t.Engine.SendTransaction(ctx, invalidChainIDTx) + if err != nil { + t.Logf("INFO (%s): Error on sending transaction with incorrect chain ID (Expected): %v", t.TestName, err) + } + }, + }) + + // Verify that the latest payload built does NOT contain the invalid chain Tx + if helper.TransactionInPayload(&t.CLMock.LatestPayloadBuilt, invalidChainIDTx) { + p, _ := json.MarshalIndent(t.CLMock.LatestPayloadBuilt, "", " ") + t.Fatalf("FAIL (%s): Invalid chain ID tx was included in payload: %s", t.TestName, p) + } +} diff --git a/simulators/ethereum/engine/suites/engine/payload_attributes.go b/simulators/ethereum/engine/suites/engine/payload_attributes.go new file mode 100644 index 0000000000..4ab3f15099 --- /dev/null +++ b/simulators/ethereum/engine/suites/engine/payload_attributes.go @@ -0,0 +1,88 @@ +package suite_engine + +import ( + "fmt" + "math/rand" + + "github.com/ethereum/hive/simulators/ethereum/engine/clmock" + "github.com/ethereum/hive/simulators/ethereum/engine/config" + "github.com/ethereum/hive/simulators/ethereum/engine/helper" + "github.com/ethereum/hive/simulators/ethereum/engine/test" +) + +type InvalidPayloadAttributesTest struct { + test.BaseSpec + Description string + Customizer helper.PayloadAttributesCustomizer + Syncing bool + ErrorOnSync bool +} + +func (s InvalidPayloadAttributesTest) WithMainFork(fork config.Fork) test.Spec { + specCopy := s + specCopy.MainFork = fork + return specCopy +} + +func (tc InvalidPayloadAttributesTest) GetName() string { + name := fmt.Sprintf("Invalid PayloadAttributes: %s", tc.Description) + if tc.Syncing { + name += " (Syncing)" + } + return name +} + +func (tc InvalidPayloadAttributesTest) Execute(t *test.Env) { + // Wait until TTD is reached by this client + t.CLMock.WaitForTTD() + + // Produce blocks before starting the test + t.CLMock.ProduceBlocks(5, clmock.BlockProcessCallbacks{}) + + // Send a forkchoiceUpdated with invalid PayloadAttributes + t.CLMock.ProduceSingleBlock(clmock.BlockProcessCallbacks{ + OnNewPayloadBroadcast: func() { + // Try to apply the new payload with invalid attributes + fcu := t.CLMock.LatestForkchoice + if tc.Syncing { + // Setting a random hash will put the client into `SYNCING` + rand.Read(fcu.HeadBlockHash[:]) + } else { + fcu.HeadBlockHash = t.CLMock.LatestPayloadBuilt.BlockHash + } + t.Logf("INFO (%s): Sending EngineForkchoiceUpdated (Syncing=%t) with invalid payload attributes: %s", t.TestName, tc.Syncing, tc.Description) + + // Get the payload attributes + originalAttr := t.CLMock.LatestPayloadAttributes + originalAttr.Timestamp += 1 + attr, err := tc.Customizer.GetPayloadAttributes(&originalAttr) + if err != nil { + t.Fatalf("FAIL (%s): Unable to customize payload attributes: %v", t.TestName, err) + } + + // 0) Check headBlock is known and there is no missing data, if not respond with SYNCING + // 1) Check headBlock is VALID, if not respond with INVALID + // 2) Apply forkchoiceState + // 3) Check payloadAttributes, if invalid respond with error: code: Invalid payload attributes + // 4) Start payload build process and respond with VALID + if tc.Syncing { + // If we are SYNCING, the outcome should be SYNCING regardless of the validity of the payload atttributes + r := t.TestEngine.TestEngineForkchoiceUpdated(&fcu, attr, t.CLMock.LatestPayloadBuilt.Timestamp) + if tc.ErrorOnSync { + r.ExpectError() + } else { + r.ExpectPayloadStatus(test.Syncing) + r.ExpectPayloadID(nil) + } + } else { + r := t.TestEngine.TestEngineForkchoiceUpdated(&fcu, attr, t.CLMock.LatestPayloadBuilt.Timestamp) + r.ExpectError() + + // Check that the forkchoice was applied, regardless of the error + s := t.TestEngine.TestHeaderByNumber(Head) + s.ExpectationDescription = "Forkchoice is applied even on invalid payload attributes" + s.ExpectHash(fcu.HeadBlockHash) + } + }, + }) +} diff --git a/simulators/ethereum/engine/suites/engine/payload_execution.go b/simulators/ethereum/engine/suites/engine/payload_execution.go new file mode 100644 index 0000000000..466eb31771 --- /dev/null +++ b/simulators/ethereum/engine/suites/engine/payload_execution.go @@ -0,0 +1,547 @@ +package suite_engine + +import ( + "math/big" + "math/rand" + + api "github.com/ethereum/go-ethereum/beacon/engine" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/hive/simulators/ethereum/engine/client" + "github.com/ethereum/hive/simulators/ethereum/engine/client/hive_rpc" + "github.com/ethereum/hive/simulators/ethereum/engine/clmock" + "github.com/ethereum/hive/simulators/ethereum/engine/config" + "github.com/ethereum/hive/simulators/ethereum/engine/helper" + "github.com/ethereum/hive/simulators/ethereum/engine/test" + typ "github.com/ethereum/hive/simulators/ethereum/engine/types" +) + +type ReExecutePayloadTest struct { + test.BaseSpec + PayloadCount int +} + +func (s ReExecutePayloadTest) WithMainFork(fork config.Fork) test.Spec { + specCopy := s + specCopy.MainFork = fork + return specCopy +} + +func (s ReExecutePayloadTest) GetName() string { + name := "Re-Execute Payload" + return name +} + +// Consecutive Payload Execution: Secondary client should be able to set the forkchoiceUpdated to payloads received consecutively +func (spec ReExecutePayloadTest) Execute(t *test.Env) { + // Wait until this client catches up with latest PoS + t.CLMock.WaitForTTD() + + // How many Payloads we are going to re-execute + var payloadReExecCount = 10 + + if spec.PayloadCount > 0 { + payloadReExecCount = spec.PayloadCount + } + + // Create those blocks + t.CLMock.ProduceBlocks(payloadReExecCount, clmock.BlockProcessCallbacks{ + OnPayloadProducerSelected: func() { + // Send at least one transaction per payload + _, err := t.SendNextTransaction( + t.TestContext, + t.CLMock.NextBlockProducer, + &helper.BaseTransactionCreator{ + Recipient: nil, + Amount: nil, + Payload: nil, + TxType: t.TestTransactionType, + GasLimit: 75000, + ForkConfig: t.ForkConfig, + }, + ) + if err != nil { + t.Fatalf("FAIL (%s): Error trying to send transaction: %v", t.TestName, err) + } + }, + OnGetPayload: func() { + // Check that the transaction was included + if len(t.CLMock.LatestPayloadBuilt.Transactions) == 0 { + t.Fatalf("FAIL (%s): Client failed to include the expected transaction in payload built", t.TestName) + } + }, + }) + + // Re-execute the payloads + r := t.TestEngine.TestBlockNumber() + r.ExpectNoError() + lastBlock := r.Number + t.Logf("INFO (%s): Started re-executing payloads at block: %v", t.TestName, lastBlock) + + for i := lastBlock - uint64(payloadReExecCount) + 1; i <= lastBlock; i++ { + payload, found := t.CLMock.ExecutedPayloadHistory[i] + if !found { + t.Fatalf("FAIL (%s): (test issue) Payload with index %d does not exist", i) + } + + r := t.TestEngine.TestEngineNewPayload(payload) + r.ExpectStatus(test.Valid) + r.ExpectLatestValidHash(&payload.BlockHash) + } +} + +type InOrderPayloadExecutionTest struct { + test.BaseSpec +} + +func (s InOrderPayloadExecutionTest) WithMainFork(fork config.Fork) test.Spec { + specCopy := s + specCopy.MainFork = fork + return specCopy +} + +func (s InOrderPayloadExecutionTest) GetName() string { + name := "In-Order Consecutive Payload Execution" + return name +} + +// Consecutive Payload Execution: Secondary client should be able to set the forkchoiceUpdated to payloads received consecutively +func (spec InOrderPayloadExecutionTest) Execute(t *test.Env) { + // Wait until this client catches up with latest PoS + t.CLMock.WaitForTTD() + + // Send a single block to allow sending newer transaction types on the payloads + t.CLMock.ProduceSingleBlock(clmock.BlockProcessCallbacks{}) + + // First prepare payloads on a first client, which will also contain multiple transactions + + // We will be also verifying that the transactions are correctly interpreted in the canonical chain, + // prepare a random account to receive funds. + recipient := common.Address{} + rand.Read(recipient[:]) + amountPerTx := big.NewInt(1000) + txPerPayload := 20 + payloadCount := 10 + txsIncluded := 0 + + t.CLMock.ProduceBlocks(payloadCount, clmock.BlockProcessCallbacks{ + // We send the transactions after we got the Payload ID, before the CLMocker gets the prepared Payload + OnPayloadProducerSelected: func() { + _, err := t.SendNextTransactions( + t.TestContext, + t.CLMock.NextBlockProducer, + &helper.BaseTransactionCreator{ + Recipient: &recipient, + Amount: amountPerTx, + Payload: nil, + TxType: t.TestTransactionType, + GasLimit: 75000, + ForkConfig: t.ForkConfig, + }, + uint64(txPerPayload), + ) + if err != nil { + t.Fatalf("FAIL (%s): Error trying to send transaction: %v", t.TestName, err) + } + }, + OnGetPayload: func() { + if len(t.CLMock.LatestPayloadBuilt.Transactions) < (txPerPayload / 2) { + t.Fatalf("FAIL (%s): Client failed to include all the expected transactions in payload built: %d < %d", t.TestName, len(t.CLMock.LatestPayloadBuilt.Transactions), (txPerPayload / 2)) + } + txsIncluded += len(t.CLMock.LatestPayloadBuilt.Transactions) + }, + }) + + expectedBalance := amountPerTx.Mul(amountPerTx, big.NewInt(int64(txsIncluded))) + + // Check balance on this first client + r := t.TestEngine.TestBalanceAt(recipient, nil) + r.ExpectBalanceEqual(expectedBalance) + + // Start a second client to send newPayload consecutively without fcU + secondaryClient, err := hive_rpc.HiveRPCEngineStarter{}.StartClient(t.T, t.TestContext, t.Genesis, t.ClientParams, t.ClientFiles) + if err != nil { + t.Fatalf("FAIL (%s): Unable to start secondary client: %v", t.TestName, err) + } + secondaryTestEngineClient := test.NewTestEngineClient(t, secondaryClient) + + // Send the forkchoiceUpdated with the LatestExecutedPayload hash, we should get SYNCING back + fcU := api.ForkchoiceStateV1{ + HeadBlockHash: t.CLMock.LatestExecutedPayload.BlockHash, + SafeBlockHash: t.CLMock.LatestExecutedPayload.BlockHash, + FinalizedBlockHash: t.CLMock.LatestExecutedPayload.BlockHash, + } + + s := secondaryTestEngineClient.TestEngineForkchoiceUpdated(&fcU, nil, t.CLMock.LatestExecutedPayload.Timestamp) + s.ExpectPayloadStatus(test.Syncing) + s.ExpectLatestValidHash(nil) + s.ExpectNoValidationError() + + // Send all the payloads in the increasing order + for k := t.CLMock.FirstPoSBlockNumber.Uint64(); k <= t.CLMock.LatestExecutedPayload.Number; k++ { + payload := t.CLMock.ExecutedPayloadHistory[k] + + s := secondaryTestEngineClient.TestEngineNewPayload(payload) + s.ExpectStatus(test.Valid) + s.ExpectLatestValidHash(&payload.BlockHash) + + } + + s = secondaryTestEngineClient.TestEngineForkchoiceUpdated(&fcU, nil, t.CLMock.LatestExecutedPayload.Timestamp) + s.ExpectPayloadStatus(test.Valid) + s.ExpectLatestValidHash(&fcU.HeadBlockHash) + s.ExpectNoValidationError() + + // At this point we should have our funded account balance equal to the expected value. + q := secondaryTestEngineClient.TestBalanceAt(recipient, nil) + q.ExpectBalanceEqual(expectedBalance) + + // Add the client to the CLMocker + t.CLMock.AddEngineClient(secondaryClient) + + // Produce a single block on top of the canonical chain, all clients must accept this + t.CLMock.ProduceSingleBlock(clmock.BlockProcessCallbacks{}) + + // Head must point to the latest produced payload + p := secondaryTestEngineClient.TestHeaderByNumber(nil) + p.ExpectHash(t.CLMock.LatestExecutedPayload.BlockHash) +} + +type MultiplePayloadsExtendingCanonicalChainTest struct { + test.BaseSpec + // How many parallel payloads to execute + PayloadCount int + // If set to true, the head will be set to the first payload executed by the client + // If set to false, the head will be set to the latest payload executed by the client + SetHeadToFirstPayloadReceived bool +} + +func (s MultiplePayloadsExtendingCanonicalChainTest) WithMainFork(fork config.Fork) test.Spec { + specCopy := s + specCopy.MainFork = fork + return specCopy +} + +func (s MultiplePayloadsExtendingCanonicalChainTest) GetName() string { + name := "Multiple New Payloads Extending Canonical Chain" + if s.SetHeadToFirstPayloadReceived { + name += " (FcU to first payload received)" + } + return name +} + +// Consecutive Payload Execution: Secondary client should be able to set the forkchoiceUpdated to payloads received consecutively +func (spec MultiplePayloadsExtendingCanonicalChainTest) Execute(t *test.Env) { + // Wait until this client catches up with latest PoS + t.CLMock.WaitForTTD() + + // Produce blocks before starting the test + t.CLMock.ProduceBlocks(5, clmock.BlockProcessCallbacks{}) + + callbacks := clmock.BlockProcessCallbacks{ + // We send the transactions after we got the Payload ID, before the CLMocker gets the prepared Payload + OnPayloadProducerSelected: func() { + recipient := common.Address{} + rand.Read(recipient[:]) + _, err := t.SendNextTransaction( + t.TestContext, + t.CLMock.NextBlockProducer, + &helper.BaseTransactionCreator{ + Recipient: &recipient, + Amount: nil, + Payload: nil, + TxType: t.TestTransactionType, + GasLimit: 75000, + ForkConfig: t.ForkConfig, + }, + ) + if err != nil { + t.Fatalf("FAIL (%s): Error trying to send transaction: %v", t.TestName, err) + } + }, + } + + reExecFunc := func() { + payloadCount := 80 + if spec.PayloadCount > 0 { + payloadCount = spec.PayloadCount + } + + basePayload := t.CLMock.LatestPayloadBuilt + + // Check that the transaction was included + if len(basePayload.Transactions) == 0 { + t.Fatalf("FAIL (%s): Client failed to include the expected transaction in payload built", t.TestName) + } + + // Fabricate and send multiple new payloads by changing the PrevRandao field + for i := 0; i < payloadCount; i++ { + newPrevRandao := common.Hash{} + rand.Read(newPrevRandao[:]) + customizer := &helper.CustomPayloadData{ + PrevRandao: &newPrevRandao, + } + newPayload, err := customizer.CustomizePayload(&basePayload) + if err != nil { + t.Fatalf("FAIL (%s): Unable to customize payload %v: %v", t.TestName, i, err) + } + + r := t.TestEngine.TestEngineNewPayload(newPayload) + r.ExpectStatus(test.Valid) + r.ExpectLatestValidHash(&newPayload.BlockHash) + } + } + + if spec.SetHeadToFirstPayloadReceived { + // We are going to set the head of the chain to the first payload executed by the client + // Therefore our re-execution function must be executed after the payload was broadcast + callbacks.OnNewPayloadBroadcast = reExecFunc + } else { + // Otherwise, we execute the payloads after we get the canonical one so it's + // executed last + callbacks.OnGetPayload = reExecFunc + } + + t.CLMock.ProduceSingleBlock(callbacks) + // At the end the CLMocker continues to try to execute fcU with the original payload, which should not fail +} + +type NewPayloadOnSyncingClientTest struct { + test.BaseSpec +} + +func (s NewPayloadOnSyncingClientTest) WithMainFork(fork config.Fork) test.Spec { + specCopy := s + specCopy.MainFork = fork + return specCopy +} + +func (s NewPayloadOnSyncingClientTest) GetName() string { + name := "Valid NewPayload->ForkchoiceUpdated on Syncing Client" + return name +} + +// Send a valid payload on a client that is currently SYNCING +func (spec NewPayloadOnSyncingClientTest) Execute(t *test.Env) { + var ( + secondaryClient client.EngineClient + previousPayload typ.ExecutableData + ) + { + // To allow sending the primary engine client into SYNCING state, we need a secondary client to guide the payload creation + var err error + secondaryClient, err = hive_rpc.HiveRPCEngineStarter{}.StartClient(t.T, t.TestContext, t.Genesis, t.ClientParams, t.ClientFiles) + + if err != nil { + t.Fatalf("FAIL (%s): Unable to spawn a secondary client: %v", t.TestName, err) + } + t.CLMock.AddEngineClient(secondaryClient) + } + + // Wait until TTD is reached by all clients + t.CLMock.WaitForTTD() + + // Produce blocks before starting the test + t.CLMock.ProduceBlocks(5, clmock.BlockProcessCallbacks{}) + + // Set a random transaction recipient + recipient := common.Address{} + rand.Read(recipient[:]) + + // Disconnect the first engine client from the CL Mocker and produce a block + t.CLMock.RemoveEngineClient(t.Engine) + t.CLMock.ProduceSingleBlock(clmock.BlockProcessCallbacks{ + OnPayloadProducerSelected: func() { + // Send at least one transaction per payload + _, err := t.SendNextTransaction( + t.TestContext, + t.CLMock.NextBlockProducer, + &helper.BaseTransactionCreator{ + Recipient: &recipient, + Amount: nil, + Payload: nil, + TxType: t.TestTransactionType, + GasLimit: 75000, + ForkConfig: t.ForkConfig, + }, + ) + if err != nil { + t.Fatalf("FAIL (%s): Error trying to send transaction: %v", t.TestName, err) + } + }, + OnGetPayload: func() { + // Check that the transaction was included + if len(t.CLMock.LatestPayloadBuilt.Transactions) == 0 { + t.Fatalf("FAIL (%s): Client failed to include the expected transaction in payload built", t.TestName) + } + }, + }) + + previousPayload = t.CLMock.LatestPayloadBuilt + + // Send the fcU to set it to syncing mode + r := t.TestEngine.TestEngineForkchoiceUpdated(&t.CLMock.LatestForkchoice, nil, t.CLMock.LatestHeader.Time) + r.ExpectPayloadStatus(test.Syncing) + + t.CLMock.ProduceSingleBlock(clmock.BlockProcessCallbacks{ + OnPayloadProducerSelected: func() { + // Send at least one transaction per payload + _, err := t.SendNextTransaction( + t.TestContext, + t.CLMock.NextBlockProducer, + &helper.BaseTransactionCreator{ + Recipient: &recipient, + Amount: nil, + Payload: nil, + TxType: t.TestTransactionType, + GasLimit: 75000, + ForkConfig: t.ForkConfig, + }, + ) + if err != nil { + t.Fatalf("FAIL (%s): Error trying to send transaction: %v", t.TestName, err) + } + }, + // Run test after the new payload has been obtained + OnGetPayload: func() { + // Send the new payload from the second client to the first, it won't be able to validate it + r := t.TestEngine.TestEngineNewPayload(&t.CLMock.LatestPayloadBuilt) + r.ExpectStatusEither(test.Accepted, test.Syncing) + r.ExpectLatestValidHash(nil) + + // Send the forkchoiceUpdated with a reference to the valid payload on the SYNCING client. + var ( + random = common.Hash{} + suggestedFeeRecipient = common.Address{} + ) + payloadAttributesCustomizer := &helper.BasePayloadAttributesCustomizer{ + Random: &random, + SuggestedFeeRecipient: &suggestedFeeRecipient, + } + newPayloadAttributes, err := payloadAttributesCustomizer.GetPayloadAttributes(&t.CLMock.LatestPayloadAttributes) + if err != nil { + t.Fatalf("FAIL (%s): Unable to customize payload attributes: %v", t.TestName, err) + } + s := t.TestEngine.TestEngineForkchoiceUpdated(&api.ForkchoiceStateV1{ + HeadBlockHash: t.CLMock.LatestPayloadBuilt.BlockHash, + SafeBlockHash: t.CLMock.LatestPayloadBuilt.BlockHash, + FinalizedBlockHash: t.CLMock.LatestPayloadBuilt.BlockHash, + }, newPayloadAttributes, t.CLMock.LatestPayloadBuilt.Timestamp) + s.ExpectPayloadStatus(test.Syncing) + + // Send the previous payload to be able to continue + p := t.TestEngine.TestEngineNewPayload(&previousPayload) + p.ExpectStatus(test.Valid) + p.ExpectLatestValidHash(&previousPayload.BlockHash) + + // Send the new payload again + + p = t.TestEngine.TestEngineNewPayload(&t.CLMock.LatestPayloadBuilt) + p.ExpectStatus(test.Valid) + p.ExpectLatestValidHash(&t.CLMock.LatestPayloadBuilt.BlockHash) + + s = t.TestEngine.TestEngineForkchoiceUpdated(&api.ForkchoiceStateV1{ + HeadBlockHash: t.CLMock.LatestPayloadBuilt.BlockHash, + SafeBlockHash: t.CLMock.LatestPayloadBuilt.BlockHash, + FinalizedBlockHash: t.CLMock.LatestPayloadBuilt.BlockHash, + }, nil, t.CLMock.LatestPayloadBuilt.Timestamp) + s.ExpectPayloadStatus(test.Valid) + + }, + }) + + // Add the secondary client again to the CL Mocker + t.CLMock.AddEngineClient(t.Engine) + + t.CLMock.RemoveEngineClient(secondaryClient) +} + +type NewPayloadWithMissingFcUTest struct { + test.BaseSpec +} + +func (s NewPayloadWithMissingFcUTest) WithMainFork(fork config.Fork) test.Spec { + specCopy := s + specCopy.MainFork = fork + return specCopy +} + +func (s NewPayloadWithMissingFcUTest) GetName() string { + name := "NewPayload with Missing ForkchoiceUpdated" + return name +} + +// Send a valid `newPayload` in correct order but skip `forkchoiceUpdated` until the last payload +func (spec NewPayloadWithMissingFcUTest) Execute(t *test.Env) { + // Wait until TTD is reached by this client + t.CLMock.WaitForTTD() + + // Get last genesis block hash + genesisHash := t.TestEngine.TestHeaderByNumber(Head).Header.Hash() + + // Produce blocks on the main client, these payloads will be replayed on the secondary client. + t.CLMock.ProduceBlocks(5, clmock.BlockProcessCallbacks{ + OnPayloadProducerSelected: func() { + var recipient common.Address + rand.Read(recipient[:]) + // Send at least one transaction per payload + _, err := t.SendNextTransaction( + t.TestContext, + t.CLMock.NextBlockProducer, + &helper.BaseTransactionCreator{ + Recipient: &recipient, + Amount: nil, + Payload: nil, + TxType: t.TestTransactionType, + GasLimit: 75000, + ForkConfig: t.ForkConfig, + }, + ) + if err != nil { + t.Fatalf("FAIL (%s): Error trying to send transaction: %v", t.TestName, err) + } + }, + OnGetPayload: func() { + // Check that the transaction was included + if len(t.CLMock.LatestPayloadBuilt.Transactions) == 0 { + t.Fatalf("FAIL (%s): Client failed to include the expected transaction in payload built", t.TestName) + } + }, + }) + + var secondaryEngineTest *test.TestEngineClient + { + secondaryEngine, err := hive_rpc.HiveRPCEngineStarter{}.StartClient(t.T, t.TestContext, t.Genesis, t.ClientParams, t.ClientFiles) + + if err != nil { + t.Fatalf("FAIL (%s): Unable to spawn a secondary client: %v", t.TestName, err) + } + secondaryEngineTest = test.NewTestEngineClient(t, secondaryEngine) + t.CLMock.AddEngineClient(secondaryEngine) + } + + // Send each payload in the correct order but skip the ForkchoiceUpdated for each + for i := t.CLMock.FirstPoSBlockNumber.Uint64(); i <= t.CLMock.LatestHeadNumber.Uint64(); i++ { + payload := t.CLMock.ExecutedPayloadHistory[i] + p := secondaryEngineTest.TestEngineNewPayload(payload) + p.ExpectStatus(test.Valid) + p.ExpectLatestValidHash(&payload.BlockHash) + } + + // Verify that at this point, the client's head still points to the last non-PoS block + r := secondaryEngineTest.TestHeaderByNumber(Head) + r.ExpectHash(genesisHash) + + // Verify that the head correctly changes after the last ForkchoiceUpdated + fcU := api.ForkchoiceStateV1{ + HeadBlockHash: t.CLMock.ExecutedPayloadHistory[t.CLMock.LatestHeadNumber.Uint64()].BlockHash, + SafeBlockHash: t.CLMock.ExecutedPayloadHistory[t.CLMock.LatestHeadNumber.Uint64()-1].BlockHash, + FinalizedBlockHash: t.CLMock.ExecutedPayloadHistory[t.CLMock.LatestHeadNumber.Uint64()-2].BlockHash, + } + p := secondaryEngineTest.TestEngineForkchoiceUpdated(&fcU, nil, t.CLMock.LatestHeader.Time) + p.ExpectPayloadStatus(test.Valid) + p.ExpectLatestValidHash(&fcU.HeadBlockHash) + + // Now the head should've changed to the latest PoS block + s := secondaryEngineTest.TestHeaderByNumber(Head) + s.ExpectHash(fcU.HeadBlockHash) +} diff --git a/simulators/ethereum/engine/suites/engine/payload_id.go b/simulators/ethereum/engine/suites/engine/payload_id.go new file mode 100644 index 0000000000..259c9a29a4 --- /dev/null +++ b/simulators/ethereum/engine/suites/engine/payload_id.go @@ -0,0 +1,95 @@ +package suite_engine + +import ( + "fmt" + + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/hive/simulators/ethereum/engine/clmock" + "github.com/ethereum/hive/simulators/ethereum/engine/config" + "github.com/ethereum/hive/simulators/ethereum/engine/test" +) + +type PayloadAttributesFieldChange string + +const ( + PayloadAttributesIncreaseTimestamp PayloadAttributesFieldChange = "Increase Timestamp" + PayloadAttributesRandom PayloadAttributesFieldChange = "Modify Random" + PayloadAttributesSuggestedFeeRecipient PayloadAttributesFieldChange = "Modify SuggestedFeeRecipient" + PayloadAttributesAddWithdrawal PayloadAttributesFieldChange = "Add Withdrawal" + PayloadAttributesModifyWithdrawalAmount PayloadAttributesFieldChange = "Modify Withdrawal Amount" + PayloadAttributesModifyWithdrawalIndex PayloadAttributesFieldChange = "Modify Withdrawal Index" + PayloadAttributesModifyWithdrawalValidator PayloadAttributesFieldChange = "Modify Withdrawal Validator" + PayloadAttributesModifyWithdrawalAddress PayloadAttributesFieldChange = "Modify Withdrawal Address" + PayloadAttributesRemoveWithdrawal PayloadAttributesFieldChange = "Remove Withdrawal" + PayloadAttributesParentBeaconRoot PayloadAttributesFieldChange = "Modify Parent Beacon Root" +) + +type UniquePayloadIDTest struct { + test.BaseSpec + FieldModification PayloadAttributesFieldChange +} + +func (s UniquePayloadIDTest) WithMainFork(fork config.Fork) test.Spec { + specCopy := s + specCopy.MainFork = fork + return specCopy +} + +func (tc UniquePayloadIDTest) GetName() string { + return fmt.Sprintf("Unique Payload ID - %s", tc.FieldModification) +} + +// Check that the payload id returned on a forkchoiceUpdated call is different +// when the attributes change +func (tc UniquePayloadIDTest) Execute(t *test.Env) { + // Wait until TTD is reached by this client + t.CLMock.WaitForTTD() + + t.CLMock.ProduceSingleBlock(clmock.BlockProcessCallbacks{ + OnPayloadAttributesGenerated: func() { + payloadAttributes := t.CLMock.LatestPayloadAttributes + switch tc.FieldModification { + case PayloadAttributesIncreaseTimestamp: + payloadAttributes.Timestamp += 1 + case PayloadAttributesRandom: + payloadAttributes.Random[0] = payloadAttributes.Random[0] + 1 + case PayloadAttributesSuggestedFeeRecipient: + payloadAttributes.SuggestedFeeRecipient[0] = payloadAttributes.SuggestedFeeRecipient[0] + 1 + case PayloadAttributesAddWithdrawal: + newWithdrawal := &types.Withdrawal{} + payloadAttributes.Withdrawals = append(payloadAttributes.Withdrawals, newWithdrawal) + case PayloadAttributesRemoveWithdrawal: + payloadAttributes.Withdrawals = payloadAttributes.Withdrawals[1:] + case PayloadAttributesModifyWithdrawalAmount, + PayloadAttributesModifyWithdrawalIndex, + PayloadAttributesModifyWithdrawalValidator, + PayloadAttributesModifyWithdrawalAddress: + if len(payloadAttributes.Withdrawals) == 0 { + t.Fatalf("Cannot modify withdrawal when there are no withdrawals") + } + modifiedWithdrawal := *payloadAttributes.Withdrawals[0] + switch tc.FieldModification { + case PayloadAttributesModifyWithdrawalAmount: + modifiedWithdrawal.Amount += 1 + case PayloadAttributesModifyWithdrawalIndex: + modifiedWithdrawal.Index += 1 + case PayloadAttributesModifyWithdrawalValidator: + modifiedWithdrawal.Validator += 1 + case PayloadAttributesModifyWithdrawalAddress: + modifiedWithdrawal.Address[0] = modifiedWithdrawal.Address[0] + 1 + } + payloadAttributes.Withdrawals = append(types.Withdrawals{&modifiedWithdrawal}, payloadAttributes.Withdrawals[1:]...) + case PayloadAttributesParentBeaconRoot: + payloadAttributes.BeaconRoot[0] = payloadAttributes.BeaconRoot[0] + 1 + default: + t.Fatalf("Unknown field change: %s", tc.FieldModification) + } + + // Request the payload with the modified attributes and add the payload ID to the list of known IDs + r := t.TestEngine.TestEngineForkchoiceUpdated(&t.CLMock. + LatestForkchoice, &payloadAttributes, t.CLMock.LatestHeader.Time) + r.ExpectNoError() + t.CLMock.AddPayloadID(r.Response.PayloadID) + }, + }) +} diff --git a/simulators/ethereum/engine/suites/engine/prev_randao.go b/simulators/ethereum/engine/suites/engine/prev_randao.go new file mode 100644 index 0000000000..0faa404501 --- /dev/null +++ b/simulators/ethereum/engine/suites/engine/prev_randao.go @@ -0,0 +1,90 @@ +package suite_engine + +import ( + "context" + "fmt" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/hive/simulators/ethereum/engine/clmock" + "github.com/ethereum/hive/simulators/ethereum/engine/config" + "github.com/ethereum/hive/simulators/ethereum/engine/globals" + "github.com/ethereum/hive/simulators/ethereum/engine/helper" + "github.com/ethereum/hive/simulators/ethereum/engine/test" + typ "github.com/ethereum/hive/simulators/ethereum/engine/types" +) + +type PrevRandaoTransactionTest struct { + test.BaseSpec + BlockCount int +} + +func (s PrevRandaoTransactionTest) WithMainFork(fork config.Fork) test.Spec { + specCopy := s + specCopy.MainFork = fork + return specCopy +} + +func (t PrevRandaoTransactionTest) GetName() string { + return fmt.Sprintf("PrevRandao Opcode Transactions Test (%s)", t.TestTransactionType) +} + +func (tc PrevRandaoTransactionTest) Execute(t *test.Env) { + t.CLMock.WaitForTTD() + + // Create a single block to not having to build on top of genesis + t.CLMock.ProduceSingleBlock(clmock.BlockProcessCallbacks{}) + + startBlockNumber := t.CLMock.LatestHeader.Number.Uint64() + 1 + + // Send transactions in PoS, the value of the storage in these blocks must match the prevRandao value + var ( + blockCount = 10 + currentTxIndex = 0 + txs = make([]typ.Transaction, 0) + ) + if tc.BlockCount > 0 { + blockCount = tc.BlockCount + } + t.CLMock.ProduceBlocks(blockCount, clmock.BlockProcessCallbacks{ + OnPayloadProducerSelected: func() { + tx, err := t.SendNextTransaction( + t.TestContext, + t.Engine, + &helper.BaseTransactionCreator{ + Recipient: &globals.PrevRandaoContractAddr, + Amount: big0, + Payload: nil, + TxType: t.TestTransactionType, + GasLimit: 75000, + ForkConfig: t.ForkConfig, + }, + ) + if err != nil { + t.Fatalf("FAIL (%s): Error trying to send transaction: %v", t.TestName, err) + } + txs = append(txs, tx) + currentTxIndex++ + }, + OnForkchoiceBroadcast: func() { + // Check the transaction tracing, which is client specific + expectedPrevRandao := t.CLMock.PrevRandaoHistory[t.CLMock.LatestHeader.Number.Uint64()+1] + ctx, cancel := context.WithTimeout(t.TestContext, globals.RPCTimeout) + defer cancel() + if err := helper.DebugPrevRandaoTransaction(ctx, t.Client.RPC(), t.Client.Type, txs[currentTxIndex-1], + &expectedPrevRandao); err != nil { + t.Fatalf("FAIL (%s): Error during transaction tracing: %v", t.TestName, err) + } + }, + }) + + for i := uint64(startBlockNumber); i <= t.CLMock.LatestExecutedPayload.Number; i++ { + checkPrevRandaoValue(t, t.CLMock.PrevRandaoHistory[i], i) + } +} + +func checkPrevRandaoValue(t *test.Env, expectedPrevRandao common.Hash, blockNumber uint64) { + storageKey := common.Hash{} + storageKey[31] = byte(blockNumber) + r := t.TestEngine.TestStorageAt(globals.PrevRandaoContractAddr, storageKey, nil) + r.ExpectStorageEqual(expectedPrevRandao) +} diff --git a/simulators/ethereum/engine/suites/engine/reorg.go b/simulators/ethereum/engine/suites/engine/reorg.go new file mode 100644 index 0000000000..57813e25be --- /dev/null +++ b/simulators/ethereum/engine/suites/engine/reorg.go @@ -0,0 +1,740 @@ +package suite_engine + +import ( + "context" + "encoding/json" + "fmt" + "math/big" + "math/rand" + "time" + + api "github.com/ethereum/go-ethereum/beacon/engine" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/hive/simulators/ethereum/engine/clmock" + "github.com/ethereum/hive/simulators/ethereum/engine/config" + "github.com/ethereum/hive/simulators/ethereum/engine/globals" + "github.com/ethereum/hive/simulators/ethereum/engine/helper" + "github.com/ethereum/hive/simulators/ethereum/engine/test" + typ "github.com/ethereum/hive/simulators/ethereum/engine/types" +) + +type SidechainReOrgTest struct { + test.BaseSpec +} + +func (s SidechainReOrgTest) WithMainFork(fork config.Fork) test.Spec { + specCopy := s + specCopy.MainFork = fork + return specCopy +} + +func (s SidechainReOrgTest) GetName() string { + name := "Sidechain Reorg" + return name +} + +// Reorg to a Sidechain using ForkchoiceUpdated +func (spec SidechainReOrgTest) Execute(t *test.Env) { + // Wait until this client catches up with latest PoS + t.CLMock.WaitForTTD() + + // Produce blocks before starting the test + t.CLMock.ProduceBlocks(5, clmock.BlockProcessCallbacks{}) + + // Produce two payloads, send fcU with first payload, check transaction outcome, then reorg, check transaction outcome again + + // This single transaction will change its outcome based on the payload + tx, err := t.SendNextTransaction( + t.TestContext, + t.Engine, + &helper.BaseTransactionCreator{ + Recipient: &globals.PrevRandaoContractAddr, + Amount: big0, + Payload: nil, + TxType: t.TestTransactionType, + GasLimit: 75000, + ForkConfig: t.ForkConfig, + }, + ) + if err != nil { + t.Fatalf("FAIL (%s): Error trying to send transaction: %v", t.TestName, err) + } + t.Logf("INFO (%s): sent tx %v", t.TestName, tx.Hash()) + + t.CLMock.ProduceSingleBlock(clmock.BlockProcessCallbacks{ + OnNewPayloadBroadcast: func() { + // At this point the CLMocker has a payload that will result in a specific outcome, + // we can produce an alternative payload, send it, fcU to it, and verify the changes + alternativePrevRandao := common.Hash{} + rand.Read(alternativePrevRandao[:]) + timestamp := t.CLMock.LatestPayloadBuilt.Timestamp + 1 + payloadAttributes, err := (&helper.BasePayloadAttributesCustomizer{ + Timestamp: ×tamp, + Random: &alternativePrevRandao, + }).GetPayloadAttributes(&t.CLMock.LatestPayloadAttributes) + if err != nil { + t.Fatalf("FAIL (%s): Unable to customize payload attributes: %v", t.TestName, err) + } + + r := t.TestEngine.TestEngineForkchoiceUpdated( + &t.CLMock.LatestForkchoice, + payloadAttributes, + t.CLMock.LatestPayloadBuilt.Timestamp, + ) + r.ExpectNoError() + + time.Sleep(t.CLMock.PayloadProductionClientDelay) + + g := t.TestEngine.TestEngineGetPayload(r.Response.PayloadID, payloadAttributes) + g.ExpectNoError() + alternativePayload := g.Payload + if len(alternativePayload.Transactions) == 0 { + t.Fatalf("FAIL (%s): alternative payload does not contain the prevRandao opcode tx", t.TestName) + } + + s := t.TestEngine.TestEngineNewPayload(&alternativePayload) + s.ExpectStatus(test.Valid) + s.ExpectLatestValidHash(&alternativePayload.BlockHash) + + // We sent the alternative payload, fcU to it + p := t.TestEngine.TestEngineForkchoiceUpdated(&api.ForkchoiceStateV1{ + HeadBlockHash: alternativePayload.BlockHash, + SafeBlockHash: t.CLMock.LatestForkchoice.SafeBlockHash, + FinalizedBlockHash: t.CLMock.LatestForkchoice.FinalizedBlockHash, + }, nil, alternativePayload.Timestamp) + p.ExpectPayloadStatus(test.Valid) + + // PrevRandao should be the alternative prevRandao we sent + checkPrevRandaoValue(t, alternativePrevRandao, alternativePayload.Number) + }, + }) + // The reorg actually happens after the CLMocker continues, + // verify here that the reorg was successful + latestBlockNum := t.CLMock.LatestHeadNumber.Uint64() + checkPrevRandaoValue(t, t.CLMock.PrevRandaoHistory[latestBlockNum], latestBlockNum) + +} + +// Test performing a re-org that involves removing or modifying a transaction +type TransactionReOrgTest struct { + test.BaseSpec + ReorgOut bool + ReorgDifferentBlock bool + NewPayloadOnRevert bool +} + +func (s TransactionReOrgTest) WithMainFork(fork config.Fork) test.Spec { + specCopy := s + specCopy.MainFork = fork + return specCopy +} + +func (s TransactionReOrgTest) GetName() string { + name := "Transaction Re-Org" + if s.ReorgOut { + name += ", Re-Org Out" + } + if s.ReorgDifferentBlock { + name += ", Re-Org to Different Block" + } + if s.NewPayloadOnRevert { + name += ", New Payload on Revert Back" + } + return name +} + +// Test transaction status after a forkchoiceUpdated re-orgs to an alternative hash where a transaction is not present +func (spec TransactionReOrgTest) Execute(t *test.Env) { + // Wait until this client catches up with latest PoS + t.CLMock.WaitForTTD() + + // Produce blocks before starting the test (So we don't try to reorg back to the genesis block) + t.CLMock.ProduceBlocks(5, clmock.BlockProcessCallbacks{}) + + // Create transactions that modify the state in order to check after the reorg. + var ( + txCount = 5 + sstoreContractAddr = common.HexToAddress("0000000000000000000000000000000000000317") + ) + + for i := 0; i < txCount; i++ { + var ( + altPayload *typ.ExecutableData + tx typ.Transaction + ) + // Generate two payloads, one with the transaction and the other one without it + t.CLMock.ProduceSingleBlock(clmock.BlockProcessCallbacks{ + OnPayloadAttributesGenerated: func() { + // At this point we have not broadcast the transaction. + if spec.ReorgOut { + // Any payload we get should not contain any + payloadAttributes := t.CLMock.LatestPayloadAttributes + rand.Read(payloadAttributes.Random[:]) + r := t.TestEngine.TestEngineForkchoiceUpdated(&t.CLMock.LatestForkchoice, &payloadAttributes, t.CLMock.LatestHeader.Time) + r.ExpectNoError() + if r.Response.PayloadID == nil { + t.Fatalf("FAIL (%s): No payload ID returned by TestEngineForkchoiceUpdated", t.TestName) + } + g := t.TestEngine.TestEngineGetPayload(r.Response.PayloadID, &payloadAttributes) + g.ExpectNoError() + altPayload = &g.Payload + + if len(altPayload.Transactions) != 0 { + t.Fatalf("FAIL (%s): Empty payload contains transactions: %v", t.TestName, altPayload) + } + } + + // At this point we can broadcast the transaction and it will be included in the next payload + // Data is the key where a `1` will be stored + data := common.LeftPadBytes([]byte{byte(i)}, 32) + t.Logf("transactionReorg, i=%v, data=%v\n", i, data) + var err error + tx, err = t.SendNextTransaction( + t.TestContext, + t.Engine, + &helper.BaseTransactionCreator{ + Recipient: &sstoreContractAddr, + Amount: big0, + Payload: data, + TxType: t.TestTransactionType, + GasLimit: 75000, + ForkConfig: t.ForkConfig, + }, + ) + if err != nil { + t.Fatalf("FAIL (%s): Error trying to send transaction: %v", t.TestName, err) + } + + // Get the receipt + ctx, cancel := context.WithTimeout(t.TestContext, globals.RPCTimeout) + defer cancel() + receipt, _ := t.Eth.TransactionReceipt(ctx, tx.Hash()) + if receipt != nil { + t.Fatalf("FAIL (%s): Receipt obtained before tx included in block: %v", t.TestName, receipt) + } + }, + OnGetPayload: func() { + // Check that indeed the payload contains the transaction + if !helper.TransactionInPayload(&t.CLMock.LatestPayloadBuilt, tx) { + t.Fatalf("FAIL (%s): Payload built does not contain the transaction: %v", t.TestName, t.CLMock.LatestPayloadBuilt) + } + if spec.ReorgDifferentBlock { + // Create side payload with different hash + var err error + customizer := &helper.CustomPayloadData{ + ExtraData: &([]byte{0x01}), + } + altPayload, err = customizer.CustomizePayload(&t.CLMock.LatestPayloadBuilt) + if err != nil { + t.Fatalf("Error creating reorg payload %v", err) + } + + if altPayload.ParentHash != t.CLMock.LatestPayloadBuilt.ParentHash { + t.Fatalf("FAIL (%s): Incorrect parent hash for payloads: %v != %v", t.TestName, altPayload.ParentHash, t.CLMock.LatestPayloadBuilt.ParentHash) + } + if altPayload.BlockHash == t.CLMock.LatestPayloadBuilt.BlockHash { + t.Fatalf("FAIL (%s): Incorrect hash for payloads: %v == %v", t.TestName, altPayload.BlockHash, t.CLMock.LatestPayloadBuilt.BlockHash) + } + } + }, + OnNewPayloadBroadcast: func() { + // Get the receipt + ctx, cancel := context.WithTimeout(t.TestContext, globals.RPCTimeout) + defer cancel() + receipt, _ := t.Eth.TransactionReceipt(ctx, tx.Hash()) + if receipt != nil { + t.Fatalf("FAIL (%s): Receipt obtained before tx included in block (NewPayload): %v", t.TestName, receipt) + } + }, + OnForkchoiceBroadcast: func() { + // Transaction is now in the head of the canonical chain, re-org and verify it's removed + // Get the receipt + txt := t.TestEngine.TestTransactionReceipt(tx.Hash()) + txt.ExpectBlockHash(t.CLMock.LatestForkchoice.HeadBlockHash) + + if altPayload.ParentHash != t.CLMock.LatestPayloadBuilt.ParentHash { + t.Fatalf("FAIL (%s): Incorrect parent hash for payloads: %v != %v", t.TestName, altPayload.ParentHash, t.CLMock.LatestPayloadBuilt.ParentHash) + } + if altPayload.BlockHash == t.CLMock.LatestPayloadBuilt.BlockHash { + t.Fatalf("FAIL (%s): Incorrect hash for payloads: %v == %v", t.TestName, altPayload.BlockHash, t.CLMock.LatestPayloadBuilt.BlockHash) + } + + if altPayload == nil { + t.Fatalf("FAIL (%s): No payload to re-org to", t.TestName) + } + r := t.TestEngine.TestEngineNewPayload(altPayload) + r.ExpectStatus(test.Valid) + r.ExpectLatestValidHash(&altPayload.BlockHash) + + s := t.TestEngine.TestEngineForkchoiceUpdated(&api.ForkchoiceStateV1{ + HeadBlockHash: altPayload.BlockHash, + SafeBlockHash: t.CLMock.LatestForkchoice.SafeBlockHash, + FinalizedBlockHash: t.CLMock.LatestForkchoice.FinalizedBlockHash, + }, nil, altPayload.Timestamp) + s.ExpectPayloadStatus(test.Valid) + + p := t.TestEngine.TestHeaderByNumber(Head) + p.ExpectHash(altPayload.BlockHash) + + txt = t.TestEngine.TestTransactionReceipt(tx.Hash()) + if spec.ReorgOut { + if txt.Receipt != nil { + receiptJson, _ := json.MarshalIndent(txt.Receipt, "", " ") + t.Fatalf("FAIL (%s): Receipt was obtained when the tx had been re-org'd out: %s", t.TestName, receiptJson) + } + } else if spec.ReorgDifferentBlock { + txt.ExpectBlockHash(altPayload.BlockHash) + } + + // Re-org back + if spec.NewPayloadOnRevert { + r = t.TestEngine.TestEngineNewPayload(&t.CLMock.LatestPayloadBuilt) + r.ExpectStatus(test.Valid) + r.ExpectLatestValidHash(&t.CLMock.LatestPayloadBuilt.BlockHash) + } + t.CLMock.BroadcastForkchoiceUpdated(&t.CLMock.LatestForkchoice, nil, 1) + + // Not it should be back with main payload + txt = t.TestEngine.TestTransactionReceipt(tx.Hash()) + txt.ExpectBlockHash(t.CLMock.LatestForkchoice.HeadBlockHash) + }, + }) + + } + +} + +// Test that performing a re-org back into a previous block of the canonical chain does not produce errors and the chain +// is still capable of progressing. +type ReOrgBackToCanonicalTest struct { + test.BaseSpec + // Depth of the re-org to back in the canonical chain + ReOrgDepth uint64 + // Number of transactions to send on each payload + TransactionPerPayload uint64 + // Whether to execute a sidechain payload on the re-org + ExecuteSidePayloadOnReOrg bool +} + +func (s ReOrgBackToCanonicalTest) WithMainFork(fork config.Fork) test.Spec { + specCopy := s + specCopy.MainFork = fork + return specCopy +} + +func (s ReOrgBackToCanonicalTest) GetName() string { + name := fmt.Sprintf("Re-Org Back into Canonical Chain (Depth: %d)", s.ReOrgDepth) + + if s.ExecuteSidePayloadOnReOrg { + name += ", Execute Side Payload on Re-Org" + } + return name +} + +func (s ReOrgBackToCanonicalTest) GetDepth() uint64 { + if s.ReOrgDepth == 0 { + return 3 + } + return s.ReOrgDepth +} + +// Test that performing a re-org back into a previous block of the canonical chain does not produce errors and the chain +// is still capable of progressing. +func (spec ReOrgBackToCanonicalTest) Execute(t *test.Env) { + // Wait until this client catches up with latest PoS + t.CLMock.WaitForTTD() + + // Check the CLMock configured safe and finalized + if t.CLMock.SlotsToSafe.Cmp(new(big.Int).SetUint64(spec.ReOrgDepth)) <= 0 { + t.Fatalf("FAIL (%s): [TEST ISSUE] CLMock configured slots to safe less than re-org depth: %v <= %v", t.TestName, t.CLMock.SlotsToSafe, spec.ReOrgDepth) + } + if t.CLMock.SlotsToFinalized.Cmp(new(big.Int).SetUint64(spec.ReOrgDepth)) <= 0 { + t.Fatalf("FAIL (%s): [TEST ISSUE] CLMock configured slots to finalized less than re-org depth: %v <= %v", t.TestName, t.CLMock.SlotsToFinalized, spec.ReOrgDepth) + } + + // Produce blocks before starting the test (So we don't try to reorg back to the genesis block) + t.CLMock.ProduceBlocks(5, clmock.BlockProcessCallbacks{}) + + // We are going to reorg back to a previous hash several times + previousHash := t.CLMock.LatestForkchoice.HeadBlockHash + previousTimestamp := t.CLMock.LatestPayloadBuilt.Timestamp + + if spec.ExecuteSidePayloadOnReOrg { + var ( + sidePayload *typ.ExecutableData + sidePayloadParentForkchoice api.ForkchoiceStateV1 + sidePayloadParentTimestamp uint64 + ) + t.CLMock.ProduceSingleBlock(clmock.BlockProcessCallbacks{ + OnPayloadAttributesGenerated: func() { + payloadAttributes := t.CLMock.LatestPayloadAttributes + rand.Read(payloadAttributes.Random[:]) + r := t.TestEngine.TestEngineForkchoiceUpdated(&t.CLMock.LatestForkchoice, &payloadAttributes, t.CLMock.LatestHeader.Time) + r.ExpectNoError() + if r.Response.PayloadID == nil { + t.Fatalf("FAIL (%s): No payload ID returned by TestEngineForkchoiceUpdated", t.TestName) + } + g := t.TestEngine.TestEngineGetPayload(r.Response.PayloadID, &payloadAttributes) + g.ExpectNoError() + sidePayload = &g.Payload + sidePayloadParentForkchoice = t.CLMock.LatestForkchoice + sidePayloadParentTimestamp = t.CLMock.LatestHeader.Time + }, + }) + // Continue producing blocks until we reach the depth of the re-org + t.CLMock.ProduceBlocks(int(spec.GetDepth()-1), clmock.BlockProcessCallbacks{ + OnPayloadProducerSelected: func() { + // Send a transaction on each payload of the canonical chain + var err error + _, err = t.SendNextTransactions( + t.TestContext, + t.Engine, + &helper.BaseTransactionCreator{ + Recipient: &ZeroAddr, + Amount: big1, + Payload: nil, + TxType: t.TestTransactionType, + GasLimit: 75000, + ForkConfig: t.ForkConfig, + }, + spec.TransactionPerPayload, + ) + if err != nil { + t.Fatalf("FAIL (%s): Error trying to send transactions: %v", t.TestName, err) + } + }, + }) + // On the last block, before executing the next payload of the canonical chain, + // re-org back to the parent of the side payload and execute the side payload first + t.CLMock.ProduceSingleBlock(clmock.BlockProcessCallbacks{ + OnGetPayload: func() { + // We are about to execute the new payload of the canonical chain, re-org back to + // the side payload + f := t.TestEngine.TestEngineForkchoiceUpdated(&sidePayloadParentForkchoice, nil, sidePayloadParentTimestamp) + f.ExpectPayloadStatus(test.Valid) + f.ExpectLatestValidHash(&sidePayloadParentForkchoice.HeadBlockHash) + // Execute the side payload + n := t.TestEngine.TestEngineNewPayload(sidePayload) + n.ExpectStatus(test.Valid) + n.ExpectLatestValidHash(&sidePayload.BlockHash) + // At this point the next canonical payload will be executed by the CL mock, so we can + // continue producing blocks + }, + }) + } else { + t.CLMock.ProduceBlocks(int(spec.GetDepth()), clmock.BlockProcessCallbacks{ + OnForkchoiceBroadcast: func() { + // Send a fcU with the HeadBlockHash pointing back to the previous block + forkchoiceUpdatedBack := api.ForkchoiceStateV1{ + HeadBlockHash: previousHash, + SafeBlockHash: previousHash, + FinalizedBlockHash: previousHash, + } + + // It is only expected that the client does not produce an error and the CL Mocker is able to progress after the re-org + r := t.TestEngine.TestEngineForkchoiceUpdated(&forkchoiceUpdatedBack, nil, previousTimestamp) + r.ExpectNoError() + }, + }) + } + + // Verify that the client is pointing to the latest payload sent + r := t.TestEngine.TestHeaderByNumber(Head) + r.ExpectHash(t.CLMock.LatestPayloadBuilt.BlockHash) + +} + +type ReOrgBackFromSyncingTest struct { + test.BaseSpec +} + +func (s ReOrgBackFromSyncingTest) WithMainFork(fork config.Fork) test.Spec { + specCopy := s + specCopy.MainFork = fork + return specCopy +} + +func (s ReOrgBackFromSyncingTest) GetName() string { + name := "Re-Org Back to Canonical Chain From Syncing Chain" + return name +} + +// Test that performs a re-org back to the canonical chain after re-org to syncing/unavailable chain. +func (spec ReOrgBackFromSyncingTest) Execute(t *test.Env) { + // Wait until this client catches up with latest PoS + t.CLMock.WaitForTTD() + + // Produce an alternative chain + sidechainPayloads := make([]*typ.ExecutableData, 0) + t.CLMock.ProduceBlocks(10, clmock.BlockProcessCallbacks{ + OnPayloadProducerSelected: func() { + // Send a transaction on each payload of the canonical chain + var err error + _, err = t.SendNextTransaction( + t.TestContext, + t.Engine, + &helper.BaseTransactionCreator{ + Recipient: &ZeroAddr, + Amount: big1, + Payload: nil, + TxType: t.TestTransactionType, + GasLimit: 75000, + ForkConfig: t.ForkConfig, + }, + ) + if err != nil { + t.Fatalf("FAIL (%s): Error trying to send transactions: %v", t.TestName, err) + } + }, + OnGetPayload: func() { + // Check that at least one transaction made it into the payload + if len(t.CLMock.LatestPayloadBuilt.Transactions) == 0 { + t.Fatalf("FAIL (%s): No transactions in payload: %v", t.TestName, t.CLMock.LatestPayloadBuilt) + } + // Generate an alternative payload by simply adding extraData to the block + altParentHash := t.CLMock.LatestPayloadBuilt.ParentHash + if len(sidechainPayloads) > 0 { + altParentHash = sidechainPayloads[len(sidechainPayloads)-1].BlockHash + } + customizer := &helper.CustomPayloadData{ + ParentHash: &altParentHash, + ExtraData: &([]byte{0x01}), + } + altPayload, err := customizer.CustomizePayload(&t.CLMock.LatestPayloadBuilt) + if err != nil { + t.Fatalf("FAIL (%s): Unable to customize payload: %v", t.TestName, err) + } + sidechainPayloads = append(sidechainPayloads, altPayload) + }, + }) + + t.CLMock.ProduceSingleBlock(clmock.BlockProcessCallbacks{ + OnGetPayload: func() { + // Re-org to the unavailable sidechain in the middle of block production + // to be able to re-org back to the canonical chain + r := t.TestEngine.TestEngineNewPayload(sidechainPayloads[len(sidechainPayloads)-1]) + r.ExpectStatusEither(test.Syncing, test.Accepted) + r.ExpectLatestValidHash(nil) + // We are going to send one of the alternative payloads and fcU to it + forkchoiceUpdatedBack := api.ForkchoiceStateV1{ + HeadBlockHash: sidechainPayloads[len(sidechainPayloads)-1].BlockHash, + SafeBlockHash: t.CLMock.LatestForkchoice.SafeBlockHash, + FinalizedBlockHash: t.CLMock.LatestForkchoice.FinalizedBlockHash, + } + + // It is only expected that the client does not produce an error and the CL Mocker is able to progress after the re-org + s := t.TestEngine.TestEngineForkchoiceUpdated(&forkchoiceUpdatedBack, nil, sidechainPayloads[len(sidechainPayloads)-1].Timestamp) + s.ExpectLatestValidHash(nil) + s.ExpectPayloadStatus(test.Syncing) + + // After this, the CLMocker will continue and try to re-org to canonical chain once again + // CLMocker will fail the test if this is not possible, so nothing left to do. + }, + }) +} + +type ReOrgPrevValidatedPayloadOnSideChainTest struct { + test.BaseSpec +} + +func (s ReOrgPrevValidatedPayloadOnSideChainTest) WithMainFork(fork config.Fork) test.Spec { + specCopy := s + specCopy.MainFork = fork + return specCopy +} + +func (s ReOrgPrevValidatedPayloadOnSideChainTest) GetName() string { + name := "Import and re-org to previously validated payload on a side chain" + return name +} + +// Test that performs a re-org to a previously validated payload on a side chain. +func (spec ReOrgPrevValidatedPayloadOnSideChainTest) Execute(t *test.Env) { + // Wait until this client catches up with latest PoS + t.CLMock.WaitForTTD() + + // Produce blocks before starting the test + t.CLMock.ProduceBlocks(5, clmock.BlockProcessCallbacks{}) + + var ( + sidechainPayloads = make([]*typ.ExecutableData, 0) + sidechainPayloadCount = 5 + ) + + // Produce a canonical chain while at the same time generate a side chain to which we will re-org. + t.CLMock.ProduceBlocks(sidechainPayloadCount, clmock.BlockProcessCallbacks{ + OnPayloadProducerSelected: func() { + // Send a transaction on each payload of the canonical chain + var err error + _, err = t.SendNextTransaction( + t.TestContext, + t.Engine, + &helper.BaseTransactionCreator{ + Recipient: &ZeroAddr, + Amount: big1, + Payload: nil, + TxType: t.TestTransactionType, + GasLimit: 75000, + ForkConfig: t.ForkConfig, + }, + ) + if err != nil { + t.Fatalf("FAIL (%s): Error trying to send transactions: %v", t.TestName, err) + } + }, + OnGetPayload: func() { + // Check that at least one transaction made it into the payload + if len(t.CLMock.LatestPayloadBuilt.Transactions) == 0 { + t.Fatalf("FAIL (%s): No transactions in payload: %v", t.TestName, t.CLMock.LatestPayloadBuilt) + } + // The side chain will consist simply of the same payloads with extra data appended + extraData := []byte("side") + customData := helper.CustomPayloadData{ + ExtraData: &extraData, + } + if len(sidechainPayloads) > 0 { + customData.ParentHash = &sidechainPayloads[len(sidechainPayloads)-1].BlockHash + } + altPayload, err := customData.CustomizePayload(&t.CLMock.LatestPayloadBuilt) + if err != nil { + t.Fatalf("FAIL (%s): Unable to customize payload: %v", t.TestName, err) + } + sidechainPayloads = append(sidechainPayloads, altPayload) + + r := t.TestEngine.TestEngineNewPayload(altPayload) + r.ExpectStatus(test.Valid) + r.ExpectLatestValidHash(&altPayload.BlockHash) + }, + }) + + // Attempt to re-org to one of the sidechain payloads, but not the leaf, + // and also build a new payload from this sidechain. + t.CLMock.ProduceSingleBlock(clmock.BlockProcessCallbacks{ + OnGetPayload: func() { + var ( + prevRandao = common.Hash{} + suggestedFeeRecipient = common.Address{0x12, 0x34} + ) + rand.Read(prevRandao[:]) + payloadAttributesCustomizer := &helper.BasePayloadAttributesCustomizer{ + Random: &prevRandao, + SuggestedFeeRecipient: &suggestedFeeRecipient, + } + + reOrgPayload := sidechainPayloads[len(sidechainPayloads)-2] + reOrgPayloadAttributes := sidechainPayloads[len(sidechainPayloads)-1].PayloadAttributes + + newPayloadAttributes, err := payloadAttributesCustomizer.GetPayloadAttributes(&reOrgPayloadAttributes) + if err != nil { + t.Fatalf("FAIL (%s): Unable to customize payload attributes: %v", t.TestName, err) + } + + r := t.TestEngine.TestEngineForkchoiceUpdated(&api.ForkchoiceStateV1{ + HeadBlockHash: reOrgPayload.BlockHash, + SafeBlockHash: t.CLMock.LatestForkchoice.SafeBlockHash, + FinalizedBlockHash: t.CLMock.LatestForkchoice.FinalizedBlockHash, + }, newPayloadAttributes, reOrgPayload.Timestamp) + r.ExpectPayloadStatus(test.Valid) + r.ExpectLatestValidHash(&reOrgPayload.BlockHash) + + p := t.TestEngine.TestEngineGetPayload(r.Response.PayloadID, newPayloadAttributes) + p.ExpectPayloadParentHash(reOrgPayload.BlockHash) + + s := t.TestEngine.TestEngineNewPayload(&p.Payload) + s.ExpectStatus(test.Valid) + s.ExpectLatestValidHash(&p.Payload.BlockHash) + + // After this, the CLMocker will continue and try to re-org to canonical chain once again + // CLMocker will fail the test if this is not possible, so nothing left to do. + }, + }) +} + +type SafeReOrgToSideChainTest struct { + test.BaseSpec +} + +func (s SafeReOrgToSideChainTest) WithMainFork(fork config.Fork) test.Spec { + specCopy := s + specCopy.MainFork = fork + return specCopy +} + +func (s SafeReOrgToSideChainTest) GetName() string { + name := "Safe Re-Org to Side Chain" + return name +} + +// Test that performs a re-org of the safe block to a side chain. +func (s SafeReOrgToSideChainTest) Execute(t *test.Env) { + // Wait until this client catches up with latest PoS + t.CLMock.WaitForTTD() + + // Produce an alternative chain + sidechainPayloads := make([]*typ.ExecutableData, 0) + + if s.SlotsToSafe.Uint64() != 1 { + t.Fatalf("FAIL (%s): [TEST ISSUE] CLMock configured slots to safe not equal to 1: %v", t.TestName, s.SlotsToSafe) + } + if s.SlotsToFinalized.Uint64() != 2 { + t.Fatalf("FAIL (%s): [TEST ISSUE] CLMock configured slots to finalized not equal to 2: %v", t.TestName, s.SlotsToFinalized) + } + + // Produce three payloads `P1`, `P2`, `P3`, along with the side chain payloads `P2'`, `P3'` + // First payload is finalized so no alternative payload + t.CLMock.ProduceSingleBlock(clmock.BlockProcessCallbacks{}) + t.CLMock.ProduceBlocks(2, clmock.BlockProcessCallbacks{ + OnGetPayload: func() { + // Generate an alternative payload by simply adding extraData to the block + altParentHash := t.CLMock.LatestPayloadBuilt.ParentHash + if len(sidechainPayloads) > 0 { + altParentHash = sidechainPayloads[len(sidechainPayloads)-1].BlockHash + } + customizer := &helper.CustomPayloadData{ + ParentHash: &altParentHash, + ExtraData: &([]byte{0x01}), + } + altPayload, err := customizer.CustomizePayload(&t.CLMock.LatestPayloadBuilt) + if err != nil { + t.Fatalf("FAIL (%s): Unable to customize payload: %v", t.TestName, err) + } + sidechainPayloads = append(sidechainPayloads, altPayload) + }, + }) + + // Verify current state of labels + head := t.TestEngine.TestHeaderByNumber(Head) + head.ExpectHash(t.CLMock.LatestPayloadBuilt.BlockHash) + + safe := t.TestEngine.TestHeaderByNumber(Safe) + safe.ExpectHash(t.CLMock.ExecutedPayloadHistory[2].BlockHash) + + finalized := t.TestEngine.TestHeaderByNumber(Finalized) + finalized.ExpectHash(t.CLMock.ExecutedPayloadHistory[1].BlockHash) + + // Re-org the safe/head blocks to point to the alternative side chain + t.CLMock.ProduceSingleBlock(clmock.BlockProcessCallbacks{ + OnGetPayload: func() { + for _, p := range sidechainPayloads { + r := t.TestEngine.TestEngineNewPayload(p) + r.ExpectStatusEither(test.Valid, test.Accepted) + } + r := t.TestEngine.TestEngineForkchoiceUpdated(&api.ForkchoiceStateV1{ + HeadBlockHash: sidechainPayloads[1].BlockHash, + SafeBlockHash: sidechainPayloads[0].BlockHash, + FinalizedBlockHash: t.CLMock.ExecutedPayloadHistory[1].BlockHash, + }, nil, sidechainPayloads[1].Timestamp) + r.ExpectPayloadStatus(test.Valid) + + head := t.TestEngine.TestHeaderByNumber(Head) + head.ExpectHash(sidechainPayloads[1].BlockHash) + + safe := t.TestEngine.TestHeaderByNumber(Safe) + safe.ExpectHash(sidechainPayloads[0].BlockHash) + + finalized := t.TestEngine.TestHeaderByNumber(Finalized) + finalized.ExpectHash(t.CLMock.ExecutedPayloadHistory[1].BlockHash) + + }, + }) +} diff --git a/simulators/ethereum/engine/suites/engine/rpc.go b/simulators/ethereum/engine/suites/engine/rpc.go new file mode 100644 index 0000000000..478cfb0c25 --- /dev/null +++ b/simulators/ethereum/engine/suites/engine/rpc.go @@ -0,0 +1,118 @@ +package suite_engine + +import ( + "fmt" + "math/big" + + "github.com/ethereum/hive/simulators/ethereum/engine/clmock" + "github.com/ethereum/hive/simulators/ethereum/engine/config" + "github.com/ethereum/hive/simulators/ethereum/engine/helper" + "github.com/ethereum/hive/simulators/ethereum/engine/test" + typ "github.com/ethereum/hive/simulators/ethereum/engine/types" +) + +type BlockStatusRPCCheckType string + +const ( + LatestOnNewPayload BlockStatusRPCCheckType = "Latest Block on NewPayload" + LatestOnHeadBlockHash BlockStatusRPCCheckType = "Latest Block on HeadBlockHash Update" + SafeOnSafeBlockHash BlockStatusRPCCheckType = "Safe Block on SafeBlockHash Update" + FinalizedOnFinalizedBlockHash BlockStatusRPCCheckType = "Finalized Block on FinalizedBlockHash Update" +) + +type BlockStatus struct { + test.BaseSpec + CheckType BlockStatusRPCCheckType + // TODO: Syncing bool +} + +func (s BlockStatus) WithMainFork(fork config.Fork) test.Spec { + specCopy := s + specCopy.MainFork = fork + return specCopy +} + +func (b BlockStatus) GetName() string { + return fmt.Sprintf("RPC: %s", b.CheckType) +} + +// Test to verify Block information available at the Eth RPC after NewPayload/ForkchoiceUpdated +func (b BlockStatus) Execute(t *test.Env) { + // Wait until this client catches up with latest PoS Block + t.CLMock.WaitForTTD() + + switch b.CheckType { + case SafeOnSafeBlockHash, FinalizedOnFinalizedBlockHash: + var number *big.Int + if b.CheckType == SafeOnSafeBlockHash { + number = Safe + } else { + number = Finalized + } + p := t.TestEngine.TestHeaderByNumber(number) + p.ExpectErrorCode(-39001) + } + + // Produce blocks before starting the test + t.CLMock.ProduceBlocks(5, clmock.BlockProcessCallbacks{}) + + var tx typ.Transaction + callbacks := clmock.BlockProcessCallbacks{ + OnPayloadProducerSelected: func() { + var err error + tx, err = t.SendNextTransaction( + t.TestContext, + t.Engine, &helper.BaseTransactionCreator{ + Recipient: &ZeroAddr, + Amount: big1, + Payload: nil, + TxType: t.TestTransactionType, + GasLimit: 75000, + ForkConfig: t.ForkConfig, + }, + ) + if err != nil { + t.Fatalf("FAIL (%s): Error trying to send transaction: %v", err) + } + }, + } + + switch b.CheckType { + case LatestOnNewPayload: + callbacks.OnGetPayload = func() { + r := t.TestEngine.TestHeaderByNumber(Head) + r.ExpectHash(t.CLMock.LatestForkchoice.HeadBlockHash) + + s := t.TestEngine.TestBlockNumber() + s.ExpectNumber(t.CLMock.LatestHeadNumber.Uint64()) + + p := t.TestEngine.TestHeaderByNumber(Head) + p.ExpectHash(t.CLMock.LatestForkchoice.HeadBlockHash) + + // Check that the receipt for the transaction we just sent is still not available + q := t.TestEngine.TestTransactionReceipt(tx.Hash()) + q.ExpectError() + } + case LatestOnHeadBlockHash: + callbacks.OnForkchoiceBroadcast = func() { + r := t.TestEngine.TestHeaderByNumber(Head) + r.ExpectHash(t.CLMock.LatestForkchoice.HeadBlockHash) + + s := t.TestEngine.TestTransactionReceipt(tx.Hash()) + s.ExpectTransactionHash(tx.Hash()) + } + case SafeOnSafeBlockHash: + callbacks.OnSafeBlockChange = func() { + r := t.TestEngine.TestHeaderByNumber(Safe) + r.ExpectHash(t.CLMock.LatestForkchoice.SafeBlockHash) + } + case FinalizedOnFinalizedBlockHash: + callbacks.OnFinalizedBlockChange = func() { + r := t.TestEngine.TestHeaderByNumber(Finalized) + r.ExpectHash(t.CLMock.LatestForkchoice.FinalizedBlockHash) + } + } + + // Perform the test + t.CLMock.ProduceSingleBlock(callbacks) +} diff --git a/simulators/ethereum/engine/suites/engine/suggested_fee_recipient.go b/simulators/ethereum/engine/suites/engine/suggested_fee_recipient.go new file mode 100644 index 0000000000..4ef344395f --- /dev/null +++ b/simulators/ethereum/engine/suites/engine/suggested_fee_recipient.go @@ -0,0 +1,97 @@ +package suite_engine + +import ( + "context" + "fmt" + "math/big" + "math/rand" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/hive/simulators/ethereum/engine/clmock" + "github.com/ethereum/hive/simulators/ethereum/engine/config" + "github.com/ethereum/hive/simulators/ethereum/engine/globals" + "github.com/ethereum/hive/simulators/ethereum/engine/helper" + "github.com/ethereum/hive/simulators/ethereum/engine/test" +) + +type SuggestedFeeRecipientTest struct { + test.BaseSpec + TransactionCount int +} + +func (s SuggestedFeeRecipientTest) WithMainFork(fork config.Fork) test.Spec { + specCopy := s + specCopy.MainFork = fork + return specCopy +} + +func (t SuggestedFeeRecipientTest) GetName() string { + return fmt.Sprintf("Suggested Fee Recipient Test (%s)", t.TestTransactionType) +} + +func (tc SuggestedFeeRecipientTest) Execute(t *test.Env) { + // Wait until this client catches up with latest PoS + t.CLMock.WaitForTTD() + + // Create a single block to not having to build on top of genesis + t.CLMock.ProduceSingleBlock(clmock.BlockProcessCallbacks{}) + + // Verify that, in a block with transactions, fees are accrued by the suggestedFeeRecipient + feeRecipient := common.Address{} + rand.Read(feeRecipient[:]) + txRecipient := common.Address{} + rand.Read(txRecipient[:]) + + // Send multiple transactions + for i := 0; i < tc.TransactionCount; i++ { + _, err := t.SendNextTransaction( + t.TestContext, + t.Engine, + &helper.BaseTransactionCreator{ + Recipient: &txRecipient, + Amount: big0, + Payload: nil, + TxType: t.TestTransactionType, + GasLimit: 75000, + ForkConfig: t.ForkConfig, + }, + ) + if err != nil { + t.Fatalf("FAIL (%s): Error trying to send transaction: %v", t.TestName, err) + } + } + // Produce the next block with the fee recipient set + t.CLMock.NextFeeRecipient = feeRecipient + t.CLMock.ProduceSingleBlock(clmock.BlockProcessCallbacks{}) + + // Calculate the fees and check that they match the balance of the fee recipient + r := t.TestEngine.TestBlockByNumber(Head) + r.ExpectTransactionCountEqual(tc.TransactionCount) + r.ExpectCoinbase(feeRecipient) + blockIncluded := r.Block + + feeRecipientFees := big.NewInt(0) + for _, tx := range blockIncluded.Transactions() { + effGasTip, err := tx.EffectiveGasTip(blockIncluded.BaseFee()) + if err != nil { + t.Fatalf("FAIL (%s): unable to obtain EffectiveGasTip: %v", t.TestName, err) + } + ctx, cancel := context.WithTimeout(t.TestContext, globals.RPCTimeout) + defer cancel() + receipt, err := t.Eth.TransactionReceipt(ctx, tx.Hash()) + if err != nil { + t.Fatalf("FAIL (%s): unable to obtain receipt: %v", t.TestName, err) + } + feeRecipientFees = feeRecipientFees.Add(feeRecipientFees, effGasTip.Mul(effGasTip, big.NewInt(int64(receipt.GasUsed)))) + } + + s := t.TestEngine.TestBalanceAt(feeRecipient, nil) + s.ExpectBalanceEqual(feeRecipientFees) + + // Produce another block without txns and get the balance again + t.CLMock.NextFeeRecipient = feeRecipient + t.CLMock.ProduceSingleBlock(clmock.BlockProcessCallbacks{}) + + s = t.TestEngine.TestBalanceAt(feeRecipient, nil) + s.ExpectBalanceEqual(feeRecipientFees) +} diff --git a/simulators/ethereum/engine/suites/engine/tests.go b/simulators/ethereum/engine/suites/engine/tests.go index 185d729152..1fe08c1fd0 100644 --- a/simulators/ethereum/engine/suites/engine/tests.go +++ b/simulators/ethereum/engine/suites/engine/tests.go @@ -1,24 +1,14 @@ package suite_engine import ( - "context" - "encoding/json" "math/big" - "math/rand" - "time" - api "github.com/ethereum/go-ethereum/beacon/engine" - "github.com/ethereum/hive/simulators/ethereum/engine/client" - "github.com/ethereum/hive/simulators/ethereum/engine/client/hive_rpc" - "github.com/ethereum/hive/simulators/ethereum/engine/client/node" - "github.com/ethereum/hive/simulators/ethereum/engine/clmock" + "github.com/ethereum/hive/simulators/ethereum/engine/config" "github.com/ethereum/hive/simulators/ethereum/engine/globals" "github.com/ethereum/hive/simulators/ethereum/engine/helper" "github.com/ethereum/hive/simulators/ethereum/engine/test" - typ "github.com/ethereum/hive/simulators/ethereum/engine/types" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/types" ) // Execution specification reference: @@ -34,3081 +24,386 @@ var ( ZeroAddr = common.Address{} ) -var Tests = []test.Spec{ - // Engine API Negative Test Cases - { - Name: "Inconsistent Head in ForkchoiceState", - Run: inconsistentForkchoiceStateGen("Head"), - }, - { - Name: "Inconsistent Safe in ForkchoiceState", - Run: inconsistentForkchoiceStateGen("Safe"), - }, - { - Name: "Inconsistent Finalized in ForkchoiceState", - Run: inconsistentForkchoiceStateGen("Finalized"), - }, - { - Name: "Unknown HeadBlockHash", - Run: unknownHeadBlockHash, - }, - { - Name: "Unknown SafeBlockHash", - Run: unknownSafeBlockHash, - }, - { - Name: "Unknown FinalizedBlockHash", - Run: unknownFinalizedBlockHash, - }, - { - Name: "ForkchoiceUpdated Invalid Payload Attributes", - Run: invalidPayloadAttributesGen(false), - }, - { - Name: "ForkchoiceUpdated Invalid Payload Attributes (Syncing)", - Run: invalidPayloadAttributesGen(true), - }, - { - Name: "Unique Payload ID", - Run: uniquePayloadID, - ForkConfig: test.LatestFork, - }, - // Invalid Payload Tests - { - Name: "Bad Hash on NewPayload", - Run: badHashOnNewPayloadGen(false, false), - }, - { - Name: "Bad Hash on NewPayload Syncing", - Run: badHashOnNewPayloadGen(true, false), - }, - { - Name: "Bad Hash on NewPayload Side Chain", - Run: badHashOnNewPayloadGen(false, true), - }, - { - Name: "Bad Hash on NewPayload Side Chain Syncing", - Run: badHashOnNewPayloadGen(true, true), - }, - { - Name: "ParentHash==BlockHash on NewPayload", - Run: parentHashOnExecPayload, - }, - { - Name: "Invalid ParentHash NewPayload", - Run: invalidPayloadTestCaseGen(helper.InvalidParentHash, false, false), - }, - { - Name: "Invalid ParentHash NewPayload (Syncing)", - Run: invalidPayloadTestCaseGen(helper.InvalidParentHash, true, false), - }, - { - Name: "Invalid StateRoot NewPayload", - Run: invalidPayloadTestCaseGen(helper.InvalidStateRoot, false, false), - }, - { - Name: "Invalid StateRoot NewPayload (Syncing)", - Run: invalidPayloadTestCaseGen(helper.InvalidStateRoot, true, false), - }, - { - Name: "Invalid StateRoot NewPayload, Empty Transactions", - Run: invalidPayloadTestCaseGen(helper.InvalidStateRoot, false, true), - }, - { - Name: "Invalid StateRoot NewPayload, Empty Transactions (Syncing)", - Run: invalidPayloadTestCaseGen(helper.InvalidStateRoot, true, true), - }, - { - Name: "Invalid ReceiptsRoot NewPayload", - Run: invalidPayloadTestCaseGen(helper.InvalidReceiptsRoot, false, false), - }, - { - Name: "Invalid ReceiptsRoot NewPayload (Syncing)", - Run: invalidPayloadTestCaseGen(helper.InvalidReceiptsRoot, true, false), - }, - { - Name: "Invalid Number NewPayload", - Run: invalidPayloadTestCaseGen(helper.InvalidNumber, false, false), - }, - { - Name: "Invalid Number NewPayload (Syncing)", - Run: invalidPayloadTestCaseGen(helper.InvalidNumber, true, false), - }, - { - Name: "Invalid GasLimit NewPayload", - Run: invalidPayloadTestCaseGen(helper.InvalidGasLimit, false, false), - }, - { - Name: "Invalid GasLimit NewPayload (Syncing)", - Run: invalidPayloadTestCaseGen(helper.InvalidGasLimit, true, false), - }, - { - Name: "Invalid GasUsed NewPayload", - Run: invalidPayloadTestCaseGen(helper.InvalidGasUsed, false, false), - }, - { - Name: "Invalid GasUsed NewPayload (Syncing)", - Run: invalidPayloadTestCaseGen(helper.InvalidGasUsed, true, false), - }, - { - Name: "Invalid Timestamp NewPayload", - Run: invalidPayloadTestCaseGen(helper.InvalidTimestamp, false, false), - }, - { - Name: "Invalid Timestamp NewPayload (Syncing)", - Run: invalidPayloadTestCaseGen(helper.InvalidTimestamp, true, false), - }, - { - Name: "Invalid PrevRandao NewPayload", - Run: invalidPayloadTestCaseGen(helper.InvalidPrevRandao, false, false), - }, - { - Name: "Invalid PrevRandao NewPayload (Syncing)", - Run: invalidPayloadTestCaseGen(helper.InvalidPrevRandao, true, false), - }, - { - Name: "Invalid Incomplete Transactions NewPayload", - Run: invalidPayloadTestCaseGen(helper.RemoveTransaction, false, false), - }, - { - Name: "Invalid Incomplete Transactions NewPayload (Syncing)", - Run: invalidPayloadTestCaseGen(helper.RemoveTransaction, true, false), - }, - { - Name: "Invalid Transaction Signature NewPayload", - Run: invalidPayloadTestCaseGen(helper.InvalidTransactionSignature, false, false), - TestTransactionType: helper.LegacyTxOnly, - }, - { - Name: "Invalid Transaction Signature NewPayload (EIP-1559)", - Run: invalidPayloadTestCaseGen(helper.InvalidTransactionSignature, false, false), - TestTransactionType: helper.DynamicFeeTxOnly, - }, - { - Name: "Invalid Transaction Signature NewPayload (Syncing)", - Run: invalidPayloadTestCaseGen(helper.InvalidTransactionSignature, true, false), - TestTransactionType: helper.LegacyTxOnly, - }, - { - Name: "Invalid Transaction Nonce NewPayload", - Run: invalidPayloadTestCaseGen(helper.InvalidTransactionNonce, false, false), - TestTransactionType: helper.LegacyTxOnly, - }, - { - Name: "Invalid Transaction Nonce NewPayload (EIP-1559)", - Run: invalidPayloadTestCaseGen(helper.InvalidTransactionNonce, false, false), - TestTransactionType: helper.DynamicFeeTxOnly, - }, - { - Name: "Invalid Transaction Nonce NewPayload (Syncing)", - Run: invalidPayloadTestCaseGen(helper.InvalidTransactionNonce, true, false), - TestTransactionType: helper.LegacyTxOnly, - }, - { - Name: "Invalid Transaction GasPrice NewPayload", - Run: invalidPayloadTestCaseGen(helper.InvalidTransactionGasPrice, false, false), - TestTransactionType: helper.LegacyTxOnly, - }, - { - Name: "Invalid Transaction GasPrice NewPayload (EIP-1559)", - Run: invalidPayloadTestCaseGen(helper.InvalidTransactionGasPrice, false, false), - TestTransactionType: helper.DynamicFeeTxOnly, - }, - { - Name: "Invalid Transaction GasPrice NewPayload (Syncing)", - Run: invalidPayloadTestCaseGen(helper.InvalidTransactionGasPrice, true, false), - TestTransactionType: helper.LegacyTxOnly, - }, - { - Name: "Invalid Transaction Gas Tip NewPayload (EIP-1559)", - Run: invalidPayloadTestCaseGen(helper.InvalidTransactionGasTipPrice, false, false), - TestTransactionType: helper.DynamicFeeTxOnly, - }, - { - Name: "Invalid Transaction Gas Tip NewPayload (EIP-1559, Syncing)", - Run: invalidPayloadTestCaseGen(helper.InvalidTransactionGasTipPrice, true, false), - TestTransactionType: helper.DynamicFeeTxOnly, - }, - { - Name: "Invalid Transaction Gas NewPayload", - Run: invalidPayloadTestCaseGen(helper.InvalidTransactionGas, false, false), - TestTransactionType: helper.LegacyTxOnly, - }, - { - Name: "Invalid Transaction Gas NewPayload (EIP-1559)", - Run: invalidPayloadTestCaseGen(helper.InvalidTransactionGas, false, false), - TestTransactionType: helper.DynamicFeeTxOnly, - }, - { - Name: "Invalid Transaction Gas NewPayload (Syncing)", - Run: invalidPayloadTestCaseGen(helper.InvalidTransactionGas, true, false), - TestTransactionType: helper.LegacyTxOnly, - }, - { - Name: "Invalid Transaction Value NewPayload", - Run: invalidPayloadTestCaseGen(helper.InvalidTransactionValue, false, false), - TestTransactionType: helper.LegacyTxOnly, - }, - { - Name: "Invalid Transaction Value NewPayload (EIP-1559)", - Run: invalidPayloadTestCaseGen(helper.InvalidTransactionValue, false, false), - TestTransactionType: helper.DynamicFeeTxOnly, - }, - { - Name: "Invalid Transaction Value NewPayload (Syncing)", - Run: invalidPayloadTestCaseGen(helper.InvalidTransactionValue, true, false), - TestTransactionType: helper.LegacyTxOnly, - }, - { - Name: "Invalid Transaction ChainID NewPayload", - Run: invalidPayloadTestCaseGen(helper.InvalidTransactionChainID, false, false), - TestTransactionType: helper.LegacyTxOnly, - }, - { - Name: "Invalid Transaction ChainID NewPayload (EIP-1559)", - Run: invalidPayloadTestCaseGen(helper.InvalidTransactionChainID, false, false), - TestTransactionType: helper.DynamicFeeTxOnly, - }, - { - Name: "Invalid Transaction ChainID NewPayload (Syncing)", - Run: invalidPayloadTestCaseGen(helper.InvalidTransactionChainID, true, false), - TestTransactionType: helper.LegacyTxOnly, - }, - - // Invalid Ancestor Re-Org Tests (Reveal via newPayload) - { - Name: "Invalid Ancestor Chain Re-Org, Invalid StateRoot, Invalid P1', Reveal using newPayload", - SlotsToFinalized: big.NewInt(20), - Run: invalidMissingAncestorReOrgGen(1, helper.InvalidStateRoot, true), - }, - { - Name: "Invalid Ancestor Chain Re-Org, Invalid StateRoot, Invalid P9', Reveal using newPayload", - SlotsToFinalized: big.NewInt(20), - Run: invalidMissingAncestorReOrgGen(9, helper.InvalidStateRoot, true), - }, - { - Name: "Invalid Ancestor Chain Re-Org, Invalid StateRoot, Invalid P10', Reveal using newPayload", - SlotsToFinalized: big.NewInt(20), - Run: invalidMissingAncestorReOrgGen(10, helper.InvalidStateRoot, true), - }, - - // Invalid Ancestor Re-Org/Sync Tests (Reveal via sync through secondary client) - { - Name: "Invalid Ancestor Chain Re-Org, Invalid StateRoot, Invalid P9', Reveal using sync", - TimeoutSeconds: 30, - SlotsToFinalized: big.NewInt(20), - Run: InvalidMissingAncestorReOrgSpec{ - PayloadInvalidIndex: 9, - PayloadField: helper.InvalidStateRoot, - ReOrgFromCanonical: true, - }.GenerateSync(), - }, - { - Name: "Invalid Ancestor Chain Sync, Invalid StateRoot, Invalid P9'", - TimeoutSeconds: 30, - SlotsToFinalized: big.NewInt(20), - Run: InvalidMissingAncestorReOrgSpec{ - PayloadInvalidIndex: 9, - PayloadField: helper.InvalidStateRoot, - ReOrgFromCanonical: false, - }.GenerateSync(), - }, - { - Name: "Invalid Ancestor Chain Re-Org, Invalid StateRoot, Empty Txs, Invalid P9', Reveal using sync", - TimeoutSeconds: 30, - SlotsToFinalized: big.NewInt(20), - Run: InvalidMissingAncestorReOrgSpec{ - PayloadInvalidIndex: 9, - PayloadField: helper.InvalidStateRoot, - EmptyTransactions: true, - ReOrgFromCanonical: true, - }.GenerateSync(), - }, - { - Name: "Invalid Ancestor Chain Sync, Invalid StateRoot, Empty Txs, Invalid P9'", - TimeoutSeconds: 30, - SlotsToFinalized: big.NewInt(20), - Run: InvalidMissingAncestorReOrgSpec{ - PayloadInvalidIndex: 9, - PayloadField: helper.InvalidStateRoot, - EmptyTransactions: true, - ReOrgFromCanonical: false, - }.GenerateSync(), - }, - { - Name: "Invalid Ancestor Chain Re-Org, Invalid ReceiptsRoot, Invalid P8', Reveal using sync", - TimeoutSeconds: 30, - SlotsToFinalized: big.NewInt(20), - Run: InvalidMissingAncestorReOrgSpec{ - PayloadInvalidIndex: 8, - PayloadField: helper.InvalidReceiptsRoot, - ReOrgFromCanonical: true, - }.GenerateSync(), - }, - { - Name: "Invalid Ancestor Chain Sync, Invalid ReceiptsRoot, Invalid P8'", - TimeoutSeconds: 30, - SlotsToFinalized: big.NewInt(20), - Run: InvalidMissingAncestorReOrgSpec{ - PayloadInvalidIndex: 8, - PayloadField: helper.InvalidReceiptsRoot, - ReOrgFromCanonical: false, - }.GenerateSync(), - }, - /* - TODO, RE-ENABLE: Test is causing a panic on the secondary node, disabling for now. - { - Name: "Invalid Ancestor Chain Re-Org, Invalid Number, Invalid P9', Reveal using sync", - TimeoutSeconds: 30, - SlotsToFinalized: big.NewInt(20), - Run: InvalidMissingAncestorReOrgSpec{ - PayloadInvalidIndex: 9, - PayloadField: helper.InvalidNumber, - ReOrgFromCanonical: true, - }.GenerateSync(), - }, - { - Name: "Invalid Ancestor Chain Sync, Invalid Number, Invalid P9'", - TimeoutSeconds: 30, - SlotsToFinalized: big.NewInt(20), - Run: InvalidMissingAncestorReOrgSpec{ - PayloadInvalidIndex: 9, - PayloadField: helper.InvalidNumber, - ReOrgFromCanonical: false, - }.GenerateSync(), - }, - */ - { - Name: "Invalid Ancestor Chain Re-Org, Invalid GasLimit, Invalid P9', Reveal using sync", - TimeoutSeconds: 30, - SlotsToFinalized: big.NewInt(20), - Run: InvalidMissingAncestorReOrgSpec{ - PayloadInvalidIndex: 8, - PayloadField: helper.InvalidGasLimit, - ReOrgFromCanonical: true, - }.GenerateSync(), - }, - { - Name: "Invalid Ancestor Chain Sync, Invalid GasLimit, Invalid P9'", - TimeoutSeconds: 30, - SlotsToFinalized: big.NewInt(20), - Run: InvalidMissingAncestorReOrgSpec{ - PayloadInvalidIndex: 8, - PayloadField: helper.InvalidGasLimit, - ReOrgFromCanonical: false, - }.GenerateSync(), - }, - { - Name: "Invalid Ancestor Chain Re-Org, Invalid GasUsed, Invalid P9', Reveal using sync", - TimeoutSeconds: 30, - SlotsToFinalized: big.NewInt(20), - Run: InvalidMissingAncestorReOrgSpec{ - PayloadInvalidIndex: 8, - PayloadField: helper.InvalidGasUsed, - ReOrgFromCanonical: true, - }.GenerateSync(), - }, - { - Name: "Invalid Ancestor Chain Sync, Invalid GasUsed, Invalid P9'", - TimeoutSeconds: 30, - SlotsToFinalized: big.NewInt(20), - Run: InvalidMissingAncestorReOrgSpec{ - PayloadInvalidIndex: 8, - PayloadField: helper.InvalidGasUsed, - ReOrgFromCanonical: false, - }.GenerateSync(), - }, - { - Name: "Invalid Ancestor Chain Re-Org, Invalid Timestamp, Invalid P9', Reveal using sync", - TimeoutSeconds: 30, - SlotsToFinalized: big.NewInt(20), - Run: InvalidMissingAncestorReOrgSpec{ - PayloadInvalidIndex: 8, - PayloadField: helper.InvalidTimestamp, - ReOrgFromCanonical: true, - }.GenerateSync(), - }, - { - Name: "Invalid Ancestor Chain Sync, Invalid Timestamp, Invalid P9'", - TimeoutSeconds: 30, - SlotsToFinalized: big.NewInt(20), - Run: InvalidMissingAncestorReOrgSpec{ - PayloadInvalidIndex: 8, - PayloadField: helper.InvalidTimestamp, - ReOrgFromCanonical: false, - }.GenerateSync(), - }, - /* - TODO, RE-ENABLE: Test consistently fails with Failed to set invalid block: missing trie node. - { - Name: "Invalid Ancestor Chain Re-Org, Invalid PrevRandao, Invalid P9', Reveal using sync", - TimeoutSeconds: 30, - SlotsToFinalized: big.NewInt(20), - Run: InvalidMissingAncestorReOrgSpec{ - PayloadInvalidIndex: 8, - PayloadField: InvalidPrevRandao, - ReOrgFromCanonical: true, - }.GenerateSync(), - }, - { - Name: "Invalid Ancestor Chain Sync, Invalid PrevRandao, Invalid P9'", - TimeoutSeconds: 30, - SlotsToFinalized: big.NewInt(20), - Run: InvalidMissingAncestorReOrgSpec{ - PayloadInvalidIndex: 8, - PayloadField: InvalidPrevRandao, - ReOrgFromCanonical: false, - }.GenerateSync(), - }, - */ - { - Name: "Invalid Ancestor Chain Re-Org, Incomplete Transactions, Invalid P9', Reveal using sync", - TimeoutSeconds: 30, - SlotsToFinalized: big.NewInt(20), - Run: InvalidMissingAncestorReOrgSpec{ - PayloadInvalidIndex: 9, - PayloadField: helper.RemoveTransaction, - ReOrgFromCanonical: true, - }.GenerateSync(), - }, - { - Name: "Invalid Ancestor Chain Sync, Incomplete Transactions, Invalid P9'", - TimeoutSeconds: 30, - SlotsToFinalized: big.NewInt(20), - Run: InvalidMissingAncestorReOrgSpec{ - PayloadInvalidIndex: 9, - PayloadField: helper.RemoveTransaction, - ReOrgFromCanonical: false, - }.GenerateSync(), - }, - { - Name: "Invalid Ancestor Chain Re-Org, Invalid Transaction Signature, Invalid P9', Reveal using sync", - TimeoutSeconds: 30, - SlotsToFinalized: big.NewInt(20), - Run: InvalidMissingAncestorReOrgSpec{ - PayloadInvalidIndex: 9, - PayloadField: helper.InvalidTransactionSignature, - ReOrgFromCanonical: true, - }.GenerateSync(), - }, - { - Name: "Invalid Ancestor Chain Sync, Invalid Transaction Signature, Invalid P9'", - TimeoutSeconds: 30, - SlotsToFinalized: big.NewInt(20), - Run: InvalidMissingAncestorReOrgSpec{ - PayloadInvalidIndex: 9, - PayloadField: helper.InvalidTransactionSignature, - ReOrgFromCanonical: false, - }.GenerateSync(), - }, - { - Name: "Invalid Ancestor Chain Re-Org, Invalid Transaction Nonce, Invalid P9', Reveal using sync", - TimeoutSeconds: 30, - SlotsToFinalized: big.NewInt(20), - Run: InvalidMissingAncestorReOrgSpec{ - PayloadInvalidIndex: 9, - PayloadField: helper.InvalidTransactionNonce, - ReOrgFromCanonical: true, - }.GenerateSync(), - }, - { - Name: "Invalid Ancestor Chain Sync, Invalid Transaction Nonce, Invalid P9'", - TimeoutSeconds: 30, - SlotsToFinalized: big.NewInt(20), - Run: InvalidMissingAncestorReOrgSpec{ - PayloadInvalidIndex: 9, - PayloadField: helper.InvalidTransactionNonce, - ReOrgFromCanonical: false, - }.GenerateSync(), - }, - { - Name: "Invalid Ancestor Chain Re-Org, Invalid Transaction Gas, Invalid P9', Reveal using sync", - TimeoutSeconds: 30, - SlotsToFinalized: big.NewInt(20), - Run: InvalidMissingAncestorReOrgSpec{ - PayloadInvalidIndex: 9, - PayloadField: helper.InvalidTransactionGas, - ReOrgFromCanonical: true, - }.GenerateSync(), - }, - { - Name: "Invalid Ancestor Chain Sync, Invalid Transaction Gas, Invalid P9'", - TimeoutSeconds: 30, - SlotsToFinalized: big.NewInt(20), - Run: InvalidMissingAncestorReOrgSpec{ - PayloadInvalidIndex: 9, - PayloadField: helper.InvalidTransactionGas, - ReOrgFromCanonical: false, - }.GenerateSync(), - }, - { - Name: "Invalid Ancestor Chain Re-Org, Invalid Transaction GasPrice, Invalid P9', Reveal using sync", - TimeoutSeconds: 30, - SlotsToFinalized: big.NewInt(20), - Run: InvalidMissingAncestorReOrgSpec{ - PayloadInvalidIndex: 9, - PayloadField: helper.InvalidTransactionGasPrice, - ReOrgFromCanonical: true, - }.GenerateSync(), - }, - { - Name: "Invalid Ancestor Chain Sync, Invalid Transaction GasPrice, Invalid P9'", - TimeoutSeconds: 30, - SlotsToFinalized: big.NewInt(20), - Run: InvalidMissingAncestorReOrgSpec{ - PayloadInvalidIndex: 9, - PayloadField: helper.InvalidTransactionGasPrice, - ReOrgFromCanonical: false, - }.GenerateSync(), - }, - { - Name: "Invalid Ancestor Chain Re-Org, Invalid Transaction Value, Invalid P9', Reveal using sync", - TimeoutSeconds: 30, - SlotsToFinalized: big.NewInt(20), - Run: InvalidMissingAncestorReOrgSpec{ - PayloadInvalidIndex: 9, - PayloadField: helper.InvalidTransactionValue, - ReOrgFromCanonical: true, - }.GenerateSync(), - }, - { - Name: "Invalid Ancestor Chain Sync, Invalid Transaction Value, Invalid P9'", - TimeoutSeconds: 30, - SlotsToFinalized: big.NewInt(20), - Run: InvalidMissingAncestorReOrgSpec{ - PayloadInvalidIndex: 9, - PayloadField: helper.InvalidTransactionValue, - ReOrgFromCanonical: false, - }.GenerateSync(), - }, - { - Name: "Invalid Ancestor Chain Re-Org, Invalid Ommers, Invalid P9', Reveal using sync", - TimeoutSeconds: 30, - SlotsToFinalized: big.NewInt(20), - Run: InvalidMissingAncestorReOrgSpec{ - PayloadInvalidIndex: 9, - PayloadField: helper.InvalidOmmers, - ReOrgFromCanonical: true, - }.GenerateSync(), - }, - { - Name: "Invalid Ancestor Chain Sync, Invalid Ommers, Invalid P9'", - TimeoutSeconds: 30, - SlotsToFinalized: big.NewInt(20), - Run: InvalidMissingAncestorReOrgSpec{ - PayloadInvalidIndex: 9, - PayloadField: helper.InvalidOmmers, - ReOrgFromCanonical: false, - }.GenerateSync(), - }, - - // Eth RPC Status on ForkchoiceUpdated Events - { - Name: "latest Block after NewPayload", - Run: blockStatusExecPayload, - }, - { - Name: "latest Block after New HeadBlockHash", - Run: blockStatusHeadBlock, - }, - { - Name: "safe Block after New SafeBlockHash", - Run: blockStatusSafeBlock, - }, - { - Name: "finalized Block after New FinalizedBlockHash", - Run: blockStatusFinalizedBlock, - }, - { - Name: "safe, finalized on Canonical Chain", - Run: safeFinalizedCanonicalChain, - SlotsToSafe: big.NewInt(1), - SlotsToFinalized: big.NewInt(2), - }, - { - Name: "latest Block after Reorg", - Run: blockStatusReorg, - }, - - // Payload Tests - { - Name: "Re-Execute Payload", - Run: reExecPayloads, - }, - { - Name: "Multiple New Payloads Extending Canonical Chain", - Run: multipleNewCanonicalPayloads, - }, - { - Name: "Consecutive Payload Execution", - Run: inOrderPayloads, - }, - { - Name: "Valid NewPayload->ForkchoiceUpdated on Syncing Client", - Run: validPayloadFcUSyncingClient, - }, - { - Name: "NewPayload with Missing ForkchoiceUpdated", - Run: missingFcu, - }, - { - Name: "Payload Build after New Invalid Payload", - Run: payloadBuildAfterNewInvalidPayload, - }, - { - Name: "Build Payload with Invalid ChainID Transaction (Legacy Tx)", - Run: buildPayloadWithInvalidChainIDTx, - TestTransactionType: helper.LegacyTxOnly, - }, - { - Name: "Build Payload with Invalid ChainID Transaction (EIP-1559)", - Run: buildPayloadWithInvalidChainIDTx, - TestTransactionType: helper.DynamicFeeTxOnly, - }, - - // Re-org using Engine API - { - Name: "Transaction Reorg", - Run: transactionReorg, - }, - { - Name: "Transaction Reorg - Check Blockhash", - Run: transactionReorgBlockhash(false), - }, - { - Name: "Transaction Reorg - Check Blockhash with NP on revert", - Run: transactionReorgBlockhash(true), - }, - { - Name: "Sidechain Reorg", - Run: sidechainReorg, - }, - { - Name: "Re-Org Back into Canonical Chain", - Run: reorgBack, - }, - { - Name: "Re-Org Back to Canonical Chain From Syncing Chain", - Run: reorgBackFromSyncing, - }, - { - Name: "Import and re-org to previously validated payload on a side chain", - SlotsToSafe: big.NewInt(15), - SlotsToFinalized: big.NewInt(20), - Run: reorgPrevValidatedPayloadOnSideChain, - }, - { - Name: "Safe Re-Org to Side Chain", - Run: safeReorgToSideChain, - SlotsToSafe: big.NewInt(1), - SlotsToFinalized: big.NewInt(2), - }, - - // Suggested Fee Recipient in Payload creation - { - Name: "Suggested Fee Recipient Test", - Run: suggestedFeeRecipient, - TestTransactionType: helper.LegacyTxOnly, - }, - { - Name: "Suggested Fee Recipient Test (EIP-1559 Transactions)", - Run: suggestedFeeRecipient, - TestTransactionType: helper.DynamicFeeTxOnly, - }, - - // PrevRandao opcode tests - { - Name: "PrevRandao Opcode Transactions", - Run: prevRandaoOpcodeTx, - TestTransactionType: helper.LegacyTxOnly, - }, - { - Name: "PrevRandao Opcode Transactions (EIP-1559 Transactions)", - Run: prevRandaoOpcodeTx, - TestTransactionType: helper.DynamicFeeTxOnly, - }, -} - -// Verify that a forkchoiceUpdated with a valid HeadBlock (previously sent using NewPayload) and unknown SafeBlock -// results in error -func unknownSafeBlockHash(t *test.Env) { - // Wait until TTD is reached by this client - t.CLMock.WaitForTTD() - - // Produce blocks before starting the test - t.CLMock.ProduceBlocks(5, clmock.BlockProcessCallbacks{}) - - t.CLMock.ProduceSingleBlock(clmock.BlockProcessCallbacks{ - // Run test after a new payload has been broadcast - OnNewPayloadBroadcast: func() { - - // Generate a random SafeBlock hash - randomSafeBlockHash := common.Hash{} - rand.Read(randomSafeBlockHash[:]) - - // Send forkchoiceUpdated with random SafeBlockHash - // Execution specification: - // - This value MUST be either equal to or an ancestor of headBlockHash - r := t.TestEngine.TestEngineForkchoiceUpdatedV1( - &api.ForkchoiceStateV1{ - HeadBlockHash: t.CLMock.LatestExecutedPayload.BlockHash, - SafeBlockHash: randomSafeBlockHash, - FinalizedBlockHash: t.CLMock.LatestForkchoice.FinalizedBlockHash, - }, nil) - r.ExpectError() - - }, - }) - -} - -// Verify that a forkchoiceUpdated with a valid HeadBlock (previously sent using NewPayload) and unknown -// FinalizedBlockHash results in error -func unknownFinalizedBlockHash(t *test.Env) { - // Wait until TTD is reached by this client - t.CLMock.WaitForTTD() - - // Produce blocks before starting the test - t.CLMock.ProduceBlocks(5, clmock.BlockProcessCallbacks{}) - - t.CLMock.ProduceSingleBlock(clmock.BlockProcessCallbacks{ - // Run test after a new payload has been broadcast - OnNewPayloadBroadcast: func() { - - // Generate a random FinalizedBlockHash hash - randomFinalizedBlockHash := common.Hash{} - rand.Read(randomFinalizedBlockHash[:]) - - // Send forkchoiceUpdated with random FinalizedBlockHash - forkchoiceStateUnknownFinalizedHash := api.ForkchoiceStateV1{ - HeadBlockHash: t.CLMock.LatestExecutedPayload.BlockHash, - SafeBlockHash: t.CLMock.LatestForkchoice.SafeBlockHash, - FinalizedBlockHash: randomFinalizedBlockHash, - } - r := t.TestEngine.TestEngineForkchoiceUpdatedV1(&forkchoiceStateUnknownFinalizedHash, nil) - r.ExpectError() - - // Test again using PayloadAttributes, should also return INVALID and no PayloadID - r = t.TestEngine.TestEngineForkchoiceUpdatedV1(&forkchoiceStateUnknownFinalizedHash, - &typ.PayloadAttributes{ - Timestamp: t.CLMock.LatestExecutedPayload.Timestamp + 1, - Random: common.Hash{}, - SuggestedFeeRecipient: common.Address{}, - }) - r.ExpectError() - - }, - }) - -} - -// Verify that an unknown hash at HeadBlock in the forkchoice results in client returning Syncing state -func unknownHeadBlockHash(t *test.Env) { - // Wait until TTD is reached by this client - t.CLMock.WaitForTTD() - - // Produce blocks before starting the test - t.CLMock.ProduceBlocks(5, clmock.BlockProcessCallbacks{}) - - // Generate a random HeadBlock hash - randomHeadBlockHash := common.Hash{} - rand.Read(randomHeadBlockHash[:]) - - forkchoiceStateUnknownHeadHash := api.ForkchoiceStateV1{ - HeadBlockHash: randomHeadBlockHash, - SafeBlockHash: t.CLMock.LatestForkchoice.FinalizedBlockHash, - FinalizedBlockHash: t.CLMock.LatestForkchoice.FinalizedBlockHash, - } - - t.Logf("INFO (%v) forkchoiceStateUnknownHeadHash: %v\n", t.TestName, forkchoiceStateUnknownHeadHash) - - // Execution specification:: - // - {payloadStatus: {status: SYNCING, latestValidHash: null, validationError: null}, payloadId: null} - // if forkchoiceState.headBlockHash references an unknown payload or a payload that can't be validated - // because requisite data for the validation is missing - r := t.TestEngine.TestEngineForkchoiceUpdatedV1(&forkchoiceStateUnknownHeadHash, nil) - r.ExpectPayloadStatus(test.Syncing) - - // Test again using PayloadAttributes, should also return SYNCING and no PayloadID - r = t.TestEngine.TestEngineForkchoiceUpdatedV1(&forkchoiceStateUnknownHeadHash, - &typ.PayloadAttributes{ - Timestamp: t.CLMock.LatestExecutedPayload.Timestamp + 1, - Random: common.Hash{}, - SuggestedFeeRecipient: common.Address{}, - }) - r.ExpectPayloadStatus(test.Syncing) - r.ExpectPayloadID(nil) - -} - -// Send an inconsistent ForkchoiceState with a known payload that belongs to a side chain as head, safe or finalized. -func inconsistentForkchoiceStateGen(inconsistency string) func(t *test.Env) { - return func(t *test.Env) { - // Wait until TTD is reached by this client - t.CLMock.WaitForTTD() - - canonicalPayloads := make([]*typ.ExecutableData, 0) - alternativePayloads := make([]*typ.ExecutableData, 0) - // Produce blocks before starting the test - t.CLMock.ProduceBlocks(3, clmock.BlockProcessCallbacks{ - OnGetPayload: func() { - // Generate and send an alternative side chain - customData := helper.CustomPayloadData{} - customData.ExtraData = &([]byte{0x01}) - if len(alternativePayloads) > 0 { - customData.ParentHash = &alternativePayloads[len(alternativePayloads)-1].BlockHash - } - alternativePayload, _, err := customData.CustomizePayload(&t.CLMock.LatestPayloadBuilt, t.CLMock.LatestPayloadAttributes.BeaconRoot) - if err != nil { - t.Fatalf("FAIL (%s): Unable to construct alternative payload: %v", t.TestName, err) - } - alternativePayloads = append(alternativePayloads, alternativePayload) - latestCanonicalPayload := t.CLMock.LatestPayloadBuilt - canonicalPayloads = append(canonicalPayloads, &latestCanonicalPayload) - - // Send the alternative payload - r := t.TestEngine.TestEngineNewPayloadV1(alternativePayload) - r.ExpectStatusEither(test.Valid, test.Accepted) - }, - }) - // Send the invalid ForkchoiceStates - inconsistentFcU := api.ForkchoiceStateV1{ - HeadBlockHash: canonicalPayloads[len(alternativePayloads)-1].BlockHash, - SafeBlockHash: canonicalPayloads[len(alternativePayloads)-2].BlockHash, - FinalizedBlockHash: canonicalPayloads[len(alternativePayloads)-3].BlockHash, - } - switch inconsistency { - case "Head": - inconsistentFcU.HeadBlockHash = alternativePayloads[len(alternativePayloads)-1].BlockHash - case "Safe": - inconsistentFcU.SafeBlockHash = alternativePayloads[len(canonicalPayloads)-2].BlockHash - case "Finalized": - inconsistentFcU.FinalizedBlockHash = alternativePayloads[len(canonicalPayloads)-3].BlockHash - } - r := t.TestEngine.TestEngineForkchoiceUpdatedV1(&inconsistentFcU, nil) - r.ExpectError() - - // Return to the canonical chain - r = t.TestEngine.TestEngineForkchoiceUpdatedV1(&t.CLMock.LatestForkchoice, nil) - r.ExpectPayloadStatus(test.Valid) - } -} - -// Verify behavior on a forkchoiceUpdated with invalid payload attributes -func invalidPayloadAttributesGen(syncing bool) func(*test.Env) { - - return func(t *test.Env) { - // Wait until TTD is reached by this client - t.CLMock.WaitForTTD() - - // Produce blocks before starting the test - t.CLMock.ProduceBlocks(5, clmock.BlockProcessCallbacks{}) - - // Send a forkchoiceUpdated with invalid PayloadAttributes - t.CLMock.ProduceSingleBlock(clmock.BlockProcessCallbacks{ - OnNewPayloadBroadcast: func() { - // Try to apply the new payload with invalid attributes - var blockHash common.Hash - if syncing { - // Setting a random hash will put the client into `SYNCING` - rand.Read(blockHash[:]) - } else { - // Set the block hash to the next payload that was broadcasted - blockHash = t.CLMock.LatestPayloadBuilt.BlockHash - } - t.Logf("INFO (%s): Sending EngineForkchoiceUpdatedV1 (Syncing=%s) with invalid payload attributes", t.TestName, syncing) - fcu := api.ForkchoiceStateV1{ - HeadBlockHash: blockHash, - SafeBlockHash: t.CLMock.LatestForkchoice.SafeBlockHash, - FinalizedBlockHash: t.CLMock.LatestForkchoice.FinalizedBlockHash, - } - attr := typ.PayloadAttributes{ - Timestamp: 0, - Random: common.Hash{}, - SuggestedFeeRecipient: common.Address{}, - } - // 0) Check headBlock is known and there is no missing data, if not respond with SYNCING - // 1) Check headBlock is VALID, if not respond with INVALID - // 2) Apply forkchoiceState - // 3) Check payloadAttributes, if invalid respond with error: code: Invalid payload attributes - // 4) Start payload build process and respond with VALID - if syncing { - // If we are SYNCING, the outcome should be SYNCING regardless of the validity of the payload atttributes - r := t.TestEngine.TestEngineForkchoiceUpdatedV1(&fcu, &attr) - r.ExpectPayloadStatus(test.Syncing) - r.ExpectPayloadID(nil) - } else { - r := t.TestEngine.TestEngineForkchoiceUpdatedV1(&fcu, &attr) - r.ExpectError() - - // Check that the forkchoice was applied, regardless of the error - s := t.TestEngine.TestHeaderByNumber(Head) - s.ExpectHash(blockHash) - } - }, - }) - } - -} - -// Check that the payload id returned on a forkchoiceUpdated call is different -// when the attributes change -func uniquePayloadID(t *test.Env) { - // Wait until TTD is reached by this client - t.CLMock.WaitForTTD() - - parentHash := t.CLMock.LatestHeader.Hash() - - fcState := &api.ForkchoiceStateV1{ - HeadBlockHash: parentHash, - } - payloadAttributes := &typ.PayloadAttributes{ - Timestamp: t.CLMock.LatestHeader.Time + 1, - Random: common.Hash{}, - SuggestedFeeRecipient: common.Address{}, - Withdrawals: []*types.Withdrawal{}, - } - - previousPayloadID := &api.PayloadID{} - - r := t.TestEngine.TestEngineForkchoiceUpdated(fcState, payloadAttributes, -1) - r.ExpectUpdatedPayloadID(previousPayloadID) - - // Modify timestamp - previousPayloadID = r.Response.PayloadID - payloadAttributes.Timestamp += 1 - r = t.TestEngine.TestEngineForkchoiceUpdated(fcState, payloadAttributes, -1) - r.ExpectUpdatedPayloadID(previousPayloadID) - - // Modify random - previousPayloadID = r.Response.PayloadID - payloadAttributes.Random = common.Hash{1} - r = t.TestEngine.TestEngineForkchoiceUpdated(fcState, payloadAttributes, -1) - r.ExpectUpdatedPayloadID(previousPayloadID) - - // Modify fee recipient - previousPayloadID = r.Response.PayloadID - payloadAttributes.SuggestedFeeRecipient = common.Address{1} - r = t.TestEngine.TestEngineForkchoiceUpdated(fcState, payloadAttributes, -1) - r.ExpectUpdatedPayloadID(previousPayloadID) - - // Add withdrawal - previousPayloadID = r.Response.PayloadID - newWithdrawal := &types.Withdrawal{} - payloadAttributes.Withdrawals = append(payloadAttributes.Withdrawals, newWithdrawal) - r = t.TestEngine.TestEngineForkchoiceUpdated(fcState, payloadAttributes, -1) - r.ExpectUpdatedPayloadID(previousPayloadID) - - // Modify withdrawal - previousPayloadID = r.Response.PayloadID - newWithdrawal.Amount = 1 - r = t.TestEngine.TestEngineForkchoiceUpdated(fcState, payloadAttributes, -1) - r.ExpectUpdatedPayloadID(previousPayloadID) - - // Add another withdrawal - previousPayloadID = r.Response.PayloadID - newWithdrawal = &types.Withdrawal{Index: 1} - payloadAttributes.Withdrawals = append(payloadAttributes.Withdrawals, newWithdrawal) - r = t.TestEngine.TestEngineForkchoiceUpdated(fcState, payloadAttributes, -1) - r.ExpectUpdatedPayloadID(previousPayloadID) - - // Add test here for future attributes! -} - -// Corrupt the hash of a valid payload, client should reject the payload. -// All possible scenarios: -// (fcU) -// ┌────────┠┌────────────────────────┠-// │ HEAD │◄───────┤ Bad Hash (!Sync,!Side) │ -// └────┬───┘ └────────────────────────┘ -// │ -// │ -// ┌────▼───┠┌────────────────────────┠-// │ HEAD-1 │◄───────┤ Bad Hash (!Sync, Side) │ -// └────┬───┘ └────────────────────────┘ -// │ -// -// -// (fcU) -// ******************** ┌───────────────────────┠-// * (Unknown) HEAD *◄─┤ Bad Hash (Sync,!Side) │ -// ******************** └───────────────────────┘ -// │ -// │ -// ┌────▼───┠┌───────────────────────┠-// │ HEAD-1 │◄───────────┤ Bad Hash (Sync, Side) │ -// └────┬───┘ └───────────────────────┘ -// │ -// - -func badHashOnNewPayloadGen(syncing bool, sidechain bool) func(*test.Env) { - - return func(t *test.Env) { - // Wait until TTD is reached by this client - t.CLMock.WaitForTTD() - - // Produce blocks before starting the test - t.CLMock.ProduceBlocks(5, clmock.BlockProcessCallbacks{}) - - var ( - alteredPayload typ.ExecutableData - invalidPayloadHash common.Hash - ) - - t.CLMock.ProduceSingleBlock(clmock.BlockProcessCallbacks{ - // Run test after the new payload has been obtained - OnGetPayload: func() { - // Alter hash on the payload and send it to client, should produce an error - alteredPayload = t.CLMock.LatestPayloadBuilt - invalidPayloadHash = alteredPayload.BlockHash - invalidPayloadHash[common.HashLength-1] = byte(255 - invalidPayloadHash[common.HashLength-1]) - alteredPayload.BlockHash = invalidPayloadHash - - if !syncing && sidechain { - // We alter the payload by setting the parent to a known past block in the - // canonical chain, which makes this payload a side chain payload, and also an invalid block hash - // (because we did not update the block hash appropriately) - alteredPayload.ParentHash = t.CLMock.LatestHeader.ParentHash - } else if syncing { - // We need to send an fcU to put the client in SYNCING state. - randomHeadBlock := common.Hash{} - rand.Read(randomHeadBlock[:]) - fcU := api.ForkchoiceStateV1{ - HeadBlockHash: randomHeadBlock, - SafeBlockHash: t.CLMock.LatestHeader.Hash(), - FinalizedBlockHash: t.CLMock.LatestHeader.Hash(), - } - r := t.TestEngine.TestEngineForkchoiceUpdatedV1(&fcU, nil) - r.ExpectPayloadStatus(test.Syncing) - - if sidechain { - // Syncing and sidechain, the caonincal head is an unknown payload to us, - // but this specific bad hash payload is in theory part of a side chain. - // Therefore the parent we use is the head hash. - alteredPayload.ParentHash = t.CLMock.LatestHeader.Hash() - } else { - // The invalid bad-hash payload points to the unknown head, but we know it is - // indeed canonical because the head was set using forkchoiceUpdated. - alteredPayload.ParentHash = randomHeadBlock - } - } - - // Execution specification:: - // - {status: INVALID_BLOCK_HASH, latestValidHash: null, validationError: null} if the blockHash validation has failed - // Starting from Shanghai, INVALID should be returned instead (https://github.com/ethereum/execution-apis/pull/338) - r := t.TestEngine.TestEngineNewPayloadV1(&alteredPayload) - r.ExpectStatusEither(test.InvalidBlockHash, test.Invalid) - r.ExpectLatestValidHash(nil) - }, - }) - - // Lastly, attempt to build on top of the invalid payload - t.CLMock.ProduceSingleBlock(clmock.BlockProcessCallbacks{ - // Run test after the new payload has been obtained - OnGetPayload: func() { - customizer := &helper.CustomPayloadData{ - ParentHash: &alteredPayload.BlockHash, - } - alteredPayload, _, err := customizer.CustomizePayload(&t.CLMock.LatestPayloadBuilt, t.CLMock.LatestPayloadAttributes.BeaconRoot) - if err != nil { - t.Fatalf("FAIL (%s): Unable to modify payload: %v", t.TestName, err) - } - - // Response status can be ACCEPTED (since parent payload could have been thrown out by the client) - // or INVALID (client still has the payload and can verify that this payload is incorrectly building on top of it), - // but a VALID response is incorrect. - r := t.TestEngine.TestEngineNewPayloadV1(alteredPayload) - r.ExpectStatusEither(test.Accepted, test.Invalid, test.Syncing) - - }, - }) - - } -} - -// Copy the parentHash into the blockHash, client should reject the payload -// (from Kintsugi Incident Report: https://notes.ethereum.org/@ExXcnR0-SJGthjz1dwkA1A/BkkdHWXTY) -func parentHashOnExecPayload(t *test.Env) { - // Wait until TTD is reached by this client - t.CLMock.WaitForTTD() - - // Produce blocks before starting the test - t.CLMock.ProduceBlocks(5, clmock.BlockProcessCallbacks{}) - - t.CLMock.ProduceSingleBlock(clmock.BlockProcessCallbacks{ - // Run test after the new payload has been obtained - OnGetPayload: func() { - // Alter hash on the payload and send it to client, should produce an error - alteredPayload := t.CLMock.LatestPayloadBuilt - alteredPayload.BlockHash = alteredPayload.ParentHash - // Execution specification:: - // - {status: INVALID_BLOCK_HASH, latestValidHash: null, validationError: null} if the blockHash validation has failed - // Starting from Shanghai, INVALID should be returned instead (https://github.com/ethereum/execution-apis/pull/338) - r := t.TestEngine.TestEngineNewPayloadV1(&alteredPayload) - r.ExpectStatusEither(test.InvalidBlockHash, test.Invalid) - r.ExpectLatestValidHash(nil) - }, - }) - -} - -// Generate test cases for each field of NewPayload, where the payload contains a single invalid field and a valid hash. -func invalidPayloadTestCaseGen(payloadField helper.InvalidPayloadBlockField, syncing bool, emptyTxs bool) func(*test.Env) { - return func(t *test.Env) { - - if syncing { - // To allow sending the primary engine client into SYNCING state, we need a secondary client to guide the payload creation - secondaryClient, err := hive_rpc.HiveRPCEngineStarter{}.StartClient(t.T, t.TestContext, t.Genesis, t.ClientParams, t.ClientFiles) - if err != nil { - t.Fatalf("FAIL (%s): Unable to spawn a secondary client: %v", t.TestName, err) - } - t.CLMock.AddEngineClient(secondaryClient) - } - - // Wait until TTD is reached by all clients - t.CLMock.WaitForTTD() - - txFunc := func() { - if !emptyTxs { - // Function to send at least one transaction each block produced - // Send the transaction to the globals.PrevRandaoContractAddr - _, err := helper.SendNextTransaction( - t.TestContext, - t.CLMock.NextBlockProducer, - &helper.BaseTransactionCreator{ - Recipient: &globals.PrevRandaoContractAddr, - Amount: big1, - Payload: nil, - TxType: t.TestTransactionType, - GasLimit: 75000, - }, - ) - if err != nil { - t.Fatalf("FAIL (%s): Error trying to send transaction: %v", t.TestName, err) - } - } - } - - // Produce blocks before starting the test - t.CLMock.ProduceBlocks(5, clmock.BlockProcessCallbacks{ - // Make sure at least one transaction is included in each block - OnPayloadProducerSelected: txFunc, - }) - - if syncing { - // Disconnect the main engine client from the CL Mocker and produce a block - t.CLMock.RemoveEngineClient(t.Engine) - t.CLMock.ProduceSingleBlock(clmock.BlockProcessCallbacks{ - OnPayloadProducerSelected: txFunc, - }) - - // This block is now unknown to the main client, sending an fcU will set it to syncing mode - r := t.TestEngine.TestEngineForkchoiceUpdatedV1(&t.CLMock.LatestForkchoice, nil) - r.ExpectPayloadStatus(test.Syncing) - } - - var ( - alteredPayload *typ.ExecutableData - err error - ) - - t.CLMock.ProduceSingleBlock(clmock.BlockProcessCallbacks{ - // Make sure at least one transaction is included in the payload - OnPayloadProducerSelected: txFunc, - // Run test after the new payload has been obtained - OnGetPayload: func() { - // Alter the payload while maintaining a valid hash and send it to the client, should produce an error - - // We need at least one transaction for most test cases to work - if !emptyTxs && len(t.CLMock.LatestPayloadBuilt.Transactions) == 0 { - // But if the payload has no transactions, the test is invalid - t.Fatalf("FAIL (%s): No transactions in the base payload", t.TestName) - } - - alteredPayload, _, err = helper.GenerateInvalidPayload(&t.CLMock.LatestPayloadBuilt, t.CLMock.LatestPayloadAttributes.BeaconRoot, payloadField) - if err != nil { - t.Fatalf("FAIL (%s): Unable to modify payload (%v): %v", t.TestName, payloadField, err) - } - - // Depending on the field we modified, we expect a different status - r := t.TestEngine.TestEngineNewPayloadV1(alteredPayload) - if syncing || payloadField == helper.InvalidParentHash { - // Execution specification:: - // {status: ACCEPTED, latestValidHash: null, validationError: null} if the following conditions are met: - // - the blockHash of the payload is valid - // - the payload doesn't extend the canonical chain - // - the payload hasn't been fully validated - // {status: SYNCING, latestValidHash: null, validationError: null} - // if the payload extends the canonical chain and requisite data for its validation is missing - // (the client can assume the payload extends the canonical because the linking payload could be missing) - r.ExpectStatusEither(test.Accepted, test.Syncing) - r.ExpectLatestValidHash(nil) - } else { - r.ExpectStatus(test.Invalid) - r.ExpectLatestValidHash(&alteredPayload.ParentHash) - } - - // Send the forkchoiceUpdated with a reference to the invalid payload. - fcState := api.ForkchoiceStateV1{ - HeadBlockHash: alteredPayload.BlockHash, - SafeBlockHash: alteredPayload.BlockHash, - FinalizedBlockHash: alteredPayload.BlockHash, - } - payloadAttrbutes := typ.PayloadAttributes{ - Timestamp: alteredPayload.Timestamp + 1, - Random: common.Hash{}, - SuggestedFeeRecipient: common.Address{}, - } - - // Execution specification: - // {payloadStatus: {status: INVALID, latestValidHash: null, validationError: errorMessage | null}, payloadId: null} - // obtained from the Payload validation process if the payload is deemed INVALID - s := t.TestEngine.TestEngineForkchoiceUpdatedV1(&fcState, &payloadAttrbutes) - if !syncing { - // Execution specification: - // {payloadStatus: {status: INVALID, latestValidHash: null, validationError: errorMessage | null}, payloadId: null} - // obtained from the Payload validation process if the payload is deemed INVALID - // Note: SYNCING/ACCEPTED is acceptable here as long as the block produced after this test is produced successfully - s.ExpectAnyPayloadStatus(test.Syncing, test.Accepted, test.Invalid) - } else { - // At this moment the response should be SYNCING - s.ExpectPayloadStatus(test.Syncing) - - // When we send the previous payload, the client must now be capable of determining that the invalid payload is actually invalid - p := t.TestEngine.TestEngineNewPayloadV1(&t.CLMock.LatestExecutedPayload) - p.ExpectStatus(test.Valid) - p.ExpectLatestValidHash(&t.CLMock.LatestExecutedPayload.BlockHash) - - /* - // Another option here could be to send an fcU to the previous payload, - // but this does not seem like something the CL would do. - s := t.TestEngine.TestEngineForkchoiceUpdatedV1(&api.ForkchoiceStateV1{ - HeadBlockHash: previousPayload.BlockHash, - SafeBlockHash: previousPayload.BlockHash, - FinalizedBlockHash: previousPayload.BlockHash, - }, nil) - s.ExpectPayloadStatus(Valid) - */ - - q := t.TestEngine.TestEngineNewPayloadV1(alteredPayload) - if payloadField == helper.InvalidParentHash { - // There is no invalid parentHash, if this value is incorrect, - // it is assumed that the block is missing and we need to sync. - // ACCEPTED also valid since the CLs normally use these interchangeably - q.ExpectStatusEither(test.Syncing, test.Accepted) - q.ExpectLatestValidHash(nil) - } else if payloadField == helper.InvalidNumber { - // A payload with an invalid number can force us to start a sync cycle - // as we don't know if that block might be a valid future block. - q.ExpectStatusEither(test.Invalid, test.Syncing) - if q.Status.Status == test.Invalid { - q.ExpectLatestValidHash(&t.CLMock.LatestExecutedPayload.BlockHash) - } else { - q.ExpectLatestValidHash(nil) - } - } else { - // Otherwise the response should be INVALID. - q.ExpectStatus(test.Invalid) - q.ExpectLatestValidHash(&t.CLMock.LatestExecutedPayload.BlockHash) - } - - // Try sending the fcU again, this time we should get the proper invalid response. - // At this moment the response should be INVALID - if payloadField != helper.InvalidParentHash { - s := t.TestEngine.TestEngineForkchoiceUpdatedV1(&fcState, nil) - // Note: SYNCING is acceptable here as long as the block produced after this test is produced successfully - s.ExpectAnyPayloadStatus(test.Syncing, test.Invalid) - } - } - - // Finally, attempt to fetch the invalid payload using the JSON-RPC endpoint - p := t.TestEngine.TestBlockByHash(alteredPayload.BlockHash) - p.ExpectError() - }, - }) - - if syncing { - // Send the valid payload and its corresponding forkchoiceUpdated - r := t.TestEngine.TestEngineNewPayloadV1(&t.CLMock.LatestExecutedPayload) - r.ExpectStatus(test.Valid) - r.ExpectLatestValidHash(&t.CLMock.LatestExecutedPayload.BlockHash) - - s := t.TestEngine.TestEngineForkchoiceUpdatedV1(&t.CLMock.LatestForkchoice, nil) - s.ExpectPayloadStatus(test.Valid) - s.ExpectLatestValidHash(&t.CLMock.LatestExecutedPayload.BlockHash) - - // Add main client again to the CL Mocker - t.CLMock.AddEngineClient(t.Engine) - } - - // Lastly, attempt to build on top of the invalid payload - t.CLMock.ProduceSingleBlock(clmock.BlockProcessCallbacks{ - // Run test after the new payload has been obtained - OnGetPayload: func() { - customizer := &helper.CustomPayloadData{ - ParentHash: &alteredPayload.BlockHash, - } - followUpAlteredPayload, _, err := customizer.CustomizePayload(&t.CLMock.LatestPayloadBuilt, t.CLMock.LatestPayloadAttributes.BeaconRoot) - if err != nil { - t.Fatalf("FAIL (%s): Unable to modify payload: %v", t.TestName, err) - } - - t.Logf("INFO (%s): Sending customized NewPayload: ParentHash %v -> %v", t.TestName, t.CLMock.LatestPayloadBuilt.ParentHash, alteredPayload.BlockHash) - // Response status can be ACCEPTED (since parent payload could have been thrown out by the client) - // or SYNCING (parent payload is thrown out and also client assumes that the parent is part of canonical chain) - // or INVALID (client still has the payload and can verify that this payload is incorrectly building on top of it), - // but a VALID response is incorrect. - r := t.TestEngine.TestEngineNewPayloadV1(followUpAlteredPayload) - r.ExpectStatusEither(test.Accepted, test.Invalid, test.Syncing) - if r.Status.Status == test.Accepted || r.Status.Status == test.Syncing { - r.ExpectLatestValidHash(nil) - } else if r.Status.Status == test.Invalid { - r.ExpectLatestValidHash(&alteredPayload.ParentHash) - } - }, - }) - } -} - -// Attempt to re-org to a chain which at some point contains an unknown payload which is also invalid. -// Then reveal the invalid payload and expect that the client rejects it and rejects forkchoice updated calls to this chain. -// The invalid_index parameter determines how many payloads apart is the common ancestor from the block that invalidates the chain, -// with a value of 1 meaning that the immediate payload after the common ancestor will be invalid. -func invalidMissingAncestorReOrgGen(invalid_index int, payloadField helper.InvalidPayloadBlockField, emptyTxs bool) func(*test.Env) { - return func(t *test.Env) { - - // Wait until TTD is reached by this client - t.CLMock.WaitForTTD() - - // Produce blocks before starting the test - t.CLMock.ProduceBlocks(5, clmock.BlockProcessCallbacks{}) - - // Save the common ancestor - cA := t.CLMock.LatestPayloadBuilt - - // Amount of blocks to deviate starting from the common ancestor - n := 10 - - // Slice to save the side B chain - altChainPayloads := make([]*typ.ExecutableData, 0) - - // Append the common ancestor - altChainPayloads = append(altChainPayloads, &cA) - - // Produce blocks but at the same time create an side chain which contains an invalid payload at some point (INV_P) - // CommonAncestor◄─▲── P1 ◄─ P2 ◄─ P3 ◄─ ... ◄─ Pn - // │ - // └── P1' ◄─ P2' ◄─ ... ◄─ INV_P ◄─ ... ◄─ Pn' - t.CLMock.ProduceBlocks(n, clmock.BlockProcessCallbacks{ - - OnPayloadProducerSelected: func() { - // Function to send at least one transaction each block produced. - // Empty Txs Payload with invalid stateRoot discovered an issue in geth sync, hence this is customizable. - if !emptyTxs { - // Send the transaction to the globals.PrevRandaoContractAddr - _, err := helper.SendNextTransaction( - t.TestContext, - t.CLMock.NextBlockProducer, - &helper.BaseTransactionCreator{ - Recipient: &globals.PrevRandaoContractAddr, - Amount: big1, - Payload: nil, - TxType: t.TestTransactionType, - GasLimit: 75000, - }, - ) - if err != nil { - t.Fatalf("FAIL (%s): Error trying to send transaction: %v", t.TestName, err) - } - } - }, - OnGetPayload: func() { - var ( - sidePayload *typ.ExecutableData - err error - ) - // Insert extraData to ensure we deviate from the main payload, which contains empty extradata - customizer := &helper.CustomPayloadData{ - ParentHash: &altChainPayloads[len(altChainPayloads)-1].BlockHash, - ExtraData: &([]byte{0x01}), - } - sidePayload, _, err = customizer.CustomizePayload(&t.CLMock.LatestPayloadBuilt, t.CLMock.LatestPayloadAttributes.BeaconRoot) - if err != nil { - t.Fatalf("FAIL (%s): Unable to customize payload: %v", t.TestName, err) - } - if len(altChainPayloads) == invalid_index { - sidePayload, _, err = helper.GenerateInvalidPayload(sidePayload, t.CLMock.LatestPayloadAttributes.BeaconRoot, payloadField) - if err != nil { - t.Fatalf("FAIL (%s): Unable to customize payload: %v", t.TestName, err) - } - } - altChainPayloads = append(altChainPayloads, sidePayload) - }, - }) - t.CLMock.ProduceSingleBlock(clmock.BlockProcessCallbacks{ - // Note: We perform the test in the middle of payload creation by the CL Mock, in order to be able to - // re-org back into this chain and use the new payload without issues. - OnGetPayload: func() { - - // Now let's send the side chain to the client using newPayload/sync - for i := 1; i <= n; i++ { - // Send the payload - payloadValidStr := "VALID" - if i == invalid_index { - payloadValidStr = "INVALID" - } else if i > invalid_index { - payloadValidStr = "VALID with INVALID ancestor" - } - t.Logf("INFO (%s): Invalid chain payload %d (%s): %v", t.TestName, i, payloadValidStr, altChainPayloads[i].BlockHash) - - r := t.TestEngine.TestEngineNewPayloadV1(altChainPayloads[i]) - p := t.TestEngine.TestEngineForkchoiceUpdatedV1(&api.ForkchoiceStateV1{ - HeadBlockHash: altChainPayloads[i].BlockHash, - SafeBlockHash: altChainPayloads[i].BlockHash, - FinalizedBlockHash: common.Hash{}, - }, nil) - if i == invalid_index { - // If this is the first payload after the common ancestor, and this is the payload we invalidated, - // then we have all the information to determine that this payload is invalid. - r.ExpectStatus(test.Invalid) - r.ExpectLatestValidHash(&altChainPayloads[i-1].BlockHash) - } else if i > invalid_index { - // We have already sent the invalid payload, but the client could've discarded it. - // In reality the CL will not get to this point because it will have already received the `INVALID` - // response from the previous payload. - // The node might save the parent as invalid, thus returning INVALID - r.ExpectStatusEither(test.Accepted, test.Syncing, test.Invalid) - if r.Status.Status == test.Accepted || r.Status.Status == test.Syncing { - r.ExpectLatestValidHash(nil) - } else if r.Status.Status == test.Invalid { - r.ExpectLatestValidHash(&altChainPayloads[invalid_index-1].BlockHash) - } - } else { - // This is one of the payloads before the invalid one, therefore is valid. - r.ExpectStatus(test.Valid) - p.ExpectPayloadStatus(test.Valid) - p.ExpectLatestValidHash(&altChainPayloads[i].BlockHash) - } - - } - - // Resend the latest correct fcU - r := t.TestEngine.TestEngineForkchoiceUpdatedV1(&t.CLMock.LatestForkchoice, nil) - r.ExpectNoError() - // After this point, the CL Mock will send the next payload of the canonical chain - }, - }) - - } -} - -// Attempt to re-org to a chain which at some point contains an unknown payload which is also invalid. -// Then reveal the invalid payload and expect that the client rejects it and rejects forkchoice updated calls to this chain. -type InvalidMissingAncestorReOrgSpec struct { - // Index of the payload to invalidate, starting with 0 being the common ancestor. - // Value must be greater than 0. - PayloadInvalidIndex int - // Field of the payload to invalidate (see helper module) - PayloadField helper.InvalidPayloadBlockField - // Whether to create payloads with empty transactions or not: - // Used to test scenarios where the stateRoot is invalidated but its invalidation - // goes unnoticed by the client because of the lack of transactions. - EmptyTransactions bool - // Height of the common ancestor in the proof-of-stake chain. - // Value of 0 means the common ancestor is the terminal proof-of-work block. - CommonAncestorHeight *big.Int - // Amount of payloads to produce between the common ancestor and the head of the - // proof-of-stake chain. - DeviatingPayloadCount *big.Int - // Whether the syncing client must re-org from a canonical chain. - // If set to true, the client is driven through a valid canonical chain first, - // and then the client is prompted to re-org to the invalid chain. - // If set to false, the client is prompted to sync from the genesis - // or start chain (if specified). - ReOrgFromCanonical bool -} - -func (spec InvalidMissingAncestorReOrgSpec) GenerateSync() func(*test.Env) { - var ( - invalidIndex = spec.PayloadInvalidIndex - ) - - return func(t *test.Env) { - var ( - err error - secondaryClient *node.GethNode - ) - // To allow having the invalid payload delivered via P2P, we need a second client to serve the payload - starter := node.GethNodeEngineStarter{ - Config: node.GethNodeTestConfiguration{}, - } - if spec.ReOrgFromCanonical { - // If we are doing a re-org from canonical, we can add both nodes as peers from the start - secondaryClient, err = starter.StartGethNode(t.T, t.TestContext, t.Genesis, t.ClientParams, t.ClientFiles, t.Engine) - } else { - secondaryClient, err = starter.StartGethNode(t.T, t.TestContext, t.Genesis, t.ClientParams, t.ClientFiles) - } - if err != nil { - t.Fatalf("FAIL (%s): Unable to spawn a secondary client: %v", t.TestName, err) - } - - t.CLMock.AddEngineClient(secondaryClient) - - if !spec.ReOrgFromCanonical { - // Remove the original client so that it does not receive the payloads created on the canonical chain - t.CLMock.RemoveEngineClient(t.Engine) - } - - // Wait until TTD is reached by this client - t.CLMock.WaitForTTD() - - // Produce blocks before starting the test - var cA *types.Block - - cAHeight := spec.CommonAncestorHeight - if cAHeight == nil { - // Default is to produce 5 PoS blocks before the common ancestor - cAHeight = big.NewInt(5) - } - - // Save the common ancestor - if cAHeight.Cmp(big0) == 0 { - // Common ancestor is the proof-of-work terminal block - ctx, cancel := context.WithTimeout(t.TestContext, globals.RPCTimeout) - defer cancel() - b, err := secondaryClient.BlockByNumber(ctx, nil) - if err != nil { - t.Fatalf("FAIL (%s): Error while getting latest block: %v", t.TestName, err) - } - cA = b - } else { - t.CLMock.ProduceBlocks(int(cAHeight.Int64()), clmock.BlockProcessCallbacks{}) - cA, err = typ.ExecutableDataToBlock(t.CLMock.LatestPayloadBuilt, nil, nil) - if err != nil { - t.Fatalf("FAIL (%s): Error converting payload to block: %v", t.TestName, err) - } - } - - // Amount of blocks to deviate starting from the common ancestor - // Default is to deviate 10 payloads from the common ancestor - n := 10 - if spec.DeviatingPayloadCount != nil { - n = int(spec.DeviatingPayloadCount.Int64()) - } - - // Slice to save the side B chain - altChainPayloads := make([]*types.Block, 0) - - // Append the common ancestor - altChainPayloads = append(altChainPayloads, cA) - - // Produce blocks but at the same time create an side chain which contains an invalid payload at some point (INV_P) - // CommonAncestor◄─▲── P1 ◄─ P2 ◄─ P3 ◄─ ... ◄─ Pn - // │ - // └── P1' ◄─ P2' ◄─ ... ◄─ INV_P ◄─ ... ◄─ Pn' - t.CLMock.ProduceBlocks(n, clmock.BlockProcessCallbacks{ - - OnPayloadProducerSelected: func() { - // Function to send at least one transaction each block produced. - // Empty Txs Payload with invalid stateRoot discovered an issue in geth sync, hence this is customizable. - if !spec.EmptyTransactions { - // Send the transaction to the globals.PrevRandaoContractAddr - _, err := helper.SendNextTransaction( - t.TestContext, - t.CLMock.NextBlockProducer, - &helper.BaseTransactionCreator{ - Recipient: &globals.PrevRandaoContractAddr, - Amount: big1, - Payload: nil, - TxType: t.TestTransactionType, - GasLimit: 75000, - }, - ) - if err != nil { - t.Fatalf("FAIL (%s): Error trying to send transaction: %v", t.TestName, err) - } - } - }, - OnGetPayload: func() { - var ( - sidePayload *typ.ExecutableData - err error - ) - // Insert extraData to ensure we deviate from the main payload, which contains empty extradata - pHash := altChainPayloads[len(altChainPayloads)-1].Hash() - customizer := &helper.CustomPayloadData{ - ParentHash: &pHash, - ExtraData: &([]byte{0x01}), - } - sidePayload, _, err = customizer.CustomizePayload(&t.CLMock.LatestPayloadBuilt, t.CLMock.LatestPayloadAttributes.BeaconRoot) - if err != nil { - t.Fatalf("FAIL (%s): Unable to customize payload: %v", t.TestName, err) - } - if len(altChainPayloads) == invalidIndex { - sidePayload, _, err = helper.GenerateInvalidPayload(sidePayload, t.CLMock.LatestPayloadAttributes.BeaconRoot, spec.PayloadField) - if err != nil { - t.Fatalf("FAIL (%s): Unable to customize payload: %v", t.TestName, err) - } - } - - sideBlock, err := typ.ExecutableDataToBlock(*sidePayload, nil, nil) - if err != nil { - t.Fatalf("FAIL (%s): Error converting payload to block: %v", t.TestName, err) - } - if len(altChainPayloads) == invalidIndex { - var uncle *types.Block - if spec.PayloadField == helper.InvalidOmmers { - if unclePayload, ok := t.CLMock.ExecutedPayloadHistory[sideBlock.NumberU64()-1]; ok && unclePayload != nil { - // Uncle is a PoS payload - uncle, err = typ.ExecutableDataToBlock(*unclePayload, nil, nil) - if err != nil { - t.Fatalf("FAIL (%s): Unable to get uncle block: %v", t.TestName, err) - } - } else { - panic("FAIL: Unable to get uncle block") - } - } - // Invalidate fields not available in the ExecutableData - sideBlock, err = helper.GenerateInvalidPayloadBlock(sideBlock, uncle, spec.PayloadField) - if err != nil { - t.Fatalf("FAIL (%s): Unable to customize payload block: %v", t.TestName, err) - } - } - - altChainPayloads = append(altChainPayloads, sideBlock) - }, - }) - t.CLMock.ProduceSingleBlock(clmock.BlockProcessCallbacks{ - // Note: We perform the test in the middle of payload creation by the CL Mock, in order to be able to - // re-org back into this chain and use the new payload without issues. - OnGetPayload: func() { - - // Now let's send the side chain to the client using newPayload/sync - for i := 1; i < n; i++ { - // Send the payload - payloadValidStr := "VALID" - if i == invalidIndex { - payloadValidStr = "INVALID" - } else if i > invalidIndex { - payloadValidStr = "VALID with INVALID ancestor" - } - payloadJs, _ := json.MarshalIndent(altChainPayloads[i].Header(), "", " ") - t.Logf("INFO (%s): Invalid chain payload %d (%s):\n%s", t.TestName, i, payloadValidStr, payloadJs) - - if i < invalidIndex { - ctx, cancel := context.WithTimeout(t.TestContext, globals.RPCTimeout) - defer cancel() - - p := typ.BlockToExecutableData(altChainPayloads[i], common.Big0) - pv1 := &typ.ExecutableDataV1{} - pv1.FromExecutableData(&p) - status, err := secondaryClient.NewPayloadV1(ctx, pv1) - if err != nil { - t.Fatalf("FAIL (%s): TEST ISSUE - Unable to send new payload: %v", t.TestName, err) - } - if status.Status != "VALID" && status.Status != "ACCEPTED" { - t.Fatalf("FAIL (%s): TEST ISSUE - Invalid payload status, expected VALID, ACCEPTED: %v", t.TestName, status.Status) - } - - ctx, cancel = context.WithTimeout(t.TestContext, globals.RPCTimeout) - defer cancel() - status2, err := secondaryClient.ForkchoiceUpdatedV1(ctx, &api.ForkchoiceStateV1{ - HeadBlockHash: p.BlockHash, - SafeBlockHash: cA.Hash(), - FinalizedBlockHash: common.Hash{}, - }, nil) - if err != nil { - t.Fatalf("FAIL (%s): TEST ISSUE - Unable to send new payload: %v", t.TestName, err) - } - if status2.PayloadStatus.Status != "VALID" && status2.PayloadStatus.Status != "SYNCING" { - t.Fatalf("FAIL (%s): TEST ISSUE - Invalid payload status, expected VALID: %v", t.TestName, status2.PayloadStatus.Status) - } - - } else { - invalidBlock := altChainPayloads[i] - if err != nil { - t.Fatalf("FAIL (%s): TEST ISSUE - Failed to create block from payload: %v", t.TestName, err) - } - - if err := secondaryClient.SetBlock(invalidBlock, altChainPayloads[i-1].NumberU64(), altChainPayloads[i-1].Root()); err != nil { - t.Fatalf("FAIL (%s): TEST ISSUE - Failed to set invalid block: %v", t.TestName, err) - } - t.Logf("INFO (%s): Invalid block successfully set %d (%s): %v", t.TestName, i, payloadValidStr, invalidBlock.Hash()) - } - } - // Check that the second node has the correct head - ctx, cancel := context.WithTimeout(t.TestContext, globals.RPCTimeout) - defer cancel() - head, err := secondaryClient.HeaderByNumber(ctx, nil) - if err != nil { - t.Fatalf("FAIL (%s): TEST ISSUE - Secondary Node unable to reatrieve latest header: %v", t.TestName, err) - - } - if head.Hash() != altChainPayloads[n-1].Hash() { - t.Fatalf("FAIL (%s): TEST ISSUE - Secondary Node has invalid blockhash got %v want %v gotNum %v wantNum %d", t.TestName, head.Hash(), altChainPayloads[n-1].Hash(), head.Number, altChainPayloads[n].NumberU64()) - } else { - t.Logf("INFO (%s): Secondary Node has correct block", t.TestName) - } - - if !spec.ReOrgFromCanonical { - // Add the main client as a peer of the secondary client so it is able to sync - secondaryClient.AddPeer(t.Engine) - - ctx, cancel := context.WithTimeout(t.TimeoutContext, globals.RPCTimeout) - defer cancel() - l, err := t.Eth.BlockByNumber(ctx, nil) - if err != nil { - t.Fatalf("FAIL (%s): Unable to query main client for latest block: %v", t.TestName, err) - } - t.Logf("INFO (%s): Latest block on main client before sync: hash=%v, number=%d", t.TestName, l.Hash(), l.Number()) - } - // If we are syncing through p2p, we need to keep polling until the client syncs the missing payloads - for { - ed := typ.BlockToExecutableData(altChainPayloads[n], common.Big0) - r := t.TestEngine.TestEngineNewPayloadV1(&ed) - t.Logf("INFO (%s): Response from main client: %v", t.TestName, r.Status) - s := t.TestEngine.TestEngineForkchoiceUpdatedV1(&api.ForkchoiceStateV1{ - HeadBlockHash: altChainPayloads[n].Hash(), - SafeBlockHash: altChainPayloads[n].Hash(), - FinalizedBlockHash: common.Hash{}, - }, nil) - t.Logf("INFO (%s): Response from main client fcu: %v", t.TestName, s.Response.PayloadStatus) - - if r.Status.Status == test.Invalid { - // We also expect that the client properly returns the LatestValidHash of the block on the - // side chain that is immediately prior to the invalid payload (or zero if parent is PoW) - var lvh common.Hash - if cAHeight.Cmp(big0) != 0 || invalidIndex != 1 { - // Parent is NOT Proof of Work - lvh = altChainPayloads[invalidIndex-1].Hash() - } - r.ExpectLatestValidHash(&lvh) - // Response on ForkchoiceUpdated should be the same - s.ExpectPayloadStatus(test.Invalid) - s.ExpectLatestValidHash(&lvh) - break - } else if test.PayloadStatus(r.Status.Status) == test.Valid { - ctx, cancel := context.WithTimeout(t.TestContext, globals.RPCTimeout) - defer cancel() - latestBlock, err := t.Eth.BlockByNumber(ctx, nil) - if err != nil { - t.Fatalf("FAIL (%s): Unable to get latest block: %v", t.TestName, err) - } - - // Print last n blocks, for debugging - k := latestBlock.Number().Int64() - int64(n) - if k < 0 { - k = 0 - } - for ; k <= latestBlock.Number().Int64(); k++ { - ctx, cancel = context.WithTimeout(t.TestContext, globals.RPCTimeout) - defer cancel() - latestBlock, err := t.Eth.BlockByNumber(ctx, big.NewInt(k)) - if err != nil { - t.Fatalf("FAIL (%s): Unable to get block %d: %v", t.TestName, k, err) - } - js, _ := json.MarshalIndent(latestBlock.Header(), "", " ") - t.Logf("INFO (%s): Block %d: %s", t.TestName, k, js) - } - - t.Fatalf("FAIL (%s): Client returned VALID on an invalid chain: %v", t.TestName, r.Status) - } - - select { - case <-time.After(time.Second): - continue - case <-t.TimeoutContext.Done(): - t.Fatalf("FAIL (%s): Timeout waiting for main client to detect invalid chain", t.TestName) - } - } - - if !spec.ReOrgFromCanonical { - // We need to send the canonical chain to the main client here - for i := t.CLMock.FirstPoSBlockNumber.Uint64(); i <= t.CLMock.LatestExecutedPayload.Number; i++ { - if payload, ok := t.CLMock.ExecutedPayloadHistory[i]; ok { - r := t.TestEngine.TestEngineNewPayloadV1(payload) - r.ExpectStatus(test.Valid) - } - } - } - - // Resend the latest correct fcU - r := t.TestEngine.TestEngineForkchoiceUpdatedV1(&t.CLMock.LatestForkchoice, nil) - r.ExpectNoError() - // After this point, the CL Mock will send the next payload of the canonical chain - }, - }) - - } -} - -// Test to verify Block information available at the Eth RPC after NewPayload -func blockStatusExecPayload(t *test.Env) { - // Wait until this client catches up with latest PoS Block - t.CLMock.WaitForTTD() - - // Produce blocks before starting the test - t.CLMock.ProduceBlocks(5, clmock.BlockProcessCallbacks{}) - - var tx typ.Transaction - t.CLMock.ProduceSingleBlock(clmock.BlockProcessCallbacks{ - OnPayloadProducerSelected: func() { - var err error - tx, err = helper.SendNextTransaction( - t.TestContext, - t.Engine, &helper.BaseTransactionCreator{ - Recipient: &ZeroAddr, - Amount: big1, - Payload: nil, - TxType: t.TestTransactionType, - GasLimit: 75000, - }, - ) - if err != nil { - t.Fatalf("FAIL (%s): Error trying to send transaction: %v", err) - } - }, - // Run test after the new payload has been broadcasted - OnNewPayloadBroadcast: func() { - r := t.TestEngine.TestHeaderByNumber(Head) - r.ExpectHash(t.CLMock.LatestForkchoice.HeadBlockHash) - - s := t.TestEngine.TestBlockNumber() - s.ExpectNumber(t.CLMock.LatestHeadNumber.Uint64()) - - p := t.TestEngine.TestBlockByNumber(Head) - p.ExpectHash(t.CLMock.LatestForkchoice.HeadBlockHash) - - // Check that the receipt for the transaction we just sent is still not available - q := t.TestEngine.TestTransactionReceipt(tx.Hash()) - q.ExpectError() - }, - }) -} - -// Test to verify Block information available at the Eth RPC after new HeadBlock ForkchoiceUpdated -func blockStatusHeadBlock(t *test.Env) { - // Wait until this client catches up with latest PoS Block - t.CLMock.WaitForTTD() - - // Produce blocks before starting the test - t.CLMock.ProduceBlocks(5, clmock.BlockProcessCallbacks{}) - - var tx typ.Transaction - t.CLMock.ProduceSingleBlock(clmock.BlockProcessCallbacks{ - OnPayloadProducerSelected: func() { - var err error - tx, err = helper.SendNextTransaction( - t.TestContext, - t.Engine, - &helper.BaseTransactionCreator{ - Recipient: &ZeroAddr, - Amount: big1, - Payload: nil, - TxType: t.TestTransactionType, - GasLimit: 75000, - }, - ) - if err != nil { - t.Fatalf("FAIL (%s): Error trying to send transaction: %v", t.TestName, err) - } - }, - // Run test after a forkchoice with new HeadBlockHash has been broadcasted - OnForkchoiceBroadcast: func() { - r := t.TestEngine.TestHeaderByNumber(Head) - r.ExpectHash(t.CLMock.LatestForkchoice.HeadBlockHash) - - s := t.TestEngine.TestTransactionReceipt(tx.Hash()) - s.ExpectTransactionHash(tx.Hash()) - }, - }) -} - -// Test to verify Block information available at the Eth RPC after new SafeBlock ForkchoiceUpdated -func blockStatusSafeBlock(t *test.Env) { - // Wait until this client catches up with latest PoS Block - t.CLMock.WaitForTTD() - - // First ForkchoiceUpdated sent was equal to 0x00..00, `safe` should return error now - p := t.TestEngine.TestHeaderByNumber(Safe) - p.ExpectErrorCode(-39001) - - t.CLMock.ProduceBlocks(3, clmock.BlockProcessCallbacks{ - // Run test after a forkchoice with new SafeBlockHash has been broadcasted - OnSafeBlockChange: func() { - r := t.TestEngine.TestHeaderByNumber(Safe) - r.ExpectHash(t.CLMock.LatestForkchoice.SafeBlockHash) - }, - }) -} - -// Test to verify Block information available at the Eth RPC after new FinalizedBlock ForkchoiceUpdated -func blockStatusFinalizedBlock(t *test.Env) { - // Wait until this client catches up with latest PoS Block - t.CLMock.WaitForTTD() - - // First ForkchoiceUpdated sent was equal to 0x00..00, `finalized` should return error now - p := t.TestEngine.TestHeaderByNumber(Finalized) - p.ExpectErrorCode(-39001) - - t.CLMock.ProduceBlocks(3, clmock.BlockProcessCallbacks{ - // Run test after a forkchoice with new FinalizedBlockHash has been broadcasted - OnFinalizedBlockChange: func() { - r := t.TestEngine.TestHeaderByNumber(Finalized) - r.ExpectHash(t.CLMock.LatestForkchoice.FinalizedBlockHash) - }, - }) -} - -func safeFinalizedCanonicalChain(t *test.Env) { - // Wait until this client catches up with latest PoS Block - t.CLMock.WaitForTTD() - gblock := t.Genesis.ToBlock() - - // At the merge we need to have head equal to the last PoW block, and safe/finalized must return error - h := t.TestEngine.TestHeaderByNumber(Head) - h.ExpectHash(gblock.Hash()) - h = t.TestEngine.TestHeaderByNumber(Safe) - h.ExpectErrorCode(-39001) - h = t.TestEngine.TestHeaderByNumber(Finalized) - h.ExpectErrorCode(-39001) - - // Producing one PoS payload should change only the head (latest) - t.CLMock.ProduceSingleBlock(clmock.BlockProcessCallbacks{}) - h = t.TestEngine.TestHeaderByNumber(Head) - h.ExpectHash(t.CLMock.LatestPayloadBuilt.BlockHash) - h = t.TestEngine.TestHeaderByNumber(Safe) - h.ExpectErrorCode(-39001) - h = t.TestEngine.TestHeaderByNumber(Finalized) - h.ExpectErrorCode(-39001) - - // Producing a second PoS payload should change safe - t.CLMock.ProduceSingleBlock(clmock.BlockProcessCallbacks{}) - h = t.TestEngine.TestHeaderByNumber(Head) - h.ExpectHash(t.CLMock.LatestPayloadBuilt.BlockHash) - h = t.TestEngine.TestHeaderByNumber(Safe) - h.ExpectHash(t.CLMock.ExecutedPayloadHistory[1].BlockHash) - h = t.TestEngine.TestHeaderByNumber(Finalized) - h.ExpectErrorCode(-39001) - - // Producing a third PoS payload should change finalized - t.CLMock.ProduceSingleBlock(clmock.BlockProcessCallbacks{}) - h = t.TestEngine.TestHeaderByNumber(Head) - h.ExpectHash(t.CLMock.LatestPayloadBuilt.BlockHash) - h = t.TestEngine.TestHeaderByNumber(Safe) - h.ExpectHash(t.CLMock.ExecutedPayloadHistory[2].BlockHash) - h = t.TestEngine.TestHeaderByNumber(Finalized) - h.ExpectHash(t.CLMock.ExecutedPayloadHistory[1].BlockHash) - -} - -// Test to verify Block information available after a reorg using forkchoiceUpdated -func blockStatusReorg(t *test.Env) { - // Wait until this client catches up with latest PoS Block - t.CLMock.WaitForTTD() - - // Produce blocks before starting the test - t.CLMock.ProduceBlocks(5, clmock.BlockProcessCallbacks{}) - - t.CLMock.ProduceSingleBlock(clmock.BlockProcessCallbacks{ - OnGetPayload: func() { - // Run using an alternative Payload, verify that the latest info is updated after re-org - customRandom := common.Hash{} - rand.Read(customRandom[:]) - customizer := &helper.CustomPayloadData{ - PrevRandao: &customRandom, - } - customizedPayload, _, err := customizer.CustomizePayload(&t.CLMock.LatestPayloadBuilt, t.CLMock.LatestPayloadAttributes.BeaconRoot) - if err != nil { - t.Fatalf("FAIL (%s): Unable to customize payload: %v", t.TestName, err) - } - - // Send custom payload and fcU to it - t.CLMock.BroadcastNewPayload(customizedPayload, nil, nil, t.CLMock.NewPayloadVersion(customizedPayload.Timestamp)) - t.CLMock.BroadcastForkchoiceUpdated(&api.ForkchoiceStateV1{ - HeadBlockHash: customizedPayload.BlockHash, - SafeBlockHash: t.CLMock.LatestForkchoice.SafeBlockHash, - FinalizedBlockHash: t.CLMock.LatestForkchoice.FinalizedBlockHash, - }, nil, 1) - - // Verify the client is serving the latest HeadBlock - r := t.TestEngine.TestHeaderByNumber(Head) - r.ExpectHash(customizedPayload.BlockHash) - - }, - OnForkchoiceBroadcast: func() { - // At this point, we have re-org'd to the payload that the CLMocker was originally planning to send, - // verify that the client is serving the latest HeadBlock. - r := t.TestEngine.TestHeaderByNumber(Head) - r.ExpectHash(t.CLMock.LatestForkchoice.HeadBlockHash) - - }, - }) - -} - -// Test that performing a re-org back into a previous block of the canonical chain does not produce errors and the chain -// is still capable of progressing. -func reorgBack(t *test.Env) { - // Wait until this client catches up with latest PoS - t.CLMock.WaitForTTD() - - t.CLMock.ProduceSingleBlock(clmock.BlockProcessCallbacks{}) - - // We are going to reorg back to this previous hash several times - previousHash := t.CLMock.LatestForkchoice.HeadBlockHash - - // Produce blocks before starting the test (So we don't try to reorg back to the genesis block) - t.CLMock.ProduceBlocks(5, clmock.BlockProcessCallbacks{ - OnForkchoiceBroadcast: func() { - // Send a fcU with the HeadBlockHash pointing back to the previous block - forkchoiceUpdatedBack := api.ForkchoiceStateV1{ - HeadBlockHash: previousHash, - SafeBlockHash: previousHash, - FinalizedBlockHash: previousHash, - } - - // It is only expected that the client does not produce an error and the CL Mocker is able to progress after the re-org - r := t.TestEngine.TestEngineForkchoiceUpdatedV1(&forkchoiceUpdatedBack, nil) - r.ExpectNoError() - }, - }) - - // Verify that the client is pointing to the latest payload sent - r := t.TestEngine.TestBlockByNumber(Head) - r.ExpectHash(t.CLMock.LatestPayloadBuilt.BlockHash) - -} - -// Test that performs a re-org to a previously validated payload on a side chain. -func reorgPrevValidatedPayloadOnSideChain(t *test.Env) { - // Wait until this client catches up with latest PoS - t.CLMock.WaitForTTD() - - // Produce blocks before starting the test - t.CLMock.ProduceBlocks(5, clmock.BlockProcessCallbacks{}) - - var ( - sidechainPayloads = make([]*typ.ExecutableData, 0) - sidechainPayloadCount = 5 - ) - - // Produce a canonical chain while at the same time generate a side chain to which we will re-org. - t.CLMock.ProduceBlocks(sidechainPayloadCount, clmock.BlockProcessCallbacks{ - OnGetPayload: func() { - // The side chain will consist simply of the same payloads with extra data appended - extraData := []byte("side") - customData := helper.CustomPayloadData{ - ExtraData: &extraData, - } - if len(sidechainPayloads) > 0 { - customData.ParentHash = &sidechainPayloads[len(sidechainPayloads)-1].BlockHash - } - altPayload, _, err := customData.CustomizePayload(&t.CLMock.LatestPayloadBuilt, t.CLMock.LatestPayloadAttributes.BeaconRoot) - if err != nil { - t.Fatalf("FAIL (%s): Unable to customize payload: %v", t.TestName, err) - } - sidechainPayloads = append(sidechainPayloads, altPayload) - - r := t.TestEngine.TestEngineNewPayloadV1(altPayload) - r.ExpectStatus(test.Valid) - r.ExpectLatestValidHash(&altPayload.BlockHash) - }, - }) - - // Attempt to re-org to one of the sidechain payloads, but not the leaf, - // and also build a new payload from this sidechain. - t.CLMock.ProduceSingleBlock(clmock.BlockProcessCallbacks{ - OnGetPayload: func() { - prevRandao := common.Hash{} - rand.Read(prevRandao[:]) - r := t.TestEngine.TestEngineForkchoiceUpdatedV1(&api.ForkchoiceStateV1{ - HeadBlockHash: sidechainPayloads[len(sidechainPayloads)-2].BlockHash, - SafeBlockHash: t.CLMock.LatestForkchoice.SafeBlockHash, - FinalizedBlockHash: t.CLMock.LatestForkchoice.FinalizedBlockHash, - }, &typ.PayloadAttributes{ - Timestamp: t.CLMock.LatestHeader.Time, - Random: prevRandao, - SuggestedFeeRecipient: common.Address{}, - }) - r.ExpectPayloadStatus(test.Valid) - r.ExpectLatestValidHash(&sidechainPayloads[len(sidechainPayloads)-2].BlockHash) - - p := t.TestEngine.TestEngineGetPayloadV1(r.Response.PayloadID) - p.ExpectPayloadParentHash(sidechainPayloads[len(sidechainPayloads)-2].BlockHash) - - s := t.TestEngine.TestEngineNewPayloadV1(&p.Payload) - s.ExpectStatus(test.Valid) - s.ExpectLatestValidHash(&p.Payload.BlockHash) - - // After this, the CLMocker will continue and try to re-org to canonical chain once again - // CLMocker will fail the test if this is not possible, so nothing left to do. - }, - }) -} - -// Test that performs a re-org of the safe block to a side chain. -func safeReorgToSideChain(t *test.Env) { - // Wait until this client catches up with latest PoS - t.CLMock.WaitForTTD() - - // Produce an alternative chain - sidechainPayloads := make([]*typ.ExecutableData, 0) - - // Produce three payloads `P1`, `P2`, `P3`, along with the side chain payloads `P2'`, `P3'` - // First payload is finalized so no alternative payload - t.CLMock.ProduceSingleBlock(clmock.BlockProcessCallbacks{}) - t.CLMock.ProduceBlocks(2, clmock.BlockProcessCallbacks{ - OnGetPayload: func() { - // Generate an alternative payload by simply adding extraData to the block - altParentHash := t.CLMock.LatestPayloadBuilt.ParentHash - if len(sidechainPayloads) > 0 { - altParentHash = sidechainPayloads[len(sidechainPayloads)-1].BlockHash - } - customizer := &helper.CustomPayloadData{ - ParentHash: &altParentHash, - ExtraData: &([]byte{0x01}), - } - altPayload, _, err := customizer.CustomizePayload(&t.CLMock.LatestPayloadBuilt, t.CLMock.LatestPayloadAttributes.BeaconRoot) - if err != nil { - t.Fatalf("FAIL (%s): Unable to customize payload: %v", t.TestName, err) - } - sidechainPayloads = append(sidechainPayloads, altPayload) - }, - }) - - // Verify current state of labels - head := t.TestEngine.TestHeaderByNumber(Head) - head.ExpectHash(t.CLMock.LatestPayloadBuilt.BlockHash) - - safe := t.TestEngine.TestHeaderByNumber(Safe) - safe.ExpectHash(t.CLMock.ExecutedPayloadHistory[2].BlockHash) - - finalized := t.TestEngine.TestHeaderByNumber(Finalized) - finalized.ExpectHash(t.CLMock.ExecutedPayloadHistory[1].BlockHash) - - // Re-org the safe/head blocks to point to the alternative side chain - t.CLMock.ProduceSingleBlock(clmock.BlockProcessCallbacks{ - OnGetPayload: func() { - for _, p := range sidechainPayloads { - r := t.TestEngine.TestEngineNewPayloadV1(p) - r.ExpectStatusEither(test.Valid, test.Accepted) - } - r := t.TestEngine.TestEngineForkchoiceUpdatedV1(&api.ForkchoiceStateV1{ - HeadBlockHash: sidechainPayloads[1].BlockHash, - SafeBlockHash: sidechainPayloads[0].BlockHash, - FinalizedBlockHash: t.CLMock.ExecutedPayloadHistory[1].BlockHash, - }, nil) - r.ExpectPayloadStatus(test.Valid) +var Tests = make([]test.Spec, 0) - head := t.TestEngine.TestHeaderByNumber(Head) - head.ExpectHash(sidechainPayloads[1].BlockHash) - - safe := t.TestEngine.TestHeaderByNumber(Safe) - safe.ExpectHash(sidechainPayloads[0].BlockHash) - - finalized := t.TestEngine.TestHeaderByNumber(Finalized) - finalized.ExpectHash(t.CLMock.ExecutedPayloadHistory[1].BlockHash) - - }, - }) +func pUint64(v uint64) *uint64 { + return &v } -// Test that performs a re-org back to the canonical chain after re-org to syncing/unavailable chain. -func reorgBackFromSyncing(t *test.Env) { - // Wait until this client catches up with latest PoS - t.CLMock.WaitForTTD() +// Register all test combinations for Paris +func init() { + // Register bad hash tests + for _, syncing := range []bool{false, true} { + for _, sidechain := range []bool{false, true} { + Tests = append(Tests, BadHashOnNewPayload{ + Syncing: syncing, + Sidechain: sidechain, + }) + } + } - // Produce an alternative chain - sidechainPayloads := make([]*typ.ExecutableData, 0) - t.CLMock.ProduceBlocks(10, clmock.BlockProcessCallbacks{ - OnGetPayload: func() { - // Generate an alternative payload by simply adding extraData to the block - altParentHash := t.CLMock.LatestPayloadBuilt.ParentHash - if len(sidechainPayloads) > 0 { - altParentHash = sidechainPayloads[len(sidechainPayloads)-1].BlockHash - } - customizer := &helper.CustomPayloadData{ - ParentHash: &altParentHash, - ExtraData: &([]byte{0x01}), - } - altPayload, _, err := customizer.CustomizePayload(&t.CLMock.LatestPayloadBuilt, t.CLMock.LatestPayloadAttributes.BeaconRoot) - if err != nil { - t.Fatalf("FAIL (%s): Unable to customize payload: %v", t.TestName, err) - } - sidechainPayloads = append(sidechainPayloads, altPayload) + // Parent hash == block hash tests + Tests = append(Tests, + ParentHashOnNewPayload{ + Syncing: false, }, - }) - - // Produce blocks before starting the test (So we don't try to reorg back to the genesis block) - t.CLMock.ProduceSingleBlock(clmock.BlockProcessCallbacks{ - OnGetPayload: func() { - r := t.TestEngine.TestEngineNewPayloadV1(sidechainPayloads[len(sidechainPayloads)-1]) - r.ExpectStatusEither(test.Syncing, test.Accepted) - r.ExpectLatestValidHash(nil) - // We are going to send one of the alternative payloads and fcU to it - forkchoiceUpdatedBack := api.ForkchoiceStateV1{ - HeadBlockHash: sidechainPayloads[len(sidechainPayloads)-1].BlockHash, - SafeBlockHash: sidechainPayloads[len(sidechainPayloads)-2].BlockHash, - FinalizedBlockHash: sidechainPayloads[len(sidechainPayloads)-3].BlockHash, - } - - // It is only expected that the client does not produce an error and the CL Mocker is able to progress after the re-org - s := t.TestEngine.TestEngineForkchoiceUpdatedV1(&forkchoiceUpdatedBack, nil) - s.ExpectLatestValidHash(nil) - s.ExpectPayloadStatus(test.Syncing) - - // After this, the CLMocker will continue and try to re-org to canonical chain once again - // CLMocker will fail the test if this is not possible, so nothing left to do. + ParentHashOnNewPayload{ + Syncing: true, }, - }) -} - -// Test transaction status after a forkchoiceUpdated re-orgs to an alternative hash where a transaction is not present -func transactionReorg(t *test.Env) { - // Wait until this client catches up with latest PoS - t.CLMock.WaitForTTD() - - // Produce blocks before starting the test (So we don't try to reorg back to the genesis block) - t.CLMock.ProduceBlocks(5, clmock.BlockProcessCallbacks{}) - - // Create transactions that modify the state in order to check after the reorg. - var ( - txCount = 5 - sstoreContractAddr = common.HexToAddress("0000000000000000000000000000000000000317") ) - for i := 0; i < txCount; i++ { - var ( - noTxnPayload typ.ExecutableData - tx typ.Transaction - ) - // Generate two payloads, one with the transaction and the other one without it - t.CLMock.ProduceSingleBlock(clmock.BlockProcessCallbacks{ - OnPayloadProducerSelected: func() { - // At this point we have not broadcast the transaction, - // therefore any payload we get should not contain any - t.CLMock.RequestNextPayload() - t.CLMock.GetNextPayload() - noTxnPayload = t.CLMock.LatestPayloadBuilt - if len(noTxnPayload.Transactions) != 0 { - t.Fatalf("FAIL (%s): Empty payload contains transactions: %v", t.TestName, noTxnPayload) - } - - // At this point we can broadcast the transaction and it will be included in the next payload - // Data is the key where a `1` will be stored - data := common.LeftPadBytes([]byte{byte(i)}, 32) - t.Logf("transactionReorg, i=%v, data=%v\n", i, data) - var err error - tx, err = helper.SendNextTransaction( - t.TestContext, - t.Engine, - &helper.BaseTransactionCreator{ - Recipient: &sstoreContractAddr, - Amount: big0, - Payload: data, - TxType: t.TestTransactionType, - GasLimit: 75000, - }, - ) - if err != nil { - t.Fatalf("FAIL (%s): Error trying to send transaction: %v", t.TestName, err) - } + // Register RPC tests + for _, field := range []BlockStatusRPCCheckType{ + LatestOnNewPayload, + LatestOnHeadBlockHash, + SafeOnSafeBlockHash, + FinalizedOnFinalizedBlockHash, + } { + Tests = append(Tests, BlockStatus{CheckType: field}) + } - // Get the receipt - ctx, cancel := context.WithTimeout(t.TestContext, globals.RPCTimeout) - defer cancel() - receipt, _ := t.Eth.TransactionReceipt(ctx, tx.Hash()) - if receipt != nil { - t.Fatalf("FAIL (%s): Receipt obtained before tx included in block: %v", t.TestName, receipt) - } + // Register ForkchoiceUpdate tests + for _, field := range []ForkchoiceStateField{ + HeadBlockHash, + SafeBlockHash, + FinalizedBlockHash, + } { + Tests = append(Tests, + InconsistentForkchoiceTest{ + Field: field, }, - OnGetPayload: func() { - // Check that indeed the payload contains the transaction - if !helper.TransactionInPayload(&t.CLMock.LatestPayloadBuilt, tx) { - t.Fatalf("FAIL (%s): Payload built does not contain the transaction: %v", t.TestName, t.CLMock.LatestPayloadBuilt) - } + ForkchoiceUpdatedUnknownBlockHashTest{ + Field: field, }, - OnForkchoiceBroadcast: func() { - // Transaction is now in the head of the canonical chain, re-org and verify it's removed - // Get the receipt - ctx, cancel := context.WithTimeout(t.TestContext, globals.RPCTimeout) - defer cancel() - _, err := t.Eth.TransactionReceipt(ctx, tx.Hash()) - if err != nil { - t.Fatalf("FAIL (%s): Unable to obtain transaction receipt: %v", t.TestName, err) - } - - if noTxnPayload.ParentHash != t.CLMock.LatestPayloadBuilt.ParentHash { - t.Fatalf("FAIL (%s): Incorrect parent hash for payloads: %v != %v", t.TestName, noTxnPayload.ParentHash, t.CLMock.LatestPayloadBuilt.ParentHash) - } - if noTxnPayload.BlockHash == t.CLMock.LatestPayloadBuilt.BlockHash { - t.Fatalf("FAIL (%s): Incorrect hash for payloads: %v == %v", t.TestName, noTxnPayload.BlockHash, t.CLMock.LatestPayloadBuilt.BlockHash) - } - - r := t.TestEngine.TestEngineNewPayloadV1(&noTxnPayload) - r.ExpectStatus(test.Valid) - r.ExpectLatestValidHash(&noTxnPayload.BlockHash) - - s := t.TestEngine.TestEngineForkchoiceUpdatedV1(&api.ForkchoiceStateV1{ - HeadBlockHash: noTxnPayload.BlockHash, - SafeBlockHash: t.CLMock.LatestForkchoice.SafeBlockHash, - FinalizedBlockHash: t.CLMock.LatestForkchoice.FinalizedBlockHash, - }, nil) - s.ExpectPayloadStatus(test.Valid) - - p := t.TestEngine.TestBlockByNumber(Head) - p.ExpectHash(noTxnPayload.BlockHash) - - ctx, cancel = context.WithTimeout(t.TestContext, globals.RPCTimeout) - defer cancel() - reorgReceipt, err := t.Eth.TransactionReceipt(ctx, tx.Hash()) - if reorgReceipt != nil { - t.Fatalf("FAIL (%s): Receipt was obtained when the tx had been re-org'd out: %v", t.TestName, reorgReceipt) - } + ) + } - // Re-org back - t.CLMock.BroadcastForkchoiceUpdated(&t.CLMock.LatestForkchoice, nil, 1) + // Payload Attributes Tests + for _, t := range []InvalidPayloadAttributesTest{ + { + Description: "Zero timestamp", + Customizer: &helper.BasePayloadAttributesCustomizer{ + Timestamp: pUint64(0), }, - }) - + }, + { + Description: "Parent timestamp", + Customizer: &helper.TimestampDeltaPayloadAttributesCustomizer{ + PayloadAttributesCustomizer: &helper.BasePayloadAttributesCustomizer{}, + TimestampDelta: -1, + }, + }, + } { + Tests = append(Tests, t) + t.Syncing = true + Tests = append(Tests, t) } -} - -// Test transaction blockhash after a forkchoiceUpdated re-orgs to an alternative block with the same transaction -func transactionReorgBlockhash(newNPOnRevert bool) func(t *test.Env) { - return func(t *test.Env) { - // Wait until this client catches up with latest PoS - t.CLMock.WaitForTTD() - - // Produce blocks before starting the test (So we don't try to reorg back to the genesis block) - t.CLMock.ProduceBlocks(5, clmock.BlockProcessCallbacks{}) - - // Create transactions that modify the state in order to check after the reorg. - var ( - txCount = 5 - sstoreContractAddr = common.HexToAddress("0000000000000000000000000000000000000317") - ) - - for i := 0; i < txCount; i++ { - var ( - mainPayload *typ.ExecutableData - sidePayload *typ.ExecutableData - tx typ.Transaction - ) - - t.CLMock.ProduceSingleBlock(clmock.BlockProcessCallbacks{ - OnPayloadProducerSelected: func() { - // At this point we have not broadcast the transaction, - // therefore any payload we get should not contain any - t.CLMock.RequestNextPayload() - t.CLMock.GetNextPayload() - - // Create the transaction - data := common.LeftPadBytes([]byte{byte(i)}, 32) - t.Logf("transactionReorg, i=%v, data=%v\n", i, data) - var err error - tx, err = helper.SendNextTransaction( - t.TestContext, - t.Engine, - &helper.BaseTransactionCreator{ - Recipient: &sstoreContractAddr, - Amount: big0, - Payload: data, - TxType: t.TestTransactionType, - GasLimit: 75000, - }, - ) - if err != nil { - t.Fatalf("FAIL (%s): Error trying to send transaction: %v", t.TestName, err) - } + // Payload ID Tests + for _, payloadAttributeFieldChange := range []PayloadAttributesFieldChange{ + PayloadAttributesIncreaseTimestamp, + PayloadAttributesRandom, + PayloadAttributesSuggestedFeeRecipient, + } { + Tests = append(Tests, UniquePayloadIDTest{ + FieldModification: payloadAttributeFieldChange, + }) + } - // Get the receipt - ctx, cancel := context.WithTimeout(t.TestContext, globals.RPCTimeout) - defer cancel() - receipt, _ := t.Eth.TransactionReceipt(ctx, tx.Hash()) - if receipt != nil { - t.Fatalf("FAIL (%s): Receipt obtained before tx included in block: %v", t.TestName, receipt) - } + // Endpoint Versions Tests + // Early upgrade of ForkchoiceUpdated when requesting a payload + Tests = append(Tests, + ForkchoiceUpdatedOnPayloadRequestTest{ + BaseSpec: test.BaseSpec{ + Name: "Early upgrade", + ForkHeight: 2, + }, + ForkchoiceUpdatedCustomizer: &helper.UpgradeForkchoiceUpdatedVersion{ + ForkchoiceUpdatedCustomizer: &helper.BaseForkchoiceUpdatedCustomizer{ + ExpectedError: globals.UNSUPPORTED_FORK_ERROR, }, - OnGetPayload: func() { - // Check that indeed the payload contains the transaction - if !helper.TransactionInPayload(&t.CLMock.LatestPayloadBuilt, tx) { - t.Fatalf("FAIL (%s): Payload built does not contain the transaction: %v", t.TestName, t.CLMock.LatestPayloadBuilt) - } - - mainPayload = &t.CLMock.LatestPayloadBuilt - - // Create side payload with different hash - var err error - customizer := &helper.CustomPayloadData{ - ExtraData: &([]byte{0x01}), - } - sidePayload, _, err = customizer.CustomizePayload(mainPayload, t.CLMock.LatestPayloadAttributes.BeaconRoot) - if err != nil { - t.Fatalf("Error creating reorg payload %v", err) - } - - if sidePayload.ParentHash != mainPayload.ParentHash { - t.Fatalf("FAIL (%s): Incorrect parent hash for payloads: %v != %v", t.TestName, sidePayload.ParentHash, t.CLMock.LatestPayloadBuilt.ParentHash) - } - if sidePayload.BlockHash == mainPayload.BlockHash { - t.Fatalf("FAIL (%s): Incorrect hash for payloads: %v == %v", t.TestName, sidePayload.BlockHash, t.CLMock.LatestPayloadBuilt.BlockHash) - } - + }, + }, + /* + TODO: This test is failing because the upgraded version of the ForkchoiceUpdated does not contain the + expected fields of the following version. + ForkchoiceUpdatedOnHeadBlockUpdateTest{ + BaseSpec: test.BaseSpec{ + Name: "Early upgrade", + ForkHeight: 2, }, - OnForkchoiceBroadcast: func() { - - // At first, the tx will be on main payload - txt := t.TestEngine.TestTransactionReceipt(tx.Hash()) - txt.ExpectBlockHash(mainPayload.BlockHash) - - r := t.TestEngine.TestEngineNewPayloadV1(sidePayload) - r.ExpectStatus(test.Valid) - r.ExpectLatestValidHash(&sidePayload.BlockHash) - - s := t.TestEngine.TestEngineForkchoiceUpdatedV1(&api.ForkchoiceStateV1{ - HeadBlockHash: sidePayload.BlockHash, - SafeBlockHash: t.CLMock.LatestForkchoice.SafeBlockHash, - FinalizedBlockHash: t.CLMock.LatestForkchoice.FinalizedBlockHash, - }, nil) - s.ExpectPayloadStatus(test.Valid) - - p := t.TestEngine.TestBlockByNumber(Head) - p.ExpectHash(sidePayload.BlockHash) - - // Now it should be with sidePayload - txt = t.TestEngine.TestTransactionReceipt(tx.Hash()) - txt.ExpectBlockHash(sidePayload.BlockHash) - - // Re-org back to main payload - if newNPOnRevert { - r = t.TestEngine.TestEngineNewPayloadV1(mainPayload) - r.ExpectStatus(test.Valid) - r.ExpectLatestValidHash(&mainPayload.BlockHash) - } - t.CLMock.BroadcastForkchoiceUpdated(&api.ForkchoiceStateV1{ - HeadBlockHash: mainPayload.BlockHash, - SafeBlockHash: t.CLMock.LatestForkchoice.SafeBlockHash, - FinalizedBlockHash: t.CLMock.LatestForkchoice.FinalizedBlockHash, - }, nil, 1) - - // Not it should be back with main payload - txt = t.TestEngine.TestTransactionReceipt(tx.Hash()) - txt.ExpectBlockHash(mainPayload.BlockHash) + ForkchoiceUpdatedCustomizer: &helper.UpgradeForkchoiceUpdatedVersion{ + ForkchoiceUpdatedCustomizer: &helper.BaseForkchoiceUpdatedCustomizer{ + ExpectedError: globals.UNSUPPORTED_FORK_ERROR, + }, }, - }) - - } - - } -} - -// Reorg to a Sidechain using ForkchoiceUpdated -func sidechainReorg(t *test.Env) { - // Wait until this client catches up with latest PoS - t.CLMock.WaitForTTD() - - // Produce blocks before starting the test - t.CLMock.ProduceBlocks(5, clmock.BlockProcessCallbacks{}) - - // Produce two payloads, send fcU with first payload, check transaction outcome, then reorg, check transaction outcome again + }, + */ + ) - // This single transaction will change its outcome based on the payload - tx, err := helper.SendNextTransaction( - t.TestContext, - t.Engine, - &helper.BaseTransactionCreator{ - Recipient: &globals.PrevRandaoContractAddr, - Amount: big0, - Payload: nil, - TxType: t.TestTransactionType, - GasLimit: 75000, + // Payload Execution Tests + Tests = append(Tests, + ReExecutePayloadTest{}, + InOrderPayloadExecutionTest{}, + MultiplePayloadsExtendingCanonicalChainTest{ + SetHeadToFirstPayloadReceived: true, + }, + MultiplePayloadsExtendingCanonicalChainTest{ + SetHeadToFirstPayloadReceived: false, }, + NewPayloadOnSyncingClientTest{}, + NewPayloadWithMissingFcUTest{}, ) - if err != nil { - t.Fatalf("FAIL (%s): Error trying to send transaction: %v", t.TestName, err) - } - t.Logf("INFO (%s): sent tx %v", t.TestName, tx.Hash()) - - t.CLMock.ProduceSingleBlock(clmock.BlockProcessCallbacks{ - OnNewPayloadBroadcast: func() { - // At this point the CLMocker has a payload that will result in a specific outcome, - // we can produce an alternative payload, send it, fcU to it, and verify the changes - alternativePrevRandao := common.Hash{} - rand.Read(alternativePrevRandao[:]) - r := t.TestEngine.TestEngineForkchoiceUpdatedV1(&t.CLMock.LatestForkchoice, - &typ.PayloadAttributes{ - Timestamp: t.CLMock.LatestHeader.Time + 1, - Random: alternativePrevRandao, - SuggestedFeeRecipient: t.CLMock.NextFeeRecipient, + // Invalid Payload Tests + for _, invalidField := range []helper.InvalidPayloadBlockField{ + helper.InvalidParentHash, + helper.InvalidStateRoot, + helper.InvalidReceiptsRoot, + helper.InvalidNumber, + helper.InvalidGasLimit, + helper.InvalidGasUsed, + helper.InvalidTimestamp, + helper.InvalidPrevRandao, + helper.RemoveTransaction, + } { + for _, syncing := range []bool{false, true} { + if invalidField == helper.InvalidStateRoot { + Tests = append(Tests, InvalidPayloadTestCase{ + InvalidField: invalidField, + Syncing: syncing, + EmptyTransactions: true, }) - r.ExpectNoError() - - time.Sleep(t.CLMock.PayloadProductionClientDelay) - - ctx, cancel := context.WithTimeout(t.TestContext, globals.RPCTimeout) - defer cancel() - alternativePayload, err := t.Engine.GetPayloadV1(ctx, r.Response.PayloadID) - if err != nil { - t.Fatalf("FAIL (%s): Could not get alternative payload: %v", t.TestName, err) - } - if len(alternativePayload.Transactions) == 0 { - t.Fatalf("FAIL (%s): alternative payload does not contain the prevRandao opcode tx", t.TestName) } - - s := t.TestEngine.TestEngineNewPayloadV1(&alternativePayload) - s.ExpectStatus(test.Valid) - s.ExpectLatestValidHash(&alternativePayload.BlockHash) - - // We sent the alternative payload, fcU to it - p := t.TestEngine.TestEngineForkchoiceUpdatedV1(&api.ForkchoiceStateV1{ - HeadBlockHash: alternativePayload.BlockHash, - SafeBlockHash: t.CLMock.LatestForkchoice.SafeBlockHash, - FinalizedBlockHash: t.CLMock.LatestForkchoice.FinalizedBlockHash, - }, nil) - p.ExpectPayloadStatus(test.Valid) - - // PrevRandao should be the alternative prevRandao we sent - checkPrevRandaoValue(t, alternativePrevRandao, alternativePayload.Number) - }, - }) - // The reorg actually happens after the CLMocker continues, - // verify here that the reorg was successful - latestBlockNum := t.CLMock.LatestHeadNumber.Uint64() - checkPrevRandaoValue(t, t.CLMock.PrevRandaoHistory[latestBlockNum], latestBlockNum) - -} - -// Re-Execute Previous Payloads -func reExecPayloads(t *test.Env) { - // Wait until this client catches up with latest PoS - t.CLMock.WaitForTTD() - - // How many Payloads we are going to re-execute - var payloadReExecCount = 10 - - // Create those blocks - t.CLMock.ProduceBlocks(payloadReExecCount, clmock.BlockProcessCallbacks{}) - - // Re-execute the payloads - r := t.TestEngine.TestBlockNumber() - r.ExpectNoError() - lastBlock := r.Number - t.Logf("INFO (%s): Started re-executing payloads at block: %v", t.TestName, lastBlock) - - for i := lastBlock - uint64(payloadReExecCount) + 1; i <= lastBlock; i++ { - payload, found := t.CLMock.ExecutedPayloadHistory[i] - if !found { - t.Fatalf("FAIL (%s): (test issue) Payload with index %d does not exist", i) + Tests = append(Tests, InvalidPayloadTestCase{ + InvalidField: invalidField, + Syncing: syncing, + }) } - - r := t.TestEngine.TestEngineNewPayloadV1(payload) - r.ExpectStatus(test.Valid) - r.ExpectLatestValidHash(&payload.BlockHash) } -} - -// Multiple New Payloads Extending Canonical Chain -func multipleNewCanonicalPayloads(t *test.Env) { - // Wait until this client catches up with latest PoS - t.CLMock.WaitForTTD() - - // Produce blocks before starting the test - t.CLMock.ProduceBlocks(5, clmock.BlockProcessCallbacks{}) - - t.CLMock.ProduceSingleBlock(clmock.BlockProcessCallbacks{ - // Run test after a new payload has been obtained - OnGetPayload: func() { - payloadCount := 80 - basePayload := t.CLMock.LatestPayloadBuilt - - // Fabricate and send multiple new payloads by changing the PrevRandao field - for i := 0; i < payloadCount; i++ { - newPrevRandao := common.Hash{} - rand.Read(newPrevRandao[:]) - customizer := &helper.CustomPayloadData{ - PrevRandao: &newPrevRandao, - } - newPayload, _, err := customizer.CustomizePayload(&basePayload, t.CLMock.LatestPayloadAttributes.BeaconRoot) - if err != nil { - t.Fatalf("FAIL (%s): Unable to customize payload %v: %v", t.TestName, i, err) - } - r := t.TestEngine.TestEngineNewPayloadV1(newPayload) - r.ExpectStatus(test.Valid) - r.ExpectLatestValidHash(&newPayload.BlockHash) - } - }, + Tests = append(Tests, PayloadBuildAfterInvalidPayloadTest{ + InvalidField: helper.InvalidStateRoot, }) - // At the end the CLMocker continues to try to execute fcU with the original payload, which should not fail -} -// Consecutive Payload Execution: Secondary client should be able to set the forkchoiceUpdated to payloads received consecutively -func inOrderPayloads(t *test.Env) { - // Wait until this client catches up with latest PoS - t.CLMock.WaitForTTD() - - // First prepare payloads on a first client, which will also contain multiple transactions - - // We will be also verifying that the transactions are correctly interpreted in the canonical chain, - // prepare a random account to receive funds. - recipient := common.Address{} - rand.Read(recipient[:]) - amountPerTx := big.NewInt(1000) - txPerPayload := 20 - payloadCount := 10 - - t.CLMock.ProduceBlocks(payloadCount, clmock.BlockProcessCallbacks{ - // We send the transactions after we got the Payload ID, before the CLMocker gets the prepared Payload - OnPayloadProducerSelected: func() { - for i := 0; i < txPerPayload; i++ { - _, err := helper.SendNextTransaction( - t.TestContext, - t.CLMock.NextBlockProducer, - &helper.BaseTransactionCreator{ - Recipient: &recipient, - Amount: amountPerTx, - Payload: nil, - TxType: t.TestTransactionType, - GasLimit: 75000, + // Invalid Transaction Payload Tests + for _, invalidField := range []helper.InvalidPayloadBlockField{ + helper.InvalidTransactionSignature, + helper.InvalidTransactionNonce, + helper.InvalidTransactionGasPrice, + helper.InvalidTransactionGasTipPrice, + helper.InvalidTransactionGas, + helper.InvalidTransactionValue, + helper.InvalidTransactionChainID, + } { + for _, syncing := range []bool{false, true} { + if invalidField != helper.InvalidTransactionGasTipPrice { + for _, testTxType := range []helper.TestTransactionType{helper.LegacyTxOnly, helper.DynamicFeeTxOnly} { + Tests = append(Tests, InvalidPayloadTestCase{ + BaseSpec: test.BaseSpec{ + TestTransactionType: testTxType, + }, + InvalidField: invalidField, + Syncing: syncing, + }) + } + } else { + Tests = append(Tests, InvalidPayloadTestCase{ + BaseSpec: test.BaseSpec{ + TestTransactionType: helper.DynamicFeeTxOnly, }, - ) - if err != nil { - t.Fatalf("FAIL (%s): Error trying to send transaction: %v", t.TestName, err) - } - } - }, - OnGetPayload: func() { - if len(t.CLMock.LatestPayloadBuilt.Transactions) != txPerPayload { - t.Fatalf("FAIL (%s): Client failed to include all the expected transactions in payload built: %d < %d", t.TestName, len(t.CLMock.LatestPayloadBuilt.Transactions), txPerPayload) + InvalidField: invalidField, + Syncing: syncing, + }) } - }, - }) - - expectedBalance := amountPerTx.Mul(amountPerTx, big.NewInt(int64(payloadCount*txPerPayload))) - - // Check balance on this first client - r := t.TestEngine.TestBalanceAt(recipient, nil) - r.ExpectBalanceEqual(expectedBalance) - - // Start a second client to send newPayload consecutively without fcU - secondaryClient, err := hive_rpc.HiveRPCEngineStarter{}.StartClient(t.T, t.TestContext, t.Genesis, t.ClientParams, t.ClientFiles) - if err != nil { - t.Fatalf("FAIL (%s): Unable to start secondary client: %v", t.TestName, err) - } - secondaryTestEngineClient := test.NewTestEngineClient(t, secondaryClient) - - // Send the forkchoiceUpdated with the LatestExecutedPayload hash, we should get SYNCING back - fcU := api.ForkchoiceStateV1{ - HeadBlockHash: t.CLMock.LatestExecutedPayload.BlockHash, - SafeBlockHash: t.CLMock.LatestExecutedPayload.BlockHash, - FinalizedBlockHash: t.CLMock.LatestExecutedPayload.BlockHash, - } - - s := secondaryTestEngineClient.TestEngineForkchoiceUpdatedV1(&fcU, nil) - s.ExpectPayloadStatus(test.Syncing) - s.ExpectLatestValidHash(nil) - s.ExpectNoValidationError() - - // Send all the payloads in the opposite order - for k := t.CLMock.FirstPoSBlockNumber.Uint64(); k <= t.CLMock.LatestExecutedPayload.Number; k++ { - payload := t.CLMock.ExecutedPayloadHistory[k] - - s := secondaryTestEngineClient.TestEngineNewPayloadV1(payload) - s.ExpectStatus(test.Valid) - s.ExpectLatestValidHash(&payload.BlockHash) + } } - // Add the client to the CLMocker - t.CLMock.AddEngineClient(secondaryClient) - - // Produce a single block on top of the canonical chain, all clients must accept this - t.CLMock.ProduceSingleBlock(clmock.BlockProcessCallbacks{}) - - // Head must point to the latest produced payload - p := secondaryTestEngineClient.TestBlockByNumber(nil) - p.ExpectHash(t.CLMock.LatestExecutedPayload.BlockHash) - // At this point we should have our funded account balance equal to the expected value. - q := secondaryTestEngineClient.TestBalanceAt(recipient, nil) - q.ExpectBalanceEqual(expectedBalance) - -} - -// Send a valid payload on a client that is currently SYNCING -func validPayloadFcUSyncingClient(t *test.Env) { - var ( - secondaryClient client.EngineClient - previousPayload typ.ExecutableData + // Invalid Transaction ChainID Tests + Tests = append(Tests, + InvalidTxChainIDTest{ + BaseSpec: test.BaseSpec{ + TestTransactionType: helper.LegacyTxOnly, + }, + }, + InvalidTxChainIDTest{ + BaseSpec: test.BaseSpec{ + TestTransactionType: helper.DynamicFeeTxOnly, + }, + }, ) - { - // To allow sending the primary engine client into SYNCING state, we need a secondary client to guide the payload creation - var err error - secondaryClient, err = hive_rpc.HiveRPCEngineStarter{}.StartClient(t.T, t.TestContext, t.Genesis, t.ClientParams, t.ClientFiles) - - if err != nil { - t.Fatalf("FAIL (%s): Unable to spawn a secondary client: %v", t.TestName, err) - } - t.CLMock.AddEngineClient(secondaryClient) - } - - // Wait until TTD is reached by all clients - t.CLMock.WaitForTTD() - - // Produce blocks before starting the test - t.CLMock.ProduceBlocks(5, clmock.BlockProcessCallbacks{}) - - // Disconnect the first engine client from the CL Mocker and produce a block - t.CLMock.RemoveEngineClient(t.Engine) - t.CLMock.ProduceSingleBlock(clmock.BlockProcessCallbacks{}) - - previousPayload = t.CLMock.LatestPayloadBuilt - // Send the fcU to set it to syncing mode - r := t.TestEngine.TestEngineForkchoiceUpdatedV1(&t.CLMock.LatestForkchoice, nil) - r.ExpectPayloadStatus(test.Syncing) - - t.CLMock.ProduceSingleBlock(clmock.BlockProcessCallbacks{ - // Run test after the new payload has been obtained - OnGetPayload: func() { - // Send the new payload from the second client to the first, it won't be able to validate it - r := t.TestEngine.TestEngineNewPayloadV1(&t.CLMock.LatestPayloadBuilt) - r.ExpectStatusEither(test.Accepted, test.Syncing) - r.ExpectLatestValidHash(nil) - - // Send the forkchoiceUpdated with a reference to the valid payload on the SYNCING client. - s := t.TestEngine.TestEngineForkchoiceUpdatedV1(&api.ForkchoiceStateV1{ - HeadBlockHash: t.CLMock.LatestPayloadBuilt.BlockHash, - SafeBlockHash: t.CLMock.LatestPayloadBuilt.BlockHash, - FinalizedBlockHash: t.CLMock.LatestPayloadBuilt.BlockHash, - }, &typ.PayloadAttributes{ - Timestamp: t.CLMock.LatestPayloadBuilt.Timestamp + 1, - Random: common.Hash{}, - SuggestedFeeRecipient: common.Address{}, + // Invalid Ancestor Re-Org Tests (Reveal Via NewPayload) + for _, invalidIndex := range []int{1, 9, 10} { + for _, emptyTxs := range []bool{false, true} { + Tests = append(Tests, InvalidMissingAncestorReOrgTest{ + SidechainLength: 10, + InvalidIndex: invalidIndex, + InvalidField: helper.InvalidStateRoot, + EmptyTransactions: emptyTxs, }) - s.ExpectPayloadStatus(test.Syncing) - - // Send the previous payload to be able to continue - p := t.TestEngine.TestEngineNewPayloadV1(&previousPayload) - p.ExpectStatus(test.Valid) - p.ExpectLatestValidHash(&previousPayload.BlockHash) - - // Send the new payload again - - p = t.TestEngine.TestEngineNewPayloadV1(&t.CLMock.LatestPayloadBuilt) - p.ExpectStatus(test.Valid) - p.ExpectLatestValidHash(&t.CLMock.LatestPayloadBuilt.BlockHash) - - s = t.TestEngine.TestEngineForkchoiceUpdatedV1(&api.ForkchoiceStateV1{ - HeadBlockHash: t.CLMock.LatestPayloadBuilt.BlockHash, - SafeBlockHash: t.CLMock.LatestPayloadBuilt.BlockHash, - FinalizedBlockHash: t.CLMock.LatestPayloadBuilt.BlockHash, - }, nil) - s.ExpectPayloadStatus(test.Valid) - - }, - }) - - // Add the secondary client again to the CL Mocker - t.CLMock.AddEngineClient(t.Engine) - - t.CLMock.RemoveEngineClient(secondaryClient) -} - -// Send a valid `newPayload` in correct order but skip `forkchoiceUpdated` until the last payload -func missingFcu(t *test.Env) { - // Wait until TTD is reached by this client - t.CLMock.WaitForTTD() - - // Get last PoW block hash (genesis) - lastPoWBlockHash := t.TestEngine.TestBlockByNumber(Head).Block.Hash() - - // Produce blocks on the main client, these payloads will be replayed on the secondary client. - t.CLMock.ProduceBlocks(5, clmock.BlockProcessCallbacks{}) - - var secondaryEngineTest *test.TestEngineClient - { - secondaryEngine, err := hive_rpc.HiveRPCEngineStarter{}.StartClient(t.T, t.TestContext, t.Genesis, t.ClientParams, t.ClientFiles) - - if err != nil { - t.Fatalf("FAIL (%s): Unable to spawn a secondary client: %v", t.TestName, err) } - secondaryEngineTest = test.NewTestEngineClient(t, secondaryEngine) - t.CLMock.AddEngineClient(secondaryEngine) - } - - // Send each payload in the correct order but skip the ForkchoiceUpdated for each - for i := t.CLMock.FirstPoSBlockNumber.Uint64(); i <= t.CLMock.LatestHeadNumber.Uint64(); i++ { - payload := t.CLMock.ExecutedPayloadHistory[i] - p := secondaryEngineTest.TestEngineNewPayloadV1(payload) - p.ExpectStatus(test.Valid) - p.ExpectLatestValidHash(&payload.BlockHash) - } - - // Verify that at this point, the client's head still points to the last non-PoS block - r := secondaryEngineTest.TestBlockByNumber(Head) - r.ExpectHash(lastPoWBlockHash) - - // Verify that the head correctly changes after the last ForkchoiceUpdated - fcU := api.ForkchoiceStateV1{ - HeadBlockHash: t.CLMock.ExecutedPayloadHistory[t.CLMock.LatestHeadNumber.Uint64()].BlockHash, - SafeBlockHash: t.CLMock.ExecutedPayloadHistory[t.CLMock.LatestHeadNumber.Uint64()-1].BlockHash, - FinalizedBlockHash: t.CLMock.ExecutedPayloadHistory[t.CLMock.LatestHeadNumber.Uint64()-2].BlockHash, } - p := secondaryEngineTest.TestEngineForkchoiceUpdatedV1(&fcU, nil) - p.ExpectPayloadStatus(test.Valid) - p.ExpectLatestValidHash(&fcU.HeadBlockHash) - - // Now the head should've changed to the latest PoS block - s := secondaryEngineTest.TestBlockByNumber(Head) - s.ExpectHash(fcU.HeadBlockHash) - -} - -// Build on top of the latest valid payload after an invalid payload has been received: -// P <- INV_P, newPayload(INV_P), fcU(head: P, payloadAttributes: attrs) + getPayload(…) -func payloadBuildAfterNewInvalidPayload(t *test.Env) { - // Add a second client to build the invalid payload - secondaryEngine, err := hive_rpc.HiveRPCEngineStarter{}.StartClient(t.T, t.TestContext, t.Genesis, t.ClientParams, t.ClientFiles) - if err != nil { - t.Fatalf("FAIL (%s): Unable to spawn a secondary client: %v", t.TestName, err) + // Invalid Ancestor Re-Org Tests (Reveal Via Sync) + spec := test.BaseSpec{ + TimeoutSeconds: 60, + SlotsToFinalized: big.NewInt(20), } - secondaryEngineTest := test.NewTestEngineClient(t, secondaryEngine) - t.CLMock.AddEngineClient(secondaryEngine) - - // Wait until TTD is reached by this client - t.CLMock.WaitForTTD() - - // Produce blocks before starting the test - t.CLMock.ProduceBlocks(5, clmock.BlockProcessCallbacks{}) - - // Produce another block, but at the same time send an invalid payload from the other client - t.CLMock.ProduceSingleBlock(clmock.BlockProcessCallbacks{ - OnPayloadProducerSelected: func() { - // We are going to use the client that was not selected - // by the CLMocker to produce the invalid payload - invalidPayloadProducer := t.TestEngine - if t.CLMock.NextBlockProducer == invalidPayloadProducer.Engine { - invalidPayloadProducer = secondaryEngineTest - } - var inv_p *typ.ExecutableData - - { - // Get a payload from the invalid payload producer and invalidate it - r := invalidPayloadProducer.TestEngineForkchoiceUpdatedV1(&t.CLMock.LatestForkchoice, &typ.PayloadAttributes{ - Timestamp: t.CLMock.LatestHeader.Time + 1, - Random: common.Hash{}, - SuggestedFeeRecipient: common.Address{}, + for _, invalidField := range []helper.InvalidPayloadBlockField{ + helper.InvalidStateRoot, + helper.InvalidReceiptsRoot, + // TODO: helper.InvalidNumber, Test is causing a panic on the secondary node, disabling for now. + helper.InvalidGasLimit, + helper.InvalidGasUsed, + helper.InvalidTimestamp, + // TODO: helper.InvalidPrevRandao, Test consistently fails with Failed to set invalid block: missing trie node. + helper.RemoveTransaction, + helper.InvalidTransactionSignature, + helper.InvalidTransactionNonce, + helper.InvalidTransactionGas, + helper.InvalidTransactionGasPrice, + helper.InvalidTransactionValue, + // helper.InvalidOmmers, Unsupported now + } { + for _, reOrgFromCanonical := range []bool{false, true} { + invalidIndex := 9 + if invalidField == helper.InvalidReceiptsRoot || + invalidField == helper.InvalidGasLimit || + invalidField == helper.InvalidGasUsed || + invalidField == helper.InvalidTimestamp || + invalidField == helper.InvalidPrevRandao { + invalidIndex = 8 + } + if invalidField == helper.InvalidStateRoot { + Tests = append(Tests, InvalidMissingAncestorReOrgSyncTest{ + BaseSpec: spec, + InvalidField: invalidField, + ReOrgFromCanonical: reOrgFromCanonical, + EmptyTransactions: true, + InvalidIndex: invalidIndex, }) - r.ExpectPayloadStatus(test.Valid) - // Wait for the payload to be produced by the EL - time.Sleep(time.Second) - - s := invalidPayloadProducer.TestEngineGetPayloadV1(r.Response.PayloadID) - s.ExpectNoError() - - inv_p, _, err = helper.GenerateInvalidPayload(&s.Payload, t.CLMock.LatestPayloadAttributes.BeaconRoot, helper.InvalidStateRoot) - if err != nil { - t.Fatalf("FAIL (%s): Unable to invalidate payload: %v", t.TestName, err) - } } + Tests = append(Tests, InvalidMissingAncestorReOrgSyncTest{ + BaseSpec: spec, + InvalidField: invalidField, + ReOrgFromCanonical: reOrgFromCanonical, + InvalidIndex: invalidIndex, + }) + } + } - // Broadcast the invalid payload - r := t.TestEngine.TestEngineNewPayloadV1(inv_p) - r.ExpectStatus(test.Invalid) - r.ExpectLatestValidHash(&t.CLMock.LatestForkchoice.HeadBlockHash) - s := secondaryEngineTest.TestEngineNewPayloadV1(inv_p) - s.ExpectStatus(test.Invalid) - s.ExpectLatestValidHash(&t.CLMock.LatestForkchoice.HeadBlockHash) + // Re-org using the Engine API tests - // Let the block production continue. - // At this point the selected payload producer will - // try to continue creating a valid payload. + // Sidechain re-org tests + Tests = append(Tests, + SidechainReOrgTest{}, + ReOrgBackFromSyncingTest{ + BaseSpec: test.BaseSpec{ + SlotsToSafe: big.NewInt(32), + SlotsToFinalized: big.NewInt(64), + }, }, - }) -} - -// Attempt to produce a payload after a transaction with an invalid Chain ID was sent to the client -// using `eth_sendRawTransaction`. -func buildPayloadWithInvalidChainIDTx(t *test.Env) { - // Wait until TTD is reached by this client - t.CLMock.WaitForTTD() - - // Produce blocks before starting the test - t.CLMock.ProduceBlocks(5, clmock.BlockProcessCallbacks{}) - - // Send a transaction with an incorrect ChainID. - // Transaction must be not be included in payload creation. - var invalidChainIDTx *types.Transaction - t.CLMock.ProduceSingleBlock(clmock.BlockProcessCallbacks{ - // Run test after a new payload has been broadcast - OnPayloadProducerSelected: func() { - ctx, cancel := context.WithTimeout(t.TestContext, globals.RPCTimeout) - defer cancel() - nonce, err := t.CLMock.NextBlockProducer.NonceAt(ctx, globals.VaultAccountAddress, nil) - if err != nil { - t.Fatalf("FAIL(%s): Unable to get address nonce: %v", t.TestName, err) - } - txData := &types.LegacyTx{ - Nonce: nonce, - To: &globals.PrevRandaoContractAddr, - Value: big0, - Gas: 75000, - GasPrice: globals.GasPrice, - Data: nil, - } - invalidChainID := new(big.Int).Set(globals.ChainID) - invalidChainID.Add(invalidChainID, big1) - invalidChainIDTx, err := types.SignTx(types.NewTx(txData), types.NewLondonSigner(invalidChainID), globals.VaultKey) - if err != nil { - t.Fatalf("FAIL(%s): Unable to sign tx with invalid chain ID: %v", t.TestName, err) - } - ctx, cancel = context.WithTimeout(t.TestContext, globals.RPCTimeout) - defer cancel() - err = t.Engine.SendTransaction(ctx, invalidChainIDTx) - if err != nil { - t.Logf("INFO (%s): Error on sending transaction with incorrect chain ID (Expected): %v", t.TestName, err) - } + ReOrgPrevValidatedPayloadOnSideChainTest{ + BaseSpec: test.BaseSpec{ + SlotsToSafe: big.NewInt(32), + SlotsToFinalized: big.NewInt(64), + }, }, - }) - - // Verify that the latest payload built does NOT contain the invalid chain Tx - if helper.TransactionInPayload(&t.CLMock.LatestPayloadBuilt, invalidChainIDTx) { - p, _ := json.MarshalIndent(t.CLMock.LatestPayloadBuilt, "", " ") - t.Fatalf("FAIL (%s): Invalid chain ID tx was included in payload: %s", t.TestName, p) - } - -} - -// Fee Recipient Tests -func suggestedFeeRecipient(t *test.Env) { - // Wait until this client catches up with latest PoS - t.CLMock.WaitForTTD() - - // Amount of transactions to send - txCount := 20 - - // Verify that, in a block with transactions, fees are accrued by the suggestedFeeRecipient - feeRecipient := common.Address{} - rand.Read(feeRecipient[:]) - - // Send multiple transactions - for i := 0; i < txCount; i++ { - _, err := helper.SendNextTransaction( - t.TestContext, - t.Engine, - &helper.BaseTransactionCreator{ - Recipient: &globals.VaultAccountAddress, - Amount: big0, - Payload: nil, - TxType: t.TestTransactionType, - GasLimit: 75000, + SafeReOrgToSideChainTest{ + BaseSpec: test.BaseSpec{ + SlotsToSafe: big.NewInt(1), + SlotsToFinalized: big.NewInt(2), }, - ) - if err != nil { - t.Fatalf("FAIL (%s): Error trying to send transaction: %v", t.TestName, err) - } - } - // Produce the next block with the fee recipient set - t.CLMock.NextFeeRecipient = feeRecipient - t.CLMock.ProduceSingleBlock(clmock.BlockProcessCallbacks{}) - - // Calculate the fees and check that they match the balance of the fee recipient - r := t.TestEngine.TestBlockByNumber(Head) - r.ExpectTransactionCountEqual(txCount) - r.ExpectCoinbase(feeRecipient) - blockIncluded := r.Block - - feeRecipientFees := big.NewInt(0) - for _, tx := range blockIncluded.Transactions() { - effGasTip, err := tx.EffectiveGasTip(blockIncluded.BaseFee()) - if err != nil { - t.Fatalf("FAIL (%s): unable to obtain EffectiveGasTip: %v", t.TestName, err) - } - ctx, cancel := context.WithTimeout(t.TestContext, globals.RPCTimeout) - defer cancel() - receipt, err := t.Eth.TransactionReceipt(ctx, tx.Hash()) - if err != nil { - t.Fatalf("FAIL (%s): unable to obtain receipt: %v", t.TestName, err) - } - feeRecipientFees = feeRecipientFees.Add(feeRecipientFees, effGasTip.Mul(effGasTip, big.NewInt(int64(receipt.GasUsed)))) - } - - s := t.TestEngine.TestBalanceAt(feeRecipient, nil) - s.ExpectBalanceEqual(feeRecipientFees) - - // Produce another block without txns and get the balance again - t.CLMock.NextFeeRecipient = feeRecipient - t.CLMock.ProduceSingleBlock(clmock.BlockProcessCallbacks{}) - - s = t.TestEngine.TestBalanceAt(feeRecipient, nil) - s.ExpectBalanceEqual(feeRecipientFees) - -} - -// TODO: Do a PENDING block suggestedFeeRecipient - -func checkPrevRandaoValue(t *test.Env, expectedPrevRandao common.Hash, blockNumber uint64) { - storageKey := common.Hash{} - storageKey[31] = byte(blockNumber) - r := t.TestEngine.TestStorageAt(globals.PrevRandaoContractAddr, storageKey, nil) - r.ExpectStorageEqual(expectedPrevRandao) + }, + ) -} + // Re-org a transaction out of a block, or into a new block + Tests = append(Tests, + TransactionReOrgTest{ + ReorgOut: true, + }, + TransactionReOrgTest{ + ReorgDifferentBlock: true, + }, + TransactionReOrgTest{ + ReorgDifferentBlock: true, + NewPayloadOnRevert: true, + }, + ) -// PrevRandao Opcode tests -func prevRandaoOpcodeTx(t *test.Env) { - t.CLMock.WaitForTTD() + // Re-Org back into the canonical chain tests + Tests = append(Tests, + ReOrgBackToCanonicalTest{ + BaseSpec: test.BaseSpec{ + SlotsToSafe: big.NewInt(10), + SlotsToFinalized: big.NewInt(20), + TimeoutSeconds: 60, + }, + TransactionPerPayload: 1, + ReOrgDepth: 5, + }, + ReOrgBackToCanonicalTest{ + BaseSpec: test.BaseSpec{ + SlotsToSafe: big.NewInt(32), + SlotsToFinalized: big.NewInt(64), + TimeoutSeconds: 120, + }, + TransactionPerPayload: 50, + ReOrgDepth: 10, + ExecuteSidePayloadOnReOrg: true, + }, + ) - // Send transactions in PoS, the value of the storage in these blocks must match the prevRandao value - var ( - txCount = 10 - currentTxIndex = 0 - txs = make([]typ.Transaction, 0) + // Suggested Fee Recipient Tests + Tests = append(Tests, + SuggestedFeeRecipientTest{ + BaseSpec: test.BaseSpec{ + TestTransactionType: helper.LegacyTxOnly, + }, + TransactionCount: 20, + }, + SuggestedFeeRecipientTest{ + BaseSpec: test.BaseSpec{ + TestTransactionType: helper.DynamicFeeTxOnly, + }, + TransactionCount: 20, + }, ) - t.CLMock.ProduceBlocks(txCount, clmock.BlockProcessCallbacks{ - OnPayloadProducerSelected: func() { - tx, err := helper.SendNextTransaction( - t.TestContext, - t.Engine, - &helper.BaseTransactionCreator{ - Recipient: &globals.PrevRandaoContractAddr, - Amount: big0, - Payload: nil, - TxType: t.TestTransactionType, - GasLimit: 75000, - }, - ) - if err != nil { - t.Fatalf("FAIL (%s): Error trying to send transaction: %v", t.TestName, err) - } - txs = append(txs, tx) - currentTxIndex++ + + // PrevRandao opcode tests + Tests = append(Tests, + PrevRandaoTransactionTest{ + BaseSpec: test.BaseSpec{ + TestTransactionType: helper.LegacyTxOnly, + }, }, - OnForkchoiceBroadcast: func() { - // Check the transaction tracing, which is client specific - expectedPrevRandao := t.CLMock.PrevRandaoHistory[t.CLMock.LatestHeader.Number.Uint64()+1] - ctx, cancel := context.WithTimeout(t.TestContext, globals.RPCTimeout) - defer cancel() - if err := helper.DebugPrevRandaoTransaction(ctx, t.Client.RPC(), t.Client.Type, txs[currentTxIndex-1], - &expectedPrevRandao); err != nil { - t.Fatalf("FAIL (%s): Error during transaction tracing: %v", t.TestName, err) - } + PrevRandaoTransactionTest{ + BaseSpec: test.BaseSpec{ + TestTransactionType: helper.DynamicFeeTxOnly, + }, }, - }) + ) - ctx, cancel := context.WithTimeout(t.TestContext, globals.RPCTimeout) - defer cancel() - lastBlockNumber, err := t.Eth.BlockNumber(ctx) - if err != nil { - t.Fatalf("FAIL (%s): Unable to get latest block number: %v", t.TestName, err) - } - for i := uint64(1); i <= lastBlockNumber; i++ { - checkPrevRandaoValue(t, t.CLMock.PrevRandaoHistory[i], i) + // Fork ID Tests + for genesisTimestamp := uint64(0); genesisTimestamp <= 1; genesisTimestamp++ { + for forkTime := uint64(0); forkTime <= 2; forkTime++ { + for prevForkTime := uint64(0); prevForkTime <= forkTime; prevForkTime++ { + for currentBlock := 0; currentBlock <= 1; currentBlock++ { + Tests = append(Tests, + ForkIDSpec{ + BaseSpec: test.BaseSpec{ + MainFork: config.Paris, + GenesisTimestamp: pUint64(genesisTimestamp), + ForkTime: forkTime, + PreviousForkTime: prevForkTime, + }, + ProduceBlocksBeforePeering: currentBlock, + }, + ) + } + } + } } - } diff --git a/simulators/ethereum/engine/suites/engine/versioning.go b/simulators/ethereum/engine/suites/engine/versioning.go new file mode 100644 index 0000000000..52230455a6 --- /dev/null +++ b/simulators/ethereum/engine/suites/engine/versioning.go @@ -0,0 +1,131 @@ +package suite_engine + +import ( + api "github.com/ethereum/go-ethereum/beacon/engine" + "github.com/ethereum/hive/simulators/ethereum/engine/clmock" + "github.com/ethereum/hive/simulators/ethereum/engine/config" + "github.com/ethereum/hive/simulators/ethereum/engine/helper" + "github.com/ethereum/hive/simulators/ethereum/engine/test" +) + +// Test versioning of the Engine API methods + +type EngineNewPayloadVersionTest struct { + test.BaseSpec +} + +func (s EngineNewPayloadVersionTest) WithMainFork(fork config.Fork) test.Spec { + specCopy := s + specCopy.MainFork = fork + return specCopy +} + +// Test modifying the ForkchoiceUpdated version on Payload Request to the previous/upcoming version +// when the timestamp payload attribute does not match the upgraded/downgraded version. +type ForkchoiceUpdatedOnPayloadRequestTest struct { + test.BaseSpec + helper.ForkchoiceUpdatedCustomizer +} + +func (s ForkchoiceUpdatedOnPayloadRequestTest) WithMainFork(fork config.Fork) test.Spec { + specCopy := s + specCopy.MainFork = fork + return specCopy +} + +func (tc ForkchoiceUpdatedOnPayloadRequestTest) GetName() string { + return "ForkchoiceUpdated Version on Payload Request: " + tc.BaseSpec.GetName() +} + +func (tc ForkchoiceUpdatedOnPayloadRequestTest) Execute(t *test.Env) { + // Wait until TTD is reached by this client + t.CLMock.WaitForTTD() + + t.CLMock.ProduceSingleBlock(clmock.BlockProcessCallbacks{ + OnPayloadAttributesGenerated: func() { + var ( + payloadAttributes = &t.CLMock.LatestPayloadAttributes + expectedStatus test.PayloadStatus = test.Valid + expectedError *int + err error + ) + tc.SetEngineAPIVersionResolver(t.ForkConfig) + testEngine := t.TestEngine.WithEngineAPIVersionResolver(tc.ForkchoiceUpdatedCustomizer) + payloadAttributes, err = tc.GetPayloadAttributes(payloadAttributes) + if err != nil { + t.Fatalf("FAIL: Error getting custom payload attributes: %v", err) + } + expectedError, err = tc.GetExpectedError() + if err != nil { + t.Fatalf("FAIL: Error getting custom expected error: %v", err) + } + if tc.GetExpectInvalidStatus() { + expectedStatus = test.Invalid + } + + r := testEngine.TestEngineForkchoiceUpdated(&t.CLMock.LatestForkchoice, payloadAttributes, t.CLMock.LatestHeader.Time) + r.ExpectationDescription = tc.Expectation + if expectedError != nil { + r.ExpectErrorCode(*expectedError) + } else { + r.ExpectNoError() + r.ExpectPayloadStatus(expectedStatus) + } + }, + }) +} + +// Test modifying the ForkchoiceUpdated version on HeadBlockHash update to the previous/upcoming +// version when the timestamp payload attribute does not match the upgraded/downgraded version. +type ForkchoiceUpdatedOnHeadBlockUpdateTest struct { + test.BaseSpec + helper.ForkchoiceUpdatedCustomizer +} + +func (s ForkchoiceUpdatedOnHeadBlockUpdateTest) WithMainFork(fork config.Fork) test.Spec { + specCopy := s + specCopy.MainFork = fork + return specCopy +} + +func (tc ForkchoiceUpdatedOnHeadBlockUpdateTest) GetName() string { + return "ForkchoiceUpdated Version on Head Set: " + tc.BaseSpec.GetName() +} + +func (tc ForkchoiceUpdatedOnHeadBlockUpdateTest) Execute(t *test.Env) { + // Wait until TTD is reached by this client + t.CLMock.WaitForTTD() + + t.CLMock.ProduceSingleBlock(clmock.BlockProcessCallbacks{ + OnPayloadAttributesGenerated: func() { + var ( + forkchoiceState *api.ForkchoiceStateV1 = &api.ForkchoiceStateV1{ + HeadBlockHash: t.CLMock.LatestPayloadBuilt.BlockHash, + SafeBlockHash: t.CLMock.LatestForkchoice.SafeBlockHash, + FinalizedBlockHash: t.CLMock.LatestForkchoice.FinalizedBlockHash, + } + expectedError *int + expectedStatus test.PayloadStatus = test.Valid + err error + ) + tc.SetEngineAPIVersionResolver(t.ForkConfig) + testEngine := t.TestEngine.WithEngineAPIVersionResolver(tc.ForkchoiceUpdatedCustomizer) + expectedError, err = tc.GetExpectedError() + if err != nil { + t.Fatalf("FAIL: Error getting custom expected error: %v", err) + } + if tc.GetExpectInvalidStatus() { + expectedStatus = test.Invalid + } + + r := testEngine.TestEngineForkchoiceUpdated(forkchoiceState, nil, t.CLMock.LatestPayloadBuilt.Timestamp) + r.ExpectationDescription = tc.Expectation + if expectedError != nil { + r.ExpectErrorCode(*expectedError) + } else { + r.ExpectNoError() + r.ExpectPayloadStatus(expectedStatus) + } + }, + }) +} diff --git a/simulators/ethereum/engine/suites/exchange_capabilities/tests.go b/simulators/ethereum/engine/suites/exchange_capabilities/tests.go index bbf3630787..26872516eb 100644 --- a/simulators/ethereum/engine/suites/exchange_capabilities/tests.go +++ b/simulators/ethereum/engine/suites/exchange_capabilities/tests.go @@ -1,84 +1,85 @@ package suite_exchange_capabilities import ( - "math/big" + "fmt" + "github.com/ethereum/hive/simulators/ethereum/engine/config" "github.com/ethereum/hive/simulators/ethereum/engine/globals" "github.com/ethereum/hive/simulators/ethereum/engine/test" "golang.org/x/exp/slices" ) -var ( - ShanghaiCapabilities = []string{ +var CapabilitiesMap = map[config.Fork][]string{ + config.Shanghai: { "engine_newPayloadV1", "engine_newPayloadV2", "engine_forkchoiceUpdatedV1", "engine_forkchoiceUpdatedV2", "engine_getPayloadV1", "engine_getPayloadV2", - } - CancunCapabilities = []string{ + }, + config.Cancun: { "engine_newPayloadV1", "engine_newPayloadV2", "engine_newPayloadV3", "engine_forkchoiceUpdatedV1", "engine_forkchoiceUpdatedV2", + "engine_forkchoiceUpdatedV3", "engine_getPayloadV1", "engine_getPayloadV2", "engine_getPayloadV3", - } -) - -var Tests = []test.SpecInterface{ - - // Shanghai - ExchangeCapabilitiesSpec{ - Spec: test.Spec{ - Name: "Exchange Capabilities - Shanghai", - ForkConfig: globals.ForkConfig{ - ShanghaiTimestamp: big.NewInt(0), - }, - }, - MinimalExpectedCapabilitiesSet: ShanghaiCapabilities, - }, - ExchangeCapabilitiesSpec{ - Spec: test.Spec{ - Name: "Exchange Capabilities - Shanghai (Not active)", - ForkConfig: globals.ForkConfig{ - ShanghaiTimestamp: big.NewInt(1000), - }, - }, - MinimalExpectedCapabilitiesSet: ShanghaiCapabilities, }, +} - // Cancun - ExchangeCapabilitiesSpec{ - Spec: test.Spec{ - Name: "Exchange Capabilities - Cancun", - ForkConfig: globals.ForkConfig{ - ShanghaiTimestamp: big.NewInt(0), - CancunTimestamp: big.NewInt(0), - }, - }, - MinimalExpectedCapabilitiesSet: CancunCapabilities, - }, - ExchangeCapabilitiesSpec{ - Spec: test.Spec{ - Name: "Exchange Capabilities - Cancun (Not active)", - ForkConfig: globals.ForkConfig{ - ShanghaiTimestamp: big.NewInt(0), - CancunTimestamp: big.NewInt(1000), - }, - }, - MinimalExpectedCapabilitiesSet: CancunCapabilities, - }, +var Tests = make([]test.Spec, 0) + +func init() { + for _, fork := range []config.Fork{ + config.Shanghai, + config.Cancun, + } { + // Each fork we test: + // - The fork is configured and active + // - The fork is configured but not active + capabilities, ok := CapabilitiesMap[fork] + if !ok { + panic("Capabilities not defined for fork") + } + for _, active := range []bool{true, false} { + var ( + nameStr string + forkTime uint64 + ) + if active { + nameStr = "Active" + forkTime = 0 + } else { + nameStr = "Not active" + forkTime = globals.GenesisTimestamp * 2 + } + Tests = append(Tests, ExchangeCapabilitiesSpec{ + BaseSpec: test.BaseSpec{ + Name: fmt.Sprintf("Exchange Capabilities - %s (%s)", fork, nameStr), + MainFork: fork, + ForkTime: forkTime, + }, + MinimalExpectedCapabilitiesSet: capabilities, + }) + } + } } type ExchangeCapabilitiesSpec struct { - test.Spec + test.BaseSpec MinimalExpectedCapabilitiesSet []string } +func (s ExchangeCapabilitiesSpec) WithMainFork(fork config.Fork) test.Spec { + specCopy := s + specCopy.MainFork = fork + return specCopy +} + func (s ExchangeCapabilitiesSpec) Execute(t *test.Env) { if returnedCapabilities, err := t.HiveEngine.ExchangeCapabilities(t.TestContext, s.MinimalExpectedCapabilitiesSet); err != nil { t.Fatalf("FAIL (%s): Unable request capabilities: %v", t.TestName, err) diff --git a/simulators/ethereum/engine/suites/sync/tests.go b/simulators/ethereum/engine/suites/sync/tests.go index ee565ef5d7..e94de670cb 100644 --- a/simulators/ethereum/engine/suites/sync/tests.go +++ b/simulators/ethereum/engine/suites/sync/tests.go @@ -15,7 +15,7 @@ import ( "github.com/ethereum/hive/simulators/ethereum/engine/test" ) -var Tests = []test.Spec{ +var Tests = []test.BaseSpec{ { Name: "Sync Client Post Merge", Run: postMergeSync, @@ -33,7 +33,7 @@ var Tests = []test.Spec{ } // Routine that adds all sync tests to a test suite -func AddSyncTestsToSuite(sim *hivesim.Simulation, suite *hivesim.Suite, tests []test.Spec) { +func AddSyncTestsToSuite(sim *hivesim.Simulation, suite *hivesim.Suite, tests []test.BaseSpec) { clientDefs, err := sim.ClientTypes() if err != nil { panic(err) @@ -99,7 +99,7 @@ func AddSyncTestsToSuite(sim *hivesim.Simulation, suite *hivesim.Suite, tests [] } // Run the test case - test.Run(currentTest, big.NewInt(ttd), timeout, t, c, &genesis, nil, syncClientParams, testFiles.Copy()) + test.Run(¤tTest, big.NewInt(ttd), timeout, t, c, &genesis, syncClientParams, testFiles.Copy()) }, }) } diff --git a/simulators/ethereum/engine/suites/withdrawals/tests.go b/simulators/ethereum/engine/suites/withdrawals/tests.go index 2e09aadd3a..3a647d65c1 100644 --- a/simulators/ethereum/engine/suites/withdrawals/tests.go +++ b/simulators/ethereum/engine/suites/withdrawals/tests.go @@ -16,6 +16,7 @@ import ( "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/hive/simulators/ethereum/engine/client/hive_rpc" "github.com/ethereum/hive/simulators/ethereum/engine/clmock" + "github.com/ethereum/hive/simulators/ethereum/engine/config" "github.com/ethereum/hive/simulators/ethereum/engine/globals" "github.com/ethereum/hive/simulators/ethereum/engine/helper" "github.com/ethereum/hive/simulators/ethereum/engine/test" @@ -45,9 +46,9 @@ var ( // https://github.com/ethereum/execution-apis/blob/main/src/engine/specification.md // List of all withdrawals tests -var Tests = []test.SpecInterface{ +var Tests = []test.Spec{ &WithdrawalsBaseSpec{ - Spec: test.Spec{ + BaseSpec: test.BaseSpec{ Name: "Withdrawals Fork On Genesis", About: ` Tests the withdrawals fork happening since genesis (e.g. on a @@ -60,7 +61,7 @@ var Tests = []test.SpecInterface{ }, &WithdrawalsBaseSpec{ - Spec: test.Spec{ + BaseSpec: test.BaseSpec{ Name: "Withdrawals Fork on Block 1", About: ` Tests the withdrawals fork happening directly after genesis. @@ -72,7 +73,7 @@ var Tests = []test.SpecInterface{ }, &WithdrawalsBaseSpec{ - Spec: test.Spec{ + BaseSpec: test.BaseSpec{ Name: "Withdrawals Fork on Block 2", About: ` Tests the transition to the withdrawals fork after a single block @@ -87,7 +88,7 @@ var Tests = []test.SpecInterface{ }, &WithdrawalsBaseSpec{ - Spec: test.Spec{ + BaseSpec: test.BaseSpec{ Name: "Withdrawals Fork on Block 3", About: ` Tests the transition to the withdrawals fork after two blocks @@ -102,7 +103,7 @@ var Tests = []test.SpecInterface{ }, &WithdrawalsBaseSpec{ - Spec: test.Spec{ + BaseSpec: test.BaseSpec{ Name: "Withdraw to a single account", About: ` Make multiple withdrawals to a single account. @@ -115,7 +116,7 @@ var Tests = []test.SpecInterface{ }, &WithdrawalsBaseSpec{ - Spec: test.Spec{ + BaseSpec: test.BaseSpec{ Name: "Withdraw to two accounts", About: ` Make multiple withdrawals to two different accounts, repeated in @@ -132,7 +133,7 @@ var Tests = []test.SpecInterface{ }, &WithdrawalsBaseSpec{ - Spec: test.Spec{ + BaseSpec: test.BaseSpec{ Name: "Withdraw many accounts", About: ` Make multiple withdrawals to MAINNET_MAX_WITHDRAWAL_COUNT_PER_BLOCK * 5 different accounts. @@ -147,7 +148,7 @@ var Tests = []test.SpecInterface{ }, &WithdrawalsBaseSpec{ - Spec: test.Spec{ + BaseSpec: test.BaseSpec{ Name: "Withdraw zero amount", About: ` Make multiple withdrawals where the amount withdrawn is 0. @@ -164,7 +165,7 @@ var Tests = []test.SpecInterface{ }, &WithdrawalsBaseSpec{ - Spec: test.Spec{ + BaseSpec: test.BaseSpec{ Name: "Empty Withdrawals", About: ` Produce withdrawals block with zero withdrawals. @@ -176,7 +177,7 @@ var Tests = []test.SpecInterface{ }, &WithdrawalsBaseSpec{ - Spec: test.Spec{ + BaseSpec: test.BaseSpec{ Name: "Corrupted Block Hash Payload (INVALID)", About: ` Send a valid payload with a corrupted hash using engine_newPayloadV2. @@ -190,7 +191,7 @@ var Tests = []test.SpecInterface{ // Block value tests &BlockValueSpec{ WithdrawalsBaseSpec: &WithdrawalsBaseSpec{ - Spec: test.Spec{ + BaseSpec: test.BaseSpec{ Name: "GetPayloadV2 Block Value", About: ` Verify the block value returned in GetPayloadV2. @@ -204,7 +205,7 @@ var Tests = []test.SpecInterface{ // Sync Tests &WithdrawalsSyncSpec{ WithdrawalsBaseSpec: &WithdrawalsBaseSpec{ - Spec: test.Spec{ + BaseSpec: test.BaseSpec{ Name: "Sync after 2 blocks - Withdrawals on Block 1 - Single Withdrawal Account - No Transactions", About: ` - Spawn a first client @@ -225,7 +226,7 @@ var Tests = []test.SpecInterface{ }, &WithdrawalsSyncSpec{ WithdrawalsBaseSpec: &WithdrawalsBaseSpec{ - Spec: test.Spec{ + BaseSpec: test.BaseSpec{ Name: "Sync after 2 blocks - Withdrawals on Block 1 - Single Withdrawal Account", About: ` - Spawn a first client @@ -244,7 +245,7 @@ var Tests = []test.SpecInterface{ }, &WithdrawalsSyncSpec{ WithdrawalsBaseSpec: &WithdrawalsBaseSpec{ - Spec: test.Spec{ + BaseSpec: test.BaseSpec{ Name: "Sync after 2 blocks - Withdrawals on Genesis - Single Withdrawal Account", About: ` - Spawn a first client, with Withdrawals since genesis @@ -262,7 +263,7 @@ var Tests = []test.SpecInterface{ }, &WithdrawalsSyncSpec{ WithdrawalsBaseSpec: &WithdrawalsBaseSpec{ - Spec: test.Spec{ + BaseSpec: test.BaseSpec{ Name: "Sync after 2 blocks - Withdrawals on Block 2 - Multiple Withdrawal Accounts - No Transactions", About: ` - Spawn a first client @@ -282,7 +283,7 @@ var Tests = []test.SpecInterface{ }, &WithdrawalsSyncSpec{ WithdrawalsBaseSpec: &WithdrawalsBaseSpec{ - Spec: test.Spec{ + BaseSpec: test.BaseSpec{ Name: "Sync after 2 blocks - Withdrawals on Block 2 - Multiple Withdrawal Accounts", About: ` - Spawn a first client @@ -301,7 +302,7 @@ var Tests = []test.SpecInterface{ }, &WithdrawalsSyncSpec{ WithdrawalsBaseSpec: &WithdrawalsBaseSpec{ - Spec: test.Spec{ + BaseSpec: test.BaseSpec{ Name: "Sync after 128 blocks - Withdrawals on Block 2 - Multiple Withdrawal Accounts", About: ` - Spawn a first client @@ -323,7 +324,7 @@ var Tests = []test.SpecInterface{ //Re-Org tests &WithdrawalsReorgSpec{ WithdrawalsBaseSpec: &WithdrawalsBaseSpec{ - Spec: test.Spec{ + BaseSpec: test.BaseSpec{ Name: "Withdrawals Fork on Block 1 - 1 Block Re-Org", About: ` Tests a simple 1 block re-org @@ -341,7 +342,7 @@ var Tests = []test.SpecInterface{ }, &WithdrawalsReorgSpec{ WithdrawalsBaseSpec: &WithdrawalsBaseSpec{ - Spec: test.Spec{ + BaseSpec: test.BaseSpec{ Name: "Withdrawals Fork on Block 1 - 8 Block Re-Org NewPayload", About: ` Tests a 8 block re-org using NewPayload @@ -360,7 +361,7 @@ var Tests = []test.SpecInterface{ }, &WithdrawalsReorgSpec{ WithdrawalsBaseSpec: &WithdrawalsBaseSpec{ - Spec: test.Spec{ + BaseSpec: test.BaseSpec{ Name: "Withdrawals Fork on Block 1 - 8 Block Re-Org, Sync", About: ` Tests a 8 block re-org using NewPayload @@ -379,7 +380,7 @@ var Tests = []test.SpecInterface{ }, &WithdrawalsReorgSpec{ WithdrawalsBaseSpec: &WithdrawalsBaseSpec{ - Spec: test.Spec{ + BaseSpec: test.BaseSpec{ Name: "Withdrawals Fork on Block 8 - 10 Block Re-Org NewPayload", About: ` Tests a 10 block re-org using NewPayload @@ -399,7 +400,7 @@ var Tests = []test.SpecInterface{ }, &WithdrawalsReorgSpec{ WithdrawalsBaseSpec: &WithdrawalsBaseSpec{ - Spec: test.Spec{ + BaseSpec: test.BaseSpec{ Name: "Withdrawals Fork on Block 8 - 10 Block Re-Org Sync", About: ` Tests a 10 block re-org using sync @@ -419,7 +420,7 @@ var Tests = []test.SpecInterface{ }, &WithdrawalsReorgSpec{ WithdrawalsBaseSpec: &WithdrawalsBaseSpec{ - Spec: test.Spec{ + BaseSpec: test.BaseSpec{ Name: "Withdrawals Fork on Canonical Block 8 / Side Block 7 - 10 Block Re-Org", About: ` Tests a 10 block re-org using NewPayload @@ -440,7 +441,7 @@ var Tests = []test.SpecInterface{ }, &WithdrawalsReorgSpec{ WithdrawalsBaseSpec: &WithdrawalsBaseSpec{ - Spec: test.Spec{ + BaseSpec: test.BaseSpec{ Name: "Withdrawals Fork on Canonical Block 8 / Side Block 7 - 10 Block Re-Org Sync", About: ` Tests a 10 block re-org using sync @@ -461,7 +462,7 @@ var Tests = []test.SpecInterface{ }, &WithdrawalsReorgSpec{ WithdrawalsBaseSpec: &WithdrawalsBaseSpec{ - Spec: test.Spec{ + BaseSpec: test.BaseSpec{ Name: "Withdrawals Fork on Canonical Block 8 / Side Block 9 - 10 Block Re-Org", About: ` Tests a 10 block re-org using NewPayload @@ -483,7 +484,7 @@ var Tests = []test.SpecInterface{ }, &WithdrawalsReorgSpec{ WithdrawalsBaseSpec: &WithdrawalsBaseSpec{ - Spec: test.Spec{ + BaseSpec: test.BaseSpec{ Name: "Withdrawals Fork on Canonical Block 8 / Side Block 9 - 10 Block Re-Org Sync", About: ` Tests a 10 block re-org using sync @@ -508,7 +509,7 @@ var Tests = []test.SpecInterface{ // EVM Tests (EIP-3651, EIP-3855, EIP-3860) &MaxInitcodeSizeSpec{ WithdrawalsBaseSpec: &WithdrawalsBaseSpec{ - Spec: test.Spec{ + BaseSpec: test.BaseSpec{ Name: "Max Initcode Size", }, WithdrawalsForkHeight: 2, // Block 1 is Pre-Withdrawals @@ -521,7 +522,7 @@ var Tests = []test.SpecInterface{ // Get Payload Bodies Requests &GetPayloadBodiesSpec{ WithdrawalsBaseSpec: &WithdrawalsBaseSpec{ - Spec: test.Spec{ + BaseSpec: test.BaseSpec{ Name: "GetPayloadBodiesByRange", About: ` Make multiple withdrawals to MAINNET_MAX_WITHDRAWAL_COUNT_PER_BLOCK accounts each payload. @@ -594,7 +595,7 @@ var Tests = []test.SpecInterface{ &GetPayloadBodiesSpec{ WithdrawalsBaseSpec: &WithdrawalsBaseSpec{ - Spec: test.Spec{ + BaseSpec: test.BaseSpec{ Name: "GetPayloadBodies After Sync", About: ` Make multiple withdrawals to MAINNET_MAX_WITHDRAWAL_COUNT_PER_BLOCK accounts each payload. @@ -644,7 +645,7 @@ var Tests = []test.SpecInterface{ &GetPayloadBodiesSpec{ WithdrawalsBaseSpec: &WithdrawalsBaseSpec{ - Spec: test.Spec{ + BaseSpec: test.BaseSpec{ Name: "GetPayloadBodiesByRange (Sidechain)", About: ` Make multiple withdrawals to MAINNET_MAX_WITHDRAWAL_COUNT_PER_BLOCK accounts each payload. @@ -675,7 +676,7 @@ var Tests = []test.SpecInterface{ &GetPayloadBodiesSpec{ WithdrawalsBaseSpec: &WithdrawalsBaseSpec{ - Spec: test.Spec{ + BaseSpec: test.BaseSpec{ Name: "GetPayloadBodiesByRange (Empty Transactions/Withdrawals)", About: ` Make no withdrawals and no transactions in many payloads. @@ -707,7 +708,7 @@ var Tests = []test.SpecInterface{ }, &GetPayloadBodiesSpec{ WithdrawalsBaseSpec: &WithdrawalsBaseSpec{ - Spec: test.Spec{ + BaseSpec: test.BaseSpec{ Name: "GetPayloadBodiesByHash", About: ` Make multiple withdrawals to MAINNET_MAX_WITHDRAWAL_COUNT_PER_BLOCK accounts each payload. @@ -760,7 +761,7 @@ var Tests = []test.SpecInterface{ &GetPayloadBodiesSpec{ WithdrawalsBaseSpec: &WithdrawalsBaseSpec{ - Spec: test.Spec{ + BaseSpec: test.BaseSpec{ Name: "GetPayloadBodiesByHash (Empty Transactions/Withdrawals)", About: ` Make no withdrawals and no transactions in many payloads. @@ -785,7 +786,7 @@ var Tests = []test.SpecInterface{ &GetPayloadBodiesSpec{ WithdrawalsBaseSpec: &WithdrawalsBaseSpec{ - Spec: test.Spec{ + BaseSpec: test.BaseSpec{ Name: "GetPayloadBodies Parallel", About: ` Make multiple withdrawals to MAINNET_MAX_WITHDRAWAL_COUNT_PER_BLOCK accounts each payload. @@ -906,7 +907,7 @@ func (wh WithdrawalsHistory) Copy() WithdrawalsHistory { // Specifies a simple withdrawals test where the withdrawals fork can happen // on genesis or afterwards. type WithdrawalsBaseSpec struct { - test.Spec + test.BaseSpec TimeIncrements uint64 // Timestamp increments per block throughout the test WithdrawalsForkHeight uint64 // Withdrawals activation fork height WithdrawalsBlockCount uint64 // Number of blocks on and after withdrawals fork activation @@ -939,8 +940,8 @@ func (ws *WithdrawalsBaseSpec) GetWithdrawalsForkTime() uint64 { } // Generates the fork config, including withdrawals fork timestamp. -func (ws *WithdrawalsBaseSpec) GetForkConfig() globals.ForkConfig { - return globals.ForkConfig{ +func (ws *WithdrawalsBaseSpec) GetForkConfig() *config.ForkConfig { + return &config.ForkConfig{ ShanghaiTimestamp: big.NewInt(int64(ws.GetWithdrawalsForkTime())), } } @@ -973,7 +974,7 @@ func AddUnconditionalBytecode(g *core.Genesis, start *big.Int, end *big.Int) { // Append the accounts we are going to withdraw to, which should also include // bytecode for testing purposes. func (ws *WithdrawalsBaseSpec) GetGenesis() *core.Genesis { - genesis := ws.Spec.GetGenesis() + genesis := ws.BaseSpec.GetGenesis() // Add some accounts to withdraw to with unconditional SSTOREs startAccount := big.NewInt(0x1000) @@ -1123,7 +1124,7 @@ func (ws *WithdrawalsBaseSpec) Execute(t *test.Env) { // contain `withdrawalsRoot`, including genesis. // Genesis should not contain `withdrawalsRoot` either - r := t.TestEngine.TestBlockByNumber(nil) + r := t.TestEngine.TestHeaderByNumber(nil) r.ExpectationDescription = ` Requested "latest" block expecting genesis to contain withdrawalRoot=nil, because genesis.timestamp < shanghaiTime @@ -1131,7 +1132,7 @@ func (ws *WithdrawalsBaseSpec) Execute(t *test.Env) { r.ExpectWithdrawalsRoot(nil) } else { // Genesis is post shanghai, it should contain EmptyWithdrawalsRoot - r := t.TestEngine.TestBlockByNumber(nil) + r := t.TestEngine.TestHeaderByNumber(nil) r.ExpectationDescription = ` Requested "latest" block expecting genesis to contain withdrawalRoot=EmptyTrieRoot, because genesis.timestamp >= shanghaiTime @@ -1148,15 +1149,16 @@ func (ws *WithdrawalsBaseSpec) Execute(t *test.Env) { var destAddr = TX_CONTRACT_ADDRESSES[int(i)%len(TX_CONTRACT_ADDRESSES)] - _, err := helper.SendNextTransaction( + _, err := t.SendNextTransaction( t.TestContext, t.CLMock.NextBlockProducer, &helper.BaseTransactionCreator{ - Recipient: &destAddr, - Amount: common.Big1, - Payload: nil, - TxType: t.TestTransactionType, - GasLimit: 75000, + Recipient: &destAddr, + Amount: common.Big1, + Payload: nil, + TxType: t.TestTransactionType, + GasLimit: 75000, + ForkConfig: t.ForkConfig, }, ) @@ -1208,14 +1210,13 @@ func (ws *WithdrawalsBaseSpec) Execute(t *test.Env) { // Send produced payload but try to include non-nil // `withdrawals`, it should fail. emptyWithdrawalsList := make(types.Withdrawals, 0) - customizer := &helper.CustomPayloadData{ + payloadWithEmptyWithdrawalsList, err := (&helper.CustomPayloadData{ Withdrawals: emptyWithdrawalsList, - } - payloadPlusWithdrawals, _, err := customizer.CustomizePayload(&t.CLMock.LatestPayloadBuilt, t.CLMock.LatestPayloadAttributes.BeaconRoot) + }).CustomizePayload(&t.CLMock.LatestPayloadBuilt) if err != nil { t.Fatalf("Unable to append withdrawals: %v", err) } - r := t.TestEngine.TestEngineNewPayloadV2(payloadPlusWithdrawals) + r := t.TestEngine.TestEngineNewPayloadV2(payloadWithEmptyWithdrawalsList) r.ExpectationDescription = "Sent pre-shanghai payload using NewPayloadV2+Withdrawals, error is expected" r.ExpectErrorCode(InvalidParamsError) @@ -1229,7 +1230,7 @@ func (ws *WithdrawalsBaseSpec) Execute(t *test.Env) { if !ws.SkipBaseVerifications { // We sent a pre-shanghai FCU. // Keep expecting `nil` until Shanghai. - r := t.TestEngine.TestBlockByNumber(nil) + r := t.TestEngine.TestHeaderByNumber(nil) r.ExpectationDescription = fmt.Sprintf(` Requested "latest" block expecting block to contain withdrawalRoot=nil, because (block %d).timestamp < shanghaiTime @@ -1281,15 +1282,16 @@ func (ws *WithdrawalsBaseSpec) Execute(t *test.Env) { for i := uint64(0); i < ws.GetTransactionCountPerPayload(); i++ { var destAddr = TX_CONTRACT_ADDRESSES[int(i)%len(TX_CONTRACT_ADDRESSES)] - _, err := helper.SendNextTransaction( + _, err := t.SendNextTransaction( t.TestContext, t.CLMock.NextBlockProducer, &helper.BaseTransactionCreator{ - Recipient: &destAddr, - Amount: common.Big1, - Payload: nil, - TxType: t.TestTransactionType, - GasLimit: 75000, + Recipient: &destAddr, + Amount: common.Big1, + Payload: nil, + TxType: t.TestTransactionType, + GasLimit: 75000, + ForkConfig: t.ForkConfig, }, ) @@ -1304,10 +1306,9 @@ func (ws *WithdrawalsBaseSpec) Execute(t *test.Env) { // with null, and client must respond with `InvalidParamsError`. // Note that StateRoot is also incorrect but null withdrawals should // be checked first instead of responding `INVALID` - customizer := &helper.CustomPayloadData{ + nilWithdrawalsPayload, err := (&helper.CustomPayloadData{ RemoveWithdrawals: true, - } - nilWithdrawalsPayload, _, err := customizer.CustomizePayload(&t.CLMock.LatestPayloadBuilt, t.CLMock.LatestPayloadAttributes.BeaconRoot) + }).CustomizePayload(&t.CLMock.LatestPayloadBuilt) if err != nil { t.Fatalf("Unable to append withdrawals: %v", err) } @@ -1393,7 +1394,7 @@ func (ws *WithdrawalsBaseSpec) Execute(t *test.Env) { ) } // Check the correct withdrawal root on `latest` block - r := t.TestEngine.TestBlockByNumber(nil) + r := t.TestEngine.TestHeaderByNumber(nil) expectedWithdrawalsRoot := helper.ComputeWithdrawalsRoot( ws.WithdrawalsHistory.GetWithdrawals( t.CLMock.LatestExecutedPayload.Number, @@ -1419,7 +1420,7 @@ func (ws *WithdrawalsBaseSpec) Execute(t *test.Env) { ws.WithdrawalsHistory.VerifyWithdrawals(block, big.NewInt(int64(block)), t.TestEngine) // Check the correct withdrawal root on past blocks - r := t.TestEngine.TestBlockByNumber(big.NewInt(int64(block))) + r := t.TestEngine.TestHeaderByNumber(big.NewInt(int64(block))) var expectedWithdrawalsRoot *common.Hash = nil if block >= ws.WithdrawalsForkHeight { calcWithdrawalsRoot := helper.ComputeWithdrawalsRoot( @@ -1567,6 +1568,8 @@ func (ws *WithdrawalsReorgSpec) Execute(t *test.Env) { // Sidechain withdraws on the max account value range 0xffffffffffffffffffffffffffffffffffffffff sidechainStartAccount.Sub(sidechainStartAccount, big.NewInt(int64(ws.GetWithdrawableAccountCount())+1)) + var sidechainPayloadAttributes *typ.PayloadAttributes + t.CLMock.ProduceBlocks(int(ws.GetPreWithdrawalsBlockCount()+ws.WithdrawalsBlockCount), clmock.BlockProcessCallbacks{ OnPayloadProducerSelected: func() { t.CLMock.NextWithdrawals = nil @@ -1592,15 +1595,16 @@ func (ws *WithdrawalsReorgSpec) Execute(t *test.Env) { }, OnRequestNextPayload: func() { // Send transactions to be included in the payload - txs, err := helper.SendNextTransactions( + txs, err := t.SendNextTransactionsBatch( t.TestContext, t.CLMock.NextBlockProducer, &helper.BaseTransactionCreator{ - Recipient: &globals.PrevRandaoContractAddr, - Amount: common.Big1, - Payload: nil, - TxType: t.TestTransactionType, - GasLimit: 75000, + Recipient: &globals.PrevRandaoContractAddr, + Amount: common.Big1, + Payload: nil, + TxType: t.TestTransactionType, + GasLimit: 75000, + ForkConfig: t.ForkConfig, }, ws.GetTransactionCountPerPayload(), ) @@ -1625,30 +1629,25 @@ func (ws *WithdrawalsReorgSpec) Execute(t *test.Env) { } } - var version int - pAttributes := typ.PayloadAttributes{ + sidechainPayloadAttributes = &typ.PayloadAttributes{ Random: t.CLMock.LatestPayloadAttributes.Random, SuggestedFeeRecipient: t.CLMock.LatestPayloadAttributes.SuggestedFeeRecipient, } if t.CLMock.CurrentPayloadNumber > ws.GetSidechainSplitHeight() { - pAttributes.Timestamp = sidechain[t.CLMock.CurrentPayloadNumber-1].Timestamp + uint64(ws.GetSidechainBlockTimeIncrements()) + sidechainPayloadAttributes.Timestamp = sidechain[t.CLMock.CurrentPayloadNumber-1].Timestamp + uint64(ws.GetSidechainBlockTimeIncrements()) } else if t.CLMock.CurrentPayloadNumber == ws.GetSidechainSplitHeight() { - pAttributes.Timestamp = t.CLMock.LatestHeader.Time + uint64(ws.GetSidechainBlockTimeIncrements()) + sidechainPayloadAttributes.Timestamp = t.CLMock.LatestHeader.Time + uint64(ws.GetSidechainBlockTimeIncrements()) } else { - pAttributes.Timestamp = t.CLMock.LatestPayloadAttributes.Timestamp + sidechainPayloadAttributes.Timestamp = t.CLMock.LatestPayloadAttributes.Timestamp } if t.CLMock.CurrentPayloadNumber >= ws.GetSidechainWithdrawalsForkHeight() { // Withdrawals - version = 2 - pAttributes.Withdrawals = sidechainWithdrawalsHistory[t.CLMock.CurrentPayloadNumber] - } else { - // No withdrawals - version = 1 + sidechainPayloadAttributes.Withdrawals = sidechainWithdrawalsHistory[t.CLMock.CurrentPayloadNumber] } - t.Logf("INFO (%s): Requesting sidechain payload %d: %v", t.TestName, t.CLMock.CurrentPayloadNumber, pAttributes) + t.Logf("INFO (%s): Requesting sidechain payload %d: %v", t.TestName, t.CLMock.CurrentPayloadNumber, sidechainPayloadAttributes) - r := secondaryEngineTest.TestEngineForkchoiceUpdated(&fcU, &pAttributes, version) + r := secondaryEngineTest.TestEngineForkchoiceUpdated(&fcU, sidechainPayloadAttributes, sidechainPayloadAttributes.Timestamp) r.ExpectNoError() r.ExpectPayloadStatus(test.Valid) if r.Response.PayloadID == nil { @@ -1659,17 +1658,14 @@ func (ws *WithdrawalsReorgSpec) Execute(t *test.Env) { }, OnGetPayload: func() { var ( - version int payload *typ.ExecutableData ) - if t.CLMock.CurrentPayloadNumber >= ws.GetSidechainWithdrawalsForkHeight() { - version = 2 - } else { - version = 1 - } if t.CLMock.LatestPayloadBuilt.Number >= ws.GetSidechainSplitHeight() { + if sidechainPayloadAttributes == nil { + panic("sidechain payload attributes not set") + } // This payload is built by the secondary client, hence need to manually fetch it here - r := secondaryEngineTest.TestEngineGetPayload(sidechainPayloadId, version) + r := secondaryEngineTest.TestEngineGetPayload(sidechainPayloadId, sidechainPayloadAttributes) r.ExpectNoError() payload = &r.Payload sidechain[payload.Number] = payload @@ -1677,14 +1673,14 @@ func (ws *WithdrawalsReorgSpec) Execute(t *test.Env) { // This block is part of both chains, simply forward it to the secondary client payload = &t.CLMock.LatestPayloadBuilt } - r := secondaryEngineTest.TestEngineNewPayload(payload, nil, nil, version) + r := secondaryEngineTest.TestEngineNewPayload(payload) r.ExpectStatus(test.Valid) p := secondaryEngineTest.TestEngineForkchoiceUpdated( &beacon.ForkchoiceStateV1{ HeadBlockHash: payload.BlockHash, }, nil, - version, + payload.Timestamp, ) p.ExpectPayloadStatus(test.Valid) }, @@ -1753,8 +1749,8 @@ func (ws *WithdrawalsReorgSpec) Execute(t *test.Env) { case <-t.TimeoutContext.Done(): t.Fatalf("FAIL (%s): Timeout waiting for sync", t.TestName) case <-time.After(time.Second): - b := t.TestEngine.TestBlockByNumber(nil) - if b.Block.Hash() == sidechain[sidechainHeight].BlockHash { + h := t.TestEngine.TestHeaderByNumber(nil) + if h.Header.Hash() == sidechain[sidechainHeight].BlockHash { // sync successful break loop } @@ -1767,21 +1763,15 @@ func (ws *WithdrawalsReorgSpec) Execute(t *test.Env) { if !ok { t.Fatalf("FAIL (%s): Invalid payload %d requested.", t.TestName, payloadNumber) } - var version int - if payloadNumber >= ws.GetSidechainWithdrawalsForkHeight() { - version = 2 - } else { - version = 1 - } t.Logf("INFO (%s): Sending sidechain payload %d, hash=%s, parent=%s", t.TestName, payloadNumber, payload.BlockHash, payload.ParentHash) - r := t.TestEngine.TestEngineNewPayload(payload, nil, nil, version) + r := t.TestEngine.TestEngineNewPayload(payload) r.ExpectStatusEither(test.Valid, test.Accepted) p := t.TestEngine.TestEngineForkchoiceUpdated( &beacon.ForkchoiceStateV1{ HeadBlockHash: payload.BlockHash, }, nil, - version, + payload.Timestamp, ) p.ExpectPayloadStatus(test.Valid) } @@ -1823,17 +1813,20 @@ type MaxInitcodeSizeSpec struct { func (s *MaxInitcodeSizeSpec) Execute(t *test.Env) { t.CLMock.WaitForTTD() - + invalidTxSender := globals.TestAccounts[0] invalidTxCreator := &helper.BigInitcodeTransactionCreator{ InitcodeLength: MAX_INITCODE_SIZE + 1, BaseTransactionCreator: helper.BaseTransactionCreator{ - GasLimit: 2000000, + GasLimit: 2000000, + ForkConfig: t.ForkConfig, }, } + validTxSender := globals.TestAccounts[1] validTxCreator := &helper.BigInitcodeTransactionCreator{ InitcodeLength: MAX_INITCODE_SIZE, BaseTransactionCreator: helper.BaseTransactionCreator{ - GasLimit: 2000000, + GasLimit: 2000000, + ForkConfig: t.ForkConfig, }, } @@ -1843,7 +1836,7 @@ func (s *MaxInitcodeSizeSpec) Execute(t *test.Env) { } for i := uint64(0); i < s.OverflowMaxInitcodeTxCountBeforeFork; i++ { - tx, err := invalidTxCreator.MakeTransaction(i) + tx, err := invalidTxCreator.MakeTransaction(invalidTxSender, i, t.CLMock.LatestHeader.Time) if err != nil { t.Fatalf("FAIL: Error creating max initcode transaction: %v", err) } @@ -1880,7 +1873,7 @@ func (s *MaxInitcodeSizeSpec) Execute(t *test.Env) { // Send transactions after the fork for i := txIncluded; i < (txIncluded + s.OverflowMaxInitcodeTxCountAfterFork); i++ { - tx, err := invalidTxCreator.MakeTransaction(i) + tx, err := invalidTxCreator.MakeTransaction(validTxSender, i, t.CLMock.LatestHeader.Time) if err != nil { t.Fatalf("FAIL: Error creating max initcode transaction: %v", err) } @@ -1896,8 +1889,8 @@ func (s *MaxInitcodeSizeSpec) Execute(t *test.Env) { // Try to include an invalid tx in new payload var ( - validTx, _ = validTxCreator.MakeTransaction(txIncluded) - invalidTx, _ = invalidTxCreator.MakeTransaction(txIncluded) + validTx, _ = validTxCreator.MakeTransaction(invalidTxSender, txIncluded, t.CLMock.LatestHeader.Time) + invalidTx, _ = invalidTxCreator.MakeTransaction(validTxSender, txIncluded, t.CLMock.LatestHeader.Time) ) t.CLMock.ProduceSingleBlock(clmock.BlockProcessCallbacks{ OnPayloadProducerSelected: func() { @@ -1914,7 +1907,7 @@ func (s *MaxInitcodeSizeSpec) Execute(t *test.Env) { // Customize the payload to include a tx with an invalid initcode if invTx, ok := invalidTx.(*types.Transaction); ok { - customPayload, _, err := helper.CustomizePayloadTransactions(&t.CLMock.LatestPayloadBuilt, t.CLMock.LatestPayloadAttributes.BeaconRoot, types.Transactions{invTx}) + customPayload, err := helper.CustomizePayloadTransactions(&t.CLMock.LatestPayloadBuilt, types.Transactions{invTx}) if err != nil { t.Fatalf("FAIL: Unable to customize payload: %v", err) } @@ -2089,7 +2082,7 @@ func (ws *GetPayloadBodiesSpec) Execute(t *test.Env) { customizer := &helper.CustomPayloadData{ Withdrawals: helper.RandomizeWithdrawalsOrder(t.CLMock.LatestExecutedPayload.Withdrawals), } - sidechainCurrent, _, err := customizer.CustomizePayload(&t.CLMock.LatestExecutedPayload, t.CLMock.LatestPayloadAttributes.BeaconRoot) + sidechainCurrent, err := customizer.CustomizePayload(&t.CLMock.LatestExecutedPayload) if err != nil { t.Fatalf("FAIL (%s): Error obtaining custom sidechain payload: %v", t.TestName, err) } @@ -2097,7 +2090,7 @@ func (ws *GetPayloadBodiesSpec) Execute(t *test.Env) { ParentHash: &sidechainCurrent.BlockHash, Withdrawals: helper.RandomizeWithdrawalsOrder(nextCanonicalPayload.Withdrawals), } - sidechainHead, _, err := customizer.CustomizePayload(nextCanonicalPayload, t.CLMock.LatestPayloadAttributes.BeaconRoot) + sidechainHead, err := customizer.CustomizePayload(nextCanonicalPayload) if err != nil { t.Fatalf("FAIL (%s): Error obtaining custom sidechain payload: %v", t.TestName, err) } diff --git a/simulators/ethereum/engine/test/env.go b/simulators/ethereum/engine/test/env.go index e3a0664ff9..8c1df04892 100644 --- a/simulators/ethereum/engine/test/env.go +++ b/simulators/ethereum/engine/test/env.go @@ -9,6 +9,7 @@ import ( "github.com/ethereum/hive/simulators/ethereum/engine/client" "github.com/ethereum/hive/simulators/ethereum/engine/client/hive_rpc" "github.com/ethereum/hive/simulators/ethereum/engine/clmock" + "github.com/ethereum/hive/simulators/ethereum/engine/config" "github.com/ethereum/hive/simulators/ethereum/engine/globals" "github.com/ethereum/hive/simulators/ethereum/engine/helper" @@ -19,6 +20,7 @@ import ( // Env is the environment of a single test. type Env struct { *hivesim.T + *helper.TransactionSender TestName string Client *hivesim.Client @@ -41,7 +43,7 @@ type Env struct { // Client parameters used to launch the default client Genesis *core.Genesis - ForkConfig *globals.ForkConfig + ForkConfig *config.ForkConfig ClientParams hivesim.Params ClientFiles hivesim.Params @@ -49,16 +51,14 @@ type Env struct { TestTransactionType helper.TestTransactionType } -func Run(testSpec SpecInterface, ttd *big.Int, timeout time.Duration, t *hivesim.T, c *hivesim.Client, genesis *core.Genesis, forkConfig *globals.ForkConfig, cParams hivesim.Params, cFiles hivesim.Params) { +func Run(testSpec Spec, ttd *big.Int, timeout time.Duration, t *hivesim.T, c *hivesim.Client, genesis *core.Genesis, cParams hivesim.Params, cFiles hivesim.Params) { // Setup the CL Mocker for this test - consensusConfig := testSpec.GetConsensusConfig() + forkConfig := testSpec.GetForkConfig() clMocker := clmock.NewCLMocker( t, genesis, - consensusConfig.SlotsToSafe, - consensusConfig.SlotsToFinalized, - big.NewInt(consensusConfig.SafeSlotsToImportOptimistically), - testSpec.GetForkConfig()) + forkConfig, + ) // Send the CLMocker for configuration by the spec, if any. testSpec.ConfigureCLMock(clMocker) @@ -81,6 +81,7 @@ func Run(testSpec SpecInterface, ttd *big.Int, timeout time.Duration, t *hivesim env := &Env{ T: t, + TransactionSender: helper.NewTransactionSender(globals.TestAccounts, false), TestName: testSpec.GetName(), Client: c, Engine: ec, diff --git a/simulators/ethereum/engine/test/expect.go b/simulators/ethereum/engine/test/expect.go index fe1de650a8..8bde67ee66 100644 --- a/simulators/ethereum/engine/test/expect.go +++ b/simulators/ethereum/engine/test/expect.go @@ -14,6 +14,7 @@ import ( "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/rpc" "github.com/ethereum/hive/simulators/ethereum/engine/client" + "github.com/ethereum/hive/simulators/ethereum/engine/config/cancun" "github.com/ethereum/hive/simulators/ethereum/engine/globals" typ "github.com/ethereum/hive/simulators/ethereum/engine/types" ) @@ -69,16 +70,24 @@ func (e ExpectEnv) Fatalf(format string, values ...interface{}) { type TestEngineClient struct { *ExpectEnv - Engine client.EngineClient + EngineAPIVersionResolver client.EngineAPIVersionResolver + Engine client.EngineClient } func NewTestEngineClient(t *Env, ec client.EngineClient) *TestEngineClient { return &TestEngineClient{ - ExpectEnv: &ExpectEnv{Env: t}, - Engine: ec, + ExpectEnv: &ExpectEnv{Env: t}, + EngineAPIVersionResolver: t.ForkConfig, + Engine: ec, } } +func (tec *TestEngineClient) WithEngineAPIVersionResolver(res client.EngineAPIVersionResolver) *TestEngineClient { + newTestEngineClient := *tec + newTestEngineClient.EngineAPIVersionResolver = res + return &newTestEngineClient +} + // ForkchoiceUpdated type ForkchoiceResponseExpectObject struct { @@ -121,10 +130,12 @@ func (tec *TestEngineClient) TestEngineForkchoiceUpdatedV2(fcState *api.Forkchoi return ret } -func (tec *TestEngineClient) TestEngineForkchoiceUpdated(fcState *api.ForkchoiceStateV1, pAttributes *typ.PayloadAttributes, version int) *ForkchoiceResponseExpectObject { - if version == -1 { - version = client.LatestForkchoiceUpdatedVersion +func (tec *TestEngineClient) TestEngineForkchoiceUpdated(fcState *api.ForkchoiceStateV1, pAttributes *typ.PayloadAttributes, headTimestamp uint64) *ForkchoiceResponseExpectObject { + var pAttrTimestamp *uint64 + if pAttributes != nil { + pAttrTimestamp = &pAttributes.Timestamp } + version := tec.EngineAPIVersionResolver.ForkchoiceUpdatedVersion(headTimestamp, pAttrTimestamp) ctx, cancel := context.WithTimeout(tec.TestContext, globals.RPCTimeout) defer cancel() resp, err := tec.Engine.ForkchoiceUpdated(ctx, version, fcState, pAttributes) @@ -227,9 +238,7 @@ type NewPayloadResponseExpectObject struct { func (tec *TestEngineClient) TestEngineNewPayloadV1(payload *typ.ExecutableData) *NewPayloadResponseExpectObject { ctx, cancel := context.WithTimeout(tec.TestContext, globals.RPCTimeout) defer cancel() - edv1 := &typ.ExecutableDataV1{} - edv1.FromExecutableData(payload) - status, err := tec.Engine.NewPayloadV1(ctx, edv1) + status, err := tec.Engine.NewPayloadV1(ctx, payload) ret := &NewPayloadResponseExpectObject{ ExpectEnv: &ExpectEnv{Env: tec.Env}, Payload: payload, @@ -260,10 +269,10 @@ func (tec *TestEngineClient) TestEngineNewPayloadV2(payload *typ.ExecutableData) return ret } -func (tec *TestEngineClient) TestEngineNewPayloadV3(payload *typ.ExecutableData, versionedHashes *[]common.Hash, beaconRoot *common.Hash) *NewPayloadResponseExpectObject { +func (tec *TestEngineClient) TestEngineNewPayloadV3(payload *typ.ExecutableData) *NewPayloadResponseExpectObject { ctx, cancel := context.WithTimeout(tec.TestContext, globals.RPCTimeout) defer cancel() - status, err := tec.Engine.NewPayloadV3(ctx, payload, versionedHashes, beaconRoot) + status, err := tec.Engine.NewPayloadV3(ctx, payload) ret := &NewPayloadResponseExpectObject{ ExpectEnv: &ExpectEnv{Env: tec.Env}, Payload: payload, @@ -277,9 +286,13 @@ func (tec *TestEngineClient) TestEngineNewPayloadV3(payload *typ.ExecutableData, return ret } -func (tec *TestEngineClient) TestEngineNewPayload(payload *typ.ExecutableData, versionedHashes *[]common.Hash, beaconRoot *common.Hash, version int) *NewPayloadResponseExpectObject { +func (tec *TestEngineClient) TestEngineNewPayload(payload *typ.ExecutableData) *NewPayloadResponseExpectObject { + if payload == nil { + panic("Payload is nil") + } + version := tec.EngineAPIVersionResolver.NewPayloadVersion(payload.Timestamp) if version == 3 { - return tec.TestEngineNewPayloadV3(payload, versionedHashes, beaconRoot) + return tec.TestEngineNewPayloadV3(payload) } else if version == 2 { return tec.TestEngineNewPayloadV2(payload) } else if version == 1 { @@ -390,10 +403,38 @@ func (tec *TestEngineClient) TestEngineGetPayloadV2(payloadID *api.PayloadID) *G return ret } -func (tec *TestEngineClient) TestEngineGetPayload(payloadID *api.PayloadID, version int) *GetPayloadResponseExpectObject { +func (tec *TestEngineClient) TestEngineGetPayloadV3(payloadID *api.PayloadID) *GetPayloadResponseExpectObject { + ctx, cancel := context.WithTimeout(tec.TestContext, globals.RPCTimeout) + defer cancel() + payload, blockValue, blobsBundle, shouldOverride, err := tec.Engine.GetPayloadV3(ctx, payloadID) + ret := &GetPayloadResponseExpectObject{ + ExpectEnv: &ExpectEnv{Env: tec.Env}, + Payload: payload, + Version: 3, + BlockValue: blockValue, + BlobsBundle: blobsBundle, + ShouldOverrideBuilder: shouldOverride, + Error: err, + } + if err, ok := err.(rpc.Error); ok { + ret.ErrorCode = err.ErrorCode() + } + return ret +} + +func (tec *TestEngineClient) TestEngineGetPayload(payloadID *api.PayloadID, payloadAttributes *typ.PayloadAttributes) *GetPayloadResponseExpectObject { + version := tec.EngineAPIVersionResolver.GetPayloadVersion(payloadAttributes.Timestamp) ctx, cancel := context.WithTimeout(tec.TestContext, globals.RPCTimeout) defer cancel() payload, blockValue, blobBundle, shouldOverride, err := tec.Engine.GetPayload(ctx, version, payloadID) + if blobBundle != nil { + payload.VersionedHashes, err = blobBundle.VersionedHashes(cancun.BLOB_COMMITMENT_VERSION_KZG) + if err != nil { + panic(err) + } + } + payload.ParentBeaconBlockRoot = payloadAttributes.BeaconRoot + // TODO: Where do we get the beacon root from ??? ret := &GetPayloadResponseExpectObject{ ExpectEnv: &ExpectEnv{Env: tec.Env}, Payload: payload, @@ -406,6 +447,7 @@ func (tec *TestEngineClient) TestEngineGetPayload(payloadID *api.PayloadID, vers if err, ok := err.(rpc.Error); ok { ret.ErrorCode = err.ErrorCode() } + return ret } @@ -774,6 +816,22 @@ func (tec *TestEngineClient) TestHeaderByNumber(number *big.Int) *HeaderResponse return ret } +func (tec *TestEngineClient) TestHeaderByHash(hash common.Hash) *HeaderResponseExpectObject { + ctx, cancel := context.WithTimeout(tec.TestContext, globals.RPCTimeout) + defer cancel() + header, err := tec.Engine.HeaderByHash(ctx, hash) + ret := &HeaderResponseExpectObject{ + ExpectEnv: &ExpectEnv{Env: tec.Env}, + Call: "HeaderByNumber", + Header: header, + Error: err, + } + if err, ok := err.(rpc.Error); ok { + ret.ErrorCode = err.ErrorCode() + } + return ret +} + func (exp *HeaderResponseExpectObject) ExpectNoError() { if exp.Error != nil { exp.Fatalf("FAIL (%s): Unexpected error on %s: %v, expected=", exp.TestName, exp.Call, exp.Error) @@ -800,6 +858,15 @@ func (exp *HeaderResponseExpectObject) ExpectHash(expHash common.Hash) { } } +func (exp *HeaderResponseExpectObject) ExpectWithdrawalsRoot(expectedRoot *common.Hash) { + exp.ExpectNoError() + actualWithdrawalsRoot := exp.Header.WithdrawalsHash + if ((expectedRoot == nil || actualWithdrawalsRoot == nil) && actualWithdrawalsRoot != expectedRoot) || + (expectedRoot != nil && actualWithdrawalsRoot != nil && *actualWithdrawalsRoot != *expectedRoot) { + exp.Fatalf("FAIL (%s): Unexpected WithdrawalsRoot on %s: %v, expected=%v", exp.TestName, exp.Call, actualWithdrawalsRoot, expectedRoot) + } +} + // Block type BlockResponseExpectObject struct { diff --git a/simulators/ethereum/engine/test/spec.go b/simulators/ethereum/engine/test/spec.go index cb6834d30d..bda2dfd4e6 100644 --- a/simulators/ethereum/engine/test/spec.go +++ b/simulators/ethereum/engine/test/spec.go @@ -7,37 +7,48 @@ import ( "github.com/ethereum/go-ethereum/core" "github.com/ethereum/hive/simulators/ethereum/engine/clmock" + "github.com/ethereum/hive/simulators/ethereum/engine/config" "github.com/ethereum/hive/simulators/ethereum/engine/globals" "github.com/ethereum/hive/simulators/ethereum/engine/helper" ) -type ConsensusConfig struct { - SlotsToSafe *big.Int - SlotsToFinalized *big.Int - SafeSlotsToImportOptimistically int64 -} - -type SpecInterface interface { +type Spec interface { + // Execute the test Execute(*Env) + // Configure the CLMocker for this specific test ConfigureCLMock(*clmock.CLMocker) + // Get the name of the test + GetName() string + // Get a brief description of the test GetAbout() string - GetConsensusConfig() ConsensusConfig + // Get the chain file to initialize the clients GetChainFile() string - GetForkConfig() globals.ForkConfig + // Get the main fork for this test + GetMainFork() config.Fork + // Create a copy of the spec with a different main fork + WithMainFork(config.Fork) Spec + // Get the fork config for this test + GetForkConfig() *config.ForkConfig + // Get the genesis file to initialize the clients GetGenesis() *core.Genesis - GetName() string + // Get the test transaction type to use throughout the test GetTestTransactionType() helper.TestTransactionType + // Get the maximum execution time until a timeout is raised GetTimeout() int + // Get whether mining is disabled for this test IsMiningDisabled() bool } -type Spec struct { +type BaseSpec struct { // Name of the test Name string // Brief description of the test About string + // Expectation Description + Expectation string + // Test procedure to execute the test Run func(*Env) @@ -46,12 +57,15 @@ type Spec struct { // Default: 0 TTD int64 + // CL Mocker configuration for time increments + BlockTimestampIncrement uint64 + // CL Mocker configuration for slots to `safe` and `finalized` respectively SlotsToSafe *big.Int SlotsToFinalized *big.Int // CL Mocker configuration for SafeSlotsToImportOptimistically - SafeSlotsToImportOptimistically int64 + SafeSlotsToImportOptimistically *big.Int // Test maximum execution time until a timeout is raised. // Default: 60 seconds @@ -59,7 +73,8 @@ type Spec struct { // Genesis file to be used for all clients launched during test // Default: genesis.json (init/genesis.json) - GenesisFile string + GenesisFile string + GenesisTimestamp *uint64 // Chain file to initialize the clients. // When used, clique consensus mechanism is disabled. @@ -73,47 +88,124 @@ type Spec struct { TestTransactionType helper.TestTransactionType // Fork Config - globals.ForkConfig + MainFork config.Fork + ForkTime uint64 + ForkHeight uint64 + PreviousForkTime uint64 } -func (s Spec) Execute(env *Env) { +func (s BaseSpec) Execute(env *Env) { s.Run(env) } -func (s Spec) ConfigureCLMock(*clmock.CLMocker) { - // No-op +func (s BaseSpec) ConfigureCLMock(cl *clmock.CLMocker) { + if s.SlotsToSafe != nil { + cl.SlotsToSafe = s.SlotsToSafe + } + if s.SlotsToFinalized != nil { + cl.SlotsToFinalized = s.SlotsToFinalized + } + if s.SafeSlotsToImportOptimistically != nil { + cl.SafeSlotsToImportOptimistically = s.SafeSlotsToImportOptimistically + } + cl.BlockTimestampIncrement = new(big.Int).SetUint64(s.GetBlockTimeIncrements()) } -func (s Spec) GetAbout() string { +func (s BaseSpec) GetAbout() string { return s.About } -func (s Spec) GetConsensusConfig() ConsensusConfig { - return ConsensusConfig{ - SlotsToSafe: s.SlotsToSafe, - SlotsToFinalized: s.SlotsToFinalized, - SafeSlotsToImportOptimistically: s.SafeSlotsToImportOptimistically, +func (s BaseSpec) GetChainFile() string { + return s.ChainFile +} + +func (s BaseSpec) GetMainFork() config.Fork { + mainFork := s.MainFork + if mainFork == "" { + mainFork = config.Paris } + return mainFork } -func (s Spec) GetChainFile() string { - return s.ChainFile + +func (s BaseSpec) WithMainFork(fork config.Fork) Spec { + specCopy := s + specCopy.MainFork = fork + return specCopy +} + +func (s BaseSpec) GetGenesisTimestamp() uint64 { + genesisTimestamp := globals.GenesisTimestamp + if s.GenesisTimestamp != nil { + genesisTimestamp = *s.GenesisTimestamp + } + return genesisTimestamp +} + +func (s BaseSpec) GetBlockTimeIncrements() uint64 { + if s.BlockTimestampIncrement == 0 { + return 1 + } + return s.BlockTimestampIncrement +} + +func (s BaseSpec) GetBlockTime(blockNumber uint64) uint64 { + return s.GetGenesisTimestamp() + blockNumber*s.GetBlockTimeIncrements() +} + +func (s BaseSpec) GetForkTime() uint64 { + forkTime := s.ForkTime + if s.ForkHeight > 0 { + forkTime = s.GetBlockTime(s.ForkHeight) + } + return forkTime } -func (s Spec) GetForkConfig() globals.ForkConfig { - return s.ForkConfig +func (s BaseSpec) GetForkConfig() *config.ForkConfig { + forkTime := s.GetForkTime() + previousForkTime := s.PreviousForkTime + forkConfig := config.ForkConfig{} + mainFork := s.GetMainFork() + genesisTimestamp := s.GetGenesisTimestamp() + if previousForkTime > forkTime { + panic(errors.New("previous fork time cannot be greater than fork time")) + } + if mainFork == config.Paris { + if forkTime > genesisTimestamp || previousForkTime != 0 { + return nil // Cannot configure a fork before Paris, skip test + } + } else if mainFork == config.Shanghai { + if previousForkTime != 0 { + return nil // Cannot configure a fork before Shanghai, skip test + } + forkConfig.ShanghaiTimestamp = new(big.Int).SetUint64(forkTime) + } else if mainFork == config.Cancun { + forkConfig.ShanghaiTimestamp = new(big.Int).SetUint64(previousForkTime) + forkConfig.CancunTimestamp = new(big.Int).SetUint64(forkTime) + } else { + panic(fmt.Errorf("unknown fork: %s", mainFork)) + } + return &forkConfig } -func (s Spec) GetGenesis() *core.Genesis { +func (s BaseSpec) GetGenesis() *core.Genesis { + // Load the default test genesis file genesisPath := "./init/genesis.json" if s.GenesisFile != "" { genesisPath = fmt.Sprintf("./init/%s", s.GenesisFile) } genesis := helper.LoadGenesis(genesisPath) + + // Set the terminal total difficulty genesis.Config.TerminalTotalDifficulty = big.NewInt(genesis.Difficulty.Int64() + s.TTD) if genesis.Difficulty.Cmp(genesis.Config.TerminalTotalDifficulty) <= 0 { genesis.Config.TerminalTotalDifficultyPassed = true } + // Set the genesis timestamp if provided + if s.GenesisTimestamp != nil { + genesis.Timestamp = *s.GenesisTimestamp + } + // Add balance to all the test accounts for _, testAcc := range globals.TestAccounts { balance, ok := new(big.Int).SetString("123450000000000000000", 16) @@ -128,22 +220,22 @@ func (s Spec) GetGenesis() *core.Genesis { return &genesis } -func (s Spec) GetName() string { +func (s BaseSpec) GetName() string { return s.Name } -func (s Spec) GetTestTransactionType() helper.TestTransactionType { +func (s BaseSpec) GetTestTransactionType() helper.TestTransactionType { return s.TestTransactionType } -func (s Spec) GetTimeout() int { +func (s BaseSpec) GetTimeout() int { return s.TimeoutSeconds } -func (s Spec) IsMiningDisabled() bool { +func (s BaseSpec) IsMiningDisabled() bool { return s.DisableMining } -var LatestFork = globals.ForkConfig{ +var LatestFork = config.ForkConfig{ ShanghaiTimestamp: big.NewInt(0), } diff --git a/simulators/ethereum/engine/types/blobs.go b/simulators/ethereum/engine/types/blobs.go index 6bfb764b3d..cbfc7df2ae 100644 --- a/simulators/ethereum/engine/types/blobs.go +++ b/simulators/ethereum/engine/types/blobs.go @@ -7,6 +7,7 @@ import ( "fmt" gokzg4844 "github.com/crate-crypto/go-kzg-4844" + beacon "github.com/ethereum/go-ethereum/beacon/engine" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" ) @@ -147,6 +148,34 @@ type BlobsBundle struct { Proofs []KZGProof `json:"proofs" gencodec:"required"` } +func (bb *BlobsBundle) FromBeaconBlobsBundle(src *beacon.BlobsBundleV1) error { + if src == nil { + return errors.New("nil blobs bundle") + } + if src.Commitments == nil { + return errors.New("nil commitments") + } + if src.Blobs == nil { + return errors.New("nil blobs") + } + if src.Proofs == nil { + return errors.New("nil proofs") + } + bb.Commitments = make([]KZGCommitment, len(src.Commitments)) + bb.Blobs = make([]Blob, len(src.Blobs)) + bb.Proofs = make([]KZGProof, len(src.Proofs)) + for i, commitment := range src.Commitments { + copy(bb.Commitments[i][:], commitment[:]) + } + for i, blob := range src.Blobs { + copy(bb.Blobs[i][:], blob[:]) + } + for i, proof := range src.Proofs { + copy(bb.Proofs[i][:], proof[:]) + } + return nil +} + func (bb *BlobsBundle) VersionedHashes(commitmentVersion byte) (*[]common.Hash, error) { if bb == nil { return nil, errors.New("nil blob bundle") diff --git a/simulators/ethereum/engine/types/types.go b/simulators/ethereum/engine/types/types.go index 9b798f1b13..dc61e76d44 100644 --- a/simulators/ethereum/engine/types/types.go +++ b/simulators/ethereum/engine/types/types.go @@ -1,7 +1,6 @@ package types import ( - "fmt" "math/big" geth_beacon "github.com/ethereum/go-ethereum/beacon/engine" @@ -134,6 +133,13 @@ type ExecutableData struct { Withdrawals []*types.Withdrawal `json:"withdrawals"` BlobGasUsed *uint64 `json:"blobGasUsed,omitempty"` ExcessBlobGas *uint64 `json:"excessBlobGas,omitempty"` + + // NewPayload parameters + VersionedHashes *[]common.Hash `json:"-"` + ParentBeaconBlockRoot *common.Hash `json:"-"` + + // Payload Attributes used to build the block + PayloadAttributes PayloadAttributes `json:"-"` } // JSON type overrides for executableData. @@ -208,23 +214,14 @@ func FromBeaconExecutableData(ed *geth_beacon.ExecutableData) (ExecutableData, e }, nil } -func ExecutableDataToBlock(ed ExecutableData, versionedHashes []common.Hash, beaconRoot *common.Hash) (*types.Block, error) { - if beaconRoot != nil { - return nil, fmt.Errorf("parent geth_beacon block root is not nil is unsupported") - } +func ExecutableDataToBlock(ed ExecutableData) (*types.Block, error) { gethEd, err := ToBeaconExecutableData(&ed) if err != nil { return nil, err } - return geth_beacon.ExecutableDataToBlock(gethEd, versionedHashes, beaconRoot) -} - -func BlockToExecutableData(block *types.Block, fees *big.Int) ExecutableData { - // TODO (DEVNET 8): Add blobs - gethEnvelope := geth_beacon.BlockToExecutableData(block, fees, nil) - ed, err := FromBeaconExecutableData(gethEnvelope.ExecutionPayload) - if err != nil { - panic(err) + var versionedHashes []common.Hash + if ed.VersionedHashes != nil { + versionedHashes = *ed.VersionedHashes } - return ed + return geth_beacon.ExecutableDataToBlock(gethEd, versionedHashes, ed.ParentBeaconBlockRoot) } diff --git a/simulators/ethereum/go.work.sum b/simulators/ethereum/go.work.sum index bfb31c436f..a0ac8aedd5 100644 --- a/simulators/ethereum/go.work.sum +++ b/simulators/ethereum/go.work.sum @@ -186,6 +186,7 @@ github.com/bugsnag/bugsnag-go v0.0.0-20141110184014-b1d153021fcd/go.mod h1:2oa8n github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b/go.mod h1:obH5gd0BsqsP2LwDJ9aOkm/6J86V6lyAXCoQWGw3K50= github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0/go.mod h1:D/8v3kj0zr8ZAKg1AQ6crr+5VwKN5eIywRkfhyM/+dE= github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= +github.com/cenkalti/backoff/v4 v4.1.2/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= github.com/cespare/cp v0.1.0/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s= github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= @@ -262,6 +263,7 @@ github.com/containerd/continuity v0.0.0-20200710164510-efbc4488d8fe/go.mod h1:cE github.com/containerd/continuity v0.0.0-20201208142359-180525291bb7/go.mod h1:kR3BEg7bDFaEddKm54WSmrol1fKWDU1nKYkgrcgZT7Y= github.com/containerd/continuity v0.0.0-20210208174643-50096c924a4e/go.mod h1:EXlVlkqNba9rJe3j7w3Xa924itAMLgZH4UD/Q4PExuQ= github.com/containerd/continuity v0.1.0/go.mod h1:ICJu0PwR54nI0yPEnJ6jcS+J7CZAUXrLh8lPo2knzsM= +github.com/containerd/continuity v0.3.0/go.mod h1:wJEAIwKOm/pBZuBd0JmeTvnLquTB1Ag8espWhkykbPM= github.com/containerd/fifo v0.0.0-20180307165137-3d5202aec260/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI= github.com/containerd/fifo v0.0.0-20190226154929-a9fb20d87448/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI= github.com/containerd/fifo v0.0.0-20200410184934-f15a3290365b/go.mod h1:jPQ2IAeZRCYxpS/Cm1495vGFww6ecHmMk1YJH2Q5ln0= @@ -270,6 +272,7 @@ github.com/containerd/fifo v0.0.0-20210316144830-115abcc95a1d/go.mod h1:ocF/ME1S github.com/containerd/fifo v1.0.0/go.mod h1:ocF/ME1SX5b1AOlWi9r677YJmCPSwwWnQ9O123vzpE4= github.com/containerd/go-cni v1.0.1/go.mod h1:+vUpYxKvAF72G9i1WoDOiPGRtQpqsNW/ZHtSlv++smU= github.com/containerd/go-cni v1.0.2/go.mod h1:nrNABBHzu0ZwCug9Ije8hL2xBCYh/pjfMb1aZGrrohk= +github.com/containerd/go-cni v1.1.6/go.mod h1:BWtoWl5ghVymxu6MBjg79W9NZrCRyHIdUtk4cauMe34= github.com/containerd/go-runc v0.0.0-20180907222934-5a6d9f37cfa3/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0= github.com/containerd/go-runc v0.0.0-20190911050354-e029b79d8cda/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0= github.com/containerd/go-runc v0.0.0-20200220073739-7016d3ce2328/go.mod h1:PpyHrqVs8FTi9vpyHwPwiNEGaACDxT/N/pLcvMSRA9g= @@ -279,6 +282,7 @@ github.com/containerd/imgcrypt v1.0.1/go.mod h1:mdd8cEPW7TPgNG4FpuP3sGBiQ7Yi/zak github.com/containerd/imgcrypt v1.0.4-0.20210301171431-0ae5c75f59ba/go.mod h1:6TNsg0ctmizkrOgXRNQjAPFWpMYRWuiB6dSF4Pfa5SA= github.com/containerd/imgcrypt v1.1.1-0.20210312161619-7ed62a527887/go.mod h1:5AZJNI6sLHJljKuI9IHnw1pWqo/F0nGDOuR9zgTs7ow= github.com/containerd/imgcrypt v1.1.1/go.mod h1:xpLnwiQmEUJPvQoAapeb2SNCxz7Xr6PJrXQb0Dpc4ms= +github.com/containerd/imgcrypt v1.1.4/go.mod h1:LorQnPtzL/T0IyCeftcsMEO7AqxUDbdO8j/tSUpgxvo= github.com/containerd/nri v0.0.0-20201007170849-eb1350a75164/go.mod h1:+2wGSDGFYfE5+So4M5syatU0N0f0LbWpuqyMi4/BE8c= github.com/containerd/nri v0.0.0-20210316161719-dbaa18c31c14/go.mod h1:lmxnXF6oMkbqs39FiCt1s0R2HSMhcLel9vNL3m4AaeY= github.com/containerd/nri v0.1.0/go.mod h1:lmxnXF6oMkbqs39FiCt1s0R2HSMhcLel9vNL3m4AaeY= @@ -301,11 +305,14 @@ github.com/containerd/zfs v1.0.0/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNR github.com/containernetworking/cni v0.7.1/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= github.com/containernetworking/cni v0.8.0/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= github.com/containernetworking/cni v0.8.1/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= +github.com/containernetworking/cni v1.1.1/go.mod h1:sDpYKmGVENF3s6uvMvGgldDWeG8dMxakj/u+i9ht9vw= github.com/containernetworking/plugins v0.8.6/go.mod h1:qnw5mN19D8fIwkqW7oHHYDHVlzhJpcY6TQxn/fUyDDM= github.com/containernetworking/plugins v0.9.1/go.mod h1:xP/idU2ldlzN6m4p5LmGiwRDjeJr6FLK6vuiUwoH7P8= +github.com/containernetworking/plugins v1.1.1/go.mod h1:Sr5TH/eBsGLXK/h71HeLfX19sZPp3ry5uHSkI4LPxV8= github.com/containers/ocicrypt v1.0.1/go.mod h1:MeJDzk1RJHv89LjsH0Sp5KTY3ZYkjXO/C+bKAeWFIrc= github.com/containers/ocicrypt v1.1.0/go.mod h1:b8AOe0YR67uU8OqfVNcznfFpAzu3rdgUV4GP9qXPfu4= github.com/containers/ocicrypt v1.1.1/go.mod h1:Dm55fwWm1YZAjYRaJ94z2mfZikIyIN4B0oB3dj3jFxY= +github.com/containers/ocicrypt v1.1.3/go.mod h1:xpdkbVAuaH3WzbEabUd5yDsl9SwJA5pABH85425Es2g= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/go-iptables v0.4.5/go.mod h1:/mVI274lEDI2ns62jHCDnCyBF9Iwsmekav8Dbxlm1MU= github.com/coreos/go-iptables v0.5.0/go.mod h1:/mVI274lEDI2ns62jHCDnCyBF9Iwsmekav8Dbxlm1MU= @@ -556,6 +563,7 @@ github.com/graph-gophers/graphql-go v1.3.0/go.mod h1:9CQHMSxwO4MprSdzoIEobiHpoLt github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= +github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= @@ -563,9 +571,11 @@ github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFb github.com/guptarohit/asciigraph v0.5.5/go.mod h1:dYl5wwK4gNsnFf9Zp+l06rFiDZ5YtXM6x7SRWZ3KGag= github.com/hashicorp/errwrap v0.0.0-20141028054710-7554cd9344ce/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/go-bexpr v0.1.10/go.mod h1:oxlubA2vC/gFVfX1A6JGp7ls7uCDlfJn732ehYYg+g0= github.com/hashicorp/go-multierror v0.0.0-20161216184304-ed905158d874/go.mod h1:JMRHfdO9jKNzS/+BTlxCjKNQHg/jZAft8U7LloJvN7I= github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= +github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/yamux v0.1.1/go.mod h1:CtWFDAQgb7dxtzFs4tWbplKIe2jSi3+5vKbgIO0SLnQ= @@ -587,6 +597,7 @@ github.com/influxdata/influxdb v1.8.3/go.mod h1:JugdFhsvvI8gadxOI6noqNeeBHvWNTbf github.com/influxdata/influxdb-client-go/v2 v2.4.0/go.mod h1:vLNHdxTJkIf2mSLvGrpj8TCcISApPoXkaxP8g9uRlW8= github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo= github.com/influxdata/line-protocol v0.0.0-20210311194329-9aa0e372d097/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo= +github.com/intel/goresctrl v0.2.0/go.mod h1:+CZdzouYFn5EsxgqAQTEzMfwKwuc0fVdMrT9FCCAVRQ= github.com/invopop/yaml v0.1.0/go.mod h1:2XuRLgs/ouIrW3XNzuNj7J3Nvu/Dig5MXvbCEdiBN3Q= github.com/iris-contrib/httpexpect/v2 v2.3.1/go.mod h1:ICTf89VBKSD3KB0fsyyHviKF8G8hyepP0dOXJPWz3T0= github.com/iris-contrib/i18n v0.0.0-20171121225848-987a633949d0/go.mod h1:pMCz62A0xJL6I+umB2YTlFRwWXaDFA0jy+5HzGiJjqI= @@ -690,6 +701,7 @@ github.com/mediocregopher/radix/v3 v3.3.0/go.mod h1:EmfVyvspXz1uZEyPBMyGK+kjWiKQ github.com/mediocregopher/radix/v3 v3.8.0/go.mod h1:8FL3F6UQRXHXIBSPUs5h0RybMF8i4n7wVopoX3x7Bv8= github.com/microcosm-cc/bluemonday v1.0.21/go.mod h1:ytNkv4RrDrLJ2pqlsSI46O6IVXmZOBBD4SaJyDwwTkM= github.com/miekg/pkcs11 v1.0.3/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= +github.com/miekg/pkcs11 v1.1.1/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= github.com/minio/highwayhash v1.0.2/go.mod h1:BQskDq+xkJ12lmlUUi7U0M5Swg3EWR+dLTk+kldvVxY= github.com/mistifyio/go-zfs v2.1.2-0.20190413222219-f784269be439+incompatible/go.mod h1:8AuVvqP/mXw1px98n46wfvcGfQ4ci2FwoAjKYxuo3Z4= github.com/mitchellh/osext v0.0.0-20151018003038-5e2d6d41470f/go.mod h1:OkQIRizQZAeMln+1tSwduZz7+Af5oFlKirV/MSYes2A= @@ -701,7 +713,9 @@ github.com/moby/sys/mountinfo v0.4.0/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2J github.com/moby/sys/mountinfo v0.4.1/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2JI+6q0qou+A= github.com/moby/sys/mountinfo v0.5.0/go.mod h1:3bMD3Rg+zkqx8MRYPi7Pyb0Ie97QEBmdxbhnCLlSvSU= github.com/moby/sys/mountinfo v0.6.2/go.mod h1:IJb6JQeOklcdMU9F5xQ8ZALD+CUr5VlGpwtX+VE0rpI= +github.com/moby/sys/signal v0.6.0/go.mod h1:GQ6ObYZfqacOwTtlXvcmh9A26dVRul/hbOZn88Kg8Tg= github.com/moby/sys/symlink v0.1.0/go.mod h1:GGDODQmbFOjFsXvfLVn3+ZRxkch54RkSiGqsZeMYowQ= +github.com/moby/sys/symlink v0.2.0/go.mod h1:7uZVF2dqJjG/NsClqul95CqKOBRQyYSNnJ6BMgR/gFs= github.com/moby/term v0.0.0-20200312100748-672ec06f55cd/go.mod h1:DdlQx2hp0Ss5/fLikoLlEeIYiATotOjgB//nb973jeo= github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6/go.mod h1:E2VnQOmVuvZB6UYnnDB0qG5Nq/1tD9acaOpo6xmt0Kw= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= @@ -765,8 +779,10 @@ github.com/opencontainers/selinux v1.6.0/go.mod h1:VVGKuOLlE7v4PJyT6h7mNWvq1rzqi github.com/opencontainers/selinux v1.8.0/go.mod h1:RScLhm78qiWa2gbVCcGkC7tCGdgk3ogry1nUQF8Evvo= github.com/opencontainers/selinux v1.8.2/go.mod h1:MUIHuUEvKB1wtJjQdOyYRgOnLD2xAPP8dBsCoU0KuF8= github.com/opencontainers/selinux v1.10.0/go.mod h1:2i0OySw99QjzBBQByd1Gr9gSjvuho1lHsJxIJ3gGbJI= +github.com/opencontainers/selinux v1.10.1/go.mod h1:2i0OySw99QjzBBQByd1Gr9gSjvuho1lHsJxIJ3gGbJI= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/pelletier/go-toml v1.8.1/go.mod h1:T2/BmBdy8dvIRq1a/8aqjN41wvWlN4lrapLU/GW4pbc= +github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= github.com/pelletier/go-toml/v2 v2.0.5/go.mod h1:OMHamSCAODeSsVrwwvcJOaoN0LIUIaFVNZzmWyNfXas= github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= github.com/peterh/liner v1.1.1-0.20190123174540-a2c9a5303de7/go.mod h1:CRroGNssyjTd/qIG2FyxByd2S8JEAZXBl4qUrZf8GS0= @@ -888,9 +904,11 @@ github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7Fw github.com/vishvananda/netlink v0.0.0-20181108222139-023a6dafdcdf/go.mod h1:+SR5DhBJrl6ZM7CoCKvpw5BKroDKQ+PJqOg65H/2ktk= github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE= github.com/vishvananda/netlink v1.1.1-0.20201029203352-d40f9887b852/go.mod h1:twkDnbuQxJYemMlGd4JFIcuhgX83tXhKS2B/PRMpOho= +github.com/vishvananda/netlink v1.1.1-0.20210330154013-f5de75959ad5/go.mod h1:twkDnbuQxJYemMlGd4JFIcuhgX83tXhKS2B/PRMpOho= github.com/vishvananda/netns v0.0.0-20180720170159-13995c7128cc/go.mod h1:ZjcWmFBXmLKZu9Nxj3WKYEafiSqer2rnvPr0en9UNpI= github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU= github.com/vishvananda/netns v0.0.0-20200728191858-db3c7e526aae/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= +github.com/vishvananda/netns v0.0.0-20210104183010-2eb08e3e575f/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= github.com/vmihailenco/msgpack/v5 v5.3.5/go.mod h1:7xyJ9e+0+9SaZT0Wt1RGleJXzli6Q/V5KbhBonMG9jc= github.com/vmihailenco/tagparser/v2 v2.0.0/go.mod h1:Wri+At7QHww0WTrCBeu4J6bNtoV6mEfg5OIWRZA9qds= github.com/willf/bitset v1.1.11-0.20200630133818-d5bec3311243/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4= @@ -917,7 +935,14 @@ go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.28.0/go.mod h1:vEhqr0m4eTc+DWxfsXoXue2GBgV2uUwVznkGIHW/e5w= +go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.3.0/go.mod h1:VpP4/RMn8bv8gNo9uK7/IMY4mtWLELsS+JIP0inH0h4= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.3.0/go.mod h1:hO1KLR7jcKaDDKDkvI9dP/FIhpmna5lkqPUQdEjFAM8= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.3.0/go.mod h1:keUU7UfnwWTWpJ+FWnyqmogPa82nuU5VUANFq49hlMY= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.3.0/go.mod h1:QNX1aly8ehqqX1LEa6YniTU7VY9I6R3X/oPxhGdTceE= +go.opentelemetry.io/otel/sdk v1.3.0/go.mod h1:rIo4suHNhQwBIPg9axF8V9CA72Wz2mKF1teNrup8yzs= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= +go.opentelemetry.io/proto/otlp v0.11.0/go.mod h1:QpEjXPrNQzrFDZgoTo49dgHR9RYRSrg3NAKnUGl9YpQ= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/automaxprocs v1.5.2/go.mod h1:eRbA25aqJrxAbsLO0xy5jVwPt7FQnRgjW+efnwa1WM0= @@ -1257,6 +1282,7 @@ google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201110150050-8816d57aaa9a/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20220502173005-c8bf987b8c21 h1:hrbNEivu7Zn1pxvHk6MBrq9iE22woVILTHqexqBxe6I= google.golang.org/genproto v0.0.0-20220502173005-c8bf987b8c21/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= google.golang.org/grpc v0.0.0-20160317175043-d3ddb4469d5a/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v0.0.0-20170208002647-2a6bf6142e96/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= @@ -1276,6 +1302,7 @@ google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc v1.47.0 h1:9n77onPX5F3qfFCqjy9dhn8PbNQsIKeVU04J9G7umt8= google.golang.org/grpc v1.47.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= @@ -1314,33 +1341,41 @@ honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9 k8s.io/api v0.20.1/go.mod h1:KqwcCVogGxQY3nBlRpwt+wpAMF/KjaCc7RpywacvqUo= k8s.io/api v0.20.4/go.mod h1:++lNL1AJMkDymriNniQsWRkMDzRaX2Y/POTUi8yvqYQ= k8s.io/api v0.20.6/go.mod h1:X9e8Qag6JV/bL5G6bU8sdVRltWKmdHsFUGS3eVndqE8= +k8s.io/api v0.22.5/go.mod h1:mEhXyLaSD1qTOf40rRiKXkc+2iCem09rWLlFwhCEiAs= k8s.io/apimachinery v0.20.1/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= k8s.io/apimachinery v0.20.4/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= k8s.io/apimachinery v0.20.6/go.mod h1:ejZXtW1Ra6V1O5H8xPBGz+T3+4gfkTCeExAHKU57MAc= +k8s.io/apimachinery v0.22.5/go.mod h1:xziclGKwuuJ2RM5/rSFQSYAj0zdbci3DH8kj+WvyN0U= k8s.io/apiserver v0.20.1/go.mod h1:ro5QHeQkgMS7ZGpvf4tSMx6bBOgPfE+f52KwvXfScaU= k8s.io/apiserver v0.20.4/go.mod h1:Mc80thBKOyy7tbvFtB4kJv1kbdD0eIH8k8vianJcbFM= k8s.io/apiserver v0.20.6/go.mod h1:QIJXNt6i6JB+0YQRNcS0hdRHJlMhflFmsBDeSgT1r8Q= +k8s.io/apiserver v0.22.5/go.mod h1:s2WbtgZAkTKt679sYtSudEQrTGWUSQAPe6MupLnlmaQ= k8s.io/client-go v0.20.1/go.mod h1:/zcHdt1TeWSd5HoUe6elJmHSQ6uLLgp4bIJHVEuy+/Y= k8s.io/client-go v0.20.4/go.mod h1:LiMv25ND1gLUdBeYxBIwKpkSC5IsozMMmOOeSJboP+k= k8s.io/client-go v0.20.6/go.mod h1:nNQMnOvEUEsOzRRFIIkdmYOjAZrC8bgq0ExboWSU1I0= +k8s.io/client-go v0.22.5/go.mod h1:cs6yf/61q2T1SdQL5Rdcjg9J1ElXSwbjSrW2vFImM4Y= k8s.io/code-generator v0.19.7/go.mod h1:lwEq3YnLYb/7uVXLorOJfxg+cUu2oihFhHZ0n9NIla0= k8s.io/component-base v0.20.1/go.mod h1:guxkoJnNoh8LNrbtiQOlyp2Y2XFCZQmrcg2n/DeYNLk= k8s.io/component-base v0.20.4/go.mod h1:t4p9EdiagbVCJKrQ1RsA5/V4rFQNDfRlevJajlGwgjI= k8s.io/component-base v0.20.6/go.mod h1:6f1MPBAeI+mvuts3sIdtpjljHWBQ2cIy38oBIWMYnrM= +k8s.io/component-base v0.22.5/go.mod h1:VK3I+TjuF9eaa+Ln67dKxhGar5ynVbwnGrUiNF4MqCI= k8s.io/cri-api v0.17.3/go.mod h1:X1sbHmuXhwaHs9xxYffLqJogVsnI+f6cPRcgPel7ywM= k8s.io/cri-api v0.20.1/go.mod h1:2JRbKt+BFLTjtrILYVqQK5jqhI+XNdF6UiGMgczeBCI= k8s.io/cri-api v0.20.4/go.mod h1:2JRbKt+BFLTjtrILYVqQK5jqhI+XNdF6UiGMgczeBCI= k8s.io/cri-api v0.20.6/go.mod h1:ew44AjNXwyn1s0U4xCKGodU7J1HzBeZ1MpGrpa5r8Yc= +k8s.io/cri-api v0.25.0/go.mod h1:J1rAyQkSJ2Q6I+aBMOVgg2/cbbebso6FNa0UagiR0kc= k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= k8s.io/gengo v0.0.0-20200428234225-8167cfdcfc14/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= k8s.io/gengo v0.0.0-20201113003025-83324d819ded/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= k8s.io/klog/v2 v2.4.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= +k8s.io/klog/v2 v2.30.0/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= k8s.io/kube-openapi v0.0.0-20200805222855-6aeccd4b50c6/go.mod h1:UuqjUnNftUyPE5H64/qeyjQoUZhGpeFDVdxjTeEVN2o= k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd/go.mod h1:WOJ3KddDSol4tAGcJo0Tvi+dK12EcqSLqcWsryKMpfM= k8s.io/kubernetes v1.13.0/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk= k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +k8s.io/utils v0.0.0-20210930125809-cb0fa318a74b/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= moul.io/http2curl v1.0.0/go.mod h1:f6cULg+e4Md/oW1cYmwW4IWQOVl2lGbmCNGOHvzX2kE= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= @@ -1351,5 +1386,6 @@ sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.15/go.mod h1:LEScyz sigs.k8s.io/structured-merge-diff/v4 v4.0.1/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= sigs.k8s.io/structured-merge-diff/v4 v4.0.3/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= +sigs.k8s.io/structured-merge-diff/v4 v4.1.2/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4= sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= diff --git a/simulators/ethereum/pyspec/runner.go b/simulators/ethereum/pyspec/runner.go index 6dc99d7eaa..02168d5b82 100644 --- a/simulators/ethereum/pyspec/runner.go +++ b/simulators/ethereum/pyspec/runner.go @@ -126,12 +126,15 @@ func (tc *testcase) run(t *hivesim.T) { latestVersion := uint64(1) for i, engineNewPayload := range tc.payloads { // execute fixture block payload + ed, err := engineNewPayload.ToExecutableData() + if err != nil { + tc.failedErr = err + t.Fatalf("unable to convert engineNewPayload to executableData: %v", err) + } plStatus, plErr := engineClient.NewPayload( context.Background(), int(engineNewPayload.Version), - engineNewPayload.Payload, - &engineNewPayload.BlobVersionedHashes, - engineNewPayload.ParentBeaconBlockRoot, + ed, ) latestVersion = engineNewPayload.Version // check for rpc errors and compare error codes diff --git a/simulators/ethereum/pyspec/types.go b/simulators/ethereum/pyspec/types.go index 3e83c6d1e1..c774c0f584 100644 --- a/simulators/ethereum/pyspec/types.go +++ b/simulators/ethereum/pyspec/types.go @@ -10,6 +10,8 @@ import ( "github.com/ethereum/go-ethereum/common/math" "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/core/types" + + typ "github.com/ethereum/hive/simulators/ethereum/engine/types" ) type testcase struct { @@ -162,3 +164,13 @@ type engineNewPayload struct { type engineNewPayloadUnmarshaling struct { Version math.HexOrDecimal64 `json:"version"` } + +func (p *engineNewPayload) ToExecutableData() (*typ.ExecutableData, error) { + ed, err := typ.FromBeaconExecutableData(p.Payload) + if err != nil { + return nil, err + } + ed.VersionedHashes = &p.BlobVersionedHashes + ed.ParentBeaconBlockRoot = p.ParentBeaconBlockRoot + return &ed, nil +} From da792c2fb747344a9e20be1b749fedb2971001c5 Mon Sep 17 00:00:00 2001 From: spencer Date: Wed, 13 Sep 2023 01:35:35 +0200 Subject: [PATCH 011/387] simulators/ethereum/engine: Beacon root pre-deploy address update (#839) simulators/ethereum/engine: Update beacon root to latest spec. --- simulators/ethereum/engine/config/cancun/constants.go | 4 ++-- simulators/ethereum/engine/config/cancun/genesis.go | 4 ++-- simulators/ethereum/engine/suites/cancun/helpers.go | 4 ++-- simulators/ethereum/engine/suites/cancun/steps.go | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/simulators/ethereum/engine/config/cancun/constants.go b/simulators/ethereum/engine/config/cancun/constants.go index e829b1b470..dff362fe17 100644 --- a/simulators/ethereum/engine/config/cancun/constants.go +++ b/simulators/ethereum/engine/config/cancun/constants.go @@ -22,8 +22,8 @@ var ( BLOB_COMMITMENT_VERSION_KZG = byte(0x01) // EIP 4788 - HISTORY_STORAGE_ADDRESS = common.HexToAddress("0x000000000000000000000000000000000000000b") - HISTORICAL_ROOTS_MODULUS = uint64(98304) + BEACON_ROOTS_ADDRESS = common.HexToAddress("0xbEac00dDB15f3B6d645C48263dC93862413A222D") + HISTORY_BUFFER_LENGTH = uint64(98304) // Test constants DATAHASH_START_ADDRESS = big.NewInt(0x20000) diff --git a/simulators/ethereum/engine/config/cancun/genesis.go b/simulators/ethereum/engine/config/cancun/genesis.go index 2d32207d6d..d8a7765147 100644 --- a/simulators/ethereum/engine/config/cancun/genesis.go +++ b/simulators/ethereum/engine/config/cancun/genesis.go @@ -27,10 +27,10 @@ func ConfigGenesis(genesis *core.Genesis, forkTimestamp uint64) error { } // Add bytecode pre deploy to the EIP-4788 address. - genesis.Alloc[HISTORY_STORAGE_ADDRESS] = core.GenesisAccount{ + genesis.Alloc[BEACON_ROOTS_ADDRESS] = core.GenesisAccount{ Balance: common.Big0, Nonce: 1, - Code: common.Hex2Bytes("3373fffffffffffffffffffffffffffffffffffffffe14604457602036146024575f5ffd5b620180005f350680545f35146037575f5ffd5b6201800001545f5260205ff35b42620180004206555f3562018000420662018000015500"), + Code: common.Hex2Bytes("3373fffffffffffffffffffffffffffffffffffffffe14604457602036146024575f5ffd5b620180005f350680545f35146037575f5ffd5b6201800001545f5260205ff35b6201800042064281555f359062018000015500"), } return nil diff --git a/simulators/ethereum/engine/suites/cancun/helpers.go b/simulators/ethereum/engine/suites/cancun/helpers.go index 2f76ddf195..e450f1a068 100644 --- a/simulators/ethereum/engine/suites/cancun/helpers.go +++ b/simulators/ethereum/engine/suites/cancun/helpers.go @@ -132,8 +132,8 @@ func VerifyTransactionFromNode(ctx context.Context, eth client.Eth, tx typ.Trans func BeaconRootStorageIndexes(timestamp uint64) (common.Hash, common.Hash) { // Calculate keys - timestampReduced := timestamp % cancun.HISTORICAL_ROOTS_MODULUS - timestampExtended := timestampReduced + cancun.HISTORICAL_ROOTS_MODULUS + timestampReduced := timestamp % cancun.HISTORY_BUFFER_LENGTH + timestampExtended := timestampReduced + cancun.HISTORY_BUFFER_LENGTH return common.BigToHash(new(big.Int).SetUint64(timestampReduced)), common.BigToHash(new(big.Int).SetUint64(timestampExtended)) } diff --git a/simulators/ethereum/engine/suites/cancun/steps.go b/simulators/ethereum/engine/suites/cancun/steps.go index 1754154432..cdece68c71 100644 --- a/simulators/ethereum/engine/suites/cancun/steps.go +++ b/simulators/ethereum/engine/suites/cancun/steps.go @@ -261,7 +261,7 @@ func VerifyBeaconRootStorage(ctx context.Context, testEngine *test.TestEngineCli // Read the storage keys from the stateful precompile that stores the beacon roots and verify // that the beacon root is the same as the one in the payload blockNumber := new(big.Int).SetUint64(payload.Number) - precompileAddress := cancun.HISTORY_STORAGE_ADDRESS + precompileAddress := cancun.BEACON_ROOTS_ADDRESS timestampKey, beaconRootKey := BeaconRootStorageIndexes(payload.Timestamp) From ce4be72744dafd7ea84058fccab5f545faf62397 Mon Sep 17 00:00:00 2001 From: spencer Date: Thu, 14 Sep 2023 19:15:10 +0200 Subject: [PATCH 012/387] clients/reth: Dockerfile support to build Reth from git or locally (#860) --- clients/reth/Dockerfile.git | 40 +++++++++++++++++++++++++++++++++++ clients/reth/Dockerfile.local | 38 +++++++++++++++++++++++++++++++++ 2 files changed, 78 insertions(+) create mode 100644 clients/reth/Dockerfile.git create mode 100644 clients/reth/Dockerfile.local diff --git a/clients/reth/Dockerfile.git b/clients/reth/Dockerfile.git new file mode 100644 index 0000000000..2c512db6ac --- /dev/null +++ b/clients/reth/Dockerfile.git @@ -0,0 +1,40 @@ + +### Build Reth From Git: +## Pulls reth from a git repository and builds it from source. + +## Builder stage: Compiles reth from a git repository +FROM rust:latest as builder + +ARG github=paradigmxyz/reth +ARG tag=main + +RUN apt-get update && apt-get install -y libclang-dev pkg-config build-essential \ + && echo "Cloning: $github - $tag" \ + && git clone --depth 1 --branch $tag https://github.com/$github reth \ + && cd reth && cargo build --release \ + && cp target/release/reth /usr/local/bin/reth + +## Final stage: Sets up the environment for running reth +FROM debian:latest +RUN apt-get update && apt-get install -y bash curl jq \ + && apt-get clean && rm -rf /var/lib/apt/lists/* + +# Copy compiled binary from builder +COPY --from=builder /usr/local/bin/reth /usr/local/bin/reth + +# Add genesis mapper script, startup script, and enode URL retriever script +COPY genesis.json /genesis.json +COPY mapper.jq /mapper.jq +COPY reth.sh /reth.sh +COPY enode.sh /hive-bin/enode.sh + +# Set execute permissions for scripts +RUN chmod +x /reth.sh /hive-bin/enode.sh + +# Create version.txt +RUN /usr/local/bin/reth --version | head -1 > /version.txt + +# Export the usual networking ports +EXPOSE 8545 8546 30303 30303/udp + +ENTRYPOINT ["/reth.sh"] diff --git a/clients/reth/Dockerfile.local b/clients/reth/Dockerfile.local new file mode 100644 index 0000000000..2408efb086 --- /dev/null +++ b/clients/reth/Dockerfile.local @@ -0,0 +1,38 @@ +### Build Reth Locally: +## Requires a copy of / -> hive/clients/reth/ + +## Builder stage: Compiles reth from a git repository +FROM rust:latest as builder + +# Default local client path: clients/reth/ +ARG local_path=reth +COPY $local_path reth + +RUN apt-get update && apt-get install -y libclang-dev pkg-config build-essential \ + && cd reth && cargo build --release \ + && cp target/release/reth /usr/local/bin/reth + +## Final stage: Sets up the environment for running reth +FROM debian:latest +RUN apt-get update && apt-get install -y bash curl jq \ + && apt-get clean && rm -rf /var/lib/apt/lists/* + +# Copy compiled binary from builder +COPY --from=builder /usr/local/bin/reth /usr/local/bin/reth + +# Add genesis mapper script, startup script, and enode URL retriever script +COPY genesis.json /genesis.json +COPY mapper.jq /mapper.jq +COPY reth.sh /reth.sh +COPY enode.sh /hive-bin/enode.sh + +# Set execute permissions for scripts +RUN chmod +x /reth.sh /hive-bin/enode.sh + +# Create version.txt +RUN /usr/local/bin/reth --version | head -1 > /version.txt + +# Export the usual networking ports +EXPOSE 8545 8546 30303 30303/udp + +ENTRYPOINT ["/reth.sh"] \ No newline at end of file From 14fe7fc3e549e68f899356896710521c82562291 Mon Sep 17 00:00:00 2001 From: Gabriel-Trintinalia Date: Sat, 16 Sep 2023 01:40:40 +1000 Subject: [PATCH 013/387] clients/besu: sh - Remove legacy option from startup flags (#863) Remove legacy tx pool option Signed-off-by: Gabriel-Trintinalia --- clients/besu/besu.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clients/besu/besu.sh b/clients/besu/besu.sh index 0a260cf4c2..31dad9ed9b 100644 --- a/clients/besu/besu.sh +++ b/clients/besu/besu.sh @@ -113,7 +113,7 @@ fi if [ "$HIVE_MINER_EXTRA" != "" ]; then FLAGS="$FLAGS --miner-extra-data=$HIVE_MINER_EXTRA" fi -FLAGS="$FLAGS --min-gas-price=1 --tx-pool-price-bump=0 --tx-pool-limit-by-account-percentage=1" +FLAGS="$FLAGS --min-gas-price=1 --tx-pool-price-bump=0" # Configure peer-to-peer networking. if [ "$HIVE_BOOTNODE" != "" ]; then From ce40cedb4df92683adbfddbfed723135ec66d0f1 Mon Sep 17 00:00:00 2001 From: Dan Cline <6798349+Rjected@users.noreply.github.com> Date: Sat, 16 Sep 2023 03:55:30 -0400 Subject: [PATCH 014/387] simulators/ethereum/pyspec: update execution-spec-tests (#865) Updates execution-spec-tests version, which includes the same beacon root contract address as the existing engine-api tests --- simulators/ethereum/pyspec/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/simulators/ethereum/pyspec/Dockerfile b/simulators/ethereum/pyspec/Dockerfile index 85b5f5bfd5..a9befb51d8 100644 --- a/simulators/ethereum/pyspec/Dockerfile +++ b/simulators/ethereum/pyspec/Dockerfile @@ -21,7 +21,7 @@ COPY --from=builder /source/pyspec/pyspec . # To run locally generated fixtures, comment the following RUN lines and # uncomment the ADD line. # Download the latest fixture release. -RUN wget https://github.com/ethereum/execution-spec-tests/releases/download/v1.0.2/fixtures.tar.gz +RUN wget https://github.com/ethereum/execution-spec-tests/releases/download/v1.0.3/fixtures.tar.gz RUN tar -xzvf fixtures.tar.gz RUN mv fixtures /fixtures From 1af772f5716ad7f4829c18b06a2880a98354f256 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Sat, 16 Sep 2023 09:57:17 +0200 Subject: [PATCH 015/387] cmd/hiveview: persist column filters in URL (#864) --- cmd/hiveview/assets/index.html | 3 +- cmd/hiveview/assets/lib/app-index.js | 304 ++++++++++++++++++++------- 2 files changed, 227 insertions(+), 80 deletions(-) diff --git a/cmd/hiveview/assets/index.html b/cmd/hiveview/assets/index.html index 04f0d75f02..1b0451fe31 100644 --- a/cmd/hiveview/assets/index.html +++ b/cmd/hiveview/assets/index.html @@ -29,7 +29,8 @@

Recent results

- + +
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 cF|t~1 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

RrTRCDk!qr3 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�}Wj0q8I^LFncYI;~ZT8Uzl*D3P) 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

9Nu7>SqBaCkSwB(8hv}PRbo*8@q7Dd8c-s+1 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%0D(r2$oW{zrOD!q9#4Zr5ti`%*;paMOk=m@ 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%0DYjD69D9!jlu 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

diff --git a/cmd/hiveview/assets/lib/app-index.js b/cmd/hiveview/assets/lib/app-index.js index 93299c5357..0bcde6d114 100644 --- a/cmd/hiveview/assets/lib/app-index.js +++ b/cmd/hiveview/assets/lib/app-index.js @@ -59,7 +59,7 @@ function showFileListing(data) { suites.push(suite); }); - $('#filetable').DataTable({ + let theTable = $('#filetable').DataTable({ data: suites, pageLength: 50, autoWidth: false, @@ -133,98 +133,244 @@ function showFileListing(data) { }, }, ], - initComplete: function () { - const api = this.api(); - $('') - .appendTo($('#filetable thead')); - dateSelect(api, 0); - selectWithOptions(api, 1, anchorStartEnd); - selectWithOptions(api, 2, anchorWord); - statusSelect(api, 3); - } }); -} -function anchorWord(re) { - return '\\b' + re + '\\b'; + const filters = new ColumnFilterSet(theTable); + filters.build(); + $('#filters-clear').click(function () { + filters.clear(); + return false; + }); } -function anchorStartEnd(re) { - return '^' + re + '$'; -} +// ColumnFilterSet manages the column filters. +class ColumnFilterSet { + table = null; // holds the DataTable + + constructor(table) { + this.table = table; + this._filters = [ + new DateFilter(this, 0), + new SuiteFilter(this, 1), + new ClientFilter(this, 2), + new StatusFilter(this, 3), + ]; + } + + // build creates the filters in the table. + build() { + // Build header row. + const ncol = this.table.columns().nodes().length; + const th = ''; + const thead = $('thead', this.table.table); + $('' + th.repeat(ncol) + '').appendTo(thead); + + // Create select boxes. + this._selects = {}; + this._filters.forEach(function (f) { + const sel = f.build(); + this._selects[f.key()] = sel; + }.bind(this)) -function genericSelect(api, colIdx, modifyRE) { - const table = $('#filetable').DataTable(); - const cell = $('.filters th').eq( - $(api.column(colIdx).header()).index() - ); - - // Create the select list and search operation - const select = $(' element and adds it to the table header. + buildSelect() { + const header = $('.filters th', this._controller.table.table); + const cell = header.eq(this._columnIndex); + + // Create the select list and search operation + const _this = this; + const callback = function () { _this.apply($(this).val()) }; + const select = $(' with ')); }); - Array.from(options.values()).sort().forEach(function (d) { - select.append($('')); - }); + return select; + } } -function statusSelect(api, colIdx) { - const select = genericSelect(api, colIdx); - select.append($('')); - select.append($('')); - select.append($('')); +// DateFilter is for the date column. +class DateFilter extends ColumnFilter { + key() { return "daysago"; } + + build() { + const select = this.buildSelect(); + select.append($('')); + select.append($('')); + select.append($('')); + select.append($('')); + select.append($('')); + select.append($('')); + select.append($('')); + select.append($('')); + return select; + } + + minusXdays(x) { + const date = new Date(new Date().setDate(new Date().getDate() - x)); + return date.toLocaleDateString(); + } + + valueToRegExp(x) { + const date = this.minusXdays(0 + x); + return escapeRegExp(date); + } } -function minusXDaysDate(x) { - const date = new Date(new Date().setDate(new Date().getDate() - x)) - return date.toLocaleDateString() +// ClientFilter is for the clients column. +class ClientFilter extends ColumnFilter { + key() { return "client"; } + + build() { + return this.buildSelectWithOptions(); + } + + valueToRegExp(value) { + return '\\b' + escapeRegExp(value) + '\\b'; // anchor match to words + } +} + +// SuiteFilter is for the suite name column. +class SuiteFilter extends ColumnFilter { + key() { return "suite"; } + + build() { + return this.buildSelectWithOptions(); + } + + valueToRegExp(value) { + return '^' + escapeRegExp(value) + '$'; // anchor match to whole field + } } -function dateSelect(api, colIdx) { - const select = genericSelect(api, colIdx); - const today = new Date().toLocaleDateString(); - select.append($('')); - select.append($('')); - select.append($('')); - select.append($('')); - select.append($('')); - select.append($('')); - select.append($('')); - select.append($('')); +// StatusFilter is for the suite status column. +class StatusFilter extends ColumnFilter { + key() { return "status"; } + + build() { + const select = this.buildSelect(); + select.append($('')); + select.append($('')); + select.append($('')); + return select; + } + + valueToRegExp(value) { + if (value === 'SUCCESS') { + return '✓'; + } + return escapeRegExp(value); + } } From fc5f2c00c42bb79a921a68dc33ec07a66461358d Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Sat, 16 Sep 2023 10:09:44 +0200 Subject: [PATCH 016/387] cmd/hiveview: avoid creating history for column filter changes (#866) --- cmd/hiveview/assets/lib/app-index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/hiveview/assets/lib/app-index.js b/cmd/hiveview/assets/lib/app-index.js index 0bcde6d114..33347eb6ef 100644 --- a/cmd/hiveview/assets/lib/app-index.js +++ b/cmd/hiveview/assets/lib/app-index.js @@ -252,7 +252,7 @@ class ColumnFilter { } else { p.delete(this.key()); } - window.location.hash = p.toString(); + window.history.replaceState(null, '', '#' + p.toString()); } // valueToRegExp turns the filter value in to a regular expression for searching. From 322945164a97868825c49619182251198f0ea318 Mon Sep 17 00:00:00 2001 From: lightclient <14004106+lightclient@users.noreply.github.com> Date: Tue, 19 Sep 2023 07:43:39 +0200 Subject: [PATCH 017/387] simulators/ethereum/engine: run tests in parallel (#869) sim/eth/engine: run tests in parallel --- simulators/ethereum/engine/main.go | 295 +++++++++++++++++------------ 1 file changed, 173 insertions(+), 122 deletions(-) diff --git a/simulators/ethereum/engine/main.go b/simulators/ethereum/engine/main.go index 4790a8e98b..c45b7de8fc 100644 --- a/simulators/ethereum/engine/main.go +++ b/simulators/ethereum/engine/main.go @@ -3,170 +3,221 @@ package main import ( "fmt" "math/big" + "os" + "strconv" + "sync" "time" "github.com/ethereum/hive/hivesim" "github.com/ethereum/hive/simulators/ethereum/engine/globals" "github.com/ethereum/hive/simulators/ethereum/engine/helper" - "github.com/ethereum/hive/simulators/ethereum/engine/test" - suite_auth "github.com/ethereum/hive/simulators/ethereum/engine/suites/auth" suite_cancun "github.com/ethereum/hive/simulators/ethereum/engine/suites/cancun" suite_engine "github.com/ethereum/hive/simulators/ethereum/engine/suites/engine" - suite_ex_cap "github.com/ethereum/hive/simulators/ethereum/engine/suites/exchange_capabilities" + suite_excap "github.com/ethereum/hive/simulators/ethereum/engine/suites/exchange_capabilities" suite_withdrawals "github.com/ethereum/hive/simulators/ethereum/engine/suites/withdrawals" + "github.com/ethereum/hive/simulators/ethereum/engine/test" ) -func main() { - var ( - engine = hivesim.Suite{ - Name: "engine-api", - Description: ` +var ( + engine = hivesim.Suite{ + Name: "engine-api", + Description: ` Test Engine API tests using CL mocker to inject commands into clients after they have reached the Terminal Total Difficulty.`[1:], - } - auth = hivesim.Suite{ - Name: "engine-auth", - Description: ` + } + auth = hivesim.Suite{ + Name: "engine-auth", + Description: ` Test Engine API authentication features.`[1:], - } - excap = hivesim.Suite{ - Name: "engine-exchange-capabilities", - Description: ` + } + excap = hivesim.Suite{ + Name: "engine-exchange-capabilities", + Description: ` Test Engine API exchange capabilities.`[1:], - } - sync = hivesim.Suite{ - Name: "engine-sync", - Description: ` - Test Engine API sync, pre/post merge.`[1:], - } - withdrawals = hivesim.Suite{ - Name: "engine-withdrawals", - Description: ` + } + syncSuite = hivesim.Suite{ + Name: "engine-sync", + Description: ` + Test Engine API sync, pre/post merge.`[1:], + } + withdrawals = hivesim.Suite{ + Name: "engine-withdrawals", + Description: ` Test Engine API withdrawals, pre/post Shanghai.`[1:], - } - cancun = hivesim.Suite{ - Name: "engine-cancun", - Description: ` + } + cancun = hivesim.Suite{ + Name: "engine-cancun", + Description: ` Test Engine API on Cancun.`[1:], - } - ) + } +) +func main() { + engine.Add(hivesim.TestSpec{ + Name: "engine test loader", + Description: "", + Run: makeRunner(suite_engine.Tests, "full"), + AlwaysRun: true, + }) + auth.Add(hivesim.TestSpec{ + Name: "engine-auth test loader", + Description: "", + Run: makeRunner(suite_auth.Tests, "full"), + AlwaysRun: true, + }) + excap.Add(hivesim.TestSpec{ + Name: "engine-excap test loader", + Description: "", + Run: makeRunner(suite_excap.Tests, "full"), + AlwaysRun: true, + }) + withdrawals.Add(hivesim.TestSpec{ + Name: "engine-withdrawals test loader", + Description: "", + Run: makeRunner(suite_withdrawals.Tests, "full"), + AlwaysRun: true, + }) + cancun.Add(hivesim.TestSpec{ + Name: "engine-cancun test loader", + Description: "", + Run: makeRunner(suite_cancun.Tests, "full"), + AlwaysRun: true, + }) simulator := hivesim.New() - addTestsToSuite(simulator, &engine, suite_engine.Tests, "full") - addTestsToSuite(simulator, &auth, suite_auth.Tests, "full") - addTestsToSuite(simulator, &excap, suite_ex_cap.Tests, "full") - //suite_sync.AddSyncTestsToSuite(simulator, &sync, suite_sync.Tests) - addTestsToSuite(simulator, &withdrawals, suite_withdrawals.Tests, "full") - addTestsToSuite(simulator, &cancun, suite_cancun.Tests, "full") - // Mark suites for execution hivesim.MustRunSuite(simulator, engine) hivesim.MustRunSuite(simulator, auth) hivesim.MustRunSuite(simulator, excap) - hivesim.MustRunSuite(simulator, sync) + // hivesim.MustRunSuite(simulator, syncSuite) hivesim.MustRunSuite(simulator, withdrawals) hivesim.MustRunSuite(simulator, cancun) } -// Add test cases to a given test suite -func addTestsToSuite(sim *hivesim.Simulation, suite *hivesim.Suite, tests []test.Spec, nodeType string) { - for _, currentTest := range tests { - currentTest := currentTest - currentTestName := fmt.Sprintf("%s (%s)", currentTest.GetName(), currentTest.GetMainFork()) - // Load the genesis file specified and dynamically bundle it. - genesis := currentTest.GetGenesis() - forkConfig := currentTest.GetForkConfig() - if forkConfig == nil { - // Test cannot be configured as is for current fork, skip - fmt.Printf("skipping test \"%s\" because fork configuration is not possible\n", currentTestName) - continue - } - forkConfig.ConfigGenesis(genesis) - genesisStartOption, err := helper.GenesisStartOption(genesis) - if err != nil { - panic("unable to inject genesis") +func makeRunner(tests []test.Spec, nodeType string) func(t *hivesim.T) { + return func(t *hivesim.T) { + parallelism := 16 + if val, ok := os.LookupEnv("HIVE_PARALLELISM"); ok { + if p, err := strconv.Atoi(val); err != nil { + t.Logf("Warning: invalid HIVE_PARALLELISM value %q", val) + } else { + parallelism = p + } } + t.Log("parallelism:", parallelism) - // Calculate and set the TTD for this test - ttd := genesis.Config.TerminalTotalDifficulty + var wg sync.WaitGroup + var testCh = make(chan hivesim.TestSpec) + wg.Add(parallelism) + for i := 0; i < parallelism; i++ { + go func() { + defer wg.Done() + for test := range testCh { + t.Run(test) + } + }() + } - // Configure Forks - newParams := globals.DefaultClientEnv.Set("HIVE_TERMINAL_TOTAL_DIFFICULTY", fmt.Sprintf("%d", ttd)) - if forkConfig.ShanghaiTimestamp != nil { - newParams = newParams.Set("HIVE_SHANGHAI_TIMESTAMP", fmt.Sprintf("%d", forkConfig.ShanghaiTimestamp)) - // Ensure the merge transition is activated before shanghai. - newParams = newParams.Set("HIVE_MERGE_BLOCK_ID", "0") - if forkConfig.CancunTimestamp != nil { - newParams = newParams.Set("HIVE_CANCUN_TIMESTAMP", fmt.Sprintf("%d", forkConfig.CancunTimestamp)) + for _, currentTest := range tests { + currentTest := currentTest + currentTestName := fmt.Sprintf("%s (%s)", currentTest.GetName(), currentTest.GetMainFork()) + // Load the genesis file specified and dynamically bundle it. + genesis := currentTest.GetGenesis() + forkConfig := currentTest.GetForkConfig() + if forkConfig == nil { + // Test cannot be configured as is for current fork, skip + fmt.Printf("skipping test \"%s\" because fork configuration is not possible\n", currentTestName) + continue + } + forkConfig.ConfigGenesis(genesis) + genesisStartOption, err := helper.GenesisStartOption(genesis) + if err != nil { + panic("unable to inject genmsis") } - } - if nodeType != "" { - newParams = newParams.Set("HIVE_NODETYPE", nodeType) - } + // Calculate and set the TTD for this test + ttd := genesis.Config.TerminalTotalDifficulty - testFiles := hivesim.Params{} - if genesis.Difficulty.Cmp(ttd) < 0 { + // Configure Forks + newParams := globals.DefaultClientEnv.Set("HIVE_TERMINAL_TOTAL_DIFFICULTY", fmt.Sprintf("%d", ttd)) + if forkConfig.ShanghaiTimestamp != nil { + newParams = newParams.Set("HIVE_SHANGHAI_TIMESTAMP", fmt.Sprintf("%d", forkConfig.ShanghaiTimestamp)) + // Ensure the merge transition is activated before shanghai. + newParams = newParams.Set("HIVE_MERGE_BLOCK_ID", "0") + if forkConfig.CancunTimestamp != nil { + newParams = newParams.Set("HIVE_CANCUN_TIMESTAMP", fmt.Sprintf("%d", forkConfig.CancunTimestamp)) + } + } - if currentTest.GetChainFile() != "" { - // We are using a Proof of Work chain file, remove all clique-related settings - // TODO: Nethermind still requires HIVE_MINER for the Engine API - // delete(newParams, "HIVE_MINER") + if nodeType != "" { + newParams = newParams.Set("HIVE_NODETYPE", nodeType) + } + + testFiles := hivesim.Params{} + if genesis.Difficulty.Cmp(ttd) < 0 { + if currentTest.GetChainFile() != "" { + // We are using a Proof of Work chain file, remove all clique-related settings + // TODO: Nethermind still requires HIVE_MINER for the Engine API + // delete(newParams, "HIVE_MINER") + delete(newParams, "HIVE_CLIQUE_PRIVATEKEY") + delete(newParams, "HIVE_CLIQUE_PERIOD") + // Add the new file to be loaded as chain.rlp + testFiles = testFiles.Set("/chain.rlp", "./chains/"+currentTest.GetChainFile()) + } + if currentTest.IsMiningDisabled() { + delete(newParams, "HIVE_MINER") + } + } else { + // This is a post-merge test delete(newParams, "HIVE_CLIQUE_PRIVATEKEY") delete(newParams, "HIVE_CLIQUE_PERIOD") - // Add the new file to be loaded as chain.rlp - testFiles = testFiles.Set("/chain.rlp", "./chains/"+currentTest.GetChainFile()) - } - if currentTest.IsMiningDisabled() { delete(newParams, "HIVE_MINER") + newParams = newParams.Set("HIVE_POST_MERGE_GENESIS", "true") } - } else { - // This is a post-merge test - delete(newParams, "HIVE_CLIQUE_PRIVATEKEY") - delete(newParams, "HIVE_CLIQUE_PERIOD") - delete(newParams, "HIVE_MINER") - newParams = newParams.Set("HIVE_POST_MERGE_GENESIS", "true") - } - if clientTypes, err := sim.ClientTypes(); err == nil { - for _, clientType := range clientTypes { - suite.Add(hivesim.TestSpec{ - Name: fmt.Sprintf("%s (%s)", currentTestName, clientType.Name), - Description: currentTest.GetAbout(), - Run: func(t *hivesim.T) { - // Start the client with given options - c := t.StartClient( - clientType.Name, - newParams, - genesisStartOption, - hivesim.WithStaticFiles(testFiles), - ) - t.Logf("Start test (%s): %s", c.Type, currentTestName) - defer func() { - t.Logf("End test (%s): %s", c.Type, currentTestName) - }() - timeout := globals.DefaultTestCaseTimeout - // If a test.Spec specifies a timeout, use that instead - if currentTest.GetTimeout() != 0 { - timeout = time.Second * time.Duration(currentTest.GetTimeout()) - } - // Run the test case - test.Run( - currentTest, - new(big.Int).Set(ttd), - timeout, - t, - c, - genesis, - newParams, - testFiles, - ) - }, - }) + if clientTypes, err := t.Sim.ClientTypes(); err == nil { + for _, clientType := range clientTypes { + test := hivesim.TestSpec{ + Name: fmt.Sprintf("%s (%s)", currentTestName, clientType.Name), + Description: currentTest.GetAbout(), + Run: func(t *hivesim.T) { + // Start the client with given options + c := t.StartClient( + clientType.Name, + newParams, + genesisStartOption, + hivesim.WithStaticFiles(testFiles), + ) + t.Logf("Start test (%s): %s", c.Type, currentTestName) + defer func() { + t.Logf("End test (%s): %s", c.Type, currentTestName) + }() + timeout := globals.DefaultTestCaseTimeout + // If a test.Spec specifies a timeout, use that instead + if currentTest.GetTimeout() != 0 { + timeout = time.Second * time.Duration(currentTest.GetTimeout()) + } + // Run the test case + test.Run( + currentTest, + new(big.Int).Set(ttd), + timeout, + t, + c, + genesis, + newParams, + testFiles, + ) + }, + } + testCh <- test + } } } + // Wait for all test threads to finish. + close(testCh) + defer wg.Wait() } } From 2d06e4a6e2b864905be57ca787544720274e9823 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Tue, 19 Sep 2023 12:48:34 +0200 Subject: [PATCH 018/387] hiveproxy: upgrade dependencies --- hiveproxy/go.mod | 17 ++++++++++------- hiveproxy/go.sum | 47 ++++++++++++++++++++++------------------------- 2 files changed, 32 insertions(+), 32 deletions(-) diff --git a/hiveproxy/go.mod b/hiveproxy/go.mod index 830ef886a4..45b1b78198 100644 --- a/hiveproxy/go.mod +++ b/hiveproxy/go.mod @@ -3,21 +3,24 @@ module github.com/ethereum/hive/hiveproxy go 1.18 require ( - github.com/ethereum/go-ethereum v1.11.4 + github.com/ethereum/go-ethereum v1.13.1 github.com/hashicorp/yamux v0.1.1 ) require ( + github.com/Microsoft/go-winio v0.6.1 // indirect github.com/deckarep/golang-set/v2 v2.1.0 // indirect github.com/go-ole/go-ole v1.2.6 // indirect github.com/go-stack/stack v1.8.1 // indirect github.com/gorilla/websocket v1.5.0 // indirect + github.com/holiman/uint256 v1.2.3 // indirect github.com/shirou/gopsutil v3.21.11+incompatible // indirect - github.com/stretchr/testify v1.8.1 // indirect - github.com/tklauser/go-sysconf v0.3.11 // indirect - github.com/tklauser/numcpus v0.6.0 // indirect + github.com/tklauser/go-sysconf v0.3.12 // indirect + github.com/tklauser/numcpus v0.6.1 // indirect github.com/yusufpapurcu/wmi v1.2.2 // indirect - golang.org/x/crypto v0.4.0 // indirect - golang.org/x/sys v0.5.0 // indirect - gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce // indirect + golang.org/x/crypto v0.12.0 // indirect + golang.org/x/exp v0.0.0-20230810033253-352e893a4cad // indirect + golang.org/x/mod v0.11.0 // indirect + golang.org/x/sys v0.11.0 // indirect + golang.org/x/tools v0.9.1 // indirect ) diff --git a/hiveproxy/go.sum b/hiveproxy/go.sum index 5c53a5a126..0a3ec116b9 100644 --- a/hiveproxy/go.sum +++ b/hiveproxy/go.sum @@ -1,10 +1,10 @@ -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= +github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/deckarep/golang-set/v2 v2.1.0 h1:g47V4Or+DUdzbs8FxCCmgb6VYd+ptPAngjM6dtGktsI= github.com/deckarep/golang-set/v2 v2.1.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= -github.com/ethereum/go-ethereum v1.11.4 h1:KG81SnUHXWk8LJB3mBcHg/E2yLvXoiPmRMCIRxgx3cE= -github.com/ethereum/go-ethereum v1.11.4/go.mod h1:it7x0DWnTDMfVFdXcU6Ti4KEFQynLHVRarcSlPr0HBo= +github.com/ethereum/go-ethereum v1.13.1 h1:UF2FaUKPIy5jeZk3X06ait3y2Q4wI+vJ1l7+UARp+60= +github.com/ethereum/go-ethereum v1.13.1/go.mod h1:xHQKzwkHSl0gnSjZK1mWa06XEdm9685AHqhRknOzqGQ= github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-stack/stack v1.8.1 h1:ntEHSVwIt7PNXNpgPmVfMrNhLtgjlmnZha2kOpuRiDw= @@ -13,32 +13,29 @@ github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWm github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/hashicorp/yamux v0.1.1 h1:yrQxtgseBDrq9Y652vSRDvsKCJKOUD+GzTS4Y0Y8pvE= github.com/hashicorp/yamux v0.1.1/go.mod h1:CtWFDAQgb7dxtzFs4tWbplKIe2jSi3+5vKbgIO0SLnQ= +github.com/holiman/uint256 v1.2.3 h1:K8UWO1HUJpRMXBxbmaY1Y8IAMZC/RsKB+ArEnnK4l5o= +github.com/holiman/uint256 v1.2.3/go.mod h1:SC8Ryt4n+UBbPbIBKaG9zbbDlp4jOru9xFZmPzLUTxw= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI= github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= -github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/tklauser/go-sysconf v0.3.11 h1:89WgdJhk5SNwJfu+GKyYveZ4IaJ7xAkecBo+KdJV0CM= -github.com/tklauser/go-sysconf v0.3.11/go.mod h1:GqXfhXY3kiPa0nAXPDIQIWzJbMCB7AmcWpGR8lSZfqI= -github.com/tklauser/numcpus v0.6.0 h1:kebhY2Qt+3U6RNK7UqpYNA+tJ23IBEGKkB7JQBfDYms= -github.com/tklauser/numcpus v0.6.0/go.mod h1:FEZLMke0lhOUG6w2JadTzp0a+Nl8PF/GFkQ5UVIcaL4= +github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= +github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= +github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= +github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= github.com/yusufpapurcu/wmi v1.2.2 h1:KBNDSne4vP5mbSWnJbO+51IMOXJB67QiYCSBrubbPRg= github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= -golang.org/x/crypto v0.4.0 h1:UVQgzMY87xqpKNgb+kDsll2Igd33HszWHFLmpaRMq/8= -golang.org/x/crypto v0.4.0/go.mod h1:3quD/ATkf6oY+rnes5c3ExXTbLc8mueNue5/DoinL80= +golang.org/x/crypto v0.12.0 h1:tFM/ta59kqch6LlvYnPa0yx5a83cL2nHflFhYKvv9Yk= +golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= +golang.org/x/exp v0.0.0-20230810033253-352e893a4cad h1:g0bG7Z4uG+OgH2QDODnjp6ggkk1bJDsINcuWmJN1iJU= +golang.org/x/exp v0.0.0-20230810033253-352e893a4cad/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc= +golang.org/x/mod v0.11.0 h1:bUO06HqtnRcc/7l71XBe4WcqTZ+3AH1J59zWDDwLKgU= +golang.org/x/mod v0.11.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU= -golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce h1:+JknDZhAj8YMt7GC73Ei8pv4MzjDUNPHgQWJdtMAaDU= -gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:5AcXVHNjg+BDxry382+8OKon8SEWiKktQR07RKPsv1c= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM= +golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/tools v0.9.1 h1:8WMNJAz3zrtPmnYC7ISf5dEn3MT0gY7jBJfw27yrrLo= +golang.org/x/tools v0.9.1/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= -gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= From 37cbbe1ef86dcf70ea915597b0cd3fc1f5f9c5db Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Tue, 19 Sep 2023 12:58:11 +0200 Subject: [PATCH 019/387] go.mod: upgrade dependencies go-ethereum v1.13 no longer provides ethash mining, so this feature had to be removed from hivechain. --- cmd/hivechain/generate.go | 18 +- cmd/hivechain/main.go | 8 - go.mod | 51 ++- go.sum | 896 +++----------------------------------- 4 files changed, 98 insertions(+), 875 deletions(-) diff --git a/cmd/hivechain/generate.go b/cmd/hivechain/generate.go index 37eff3fbed..3ef5079a50 100644 --- a/cmd/hivechain/generate.go +++ b/cmd/hivechain/generate.go @@ -23,6 +23,7 @@ import ( "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/params" + "github.com/ethereum/go-ethereum/trie" ) func init() { @@ -51,7 +52,6 @@ type generatorConfig struct { blockCount int // number of generated pow blocks posBlockCount int // number of generated pos blocks blockTimeSec int // block time in seconds, influences difficulty - powMode ethash.Mode genesis core.Genesis isPoS bool // true if the generator should create post pos blocks modifyBlock func(*types.Block) *types.Block // modify the block during exporting @@ -165,7 +165,7 @@ func generateTx(txType int, key *ecdsa.PrivateKey, genesis *core.Genesis, gen *c tx = types.NewContractCreation(gen.TxNonce(src), new(big.Int), gas, gasprice, input) } // Sign the transaction. - signer := types.MakeSigner(genesis.Config, gen.Number()) + signer := types.MakeSigner(genesis.Config, gen.Number(), gen.Timestamp()) signedTx, err := types.SignTx(tx, signer, key) if err != nil { panic(err) @@ -176,7 +176,7 @@ func generateTx(txType int, key *ecdsa.PrivateKey, genesis *core.Genesis, gen *c func createTxGasLimit(gen *core.BlockGen, genesis *core.Genesis, data []byte) uint64 { isHomestead := genesis.Config.IsHomestead(gen.Number()) isEIP2028 := genesis.Config.IsIstanbul(gen.Number()) - isEIP3860 := genesis.Config.IsShanghai(gen.Timestamp()) + isEIP3860 := genesis.Config.IsShanghai(gen.Number(), gen.Timestamp()) igas, err := core.IntrinsicGas(data, nil, true, isHomestead, isEIP2028, isEIP3860) if err != nil { panic(err) @@ -187,16 +187,10 @@ func createTxGasLimit(gen *core.BlockGen, genesis *core.Genesis, data []byte) ui // generateAndSave produces a chain based on the config. func (cfg generatorConfig) generateAndSave(path string, blockModifier func(i int, gen *core.BlockGen)) error { db := rawdb.NewMemoryDatabase() - genesis := cfg.genesis.MustCommit(db) + triedb := trie.NewDatabase(db, trie.HashDefaults) + genesis := cfg.genesis.MustCommit(db, triedb) config := cfg.genesis.Config - ethashConf := ethash.Config{ - PowMode: cfg.powMode, - CachesInMem: 2, - DatasetsOnDisk: 2, - DatasetDir: ethashDir(), - } - - powEngine := ethash.New(ethashConf, nil, false) + powEngine := ethash.NewFaker() posEngine := beacon.New(powEngine) engine := instaSeal{posEngine} diff --git a/cmd/hivechain/main.go b/cmd/hivechain/main.go index bc048e1d89..e1c109f622 100644 --- a/cmd/hivechain/main.go +++ b/cmd/hivechain/main.go @@ -25,7 +25,6 @@ import ( "io" "os" - "github.com/ethereum/go-ethereum/consensus/ethash" "github.com/ethereum/go-ethereum/core/types" ethlog "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/rlp" @@ -158,7 +157,6 @@ func generateCommand(args []string) { cfg generatorConfig genesis = flag.String("genesis", "", "The path and filename to the source genesis.json") outdir = flag.String("output", ".", "Chain destination folder") - mine = flag.Bool("mine", false, "Enables ethash mining") pos = flag.Bool("pos", false, "Enables PoS chain") ) flag.IntVar(&cfg.blockCount, "length", 2, "The length of the pow chain to generate") @@ -171,12 +169,6 @@ func generateCommand(args []string) { if *genesis == "" { fatalf("Missing -genesis option, please supply a genesis.json file.") } - if *mine { - cfg.powMode = ethash.ModeNormal - } else { - cfg.powMode = ethash.ModeFullFake - } - cfg.isPoS = *pos gspec, err := loadGenesis(*genesis) diff --git a/go.mod b/go.mod index 6bd3961d18..d005a4f453 100644 --- a/go.mod +++ b/go.mod @@ -4,13 +4,13 @@ go 1.20 require ( github.com/davecgh/go-spew v1.1.1 - github.com/ethereum/go-ethereum v1.11.4 + github.com/ethereum/go-ethereum v1.13.1 github.com/ethereum/hive/hiveproxy v0.0.0-20230313101845-c7dfe88c8138 github.com/evanw/esbuild v0.18.11 - github.com/fsouza/go-dockerclient v1.8.1 + github.com/fsouza/go-dockerclient v1.9.8 github.com/gorilla/mux v1.8.0 - golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1 - golang.org/x/net v0.7.0 + golang.org/x/exp v0.0.0-20230810033253-352e893a4cad + golang.org/x/net v0.10.0 gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1 gopkg.in/yaml.v3 v3.0.1 ) @@ -18,37 +18,38 @@ require ( require ( github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 // indirect github.com/DataDog/zstd v1.5.2 // indirect - github.com/Microsoft/go-winio v0.5.2 // indirect - github.com/Microsoft/hcsshim v0.9.6 // indirect + github.com/Microsoft/go-winio v0.6.1 // indirect github.com/VictoriaMetrics/fastcache v1.12.0 // indirect github.com/allegro/bigcache v1.2.1 // indirect github.com/beorn7/perks v1.0.1 // indirect + github.com/bits-and-blooms/bitset v1.5.0 // indirect github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/cockroachdb/errors v1.9.1 // indirect github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect - github.com/cockroachdb/pebble v0.0.0-20230209160836-829675f94811 // indirect + github.com/cockroachdb/pebble v0.0.0-20230906160148-46873a6a7a06 // indirect github.com/cockroachdb/redact v1.1.3 // indirect - github.com/containerd/cgroups v1.0.4 // indirect + github.com/consensys/bavard v0.1.13 // indirect + github.com/consensys/gnark-crypto v0.10.0 // indirect github.com/containerd/containerd v1.6.18 // indirect + github.com/crate-crypto/go-kzg-4844 v0.3.0 // indirect github.com/deckarep/golang-set/v2 v2.1.0 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 // indirect - github.com/docker/docker v20.10.17+incompatible // indirect + github.com/docker/docker v24.0.5+incompatible // indirect github.com/docker/go-connections v0.4.0 // indirect - github.com/docker/go-units v0.4.0 // indirect - github.com/edsrzf/mmap-go v1.1.0 // indirect + github.com/docker/go-units v0.5.0 // indirect + github.com/ethereum/c-kzg-4844 v0.3.1 // indirect github.com/getsentry/sentry-go v0.18.0 // indirect github.com/go-ole/go-ole v1.2.6 // indirect github.com/go-stack/stack v1.8.1 // indirect github.com/gofrs/flock v0.8.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/protobuf v1.5.2 // indirect - github.com/golang/snappy v0.0.4 // indirect + github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect github.com/gorilla/websocket v1.5.0 // indirect github.com/hashicorp/yamux v0.1.1 // indirect github.com/holiman/bloomfilter/v2 v2.0.3 // indirect - github.com/holiman/uint256 v1.2.1 // indirect + github.com/holiman/uint256 v1.2.3 // indirect github.com/klauspost/compress v1.15.15 // indirect github.com/kr/pretty v0.3.1 // indirect github.com/kr/text v0.2.0 // indirect @@ -56,8 +57,9 @@ require ( github.com/mattn/go-isatty v0.0.16 // indirect github.com/mattn/go-runewidth v0.0.14 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect - github.com/moby/sys/mount v0.3.3 // indirect - github.com/moby/sys/mountinfo v0.6.2 // indirect + github.com/mmcloughlin/addchain v0.4.0 // indirect + github.com/moby/patternmatcher v0.6.0 // indirect + github.com/moby/sys/sequential v0.5.0 // indirect github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6 // indirect github.com/morikuni/aec v1.0.0 // indirect github.com/olekukonko/tablewriter v0.0.5 // indirect @@ -73,16 +75,19 @@ require ( github.com/rogpeppe/go-internal v1.9.0 // indirect github.com/shirou/gopsutil v3.21.11+incompatible // indirect github.com/sirupsen/logrus v1.9.0 // indirect + github.com/supranational/blst v0.3.11 // indirect github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a // indirect - github.com/tklauser/go-sysconf v0.3.11 // indirect - github.com/tklauser/numcpus v0.6.0 // indirect + github.com/tklauser/go-sysconf v0.3.12 // indirect + github.com/tklauser/numcpus v0.6.1 // indirect github.com/yusufpapurcu/wmi v1.2.2 // indirect - go.opencensus.io v0.23.0 // indirect - golang.org/x/crypto v0.4.0 // indirect - golang.org/x/sys v0.5.0 // indirect - golang.org/x/text v0.7.0 // indirect + golang.org/x/crypto v0.12.0 // indirect + golang.org/x/mod v0.11.0 // indirect + golang.org/x/sync v0.3.0 // indirect + golang.org/x/sys v0.11.0 // indirect + golang.org/x/text v0.12.0 // indirect + golang.org/x/tools v0.9.1 // indirect google.golang.org/protobuf v1.28.1 // indirect - gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce // indirect + rsc.io/tmplfunc v0.0.3 // indirect ) replace github.com/ethereum/hive/hiveproxy => ./hiveproxy diff --git a/go.sum b/go.sum index 4090626604..a3031f184e 100644 --- a/go.sum +++ b/go.sum @@ -1,334 +1,108 @@ -bazil.org/fuse v0.0.0-20160811212531-371fbbdaa898/go.mod h1:Xbm+BRKSBEpa4q4hTSxohYNQpsxXPbPry4JJWOB3LB8= cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= -cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= -cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= -cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= -cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= -cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= -cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= -cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= -cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= -cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= -cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= -cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= -cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= -cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= -cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= -cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= -cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= -cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +github.com/AdaLogics/go-fuzz-headers v0.0.0-20210715213245-6c3934b029d8 h1:V8krnnfGj4pV65YLUm3C0/8bl7V5Nry2Pwvy3ru/wLc= github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= -github.com/Azure/azure-sdk-for-go v16.2.1+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8= github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= -github.com/Azure/go-autorest v10.8.1+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest/autorest v0.11.1/go.mod h1:JFgpikqFJ/MleTTxwepExTKnFUKKszPS8UavbQYUMuw= -github.com/Azure/go-autorest/autorest/adal v0.9.0/go.mod h1:/c022QCutn2P7uY+/oQWWNcK9YU+MH96NgK+jErpbcg= -github.com/Azure/go-autorest/autorest/adal v0.9.5/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A= -github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= -github.com/Azure/go-autorest/autorest/mocks v0.4.0/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= -github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= -github.com/Azure/go-autorest/logger v0.2.0/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= -github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/CloudyKit/fastprinter v0.0.0-20200109182630-33d98a066a53/go.mod h1:+3IMCy2vIlbG1XG/0ggNQv0SvxCAIpPM5b1nCz56Xno= github.com/CloudyKit/jet/v3 v3.0.0/go.mod h1:HKQPgSJmdK8hdoAbKUUWajkHyHo4RaU5rMdUywE7VMo= github.com/DataDog/zstd v1.5.2 h1:vUG4lAyuPCXO0TLbXvPv7EB7cNK1QV/luu55UHLrrn8= github.com/DataDog/zstd v1.5.2/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= github.com/Joker/hpp v1.0.0/go.mod h1:8x5n+M1Hp5hC0g8okX3sR3vFQwynaX/UgSOM9MeBKzY= -github.com/Microsoft/go-winio v0.4.11/go.mod h1:VhR8bwka0BXejwEJY73c50VrPtXAaKcyvVC4A4RozmA= -github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= -github.com/Microsoft/go-winio v0.4.15-0.20190919025122-fc70bd9a86b5/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw= -github.com/Microsoft/go-winio v0.4.16-0.20201130162521-d1ffc52c7331/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0= -github.com/Microsoft/go-winio v0.4.16/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0= -github.com/Microsoft/go-winio v0.4.17-0.20210211115548-6eac466e5fa3/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= -github.com/Microsoft/go-winio v0.4.17-0.20210324224401-5516f17a5958/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= -github.com/Microsoft/go-winio v0.4.17/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= -github.com/Microsoft/go-winio v0.5.2 h1:a9IhgEQBCUEk6QCdml9CiJGhAws+YwffDHEMp1VMrpA= -github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY= -github.com/Microsoft/hcsshim v0.8.6/go.mod h1:Op3hHsoHPAvb6lceZHDtd9OkTew38wNoXnJs8iY7rUg= -github.com/Microsoft/hcsshim v0.8.7-0.20190325164909-8abdbb8205e4/go.mod h1:Op3hHsoHPAvb6lceZHDtd9OkTew38wNoXnJs8iY7rUg= -github.com/Microsoft/hcsshim v0.8.7/go.mod h1:OHd7sQqRFrYd3RmSgbgji+ctCwkbq2wbEYNSzOYtcBQ= -github.com/Microsoft/hcsshim v0.8.9/go.mod h1:5692vkUqntj1idxauYlpoINNKeqCiG6Sg38RRsjT5y8= -github.com/Microsoft/hcsshim v0.8.14/go.mod h1:NtVKoYxQuTLx6gEq0L96c9Ju4JbRJ4nY2ow3VK6a9Lg= -github.com/Microsoft/hcsshim v0.8.15/go.mod h1:x38A4YbHbdxJtc0sF6oIz+RG0npwSCAvn69iY6URG00= -github.com/Microsoft/hcsshim v0.8.16/go.mod h1:o5/SZqmR7x9JNKsW3pu+nqHm0MF8vbA+VxGOoXdC600= -github.com/Microsoft/hcsshim v0.8.21/go.mod h1:+w2gRZ5ReXQhFOrvSQeNfhrYB/dg3oDwTOcER2fw4I4= +github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= +github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= github.com/Microsoft/hcsshim v0.9.6 h1:VwnDOgLeoi2du6dAznfmspNqTiwczvjv4K7NxuY9jsY= -github.com/Microsoft/hcsshim v0.9.6/go.mod h1:7pLA8lDk46WKDWlVsENo92gC0XFa8rbKfyFRBqxEbCc= -github.com/Microsoft/hcsshim/test v0.0.0-20201218223536-d3e5debf77da/go.mod h1:5hlzMzRKMLyo42nCZ9oml8AdTlq/0cvIaBv6tK1RehU= -github.com/Microsoft/hcsshim/test v0.0.0-20210227013316-43a75bb4edd3/go.mod h1:mw7qgWloBUl75W/gVH3cQszUg1+gUITj7D6NY7ywVnY= -github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= github.com/Shopify/goreferrer v0.0.0-20181106222321-ec9c9a553398/go.mod h1:a1uqRtAwp2Xwc6WNPJEufxJ7fx3npB4UV/JOLmbu5I0= -github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d/go.mod h1:HI8ITrYtUY+O+ZhtlqUnD8+KwNPOyugEhfP9fdUIaEQ= github.com/VictoriaMetrics/fastcache v1.12.0 h1:vnVi/y9yKDcD9akmc4NqAoqgQhJrOwUF+j9LTgn4QDE= github.com/VictoriaMetrics/fastcache v1.12.0/go.mod h1:tjiYeEfYXCqacuvYw/7UoDIeJaNxq6132xHICNP77w8= github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY= -github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= -github.com/alexflint/go-filemutex v0.0.0-20171022225611-72bdc8eae2ae/go.mod h1:CgnQgUtFrFz9mxFNtED3jI5tLDjKlOM+oUF/sTk6ps0= github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= github.com/allegro/bigcache v1.2.1 h1:hg1sY1raCwic3Vnsvje6TT7/pnZba83LeFck5NrFKSc= github.com/allegro/bigcache v1.2.1/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= -github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= -github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= -github.com/aws/aws-sdk-go v1.15.11/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= github.com/aymerick/raymond v2.0.3-0.20180322193309-b565731e1464+incompatible/go.mod h1:osfaiScAUVup+UC9Nfq76eWqDhXlp+4UYaA8uhTBO6g= -github.com/beorn7/perks v0.0.0-20160804104726-4c0e84591b9a/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/bitly/go-simplejson v0.5.0/go.mod h1:cXHtHw4XUPsvGaxgjIAn8PhEWG9NfngEKAMDJEczWVA= -github.com/bits-and-blooms/bitset v1.2.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= -github.com/blang/semver v3.1.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= -github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= -github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= -github.com/bshuster-repo/logrus-logstash-hook v0.4.1/go.mod h1:zsTqEiSzDgAa/8GZR7E1qaXrhYNDKBYy5/dWPTIflbk= +github.com/bits-and-blooms/bitset v1.5.0 h1:NpE8frKRLGHIcEzkR+gZhiioW1+WbYV6fKwD6ZIpQT8= +github.com/bits-and-blooms/bitset v1.5.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U= github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= -github.com/buger/jsonparser v0.0.0-20180808090653-f4dd9f5a6b44/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s= -github.com/bugsnag/bugsnag-go v0.0.0-20141110184014-b1d153021fcd/go.mod h1:2oa8nejYd4cQ/b0hMIopN0lCRxU0bueqREvZLWFrtK8= -github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b/go.mod h1:obH5gd0BsqsP2LwDJ9aOkm/6J86V6lyAXCoQWGw3K50= -github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0/go.mod h1:D/8v3kj0zr8ZAKg1AQ6crr+5VwKN5eIywRkfhyM/+dE= -github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/checkpoint-restore/go-criu/v4 v4.1.0/go.mod h1:xUQBLp4RLc5zJtWY++yjOoMoB5lihDt7fai+75m+rGw= -github.com/checkpoint-restore/go-criu/v5 v5.0.0/go.mod h1:cfwC0EG7HMUenopBsUf9d89JlCLQIfgVcNsNN0t6T2M= github.com/checkpoint-restore/go-criu/v5 v5.3.0/go.mod h1:E/eQpaFtUKGOOSEBZgmKAcn+zUUwWxqcaKZlF54wK8E= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/cilium/ebpf v0.0.0-20200110133405-4032b1d8aae3/go.mod h1:MA5e5Lr8slmEg9bt0VpxxWqJlO4iwu3FBdHUzV7wQVg= -github.com/cilium/ebpf v0.0.0-20200702112145-1c8d4c9ef775/go.mod h1:7cR51M8ViRLIdUjrmSXlK9pkrsDlLHbO8jiB8X8JnOc= -github.com/cilium/ebpf v0.2.0/go.mod h1:To2CFviqOWL/M0gIMsvSMlqe7em/l1ALkX1PyjrX2Qs= -github.com/cilium/ebpf v0.4.0/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs= -github.com/cilium/ebpf v0.6.2/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs= github.com/cilium/ebpf v0.7.0/go.mod h1:/oI2+1shJiTGAMgl6/RgJr36Eo1jzrRcAWbcXO2usCA= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= -github.com/cockroachdb/datadriven v1.0.2 h1:H9MtNqVoVhvd9nCBwOyDjUEdZCREqbIdCJD93PBm/jA= github.com/cockroachdb/datadriven v1.0.2/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= +github.com/cockroachdb/datadriven v1.0.3-0.20230801171734-e384cf455877 h1:1MLK4YpFtIEo3ZtMA5C795Wtv5VuUnrXX7mQG+aHg6o= github.com/cockroachdb/errors v1.9.1 h1:yFVvsI0VxmRShfawbt/laCIDy/mtTqqnvoNgiy5bEV8= github.com/cockroachdb/errors v1.9.1/go.mod h1:2sxOtL2WIc096WSZqZ5h8fa17rdDq9HZOZLBCor4mBk= github.com/cockroachdb/logtags v0.0.0-20211118104740-dabe8e521a4f/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= -github.com/cockroachdb/pebble v0.0.0-20230209160836-829675f94811 h1:ytcWPaNPhNoGMWEhDvS3zToKcDpRsLuRolQJBVGdozk= -github.com/cockroachdb/pebble v0.0.0-20230209160836-829675f94811/go.mod h1:Nb5lgvnQ2+oGlE/EyZy4+2/CxRh9KfvCXnag1vtpxVM= +github.com/cockroachdb/pebble v0.0.0-20230906160148-46873a6a7a06 h1:T+Np/xtzIjYM/P5NAw0e2Rf1FGvzDau1h54MKvx8G7w= +github.com/cockroachdb/pebble v0.0.0-20230906160148-46873a6a7a06/go.mod h1:bynZ3gvVyhlvjLI7PT6dmZ7g76xzJ7HpxfjgkzCGz6s= github.com/cockroachdb/redact v1.1.3 h1:AKZds10rFSIj7qADf0g46UixK8NNLwWTNdCIGS5wfSQ= github.com/cockroachdb/redact v1.1.3/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= -github.com/cockroachdb/sentry-go v0.6.1-cockroachdb.2/go.mod h1:8BT+cPK6xvFOcRlk0R8eg+OTkcqI6baNH4xAkpiYVvQ= github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0/go.mod h1:4Zcjuz89kmFXt9morQgcfYZAYZ5n8WHjt81YYWIwtTM= -github.com/containerd/aufs v0.0.0-20200908144142-dab0cbea06f4/go.mod h1:nukgQABAEopAHvB6j7cnP5zJ+/3aVcE7hCYqvIwAHyE= -github.com/containerd/aufs v0.0.0-20201003224125-76a6863f2989/go.mod h1:AkGGQs9NM2vtYHaUen+NljV0/baGCAPELGm2q9ZXpWU= -github.com/containerd/aufs v0.0.0-20210316121734-20793ff83c97/go.mod h1:kL5kd6KM5TzQjR79jljyi4olc1Vrx6XBlcyj3gNv2PU= -github.com/containerd/aufs v1.0.0/go.mod h1:kL5kd6KM5TzQjR79jljyi4olc1Vrx6XBlcyj3gNv2PU= -github.com/containerd/btrfs v0.0.0-20201111183144-404b9149801e/go.mod h1:jg2QkJcsabfHugurUvvPhS3E08Oxiuh5W/g1ybB4e0E= -github.com/containerd/btrfs v0.0.0-20210316141732-918d888fb676/go.mod h1:zMcX3qkXTAi9GI50+0HOeuV8LU2ryCE/V2vG/ZBiTss= -github.com/containerd/btrfs v1.0.0/go.mod h1:zMcX3qkXTAi9GI50+0HOeuV8LU2ryCE/V2vG/ZBiTss= -github.com/containerd/cgroups v0.0.0-20190717030353-c4b9ac5c7601/go.mod h1:X9rLEHIqSf/wfK8NsPqxJmeZgW4pcfzdXITDrUSJ6uI= -github.com/containerd/cgroups v0.0.0-20190919134610-bf292b21730f/go.mod h1:OApqhQ4XNSNC13gXIwDjhOQxjWa/NxkwZXJ1EvqT0ko= -github.com/containerd/cgroups v0.0.0-20200531161412-0dbf7f05ba59/go.mod h1:pA0z1pT8KYB3TCXK/ocprsh7MAkoW8bZVzPdih9snmM= -github.com/containerd/cgroups v0.0.0-20200710171044-318312a37340/go.mod h1:s5q4SojHctfxANBDvMeIaIovkq29IP48TKAxnhYRxvo= -github.com/containerd/cgroups v0.0.0-20200824123100-0b889c03f102/go.mod h1:s5q4SojHctfxANBDvMeIaIovkq29IP48TKAxnhYRxvo= -github.com/containerd/cgroups v0.0.0-20210114181951-8a68de567b68/go.mod h1:ZJeTFisyysqgcCdecO57Dj79RfL0LNeGiFUqLYQRYLE= -github.com/containerd/cgroups v1.0.1/go.mod h1:0SJrPIenamHDcZhEcJMNBB85rHcUsw4f25ZfBiPYRkU= -github.com/containerd/cgroups v1.0.4 h1:jN/mbWBEaz+T1pi5OFtnkQ+8qnmEbAr1Oo1FRm5B0dA= -github.com/containerd/cgroups v1.0.4/go.mod h1:nLNQtsF7Sl2HxNebu77i1R0oDlhiTG+kO4JTrUzo6IA= -github.com/containerd/console v0.0.0-20180822173158-c12b1e7919c1/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw= -github.com/containerd/console v0.0.0-20181022165439-0650fd9eeb50/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw= -github.com/containerd/console v0.0.0-20191206165004-02ecf6a7291e/go.mod h1:8Pf4gM6VEbTNRIT26AyyU7hxdQU3MvAvxVI0sc00XBE= -github.com/containerd/console v1.0.1/go.mod h1:XUsP6YE/mKtz6bxc+I8UiKKTP04qjQL4qcS3XoQ5xkw= -github.com/containerd/console v1.0.2/go.mod h1:ytZPjGgY2oeTkAONYafi2kSj0aYggsf8acV1PGKCbzQ= +github.com/consensys/bavard v0.1.13 h1:oLhMLOFGTLdlda/kma4VOJazblc7IM5y5QPd2A/YjhQ= +github.com/consensys/bavard v0.1.13/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI= +github.com/consensys/gnark-crypto v0.10.0 h1:zRh22SR7o4K35SoNqouS9J/TKHTyU2QWaj5ldehyXtA= +github.com/consensys/gnark-crypto v0.10.0/go.mod h1:Iq/P3HHl0ElSjsg2E1gsMwhAyxnxoKK5nVyZKd+/KhU= github.com/containerd/console v1.0.3/go.mod h1:7LqA/THxQ86k76b8c/EMSiaJ3h1eZkMkXar0TQ1gf3U= -github.com/containerd/containerd v1.2.10/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.3.0-beta.2.0.20190828155532-0293cbd26c69/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.3.0/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.3.1-0.20191213020239-082f7e3aed57/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.3.2/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.4.0-beta.2.0.20200729163537-40b22ef07410/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.4.1/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.4.3/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.5.0-beta.1/go.mod h1:5HfvG1V2FsKesEGQ17k5/T7V960Tmcumvqn8Mc+pCYQ= -github.com/containerd/containerd v1.5.0-beta.3/go.mod h1:/wr9AVtEM7x9c+n0+stptlo/uBBoBORwEx6ardVcmKU= -github.com/containerd/containerd v1.5.0-beta.4/go.mod h1:GmdgZd2zA2GYIBZ0w09ZvgqEq8EfBp/m3lcVZIvPHhI= -github.com/containerd/containerd v1.5.0-rc.0/go.mod h1:V/IXoMqNGgBlabz3tHD2TWDoTJseu1FGOKuoA4nNb2s= -github.com/containerd/containerd v1.5.1/go.mod h1:0DOxVqwDy2iZvrZp2JUx/E+hS0UNTVn7dJnIOwtYR4g= -github.com/containerd/containerd v1.5.7/go.mod h1:gyvv6+ugqY25TiXxcZC3L5yOeYgEw0QMhscqVp1AR9c= github.com/containerd/containerd v1.6.18 h1:qZbsLvmyu+Vlty0/Ex5xc0z2YtKpIsb5n45mAMI+2Ns= github.com/containerd/containerd v1.6.18/go.mod h1:1RdCUu95+gc2v9t3IL+zIlpClSmew7/0YS8O5eQZrOw= -github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= -github.com/containerd/continuity v0.0.0-20190815185530-f2a389ac0a02/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= -github.com/containerd/continuity v0.0.0-20191127005431-f65d91d395eb/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= -github.com/containerd/continuity v0.0.0-20200710164510-efbc4488d8fe/go.mod h1:cECdGN1O8G9bgKTlLhuPJimka6Xb/Gg7vYzCTNVxhvo= -github.com/containerd/continuity v0.0.0-20201208142359-180525291bb7/go.mod h1:kR3BEg7bDFaEddKm54WSmrol1fKWDU1nKYkgrcgZT7Y= -github.com/containerd/continuity v0.0.0-20210208174643-50096c924a4e/go.mod h1:EXlVlkqNba9rJe3j7w3Xa924itAMLgZH4UD/Q4PExuQ= -github.com/containerd/continuity v0.1.0/go.mod h1:ICJu0PwR54nI0yPEnJ6jcS+J7CZAUXrLh8lPo2knzsM= -github.com/containerd/continuity v0.3.0 h1:nisirsYROK15TAMVukJOUyGJjz4BNQJBVsNvAXZJ/eg= -github.com/containerd/fifo v0.0.0-20180307165137-3d5202aec260/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI= -github.com/containerd/fifo v0.0.0-20190226154929-a9fb20d87448/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI= -github.com/containerd/fifo v0.0.0-20200410184934-f15a3290365b/go.mod h1:jPQ2IAeZRCYxpS/Cm1495vGFww6ecHmMk1YJH2Q5ln0= -github.com/containerd/fifo v0.0.0-20201026212402-0724c46b320c/go.mod h1:jPQ2IAeZRCYxpS/Cm1495vGFww6ecHmMk1YJH2Q5ln0= -github.com/containerd/fifo v0.0.0-20210316144830-115abcc95a1d/go.mod h1:ocF/ME1SX5b1AOlWi9r677YJmCPSwwWnQ9O123vzpE4= -github.com/containerd/fifo v1.0.0/go.mod h1:ocF/ME1SX5b1AOlWi9r677YJmCPSwwWnQ9O123vzpE4= -github.com/containerd/go-cni v1.0.1/go.mod h1:+vUpYxKvAF72G9i1WoDOiPGRtQpqsNW/ZHtSlv++smU= -github.com/containerd/go-cni v1.0.2/go.mod h1:nrNABBHzu0ZwCug9Ije8hL2xBCYh/pjfMb1aZGrrohk= -github.com/containerd/go-runc v0.0.0-20180907222934-5a6d9f37cfa3/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0= -github.com/containerd/go-runc v0.0.0-20190911050354-e029b79d8cda/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0= -github.com/containerd/go-runc v0.0.0-20200220073739-7016d3ce2328/go.mod h1:PpyHrqVs8FTi9vpyHwPwiNEGaACDxT/N/pLcvMSRA9g= -github.com/containerd/go-runc v0.0.0-20201020171139-16b287bc67d0/go.mod h1:cNU0ZbCgCQVZK4lgG3P+9tn9/PaJNmoDXPpoJhDR+Ok= -github.com/containerd/go-runc v1.0.0/go.mod h1:cNU0ZbCgCQVZK4lgG3P+9tn9/PaJNmoDXPpoJhDR+Ok= -github.com/containerd/imgcrypt v1.0.1/go.mod h1:mdd8cEPW7TPgNG4FpuP3sGBiQ7Yi/zak9TYCG3juvb0= -github.com/containerd/imgcrypt v1.0.4-0.20210301171431-0ae5c75f59ba/go.mod h1:6TNsg0ctmizkrOgXRNQjAPFWpMYRWuiB6dSF4Pfa5SA= -github.com/containerd/imgcrypt v1.1.1-0.20210312161619-7ed62a527887/go.mod h1:5AZJNI6sLHJljKuI9IHnw1pWqo/F0nGDOuR9zgTs7ow= -github.com/containerd/imgcrypt v1.1.1/go.mod h1:xpLnwiQmEUJPvQoAapeb2SNCxz7Xr6PJrXQb0Dpc4ms= -github.com/containerd/nri v0.0.0-20201007170849-eb1350a75164/go.mod h1:+2wGSDGFYfE5+So4M5syatU0N0f0LbWpuqyMi4/BE8c= -github.com/containerd/nri v0.0.0-20210316161719-dbaa18c31c14/go.mod h1:lmxnXF6oMkbqs39FiCt1s0R2HSMhcLel9vNL3m4AaeY= -github.com/containerd/nri v0.1.0/go.mod h1:lmxnXF6oMkbqs39FiCt1s0R2HSMhcLel9vNL3m4AaeY= -github.com/containerd/stargz-snapshotter/estargz v0.4.1/go.mod h1:x7Q9dg9QYb4+ELgxmo4gBUeJB0tl5dqH1Sdz0nJU1QM= -github.com/containerd/ttrpc v0.0.0-20190828154514-0e0f228740de/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o= -github.com/containerd/ttrpc v0.0.0-20190828172938-92c8520ef9f8/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o= -github.com/containerd/ttrpc v0.0.0-20191028202541-4f1b8fe65a5c/go.mod h1:LPm1u0xBw8r8NOKoOdNMeVHSawSsltak+Ihv+etqsE8= -github.com/containerd/ttrpc v1.0.1/go.mod h1:UAxOpgT9ziI0gJrmKvgcZivgxOp8iFPSk8httJEt98Y= -github.com/containerd/ttrpc v1.0.2/go.mod h1:UAxOpgT9ziI0gJrmKvgcZivgxOp8iFPSk8httJEt98Y= -github.com/containerd/ttrpc v1.1.0/go.mod h1:XX4ZTnoOId4HklF4edwc4DcqskFZuvXB1Evzy5KFQpQ= -github.com/containerd/typeurl v0.0.0-20180627222232-a93fcdb778cd/go.mod h1:Cm3kwCdlkCfMSHURc+r6fwoGH6/F1hH3S4sg0rLFWPc= -github.com/containerd/typeurl v0.0.0-20190911142611-5eb25027c9fd/go.mod h1:GeKYzf2pQcqv7tJ0AoCuuhtnqhva5LNU3U+OyKxxJpk= -github.com/containerd/typeurl v1.0.1/go.mod h1:TB1hUtrpaiO88KEK56ijojHS1+NeF0izUACaJW2mdXg= -github.com/containerd/typeurl v1.0.2/go.mod h1:9trJWW2sRlGub4wZJRTW83VtbOLS6hwcDZXTn6oPz9s= -github.com/containerd/zfs v0.0.0-20200918131355-0a33824f23a2/go.mod h1:8IgZOBdv8fAgXddBT4dBXJPtxyRsejFIpXoklgxgEjw= -github.com/containerd/zfs v0.0.0-20210301145711-11e8f1707f62/go.mod h1:A9zfAbMlQwE+/is6hi0Xw8ktpL+6glmqZYtevJgaB8Y= -github.com/containerd/zfs v0.0.0-20210315114300-dde8f0fda960/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY= -github.com/containerd/zfs v0.0.0-20210324211415-d5c4544f0433/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY= -github.com/containerd/zfs v1.0.0/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY= -github.com/containernetworking/cni v0.7.1/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= -github.com/containernetworking/cni v0.8.0/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= -github.com/containernetworking/cni v0.8.1/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= -github.com/containernetworking/plugins v0.8.6/go.mod h1:qnw5mN19D8fIwkqW7oHHYDHVlzhJpcY6TQxn/fUyDDM= -github.com/containernetworking/plugins v0.9.1/go.mod h1:xP/idU2ldlzN6m4p5LmGiwRDjeJr6FLK6vuiUwoH7P8= -github.com/containers/ocicrypt v1.0.1/go.mod h1:MeJDzk1RJHv89LjsH0Sp5KTY3ZYkjXO/C+bKAeWFIrc= -github.com/containers/ocicrypt v1.1.0/go.mod h1:b8AOe0YR67uU8OqfVNcznfFpAzu3rdgUV4GP9qXPfu4= -github.com/containers/ocicrypt v1.1.1/go.mod h1:Dm55fwWm1YZAjYRaJ94z2mfZikIyIN4B0oB3dj3jFxY= -github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= -github.com/coreos/go-iptables v0.4.5/go.mod h1:/mVI274lEDI2ns62jHCDnCyBF9Iwsmekav8Dbxlm1MU= -github.com/coreos/go-iptables v0.5.0/go.mod h1:/mVI274lEDI2ns62jHCDnCyBF9Iwsmekav8Dbxlm1MU= -github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-systemd v0.0.0-20161114122254-48702e0da86b/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd/v22 v22.0.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= -github.com/coreos/go-systemd/v22 v22.1.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= +github.com/crate-crypto/go-kzg-4844 v0.3.0 h1:UBlWE0CgyFqqzTI+IFyCzA7A3Zw4iip6uzRv5NIXG0A= +github.com/crate-crypto/go-kzg-4844 v0.3.0/go.mod h1:SBP7ikXEgDnUPONgm33HtuDZEDtWa3L4QtN1ocJSEQ4= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/creack/pty v1.1.11 h1:07n33Z8lZxZ2qwegKbObQohDhXDQxiMMz1NOUGYlesw= github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/cyphar/filepath-securejoin v0.2.2/go.mod h1:FpkQEhXnPnOthhzymB7CGsFk2G9VLXONKD9G7QGMM+4= github.com/cyphar/filepath-securejoin v0.2.3/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= -github.com/d2g/dhcp4 v0.0.0-20170904100407-a1d1b6c41b1c/go.mod h1:Ct2BUK8SB0YC1SMSibvLzxjeJLnrYEVLULFNiHY9YfQ= -github.com/d2g/dhcp4client v1.0.0/go.mod h1:j0hNfjhrt2SxUOw55nL0ATM/z4Yt3t2Kd1mW34z5W5s= -github.com/d2g/dhcp4server v0.0.0-20181031114812-7d4a0a7f59a5/go.mod h1:Eo87+Kg/IX2hfWJfwxMzLyuSZyxSoAug2nGa1G2QAi8= -github.com/d2g/hardwareaddr v0.0.0-20190221164911-e7d9fbe030e4/go.mod h1:bMl4RjIciD2oAxI7DmWRx6gbeqrkoLqv3MV0vzNad+I= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/deckarep/golang-set/v2 v2.1.0 h1:g47V4Or+DUdzbs8FxCCmgb6VYd+ptPAngjM6dtGktsI= github.com/deckarep/golang-set/v2 v2.1.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0= -github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 h1:HbphB4TFFXpv7MNrT52FGrrgVXF1owhMVTHFZIlnvd4= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0/go.mod h1:DZGJHZMqrU4JJqFAWUS2UO1+lbSKsdiOoYi9Zzey7Fc= -github.com/denverdino/aliyungo v0.0.0-20190125010748-a747050bb1ba/go.mod h1:dV8lFg6daOBZbT6/BDGIz6Y3WFGn8juu6G+CQ6LHtl0= github.com/dgraph-io/badger v1.6.0/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6psNgSztDR4= -github.com/dgrijalva/jwt-go v0.0.0-20170104182250-a601269ab70c/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= -github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= -github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E= -github.com/docker/cli v0.0.0-20191017083524-a8ff7f821017/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= -github.com/docker/distribution v0.0.0-20190905152932-14b96e55d84c/go.mod h1:0+TTO4EOBfRPhZXAeF1Vu+W3hHZ8eLp8PgKVZlcvtFY= -github.com/docker/distribution v2.7.1-0.20190205005809-0d3efadf0154+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/docker v1.4.2-0.20190924003213-a8608b5b67c7/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/docker v20.10.17+incompatible h1:JYCuMrWaVNophQTOrMMoSwudOVEfcegoZZrleKc1xwE= -github.com/docker/docker v20.10.17+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/docker-credential-helpers v0.6.3/go.mod h1:WRaJzqw3CTB9bk10avuGsjVBZsD05qeibJ1/TYlvc0Y= +github.com/docker/docker v24.0.5+incompatible h1:WmgcE4fxyI6EEXxBRxsHnZXrO1pQ3smi0k/jho4HLeY= +github.com/docker/docker v24.0.5+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= -github.com/docker/go-events v0.0.0-20170721190031-9461782956ad/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA= -github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA= -github.com/docker/go-metrics v0.0.0-20180209012529-399ea8c73916/go.mod h1:/u0gXw0Gay3ceNrsHubL3BtdOL2fHf93USgMTe0W5dI= -github.com/docker/go-metrics v0.0.1/go.mod h1:cG1hvH2utMXtqgqqYE9plW6lDxS3/5ayHzueweSI3Vw= github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw= github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= -github.com/docker/libtrust v0.0.0-20150114040149-fa567046d9b1/go.mod h1:cyGadeNEkKy96OOhEzfZl+yxihPEzKnqJwvfuSUqbZE= -github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= -github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= -github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= +github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/edsrzf/mmap-go v1.1.0 h1:6EUwBLQ/Mcr1EYLE4Tn1VdW1A4ckqCQWZBw8Hr0kjpQ= -github.com/edsrzf/mmap-go v1.1.0/go.mod h1:19H/e8pUPLicwkyNgOykDXkJ9F0MHE+Z52B8EIth78Q= github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385/go.mod h1:0vRUJqYpeSZifjYj7uP3BG/gKcuzL9xWVV/Y+cK33KM= -github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= -github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/etcd-io/bbolt v1.3.3/go.mod h1:ZF2nL25h33cCyBtcyWeZ2/I3HQOfTP+0PIEvHjkjCrw= -github.com/ethereum/go-ethereum v1.11.4 h1:KG81SnUHXWk8LJB3mBcHg/E2yLvXoiPmRMCIRxgx3cE= -github.com/ethereum/go-ethereum v1.11.4/go.mod h1:it7x0DWnTDMfVFdXcU6Ti4KEFQynLHVRarcSlPr0HBo= -github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanw/esbuild v0.17.6 h1:4TFYbndxF6+KQwLTyZ4PGIal5Pc6g6AK6jp0IU4Elf0= -github.com/evanw/esbuild v0.17.6/go.mod h1:iINY06rn799hi48UqEnaQvVfZWe6W9bET78LbvN8VWk= +github.com/ethereum/c-kzg-4844 v0.3.1 h1:sR65+68+WdnMKxseNWxSJuAv2tsUrihTpVBTfM/U5Zg= +github.com/ethereum/c-kzg-4844 v0.3.1/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= +github.com/ethereum/go-ethereum v1.13.1 h1:UF2FaUKPIy5jeZk3X06ait3y2Q4wI+vJ1l7+UARp+60= +github.com/ethereum/go-ethereum v1.13.1/go.mod h1:xHQKzwkHSl0gnSjZK1mWa06XEdm9685AHqhRknOzqGQ= github.com/evanw/esbuild v0.18.11 h1:Mb0qb9KyJQraob0Y7LA0DOdD8ijJs2TxhqgqrDeGq4w= github.com/evanw/esbuild v0.18.11/go.mod h1:iINY06rn799hi48UqEnaQvVfZWe6W9bET78LbvN8VWk= github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072/go.mod h1:duJ4Jxv5lDcvg4QuQr0oowTf7dz4/CR8NtyCooz9HL8= -github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= -github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= @@ -336,93 +110,42 @@ github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmV github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= github.com/fsouza/go-dockerclient v1.8.1 h1:a27vHYqNSZz88nUAurI1o6W5PgEt63nAWilOI+j63RE= github.com/fsouza/go-dockerclient v1.8.1/go.mod h1:zmA2ogSxRnXmbZcy0Aq7yhRoCdP/bDns/qghCK9SWtM= -github.com/fullsailor/pkcs7 v0.0.0-20190404230743-d7302db945fa/go.mod h1:KnogPXtdwXqoenmZCw6S+25EAm2MkxbG0deNDu4cbSA= -github.com/garyburd/redigo v0.0.0-20150301180006-535138d7bcd7/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY= +github.com/fsouza/go-dockerclient v1.9.8 h1:UdfyV4/w8VthS2VS0muJqUSPL/e6XSj49jqPnbuUOWA= +github.com/fsouza/go-dockerclient v1.9.8/go.mod h1:74lNReDQxrOaogajs51IvZgkDME4qe9yPJAUEUTJtHw= github.com/gavv/httpexpect v2.0.0+incompatible/go.mod h1:x+9tiU1YnrOvnB725RkpoLv1M62hOWzwo5OXotisrKc= github.com/getsentry/sentry-go v0.12.0/go.mod h1:NSap0JBYWzHND8oMbyi0+XZhUalc1TBdRL1M71JZW2c= github.com/getsentry/sentry-go v0.18.0 h1:MtBW5H9QgdcJabtZcuJG80BMOwaBpkRDZkxRkNC1sN0= github.com/getsentry/sentry-go v0.18.0/go.mod h1:Kgon4Mby+FJ7ZWHFUAZgVaIa8sxHtnRJRLTXZr51aKQ= -github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3/go.mod h1:VJ0WA2NBN22VlZ2dKZQPAPnyWw5XTlK1KymzLKsr59s= github.com/gin-gonic/gin v1.4.0/go.mod h1:OW2EZn3DO8Ln9oIKOvM++LBO+5UPHJJDH72/q/3rZdM= github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= -github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-ini/ini v1.25.4/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= -github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= -github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= -github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= -github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab/go.mod h1:/P9AEU963A2AYjv4d1V5eVL1CQbEJq6aCNHDDjibzu8= github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= -github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0= -github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= -github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9/go.mod h1:W3Z9FmVs9qj+KR4zFKmDPGiLdk1D9Rlm7cyMvf57TTg= -github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= -github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= -github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501/go.mod h1:J8+jY1nAiCcj+friV/PDoE1/3eeccG9LYBs0tYvLOWc= -github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= -github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87/go.mod h1:DXUve3Dpr1UfpPtxFw+EFuQ41HhCWZfha5jSVRG7C7I= -github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-stack/stack v1.8.1 h1:ntEHSVwIt7PNXNpgPmVfMrNhLtgjlmnZha2kOpuRiDw= github.com/go-stack/stack v1.8.1/go.mod h1:dcoOX6HbPZSZptuspn9bctJ+N/CnF5gGygcUP3XYfe4= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= -github.com/godbus/dbus v0.0.0-20151105175453-c7fdd8b5cd55/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= -github.com/godbus/dbus v0.0.0-20180201030542-885f9cc04c9c/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= -github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= -github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/godbus/dbus/v5 v5.0.6/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= github.com/gogo/googleapis v0.0.0-20180223154316-0cd9801be74a/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= -github.com/gogo/googleapis v1.2.0/go.mod h1:Njal3psf3qN6dwBtQfUmBZh2ybovJ0tlu3o/AC7HYjU= -github.com/gogo/googleapis v1.4.0/go.mod h1:5YRNX2z1oM5gXdAkurHa942MDgEJyk02w4OecKY87+c= github.com/gogo/googleapis v1.4.1/go.mod h1:2lpHqI5OcWCtVElxXnPt+s8oJvMpySlOyM6xDCrzib4= -github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= -github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/gogo/protobuf v1.3.0/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/gogo/status v1.1.0/go.mod h1:BFv9nrluPLmrS0EmGVvLaPNmRosr9KapBYd5/hpY1WM= github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= -github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= @@ -431,89 +154,43 @@ github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:W github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXiurYmW7fx4GZkL8feAMVq7nEjURHk= +github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/gomodule/redigo v1.7.1-0.20190724094224-574c33c3df38/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4= -github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= -github.com/google/go-containerregistry v0.5.1/go.mod h1:Ct15B4yir3PLOP5jsy0GNeYVaIZs/MK/Jz5any1wFW0= github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gorilla/handlers v0.0.0-20150720190736-60c7bfde3e33/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= -github.com/gorilla/mux v1.7.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= -github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= -github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= -github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/hashicorp/errwrap v0.0.0-20141028054710-7554cd9344ce/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-multierror v0.0.0-20161216184304-ed905158d874/go.mod h1:JMRHfdO9jKNzS/+BTlxCjKNQHg/jZAft8U7LloJvN7I= -github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hashicorp/yamux v0.1.1 h1:yrQxtgseBDrq9Y652vSRDvsKCJKOUD+GzTS4Y0Y8pvE= github.com/hashicorp/yamux v0.1.1/go.mod h1:CtWFDAQgb7dxtzFs4tWbplKIe2jSi3+5vKbgIO0SLnQ= github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao= github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA= -github.com/holiman/uint256 v1.2.1 h1:XRtyuda/zw2l+Bq/38n5XUoEF72aSOu/77Thd9pPp2o= -github.com/holiman/uint256 v1.2.1/go.mod h1:y4ga/t+u+Xwd7CpDgZESaRcWy0I7XMlTMA25ApIH5Jw= +github.com/holiman/uint256 v1.2.3 h1:K8UWO1HUJpRMXBxbmaY1Y8IAMZC/RsKB+ArEnnK4l5o= +github.com/holiman/uint256 v1.2.3/go.mod h1:SC8Ryt4n+UBbPbIBKaG9zbbDlp4jOru9xFZmPzLUTxw= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/hydrogen18/memlistener v0.0.0-20200120041712-dcc25e7acd91/go.mod h1:qEIFzExnS6016fRpRfxrExeVn2gbClQA99gQhnIcdhE= -github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/imdario/mergo v0.3.10/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= -github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= -github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= github.com/imkira/go-interpol v1.1.0/go.mod h1:z0h2/2T3XF8kyEPpRgJ3kmNv+C43p+I/CoI+jC3w2iA= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/iris-contrib/blackfriday v2.0.0+incompatible/go.mod h1:UzZ2bDEoaSGPbkg6SAB4att1aAwTmVIx/5gCVqeyUdI= @@ -521,71 +198,41 @@ github.com/iris-contrib/go.uuid v2.0.0+incompatible/go.mod h1:iz2lgM/1UnEf1kP0L/ github.com/iris-contrib/jade v1.1.3/go.mod h1:H/geBymxJhShH5kecoiOCSssPX7QWYH7UaeZTSWddIk= github.com/iris-contrib/pongo2 v0.0.1/go.mod h1:Ssh+00+3GAZqSQb30AvBRNxBx7rf0GqwkjqxNd0u65g= github.com/iris-contrib/schema v0.0.1/go.mod h1:urYA3uvUNG1TIIjOSCzHr9/LmbQo8LrOcOqfqxa4hXw= -github.com/j-keck/arping v0.0.0-20160618110441-2cf9dc699c56/go.mod h1:ymszkNOg6tORTn+6F6j+Jc8TOr5osrynvN6ivFWZ2GA= -github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= -github.com/jmespath/go-jmespath v0.0.0-20160803190731-bd40a432e4c7/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= -github.com/joefitzgerald/rainbow-reporter v0.1.0/go.mod h1:481CNgqmVHQZzdIbN52CupLJyoVwB10FQ/IQlF1pdL8= -github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= -github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= -github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= -github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= -github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88/go.mod h1:3w7q1U84EfirKl04SVQ/s7nPm1ZPhiXd34z40TNz36k= github.com/kataras/golog v0.0.10/go.mod h1:yJ8YKCmyL+nWjERB90Qwn+bdyBZsaQwU3bTVFgkFIp8= github.com/kataras/iris/v12 v12.1.8/go.mod h1:LMYy4VlP67TQ3Zgriz8RE2h2kMZV2SgMYbq3UhfoFmE= github.com/kataras/neffos v0.0.14/go.mod h1:8lqADm8PnbeFfL7CLXh1WHw53dG27MC3pgi2R1rmoTE= github.com/kataras/pio v0.0.2/go.mod h1:hAoW0t9UmXi4R5Oyq5Z4irTbaTsOemSrDGUtaTl7Dro= github.com/kataras/sitemap v0.0.5/go.mod h1:KY2eugMKiPwsJgx7+U103YZehfvNGOXURubcGyk0Bz8= -github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= -github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/compress v1.8.2/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= github.com/klauspost/compress v1.9.7/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= -github.com/klauspost/compress v1.11.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= -github.com/klauspost/compress v1.11.13/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.15.15 h1:EF27CXIuDsYJ6mmvtBRlEuB2UVOqHG1tAXgZ7yIO+lw= github.com/klauspost/compress v1.15.15/go.mod h1:ZcK2JAFqKOpnBlxcLsJzYfrS9X1akm9fHZNnD9+Vo/4= github.com/klauspost/cpuid v1.2.1/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= -github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/labstack/echo/v4 v4.5.0/go.mod h1:czIriw4a0C1dFun+ObrXp7ok03xON0N1awStJ6ArI7Y= github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= -github.com/linuxkit/virtsock v0.0.0-20201010232012-f8cee7dfc7a3/go.mod h1:3r6x7q95whyfWQpmGZTu3gk3v2YkMi05HEzl7Tf7YEo= +github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= -github.com/marstr/guid v1.1.0/go.mod h1:74gB1z2wpxxInTG6yaqA7KrtM0NZ+RbrcqDvYHefzho= -github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.11/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= -github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= @@ -593,174 +240,84 @@ github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Ky github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peKQ= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.14 h1:+xnbZSEeDbOIg5/mE6JF0w6n9duR1l3/WmbinWVwUuU= github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= -github.com/mattn/go-shellwords v1.0.3/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o= -github.com/mattn/go-shellwords v1.0.6/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o= github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw= -github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= -github.com/maxbrunsfeld/counterfeiter/v6 v6.2.2/go.mod h1:eD9eIE7cdwcMi9rYluz88Jz2VyhSmden33/aXg4oVIY= github.com/mediocregopher/radix/v3 v3.4.2/go.mod h1:8FL3F6UQRXHXIBSPUs5h0RybMF8i4n7wVopoX3x7Bv8= github.com/microcosm-cc/bluemonday v1.0.2/go.mod h1:iVP4YcDBq+n/5fb23BhYFvIMq/leAFZyRl6bYmGDlGc= -github.com/miekg/pkcs11 v1.0.3/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= -github.com/mistifyio/go-zfs v2.1.2-0.20190413222219-f784269be439+incompatible/go.mod h1:8AuVvqP/mXw1px98n46wfvcGfQ4ci2FwoAjKYxuo3Z4= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/osext v0.0.0-20151018003038-5e2d6d41470f/go.mod h1:OkQIRizQZAeMln+1tSwduZz7+Af5oFlKirV/MSYes2A= -github.com/moby/locker v1.0.1/go.mod h1:S7SDdo5zpBK84bzzVlKr2V0hz+7x9hWbYC/kq7oQppc= -github.com/moby/sys/mount v0.3.3 h1:fX1SVkXFJ47XWDoeFW4Sq7PdQJnV2QIDZAqjNqgEjUs= -github.com/moby/sys/mount v0.3.3/go.mod h1:PBaEorSNTLG5t/+4EgukEQVlAvVEc6ZjTySwKdqp5K0= -github.com/moby/sys/mountinfo v0.4.0/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2JI+6q0qou+A= -github.com/moby/sys/mountinfo v0.4.1/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2JI+6q0qou+A= +github.com/mmcloughlin/addchain v0.4.0 h1:SobOdjm2xLj1KkXN5/n0xTIWyZA2+s99UCY1iPfkHRY= +github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqkyU72HC5wJ4RlU= +github.com/mmcloughlin/profile v0.1.1/go.mod h1:IhHD7q1ooxgwTgjxQYkACGA77oFTDdFVejUS1/tS/qU= +github.com/moby/patternmatcher v0.6.0 h1:GmP9lR19aU5GqSSFko+5pRqHi+Ohk1O69aFiKkVGiPk= +github.com/moby/patternmatcher v0.6.0/go.mod h1:hDPoyOpDY7OrrMDLaYoY3hf52gNCR/YOUYxkhApJIxc= github.com/moby/sys/mountinfo v0.5.0/go.mod h1:3bMD3Rg+zkqx8MRYPi7Pyb0Ie97QEBmdxbhnCLlSvSU= -github.com/moby/sys/mountinfo v0.6.2 h1:BzJjoreD5BMFNmD9Rus6gdd1pLuecOFPt8wC+Vygl78= -github.com/moby/sys/mountinfo v0.6.2/go.mod h1:IJb6JQeOklcdMU9F5xQ8ZALD+CUr5VlGpwtX+VE0rpI= -github.com/moby/sys/symlink v0.1.0/go.mod h1:GGDODQmbFOjFsXvfLVn3+ZRxkch54RkSiGqsZeMYowQ= -github.com/moby/term v0.0.0-20200312100748-672ec06f55cd/go.mod h1:DdlQx2hp0Ss5/fLikoLlEeIYiATotOjgB//nb973jeo= +github.com/moby/sys/sequential v0.5.0 h1:OPvI35Lzn9K04PBbCLW0g4LcFAJgHsvXsRyewg5lXtc= +github.com/moby/sys/sequential v0.5.0/go.mod h1:tH2cOOs5V9MlPiXcQzRC+eEyab644PWKGRYaaV5ZZlo= github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6 h1:dcztxKSvZ4Id8iPpHERQBbIJfabdt4wUm5qy3wOL2Zc= github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6/go.mod h1:E2VnQOmVuvZB6UYnnDB0qG5Nq/1tD9acaOpo6xmt0Kw= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= github.com/moul/http2curl v1.0.0/go.mod h1:8UbvGypXm98wA/IqH45anm5Y2Z6ep6O31QGOAZ3H0fQ= github.com/mrunalp/fileutils v0.5.0/go.mod h1:M1WthSahJixYnrXQl/DFQuteStB1weuxD2QJNHXfbSQ= -github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= -github.com/ncw/swift v1.0.47/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= -github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= -github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= -github.com/onsi/ginkgo v0.0.0-20151202141238-7f8ab55aaf3b/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= github.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= -github.com/onsi/gomega v0.0.0-20151007035656-2152b45fa28a/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= -github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.10.3/go.mod h1:V9xEwhxec5O8UDM77eCW8vLymOMltsqPVYWrpDsH8xc= github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= github.com/onsi/gomega v1.19.0 h1:4ieX6qQjPP/BfC3mpsAtIGGlxTWPeA3Inl/7DtXw1tw= github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= -github.com/opencontainers/go-digest v0.0.0-20170106003457-a6d0ee40d420/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= -github.com/opencontainers/go-digest v0.0.0-20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= -github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= -github.com/opencontainers/go-digest v1.0.0-rc1.0.20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= -github.com/opencontainers/image-spec v1.0.0/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= -github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= github.com/opencontainers/image-spec v1.0.3-0.20211202183452-c5a74bcca799 h1:rc3tiVYb5z54aKaDfakKn0dDjIyPpTtszkjuMzyt7ec= github.com/opencontainers/image-spec v1.0.3-0.20211202183452-c5a74bcca799/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= -github.com/opencontainers/runc v0.0.0-20190115041553-12f6a991201f/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= -github.com/opencontainers/runc v0.1.1/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= -github.com/opencontainers/runc v1.0.0-rc8.0.20190926000215-3e425f80a8c9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= -github.com/opencontainers/runc v1.0.0-rc9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= -github.com/opencontainers/runc v1.0.0-rc93/go.mod h1:3NOsor4w32B2tC0Zbl8Knk4Wg84SM2ImC1fxBuqJ/H0= -github.com/opencontainers/runc v1.0.2/go.mod h1:aTaHFFwQXuA71CiyxOdFFIorAoemI04suvGRQFzWTD0= github.com/opencontainers/runc v1.1.5 h1:L44KXEpKmfWDcS02aeGm8QNTFXTo2D+8MYGDIJ/GDEs= github.com/opencontainers/runc v1.1.5/go.mod h1:1J5XiS+vdZ3wCyZybsuxXZWGrgSr8fFJHLXuG2PsnNg= -github.com/opencontainers/runtime-spec v0.1.2-0.20190507144316-5b71a03e2700/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-spec v1.0.1/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-spec v1.0.2-0.20190207185410-29686dbc5559/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-spec v1.0.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-spec v1.0.3-0.20200929063507-e6143ca7d51d/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-tools v0.0.0-20181011054405-1d69bd0f9c39/go.mod h1:r3f7wjNzSs2extwzU3Y+6pKfobzPh+kKFJ3ofN+3nfs= -github.com/opencontainers/selinux v1.6.0/go.mod h1:VVGKuOLlE7v4PJyT6h7mNWvq1rzqiriPsEqVhc+svHE= -github.com/opencontainers/selinux v1.8.0/go.mod h1:RScLhm78qiWa2gbVCcGkC7tCGdgk3ogry1nUQF8Evvo= -github.com/opencontainers/selinux v1.8.2/go.mod h1:MUIHuUEvKB1wtJjQdOyYRgOnLD2xAPP8dBsCoU0KuF8= github.com/opencontainers/selinux v1.10.0/go.mod h1:2i0OySw99QjzBBQByd1Gr9gSjvuho1lHsJxIJ3gGbJI= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/pelletier/go-toml v1.8.1/go.mod h1:T2/BmBdy8dvIRq1a/8aqjN41wvWlN4lrapLU/GW4pbc= -github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= -github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.8.1-0.20171018195549-f15c970de5b7/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= -github.com/prometheus/client_golang v0.0.0-20180209125602-c332b6f63c06/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= -github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= -github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g= -github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= github.com/prometheus/client_golang v1.14.0 h1:nJdhIvne2eSX/XRAFV9PcvFFRbrjbcTUj0VP62TMhnw= github.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y= -github.com/prometheus/client_model v0.0.0-20171117100541-99fa1f4be8e5/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4= github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= -github.com/prometheus/common v0.0.0-20180110214958-89604d197083/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc= -github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= github.com/prometheus/common v0.39.0 h1:oOyhkDq05hPZKItWVBkJ6g6AtGxi+fy7F4JvUV8uhsI= github.com/prometheus/common v0.39.0/go.mod h1:6XBZ7lYdLCbkAVhwRsWTZn+IN5AB9F/NXd5w0BbEX0Y= -github.com/prometheus/procfs v0.0.0-20180125133057-cb4147076ac7/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.0-20190522114515-bc1a522cf7b1/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= -github.com/prometheus/procfs v0.0.5/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= -github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= -github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/procfs v0.9.0 h1:wzCHvIvM5SxWqYvwgVL7yJY8Lz3PKn49KQtpgMYJfhI= github.com/prometheus/procfs v0.9.0/go.mod h1:+pB4zwohETzFnmlpe6yd2lSc+0/46IYZRB/chUwxUZY= -github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.3 h1:utMvzDsuh3suAEnhH0RdHmoPbU648o6CvXxTx4SBMOw= github.com/rivo/uniseg v0.4.3/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= -github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= -github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rogpeppe/go-internal v1.8.1/go.mod h1:JeRgkft04UBgHMgCIwADu4Pn6Mtm5d4nPKWu0nJ5d+o= github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= @@ -768,99 +325,56 @@ github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/f github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/safchain/ethtool v0.0.0-20190326074333-42ed695e3de8/go.mod h1:Z0q5wiBQGYcxhMZ6gUqHn6pYNLypFAvaL3UvgZLR0U4= -github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= github.com/schollz/closestmatch v2.1.0+incompatible/go.mod h1:RtP1ddjLong6gTkbtmuhtR2uUrrJOpYzYRvbcPAid+g= -github.com/sclevine/spec v1.2.0/go.mod h1:W4J29eT/Kzv7/b9IWLB055Z+qvVC9vt0Arko24q7p+U= -github.com/seccomp/libseccomp-golang v0.9.1/go.mod h1:GbW5+tmTXfcxTToHLXlScSlAvWlF4P2Ca7zGrPiEpWo= github.com/seccomp/libseccomp-golang v0.9.2-0.20220502022130-f33da4d89646/go.mod h1:JA8cRccbGaA1s33RQf7Y1+q9gHmZX1yB/z9WDN1C6fg= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI= github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/sirupsen/logrus v1.0.4-0.20170822132746-89742aefa4b2/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= -github.com/sirupsen/logrus v1.0.6/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= -github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= -github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= -github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0= github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cobra v0.0.2-0.20171109065643-2da4a54c5cee/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= -github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= -github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= -github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.1-0.20171106142849-4c012f6dcd95/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= -github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= -github.com/stefanberger/go-pkcs11uri v0.0.0-20201008174630-78d3cae3a980/go.mod h1:AO3tvPzVZ/ayst6UlUKUv6rcPQInYe3IknH3jYhAKu8= -github.com/stretchr/objx v0.0.0-20180129172003-8a3f7159479f/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= -github.com/stretchr/testify v0.0.0-20180303142811-b89eecf5ca5d/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= -github.com/syndtr/gocapability v0.0.0-20170704070218-db04d3cc01c8/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= -github.com/syndtr/gocapability v0.0.0-20180916011248-d98352740cb2/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= +github.com/supranational/blst v0.3.11 h1:LyU6FolezeWAhvQk0k6O/d49jqgO52MSDDfYgbeoEm4= +github.com/supranational/blst v0.3.11/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a h1:1ur3QoCqvE5fl+nylMaIr9PVV1w343YRDtsy+Rwu7XI= github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a/go.mod h1:RRCYJbIwD5jmqPI9XoAFR0OcDxqUctll6zUj/+B4S48= -github.com/tchap/go-patricia v2.2.6+incompatible/go.mod h1:bmLyhP68RS6kStMGxByiQ23RP/odRBOTVjwp2cDyi6I= -github.com/tklauser/go-sysconf v0.3.11 h1:89WgdJhk5SNwJfu+GKyYveZ4IaJ7xAkecBo+KdJV0CM= -github.com/tklauser/go-sysconf v0.3.11/go.mod h1:GqXfhXY3kiPa0nAXPDIQIWzJbMCB7AmcWpGR8lSZfqI= -github.com/tklauser/numcpus v0.6.0 h1:kebhY2Qt+3U6RNK7UqpYNA+tJ23IBEGKkB7JQBfDYms= -github.com/tklauser/numcpus v0.6.0/go.mod h1:FEZLMke0lhOUG6w2JadTzp0a+Nl8PF/GFkQ5UVIcaL4= -github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= +github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= +github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= +github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= -github.com/urfave/cli v0.0.0-20171014202726-7bc6a0acffa5/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= -github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/urfave/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/valyala/fasthttp v1.6.0/go.mod h1:FstJa9V+Pj9vQ7OJie2qMHdwemEDaDiSdBnvPM1Su9w= github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio= -github.com/vishvananda/netlink v0.0.0-20181108222139-023a6dafdcdf/go.mod h1:+SR5DhBJrl6ZM7CoCKvpw5BKroDKQ+PJqOg65H/2ktk= github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE= -github.com/vishvananda/netlink v1.1.1-0.20201029203352-d40f9887b852/go.mod h1:twkDnbuQxJYemMlGd4JFIcuhgX83tXhKS2B/PRMpOho= -github.com/vishvananda/netns v0.0.0-20180720170159-13995c7128cc/go.mod h1:ZjcWmFBXmLKZu9Nxj3WKYEafiSqer2rnvPr0en9UNpI= github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU= -github.com/vishvananda/netns v0.0.0-20200728191858-db3c7e526aae/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= -github.com/willf/bitset v1.1.11-0.20200630133818-d5bec3311243/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4= -github.com/willf/bitset v1.1.11/go.mod h1:83CECat5yLh5zVOf4P1ErAgKA5UDvKtgyUABdr3+MjI= github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= -github.com/xeipuuv/gojsonschema v0.0.0-20180618132009-1d523034197f/go.mod h1:5yf86TLmAcydyeJq5YvxkGPE2fm/u4myDekKRoLuqhs= github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= -github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0/go.mod h1:/LWChgwKmvncFJFHJ7Gvn9wZArjbV5/FppcK2fKk/tI= github.com/yudai/gojsondiff v1.0.0/go.mod h1:AY32+k2cwILAkW1fbgxQ5mUmMiZFgLIV+FBNExI05xg= @@ -871,214 +385,90 @@ github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9dec github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yusufpapurcu/wmi v1.2.2 h1:KBNDSne4vP5mbSWnJbO+51IMOXJB67QiYCSBrubbPRg= github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= -github.com/yvasiyarov/go-metrics v0.0.0-20140926110328-57bccd1ccd43/go.mod h1:aX5oPXxHm3bOH+xeAttToC8pqch2ScQN/JoXYupl6xs= -github.com/yvasiyarov/gorelic v0.0.0-20141212073537-a9bba5b9ab50/go.mod h1:NUSPSUX/bi6SeDMUh6brw0nXpxHnc96TguQh0+r/ssA= -github.com/yvasiyarov/newrelic_platform_go v0.0.0-20140908184405-b21fdbd4370f/go.mod h1:GlGEuHIJweS1mbCqG+7vt2nvWLzLLnRHbXz5JKd/Qbg= -go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/bbolt v1.3.5/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= -go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4= -go.etcd.io/etcd v0.5.0-alpha.5.0.20200910180754-dd1b699fc489/go.mod h1:yVHk9ub3CSBatqGNg7GRmsnfLWtoW60w4eDYfh7vHDg= -go.mozilla.org/pkcs7 v0.0.0-20200128120323-432b2356ecb1/go.mod h1:SNgMg+EgDFwmvSmLRTNKC5fegJjB7v23qTQ0XLGUNHk= -go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= -go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.23.0 h1:gqCw0LfLxScz8irSi8exQc7fyQ0fKQU/qnC/X8+V/1M= -go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/goleak v1.1.12/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= -go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -golang.org/x/crypto v0.0.0-20171113213409-9f005a07e0d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181009213950-7c1a557ab941/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191227163750-53104e6ec876/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.4.0 h1:UVQgzMY87xqpKNgb+kDsll2Igd33HszWHFLmpaRMq/8= -golang.org/x/crypto v0.4.0/go.mod h1:3quD/ATkf6oY+rnes5c3ExXTbLc8mueNue5/DoinL80= +golang.org/x/crypto v0.12.0 h1:tFM/ta59kqch6LlvYnPa0yx5a83cL2nHflFhYKvv9Yk= +golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= -golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= -golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1 h1:k/i9J1pBpvlfR+9QsetwPyERsqu1GIbi967PQMq3Ivc= -golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1/go.mod h1:V1LtkGg67GoY2N1AnLN78QLrzxkLyJw7RJb1gzOOz9w= -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/exp v0.0.0-20230810033253-352e893a4cad h1:g0bG7Z4uG+OgH2QDODnjp6ggkk1bJDsINcuWmJN1iJU= +golang.org/x/exp v0.0.0-20230810033253-352e893a4cad/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= -golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.11.0 h1:bUO06HqtnRcc/7l71XBe4WcqTZ+3AH1J59zWDDwLKgU= +golang.org/x/mod v0.11.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181011144130-49bb7cea24b1/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190327091125-710a502c58a2/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190619014844-b5b0513f8c1b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20201006153459-a7d1128ccaa0/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= -golang.org/x/net v0.0.0-20210825183410-e898025ed96a/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211008194852-3b03d305991f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.7.0 h1:rJrUqqhjsgNp7KqAIc25s9pZnjU7TUcSY7HcVZjdn1g= -golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= +golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= +golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190514135907-3a4b5fb9f71f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190522044717-8097e1b27ff5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190602015325-4c4f7f33c9ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190606203320-7fc4e5ec1444/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190812073006-9eafafc0a87e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191022100944-742c48ecaeb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191115151921-52ab43148777/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191210023423-ac6580df4449/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200120151820-655fe14d7479/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200217220822-9197077df867/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200728102440-3e129f6d46b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200817155316-9781c653f443/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200909081042-eff7692f9009/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200916030750-2334cc1a136f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200922070232-aee5d888a860/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200923182605-d9f96fdee20d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201112073958-5cba982894dd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201117170446-d9b008d0a637/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201202213521-69691e467435/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210426230700-d19ff857e887/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -1095,149 +485,56 @@ golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU= -golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM= +golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.5.0 h1:n2a8QNdAb0sZNpU9R1ALUXBbY+w51fCQDN+7EdxNBsY= -golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/term v0.11.0 h1:F9tnn/DA/Im8nCwm+fX+1/eBwi4qFjRT++MhtVC4ZX0= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.7.0 h1:4BRB4x83lYWy72KwLD/qYDuTu7q9PjSagHvijDw7cLo= -golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc= +golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181011042414-1f849cf54d09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181221001348-537d06c36207/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190327201419-c70d86f8b7cf/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190706070813-72ffa07ba3db/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI= -golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200616133436-c1934b75d054/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200916195026-c9a70fc28ce3/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.9.1 h1:8WMNJAz3zrtPmnYC7ISf5dEn3MT0gY7jBJfw27yrrLo= +golang.org/x/tools v0.9.1/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -google.golang.org/api v0.0.0-20160322025152-9bf6e6e569ff/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= -google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= -google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/cloud v0.0.0-20151119220103-975617b05ea8/go.mod h1:0H1ncTHf11KCFhTc/+EFRbzSCOZx+VUbRMk55Yv5MYk= google.golang.org/genproto v0.0.0-20180518175338-11a468237815/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190522204451-c2c4e71fbf69/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= -google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200117163144-32f20d992d24/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= -google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20200527145253-8367513e4ece/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= -google.golang.org/genproto v0.0.0-20201110150050-8816d57aaa9a/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= -google.golang.org/grpc v0.0.0-20160317175043-d3ddb4469d5a/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.12.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= -google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= -google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -1246,48 +543,28 @@ google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzi google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U= -gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20141024133853-64131543e789/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= -gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo= gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= gopkg.in/go-playground/validator.v8 v8.18.2/go.mod h1:RX2a/7Ha8BgOhfk7j780h4/u/RRjR0eouCJSH80/M2Y= gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1 h1:iiHuQZCNgYPmFQxd3BBN/Nc5+dAwzZuq5y40s20oQw0= gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= -gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/ini.v1 v1.51.1/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= -gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= -gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce h1:+JknDZhAj8YMt7GC73Ei8pv4MzjDUNPHgQWJdtMAaDU= -gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:5AcXVHNjg+BDxry382+8OKon8SEWiKktQR07RKPsv1c= -gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= -gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= -gopkg.in/square/go-jose.v2 v2.3.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= -gopkg.in/square/go-jose.v2 v2.5.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= @@ -1296,54 +573,9 @@ gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= -gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= -gotest.tools/v3 v3.0.3 h1:4AuOwCGf4lLR9u3YOe2awrHygurzhO/HeQ6laiA6Sx0= -gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8= +gotest.tools/v3 v3.5.0 h1:Ljk6PdHdOhAb5aDMWXjDLMMhph+BpztA4v1QdqEW2eY= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -k8s.io/api v0.20.1/go.mod h1:KqwcCVogGxQY3nBlRpwt+wpAMF/KjaCc7RpywacvqUo= -k8s.io/api v0.20.4/go.mod h1:++lNL1AJMkDymriNniQsWRkMDzRaX2Y/POTUi8yvqYQ= -k8s.io/api v0.20.6/go.mod h1:X9e8Qag6JV/bL5G6bU8sdVRltWKmdHsFUGS3eVndqE8= -k8s.io/apimachinery v0.20.1/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= -k8s.io/apimachinery v0.20.4/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= -k8s.io/apimachinery v0.20.6/go.mod h1:ejZXtW1Ra6V1O5H8xPBGz+T3+4gfkTCeExAHKU57MAc= -k8s.io/apiserver v0.20.1/go.mod h1:ro5QHeQkgMS7ZGpvf4tSMx6bBOgPfE+f52KwvXfScaU= -k8s.io/apiserver v0.20.4/go.mod h1:Mc80thBKOyy7tbvFtB4kJv1kbdD0eIH8k8vianJcbFM= -k8s.io/apiserver v0.20.6/go.mod h1:QIJXNt6i6JB+0YQRNcS0hdRHJlMhflFmsBDeSgT1r8Q= -k8s.io/client-go v0.20.1/go.mod h1:/zcHdt1TeWSd5HoUe6elJmHSQ6uLLgp4bIJHVEuy+/Y= -k8s.io/client-go v0.20.4/go.mod h1:LiMv25ND1gLUdBeYxBIwKpkSC5IsozMMmOOeSJboP+k= -k8s.io/client-go v0.20.6/go.mod h1:nNQMnOvEUEsOzRRFIIkdmYOjAZrC8bgq0ExboWSU1I0= -k8s.io/code-generator v0.19.7/go.mod h1:lwEq3YnLYb/7uVXLorOJfxg+cUu2oihFhHZ0n9NIla0= -k8s.io/component-base v0.20.1/go.mod h1:guxkoJnNoh8LNrbtiQOlyp2Y2XFCZQmrcg2n/DeYNLk= -k8s.io/component-base v0.20.4/go.mod h1:t4p9EdiagbVCJKrQ1RsA5/V4rFQNDfRlevJajlGwgjI= -k8s.io/component-base v0.20.6/go.mod h1:6f1MPBAeI+mvuts3sIdtpjljHWBQ2cIy38oBIWMYnrM= -k8s.io/cri-api v0.17.3/go.mod h1:X1sbHmuXhwaHs9xxYffLqJogVsnI+f6cPRcgPel7ywM= -k8s.io/cri-api v0.20.1/go.mod h1:2JRbKt+BFLTjtrILYVqQK5jqhI+XNdF6UiGMgczeBCI= -k8s.io/cri-api v0.20.4/go.mod h1:2JRbKt+BFLTjtrILYVqQK5jqhI+XNdF6UiGMgczeBCI= -k8s.io/cri-api v0.20.6/go.mod h1:ew44AjNXwyn1s0U4xCKGodU7J1HzBeZ1MpGrpa5r8Yc= -k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/gengo v0.0.0-20200428234225-8167cfdcfc14/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/gengo v0.0.0-20201113003025-83324d819ded/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= -k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= -k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= -k8s.io/klog/v2 v2.4.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= -k8s.io/kube-openapi v0.0.0-20200805222855-6aeccd4b50c6/go.mod h1:UuqjUnNftUyPE5H64/qeyjQoUZhGpeFDVdxjTeEVN2o= -k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd/go.mod h1:WOJ3KddDSol4tAGcJo0Tvi+dK12EcqSLqcWsryKMpfM= -k8s.io/kubernetes v1.13.0/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk= -k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= -rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.14/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.15/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= -sigs.k8s.io/structured-merge-diff/v4 v4.0.1/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/structured-merge-diff/v4 v4.0.3/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= -sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= +rsc.io/tmplfunc v0.0.3 h1:53XFQh69AfOa8Tw0Jm7t+GV7KZhOi6jzsCzTtKbMvzU= +rsc.io/tmplfunc v0.0.3/go.mod h1:AG3sTPzElb1Io3Yg4voV9AGZJuleGAwaVRxL9M49PhA= From d58aec4a3eb53ddfc4d399c96d560e95b0665e04 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Tue, 19 Sep 2023 13:02:29 +0200 Subject: [PATCH 020/387] go.mod: upgrade hiveproxy dependency --- go.mod | 2 +- go.sum | 3 --- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/go.mod b/go.mod index d005a4f453..01582a1704 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.20 require ( github.com/davecgh/go-spew v1.1.1 github.com/ethereum/go-ethereum v1.13.1 - github.com/ethereum/hive/hiveproxy v0.0.0-20230313101845-c7dfe88c8138 + github.com/ethereum/hive/hiveproxy v0.0.0-20230919105823-37cbbe1ef86d github.com/evanw/esbuild v0.18.11 github.com/fsouza/go-dockerclient v1.9.8 github.com/gorilla/mux v1.8.0 diff --git a/go.sum b/go.sum index a3031f184e..c2c5cd16fe 100644 --- a/go.sum +++ b/go.sum @@ -84,7 +84,6 @@ github.com/docker/docker v24.0.5+incompatible h1:WmgcE4fxyI6EEXxBRxsHnZXrO1pQ3sm github.com/docker/docker v24.0.5+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= -github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw= github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= @@ -108,8 +107,6 @@ github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMo github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= -github.com/fsouza/go-dockerclient v1.8.1 h1:a27vHYqNSZz88nUAurI1o6W5PgEt63nAWilOI+j63RE= -github.com/fsouza/go-dockerclient v1.8.1/go.mod h1:zmA2ogSxRnXmbZcy0Aq7yhRoCdP/bDns/qghCK9SWtM= github.com/fsouza/go-dockerclient v1.9.8 h1:UdfyV4/w8VthS2VS0muJqUSPL/e6XSj49jqPnbuUOWA= github.com/fsouza/go-dockerclient v1.9.8/go.mod h1:74lNReDQxrOaogajs51IvZgkDME4qe9yPJAUEUTJtHw= github.com/gavv/httpexpect v2.0.0+incompatible/go.mod h1:x+9tiU1YnrOvnB725RkpoLv1M62hOWzwo5OXotisrKc= From 7649afd86c50040e441242e8ac8b153fe819ce6e Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Tue, 19 Sep 2023 13:05:49 +0200 Subject: [PATCH 021/387] .circleci: use Go 1.21 --- .circleci/config.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 45eac3869f..c7f37d6d13 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -6,7 +6,7 @@ jobs: # This job builds the hive executable and stores it in the workspace. build: docker: - - image: cimg/go:1.19 + - image: cimg/go:1.21 steps: # Build it. - checkout @@ -49,7 +49,7 @@ jobs: # This job runs the go unit tests. go-test: docker: - - image: cimg/go:1.19 + - image: cimg/go:1.21 steps: # Get the source. - checkout From cad3f27f18192b27ecbc1fa6c410cdde55ee68c0 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Tue, 19 Sep 2023 13:10:16 +0200 Subject: [PATCH 022/387] .circleci: enable internal static linking --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index c7f37d6d13..cace5aa48c 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -13,7 +13,7 @@ jobs: - go/load-cache - go/mod-download - go/save-cache - - run: {command: 'go build -ldflags="-extldflags=-static" .'} + - run: {command: 'go build -ldflags="-s -extldflags=-static" .'} # Store the executable. - persist_to_workspace: root: . From 9458d7460cc78d1afc745f68e21f1d78bb710285 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Tue, 19 Sep 2023 13:15:20 +0200 Subject: [PATCH 023/387] .circleci: disable libc dependencies in CI build --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index cace5aa48c..092a0a7f6b 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -13,7 +13,7 @@ jobs: - go/load-cache - go/mod-download - go/save-cache - - run: {command: 'go build -ldflags="-s -extldflags=-static" .'} + - run: {command: 'go build -ldflags="-s -extldflags=-static" -tags "osusergo netgo static_build" .'} # Store the executable. - persist_to_workspace: root: . From 7a28cca0e0cbae7bafc1c7fab48c2d436ef0f43a Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Tue, 19 Sep 2023 13:29:02 +0200 Subject: [PATCH 024/387] simulators/devp2p: upgrade dependencies --- simulators/devp2p/go.mod | 21 +++++++++------- simulators/devp2p/go.sum | 52 +++++++++++++++++++++------------------- 2 files changed, 40 insertions(+), 33 deletions(-) diff --git a/simulators/devp2p/go.mod b/simulators/devp2p/go.mod index 9b34700ce3..3590f24b5d 100644 --- a/simulators/devp2p/go.mod +++ b/simulators/devp2p/go.mod @@ -3,26 +3,29 @@ module github.com/ethereum/hive/simulators/devp2p go 1.18 require ( - github.com/ethereum/hive v0.0.0-20230313141339-8e3200bfc09e + github.com/ethereum/hive v0.0.0-20230919110229-d58aec4a3eb5 github.com/shogo82148/go-tap v0.0.3 ) require ( + github.com/Microsoft/go-winio v0.6.1 // indirect github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect github.com/deckarep/golang-set/v2 v2.1.0 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 // indirect - github.com/ethereum/go-ethereum v1.11.4 // indirect + github.com/ethereum/go-ethereum v1.13.1 // indirect github.com/go-ole/go-ole v1.2.6 // indirect github.com/go-stack/stack v1.8.1 // indirect - github.com/golang/snappy v0.0.4 // indirect + github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect github.com/gorilla/websocket v1.5.0 // indirect + github.com/holiman/uint256 v1.2.3 // indirect github.com/shirou/gopsutil v3.21.11+incompatible // indirect - github.com/stretchr/testify v1.8.1 // indirect github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a // indirect - github.com/tklauser/go-sysconf v0.3.11 // indirect - github.com/tklauser/numcpus v0.6.0 // indirect + github.com/tklauser/go-sysconf v0.3.12 // indirect + github.com/tklauser/numcpus v0.6.1 // indirect github.com/yusufpapurcu/wmi v1.2.2 // indirect - golang.org/x/crypto v0.4.0 // indirect - golang.org/x/sys v0.5.0 // indirect - gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce // indirect + golang.org/x/crypto v0.12.0 // indirect + golang.org/x/exp v0.0.0-20230810033253-352e893a4cad // indirect + golang.org/x/mod v0.11.0 // indirect + golang.org/x/sys v0.11.0 // indirect + golang.org/x/tools v0.9.1 // indirect ) diff --git a/simulators/devp2p/go.sum b/simulators/devp2p/go.sum index 8b726fea90..252c21b56d 100644 --- a/simulators/devp2p/go.sum +++ b/simulators/devp2p/go.sum @@ -1,3 +1,5 @@ +github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= +github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U= github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= @@ -12,10 +14,10 @@ github.com/deckarep/golang-set/v2 v2.1.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpO github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 h1:HbphB4TFFXpv7MNrT52FGrrgVXF1owhMVTHFZIlnvd4= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0/go.mod h1:DZGJHZMqrU4JJqFAWUS2UO1+lbSKsdiOoYi9Zzey7Fc= -github.com/ethereum/go-ethereum v1.11.4 h1:KG81SnUHXWk8LJB3mBcHg/E2yLvXoiPmRMCIRxgx3cE= -github.com/ethereum/go-ethereum v1.11.4/go.mod h1:it7x0DWnTDMfVFdXcU6Ti4KEFQynLHVRarcSlPr0HBo= -github.com/ethereum/hive v0.0.0-20230313141339-8e3200bfc09e h1:3g9cqRqpbZ92tSlGL4PfFoq435axKw6HiZ1Gz3fOkfk= -github.com/ethereum/hive v0.0.0-20230313141339-8e3200bfc09e/go.mod h1:PlpDuxHg6q1jU0K8Ouf+RXlHguignJ7k8Eyukc9RCPQ= +github.com/ethereum/go-ethereum v1.13.1 h1:UF2FaUKPIy5jeZk3X06ait3y2Q4wI+vJ1l7+UARp+60= +github.com/ethereum/go-ethereum v1.13.1/go.mod h1:xHQKzwkHSl0gnSjZK1mWa06XEdm9685AHqhRknOzqGQ= +github.com/ethereum/hive v0.0.0-20230919110229-d58aec4a3eb5 h1:22Z+XoI2hGtYR0AMzYr9IusfYM/chALq/6oJnejJQpk= +github.com/ethereum/hive v0.0.0-20230919110229-d58aec4a3eb5/go.mod h1:iKqu3dndnqdwSckyBGoZzeHhZz6X6XZws2TfZMdLdes= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= @@ -34,8 +36,9 @@ github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvq github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXiurYmW7fx4GZkL8feAMVq7nEjURHk= +github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= @@ -44,6 +47,8 @@ github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLe github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/holiman/uint256 v1.2.3 h1:K8UWO1HUJpRMXBxbmaY1Y8IAMZC/RsKB+ArEnnK4l5o= +github.com/holiman/uint256 v1.2.3/go.mod h1:SC8Ryt4n+UBbPbIBKaG9zbbDlp4jOru9xFZmPzLUTxw= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= @@ -69,29 +74,28 @@ github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMT github.com/shogo82148/go-tap v0.0.3 h1:i3RzbsucWz9caoWS0wFAmJGEU0hwCsWmuK9kYGPoajw= github.com/shogo82148/go-tap v0.0.3/go.mod h1:H6vRVOZ2uqX/Epmer6MnielLhU3ybUIPm6P3G4zGf5E= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= -github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a h1:1ur3QoCqvE5fl+nylMaIr9PVV1w343YRDtsy+Rwu7XI= github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a/go.mod h1:RRCYJbIwD5jmqPI9XoAFR0OcDxqUctll6zUj/+B4S48= -github.com/tklauser/go-sysconf v0.3.11 h1:89WgdJhk5SNwJfu+GKyYveZ4IaJ7xAkecBo+KdJV0CM= -github.com/tklauser/go-sysconf v0.3.11/go.mod h1:GqXfhXY3kiPa0nAXPDIQIWzJbMCB7AmcWpGR8lSZfqI= -github.com/tklauser/numcpus v0.6.0 h1:kebhY2Qt+3U6RNK7UqpYNA+tJ23IBEGKkB7JQBfDYms= -github.com/tklauser/numcpus v0.6.0/go.mod h1:FEZLMke0lhOUG6w2JadTzp0a+Nl8PF/GFkQ5UVIcaL4= +github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= +github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= +github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= +github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yusufpapurcu/wmi v1.2.2 h1:KBNDSne4vP5mbSWnJbO+51IMOXJB67QiYCSBrubbPRg= github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.4.0 h1:UVQgzMY87xqpKNgb+kDsll2Igd33HszWHFLmpaRMq/8= -golang.org/x/crypto v0.4.0/go.mod h1:3quD/ATkf6oY+rnes5c3ExXTbLc8mueNue5/DoinL80= +golang.org/x/crypto v0.12.0 h1:tFM/ta59kqch6LlvYnPa0yx5a83cL2nHflFhYKvv9Yk= +golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= +golang.org/x/exp v0.0.0-20230810033253-352e893a4cad h1:g0bG7Z4uG+OgH2QDODnjp6ggkk1bJDsINcuWmJN1iJU= +golang.org/x/exp v0.0.0-20230810033253-352e893a4cad/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.11.0 h1:bUO06HqtnRcc/7l71XBe4WcqTZ+3AH1J59zWDDwLKgU= +golang.org/x/mod v0.11.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -100,10 +104,11 @@ golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwY golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.7.0 h1:rJrUqqhjsgNp7KqAIc25s9pZnjU7TUcSY7HcVZjdn1g= +golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -121,19 +126,21 @@ golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU= -golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM= +golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.7.0 h1:4BRB4x83lYWy72KwLD/qYDuTu7q9PjSagHvijDw7cLo= +golang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.9.1 h1:8WMNJAz3zrtPmnYC7ISf5dEn3MT0gY7jBJfw27yrrLo= +golang.org/x/tools v0.9.1/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -150,8 +157,6 @@ google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQ gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1 h1:iiHuQZCNgYPmFQxd3BBN/Nc5+dAwzZuq5y40s20oQw0= -gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce h1:+JknDZhAj8YMt7GC73Ei8pv4MzjDUNPHgQWJdtMAaDU= -gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:5AcXVHNjg+BDxry382+8OKon8SEWiKktQR07RKPsv1c= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= @@ -159,6 +164,5 @@ gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= From 3eb7c903e34ae79a7f584ea228653f465cb50ee0 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Tue, 19 Sep 2023 13:29:18 +0200 Subject: [PATCH 025/387] simulators/smoke: upgrade dependencies --- simulators/smoke/clique/go.mod | 21 +++++++------ simulators/smoke/clique/go.sum | 52 ++++++++++++++++++--------------- simulators/smoke/genesis/go.mod | 21 +++++++------ simulators/smoke/genesis/go.sum | 52 ++++++++++++++++++--------------- simulators/smoke/network/go.mod | 21 +++++++------ simulators/smoke/network/go.sum | 52 ++++++++++++++++++--------------- 6 files changed, 120 insertions(+), 99 deletions(-) diff --git a/simulators/smoke/clique/go.mod b/simulators/smoke/clique/go.mod index 45ada91428..6b31297503 100644 --- a/simulators/smoke/clique/go.mod +++ b/simulators/smoke/clique/go.mod @@ -2,24 +2,27 @@ module github.com/ethereum/hive/simulators/smoke/clique go 1.18 -require github.com/ethereum/hive v0.0.0-20230313141339-8e3200bfc09e +require github.com/ethereum/hive v0.0.0-20230919110229-d58aec4a3eb5 require ( + github.com/Microsoft/go-winio v0.6.1 // indirect github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect github.com/deckarep/golang-set/v2 v2.1.0 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 // indirect - github.com/ethereum/go-ethereum v1.11.4 // indirect + github.com/ethereum/go-ethereum v1.13.1 // indirect github.com/go-ole/go-ole v1.2.6 // indirect github.com/go-stack/stack v1.8.1 // indirect - github.com/golang/snappy v0.0.4 // indirect + github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect github.com/gorilla/websocket v1.5.0 // indirect + github.com/holiman/uint256 v1.2.3 // indirect github.com/shirou/gopsutil v3.21.11+incompatible // indirect - github.com/stretchr/testify v1.8.1 // indirect github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a // indirect - github.com/tklauser/go-sysconf v0.3.11 // indirect - github.com/tklauser/numcpus v0.6.0 // indirect + github.com/tklauser/go-sysconf v0.3.12 // indirect + github.com/tklauser/numcpus v0.6.1 // indirect github.com/yusufpapurcu/wmi v1.2.2 // indirect - golang.org/x/crypto v0.4.0 // indirect - golang.org/x/sys v0.5.0 // indirect - gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce // indirect + golang.org/x/crypto v0.12.0 // indirect + golang.org/x/exp v0.0.0-20230810033253-352e893a4cad // indirect + golang.org/x/mod v0.11.0 // indirect + golang.org/x/sys v0.11.0 // indirect + golang.org/x/tools v0.9.1 // indirect ) diff --git a/simulators/smoke/clique/go.sum b/simulators/smoke/clique/go.sum index 2b80706cb8..385d52e663 100644 --- a/simulators/smoke/clique/go.sum +++ b/simulators/smoke/clique/go.sum @@ -1,3 +1,5 @@ +github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= +github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U= github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= @@ -12,10 +14,10 @@ github.com/deckarep/golang-set/v2 v2.1.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpO github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 h1:HbphB4TFFXpv7MNrT52FGrrgVXF1owhMVTHFZIlnvd4= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0/go.mod h1:DZGJHZMqrU4JJqFAWUS2UO1+lbSKsdiOoYi9Zzey7Fc= -github.com/ethereum/go-ethereum v1.11.4 h1:KG81SnUHXWk8LJB3mBcHg/E2yLvXoiPmRMCIRxgx3cE= -github.com/ethereum/go-ethereum v1.11.4/go.mod h1:it7x0DWnTDMfVFdXcU6Ti4KEFQynLHVRarcSlPr0HBo= -github.com/ethereum/hive v0.0.0-20230313141339-8e3200bfc09e h1:3g9cqRqpbZ92tSlGL4PfFoq435axKw6HiZ1Gz3fOkfk= -github.com/ethereum/hive v0.0.0-20230313141339-8e3200bfc09e/go.mod h1:PlpDuxHg6q1jU0K8Ouf+RXlHguignJ7k8Eyukc9RCPQ= +github.com/ethereum/go-ethereum v1.13.1 h1:UF2FaUKPIy5jeZk3X06ait3y2Q4wI+vJ1l7+UARp+60= +github.com/ethereum/go-ethereum v1.13.1/go.mod h1:xHQKzwkHSl0gnSjZK1mWa06XEdm9685AHqhRknOzqGQ= +github.com/ethereum/hive v0.0.0-20230919110229-d58aec4a3eb5 h1:22Z+XoI2hGtYR0AMzYr9IusfYM/chALq/6oJnejJQpk= +github.com/ethereum/hive v0.0.0-20230919110229-d58aec4a3eb5/go.mod h1:iKqu3dndnqdwSckyBGoZzeHhZz6X6XZws2TfZMdLdes= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= @@ -34,8 +36,9 @@ github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvq github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXiurYmW7fx4GZkL8feAMVq7nEjURHk= +github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= @@ -44,6 +47,8 @@ github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLe github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/holiman/uint256 v1.2.3 h1:K8UWO1HUJpRMXBxbmaY1Y8IAMZC/RsKB+ArEnnK4l5o= +github.com/holiman/uint256 v1.2.3/go.mod h1:SC8Ryt4n+UBbPbIBKaG9zbbDlp4jOru9xFZmPzLUTxw= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= @@ -67,29 +72,28 @@ github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZN github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI= github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= -github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a h1:1ur3QoCqvE5fl+nylMaIr9PVV1w343YRDtsy+Rwu7XI= github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a/go.mod h1:RRCYJbIwD5jmqPI9XoAFR0OcDxqUctll6zUj/+B4S48= -github.com/tklauser/go-sysconf v0.3.11 h1:89WgdJhk5SNwJfu+GKyYveZ4IaJ7xAkecBo+KdJV0CM= -github.com/tklauser/go-sysconf v0.3.11/go.mod h1:GqXfhXY3kiPa0nAXPDIQIWzJbMCB7AmcWpGR8lSZfqI= -github.com/tklauser/numcpus v0.6.0 h1:kebhY2Qt+3U6RNK7UqpYNA+tJ23IBEGKkB7JQBfDYms= -github.com/tklauser/numcpus v0.6.0/go.mod h1:FEZLMke0lhOUG6w2JadTzp0a+Nl8PF/GFkQ5UVIcaL4= +github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= +github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= +github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= +github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yusufpapurcu/wmi v1.2.2 h1:KBNDSne4vP5mbSWnJbO+51IMOXJB67QiYCSBrubbPRg= github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.4.0 h1:UVQgzMY87xqpKNgb+kDsll2Igd33HszWHFLmpaRMq/8= -golang.org/x/crypto v0.4.0/go.mod h1:3quD/ATkf6oY+rnes5c3ExXTbLc8mueNue5/DoinL80= +golang.org/x/crypto v0.12.0 h1:tFM/ta59kqch6LlvYnPa0yx5a83cL2nHflFhYKvv9Yk= +golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= +golang.org/x/exp v0.0.0-20230810033253-352e893a4cad h1:g0bG7Z4uG+OgH2QDODnjp6ggkk1bJDsINcuWmJN1iJU= +golang.org/x/exp v0.0.0-20230810033253-352e893a4cad/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.11.0 h1:bUO06HqtnRcc/7l71XBe4WcqTZ+3AH1J59zWDDwLKgU= +golang.org/x/mod v0.11.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -98,10 +102,11 @@ golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwY golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.7.0 h1:rJrUqqhjsgNp7KqAIc25s9pZnjU7TUcSY7HcVZjdn1g= +golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -119,19 +124,21 @@ golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU= -golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM= +golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.7.0 h1:4BRB4x83lYWy72KwLD/qYDuTu7q9PjSagHvijDw7cLo= +golang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.9.1 h1:8WMNJAz3zrtPmnYC7ISf5dEn3MT0gY7jBJfw27yrrLo= +golang.org/x/tools v0.9.1/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -148,8 +155,6 @@ google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQ gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1 h1:iiHuQZCNgYPmFQxd3BBN/Nc5+dAwzZuq5y40s20oQw0= -gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce h1:+JknDZhAj8YMt7GC73Ei8pv4MzjDUNPHgQWJdtMAaDU= -gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:5AcXVHNjg+BDxry382+8OKon8SEWiKktQR07RKPsv1c= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= @@ -157,6 +162,5 @@ gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/simulators/smoke/genesis/go.mod b/simulators/smoke/genesis/go.mod index b1d3b4fac3..f2ab53d455 100644 --- a/simulators/smoke/genesis/go.mod +++ b/simulators/smoke/genesis/go.mod @@ -2,24 +2,27 @@ module github.com/ethereum/hive/simulators/smoke/genesis go 1.18 -require github.com/ethereum/hive v0.0.0-20230313141339-8e3200bfc09e +require github.com/ethereum/hive v0.0.0-20230919110229-d58aec4a3eb5 require ( + github.com/Microsoft/go-winio v0.6.1 // indirect github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect github.com/deckarep/golang-set/v2 v2.1.0 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 // indirect - github.com/ethereum/go-ethereum v1.11.4 // indirect + github.com/ethereum/go-ethereum v1.13.1 // indirect github.com/go-ole/go-ole v1.2.6 // indirect github.com/go-stack/stack v1.8.1 // indirect - github.com/golang/snappy v0.0.4 // indirect + github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect github.com/gorilla/websocket v1.5.0 // indirect + github.com/holiman/uint256 v1.2.3 // indirect github.com/shirou/gopsutil v3.21.11+incompatible // indirect - github.com/stretchr/testify v1.8.1 // indirect github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a // indirect - github.com/tklauser/go-sysconf v0.3.11 // indirect - github.com/tklauser/numcpus v0.6.0 // indirect + github.com/tklauser/go-sysconf v0.3.12 // indirect + github.com/tklauser/numcpus v0.6.1 // indirect github.com/yusufpapurcu/wmi v1.2.2 // indirect - golang.org/x/crypto v0.4.0 // indirect - golang.org/x/sys v0.5.0 // indirect - gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce // indirect + golang.org/x/crypto v0.12.0 // indirect + golang.org/x/exp v0.0.0-20230810033253-352e893a4cad // indirect + golang.org/x/mod v0.11.0 // indirect + golang.org/x/sys v0.11.0 // indirect + golang.org/x/tools v0.9.1 // indirect ) diff --git a/simulators/smoke/genesis/go.sum b/simulators/smoke/genesis/go.sum index 2b80706cb8..385d52e663 100644 --- a/simulators/smoke/genesis/go.sum +++ b/simulators/smoke/genesis/go.sum @@ -1,3 +1,5 @@ +github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= +github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U= github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= @@ -12,10 +14,10 @@ github.com/deckarep/golang-set/v2 v2.1.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpO github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 h1:HbphB4TFFXpv7MNrT52FGrrgVXF1owhMVTHFZIlnvd4= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0/go.mod h1:DZGJHZMqrU4JJqFAWUS2UO1+lbSKsdiOoYi9Zzey7Fc= -github.com/ethereum/go-ethereum v1.11.4 h1:KG81SnUHXWk8LJB3mBcHg/E2yLvXoiPmRMCIRxgx3cE= -github.com/ethereum/go-ethereum v1.11.4/go.mod h1:it7x0DWnTDMfVFdXcU6Ti4KEFQynLHVRarcSlPr0HBo= -github.com/ethereum/hive v0.0.0-20230313141339-8e3200bfc09e h1:3g9cqRqpbZ92tSlGL4PfFoq435axKw6HiZ1Gz3fOkfk= -github.com/ethereum/hive v0.0.0-20230313141339-8e3200bfc09e/go.mod h1:PlpDuxHg6q1jU0K8Ouf+RXlHguignJ7k8Eyukc9RCPQ= +github.com/ethereum/go-ethereum v1.13.1 h1:UF2FaUKPIy5jeZk3X06ait3y2Q4wI+vJ1l7+UARp+60= +github.com/ethereum/go-ethereum v1.13.1/go.mod h1:xHQKzwkHSl0gnSjZK1mWa06XEdm9685AHqhRknOzqGQ= +github.com/ethereum/hive v0.0.0-20230919110229-d58aec4a3eb5 h1:22Z+XoI2hGtYR0AMzYr9IusfYM/chALq/6oJnejJQpk= +github.com/ethereum/hive v0.0.0-20230919110229-d58aec4a3eb5/go.mod h1:iKqu3dndnqdwSckyBGoZzeHhZz6X6XZws2TfZMdLdes= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= @@ -34,8 +36,9 @@ github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvq github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXiurYmW7fx4GZkL8feAMVq7nEjURHk= +github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= @@ -44,6 +47,8 @@ github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLe github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/holiman/uint256 v1.2.3 h1:K8UWO1HUJpRMXBxbmaY1Y8IAMZC/RsKB+ArEnnK4l5o= +github.com/holiman/uint256 v1.2.3/go.mod h1:SC8Ryt4n+UBbPbIBKaG9zbbDlp4jOru9xFZmPzLUTxw= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= @@ -67,29 +72,28 @@ github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZN github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI= github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= -github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a h1:1ur3QoCqvE5fl+nylMaIr9PVV1w343YRDtsy+Rwu7XI= github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a/go.mod h1:RRCYJbIwD5jmqPI9XoAFR0OcDxqUctll6zUj/+B4S48= -github.com/tklauser/go-sysconf v0.3.11 h1:89WgdJhk5SNwJfu+GKyYveZ4IaJ7xAkecBo+KdJV0CM= -github.com/tklauser/go-sysconf v0.3.11/go.mod h1:GqXfhXY3kiPa0nAXPDIQIWzJbMCB7AmcWpGR8lSZfqI= -github.com/tklauser/numcpus v0.6.0 h1:kebhY2Qt+3U6RNK7UqpYNA+tJ23IBEGKkB7JQBfDYms= -github.com/tklauser/numcpus v0.6.0/go.mod h1:FEZLMke0lhOUG6w2JadTzp0a+Nl8PF/GFkQ5UVIcaL4= +github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= +github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= +github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= +github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yusufpapurcu/wmi v1.2.2 h1:KBNDSne4vP5mbSWnJbO+51IMOXJB67QiYCSBrubbPRg= github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.4.0 h1:UVQgzMY87xqpKNgb+kDsll2Igd33HszWHFLmpaRMq/8= -golang.org/x/crypto v0.4.0/go.mod h1:3quD/ATkf6oY+rnes5c3ExXTbLc8mueNue5/DoinL80= +golang.org/x/crypto v0.12.0 h1:tFM/ta59kqch6LlvYnPa0yx5a83cL2nHflFhYKvv9Yk= +golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= +golang.org/x/exp v0.0.0-20230810033253-352e893a4cad h1:g0bG7Z4uG+OgH2QDODnjp6ggkk1bJDsINcuWmJN1iJU= +golang.org/x/exp v0.0.0-20230810033253-352e893a4cad/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.11.0 h1:bUO06HqtnRcc/7l71XBe4WcqTZ+3AH1J59zWDDwLKgU= +golang.org/x/mod v0.11.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -98,10 +102,11 @@ golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwY golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.7.0 h1:rJrUqqhjsgNp7KqAIc25s9pZnjU7TUcSY7HcVZjdn1g= +golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -119,19 +124,21 @@ golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU= -golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM= +golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.7.0 h1:4BRB4x83lYWy72KwLD/qYDuTu7q9PjSagHvijDw7cLo= +golang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.9.1 h1:8WMNJAz3zrtPmnYC7ISf5dEn3MT0gY7jBJfw27yrrLo= +golang.org/x/tools v0.9.1/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -148,8 +155,6 @@ google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQ gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1 h1:iiHuQZCNgYPmFQxd3BBN/Nc5+dAwzZuq5y40s20oQw0= -gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce h1:+JknDZhAj8YMt7GC73Ei8pv4MzjDUNPHgQWJdtMAaDU= -gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:5AcXVHNjg+BDxry382+8OKon8SEWiKktQR07RKPsv1c= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= @@ -157,6 +162,5 @@ gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/simulators/smoke/network/go.mod b/simulators/smoke/network/go.mod index 91ea91aac0..3069cb477e 100644 --- a/simulators/smoke/network/go.mod +++ b/simulators/smoke/network/go.mod @@ -2,24 +2,27 @@ module github.com/ethereum/hive/simulators/smoke/network go 1.18 -require github.com/ethereum/hive v0.0.0-20230313141339-8e3200bfc09e +require github.com/ethereum/hive v0.0.0-20230919110229-d58aec4a3eb5 require ( + github.com/Microsoft/go-winio v0.6.1 // indirect github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect github.com/deckarep/golang-set/v2 v2.1.0 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 // indirect - github.com/ethereum/go-ethereum v1.11.4 // indirect + github.com/ethereum/go-ethereum v1.13.1 // indirect github.com/go-ole/go-ole v1.2.6 // indirect github.com/go-stack/stack v1.8.1 // indirect - github.com/golang/snappy v0.0.4 // indirect + github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect github.com/gorilla/websocket v1.5.0 // indirect + github.com/holiman/uint256 v1.2.3 // indirect github.com/shirou/gopsutil v3.21.11+incompatible // indirect - github.com/stretchr/testify v1.8.1 // indirect github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a // indirect - github.com/tklauser/go-sysconf v0.3.11 // indirect - github.com/tklauser/numcpus v0.6.0 // indirect + github.com/tklauser/go-sysconf v0.3.12 // indirect + github.com/tklauser/numcpus v0.6.1 // indirect github.com/yusufpapurcu/wmi v1.2.2 // indirect - golang.org/x/crypto v0.4.0 // indirect - golang.org/x/sys v0.5.0 // indirect - gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce // indirect + golang.org/x/crypto v0.12.0 // indirect + golang.org/x/exp v0.0.0-20230810033253-352e893a4cad // indirect + golang.org/x/mod v0.11.0 // indirect + golang.org/x/sys v0.11.0 // indirect + golang.org/x/tools v0.9.1 // indirect ) diff --git a/simulators/smoke/network/go.sum b/simulators/smoke/network/go.sum index 2b80706cb8..385d52e663 100644 --- a/simulators/smoke/network/go.sum +++ b/simulators/smoke/network/go.sum @@ -1,3 +1,5 @@ +github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= +github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U= github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= @@ -12,10 +14,10 @@ github.com/deckarep/golang-set/v2 v2.1.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpO github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 h1:HbphB4TFFXpv7MNrT52FGrrgVXF1owhMVTHFZIlnvd4= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0/go.mod h1:DZGJHZMqrU4JJqFAWUS2UO1+lbSKsdiOoYi9Zzey7Fc= -github.com/ethereum/go-ethereum v1.11.4 h1:KG81SnUHXWk8LJB3mBcHg/E2yLvXoiPmRMCIRxgx3cE= -github.com/ethereum/go-ethereum v1.11.4/go.mod h1:it7x0DWnTDMfVFdXcU6Ti4KEFQynLHVRarcSlPr0HBo= -github.com/ethereum/hive v0.0.0-20230313141339-8e3200bfc09e h1:3g9cqRqpbZ92tSlGL4PfFoq435axKw6HiZ1Gz3fOkfk= -github.com/ethereum/hive v0.0.0-20230313141339-8e3200bfc09e/go.mod h1:PlpDuxHg6q1jU0K8Ouf+RXlHguignJ7k8Eyukc9RCPQ= +github.com/ethereum/go-ethereum v1.13.1 h1:UF2FaUKPIy5jeZk3X06ait3y2Q4wI+vJ1l7+UARp+60= +github.com/ethereum/go-ethereum v1.13.1/go.mod h1:xHQKzwkHSl0gnSjZK1mWa06XEdm9685AHqhRknOzqGQ= +github.com/ethereum/hive v0.0.0-20230919110229-d58aec4a3eb5 h1:22Z+XoI2hGtYR0AMzYr9IusfYM/chALq/6oJnejJQpk= +github.com/ethereum/hive v0.0.0-20230919110229-d58aec4a3eb5/go.mod h1:iKqu3dndnqdwSckyBGoZzeHhZz6X6XZws2TfZMdLdes= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= @@ -34,8 +36,9 @@ github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvq github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXiurYmW7fx4GZkL8feAMVq7nEjURHk= +github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= @@ -44,6 +47,8 @@ github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLe github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/holiman/uint256 v1.2.3 h1:K8UWO1HUJpRMXBxbmaY1Y8IAMZC/RsKB+ArEnnK4l5o= +github.com/holiman/uint256 v1.2.3/go.mod h1:SC8Ryt4n+UBbPbIBKaG9zbbDlp4jOru9xFZmPzLUTxw= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= @@ -67,29 +72,28 @@ github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZN github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI= github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= -github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a h1:1ur3QoCqvE5fl+nylMaIr9PVV1w343YRDtsy+Rwu7XI= github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a/go.mod h1:RRCYJbIwD5jmqPI9XoAFR0OcDxqUctll6zUj/+B4S48= -github.com/tklauser/go-sysconf v0.3.11 h1:89WgdJhk5SNwJfu+GKyYveZ4IaJ7xAkecBo+KdJV0CM= -github.com/tklauser/go-sysconf v0.3.11/go.mod h1:GqXfhXY3kiPa0nAXPDIQIWzJbMCB7AmcWpGR8lSZfqI= -github.com/tklauser/numcpus v0.6.0 h1:kebhY2Qt+3U6RNK7UqpYNA+tJ23IBEGKkB7JQBfDYms= -github.com/tklauser/numcpus v0.6.0/go.mod h1:FEZLMke0lhOUG6w2JadTzp0a+Nl8PF/GFkQ5UVIcaL4= +github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= +github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= +github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= +github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yusufpapurcu/wmi v1.2.2 h1:KBNDSne4vP5mbSWnJbO+51IMOXJB67QiYCSBrubbPRg= github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.4.0 h1:UVQgzMY87xqpKNgb+kDsll2Igd33HszWHFLmpaRMq/8= -golang.org/x/crypto v0.4.0/go.mod h1:3quD/ATkf6oY+rnes5c3ExXTbLc8mueNue5/DoinL80= +golang.org/x/crypto v0.12.0 h1:tFM/ta59kqch6LlvYnPa0yx5a83cL2nHflFhYKvv9Yk= +golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= +golang.org/x/exp v0.0.0-20230810033253-352e893a4cad h1:g0bG7Z4uG+OgH2QDODnjp6ggkk1bJDsINcuWmJN1iJU= +golang.org/x/exp v0.0.0-20230810033253-352e893a4cad/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.11.0 h1:bUO06HqtnRcc/7l71XBe4WcqTZ+3AH1J59zWDDwLKgU= +golang.org/x/mod v0.11.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -98,10 +102,11 @@ golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwY golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.7.0 h1:rJrUqqhjsgNp7KqAIc25s9pZnjU7TUcSY7HcVZjdn1g= +golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -119,19 +124,21 @@ golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU= -golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM= +golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.7.0 h1:4BRB4x83lYWy72KwLD/qYDuTu7q9PjSagHvijDw7cLo= +golang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.9.1 h1:8WMNJAz3zrtPmnYC7ISf5dEn3MT0gY7jBJfw27yrrLo= +golang.org/x/tools v0.9.1/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -148,8 +155,6 @@ google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQ gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1 h1:iiHuQZCNgYPmFQxd3BBN/Nc5+dAwzZuq5y40s20oQw0= -gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce h1:+JknDZhAj8YMt7GC73Ei8pv4MzjDUNPHgQWJdtMAaDU= -gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:5AcXVHNjg+BDxry382+8OKon8SEWiKktQR07RKPsv1c= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= @@ -157,6 +162,5 @@ gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= From 98e7a998e450119f1d3a9b275f5e34afebd050c7 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Tue, 19 Sep 2023 13:34:00 +0200 Subject: [PATCH 026/387] simulators/smoke/genesis: add some new forks --- simulators/smoke/genesis/main.go | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/simulators/smoke/genesis/main.go b/simulators/smoke/genesis/main.go index ace1b764cf..39a007a535 100644 --- a/simulators/smoke/genesis/main.go +++ b/simulators/smoke/genesis/main.go @@ -26,18 +26,21 @@ func main() { "/genesis.json": "genesis-empty.json", }, Parameters: map[string]string{ - "HIVE_CHAIN_ID": "10", - "HIVE_FORK_HOMESTEAD": "11", - "HIVE_FORK_DAO_BLOCK": "12", - "HIVE_FORK_TANGERINE": "13", - "HIVE_FORK_SPURIOUS": "14", - "HIVE_FORK_BYZANTIUM": "15", - "HIVE_FORK_CONSTANTINOPLE": "16", - "HIVE_FORK_PETERSBURG": "17", - "HIVE_FORK_ISTANBUL": "18", - "HIVE_FORK_MUIR_GLACIER": "19", - "HIVE_FORK_BERLIN": "20", - "HIVE_FORK_LONDON": "21", + "HIVE_CHAIN_ID": "10", + "HIVE_FORK_HOMESTEAD": "11", + "HIVE_FORK_DAO_BLOCK": "12", + "HIVE_FORK_TANGERINE": "13", + "HIVE_FORK_SPURIOUS": "14", + "HIVE_FORK_BYZANTIUM": "15", + "HIVE_FORK_CONSTANTINOPLE": "16", + "HIVE_FORK_PETERSBURG": "17", + "HIVE_FORK_ISTANBUL": "18", + "HIVE_FORK_MUIR_GLACIER": "19", + "HIVE_FORK_BERLIN": "20", + "HIVE_FORK_LONDON": "21", + "HIVE_TERMINAL_TOTAL_DIFFICULTY": "22", + "HIVE_SHANGHAI_TIMESTAMP": "23", + "HIVE_CANCUN_TIMESTAMP": "24", }, Run: genesisTest{"0x433d0b859a77a29753d2a6df477c971dcc6300af33f9d64d821a1d490b4148b1"}.test, }) From a5e17647854b8fbd2051549b6a70bae7dca7cb12 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Tue, 19 Sep 2023 13:34:23 +0200 Subject: [PATCH 027/387] simulators/ethereum/sync: upgrade dependencies --- simulators/ethereum/sync/go.mod | 32 ++++++++----- simulators/ethereum/sync/go.sum | 85 ++++++++++++++++++++------------- 2 files changed, 74 insertions(+), 43 deletions(-) diff --git a/simulators/ethereum/sync/go.mod b/simulators/ethereum/sync/go.mod index 129eb1adc0..d2da75adaf 100644 --- a/simulators/ethereum/sync/go.mod +++ b/simulators/ethereum/sync/go.mod @@ -3,33 +3,43 @@ module github.com/ethereum/hive/simulators/ethereum/sync go 1.18 require ( - github.com/ethereum/go-ethereum v1.11.4 - github.com/ethereum/hive v0.0.0-20230313141339-8e3200bfc09e + github.com/ethereum/go-ethereum v1.13.1 + github.com/ethereum/hive v0.0.0-20230919110229-d58aec4a3eb5 ) require ( + github.com/Microsoft/go-winio v0.6.1 // indirect + github.com/bits-and-blooms/bitset v1.5.0 // indirect github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect + github.com/consensys/bavard v0.1.13 // indirect + github.com/consensys/gnark-crypto v0.10.0 // indirect + github.com/crate-crypto/go-kzg-4844 v0.3.0 // indirect github.com/deckarep/golang-set/v2 v2.1.0 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 // indirect + github.com/ethereum/c-kzg-4844 v0.3.1 // indirect github.com/fjl/memsize v0.0.1 // indirect github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08 // indirect github.com/go-ole/go-ole v1.2.6 // indirect github.com/go-stack/stack v1.8.1 // indirect github.com/golang-jwt/jwt/v4 v4.4.3 // indirect - github.com/golang/snappy v0.0.4 // indirect + github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect github.com/gorilla/websocket v1.5.0 // indirect github.com/hashicorp/go-bexpr v0.1.11 // indirect + github.com/holiman/uint256 v1.2.3 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect + github.com/mmcloughlin/addchain v0.4.0 // indirect github.com/rs/cors v1.8.2 // indirect github.com/shirou/gopsutil v3.21.11+incompatible // indirect - github.com/stretchr/testify v1.8.1 // indirect + github.com/supranational/blst v0.3.11 // indirect github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a // indirect - github.com/tklauser/go-sysconf v0.3.11 // indirect - github.com/tklauser/numcpus v0.6.0 // indirect - github.com/urfave/cli/v2 v2.23.7 // indirect + github.com/tklauser/go-sysconf v0.3.12 // indirect + github.com/tklauser/numcpus v0.6.1 // indirect github.com/yusufpapurcu/wmi v1.2.2 // indirect - golang.org/x/crypto v0.4.0 // indirect - golang.org/x/sys v0.5.0 // indirect - golang.org/x/time v0.3.0 // indirect - gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce // indirect + golang.org/x/crypto v0.12.0 // indirect + golang.org/x/exp v0.0.0-20230810033253-352e893a4cad // indirect + golang.org/x/mod v0.11.0 // indirect + golang.org/x/sync v0.3.0 // indirect + golang.org/x/sys v0.11.0 // indirect + golang.org/x/tools v0.9.1 // indirect + rsc.io/tmplfunc v0.0.3 // indirect ) diff --git a/simulators/ethereum/sync/go.sum b/simulators/ethereum/sync/go.sum index b216005a87..cca7f3eeae 100644 --- a/simulators/ethereum/sync/go.sum +++ b/simulators/ethereum/sync/go.sum @@ -1,6 +1,10 @@ github.com/DataDog/zstd v1.5.2 h1:vUG4lAyuPCXO0TLbXvPv7EB7cNK1QV/luu55UHLrrn8= +github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= +github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= github.com/VictoriaMetrics/fastcache v1.12.0 h1:vnVi/y9yKDcD9akmc4NqAoqgQhJrOwUF+j9LTgn4QDE= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= +github.com/bits-and-blooms/bitset v1.5.0 h1:NpE8frKRLGHIcEzkR+gZhiioW1+WbYV6fKwD6ZIpQT8= +github.com/bits-and-blooms/bitset v1.5.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U= github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= @@ -10,9 +14,15 @@ github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5P github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/cockroachdb/errors v1.9.1 h1:yFVvsI0VxmRShfawbt/laCIDy/mtTqqnvoNgiy5bEV8= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE= -github.com/cockroachdb/pebble v0.0.0-20230209160836-829675f94811 h1:ytcWPaNPhNoGMWEhDvS3zToKcDpRsLuRolQJBVGdozk= +github.com/cockroachdb/pebble v0.0.0-20230906160148-46873a6a7a06 h1:T+Np/xtzIjYM/P5NAw0e2Rf1FGvzDau1h54MKvx8G7w= github.com/cockroachdb/redact v1.1.3 h1:AKZds10rFSIj7qADf0g46UixK8NNLwWTNdCIGS5wfSQ= +github.com/consensys/bavard v0.1.13 h1:oLhMLOFGTLdlda/kma4VOJazblc7IM5y5QPd2A/YjhQ= +github.com/consensys/bavard v0.1.13/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI= +github.com/consensys/gnark-crypto v0.10.0 h1:zRh22SR7o4K35SoNqouS9J/TKHTyU2QWaj5ldehyXtA= +github.com/consensys/gnark-crypto v0.10.0/go.mod h1:Iq/P3HHl0ElSjsg2E1gsMwhAyxnxoKK5nVyZKd+/KhU= github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= +github.com/crate-crypto/go-kzg-4844 v0.3.0 h1:UBlWE0CgyFqqzTI+IFyCzA7A3Zw4iip6uzRv5NIXG0A= +github.com/crate-crypto/go-kzg-4844 v0.3.0/go.mod h1:SBP7ikXEgDnUPONgm33HtuDZEDtWa3L4QtN1ocJSEQ4= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -21,11 +31,12 @@ github.com/deckarep/golang-set/v2 v2.1.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpO github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 h1:HbphB4TFFXpv7MNrT52FGrrgVXF1owhMVTHFZIlnvd4= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0/go.mod h1:DZGJHZMqrU4JJqFAWUS2UO1+lbSKsdiOoYi9Zzey7Fc= -github.com/edsrzf/mmap-go v1.1.0 h1:6EUwBLQ/Mcr1EYLE4Tn1VdW1A4ckqCQWZBw8Hr0kjpQ= -github.com/ethereum/go-ethereum v1.11.4 h1:KG81SnUHXWk8LJB3mBcHg/E2yLvXoiPmRMCIRxgx3cE= -github.com/ethereum/go-ethereum v1.11.4/go.mod h1:it7x0DWnTDMfVFdXcU6Ti4KEFQynLHVRarcSlPr0HBo= -github.com/ethereum/hive v0.0.0-20230313141339-8e3200bfc09e h1:3g9cqRqpbZ92tSlGL4PfFoq435axKw6HiZ1Gz3fOkfk= -github.com/ethereum/hive v0.0.0-20230313141339-8e3200bfc09e/go.mod h1:PlpDuxHg6q1jU0K8Ouf+RXlHguignJ7k8Eyukc9RCPQ= +github.com/ethereum/c-kzg-4844 v0.3.1 h1:sR65+68+WdnMKxseNWxSJuAv2tsUrihTpVBTfM/U5Zg= +github.com/ethereum/c-kzg-4844 v0.3.1/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= +github.com/ethereum/go-ethereum v1.13.1 h1:UF2FaUKPIy5jeZk3X06ait3y2Q4wI+vJ1l7+UARp+60= +github.com/ethereum/go-ethereum v1.13.1/go.mod h1:xHQKzwkHSl0gnSjZK1mWa06XEdm9685AHqhRknOzqGQ= +github.com/ethereum/hive v0.0.0-20230919110229-d58aec4a3eb5 h1:22Z+XoI2hGtYR0AMzYr9IusfYM/chALq/6oJnejJQpk= +github.com/ethereum/hive v0.0.0-20230919110229-d58aec4a3eb5/go.mod h1:iKqu3dndnqdwSckyBGoZzeHhZz6X6XZws2TfZMdLdes= github.com/fjl/memsize v0.0.1 h1:+zhkb+dhUgx0/e+M8sF0QqiouvMQUiKR+QYvdxIOKcQ= github.com/fjl/memsize v0.0.1/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= @@ -54,29 +65,34 @@ github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXiurYmW7fx4GZkL8feAMVq7nEjURHk= +github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/hashicorp/go-bexpr v0.1.11 h1:6DqdA/KBjurGby9yTY0bmkathya0lfwF2SeuubCI7dY= github.com/hashicorp/go-bexpr v0.1.11/go.mod h1:f03lAo0duBlDIUMGCuad8oLcgejw4m7U+N8T+6Kz1AE= +github.com/holiman/billy v0.0.0-20230718173358-1c7e68d277a7 h1:3JQNjnMRil1yD0IfZKHF9GxxWKDJGj8I0IqOUol//sw= github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao= -github.com/holiman/uint256 v1.2.1 h1:XRtyuda/zw2l+Bq/38n5XUoEF72aSOu/77Thd9pPp2o= +github.com/holiman/uint256 v1.2.3 h1:K8UWO1HUJpRMXBxbmaY1Y8IAMZC/RsKB+ArEnnK4l5o= +github.com/holiman/uint256 v1.2.3/go.mod h1:SC8Ryt4n+UBbPbIBKaG9zbbDlp4jOru9xFZmPzLUTxw= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/huin/goupnp v1.0.3 h1:N8No57ls+MnjlB+JPiCVSOyy/ot7MJTqlo7rn+NYSqQ= +github.com/huin/goupnp v1.3.0 h1:UvLUlWDNpoUdYzb2TCn+MuTWtcjXKSza2n6CBdQ0xXc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= github.com/klauspost/compress v1.15.15 h1:EF27CXIuDsYJ6mmvtBRlEuB2UVOqHG1tAXgZ7yIO+lw= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= +github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peKQ= github.com/mattn/go-runewidth v0.0.14 h1:+xnbZSEeDbOIg5/mE6JF0w6n9duR1l3/WmbinWVwUuU= @@ -86,6 +102,9 @@ github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyua github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/pointerstructure v1.2.1 h1:ZhBBeX8tSlRpu/FFhXH4RC4OJzFlqsQhoHZAz4x7TIw= github.com/mitchellh/pointerstructure v1.2.1/go.mod h1:BRAsLI5zgXmw97Lf6s25bs8ohIXc3tViBH44KcwB2g4= +github.com/mmcloughlin/addchain v0.4.0 h1:SobOdjm2xLj1KkXN5/n0xTIWyZA2+s99UCY1iPfkHRY= +github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqkyU72HC5wJ4RlU= +github.com/mmcloughlin/profile v0.1.1/go.mod h1:IhHD7q1ooxgwTgjxQYkACGA77oFTDdFVejUS1/tS/qU= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= @@ -117,24 +136,20 @@ github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKl github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= github.com/status-im/keycard-go v0.2.0 h1:QDLFswOQu1r5jsycloeQh3bVU8n/NatHHaZobtDnDzA= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= -github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/supranational/blst v0.3.11 h1:LyU6FolezeWAhvQk0k6O/d49jqgO52MSDDfYgbeoEm4= +github.com/supranational/blst v0.3.11/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a h1:1ur3QoCqvE5fl+nylMaIr9PVV1w343YRDtsy+Rwu7XI= github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a/go.mod h1:RRCYJbIwD5jmqPI9XoAFR0OcDxqUctll6zUj/+B4S48= -github.com/tklauser/go-sysconf v0.3.11 h1:89WgdJhk5SNwJfu+GKyYveZ4IaJ7xAkecBo+KdJV0CM= -github.com/tklauser/go-sysconf v0.3.11/go.mod h1:GqXfhXY3kiPa0nAXPDIQIWzJbMCB7AmcWpGR8lSZfqI= -github.com/tklauser/numcpus v0.6.0 h1:kebhY2Qt+3U6RNK7UqpYNA+tJ23IBEGKkB7JQBfDYms= -github.com/tklauser/numcpus v0.6.0/go.mod h1:FEZLMke0lhOUG6w2JadTzp0a+Nl8PF/GFkQ5UVIcaL4= +github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= +github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= +github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= +github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= github.com/tyler-smith/go-bip39 v1.1.0 h1:5eUemwrMargf3BSLRRCalXT93Ns6pQJIjYQN2nyfOP8= -github.com/urfave/cli/v2 v2.23.7 h1:YHDQ46s3VghFHFf1DdF+Sh7H4RqhcM+t0TmZRJx4oJY= -github.com/urfave/cli/v2 v2.23.7/go.mod h1:GHupkWPMM0M/sj1a2b4wUrWBPzazNrIjouW6fmdJLxc= +github.com/urfave/cli/v2 v2.25.7 h1:VAzn5oq403l5pHjc4OhD54+XGO9cdKVL/7lDjF+iKUs= github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yusufpapurcu/wmi v1.2.2 h1:KBNDSne4vP5mbSWnJbO+51IMOXJB67QiYCSBrubbPRg= @@ -142,10 +157,13 @@ github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQ golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.4.0 h1:UVQgzMY87xqpKNgb+kDsll2Igd33HszWHFLmpaRMq/8= -golang.org/x/crypto v0.4.0/go.mod h1:3quD/ATkf6oY+rnes5c3ExXTbLc8mueNue5/DoinL80= -golang.org/x/exp v0.0.0-20230206171751-46f607a40771 h1:xP7rWLUr1e1n2xkK5YB4LI0hPEy3LJC6Wk+D4pGlOJg= +golang.org/x/crypto v0.12.0 h1:tFM/ta59kqch6LlvYnPa0yx5a83cL2nHflFhYKvv9Yk= +golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= +golang.org/x/exp v0.0.0-20230810033253-352e893a4cad h1:g0bG7Z4uG+OgH2QDODnjp6ggkk1bJDsINcuWmJN1iJU= +golang.org/x/exp v0.0.0-20230810033253-352e893a4cad/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.11.0 h1:bUO06HqtnRcc/7l71XBe4WcqTZ+3AH1J59zWDDwLKgU= +golang.org/x/mod v0.11.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -154,11 +172,12 @@ golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwY golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.7.0 h1:rJrUqqhjsgNp7KqAIc25s9pZnjU7TUcSY7HcVZjdn1g= +golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= +golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= +golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -176,21 +195,22 @@ golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU= -golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM= +golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.7.0 h1:4BRB4x83lYWy72KwLD/qYDuTu7q9PjSagHvijDw7cLo= +golang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc= golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= -golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.9.1 h1:8WMNJAz3zrtPmnYC7ISf5dEn3MT0gY7jBJfw27yrrLo= +golang.org/x/tools v0.9.1/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -208,8 +228,7 @@ google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1 h1:iiHuQZCNgYPmFQxd3BBN/Nc5+dAwzZuq5y40s20oQw0= -gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce h1:+JknDZhAj8YMt7GC73Ei8pv4MzjDUNPHgQWJdtMAaDU= -gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:5AcXVHNjg+BDxry382+8OKon8SEWiKktQR07RKPsv1c= +gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= @@ -220,3 +239,5 @@ gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +rsc.io/tmplfunc v0.0.3 h1:53XFQh69AfOa8Tw0Jm7t+GV7KZhOi6jzsCzTtKbMvzU= +rsc.io/tmplfunc v0.0.3/go.mod h1:AG3sTPzElb1Io3Yg4voV9AGZJuleGAwaVRxL9M49PhA= From 66da4c1590202eec0a649561d57a16cb3f3f8e98 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Tue, 19 Sep 2023 13:34:39 +0200 Subject: [PATCH 028/387] simulators/ethereum/rpc: upgrade dependencies --- simulators/ethereum/rpc/go.mod | 38 ++++++++------ simulators/ethereum/rpc/go.sum | 93 ++++++++++++++++++++-------------- 2 files changed, 79 insertions(+), 52 deletions(-) diff --git a/simulators/ethereum/rpc/go.mod b/simulators/ethereum/rpc/go.mod index 128c785276..76707877f2 100644 --- a/simulators/ethereum/rpc/go.mod +++ b/simulators/ethereum/rpc/go.mod @@ -3,24 +3,30 @@ module github.com/ethereum/hive/simulators/ethereum/rpc go 1.18 require ( - github.com/ethereum/go-ethereum v1.11.4 - github.com/ethereum/hive v0.0.0-20230313141339-8e3200bfc09e + github.com/ethereum/go-ethereum v1.13.1 + github.com/ethereum/hive v0.0.0-20230919110229-d58aec4a3eb5 github.com/kr/pretty v0.3.1 ) require ( github.com/DataDog/zstd v1.5.2 // indirect + github.com/Microsoft/go-winio v0.6.1 // indirect github.com/VictoriaMetrics/fastcache v1.12.0 // indirect github.com/beorn7/perks v1.0.1 // indirect + github.com/bits-and-blooms/bitset v1.5.0 // indirect github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect github.com/cespare/cp v1.1.1 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/cockroachdb/errors v1.9.1 // indirect github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect - github.com/cockroachdb/pebble v0.0.0-20230209160836-829675f94811 // indirect + github.com/cockroachdb/pebble v0.0.0-20230906160148-46873a6a7a06 // indirect github.com/cockroachdb/redact v1.1.3 // indirect + github.com/consensys/bavard v0.1.13 // indirect + github.com/consensys/gnark-crypto v0.10.0 // indirect + github.com/crate-crypto/go-kzg-4844 v0.3.0 // indirect github.com/deckarep/golang-set/v2 v2.1.0 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 // indirect + github.com/ethereum/c-kzg-4844 v0.3.1 // indirect github.com/fjl/memsize v0.0.1 // indirect github.com/fsnotify/fsnotify v1.6.0 // indirect github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08 // indirect @@ -31,17 +37,18 @@ require ( github.com/gogo/protobuf v1.3.2 // indirect github.com/golang-jwt/jwt/v4 v4.4.3 // indirect github.com/golang/protobuf v1.5.2 // indirect - github.com/golang/snappy v0.0.4 // indirect + github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect github.com/google/uuid v1.3.0 // indirect github.com/gorilla/websocket v1.5.0 // indirect github.com/hashicorp/go-bexpr v0.1.11 // indirect github.com/holiman/bloomfilter/v2 v2.0.3 // indirect - github.com/holiman/uint256 v1.2.1 // indirect + github.com/holiman/uint256 v1.2.3 // indirect github.com/klauspost/compress v1.15.15 // indirect github.com/kr/text v0.2.0 // indirect github.com/mattn/go-runewidth v0.0.14 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect + github.com/mmcloughlin/addchain v0.4.0 // indirect github.com/olekukonko/tablewriter v0.0.5 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/prometheus/client_golang v1.14.0 // indirect @@ -52,17 +59,18 @@ require ( github.com/rogpeppe/go-internal v1.9.0 // indirect github.com/rs/cors v1.8.2 // indirect github.com/shirou/gopsutil v3.21.11+incompatible // indirect - github.com/stretchr/testify v1.8.1 // indirect + github.com/supranational/blst v0.3.11 // indirect github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a // indirect - github.com/tklauser/go-sysconf v0.3.11 // indirect - github.com/tklauser/numcpus v0.6.0 // indirect - github.com/urfave/cli/v2 v2.23.7 // indirect + github.com/tklauser/go-sysconf v0.3.12 // indirect + github.com/tklauser/numcpus v0.6.1 // indirect github.com/yusufpapurcu/wmi v1.2.2 // indirect - golang.org/x/crypto v0.4.0 // indirect - golang.org/x/exp v0.0.0-20230206171751-46f607a40771 // indirect - golang.org/x/sys v0.5.0 // indirect - golang.org/x/text v0.7.0 // indirect - golang.org/x/time v0.3.0 // indirect + golang.org/x/crypto v0.12.0 // indirect + golang.org/x/exp v0.0.0-20230810033253-352e893a4cad // indirect + golang.org/x/mod v0.11.0 // indirect + golang.org/x/sync v0.3.0 // indirect + golang.org/x/sys v0.11.0 // indirect + golang.org/x/text v0.12.0 // indirect + golang.org/x/tools v0.9.1 // indirect google.golang.org/protobuf v1.28.1 // indirect - gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce // indirect + rsc.io/tmplfunc v0.0.3 // indirect ) diff --git a/simulators/ethereum/rpc/go.sum b/simulators/ethereum/rpc/go.sum index 4d3a531c48..3dca035dbc 100644 --- a/simulators/ethereum/rpc/go.sum +++ b/simulators/ethereum/rpc/go.sum @@ -6,6 +6,8 @@ github.com/CloudyKit/jet/v3 v3.0.0/go.mod h1:HKQPgSJmdK8hdoAbKUUWajkHyHo4RaU5rMd github.com/DataDog/zstd v1.5.2 h1:vUG4lAyuPCXO0TLbXvPv7EB7cNK1QV/luu55UHLrrn8= github.com/DataDog/zstd v1.5.2/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= github.com/Joker/hpp v1.0.0/go.mod h1:8x5n+M1Hp5hC0g8okX3sR3vFQwynaX/UgSOM9MeBKzY= +github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= +github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= github.com/Shopify/goreferrer v0.0.0-20181106222321-ec9c9a553398/go.mod h1:a1uqRtAwp2Xwc6WNPJEufxJ7fx3npB4UV/JOLmbu5I0= github.com/VictoriaMetrics/fastcache v1.12.0 h1:vnVi/y9yKDcD9akmc4NqAoqgQhJrOwUF+j9LTgn4QDE= github.com/VictoriaMetrics/fastcache v1.12.0/go.mod h1:tjiYeEfYXCqacuvYw/7UoDIeJaNxq6132xHICNP77w8= @@ -16,6 +18,8 @@ github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5 github.com/aymerick/raymond v2.0.3-0.20180322193309-b565731e1464+incompatible/go.mod h1:osfaiScAUVup+UC9Nfq76eWqDhXlp+4UYaA8uhTBO6g= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/bits-and-blooms/bitset v1.5.0 h1:NpE8frKRLGHIcEzkR+gZhiioW1+WbYV6fKwD6ZIpQT8= +github.com/bits-and-blooms/bitset v1.5.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U= github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= @@ -30,24 +34,30 @@ github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5P github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cockroachdb/datadriven v1.0.2 h1:H9MtNqVoVhvd9nCBwOyDjUEdZCREqbIdCJD93PBm/jA= github.com/cockroachdb/datadriven v1.0.2/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= +github.com/cockroachdb/datadriven v1.0.3-0.20230801171734-e384cf455877 h1:1MLK4YpFtIEo3ZtMA5C795Wtv5VuUnrXX7mQG+aHg6o= github.com/cockroachdb/errors v1.9.1 h1:yFVvsI0VxmRShfawbt/laCIDy/mtTqqnvoNgiy5bEV8= github.com/cockroachdb/errors v1.9.1/go.mod h1:2sxOtL2WIc096WSZqZ5h8fa17rdDq9HZOZLBCor4mBk= github.com/cockroachdb/logtags v0.0.0-20211118104740-dabe8e521a4f/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= -github.com/cockroachdb/pebble v0.0.0-20230209160836-829675f94811 h1:ytcWPaNPhNoGMWEhDvS3zToKcDpRsLuRolQJBVGdozk= -github.com/cockroachdb/pebble v0.0.0-20230209160836-829675f94811/go.mod h1:Nb5lgvnQ2+oGlE/EyZy4+2/CxRh9KfvCXnag1vtpxVM= +github.com/cockroachdb/pebble v0.0.0-20230906160148-46873a6a7a06 h1:T+Np/xtzIjYM/P5NAw0e2Rf1FGvzDau1h54MKvx8G7w= +github.com/cockroachdb/pebble v0.0.0-20230906160148-46873a6a7a06/go.mod h1:bynZ3gvVyhlvjLI7PT6dmZ7g76xzJ7HpxfjgkzCGz6s= github.com/cockroachdb/redact v1.1.3 h1:AKZds10rFSIj7qADf0g46UixK8NNLwWTNdCIGS5wfSQ= github.com/cockroachdb/redact v1.1.3/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0/go.mod h1:4Zcjuz89kmFXt9morQgcfYZAYZ5n8WHjt81YYWIwtTM= +github.com/consensys/bavard v0.1.13 h1:oLhMLOFGTLdlda/kma4VOJazblc7IM5y5QPd2A/YjhQ= +github.com/consensys/bavard v0.1.13/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI= +github.com/consensys/gnark-crypto v0.10.0 h1:zRh22SR7o4K35SoNqouS9J/TKHTyU2QWaj5ldehyXtA= +github.com/consensys/gnark-crypto v0.10.0/go.mod h1:Iq/P3HHl0ElSjsg2E1gsMwhAyxnxoKK5nVyZKd+/KhU= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/cpuguy83/go-md2man v1.0.10 h1:BSKMNlYxDvnunlTymqtgONjNnaRV1sTpcovwwjF22jk= github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= +github.com/crate-crypto/go-kzg-4844 v0.3.0 h1:UBlWE0CgyFqqzTI+IFyCzA7A3Zw4iip6uzRv5NIXG0A= +github.com/crate-crypto/go-kzg-4844 v0.3.0/go.mod h1:SBP7ikXEgDnUPONgm33HtuDZEDtWa3L4QtN1ocJSEQ4= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= @@ -60,17 +70,18 @@ github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0/go.mod h1:DZGJHZMqrU4JJqFAWUS2U github.com/dgraph-io/badger v1.6.0/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6psNgSztDR4= github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/edsrzf/mmap-go v1.1.0 h1:6EUwBLQ/Mcr1EYLE4Tn1VdW1A4ckqCQWZBw8Hr0kjpQ= github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385/go.mod h1:0vRUJqYpeSZifjYj7uP3BG/gKcuzL9xWVV/Y+cK33KM= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/etcd-io/bbolt v1.3.3/go.mod h1:ZF2nL25h33cCyBtcyWeZ2/I3HQOfTP+0PIEvHjkjCrw= -github.com/ethereum/go-ethereum v1.11.4 h1:KG81SnUHXWk8LJB3mBcHg/E2yLvXoiPmRMCIRxgx3cE= -github.com/ethereum/go-ethereum v1.11.4/go.mod h1:it7x0DWnTDMfVFdXcU6Ti4KEFQynLHVRarcSlPr0HBo= -github.com/ethereum/hive v0.0.0-20230313141339-8e3200bfc09e h1:3g9cqRqpbZ92tSlGL4PfFoq435axKw6HiZ1Gz3fOkfk= -github.com/ethereum/hive v0.0.0-20230313141339-8e3200bfc09e/go.mod h1:PlpDuxHg6q1jU0K8Ouf+RXlHguignJ7k8Eyukc9RCPQ= +github.com/ethereum/c-kzg-4844 v0.3.1 h1:sR65+68+WdnMKxseNWxSJuAv2tsUrihTpVBTfM/U5Zg= +github.com/ethereum/c-kzg-4844 v0.3.1/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= +github.com/ethereum/go-ethereum v1.13.1 h1:UF2FaUKPIy5jeZk3X06ait3y2Q4wI+vJ1l7+UARp+60= +github.com/ethereum/go-ethereum v1.13.1/go.mod h1:xHQKzwkHSl0gnSjZK1mWa06XEdm9685AHqhRknOzqGQ= +github.com/ethereum/hive v0.0.0-20230919110229-d58aec4a3eb5 h1:22Z+XoI2hGtYR0AMzYr9IusfYM/chALq/6oJnejJQpk= +github.com/ethereum/hive v0.0.0-20230919110229-d58aec4a3eb5/go.mod h1:iKqu3dndnqdwSckyBGoZzeHhZz6X6XZws2TfZMdLdes= github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072/go.mod h1:duJ4Jxv5lDcvg4QuQr0oowTf7dz4/CR8NtyCooz9HL8= github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= github.com/fjl/memsize v0.0.1 h1:+zhkb+dhUgx0/e+M8sF0QqiouvMQUiKR+QYvdxIOKcQ= @@ -127,8 +138,9 @@ github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXiurYmW7fx4GZkL8feAMVq7nEjURHk= +github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/gomodule/redigo v1.7.1-0.20190724094224-574c33c3df38/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= @@ -140,6 +152,7 @@ github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -152,12 +165,13 @@ github.com/hashicorp/go-bexpr v0.1.11 h1:6DqdA/KBjurGby9yTY0bmkathya0lfwF2SeuubC github.com/hashicorp/go-bexpr v0.1.11/go.mod h1:f03lAo0duBlDIUMGCuad8oLcgejw4m7U+N8T+6Kz1AE= github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/holiman/billy v0.0.0-20230718173358-1c7e68d277a7 h1:3JQNjnMRil1yD0IfZKHF9GxxWKDJGj8I0IqOUol//sw= github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao= github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA= -github.com/holiman/uint256 v1.2.1 h1:XRtyuda/zw2l+Bq/38n5XUoEF72aSOu/77Thd9pPp2o= -github.com/holiman/uint256 v1.2.1/go.mod h1:y4ga/t+u+Xwd7CpDgZESaRcWy0I7XMlTMA25ApIH5Jw= +github.com/holiman/uint256 v1.2.3 h1:K8UWO1HUJpRMXBxbmaY1Y8IAMZC/RsKB+ArEnnK4l5o= +github.com/holiman/uint256 v1.2.3/go.mod h1:SC8Ryt4n+UBbPbIBKaG9zbbDlp4jOru9xFZmPzLUTxw= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/huin/goupnp v1.0.3 h1:N8No57ls+MnjlB+JPiCVSOyy/ot7MJTqlo7rn+NYSqQ= +github.com/huin/goupnp v1.3.0 h1:UvLUlWDNpoUdYzb2TCn+MuTWtcjXKSza2n6CBdQ0xXc= github.com/hydrogen18/memlistener v0.0.0-20200120041712-dcc25e7acd91/go.mod h1:qEIFzExnS6016fRpRfxrExeVn2gbClQA99gQhnIcdhE= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/imkira/go-interpol v1.1.0/go.mod h1:z0h2/2T3XF8kyEPpRgJ3kmNv+C43p+I/CoI+jC3w2iA= @@ -195,6 +209,7 @@ github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/labstack/echo/v4 v4.5.0/go.mod h1:czIriw4a0C1dFun+ObrXp7ok03xON0N1awStJ6ArI7Y= github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= +github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= @@ -221,6 +236,9 @@ github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyua github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/pointerstructure v1.2.1 h1:ZhBBeX8tSlRpu/FFhXH4RC4OJzFlqsQhoHZAz4x7TIw= github.com/mitchellh/pointerstructure v1.2.1/go.mod h1:BRAsLI5zgXmw97Lf6s25bs8ohIXc3tViBH44KcwB2g4= +github.com/mmcloughlin/addchain v0.4.0 h1:SobOdjm2xLj1KkXN5/n0xTIWyZA2+s99UCY1iPfkHRY= +github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqkyU72HC5wJ4RlU= +github.com/mmcloughlin/profile v0.1.1/go.mod h1:IhHD7q1ooxgwTgjxQYkACGA77oFTDdFVejUS1/tS/qU= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= @@ -293,31 +311,27 @@ github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnIn github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= github.com/status-im/keycard-go v0.2.0 h1:QDLFswOQu1r5jsycloeQh3bVU8n/NatHHaZobtDnDzA= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= -github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/supranational/blst v0.3.11 h1:LyU6FolezeWAhvQk0k6O/d49jqgO52MSDDfYgbeoEm4= +github.com/supranational/blst v0.3.11/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a h1:1ur3QoCqvE5fl+nylMaIr9PVV1w343YRDtsy+Rwu7XI= github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a/go.mod h1:RRCYJbIwD5jmqPI9XoAFR0OcDxqUctll6zUj/+B4S48= -github.com/tklauser/go-sysconf v0.3.11 h1:89WgdJhk5SNwJfu+GKyYveZ4IaJ7xAkecBo+KdJV0CM= -github.com/tklauser/go-sysconf v0.3.11/go.mod h1:GqXfhXY3kiPa0nAXPDIQIWzJbMCB7AmcWpGR8lSZfqI= -github.com/tklauser/numcpus v0.6.0 h1:kebhY2Qt+3U6RNK7UqpYNA+tJ23IBEGKkB7JQBfDYms= -github.com/tklauser/numcpus v0.6.0/go.mod h1:FEZLMke0lhOUG6w2JadTzp0a+Nl8PF/GFkQ5UVIcaL4= +github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= +github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= +github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= +github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= github.com/tyler-smith/go-bip39 v1.1.0 h1:5eUemwrMargf3BSLRRCalXT93Ns6pQJIjYQN2nyfOP8= github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= -github.com/urfave/cli/v2 v2.23.7 h1:YHDQ46s3VghFHFf1DdF+Sh7H4RqhcM+t0TmZRJx4oJY= -github.com/urfave/cli/v2 v2.23.7/go.mod h1:GHupkWPMM0M/sj1a2b4wUrWBPzazNrIjouW6fmdJLxc= +github.com/urfave/cli/v2 v2.25.7 h1:VAzn5oq403l5pHjc4OhD54+XGO9cdKVL/7lDjF+iKUs= github.com/urfave/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/valyala/fasthttp v1.6.0/go.mod h1:FstJa9V+Pj9vQ7OJie2qMHdwemEDaDiSdBnvPM1Su9w= @@ -346,11 +360,11 @@ golang.org/x/crypto v0.0.0-20191227163750-53104e6ec876/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.4.0 h1:UVQgzMY87xqpKNgb+kDsll2Igd33HszWHFLmpaRMq/8= -golang.org/x/crypto v0.4.0/go.mod h1:3quD/ATkf6oY+rnes5c3ExXTbLc8mueNue5/DoinL80= +golang.org/x/crypto v0.12.0 h1:tFM/ta59kqch6LlvYnPa0yx5a83cL2nHflFhYKvv9Yk= +golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20230206171751-46f607a40771 h1:xP7rWLUr1e1n2xkK5YB4LI0hPEy3LJC6Wk+D4pGlOJg= -golang.org/x/exp v0.0.0-20230206171751-46f607a40771/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc= +golang.org/x/exp v0.0.0-20230810033253-352e893a4cad h1:g0bG7Z4uG+OgH2QDODnjp6ggkk1bJDsINcuWmJN1iJU= +golang.org/x/exp v0.0.0-20230810033253-352e893a4cad/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= @@ -359,6 +373,8 @@ golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzB golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.11.0 h1:bUO06HqtnRcc/7l71XBe4WcqTZ+3AH1J59zWDDwLKgU= +golang.org/x/mod v0.11.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -380,7 +396,7 @@ golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT golang.org/x/net v0.0.0-20211008194852-3b03d305991f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.7.0 h1:rJrUqqhjsgNp7KqAIc25s9pZnjU7TUcSY7HcVZjdn1g= +golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -390,7 +406,8 @@ golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= +golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= +golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -424,9 +441,9 @@ golang.org/x/sys v0.0.0-20220405052023-b1e9470b6e64/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU= -golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM= +golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -435,11 +452,10 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.7.0 h1:4BRB4x83lYWy72KwLD/qYDuTu7q9PjSagHvijDw7cLo= -golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc= +golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= -golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181221001348-537d06c36207/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -454,6 +470,8 @@ golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roY golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.9.1 h1:8WMNJAz3zrtPmnYC7ISf5dEn3MT0gY7jBJfw27yrrLo= +golang.org/x/tools v0.9.1/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -496,8 +514,7 @@ gopkg.in/go-playground/validator.v8 v8.18.2/go.mod h1:RX2a/7Ha8BgOhfk7j780h4/u/R gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1 h1:iiHuQZCNgYPmFQxd3BBN/Nc5+dAwzZuq5y40s20oQw0= gopkg.in/ini.v1 v1.51.1/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= -gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce h1:+JknDZhAj8YMt7GC73Ei8pv4MzjDUNPHgQWJdtMAaDU= -gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:5AcXVHNjg+BDxry382+8OKon8SEWiKktQR07RKPsv1c= +gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= @@ -512,3 +529,5 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +rsc.io/tmplfunc v0.0.3 h1:53XFQh69AfOa8Tw0Jm7t+GV7KZhOi6jzsCzTtKbMvzU= +rsc.io/tmplfunc v0.0.3/go.mod h1:AG3sTPzElb1Io3Yg4voV9AGZJuleGAwaVRxL9M49PhA= From 221e19df915daaf76200a13ac0692d72303d0598 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Tue, 19 Sep 2023 13:35:13 +0200 Subject: [PATCH 029/387] simulators/ethereum/rpc-compat: upgrade dependencies --- simulators/ethereum/rpc-compat/go.mod | 21 ++++++----- simulators/ethereum/rpc-compat/go.sum | 52 ++++++++++++++------------- 2 files changed, 40 insertions(+), 33 deletions(-) diff --git a/simulators/ethereum/rpc-compat/go.mod b/simulators/ethereum/rpc-compat/go.mod index 047468a76a..5ff677b770 100644 --- a/simulators/ethereum/rpc-compat/go.mod +++ b/simulators/ethereum/rpc-compat/go.mod @@ -3,29 +3,32 @@ module github.com/ethereum/hive/simulators/ethereum/rpc-compat go 1.18 require ( - github.com/ethereum/hive v0.0.0-20230313141339-8e3200bfc09e + github.com/ethereum/hive v0.0.0-20230919110229-d58aec4a3eb5 github.com/yudai/gojsondiff v1.0.0 ) require ( + github.com/Microsoft/go-winio v0.6.1 // indirect github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect github.com/deckarep/golang-set/v2 v2.1.0 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 // indirect - github.com/ethereum/go-ethereum v1.11.4 // indirect + github.com/ethereum/go-ethereum v1.13.1 // indirect github.com/go-ole/go-ole v1.2.6 // indirect github.com/go-stack/stack v1.8.1 // indirect - github.com/golang/snappy v0.0.4 // indirect + github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect github.com/gorilla/websocket v1.5.0 // indirect + github.com/holiman/uint256 v1.2.3 // indirect github.com/sergi/go-diff v1.2.0 // indirect github.com/shirou/gopsutil v3.21.11+incompatible // indirect - github.com/stretchr/testify v1.8.1 // indirect github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a // indirect - github.com/tklauser/go-sysconf v0.3.11 // indirect - github.com/tklauser/numcpus v0.6.0 // indirect + github.com/tklauser/go-sysconf v0.3.12 // indirect + github.com/tklauser/numcpus v0.6.1 // indirect github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82 // indirect github.com/yudai/pp v2.0.1+incompatible // indirect github.com/yusufpapurcu/wmi v1.2.2 // indirect - golang.org/x/crypto v0.4.0 // indirect - golang.org/x/sys v0.5.0 // indirect - gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce // indirect + golang.org/x/crypto v0.12.0 // indirect + golang.org/x/exp v0.0.0-20230810033253-352e893a4cad // indirect + golang.org/x/mod v0.11.0 // indirect + golang.org/x/sys v0.11.0 // indirect + golang.org/x/tools v0.9.1 // indirect ) diff --git a/simulators/ethereum/rpc-compat/go.sum b/simulators/ethereum/rpc-compat/go.sum index 8c441d29d3..db893f6416 100644 --- a/simulators/ethereum/rpc-compat/go.sum +++ b/simulators/ethereum/rpc-compat/go.sum @@ -1,3 +1,5 @@ +github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= +github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U= github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= @@ -12,10 +14,10 @@ github.com/deckarep/golang-set/v2 v2.1.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpO github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 h1:HbphB4TFFXpv7MNrT52FGrrgVXF1owhMVTHFZIlnvd4= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0/go.mod h1:DZGJHZMqrU4JJqFAWUS2UO1+lbSKsdiOoYi9Zzey7Fc= -github.com/ethereum/go-ethereum v1.11.4 h1:KG81SnUHXWk8LJB3mBcHg/E2yLvXoiPmRMCIRxgx3cE= -github.com/ethereum/go-ethereum v1.11.4/go.mod h1:it7x0DWnTDMfVFdXcU6Ti4KEFQynLHVRarcSlPr0HBo= -github.com/ethereum/hive v0.0.0-20230313141339-8e3200bfc09e h1:3g9cqRqpbZ92tSlGL4PfFoq435axKw6HiZ1Gz3fOkfk= -github.com/ethereum/hive v0.0.0-20230313141339-8e3200bfc09e/go.mod h1:PlpDuxHg6q1jU0K8Ouf+RXlHguignJ7k8Eyukc9RCPQ= +github.com/ethereum/go-ethereum v1.13.1 h1:UF2FaUKPIy5jeZk3X06ait3y2Q4wI+vJ1l7+UARp+60= +github.com/ethereum/go-ethereum v1.13.1/go.mod h1:xHQKzwkHSl0gnSjZK1mWa06XEdm9685AHqhRknOzqGQ= +github.com/ethereum/hive v0.0.0-20230919110229-d58aec4a3eb5 h1:22Z+XoI2hGtYR0AMzYr9IusfYM/chALq/6oJnejJQpk= +github.com/ethereum/hive v0.0.0-20230919110229-d58aec4a3eb5/go.mod h1:iKqu3dndnqdwSckyBGoZzeHhZz6X6XZws2TfZMdLdes= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= @@ -34,8 +36,9 @@ github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvq github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXiurYmW7fx4GZkL8feAMVq7nEjURHk= +github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= @@ -44,6 +47,8 @@ github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLe github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/holiman/uint256 v1.2.3 h1:K8UWO1HUJpRMXBxbmaY1Y8IAMZC/RsKB+ArEnnK4l5o= +github.com/holiman/uint256 v1.2.3/go.mod h1:SC8Ryt4n+UBbPbIBKaG9zbbDlp4jOru9xFZmPzLUTxw= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= @@ -72,21 +77,16 @@ github.com/sergi/go-diff v1.2.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNX github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI= github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= -github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a h1:1ur3QoCqvE5fl+nylMaIr9PVV1w343YRDtsy+Rwu7XI= github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a/go.mod h1:RRCYJbIwD5jmqPI9XoAFR0OcDxqUctll6zUj/+B4S48= -github.com/tklauser/go-sysconf v0.3.11 h1:89WgdJhk5SNwJfu+GKyYveZ4IaJ7xAkecBo+KdJV0CM= -github.com/tklauser/go-sysconf v0.3.11/go.mod h1:GqXfhXY3kiPa0nAXPDIQIWzJbMCB7AmcWpGR8lSZfqI= -github.com/tklauser/numcpus v0.6.0 h1:kebhY2Qt+3U6RNK7UqpYNA+tJ23IBEGKkB7JQBfDYms= -github.com/tklauser/numcpus v0.6.0/go.mod h1:FEZLMke0lhOUG6w2JadTzp0a+Nl8PF/GFkQ5UVIcaL4= +github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= +github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= +github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= +github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= github.com/yudai/gojsondiff v1.0.0 h1:27cbfqXLVEJ1o8I6v3y9lg8Ydm53EKqHXAOMxEGlCOA= github.com/yudai/gojsondiff v1.0.0/go.mod h1:AY32+k2cwILAkW1fbgxQ5mUmMiZFgLIV+FBNExI05xg= github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82 h1:BHyfKlQyqbsFN5p3IfnEUduWvb9is428/nNb5L3U01M= @@ -99,9 +99,13 @@ github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQ golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.4.0 h1:UVQgzMY87xqpKNgb+kDsll2Igd33HszWHFLmpaRMq/8= -golang.org/x/crypto v0.4.0/go.mod h1:3quD/ATkf6oY+rnes5c3ExXTbLc8mueNue5/DoinL80= +golang.org/x/crypto v0.12.0 h1:tFM/ta59kqch6LlvYnPa0yx5a83cL2nHflFhYKvv9Yk= +golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= +golang.org/x/exp v0.0.0-20230810033253-352e893a4cad h1:g0bG7Z4uG+OgH2QDODnjp6ggkk1bJDsINcuWmJN1iJU= +golang.org/x/exp v0.0.0-20230810033253-352e893a4cad/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.11.0 h1:bUO06HqtnRcc/7l71XBe4WcqTZ+3AH1J59zWDDwLKgU= +golang.org/x/mod v0.11.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -110,10 +114,11 @@ golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwY golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.7.0 h1:rJrUqqhjsgNp7KqAIc25s9pZnjU7TUcSY7HcVZjdn1g= +golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -131,19 +136,21 @@ golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU= -golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM= +golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.7.0 h1:4BRB4x83lYWy72KwLD/qYDuTu7q9PjSagHvijDw7cLo= +golang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.9.1 h1:8WMNJAz3zrtPmnYC7ISf5dEn3MT0gY7jBJfw27yrrLo= +golang.org/x/tools v0.9.1/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -161,8 +168,6 @@ gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8 gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1 h1:iiHuQZCNgYPmFQxd3BBN/Nc5+dAwzZuq5y40s20oQw0= -gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce h1:+JknDZhAj8YMt7GC73Ei8pv4MzjDUNPHgQWJdtMAaDU= -gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:5AcXVHNjg+BDxry382+8OKon8SEWiKktQR07RKPsv1c= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= @@ -170,6 +175,5 @@ gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= From ffe428c8daa2649133c7ad8f51b0ea4ce8431d84 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Tue, 19 Sep 2023 13:35:31 +0200 Subject: [PATCH 030/387] simulators/ethereum/pyspec: upgrade dependencies --- simulators/ethereum/pyspec/go.mod | 18 ++++++++-------- simulators/ethereum/pyspec/go.sum | 34 +++++++++++++++---------------- 2 files changed, 26 insertions(+), 26 deletions(-) diff --git a/simulators/ethereum/pyspec/go.mod b/simulators/ethereum/pyspec/go.mod index d1f139f865..c4c7fd8a48 100644 --- a/simulators/ethereum/pyspec/go.mod +++ b/simulators/ethereum/pyspec/go.mod @@ -3,9 +3,9 @@ module github.com/ethereum/hive/simulators/ethereum/pyspec go 1.20 require ( - github.com/ethereum/go-ethereum v1.12.1-0.20230728070838-8f2ae29b8f77 - github.com/ethereum/hive v0.0.0-20230616141546-33068992107d - github.com/ethereum/hive/simulators/ethereum/engine v0.0.0-20230616141546-33068992107d + github.com/ethereum/go-ethereum v1.13.1 + github.com/ethereum/hive v0.0.0-20230919110229-d58aec4a3eb5 + github.com/ethereum/hive/simulators/ethereum/engine v0.0.0-20230919054339-322945164a97 ) require ( @@ -18,7 +18,7 @@ require ( github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/cockroachdb/errors v1.9.1 // indirect github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect - github.com/cockroachdb/pebble v0.0.0-20230821143352-55b44ac08de8 // indirect + github.com/cockroachdb/pebble v0.0.0-20230906160148-46873a6a7a06 // indirect github.com/cockroachdb/redact v1.1.3 // indirect github.com/consensys/bavard v0.1.13 // indirect github.com/consensys/gnark-crypto v0.11.0 // indirect @@ -54,15 +54,15 @@ require ( github.com/shirou/gopsutil v3.21.11+incompatible // indirect github.com/supranational/blst v0.3.11 // indirect github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a // indirect - github.com/tklauser/go-sysconf v0.3.11 // indirect - github.com/tklauser/numcpus v0.6.0 // indirect + github.com/tklauser/go-sysconf v0.3.12 // indirect + github.com/tklauser/numcpus v0.6.1 // indirect github.com/yusufpapurcu/wmi v1.2.2 // indirect - golang.org/x/crypto v0.9.0 // indirect + golang.org/x/crypto v0.12.0 // indirect golang.org/x/exp v0.0.0-20230810033253-352e893a4cad // indirect golang.org/x/mod v0.11.0 // indirect golang.org/x/sync v0.3.0 // indirect - golang.org/x/sys v0.9.0 // indirect - golang.org/x/text v0.9.0 // indirect + golang.org/x/sys v0.11.0 // indirect + golang.org/x/text v0.12.0 // indirect golang.org/x/tools v0.9.1 // indirect google.golang.org/protobuf v1.28.1 // indirect rsc.io/tmplfunc v0.0.3 // indirect diff --git a/simulators/ethereum/pyspec/go.sum b/simulators/ethereum/pyspec/go.sum index 51fff102ea..c82c613b4b 100644 --- a/simulators/ethereum/pyspec/go.sum +++ b/simulators/ethereum/pyspec/go.sum @@ -39,8 +39,8 @@ github.com/cockroachdb/errors v1.9.1/go.mod h1:2sxOtL2WIc096WSZqZ5h8fa17rdDq9HZO github.com/cockroachdb/logtags v0.0.0-20211118104740-dabe8e521a4f/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= -github.com/cockroachdb/pebble v0.0.0-20230821143352-55b44ac08de8 h1:2fNOyQqrHSjFdqnKqSLj9W7eGTcqKujJPA8vAuT1zN8= -github.com/cockroachdb/pebble v0.0.0-20230821143352-55b44ac08de8/go.mod h1:bynZ3gvVyhlvjLI7PT6dmZ7g76xzJ7HpxfjgkzCGz6s= +github.com/cockroachdb/pebble v0.0.0-20230906160148-46873a6a7a06 h1:T+Np/xtzIjYM/P5NAw0e2Rf1FGvzDau1h54MKvx8G7w= +github.com/cockroachdb/pebble v0.0.0-20230906160148-46873a6a7a06/go.mod h1:bynZ3gvVyhlvjLI7PT6dmZ7g76xzJ7HpxfjgkzCGz6s= github.com/cockroachdb/redact v1.1.3 h1:AKZds10rFSIj7qADf0g46UixK8NNLwWTNdCIGS5wfSQ= github.com/cockroachdb/redact v1.1.3/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0/go.mod h1:4Zcjuz89kmFXt9morQgcfYZAYZ5n8WHjt81YYWIwtTM= @@ -76,10 +76,10 @@ github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7 github.com/etcd-io/bbolt v1.3.3/go.mod h1:ZF2nL25h33cCyBtcyWeZ2/I3HQOfTP+0PIEvHjkjCrw= github.com/ethereum/c-kzg-4844 v0.3.1 h1:sR65+68+WdnMKxseNWxSJuAv2tsUrihTpVBTfM/U5Zg= github.com/ethereum/c-kzg-4844 v0.3.1/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= -github.com/ethereum/hive v0.0.0-20230616141546-33068992107d h1:LHq8wfx+J+YqdTJ6e6dgIoqiXG4WIysuhSZ1jig1LIk= -github.com/ethereum/hive v0.0.0-20230616141546-33068992107d/go.mod h1:2RR3SFHSGGSh7UTvIsw4fDDqjkkr7HrWPyDaMoe6Ehw= -github.com/ethereum/hive/simulators/ethereum/engine v0.0.0-20230616141546-33068992107d h1:akwfB80JUROiS8dqEcf/Umgewizy68P/P2YQceEAhzw= -github.com/ethereum/hive/simulators/ethereum/engine v0.0.0-20230616141546-33068992107d/go.mod h1:egwoyl8No2k5UBtqXj5iS+7TZXVCtLDLfBlyhjkORaQ= +github.com/ethereum/hive v0.0.0-20230919110229-d58aec4a3eb5 h1:22Z+XoI2hGtYR0AMzYr9IusfYM/chALq/6oJnejJQpk= +github.com/ethereum/hive v0.0.0-20230919110229-d58aec4a3eb5/go.mod h1:iKqu3dndnqdwSckyBGoZzeHhZz6X6XZws2TfZMdLdes= +github.com/ethereum/hive/simulators/ethereum/engine v0.0.0-20230919054339-322945164a97 h1:A1bYQxUbl4ZM6q5E8RcDYGm/UIxO5u03ypN8mxX9oKY= +github.com/ethereum/hive/simulators/ethereum/engine v0.0.0-20230919054339-322945164a97/go.mod h1:zCFJyLJJjLDT5/R9l8Rqrwt9i9irgg94d2n4kpehTno= github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072/go.mod h1:duJ4Jxv5lDcvg4QuQr0oowTf7dz4/CR8NtyCooz9HL8= github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= github.com/fjl/memsize v0.0.1 h1:+zhkb+dhUgx0/e+M8sF0QqiouvMQUiKR+QYvdxIOKcQ= @@ -313,10 +313,10 @@ github.com/supranational/blst v0.3.11 h1:LyU6FolezeWAhvQk0k6O/d49jqgO52MSDDfYgbe github.com/supranational/blst v0.3.11/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a h1:1ur3QoCqvE5fl+nylMaIr9PVV1w343YRDtsy+Rwu7XI= github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a/go.mod h1:RRCYJbIwD5jmqPI9XoAFR0OcDxqUctll6zUj/+B4S48= -github.com/tklauser/go-sysconf v0.3.11 h1:89WgdJhk5SNwJfu+GKyYveZ4IaJ7xAkecBo+KdJV0CM= -github.com/tklauser/go-sysconf v0.3.11/go.mod h1:GqXfhXY3kiPa0nAXPDIQIWzJbMCB7AmcWpGR8lSZfqI= -github.com/tklauser/numcpus v0.6.0 h1:kebhY2Qt+3U6RNK7UqpYNA+tJ23IBEGKkB7JQBfDYms= -github.com/tklauser/numcpus v0.6.0/go.mod h1:FEZLMke0lhOUG6w2JadTzp0a+Nl8PF/GFkQ5UVIcaL4= +github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= +github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= +github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= +github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= github.com/tyler-smith/go-bip39 v1.1.0 h1:5eUemwrMargf3BSLRRCalXT93Ns6pQJIjYQN2nyfOP8= github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= @@ -351,8 +351,8 @@ golang.org/x/crypto v0.0.0-20191227163750-53104e6ec876/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.9.0 h1:LF6fAI+IutBocDJ2OT0Q1g8plpYljMZ4+lty+dsqw3g= -golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= +golang.org/x/crypto v0.12.0 h1:tFM/ta59kqch6LlvYnPa0yx5a83cL2nHflFhYKvv9Yk= +golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20230810033253-352e893a4cad h1:g0bG7Z4uG+OgH2QDODnjp6ggkk1bJDsINcuWmJN1iJU= golang.org/x/exp v0.0.0-20230810033253-352e893a4cad/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc= @@ -431,9 +431,9 @@ golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220405052023-b1e9470b6e64/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.9.0 h1:KS/R3tvhPqvJvwcKfnBHJwwthS11LRhmM5D59eEXa0s= -golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM= +golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -442,8 +442,8 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE= -golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc= +golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= From 225f76bc7703800165e7704a83ae37172cd8e66c Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Tue, 19 Sep 2023 13:35:48 +0200 Subject: [PATCH 031/387] simulators/ethereum/graphql: upgrade dependencies --- simulators/ethereum/graphql/go.mod | 21 ++++++------ simulators/ethereum/graphql/go.sum | 52 ++++++++++++++++-------------- 2 files changed, 40 insertions(+), 33 deletions(-) diff --git a/simulators/ethereum/graphql/go.mod b/simulators/ethereum/graphql/go.mod index 908b51174d..68b2773a8f 100644 --- a/simulators/ethereum/graphql/go.mod +++ b/simulators/ethereum/graphql/go.mod @@ -2,24 +2,27 @@ module github.com/ethereum/hive/simulators/ethereum/graphql go 1.18 -require github.com/ethereum/hive v0.0.0-20230313141339-8e3200bfc09e +require github.com/ethereum/hive v0.0.0-20230919110229-d58aec4a3eb5 require ( + github.com/Microsoft/go-winio v0.6.1 // indirect github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect github.com/deckarep/golang-set/v2 v2.1.0 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 // indirect - github.com/ethereum/go-ethereum v1.11.4 // indirect + github.com/ethereum/go-ethereum v1.13.1 // indirect github.com/go-ole/go-ole v1.2.6 // indirect github.com/go-stack/stack v1.8.1 // indirect - github.com/golang/snappy v0.0.4 // indirect + github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect github.com/gorilla/websocket v1.5.0 // indirect + github.com/holiman/uint256 v1.2.3 // indirect github.com/shirou/gopsutil v3.21.11+incompatible // indirect - github.com/stretchr/testify v1.8.1 // indirect github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a // indirect - github.com/tklauser/go-sysconf v0.3.11 // indirect - github.com/tklauser/numcpus v0.6.0 // indirect + github.com/tklauser/go-sysconf v0.3.12 // indirect + github.com/tklauser/numcpus v0.6.1 // indirect github.com/yusufpapurcu/wmi v1.2.2 // indirect - golang.org/x/crypto v0.4.0 // indirect - golang.org/x/sys v0.5.0 // indirect - gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce // indirect + golang.org/x/crypto v0.12.0 // indirect + golang.org/x/exp v0.0.0-20230810033253-352e893a4cad // indirect + golang.org/x/mod v0.11.0 // indirect + golang.org/x/sys v0.11.0 // indirect + golang.org/x/tools v0.9.1 // indirect ) diff --git a/simulators/ethereum/graphql/go.sum b/simulators/ethereum/graphql/go.sum index 2b80706cb8..385d52e663 100644 --- a/simulators/ethereum/graphql/go.sum +++ b/simulators/ethereum/graphql/go.sum @@ -1,3 +1,5 @@ +github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= +github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U= github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= @@ -12,10 +14,10 @@ github.com/deckarep/golang-set/v2 v2.1.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpO github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 h1:HbphB4TFFXpv7MNrT52FGrrgVXF1owhMVTHFZIlnvd4= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0/go.mod h1:DZGJHZMqrU4JJqFAWUS2UO1+lbSKsdiOoYi9Zzey7Fc= -github.com/ethereum/go-ethereum v1.11.4 h1:KG81SnUHXWk8LJB3mBcHg/E2yLvXoiPmRMCIRxgx3cE= -github.com/ethereum/go-ethereum v1.11.4/go.mod h1:it7x0DWnTDMfVFdXcU6Ti4KEFQynLHVRarcSlPr0HBo= -github.com/ethereum/hive v0.0.0-20230313141339-8e3200bfc09e h1:3g9cqRqpbZ92tSlGL4PfFoq435axKw6HiZ1Gz3fOkfk= -github.com/ethereum/hive v0.0.0-20230313141339-8e3200bfc09e/go.mod h1:PlpDuxHg6q1jU0K8Ouf+RXlHguignJ7k8Eyukc9RCPQ= +github.com/ethereum/go-ethereum v1.13.1 h1:UF2FaUKPIy5jeZk3X06ait3y2Q4wI+vJ1l7+UARp+60= +github.com/ethereum/go-ethereum v1.13.1/go.mod h1:xHQKzwkHSl0gnSjZK1mWa06XEdm9685AHqhRknOzqGQ= +github.com/ethereum/hive v0.0.0-20230919110229-d58aec4a3eb5 h1:22Z+XoI2hGtYR0AMzYr9IusfYM/chALq/6oJnejJQpk= +github.com/ethereum/hive v0.0.0-20230919110229-d58aec4a3eb5/go.mod h1:iKqu3dndnqdwSckyBGoZzeHhZz6X6XZws2TfZMdLdes= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= @@ -34,8 +36,9 @@ github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvq github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXiurYmW7fx4GZkL8feAMVq7nEjURHk= +github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= @@ -44,6 +47,8 @@ github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLe github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/holiman/uint256 v1.2.3 h1:K8UWO1HUJpRMXBxbmaY1Y8IAMZC/RsKB+ArEnnK4l5o= +github.com/holiman/uint256 v1.2.3/go.mod h1:SC8Ryt4n+UBbPbIBKaG9zbbDlp4jOru9xFZmPzLUTxw= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= @@ -67,29 +72,28 @@ github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZN github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI= github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= -github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a h1:1ur3QoCqvE5fl+nylMaIr9PVV1w343YRDtsy+Rwu7XI= github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a/go.mod h1:RRCYJbIwD5jmqPI9XoAFR0OcDxqUctll6zUj/+B4S48= -github.com/tklauser/go-sysconf v0.3.11 h1:89WgdJhk5SNwJfu+GKyYveZ4IaJ7xAkecBo+KdJV0CM= -github.com/tklauser/go-sysconf v0.3.11/go.mod h1:GqXfhXY3kiPa0nAXPDIQIWzJbMCB7AmcWpGR8lSZfqI= -github.com/tklauser/numcpus v0.6.0 h1:kebhY2Qt+3U6RNK7UqpYNA+tJ23IBEGKkB7JQBfDYms= -github.com/tklauser/numcpus v0.6.0/go.mod h1:FEZLMke0lhOUG6w2JadTzp0a+Nl8PF/GFkQ5UVIcaL4= +github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= +github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= +github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= +github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yusufpapurcu/wmi v1.2.2 h1:KBNDSne4vP5mbSWnJbO+51IMOXJB67QiYCSBrubbPRg= github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.4.0 h1:UVQgzMY87xqpKNgb+kDsll2Igd33HszWHFLmpaRMq/8= -golang.org/x/crypto v0.4.0/go.mod h1:3quD/ATkf6oY+rnes5c3ExXTbLc8mueNue5/DoinL80= +golang.org/x/crypto v0.12.0 h1:tFM/ta59kqch6LlvYnPa0yx5a83cL2nHflFhYKvv9Yk= +golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= +golang.org/x/exp v0.0.0-20230810033253-352e893a4cad h1:g0bG7Z4uG+OgH2QDODnjp6ggkk1bJDsINcuWmJN1iJU= +golang.org/x/exp v0.0.0-20230810033253-352e893a4cad/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.11.0 h1:bUO06HqtnRcc/7l71XBe4WcqTZ+3AH1J59zWDDwLKgU= +golang.org/x/mod v0.11.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -98,10 +102,11 @@ golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwY golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.7.0 h1:rJrUqqhjsgNp7KqAIc25s9pZnjU7TUcSY7HcVZjdn1g= +golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -119,19 +124,21 @@ golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU= -golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM= +golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.7.0 h1:4BRB4x83lYWy72KwLD/qYDuTu7q9PjSagHvijDw7cLo= +golang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.9.1 h1:8WMNJAz3zrtPmnYC7ISf5dEn3MT0gY7jBJfw27yrrLo= +golang.org/x/tools v0.9.1/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -148,8 +155,6 @@ google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQ gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1 h1:iiHuQZCNgYPmFQxd3BBN/Nc5+dAwzZuq5y40s20oQw0= -gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce h1:+JknDZhAj8YMt7GC73Ei8pv4MzjDUNPHgQWJdtMAaDU= -gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:5AcXVHNjg+BDxry382+8OKon8SEWiKktQR07RKPsv1c= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= @@ -157,6 +162,5 @@ gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= From 546a28f86aa121601d80c6db27d44b2a9567c9b9 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Tue, 19 Sep 2023 13:37:34 +0200 Subject: [PATCH 032/387] simulators/ethereum/consensus: upgrade dependencies --- simulators/ethereum/consensus/go.mod | 36 +++++++----- simulators/ethereum/consensus/go.sum | 85 +++++++++++++++++----------- 2 files changed, 75 insertions(+), 46 deletions(-) diff --git a/simulators/ethereum/consensus/go.mod b/simulators/ethereum/consensus/go.mod index dd366b83f4..f3322fb1b3 100644 --- a/simulators/ethereum/consensus/go.mod +++ b/simulators/ethereum/consensus/go.mod @@ -3,37 +3,44 @@ module github.com/ethereum/hive/simulators/ethereum/consensus go 1.18 require ( - github.com/ethereum/go-ethereum v1.11.4 - github.com/ethereum/hive v0.0.0-20230313141339-8e3200bfc09e + github.com/ethereum/go-ethereum v1.13.1 + github.com/ethereum/hive v0.0.0-20230919110229-d58aec4a3eb5 ) require ( github.com/DataDog/zstd v1.5.2 // indirect + github.com/Microsoft/go-winio v0.6.1 // indirect github.com/VictoriaMetrics/fastcache v1.12.0 // indirect github.com/beorn7/perks v1.0.1 // indirect + github.com/bits-and-blooms/bitset v1.5.0 // indirect github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/cockroachdb/errors v1.9.1 // indirect github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect - github.com/cockroachdb/pebble v0.0.0-20230209160836-829675f94811 // indirect + github.com/cockroachdb/pebble v0.0.0-20230906160148-46873a6a7a06 // indirect github.com/cockroachdb/redact v1.1.3 // indirect + github.com/consensys/bavard v0.1.13 // indirect + github.com/consensys/gnark-crypto v0.10.0 // indirect + github.com/crate-crypto/go-kzg-4844 v0.3.0 // indirect github.com/deckarep/golang-set/v2 v2.1.0 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 // indirect + github.com/ethereum/c-kzg-4844 v0.3.1 // indirect github.com/getsentry/sentry-go v0.18.0 // indirect github.com/go-ole/go-ole v1.2.6 // indirect github.com/go-stack/stack v1.8.1 // indirect github.com/gofrs/flock v0.8.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/protobuf v1.5.2 // indirect - github.com/golang/snappy v0.0.4 // indirect + github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect github.com/gorilla/websocket v1.5.0 // indirect github.com/holiman/bloomfilter/v2 v2.0.3 // indirect - github.com/holiman/uint256 v1.2.1 // indirect + github.com/holiman/uint256 v1.2.3 // indirect github.com/klauspost/compress v1.15.15 // indirect github.com/kr/pretty v0.3.1 // indirect github.com/kr/text v0.2.0 // indirect github.com/mattn/go-runewidth v0.0.14 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect + github.com/mmcloughlin/addchain v0.4.0 // indirect github.com/olekukonko/tablewriter v0.0.5 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/prometheus/client_golang v1.14.0 // indirect @@ -43,15 +50,18 @@ require ( github.com/rivo/uniseg v0.4.3 // indirect github.com/rogpeppe/go-internal v1.9.0 // indirect github.com/shirou/gopsutil v3.21.11+incompatible // indirect - github.com/stretchr/testify v1.8.1 // indirect + github.com/supranational/blst v0.3.11 // indirect github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a // indirect - github.com/tklauser/go-sysconf v0.3.11 // indirect - github.com/tklauser/numcpus v0.6.0 // indirect + github.com/tklauser/go-sysconf v0.3.12 // indirect + github.com/tklauser/numcpus v0.6.1 // indirect github.com/yusufpapurcu/wmi v1.2.2 // indirect - golang.org/x/crypto v0.4.0 // indirect - golang.org/x/exp v0.0.0-20230206171751-46f607a40771 // indirect - golang.org/x/sys v0.5.0 // indirect - golang.org/x/text v0.7.0 // indirect + golang.org/x/crypto v0.12.0 // indirect + golang.org/x/exp v0.0.0-20230810033253-352e893a4cad // indirect + golang.org/x/mod v0.11.0 // indirect + golang.org/x/sync v0.3.0 // indirect + golang.org/x/sys v0.11.0 // indirect + golang.org/x/text v0.12.0 // indirect + golang.org/x/tools v0.9.1 // indirect google.golang.org/protobuf v1.28.1 // indirect - gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce // indirect + rsc.io/tmplfunc v0.0.3 // indirect ) diff --git a/simulators/ethereum/consensus/go.sum b/simulators/ethereum/consensus/go.sum index ff68e73df1..0c4c27122c 100644 --- a/simulators/ethereum/consensus/go.sum +++ b/simulators/ethereum/consensus/go.sum @@ -6,6 +6,8 @@ github.com/CloudyKit/jet/v3 v3.0.0/go.mod h1:HKQPgSJmdK8hdoAbKUUWajkHyHo4RaU5rMd github.com/DataDog/zstd v1.5.2 h1:vUG4lAyuPCXO0TLbXvPv7EB7cNK1QV/luu55UHLrrn8= github.com/DataDog/zstd v1.5.2/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= github.com/Joker/hpp v1.0.0/go.mod h1:8x5n+M1Hp5hC0g8okX3sR3vFQwynaX/UgSOM9MeBKzY= +github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= +github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= github.com/Shopify/goreferrer v0.0.0-20181106222321-ec9c9a553398/go.mod h1:a1uqRtAwp2Xwc6WNPJEufxJ7fx3npB4UV/JOLmbu5I0= github.com/VictoriaMetrics/fastcache v1.12.0 h1:vnVi/y9yKDcD9akmc4NqAoqgQhJrOwUF+j9LTgn4QDE= github.com/VictoriaMetrics/fastcache v1.12.0/go.mod h1:tjiYeEfYXCqacuvYw/7UoDIeJaNxq6132xHICNP77w8= @@ -16,6 +18,8 @@ github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5 github.com/aymerick/raymond v2.0.3-0.20180322193309-b565731e1464+incompatible/go.mod h1:osfaiScAUVup+UC9Nfq76eWqDhXlp+4UYaA8uhTBO6g= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/bits-and-blooms/bitset v1.5.0 h1:NpE8frKRLGHIcEzkR+gZhiioW1+WbYV6fKwD6ZIpQT8= +github.com/bits-and-blooms/bitset v1.5.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U= github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= @@ -28,22 +32,28 @@ github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5P github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cockroachdb/datadriven v1.0.2 h1:H9MtNqVoVhvd9nCBwOyDjUEdZCREqbIdCJD93PBm/jA= github.com/cockroachdb/datadriven v1.0.2/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= +github.com/cockroachdb/datadriven v1.0.3-0.20230801171734-e384cf455877 h1:1MLK4YpFtIEo3ZtMA5C795Wtv5VuUnrXX7mQG+aHg6o= github.com/cockroachdb/errors v1.9.1 h1:yFVvsI0VxmRShfawbt/laCIDy/mtTqqnvoNgiy5bEV8= github.com/cockroachdb/errors v1.9.1/go.mod h1:2sxOtL2WIc096WSZqZ5h8fa17rdDq9HZOZLBCor4mBk= github.com/cockroachdb/logtags v0.0.0-20211118104740-dabe8e521a4f/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= -github.com/cockroachdb/pebble v0.0.0-20230209160836-829675f94811 h1:ytcWPaNPhNoGMWEhDvS3zToKcDpRsLuRolQJBVGdozk= -github.com/cockroachdb/pebble v0.0.0-20230209160836-829675f94811/go.mod h1:Nb5lgvnQ2+oGlE/EyZy4+2/CxRh9KfvCXnag1vtpxVM= +github.com/cockroachdb/pebble v0.0.0-20230906160148-46873a6a7a06 h1:T+Np/xtzIjYM/P5NAw0e2Rf1FGvzDau1h54MKvx8G7w= +github.com/cockroachdb/pebble v0.0.0-20230906160148-46873a6a7a06/go.mod h1:bynZ3gvVyhlvjLI7PT6dmZ7g76xzJ7HpxfjgkzCGz6s= github.com/cockroachdb/redact v1.1.3 h1:AKZds10rFSIj7qADf0g46UixK8NNLwWTNdCIGS5wfSQ= github.com/cockroachdb/redact v1.1.3/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0/go.mod h1:4Zcjuz89kmFXt9morQgcfYZAYZ5n8WHjt81YYWIwtTM= +github.com/consensys/bavard v0.1.13 h1:oLhMLOFGTLdlda/kma4VOJazblc7IM5y5QPd2A/YjhQ= +github.com/consensys/bavard v0.1.13/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI= +github.com/consensys/gnark-crypto v0.10.0 h1:zRh22SR7o4K35SoNqouS9J/TKHTyU2QWaj5ldehyXtA= +github.com/consensys/gnark-crypto v0.10.0/go.mod h1:Iq/P3HHl0ElSjsg2E1gsMwhAyxnxoKK5nVyZKd+/KhU= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= +github.com/crate-crypto/go-kzg-4844 v0.3.0 h1:UBlWE0CgyFqqzTI+IFyCzA7A3Zw4iip6uzRv5NIXG0A= +github.com/crate-crypto/go-kzg-4844 v0.3.0/go.mod h1:SBP7ikXEgDnUPONgm33HtuDZEDtWa3L4QtN1ocJSEQ4= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= @@ -56,17 +66,18 @@ github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0/go.mod h1:DZGJHZMqrU4JJqFAWUS2U github.com/dgraph-io/badger v1.6.0/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6psNgSztDR4= github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/edsrzf/mmap-go v1.1.0 h1:6EUwBLQ/Mcr1EYLE4Tn1VdW1A4ckqCQWZBw8Hr0kjpQ= github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385/go.mod h1:0vRUJqYpeSZifjYj7uP3BG/gKcuzL9xWVV/Y+cK33KM= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/etcd-io/bbolt v1.3.3/go.mod h1:ZF2nL25h33cCyBtcyWeZ2/I3HQOfTP+0PIEvHjkjCrw= -github.com/ethereum/go-ethereum v1.11.4 h1:KG81SnUHXWk8LJB3mBcHg/E2yLvXoiPmRMCIRxgx3cE= -github.com/ethereum/go-ethereum v1.11.4/go.mod h1:it7x0DWnTDMfVFdXcU6Ti4KEFQynLHVRarcSlPr0HBo= -github.com/ethereum/hive v0.0.0-20230313141339-8e3200bfc09e h1:3g9cqRqpbZ92tSlGL4PfFoq435axKw6HiZ1Gz3fOkfk= -github.com/ethereum/hive v0.0.0-20230313141339-8e3200bfc09e/go.mod h1:PlpDuxHg6q1jU0K8Ouf+RXlHguignJ7k8Eyukc9RCPQ= +github.com/ethereum/c-kzg-4844 v0.3.1 h1:sR65+68+WdnMKxseNWxSJuAv2tsUrihTpVBTfM/U5Zg= +github.com/ethereum/c-kzg-4844 v0.3.1/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= +github.com/ethereum/go-ethereum v1.13.1 h1:UF2FaUKPIy5jeZk3X06ait3y2Q4wI+vJ1l7+UARp+60= +github.com/ethereum/go-ethereum v1.13.1/go.mod h1:xHQKzwkHSl0gnSjZK1mWa06XEdm9685AHqhRknOzqGQ= +github.com/ethereum/hive v0.0.0-20230919110229-d58aec4a3eb5 h1:22Z+XoI2hGtYR0AMzYr9IusfYM/chALq/6oJnejJQpk= +github.com/ethereum/hive v0.0.0-20230919110229-d58aec4a3eb5/go.mod h1:iKqu3dndnqdwSckyBGoZzeHhZz6X6XZws2TfZMdLdes= github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072/go.mod h1:duJ4Jxv5lDcvg4QuQr0oowTf7dz4/CR8NtyCooz9HL8= github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= @@ -116,8 +127,9 @@ github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXiurYmW7fx4GZkL8feAMVq7nEjURHk= +github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/gomodule/redigo v1.7.1-0.20190724094224-574c33c3df38/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= @@ -129,6 +141,7 @@ github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= @@ -139,8 +152,8 @@ github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09 github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao= github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA= -github.com/holiman/uint256 v1.2.1 h1:XRtyuda/zw2l+Bq/38n5XUoEF72aSOu/77Thd9pPp2o= -github.com/holiman/uint256 v1.2.1/go.mod h1:y4ga/t+u+Xwd7CpDgZESaRcWy0I7XMlTMA25ApIH5Jw= +github.com/holiman/uint256 v1.2.3 h1:K8UWO1HUJpRMXBxbmaY1Y8IAMZC/RsKB+ArEnnK4l5o= +github.com/holiman/uint256 v1.2.3/go.mod h1:SC8Ryt4n+UBbPbIBKaG9zbbDlp4jOru9xFZmPzLUTxw= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/hydrogen18/memlistener v0.0.0-20200120041712-dcc25e7acd91/go.mod h1:qEIFzExnS6016fRpRfxrExeVn2gbClQA99gQhnIcdhE= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= @@ -178,6 +191,7 @@ github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/labstack/echo/v4 v4.5.0/go.mod h1:czIriw4a0C1dFun+ObrXp7ok03xON0N1awStJ6ArI7Y= github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= +github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= @@ -199,6 +213,9 @@ github.com/mediocregopher/radix/v3 v3.4.2/go.mod h1:8FL3F6UQRXHXIBSPUs5h0RybMF8i github.com/microcosm-cc/bluemonday v1.0.2/go.mod h1:iVP4YcDBq+n/5fb23BhYFvIMq/leAFZyRl6bYmGDlGc= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mmcloughlin/addchain v0.4.0 h1:SobOdjm2xLj1KkXN5/n0xTIWyZA2+s99UCY1iPfkHRY= +github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqkyU72HC5wJ4RlU= +github.com/mmcloughlin/profile v0.1.1/go.mod h1:IhHD7q1ooxgwTgjxQYkACGA77oFTDdFVejUS1/tS/qU= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= @@ -266,24 +283,21 @@ github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb6 github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= -github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/supranational/blst v0.3.11 h1:LyU6FolezeWAhvQk0k6O/d49jqgO52MSDDfYgbeoEm4= +github.com/supranational/blst v0.3.11/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a h1:1ur3QoCqvE5fl+nylMaIr9PVV1w343YRDtsy+Rwu7XI= github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a/go.mod h1:RRCYJbIwD5jmqPI9XoAFR0OcDxqUctll6zUj/+B4S48= -github.com/tklauser/go-sysconf v0.3.11 h1:89WgdJhk5SNwJfu+GKyYveZ4IaJ7xAkecBo+KdJV0CM= -github.com/tklauser/go-sysconf v0.3.11/go.mod h1:GqXfhXY3kiPa0nAXPDIQIWzJbMCB7AmcWpGR8lSZfqI= -github.com/tklauser/numcpus v0.6.0 h1:kebhY2Qt+3U6RNK7UqpYNA+tJ23IBEGKkB7JQBfDYms= -github.com/tklauser/numcpus v0.6.0/go.mod h1:FEZLMke0lhOUG6w2JadTzp0a+Nl8PF/GFkQ5UVIcaL4= +github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= +github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= +github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= +github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= @@ -315,11 +329,11 @@ golang.org/x/crypto v0.0.0-20191227163750-53104e6ec876/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.4.0 h1:UVQgzMY87xqpKNgb+kDsll2Igd33HszWHFLmpaRMq/8= -golang.org/x/crypto v0.4.0/go.mod h1:3quD/ATkf6oY+rnes5c3ExXTbLc8mueNue5/DoinL80= +golang.org/x/crypto v0.12.0 h1:tFM/ta59kqch6LlvYnPa0yx5a83cL2nHflFhYKvv9Yk= +golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20230206171751-46f607a40771 h1:xP7rWLUr1e1n2xkK5YB4LI0hPEy3LJC6Wk+D4pGlOJg= -golang.org/x/exp v0.0.0-20230206171751-46f607a40771/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc= +golang.org/x/exp v0.0.0-20230810033253-352e893a4cad h1:g0bG7Z4uG+OgH2QDODnjp6ggkk1bJDsINcuWmJN1iJU= +golang.org/x/exp v0.0.0-20230810033253-352e893a4cad/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= @@ -328,6 +342,8 @@ golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzB golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.11.0 h1:bUO06HqtnRcc/7l71XBe4WcqTZ+3AH1J59zWDDwLKgU= +golang.org/x/mod v0.11.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -349,7 +365,7 @@ golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT golang.org/x/net v0.0.0-20211008194852-3b03d305991f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.7.0 h1:rJrUqqhjsgNp7KqAIc25s9pZnjU7TUcSY7HcVZjdn1g= +golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -359,7 +375,8 @@ golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= +golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= +golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -392,9 +409,9 @@ golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220405052023-b1e9470b6e64/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU= -golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM= +golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -403,8 +420,8 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.7.0 h1:4BRB4x83lYWy72KwLD/qYDuTu7q9PjSagHvijDw7cLo= -golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc= +golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181221001348-537d06c36207/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -420,6 +437,8 @@ golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roY golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.9.1 h1:8WMNJAz3zrtPmnYC7ISf5dEn3MT0gY7jBJfw27yrrLo= +golang.org/x/tools v0.9.1/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -462,8 +481,6 @@ gopkg.in/go-playground/validator.v8 v8.18.2/go.mod h1:RX2a/7Ha8BgOhfk7j780h4/u/R gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1 h1:iiHuQZCNgYPmFQxd3BBN/Nc5+dAwzZuq5y40s20oQw0= gopkg.in/ini.v1 v1.51.1/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= -gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce h1:+JknDZhAj8YMt7GC73Ei8pv4MzjDUNPHgQWJdtMAaDU= -gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:5AcXVHNjg+BDxry382+8OKon8SEWiKktQR07RKPsv1c= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= @@ -478,3 +495,5 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +rsc.io/tmplfunc v0.0.3 h1:53XFQh69AfOa8Tw0Jm7t+GV7KZhOi6jzsCzTtKbMvzU= +rsc.io/tmplfunc v0.0.3/go.mod h1:AG3sTPzElb1Io3Yg4voV9AGZJuleGAwaVRxL9M49PhA= From 746e9b8826a2bd2ce43798f16fa1188b417bda1d Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Tue, 19 Sep 2023 13:37:45 +0200 Subject: [PATCH 033/387] simulators/ethereum/engine: upgrade dependencies Also remove the module replacement, since it should not be needed anymore. --- simulators/ethereum/engine/go.mod | 18 ++++++++---------- simulators/ethereum/engine/go.sum | 30 +++++++++++++++--------------- 2 files changed, 23 insertions(+), 25 deletions(-) diff --git a/simulators/ethereum/engine/go.mod b/simulators/ethereum/engine/go.mod index ccbdc2fe7c..6900ec17c3 100644 --- a/simulators/ethereum/engine/go.mod +++ b/simulators/ethereum/engine/go.mod @@ -5,8 +5,8 @@ go 1.20 require ( github.com/crate-crypto/go-kzg-4844 v0.3.0 github.com/davecgh/go-spew v1.1.1 - github.com/ethereum/go-ethereum v1.12.1-0.20230728070838-8f2ae29b8f77 - github.com/ethereum/hive v0.0.0-20230313141339-8e3200bfc09e + github.com/ethereum/go-ethereum v1.13.1 + github.com/ethereum/hive v0.0.0-20230919110229-d58aec4a3eb5 github.com/golang-jwt/jwt/v4 v4.4.3 github.com/holiman/uint256 v1.2.3 github.com/pkg/errors v0.9.1 @@ -25,7 +25,7 @@ require ( github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/cockroachdb/errors v1.9.1 // indirect github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect - github.com/cockroachdb/pebble v0.0.0-20230821143352-55b44ac08de8 // indirect + github.com/cockroachdb/pebble v0.0.0-20230906160148-46873a6a7a06 // indirect github.com/cockroachdb/redact v1.1.3 // indirect github.com/consensys/bavard v0.1.13 // indirect github.com/consensys/gnark-crypto v0.11.0 // indirect @@ -79,23 +79,21 @@ require ( github.com/status-im/keycard-go v0.2.0 // indirect github.com/supranational/blst v0.3.11 // indirect github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a // indirect - github.com/tklauser/go-sysconf v0.3.11 // indirect - github.com/tklauser/numcpus v0.6.0 // indirect + github.com/tklauser/go-sysconf v0.3.12 // indirect + github.com/tklauser/numcpus v0.6.1 // indirect github.com/tyler-smith/go-bip39 v1.1.0 // indirect github.com/urfave/cli/v2 v2.24.1 // indirect github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 // indirect github.com/yusufpapurcu/wmi v1.2.2 // indirect - golang.org/x/crypto v0.9.0 // indirect + golang.org/x/crypto v0.12.0 // indirect golang.org/x/mod v0.11.0 // indirect golang.org/x/net v0.10.0 // indirect golang.org/x/sync v0.3.0 // indirect - golang.org/x/sys v0.9.0 // indirect - golang.org/x/text v0.9.0 // indirect + golang.org/x/sys v0.11.0 // indirect + golang.org/x/text v0.12.0 // indirect golang.org/x/time v0.3.0 // indirect golang.org/x/tools v0.9.1 // indirect google.golang.org/protobuf v1.28.1 // indirect gopkg.in/natefinch/lumberjack.v2 v2.0.0 // indirect rsc.io/tmplfunc v0.0.3 // indirect ) - -replace github.com/ethereum/go-ethereum => github.com/lightclient/go-ethereum v1.10.10-0.20230829211949-79f3c2d9c96b diff --git a/simulators/ethereum/engine/go.sum b/simulators/ethereum/engine/go.sum index f9ca0de395..ac9c18de13 100644 --- a/simulators/ethereum/engine/go.sum +++ b/simulators/ethereum/engine/go.sum @@ -46,8 +46,8 @@ github.com/cockroachdb/errors v1.9.1/go.mod h1:2sxOtL2WIc096WSZqZ5h8fa17rdDq9HZO github.com/cockroachdb/logtags v0.0.0-20211118104740-dabe8e521a4f/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= -github.com/cockroachdb/pebble v0.0.0-20230821143352-55b44ac08de8 h1:2fNOyQqrHSjFdqnKqSLj9W7eGTcqKujJPA8vAuT1zN8= -github.com/cockroachdb/pebble v0.0.0-20230821143352-55b44ac08de8/go.mod h1:bynZ3gvVyhlvjLI7PT6dmZ7g76xzJ7HpxfjgkzCGz6s= +github.com/cockroachdb/pebble v0.0.0-20230906160148-46873a6a7a06 h1:T+Np/xtzIjYM/P5NAw0e2Rf1FGvzDau1h54MKvx8G7w= +github.com/cockroachdb/pebble v0.0.0-20230906160148-46873a6a7a06/go.mod h1:bynZ3gvVyhlvjLI7PT6dmZ7g76xzJ7HpxfjgkzCGz6s= github.com/cockroachdb/redact v1.1.3 h1:AKZds10rFSIj7qADf0g46UixK8NNLwWTNdCIGS5wfSQ= github.com/cockroachdb/redact v1.1.3/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0/go.mod h1:4Zcjuz89kmFXt9morQgcfYZAYZ5n8WHjt81YYWIwtTM= @@ -86,8 +86,8 @@ github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7 github.com/etcd-io/bbolt v1.3.3/go.mod h1:ZF2nL25h33cCyBtcyWeZ2/I3HQOfTP+0PIEvHjkjCrw= github.com/ethereum/c-kzg-4844 v0.3.1 h1:sR65+68+WdnMKxseNWxSJuAv2tsUrihTpVBTfM/U5Zg= github.com/ethereum/c-kzg-4844 v0.3.1/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= -github.com/ethereum/hive v0.0.0-20230313141339-8e3200bfc09e h1:3g9cqRqpbZ92tSlGL4PfFoq435axKw6HiZ1Gz3fOkfk= -github.com/ethereum/hive v0.0.0-20230313141339-8e3200bfc09e/go.mod h1:PlpDuxHg6q1jU0K8Ouf+RXlHguignJ7k8Eyukc9RCPQ= +github.com/ethereum/hive v0.0.0-20230919110229-d58aec4a3eb5 h1:22Z+XoI2hGtYR0AMzYr9IusfYM/chALq/6oJnejJQpk= +github.com/ethereum/hive v0.0.0-20230919110229-d58aec4a3eb5/go.mod h1:iKqu3dndnqdwSckyBGoZzeHhZz6X6XZws2TfZMdLdes= github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072/go.mod h1:duJ4Jxv5lDcvg4QuQr0oowTf7dz4/CR8NtyCooz9HL8= github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= github.com/fjl/memsize v0.0.1 h1:+zhkb+dhUgx0/e+M8sF0QqiouvMQUiKR+QYvdxIOKcQ= @@ -357,10 +357,10 @@ github.com/supranational/blst v0.3.11 h1:LyU6FolezeWAhvQk0k6O/d49jqgO52MSDDfYgbe github.com/supranational/blst v0.3.11/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a h1:1ur3QoCqvE5fl+nylMaIr9PVV1w343YRDtsy+Rwu7XI= github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a/go.mod h1:RRCYJbIwD5jmqPI9XoAFR0OcDxqUctll6zUj/+B4S48= -github.com/tklauser/go-sysconf v0.3.11 h1:89WgdJhk5SNwJfu+GKyYveZ4IaJ7xAkecBo+KdJV0CM= -github.com/tklauser/go-sysconf v0.3.11/go.mod h1:GqXfhXY3kiPa0nAXPDIQIWzJbMCB7AmcWpGR8lSZfqI= -github.com/tklauser/numcpus v0.6.0 h1:kebhY2Qt+3U6RNK7UqpYNA+tJ23IBEGKkB7JQBfDYms= -github.com/tklauser/numcpus v0.6.0/go.mod h1:FEZLMke0lhOUG6w2JadTzp0a+Nl8PF/GFkQ5UVIcaL4= +github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= +github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= +github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= +github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= github.com/tyler-smith/go-bip39 v1.1.0 h1:5eUemwrMargf3BSLRRCalXT93Ns6pQJIjYQN2nyfOP8= github.com/tyler-smith/go-bip39 v1.1.0/go.mod h1:gUYDtqQw1JS3ZJ8UWVcGTGqqr6YIN3CWg+kkNaLt55U= github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= @@ -400,8 +400,8 @@ golang.org/x/crypto v0.0.0-20191227163750-53104e6ec876/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.9.0 h1:LF6fAI+IutBocDJ2OT0Q1g8plpYljMZ4+lty+dsqw3g= -golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= +golang.org/x/crypto v0.12.0 h1:tFM/ta59kqch6LlvYnPa0yx5a83cL2nHflFhYKvv9Yk= +golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20230810033253-352e893a4cad h1:g0bG7Z4uG+OgH2QDODnjp6ggkk1bJDsINcuWmJN1iJU= golang.org/x/exp v0.0.0-20230810033253-352e893a4cad/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc= @@ -484,9 +484,9 @@ golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.9.0 h1:KS/R3tvhPqvJvwcKfnBHJwwthS11LRhmM5D59eEXa0s= -golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM= +golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -495,8 +495,8 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE= -golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc= +golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= From 52d3ad4379b12f7176ba6495cebf82ac1182d199 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Tue, 19 Sep 2023 13:38:12 +0200 Subject: [PATCH 034/387] simulators/ethereum: update Go version in go.work file --- simulators/ethereum/go.work | 2 +- simulators/ethereum/go.work.sum | 9 ++++++--- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/simulators/ethereum/go.work b/simulators/ethereum/go.work index 36bf6f7a7f..537e04a1c4 100644 --- a/simulators/ethereum/go.work +++ b/simulators/ethereum/go.work @@ -1,4 +1,4 @@ -go 1.19 +go 1.20 use ( ./consensus diff --git a/simulators/ethereum/go.work.sum b/simulators/ethereum/go.work.sum index a0ac8aedd5..cf8b303272 100644 --- a/simulators/ethereum/go.work.sum +++ b/simulators/ethereum/go.work.sum @@ -171,7 +171,6 @@ github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+Ce github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/bitly/go-simplejson v0.5.0/go.mod h1:cXHtHw4XUPsvGaxgjIAn8PhEWG9NfngEKAMDJEczWVA= github.com/bits-and-blooms/bitset v1.2.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= -github.com/bits-and-blooms/bitset v1.5.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= github.com/blang/semver v3.1.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= @@ -219,7 +218,6 @@ github.com/cockroachdb/errors v1.8.1/go.mod h1:qGwQn6JmZ+oMjuLwjWzUNqblqk0xl4CVV github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI= github.com/cockroachdb/redact v1.0.8/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= github.com/cockroachdb/sentry-go v0.6.1-cockroachdb.2/go.mod h1:8BT+cPK6xvFOcRlk0R8eg+OTkcqI6baNH4xAkpiYVvQ= -github.com/consensys/gnark-crypto v0.10.0/go.mod h1:Iq/P3HHl0ElSjsg2E1gsMwhAyxnxoKK5nVyZKd+/KhU= github.com/containerd/aufs v0.0.0-20200908144142-dab0cbea06f4/go.mod h1:nukgQABAEopAHvB6j7cnP5zJ+/3aVcE7hCYqvIwAHyE= github.com/containerd/aufs v0.0.0-20201003224125-76a6863f2989/go.mod h1:AkGGQs9NM2vtYHaUen+NljV0/baGCAPELGm2q9ZXpWU= github.com/containerd/aufs v0.0.0-20210316121734-20793ff83c97/go.mod h1:kL5kd6KM5TzQjR79jljyi4olc1Vrx6XBlcyj3gNv2PU= @@ -876,8 +874,12 @@ github.com/stefanberger/go-pkcs11uri v0.0.0-20201008174630-78d3cae3a980/go.mod h github.com/stretchr/objx v0.0.0-20180129172003-8a3f7159479f/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v0.0.0-20180303142811-b89eecf5ca5d/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/syndtr/gocapability v0.0.0-20170704070218-db04d3cc01c8/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= github.com/syndtr/gocapability v0.0.0-20180916011248-d98352740cb2/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= @@ -1149,10 +1151,11 @@ golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220928140112-f11e5e49a4ec/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= +golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= From 1f4cb291a3f4321b338302845bfc1afab9821e75 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Tue, 19 Sep 2023 13:47:13 +0200 Subject: [PATCH 035/387] simulators/ethereum/engine: go mod tidy --- simulators/ethereum/engine/go.mod | 4 ++-- simulators/ethereum/engine/go.sum | 15 +++++++-------- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/simulators/ethereum/engine/go.mod b/simulators/ethereum/engine/go.mod index 6900ec17c3..c63908355c 100644 --- a/simulators/ethereum/engine/go.mod +++ b/simulators/ethereum/engine/go.mod @@ -50,7 +50,7 @@ require ( github.com/hashicorp/go-bexpr v0.1.11 // indirect github.com/holiman/billy v0.0.0-20230718173358-1c7e68d277a7 // indirect github.com/holiman/bloomfilter/v2 v2.0.3 // indirect - github.com/huin/goupnp v1.0.3 // indirect + github.com/huin/goupnp v1.3.0 // indirect github.com/influxdata/influxdb-client-go/v2 v2.12.1 // indirect github.com/influxdata/influxdb1-client v0.0.0-20220302092344-a9ab5670611c // indirect github.com/influxdata/line-protocol v0.0.0-20210922203350-b1ad95c89adf // indirect @@ -82,7 +82,7 @@ require ( github.com/tklauser/go-sysconf v0.3.12 // indirect github.com/tklauser/numcpus v0.6.1 // indirect github.com/tyler-smith/go-bip39 v1.1.0 // indirect - github.com/urfave/cli/v2 v2.24.1 // indirect + github.com/urfave/cli/v2 v2.25.7 // indirect github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 // indirect github.com/yusufpapurcu/wmi v1.2.2 // indirect golang.org/x/crypto v0.12.0 // indirect diff --git a/simulators/ethereum/engine/go.sum b/simulators/ethereum/engine/go.sum index ac9c18de13..f1b4ad5552 100644 --- a/simulators/ethereum/engine/go.sum +++ b/simulators/ethereum/engine/go.sum @@ -1,7 +1,7 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/toml v1.2.1 h1:9F2/+DoOYIOksmaJFPw1tGFy1eDnIJXg+UHjuD8lTak= +github.com/BurntSushi/toml v1.3.2 h1:o7IhLm0Msx3BaB+n3Ag7L8EVlByGnpq14C4YWiu/gL8= github.com/CloudyKit/fastprinter v0.0.0-20200109182630-33d98a066a53/go.mod h1:+3IMCy2vIlbG1XG/0ggNQv0SvxCAIpPM5b1nCz56Xno= github.com/CloudyKit/jet/v3 v3.0.0/go.mod h1:HKQPgSJmdK8hdoAbKUUWajkHyHo4RaU5rMdUywE7VMo= github.com/DataDog/zstd v1.5.2 h1:vUG4lAyuPCXO0TLbXvPv7EB7cNK1QV/luu55UHLrrn8= @@ -86,6 +86,8 @@ github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7 github.com/etcd-io/bbolt v1.3.3/go.mod h1:ZF2nL25h33cCyBtcyWeZ2/I3HQOfTP+0PIEvHjkjCrw= github.com/ethereum/c-kzg-4844 v0.3.1 h1:sR65+68+WdnMKxseNWxSJuAv2tsUrihTpVBTfM/U5Zg= github.com/ethereum/c-kzg-4844 v0.3.1/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= +github.com/ethereum/go-ethereum v1.13.1 h1:UF2FaUKPIy5jeZk3X06ait3y2Q4wI+vJ1l7+UARp+60= +github.com/ethereum/go-ethereum v1.13.1/go.mod h1:xHQKzwkHSl0gnSjZK1mWa06XEdm9685AHqhRknOzqGQ= github.com/ethereum/hive v0.0.0-20230919110229-d58aec4a3eb5 h1:22Z+XoI2hGtYR0AMzYr9IusfYM/chALq/6oJnejJQpk= github.com/ethereum/hive v0.0.0-20230919110229-d58aec4a3eb5/go.mod h1:iKqu3dndnqdwSckyBGoZzeHhZz6X6XZws2TfZMdLdes= github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072/go.mod h1:duJ4Jxv5lDcvg4QuQr0oowTf7dz4/CR8NtyCooz9HL8= @@ -184,9 +186,8 @@ github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iU github.com/holiman/uint256 v1.2.3 h1:K8UWO1HUJpRMXBxbmaY1Y8IAMZC/RsKB+ArEnnK4l5o= github.com/holiman/uint256 v1.2.3/go.mod h1:SC8Ryt4n+UBbPbIBKaG9zbbDlp4jOru9xFZmPzLUTxw= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/huin/goupnp v1.0.3 h1:N8No57ls+MnjlB+JPiCVSOyy/ot7MJTqlo7rn+NYSqQ= -github.com/huin/goupnp v1.0.3/go.mod h1:ZxNlw5WqJj6wSsRK5+YfflQGXYfccj5VgQsMNixHM7Y= -github.com/huin/goutil v0.0.0-20170803182201-1ca381bf3150/go.mod h1:PpLOETDnJ0o3iZrZfqZzyLl6l7F3c6L1oWn7OICBi6o= +github.com/huin/goupnp v1.3.0 h1:UvLUlWDNpoUdYzb2TCn+MuTWtcjXKSza2n6CBdQ0xXc= +github.com/huin/goupnp v1.3.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8= github.com/hydrogen18/memlistener v0.0.0-20200120041712-dcc25e7acd91/go.mod h1:qEIFzExnS6016fRpRfxrExeVn2gbClQA99gQhnIcdhE= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/imkira/go-interpol v1.1.0/go.mod h1:z0h2/2T3XF8kyEPpRgJ3kmNv+C43p+I/CoI+jC3w2iA= @@ -234,8 +235,6 @@ github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0 github.com/labstack/echo/v4 v4.5.0/go.mod h1:czIriw4a0C1dFun+ObrXp7ok03xON0N1awStJ6ArI7Y= github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c= -github.com/lightclient/go-ethereum v1.10.10-0.20230829211949-79f3c2d9c96b h1:dglsK4NuDRreW5+/0EoTFxCiZwkRZay/aDoOul2lca0= -github.com/lightclient/go-ethereum v1.10.10-0.20230829211949-79f3c2d9c96b/go.mod h1:UWQqzN9473khWbdvlh2QjYXX0ykhKT1OuPYus9Hgv+o= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= @@ -367,8 +366,8 @@ github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGr github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= -github.com/urfave/cli/v2 v2.24.1 h1:/QYYr7g0EhwXEML8jO+8OYt5trPnLHS0p3mrgExJ5NU= -github.com/urfave/cli/v2 v2.24.1/go.mod h1:GHupkWPMM0M/sj1a2b4wUrWBPzazNrIjouW6fmdJLxc= +github.com/urfave/cli/v2 v2.25.7 h1:VAzn5oq403l5pHjc4OhD54+XGO9cdKVL/7lDjF+iKUs= +github.com/urfave/cli/v2 v2.25.7/go.mod h1:8qnjx1vcq5s2/wpsqoZFndg2CE5tNFyrTvS6SinrnYQ= github.com/urfave/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/valyala/fasthttp v1.6.0/go.mod h1:FstJa9V+Pj9vQ7OJie2qMHdwemEDaDiSdBnvPM1Su9w= From 2a4f092c68c904953227194138b62c40373e470d Mon Sep 17 00:00:00 2001 From: Mario Vega Date: Tue, 19 Sep 2023 10:48:27 -0600 Subject: [PATCH 036/387] simulators/ethereum/engine: Add London non-zero-number test (#867) --- simulators/ethereum/engine/config/fork.go | 1 + simulators/ethereum/engine/main.go | 3 ++ .../ethereum/engine/suites/engine/misc.go | 41 +++++++++++++++++++ .../ethereum/engine/suites/engine/tests.go | 9 ++++ .../engine/suites/withdrawals/tests.go | 9 ++++ 5 files changed, 63 insertions(+) create mode 100644 simulators/ethereum/engine/suites/engine/misc.go diff --git a/simulators/ethereum/engine/config/fork.go b/simulators/ethereum/engine/config/fork.go index 806aa825f8..6e4e879cb3 100644 --- a/simulators/ethereum/engine/config/fork.go +++ b/simulators/ethereum/engine/config/fork.go @@ -27,6 +27,7 @@ func (f Fork) PreviousFork() Fork { } type ForkConfig struct { + LondonNumber *big.Int ShanghaiTimestamp *big.Int CancunTimestamp *big.Int } diff --git a/simulators/ethereum/engine/main.go b/simulators/ethereum/engine/main.go index c45b7de8fc..6cb74003b2 100644 --- a/simulators/ethereum/engine/main.go +++ b/simulators/ethereum/engine/main.go @@ -141,6 +141,9 @@ func makeRunner(tests []test.Spec, nodeType string) func(t *hivesim.T) { // Configure Forks newParams := globals.DefaultClientEnv.Set("HIVE_TERMINAL_TOTAL_DIFFICULTY", fmt.Sprintf("%d", ttd)) + if forkConfig.LondonNumber != nil { + newParams = newParams.Set("HIVE_FORK_LONDON", fmt.Sprintf("%d", forkConfig.LondonNumber)) + } if forkConfig.ShanghaiTimestamp != nil { newParams = newParams.Set("HIVE_SHANGHAI_TIMESTAMP", fmt.Sprintf("%d", forkConfig.ShanghaiTimestamp)) // Ensure the merge transition is activated before shanghai. diff --git a/simulators/ethereum/engine/suites/engine/misc.go b/simulators/ethereum/engine/suites/engine/misc.go new file mode 100644 index 0000000000..bc3a4ceefa --- /dev/null +++ b/simulators/ethereum/engine/suites/engine/misc.go @@ -0,0 +1,41 @@ +package suite_engine + +import ( + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/hive/simulators/ethereum/engine/clmock" + "github.com/ethereum/hive/simulators/ethereum/engine/config" + "github.com/ethereum/hive/simulators/ethereum/engine/test" +) + +// Runs a sanity test on a post Merge fork where a previous fork's (London) number is not zero +type NonZeroPreMergeFork struct { + test.BaseSpec +} + +func (s NonZeroPreMergeFork) WithMainFork(fork config.Fork) test.Spec { + specCopy := s + specCopy.MainFork = fork + return specCopy +} + +func (b NonZeroPreMergeFork) GetName() string { + return "Pre-Merge Fork Number > 0" +} + +func (s NonZeroPreMergeFork) GetForkConfig() *config.ForkConfig { + forkConfig := s.BaseSpec.GetForkConfig() + if forkConfig == nil { + return nil + } + forkConfig.LondonNumber = common.Big1 + return forkConfig +} + +func (b NonZeroPreMergeFork) Execute(t *test.Env) { + // Wait until TTD is reached by this client + t.CLMock.WaitForTTD() + + // Simply produce a couple of blocks without transactions (if London is not active at genesis + // we can't send type-2 transactions) and check that the chain progresses without issues + t.CLMock.ProduceBlocks(5, clmock.BlockProcessCallbacks{}) +} diff --git a/simulators/ethereum/engine/suites/engine/tests.go b/simulators/ethereum/engine/suites/engine/tests.go index 1fe08c1fd0..91e79e6264 100644 --- a/simulators/ethereum/engine/suites/engine/tests.go +++ b/simulators/ethereum/engine/suites/engine/tests.go @@ -406,4 +406,13 @@ func init() { } } } + + // Misc Tests + Tests = append(Tests, + NonZeroPreMergeFork{ + BaseSpec: test.BaseSpec{ + ForkHeight: 1, + }, + }, + ) } diff --git a/simulators/ethereum/engine/suites/withdrawals/tests.go b/simulators/ethereum/engine/suites/withdrawals/tests.go index 3a647d65c1..0b8b9579a7 100644 --- a/simulators/ethereum/engine/suites/withdrawals/tests.go +++ b/simulators/ethereum/engine/suites/withdrawals/tests.go @@ -19,6 +19,7 @@ import ( "github.com/ethereum/hive/simulators/ethereum/engine/config" "github.com/ethereum/hive/simulators/ethereum/engine/globals" "github.com/ethereum/hive/simulators/ethereum/engine/helper" + suite_engine "github.com/ethereum/hive/simulators/ethereum/engine/suites/engine" "github.com/ethereum/hive/simulators/ethereum/engine/test" typ "github.com/ethereum/hive/simulators/ethereum/engine/types" ) @@ -814,6 +815,14 @@ var Tests = []test.Spec{ }, }, }, + + // TODO: Remove since this will be automatically inherited when this test suite is refactored + suite_engine.NonZeroPreMergeFork{ + BaseSpec: test.BaseSpec{ + MainFork: config.Shanghai, + ForkHeight: 1, + }, + }, } // Helper types to convert gwei into wei more easily From c225765982b6427f2168ef53201b49c6908e0253 Mon Sep 17 00:00:00 2001 From: Mario Vega Date: Wed, 20 Sep 2023 14:05:19 -0600 Subject: [PATCH 037/387] configs/cancun: Update Geth (#871) --- configs/cancun.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configs/cancun.yaml b/configs/cancun.yaml index 71f65ae8b4..1ae2fcbed4 100644 --- a/configs/cancun.yaml +++ b/configs/cancun.yaml @@ -23,7 +23,7 @@ dockerfile: git build_args: github: lightclient/go-ethereum - tag: devnet-8 + tag: devnet-9 - client: nethermind nametag: cancun-git From 57acfca1530285a52a45d0abaf9a3f8f10d9cf50 Mon Sep 17 00:00:00 2001 From: Mario Vega Date: Thu, 21 Sep 2023 00:22:33 -0600 Subject: [PATCH 038/387] simulators/ethereum/engine: Update beacon root address: 0xbEAC..7d7a (#873) --- simulators/ethereum/engine/config/cancun/constants.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/simulators/ethereum/engine/config/cancun/constants.go b/simulators/ethereum/engine/config/cancun/constants.go index dff362fe17..8e5a15c2da 100644 --- a/simulators/ethereum/engine/config/cancun/constants.go +++ b/simulators/ethereum/engine/config/cancun/constants.go @@ -22,7 +22,7 @@ var ( BLOB_COMMITMENT_VERSION_KZG = byte(0x01) // EIP 4788 - BEACON_ROOTS_ADDRESS = common.HexToAddress("0xbEac00dDB15f3B6d645C48263dC93862413A222D") + BEACON_ROOTS_ADDRESS = common.HexToAddress("0xbEAC020008aFF7331c0A389CB2AAb67597567d7a") HISTORY_BUFFER_LENGTH = uint64(98304) // Test constants From f11e398ad634325c2117858d74aec953e6237eb3 Mon Sep 17 00:00:00 2001 From: spencer Date: Thu, 21 Sep 2023 02:28:10 -0400 Subject: [PATCH 039/387] simulators/ethereum/pyspec: Use hive specific fixture format (#844) * simulators/pyspec: Update to use correct fcuVersion. * simulators/ethereum/pyspec: Refactor to use new fixture format. * simulators/ethereum/pyspec: Fix logging, tests links and go.sum. * simulators/ethereum/pyspec: fixes * simulators/ethereum/pyspec: update fixtures source --------- Co-authored-by: Mario Vega --- simulators/ethereum/pyspec/Dockerfile | 4 +- simulators/ethereum/pyspec/gen_bh.go | 190 -------------------------- simulators/ethereum/pyspec/gen_enp.go | 62 --------- simulators/ethereum/pyspec/gen_gb.go | 100 ++++++++++++++ simulators/ethereum/pyspec/gen_txs.go | 142 ------------------- simulators/ethereum/pyspec/gen_wds.go | 55 -------- simulators/ethereum/pyspec/main.go | 25 ++-- simulators/ethereum/pyspec/runner.go | 85 ++++++------ simulators/ethereum/pyspec/types.go | 149 ++++---------------- 9 files changed, 180 insertions(+), 632 deletions(-) delete mode 100644 simulators/ethereum/pyspec/gen_bh.go delete mode 100644 simulators/ethereum/pyspec/gen_enp.go create mode 100644 simulators/ethereum/pyspec/gen_gb.go delete mode 100644 simulators/ethereum/pyspec/gen_txs.go delete mode 100644 simulators/ethereum/pyspec/gen_wds.go diff --git a/simulators/ethereum/pyspec/Dockerfile b/simulators/ethereum/pyspec/Dockerfile index a9befb51d8..529857039d 100644 --- a/simulators/ethereum/pyspec/Dockerfile +++ b/simulators/ethereum/pyspec/Dockerfile @@ -21,8 +21,8 @@ COPY --from=builder /source/pyspec/pyspec . # To run locally generated fixtures, comment the following RUN lines and # uncomment the ADD line. # Download the latest fixture release. -RUN wget https://github.com/ethereum/execution-spec-tests/releases/download/v1.0.3/fixtures.tar.gz -RUN tar -xzvf fixtures.tar.gz +RUN wget https://github.com/ethereum/execution-spec-tests/releases/download/v1.0.4/fixtures_hive.tar.gz +RUN tar -xzvf fixtures_hive.tar.gz RUN mv fixtures /fixtures # ADD ./pyspec/fixtures /fixtures diff --git a/simulators/ethereum/pyspec/gen_bh.go b/simulators/ethereum/pyspec/gen_bh.go deleted file mode 100644 index ea6822e59e..0000000000 --- a/simulators/ethereum/pyspec/gen_bh.go +++ /dev/null @@ -1,190 +0,0 @@ -// Code generated by github.com/fjl/gencodec. DO NOT EDIT. - -package main - -import ( - "encoding/json" - "math/big" - - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/common/hexutil" - "github.com/ethereum/go-ethereum/common/math" - "github.com/ethereum/go-ethereum/core/types" -) - -var _ = (*blockHeaderUnmarshaling)(nil) - -// MarshalJSON marshals as JSON. -func (b blockHeader) MarshalJSON() ([]byte, error) { - type blockHeader struct { - ParentHash common.Hash `json:"parentHash"` - UncleHash common.Hash `json:"sha3Uncles"` - UncleHashAlt common.Hash `json:"uncleHash"` - Coinbase common.Address `json:"coinbase"` - CoinbaseAlt common.Address `json:"author"` - CoinbaseAlt2 common.Address `json:"miner"` - StateRoot common.Hash `json:"stateRoot"` - TransactionTrie common.Hash `json:"transactionRoot"` - TransactionTrieAlt common.Hash `json:"transactionTrie"` - ReceiptTrie common.Hash `json:"receiptsRoot"` - ReceiptTrieAlt common.Hash `json:"receiptTrie"` - Bloom types.Bloom `json:"bloom"` - Difficulty *math.HexOrDecimal256 `json:"difficulty"` - Number *math.HexOrDecimal256 `json:"number"` - GasLimit math.HexOrDecimal64 `json:"gasLimit"` - GasUsed math.HexOrDecimal64 `json:"gasUsed"` - Timestamp *math.HexOrDecimal256 `json:"timestamp"` - ExtraData hexutil.Bytes `json:"extraData"` - MixHash common.Hash `json:"mixHash"` - Nonce types.BlockNonce `json:"nonce"` - BaseFee *math.HexOrDecimal256 `json:"baseFeePerGas"` - Hash common.Hash `json:"hash"` - WithdrawalsRoot common.Hash `json:"withdrawalsRoot"` - BlobGasUsed *math.HexOrDecimal64 `json:"blobGasUsed"` - ExcessBlobGas *math.HexOrDecimal64 `json:"excessBlobGas"` - BeaconRoot *common.Hash `json:"parentBeaconBlockRoot"` - } - var enc blockHeader - enc.ParentHash = b.ParentHash - enc.UncleHash = b.UncleHash - enc.UncleHashAlt = b.UncleHashAlt - enc.Coinbase = b.Coinbase - enc.CoinbaseAlt = b.CoinbaseAlt - enc.CoinbaseAlt2 = b.CoinbaseAlt2 - enc.StateRoot = b.StateRoot - enc.TransactionTrie = b.TransactionTrie - enc.TransactionTrieAlt = b.TransactionTrieAlt - enc.ReceiptTrie = b.ReceiptTrie - enc.ReceiptTrieAlt = b.ReceiptTrieAlt - enc.Bloom = b.Bloom - enc.Difficulty = (*math.HexOrDecimal256)(b.Difficulty) - enc.Number = (*math.HexOrDecimal256)(b.Number) - enc.GasLimit = math.HexOrDecimal64(b.GasLimit) - enc.GasUsed = math.HexOrDecimal64(b.GasUsed) - enc.Timestamp = (*math.HexOrDecimal256)(b.Timestamp) - enc.ExtraData = b.ExtraData - enc.MixHash = b.MixHash - enc.Nonce = b.Nonce - enc.BaseFee = (*math.HexOrDecimal256)(b.BaseFee) - enc.Hash = b.Hash - enc.WithdrawalsRoot = b.WithdrawalsRoot - enc.BlobGasUsed = (*math.HexOrDecimal64)(b.BlobGasUsed) - enc.ExcessBlobGas = (*math.HexOrDecimal64)(b.ExcessBlobGas) - enc.BeaconRoot = b.BeaconRoot - return json.Marshal(&enc) -} - -// UnmarshalJSON unmarshals from JSON. -func (b *blockHeader) UnmarshalJSON(input []byte) error { - type blockHeader struct { - ParentHash *common.Hash `json:"parentHash"` - UncleHash *common.Hash `json:"sha3Uncles"` - UncleHashAlt *common.Hash `json:"uncleHash"` - Coinbase *common.Address `json:"coinbase"` - CoinbaseAlt *common.Address `json:"author"` - CoinbaseAlt2 *common.Address `json:"miner"` - StateRoot *common.Hash `json:"stateRoot"` - TransactionTrie *common.Hash `json:"transactionRoot"` - TransactionTrieAlt *common.Hash `json:"transactionTrie"` - ReceiptTrie *common.Hash `json:"receiptsRoot"` - ReceiptTrieAlt *common.Hash `json:"receiptTrie"` - Bloom *types.Bloom `json:"bloom"` - Difficulty *math.HexOrDecimal256 `json:"difficulty"` - Number *math.HexOrDecimal256 `json:"number"` - GasLimit *math.HexOrDecimal64 `json:"gasLimit"` - GasUsed *math.HexOrDecimal64 `json:"gasUsed"` - Timestamp *math.HexOrDecimal256 `json:"timestamp"` - ExtraData *hexutil.Bytes `json:"extraData"` - MixHash *common.Hash `json:"mixHash"` - Nonce *types.BlockNonce `json:"nonce"` - BaseFee *math.HexOrDecimal256 `json:"baseFeePerGas"` - Hash *common.Hash `json:"hash"` - WithdrawalsRoot *common.Hash `json:"withdrawalsRoot"` - BlobGasUsed *math.HexOrDecimal64 `json:"blobGasUsed"` - ExcessBlobGas *math.HexOrDecimal64 `json:"excessBlobGas"` - BeaconRoot *common.Hash `json:"parentBeaconBlockRoot"` - } - var dec blockHeader - if err := json.Unmarshal(input, &dec); err != nil { - return err - } - if dec.ParentHash != nil { - b.ParentHash = *dec.ParentHash - } - if dec.UncleHash != nil { - b.UncleHash = *dec.UncleHash - } - if dec.UncleHashAlt != nil { - b.UncleHashAlt = *dec.UncleHashAlt - } - if dec.Coinbase != nil { - b.Coinbase = *dec.Coinbase - } - if dec.CoinbaseAlt != nil { - b.CoinbaseAlt = *dec.CoinbaseAlt - } - if dec.CoinbaseAlt2 != nil { - b.CoinbaseAlt2 = *dec.CoinbaseAlt2 - } - if dec.StateRoot != nil { - b.StateRoot = *dec.StateRoot - } - if dec.TransactionTrie != nil { - b.TransactionTrie = *dec.TransactionTrie - } - if dec.TransactionTrieAlt != nil { - b.TransactionTrieAlt = *dec.TransactionTrieAlt - } - if dec.ReceiptTrie != nil { - b.ReceiptTrie = *dec.ReceiptTrie - } - if dec.ReceiptTrieAlt != nil { - b.ReceiptTrieAlt = *dec.ReceiptTrieAlt - } - if dec.Bloom != nil { - b.Bloom = *dec.Bloom - } - if dec.Difficulty != nil { - b.Difficulty = (*big.Int)(dec.Difficulty) - } - if dec.Number != nil { - b.Number = (*big.Int)(dec.Number) - } - if dec.GasLimit != nil { - b.GasLimit = uint64(*dec.GasLimit) - } - if dec.GasUsed != nil { - b.GasUsed = uint64(*dec.GasUsed) - } - if dec.Timestamp != nil { - b.Timestamp = (*big.Int)(dec.Timestamp) - } - if dec.ExtraData != nil { - b.ExtraData = *dec.ExtraData - } - if dec.MixHash != nil { - b.MixHash = *dec.MixHash - } - if dec.Nonce != nil { - b.Nonce = *dec.Nonce - } - if dec.BaseFee != nil { - b.BaseFee = (*big.Int)(dec.BaseFee) - } - if dec.Hash != nil { - b.Hash = *dec.Hash - } - if dec.WithdrawalsRoot != nil { - b.WithdrawalsRoot = *dec.WithdrawalsRoot - } - if dec.BlobGasUsed != nil { - b.BlobGasUsed = (*uint64)(dec.BlobGasUsed) - } - if dec.ExcessBlobGas != nil { - b.ExcessBlobGas = (*uint64)(dec.ExcessBlobGas) - } - if dec.BeaconRoot != nil { - b.BeaconRoot = dec.BeaconRoot - } - return nil -} diff --git a/simulators/ethereum/pyspec/gen_enp.go b/simulators/ethereum/pyspec/gen_enp.go deleted file mode 100644 index 653b0f48a2..0000000000 --- a/simulators/ethereum/pyspec/gen_enp.go +++ /dev/null @@ -1,62 +0,0 @@ -// Code generated by github.com/fjl/gencodec. DO NOT EDIT. - -package main - -import ( - "encoding/json" - - "github.com/ethereum/go-ethereum/beacon/engine" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/common/math" -) - -var _ = (*engineNewPayloadUnmarshaling)(nil) - -// MarshalJSON marshals as JSON. -func (e engineNewPayload) MarshalJSON() ([]byte, error) { - type engineNewPayload struct { - Payload *engine.ExecutableData `json:"executionPayload"` - BlobVersionedHashes []common.Hash `json:"expectedBlobVersionedHashes"` - ParentBeaconBlockRoot *common.Hash `json:"parentBeaconBlockRoot"` - Version math.HexOrDecimal64 `json:"version"` - ErrorCode int64 `json:"errorCode,string"` - } - var enc engineNewPayload - enc.Payload = e.Payload - enc.BlobVersionedHashes = e.BlobVersionedHashes - enc.ParentBeaconBlockRoot = e.ParentBeaconBlockRoot - enc.Version = math.HexOrDecimal64(e.Version) - enc.ErrorCode = e.ErrorCode - return json.Marshal(&enc) -} - -// UnmarshalJSON unmarshals from JSON. -func (e *engineNewPayload) UnmarshalJSON(input []byte) error { - type engineNewPayload struct { - Payload *engine.ExecutableData `json:"executionPayload"` - BlobVersionedHashes []common.Hash `json:"expectedBlobVersionedHashes"` - ParentBeaconBlockRoot *common.Hash `json:"parentBeaconBlockRoot"` - Version *math.HexOrDecimal64 `json:"version"` - ErrorCode *int64 `json:"errorCode,string"` - } - var dec engineNewPayload - if err := json.Unmarshal(input, &dec); err != nil { - return err - } - if dec.Payload != nil { - e.Payload = dec.Payload - } - if dec.BlobVersionedHashes != nil { - e.BlobVersionedHashes = dec.BlobVersionedHashes - } - if dec.ParentBeaconBlockRoot != nil { - e.ParentBeaconBlockRoot = dec.ParentBeaconBlockRoot - } - if dec.Version != nil { - e.Version = uint64(*dec.Version) - } - if dec.ErrorCode != nil { - e.ErrorCode = *dec.ErrorCode - } - return nil -} diff --git a/simulators/ethereum/pyspec/gen_gb.go b/simulators/ethereum/pyspec/gen_gb.go new file mode 100644 index 0000000000..09b9e4bea6 --- /dev/null +++ b/simulators/ethereum/pyspec/gen_gb.go @@ -0,0 +1,100 @@ +// Code generated by github.com/fjl/gencodec. DO NOT EDIT. + +package main + +import ( + "encoding/json" + "math/big" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/common/math" + "github.com/ethereum/go-ethereum/core/types" +) + +var _ = (*genesisBlockUnmarshaling)(nil) + +// MarshalJSON marshals as JSON. +func (g genesisBlock) MarshalJSON() ([]byte, error) { + type genesisBlock struct { + Coinbase common.Address `json:"coinbase"` + Difficulty *math.HexOrDecimal256 `json:"difficulty"` + GasLimit math.HexOrDecimal64 `json:"gasLimit"` + Timestamp *math.HexOrDecimal256 `json:"timestamp"` + ExtraData hexutil.Bytes `json:"extraData"` + MixHash common.Hash `json:"mixHash"` + Nonce types.BlockNonce `json:"nonce"` + BaseFee *math.HexOrDecimal256 `json:"baseFeePerGas"` + BlobGasUsed *math.HexOrDecimal64 `json:"blobGasUsed"` + ExcessBlobGas *math.HexOrDecimal64 `json:"excessBlobGas"` + Hash common.Hash `json:"hash"` + } + var enc genesisBlock + enc.Coinbase = g.Coinbase + enc.Difficulty = (*math.HexOrDecimal256)(g.Difficulty) + enc.GasLimit = math.HexOrDecimal64(g.GasLimit) + enc.Timestamp = (*math.HexOrDecimal256)(g.Timestamp) + enc.ExtraData = g.ExtraData + enc.MixHash = g.MixHash + enc.Nonce = g.Nonce + enc.BaseFee = (*math.HexOrDecimal256)(g.BaseFee) + enc.BlobGasUsed = (*math.HexOrDecimal64)(g.BlobGasUsed) + enc.ExcessBlobGas = (*math.HexOrDecimal64)(g.ExcessBlobGas) + enc.Hash = g.Hash + return json.Marshal(&enc) +} + +// UnmarshalJSON unmarshals from JSON. +func (g *genesisBlock) UnmarshalJSON(input []byte) error { + type genesisBlock struct { + Coinbase *common.Address `json:"coinbase"` + Difficulty *math.HexOrDecimal256 `json:"difficulty"` + GasLimit *math.HexOrDecimal64 `json:"gasLimit"` + Timestamp *math.HexOrDecimal256 `json:"timestamp"` + ExtraData *hexutil.Bytes `json:"extraData"` + MixHash *common.Hash `json:"mixHash"` + Nonce *types.BlockNonce `json:"nonce"` + BaseFee *math.HexOrDecimal256 `json:"baseFeePerGas"` + BlobGasUsed *math.HexOrDecimal64 `json:"blobGasUsed"` + ExcessBlobGas *math.HexOrDecimal64 `json:"excessBlobGas"` + Hash *common.Hash `json:"hash"` + } + var dec genesisBlock + if err := json.Unmarshal(input, &dec); err != nil { + return err + } + if dec.Coinbase != nil { + g.Coinbase = *dec.Coinbase + } + if dec.Difficulty != nil { + g.Difficulty = (*big.Int)(dec.Difficulty) + } + if dec.GasLimit != nil { + g.GasLimit = uint64(*dec.GasLimit) + } + if dec.Timestamp != nil { + g.Timestamp = (*big.Int)(dec.Timestamp) + } + if dec.ExtraData != nil { + g.ExtraData = *dec.ExtraData + } + if dec.MixHash != nil { + g.MixHash = *dec.MixHash + } + if dec.Nonce != nil { + g.Nonce = *dec.Nonce + } + if dec.BaseFee != nil { + g.BaseFee = (*big.Int)(dec.BaseFee) + } + if dec.BlobGasUsed != nil { + g.BlobGasUsed = (*uint64)(dec.BlobGasUsed) + } + if dec.ExcessBlobGas != nil { + g.ExcessBlobGas = (*uint64)(dec.ExcessBlobGas) + } + if dec.Hash != nil { + g.Hash = *dec.Hash + } + return nil +} diff --git a/simulators/ethereum/pyspec/gen_txs.go b/simulators/ethereum/pyspec/gen_txs.go deleted file mode 100644 index 9dd464ee33..0000000000 --- a/simulators/ethereum/pyspec/gen_txs.go +++ /dev/null @@ -1,142 +0,0 @@ -// Code generated by github.com/fjl/gencodec. DO NOT EDIT. - -package main - -import ( - "encoding/json" - "math/big" - - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/common/hexutil" - "github.com/ethereum/go-ethereum/common/math" - "github.com/ethereum/go-ethereum/core/types" -) - -var _ = (*transactionUnmarshaling)(nil) - -// MarshalJSON marshals as JSON. -func (t transaction) MarshalJSON() ([]byte, error) { - type transaction struct { - Type *math.HexOrDecimal64 `json:"type"` - ChainId *math.HexOrDecimal256 `json:"chainId"` - Nonce math.HexOrDecimal64 `json:"nonce"` - GasPrice *math.HexOrDecimal256 `json:"gasPrice"` - MaxPriorityFeePerGas *math.HexOrDecimal256 `json:"maxPriorityFeePerGas"` - MaxFeePerGas *math.HexOrDecimal256 `json:"maxFeePerGas"` - Gas math.HexOrDecimal64 `json:"gasLimit"` - Value *math.HexOrDecimal256 `json:"value"` - Input hexutil.Bytes `json:"data"` - To string `json:"to"` - Protected bool `json:"protected"` - AccessList *types.AccessList `json:"accessList"` - SecretKey *common.Hash `json:"secretKey"` - V *math.HexOrDecimal256 `json:"v"` - R *math.HexOrDecimal256 `json:"r"` - S *math.HexOrDecimal256 `json:"s"` - MaxFeePerDataGas *math.HexOrDecimal256 `json:"maxFeePerDataGas"` - BlobVersionedHashes []*common.Hash `json:"blobVersionedHashes"` - } - var enc transaction - enc.Type = (*math.HexOrDecimal64)(t.Type) - enc.ChainId = (*math.HexOrDecimal256)(t.ChainId) - enc.Nonce = math.HexOrDecimal64(t.Nonce) - enc.GasPrice = (*math.HexOrDecimal256)(t.GasPrice) - enc.MaxPriorityFeePerGas = (*math.HexOrDecimal256)(t.MaxPriorityFeePerGas) - enc.MaxFeePerGas = (*math.HexOrDecimal256)(t.MaxFeePerGas) - enc.Gas = math.HexOrDecimal64(t.Gas) - enc.Value = (*math.HexOrDecimal256)(t.Value) - enc.Input = t.Input - enc.To = t.To - enc.Protected = t.Protected - enc.AccessList = t.AccessList - enc.SecretKey = t.SecretKey - enc.V = (*math.HexOrDecimal256)(t.V) - enc.R = (*math.HexOrDecimal256)(t.R) - enc.S = (*math.HexOrDecimal256)(t.S) - enc.MaxFeePerDataGas = (*math.HexOrDecimal256)(t.MaxFeePerDataGas) - enc.BlobVersionedHashes = t.BlobVersionedHashes - return json.Marshal(&enc) -} - -// UnmarshalJSON unmarshals from JSON. -func (t *transaction) UnmarshalJSON(input []byte) error { - type transaction struct { - Type *math.HexOrDecimal64 `json:"type"` - ChainId *math.HexOrDecimal256 `json:"chainId"` - Nonce *math.HexOrDecimal64 `json:"nonce"` - GasPrice *math.HexOrDecimal256 `json:"gasPrice"` - MaxPriorityFeePerGas *math.HexOrDecimal256 `json:"maxPriorityFeePerGas"` - MaxFeePerGas *math.HexOrDecimal256 `json:"maxFeePerGas"` - Gas *math.HexOrDecimal64 `json:"gasLimit"` - Value *math.HexOrDecimal256 `json:"value"` - Input *hexutil.Bytes `json:"data"` - To *string `json:"to"` - Protected *bool `json:"protected"` - AccessList *types.AccessList `json:"accessList"` - SecretKey *common.Hash `json:"secretKey"` - V *math.HexOrDecimal256 `json:"v"` - R *math.HexOrDecimal256 `json:"r"` - S *math.HexOrDecimal256 `json:"s"` - MaxFeePerDataGas *math.HexOrDecimal256 `json:"maxFeePerDataGas"` - BlobVersionedHashes []*common.Hash `json:"blobVersionedHashes"` - } - var dec transaction - if err := json.Unmarshal(input, &dec); err != nil { - return err - } - if dec.Type != nil { - t.Type = (*uint64)(dec.Type) - } - if dec.ChainId != nil { - t.ChainId = (*big.Int)(dec.ChainId) - } - if dec.Nonce != nil { - t.Nonce = uint64(*dec.Nonce) - } - if dec.GasPrice != nil { - t.GasPrice = (*big.Int)(dec.GasPrice) - } - if dec.MaxPriorityFeePerGas != nil { - t.MaxPriorityFeePerGas = (*big.Int)(dec.MaxPriorityFeePerGas) - } - if dec.MaxFeePerGas != nil { - t.MaxFeePerGas = (*big.Int)(dec.MaxFeePerGas) - } - if dec.Gas != nil { - t.Gas = uint64(*dec.Gas) - } - if dec.Value != nil { - t.Value = (*big.Int)(dec.Value) - } - if dec.Input != nil { - t.Input = *dec.Input - } - if dec.To != nil { - t.To = *dec.To - } - if dec.Protected != nil { - t.Protected = *dec.Protected - } - if dec.AccessList != nil { - t.AccessList = dec.AccessList - } - if dec.SecretKey != nil { - t.SecretKey = dec.SecretKey - } - if dec.V != nil { - t.V = (*big.Int)(dec.V) - } - if dec.R != nil { - t.R = (*big.Int)(dec.R) - } - if dec.S != nil { - t.S = (*big.Int)(dec.S) - } - if dec.MaxFeePerDataGas != nil { - t.MaxFeePerDataGas = (*big.Int)(dec.MaxFeePerDataGas) - } - if dec.BlobVersionedHashes != nil { - t.BlobVersionedHashes = dec.BlobVersionedHashes - } - return nil -} diff --git a/simulators/ethereum/pyspec/gen_wds.go b/simulators/ethereum/pyspec/gen_wds.go deleted file mode 100644 index 44bbf8084f..0000000000 --- a/simulators/ethereum/pyspec/gen_wds.go +++ /dev/null @@ -1,55 +0,0 @@ -// Code generated by github.com/fjl/gencodec. DO NOT EDIT. - -package main - -import ( - "encoding/json" - - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/common/math" -) - -var _ = (*withdrawalsUnmarshaling)(nil) - -// MarshalJSON marshals as JSON. -func (w withdrawals) MarshalJSON() ([]byte, error) { - type withdrawals struct { - Index math.HexOrDecimal64 `json:"index"` - ValidatorIndex math.HexOrDecimal64 `json:"validatorIndex"` - Address common.Address `json:"address"` - Amount math.HexOrDecimal64 `json:"amount"` - } - var enc withdrawals - enc.Index = math.HexOrDecimal64(w.Index) - enc.ValidatorIndex = math.HexOrDecimal64(w.ValidatorIndex) - enc.Address = w.Address - enc.Amount = math.HexOrDecimal64(w.Amount) - return json.Marshal(&enc) -} - -// UnmarshalJSON unmarshals from JSON. -func (w *withdrawals) UnmarshalJSON(input []byte) error { - type withdrawals struct { - Index *math.HexOrDecimal64 `json:"index"` - ValidatorIndex *math.HexOrDecimal64 `json:"validatorIndex"` - Address *common.Address `json:"address"` - Amount *math.HexOrDecimal64 `json:"amount"` - } - var dec withdrawals - if err := json.Unmarshal(input, &dec); err != nil { - return err - } - if dec.Index != nil { - w.Index = uint64(*dec.Index) - } - if dec.ValidatorIndex != nil { - w.ValidatorIndex = uint64(*dec.ValidatorIndex) - } - if dec.Address != nil { - w.Address = *dec.Address - } - if dec.Amount != nil { - w.Amount = uint64(*dec.Amount) - } - return nil -} diff --git a/simulators/ethereum/pyspec/main.go b/simulators/ethereum/pyspec/main.go index 5a3f14585c..545f2bc210 100644 --- a/simulators/ethereum/pyspec/main.go +++ b/simulators/ethereum/pyspec/main.go @@ -20,12 +20,9 @@ import ( func main() { suite := hivesim.Suite{ Name: "pyspec", - Description: "The 'pyspec' test suite runs every test fixture from " + - "the execution-spec-tests repository (https://github.com/ethereum/execution-spec-tests)" + - "against each client specified in the hive simulation run for forks >= Merge. " + - "The clients are first fed a fixture genesis field, followed by each fixture block. " + - "The last valid block is then queried for its storage, nonce & balance, that are compared" + - "against the expected values from the test fixture file. This is all achieved using the EngineAPI.", + Description: "The pyspec test suite runs every fixture from " + + "the execution-spec-tests repo (https://github.com/ethereum/execution-spec-tests) where the fork >= Merge. " + + "For each test clients are first fed the fixture genesis data followed by engine new payloads specfic to the test.", } suite.Add(hivesim.TestSpec{ Name: "pytest_fixture_runner", @@ -121,14 +118,12 @@ func fixtureRunner(t *hivesim.T) { // repoLink coverts a pyspec test path into a github repository link. func repoLink(testPath string) string { - // Example for withdrawals_zero_amout.json: - // Converts '/fixtures/withdrawals/withdrawals/withdrawals_zero_amount.json' - // into 'fillers/withdrawals/withdrawals.py', - // and appends onto main branch repo link. - filePath := strings.Replace(testPath, "/fixtures", "fillers", -1) - fileDir := strings.TrimSuffix(filePath, "/"+filepath.Base(filePath)) + ".py" - repoLink := fmt.Sprintf( - "https://github.com/ethereum/execution-spec-tests/blob/main/%v", - fileDir) + // Example: Converts '/fixtures/cancun/eip4844_blobs/blob_txs/invalid_normal_gas.json' + // into 'tests/cancun/eip4844_blobs/test_blob_txs.py', and appends onto main branch repo link. + filePath := strings.Replace(testPath, "/fixtures", "tests", -1) + fileDir := filepath.Dir(filePath) + fileBase := filepath.Base(fileDir) + fileName := filepath.Join(filepath.Dir(fileDir), "test_"+fileBase+".py") + repoLink := fmt.Sprintf("https://github.com/ethereum/execution-spec-tests/tree/main/%v", fileName) return repoLink } diff --git a/simulators/ethereum/pyspec/runner.go b/simulators/ethereum/pyspec/runner.go index 02168d5b82..4c6d7a9a19 100644 --- a/simulators/ethereum/pyspec/runner.go +++ b/simulators/ethereum/pyspec/runner.go @@ -1,7 +1,6 @@ package main import ( - "bytes" "context" "errors" "fmt" @@ -20,6 +19,8 @@ import ( "github.com/ethereum/hive/hivesim" "github.com/ethereum/hive/simulators/ethereum/engine/client/hive_rpc" "github.com/ethereum/hive/simulators/ethereum/engine/globals" + + typ "github.com/ethereum/hive/simulators/ethereum/engine/types" ) // loadFixtureTests extracts tests from fixture.json files in a given directory, @@ -49,7 +50,7 @@ func loadFixtureTests(t *hivesim.T, root string, re *regexp.Regexp, fn func(test // create testcase structure from fixtureTests for name, fixture := range fixtureTests { // skip networks post merge or not supported - network := fixture.json.Network + network := fixture.json.Fork if _, exist := envForks[network]; !exist { continue } @@ -123,35 +124,27 @@ func (tc *testcase) run(t *hivesim.T) { // send payloads and check response latestValidHash := common.Hash{} - latestVersion := uint64(1) - for i, engineNewPayload := range tc.payloads { - // execute fixture block payload - ed, err := engineNewPayload.ToExecutableData() - if err != nil { - tc.failedErr = err - t.Fatalf("unable to convert engineNewPayload to executableData: %v", err) - } + for _, engineNewPayload := range tc.engineNewPayloads { plStatus, plErr := engineClient.NewPayload( context.Background(), int(engineNewPayload.Version), - ed, + engineNewPayload.HiveExecutionPayload, ) - latestVersion = engineNewPayload.Version // check for rpc errors and compare error codes - fxErrCode := int(tc.fixture.json.Blocks[i].EngineNewPayload.ErrorCode) - if fxErrCode != 0 { - checkRPCErrors(plErr, fxErrCode, t, tc) + errCode := int(engineNewPayload.ErrorCode) + if errCode != 0 { + checkRPCErrors(plErr, errCode, t, tc) continue } // set expected payload return status expectedStatus := "VALID" - if tc.fixture.json.Blocks[i].Exception != "" { + if !engineNewPayload.Valid { expectedStatus = "INVALID" } // check payload status matches expected if plStatus.Status != expectedStatus { tc.failedErr = fmt.Errorf("payload status mismatch: client returned %v and fixture expected %v", plStatus.Status, expectedStatus) - t.Fatalf("payload status mismatch: client returned %v\n fixture expected %v\n", plStatus.Status, expectedStatus, tc.name) + t.Fatalf("payload status mismatch: client returned %v fixture expected %v", plStatus.Status, expectedStatus) } // update latest valid block hash if payload status is VALID if plStatus.Status == "VALID" { @@ -164,9 +157,7 @@ func (tc *testcase) run(t *hivesim.T) { if latestValidHash != (common.Hash{}) { // update with latest valid response fcState := &api.ForkchoiceStateV1{HeadBlockHash: latestValidHash} - // TODO: This is incorrect, up to this point, the `engine_forkchoiceUpdated` and `engine_newPayload` versions for each - // fork match, but it could change in the future. Ideally we should embed the version in the fixture. - if _, fcErr := engineClient.ForkchoiceUpdated(ctx, int(latestVersion), fcState, nil); fcErr != nil { + if _, fcErr := engineClient.ForkchoiceUpdated(ctx, int(tc.fixture.json.EngineFcuVersion), fcState, nil); fcErr != nil { tc.failedErr = fcErr t.Fatalf("unable to update head of beacon chain in test %s: %v ", tc.name, fcErr) } @@ -215,8 +206,7 @@ func (tc *testcase) run(t *hivesim.T) { for _, key := range keys { if genesisAccount.Storage[key] != *gotStorage[key] { tc.failedErr = errors.New("storage recieved doesn't match expected from fixture") - t.Errorf(`storage recieved from account %v doesn't match expected from fixture in test %s: - from storage address: %v + t.Errorf(`storage recieved from account %v doesn't match expected from fixture in test %s: from storage address: %v recieved from block: %v expected in fixture: %v`, account, tc.name, key, gotStorage[key], genesisAccount.Storage[key]) } @@ -240,7 +230,7 @@ func (tc *testcase) run(t *hivesim.T) { // updateEnv updates the environment variables against the fork rules // defined in envForks, for the network specified in the testcase fixture. func (tc *testcase) updateEnv(env hivesim.Params) { - forkRules := envForks[tc.fixture.json.Network] + forkRules := envForks[tc.fixture.json.Fork] for k, v := range forkRules { env[k] = fmt.Sprintf("%d", v) } @@ -248,35 +238,21 @@ func (tc *testcase) updateEnv(env hivesim.Params) { // extractFixtureFields extracts the genesis, post allocation and payload // fields from the given fixture test and stores them in the testcase struct. -func (tc *testcase) extractFixtureFields(fixture fixtureJSON) error { - var err error - tc.genesis, err = extractGenesis(fixture) - if err != nil { - return err +func (tc *testcase) extractFixtureFields(fixture fixtureJSON) (err error) { + if tc.genesis, err = extractGenesis(fixture); err != nil { + return fmt.Errorf("failed to extract genesis: %w", err) } - tc.postAlloc = &fixture.Post - var engineNewPayloads []*engineNewPayload - for _, bl := range fixture.Blocks { - if bl.EngineNewPayload == nil { - return errors.New("engineNewPayload is nil") - } - engineNewPayloads = append(engineNewPayloads, bl.EngineNewPayload) + if tc.engineNewPayloads, err = extractEngineNewPayloads(fixture); err != nil { + return fmt.Errorf("failed to extract engineNewPayloads: %w", err) } - tc.payloads = engineNewPayloads + tc.postAlloc = &fixture.Post return nil } -// extractGenesis extracts the genesis block information from the given fixture -// and returns a core.Genesis struct containing the extracted information. +// extracts the genesis block information from the given fixture. func extractGenesis(fixture fixtureJSON) (*core.Genesis, error) { - if fixture.Genesis.BeaconRoot != nil { - emptyHash := common.Hash{} - if !bytes.Equal(fixture.Genesis.BeaconRoot[:], emptyHash[:]) { - return nil, errors.New("beacon root in genesis is not empty") - } - } genesis := &core.Genesis{ - Config: tests.Forks[fixture.Network], + Config: tests.Forks[fixture.Fork], Coinbase: fixture.Genesis.Coinbase, Difficulty: fixture.Genesis.Difficulty, GasLimit: fixture.Genesis.GasLimit, @@ -292,7 +268,24 @@ func extractGenesis(fixture fixtureJSON) (*core.Genesis, error) { return genesis, nil } -// checkRPCErrors checks for RPC errors and compares error codes if expected. +// extracts all the engineNewPayload information from the given fixture. +func extractEngineNewPayloads(fixture fixtureJSON) ([]engineNewPayload, error) { + var engineNewPayloads []engineNewPayload + for _, engineNewPayload := range fixture.EngineNewPayloads { + engineNewPayload := engineNewPayload + hiveExecutionPayload, err := typ.FromBeaconExecutableData(engineNewPayload.ExecutionPayload) + if err != nil { + return nil, errors.New("executionPayload param within engineNewPayload is invalid") + } + hiveExecutionPayload.VersionedHashes = &engineNewPayload.BlobVersionedHashes + hiveExecutionPayload.ParentBeaconBlockRoot = engineNewPayload.ParentBeaconBlockRoot + engineNewPayload.HiveExecutionPayload = &hiveExecutionPayload + engineNewPayloads = append(engineNewPayloads, engineNewPayload) + } + return engineNewPayloads, nil +} + +// checks for RPC errors and compares error codes if expected. func checkRPCErrors(plErr error, fxErrCode int, t *hivesim.T, tc *testcase) { rpcErr, isRpcErr := plErr.(rpc.Error) if isRpcErr { diff --git a/simulators/ethereum/pyspec/types.go b/simulators/ethereum/pyspec/types.go index c774c0f584..63486948ea 100644 --- a/simulators/ethereum/pyspec/types.go +++ b/simulators/ethereum/pyspec/types.go @@ -21,10 +21,10 @@ type testcase struct { clientType string failedErr error // test fixture data - fixture fixtureTest - genesis *core.Genesis - postAlloc *core.GenesisAlloc - payloads []*engineNewPayload + fixture fixtureTest + genesis *core.Genesis + postAlloc *core.GenesisAlloc + engineNewPayloads []engineNewPayload } type fixtureTest struct { @@ -39,63 +39,33 @@ func (t *fixtureTest) UnmarshalJSON(in []byte) error { } type fixtureJSON struct { - Blocks []block `json:"blocks"` - Genesis blockHeader `json:"genesisBlockHeader"` - Pre core.GenesisAlloc `json:"pre"` - Post core.GenesisAlloc `json:"postState"` - BestBlock common.UnprefixedHash `json:"lastblockhash"` - Network string `json:"network"` - SealEngine string `json:"sealEngine"` + Fork string `json:"network"` + Genesis genesisBlock `json:"genesisBlockHeader"` + EngineNewPayloads []engineNewPayload `json:"engineNewPayloads"` + EngineFcuVersion math.HexOrDecimal64 `json:"engineFcuVersion"` + Pre core.GenesisAlloc `json:"pre"` + Post core.GenesisAlloc `json:"postState"` } -type block struct { - Rlp string `json:"rlp"` - BlockHeader *blockHeader `json:"blockHeader"` - Transactions []transaction `json:"transactions"` - UncleHeaders []byte `json:"uncleHeaders"` - Withdrawals []withdrawals `json:"withdrawals"` - Exception string `json:"expectException"` - EngineNewPayload *engineNewPayload `json:"engineNewPayload"` +//go:generate go run github.com/fjl/gencodec -type genesisBlock -field-override genesisBlockUnmarshaling -out gen_gb.go +type genesisBlock struct { + Coinbase common.Address `json:"coinbase"` + Difficulty *big.Int `json:"difficulty"` + GasLimit uint64 `json:"gasLimit"` + Timestamp *big.Int `json:"timestamp"` + ExtraData []byte `json:"extraData"` + MixHash common.Hash `json:"mixHash"` + Nonce types.BlockNonce `json:"nonce"` + BaseFee *big.Int `json:"baseFeePerGas"` + BlobGasUsed *uint64 `json:"blobGasUsed"` + ExcessBlobGas *uint64 `json:"excessBlobGas"` + + Hash common.Hash `json:"hash"` } -//go:generate go run github.com/fjl/gencodec -type blockHeader -field-override blockHeaderUnmarshaling -out gen_bh.go -//go:generate go run github.com/fjl/gencodec -type transaction -field-override transactionUnmarshaling -out gen_txs.go -//go:generate go run github.com/fjl/gencodec -type withdrawals -field-override withdrawalsUnmarshaling -out gen_wds.go -//go:generate go run github.com/fjl/gencodec -type engineNewPayload -field-override engineNewPayloadUnmarshaling -out gen_enp.go -type blockHeader struct { - ParentHash common.Hash `json:"parentHash"` - UncleHash common.Hash `json:"sha3Uncles"` - UncleHashAlt common.Hash `json:"uncleHash"` // name in fixtures - Coinbase common.Address `json:"coinbase"` - CoinbaseAlt common.Address `json:"author"` // nethermind name - CoinbaseAlt2 common.Address `json:"miner"` // geth/besu name - StateRoot common.Hash `json:"stateRoot"` - TransactionTrie common.Hash `json:"transactionRoot"` - TransactionTrieAlt common.Hash `json:"transactionTrie"` // name in fixtures - ReceiptTrie common.Hash `json:"receiptsRoot"` - ReceiptTrieAlt common.Hash `json:"receiptTrie"` // name in fixtures - Bloom types.Bloom `json:"bloom"` - Difficulty *big.Int `json:"difficulty"` - Number *big.Int `json:"number"` - GasLimit uint64 `json:"gasLimit"` - GasUsed uint64 `json:"gasUsed"` - Timestamp *big.Int `json:"timestamp"` - ExtraData []byte `json:"extraData"` - MixHash common.Hash `json:"mixHash"` - Nonce types.BlockNonce `json:"nonce"` - BaseFee *big.Int `json:"baseFeePerGas"` - Hash common.Hash `json:"hash"` - WithdrawalsRoot common.Hash `json:"withdrawalsRoot"` - BlobGasUsed *uint64 `json:"blobGasUsed"` - ExcessBlobGas *uint64 `json:"excessBlobGas"` - BeaconRoot *common.Hash `json:"parentBeaconBlockRoot"` -} - -type blockHeaderUnmarshaling struct { +type genesisBlockUnmarshaling struct { Difficulty *math.HexOrDecimal256 `json:"difficulty"` - Number *math.HexOrDecimal256 `json:"number"` GasLimit math.HexOrDecimal64 `json:"gasLimit"` - GasUsed math.HexOrDecimal64 `json:"gasUsed"` Timestamp *math.HexOrDecimal256 `json:"timestamp"` ExtraData hexutil.Bytes `json:"extraData"` BaseFee *math.HexOrDecimal256 `json:"baseFeePerGas"` @@ -103,74 +73,13 @@ type blockHeaderUnmarshaling struct { ExcessBlobGas *math.HexOrDecimal64 `json:"excessDataGas"` } -type transaction struct { - Type *uint64 `json:"type"` - ChainId *big.Int `json:"chainId"` - Nonce uint64 `json:"nonce"` - GasPrice *big.Int `json:"gasPrice"` - MaxPriorityFeePerGas *big.Int `json:"maxPriorityFeePerGas"` - MaxFeePerGas *big.Int `json:"maxFeePerGas"` - Gas uint64 `json:"gasLimit"` - Value *big.Int `json:"value"` - Input []byte `json:"data"` - To string `json:"to"` - Protected bool `json:"protected"` - AccessList *types.AccessList `json:"accessList"` - SecretKey *common.Hash `json:"secretKey"` - V *big.Int `json:"v"` - R *big.Int `json:"r"` - S *big.Int `json:"s"` - MaxFeePerDataGas *big.Int `json:"maxFeePerDataGas"` - BlobVersionedHashes []*common.Hash `json:"blobVersionedHashes"` -} - -type transactionUnmarshaling struct { - Type *math.HexOrDecimal64 `json:"type"` - ChainId *math.HexOrDecimal256 `json:"chainId"` - Nonce math.HexOrDecimal64 `json:"nonce"` - GasPrice *math.HexOrDecimal256 `json:"gasPrice"` - MaxPriorityFeePerGas *math.HexOrDecimal256 `json:"maxPriorityFeePerGas"` - MaxFeePerGas *math.HexOrDecimal256 `json:"maxFeePerGas"` - Gas math.HexOrDecimal64 `json:"gasLimit"` - Value *math.HexOrDecimal256 `json:"value"` - Input hexutil.Bytes `json:"data"` - V *math.HexOrDecimal256 `json:"v"` - R *math.HexOrDecimal256 `json:"r"` - S *math.HexOrDecimal256 `json:"s"` - MaxFeePerDataGas *math.HexOrDecimal256 `json:"maxFeePerDataGas"` -} - -type withdrawals struct { - Index uint64 `json:"index"` - ValidatorIndex uint64 `json:"validatorIndex"` - Address common.Address `json:"address"` - Amount uint64 `json:"amount"` -} - -type withdrawalsUnmarshaling struct { - Index math.HexOrDecimal64 `json:"index"` - ValidatorIndex math.HexOrDecimal64 `json:"validatorIndex"` - Amount math.HexOrDecimal64 `json:"amount"` -} - type engineNewPayload struct { - Payload *api.ExecutableData `json:"executionPayload"` + ExecutionPayload *api.ExecutableData `json:"executionPayload"` BlobVersionedHashes []common.Hash `json:"expectedBlobVersionedHashes"` ParentBeaconBlockRoot *common.Hash `json:"parentBeaconBlockRoot"` - Version uint64 `json:"version"` + Version math.HexOrDecimal64 `json:"version"` + Valid bool `json:"valid"` ErrorCode int64 `json:"errorCode,string"` -} -type engineNewPayloadUnmarshaling struct { - Version math.HexOrDecimal64 `json:"version"` -} - -func (p *engineNewPayload) ToExecutableData() (*typ.ExecutableData, error) { - ed, err := typ.FromBeaconExecutableData(p.Payload) - if err != nil { - return nil, err - } - ed.VersionedHashes = &p.BlobVersionedHashes - ed.ParentBeaconBlockRoot = p.ParentBeaconBlockRoot - return &ed, nil + HiveExecutionPayload *typ.ExecutableData } From f304a080cb34c769187b11aa666a517cda135303 Mon Sep 17 00:00:00 2001 From: Parithosh Jayanthi Date: Fri, 22 Sep 2023 16:20:24 +0200 Subject: [PATCH 040/387] Add reth (#875) Add reth to default cancun config --- configs/cancun.yaml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/configs/cancun.yaml b/configs/cancun.yaml index 1ae2fcbed4..dcaa424089 100644 --- a/configs/cancun.yaml +++ b/configs/cancun.yaml @@ -31,3 +31,10 @@ build_args: github: NethermindEth/nethermind tag: cancun + +- client: reth + nametag: cancun-git + dockerfile: git + build_args: + github: paradigmxyz/reth + tag: main From ecef98afbb704d183a5984cd5b5f2a962d6af445 Mon Sep 17 00:00:00 2001 From: Mario Vega Date: Wed, 20 Sep 2023 18:25:32 +0000 Subject: [PATCH 041/387] clients/prysm-vc: Fix docker args --- clients/prysm-vc/Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/clients/prysm-vc/Dockerfile b/clients/prysm-vc/Dockerfile index 2e0ced7433..98b0395699 100644 --- a/clients/prysm-vc/Dockerfile +++ b/clients/prysm-vc/Dockerfile @@ -1,7 +1,7 @@ -ARG tag=latest-debug ARG baseimage=gcr.io/prysmaticlabs/prysm/validator +ARG tag=latest-debug -FROM $baseimage:$branch as upstream +FROM $baseimage:$tag as upstream FROM debian:buster-slim COPY --from=upstream /app/cmd/validator/validator validator From d7e89c19c4ee6450334b8ae25ce73d86f9f0794a Mon Sep 17 00:00:00 2001 From: Mario Vega Date: Fri, 22 Sep 2023 17:21:19 +0000 Subject: [PATCH 042/387] clients/lodestar-vc: Remove builder option --- clients/lodestar-vc/lodestar_vc.sh | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/clients/lodestar-vc/lodestar_vc.sh b/clients/lodestar-vc/lodestar_vc.sh index c79fe604c9..cc1d01fc70 100755 --- a/clients/lodestar-vc/lodestar_vc.sh +++ b/clients/lodestar-vc/lodestar_vc.sh @@ -32,9 +32,6 @@ case "$HIVE_LOGLEVEL" in 5) LOG=trace ;; esac -builder_option=$([[ "$HIVE_ETH2_BUILDER_ENDPOINT" == "" ]] && echo "" || echo "--builder --suggestedFeeRecipient 0xa94f5374Fce5edBC8E2a8697C15331677e6EbF0B") -echo BUILDER=$builder_option - echo Starting Lodestar Validator Client node /usr/app/node_modules/.bin/lodestar \ @@ -44,6 +41,6 @@ node /usr/app/node_modules/.bin/lodestar \ --paramsFile=/hive/input/config.yaml \ --keystoresDir="/data/validators" \ --secretsDir="/data/secrets" \ - $metrics_option $builder_option \ + $metrics_option \ --beaconNodes="http://$HIVE_ETH2_BN_API_IP:$HIVE_ETH2_BN_API_PORT" From 59e26a6ef3df77a6ecf29d0cabc16d6ca7ce1e70 Mon Sep 17 00:00:00 2001 From: Mario Vega Date: Wed, 20 Sep 2023 18:31:36 +0000 Subject: [PATCH 043/387] clients/teku-bn: Add trusted setup file --- clients/teku-bn/Dockerfile | 2 + clients/teku-bn/teku_bn.sh | 10 +- clients/teku-bn/trusted_setup.txt | 4163 +++++++++++++++++++++++++++++ 3 files changed, 4172 insertions(+), 3 deletions(-) create mode 100644 clients/teku-bn/trusted_setup.txt diff --git a/clients/teku-bn/Dockerfile b/clients/teku-bn/Dockerfile index c722700517..fafc2af649 100644 --- a/clients/teku-bn/Dockerfile +++ b/clients/teku-bn/Dockerfile @@ -10,4 +10,6 @@ RUN chmod +x /opt/teku/bin//teku_bn.sh RUN ./bin/teku --version > /version.txt > /version.txt +ADD trusted_setup.txt /trusted_setup.txt + ENTRYPOINT ["/opt/teku/bin/teku_bn.sh"] diff --git a/clients/teku-bn/teku_bn.sh b/clients/teku-bn/teku_bn.sh index 34eb6af186..7a053fdf6a 100755 --- a/clients/teku-bn/teku_bn.sh +++ b/clients/teku-bn/teku_bn.sh @@ -23,6 +23,10 @@ if [[ "$HIVE_ETH2_SAFE_SLOTS_TO_IMPORT_OPTIMISTICALLY" != "" ]]; then echo "SAFE_SLOTS_TO_IMPORT_OPTIMISTICALLY: $HIVE_ETH2_SAFE_SLOTS_TO_IMPORT_OPTIMISTICALLY" >> /data/testnet_setup/config.yaml fi +trusted_setup_path="/trusted_setup.txt" + +echo "Xtrusted-setup: $trusted_setup_path" >> /data/testnet_setup/config.yaml + echo config.yaml: cat /data/testnet_setup/config.yaml @@ -47,7 +51,6 @@ enr_option=$([[ "$HIVE_ETH2_BOOTNODE_ENRS" == "" ]] && echo "" || echo --p2p-dis static_option=$([[ "$HIVE_ETH2_STATIC_PEERS" == "" ]] && echo "" || echo --p2p-static-peers="$HIVE_ETH2_STATIC_PEERS") opt_sync_option=$([[ "$HIVE_ETH2_SAFE_SLOTS_TO_IMPORT_OPTIMISTICALLY" == "" ]] && echo "" || echo "--Xnetwork-safe-slots-to-import-optimistically=$HIVE_ETH2_SAFE_SLOTS_TO_IMPORT_OPTIMISTICALLY") builder_option=$([[ "$HIVE_ETH2_BUILDER_ENDPOINT" == "" ]] && echo "" || echo "--validators-builder-registration-default-enabled=true --validators-proposer-blinded-blocks-enabled=true --builder-endpoint=$HIVE_ETH2_BUILDER_ENDPOINT") -echo $builder_option if [ "$HIVE_ETH2_MERGE_ENABLED" != "" ]; then echo -n "0x7365637265747365637265747365637265747365637265747365637265747365" > /jwtsecret @@ -55,7 +58,7 @@ if [ "$HIVE_ETH2_MERGE_ENABLED" != "" ]; then fi echo Starting Teku Beacon Node - +/opt/teku/bin/teku --version /opt/teku/bin/teku \ --network=/data/testnet_setup/config.yaml \ --data-path=/data/teku \ @@ -72,4 +75,5 @@ echo Starting Teku Beacon Node --rest-api-enabled=true --rest-api-interface=0.0.0.0 --rest-api-port="${HIVE_ETH2_BN_API_PORT:-4000}" --rest-api-host-allowlist="*" \ --data-storage-mode=ARCHIVE \ --Xstartup-target-peer-count=0 \ - --p2p-subscribe-all-subnets-enabled + --p2p-subscribe-all-subnets-enabled \ + --Xtrusted-setup="$trusted_setup_path" diff --git a/clients/teku-bn/trusted_setup.txt b/clients/teku-bn/trusted_setup.txt new file mode 100644 index 0000000000..26612cb887 --- /dev/null +++ b/clients/teku-bn/trusted_setup.txt @@ -0,0 +1,4163 @@ +4096 +65 +8d0c6eeadd3f8529d67246f77404a4ac2d9d7fd7d50cf103d3e6abb9003e5e36d8f322663ebced6707a7f46d97b7566d +a0d2392f030681c61c2a867862917e10f7678d882034bb89af3db87e6ab3883a304034643dc9688a04e41a5b831582bc +94298073048d70c74f36685e547d04b7311479daa05912e18ead64b2099a194bf48ec344273d58daf0b86b1d8f1d318d +85c4063d13499013dc2ccaa98c1606763e6b1e8cca20922d4cec12ecbaf006ea81ffabe6596d1ac7ba1daf7e63e30898 +84c64bce36c6b5145c6880113366025ab9a8f88e3948d374e27be8b8f9f87402c70fec9b3c621a2d1d26764a84370d0c +8b206c823acf5294552ee54579fac0f45ea15bd273dbacd63b88cd7cddbcce23b56e52f8ea352e1e1d7dcd9b3991b413 +b70aaa4038ba3f5ff306c647b4392d004950c53ad8f6713b5c9c21ac99f5c56cf57323dac500a1f4e9507c4746b07a2f +895f6d1fc70b52f838d81b24f4840729cd5988b649e9d6e6f6dbac4281d8818f39ebdae7e6ea139d7f98a832bd6f29f1 +a71a2832bbaade974c9ef7505dfa24e1ba466a9951b7c2db56886be31c9c7b871f3ee76cb1fcc1aab4b906d6502bc9b5 +9530ba64a21e27834609c00616bc63e8fc2dc7800e478ad728ec39c624f65bbc62cb48f59decb7fbf605ce1920d02622 +8d0609affaf8619bb2f6c80699e5bc7783becbd5973630cdd227ae52d6d701c45f4270becca97701b40279fab588cf64 +8f5d5b4c3bb8dc9a19e5a0f84df6322a79a00c7783c86254197d313a5b35d3965a1f7c0b9c4e39ec1e8f5d02d3aa0862 +96aa47a3ba20b1cfe81eb26bef503225037fdf4c9df53bea1b520841875cd1db6aa8e0f34685da08b55a3ce7289e6de0 +b4c27ee3f4b8c0031837160f0a75632f5b51b5850d52b530096443f54c2b264aeccc5c61b4fcc8de7074475f354fa0d8 +acfd735cda20be1d6f425a7886629c91732fbb5a4e0350ca740a8fb5b39f2001071cec0b2a0f6ca35e1f35a5ea18d00f +ae44d87b1d16d59504c602cbacde2c2791f1520391ca50154e6036d3953ca466cf93d6537da2adb729e6f9f4ffa87853 +97b492872ce44941ea4668ffca83b82fac0f4021bd47e0a5ffeaaacb1b3fc924ee4d53b99f7bcafe0985caf0fbe5d1d3 +b3fbe2f9103d293f49c6c6016d5913f041c9113295397388111a0fdf4245d8edd6e63b9a1a1c9c8f868d6e1988116880 +805efa08fd2046c44c427b225c17bed8a1eb3320cdf94026fdc24c6d345a6cfebfd7475f85d2d1bf22018ca72d2761d3 +9888bae0d83077d1dfde82fdffb1195565c31c519b80cba1e21aba58ee9ccb5677f74bfde13fa5723026514a7d839661 +922e19d2646ba90c9f56278bddf74621cc4518ae2f042fb8245843e87cd82724c6d7c9a99907ac6de5f2187fd2e77cbe +a38f0e1faf97dd1e0804b44e4d150dbfa48318442d1c5255eb0c14ea56b50502f3c7cb216a0336e7c140398088dc01cf +93598ea391c8735799a1d4cd0456f34994ccdf4883fad57419f634f30fee595938bc66b066dade9ae52578818c00d899 +a528dc920734cfaee9feacbc0baa5b73befb1ec6fbd422fcad09a9c1f8f8c40b5ea332b2cf04dc1d6d921e9da9ddfeb4 +b38d45316bf78d11e796a34ee535814e6cde0e642f14108329c5b21f4fec18cd61f84a3025824bb8dc4cbd26b2ecc9bf +8eec35a7404c9a35dc6ad0260b7f0f7fd1bfe92a2e08bc72548b99ed9acdc378728a8ea9c6879a6e47e37edb0d28c193 +a68a4446274ccd947c61bf736c5219dad680b99c6085a26719793e0d9dab26d5f8a0b28e71be6e1b9ea4ae39139f7f57 +a0acb543f41ad12e3b2e096629ccdd719a001d0ff53bb151e9a37aa57852f7275a7bbd06dc2a06af9144524548164af5 +b271e74cdbcf8b9143f8472174bdb068c23308ea807c60a554c185f7be6f231aac13347139837514171a876dfac5baa5 +8195a460719000cd1df379ebbf7918f71301a50a2fa587505cc5b8c4534c3d2343f63d28e7ee991d7a1cebb15d380696 +96202b60426773e8731dcbedbf613477f65940a19fb4be0f4f742b0c76ae9d88ecdb6d36cd4f12bb404dd5d360c819e2 +b0a80fe60b71ca9e80157138de8787b8a786326179604b8a15a744e52662645987e5f859ef5c76492d560daf4624b9a7 +a331ea8adf87daa5e2d458d0113c307edae1a84927bca7d484aca5f8c1b6378ab42981c44b0d916d7249f4b475f926f1 +aa1a8f59ae0912abf191ea7e209ff401628278dfb2269db6d87cf33bd52af3dbffbe96513a8b210e965c853a554b787a +ac4f4a0e1b1a155e1f22a9085b0b047fe54c8437dbbb8e9720fd6b0cdd76557d19ca2e885a48890f0247b1a72be0e287 +a428465505eac7b9660eb0d495a7a00c8cc238de3a02ebbd2eb07e502e9868086e9584b59953cf1480c0b781295db339 +b7b77e21e08f6357cbd3dcd3035c3e8ec84cdfa13c7baef6c67e0ef43095e61fd549694263d7def8b8adc3a0fdcc7987 +abb991d17c5bdd264c592c55101e265cb3210c4157aee4079173fd51da1e0199eed1d6c890aab95817ec078561d771af +846a8e4f801faf5fbec078b09c362ee30a00b2b58a4871744d03cd118b913464233ff926e52b0c75fbfcf098ad25a1e6 +947e91ffa32f38c1ccb72cca4bfabaee9e63ab74a16f034cabba25e462f7331ebe5a7ba393f69e91830415fa75b1b52e +8dc5e26adc693f4e300cab7385edca1a2fe14c8ee6dc0cd6d013cb5aa154dc380e9e81e259cbc59c1f38f7c4a57f1c7d +9818ef6605d6ea3b7bf4da5c6d6d8ed540bb94df4d14c974e1b79ed2fd1a0b897b8cf1ff671a181a697effd66b1644a5 +b5eab6baf03af994fc32cc9dce388394c18c01cdafe7909fde948f3e00a72dc8f30d15977d0f114bd7c140f5f94cf005 +83b2e9858d3b929f9a2ad66a91a2c0c44d15d288c17c12a1614301a6f2d61d31eaa540ca7781520fe4420afae0ec0208 +ab338fbd38bce4d1b7a759f71e5e5673746c52846eff3d0b6825e390aeeca8f9f123ee88c78fe4d520cc415cbae32bf1 +81adb6322b8db95d1711304e5b59f37640ca88c03e6c7e15de932be5267dff7351fa17664113ecc528e8920f5bfdc0d1 +89e2e0c0d769e4107232df741678a6bacb041d0154385450aaca8be9c3c18c42f817373962e7569d33935c35666a8a6a +8f0756fea8b34a2b471ec39e4448a6a6935e5432ec2859d222964a4c82777a340e1d702777aeb946fa405afc0438221a +a2bf90c505a6f03b3dd09d04e1e7cf301fe3415b273e263f15fdfe5d0e40f619b95e8bf00916d3eaa7d7f8c0bae41c8e +91d5c76b5542637588cd47279d0bd74a25dbda0d8ec0ff68b62d7e01e34a63fc3e06d116ee75c803864b1cf330f6c360 +a9958c388d25315a979566174b0622446335cb559aff1992bd71910c47497536019c6854d31c0e22df07505963fc44ff +91d82b09d5726077eed6c19bcb398abe79d87ce16c413df6bf5932b8fd64b4c0fd19c9bf0fa8db657a4a4d4c0d8f5a2d +ac6e0a86e0ee416855c3e9eef2526c43835f5245527ed0038bc83b4fcadb4ea5beb91143cc674486681a9f0e63f856b1 +aaf00d6efd0c6efb9f7d6a42555abec05c5af8f324e2e579fc2ac83bdc937cc682d9bc2ffd250619c8bb098b8c84db80 +963f5fcd8476d0dbeb03a62cde40e3deee25f55e7ded7572d8884975f38eddc5406fc4b0adff602a1cca90f7205a7fdc +a3805ee01512f644d2679511bd8607890ee9721e75ac9a85ab9fd6fceb1308d5b9b0e9907686b4e683b34aed0f34cd81 +a483d7708465cd4e33b4407fe82c84ef6bc7fa21475d961fe2e99802d0c999b6474ef7a46dd615b219c9c7e9faec45ee +b6b5f9456f12d6781c41f17cdc9d259f9515994d5dee49bb701a33fa2e8dcbb2c8c13f822b51ad232fc5e05bff2f68ef +8766b721b0cf9b1a42614c7d29aad2d89da4996dc9e2a3baeba4b33ca74100ab0b83f55c546c963e3b6af1dcf9ca067c +ac5e8da1154cf4be8df2bbd2e212b7f8077099b2010c99e739441198f65337c6f7ef0d9136453a7668fde6e1389c32c7 +a9d6d2c8845e5f1fec183c5153f1f6e23421e28ce0c86b0ce993b30b87869065acad9e6d9927d9f03c590852821b2f9c +a320ca07c44f7ea3ff858fe18395a86f59559617f13ec96d1e8b4a3f01d9c066a45c8d8cf8f1f14a360bb774d55f5f18 +b3adb00e1312dce73b74fbd2ea16f0fb0085bd0db10772e9c260e9ed9f8829ff690e3dfffacaddc8233d484bb69778b3 +87b0c8d8a167d5199d0b0743c20fb83ec8a1c442f0204bcc53bf292ba382bef58a58a6d1e2467920e32c290fdc6dae7c +a74fa436a5adc280a68e0c56b28ac33647bdfc8c5326f4c99db6dbd1b98d91afb1f41f5fffd6bcc31c1f8789c148e2db +8a37349e4ba7558965077f7f9d839c61b7dcb857fcc7965c76a64a75e377bfea8cd09b7a269ce602cc4472affc483b69 +8af813f62c5962ff96bf73e33f47fd5a8e3e55651d429e77d2ce64a63c535ecc5cfc749bb120c489b7ea1d9b2a5d233c +833021445b7d9817caa33d6853fa25efc38e9d62494d209627d26799432ea7b87a96de4694967151abc1252dd2d04dfc +8f78a715107e0ace3a41bff0385fd75c13bf1250f9e5ddecf39e81bacc1244b978e3464892f7fb2596957855b8bf9fc7 +aed144134dc1cc6c671f70ebe71a3aadf7511eea382969bc5d499a678d2d8ce249ebf1a06b51183f61413eba0517012b +b39a53e82c5553943a5e45bc5116d8672ec44bed96b3541dead40344b287a7b02dbf7107372effb067edd946f47de500 +b383844c3b20a8bc06098046ec6b406df9419ad86fac4a000905c01325426903a5e369af856d71ccd52fea362ed29db5 +83815a7098283723eec6aa6451b5d99578bf28a02971375a1fe90c15a20963e129372ac4af7b306ee2e7316472c5d66d +b426b4e185806a31febd745fa8d26b6397832a04e33c9a7eb460cbf302b4c134a8a01d4e5e40bc9b73296c539e60b3ca +a6cabf8205711457e6363ef4379ebc1226001e1aaea3002b25bfd9e173f4368002f4461e79eeb9f4aa46f1b56c739ab9 +a6e88ab01282313269cd2d8c0df1a79dada5b565d6623900af9e7e15351de2b0105cc55d3e9080e1e41efe48be32a622 +b2b106db3d56d189ea57afa133ae4941b4eb1dc168357af488e46811c687713fc66bbd6f8500bbd13cdb45cb82c14d1d +b3a74780ff949d19e6438db280e53632c60dc544f41320d40297fe5bb7fcee7e7931111053c30fb1ed9019ab28965b44 +8c67f32b9fdc04ec291cc0d928841ab09b08e87356e43fbbf7ac3ff0f955642628f661b6f0c8e2192a887489fddf07bb +b3be58bd628383352e6473fe9a1a27cf17242df0b1273f5867e9119e908969b9e9e7e294a83b9ea14825003cb652d80c +a867acf6ab03e50936c19a21d4040bfd97eb5a89852bd9967da0e326d67ce839937cab4e910d1149ecef9d5f1b2d8f08 +8006b19126bd49cbb40d73a99a37c2e02d6d37065bbe0cfcee888280176184964bd8f222f85960667c5b36dfaee0ee35 +ac50967b8b7840bf9d51216d68a274f1d3431c7d4031fbac75a754befbbb707c2bb184867db6b9d957f3ba0fd0a26231 +b5a794c928aff0c4271674eb0a02143ed9b4d3bc950584c7cd97b7d3c3f2e323798fd5ccc6fcc0eb2e417d87f4c542a2 +a2ca3d6509f04b37091ce6697672ee6495b42d986d75bd2d2058faa100d09fd0a145350f2d280d2cb36516171bd97dbf +92cfa293469967a9207b37cd70392312faf81b52963bfbad5f9f3da00817d26e10faf469e0e720c3bb195f23dda8c696 +a0dd5135da0a0e33fa922c623263b29518d7fa000e5beefc66faa4d6201516d058f155475c4806917a3259db4377c38a +8fc3ae8ea6231aa9afb245a0af437e88ebca2c9ab76850c731981afba90d5add0ea254053449355eccf39df55bd912ed +9727afe1f0804297717cec9dc96d2d27024a6ae6d352fee5d25377ee858ee801593df6124b79cb62ddc9235ec1ade4ac +8bcb2c53fcaa38e8e2e0fd0929bc4d9ddce73c0282c8675676950ff806cb9f56ebd398b269f9a8c2a6265b15faf25fca +a8bd9007fbbdd4b8c049d0eb7d3649bd6a3e5097372fa8ea4b8821ba955c9ef3f39ac8b19f39d3af98640c74b9595005 +92c7e851c8bd6b09dfcbfdb644725c4f65e1c3dbd111df9d85d14a0bb2d7b657eb0c7db796b42bf447b3912ef1d3b8c3 +98c499b494d5b2b8bea97d00ac3a6d826ab3045bb35424575c87117fc2a1958f3829813e266630749caf0fa6eeb76819 +8df190d71e432fe8691d843f6eb563445805c372eb5b6b064ec4e939be3e07526b5b7f5a289ede44ae6116a91357b8b1 +b5010243f7c760fb52a935f6d8ed8fc12c0c2f57db3de8bb01fdeedf7e1c87b08f3dd3c649b65751f9fd27afa6be34c7 +889c8057402cc18649f5f943aed38d6ef609b66c583f75584f3b876c1f50c5dc7d738dc7642135742e1f13fa87be46c1 +996087337f69a19a4ebe8e764acf7af8170a7ad733cd201b0e4efde6ea11039a1853e115ad11387e0fb30ab655a666d8 +902732c429e767ab895f47b2e72f7facad5ef05a72c36a5f9762c2194eb559f22845bbb87c1acc985306ecb4b4fbbf79 +8519b62a150ea805cdfc05788b8d4e797d8396a7306b41777c438c2e8b5c38839cfec5e7dc5d546b42b7b76e062982a7 +862a53ba169e6842a72763f9082ff48fbfbb63129d5a26513917c2bca9ad6362c624ce6fc973cf464f2eb4892131eb04 +b86cd67c809d75fdb9f1c9453a39870f448b138f2b4058d07a707b88bb37f29d42e33ce444f4fbe50d6be13339cae8a6 +8cf5d8365dbbafc0af192feb4fc00c181e2c3babc5d253268ef5564934555fb1e9b1d85ec46f0ca4709b7d5b27169b89 +b48f11a1809ec780bf6181fae3b8d14f8d4dc7d1721128854354be691c7fc7695d60624f84016c1cea29a02aaf28bfbc +8b46b695a08cb9a2f29ab9dd79ab8a39ec7f0086995b8685568e007cd73aa2cd650d4fae6c3fb109c35612f751ba225e +8d2f9f0a5a7de894d6c50baceb8d75c96082df1dcf893ac95f420a93acbbf910204903d2eb6012b1b0495f08aaf9992f +b334db00a770394a84ec55c1bd5440b7d9f2521029030ef3411b0c2e0a34c75c827fd629c561ea76bd21cd6cf47027f4 +96e9ff76c42bcb36f2fb7819e9123420ed5608132f7c791f95cb657a61b13041e9ba2b36f798a0fdb484878cbe015905 +99f8d701e889abd7815d43ba99e0a85776ec48311fa7cb719d049f73b5d530fa950746ffbbb7beb9e30c39d864891dc2 +98169c20df7c15d7543991f9c68e40ac66607cbd43fc6195416e40009917039357e932d6e807f3a40bc4503ad01ae80a +84bd97dd9e4e2ba75d0dee7d4418c720d4746203d847ce2bdd6ed17d492023df48d7b1de27e3f5cb8660c4bb9519ae1b +a54319e06db7f5f826277a54734a875c5b3fd2fa09d36d8b73594137aa62774b7356560157bc9e3fdf1046dc57b6006a +90cfff7cd4e7c73b84f63455d31b0d428cb5eee53e378028591478511985bcc95eb94f79ad28af5b3bed864e422d7b06 +a11c23cc8dce26ac35aea9abe911905a32616a259fa7da3a20f42dc853ad31b2634007aa110c360d3771ff19851f4fb4 +9856fbee9095074ad0568498ff45f13fe81e84ea5edaf04127d9ee7e35e730c6d23fa7f8f49d092cf06b222f94ab7f36 +818862dec89f0dc314629fffbca9b96f24dfde2d835fa8bde21b30dc99fe46d837d8f745e41b39b8cf26bfe7f338f582 +831819d41524c50d19f7720bf48f65346b42fb7955ee6ecc192f7e9fed2e7010abccdfdeac2b0c7c599bc83ac70be371 +b367e588eb96aa8a908d8cc354706fee97e092d1bc7a836dbcc97c6ed4de349643a783fb4ddf0dec85a32060318efa85 +b7aaef729befd4ab2be5ec957d7d1dbe6178de1d05c2b230d8c4b0574a3363e2d51bc54ea0279a49cc7adffa15a5a43a +ae2891d848822794ecb641e12e30701f571431821d281ceecbccaaa69b8cd8242495dc5dbf38f7d8ed98f6c6919038aa +872cf2f230d3fffce17bf6f70739084876dc13596415644d151e477ce04170d6ab5a40773557eeb3600c1ad953a0bfce +b853d0a14cef7893ba1efb8f4c0fdb61342d30fa66f8e3d2ca5208826ce1db5c8a99aa5b64c97e9d90857d53beb93d67 +910b434536cec39a2c47ca396e279afdbc997a1c0192a7d8be2ba24126b4d762b4525a94cea593a7c1f707ba39f17c0c +b6511e9dea1fbccedd7b8bb0a790a71db3999bd4e3db91be2f1e25062fae9bb4e94e50d8ec0dcc67b7a0abce985200b2 +936885c90ebe5a231d9c2eb0dfd8d08a55ecaa8e0db31c28b7416869b3cc0371448168cbec968d4d26d1cb5a16ebe541 +b71c2ac873b27fe3da67036ca546d31ca7f7a3dc13070f1530fce566e7a707daeb22b80423d505f1835fe557173754f8 +85acb64140915c940b078478b7d4dadd4d8504cde595e64f60bd6c21e426b4e422608df1ed2dd94709c190e8592c22d7 +b5831c7d7c413278070a4ef1653cec9c4c029ee27a209a6ea0ad09b299309dea70a7aef4ff9c6bdeda87dcda8fa0c318 +aa0e56e3205751b4b8f8fa2b6d68b25121f2b2468df9f1bd4ef55f236b031805a7d9fd6f3bba876c69cdba8c5ea5e05f +b021f5ae4ed50f9b53f66dd326e3f49a96f4314fc7986ace23c1f4be9955ec61d8f7c74961b5fdeabcd0b9bccbf92ce8 +88df439f485c297469e04a1d407e738e4e6ac09a7a0e14e2df66681e562fdb637a996df4b9df4e185faab8914a5cef76 +8e7ae06baa69cb23ca3575205920cb74ac3cda9eb316f4eef7b46e2bff549175a751226d5b5c65fe631a35c3f8e34d61 +99b26ff174418d1efc07dfbed70be8e0cb86ac0cec84e7524677161f519977d9ca3e2bbe76face8fe9016f994dafc0ff +a5f17fe28992be57abd2d2dcaa6f7c085522795bfdf87ba9d762a0070ad4630a42aa1e809801bc9f2a5daf46a03e0c22 +8d673c7934d0e072b9d844994f30c384e55cec8d37ce88d3ad21f8bb1c90ecc770a0eaf2945851e5dab697c3fc2814a9 +a003ed4eb401cfe08d56405442ca572f29728cfff8f682ef4d0e56dd06557750f6a9f28a20c033bc6bbb792cc76cc1a8 +8010408f845cf1185b381fed0e03c53b33b86ea4912426819d431477bd61c534df25b6d3cf40042583543093e5f4bb44 +9021a1ae2eb501134e0f51093c9f9ac7d276d10b14471b14f4a9e386256e8c155bef59973a3d81c38bdab683cd5c10e0 +a5abf269ceabbb1cf0b75d5b9c720a3d230d38f284ed787b6a05145d697a01909662a5b095269996e6fa021849d0f41f +b4b260af0a005220deb2266518d11dbc36d17e59fc7b4780ab20a813f2412ebd568b1f8adc45bf045fcbe0e60c65fd24 +b8c4cb93bedbb75d058269dfccda44ae92fe37b3ab2ef3d95c4a907e1fadf77c3db0fa5869c19843e14b122e01e5c1f4 +ac818f7cdecc7b495779d8d0ff487f23ab36a61d0cf073e11000349747537b5b77044203585a55214bb34f67ef76f2d2 +86215799c25356904611e71271327ca4882f19a889938839c80a30d319ddbe6c0f1dfa9d5523813a096048c4aef338cd +a9204889b9388bf713ca59ea35d288cd692285a34e4aa47f3751453589eb3b03a9cc49a40d82ec2c913c736752d8674d +893aecf973c862c71602ffb9f5ac7bf9c256db36e909c95fe093d871aab2499e7a248f924f72dea604de14abfc00e21c +b8882ee51cfe4acba958fa6f19102aa5471b1fbaf3c00292e474e3e2ec0d5b79af3748b7eea7489b17920ce29efc4139 +8350813d2ec66ef35f1efa6c129e2ebaedc082c5160507bcf04018e170fc0731858ad417a017dadbd9ade78015312e7f +83f6829532be8cd92f3bf1fef264ee5b7466b96e2821d097f56cbb292d605a6fb26cd3a01d4037a3b1681d8143ae54d7 +87d6258777347e4c1428ba3dcbf87fdd5113d5c30cf329e89fa3c9c1d954d031e8acacb4eed9dca8d44507c65e47e7cd +a05669a1e561b1c131b0f70e3d9fc846dc320dc0872334d07347e260d40b2e51fdbabeb0d1ae1fb89fba70af51f25a1a +819925c23fd4d851ea0eecc8c581f4a0047f5449c821d34eccc59a2911f1bd4c319dab6ece19411d028b7fdedece366b +b831b762254afd35364a04966d07b3c97e0b883c27444ff939c2ab1b649dc21ac8915b99dc6903623ed7adaae44870ac +93ec0190f47deffe74179879d3df8113a720423f5ca211d56db9654db20afe10371f3f8ec491d4e166609b9b9a82d0d4 +8f4aa6313719bcfad7ca1ed0af2d2ee10424ea303177466915839f17d2c5df84cc28fcef192cbb91bb696dd383efd3b2 +8d9c9fdf4b8b6a0a702959cf784ad43d550834e5ab2cd3bebede7773c0c755417ad2de7d25b7ff579f377f0800234b44 +99d9427c20752f89049195a91cf85e7082f9150c3b5cb66b267be44c89d41e7cc269a66dacabacadab62f2fa00cc03be +b37709d1aca976cbbf3dc4f08d9c35924d1b8b0f1c465bd92e4c8ff9708e7d045c423183b04a0e0ab4c29efd99ef6f0e +a163f42fb371b138d59c683c2a4db4ca8cbc971ae13f9a9cc39d7f253b7ee46a207b804360e05e8938c73bf3193bab55 +87a037aa558508773fc9a0b9ba18e3d368ffe47dfaf1afacee4748f72e9d3decc2f7c44b7bf0b0268873a9c2ef5fe916 +a1f20cb535cc3aebd6e738491fe3446478f7609d210af56a4004d72500b3ec2236e93446783fe628c9337bcd89c1e8e1 +9757aa358dfbba4f7116da00fe9af97f7ac6d390792ea07682b984aa853379ac525222ac8a83de802859c6dec9182ef7 +815daca1eded189ec7cb7cbc8ad443f38e6ddb3fb1301d1e5a1b02586f1329035209b7c9232dc4dff3fc546cb5ac7835 +aed86dfaf9c4f0a4b2a183f70f9041172002a773482a8ebf3d9d5f97d37ee7c6767badfda15476b3b243931235c7831c +8d032e681e89e41b29f26be02f80030fa888f6967061d2204c1ebb2279a3211d759d187bce6408c6830affa1337fb4e0 +877bff5c2db06116f918a722b26422c920aeade1efa02fa61773fca77f0ea4a7e4ee0ecaaa5cfe98044c0ff91b627588 +b9ee5310d0996a10a242738d846565bdb343a4049a24cd4868db318ea6168a32548efaf4ab84edfbf27ce8aec1be2d1c +b59f6928167323037c6296dd7697846e80a7a4b81320cfae9073ebd2002a03bdf6933e887f33ad83eda8468876c2c4fb +8167686245149dc116a175331c25301e18bb48a6627e2835ae3dd80dd373d029129c50ab2aebeaf2c2ccddc58dcc72ec +82b7dcc29803f916effb67c5ba96a1c067ed8ca43ad0e8d61a510ab067baefd4d6b49e3886b863da2de1d8f2979a4baa +b43824cd6f6872a576d64372dde466fef6decdbb5ad5db55791249fde0a483e4e40c6e1c221e923e096a038fe47dab5e +ab1e9884cf5a8444140cf4a22b9a4311a266db11b392e06c89843ac9d027729fee410560bcd35626fd8de3aad19afc4a +a0dbd92a8d955eb1d24887ca739c639bdee8493506d7344aadb28c929f9eb3b4ebaae6bd7fd9ffe8abb83d0d29091e43 +8352a47a70e343f21b55da541b8c0e35cd88731276a1550d45792c738c4d4d7dc664f447c3933daabd4dbb29bb83be4a +8ce4a1e3c4370346d6f58528a5ef1a85360d964f89e54867ba09c985c1e6c07e710a32cdda8da9fa0e3b26622d866874 +b5e356d67dd70b6f01dd6181611d89f30ea00b179ae1fa42c7eadb0b077fb52b19212b0b9a075ebd6dc62c74050b2d2f +b68f2cd1db8e4ad5efdba3c6eaa60bfcc7b51c2b0ce8bb943a4bc6968995abe8a45fe7f12434e5b0076f148d942786be +b5c7b07f80cd05c0b0840a9f634845928210433b549fb0f84a36c87bf5f7d7eb854736c4083445c952348482a300226a +8cfd9ea5185ff9779dee35efe0252957d6a74693104fb7c2ea989252a1aa99d19abaab76b2d7416eb99145c6fdb89506 +8cc8e2c5c6ddee7ef720052a39cab1ecc5e1d4c5f00fb6989731a23f6d87ac4b055abb47da7202a98c674684d103152a +8c95394c9ed45e1bf1b7cfe93b2694f6a01ff5fed8f6064e673ba3e67551829949f6885963d11860d005e6fabd5ac32c +adf00b86f4a295b607df157f14195d6b51e18e2757778fde0006289fabba8c0a4ab8fad5e3e68ddbb16ccb196cc5973f +b1714b95c4885aac0ee978e6bbabbc9596f92b8858cb953df077511d178527c462cbe1d97fdc898938bae2cd560f7b66 +adf103f4344feb6b9c8104105d64475abc697e5f805e9b08aa874e4953d56605677ef7ff4b0b97987dc47257168ae94d +b0ce6ede9edb272d8769aed7c9c7a7c9df2fb83d31cc16771f13173bcdc209daf2f35887dcca85522d5fdae39f7b8e36 +ad698d1154f7eda04e2e65f66f7fcdb7b0391f248ba37d210a18db75dafd10aedc8a4d6f9299d5b6a77964c58b380126 +904856cd3ecdbb1742239441f92d579beb5616a6e46a953cf2f1dd4a83a147679fc45270dcac3e9e3d346b46ab061757 +b600b5b521af51cdfcb75581e1eccc666a7078d6a7f49f4fdb0d73c9b2dab4ce0ecafcbd71f6dd22636e135c634ee055 +a170c5d31f6657f85078c48c7bbf11687ce032ab2ff4b9b3aee5af742baecf41ea1c2db83bcba00bccc977af7d0c5c8e +a9ef1cbb6a7acb54faf1bcbd4676cdeba36013ca5d1ac1914c3ff353954f42e152b16da2bdf4a7d423b986d62b831974 +aa706d88d3bd2ce9e992547e285788295fd3e2bbf88e329fae91e772248aa68fdfdb52f0b766746a3d7991308c725f47 +911a837dfff2062bae6bcd1fe41032e889eb397e8206cedadf888c9a427a0afe8c88dcb24579be7bfa502a40f6a8c1cc +ae80382929b7a9b6f51fe0439528a7b1a78f97a8565ba8cddb9ee4ba488f2ab710e7923443f8759a10f670087e1292c4 +b8962de382aaa844d45a882ffb7cd0cd1ab2ef073bce510a0d18a119f7a3f9088a7e06d8864a69b13dc2f66840af35ae +954538ffff65191538dca17ec1df5876cb2cd63023ff2665cc3954143e318ece7d14d64548929e939b86038f6c323fc1 +89efa770de15201a41f298020d1d6880c032e3fb8de3690d482843eb859e286acabb1a6dc001c94185494759f47a0c83 +a7a22d95b97c7c07b555764069adaa31b00b6738d853a5da0fe7dc47297d4912a0add87b14fa7db0a087a9de402ea281 +9190d60740c0813ba2ae1a7a1400fa75d6db4d5ce88b4db0626922647f0c50796a4e724e9cc67d635b8a03c5f41978f7 +ab07c30b95477c65f35dc4c56d164e9346d393ad1c2f989326763a4cc04b2cb0386e263007cc5d0125631a09ad3b874c +9398d8e243147de3f70ce60f162c56c6c75f29feb7bc913512420ee3f992e3c3fb964d84ef8de70ef2c118db7d6d7fd5 +b161b15b38cbd581f51ca991d1d897e0710cd6fdf672b9467af612cd26ec30e770c2553469de587af44b17e3d7fea9f7 +8c5d0260b6eb71375c7ad2e243257065e4ea15501190371e9c33721a121c8111e68387db278e8f1a206c0cce478aaa2b +b54ac06a0fb7711d701c0cd25c01ef640e60e3cb669f76e530a97615680905b5c5eac3c653ce6f97ceca2b04f6248e46 +b5c7f76e3ed6dc6c5d45494f851fa1b5eaf3b89adac7c34ad66c730e10488928f6ef0c399c4c26cbeb231e6e0d3d5022 +b6cd90bdd011ac1370a7bbc9c111489da2968d7b50bf1c40330375d1a405c62a31e338e89842fe67982f8165b03480c7 +b0afcaf8d01f5b57cdeb54393f27b27dc81922aa9eaccc411de3b03d920ae7b45295b090ef65685457b1f8045c435587 +b2786c0460e5057f94d346c8ebe194f994f6556ab2904a1d1afd66c0ff36391b56f72ed769dcc58558ee5efaa2ed6785 +965dbb0cb671be339afcb2d6f56e3c386fb5d28536d61d6073b420ee15dee79c205af2f089fbb07514a03c71bf54b4e2 +90f2003e2286bba9cebff3a6791637ca83b6509201c6aed1d47f27097d383d5c2d8532bff9e3541d2c34259841cf26ab +902142d1224e1888ebbfef66aaf8d5b98c27927a00b950753a41d1d28a687a8286b51655da9a60db285b20dc81d5ea89 +a5d364448bf0d0849e5104bdaef9cb2cc8c555f5d6d34239c68671fbe1252f7c8c75b83cea10159dee4da73298f39a12 +b013a54c5b99e296d9419ad5c2aaf4545acd34405e57d13cb764e92132cc20d1a14b33e10caf22d898b608670c04f273 +b92976dceda373331804d48a7847f508cafde8d15949df53dbda09d03908678db1e61ee637baad5f05b2b03ea6f5a870 +968bcb308c7ad0813dc9b3170f23f419aecd7b42176f27fac698811795bf42659fea6b04dab4ef43595dcc990622041b +a9d0a20e9367ea831dccd37f4d97ea75e9aeec952947a7946d95e0d249c94024183ef79a624bdea782469824df0ee4e4 +8521b9667453c3658703e5db365b13f0e0d2331ce611ff1e708f8124d8a81bb5e82871de4a66d45c1a6b0a3901bd901e +b9c88e76e69b0722c0a2f97e57dbc4a6f7456434cd694e2ff67f4e24740cffa4db03e2b18f07f22954ae7db2286e1fa2 +8400e55aa9ab01d4cc0affd611127b5d8d9a9dbd897f3cb8e2050379983aa54249be17d7b7891977b2515bb44a483f65 +8cbb967b4ed31dc40ea06822a94d54cbfc8845c66fbafa3474c8f5fe1ada97299ed4ca955d9d7a39af8821eabf711854 +b4d266ee3fea264a6c563fd6bed46f958c2d7bd328225f6e47faf41a0916aef3b697574322f8b814dfb2f5c242022bf6 +8f7c72d69a919450215ead660ffa9637642c5306354888d549fd4a42e11c649b389f67cc802a0184d10fdb261351140c +a5f9e494ea9b2393ec32c48aac76c04158ccef436d4e70ad930cba20c55fbf61e8f239f70b9d75462405c4b6317c71a1 +b3befb259b52a44a6f44345859e315c20efa48c0c992b0b1621d903164a77667a93f13859790a5e4acb9f3ec6c5a3c6e +b9e4ca259b4ee490d0824207d4d05baf0910d3fe5561ff8b514d8aa5c646417ca76f36ab7c6a9d0fb04c279742f6167a +98fa8c32a39092edb3c2c65c811d2a553931010ccb18d2124d5b96debd8b637d42b8a80111289f2079d9ebca2131a6dc +a65e5aa4631ab168b0954e404006ce05ac088fd3d8692d48af2de5fd47edbf306c80e1c7529697754dbbba1b54164ba0 +b94b7d37e4d970b4bb67bf324ebf80961a1b5a1fa7d9531286ab81a71d6c5f79886f8ef59d38ae35b518a10ed8176dcc +b5ed2f4b0a9ae9ace2e8f6a7fd6560d17c90ae11a74fa8bef2c6c0e38bfd2b9dd2984480633bca276cb73137467e2ce3 +a18556fe291d87a2358e804ee62ddff2c1d53569858b8ae9b4949d117e3bfb4aefce1950be8b6545277f112bebeeb93d +a0d60b9def5d3c05856dff874b4b66ec6e6f0a55c7b33060cc26206c266017cdcf79b1d6f6be93ed7005a932f9c6a0b9 +801fced58a3537c69c232ce846b7517efd958e57c4d7cd262dbec9038d71246dafad124aa48e47fe84ecc786433747c7 +a5e9a8ea302524323aa64a7c26274f08d497df3d570676ecc86bd753c96a487a650389a85f0bc8f5ea94fe6819dc14e5 +a8a2963dc9238a268045d103db101adc3b2f3ab4651b7703b2fe40ece06f66bf60af91369c712aa176df6ed3d64a82fa +a4a8ff0a9a98442357bcdd9a44665919c5d9da6a7d7d21ccdbbd8f3079b1e01125af054b43b37fc303941d0a2e7baee0 +90ef893350f50d6f61ee13dfab6e3121f4a06a1908a707b5f0036cdc2fe483614de3b1445df663934036784342b0106f +84e74d5bc40aaab2cc1d52946b7e06781fbef9d8de6f8b50cd74955d6bdb724864c0e31d5ac57bf271a521db6a352bd6 +832cdf653bbbd128e2e36e7360354a9e82813737c8ab194303d76667a27aa95252756c1514b9e4257db1875f70f73eb4 +a0af8660ed32e6dbcc4d5d21b0a79a25ff49394224f14e6e47604cf3b00136de8f9ab92e82814a595bf65340271c16c3 +9040b5caf5e4dc4118572a2df6176716b5b79d510877bbb4a1211b046596899ea193be4d889e11e464ffb445ab71907b +b9bf8354c70238ab084b028f59e379b8a65c21604034d1b8c9b975f35a476e3c0ba09dd25bf95c5d8ffb25832537319b +a7b492cc1df2a8f62c935d49770d5078586bd0fefda262eb5622033e867e0b9dc0ffc2ce61cd678136a3878d4cbb2b56 +95a5ef06f38743bba187a7a977023b1d9d5ec9ef95ba4343ad149a7b8b0db0e8e528bfb268dc7e5c708bc614dc3d02c8 +99dcf7f123df6c55aeff0a20885a73e84d861ec95cf9208ba90494f37a2dcaacebc8344f392547d3046616d9753c7217 +b3e14f309281a3685ceb14f8921c1e021b7e93c9e9595596b9fb627e60d09ed9e5534733fcbdf2fbc8c981698f5e62ac +816a5e0463074f8c7fb2998e0f0cf89b55790bdbbb573715f6268afb0492453bd640dd07a9953d0400169d555fdf4ac8 +8356d68f3fe7e02a751f579813bd888c9f4edcc568142307d1c9259caef692800e1581d14225e3a3585dac667928fa94 +8d70ea3314c91bfc3f7c1dcf08328ae96f857d98c6aac12ad9eebc2f77e514afdbaf728dfcb192ed29e7ce9a0623ecbb +b68280e7f62ced834b55bc2fcc38d9ea0b1fbcd67cc1682622231894d707c51478ed5edf657d68e0b1b734d9f814b731 +b712dd539e1d79a6222328615d548612eab564ace9737d0249aa2eefed556bbcf3101eba35a8d429d4a5f9828c2ac1fe +8da42ca096419f267f0680fd3067a5dbb790bc815606800ae87fe0263cae47c29a9a1d8233b19fe89f8cc8df6f64697e +8cb2ffd647e07a6754b606bde29582c0665ac4dde30ebdda0144d3479998948dae9eb0f65f82a6c5630210449fbd59f7 +8064c3ef96c8e04398d49e665d6de714de6ee0fced836695baa2aa31139373fad63a7fc3d40600d69799c9df1374a791 +aec99bea8ab4e6d4b246c364b5edc27631c0acc619687941d83fa5ba087dd41f8eaec024c7e5c97cf83b141b6fb135da +8db6051f48901308b08bb1feb8fd2bceaedde560548e79223bd87e485ea45d28c6dcec58030537406ed2b7a9e94e60cc +a5b812c92d0081833dcf9e54f2e1979a919b01302535d10b03b779330c6d25d2de1f374b77fe357db65d24f9cbcd5572 +967d442485c44cf94971d035040e090c98264e3348f55deabd9b48366ec8fe0d5a52e4b2c9a96780a94fc1340338484e +a4b4110bef27f55d70f2765fc3f83c5ddcdfe7f8c341ea9d7c5bcee2f6341bcfbf7b170b52e51480e9b5509f3b52048f +a0d39e4eb013da967a6ac808625122a1c69bf589e3855482dedb6847bb78adc0c8366612c1886d485b31cda7304ec987 +a92f756b44d44b4e22ad265b688b13c9358114557489b8fb0d9720a35e1773b3f0fa7805ac59b35d119a57fe0f596692 +aa27e4b979af6742b49db8bf73c064afd83a9cfe9016131a10381f35a46169e8cfd1a466f295fcc432c217c7c9fa44a5 +845961319cc10bcfbb1f3cb414a5c6a6d008fb3aac42c7d5d74e892cc998af97bc9a9120c3f794e4078135e16a416e38 +a18dbe3015c26ae3e95034c01d7898e3c884d49cc82e71ddb2cf89d11cec34cc2a3dff0fafb464e8e59b82ce1a0a7a11 +a954aed6d7124fa5bd5074bd65be4d28547a665fb4fe5a31c75a5313b77d1c6fc3c978e24c9591a2774f97f76632bdde +8f983b2da584bdff598fcb83c4caa367b4542f4417cc9fa05265ff11d6e12143c384b4398d3745a2d826235c72186a79 +b2caa17d434982d8dd59a9427307dfe4416b0efc8df627dd5fc20d2c11046c93461d669cab2862c094eec6a9845990c6 +8c2baa5a97ee3154cce9fa24f6b54b23e9d073e222220fdd0e83e210c0058fb45ce844382828b0cb21438cf4cad76ee6 +b93437406e4755ccf1de89f5cbe89e939490a2a5cf1585d4363c21ae35b986cb0b981dec02be2940b4ec429cc7a64d4c +a90ac36c97b7ea2eddb65e98e0d08a61e5253019eeb138b9f68f82bb61cdbadf06245b9dfffe851dfa3aa0667c6ac4b8 +8bcdd7b92f43b721ddbfd7596e104bc30b8b43bdaee098aac11222903c37f860df29d888a44aa19f6041da8400ddd062 +98f62d96bdf4e93ed25b2184598081f77732795b06b3041515aa95ffda18eb2af5da1db0e7cfed3899143e4a5d5e7d6c +ad541e3d7f24e4546b4ae1160c1c359f531099dab4be3c077e446c82cb41b9e20b35fa7569798a9f72c1fae312b140b4 +8844a1471ff3f868c6465459a5e0f2fb4d93c65021641760f1bb84f792b151bc04b5a0421bbc72cf978e038edc046b8f +af895aebe27f8357ae6d991c2841572c2063b8d0b05a2a35e51d9b58944c425c764f45a3f3b13f50b1b1f3d9025e52ad +adf85265bb8ee7fead68d676a8301129a6b4984149f0eb4701eae82ec50120ddad657d8798af533e2295877309366e9c +962e157fe343d7296b45f88d9495d2e5481e05ea44ca7661c1fdf8cc0ac87c403753ca81101c1294f248e09089c090eb +a7c8959548c7ae2338b083172fee07543dc14b25860538b48c76ef98ab8f2f126ecb53f8576b8a2b5813ecb152867f18 +ae71680366e11471e1c9a0bc7ea3095bc4d6ceb6cf15b51f1b6061b043f6d5941c9f869be7cb5513e8450dca16df2547 +831290201f42ebf21f611ca769477b767cf0ee58d549fcd9e993fae39d07745813c5ce66afa61b55bb5b4664f400ece7 +af5879e992f86de4787f1bc6decbc4de7d340367b420a99a6c34ac4650d2a40cbe1cef5c6470fc6c72de8ee1fe6bcce4 +8d3c27e1b2ef88d76ac0b1441d327567c761962779c8b1f746e3c976acb63b21d03e5e76589ce9bb0d9ba6e849ed3d53 +ab23b09c9f4151e22654d43c1523f009623b01fe1953d343107cef38b95bd10afd898964946d3cb8521bcbe893e1c84d +8a6acade9520e7a8c07f33d60a87fd53faa6fbf7f018735bffcbbb757c3bafb26f547ceb68e7b8b6bca74819bfcd521a +94db50080d557440a46b6b45ee8083bc90e9267d40489040cbed6234bebf350c788ec51557b969f95194102fde8e9713 +8be8031f32504e0c44958d893649f76cec17af79efcd22bbedb78378f0a150845467e59f79a3f2a3b6a66bdf0d71d13c +a69a4ac47fd92e1926b5e14adcbebbef049848e8a00d4bb387340892e5a9333cae512f447201728d3b53c6cf980a5fdc +8fc713825277c5a8d9ef0a1f6219d141def6d8b30aff0d901026280a17d1265d563ff5192a0817e0e1a04ff447fb6643 +8bf0a85569c4f0770ff09db30b8b2ea6c687630c7801302c17986c69a57c30f0781d14b3f98a10b50c4ecebc16a5b5ec +896baa4135d5621fd6b6a19c6d20b47415923c6e10f76c03a8879fd8354e853b0b98993aa44e334623d60166ba3e3ca9 +b82cde1c2e75a519ef727b17f1e76f4a858857261be9d866a4429d9facf9ea71d16b8af53c26bde34739fe6ea99edc73 +b1a9e1f2e34895a7c5711b983220580589713306837c14073d952fe2aef0297135de0be4b25cbfaed5e2566727fb32ef +b42ed0e9eaf02312d1dba19a044702038cf72d02944d3018960077effc6da86c5753036a85d93cd7233671f03d78d49a +a402e34849e911dbf0981328b9fe6fff834c1b8683591efd3b85aa7d249811d6b460a534d95e7a96fdd7f821a201c2c4 +a774417470c1532f39923d499566af762fa176c9d533767efd457cc5e4a27f60e9217f4b84a9343ecb133d9a9aab96b7 +83dc340541b9ef2eb8394d957cd07b996d2b52ac6eb5562cbba8f1a3312f941c424c12d1341a6dc19d18d289c681ef40 +b2906c32d5756b5712e45dec53782494a81e80f887c6e1ef76e79c737625eccecb8fd17b20e6f84890d322b6ffde6eab +b89705c30cec4d50691bc9f4d461c902d6a4d147cf75ee2f1c542ad73e5f0dabe3d04cd41c6c04ab1422be4134cf1ad7 +8c3293651f4c4fac688bf5837c208b15e5a19ce51b20dd80ffc7fca12d3e615b2773cfc3ed62a1b39c66808a116bde06 +8fceb8ef481163527d1fc3abc7e1a5b3b6de2f654c3fe116d1367b177dcba2e0d2124a7216803513a3d53fc1e30435b9 +b2a42c827da630aaa3eb20ed07d136aa11ba01b4c8efc0a57ebab7d5b851a15daa6ba118bcffbc20703916e430e30a87 +a86340153abb3fe97414e2fde857e15aac27c9bb9b61258eea6766024f426ed0753f08f07f6b02b5375e1587ea3afcab +b006465e258e646f91ba889765113d3dc9bd657246c533cab6516d55ba054baa9d7276a3b0fa31730c3bd824845bf107 +a08aadc09428719cde0050d064c0f42c5b7c4f6c158227d7636f870957d6cfe821b4c62d39279a7c98f5a75fcb7bbfba +885e7d47ce9b50d21b95116be195be25f15223a6a189387575cc76740174c3e9044f1196986d82856b3fb25cdd562049 +b18c3780362d822cc06910743c4cbcef044823a22d12987fe2e56f3801e417f2e9cd31574ea1c5c6ee7673a14aa56e3e +a625570ef7d31c042d968018865aeeba34ee65a059ab1ec079c7a8ba1be9e24bce6afb7036c07d9d6c96ab014f95d661 +8fc9bd4764adc4c300b5bd49a06dce885d1d8aff9bae68a47976d0cd42110aa6afa2d7b90b64e81c0f14de729f2fb851 +91d88714cb669f5f00241aa5ab80dffb04109492ea9c72b59645eb1f85f3539c61db2ab418af986f42241df8b35445e9 +b98f14e664df2590dd2d00b5b5c817e388e5d9fb074f718637c33b3d4969c89e82fdd12db8997f5ff3bf5bb5ca5dd839 +86cb3d9f148cb2170317a4c22af7092155aa66ecff7ab1299b102fbbaa33ed2a284b97b08f529d2da9faea63fb98972c +92449f6b8a7c737ecef291c947cbd602c47d7fe47dc3426c2b413f3019169aa56e14c2a7216adce713e1c7bd5c08a83f +b08c1b9080bba88b44a65070948142d73c00730715fbdd01e13fc3415c5b4f3248ef514fa3ade4a918c9a820cccae97c +b0a05297da76e37c22be7383e60bba1cbc4f98ba650e12d4afcfcea569842003644a10ad73c9148958f7bf1ffa0a27d0 +839092c1f4e9fb1ec0dde8176f013b0d706ab275079f00f8e774287dd658d1b5638d5fe206f5f2a141911a74bb120f75 +a36bd669bdc055ece4b17ff6eac4c60a2f23324a5eb6d0d6c16a2fce44c39cfd52d1fa2b67f3f5e83504e36426fbfc40 +8aa428323512cf769645e2913a72976d32da4c0062ffe468a6062fd009340f0f23c6b63285848a0e7631a907adb032a0 +944800f7d43f41283eb56115ac39ccc5bf107ae5db6abcaba6936b896260cd09428a6b828c0bccebeb00541073dbf38e +8e700ca7c9e1538cf64e161dd8d16af56fc29d53c79648150d6d8c268b0c95c76acded723e29918690d66252bd75f5b3 +b9c4ce35b5b16b4c39b6e85800c76b26e8d0999500fabc1e5b6234a7f8da18c621266ac0d5ebc085354297ff21ac89a5 +a0c706d32063f1877f7e903048ce885f5d012008d4a8019dd00261a8bbc30834bffeba56cdeddc59167d54cc9e65f8fa +839813b736225087cbbcf24506ea7bf69138605036b764ec0514055ac174bbc67c786a405708eb39a6c14c8d7e0ec6ee +b1a5fef055a7e921c664f1a6d3cb8b21943c89b7e61524a307d8e45aa432e5765a27c32efdb32d88062cd80800a260de +b17f8202d9ed42f0f5cb1b1dbda60711de3b917a77f6069546fa3f86d21f372b8dd5cb86f1994b873ba9982404e08daf +b5211d54bd02d44d4d808ad57067606f3e9fa2cad244a5f2acef0edf82de3c496d2b800f7c05f175d01fa6ace28b44d1 +aa9c6f8f489b35fdb7544116fe5102a34ff542de29262f156df4db4ea6e064f5ea20c4bd877d40377ed5d58114b68f19 +826668b1f32e85844ff85dd7e2a8e7f4e0fd349162428bc9d91626b5ab21bdbacd1c9e30cf16f5809b8bf5da4f4fe364 +b30d14917b49437f9fdbae13d50aee3d8a18da3a7f247b39e5d3e975c60bd269da32da4e4cc8844666fca0d65f4e3640 +8c6918d8d94b36c6b9e772e9a432e66df16724e3b0660bde5ea397e6ef88028bb7d26184fbe266a1e86aef4a0dfe5faa +906d80ffd692c1dd03ab89be52e0a5a9e90a9cdbfc523d2b99c138ae81f45d24c34703f9cb5a666b67416e3bb6272bc4 +8b07e8ba22b436e64f011cacf5e89c55cd3bfb72ae8b32a3a8922c4fccb29de6f73662d6e330da6aa6e732a2187ef3c9 +9547466b4553a49adf59cc65d4c3c9401b2178947ebe3bd33c6e63cfb67d6be8729033158594f6f244b272c4487d6958 +aafcccea41e05cb47223fa8dfec0dd55964268bd4d05e24469614077668655ac8a51d2ac2bfb22862f8f4fa817048c2f +870f8c1173e8fd365b0a2e55c66eea3ab55355990c311f3042377803d37e68d712edcc5a0a2e2f5a46df0c1c8e6310c2 +b4288f792008f342935f18d8d9447fe4ddcfea350566e13dba451f58c68e27241af1367f2603a9dff6748e7fe0c53de4 +91c58c0e537d3afdcf7783601dd9cda2aa9956e11f711b15403760cf15fc6dffb40ed643886854571da8c0f84e17adfe +a43fec8ee92febed32e7cdd4e6314a62d9d3052c7a9504057dfba6c71fdfbeff1cef945d8f087bd106b5bec7478ad51f +99cf5e0e3593a92f2ec12eb71d00eccec3eec8662333471b2cb3a7826b7daca2c4d57ffba18299189cf7364e2af5df6d +af50f9ab890b7517ff1f1194c5b3b6f7f82eabc607687a8380be371a6a67b117aeb9b6f725556551b81f8117971706a2 +aa352430887053602a54403bd0d24d6b5181b44aa976dfa190e21851699a88127dcc904c90a48ec44610056b5dcd36c4 +964c821ea1902354736fa382a929c156bd67b9468d6920d47c27b9d0d304b6144118888d124c1f6785da596435ed2410 +b2284a67af26b5f5aff87b4d8e12c78ab37c5eb6e92718fca8549f86f4f001b660fc4520456aff72c9bcddd686603942 +83c54cbb997ea493dc75df4023071dce6da94268feaa2352373789616f012098270ba4fd60c791796a6f5062fb2cd35e +9143e8fee0b8f0f34c65c7750858093dcf165c6a83c026bfac2d5ffa746361eb4b6a14fdb43e403add901ac3735735a3 +97d7748a5b278ee47b18c9e60689b12a0a05be47e58e78bf8c04b9e8b34e2e2f2d3ac3c25c76ab2e0a75e8a54777b7c8 +b4e68f6f2d978a5411414c164c81ddb2a141b01ebe18c65a8626ca75d6432e5988310b50a888a78c3a0a242353525af5 +8976f4cc3eaf2684718cf584712c4adaf00a4d9c521f395f937e13233b30329658b3deacfe7e29fac84c496047f2d36b +a40bcdf4b6e95f1535c88dddcbf2074ef2e746b7fd232bdfd2b88f2f6d4bbf21c6b263cf5fd3e12a03476f2f5ffe00d2 +88c7b6337ee705acd8358ef6d2242d36b140afff0579a7784b3928a0c49698bd39c1f400e8a2e3eda5fbfb2e8f28fe51 +a98612ba8b450a71d2075d51617ebeb7ca401ad3cbd9b8554850c65ef4f093ba78defb00638428c9f1f6f850d619287f +b7e71d3ffa18b185c1a6bd75668ff65d985efc0a0c19f3812cafde9adbfb59ffd108abeb376e6a8877fdf5061562f82b +8a3e5fd776cc26908a108a22b1b122d60cb8c4f483cbedcd8af78a85217bb5a887df3efed2b8b4ec66e68eb02a56ca93 +b0d92b28b169d9422c75f9d5cb0a701e2e47b051e4eacd2fd1aa46e25581a711c16caf32f40de7c7721f5bf19f48b3f5 +88895739d5152282f23e5909cf4beebda0425116eb45fc5a6a162e19207686d164506c53b745fb2e051bb493f6dbad74 +adbccfed12085cd3930bd97534980888ee564dda49e510c4e3ca0c088894855ef6178d5b060bca8a8a1a427afdbec8a8 +87d00674abd3d2e7047a07ed82d887e1d8b8155635887f232dd50d6a0de3fb8e45b80b5a05bc2ec0dea9497b4aa783ac +806e1d3dfadd91cbf10e0d6a5e61738d0dbff83407b523720dce8f21f8468b8a3fc8102acf6ba3cf632ca1cb2af54675 +95a9dff67cf30e993071edede12623d60031fa684dfbe1654f278a1eb1eb7e1be47886d3f8a46c29b032da3176c0d857 +9721973288384c70a9b191436029e85be57970ad001717edc76d44cbfa0dff74f8af61d5279c5cd5c92c9d0f6c793f63 +95c22d1d9b51ef36ba30ee059dcd61d22be3c65f245d0a5179186874219c08e1a4266f687fc973e71f3e33df2b0f7fd3 +b53ec083dd12cc42ae2bae46883a71f2a35443c9ce4ed43aa341eb5f616a53b64211ed5aac717fe09ef1d50f551ed9f0 +a103dab6695c682400f60be8d5851ce07f12e4bd9f454d83b39c41ddcf1443bb14c719b00b4da477a03f341aa1e920cb +b522236988518e5363b1c4bb3f641ff91d3d4c4d64c5f065415b738160b4ce4b0c22e1e054a876aa6c6a52fa4a21dfa2 +a6a00562f0879702cdba5befd256a09f44bf48e61780e0677ff8c3fda81d8e6dc76ba1b05e3494ca9a4cef057eba6610 +b974a2ae631e0b348421f0cda5bd4ce7d73c22dd0fc30404c28852c33499818cab89fbf5c95436d56a0aab3bf2bbab51 +9148cf2a7b7e773245d4df5a9d34cf6d9d42b1a26a4ca6bc3013feca6f3941d6c44f29ba9328b7fe6ce6d7f6565f8e4a +a34035c4a63e98528a135cc53bbbcfcda75572bc4c765f212507f33ac1a4f55563c1a2991624f7133c77b748bbe1a6da +a0c45923cfb7bd272ee113aecb21ae8c94dda7ad1fe051ddb37ab13d3bb7da5d52d86fff9f807273476c24f606a21521 +81ec2ca57f4e7d47897d0c5b232c59d7b56fe9ce0a204be28256a7472808de93d99b43c824a0cd26391e6cac59171daa +8373852f14a3366d46c7a4fc470199f4eebe8ee40379bd5aae36e9dd3336decaead2a284975ba8c84d08236e6b87c369 +b47e878a93779f71773af471ba372cb998f43baca1ae85ea7ff1b93a4dee9327e2fb79691c468ec6e61ab0eae7ceb9f1 +8fc8f260f74303f26360464cfef5ee7eebcbb06073cef3b1b71dab806d7c22f6b3244ce21d0945b35c41f032f7929683 +87e3c4e1dab00596e051ce780b9a8dba02ecdc358f6ddaeb4ec03c326e4b7da248404745392658eb1defff75b1ba25c8 +aac95d8e3b7fe236a7ca347d12a13ec33073f2b2b5a220ecfd1986ca5c3889f0e6a9d9c377a721949aa8991c1821953a +91a483679437ae126a16f5dc3bba6e9bb199dfbba417f0dc479f22819b018c420edc79b602db6183c6591b1909df4488 +94a4b2c663aa87a2417cad4daf21a88b84983a7b212ffcd18048a297b98e07dd4c059617136976fac1d9e94c8c25b8d2 +83e2a690bfa93c79f878a63c0f69f57aabdd8bede16b5966ffba7903dc6ad76775df1fd5347e6f2825f6cd7640f45a45 +a316af7ac11b7780d15312dc729499a1a63b61c4283e103ecce43c3b0cbb0f4bce6ff04e403f5c7cb670dee80c75ab99 +8d0a911c54ee1f9f7e7794732ad87b434c3f356294d196a5e35eac871727fd32a49c27c2dfa10833f9e6f9c7ccbe0064 +8b8db09028298a1f6362b346c8bfeced7cb5d13165a67c0559a9798a95b7a4a9810c02bb852289d47c59f507bd24ce77 +962d57305c518f175ed5d0847fb52ddc4258ca0e4c9ddfc8c333a2ee9f8b4e48d25a3d7e644b785a5953e2e4063da224 +92e0799491898271769250fe88b0cb9dadec98ac92f79de58c418d23ef8c47fcf21ddc90e0cd68bb8f1deb5da82da183 +99855067125f6a6c3a3e58d3bd2700a73ef558926bd8320d2c805a68e94207b63eda6bdc5a925ec36556045900802d51 +a724ae105ab4364a17ddb43d93da1e3fc6b50213f99b7be60954b24dc375c4f93a0737f4a10b4499b6f52667d5f3a64e +82070fb43a63fb50869b118f8940108f0a3e4cc5e4618948417e5cc3801996f2c869d22f90ca4ca1fdbef83c4778421a +b25c04365d6f24d5d3296c10d85a5de87d52a139ddbcbf9e0142074bc18b63a8bc5f5d135bd1e06c111702a4db4cee28 +851093282dcda93e5c98d687a17a7ee828cf868f6c85d372d9ae87f55d0593d8f9f0c273d31f7afa031cf6aea6a7ef93 +93f04f086fa48578210ed207065d80a40abcc82d8bfc99386a4044561d35748ff6c3da6489933c23644ad4b60726da8a +84b1b50d1e876ca5fc341bbedab5b3cc0f6a3f43ea7dd72605f74d0d9c781297b2f12b7872dd600924f1659a4cdf8089 +81b0ba88c582d3956f6b49ca3e031c6400f2ec7e1cd73684f380f608101e9807f54866be0bb9a09c03953c4c74fbb3c8 +a641af6ac644c41a55dee2ef55d3c37abdb19d52bc1835d88e7adda6b6ccd13987c5fd9cba9d318cabb541aa6a0c652e +a7b75b0624d04ad0901070e691eb2d2645b60f87e9d6b26e77a5fb843f846c32fc26e76ae93fd33fe3b857f87bc25162 +a81ba3e2ed0f94c67cd02ba7360e134f8becf7ed2ed2db09b9f5ef0942f7073bfee74ca446067db6092f7b38f74ccc11 +ab80edcabab5830a24210420f880ebac4e41bf7650c11ba230f4889634dbf8e8e2309f36be892b071c67a3bab8fc7ed6 +94d69b64675076fecad40fae4887fb13a8b991b325fa84e9d2d66e3b57646de71a58ad8fd8700fefb46975b18289250b +b44fc0df480cd753a041620fa655be9df74963ae03d4625847d5bb025ceb37f48d19c8c9c444546fba5fe5abb2868506 +b56e2c51324d6200b3d9781b68b5b5e1617a68afccd28b3a12a4be498d2e3aafcd86514c373a9f3a001db733010c29cf +a359a0c172e5cd7ce25080dd2652d863d7c95a4a502ae277ac47f613be5991300f05978404a0acb3bcda93524dcf36e4 +b01427a3dfdf8888727c0c9b01590b8ae372b7b4080d61e17ccb581bac21e61c4a58c75db7a410d1b2a367304e1e4943 +95cb08be4a96c18fbf9d32a4bbf632242029d039a5fdea811488d3634cd86520d4f9806250a8c01855ee2481210f542a +b8594fe6c0717164058f08aedeed1853523f56cec5edbf0d2be271fa5e8bfd61f2974b0f3988d70f5baa2e7888c7ec1f +8f64ee89f59daf74fa1056803247c9d678783ee3917b12a201f30f7523957763e979ceaddb38bae20de40b9885728049 +b6093ee4bdb837bcc59172e236f4bdbd439c0a5a50e2aa16636cbff81b51e92989eb5f80a3f75c37ae7b5b942e55b3d2 +913b6fbb7b43e3e5c49e96cd8e82ed25c655e51c7b8ca82e8fbf92b01ac83c39d52f6f4efab5d39b0591a0538601a86f +81f42668479ca0bec589678dc0973bf716b632578690efe1a0f13de630f306fb4a189a98c2302572fd85d3877ee030b5 +90ff89c38a9a7189f28d35a088657f52283670e7fec842fa91c265660ea2e73b0ad6c46703d649f406f787490b7a7e4b +9077b8b5f1e083183f3152ceb9c5491b5d4b86525a08879f7fb6d5e27f9f1a6867cf0d81b669a4a2d1f1654b67fa8d9c +a7a0275cf5b894adbf2e54a972310cfe113e811872111d6ee497d03750d9f6ffa5517b6c13a99b111a4a91e8e4dfeeee +a08976bf8125b7538313a584bbe710741d630cab067a204ad4501cc4938874ce7aa6a1a826259c2e82ef10a66f1f36fa +8aa45385b5b97f1f3e45f2bbf7a4f3e8ef068e628608484971c97adeb610ebd5deec31317e03eb6536808921062c04db +945b106b8f3ae85e60dfd34ef3dcc079bc6f0aab6df279ed000856efd51321462038ac0a1ca5db3ebf6379bc341e7c55 +a4199c87a96f98cc9d8776fe6de131d2c706b481eb9e9a3bbc50a93d492d7fd724ea469f723fbcfb94920cb5b32c1d76 +a5347b1b2f6149805de67546c5ed72253311099bf1473dbc63edcf14a0a5e68d401f5341338623fbe2e2715b8257e386 +af5dcd03ddc3769e83351d6b958d47a06d4e5224bd5b0ec40ffe6b319763fab8572002f4da294a9673d47762fd0e6e1d +82ec1031b7430419d83b3eea10a4af4c7027f32b91c3ae723de043233b4a2e0c022c9e0f5a1ac49753800f119159112d +8a744d911b67d03b69811f72e9b40d77084547e4da5c05ff33893468b029a08266fc07303f7005fd6099683ca42b3db4 +93ab566bd62d3439b8fc620f3313ef0d4cb369f0f0c352cdaf8e5c9e50b9950ac3540b72f4bf5adcb9635f9f7ce74219 +b2a211d72e314799bc2ac7030b8bbb8ef4c38ebd0ebb09d6cbd43bd40c6c61d80a3aad02cc73f5775a08b9657da20a48 +98d60f0a98d28718e0c6dcccc35a53521ea7f2d8fe08ea474374a336b44cea4cd1c63b31f2ad10186822bfb54aca53e6 +831f89cb94627cfe554d46ae1aad8c1cde7ebe86c4bd8fac4ef73ac2d5b491f5efa5dc4198cb8ffbec563e0606b91d89 +8f8552583bc6cb3fb176b7202236ee4128faf0c8ec608f9150f8e011d8c80b42aab5242c434d622b6d43510eaef752c0 +897bf27baaee0f9a8445200c3d688ae04789c380d1b795557841606a2031092328eb4c47fef31c27fdd64ba841d9d691 +b57589a4af8184b4a8ceb6d8657a35522672229b91692c1cec3ac632951e707922a00086d55d7550d699c4828bcfaab1 +98c2fe98095e026aa34074bcff1215e5a8595076167b6023311176e1c314b92b5a6d5faa9599d28fca286fadd4e3b26c +a034992e563bd31ede3360efd9987ecddc289bc31046aa8680903bb82345724805e6f6cf30f7889b6b95cf7319c3aea1 +85c33d9f10cc7185f54d53c24095e621966065e0ff2689a9aa6bb3d63706796c37a95021738df990c2c19493c0d44b64 +a8c1247d6de2215f45b50dd2dc24945ff9b93184bcc2159b69703b0bba246adcd1a70a12659f34c4ca4ba27dea6e3df5 +83ebdad2834c97bf92aac8717bab2f5cb1f01026b964d78e2f3b44e99d7908e419165b345d2b2f125b903096584e6683 +b0af6f7f81780ceb6e70adfd98e7702ec930c8ca854b50704c4a0fc8b887b9df60a6fe9038b487f3ed0eb8eb457307ea +933ec7e53882453898617f842ab2efae4756eb6f6ea0161cced5b62a0cdde4c08c7700d52f7546d4dd11a4c9e25d624e +adf6e6d4706025f85eb734f506dde66459c9537a1abf6189199cf219ae583b461e11c6242fce5f0795e4d9025270fabf +89e4316319483098761b0b065df4cfb542963b7a2556ba5425b6442fb0e596eb2a4f03e2dc8c617eebe8f243a12e7d10 +90c5a147555759ebc4d0e15e957a548315f9994ef0c7a3f53f2d18da44fb93bf051d96ba8551597a6f3e701b926fd791 +a151a9a5199c72c697b771cd81e550fc6f9596c752ae686ad988b316a7548360cf9785ab4645164d96cfdf9069a94020 +80cba11a3977729d7948db5bcc186159f4cae7c0a835bb38bb781e287dd6c238508e748f23454405c9d5eed28e77df02 +ae4b92ea03cb8ad12ad3ec76869ad05acb09f9d07a3c9a87dec0e50d9a276fe5d3d515a8c446f3aa35cd7d340a22c369 +8630062709a1f180f952de9f1ca3f41acce5420677f43d9619097e905a6237f1908d66db7a4dfdf1b2b92fb087e9944f +81defc33dd383d984c902c014424bddd5e53b013f67f791a919446daa103b09b972fa5242aba1b1dbe4a93149373f6c3 +963891ecaea97e661bac2594642327a54f5a0beb38fcb1c642c44b0b61faab9c87b0c9f544a3369171b533d3ab22f8f1 +932fadbff5f922ddcd4da942d57fe3e6da45c3d230808d800a3ca55f39b0b62f159be31a5924b395d577a259f48c6400 +992ce13bd037723447f88aeb6c7722fd9510c7474192b174ea914ed57c195c44c298aec9a8cabac103f0a5b50051c70b +b032157b3e4fe69db6ce6bb10bdf706a853fbd0bee08c2ab89da51ad827425df5df498b90e7a30247a7f9e954ca986e5 +b2478d4874578da3d5000893736bb65712e6aafe96e6fa5cf5878ae59ba0ce640dbe5d76ec2b5baca75af57def471719 +a387c17b14dd54910fecf472f760e67cf71a95e9e965cc09484e19581ada65e79938b86136a93e287e615fbd4908e080 +98f02be271d0f8841d8d561163f9e55e99b57aff121a93fba7a4654bcf15a0899811f00f5bcbfbebd98e365a0e332e97 +a3c34f01d54cab52a8890391b8cf152cc9cdc16e7e53794ed11aa7b1a21e9a84d39ddcfbcb36c5df6891c12307efc2e0 +a940331f491ec7ad4a9236ca581b280688d7015eb839ee6a64415827693d82d01710dc4bbd5352396be22781fea7a900 +b10874ed88423731535094031c40c4b82af407160dfade4229ac8f4ef09d57b3db95c4a9d73c1a35704f6bd0d5f6c561 +a9c5a4a7680261c1b0596f8ab631d73d4a7881b01e6559c628b5cdafa6dd2b6db2db64f3f2ab5841413a8a52b966a0da +8fc154564a61d5e799badc98b43a3587f804385a850adce9a115cbd2ad911f3fd4072b8e6b22fc6c025a6b7e7ea5a49f +b9caf7c6dcce3d378aa62c182b50bc9c6f651eb791d20fffa37ef4c9925962335fe0b3bc90190539312aa9ccf596b3b9 +90c5b7acf5cb37596d1f64fc91dee90f625f4219fa05e03e29aebea416c8e13384f2996f8d56791bcf44ae67dc808945 +ab8d311fc78f8a1b98830555a447c230c03981f59089e3d8a73069d402a3c7485abe3db82faf6304aaca488a12dbe921 +8a74fda6100c1f8810a8cacc41b62875dd46d5c4a869e3db46202d45a8d9c733b9299dda17ce2ad3e159122412a29372 +8769dcacba90e6fc8cab8592f996c95a9991a3efecfb8646555f93c8e208af9b57cf15569e1d6e603edac0148a94eb87 +854fd65eea71247df6963499bafc7d0e4e9649f970716d5c02fbd8708346dcde878253febb5797a0690bd45a2779fa04 +83e12dc75ef79fd4cc0c89c99d2dace612956723fb2e888432ec15b858545f94c16fae6230561458ceee658738db55ba +8416ef9ac4e93deff8a571f10ed05588bef96a379a4bdcc1d4b31891a922951fa9580e032610ac1bb694f01cb78e099b +93aea6e5561c9470b69d6a3a1801c7eef59d792d2795a428970185c0d59b883ab12e5e30612d5b6cde60323d8b6a4619 +91d383035aa4ec3d71e84675be54f763f03427d26c83afb229f9a59e748fb1919a81aca9c049f2f2b69c17207b0fb410 +b1c438956f015aef0d89304beb1477a82aed7b01703c89372b0e6f114c1d6e02a1b90d961b4acbb411cd730e8cacc022 +a1ee864a62ca6007681d1f859d868e0bcd9e0d27d1da220a983106dc695cb440980cfdb286e31768b0324b39ae797f18 +b57881eba0712599d588258ceada1f9e59c246cc38959747d86e5a286d5780d72d09e77fd1284614122e73da30d5cf5c +a48f9ae05ba0e3a506ba2e8bbce0d04e10c9238fa3dffa273ef3ffe9ec2ed929198a46507c0c9d9b54653427f12160f9 +8db18da7426c7779756790c62daf32ae40d4b797073cd07d74e5a7a3858c73850a3060f5a3506aae904c3219a149e35d +a2bf815f1a18d7be8ce0c452dfc421da00dcd17e794300cdd536e4c195b8c5b7ccc9729f78936940a527672ac538c470 +a34c6f1f2398c5712acc84e2314f16d656055adcafad765575ae909f80ab706cf526d59e5a43074d671c55b3a4c3c718 +b19357c82069a51a856f74cbb848d99166ce37bd9aca993467d5c480a1b54e6122ebddb6aa86d798188ea9f3087f7534 +b440eac6f24d12c293d21f88e7c57c17be2bdb2a0569a593766ae90d43eccf813a884f09d45a0fb044ee0b74ff54146a +b585d42ef5c7f8d5a1f47aa1329f3b1a566c38bf812af522aa26553010a02bfd6e9cc78fdb940ef413e163c836396a5f +aca213b27f3718348e5496342c89fffc7335f6792283084458c4a1aa5fe0a1e534fcec8e7c002f36141308faae73ef2a +b24c07359769f8ffc33bb60c1f463ea2baad440687ef83d8b7c77931592d534b2c44953c405914ace5b90b65646c1913 +b53dfaf381205a87ca4347328ff14a27541fa6436538f697824071d02d4a737ceb76a38dcc6e8dadef3b5bc6442f5109 +b55972d8ed5197215c0a9144fc76f2cd562ca5f4e28c33a4df913363fd1388978b224c44814adb4c065c588a4ac1fe10 +a3303bc650e120c2e9b8e964ad550eb6ac65ffe6b520768b3e8735565ae37eafdc00e3c15fae766d812f66956a460733 +b11e53912ea0e40c3636d81d7637e10c94cc7ed9330a7e78171a66d02b7603f4cb9b3f6968104b158de254e65b81640f +b076bb9f6d396aa09c2f4706ea553b426fdfd87d7d69e438285b74d334e82f73973cb4dbd6cb1647493433dad65dbc41 +9415828b1632175f0b733541e32c26a9c88fe12c721c23e595f2efceaa7f867f359e32564b7c032185686587ac935cf4 +89579a112c306181c79aabdbf683e7806357febcb73bf5e8883862ae29618ef89498b62634404bb612d618fcd16da415 +8761bcd55d04297c4f24899e8fb9f7c1fcd7449ae86371ee985b6a262e228f561c2584980694d9bf354bdf01543edb6a +9100c88bf5f6f00305de0c9cf73555f16a2016d71c50cb77438e8062bd549fa5407793a8a6a7e06398756777680a2069 +9235dfef45aeff9c174898b0755881b7171ed86362854f0eabc3bc9256176c05a5dc27ca527c91c3fa70c0ec5fd5e160 +ac53b1d677cebab6a99381dd9072b8ac1abae9870ec04a1f8d2a59b6f1de797c1492b59af6948f5cf2b20599170f5bba +946542936b0c59156e8fd5c1623b41369bc2cbcc46ece80360dcb5e7cce718a3dd8a021f0b9c223062a4e43d910b634f +b1e9939b34e1fcc026e820fcfa9ce748b79499f8e81d24a3ef0457b3f507fe5fa37b975a47c143e92eb695623b4e253b +9382d9b5766f6ae960d8a8435e8b5666e57ef8e5f56219e7bfd02857afe5cb16f44d70a9e444cfb1008649ae9b863857 +91770ed1215ed97dca1282b60b960be69c78e1473edb17cd833e712632f4338ff74bf435c3b257439497c72d535ae31f +8eb2cbe8681bb289781bf5250e8fa332141548234c5c428ff648700103a7cd31fdc2f17230992516c674aa0ab211af02 +a823b71c82481bc6ac4f157d5c7f84b893a326bbb498c74222427ded463d231bc6e0240d572ab96266e60eb7c8486aea +a13ce4f482089d867e5babcd11c39fa9a9facd41a2c34ee2577de9ce9c249187e16f2b3a984cc55f9e45b9343462d6d2 +8d80e7bc706059cf5151f9f90e761b033db35d16b80b34dc8b538adc8709d305a0c06933dcd391e96629cf3888c8bf87 +abcd36cdd86c0fb57fb7c0d7a3b9af5fd9aed14e9f4e7e84b0796c5c0ad18c41585e8c46e511cef73dc486fe43f6a014 +a947a5b6916f416fa5a69c31aba94add48584791148b27d0b3ed32c02a05dfc06f7fdc5006e3b2503bdf6e410e30f2fb +b158e621580659f1fa061d976b8591ac03b53ecd23d9eb2b08c1a20353d78438287749664d196020d469ef44b3b8752e +90a5a9540281e481ac4b8d29968f477cb006b56bd145529da855d65d7db0cf610062418c41a1d80c4a5a880c0abe62a0 +b2c91808b6289d08a395204a5c416d4e50a8bb1a8d04a4117c596c4ad8f4dd9e3fb9ce5336d745fc6566086ae2b8e94f +af6767c9b4a444b90aeb69dfddae5ee05d73b5d96e307ce0f3c12bccca7bc16475b237ba3bc401d8dafb413865edf71e +8dcecf624419f6517ef038748ac50797623b771d6111aa29194f7d44cfb30097ced26879e24f1b12a1f6b4591af4639b +954437559d082a718b0d6d7cec090532104ab4e85088e1fc8ee781d42e1a7f4cdb99960429707d72f195ff5d00928793 +80f0b7d190baa6e6ab859dc5baab355e277b00ddcca32e5cebe192877ad1b90ead9e4e846ca0c94c26315465aeb21108 +b8c29f181ed0bb6ac5f6a8d9016980303bb9a6e3bd63ce7a1a03b73829ac306d4fab306ac21c4d285e0d9acb289c8f2a +a7685079fe73ecaeabf2a0ef56bad8b8afb6aeca50f550c97bf27e6b4a8b6866601427fcd741dc9cb4ce67a223d52990 +ada2ebf6f2a05708d3757fbf91365ec4d8747eb4c9d7a8728de3198ceac5694516ab6fd6235568aecd8d6d21fef5ef48 +846bc5da33d969c53ab98765396cab8dcdbb73b9836c9bda176470582a3427cb6de26d9732fab5395d042a66bdba704c +800a3a7ea83ce858b5ebc80820f4117efa5e3927a7350d9771cad9cb38b8299a5ad6d1593682bba281c23a48d8b2aa71 +a002b18595dec90b5b7103a5e3ec55bdd7a5602ee2d3e5bd4d635730483d42745d339521c824128423dfe7571e66cbaf +b6b4e2067ac00a32f74b71007d8ab058c2ef6b7f57249cb02301085e1a1e71d5de8f24f79b463376fd5c848f2ab1c5bc +a3e03036db1b6117efe995bf238b0353ad6f12809630dca51f7daaaf69f7db18702e6b265208944bfb1e8d3897878a51 +add16712f66d48aab0885bd8f0f1fb8230227b8e0ffca751951c97077888e496d6bfab678cb8f9ffba34cee7a8027634 +ad211af2dd0748f85a9701b68c19edd4a7c420e497cb2e20afdc9df0e79663841e03b3c52b66d4474736f50d66c713ce +8c8a899ce0f16d797b342dc03c2212dda9ee02244c73c7511626dba845d11a0feb138441da5459c42f97209bf758cd9b +a17efc75c7d34326564ec2fdc3b7450e08ad5d1de4eb353de9d1cd919d90f4be99f7d8e236908b1f29cf07ae1ffe0f84 +862d4a8b844e1b0dd9f4deff180456ebed5333b54290b84f23c0ddb2725ac20307e21cbb7343feac598756fe36d39053 +9187fbb19e728a95629deda66a59e178f3fcd6e9d7877465aa5a02cea3baba2b684bd247b4afbf4aa466b64cb6460485 +85ae5636688d06eab3be16e44fe148515d9448c6123af2365d2c997f511764f16830610a58d747adab6db5031bea3981 +8aa8a82891f4e041ce6df3d6d5d7e5c9aaaffe08e0a345ac0a34df218272664c1b7be2450abb9bc428bd4077e6e5dcc4 +8c3bcc85ea574dfe1b9ca8748565c88024e94374434612925b4e9a09fa9d49c0a56b8d0e44de7bd49a587ef71c4bff5f +9524f9dd866fe62faf8049a0a3f1572b024120d2e27d1be90ad8b8805b4e2c14a58614516281cc646c19460a6b75587c +84580d9c72cfa6726ff07e8d9628f0382dc84ce586d616c0c1bd1fd193d0a49305893eae97388de45ba79afe88052ee9 +b5573e7b9e5f0e423548f0583423a5db453790ab4869bd83d4d860167e13fd78f49f9a1ffe93ddddf5d7cd6ec1402bc4 +aff658033db3dad70170decb471aee2cf477cf4d7e03267a45f1af5fd18200f5505c7ce75516d70af0b0804ec5868a05 +84a0eab4e732a0484c6c9ed51431e80cea807702fa99c8209f4371e55551088a12e33a11a7ef69012202b0bc2b063159 +a68f8e730f8eb49420fe9d7d39bb986f0584c1775817e35bb3f7dae02fd860cddf44f1788dc9e10d5bf837886b51947f +946002dd6cf7a4fd3be4bf451440e3f3fd7e9b09f609fa4e64767180b43146095dfc4b6994287f8cfa6d1390d144be71 +b7f19777d0da06f2ab53d6382751dc5e415249d2c96fce94ef971401935c1d1f7d3b678501e785cf04b237efe2fe736e +81e5c66dd404fc8ffd3ac5fe5e69ead7b32a5a7bc8605a2c19185efcc65c5073e7817be41e1c49143e191c63f35239c1 +b5f49c523532dfa897034977b9151d753e8a0fc834fa326d0f3d6dacc7c7370a53fc6e80f6d5a90a3fbec9bbb61b4b7c +8fc8e78c07319877adfaa154a339e408a4ae7572c4fb33c8c5950376060667fbfc8ede31e1b067933d47e3fdbf8564d7 +859cfef032a1a044532e2346975679545fbb3993a34497ce81bdcc312e8d51b021f153090724e4b08214f38276ee1e0d +ae476722f456c79a9c9dfdc1c501efa37f2bff19ab33a049908409c7309d8dd2c2912aa138a57a8d5cb3790ca3c0ba2f +89acbbeffb37a19d89cfe8ed9aa8b6acf332767a4c54900428dd9ab3bf223b97315aca399c6971fe3b73a10a5e95a325 +90a4a00418fdf4420a4f48e920622aae6feb5bf41fd21a54e44039378e24f0d93ccc858d2d8a302200c199987d7cb5e4 +a3f316b0bd603143eba4c3d2f8efe51173c48afe3c25b4ca69d862c44922c441bd50d9a5040b7b42ba5685b44071c272 +a22f4dc96fedd62b9a9f51812349e04d42d81d0103465c09295a26544e394a34abdc6ded37902d913d7f99752dbfb627 +a49f51baf32d0b228f76796a0fef0fe48a0c43ec5d6af1aa437603d7332505be8b57b1c5e133bc5d413739f5ae2ce9d0 +a9e4fe133057a0cd991898e119b735b31a79811307625277c97491ff5d864c428cfa42ae843601d7bb05c0313472d086 +b987edfe0add1463a797ff3de10492b2b6b7ef0da67c221ab6f0f2b259445768a73fbe495de238c4abbe4d328e817c49 +b7f0e4532a379a4c306bbef98b45af3b82b17175dfe0f884222ed954c12f27d8a5bdd0cdeb1df27ff5832ba42a6dd521 +9471bc5ad5ec554acfd61b2eb97b752cb754536f95ae54ca2cbd1dc2b32eb618881f6d8a8b2802c1a4e58c927067d6cf +b4c84f09225cf963c7cc9d082efe51afbbbe33469dd90b072807438e6bde71db8352a31bb0efde6cd3529619812ef067 +8f08005a83e716062d6659c7e86c7d3b51e27b22be70371c125046de08f10ea51db12d616fbf43e47a52e546e7acaac7 +a8937e66a23f9d9b353224491f06e98750b04eca14a88021ee72caf41bdce17d128957c78127fba8ef3dc47598d768a7 +80ad991de9bd3ad543cddeaa1d69ca4e749aaefb461644de9fc4bd18c3b4376c6555fc73517a8b1268d0e1e1628d3c1f +b22f98bca8fe5a048ba0e155c03e7df3e3cee2bfe8d50e110159abdb16b316d6948f983c056991a737b646b4d1807866 +b0bb925c19ca875cf8cdbefa8879b950016cc98b1deb59df8b819018e8c0ad71ea7413733286f9a1db457066965ce452 +95a991e66d00dd99a1f4753f6171046a5ab4f4d5d4fe0adfe9842795348a772d5a4a714dba06b4264b30f22dafa1322f +ad91e781fa68527a37c7d43dd242455752da9c3f6065cd954c46ae23ce2db08f9df9fec3917e80912f391c7a7f2f7ffa +a202d3becbf28d899fe28f09a58a0a742617c1b9b03209eca1be7f072a8ada1f7eac2cc47e08788d85e1908eb9d3d8ee +a360ccb27e40d774d5a07b4ebed713e59a0d71b3ee3f02374e7582b59ec4a5ce22cc69c55e89742ba036dd9b4edd8f34 +a10b897a946882b7c9e28abbb512a603ffa18f9274369843eb3491524a321df1f572eea349099ac6e749ea253c901ea0 +b782a672cd344da368732ecd7e0a1476c2af04613d3eb6da0e322f80438af932bd6d49be7a6f69f7c877512731723d89 +aeccee8dfd764e1adcfc4bf669e0fa87a94e7c79324333e958df47888bff5cec358b8b5bbb48db54822b54d11bbb4bc6 +ad4953913662a9ee8753a354864339f43916f2c2390d0a3f847c712b42718ee00ee14158d730709971941e8680d54560 +92ccb31d6c9e8940c7e8a4873e7eb9de9fb2fa2bac344fa367062ea451fd49a6920a45218dca3ee968711397d2a01536 +9448d9b2b3d12dde9b702f53373db8b8595f9d1f9de2ebee76de292f966f375316953aadf6bfc0e4e853e1fa12d8f02c +8919230878a7219da8c80a4b7d00b9169fb503e72d79789dd53863c243b8d0fb0a819d46fa636d805d0b9b1d15d1f2d9 +b6581ab01215aac023f5e6f57419b6aa63c0743c07caf57d4e146b56b02d90ce1423f70489ac3a11e5c968cb924f937c +a793ec1b1fe56a76920296af06073caadfd6f1d7e30950f8ca13de3de45fe275ca4b361f5249d9405264c3a06ebb5502 +86385b4a4e1bfb5efe7bfef8fd0dfeba7f4400852237cab60febb1dfa409e497a649e81284b5a15fe680b78927256756 +85d10600de96103daa7c90657174b6cb4a1286df5379f1eda9f11c97f9df57043c290eb1ae83658530fe0fd264867b86 +ae01b2396d0f598c21659cd854c15edd4904a34d22278aef97c9260a14a8b250b52d972d304ac4b187c24d08795d5355 +b91b3e4b6fc06e88081fe023ef1b773d82c628eb0f73a2731a9aa05b0dc89b7aeef2eea60125d302e696f45c407aeac2 +986d0f478e33af7568eab6bb26a55c13ffd7cae27525b4abe2f3a994bdb11bbc73d59bdb9a2f6b6ba420a26f8f620ba6 +9746f4fdeef35feaff1def0ea5366b64f21ed29749ae6349f9cb75987e7f931952f913f446100f2a6b182561f382e8eb +a34a116cfde1acbce0d7de037f72a7ca30ab126d8f4815b2b8bcb88e0e6c89015a4daaf4d4ce8eae23eb5d059cf9a5cf +80c3ea37f6a44f07cc9c9c881990f2a5deb9f9489a382718b18a287aa3c50ee6ebe8fd1b3afb84a3cf87f06556f4ca15 +97cff3bc88cfc72ce5e561f7eeb95d4ffb32697e290190c7902e9570c56b3854753777fc417fd27536fc398c8fefb63b +b8807232455833e4072df9bffa388ae6e8099758c2a739194719af7d9ed4041974a6cd9605f089de8b43f0e12f181358 +96f79fca72f75dc182c71f2343f0c43b06d98563fd02d2e1fbc031b96601608d8a726c811a74bb51ab8b0a3ce3632dc4 +b5262761680a4235a8c1257de4735cdcadf08d5d12c6e9d4f628464d5c05dfff3884a9ef2af3b7724b5a8c97e6be74eb +b6ce0eada73433d98f8fae7d55e4ea2b9d9d7a0ae850d328dd06991f27b1f03e470868fb102800ff3efe4ee1698531b9 +a37b7d9fe9d3fdfbc72c59cf6cacc7e7a89d534dea3d73121f7483331aec8ab3fbff58ffabb943b75d6f86df0ba43262 +93fce9be8a27fcaa1283d90d3e87265a6221ee302ec708161a42bd00ffe8e726743d9e187e1bf4307c0e3f25afbb1d44 +a4ea919021346ae7ea69d5e8f46d860b24c35c676b62f4e577c90e0c05c5646fe73721b143b7c38835dd4b443e6c3676 +b79983a5948453f70dfa4c396ce1945204498fe79f40c0667291bd0fdd96ed0b9ea424571f7ade342275c854c9f03d9e +866f8e395ed730b614b70bf999cad6e87e9086c1f5aea8d69020b562ee285dd0fb93afaca0dd13a0713f74a3f9340f01 +a3fef158782292c6139f9a0d01711aa4ed6f5cac11d4c499e9e65c60469ae3afbde44fb059845973a4b3bbca627b7eb7 +b4a2c0321b68f056e7d8051beede396fa2f0704d8aa34224f79f7b7a62eb485fc81889cb617019622fd5b5fa604516f5 +8f0e3edddbaead9059df94de4139e3a70693c9ea9bc6baaa5695dddfd67263b33926670159846292801941b9a0c6545b +9804e850f961e091dadd985d43d526ba8054d1bf9c573ed38f24bbd87aeaad4dcba4c321480abc515a16b3b28f27bb2a +95f330da28af29e362da3776f153f391703a0595323585220712dae2b54362cc6222070edd2f0dd970acfbe2e3147d5c +82d03b771231179cc31b29fe1e53379d77b5273b5c0a68d973accd7a757c7584dbb37f0507cdfde8807313ec733a6393 +81b3c39a9f632086e97b7c1f0ec7e2eaf9dc3cb0d84dec18a4441dbdc9fe9878fde4bcfa686bca1a9522632a353a5566 +a2db124ab2b493d5f9a1e4ca6b3144593c2fc8bfac129fd79da11dfbb7ef410a234fda9273a50a5ca05d7b37cc2088a2 +aa8550633c9449228702690cc505c0fc4837ea40862058e8f9713622b34d49fdc3a979b9317993c5da53b5bb5b7f4974 +ae783bcf7a736fdc815d0205b4c2c2b2fee0a854765228f76c39638ba503e2d37f1e28f6bdf263923f96fead76b4187b +b5ec86092c1d250251e93bab2f24e321afd2cd24cf49adfcbed9e8bc5142343ae750206c556320551e50fc972142f0da +b3b5791b590a6e9b3f473d5148624014aa244495249322a5d75cde2c64117ff9d32f4b0698b0e4382e5e7f72933061f8 +876c6a9162c17b16d6b35e6ce1ba32e26aec7dd1368bceab261ab880ad845c91e54b96a52c7d3aafbfbafc0e37139dca +902ddb5774d20b0707a704486457c29048776a5b88c377b14af6616c8ddf6cd34f49807df9c9d8866d6b39685cfb0f19 +8b87f71f94bc96de927d77a5d7123fa9cdda8c76aff64a5e6112cbc2eca43b07f8376db3e330f8af6a1db9b948908a6a +a69a5922e572b13d6778218e3657f1e1eea9a9682f6eb1b731d676d03563e14a37ff69bc5e673c74090ecb0969a593f7 +aff3510d78ba72f3cf5e3101847b7c4a956815aa77148689c07864e8a12dd0ef33d5f6c8cb486e0ea55850161f6afed0 +aa9c459cb2a008d94cbee2c6b561d18b0d7c6ffa8a65cbf86ae2c14eec070ee9d5324f5d38f25a945ddcd70307e964c4 +8310e15b050b1e40ece7530b22964bde0fd04f48dfffdec5a0d1fb8af0799a7fdc1d878139fb7cb8d043d3a52c2d1605 +b8f0856ce2c4034ee4041d0383f25fb0eeefc00b82443311a466fc18608313683af2e70e333eb87e7c687e8498e8a1ce +a8200a75c158fbb78474cab8a543caecd430b5d8b9964fc45d2d494dd938021cd00c7c33413ad53aa437d508f460a42a +a310091472b5b42b02176b72d5f8120bdb173025de24b420e3ca3fb9a386c39092a1d1bb591c6f68ee97a268a7ff9e95 +b23f1bf8bcec9cb5232b407115eead855fd06f5bf86ba322ad61d45460c84f0f36911aba303de788c9a0878207eac288 +ae4c129ad6d08be44690bb84370e48bfd92c5d87940750ee2c98c9a2604456f7f42727ab211989657bb202f6d907df04 +95992057d654f3e189a859346aa9aa009f074cb193b7f5720fa70c2b7c9ce887d886f6cff93fa57c1f7c8eaa187603f6 +ad12d560273963da94151dd6be49c665d7624011c67d54ab41447452a866bc997e92a80bdd9ca56a03528e72c456dc76 +8e4eda72e9cfcaa07265bb6a66d88e9ce3390ae1a6b8831045b36ea4156b53d23724824d0f0bca250ce850c5926fa38f +980fe29c1a267c556532c46130fb54a811944bdfea263f1afcdab248fa85591c22ac26167f4133372b18d9f5cce83707 +a7da9f99ddde16c0eac63d534a6b6776ad89b48a5b9718a2f2331dce903a100a2b7855cf7b257565a326ddc76adc71a5 +8ca854c55e256efd790940cb01125f293e60a390b5bd3e7a60e13ac11a24f350a7eb5ebddfa0a2890905ca0f1980b315 +9440335818859b5e8f180893a8acedceabaaa44e320286506721c639a489b5bfb80b42b28902ee87237b0bd3dd49552a +b9da545a20a5e7d60fd0c376dcaf4b144f5c5a62c8ffa7b250c53ce44be69c4e0d5e4e11422ef90593ae58ae1df0e5d3 +b75852a850687f477849fc51e0479703cd44428671c71bfdd27fe3e7930b97d2fc55f20348ca4e5bc08db2fc16a4f23c +b515081d8d099e4b6253c991ca2d3e42633f5832c64aa8f9cde23cb42c097c2c3717c46c5f178f16c58295f97b2b3fe7 +9506c9902419243e73d3197e407985dd5113f16c6be492651bbbf9576621942710aea74522d6fb56d5b52c6ccdaa4307 +952673ae27462a0f6c9545eede245c2f8e2fd6077b72a71f5672f1a5a02c263bc2a66f24f0e30376feb7a8187b715f08 +a8f1e2085ed666a8f86b474d9589dc309d5c83bd53e745f8e09abe0dfbaf53e5384c68580672990344d4aa739438b4d8 +ad6e04d4a67a5a5529ceaf7de6e19416be5b4c436610aa576ac04aee3b73317da88f891121f966393a37f52b775a2dd8 +a35a884736f08c7f76923ae7adb17fdac04e6c505178bca9502eaa2ed16d4d93fa953fb6dcf99e9e9962a6eb3eeead00 +b8af72273360bab4b3ca302cf0659717cbfb335fbc9ad4ffdd3340113ece9e63b2bdbd611e5f6b740a4689286f9a452d +b1a1f4ba2640800c3ed3892e049f6e10f8a571efa3bbe21fe2d6cee8fded171c675a3bb8aa121e2d1d715de84bad2e2b +8102a6c3598b40da4d6e8eccfdd5dadc8d6262e38b69c5b211b0732f4c6e3045d79fba12770a0b2b66f1e9f4664b1510 +90979587d75bf12819f63832beea7dcbef101f6814bf88db4575bfcd9cf0ea8eceba76d4d6db17630b73b46c1acfe011 +8dd98f14d2beb5b5b79cc30f6825ec11ed76bd5a8864593ffc0c2baffab6872bad182e1c64b93aab8dd5adb465fa5cec +8083334dadc49c84f936c603a2857f174eda5659ab2b7214572f318aba3ebd7b1c50e7cbea57272b9edf106bd016df3b +a634d08d2e8641b852e89d7ccab1bab700c32fb143bcbea132f2a5fb2968d74ded2af4107f69818798f0128cc245a8cb +94fc2dccf746d5b3027f7cf4547edf97097cd11db8d6a304c1c2ca6b3aba28c1af17c08d2bbb66f88c14472e0196a45e +b257a6fb01424b35e414c1c002e60487abb3b889d74c60cbdbf591e222739c6f97b95f6962842401f5e2009e91b28c55 +81955bdbf25741f3b85d5044898dc76ae51b1b805a51f7c72a389d3b4d94b2e3e0aa1ec271685bbcf192ed80db7367ab +86eb229b66c542514e42b113b9de7d4f146861a60f2a253264873e7de7da2ac206e156ff11f2de88491b9897174fe2f4 +8b8db00533afbb56b3d7d7a9a4a6af3cebb523699ffcb974603e54f268b3ef739c41cd11850b9651d9640d72217c3402 +8b7cbb72a6c4408d5f1b61001e65de459790444530245d47d4ee8e2d17716695283f21540bd7ac4f5a793a0d00bdf1d4 +875920b9bab4bc1712e6af89ae2e58e9928c22095026070b07e338421b554d9f96e549ac3706c6c8d73f502913a27553 +9455d192db7b039b3e8f0bc186c25ff07dfbe90dab911e3c62e3bd636db8019ed712cbb0ecd5cbb9a36c11034e102aba +8cb0b28e5d3838d69f6c12274d6b1250f8843938065d0665b347977fa3c1c685caef6930bae9483ed0d0a67005baad76 +94df2e14aae1ae2882ab22a7baf3dc768c4a72b346c2d46bfd93d394458398f91315e85dc68be371f35d5720d6ca8e11 +aacd94b416bfbeb5334032701214dd453ad6be312f303b7bec16a9b7d46ab95432a14c0fbf21a90f26aafb50ec7bb887 +b43d26963665244633cbb9b3c000cacce068c688119e94cc0dac7df0e6ee30188e53befff255977788be888a74c60fc2 +b40d67c9ad0078f61e8744be175e19c659a12065fe4363b0e88482b098b2431612e7c2fa7e519a092965de09ceafe25c +82cd4a4e547c798f89ce8b59687614aa128877e6d38b761646d03dc78f6cdd28054649fb3441bcd95c59b65a6d0dd158 +a058e9700f05cef6e40c88b154d66a818298e71ae9c2cf23e2af99a0a7dc8f57fbe529d566cb4247432e3c1dee839b08 +95c6f84406466346c0b4a2a7331ac266177fb08c493d9febb284c5ca0b141ccc17aa32407f579666b208fb187c0227dd +905d1d47a26b154f44d7531c53efbc3743ff70bd7dba50c9b9d26636767b0ae80de3963c56d4604399126f4ad41a0574 +83dfa11c520b4abaefe1b2bc1ce117806e222f373cd4fb724f3c037c228e3379d27a364e68faa73984ba73a0845f1b9a +a16e54786ba308a9c0241aff8f1bf785dece387d93bd74aa31de0969e3431479e2c0abebff9939a6644d2b0af44f80bb +81ac565212365176f5be1c0217f4e7c9fdbc9fe90f16161367635d52edcf57af79290531d2e8b585e1223d33febd957d +a296f4b09915e5d80ff7274dc3ffc9b04f0427e049ea4ef83dca91095275e8a260ef0335c7b6585953b62682da8c8e99 +a9150626208168a21ae871192ca9f11c1f7f6e41e8e02de00732de2324d0d69fe52f8762155c9913ee408a034552e49a +a42a56008ca340c6e9ff5a68c8778bb899ba5de9e7508c0cac355c157979a7ff6a6bd64f98b182114d3831cfa97ee72b +a4f05adf22c051812279258eea9eb00956b04ef095f2ca175f775ff53c710fb0020266adabd1dacaee814c4f1d965299 +967492e78ac0bceb8ad726ea0d2292b760043d16d64a6b1bb896e32630a7bf405c2b20e4e00842ae519a21697ff8db2d +adbf05e9b5931ae3dd24d105b5c523c221a486a4123c727069b9e295a5bc94f3e647a3c2cde1f9f45dbd89df411453c9 +a1759c0ebebd146ee3be0e5461a642938a8e6d0cdd2253ebd61645b227624c10c711e12615cd1e7ea9de9b83d63d1a25 +a4c5945d635b9efc89ad51f5428862aefe3d868d8fb8661911338a6d9e12b6c4e5c15a25e8cb4a7edc889b9fa2b57592 +aff127675ea6ad99cb51c6e17c055c9f8fd6c40130c195a78afdf4f9f7bc9c21eed56230adb316d681fc5cacc97187da +9071294e8ff05b246ff4526105742c8bf2d97a7e7913f4541080838ecfd2dbc67c7be664a8521af48dbc417c1b466a85 +990880b0dd576b04f4b4ce6f0c5d9ff4606ec9d3f56743ac2f469ac6a78c33d25c3105cf54f675e300ac68073b61b97a +a8d1a62ce47a4648988633ed1f22b6dea50a31d11fdddf490c81de08599f6b665e785d9d2a56be05844bd27e6d2e0933 +8ea5a6c06f2096ded450c9538da7d9e402a27d070f43646533c69de8ea7993545673a469c0e59c31520e973de71db1b4 +99d3a098782520612b98a5b1862ae91bcb338ab97d1a75536e44b36a22885f1450a50af05c76da3dd5ca3c718e69fdd4 +b987451526e0389b5fe94c8be92f4e792405745b0a76acd6f777053d0809868657ba630aa5945f4bd7ce51319f8996f7 +afffccc5ddd41313888a4f9fee189f3d20d8b2918aa5ad0617009ea6d608e7968063c71bd5e6a1d7557880d9a639328d +8ac51a02505d5cadfd158dde44932ab33984c420aeceb032ed1ee3a72770d268f9e60ccf80ce8494dfc7434b440daafd +b6543e50bd9c6f8e0862850c3d89835ddd96231527681d4ab7ae039c4a3a5a0b133a6d40cdb35c8a6c8dbb8d421d3e2b +a2ba901f4fde2b62274d0c5b4dbbea8f89518571d8f95ec0705b303b91832f7027704790a30f7d9d2cdafde92f241b3e +a6974b09280591c86998a6854a7d790f2a6fbe544770e062845cfc8f25eb48c58f5dfb1b325b21f049d81998029ad221 +890baeb336bbf6c16a65c839ffaab7b13dd3e55a3e7189f7732dbcb281b2901b6d8ba896650a55caa71f0c2219d9b70e +b694211e0556aebbe4baf9940326e648c34fda17a34e16aa4cefd0133558c8513ffb3b35e4ee436d9d879e11a44ec193 +97cf9eb2611d467421a3e0bfe5c75382696b15346f781311e4c9192b7bca5eb8eaf24fa16156f91248053d44de8c7c6f +8247f88605bd576e97128d4115a53ab1f33a730dc646c40d76c172ca2aa8641c511dddad60ee3a6fbe1bb15cac94a36c +ae7ecd1c4a5e9e6b46b67366bc85b540915623a63ab67e401d42ca1d34ae210a0d5487f2eef96d0021ebecfd8d4cd9a8 +aec5123fff0e5d395babe3cb7c3813e2888eb8d9056ad4777097e4309fb9d0928f5c224c00260a006f0e881be6a3bf8f +8101724fa0ce7c40ea165e81f3c8d52aa55951cc49b4da0696d98c9fafd933e7b6c28119aa33f12928d9f2339a1075d1 +a8360843bab19590e6f20694cdd8c15717a8539616f2c41a3e1690f904b5575adb0849226502a305baefb2ead2024974 +ade5cad933e6ed26bba796c9997b057c68821e87645c4079e38e3048ea75d8372758f8819cde85a3ab3ab8e44a7d9742 +ab1fe373fb2454174bd2bd1fe15251c6140b4ac07bda1a15e5eabf74b6f9a5b47581ef5f0dbd99fdf4d1c8c56a072af7 +b425e1af8651e2be3891213ff47a4d92df7432b8d8ea045bb6670caf37800a4cd563931a4eb13bff77575cbcae8bc14f +b274799fe9dd410e7aed7436f0c562010b3da9106dc867405822b1e593f56478645492dbc101a871f1d20acf554c3be6 +b01a62a9d529cc3156bc3e07f70e7a5614b8d005646c0d193c4feb68be0b449d02b8f0000da3404e75dbdfa9ca655186 +878b95e692d938573cdb8c3a5841de0b05e5484a61e36ea14042f4eadb8b54a24038d2f09745455715d7562b38a8e0df +a89e998e979dba65c5b1a9000ad0fd9bb1b2e1c168970f2744982781306bbe338857e2fac49c8cafda23f7cc7c22f945 +85880fdf30faed6acce9973225e8fe160e680a55fc77a31daacf9df185453ad0c0552eb3fd874698ad8e33c224f7f615 +ac28d20d4bbb35ba77366272474f90f0ed1519a0e4d5de737adee2de774ccd5f115949e309e85c5883dbc63daaa6e27b +a1758ac86db859e323f5231ad82d78acbe11d53d3ebf7e644e581b646eede079d86f90dc23b54e5de55f5b75f7ea7758 +ae4c0b84903f89353bf9a462370f0bf22c04628c38bb0caae23d6e2d91699a58bd064e3c2b1cbda7f0a675d129f67930 +95f21a099ffc21a0f9064d9b94ce227b3ff0a8c5a2af06ff5ee6b7f3248a17a8ca2f78cd7929ef1d0784f81eddefcd48 +8d06fbc1b468f12b381fd1e6108c63c0d898ddf123ea4e2e1247af115043c4f90b52796076277b722dd2b92708f80c21 +a300f39039d8b2452e63b272c6d1f6d14a808b2cd646e04476545da65b71a6e29060f879409f6941c84bde9abe3c7d01 +adecce1ccc5373072ba73930e47b17298e16d19dbb512eed88ad58d3046bb7eec9d90b3e6c9ba6b51e9119cf27ce53f2 +941a7e03a64a2885d9e7bee604ddc186f93ff792877a04209bbee2361ab4cb2aed3291f51a39be10900a1a11479282ca +acbcb1ab19f3add61d4544c5e3c1f6022e5cc20672b5dc28586e0e653819bdae18cda221bb9017dfaa89c217f9394f63 +b8d92cea7766d3562772b0f287df4d2e486657b7ab743ed31ec48fdc15b271c2b41d6264697282b359f5cb4d91200195 +957360ecb5d242f06d13c1b6d4fcd19897fb50a9a27eb1bd4882b400dc3851d0871c0c52716c05c6c6cf3dee3d389002 +abd2a23abbc903fbb00454c44b9fb4a03554a5ef04101b2f66b259101125058346d44d315b903c6d8d678132f30b1393 +ae9572beff080dd51d3c132006107a99c4271210af8fbe78beb98d24a40b782537c89308c5a2bddfdfe770f01f482550 +82c7e5a5e723938eb698602dc84d629042c1999938ebd0a55411be894bccfb2c0206ac1644e11fddd7f7ab5ee3de9fdc +aba22f23c458757dc71adb1ce7ef158f50fdd1917b24d09cfc2fbbcbe430b2d60785ab141cf35ad9f3d0a2b3e2c7f058 +8eff41278e6c512c7552469b74abedf29efa4632f800f1a1058a0b7a9d23da55d21d07fdbb954acb99de3a3e56f12df6 +8abd591e99b7e0169459861a3c2429d1087b4f5c7b3814e8cee12ecc527a14a3bdda3472409f62f49a1eb4b473f92dbf +82dcbff4c49a9970893afc965f1264fcab9bae65e8fb057f883d4417b09e547924123493501c3d6c23a5160277d22a8e +b5a919fcb448a8203ad3a271c618e7824a33fd523ed638c9af7cfe2c23e3290e904d2cd217a7f1f7170a5545f7e49264 +96d6834b592ddb9cf999ad314c89c09bedc34545eeda4698507676674b62c06cc9b5256483f4f114cd1ed9aaec2fba5e +a4e878cf4976eb5ff3b0c8f19b87de0ef10cd8ec06fe3cd0677bd6be80ba052ff721a4b836841bdffb1df79639d0446c +8e15787a8075fd45ab92503120de67beb6d37c1cc0843c4d3774e1f939ac5ed0a85dad7090d92fa217bd9d831319021b +8506c7fea5a90cd12b68fdbbae4486a630372e6fd97a96eea83a31863905def661c5cdead3cf8819515afe258dbcd4d9 +952ef3bc16a93714d611072a6d54008b5e1bf138fd92e57f40a6efb1290d6a1ffcc0e55ff7e1a6f5d106702bd06807cd +a5f7761fa0be1e160470e3e9e6ab4715992587c0a81b028c9e2cf89d6f9531c2f83c31d42b71fca4cc873d85eba74f33 +b4811f0df11ff05bf4c2c108a48eece601109304f48cde358400d4d2fa5c1fdaaf3627f31cb3a1bdd3c98862b221720d +9207ad280b0832f8687def16ad8686f6ce19beb1ca20c01b40dd49b1313f486f2cb837cfbbf243be64d1c2ab9d497c3f +b18a8c1e6363fadd881efb638013e980e4edb68c1313f3744e781ce38730e7777f0cba70ea97440318d93a77059d4a2b +901faf777867995aac092f23c99c61f97eeadf4ac6bcb7791c67fa3c495947baef494b2aace77077c966c5d427abbf92 +a123281aca1c4f98f56cff7ff2ae36862449f234d1723b2f54ebfccd2740d83bd768f9f4008b4771e56c302d7bfc764f +8cffe1266468cad1075652d0765ff9b89f19b3d385e29b40f5395b5a3ad4b157eed62e94279ac3ec5090a6bad089d8b3 +8d39870719bc4ebbcecba2c54322111b949a6ed22bda28a6cea4b150272e98c9ded48cc58fc5c6e3a6002327856726ec +b3d482c00301f6e7667aaeaf261150b322164a5a19a2fa3d7e7c7bf77dc12fa74f5b5685228ab8bf0daf4b87d9092447 +801acb8e2204afb513187936d30eb7cab61f3fbb87bfd4cd69d7f3b3ddba8e232b93050616c5a2e6daa0e64cef6d106f +ac11e18adda82d2a65e1363eb21bda612414b20202ecc0e2e80cc95679a9efa73029034b38fd8745ce7f85172a9ab639 +b631d6990d0f975a3394f800f3df1174a850b60111567784f1c4d5bba709739d8af934acfa4efc784b8fc151e3e4e423 +aeda6279b136b043415479a18b3bbff83f50e4207b113e30a9ccfd16bd1756065fc3b97553a97998a66013c6ac28f3d8 +8840b305dc893f1cb7ad9dd288f40774ec29ea7545477573a6f1b23eaee11b20304939797fd4bcab8703567929ce93ad +963cc84505a28571b705166592bffa4ea5c4eeafe86be90b3e4ae7b699aaaca968a151fe3d1e89709fe0a3f0edf5d61a +8e1ec0d0e51f89afea325051fc2fa69ab77d6c7363cc762e470a9dfa28d4827de5e50f0b474c407b8c8713bad85c4acd +909f313420403cb36c11d392cf929a4c20514aa2cb2d9c80565f79029121efd5410ef74e51faba4e9ba6d06fcf9f1bd1 +b2992b45da467e9c327ac4d8815467cf4d47518fc2094870d4355eb941534d102354fbda5ab7f53fbf9defa7e767ca13 +9563b50feb99df160946da0b435ac26f9c8b26f4470c88a62755cdf57faebeefffff41c7bdc6711511b1f33e025f6870 +a2a364d9536cd5537a4add24867deec61e38d3f5eb3490b649f61c72b20205a17545e61403d1fb0d3a6f382c75da1eb3 +89b6d7c56251304b57b1d1a4255cb588bd7a851e33bf9070ee0b1d841d5c35870f359bc0fdc0c69afe4e0a99f3b16ec2 +a8ae1ee0484fe46b13a627741ddcdae6a71c863b78aafe3852b49775a0e44732eaf54d81715b1dca06bb0f51a604b7e2 +b814ecbfbc9645c46fc3d81c7917268e86314162d270aed649171db8c8603f2bd01370f181f77dbcbcc5caf263bedc6c +8e5d7cc8aad908f3b4e96af00e108754915fecebdb54f0d78d03153d63267b67682e72cd9b427839dca94902d2f3cda7 +8fc5ff6d61dd5b1de8c94053aef5861009cb6781efcca5050172ef9502e727d648838f43df567f2e777b7d3a47c235dd +8788eea19d09e42b0e3e35eb9bcd14f643751c80c6e69a6ff3a9f1711e8031bbe82ccd854a74a5cfcf25dda663a49a62 +95d441d8cd715596343182ddcecb8566d47eaa2d957d8aea1313bbed9d643a52b954443deb90a8037a7fa51c88eec942 +a15efd36ef72783ccdc6336ef22a68cc46b1ecec0f660cfe8a055952a974342bf30f08cb808214bce69e516ff94c14c5 +acc084d36907a16de09a5299f183391e597beaf9fa27d905f74dc227701a7678a0f5a5d1be83657de45c9270a287ec69 +b3fd385764356346061570beb760ccf3808619618fd7521eb0feadc55b8153ef4986ff0cbfcbd4153ad4ea566989d72a +91ec6b26725532e8edfda109daa7ce578235f33bd858238dfa2eb6f3cd214115b44cce262a0f2f46727a96b7311d32e1 +96b867ccddb73afe1049bda018c96cfe4083fff5bb499e6a4d9fd1a88a325144f9a08cb0aee310e1bb4f6a5793777e80 +ad10c18465910152676f1bc6a40986119607b5c272488e6422cfda2eb31da741af13a50f5de84037348014a869c8e686 +86ade2dbc4cceb52b84afe1c874d1e3644691284c189761febc4804b520adf60b25817e46f3f3c08d2ab227d00b93076 +998b949af82065c709fc8f63113a9fecdd1367fc84fc3b88857d92321ba795e630ce1396a39c2e056b5acd206ee011d8 +8dec440bbd17b47dfd04e566c2d1b46f9133023b982fdc5eaeae51404bc83a593f8d10c30b24e13aec709549137cae47 +89436ff47431b99f037cddaee08bb199be836587a7db6ed740317888638e5f4bebbb86b80549edff89678fc137dfb40a +a8e9960746769b3f76246c82cd722d46d66625e124d99a1f71a790c01cec842bcf6c23c19cc7011ec972cedf54dc8a4c +980979dafedfd75ff235b37e09e17361cfdda14a5ac3db0b90ed491abfd551916016b2254538da7f4b86ece3038b1b1c +8ec340ca7654720bb9d2f209985439ebbc3f9990ef27e7d7ae366e0c45b4ed973316943122119604ea9a87fc41ebd29f +ab24440a40ab238d8cd811edb3ef99948ae0f33bf3d257b22c445204016cce22b6f06a1ca979fa72a36c4ddedc2b3195 +a1bcd2473ac7cfebfa61c10e56cae5422c6b261a4a1be60b763fcbcdf2eae4ccf80695f09b062b6cf5654dfab0ee62a5 +9027a613ce7bd827110a3a0e63e83f652e9bc7f4ce8da26c38b28ee893fd0c38bdb20f63a33470a73cb77f776244ab4a +86911cc8aeb628197a22bf44d95a0b49afb8332c38857fba8e390c27c527b8b45335e22b0f2e0a3395c16ced3c1ed2e8 +8f0529a330a3e9967dce09357d774715fd305bd9e47b53b8b71a2a1303d390942a835aa02fb865a14cfed4f6f2f33fe6 +b71ec81a64c834e7e6ef75b7f321a308943b4bad55b92f4dbaf46658613cebf7e4b5b1bc7f1cdc5d50d1a2a0690e2766 +98d66aaed9fb92f4c7bb1b488ccbca5e570aa14433028867562a561d84f673ac72e971cbe2cb3cbbb0a702797dc45a7e +8380aa94d96c6b3efd178de39f92f12ca4edd49fe3fe098b2b7781e7f3e5f81ee71d196fb8e260d1d52f2e300e72e7bc +8c36296ff907893ac58cecadd957b29f5508ae75c6cc61b15ae147b789e38c0eace67963ae62eff556221b3d64a257a2 +97e17676cbc0f62a93555375e82422ee49bc7cf56ad6c3d69bb1989d1dc043f9f7113d0ed84616dde310441b795db843 +a952229615534c7e9a715409d68e33086cdaddf0aec51f4369c4017a94ec3d7113a045054d695fb9d7fd335527259012 +817b90958246f15cbd73a9679e10192ca7f5325b41af6388b666d8436706dea94eafffbc3b8d53057f67ad726dbcd528 +95776e378c8abd9223c55cd6a2608e42e851c827b6f71ad3d4dc255c400f9eccf4847c43155f2d56af0c881abef4acfa +8476c254f4b82858ecbe128ed7d4d69a6563fd9c5f7d4defc3c67e0bfa44e41cfd78b8e2a63b0773ce3076e01d3f6a7d +a64b0b189063d31bcae1d13931e92d5ab0cfc23bf40566ac34b5b8b711d0e7d941102e6beb140547512e1fe2d9342e6c +9678460acff1f6eae81a14d5c8049cdcd50779a8719b5c5861762a035b07f7fa1b1ada8b6173f9decf051fd5a55bebd8 +88398758ce86ed0388b13413a73062adb8a026d6b044cd1e7f52142758bed397befee46f161f8a99900ae6a2b8f6b89f +a7dfaf40637c81d8b28358b6135bd7ad9cc59177bd9bc8e42ba54d687d974cdf56be0457638c46b6a18ceaa02d3c53f3 +b0e885e5d48aa8d7af498c5e00b7862ed4be1dad52002f2135d98e8f2e89ca0b36cf95b3218aad71d5b4ada403b7045b +803b0e69a89e8de138123f8da76f6c3e433402d80d2baba98cde3b775a8eda4168530a49345962c4b25a57257ba9f0a7 +8ce6ef80dadb4b1790167fbc48be10ef24248536834ff2b74887b1716c75cb5480c30aa8439c20474477f1ac69734e61 +824764396e2b1e8dcc9f83827a665ef493faec007276f118b5a1f32526340b117c0df12bea630030a131bf389ec78fc3 +874edb379ce4cc8247d071ef86e6efbd8890ba6fcb41ea7427942c140347ebf93e8cf369d1c91bd5f486eb69b45bce70 +adadcb6eb4cafa1e2a9aef3efb5b09ffa2a5cf3ce21f886d96a136336be680dabc0a7c96ec327d172072f66d6dcdbb39 +b993591b280e1f3527f083d238a8f7cf516d3cf00c3690d384881911c1495192a419b8e37872a565ce8007eb04ebe1b6 +b125faaeca3f0b9af7cb51bb30a7c446adbb9a993b11600c8b533bff43c1278de5cdda8cb46a4df46f2e42adb995bce8 +a7efe1b57326b57c2c01720d4fdf348d6a84d35f229d32a8f2eb5d2be4e561ef8aea4d4d0bcfcbf17da10a8e49835031 +a6bd4f5a87574b90a37b44f778d5c7117d78eb38f3d7874bad15ae141b60eed4ab0a7281ed747297f92e0b3fe5f9cafa +94b5e3067ca1db3c4e82daf6189d7d00246b0360cb863940840358daa36cb33857fde4c01acd0457a90e15accee7d764 +a5ff3ab12197b8a07dd80222a709271ab3b07beba453aacbaf225cfb055d729e5a17a20f0ff9e08febf307823cba4383 +a76dd8aa2b6a957ed82ecec49b72085394af22843272f19360a5b5f700910c6ec65bf2a832e1d70aa53fd6baa43c24f6 +8dfcbe4143ae63c6515f151e78e6690078a349a69bb1602b79f59dc51dea7d00d808cf3e9a88b3f390f29aaae6e69834 +8c6134b95946a1dd54126952e805aeb682bc634c17fe642d5d3d8deffffd7693c90c4cd7d112890abfd874aa26736a93 +933531875561d327c181a2e89aaaac0b53e7f506d59ef2dfc930c166446565bd3df03bab8f7d0da7c65624949cfbae2f +ac6937c5e2193395e5bb69fd45aa6a9ae76b336ea7b6fd3e6aeac124365edcba7e918ec2c663fb5142df2f3ad03411a6 +a8f0f968f2a61d61d2cf01625e6ac423b447d3e48378ea70d6ff38bc98c42e222fe3cbcb04662b19973a160dc9f868a2 +94100a36f63d5c3a6cfb903c25a228389921684cc84f123390f38f90859f37ec9714942ffe6766f9b615101a3c009e43 +b5321b07f5b1eb2c1c20b0c8ab407f72f9705b55a761ec5176c5bcc6e585a01cae78546c54117ca3428b2b63793f2e65 +9922f61ed6763d1c4d12485c142b8ff02119066b5011c43e78da1ee51f10a1cf514329874061e67b55597ca01a7b92ab +a212eb2d72af0c45c9ef547d7c34ac5c4f81a4f5ec41459c4abd83d06ec6b09fdab52f801a2209b79612ae797fa4507b +8577d2d8f17c7d90a90bab477a432602d6918ca3d2af082fbb9e83644b93e21ca0bced7f90f6e9279eaa590f4e41dc4d +9002d424e3bebd908b95c5e6a47180b7e1d83e507bfb81d6ad7903aa106df4808c55f10aa34d1dccad3fab4d3f7a453e +b9050299bf9163f6ebeff57c748cb86f587aea153c2e06e334b709a7c48c4cbfba427babf6188786a0387b0c4f50b5ce +852ae1195cc657c4d4690d4b9a5dea8e0baaa59c8de363ba5fccd9e39ec50c6aa8d2087c8b7589b19248c84608f5d0a8 +a02ff5781417ca0c476d82cf55b35615f9995dc7a482124bc486e29b0b06a215fbe3e79228c04547c143d32cd3bac645 +8d7bc95e34bc914642e514a401448b23cf58bce767bab1277697327eb47c4a99214a78b04c92d2e3f99a654308b96e34 +adb28445d3b1cc7d4e4dd1f8b992a668f6b6f777810465fdab231fd42f06b5bada290ba9ae0472110366fad033da514e +a0c72b15a609f56ff71da17b5b744d8701af24b99fbc24a88588213864f511bfa592775e9ab4d11959f4c8538dc015b8 +933205a40379d5f5a7fb62cda17873fbbd99a0aaa8773ddf4cd2707966d8f3b93a107ebfe98b2bb222fe0de33ef68d03 +90690c1a4635e2e165773249477fc07bf48b1fd4d27c1b41a8f83a898c8d3763efb289867f8d6b0d354d7f4c3f5c7320 +99858d8c4f1be5a462e17a349b60991cb8ce9990895d6e42ae762ce144abc65b5a6f6e14df6592a4a07a680e0f103b2a +b354a7da06bd93fb5269e44925295b7c5049467b5cacce68cbb3cab60135b15e2010037a889cb927e6065053af9ccb77 +af01fc4ac396d9b15a4bbd8cc4fe7b30c32a9f544d39e88cdcb9b20c1c3056f56d92583a9781ddb039ec2eeda31fb653 +a8d889fb7155f7900982cf2a65eb2121eb1cc8525bbee48fae70e5f6275c5b554e923d29ebbd9772b62109ff48fb7c99 +b80edae6e26364c28749fd17c7c10eb96787053c7744a5cc6c44082ae96c5d3a4008c899a284f2747d25b72ecb9cb3d0 +b495b37503d77e7aafc226fca575e974b7bb6af2b7488372b32055feecc465a9f2909729e6114b52a69d8726e08739cb +a877f18b1144ff22e10a4879539968a01321cecde898894cbe0c34348b5e6faa85e1597105c49653faed631b1e913ec7 +8c235c558a065f64e06b4bb4f876fe549aab73302a25d8c06a60df9fad05843915ac91b507febca6fe78c69b51b597de +b4c31398b854ccc3847065e79329a3fdae960f200c1cce020234778d9c519a244ff1988c1fbc12eb3da2540a5fa33327 +b7bd134b3460cb05abf5aed0bc3f9d0ccbfac4647324bedbdf5011da18d8b85dc4178dd128f6ddbe9d56ea58f59d0b5d +92594c786c810cf3b5d24c433c8a947f9277fe6c669e51ceb359f0ae8a2c4e513a6dad1ae71b7ded3cdca823a51e849b +b178535e043f1efcce10fbec720c05458e459fdda727753e0e412ef0114db957dc9793e58ec2c031008e8fb994145d59 +b31da7189abf3e66042053f0261c248d4da142861bfd76a9aced19559be5284523d3e309ef69843772b05e03741a13fe +b190a8c1a477e4187fecff2a93033e77e02de20aae93dda1e154598814b78fdf8b9ff574c5f63047d97e736e69621462 +98234bd1d079c52f404bf5e7f68b349a948ec1f770c999c3c98888a55d370982bfa976e7e32848a1ebb4c7694acc1740 +99b9eeb33a6fb104bba5571a3822ebe612bf4b07d720d46bde17f0db0b8e8b52165f9b569be9356a302614e43df3e087 +a1e3915b0dd90625b424303860d78e243dda73eecd01cba7c33100b30471d0a1ec378c29da0f5a297008b115be366160 +975118bf6ca718671335a427b6f2946ee7ece2d09ccfb1df08aa1e98ff8863b6c8b174c608b6b2f4b1176fb3cbc1e30d +903cb1e469694b99360a5850e2ca4201cad23cfccce15de9441e9065eb3e6e87f51cba774ab9015852abd51194c25e57 +821f7ff4d0b133e3be4e91d7ff241fa46c649ff61fc25a9fdcf23d685fe74cf6fade5729763f206876764a3d1a8e9b24 +a1ee8db859439c17e737b4b789023d8b3ce15f3294ec39684f019e1ea94b234ec8a5402bc6e910c2ed1cd22ff3add4de +af27383148757bdf6631c0ea8a5c382f65fc6ab09f3d342a808ca7e18401e437cd1df3b4383190fdf437a3b35cbcc069 +8310551d240750cef8232cd935869bad092b81add09e2e638e41aa8a50042ce25742120b25fb54ebece0b9f9bdb3f255 +8b1954e0761a6397e8da47dc07133434ebe2f32c1c80cd1f7f941f9965acdf3d0c0b1eb57f7ff45a55697d8b804e1d03 +8c11612381c6be93df17851d9f516395a14a13c7816c8556d9510472b858184bf3cc5b9d14ded8d72e8fb4729f0b23ba +b413ac49121c7e8731e536b59d5f40d73a200c4e8300f8b9f2b01df95a3dc5fe85404027fc79b0e52946e8679b3a8e43 +8451e5c1c83df9b590ec53d1f1717d44229ed0f0b6e7011d01ea355d8b351f572866b88032030af372bd9104124df55a +8d0a5c848ec43299bc3ea106847ed418876bc3cd09b2280c2a9b798c469661505ed147a8f4ffba33af0e1167fdb17508 +a6aa97a1f10709582471000b54ec046925a6ad72f2b37c4435621c9f48026d3e332b8e205b6518f11b90b476405960a9 +97696635b5a2a6c51de823eea97d529f6c94846abb0bd4c322b108825589eba9af97762484efaac04ee4847fb2fb7439 +92fd142181fe6ca8d648736866fed8bc3a158af2a305084442155ba8ce85fa1dfb31af7610c1c52a1d38686ac1306b70 +ae3da824ecc863b5229a1a683145be51dd5b81c042b3910a5409ca5009ba63330e4983020271aa4a1304b63b2a2df69e +aecc0fe31432c577c3592110c2f4058c7681c1d15cd8ed8ffb137da4de53188a5f34ca3593160936119bdcf3502bff7c +821eac5545e7f345a865a65e54807e66de3b114a31ddeb716f38fe76fdd9d117bee0d870dd37f34b91d4c070a60d81f4 +91a02abb7923f37d9d8aa9e22ded576c558188c5f6093c891c04d98ab9886893f82b25b962e9b87f3bf93d2c37a53cb9 +99a96f5d6c612ee68e840d5f052bf6a90fecfd61891d8a973e64be2e2bdd5de555b1d8bffbd2d3c66621f6e8a5072106 +b1d5ec8f833d8fbb0e320ff03141868d4a8fff09d6a401c22dbefadbb64323e6d65932879291090daf25658844c91f2e +a06afd66ebc68af507c7cf5ab514947ca7d6ccc89fb2e2e8cb6e5ae0f471473e5fba40bb84d05f2c0f97c87f9a50cb73 +83de3ca182bcf1eac0cc1db6ad9b1c2a1ecd5e394e78add7faa36e039a1b13cb0d1d2639892489df080fbf43e5cef8d5 +adf77fc7b342ff67a2eddaa4be2f04b4e6ceaca8ea89a9fc45cc892fcce8ac3cf8646cfa5aab10ac9d9706ce4c48a636 +8509a430ef8dc9a0abc30ef8f8ccdb349d66d40390fb39f0d3281f3f44acb034625361270162822ef0743d458a82b836 +8350fc09e8617826f708e8154a3280d8753e7dbbcf87e852f9b789fdbeb10bf3fed84fb76edd7b8239a920c449e2f4b7 +a2e7a29da8391a5b2d762bf86cb6ae855cdfad49821175f83f4713dd0c342a0784beba98d4948356985a44d9b8b9d0f7 +a99c50a1a88b8efe540e0f246439db73263648546d199ef0d5bc941524a07d7e02b3ef6e5b08dc9e316b0b4c6966823e +b34ba55136c341f4ca2927080a07476915b86aa820066230903f1f503afebd79f2acf52a0bc8589b148d3a9a4a99f536 +af637be5a3e71c172af1f2644d3674e022bc49c393df565ea5b05ce6401a27718c38a9232049dd18cbd5bf4f2ce65b32 +a2972ba7bfa7f40c2e175bb35048a8ef9bc296d5e5a6c4ca7ab3728f4264d64f2d81d29dce518dc86849485ff9703d7d +8c9db203e8726299adeb331d6f4c235dc3873a8022138d35796fb7098887e95e06dcfad5d766ceaa2c4fb0f8857f37fa +a82bfbaa9a6379442109e89aad0c0cfc6a27d4a5db5480741a509d549c229cb847b46a974dde9f1398c6b3010530f612 +b2d8ef6e091a76dfc04ab85a24dbe8b5a611c85f0ed529a752c2e4c04500de5b305c539d807184e05f120be2c4a05fc3 +8c6ffc66a87d38cea485d16ee6c63ce79c56b64ae413b7593f99cc9c6d3cd78ef3fa2ab8a7943d2f0e182176642adadb +acbc92de68b2b04e3dc128109511a1cbe07518042f365d5634e8b651cb1ac435ea48eeeb2b921876239183096ef6edee +979c4e1165e0ecfa17ed59fb33f70797e000ddbb64acf5fc478cccde940451df051e51b6449c5b11a36afa7868af82e3 +a5a017c5a94952aeae473976027124231abe50460cec4db3ebeb8b1290525776be7c15d108b749c2a1e4b018de827915 +8b6922ab1db925eed24b2586e95f5c709b79d2408a8fa2a71057045ead3ebdd0cc72bee23d9064cd824166eda1e29318 +89a991087a0b5805fcc5c6c5f6ac27e100da0d3713645aa9c90114e68ca9f185f21155eb7645a2c6c0616a47291fe129 +ae6ef954c942cbfd37f8f2dc58a649e2584d6777e7eb09ae6992ccde283ac4f4ec39e3a5cda7f7c60f467fb308d37f08 +9335ca5ccac59b39eb2bcef09c54b778ebb690415ba13fe5c8e4b6091d9343a01cc9baa6228cefd8dba98f0710f714da +a0211c9328be2b46f90ff13614eeffb4c1285e55580db3874610653219926af1d83bda5b089fd37a7c7440a0f1d94984 +a82e097dfa782c40808fac5d8ed1c4fccf6b95ef92e22276fd8d285303fcf18c46d8f752595a658ee5294088b9dc6fc0 +ad108fcd0ead65f7f839a1337d520f5bd0cb665ee7100fc3f0563ff1d2959eb01617de8eb7a67c9b98b7b4892082acdb +b89e6aeabcb3ee3cbf12e3c836bab29e59d49676bcf17a922f861d63141076833f4149fe9e9c3beed24edfacdf1e248b +8477501bd91211e3b1f66c3bfd399ef785271511bc9366366ce95ec5ea95d9288ab0928a6b7887aba62de4da754d3eaf +aeec40c04b279096946b743ad8171bf27988405e1321c04894d9a34e2cbd71f444ff0d14da6cda47e93aa6fe9c780d50 +a703bd2d8a5c3521a8aad92afef5162aed64e9e6343d5b0096ca87b5b5d05e28ed31ba235ab1a626943533a57872dd01 +b52d9dfc12c359efb548d7e2b36ddedaefdec0ef78eda8ac49a990b3eb0ed7668690a98d4d3c7bec4748a43df73f0271 +af887c008bad761ee267b9c1600054c9f17f9fc71acfe0d26d3b9b55536bca5c8aebe403a80aa66a1e3748bb150b20ef +ad2f7a545ef2c2a2978f25cf2402813665c156bab52c9e436d962e54913c85d815f0ba1ce57f61e944f84d9835ce05ea +91a0a9b3cfd05baf9b7df8e1fb42577ec873f8a46bb69a777a6ac9f702735d6e75e66c9257822c781c47b9f78993a46b +939fdc380fb527f9a1ddecf9c9460f37e406cd06c59ce988e361404acbfcb6379f2664a078531705dbc0c375d724137b +8bbbe5d5a0d102b8e0c8a62e7542e13c8c8a6acb88859e78d8e1d01ec0ddff71d429fcb98099e09ff0aa673c8b399dc4 +b67a70e4ef138f48258f7d905af753c962c3cc21b7b8ae8b311a2356c4753f8cd42fdee09ac5ed6de31296ead88c351a +8d21539e7dca02a271ce7d16431773bbe30e6a03f5aff517132d34cdd215ad0da2f06aa4a2a595be489234b233e0852e +892ae11513f572cc5dc8b734b716bb38c0876e50e5e942631bb380b754e9114c34b0606740301e29b27d88439fb32071 +a8780dc9faa485f51b6f93a986bc4e15b166986b13d22ec2fefc6b25403b8b81c15cc9ac0025acc09d84932b15afa09b +b01af013360cd9f2bb9789a2b909c5e010fe6ff179f15997dee1a2ba9ef1ccec19545afdecfcb476f92fcdd482bb2b5a +b5202e5d5053d3af21375d50ad1ccd92538ef9916d17c60eb55c164767c3c74681886297b6f52e258c98d0304d195d3d +8f6adbcfbb0734bf3a4609d75cf2e10f74ed855a8b07cf04ac89a73d23b2e3e5cf270a1f2547b3d73e9da033a3c514b0 +8abe529cd31e4cb2bd75fa2a5e45bd92cbe3b281e90ffc7dea01ba0df17c9a3df97a3fde373cce5d25b5814cf1128fed +b8bbf51187bb3bb124da3870e2dfecb326f25a9383e5cc3323813487457010b9055811669c3da87105050825dc98a743 +a5c83875fe61ebbdd3fd478540d7e5a1ad0f8c790bad0b7dd3a44831e2c376c4fffbc6b988667afa1b67bfaa2dbbb256 +a0606b3062e4beba9031ba2a8e6e90aa5a43ba7321003976e721fd4eedb56486f2c5b10ba7a7f5383272f4022092eacb +b485cc5e001de6bd1bbc9cd8d777098e426d88275aaa659232f317352e1ddff3478262d06b46a573c45409bc461883e1 +916449580b64a9d8510e2f8c7aee0b467a0e93b11edc3d50725bcbc3ca53c2b8bb231fdc0fc0ed5270bf2df3f64750d9 +b2e687caa9f148c2b20a27a91bada01a88bff47faaf6ed87815db26bb6cdd93672199661654763a6b8b4b2012f59dcca +b6933f7f9dabc8fb69197571366ac61295160d25881adf2fcc8aaabc9c5ed7cf229a493fd9e2f1c2f84facd1f55fee84 +b01eb8b2cf88c75c3e31807cfc7a4d5cafded88b1974ba0a9d5aaeda95a788030898239e12843eda02873b0cabe30e2b +a3ca290fa6ce064514a3431b44ecdb390ef500629270202041f23bc2f74038147f338189c497949fb3126bae3a6e3524 +93b0f8d02bd08af74918b1c22131865aa82aba9429dc47f6b51354ba72e33a8b56684b335a44661aa87774931eb85974 +81eebeb9bd92546c37c98e0a5deba012c159f69331a89615cf40c5b95c73dcdbf3ceb46b8620d94ff44fcdad88020c1e +b350e497932382c453a27bb33d2a9e0dbadf4cd8a858b6b72d1f3a0921afc571371e22b051b97da3bb08694c4ca3a4e8 +8c7052f63ba16f14fa85d885aa857d52f04b3a899a4108493799c90c0410de7549be85bec1f539f1608924668df48e5a +b397574d1fb43de0faaea67d1d9348d67b712b1adce300d6dc497bca94e0994eef8707c285c5c9ac0a66022655a8420b +a934661d2168ae1bd95b1143c2e5c19261708aeb795abad8ec87f23dc1b352fa436de997ebb4903d97cb875adb40dc2b +acf535fa1b77255210e1b8975e0e195624c9e9ffd150286ccd531a276cadc12047a4ded6362977891e145a2bd765e6b9 +8cc32356015d7fd29738dcc13c8008cdbe487755dd87d449ab569c85d0556a1ec520dbce6c3698fc413d470c93cb0c92 +8787c7b3b890e0d3734ac1c196588cacf0a3bde65e2cf42e961e23dbf784eef14c07337d3300ed430f518b03037bd558 +99da90994030cbc2fb8a057350765acac66129a62514bbd3f4ec29d5aab8acdd5f4d69ca83efe7f62b96b36116181e79 +a306424f71e8b58dfa0a0564b2b249f0d02c795c30eee5b0ad276db60423210bba33380fb45dbe2c7fedd6ee83794819 +b207a35d31ce966282348792d53d354bbd29ac1f496f16f3d916e9adbf321dc8a14112ca44965eb67370a42f64ca1850 +89e62e208147a7f57e72290eefccb9d681baa505d615ca33325dfa7b91919214646ca9bdc7749d89c9a2ce78c1b55936 +ac2d0ec2b26552335c6c30f56925baa7f68886a0917e41cfbc6358a7c82c1cb1b536246f59638fb2de84b9e66d2e57eb +8f1487659ecc3b383cebc23a1dc417e5e1808e5c8ae77c7c9d86d5ab705e8041ce5a906a700d1e06921f899f9f0ee615 +a58f1d414f662f4b78b86cae7b0e85dfddae33c15431af47352b6e7168a96c1d307d8b93f9888871fc859f3ed61c6efc +94f3626a225ac8e38a592b9c894e3b9168f9cf7116d5e43e570368ee6ee4ab76e725a59029006a9b12d5c19ddce8f811 +b5986e2601ad9b3260e691c34f78e1a015c3286fdd55101dcef7921f6cbcc910c79025d5b2b336d2b2f6fd86ee4e041e +b6e6798ddd0255fbe5cb04a551a32d4c5d21bdfd8444ff2c879afe722af8878d0a3a2fe92d63936f1f63fea2d213febf +86bea9bfffef8bc11758f93928c9fdfae916703b110c61fa7d8fe65653f8c62c6fecd4ff66a1f1a7f3c5e349492e334c +9595a4606284569f4b41d88111320840159fd3b446e00ec8afd7ddaa53dd5268db523f011074a092f8e931fc301a8081 +83b540a6bc119bf604a7db5f6c0665c33b41c365c12c72ca4fa7b0724115bbb0ff1ae38532c3356e8bb3ac551285929f +92c6daf961ca4eb25293e1794cf85cda4333cf1c128207af8a434e7e0b45d365f0f5baaefc4ebd5cd9720c245139c6e2 +b71465f3d7dba67990afc321384a8bb17f6d59243098dbed5abd9a6ffc7a3133b301dd0c6ca3843abbaa51d0953abbed +b15d93482d2ee5b1fec7921fcc5e218c1f4a9105a554220a4fb1895c7b1d7a41f90bbf8463d195eecf919fcbe8738c51 +a79c98e70931ffd64f4dcf7157fbae601a358261e280fe607eb70cef7d87f03efa44cf6ba0f17fbb283a9c8a437d2fdb +9019d51a6873331f8fe04cb45e728a0c8724a93d904522a9915c748360ddf5cdbf426a47b24abf2005295ed2a676cbf0 +b34cc339fec9a903a0c92ce265e64626029497762ff4dcaaf9bb3994298400ce80f4fb7dbe9ec55fe0c4a522c495cb69 +8fda9be7abfe3b2033cad31661432300e2905aef45a6f9a884e97729224887a6ec13368075df88bd75c11d05247bef15 +9417d120e70d6d5ca4b9369cba255805b5083c84d62dc8afec1a716ead1f874c71a98ad102dac4224467178fe3228f62 +a0a06b64867eebb70d3ce8aaa62908a767fb55438a0af3edf9a8249cd115879cde9f7425778b66bb6778cb0afeb44512 +a44309d3e1624b62754a3a4de28b4421f1969870f005ac5dc7e15183fa5b3ad182bcd09cca44924e03fbdb22f92f8cf8 +aea80f1c3a8fc36cfb5c9357d59470915370b2bec05f51f1d0e1d4437657e2303ba2d1ac3f64cf88f2df412dff158160 +b3f1557883d91b24485123d2f3ae0fce65caa533c09345ae6b30d2ac49953acee61c880c57975be7b4f5558d3a081305 +b52cb1e56f0d147cfb58528b29c7a40bab7cfc9365f2409df7299bfc92614269ff9de3cb2500bbc4909f6a56cf4b9984 +aa4f8fd0f5f87c177ee7242f7da76d352db161846cd31523a2100c069d9e4464170eec0bffc6d4da4f9e87017b415dbd +b5b61f52242985c718461a34504f82495d73cbb4bc51f9554b7fe9799491f26826d773656225f52a1531cd5bd6103cde +ad12ba9697804ede96001181c048f95b24ba60761c93fb41f4b4a27e0f361e6b1434e9b61391bacaf0705fdaa4a3a90e +9319286cbda236f19192ae9eb8177e5a57a195c261082ba1385b20328fb83ed438f29d263dddae2f5278c09548830c4a +88b01ee88c3a7ae2c9f80317dddbaa2b7b0c3a3c23828f03ff196e244500410c9ac81c2e2d3e1f609d4b36ee1732738c +8e31f30600a9d629488d44a008c821c3c57f13734eaee5a19f0182a2de9e538fff7d982980d7fcc725c969f29f7c2572 +b215740eea98b4bb14197a803a8975700ad2f25a25ef3628eae10166d56c823301f6dd62ce3f9ebf2d42d1f33d535004 +8fb0fdb253d4bcc6693642779be13a5b816189532763dfd7da868cfacfdb87cb5ebe53b18b69dfd721f8d4baf3c1d22d +8cdd050a447f431ff792156d10381aaf83c6634a94b614dd5b428274538a9cc1f830073533b4fd0a734d6dd4f8d9c4ce +81b01ee8c72ac668ad9dd19ead2d69cac28c3525e613e036e87aa455c2da9651cc8fcc97c451a8c8a071a4eb69623cd1 +8d9e02dc9ac83f861b3745bd69216232144c47cb468a7dbc49083ed961f978e34265b3f42c400339120bdc4644fe5711 +89e9410455b34cba9db0a5ea738e150fae54dd000d61e614f3274a6c8102ba7cd05b0936f484a85711ad9da7946f51ea +91f9d4949678f8e6f4b8499899818bdd0f510da552b5d79d8e09bf3b69d706ab36524b5e86d3251318899b9223debf6b +8b3c38eec7e1926a4be5e6863038c2d38ab41057bcfa20f2b494e9a0c13bc74c3a44c653402eb62a98e934928d0ebccb +a5cfe465bfbf6e8bfbd19d5e2da2fc434bd71acd651371087450c041aa55e3c4f822361e113c6c3d58646ed3ba89d6da +918665b8810bcb8d573ca88b02a02c62eaa5a4a689efb5c564b0c9183f78144e75d91fd1603e17d2c77586cbe5932954 +997dace0b739aeb52ba786faae5bdf1d48630a90321f9ceebfa9e86d189a3d79d7b04e459ac8e4adcfe83a5ce964eb1c +a5a1ca9f0ccc88017a616d481d912aab3f0e154b673f1131c5d9c9c3f5f147d25b6392b2c31e49f7bb7eb2697d05dbec +a76e99bec509eff01bf6767a06ac97ebc6671cb58bc3d4acc2803580a874885453dbba2e1bba26e45f8d2bda5f688860 +956c1362c8123c5d9ebff7049e851235d69fa645f211ef98e2b6564f2871114a12224e0ec676738d77d23c709dd28a6c +885efede83b1a3e96417e9f2858ab0c7a576fc420e8f1f26cabf3b1abeec36bcaa63e535da177847f5e0afdb211bf347 +affca2257f292a2db52f8b1bab350093f16f27ef17e724728eeaec324e2513cd576f6d2e003cc1c6e881334cb2e8bf22 +8dac963d34dcc9d479207a586715e938c232612107bb2d0af534d8da57ad678555d7c1887fadca6551c4f736ffa61739 +b55e600a6bbde81f5a0384f17679d3facb93a7c62ca50c81a1d520cf6e8008ac0160e9763cb2ca6f2e65d93ca458783b +9485e6c5ab2ebfb51498017e3823547b6ab297d818521ceac85cd6c3aa2d85ae075a0a264ae748fc76ce96a601462ffa +b4d8abca786c0db304a6634fba9b2a40d055c737ed0f933e1739354befdae138dae3c8620a44138f50ebeaf13b91929f +8bde7ca39c7bda95b1677a206b16c3a752db76869ea23c4b445c2ff320f2ee01f7358d67a514982ee3d1fb92b7bd7229 +8f8cd0acc689b6403ee401383e36cae5db2ff36fc2311bbadf8ebb6c31cbcc2ca4ffac4c049da5ba387761ef5ec93b02 +a06f42d5f69a566ff959139c707355bbf7aa033c08d853dce43f74a9933e6d7b90e72010ef3fcb3d12e25852343d1d31 +b10ece7cf6b69a76dba453b41049db0cdf13d116cf09c625312b150ee7437abd71d921eda872403d7d7ce7af1e6dccb7 +a3d820318e0f3b54fba7a4567912a82d6e6adf22b67cfc39784683a8e75f77538e793d9708aae228fa48a71abb596195 +8758fad55b68a260bea3bd113e078fd58d64a92f7935ff877f9f77d8adc0994b27040cfc850126c7777cfdfb2428a3e5 +b504913ee96c10f00b848cd417c555a24bc549bf5c7306140eff0af2ada8cb5e76bed1adb188e494332b210fbf24e781 +a00e019a40acc7aab84c1cc27c69920ad7205c2a3dc9e908a7ef59383695c9cb7093c4bcbc2945aab2655119552e3810 +b1000b4c4f306672e39d634e5e2026886a99930d81b8670a5d4046db9621e44997c4b78f583374a09c60995f18a6fd4f +a6c5053c4e748540ad2b622c28896c9d4ca3978ca4784ac8f09da5314a245f5cdc5d6203c84e6e0bcb3081829720a56d +8e37e67a70205a5c7da95de94ac4d0ebd287c1c9922d60c18eec1705030dfcbf74ae179e377c008bf5a8bc29c7c07cce +a66bd7c0243319b553d5cb7013f17e3504216e8b51ba4f0947b008c53bcb6b4979286b614a4a828ee40d58b5ef83e527 +97e2110b0fb485508a2d82ecc2ce1fbe9e12e188f06c7ef2ac81caeeb3aca2c00e5e6c031243b5ca870a9692e1c4e69b +8734ce8bbc862e12bea5f18d8a8d941d7b16a56ef714792fed912ca9c087497e69b6481fdf14efe1f9d1af0a77dac9b1 +b441dddac94a6a6ae967e0e8d7ab9a52eb9525fb7039e42665e33d697e9a39c7dcef19c28932fb3736e5651d56944756 +918b8997f2d99a3a6150d738daed2ff9eb1f5ed4a1c432d18eab4a898297f7ffbffd1e4ae9037acf589b1cd9e1185ef6 +a0247b8ac4d708cf6b398dc2d5c127a291d98e8bef5f195f820c4fddb490574ba4f62647c2d725237a3e4856eec73af0 +b45636e7e0a823c2a32e8529bb06fcccfd88e9964f61201ee116279223ed77458811d1b23bcb6b70508d16d4570a7afb +a99c1188fa22b30b04fda180d2733586ea6ef414618f1f766d240c71f66b453900d3645541c019361027aebe0a0f305f +b4c2f758e27fe233f7e590e8e0c6de88441164da3fcd5211a228318d3066dfdafc1d40246dd194f2b597f6fe9600b3d7 +972530819445b11374c3043d7855d5f1d3c4922b3b205d0bf40162c51605375dd0b61f49cd7f3d39a533a86a13005989 +992b533a13e5d790259bfdfdf1074f84a5e5a0a0d7be9cd6568cdc1662524f1a6666a46da36cea3792ba6707850f4d86 +9875d130457e04dc6ea2607309bfbb900ad3cb5f3e0574f808d27b20cbf6f88389d87dca19998680c5bc30d1df30a41b +adea8494a69e83221edf360ab847272b5c47eba5404665fb743d98c0682732c30085ae3ec82bc1e8e4aba8454c9b1849 +887d4c624ce05e224216c5f6fa13c5741012ac33330bc291754782f0bfe668decdc98c0e43a1ce28323effe6b639f477 +ab6b167aeb5e93ab155990b94895e7e7ff6dea91384854a42cc8a3b9983495b4b3c33ab1b60b2b6450ccf0418fada158 +a7588d0b7c6a6bc32fc474aa0f4e51dfb8e6e010346ad32c59d6f99e6f0522424111a03a4f56ba4075da8009ee7a63e9 +94d645cc3936db1563568193639badfc064dd5bda8d0631804ee00b09e141b200619e07506b5a8225130541436327194 +8d695c03cc51530bdc01ee8afcd424e1460d2c009e1d7765c335368e5c563cf01a2373c32a36400c10e2bf23c185ed19 +ad824a0a7ed5528e1f9992cbb2050785e092b1ea73edd7fb92b174849794a5b04059e276f2941e945bc0f3e46172f2af +ad6ed2af077a495d84f8eeed7d340b75c0d1c8b7c5a854dfc63ab40a3d0c2b0d45016d30b3373a13f0caae549f657976 +82454126c666023c5028599a24be76d8776d49951dfe403ebf9a5739b8eb2480c6934a34010d32cd384c91c62a9aa251 +b57070006793eca9fa2f5237453ed853994ad22c21deb9b835e1fb3fbc5ac73aec265a4a08de7afae1610dc8c42b7745 +ad94667c791cf58875eb77eb17b6ad02de44e4ba2ddc2efe4d0ff22a5e1a090c670354437847349fd61edc4ba5606f07 +b2aac0c345ffc00badaab331c12a22019617b004d32c099c78fa406d683744d96d51d1237ad0842f9f54655186f8f95b +8fed51076cc939b354e3b69034a594e6c9c98425ccf546154ab087a195375128444732388d2eb28f82877de971ec2f58 +8e521c0093deb9dff37888893db8ffebc139984e7701e68b94d053c544c1be0d85f0f98d84b2657933647b17e10a474c +a2c6c9a307aff9b1dea85f90fa9e3b8057fd854835055edeb73842a7ef7c5ae63d97c51fec19dd8f15d696a18a0424a6 +a3390b25a9c11344ed1e8a0de44c848313026067a0f289481673c2c0e7883a8fc9f6cab6ccd9129729a6d8d0a2498dc2 +82770c42b1c67bbd8698c7fe84dd38cc5f2ad69a898097a33b5d7c5638928eb1520df2cb29853d1fa86a0f1bcc1187e8 +a6fdf7a4af67bc4708b1d589135df81607332a410741f6e1cc87b92362a4d7a1a791b191e145be915aa2d8531ee7a150 +aecac69574188afc5b6394f48ba39607fe5bb2aa1bd606bc0848128a3630d7d27101eb2cea1fb3e6f9380353a1bb2acc +a23fd0c52c95d0dffb7c17ec45b79bf48ed3f760a3a035626f00b6fe151af2e8b83561d0b9f042eaae99fde4cbd0788d +a5f98068525cdd9b9af60e0353beb3ac5ac61e6d3bac1322e55c94b3d29909d414f7f3a3f897d5ae61f86226219215c6 +b2a4d724faac0adf0637c303ff493a1d269b2cdbec5f514c027d2d81af0d740de04fb40c07344e224908f81f5e303c61 +adeadb3521e1f32ef7def50512854b5d99552e540ec0a58ea8e601008de377538c44e593e99060af76f6126d40477641 +a18b7fc2fcd78404fed664272e0fef08766a3e2bc2a46301451df158bd6c1c8aa8cf674dd4d5b3dedfaceb9dd8a68ae3 +83bcfb49313d6db08b58c6827486224115ceef01ca96c620e105f06954298e301399cdd657a5ff6df0b0c696feec1a08 +8c94391eba496e53428ec76dfe5fa38f773c55c0f34a567823316522a0664a3d92bff38ec21cf62ac061d7d1030650c5 +b1fa196ccfd7d5f1535b2e1c002b5cde01165c444757c606b9848bc5f11b7960973038fb7cc3da24300fc1848e34c9af +b139f6c6449449638de220c9d294e53fc09865a171756d63bbf28ec7916bf554f587c24bddf51dd44372d15260d8fe25 +b716242299d4ee72b5b218781b38ca5e005dcf52333364f85130615d1dbf56216af8ee2c9c652d82f7aab5345356538c +9909f24e4ad561aa31afd3a3b9456b2bd13a1d2e21e809a66af62fec5f95b504507ac50e81d2233da2b223f5443e7585 +ae863530a02cf3a757f72b945c8c0725d9f634d2ff26233478d1883595ff9a1eef69e8babffdbfa161452fc204f5b5a1 +8eb82bde283b6a6e692b30236cbf41433b03eda8dad121282772edd56f144b1ebf5fb489d18c6ce8776135771cbb91e2 +9296141fadf8dadc885fff4999c36efa25ec76c5637a8300a1a7dc9cf55bcedfe159e0ef33f90eee9be8c4f085734e10 +b6c07f2e6fcbd6c42a8b51e52fbcd5df3aa9f7c3f0b3c31021de1aec2111d0a1c36b5ab489ba126af44fd43cf31c2594 +a70ca669c357535b363d16b240fd9cb9c5ba1b648510afc21218ea034e9bf5f22717ae31ff43ef89dded95b7132fa58f +b350721f8f6b4d164fd08aca30cd4dece9b4a81aed0ac12119c9399bab691d5945814306f9a61f0106b76d4d96f7b9d6 +b6886076c9d8c344bf3fb6975173d00fa82866012894f31c17e6fc784fbc0dd2d24d6a1cddd17f7379c74566a23219aa +87636e4a83ceadc170a4b2517b19525c98e2163900401996b7a995b2f3da8d6ba2ab92f909eade65074fac07cf42f6fa +8ff61d87c4699a067a54b8540e8642f4c7be09d3783ec18318bcba903c6714fcd61be69165e07e1ca561fe98e07507de +85485d6b569ac20e6b81a9e97ef724e038f4fee482f0c294c755c7b6dad91293814f143bfcfc157f6cfa50b77b677f37 +a49256cb1970cc1011a7aed489128f9b6981f228c68d53b1214d28fbcfb921386cc7cf5059027e667a18073efa525a74 +87bc710444b0c3e6682d19307bedc99c22952af76e2d851465ee4f60e5e1146a69f9e0f0314f38a18342e04ece8e3ed3 +a671a6cabfd19121a421fdfe7732eccbb5105dfb68e8cbcf2b44ae8465c99e78c31b99730beca5bc47db6fc2f167203a +a2f3270c184629f6dfc5bf4bdd6e1b8a41e8840a1e4b152253c35c3d9e7ab4b8e3516dc999c31f567e246243e4a92141 +b9795a5a44f3f68a2460be69ecacdbb4664991ebbedffed5c95952147ad739e2874c099029412b9653d980a2d4307462 +959053faec9a966dd5a4a767a3154e4b8e4f56ca540ae53e373c565dda99fb626f725e5a5e3721c82918f8c5f2e9e0a3 +b3ef9d6a1b3cd44a3e5112819fa91cb8a7becc3f5b164c6f759f93171d568497b01c8e743f4727b341a1296a0dbadf4f +b852dfdfbe2b8c77d938fad45f00737e14eacf71d5fecbb3e4f60052ec9efb502c38c1fcecaf71da69eabe8b33852a67 +921c7007f26bdd4139e919dfe27d87b489a0bc5bd6fb341e949e4451f14c74add0489b108c9c9666a54c5455ac914a9f +86b63d73ba31c02e5337f4138e1684eccdc45ab5e4f30e952fb37d638b54ecec11010414d7a4b7aa91f7cc658f638845 +853c55e0720b66708a648933407795571fc11ad5c234e97f92faabce9e592983dfb97a1705047ee803648ecf9fbb2e5c +995fe7d1dc09bb0c3c3f9557c4146534778f5ea9c1d731c57440fdcf8094f82debf19090b5d23298da1ed71c283b3ae5 +b9c49c911a0c4d716b7baec130f9e615bfa7d504aa8766ed38878a93c22b1f6353503d4f7f425d4902239fb4689429df +80504d964246789a09dcd5c0298680afb6fe50bca3bb9c43d088f044df2424a1828de10e0dbdc5c0aac114fa6d9cf5d1 +90249351f109f6b23a49a610aaa3b2032189fd50e5e87cdc3b20f23ed4998af3a8b292bf9fbab9bd1cbe0a1371081878 +abb5f0148850f0d80b429c2b9e0038772432340ef0862ccb5dcb7347026ca95bf9a5857f538e295aebd3a6a5027adb4c +b92ac9c0f7e73150798348265e5f01f3c752480c72613c6894a95e9330bba1c642b21b9cbd8988442b5975476634b4fa +af3fbcc825abd92c6d7ea259467f27045e288f27a505e6a3c9ec864aa08fcaca0d4123034513dbd4c82d4814075708ab +a738232a66030e0e9c78e093a92fcc545b10e62fb0ecb832bbbc71471b28eb6ec422a498c2402e2c6d74983df801e947 +ae60194ce2035edd1af253b9eefbb4b1b7609c9678256c89c3cb076c332a9f4442c3441ad2ecc9d73265359bdadc926c +8b2fd55e686f16725fc0addb4065f696275852320b03221fd22889825d66fae5bb986b03c47452e32b3a32c1fdfc8dfd +8e2e1a36673b7729b07e7bc5014584e1c03e9552f7440fbfda0a6a7f41953947fcdf8d666f843bfc03dcca5b06a14318 +95a3df04368c069f3fd32a20b627c5f043e952167c9e80bf5914bbf2086879909c60e089bbd488725ab977c0e6051728 +9856403b2211d0152d4eec10db7ec34c16ac35170714b75af3ebc398a676c171b24b6f370361de0f9057ba444293db14 +a2cb484b758af5fd8e2baca7f0406f849c71255e58ef110d685cd0c1137893a25d85a4d8582e3ced7dd14287faa95476 +b0f697b6a42f37916b90ab91994ae4a92c96dc71e4da527af41b9d510bc2db5a9b4f29183a758074b6437a1e62b2d1d7 +b39c49266aae46f257b7ae57322972fb1483125298f9f04c30910a70fe5629dba0ec86b94cc6ba16df3537a55e06f189 +86cd5595b5b769dfd9ceb68b11b451f6c5b2e7a9f6f6958eac8037db1c616e8a9defb68a0d6c2287494d1f18076072c1 +b462e8fa9a372d4c1888fd20708c3bed1cb00c17f7d91a0481238d6584fbbf2d238e25931154f78a17296a12825d7053 +a5ef28286628ba509bac34c9f13158d0013239fdca96b5165161f90b89d6e46295822ebdf63f22d7739911363a0e0e86 +a629a95a24e2545862b41a97ecba61b1efa792fd5555dc0599c175947e9501bffc82b05a605fd5aabc06969ccf14fff4 +af83467e4b1f23a641630cc00c38d4225ff2b4277612b204d88de12a07d9de52fb4d54a2375a7fd91eb768623c255376 +a630f29fb2e9a9e2096d7f3b2f6814ee046ebc515f6911d4bc54ad8a5a821a41511ff9dcfbe3176f35c444338ecd0288 +950dedc11bd29e01ba9744bec681ad9462127c35e9fcadfacc9405ec86b985a1b1c4f9ac374c0f1fa248212e5e170503 +82e8e7be8011ee0fd9c682d26a0ef992d0191e621d07fd46a3a5640ef93a42e1b98a33cad1f8017341a671d28caebb03 +a075860554e712398dac2fb0375067a48d0e4ca655195cefc5ccb1feb8900d77124aa52a12e4f54f7dab2a8f1c905b5b +81d2183d868f08714046128df0525653a2dc2ff9e2c3b17900139c9e315b9f4f796e0fb9d1d8cbadbaa439931c0e0879 +81fb1456969579515a75fb66560f873302088cde2edc67659b99a29172165482ca1f563758c750f00086b362ae405322 +a13c15ab19203c89208c6af48d2734bb0873b70edb660d1d5953141f44db9012528d48fb05aa91d16638cbda2ca8f0cc +8ba46eef93e4ec8d7818124a0b9fcfe2bcf84a98db3545d2b3d0192cfadc81fc667dcc22ab833c3e71508d0f3c621fe4 +b9bd60d2266a7d01e1665631a6ed6d80ffc0cd7f088f115a5d4ea785c518a8f97d955e2115b13c4960302b9825526c92 +b26fa4e87142150250876083a70c229249099331410f0e09096077fdf97b31b88dc57a3e3568d2a66a39af161cf5dfec +b9d147564124728b813d8660ba15fa030c924f0e381ad51d4e0cf11cc92537c512499d3c2983dd15f2e24ca166070d70 +b6fb44e1a111efb3890306fa911fafda88324335da07f7de729b2239921ef15b481630a89c80e228bec7ab6444a0b719 +a6cd9c7acac052909ef0cf848b6012375486b59b7bac55b42c41f0255b332c1d45a801f6212d735be8341053bd5070b9 +864258d69234786af5de874c02856fc64df51eff16d43bfb351b410402ab28f66895aec4025e370a4864f19ff30fd683 +84370fa1243b64b3669dd62e1e041ff9bd62810752603486aac3cba69978bd5f525c93cbc5f120d6f2af24db31ec3638 +b983c2cdc1a310446de71a7380b916f9866d16837855b7d4a3a6c56c54dab3e373a6fc6563b8309dc3b984d4e09275d6 +914f8587f876470f7812fa11c6f67e2dd38bf3090e8928e91fe2fe5595bee96cbe5f93d26fdced6b4e7b94f75662b35d +8b47bcb111d91aa3d80e4ceef283824aa00d1faeb6fe4111aecd9819869c0e1f6f4b6fb2018aebb07a0f997412cda031 +95b2befa98f9992450ca7ff715ae4da8c36dd8adcfef3f0097de6e3a0b68674b05cbf98734f9665051bb4562692641e0 +8bcd1651a2bfce390873a958e5ff9ca62aac5edd1b2fd0f414d6bcf2f4cf5fa828e9004a9d0629621b5e80fbbd5edb90 +af79bed3c4d63239ac050e4fa1516c8ad990e2f3d5cb0930fc9d3ce36c81c1426e6b9fe26ac6a416d148bf5025d29f8b +881257e86b7ab5af385c567fde5badf67a8e7fff9b7521931b3ce3bac60485c0fe7497339194fb7d40e1fad727c5c558 +a1b40b63482cd5109990dfb5a1f1084b114696cbbf444bf3b4200ab78c51dad62c84731879ea9d5d8d1220e297d6e78a +b472212baa2a31480791828ca5538c3dcc92e23f561b0412f8cc9e58839d1625ddcaf09c8078d31ac93470436843cd74 +8f516d252b1863cd3608d852a2857052bb2a3570066d4332fa61cb684b10ac8d1a31c8d32f2a0d1c77eee2ad7a49643d +8d20b75c51daa56117eda2fd5d7a80a62226074b6a3ff201519f2054eecfeff0aa2b2f34b63bea3f53d7d0ce5c036db9 +8282f433229e7948a286ba7f4a25deb0e0a3c5da8870562c3646757bef90ca1e8d3390b0a25b3f2bf45bf259a4569b77 +8a2dbf4b55cc74f0a085d143a88ebc8c2a75a08eab2703d13a00b747eaddc259a3dd57f7330be938131835a6da9a6a68 +aa0bc51617a938ea6a7b0570e98b8a80862dd9e1cf87e572b51b2a973e027bcd444ef08e0d7b5dee642e0da894435e91 +aa7319ca1ac4fe3cc7835e255419eeb7d5b2d9680769cc0ca11283e6147295db75713b71a9312418a8f5505cd45b783d +ab3f9c465663dc90fae327a2ee9cb7b55361a9b6fbe713540a7edd3cff1c716802fb8ad4dd8fb0c945d96b3b44c5795b +913a2ae88acffab12541fc08920ee13ab949f985a117efe9a5b2c76f69f327f60c5b5ad3fa5afa748034ac14298fc45a +9008f044183d2237b723b235953e4d8b47bec6a7b300d98075555478da173b599ba9c7c547c2f111ce1fae5ac646e7a3 +a26b4cc42b353e1c18222d2e088d7f705c36be12e01179db440f10fcfa9691d31fc4fc7e7ee47876f1624e6d44be1021 +995e75824f322294336bfa2c5d1a319f0d77f6a0709beabaf1b43015d8a78d62447eab907349524734170f0294d1ca7a +8b96f04a19dbe4edc71d1f2c6d3475ae77962e070ec5797752453283c027c6b29b6e58e8b7eb5c3f9770557be7e80b67 +8621459865234734bcfaa492ca1b89899525198a7916ccc6f078fb24c8bf01154815bb5b12e1c3d0a10bd4f1e2ea2338 +ab52174541185b72650212e10a0fe2e18ccfd4b266a81233706e6988c4af751b89af87de0989875f7b5107d8d34c6108 +966819d637bdd36db686be5a85065071cf17e1b2c53b0e59594897afc29354ecba73bf5fc6fa8d332959607f8c0a9c27 +b7411209b5ab50b3292c3a30e16f50d46351b67b716b0efb7853f75dc4e59ec530a48c121b0b5410854cd830f6c4b3ea +a5dc04adbadce0af5dc1d6096bad47081110d4233c1bf59a5c48a8e8422858620f4be89bf1f770681be2f4684ee4cce7 +af77a8f83cffb5f8d17be0ab628dedcad63226c9b13ce4975fb047f44bfef7d85e7179aa485abb581624913eddbb27ec +82bf28dc58c893c93712ce297cc0d64f70acb73a641cb4954ccf9bf17597f6d85eecf5a77c8984ab9afbe588562a0ee9 +988a7cef9a178e8edb91f3ec12f878fd68af2ac0762fa0a48a2423e24f765ed8f7837429fd8bc0e547e82e6894e63008 +a5d5969311056d84b3ee87f49286fac0bd9a7220c196cea4f9dced3b858dcdba74718eab95b38bd5d38d2d1184679c98 +af4d51b3ded0aaad8f12bef66c0616e9398fc42618852ac958e6ab2984a720a6111ac55b249d7e4523051740e12b346f +ac635b4a49f6fbb94a5f663660f28431ba9f7c5c18c36ebc84fd51e16077de7753595f64619b10c16510ecbc94c2052d +ae25eb349735ced1fe8952c023a9b186a1f628a7ddf1a4b6f682354a88f98987ac35b80b33189b016182f3428a276936 +ae3ab269690fdd94134403691ba4f5ed291c837c1f5fdc56b63b44e716526e18abb54f68ca5d880e2fb7bea38e74c287 +a748b03b2bd3fbc862572bc4ddc0579fa268ee7089bcfd0d07d0c5776afcd721302dbb67cb94128e0b1b25c75f28e09a +8f09a2aaa9ba3dfe7271f06648aba9cc1ea149e500a7902d94bb9c941a4b01d1bb80226fd0fd2a59ad72c4f85a2a95d0 +853d55ad8446fd7034e67d79e55d73a0afcb5e473ed290e1c3c7aa5497e7f6e9bbf12d513fc29e394a3dc84158a6d630 +b1610417fb404336354f384d0bf9e0eb085073005d236a0b25c515d28235cea5733d6fbd0ac0483d23d4960064306745 +86de805b3d4f6fbb75233b2cf4d22fcc589faa2ac9688b26730cb5f487a3c6800c09bb041b2c6ab0807bfd61b255d4c9 +893b38c72cf2566282ee558d8928588dca01def9ba665fcb9a8d0164ee00dedafbf9d7c6c13bcc6b823294b2e8a6a32c +8e50de7a70ac9a25b0b5cf4abc188d88141605e60ce16d74a17913a2aff3862dec8fbbf7c242cf956f0caae5bcc4c6bf +b5cf09886a4fb4ce9ea07d1601d648f9f9d1a435b5e1e216826c75197cd6dafd6b2b07d0425a4397a38d859a13fdb6dc +859dc05daf98e7f778a7e96591cc344159c1cbe1a7d017d77111db95b491da0a9272866d2638a731923ca559b2345ebe +8ff1792f77ecdfbd9962f791a89521561c7b82031a4e53725f32fe7d99634a97b43af04cbf3e0b0fdff4afa84c49eb99 +81e2cd8a221b68ae46dd7ce97563bd58767dc4ce1192b50ff385423de92206ff585107865c693c707e9d4ed05f3149fb +8fce7da7574e915def0d1a3780aa47ef79b6d13c474192bd1f510539359494ddc07e5412f9aac4fc6c8725ade4529173 +ac02f5df60242734f5ead3b8a62f712fefdb33f434f019868a0b8ddf286770244e2ddfb35e04e5243ba1e42bcd98a6a5 +a8d69783349a442c4a21ecb3abd478a63e2c24312cb2d2b3e10ea37829eb2226a9b8d05a8c9b56db79ffaa10d1f582d1 +b25b5cca48bf01535aba6d435f0d999282845d07ac168f2ca7d5dba56ee556b37eab9221abdb1809767b2de7c01866c1 +8af7e1d1f4df21857d84e5767c3abe9a04de3256652b882672b056a3ab9528e404a8597b1ad87b6644243f8c4cd3799f +a6718308dfa6992ae84fcb5361e172dbbb24a1258a6bd108fd7fc78f44cc1d91be36e423204a219a259be4ab030f27ff +b99cbe3552c1a5259e354c008b58767c53451932162e92231b1bebfc6a962eb97535966a9bd1dfd39010dfcda622d62a +a8458f6b8b259581f894e4b5ce04d865f80c5a900736ca5b7c303c64eaf11fe9cb75e094eece0424ba871b2aee9f7a46 +914f763e646107b513c88f899335d0c93688ffa6e56c3d76bff6c7d35cb35a09f70dc9f2fe31673a364119c67cd21939 +9210f2d39e04374f39b7650debe4aceeb21508f6110ab6fc0ab105ec7b99b825e65753d4d40f35fad283eeff22a63db0 +98729cf927a4222c643b2aa45b3957b418bce3f20715dd9d07997a3c66daa48dd62355dbd95a73be9f1d1516d1910964 +a602c399f1217264325b82e5467a67afed333651c9f97230baf86aec0dd4edeae1e973cafef2ea2236d6d5b26719954d +ac9632921d45900bf3be122c229ba20b105b84d0f0cba208ccdce867d3e9addfb3ef6ece9955950d41e1b98e9191ef42 +a76ce1f53e1dc82245679077cb3bca622558f2269f2d1a1d76b053896eba1c3fc29d6c94d67523beb38a47998b8c0aa7 +b22b51fcc1b328caa67cc97fb4966cb27d0916488a43248309c745cd6e2225f55ad8736d049250fa0d647e5f8daa713c +b7645c1923a6243fa652494fe9033fa0da2d32a0fb3ab7fcb40a97d784282a1ffad3646c499961d4b16dadbc3cbb6fd6 +acab12b490da690db77c4efdc8b2fe6c97ac4ba5afb5165d6647fdd743b4edbad4e78d939fc512bebcf73019c73bae40 +ad7a0fcd4e4ccb937a20e46232a6938fccf66c48a858cf14c8e3035d63db9d1486e68a6bf113227406087b94a0ece6a0 +a78605beaa50c7db7f81ab5d77a8e64180feea00347c059b15dc44c7274f542dc4c6c3a9c3760240df5f196d40f3e78b +8763315981c8efa9b8ae531b5b21cfc1bbc3da3d6de8628a11dcc79dee8706bd8309f9524ec84915f234e685dd744b69 +b4a6c48531190219bf11be8336ec32593b58ff8c789ee0b1024414179814df20402c94f5bfd3157f40eb50e4ef30c520 +8dac8a3f152f608ce07b44aee9f0ed6030fa993fd902e3d12f5ac70bf19f9cde2168777d2683952a00b4b3027d7b45ea +8baf7dfae8a5840c5d94eabfe8960265f6287bb8bc9d0794a6d142266667a48bec99b11d91120907592950a0dddc97d9 +b8595e6ea6b8734d8ae02118da161d3d8d47298d43128a47e13557976032dad8c2ccbfff7080261c741d84d973f65961 +8b93979c51c8d49f4f3825826a5b9121c4351e0241b60434a3c94f2c84f0b46bbf8245f4d03068676166d0280cf4f90c +aceb0fdaf20bf3be6daebf53719604d3ab865807cc2523285f8fef6f3fc4f86f92a83ad65da39de5bd3d73718a9c4bd2 +814dd41764a7d0f1a14a9c92e585f154a26c8dbf2f9bff7c63ae47f1ac588cec94f601ccc12e8a63a7a7fce75a4287f2 +b47b711848e54fa5c73efc079d0a51a095fa6f176e1e4047e4dac4a1c609e72099df905958421aee0460a645cba14006 +aaf7bd7e1282e9449c0bc3a61a4fca3e8e1f55b1c65b29e9c642bb30a8381ce6451f60c5e0403abc8cee91c121fa001f +b8b0e16e93b47f7828826e550f68e71a578a567055c83e031033c1b7f854e7fc8359662a32cc5f857b6de4aff49e8828 +b3eb70b8c8743a64e1657be22a0d5aeb093070f85a5795f0c4cb35dc555958b857c6c6b7727f45bf5bedf6e6dc079f40 +ae68987acd1666f9d5fa8b51a6d760a7fb9f85bf9413a6c80e5a4837eb8e3651a12e4d1c5105bfb5cfa0d134d0d9cfc2 +acd8fa5742b0bac8bd2e68c037b9a940f62284ff74c717f0db0c033bf8637e4f50774a25eb57f17b2db46e5a05e1d13d +a98dac386e7b00397f623f5f4b6c742c48ab3c75d619f3eaf87b1a0692baf7cb7deac13f61e7035423e339c5f9ae8abf +99169bd4d1b4c72852245ebfbc08f18a68fb5bcce6208dd6d78b512b0bc7461f5caf70472b8babf3e6be2b0276e12296 +937d908967f12bf7f728fe7287988c9b3f06c1006d7cd082e079d9820d67080736910bc7e0e458df5bae77adb9a7cbc1 +8c50e90ce67c6b297fd9406c8f9174058c29e861597a0f4ed2126d854a5632fa408dfa62ad9bb8b6b9b6b67b895d5a4d +8f4840a91b0a198226631a28e7a2e893fc6fed4d5eb3cb87b585aac7f4e780855a353631ad56731803296f931e68a8d0 +96a4b8c64d3d29765e877345383bf0e59f4ac08798ac79dd530acd7f3e693256f85823ad3130fb373d21a546fe3ca883 +b0dce7a6ab5e6e98b362442d6e365f8063ba9fef4b2461809b756b5da6f310839ac19b01d3fd96e6d6b178db4ff90ee1 +8f012cb2be5f7cb842b1ffc5b9137cafef4bd807188c1791936248570138f59f646230a1876f45b38a396cbdd3d02e08 +94a87b5ce36253491739ca5325e84d84aaff9556d83dcb718e93f3ff5d1eecf9ae09d0800a20b9e5c54a95dfebfcecd3 +b993ec5f9e82cc9ceeb7c5755d768bc68af92cc84f109dfaf9cf5feb3aa54881e43c3f598ba74ed98e8d6163377440ca +92f845d4d06a5b27d16aef942f1e3bcbe479b10fef313f9ca995315983090511701b39ccbb86b62d0c7c90a2d1f0c071 +b6ec6da0f9e7881e57fa3385f712e77f798abc523609a5b23e017bb05acc6898825541aed7fe2416c4873de129feceea +86b181183655badfe222161d4adf92a59371624a358d0ec10e72ee9fa439d8418f03d635435ec431161b79fd3fa0d611 +b5e28eeed55fb5318b06a0f63dbf23e00128d3b70358f1c6549fd21c08ef34cb1372bc0d4b0906cc18005a2f4cd349bf +85c4d3fddda61dbfb802214aa0f7fc68e81230fb6a99f312848df76cddc7b6dfd02860e8a4feb085dad1c92d9c6c65e0 +80f7fdec119309b2ac575562854f6c2918f80fc51346de4523ec32154d278f95364fdef6f93c7d3537a298dd88df7be6 +9192c1949d058614c25f99d4db48f97d64e265a15254aa6ed429e1ef61d46aa12355769f1909a5545cd925d455a57dbe +a0b1e7d928efc4dcbd79db45df026ae59c20c1a4538d650c0415ab7cb0657bc1e9daeacc3053ee547e8f9c01bdbd59c4 +893e84c41d3a56bca35652983c53c906143b9ad8d37b7c57f9dacbeb7b8dd34defc6a841f5b9857ffb90062bbd8e9dee +a7f89a448349dbc79854cf888980327f92aedc383c7fadd34fdc0eaa4f63d751315b4f979e14f188854ef4d16c9e8107 +833f2774a96187805f8d6b139c22e7476bce93bc5507344d345008080fb01b36d702b96e4c045617a23a8ca1770b4901 +80e46e86d68bd0a48ac6fa0b376d5bb93a5d6b14f08b3a47efa02bb604c8828c2047695f1f88fc5080e5548e1a37130f +943f42b7b4ad930059a26ad06b62e639f06c1c425d66066c55134e97c49abe412358c7cb994fcc1cf517ea296bca1f68 +8b9d4fe835dc6a2cbf85738937bbfb03f0119ab8df04a7d68860716ce6ee757dbe388a1e8854ddb69fe0c9fa7ed51822 +909030c7fde2591f9ea41ae6b8fa6095e6e1a14180dda478e23f9c1a87b42c082a1ea5489c98702f6ccd2ba5812d1133 +a715ec1beb421b41c5155c7ef065bbb50b691d0fa76d7df7ee47683d9e4eb69b9ea3e62fc65196a405d6e5e29e6c2c60 +8c9e801cb7ef780a535be5c2a59b03e56912acbfdb00447bfa22e8fc4b11dceecc528f848d5fba0eec4237d6f81f4c79 +b96b6af857c3bc0344082bd08ec49a9bed478d4d35b85a2099b1849cd6997521c42225305f414cdd82aef94b9e1007d3 +8764db720b4e44a4d2527f7f9b535a494a46c60e28eac06bf1569d0703c4284aefa6cb81fbba9d967286f9202d4b59ea +a66fd2f9158e1ffcdd576cba1413081f43eed00c7eb8f5919226f7b423f34ac783c1c06247819b238de150eb5a48d977 +82c52e817ac3bb0833ea055dec58c276c86ca5181811cf7a483b3703a06ea1bee90ae3aeaa2cffeaeba0b15fe5bf99be +987d07cb276f7f03a492cfb82bba6d841981518286402d3e69e730a9a0e29689a3619298124030da494e2a91974e0258 +b34f2c5740236bc6d4ae940920c5bc2d89ff62a3dd3a3ec9a0d904d812b16f483073db1e53b07f2b62e23f381d7bdbe5 +a1c0679331ab779501516681b3db9eefb7e3c0affb689e33326306ada6d7115fafd2cc8c1c57b2fa6c2072552f90a86e +94805e30d7852fc746e0c105f36961cc62648e438e8b9182fc0140dbf566ec14a37ad6e7f61cacb82596fc82aed321e5 +a42fb00b29a760141ff0faaeb7aca50b44e7bbc0a3f00e9fb8842da7abfcaae6fae9450abe6ba11e8ecf11d449cbe792 +8fb36ce4cfa6187bfe8080ac86b0fa4994f20575fb853bd8ffa57c696179cc39f58ff3b4bd5a2542ff1c8b09015539df +a1c54e7aa64df7fb85ce26521ecfc319563b687ffecd7ca9b9da594bbef03f2d39f51f6aaff9a3b5872d59388c0511c6 +855e48fdb8f771d4e824dbedff79f372fd2d9b71aa3c3ecf39e25bf935e2d6e0429934817d7356429d26bf5fd9f3dd79 +8ae6157a8026352a564de5ee76b9abb292ae598694d0ea16c60f9379e3bb9838ce7fd21def755f331482dc1c880f2306 +a78de754e826989de56fe4f52047b3ffd683c6ceaf3e569a7926f51f0a4c4203354f7b5cfa10c4880ba2a034d55a9b0d +97609477d0a1af746455bbd8cb2216adacc42f22bfd21f0d6124588cd4fec0c74d5bde2cdba04cdbfbff4ac6041b61b1 +a03dc3173417381eb427a4949c2dbfa0835ef6032e038bf4f99297acf4f0ba34a5fc8ccf7e11f95d701f24ee45b70e27 +aad6283e85cd1b873aeb8b5a3759b43343fdadc9c814a5bf2e8cf3137d686b3270f1ec2fb20d155bbfd38c7091f82c44 +92ab94ed989203a283d9c190f84479c2b683615438d37018e9c8de29c2610bb8fccd97bb935dca000d97d91f11a98d65 +8c0444a0b9feb3acb65a53014742e764fa07105e1c1db016aec84f7a3011d9adc168dbba8034da8d0d5db177a244d655 +95a33d25e682f6c542d4e81716cc1c57ef19938409df38bf8f434bc03193b07cedd4e0563414ce00ab1eebbd3256f3e7 +8716c30e3e4b3778f25c021946c6fb5813db765fde55e7e9083a8985c7c815e1b3d3b74925ba108d9a733ddf93b056af +a186aabc10f1fff820376fa4cc254211c850c23a224f967d602324daec041bbe0996bf359ed26806a8c18e13633a18a8 +a1e8489f3db6487c81be0c93bade31e4d56ec89d1a1b00c7df847f5cd7b878671015f5eaa42ee02165087991936660b9 +8f688c969c1304dfa6c1a370119d1988604026a2ab8e059016c5d33393d149aae6e56f3ee2b5d25edc20d4c6c9666ad9 +91950b651fefd13d2fa383fd0fdc022138ce064ee3b0911157768ad67ed1fb862257c06211cf429fba0865e0b1d06fc8 +86cff4080870d3e94ed5c51226a64d0e30266641272666c2348671a02049ae2e8530f5fb1c866c89b28740a9110e8478 +88732c4d9e165d4bb40fb5f98c6d17744a91ff72ca344bc0623d4b215849a420f23338d571a03dd3e973877228334111 +afcc476ad92f09cf2ac7297c5f2eb24d27896d7648ba3e78e1f538c353ceeb1e569917a2447f03f3d4d7735b92687ba5 +b622aa475e70d9b47b56f8f5026e2304d207684726fb470a0f36da7cb17c30dd952813fab6c7eb9c14579aacca76f391 +802cf5630c0407ae0d3c5cf3bef84e223e9eb81e7c697ea10ec12e029fc4697ce7385b5efab7014976dacc4eb834a841 +a08596493f4cd1b8ac2ec8604496ee66aa77f79454bb8ab6fdf84208dc7607b81406c31845d386f6ac8326a9a90e7fc5 +a54652ca9e6b7515cb16e5e60e9eabbccbc40bb52423d56f0532d0bac068aec659a16103342971f2cc68178f29f695db +a3ab54875cb4914c3a75b35d47855df50694310c49eb567f12bbc5fa56296e11f4930162700e85ba2dbfdd94c7339f91 +94183a040285259c8f56bef0f03975a75d4def33222cc7f615f0463798f01b1c25756502385020750ac20ae247f649a1 +b0004261cc47b0dc0b554b7c6ebf7adf3a5ece004f06e6db3bbac880634cdf100523b952256a796998a5c25359f12665 +a25dfeb0e18ebe0eb47339190f6a16f8e116509ab2eef4920f0d3ff354e3ead5abe7f5050b2f74f00b0885ea75b4b590 +ab10ef2f5dc0ede54e20fa8b0bce4439543db8d8b31e7f8600f926b87ec5b8eea0ac2153685c7585e062ffac9e8633c3 +8386eac1d34d033df85690807251e47d0eaacb5fe219df410ab492e9004e8adabb91de7c3e162de5388f30e03336d922 +b6f44245a7d0cb6b1e1a68f5003a9461c3d950c60b2c802e904bc4bc976d79e051900168b17c5ac70a0aed531e442964 +ad12f06af4aa5030b506e6c6f3244f79f139f48aec9fc9e89bbfbd839674cfd5b74cea5b118fb8434ba035bda20180af +88511306dfe1e480a17dba764de9b11b9126b99f340ceb17598b1c1f1e5acbdd1932301806fe7e7e5e9aa487a35e85de +a17cdf656e1492e73321134a7678296a144c9c88c9a413932d1e4ca0983e63afc9cdc20fd34b5c6a545436b4db50f699 +b555b11598a76de00df0f83f0a6b8c866c5b07f7ac2325f64fb4a0c2db5b84e0e094d747186c3c698ee4d0af259dc4c7 +88014560587365e1138d5b95c2a69bdae5d64eb475838fee387b7eb4c41d8c11925c4402b33d6360f0da257907aa2650 +b220634e6adee56e250e211e0339701b09bf1ea21cd68a6bd6ee79b37750da4efe9402001ba0b5f5cbbfcb6a29b20b0c +ac5970adc08bc9acec46121b168af1b3f4697fb38a2f90a0fbc53416a2030da4c7e5864321225526662d26f162559230 +97667115b459b270e6e0f42475f5bce4f143188efc886e0e0977fb6a31aba831a8e8149f39bc8f61848e19bcd60ceb52 +b6c456b36c40a0914417dd7395da9ed608b1d09e228c4f0880719549367f6398116bf215db67efe2813aa2d8122048f2 +ab7aef0d6cda6b4e5b82d554bd8416a566d38ded953ffd61ef1fcca92df96cdcc75b99a266205ff84180ab1c3de852a4 +81d354c70ce31174888c94e6cf28b426e7d5c4f324dc005cd3b13e22d3080f3881d883ca009800f21b0bb32fa323a0cf +94f3440965f12bee4916fcc46723135b56773adba612f5ce5400f58e4d4c21435e70518bdef4f81e595fa89e76d08fc6 +a6683e7a1147f87cbeeb5601184cc10f81bca4c3c257fd7b796a2786c83381e7698fb5d1898eb5b5457571619e89e7d6 +8ca29539600f8040793b3e25d28808127f7dc20c191827a26b830fff284739fb3fc111453ff7333d63bce334653a0875 +98a69644048b63e92670e3e460f9587cf545a05882eb5cba0bcbd2d080636a0a48147048a26743509ab3729484b3cc12 +84d40302889c03c3578c93aca9d09a1b072aadd51873a19ef4a371ca4427267615050c320165abece7f37c13a73d4857 +87954271e3de3f0b061c6469d038108aac36f148c3c97aefb24bf1d3563f342ea6c1c1c44c703e1587a801708a5e03f8 +86b6f5367e04c5caa3ec95fd5678c0df650371edac68f8719910adf1c3b9df902cc709a2bddc4b6dde334568ca8f98ac +a95fed2895a035811a5fee66ca796fdecce1157481dd422f8427033ed50c559692908d05f39cb6bea5b17f78a924633c +8ba05bdadde08a6592a506ea438dbdc3211b97ea853d1ad995681a1065ececce80f954552b1685ef8def4d2d6a72e279 +90b6b7494687923e9c5eb350e4b4b2e2fa362764d9a9d2ebb60ee2ad15b761e0850c9a293123cf2ef74d087693e41015 +8819ea00c5ea7b960eb96ab56a18c10a41fd77e150ab6c409258bc7f88a8d718d053e8f6cb5879825b86563e8740808d +91e42031d866a6c7b4fd336a2ae25da28f8bde7ace6ff15dc509708b693327884e270d889fff725e6403914546055c28 +85763642052f21cf1d8bd15fd2dc0c2b91bba076751e4c4f7a31fbdb28787b4c6a74d434d6ef58b10f3ad5cde53ef56d +8b61c36c7342a1967a1e7b4c01cddf4dce0e2025bc4a4a827c64994825f53e45277550ceb73c34bb277323fb784aa3c6 +80b9634a45c8b3770e993257bd14df6a17709243d5429969ab8b9a4645bf2a94f9b3cd3d759169887b4aa0eb50f4f78c +b5c44db9439dd8aa4edd151d95e48a25c1154e1525c337f97109f40131db81a4898344c8c3144c270bdc835c269b3477 +863080fcbc227eea32d0dc844f42dc642fbda7efc398ab698be3a3c6f3bf8803dea6ba2b51fed6151f9522b4ab2a8722 +8481e871129e9cb9d2d109c513cbba264053e75192e967f89659dcfcc1499de9ae7a1ac4f88f02289150231c70b4da01 +834d8183698d3d2d1352c22c373222cb78d0f4c8cb15e0ad82073dde273b613515ebcd184aa020f48f8e6fc18f3e223c +a227e300f0c5bc1b8d9138411413d56c274cc014ae8747ec9713f3314d5fae48bb6f8cc896f232fd066182af12c924e4 +ab7242835e91ba273de1c21eb4fca8312bdda5b63b080888b96a67a819b50294a7f17a7dc0cd87fae5e7f34bc24c209a +86eb27c898a5d6c3618c3b8927acee195d45fe3f27b0991903520a26fb8021b279e2a8015fbbba5352223ae906c7c5d6 +a61b1c200b0af25da8ad8e29f78d000a98683d1508ae92ee7f4326a7c88e0edb645b6cb5dde393ac74d322895e77ba24 +887739318c710aae457b9fe709debff63bfbb3ffbbb48a582c758b45d6bf47a7d563f954b1f085c3bc633ffd68c93902 +aacfcb0e2b0a868b1c41680487dc6600577ce00aa2edeee8c6141f4dc407217ddb4d37b79e7c9182258c750d12a91508 +ad8cd2cf5ccd350cd675a17f31b86a0e47499c6c4c11df640a5391bb10989c9c70df0a3ddeba9c89c51e15fedaf67644 +8aba897d32c7ef615c4dfa9498436529c91c488a83efc07ba9600875c90c08b00f66a51469eb901451b6e18e7f38ffd7 +aab8a600609b80e36b4a6772308bac77929a0c5d8d92bbc38e9999186a1c2bfdbef4f7a2b1efba9c17a68dc15a9373ab +b95811d1454307a30c2ac8588c8104804b06c1aec783fed75a6f12c9df626be57865850100f1ad28073e3867aca941cf +8b119d3bd4ee644469457df5d8a0020fd99b8b20bd65ab121cf95a7f55e50dd8945fcf1dff9d269d9d0b74b4edbc7726 +a980b912df832ea09353fd755aa3eec9eb4cfd07ca04387f02a27feab26efa036fca54cc290bb0c04a8a42fdfd94ce2f +91288e84da1d4ee2a4dad2df712544da3a098fdb06a5470c981fb6d6f3dcc1c141b6f426d6196ff3df6f551287179820 +98b0473bcffcbd478fd1b49895c61dd2311dab3cdec84f8e3402f8add126c439ffcb09cae3b7f8523754090d8487b5a9 +abe76988cf3065801f62a1eb3cfe9f8185bd6ab6f126c1b4b4fde497ca9118d02a0db3fadccd4ca98826b30475fa67ef +94a316a0faa177273574e9e31989576a43e9feb4cc0f67aa14d5c1967c4e10fc99db3ef4fdca2e63800a0b75f4b84256 +975ad39adadc7e69e34981be2e5dc379b325dc24dddacc0bb22311ff4a551a0020a8bdecf8ab8ac5830ca651b7b630ce +8b3bc73b640dc80ac828541b723a968fb1b51a70fa05872b5db2c2f9b16242c5fe2e8d1d01a1dbeaac67262e0088b7b0 +aa8d892a6c23dbc028aae82c1534acb430a1e7891b2a9337cedb913ff286da5715209cffb4a11008eae2578f072836cb +8dee9747a3ae8ed43ce47d3b4db24905c651663e0f70e2d6d2ddb84841272848a1106c1aa6ba7800c5a9693c8ac2804e +81e2c651b8b448f7b2319173ecdc35005c2180a1263e685a7e3a8af05e27d57ec96d1b2af2cae4e16f6382b9f6ec917c +98a9a47635de61462943f4a9098747a9cf6a9072a6d71903d2173d17c073eff3fc59b2db4168515be31e6867210ecbcd +912b2398505c45b0bb4a749c3f690b1553b76f580b57007f82f7f6cce4fadd290d6df9048258978c8a95ef9c751a59a2 +8ac8f0893fe642111ef98ae4e7b6378313a12041bbca52141e94d23152f78c2e4747ae50521fc9c5874f5eb06976e5cf +946b4a8eb05b529aaed56ac05e7abeb307b186a7835623fa4e85ed9eb41a4910663c09ea1bd932a2c467d28776b67811 +a4be51abeddd40e1da6fdb395d1c741244988ff30e10705417b508574b32dce14d08b464486114709339549794df9254 +b33b6b7d66cb013e7afeabbd7ed1e0734eb0364afe4f0f4c3093938eec15f808985fb7f3976969bf059fa95f4d8e335b +a808adbcf0049f394914482483ee0f711d9a865615ff39b5313ed997f7a0d202ad9ed6e6de5be8a5c1aaafe61df84bca +8856268be15a78465ad00b495162dc14f28d4ef4dcf2b5cba4f383472363716f66dabc961a6dbdda396e900551411e41 +b16ba931e570e1bf124ea3bd3bdf79aed8aa556697ea333e6a7d3f11d41538f98dcde893d0d9ba7050442f1515fb83b1 +91ecde1864c1a9c950fd28fa4c160958246b6f0aa9dda2a442f7222641433f1592d38763c77d3f036a3dbb535b8c6d8f +92cda991f69fbf8e55c6bf281b07fff5dbbb79d1222b8c55686480669247b60212aac27aa7cccd12fcee94e7a759b8af +b1d9b5b4e996b375d505d7250a54c12d32372c004a9cabf1497899054cb8b5584b1cef1105f87b6e97603ccbf2035260 +86e98bde8b484fb809b100f150199f13a70c80813ad8b673bf38e291595e2e362ad1fa6470d07d6fbe2cf7aeac08effc +aa12f7c39ba0597a8b15405057822e083aca3cee6ed30c4e0861eeb22620823588d96c97bb1c3776b711041c4dc3d85d +b477b34f29334f3bae69c7781d574342b7c27326088f9a622559ab93075c7357953ae84eb40e3421f453e04e9b4d5877 +9625067cb2120ce8220a469900aa1d1bb10db8fe1609988786b07eb2b88e0ddb35a3eccd4b6741e1fa2365c0db6b1134 +997b92af7765f587d70ea9718e78a05498cd523fc675ad7b0e54a4aae75fbeac55d0c8d72471471439dacd5bfcfae78d +88b59eaea802e6a2cf0c0075bf3fd6891515adcb9adf480b793f87f1e38d2188c5ed61ac83d16268182771237047ec8a +a57d078b230b1532c706a81eaabfef190fb3eb2932f4764631e916a0f0d837d6014da84ede100abaf610519b01054976 +94ed5c5b96f6afa9f2d5e57e1c847ae711839126ab6efb4b0cf10c4564ff63c819d206fdc706178eb6a0301df2434c01 +980296511019c86cc32212bad6e4a77bc5668b82a2321a1ecabc759a8bbc516183a4787c7f75f9ee7f1338691dc426cc +b10ef97db257343474601fd95f9016c205e28bd22bf7b8f9e30c3b14aca1cc9a11e6404ff412ef269c55fb101fee5a37 +b670d5d9c77fc6aa14212dd3eae100620f3510031b11a9625aa40bf31835c9fd717753b555bd159b1aa64a2104929340 +862054fabf6d6d529a7584d1a48f72d2eb216caf959c782ec36c69c26aef4595415d19a28b041946811b34a629105241 +ae4bf2ccd7b0f3774653848b5b4d39e5517dcbcff30d8441d78bc387ff42b573f16b7b0a7366e6ca5cef1dd9f0816df9 +8f810527badcb49f1542a0ccd12e3541efa084243f7106eae003458c176f4c1f01daae9d4a073c2cb2aced747e8a4576 +8a32c2067aaf6baf32db67acd4974a22a6da33db5444028a7c8c4135f9c84e102dc3b2c635b15afa6dc907d0270daffb +b15fc057f306a60b20c8487125b6b334ab749cf70eb8a30c962f625bb203ebd0d2a315949ee3b7a99e3d91acec384806 +a37f145d321359b21cba7be8b64dfae7c67a20b7b324f27c9db172d58e77a49fa02ed3d06d09d7644bf1fd81f4aab44b +b338d2e39a485ee4297adcf5e58e16c3cc331c5dffeade0be190907c1c5bdfed38537a6d81dc39a2cdfc1bc45e677886 +b69d84d8511b3aedfdc7c7e66f68b24e12e5a2365dbbe014bddd2e99e54143428cf8b74cf12c0e71316038aa5300e87e +ab210cc38661667450561a1857337879633f5d5bf2c434a3df74ff67f5c3ba69a7880872f19ae4dcbbb426462cd7d0fb +94538ef487a58a5ff93a5e9616494c5f066715d02be5b249d881a00bd0edfe2fe19dd7a5daa27f043d1dbb5ac69cf58d +afb47a899c1b25fe800241635fa05de9687a69722802ad45434f551971df91d8ca9edda0d835d82eb8f36ff9378ed7e8 +827a10d7536230887283a9b1dedccc6b95ef89cb883c4ee7b9821058b0f559704d1636670c0ada2b253bf60b7cb8a820 +97cc07965065d64409f19fb2c833b89ca3a249694b16b58818a6f49d3800926627ce0f87e5c0853ae868b4699cfdee5e +ae0c93d44780ef48ea537cf4cb8713fd49227f4b233bc074e339d754b5953e637a7289c6f965162701e4b64e4eaec26d +80953053397c4c0ba9b8e434707f183f9ced2a4c00d5c83b7dc204e247ad7febc1855daeb906c53abfdf3fe3caca30c4 +80f017e87b471b5216ebe25d807be6c027614572337f59f0b19d2d1f3125537478cb58e148f3f29b94985eac526cd92f +8a8e1c0d49801a8dd97e9e7c6955fc8b2c163a63bd6a4be90bb13e7809bb0dddc7a5025cc7d289a165d24048eac4e496 +8530e5b5c551a2e513d04e046672902c29e3bb3436b54869c6dea21bab872d84c4b90465de25dff58669c87c4c7d2292 +ae3589d389766b94428e9bde35e937ed11aac7ead3ce1b8efe4916c9bfff231d83b7e904fe203884825b41022988897a +ac02e629a900438350dd0df7134dfa33e3624169a5386ea7411177b40aa7a638e8d8aef8a528535efdbe1ca549911c0b +b1ac60b7270e789422c3871db0fa6c52946d709087b3b82e6eba0d54f478520b1dc366bb8b7f00ff4cf76e065c4146eb +a7465e1f8e57de1a087144d3c735fee2b8213fcbf2b9e987bb33c2d4f811de237bf007402e8d7f895563e88b864f7933 +8ab0007ba8984dee8695ec831d3c07524c5d253e04ec074f4d9f8bd36e076b7160eb150d33d15de5dd6e6fb94f709006 +9605bbe98dadd29504ce13078c1891eca955f08f366e681d8b5c691eadb74d6b1f2620220b823f90ef72eb4ab7098e16 +942a083d07c9cb7f415fedef01e86af4019b14ef72d8ab39fe6bd474f61ba444b9aac7776bea7e975724adb737e6337a +b9a49a8c4e210022d013b42363ac3609f90ea94b111af014f2c5754fbc2270f6846fa6a8deb81b1513bb8a5d442ea8dc +99cd62b177d5d7ce922e980cc891b4f0a5a8fa5b96dfc3204673fbef2e7fb2d7553bbacd7b2e6eca4efb5e9a86096e2e +94e30b65b3edd7472111566dde7fab0e39a17e1f462686050f7134c7d3897e977550faf00174748cbeaec6c9c928baa8 +a32fbcb29f3391d62092f2720e92b6ef4d687d8a3eae39395e0464669a64a38fe21a887f60bc9519d831b9efde27f0f4 +8f1492c4890d8f9deecb4adada35656e078754dcf40b81291e7ef9666d11ba3747a478f9420a17409d7d242cecd2808f +8942960b319ef65812d74cb1d08a492334db58d41e8437e83ddf32e387d9f3ad36834f59e6a71d1afb31263773c3ec49 +88d692f4976c99e763b027df9c2d95744d224724041dfbe35afc78b1f12626db60b9d0056b3673af3a1741eaf5f61b43 +9920cd37eab256108249a34d3f1cc487829cc5f16d1bce3a2328fe48b4de735ebde56c8b5cf4e532a4d68792387257c5 +87d34c9f5a913b806504a458c843eda9f00ff02ad982142543aa85551208cab36ebf8b3409f1c566a09a60001891a921 +a2ee8339c96f790b3cf86435860219322428b03ea7909784f750fe222bc99128d1da2670ad0b1f45e71a6856c7744e09 +84bd257f755de6e729cc3798777c8e688da0251a2c66d7ba2e0ce5470414db607f94572f5559f55648373ce70e0b560e +8d0e170714ddf5dde98b670846307ab7346d623f7e504874bfd19fbf2a96c85e91351ba198d09caa63489552b708fbc8 +9484cc95d64f5a913ed15d380c2301a74da3d489b8689f92c03c6109a99f7431feb8a07d9f39905dcef25a8e04bcec9b +b14685f67dd781f8ef3f20b4370e8a77fef558aa212982f1014f14b1bdd8b375c8a782d1b8c79efc31b41eec5aa10731 +b22fb1541aa7d2b792aa25d335d66e364193fdbf51b24a90677191cae443f0ce40a52faf5983d2cb5f91f0b62a5f20e1 +b06fa9489123ab7209d85e8c34d7122eb0c35c88ee6c4c5e8ae03a5f1ae7c497c859b0d62e0e91f5e549952330aa95a4 +b5cd71617ff848178650e6f54836d83947714d2e074d8954cfb361d9a01e578e8537d4a42eb345031e3566c294813f73 +848d39ea2975d5de89125a5cbe421496d32414032c1e2fbc96af33501d3062745b94e27dfe1798acaf9626eabff66c79 +ad35955efd5a7b6d06b15d8738c32067ffa7dd21cf24afc8ea4772e11b79b657af706ce58a7adcc3947e026768d9cdaf +aff6d7c4861ff06da7cb9252e3bd447309ad553b2f529200df304953f76b712ac8b24925cf4d80a80b1adaa2396f259a +b4b88d35e03b7404fc14880b029c188feecb4d712057f7ba9dedb77a25d4023e5a2eb29c408fde2c0329718bdaf1ff63 +88e96720e2f7c63236cca923e017ca665b867ba363bc72e653830caf585d802fad485199055b5dba94a4af2c3130a6f6 +982675dc0299aeedba4b122b9b5f523ca06d54dc35da0f21b24f7c56c07f4280265fb64cec2f130993521272c3470504 +95c77d418490e7e28293169cf7a491a7dcc138362f444c65b75d245c1b986d67c9e979a43c6bd8634dae3052df975124 +8fd6c4dff54fb2edc0bdd44ccd1f18238c145859ccd40fbfbc1cf485264445b9d55ffd4089c31a9c7a0543cc411a0398 +b153eb30af9807b5fe05d99735c97471d369c8a1af06b2e2f0b903b991eb787ab5a88c6e406e86225582acf8186ad5ef +826b55de54496751b0134583b35c0c2049b38de82821177e893feeeeb76ceeb747c7a18312cb79a6fc52f2c18f62f33e +91650d7205b232c495f1386bea0c36e136a22b645ffd4f5207f5870b9ce329c44524781c983adf2769f4c05b28a8f385 +b8d51a39162ebb38625e341caacc030913f7971f178b3eee62dc96f979495a94763ea52152198919c6dd4733bc234f64 +a1fbd3673f2ae18a61e402fe3129b7506d9142f2baca78f461579a99183c596b17d65821f00d797519e9d3c44884d8a6 +b7c5f5407263398cf0ed3f0cf3e6fcebdd05c4b8fd4656a152cedcdbf9204315f265fd8a34a2206131585fad978a0d6c +94fa71804e90f0e530a3f2853164bc90929af242e8703671aa33d2baad57928f5336e67c9efdcbd92c5e32a220b4df07 +b75dcea5ad5e3ed9d49062713c158ebc244c2e4455e7a930239998b16836b737dd632a00664fded275abe4f40a286952 +a02f7b37fc30874898618bfcc5b8ff8d85ef19f455f2120c36f4014549d68a60a0473ddfd294530dfd47f87fbd5e992d +8b48e1626917b8ba70c945fe0d92d65cab0609f0a1371fd6614d262d49fe037f96991c697904d02031ec47aab4b32f48 +b368f02c21d4af59c4d11027e583ca03ef727f2b2b7918ef623f529ceac76753a05a4ce724ce2e018da6ecc5c1c1261b +a95cba06eeae3b846fc19a36d840cbcf8036c6b0dc8c2a090afcf3434aaf5f51ef5d14b1e9189b1d8f6e4961bf39bbf8 +b32ca4dfbeb1d3114163152361754e97d3300e0647d255c34ec3025d867ed99e36d67ebafe8255b8c29be41864c08edc +8e4eddefa27d4fe581f331314d203a6a0417c481085134d8376898f9260f133e2bf48576528d62adf29953ad303e63a7 +92b7d5505833f00d5901ae16c87af028de6921c2d1752a4d08a594eb15446756ea905b0036ae6ffe6b8374e85eb49348 +b50e9018d3c4e05ba9b28b74b6634043f622d06aa8123da7cd0bc482b3131912149214d51bdfd887484422e143c3c1c0 +ab980a2f5317dfcb92baa4e2b3eb64a9ac2a755da6c11094d57e781ae5cf43e351824f1dd3abb4c6df75065b3784210b +aaabb009dfcb0bae65a0aee26ed74872c226965c52a6ed0998209e020a9ee806297dba4b15845cf61e1a514de5d125db +a1fe78f67000ebb6e90fe33e1a9dd5489be6e15fedb93b2a37a961932b77137fe85d46e89a132ecf7bcfb7aa95e16757 +85bc6e7d660180de2803d87b19ed719d3f195ea0a92baf9bfff6113c743f4237f51355b048549913e95be8ddf237864d +87a167968c4973105710e6d24ad550302ee47fe1f5079d0f9f9d49f829b9f5c1cd65d832d10fe63533e9ad1fa0ad20f5 +b2ad1a7b95b8a89d58e0b05c8b04ae6b21b571d035ae56dc935f673d2813418e21a271cccaf9d03f0d6fa311f512d28c +8268e555319992d5ac50cb457516bd80c69888d4afa5795fcc693d48a297034f51e79f877487b6f7219cfdd34f373e14 +b235411f1f6d89de3898642f9f110811e82b04ad7e960d1dd66ec7a9bf21de60e00cfabcd3004f3b5c4f89f5d9c7422a +b6963effcfe883f7ed782a3df3c40edd70f54ceca551859bcccb5d3e28fd2c1fcbdd7acc7af24a104687fd02b53c704d +862645c944e1e2909b941578cc5071afd7353fed1c2c99517e2de7573037704ef5d35accf6ec79b8269da27564209d50 +90f585eeb1a053e2f18c1280c9d6a561c0bc510b5f43cd68370ed6daac4b3749852b66c371397b6a7c1ece05ee5906c9 +876d9a3686feb79ce781e87ac3e3fbeef747b6ab031285e808c8a73f73f55b44507850dcaa745c0791d2cae8ad61d74e +a7ecc3b8c10de41a7bd9527228a0d3b695a651a5b5cb552a3664a887077d39ee60e649aecd68ed630da6288d9c3074ad +83529f1f2b4dc731ea05c1ee602fa2e4c3eebe2f963f3625959ba47657be30716d64e05e8b7e645a98bf71c237d9c189 +834ca6b14428c30a4bc8d5a795596820af6f3606f85bee9f3008f3fb94b3adffa968d21a29e2588d7a473d8b5d3a8b42 +b8d08cd8b73430984fd16e8db0525ae2b76253c92cccd7b3470add4d12d082eafb55a72bde04870924d0bdaf61f76c5d +96ef32df669690c2391f82136fc720231e4a185c90ba79eef7beaadedf7fbeb56ed264825564bdc7da01829b47f4aa88 +93d637b2f04d71891a80a1ee93fd9c9046d671bc4c15c4e597cfcc36f4ae85a7efc111359628965fd10d36c39129b160 +89f28dd3f7bc43749d0e3750c136385d4ffaf2c40354d3be38341416d755de7886d8108d83721b36f99feb3bccd73c88 +ac6392e274659f4c293e5cb19859828f101959c4c0939920a8dfed0e2df24a0cbf89a7aa983e947318c58791c893928e +83b2d4ce42c2fa0f672cd911365d1f1a3e19f1c38f32bedc82820ad665d83ae5fac4068e4eca6907bd116898966fed92 +b5e0144d6e59a9d178d4ee9f8c5dba18d22747fcdf8dc4d96d4596a6e048e384cd1e211065f34109c9ed6b96010d37e5 +b1a65e6b38c9e84b3937404d5b86c803c2dac2b369a97cbf532cfdd9478ee7972cf42677296ad23a094da748d910bc48 +849d7f012df85c4c881b4d5c5859ab3fb12407b3258799cfc2cb0a48ae07305923d7c984ff168b3e7166698368a0653d +84d9b7ee22bf4e779c5b1dd5f2d378ef74878899e9dbb475dfdcd30c2d13460f97f71c2e142c4442160b467a84f1c57d +964e497ef289fac7e67673a6cb0e6f0462cd27fc417479ecb5eb882e83be594977fb0c15a360418886aece1aaf9f4828 +ae1226222098a38ce71f88ab72de6ededb2497e30580e7ae63d4829dcc9c093bdd486102b7a7441cb06253cf0df93772 +a72865b66d79009b759022e53b9eedbd647ff4b1aab5d98b188100d01fc6b5d8c02b80eb6f53dc686f1fdda47d4722b8 +93aa8d7d8400bdfa736521133c8485c973d6d989ec0a81db503074fe46957a3999880fd9e4e7f44de92adf6ac0abe99b +a75e5ab84399962ada1f9ebcfc29f64405a1b17cd0a983950d0595b17f66386393d95a5aa4c6c878408984141625141c +91b1e5e75f4b55ec2e8f922897537082a1414eedc2bc92608376a626d8752d5d94f22f0e78ea1970eb0e7969874ad203 +83bf9c308424ef4711bfa2324d722f550d95f37d7f7b4de0487ccf952b89d7219ca94e7fa25bee60309efefd9a0e4716 +a42060476c425ff7979456d3c5484bc205fb1ef2d7149554a4d483d48e2a19119f708c263e902943bcf20a47e6c7d605 +8170c45ea126e6367aa5f4a44b27f7489a5dd50202cb7c69f27a2bdf86d22cf6b00613b0080d75fca22439eeaaaa9707 +8e5a82da70617697e42c6b829e1889b550c9d481408fe4cf8dc9d01daccabdec01f9e1b8c27dc84902a615d539bf9bc6 +80606c51401d0bf5f2700ebce694c807ab1f7d668920bdcccef2775e0939472419a8f404567bd4f9355095517eb4d628 +a40314565d60d0ddf8995673e8c643b1baa77a143b3d29433263730a6871032260abc1320e95af8287b90aa316133da0 +a87e07e84435f9e8a51ce155cd3096aa4b20d18e493c9dcbc0ac997ac180f3a255bf68ccd8195f2564d35ec60551a628 +84d2ab98416643c457bf7ddd9f1aa82967ecea189db08f3558f56803fe7001693ed67ec6ca8574c81ec1293b84a7c542 +937c3b955889ceae77f28054ce53d75f33cfe3a04f28e049cea8b8ade2a0440d5e2e8c4f377e6c1ae2115d68cc95fc16 +885a911f16845fe587b15ce7cd18cc2a84295bf609732340f74e0f5275b698cffed3e9aa1440e19e6940a7fa8f24c89c +ad90059a50c399996aaa0a10a8f637b7bab0dd5d9100301f0159a2c816596da55c30b2568d1717705fd2826b117a42d6 +828de9ff1e095c189da1f1ee18009afe14613ac696025add6f4e330488e02d5f1a90be69edd9a17bfb3355a0ca77b525 +b7aedb8394064a58dd802be6457555c0cf7b94805ed00cc66f38449773f4b1865feaee3a6f166eb51b2123b89d853a4d +b09c564ff37ccea34e90f2d50a40919a94c2e10d4fa58ffeaed656f88f9f4ae712d51c751b1b8f443dc6c9506d442301 +b24882d66b2ebb0271ebb939c72308d81f653940e70d6f1bcaae352f829134aff7f37522cc42de9e7fe6243db2c4806f +8e6f8dd906e0d4eb8d883f527e926ad1d8156b500c4cfa27214450c8112267c319900de2443c87bed1e4bb4466297dd5 +ae42f4578e8d79b6aa2dca422ada767e63553a5ee913ff09cb18918116905b68f365720a1a8c54c62cce4475ba5cdd47 +ade639bcd5017ea83ec84689874175ed9835c91f4ec858039948010a50c2b62abc46b9aee66a26bf9387ab78f968b73e +8d310a57aeb123cc895ee2fd37edc3e36ce12743f1a794ad0e1a46d0f5e4c9a68b3f128719ed003e010f717ec8949f43 +8606c086fcf3e2f92c1b483f7e2a4d034f08aef1a9d5db9e8a598718e544b82544268a0a54dfed65b4d0e6027a901d47 +8ccd95dd673d8cfdfa5554c61bcdbe6bb5b026403a320856fe51571e7c59504fe1c035f2ad87d67827339d84c0e1a0c6 +955a7cb4afcf70f2eb78756fc3a82e85ab4330eb89a87117294809beb197d1d474001e25306e8ad71daab6928abf6d64 +ae6b44ec6294736ea853ddeb18fc00cce0ac63b38170ff0416a7825cd9a0450e2f2b340d27a7f2e9c5ac479b4cb8a5fe +a88ec3f12b7020dd593c54376597b056e70c772c0ec62c24c5bfd258b02f772161b66e5dcd95c0c0fceb23433df9ff23 +b4a83933b4de552dba45eedf3711f32714e58ae41d4dab8a6114daeb06e90a5a5732c70384150d04124ac6936ca9804b +b8b7c4fa549b0fa1dc9c1f0af0750d6573f1648767751882d41f0dd7e430e3934590757e1c8b436ac35381bdde808117 +ab598b911234a98cfde07234cfc0d2fddfc5cb9ea760212aa3e175a787ce012965c8fcfdf52d30347f5f1b79cf4a0f54 +a9d354f9dfbd1976e5921dd80cbb56b2e15df53ce099ecb4368eff416998130d7830209282aaf1d4354129845f47eb80 +8c889afff546c721969e4d8aae6e6716ad7c2e9c1914dd650e30419ee77d630efb54dfffb4ec4ff487687b1864bf5667 +94ed2fa79116c7c8c554dc306b1617834dd3eab58baf8f0d085132c4688ca4a6bd38420281283678b38970a3f02b9a94 +944fdc8f0516d22f1672193d183833d3e3b043e26807fb2123729a0216c299785b1c4e24b5aa56e9bbe74fa54d43e22a +a48521454a3e0c10a13d8e810fad9d0522c68eea841821a8e0e57811362f7064a8f9c50f79c780a02df7df8c277feaef +8f3d26670ab55e1bd63144e785203373b2b13b76cac305f0363e48a6339fac3364caa3fceb245527161fc2fac9890912 +b4d6fe71001cb4141f6d8174dd7586d617cfccb54471e1fbce30debc2b1dead62cab29565abb140b682811c6231acb03 +91dc8afc4934fcc53ef851462a055cc1c3c87d7d767e128806891738427606d2fbfa832664d2a7f95f8ffe2cf0c44dc6 +b297eb432c74071764272c1b1663547ba753e66bf026643bfc0e42a9c5cdfb05a88083ad67d6ddfe6ab290678c607b29 +b343d1df85be154faeb5b21741a5ac454ca93f70a0b83a98f5901d1be173a1b2969d43e646363c5d4975924e1912599e +b2d74a66e4dfc41128aee6a3f0ff1e5137a953ed7a2a0ab5a08d7ea75642f12bd150b965c8f786ad0caf55ef7c26be4f +a54141faa8dd9a567c3cd507e4fc9057535ffe352fa1e8a311538fe17e4a72df073fbf9371523e5390303db02321650e +8e229a58f1acc641202d2a7c7e120210b9924e048603b9f785a9787ad4688294140ef3f4508c8c332d2dedafff2485be +9523554c11d39b56e6a38b3b0fadb7a9a32a73c55e455efdcfda923aff1e9f457d1b7cbc859b5ecbb03094eae8b87d38 +a199ffdff1812aaea10cd21a02b3e7bf3d8e80e501aa20bb2105b5f4cb3d37265abcda4fd4c298d6c555e43fa34517f8 +97f1285229b07f6f9acd84559afef5daad4320de633c9898b8068c6cb3b19b4468b4445607559ddf719f97d2410e2872 +a1dfff82908c90fc38ec7108c484735f104e6ce7f06097e1e80f6545702b6a0bc2a2706203cd85162edb7e9294fdedba +b12a706311c617d6c19e964e296072afce520c2711086b827cff43a18e26577e103434c0086d9d880c709df53947b48c +88503a6f48cef2f5cd3efa96a5aacc85dc3712a3b9abbb720a2cff582a6ea3c2afc49288b6832c8599f894950843ac11 +83ed63e38dfbe062fe8c7e6bc2eeb5a116f1cc505c6b038990038de6051281f9062e761ea882906ccff69c9c5b8a4a25 +911090d5d0231dde1189408dca939daddcb69a812ac408d1326060f0220781bcc131c9229e6015540f529d9fb33d9b0a +8a8352f1d9e5c7e80276e4448f997d420d5a7e0e2d5be58ae4106f47f867d1caa478b2e714d9c3263e93e5cc4c7be08b +9362f1ea9995f9b3850ebb7c8d5bf95927ab5ea25ee00e85d7456b3bf54459798b1fffde049d445c0d0587b0ab0a1694 +8859502b391273f4a00b6c0e87e5cdae676b7baf6c402f12b3360db6a5dfb4931ece4da0e1e4d98c7a71c3d01a183a9b +a9a5edf474120f9bbec9485d8b1e6f83be68b10de3d765219b0bf3e5d2840e478f1fb2bf806d78a8b8ad22ec50cf7555 +82c75daf983b06e49f0d75a042dfaae8cc92af050293d9059d6e8b01ca3ab2597e7adfc1159ed805513488944e739fa5 +a5cf240f04a9bfa65b811702c923d209e01f9535e217fa55ae3e0d1eb3257d6749e5587e727091e860609d1df29a1305 +95608ab8ade1c9fb814bad78d9cc99a36ad3e9562d5319830e4611ceea508ef76be04639294be9062f938667e33bce6e +8e44181f35c38b02133473de15560ae6588ac744cfdaf5cdfc34f30ca8e5ff6c85eb67dddc1c7d764f96ed7717c89f06 +8007b6ddece0646b7e9b694931a6a59e65a5660c723ebdffb036cf3eb4564177725b1e858ed8bc8561220e9352f23166 +a2d9d10fa3879de69c2a5325f31d36e26a7fb789dc3058ee12e6ccdda3394b8b33f6287ba1699fce7989d81f51390465 +81993d0806f877ca59d7ffa97bd9b90c4ebf16455ea44b9fe894323c8de036c5cc64eacf3f53b51461f18fa701a5860d +a20030f457874d903b2940ec32fa482410efecb8a20e93f7406fc55ab444e6c93fa46561786e40e9bf1e3c7d5d130bc8 +80c72d4985346ac71a231e7bbbb3e4a91bf50142af0927e8eb86069303eb4ce7fca1aa5b919d5efc82f2f09b41949acb +91b857d2f47f1408494940281127ba4b9ac93525788e700889aa43402eedea002e70eded017f5f5263741ed3ee53a36c +97445d007f08e285ea7f4d25e34890e955dac97448f87d8baa408e826763c06cbd58dd26416ba038d6c28f55bcea2d3a +a409c89526c2886f6a6439e2cd477351fc7f886d1a48acc221d628e11895a4eedd426112a368a0dbd02440cd577880a8 +a2c6adc7866535f6ffc29e00be4a20fa301357e1b86dff6df5f8b395ad9fb1cdc981ff3f101a1d66672b9b22bd94ec0f +8887fc53ffc45e4335778325463b3242190f65ae5d086c294a1dd587f62dd0d6dc57ca0c784bf1acaa5bbba996af201c +9731d3261a7a0e8c7d2b11886cd7c0b6bb1f5c57816944cc146caa518565034cea250eeee44ddffaeb6e818c6b519f4d +afe91c706efb9ee9e9c871e46abde63573baa8b2ea2b61e426cd70d25de3cc8b46d94c142749094287a71f4dfadd3507 +ae7bdf6ecc4fc0d8d8a7fa7159aae063d035f96ca5a06b6438b6562a4eee2b48d9024dbe0a54cfd075eac39b7a517f2b +a382e5205bfa21a6259f42e9ebc11406b5da2aad47f7a722212fdd6fef39117dd158a9991ff95e82efa0826625168a1c +862760c80bf44c2d41c2a9a15c887889eaeea32acc894f92167fb6f72593377c228499f445ccb59794415597f038ac9e +b4e96595a91a611c4563d09f29a136a4c04f07be74dd71a6bbabc836617ecb95494e48971a8229f980b2189fd108d2e5 +b5e7200357317c36244c2e902de660d3c86774f7da348aca126e2fc2e2ba765fa0facd29eebcb3db3d306260e91a6739 +a64c7133156afee0613701189c37c1362e2b4414f7e99408e66370680c554de67832c30c211c2c678dab5cfcdcecb3f7 +88f4cb67b1db497a91a0823ee3541378133eb98777842d73e43ab99efe8aa52fa02dfb611c1691be23684618394988d6 +89a9382a147d7387d0ff9516ee0c75cd1f8ee23333f4a2c9693d1a8cbe03680bc5b10c43c238c2190db746cac409bf39 +ad510bcc067373d40b05a830bf96fac5487de1ad5b708a13f62484c09b00fba6c5b00b981004e5ab3f28e55c9a5bce26 +8384156d7117675547279ad40dc6bf81e8f9a57b2d8cfebeea6b9cd1d8534dc0cf704068bc3ba0815010cd8731d93932 +a818fb76e53165b2f86c7f2317d64cf5e45f48405a34560983cd88bfbd48369e258ce2952233a8ce09c464e07afcade6 +ab19a4ed90527e30796064634b66cdc023bc5966e2c282468f5abef7879fc52986d5bb873a796b077d10e7b374b60309 +a17dafe2484d633fe295f8533662631b0bb93cdb4e7cd6115271f20336f602f7f8b073983cd23115093c7f9891c4eef5 +804acbc149d0334c0b505a8b04f99c455a01592a12f64d1ec3b82b2f053ccc4107e47f418f813d6f400940c7c8700a4a +965e097a825d8511d095b247554ec736bcb3701ead3ba785bd425cbabd56f4b989764e0965a437fa63e7e16efd991fc0 +b6701675ca27d7a4084f06f89bd61a250b4a292ee0521b2a857c88c32b75f2a70b97f98abce563a25d57555b631844e0 +abbdf65fcbdf7d6551ccd8d6e5edc556f1ecd275ccd87ee2bda8ea577c74615f725aa66e0911e76661a77f5278e0c2b9 +ab715ae372c900239a0758a3524e42063afc605b8fb72f884dc82ab9b0ff16715f3fb2fd06f20f15f9e454f73a34e668 +b45f41ea1d25a90af80a8a67c45dea881775fed000538a15edc72e64c7aa435a5e4375dcdedc5c652397c02b0bc61b16 +86f7be9252f8ed9078e642c31a70a09639899f7ffcd7faaf1a039fec8f37e1fa318fba0ed1097f54fc55d79900265478 +a30e5ed4277dd94007d58d5a3dc2f8d3e729d14d33a83d23c44ddfc31c6eac3c6fe5eb13b5b4be81b6230cfd13517163 +87e723d916f5fcda13fab337af80354e8efe6b1c09ae5a8ceeb52df45bfca618eb4bec95fefef3404671fb21e80bf9db +a521b8a04dc3abd3e9e0454b9a395b3638e5394dc2d60e97fda61b0a1880d1d73a64a4633f3d7acbd379bde113240d03 +851686c79c5403d5f05fbaac4959fcbfdfb51151bec55e10481b3c16e3be019e449907ae782ca154f76a805543d5755d +8ec1929e746b6c62b0c3fdd8f4e255e5c707e6e0d8d57ff9e409ae2dd6e76fdb50af923749992cf92d1b5f2f770bafbc +9175f7b6820d47205c9e44f8c684833e1e81da46c1fdf918a4dcafbc3231173f68370d442a20e45f8902bcab76a4e259 +b4f66c698115333b5ac00c9fe09aa9e1e9c943fbb4cce09c7d8a6ed4f030e5d97b48e944fd6d3e69ac70f1ae49d35332 +b958878b875eead61a4416a4597b1c567ddbb1eaaa971033f4a656f01a277822c1f4ea3972045156c2a5a28d159f5ddf +8188de8ad5258024d0280137a40909d24748137ac7c045dddd2bc794eac8edd5850b9d38f568fa8174b2c0593bb57e96 +91152c7bafce7a0358152221081bc065796fa4736bfc7d78076a0a6845287cde2ee2a2c9b96f500297c0a00410634888 +a5328ab939a2d3bd4c21e5f3894c02986b6590ad551c7734be3f4e70380eb7bc19629e9031b886ce3b4074ee4edee63a +97c4d49db40e266bcedaacb55edca4e1ebf50294679b271f3a2332c841705089b5ba96ef2064040fa56c36bb1375a8d9 +85cf0514f340f9d865b32415710d7451b9d50342dbf2c99a91a502a9691c24cd3403cb20d84809101cd534408ddf74e8 +950c3d167f59f03f803dcba3f34fe841d40adc31e5be7eefff2103d84e77a7cbe4f14bd9c3dfa51cde71feb3468a9c00 +96a69624e29c0fde3b92caf75a63ac0f3921e483f52e398652f27a1ec4e3cc3202f17af1f66224731bc736a25638d3e4 +aeac4170cf4b967227f66212f25edc76157eb4fb44c84190b520ecc2946470c37da505790e225fd1b0682bef7fc12657 +a94146a04e3662c50c2580ae1dba969cbb3fb0f43a038729c9e8be6ed45860b2c7de74f248dfa50ccdbe2ecaf3f2b201 +917b8e2880e85b8db723631c539992ec42536146e7091d4a3f87d37f051b5da934d84393523814f19962c78e6cb12ef8 +931f140ff8f7de79e399f5cd8503558d566b5c2ab41671724dd38aed08dd378210f01ac8fa9911f3047993dbc10cf8c4 +859eb9b560bc36273694f8ae1a70d25e7f206013597c4855a11328162ba1254bb736f1ae41240c8ec8dea8db035e08f2 +b4ad2cb2c3a3e6ab1e174f2dbfb1787a8544f3c9109215aa6d33265ef269455e3cde9858738b4fe04711a9cf9050e7d4 +8a3b342b87b19c0cdb866afff60317e722013c02dee458ba71e7123edc8b5a9f308c533b9074c7dd0d684948467502d1 +89185ac5cc5ea8f10a1f2a3eb968bb5867376d3cff98ef7560b9a0060206c4046ff7001be10b9e4d7ad0836178eba7e4 +845f48301f25868f6d0f55b678eab1f8458e3321137dba02b4cfbb782cbc09f736a7585bf62f485e06a4e205b54a10b7 +931a6c523d4a66b51efadb7eefadba15bf639d52d1df5026d81fd1734e7f8d5b51b3f815f4370b618747e3e8eb19699c +8eb3a64fa83dcd8dd2258942aea3f11e9cf8207f2fdd7617507c6dae5ea603f9c89f19d1a75d56eaa74305a1284ce047 +912a5050ed6058221d780235fb0233207c546236316176a104a9761bc332323cf03786dbac196d80a9084790506e0a88 +945fe10ec8dc5e51aa6f8ba7dace6f489449810f664484e572bfe30c2fe6b64229f3c8801e2eb1a9cb92ff3c4428cdf7 +b62383bf99c7822efd659e3ef667efee67956c5150aea57e412cbd6cd470807dfaad65c857fada374c82fcfca2516ad1 +a727a31c45b2970d08a37e169ea578c21484dde15cb11f9c94eaaf3736652619ce9d3a44e7431d50b0e75b658ebbc1da +97bf54ea9b84b82e4616027bd903ef6152439f1c6a8e1bae6db1d10fdf016af2cac10ff539845833dfd1ddad1403aa8c +a08cf36437e010e59b2057aedb7192e04b16f1cc66382cdef3490b7ad1544ae51f03e87cba0fe43a275841c247a2a0cf +acafab9fa28c1a607df2246490b630ddda1ecf0885ad24c2ecb2c2c1b7b9c7de8066714bf5b9b25f61981d08576789ec +851f0375128d2782586223467d0a595f4c5baa79616622a32f7d6ce1f08af06f8a109bd6527f88d93367dba17be661e8 +a2f1187c2a7cbf776653ff834ed703dd32e68eaf36f0700709be929f4c0ce5fa1d9930d1e3ea2aa01c7a16239e66cb33 +b3721f4a5d24ca112f020cb3f849543bf0e7f84b470fb00126ae80aaaa6f2c208d8359cd82ad9fbafd3ef2ac70656fb2 +98773ac3ce9528c73cfd8e7b95976ce597f67e146357642ac4fb6cb35046f3f39cf6c4a7b5af5c7740dda358aa0d2d08 +92c883a5d820541692af75be1b25dd4a50a4b91f39f367a551a7d5ad6065a26b60d68221a01e4950559717b559c2626a +b82e46dd25fd1234dad26fbcd8bb5177d7b87d79d362ffb9c2f6a5c16eb2ff324d135996fcd6274d919634597869d772 +82a53ed356ced5e94d77ee2a7f6e63f2ad8240aff2d17c5012cf5d1f18512c88c24793339b565dfbb659bd7c48dcbcd2 +84d20c7859b35a1cae1ff2b486d50822f9e6858b6a1f089ce4c598970e63e7c0f7dfbcb3337845e897a9dedf9d449dd3 +974892e5cf5ee809e9353d00e9cd5253d04826a8989d30cf488528c5dcdcad7650e23b4d228c3eb81f6647d2035a9e02 +b2327854910dbf3d97fe668da5fc507e179c4bc941f39bdd62e8b6035f004449c467240f656417e501f32dee109f0365 +88888f73475613d45d0b441276b1dd55835b69adfb27e26c4186936dae047b85478cca56be8dc06107b89a28f3bbb707 +836ba22e40511feff81a5dace3df54e2c822b55e66874dd1a73929994ec29909ffc2a8e39bfc2d16e316b621eb4a5ec6 +a754cedcccf4165a8d998f326f3f37d2989f92ca36d9da066a153c4aab5a62bb0011896bcbf90f14c18e00488d4123bd +86c26fa9584314292c4b7d6fe315f65dadd0f811c699e6e45c95a7a4ea4886c57dc5417b67edd78e597d037c7689568e +b205589648aa49ef56637712490e6867aa3b85b2b31e91437a249fb51bdb31401bff57b865c9e27293b30014b4604246 +afab0843ede582e5a1898ee266235066b94ea378884eaf34919ceaacc0e2738e1074b6ed41e0a1dd9711563e24f0215d +996ed65fbcab7611eada5bd0fd592d3e44705098b8b1dfba6dcdbdcfa1382fe893fa55270a0df0be0e1938bd71ab997c +881bc448a5ef8c3756b67ecb1a378a5792525d0a5adb26cc22a36c5df69e14925f67c9cb747a2f7e5f86ba1435509d7c +b219303c02c9015c6a9a737b35fb38578ab6b85194950a0695f7d521206e1e12956cd010d4d6c3bc3fafd6415845d5d1 +91748829bbd005d2ec37fc36fee97adaccb015208b74d2f89faa2e4295679f7685298f6a94b42d93c75ca9d256487427 +a41d6fd33b9864ebc404d10a07b82ba9d733e904875f75526d9a1f1c1c08b27160dcdb9023c5d99b8ff8a3461d57281f +b68978d39c97d34f2b2fea61174e05e05e6e49cde587e818b584201cf59b7096cf1807b68f315119c6db8d6110b28a9f +b64e66cec798022d64ce52477475d27ea7340817fe7f570617f58c3a9c74071d7ea6b54743d4f520b62aecad9a3a6620 +87b2b9e1c1786b7824f239a857024780a1457e51c64599b858118885833fb87a17d408bc09dcc0607d15ec1e53683a74 +9814799bac07dab4f0c934cc3c051676ca13abd49cf8d4739864e5bb9f2a8474897695113f49239f28832a8658332846 +806931a1526a843a9c2045943d616a8102b02b1f219535a1f1fbda659a1244f1bfead52ca7f1851ff8a97169b91c9ec0 +b8678249595a9641c6404c35f89745b93d8e7b34d9d44da933a1b2f1606972624c5108f1c04eb42e454d0509f441ed9e +81426714851741045a4332eb32b6dfe6422a4a2e75b094fb7c3f37da85648c47ee8af1e54ba26f4e1b57ebe32d0e8392 +b7a1875ea3f119fe0429fd9068548f65cf2869f8519dbbce0b143e66127cb618c81d7578e8391d676b2f3963e9d87f43 +872220a803ea0c6294cdc55aceea42cfacfd7a482982bcb90c0361c351a900c46736a890609cd78f02fb5c8cc21fa04b +974f0380197b68205ff4bb2c9efe5626add52c0ad9441d7b83e6e59ddb2ed93ad4e9bbdbf33b3e0a206ed97e114ea0f2 +a840f2d9a74fca343aedb32ac970a30cbb38991f010d015dc76eb38c5bb0bfe97dd8951de925a692057262e28f2b4e9d +b0913c3ce61f12f9fdc4be3366ed514c3efc438f82fc58c4de60fe76098fbc033a580ec6e4531b9799611c89a8063a66 +a0180d533eee93b070dac618be1496f653a9a0e4e3455b58752bf1703ec68d0be33ec0b786f9431ef4208574b0ad316e +a4a6b871bc95d3aa57bed90e14a0a1dda6e7b92b7ae50e364593ce6773fbf736672b1f4c44e383af4c3cc33e017a545a +a3f44cf19fe52bacc4f911cab435a9accbe137bdbe05d34bdd8951531eb20b41d17e3540e8d81e6b3eea92c744562ee5 +ae6b6d0ff3b30ff0b7f9984ef741cba27ffb70d558de78b897199d586cf60622ec2d8a9d841712fe719cf0f97628842c +87abf72f98c81d6d3a57ab1e224fe4b502ab0d8090d8abc71791271550b721c220d4e2e7da3be94a20c0e63d98e39a50 +b2f73ebdfe7133af57353052f4599776e16862905e64d97e1020c4bb84132e476d1ab79a9fb71611410f3f9d56c95433 +ae1a928253af2b210d31e1b64c765fcbd20a96b8d53823a6b9b6e7fc62249abf4a66c6a6aedb0b687e7384af9a845e0d +99c54398627833ca1435718154de171a47c709e4d5c58589fdabe62e72f2a7a11ae561bc31d7cbe92df4aff23e08cd0e +8a1310bbf1a31fae18189479f470977d324dec6518a5d374ab2ffcc8f64412fb765df57d2ddf69b9a6efaeb2b4c723b8 +898312c6c0d3d3438229b19a8a233eca8f62f680c2897f4dd9bbcacde32c5996d56ac0e63e3e9360158761185491ce93 +81b3f965815b97bc6988d945496a51e4a4d8582679c22d138f3d3bd467ed1f59545da2d66e7b4c2e0373628ae2682686 +b9aca91c6e6f4199beb6976b28e0e35e36e8752618468d436b1cf00d8d23538d0747920e5b2c31f71e34dfe4d5c86a0d +b908f4aa18293295b8cacfda8f3ea731bc791074902c554764c603ab9a1de1bbc72654fd826bffc632d95ce9f79c27d9 +a7316ae1baf4b1196961d53be7fe36535499287aba9bc5f3bed4323039b4121b65bb0bd15a14c1b9cd8b65ede3566da2 +815e39208f205c5fac25ac9988c14a62ab01657c7737a24472d17b0e765644bc2cbb7ff1e8ea169b8b0b17b6996c4704 +89a451d2b740cdaa83ccaa9efb4d0ff5822140783979a4fee89eda68329a08c018a75d58bd9325bdc648b0d08340b944 +8cd08f768438c76bae6bee1809dd7be38ec42e49eb6a4d6862db7698f338bf6b4b409088e4f3d1c5bee430295b12a71f +a4bd8c312103a4bfeb25b0cfffec7a1c15e6e6513b35af685286333c1dce818ffeb52826f2f5bada6b67d109c4ab709e +93afbef5382d89fa539ca527f3e9b4a8e27ab69fd5d5023962cc6d8932b33cb4dfc5f14343e1a3749bfd5e100c9924e5 +8d8e69d046992ec9ff14f21840809166cae8e0e9e7c8f14fb29daf163b05abe6611daa4010960e1141c5ab24373fb58e +96f8e72e96ba673c9265e9cc312f6b9c3b931745fc62d2444d59404bb08e5fb02ddb60715181feb9971cbd954526a616 +8d444c2b8e4d0baadb79e3147a2ee20f1bfe30d72eb9a02f15d632185fb8f4e8c3116066f7de1ebfe38577aaccacb927 +971410c0b10e3698f4f64148b3d2148fc6a4a22217fcf4253583530a9d6fbec77e2cf6f7bb5e819120a29c44653de3fc +99e7e1857bd5ee57007b7b99494b1f1c6bf1b0abd70c054770427d59a3c48eda71b7de7a0d7fcf6084a454469a439b41 +8c8a4cd864894f7a870f35b242b01d17133cb5dfdf2e8007cd5f1753decc0d1fd41be04e1e724df89f1d727e760fdb15 +890a24328bdeaaadf901b120497d1efa17d798f6f4406661e46ecdc64951f9d123d724ab1b2b49e0e9a10d532dd6f06c +a7cbe1f42981c9518608569a133b0b449e9d67c742d62f0d3358112c97e65ee3f08ec0ff4894ce538b64e134d168e5c8 +87c976dea77b3b750c3a50847f25b851af95afbaad635f9bb9f7a6ba8f0c4faeb099dd777cf7eac41072a526474cb594 +9882aa5e9bcc4ea2dd3de4bb5a0878a672bea924b50c58ae077563b6df0268910a60e969d3da1694ae7394ad0d9acd3d +90d35ce677327c461fb5dcb032202e851af1d205e9d21a34ed2b95635f13f8fb8dfa470ea202ccfa4b08140d0cf1d636 +b3b4cbb521cce2b681e45e30a4d22078267e97ccdbdc611b2c9719705650dd87e0ca6e80cf2e174f8f8160be94232c36 +95892b00478e6b27ed09efe23a2092c08e691b4120336109d51e24efbf8aba31d59abf3cf55c0cdab1c210670b9743ba +8643018957fb8ef752673ad73102d0b928796c6496e22f47b6454c9ed5df784306f4908641ae23695db46ebfcfb0b62b +b166ce57669bf0543019ecf832d85164c551c3a3a66c05b17874bccd5d0ae87245925d6f8edc62ac13dbd5db265823a2 +89fb4800ce4b6c5900d58f1a216ad77a170ea186f3aa0e355840aeedcf374e92a15ae442800c9d60334544be020b17a4 +8c65e586215a97bf11ffc591bce5147b4e20750e82486cc868070c7736c3de697debc1f335674aef24b7afdd41922d93 +90f68ce0c97d2661d3df1040ce9c4fa106661a719e97c7b2d7c96f0a958930c57d6b78d823a2d41910261ae1f10e7b0e +adda85e1287371ccbe752aa2a3c1d5285595027ba4a47b67baf7b105a22fb8548fa2b5b3eb93ca6850ecc3995f76d3dd +b26535d218f48d6c846828f028c5b733594ce01186e22e412dd4f4a45b3d87d2ac1bfe5d54c987e4e8aaddeb86366d7d +a081bd86962ea3d4fd13df6481f3aeaabdd7ceae66f7bbb913e601131f95d016cf147d045253d28457a28b56f15643c8 +b3d852cef4c8b4c7a694edbf6f0e103f3ae7f046a45945c77a1a85ec8dad3423636a89058fafc6628aabff4dbb95c2ba +b424ffc94e06e6addc90a6324e0482814229b5902e2a266d0c2d716e40651b952bc9f00d7dad9b6050377a70a72c7f24 +b2cafd908cae0ca22eaa2d9a96175744897a20eb7b0a6d43b0098cb1c69e3cb55373888201e4ed32816655eb7d8a3dd7 +b61177ecf1ae9d7e7852d98cbf6080d9f1e33c90f2436720b4ea4690437e8c7850c3754768fc1312cb4e838d855c5ccc +81b486644e1ae22cf0ba3a37e1df34dc186c82a99ab35ad6f475c37babdea574ddfbe5811d4aa020581292a793d66bd2 +97ae848a823ea7a99f91834e537fb47208f616c08fe32c8f8fe06bd35c9b638698c513265d0b4de9e572a2f9692b98e2 +81b8fef4ea5d399c65e78f40e47c559ada86d890777c549ce362e7ab81b3bfb00d5ff4ae4ee30fd7bda7ee90d28f85d8 +aada6912cc748923ea40bf01922c06c84bc81b2ab0bb3664a0579b646f03d47ce88de733ac7f2cb9be4a8200584cdb71 +89b48b9c79332f8f58eac9100ada5bb7decdc4b1555c5d383e2c1ce447efb0ebdff9c50bb52bc3042107f33a61ab2520 +a32ecca8b870b2b6e9d10b5c1d8f925b3d629d271febad65abed316262bb283c60cade0e91047fbd0fac53ac6db372b9 +b829cd1f13409e3573a8e109c9541b0a9546e98b6c879a11152b5564477ada4d8cb4b3079040e05a5cb63d75ef11eaab +91f3b100baa19e960b170fe9e03b799faac5b9c6f305c56115940bf81f6e64dcb9cda77e8de70ed73a21c0e8a74acc58 +b25b5e872c84065aee04822bbcb4f3bdff57fbd7cea314c383765cc387786c17de3d5bb3de3ae3314bdede14542bfac6 +a89bea9eca1f5a17a3efccfa4987d8e5366b0dba70ef1fef43aaea83c528428d1498c8b056ac27f16e8946ee93f7028e +818a1f7b0b8b06ea0514d6b4a0296da4f69cb18ac8e48c5579e6ba2880b06215fcbe81672566b8b94fcc3c0cadecb191 +98dd6e6b4b4d63d9aa7464a2be08ae8babac4da7716a3f109340bc9187d59c6ca0c88e6877a67c65096f64a3ced22a4b +a2069c5bac4f6590042aefb37570cc20908b0df9d0130180f565ed8a53b4ea476a274de993561fb4d009f529fe7aa1cd +860b7ec2410f033a7b0c5ca08f88a0ad29f951a5ebd5383408a84367e92f1bd33bee3b87adef2466b7e33b47daabf30e +a408855a8414102c3cb49f47dda104edf0887e414723da59b6b6537ada7433529f6a4d1a4ad4fe311c279213cdd59356 +8ca0d81dcb43b89a4c6742747d29598ede83a185a8301d78c6e7f1c02c938441360a1ab62a5e571e3eb16fe17131cbc0 +af7875a495cb4201cdb26e23b7c76492f47f8dd4c81251de2397d73d4c8d5f419cdbad69ba88ef0dc3552e460dbcd22e +80e901e433dca34f3d386f39b975e97f7fc16c7f692808221fb2ee60c1aaa8db079cc48c7d72fd548aaf8dde8d0b8f05 +b6062319e13926416e57a0ffc65668bfa667e708a4e3f5cb26d8a6a32072f5b790d628052d5946c5068dd17cf4a81df8 +90094b569e8975f8799863798912dbf89b12d2c2d62b3e5fac7efc245436fcd33af23b8c509ae28c6591d3f020966e06 +a504f72d3d06a0c9b188a1035c7c6d80047451c378b6c5b2ffa1f8cecdb64871cb6440afb296974c0a528e5e563061a1 +959061c4924e133a419e76e000e7c62204093576ff733ce0b8ae656ec6045ef94c5a1f3c934fb76fa9188c5eb397a548 +a8b9d0b58de38cb86cb88fb039a7c4c0c79e9f07f03954af29013baa18fc2633883f8f9ca847209c61a8da378f9075d3 +b16d8341da4ff003ed6d1bbdb3be4e35654a77277341fe604b4c4e4a1cb95e61362094fb3d20ab8482ea14661c8b9852 +8ea4ca202e3aed58081a208a74b912d1a17f7b99a9aa836cfaa689a4a6aa9d9fbfe48425cad53b972000f23940db4c5c +96a372f55e9a25652db144ec077f17acc1be6aa8b4891e408f1909100cd62644a1c0296a3ddc38cd63ef46bef4e08462 +87df40018ab3a47c3782e053dbd020f199fda791f3109253334a71be4159f893a197a494de8f94d6f09efa5811a99977 +aff82d2ea6b3ad28d0ca1999a4b390641d727689dc2df6829a53e57d4f6418196f63a18495caf19d31fc23fdff26d5e2 +9091053c4a18a22d13ad309313b6d2133a96df10fe167f96ec367f9b8c789ecca7667f47d486fc5ba8531323b9f035ac +a4842090515a1faccc3d8cadbb234b7024254eba5fdfcef0d15265c7cec9dc8727c496ad4e46565d1f08504c77e511d2 +b1d8a37b1a97883d5804d0d2adaa8dbf0c2d334ef4b5095170b19613fb05e9c648484093d0c70d545cf9b043b449c707 +b1ea40f3dd1c3d437072f8adf02c32024f32488dd59389d1c3dfe78aca3df0bab7767f6ded5943cc10f50555da6092f5 +ad219c6a8149f10391452892b65a3268743baa7402736f810a35d56cdfed83d2172b03f15c205f0dc5446baf855907a5 +afe44c3e1373df9fc53a440807fa6af8ebc53f705e8ee44a162891684970b04fb55d60bc2595626b020532cb455ee868 +859ae154b017eae9be9da5c02d151de747cc23094d8f96d5db7d397e529b12fb55666f55e846e2bbe5e6f5b59c9d8b05 +8aa01354697de23e890fe54869cd3ec371f1be32064616ca3a556d3019541ba8e00d683f1396ca08e48988f7f7df5de4 +b8f682487460b9d825302c40a7d6dd0353ff43bf24cd8807cdfa46c043e3f5a7db182b27a8350b28e91888802a015af4 +b6d4d6c3ac40f8976b50be271cf64539eb66dc5d5b7cec06804dfe486d1e386037b01271cf81ef96dba5ea98a35a4b43 +9385a2fd1cd3549b0056af53f9e4a6c2dfcd229801ffda266610118ade9a568b33e75b6964e52fcc49c8e3b900e1e380 +98f4aa0e4ef039786cbd569536204e02b0b1338568d1d22bb5bc47b5e0633fb7ffe1da93eb9d825b40b9b7f291f84d51 +b7b3460cf706dc270a773c66d50b949dabad07075021d373c41fbb56228355324d120703e523ea3f345ef7249bfff99d +81b826255f95201987513d7987cdc0ca0529524d0e043b315a47583136dbada23a114d50d885bb3f855fa8313eff801a +afdc6c35161645a14b54f7b7a799910e2e07c8a5efe1827031a2eecd5d9263b3baa367fdd867360fabc41e85ab687e74 +817b361ce582153f2952f3042e235ee2d229e5a6b51c3d3da7bbe840b5c6ec2f01446125045848d15fd77dc46c8a8fe2 +aeb599265398af6e5613297d97d2b70222534590fcbd534d68b24a0289b6366ac8188b753f6fd1000ee73ef44f8fb7af +a5a9e528b606557be64460c1ad302a43e741357827b92ddc50766a7e6287740fc23bd528d9faf23345ce8bff527d5bc7 +a8d3b3b438d5f75efaae6ce7b67c2212899ece5b5bdc9bac655e271fd1846ea8560e646fdbded3d9363eefe29473d80d +984c7976d557e2f591e779c2885f5033da6f90d63a898d515b5da3adbffa526764cd8eb679b771573fdf7eed82c594ec +8ac748689cc3280e064807e68e27e234609e3cc87cb011f172204e1865ad7fdc78bec1672bd6e6fddcf4e7902b0f38bf +877bb392059540b1c8f45917254b8cc34fb7e423952bdc927e0a1622efec4113fa88988686b48134eb67ddebcb7c3ef4 +ac04b154ccd307ca20428091585e00121b61bae37b22d5d2a1565bc1134be3c81ccf3715fffebe90744164e5091b3d9a +90745c04278c3a47ceea491d9dc70a21a99d52648149b1ab623b5396b7d968fd3c4d1a2d08fc5638e8790463e0cf934e +80bf26ca7301e370f101cc69e7921e187cf5315b484fc80a872dec28bb65886569611a939958f4a3d2d3da4350011298 +87cbf4d6f0c06cc5f24e0f173a5f2f9bf2083a619dcce69a8347c1a6cd1d03325544610f2984eb87a13241e6ab9a22b7 +8909368817a515789ff4d19ed26afafa5729a24b303a368ea945a9287bc9facec9e1c8af19cbec8dab4acbb6a6ddf6c7 +ad8d2f82b08e0990dfd6b09fd54db3a30fd70aad218275550f173fd862347e1258a4716ca2bf4c40e4963850b2277eab +a9467ceacf9337cae4f2c7eeb3e03752ac7d77692b07d5e5d75c438fbe7dc2029ff84f7759372a0ddfa953b4ec7e9e38 +a5feb7669e84b977cb1a50ff3a39c28f7ad1ecc33a893fdf1ddae7a0d8a4c5f6fbaff25cc56631b708af038a961f3b55 +8f2e1fa07963ba18db890b44c3b9ae7f8992b702a5148679df69e4d9d4b1c082b2bd2ae53f96a4fe24b54f3dc1588f17 +896778f35cbecb43f001277c306e38a9c637275101f1a09546f87378b10ccc025644bc650b3b6c36e4fd0c09fbb3df35 +91dc702778176a4d089dc65502d703752dd9a766f125ffef26bdc38fe4abcae07cdea14102c3448d10f8dd6c852ee720 +a5df3004cec6b68b937cadded0dd2f48bd3203a903a3e1c22498c1193f4567659ecaaf3deb7ed7cf43796da9188f5dc6 +b18b4c8ffcb8599c24d9851abf8ee43047cbd4c9074c9cfbf88376a170da4554978988f550afde8a45306ca32713c204 +8370bc38c84da04d236e3c5a6c063e1db6613dcc4b47239d23efdcb0cf86846955b60da3e50f17b17cd3f7e0c29302d9 +ab7d6bb6be10aa52ef43abbe90945e78e488561afb959dc2fe768f8fd660d267c7203a2b7bdfa1b44cd07898f4849e06 +965c96047d82d76ec2cfe5035fd58d483cd2cb7f65c728ab3049562c5d1943096d6a5014c05babc697d79c07907cf284 +9614f7006aef6f0478ebd37fbf17276fe48db877394590e348c724059f07c3d1da80d357120d3063cd2b2bc56c58d9d6 +819c7b2a1a4bb4915b434b40a4e86dd7863ea85177b47a759bc8ecd8017f78d643982e8a091ee9a9e582f2b0208725a5 +8e159a185b5790a3ed444b6daab45f430f72f4ac4026750cbd5c7cd7947b5e00f2b10eaaf5aadf8d23054c5b29245546 +b48cb6f6c0aaea04833e10d735b67607846158b6663da380ef01c5bca3c9d537611716867dc2259883e5bc9daed57473 +8b48ce8b5ab76b7d662c29d0f874f5eec178baf3f14221bffd5d20e952f54f3ed053182a486da1d1f400e0acef58f673 +b6fd3cba177bfbcb5e7ebb1e3c1967cad5848c09c615ba2a6c277908f8b1f4f1ac5f184c33f2a401e8bdafcaed48bb88 +abd8f44c4a447de8fde1c119f4fd43c75b4cc99de9c817a019d219d4b2ad2a73b60606c27e36e9856a86bf03e7fc861f +af9f7e8b3e9e8599c7e355433c503a05171900a5754200520fd2afed072305be0e4aebb9764525d2c37a5a7eede72025 +a0960a58bd2681804edd7684793e3cbb0e20d1d4bd8721b192baf9aee97266be14c4ee8b3a3715845dca157ba2fb2c1d +949a37213209adfbfa4e67c7bad591c128352efd9b881c1202cf526bf4f657140ef213acf0efeb827a0c51a1f18809c4 +9192fae84a2a256f69a5e4a968d673bebf14ea9a2c3953f69fe0416f7b0fafa5166f3e4588d281f00d6deac1b6ec08bc +b1a249662f34a88d2798eae20c096268d19f1769d94879b8f1aa40a37b3764349b8e6ab970558436a88a5aa5c37e150d +aea87086dcd6de0b92886b3da0813ff271a7107ab1a3cb7021b85172c1e816a84dbb1a8fdb47e8a8eb5e6fcddd5b919a +a586b5078b3f113eec9f074430bcf9aabe4e82752e5b421c6e31d1c2a911512e34154bf8143b5197e820c5af42aa8ac7 +a6eda122e400a6600f025daa383685a10f72f62317a621698bd0106b331077b05ac1afc68ece7a2e285c54a366921a3c +8875e9ba654ad7b1d57ede84e2b702600416d40f7475fe2df25dd1b95c0178a227ee187547898e5b9d1ce8ce9ebd15c9 +af2cb289f8c75f4ddae9e3ef9c1977fe4d4d513e411777b03b996f5baa372eb995b5ca96255fad9ace776168806ecc42 +8d24c465d26bd93290f45ef035bb6dde4530d9d7d051baf583b1f8b98e9886de262c88b5709084710cffa7c767b4c27d +8cf35b1b28a7726645971805170392d522f5e7e6cb94157fe9c122a987051c1c90abe3c5bdb957ef97b1c45dd9bba05c +93e2bbd82a3cb872cea663f9248b21d4541d981f3f8d5af80a43920db5194857f69e2884753f6ed03b6d748dbfb33620 +8b774b97657db654ebdafce3654d645f849203452e876e49dad7af562491cb6531bd056f51cb5b2e8f0a99e69bd8566b +b5333c49d3e1c4c52f70f3a52f0ad77165bed6ad9dcbfaf1364e7a8a0f24570e85a218e4c2193f63d58a7dd975ceb7a5 +b4a34c443e4fdaab8e69fcda1fce5e72eaa50cf968f5d3d19084d049c5e005d63ab6e1d63dee038317da36f50ffb6b74 +824a224009c6848b92d6e1c96e77cb913fee098aaac810e2c39a0e64d5adb058e626d6a99be58593d921198edd48b19c +a86f1fdd2e1ba11ebda82411b75536fc0c7d2cdb99424e0896d7db6cae0743ee9349ffa5bff8a8995e011337fa735a9d +b406b5b89b8bed7221628b0b24eb23b91f548e9079a3abd18be2ed49baf38536a2c1ec61ab1ddc17928f14b006623e7b +8a7ea88d1f7420e2aaf06ee90efa4af798e2ec7cd297aacd44141471ed500107fdd93bd43b6de540314ef576646a7535 +a7a8c071e68bbae9aca110394cf56daad89404dff3e91ea3440670cd3d0423b67905e32b1ba7218fd4f24d2f8bd86ce7 +b959830f152e4d31c357be1ded5782aed5d6970e823cf8809434cf4fddd364963bc7cfda15c8f6b53eda16ab20ca3451 +b59232c8396c418238807ce07e0d248ad2045289e032678b811cc52730f99b480eb76f6adf985e6d5e38331d4bb2b9d5 +a14092fddecc1df18847ab659f6cf7c8603769a4e96fbe386d8303b225cebbbe8f61d6ab3dca08e3ed027e7e39f2641f +941cb0632acd395439f615c6b4b7da9ed5abf39700a8f6e6f3d3b87a58a1a7dbb2478a6c9ff1990637ada7f7d883f103 +951b8805ecb46c68101078847737e579206f2029e24b071bae6013e9dde8efa22bce28aa72c71708caf4e37f9789a803 +b2cbf22e53f6535fa950dd8de4aa6a85e72784dd1b800c7f31ec5030709d93595768748785ff2dd196fbedf3b53cd9d7 +8d84ea3a7eafb014b6bd6d57b02cab5ac3533aa7be4b86d2c5d53ce2d281304409071100d508ed276f09df81db9080ea +a2204b60836cba8bf29acd33709e6424226ae4d789ef6b280df8a62e30d940bc9f958ff44b5590d12fa99fcde2a4a7a9 +86692c58214f326c70eb2aaf2d8b26eae66fb624f143a3c144fd00f0249e30e0c832733a7822fac05c8fe74293768ace +b1cb3d64eb5b9ca0e01211128f990506fba602cd1417da02237205aa42879ae2a6457386da5f06434bcb757f745f701d +b3eb4290a53d5ff9b4596e4854516f05283f2c9f616ec928a0934b81c61afc351835f7eca66704a18a8b6695571adb30 +b0bfb1d44b039d067d7e0e2621e7c4444a648bce4231a6245179a58cd99758ec8c9e3f261d0adb22f9f1551fceb13e4a +a29320f71a9e23115672ea2b611764fe60df0374e0d3ff83237d78032e69c591a4bdec514e8b34f4b3aeb98181153081 +8a6abe9c8a048002b2ff34154a02c2f13fc6dbae928da47c77f3e5b553ea93d8f763821a6ead3c6069677870fdff7ff3 +b73ab66a62f427e1a5e315239a2e823e2a43550d245cff243c2799eb2e4701fabb7d5f9ce74a601b5ee65f6555dacf64 +b64858e98b9c10de8c9264b841b87e7396ba1da52f0f25029339ca1d13f7f9d97f4de008cfe12a1e27b0a6b0f2c9e1ab +807d2440d1f79a03f7163f5669021f3518094881f190cb02922eb4e9b17312da5e729316fe7ba9bfffc21ed247b033cb +a7f06458d47ebe932c2af053823433a8a06061c48f44314fad8c34846261c8c3f7f63d585a7930937327ad7d7ca31a6f +82ac2215eba9352b37eb8980f03374f5e0a2f439c0508daa7a32cdce398dde2a600e65a36795a4f5cc95bbcf49b01936 +a1882c83a2f946d54d74a008eac4aed70664db969e6799b142e0d0465e5662ba0d224a1cc33be339438d69bdad446ff6 +8009776f7a34a3c8779e21511fa409b0c5a38e172d1331acc29a16114e002f5f2f001381adb5fb3427a100752d775114 +b24441019af4a0df2dc68e3a736f358da0fd930c288398a18bb5a8d9a1e98ea376395f19d8e03a5f020b83fcb709f1af +ac72b4de3920c4f3c9b8ea90035cd7ed74d34b79e79aab392f057c3e992ebe79050cc1c6ccf87120e4162b29419147de +973e75577cd2a131a0bd568fd44e43554ac5a9ea3bf10f02d1ad3ac6ce9dc7a8a7ea93aacf3325f7d252d094a0de1376 +98a114de2a86f62c86862de37c328bf6a7fccff4d45a124addbe0eb64debe365409fcb72ce763f2a75030e1ff4060c64 +aff753e1dd4707f1a359eaec06ebef1903242889a2cb705d59dd78a79eb5b894731f5a91547479506145ca5768877dec +b856e4234858b5aa515de843e8bd4141c15a4cc02c51640e98a8aaa1e40344f1ff8ef7c3b913ea2ae7411713daa558d2 +863525eb2f8147a6d1d0d4304881795bfed348913cd7f38d815d929a426788b69e41f022dba5fdcaf56c85720e37fefe +a14ad76b145a6de2e0f8d4f615288c1512701a7b3010eb8a95941a2171bc23561e9c643764a08c4599040a3b4f5e936a +a18bfc66f6139dcb0485a193104fec2e7d52043837a4c0cadb95743e229712a05cf9ce4ccb482f36ff1ce021e04b574a +991c8e6678077d6e5f5733267c1819d8f7594e3b2c468b86a5c6346495a50701b1b05967e9590c15cef2f72bc10a38f9 +a034e7f9b547b047c99b99a0dd45509b0ac520d09130519174611de5bcdb9998259e1543470b74dcd112d0305c058bad +95ffe0d02317b5c6d5bfddbcec7f3fdfb257b26ad1783bb5634d983012e2ea1c6b9778009e1b6d10564198562f849ac0 +b3db442aa4adb33577583b2a4ad743f41efe0e1f87bfc66091d1d975333ffc00b4afc43057bcb88a7d68b0c9695d38dd +ad2e97d10d7c53d231619e3f2e8155a27ea4f2fb3c0cecf5c7f14f4cfcdd21f62ea46d843b21df748b2892131633fed2 +905d7aad6d3b56bad48694b6b20b27e370ebca8b91d0821e48e2f9cad39910c26cc11c77c266894db3d470485a63ed11 +99bfadefca796ce6af04ede65ba5ef5bf683ff7e2852bb9c406fda77b95ef382289853dfe4d933525071e4cab8ce3936 +94d9905ed4ef92107d0adb9ea38f085a2a24b8f792108bec702d747c215b1f14aafd486ea0c07ed42602b12d8f602b93 +a78dce23ca09dda2d5e7fe923290062546825286d624de35ac5756b6c8ae030e211f4f9c9c8d18a924f5880e3b383d1f +abce9e2128ff51fa17e73d93e63d7134859b2f328eedbcefb337c39e752d6750d9cffe6abfcd359c135dc5a12018827b +a9ea7d91e8a3524acb3182bedd7e1614d37b48f8eb2d8f677eb682d38408b8d512786d8bb65811f4d96788b9378e59b3 +912c9f804fb57dd1928f8274be58b42618f589fc72a7e5b6cb4d4b5d78c547f80737cdd77ebe5d2b71eaf60b8fd2b663 +b7227ec9a62d5538974547f717fdd554ab522d8782667fc3e9962e9c79a21134ef168371bf3b67e28d0964e92cf44028 +89440a781c812a19c758172bf722139598023ed0425374fbb0d91f33be7b7f62a36d7aa34696c4fb0da533bd5dd41532 +b31e4a9792d6e9c625c95aa3c0cd3519410dec07940afab820ef9f63017415d237a47f957d0b591b6de399ffc2a8a893 +a66ec47393df2693be161daaa88be0cf07b430c709ca97246d10a6080ae79db55c9e206b69a61f52512b868ba543e96b +90ca425dee74cc6a7e8eb1755cf9b7b76ba2a36ab851333b0fb7b35e8e6e189702456f2781ad87b4215993d62230ff4f +88b64741f93a2ae5d7b90b22a5e83c9d56bcee5c6bfcedb86f212acc776cc3ebd0b62cc025f596cd8db4f4b6a7aeebab +a1b6c7d2358bb201b42264f8fbebaa242ef105450bab21b4a2f16f368048c16ad1f3695841787eb33a0192f1f6b595eb +8a932f1cd227ceb18389791ed9ea1ff26571715ed1ab56601a994795713a8f7f031d1e8472ec3eb665b7bfbbca8ca623 +8bb2e34a2bf77f9f657dfc51ff296a6279a4d7d15860924f72b184fb7d5680320c7769954b9dac73c4bfe9c698e65e58 +af54e7367891c09f2cea44cc7d908d37d058162ec40059d32ded3983a4cabfe5057953878cf23bfad5292dbd0e03c0e1 +8a202532b9205385cf79f0299ddcb3156fd9fab09f9197bce762b5623f75c72ab1d74334ee6f0d289007befe222bf588 +83bd0f5896eaad58cfa7c88fc5ed505cd223f815dcfe93881b7b696cdd08b8b5ede03ea5b98e195c1a99c74ac5394c1b +b4a84d9940e58e3b4f804e4dd506f8c242579cfa19323c6e59047e5a1e35150699a2fab2f4862dba2f0ee4ed1d8970f8 +8c9ec477d057abebc2e2f6df5c4356a4f565bde09f499a131967d803d4bf36940ca2ed9d4a72adbe0a4a8b83fc686176 +8598f43c32623fd5b563d1ec8048ffc36db3d7f9b3a784299811687976f64b60585b2a2707050a3c36523b75d1e26716 +b55eb07014fe5ad3e5c9359259733945799e7429435d9bf5c72b2e0418776e329379433e17206f9f0a892d702a342917 +a5ed942eda7b36a3b0f516fafd43d9133986e4c623b14c0f6405db04e29c2d0f22f1c588150f670dbb501edda6e6dd4b +92b6abb28cefab2e332c41c98bfa53d065b7d262638389603a43f4431e6caf837b986254c71f7cdacf4d6cc4064b0195 +b01806178a28cc00d1561db03721eef6f6539676d93dd1fa76a13b42a31d38797e99b1848de92fd11821a342b04f3f72 +a2f10303437acfbb5912e186bbff1c15b27ed194c02cbc1c5b482b0b732c41fa809136e8e314e26b5bfe57690fe3b250 +9990207fcc711102e7e941b3ac105547a3e7301390e84f03086c99c6d3e14efff3a2e2b06e26227f496d88d5cdaa3af1 +b903cdb0c2fd578612398c30fe76d435cd1c2bab755478761244abb1e18ba8506fd9c95b326422affbcaf237309959d7 +99e0c12cae23f244f551d649302aac29bfdeb2c7b95578c591f512ad7ac562bd47e7c7317ac9bac52c9ea246617bdb48 +b996d267ab5149c1c06168ee41e403be83f99c385be118928d6e2c042a782de0659d4d837f0c58b26df0ce22049a5836 +989001b8414743765282f7e9517e4b8983a929341b8971d7dd8a87d246f6c8ba5e550c983566ddd932c22948f4fa5402 +a0b006a2c9124375364b8fc5ddb543a7468fa6d321ea046d0fd2bfdaef79e5e3600b3d56190733491ca499add1298c7f +80881d6f3ee507089b7dfb847fc53dd443d4384ef6fce878d07d9b4a1171eefea98242580e8a6a69664699f31e675cfb +adc48ef53d88b9d70409ed89cc3be592c4bd5eb65d9b1b28f2167dc4b12406889c00f2465c554f3aff673debc2997ccf +a62f5d9f167b9f4a4aab40d9cd8c8a48c519f64a1985823e20e233191b037c02e511b0280487112a9f8b1f1503b02db7 +b89aa2d4fb345a1d21133b0bd87f2326eb3285bd4da78b62174bf43d30a36340e4217dbe233afb925ab59e74c90fccf0 +932ba22acdd2f9d9494da90958bf39d8793af22417647d2082d2c3e6a5e17a2d14b0c096139fa8fa3f03967ca2f84963 +b67b107e71d96de1488b4154da83919d990502601c719e89feabe779049ddf7e4fb7e146eb05e754b70bbead4449efb1 +84509de1b8dc35aa2966d8a48501f725d59b4c65f3abf314b2009b9a573365ae3163c1f276708c66af17de180aae0868 +849153fe837a33fcb32c5fa6722c2db9753e984867c112a364eb880d87467782142d1c53a74b41df1dec7e900c877e1f +903d05c73ae043b69b18e980a058ce2254d008647a8d951175b9c47984164b34fc857108dcc29ad9df0806d7e90405f4 +a6b05917ac32c0b0eeea18f1ef3af5343778c543592078fdf6a1b47165013e2676bfe6a592a24efab9d49c4bd92b8fc0 +8648482f6947a5a8d892a39f098160aae1a648cb93e7724ea9e91b0d1a4f4150b91481f6e67d3bf29ff9d65ba4fa61a8 +a6ecaabc38895013297ae020686f04ea739c4512d2e3d6f2d9caf3f54000fb031f202e804ee615eb3357714a18657bcf +912f5935acc2dd20d5ef42b2ad5b307c925324a84a3c78ff66bc5885751934bd92f244e9636b60a744d750a2a7621198 +a0d6f261a776c5b114298f5de08d6e3372649b562051ea2470d3edfc376048793e18fc57ec84809b463dc72496d94329 +940744cd3118d1598c248b38503f6f1fbdbe7a147e683e5b3635140aa91679f8d6c1472600f8e9c36117a60203be6b4e +ab81737c839fe340f6f1fb7275811cb0c0d5fe8bbc265f6a56c6c68d0291bc7234eaa581ff26f8929d9a5bed4aac7002 +8df47341160f1c728c3e31be17a32e42b54faaa1286ef2c7946882ca4dd46443b8428f3654616c6e4053f1cda2e11994 +a721067e75c3c791f4d9f58d4810ac9621606e29c6badb593d6bb78c39968b45be1777ddb9bf03696d4d4be95b2dc1bf +a4e399213d3c4350c2d0cbe30757ba7e1f9680f58e214ff65433b36232323744c866a87d717851ba1dbd6769599f69a6 +b0be851d1e43dee27abe68f85e2330d94521b5f1c1a356ad83fcd09162c0ca9c2e88bccbcc5bacfa59661764361867a3 +86111bdd3dbfca232aa5802a6db41d639502e43a2e24cb06bb5d05c7f9b5ccac334d16b61d1c5eaac4fa0cab91113b46 +a4f805b11c174c34250748b9beebfb7c8c243198fb13463911906ee4effe7d331258a077e374b639a0c5cdcdff166b7f +87e4cf2c6f46d2dbac726a121127502921decf0195d7165e7bbeec6f976adb2d1c375eaa57f419895a2c70193215dc4c +8ff06de2c1c4d0744483bb4f7c5c80bf9c97b4df23e86c0bb17f1498ea70e0ee3af20827da5e8cb9d7f279dc50d7bd85 +ab112c0116471b4dc3fd1e6d918f99158eb7a08153e891ddbba2fe5bf0eeb188209e3019176e758231c3df937438136c +a67f89194e99e028a5da57747268e5ef66fefb881144043429920d222d37aaf268ebf73ca1da659fcdac3b4e7a65092a +b4da1dcc791566140d6abeaa2923cb6b21a6e6aaa30bb4cc70011e931eefa71f96b7e05358c0654bad7ce45191ab9fa8 +8283933231bca359db588c80e043ad6ea765fb0cba5ef233c5d514ba01ddd1b409efbadb368f26763402e4576dc4655f +97f568ce3edacd06f3e31a15462f5f9818a8c3fdbcf92b1ac5840b0b6e73166a154013dd52e85a18e8ead3fc9e54aca0 +a9cd1601c41e5ab2018f986443914fb703ddb6b06a36c06fb58065f2fee8e1751071ef924ea3ad76f0c19baccb1b5f8b +92aad71bb7e929cc35a48020d16a5822f4f106a7f59985005a5ae5ba8e8016ec33727610393498f56b4f353b3d5161b8 +89427780aa4e7ac894c681fbe2889153b94db883f17f109bc9caa93f0c259dda42aab502bbefaf572c56f70abbc42db8 +aa8cf76ff847dfe59534432ed8520bb48bf412c28497747dce04d2b2a54ba843c3be1564630cb49ec0217167847ba590 +a1570a6748a2303e74a31c2131d05ab372ec006ee92ef74c42f2e9a250663bebdfb3777e7ad91f50c954889a59c2d434 +a4c2b1bbc48199c31ea8d8196729eab00ce0200350d4aa9f23347a3289355e5828cb2f93036a14d2d9ec575fb3835239 +84819d0bedbaab5bf8afdf23f59a7ec5f50da3063cfdd1ef5fc4ca4c1fe68980b5c80e30a49f38e5816765e81dfc5a57 +a57cfb5e877b88202f589be777605deafbfc85ed1357af03a18709cfb4b668a271199899243cd3750f1cb77ebc40bba7 +8d95934bbb0efaf3339f27cb96de46e4486aa58a2c40dbc77c1c3ac7c27a228062824b9045c046631b2e286e8549603a +b99a8356abeee69f40cb3bd8c87e8039a1e076897dde430bfbf989dc495c48609a7122bc6c1d1c32ccac687b47d5558a +aac2edcf2fe5d3f1a84e8f1f27ece920eabe7793bf0ed5290cda380752e55d57a55a362c5253bebb71e4a55f2c437ff6 +af7c76876072c3b0091e22b9c5b27ce99bf1f0079ea1a7816ad9c06e9e5fc407595c7f4f9953e67d86fb2da656443dc3 +9175b64d104f78d3310c9c02f82e04c8e9878d2044ea5ee9c799846a3d23afa5fa2aa4af7350956136c69a0eed03cb2e +b3328e953317494a3d976e7f7c3d264258a5d4b2c88e12d06786a9e7b2affd41086762ef6124c6a6e5b6b028db933c14 +a49d166065e19d39299ee870229e4a04be81acd6af3a2201f3a291a025dd5f8bc3e676ee123cd4b9d8455f6a330b395b +85fa15bc8947ba03681d87b50bd2f8238b1c07849a7ed4e065053fad46aac9dd428186a6dd69dc61b5eba6ffec470831 +b6fcb2f694a47d3879b374b8b2967dcd59bd82a5d67ae6289a7326c18791b1b374e12571e8c8ea16a4bfc5525ced3ec4 +b6115f52566aa90ccac2aab6d2dbf46eca296d047db1eb29a1b8a2bc2eef7a24e90407f8dae528806aceb2a1e684d49e +9707e66220233f6a48a93e8dec7b253d19075eaa79238e519b82ce1ac5562cca184f8a1c14f708a96c34ad234673d646 +a0822903fb3825eae07ee9d3482277c0b8fc811856dfe4a51cf24b373f603924166fc5485185f99c4547cd6476b62270 +88dac6366c439daaeee2532b2ddbe206132cf6e12befbb8e99870ac684e04e62de150cba0e22e395a0b858948f40808b +a72dfba9caad3179f43fead0f75e33ba5342470d8c9cb7c86d30d2c7ce7244a8aafd1d558b0ec8e2a9436de2c2e95ccc +8d696046defcc32cc19954c559213100f0ba273ea12abb55ca7c42818071d853846bd4213af2c41ecd4442f6b4b511b1 +89d6f2d52cf65414da15a2fb1911c53afbfb50bb5f2638844abfc325ff2651cd9130be4beff05dc4046adfc44394a182 +afb91abd7c2a9cfe62855ede3c6960ad037fe8778364a2746ff7c214c55f84e19a474a9a0062b52a380d3170456ee9c6 +87f724a16ec8fdae8c05788fa3f823ecc3613df46581a63fc79b58f7c0dc2519b6b23e3dd441a0ca6946dfe4bc6cd0ce +86760f90f6bedfba404b234e90fbf981d26c29b87f2fa272c09540afa0f22e6682d08c21627b8a153c0feb27150458e2 +ad4d0342f255a232252450ce4209507ba619abfd1ffcb9c5707cfa45f89be41d88f1837acea993a1c47211b110250b4d +ace54b5889bccdf1d46c4ca21ed97cca57f7d12648381411d1b64afdfc64532a12d49655776ea24cf5eabe34145705ad +936dac693d0c1b1e5de1701f0bc46aef6e439e84bc368a23c0abe942eb539a2950e8929265786fcdb18d40a44bda14b9 +94fafbc544decec1d489b9ad6b23410b9de4779f9f44aabd093d7fab08340a4646a8cba31633e49c04d2690b8369a1d7 +98157e757f1a677c5d9d65c47759727a4dbc49fec2da4d9889c4ea90573fb42e2a8d72eaef92b782ac6f320970f09363 +8eaa0498c191c810c7e1ca7398f7c80dd0a7e7d7829ed07039490f60e7c2ae108843c06fe38fa36d45d63da46cba887c +a0ae116e5b0d2dccf83f056ad876037225687904e0290fe513fdc6b2dbe4cbf5fac1d828352e64734895895840b3c57c +b592b318dbbd7ec4872aae5e64bdf2305db2e5e8cfe0ad77b691f542ba5e066dd20b09b0b08ff0d798bd79ad946ddf7f +879e50c8c3e7f414ad2b38632bc482b71759cd561aeb2215550186ebb4559e4cf744cdf980512d8321954b3458d21e11 +aed5c6c7ce0407d7b2c04785fcb9deadb9b9413e37cef5b1d918f474cccc7de012fe1fa6f5fa93cb7ef9ac974d9fbc20 +892274a9f0afc68fa74be276c2a16de5cec674193f96b27a80bbb9f3add163f85716b531f3c920b98577a0225f84e8ca +938fb7a53266b997a7669596577af82f5289b160b7fcf06d76eee2a094696f6f12b28c2c65b833a52529a116c42e6c7e +892083929b6067f5045b1208f3dc8f0ee25bd0533a8831f5c23bb4ff46a82d48f0a34523359df5061d84a86b718d5060 +99159ae9574df6c16273eda66b6d8b79a327940e335b28c75d647f4744a009f4b5f0f385e2017bd3e7fbf59e629cd215 +a03e5757ef7738eba32d396923ff7ef82db2c15bb6adc8770fcb37260b7bda3be62473bc352a9a2ef7ec8ebe0d7688bc +ae3c24a85c9b1fa55158b2acd56d2016f70dca45a23f3ef7e0c6b096f4a7c54c14020d61bec7c7f87be4a595bf254209 +a920a6f9cc803fe31352fca39c13f8ac1e8d494fcf11b206092227c2af38469b1fbc068b8fe014800b70f137107aafc4 +b893853be57519ffa6410da605e7d3a746ebadec4788c7907f6e0dde9f20f5a6a01181148b874b3decf9b4814846a11a +b46f43918c5195729f6532439f815d1eb519e91005bc641a4a30ae88700982bf4ed07a342e77945780317c297c903755 +8e431bf4497d0ef6538c93c4bdda520179301a0104eebcfd104efa1edea876818d7d31079656f01a5ff76c4f5fcd71df +92e3dbcb580dfb9cc998f878052b0c3be1c5119e5249ae9bad3538ebb0f0c4ab5a959b04033b96d61836ef07784e6b64 +b712d9d63aa888156f4ec83e939c6bad53de18045f115f54fbf4261fb02f10a8a46a8d716ab43d4acbad3b02283c32fc +b2334e776988b4f772446a47c87416b4f19f9b44164a5f828424d3f35ef10baa56afe810d49b0b86b786b9c0227681a6 +a3f25ad18e435ef585fa90e6cef65a8ba327e5e33701979e27e64ef7d8e09e2591e52bff9c5749d35643456d18625685 +adcfa48ae43cac6fa9866b4cce10a243969965942c891d5e6c0e5b03bd4763f9b63779fbf40d26ac674534fe7cc478d7 +a0eb3448e045038740e2ee666e88aa0f8b8e24b1b55d7d4964f01bfc0c581f7e9d4c0e79f8cfbfecfa8b024b216c8ea6 +8110aa1d82f11965af4f4eedb4de09ee9c353481b2d7ee7a2bc2f302d2a5ae6c31ebc6451309ba7c305da41070b0f666 +b074fdad419d42783ebda17f19863aa499eec71fda5aab6cdcc389276b7bf08053795d15890175ca3dc89f6d8d17758c +a14665846d95d7d5f0b5381502080c822776ec0994ccb1ae1ffbb3f19205ce9c7c9bf9c2d2ca098807ce99f29e4f07a0 +b4884842670a333cb5548a842fa2971881e26b442dfab0b91d6bf3b4cbdf99adbbc9d14fe2bb46872cfcabedae85db30 +94549b01cb47ba16c0cf6f7522c833545397de0b3388c25d03e60132eddada6401682f9ffd8c50d1a61b4d2dde37461f +a790c9b4cec96e4c54777f3e03cea5769b20382cdcaf1de494bac2b9425eaf453eff643c62ab284cc1af33bbd36013be +b1b45fd298ed11609aa1ae6c5ac655e365bb451de1b9fc92aad40422ba85c6a454f33b8142acabe55171328c13d92edf +a74cea9e7096e38327064f058a3cdaa34e6eafaa9c7d58f753c40be67998152380fbd612b9dc0751bda7befcdffcc749 +b18978dfc5efb07b7ef992c7b0cf5d1b4ca551578b1dd13057b7aced8b1deb9f2036e1e3116248a803e922659d206545 +8153c07603cdff6622835a9853b795274390abf7197d7a192193bec44acb43e8cd50b56c11a03f4a2a27124c36974f3d +86b987f30bb9a37cc91d22dffffcd346ec5773e846a6c2b8f9e03b25ffcae859c470c901c4e29695d325dfe4eee927bd +af5e980b9507d10d5269c1a5d02bc16f4f009b663e413ea6a7c655250f3a21c608c12f4002269a05d3779907e7be7d69 +a6f737fab2af9f27bfb8ca87f5fdab6ad51e73ccf074e90576db57b309dfa0a95f9624526dfa4feaef39c388802f2ae9 +b7ed51f699f615f58a7ff4f99d52c4ce7a8d662843c1f4d91f1620fa119b80a0f6848f9fb6c4b9822dc019830e7dfd11 +b71f27f291aa6ef0723ed79c13a1c7a1c40198ffb780a129d9d20e250406bc91f459705b2b6674c9bb412a7b5dd9ff07 +9698cf8f638c3d2916fefa5f28c6050784479f84c2ee76a8aeda7e562630a6ae135b445ec4e29af8588ca5ad94a67f49 +9270aa5030966a9990d8bc71b00b9a7a1d7c1ad8f4c7f78a31b3d7f86467332f21407c74a89ba4f574d723acaf0d2042 +b1b82faceed8e2297cd49cc355471d15ff8dc2ccc78f6944c8f7a75d3ad1629a2e2f1d0a2ff7fa2b3c38cd19839aa5e9 +8a8c4ed49dc9bd961773edf8d41d04385b11bbd3577024639a39319cc7068380236bf73fce0b83e6535bd3f95cef0e65 +8d04ec1e7d148b7e66910ab45a0e6bf409612a3b560bfa784e26f2963152821c646a655cf17a0ce3d4ba4c4ebeeb4a1e +8e9d707f6186d93accb60813715ed1f6b3001ff6d2f87daf8b906bd0b988c1833b2ccd80dee9bdefb45901e81bb82971 +9762317ca6a5e6fe0b2991e0fa54b5fbf419dd0550d70074957d65cd7ebf79ceba607dd40d709ed635c822b3b4da2cac +82b53cd9a1eca2f5d3256723dc4b6531ca422bd87bab36243c727d1952db58d7288ab11467305d875d172ce165b1e4a5 +b4dbeafa05c87029ae257bee1ed7603645fab41f6ba7ac8b57ced5b4774a72ba3e671c2433a93acc3c498795b5cccc42 +a916d3ab7f0e7cef294e11c97c910a19c338ad8e615406e6d1c8995b4a19c3b2527100cc6b97a950ec5a4f3f6db7d01a +b9a785c7123609bdc96f8dd74500c6c77831d9d246f73244de964910b4045ce3242c881271bb1a4bc207d67de7b62e97 +b5f94084f695d0821c472e59c0b761e625b537c8ae3a09f11d9a57259e148cfadba1e43bf22c681b6b32390121cec208 +8f91b36d8570f19a90cf3ed6d5bb25f49a3315ddb566280c091fe2795c4e25ed2c6a1ef8d2669b83f2d7bb78fc8c40f5 +80f27359a73ed8fdd52762f0c7b9f676be2398b1f33c67877261480bf375f975f626c2ca3e7a9f59634db176ed672c98 +b96b91e3d5148ca793edefe4ca776b949c9305acb6f3a3cf87767a684014d2c8f2937c2c672eef8510f17d2da5d51385 +99c4e1ca2cabd4388ea2437dbdf809013d19be9bd09ff6088c8c0cfdb9ecf8fd514391a07b4288dd362434638b8834d9 +b6fdfb812e145f74853892c14f77c29b0c877d8b00055fd084b81360425b3660cd42236ecc853eadb25253e1cd8445c4 +a714af044ef500104576898b9409a9a326ef4286a45c3dae440bd9003fdf689c5f498f24a6f6d18502ce705c60a1cf14 +a9444e201be4a4d8c72119b3d3b13098afee6e5d13c5448fa2e9845cc9188239778f29b208749c960571dfa02b484f05 +91c826a6b8425f93ff395d9fdfa60dbfa655534c36c40a295906578540b9a0e6b94fd8d025b8b8611433022fbbc4fb0b +a355d76bc3cc48ba07026197130f25a593ec730d2ef0d5d2642bfcad745ecbe5c391324bc2485944060ff3100c952557 +b5f9b5a289a6f9a7252cc1f381c892bdb6836a5998f323ee21ae387936148ad1ad7cc6eca37ecece36404b958ae01e8e +a3c7ae04a6208851f6cc40ff270047283b95218905396c5dedc490e405061cbefd1251ecf77837d08c5ec1c77d2776ce +aa02ee387dd2cc7a23cf5cd582da0bc84bb33a7158d76545cbd6e06b26a6f30565dc712d7a8594c29f0529a892138802 +8aff025c841f167fadaf77a68284c355ace41d6df3a9f1e41a6e91454b336f0b69ea34cce495839b642a7c43997a8fd9 +82eccf0b6b4b6460f676d677266451d50f775446df313fc89bdf4c96e082340f6811939d215a54ba0fe30c69b3e43e25 +af324d871b038ff45a04366817c31d2c1e810359776fb57ac44907c6157004e3705476574e676b405d48a48bfb596f59 +9411dcca93ef5620ce375f379fea5c1017a2dd299e288e77b1ab126273631a299d7436f3bf3c860bf795e5faaaefa804 +934fca809e66f582c690c3778ea49de2e7940c0aeb8d7edad68f2edccdfda853d2c4844abd366fbc2215348935e4b2e2 +a1b1fa4c088418f2609d4dea0656b02a8ee664db25f40d53d8f4b1be89a55e5abecbf2c44c0499874abeb3d3a80acf71 +ae6ed7a0ba6280c679b0bf86111afad76fc5d930e9fb199df08134ba807f781d7e0b8b9b2c8c03b02d8cc20dbe949a28 +937d200a72fe4ab8d52f6cb849e322bc5959632b85a93c89744b33e832e8dcf1dddd6ffac0c049b03c105afb8930f7f5 +b4b4a46ebe0c5db16004933c08ad039d365db600a13d68be5346b1c840cce154f56c858874e866de8c3711e755c6e5dd +afcbcb7170c8caa2b77d2b3388dc2f640aeb9eff55798aeceb6eb6494438be05a2ae82f7034b2d439a45ad31d8c64b07 +a2c676273081b8761f58e0b11306ddb6a4cde3d90e7c47b434468700c5b749932819b01efd7637ca820e10fc28dfb427 +b445715162d834c9ee75ac2ff8932ace91c8242d67926b2a650217e4765e0531c2393c9438a52852d63dbbe2cceaafc5 +a0c0ebdc1480fb238a25fbfc77fae0db6e5e74b91809f0ff20a819e56b8c3141549615d1bd7b99829898f6028e8c86be +b3d11933e9d1db8ca617934261ed26c6f5ca06ba16369e7541482bf99c4f86520d43fbb10f4effb2fdf3cc70a189fdb5 +888ac610f8fd87a36b5646e1016eaf6dbca04aa0cc43f53a1046d74a658c4d2794606e79fb07fae57cf9d71ed339f4b6 +979818dab00c58435dc0d0d21185943f95819d2a13531abd2d798e1773c4bbd90047f4eebe117868743db75604a50227 +a6fbcd2656e475065fe44e995e8e2b5309b286b787a7597117e7acc3bb159e591a3e7304ef26f567b5720799d8ae1836 +a03f0ac08d2101ec4d99ca1443eea0efa767a65448a8ecd73a7818a99e863a04392bec8c5b8e5192834e8f98d4683f13 +b3c4ea8c6c3ee8aab2873d446ad702000b0e927e0991c9e30d83c6fe62a604efdc3ac92453313ff0d5e0ac6952922366 +ab25c857f26830631113d50145e961441b5e35d47b9e57f92466654dffebde43e4f78b0867d20929f97c2888c2f06509 +98950aa5a70ef41f274775f021a284d4d801a2efe2dea38460db8a3a8c08c243836d176e69127c2cd17497b0ca393e9e +a9698113febfb6d87fcb84bad82ce52d85a279d3a2933bdd179d53cfe8d6c6c68770e549a1e2947e7528a0e82c95d582 +832b504513266259db78478bd1b5a3b0f3bf2c6d25f1013e64bf0cfae9dc23da8ecd25f7f1047d2efb90e5f1d9b4b3cc +b588bba7bcc0d268ab260d5c1db2122cee7fd01583c7cc27a8ae6b48b29f34c6ea8a6acbb71b9b09c6156ec0a0766142 +a73d2223c7afadc381951a2e9e7bcb7b5c232369f27108c9f3c2ced2dc173e0f49531d0ca527eb142fbb70285307433f +9152cd6b97bd3278465348dde2095892f46342aed0e3d48675848c05b9aee6ef5ad7fe26e0dcd4ab176532289d40eedd +a7812a95a43b020721f688dd726356dda8ebe4de79b4f0fdef78615795e29681bff7c6ff710ff5b2d6ae3fd81bdb8507 +83724c16049e9eaae3269ea8e65caa212f0592e0190b47159bb3346208ccb9af3cfe8f6c3176fa566377da1046044ab8 +877634ec37c7dcd3b83705b103c31013697012795f11e8abf88d54bc84f2c060f665f0c3b14ef8087d3c6a8a7982d64f +b3e53aaacef7a20327bdbba8cd84513534d2e12fd5e1dcf2849f43146e098143b539ebd555623d0ecc46f5ebb4051fca +952d58ecafca9b7ffc25768ee4f05ce138f0289d72978eb5e5d3b23a0daedcb17478890afdce42e30d924d680e13c561 +a10dcc725f9a261de53dd3133858c126f6aa684cf26d92bce63a70e0ff5fff9610ad00d2b87e598b0a7548cfd1ffe713 +b7bc5d0c6b665d5e6f4d0af1c539d8a636550a327e50a0915c898ac494c42b3100e5fae0074c282d1c5073bf4a5456fb +8adc330d3b49ddf3ed210166afc944491aaedb28cb4e67472aeb496f66ce59184c842aa583bfb1a26d67d03b85065134 +b2df992a1310936394a1ebca94a7885b4c0a785638f92a7b567cfb4e68504ac5966a9e2b14891d0aa67d035a99e6583a +96f5da525d140739d19cebb706e2e1e0211edea1f518e040d361d5aca4c80f15be797f58cb4cd3908e4c360c18821243 +b2c0d9173a3d4867c8842e9b58feb1fb47f139f25d1e2332d6b70a85a58811ef99324bf8e52e144e839a4fe2d484e37b +ad95a7631ddb4846d9343d16533493524dfd22e8cbfc280a202343fccee86ab14446f6e7dad9bad9b4185c43fd5f862e +97f38ab82a51a7a792d459a90e7ea71c5a2f02d58e7d542eb3776d82413932737d9431bd6b74ec2a6a8b980d22d55887 +ad4e4c57ec3def5350c37659e8c15bd76d4c13d6de5453493123198dda2c2f40df349f20190e84d740a6b05e0b8f3deb +a691bc10810d11172a6662e46b6bbc48c351df32f325b319553377f525af44a50aaa02790c915b3a49824aa43f17fff0 +a80ccac79bb4014ee366dbf6e380beb61552bd30ef649d4ec39ab307e4139b7775e776fab30831517674ff3d673566f6 +b11e010b855d80e171705ab9e94364c45998e69d9120e4ca4127049b7a620c2eec1377356e7b877874e767f7c44afef4 +96bfab7777769a1e00ce16ada6667a0d21d709e71bd0371c03002427d138d9172640cdd5c529c710fea74bb9d19270c7 +a5bffd2c30e29633b4ecf637c1e792c0378252e2a99b385a093675940b48de2f262c275332ed4765f4a02467f98e3ddd +8d11929d67a6bd8a835b80660a89496250c766e713bddb2cd7052d67b92c39a38ce49005d38b4877856c4bef30fb9af4 +8e704597a0dba1dbd1ff8c9755ddac3f334eeeb513fd1c6b78366603ebc1778231deb8e18f2889421f0091e2c24d3668 +904fbb3f78a49e391a0544cf1faa96ba9402cba818359582258d00aff5319e3c214156cff8c603fbc53a45ede22443e9 +af12ac61eaa9c636481a46fd91903c8a16e7647534fc6fd9baa58ae2998c38ffbd9f03182062311c8adfef0a338aa075 +87f2e544b2993349ab305ab8c3bf050e7764f47d3f3031e26e084e907523d49e1d46c63d0c97b790394f25868e12b932 +a279a7bef6de9d4e183e2bedaf8c553fadfc623a9af8785fe7577cadced02b86e3dab1e97b492d4680c060ea0126abeb +8ece08667ed826f0a239cea72e11359f7e85d891826292b61d4edbdc672f8342e32c66bec3e6498016b8194168ba0e0d +90a15162586e991b302427bc0307790a957b53ab0e83c8b2216f6e6302bc496cb256f0f054ff2cccdfe042763de00976 +9966c0413b086a983f031a39080efde41a9fedcaf8e92897ce92e0c573b37981f5ea266b39dc4f4fb926a1bce5e95ad7 +9515be2f65a57e6960d71bfb1917d33f3f6d8b06f8f31df30fc76622949770fea90ff20be525ae3294c56bc91efb7654 +86e71c9b4059dc4fd1ce7e28883e4f579a51449cab5899e371118cdb6afe2758b1485961ca637c299896dea7c732151b +8695b4ff746d573f8d150f564e69fe51c0726c5d14aa1d72d944f4195e96165eca7eba8cac583fd19d26718b0ce3eb61 +813eecf402151c99c1a55b4c931716e95810fc4e6d117dfc44abbf5ef8dcdf3f971d90d7fa5e5def393681b9584637e0 +a9caf7219eed1db14b7b8f626f20294a3305ed1f6c22f6a26962772c2fa3e50b5234f6d9ba7fa5c3448824c2a15271b3 +b2b2ee20de9b334f2d82cbe0d2e426ca1f35f76218737d0069af9b727a1bfc12d40cf8b88d4afcbeaadf317b7f7ad418 +b853960749521a17ff45f16ac46813d249c4e26e3c08fd33d31ef1ed2b2e157c9cb18bd2454fb5c62690bdd090a48f60 +88772297d2972471b3db71f3ddbf5945a90154768ca49fa6729a5e2299f1795445fb3d4d969d1620e87dca618fbc8a6c +a2bb783fd13aee993e3efd3a963ebc8a8eacfc8450042f018f2040353de88c71ac784b0898bdff27f606c60a3d5ef2c6 +9210903ac619edca0cb8c288ed6dcc93c472f45182cd6614a8e2390801ddea41d48a4ac04a40e2f0adfd48f91aabe2ea +a621d00f83260c22db9fa28757ea81dabcc78b10eeaaf58b06b401db6cc7a7d9a6831a16f171ead4e8506d0c46a752ca +b25c525bf6761a18bbd156ac141df2595940c7b011ed849dbb8ac3a2cd2da6b63ba4755324d70dc14c959deb29fb9ad3 +a35111d0db3e862e1b06249d289e0fc6b110877d254f2ae1604fb21292c227a8b6d87dd17a7b31166038d6860b1bd249 +90bf057309867d95f27637bd10ef15ceb788f07d38aca7ad7920042293d7c4a1a13d4ca1d6db202864d86d20a93e16cf +a88510e110b268d15dcd163ba1e403e44b656771399ac3a049dcb672a1201e88bf60bdd1d303158888a3d30d616cc0bd +b33b7e1f765e9cbd5eeb925e69c39b0a9ea3348ab17f1dbb84b66f4a4b3233e28cbdeb0903d6cfe49ec4fc2f27378ff9 +b777da64fa64d9bc3d2d81b088933fce0e5fcc29c15536159c82af3622a2604c2b968991edea7b6882c9e6f76b544203 +8ea598e402a056fd8031fbf3b9e392347999adc1bd5b68c5797a791a787d006e96918c799467af9ac7f5f57eb30b4f94 +b6901a389bf3b3045e679d015c714d24f8bbe6183349b7f6b42f43409a09f0d5bd4b794012257d735c5fdf6d1812554b +b5866426336d1805447e6efc3f3deb629b945b2781f618df9a2cc48c96020846e9108f9d8507a42ba58d7617cb796c31 +a18ccc6ad1caa8462fa9bec79510689dd2a68d2e8b8e0ddbeb50be4d77728e1d6a18748a11e27edd8d3336c212689a4d +abbd48c48a271b6b7c95518a9352d01a84fb165f7963b87cdc95d5891119a219571a920f0d9ceedc8f9f0de4ab9deb65 +94a4e5f4d7e49229e435530b12a1ff0e9259a44a4f183fb1fe5b7b59970436e19cf932625f83f7b75702fd2456c3b801 +af0a6f2a0d0af7fc72e8cb690f0c4b4b57b82e1034cca3d627e8ef85415adec8eb5df359932c570b1ee077c1d7a5a335 +9728025e03114b9e37ed43e9dcba54a2d67f1c99c34c6139e03d4f9c57c9e28b6b27941d9fca4051d32f9b89bec6537b +941601742d1e1ec8426591733a4f1c13785b0a9b0a6b2275909301a6a3c6c1e2fb1ffa5fdcc08d7fb69f836ae641ced5 +b84b90480defd22f309e294379d1ca324a76b8f0ba13b8496b75a6657494e97d48b0ea5cfdb8e8ac7f2065360e4b1048 +95cc438ee8e370fc857fd36c3679c5660cf6a6c870f56ef8adf671e6bf4b25d1dbad78872cc3989fdfe39b29fc30486d +8aafba32e4a30cad79c5800c8709241b4041b0c13185ea1aa9bc510858709870b931d70b5d9a629f47579b161f1d8af7 +865b0155d9013e80cba57f204c21910edbd4d15e53ae4fee79992cb854dc8b8a73f0a9be92f74893e30eb70f270511bc +b9a49ce58d40b429ac7192cdbf76da31300efc88c827b1e441dd5bdb2f1c180d57808c48992492a2dc5231008629159f +8d1438b10f6cd996494d4c7b5a0841617ec7cf237c9e0956eac04fda3f9ded5110ec99776b816e3c78abd24eb4a9c635 +af2dd18211bb8a3e77c0a49d5773da6e29e4e6fa6632a6eeb56c4be233f6afe81655d977932548de2be16567c54ffbd7 +92b92443f44464f2b48002a966664a4267eae559fa24051983bcf09d81bed5bcc15cb6ff95139d991707697a5d0cc1ab +a1864a2bac0c0dd5b2fb1a79913dd675fe0a5ae08603a9f69d8ca33268239ac7f2fed4f6bf6182a4775683cb9ccd92a8 +948e8f1cf5bd594c5372845b940db4cb2cb5694f62f687952c73eb77532993de2e2d7d974a2ced58730d12c8255c30a2 +aa825c08284fa74a99fcfc473576e8a9788277f72f8c87f29be1dd41229c286c2753ff7444c753767bd8180226763dfc +8384d8d51415e1a4d6fe4324504e958c1b86374cc0513ddf5bcbffabb3edcf4b7d401421e5d1aa9da9010f07ef502677 +8b8223a42585409041d8a6e3326342df02b2fe0bcc1758ff950288e8e4677e3dc17b0641286eaf759a68e005791c249c +a98a98cc2fb14e71928da7f8ce53ab1fb339851c9f1f4bceb5f1d896c46906bd027ef5950ca53b3c8850407439efedd4 +866f44d2e35a4dbffe6cd539b6ef5901924061e37f9a0e7007696fb23526379c9b8d095b417effe1eecda698de744dcb +91774f44bf15edafdf43957fdf254682a97e493eb49d0779c745cb5dbe5d313bf30b372edd343f6d2220475084430a2e +ab52fc3766c499a5f5c838210aada2c3bcc1a2ec1a82f5227d4243df60809ee7be10026642010869cfbf53b335834608 +a0e613af98f92467339c1f3dc4450b7af396d30cefd35713388ccd600a3d7436620e433bf294285876a92f2e845b90d0 +8a1b5ca60a9ae7adc6999c2143c07a855042013d93b733595d7a78b2dc94a9daa8787e2e41b89197a0043343dbd7610f +ae7e4557bc47b1a9af81667583d30d0da0d4a9bb0c922450c04ec2a4ae796c3f6b0ede7596a7a3d4e8a64c1f9ee8ff36 +8d4e7368b542f9f028309c296b4f84d4bde4837350cf71cfe2fa9d4a71bce7b860f48e556db5e72bc21cf994ffdf8e13 +af6ed1fbff52dd7d67d6a0edfa193aa0aab1536979d27dba36e348759d3649779f74b559194b56e9378b41e896c4886f +a069ba90a349ac462cac0b44d02c52a4adf06f40428aef5a2ddff713de31f991f2247fc63426193a3ea1b1e50aa69ded +8750f5f4baf49a5987470f5022921108abe0ead3829ddef00e61aedd71f11b1cdd4be8c958e169440b6a8f8140f4fbf9 +a0c53cefc08a8d125abd6e9731bd351d3d05f078117ff9c47ae6b71c8b8d8257f0d830481f941f0c349fc469f01c9368 +94eea18c5ed056900c8285b05ba47c940dff0a4593b627fdd8f952c7d0122b2c26200861ef3e5c9688511857535be823 +8e1b7bd80d13460787e5060064c65fbcdac000c989886d43c7244ccb5f62dcc771defc6eb9e00bae91b47e23aeb9a21f +b4b23f9dd17d12e145e7c9d3c6c0b0665d1b180a7cfdf7f8d1ab40b501c4b103566570dca2d2f837431b4bf698984cad +847a47c6b225a8eb5325af43026fb9ef737eede996257e63601f80302092516013fde27b93b40ff8a631887e654f7a54 +9582d7afb77429461bd8ebb5781e6390a4dde12a9e710e183581031ccfacd9067686cfaf47584efaafeb1936eae495cc +8e4fd5dbd9002720202151608f49ef260b2af647bd618eb48ebeceeb903b5d855aa3e3f233632587a88dc4d12a482df9 +87b99fe6a9c1d8413a06a60d110d9e56bb06d9f0268dc12e4ab0f17dd6ca088a16ade8f4fb7f15d3322cbe7bfd319ae1 +b562d23002ed00386db1187f519018edd963a72fca7d2b9fcaab9a2213ac862803101b879d1d8ac28d1ccae3b4868a05 +b4cc8b2acacf2ce7219a17af5d42ce50530300029bc7e8e6e2a3c14ff02a5b33f0a7fecb0bb4a7900ea63befa854a840 +9789f0fe18d832ff72df45befa7cabf0a326b42ada3657d164c821c35ac7ed7b2e0eba3d67856e8c387626770059b0c3 +986c6fe6771418549fa3263fa8203e48552d5ecb4e619d35483cb4e348d849851f09692821c9233ae9f16f36979c30c2 +a9160182a9550c5756f35cea1fe752c647d1b64a12426a0b5b8d48af06a12896833ec5f5d9b90185764db0160905ca01 +82614dbd89d54c1e0af4f6ffe8710e6e871f57ef833cbcb3d3d7c617a75ec31e2a459a89ebb716b18fc77867ff8d5d47 +8fc298ffba280d903a7873d1b5232ce0d302201957226cddff120ffe8df9fee34e08420302c6b301d90e3d58f10beeb9 +898da9ac8494e31705bdf684545eee1c99b564b9601877d226d0def9ec67a20e06f8c8ba2a5202cc57a643487b94af19 +88218478d51c3ed2de35b310beedf2715e30208c18f046ee65e824f5e6fd9def921f6d5f75fd6dde47fa670c9520f91a +89703ae7dff9b3bc2a93b44cdbab12c3d8496063a3c658e21a7c2078e4c00be0eecae6379ee8c400c67c879748f1d909 +a44d463477dece0d45abb0ebb5f130bfb9c0a3bbcd3be62adf84a47bbd6938568a89bc92a53ca638ff1a2118c1744738 +95df2b4d392143ee4c39ad72f636d0ed72922de492769c6264015776a652f394a688f1d2b5cf46077d01fda8319ba265 +aa989867375710ed07ad6789bfb32f85bdc71d207f6f838bd3bde9da5a169325481ac326076b72358808bd5c763ba5bb +b859d97d0173920d16bc01eb7d3ddd47273daac72f86c4c30392f8de05fee643e8d6aa8bebdbc5c2d89037bc68a8a105 +b0249ec97411fa39aa06b3d9a6e04bbbcd5e99a7bc527273b6aa95e7ae5f437b495385adaefa4327231562d232c9f822 +8209e156fe525d67e1c83ec2340d50d45eba5363f617f2e5738117cdcc4a829c4cc37639afd7745cbe929c66754fd486 +99fd2728ceb4c62e5f0763337e6d28bf11fbe5df114217f002bc5cd3543c9f62a05a8a41b2e02295360d007eaab796a6 +902ebc68b8372feeaf2e0b40bd6998a0e17981db9cc9d23f932c34fbcc680292a0d8adcea2ad3fb2c9ed89e7019445c2 +8b5653f4770df67f87cb68970555b9131c3d01e597f514e0a399eec8056e4c5a7deed0371a27b3b2be426d8e860bf9f2 +8f5af27fdc98a29c647de60d01b9e9fd0039013003b44ba7aa75a4b9c42c91feb41c8ae06f39e22d3aed0932a137affa +81babb9c1f5bcc0fd3b97d11dd871b1bbd9a56947794ff70ab4758ae9850122c2e78d53cb30db69ece23538dc4ee033e +b8b65d972734f8ecae10dd4e072fa73c9a1bf37484abcfa87e0d2fcecac57294695765f63be87e1ba4ec0eb95688403a +b0fe17d0e53060aef1947d776b06ab5b461a8ef41235b619ca477e3182fadaf9574f12ffc76420f074f82ac4a9aa7071 +ae265c0b90bf064d7a938e224cb1cd3b7eca3e348fbc4f50a29ac0930a803b96e0640992354aa14b303ea313cb523697 +8bc10ffde3224e8668700a3450463ab460ec6f198e1deb016e2c9d1643cc2fe1b377319223f41ffeb0b85afd35400d40 +8d5113b43aea2e0cc6f8ec740d6254698aff7881d72a6d77affd6e6b182909b4de8eb5f524714b5971b418627f15d218 +ae2ef0a401278b7b5d333f0588773ec62ead58807cdee679f72b1af343c1689c5f314989d9e6c9369f8da9ce76979db6 +b9c1cb996a78d4f7793956daaa8d8825dd43c4c37877bc04026db4866144b1bf37aa804d2fe0a63c374cf89e55e9069f +a35f73851081f6540e536a24a28808d478a2bb1fd15ee7ff61b1562e44fbafc0004b9c92c9f96328d546b1287e523e48 +82007f34e3383c628c8f490654369744592aa95a63a72be6e90848ad54f8bc2d0434b62f92a7c802c93017214ecf326e +9127db515b1ed3644c64eaf17a6656e6663838fed4c6612a444a6761636eaaeb6a27b72d0e6d438c863f67b0d3ec25c5 +984c9fcc3deccf83df3bbbb9844204c68f6331f0f8742119ba30634c8c5d786cd708aa99555196cf6563c953816aec44 +a0f9daf900112029474c56ddd9eb3b84af3ed2f52cd83b4eb34531cf5218e7c58b3cab4027b9fc17831e1b6078f3bf4a +90adbcc921369023866a23f5cea7b0e587d129ad71cab0449e2e2137838cea759dec27b0b922c59ac4870ef6146ea283 +8c5650b6b9293c168af98cf60ad35c945a30f5545992a5a8c05d42e09f43b04d370c4d800f474b2323b4269281ca50f8 +868d95be8b34a337b5da5d886651e843c073f324f9f1b4fbd1db14f74aba6559449f94c599f387856c5f8a7bc83b52a1 +812df0401d299c9e95a8296f9c520ef12d9a3dd88749b51eab8c1b7cc97961608ab9fc241a7e2888a693141962c8fd6d +abda319119d8a4d089393846830eee19d5d6e65059bf78713b307d0b4aad245673608b0880aa31c27e96c8d02eff39c0 +887f11ae9e488b99cb647506dcaa5e2518b169ee70a55cd49e45882fe5bfb35ffaf11feb2bf460c17d5e0490b7c1c14d +b36b6e9f95ffff917ca472a38fa7028c38dc650e1e906e384c10fe38a6f55e9b84b56ffa3a429d3b0c3e2cf8169e66a9 +a0450514d20622b7c534f54be3260bab8309632ca21c6093aa0ccc975b8eed33a922cbcc30a730ccc506edf9b188a879 +87cfaf7bcd5d26875ca665ac45f9decd3854701b0443332da0f9b213e69d6f5521ae0217ec375489cd4fad7b4babf724 +842ad67c1baf7a9d4504c10c5c979ce0a4d1b86a263899e2b5757407c2adcdcf7ed58173ad9d156d84075ef8798cb1c4 +ac1a05755fe4d3fb2ab5b951bafe65cca7c7842022ca567b32cddf7741782cbf8c4990c1dd4ea05dc087a4712844aebb +a000c8cecc4fddeb926dc8dd619952bc51d00d7c662e025f973387a3fc8b1ef5c7c10b6a62e963eb785e0ec04cb1ffbe +8a573c9986dbeb469547dfd09f60078eab252d8ec17351fe373a38068af046b0037967f2b3722fa73ed73512afd038d2 +b8dff15dff931f58ba05b6010716c613631d7dd9562ae5138dbec966630bcdb0e72552e4eefc0351a6a6b7912d785094 +990e81fd459433522e8b475e67e847cb342c4742f0dbf71acc5754244ccd1d9ff75919168588d8f18b8aea17092dd2a4 +b012f8644da2113bef7dd6cdc622a55cfa0734bd267b847d11bba2e257a97a2a465c2bb616c240e197ff7b23e2ce8d8e +a659bd590fde467766e2091c34a0b070772f79380be069eef1afecc470368a95afd9eed6520d542c09c0d1a9dca23bd0 +b9239f318b849079477d1cf0a60a3d530391adacd95c449373da1c9f83f03c496c42097c3f9aca10c1b9b3dbe5d98923 +851e9a6add6e4a0ee9994962178d06f6d4fbc0def97feef1ba4c86d3bcf027a59bafa0cf25876ca33e515a1e1696e5cc +803b9c5276eed78092de2f340b2f0d0165349a24d546e495bd275fe16f89a291e4c74c22fdee5185f8fce0c7fbced201 +95915654ca4656d07575168fb7290f50dc5dcbbcdf55a44df9ec25a9754a6571ab8ca8a159bc27d9fa47c35ffd8f7ffd +88f865919764e8e765948780c4fdd76f79af556cd95e56105d603c257d3bfb28f11efca1dfb2ce77162f9a5b1700bac8 +b1233131f666579b4cc8b37cfa160fc10551b1ec33b784b82685251464d3c095cdde53d0407c73f862520aa8667b1981 +a91115a15cf4a83bda1b46f9b9719cfba14ffb8b6e77add8d5a0b61bea2e4ea8ce208e3d4ed8ca1aab50802b800e763a +93553b6c92b14546ae6011a34600a46021ce7d5b6fbfcda2a70335c232612205dbe6bfb1cc42db6d49bd4042c8919525 +8c2a498e5d102e80c93786f13ccf3c9cab7f4c538ccf0aee8d8191da0dbca5d07dff4448383e0cf5146f6d7e629d64f8 +a66ab92c0d2c07ea0c36787a86b63ee200499527c93b9048b4180fc77e0bb0aa919f4222c4bec46eeb3f93845ab2f657 +917e4fc34081a400fc413335fdf5a076495ae19705f8542c09db2f55fa913d6958fa6d711f49ad191aec107befc2f967 +940631a5118587291c48ac8576cdc7e4a904dd9272acb79407a7d3549c3742d9b3669338adbc1386724cc17ee0cc1ca3 +ae23ae3a531900550671fd10447a35d3653c5f03f65b0fdffe092844c1c95d0e67cab814d36e6388db5f8bd0667cd232 +ae545727fca94fd02f43e848f0fbbb1381fd0e568a1a082bf3929434cc73065bfbc9f2c840b270dda8cc2e08cd4d44b0 +8a9bc9b90e98f55007c3a830233c7e5dc3c4760e4e09091ff30ee484b54c5c269e1292ce4e05c303f6462a2a1bd5de33 +a5a2e7515ce5e5c1a05e5f4c42f99835f6fde14d47ecb4a4877b924246038f5bc1b91622e2ff97ed58737ed58319acfa +8fa9f5edf9153618b72b413586e10aaa6c4b6e5d2d9c3e8693ca6b87804c58dc4bf23a480c0f80cb821ebc3cf20ea4fc +925134501859a181913aadac9f07f73d82555058d55a7d5aaa305067fbd0c43017178702facc404e952ea5cfd39db59b +8b5ab1d9b5127cb590d6bddbf698ffe08770b6fc6527023d6c381f39754aecc43f985c47a46be23fe29f6ca170249b44 +aa39c6b9626354c967d93943f4ef09d637e13c505e36352c385b66e996c19c5603b9f0488ad4014bb5fc2e051b2876cc +8e77399c6e9cb8345002195feb7408eb571e6a81c0418590d2d775af7414fc17e61fe0cd37af8e737b59b89c849d3a28 +a0150aeca2ddc9627c7ea0af0dd4426726583389169bc8174fc1597cc8048299cc594b22d234a4e013dff7232b2d946c +98659422ef91f193e6104b09ff607d1ed856bb6baed2a6386c9457efbc748bd1bf436573d80465ebc54f8c340b697ea5 +8d6fb015898d3672eb580e1ffdf623fc4b23076664623b66bfb18f450d29522e8cb9c90f00d28ccf00af34f730bff7ac +996a8538efa9e2937c1caad58dc6564e5c185ada6cdcef07d5ec0056eb1259b0e4cef410252a1b5dbaee0da0b98dac91 +aa0ae2548149d462362a33f96c3ce9b5010ebf202602e81e0ef77e22cfc57ecf03946a3076b6171bea3d3dc9681187d7 +a5ce876b29f6b89050700df46d679bed85690daf7bad5c0df65e6f3bde5673e6055e6c29a4f4dcb82b93ccecf3bad9cc +81d824bb283c2f55554340c3514e15f7f1db8e9e95dd60a912826b1cccb1096f993a6440834dad3f2a5de70071b4b4b5 +914e7291da286a89dfc923749da8f0bf61a04faa3803d6d10633261a717184065dcc4980114ad852e359f79794877dd9 +ae49dc760db497c8e834510fe89419cc81f33fd2a2d33de3e5e680d9a95a0e6a3ccbdf7c0953beeb3d1caf0a08b3e131 +b24f527d83e624d71700a4b238016835a2d06f905f3740f0005105f4b2e49fc62f7e800e33cdc900d805429267e42fc0 +b03471ecaa7a3bf54503347f470a6c611e44a3cee8218ad3fcad61d286cfb7bb6a1113dad18475ec3354a71fcc4ec1e2 +881289b82b30aff4c8f467c2a25fced6064e1eece97c0de083e224b21735da61c51592a60f2913e8c8ba4437801f1a83 +b4ce59c0fc1e0ecad88e79b056c2fd09542d53c40f41dea0f094b7f354ad88db92c560b9aeb3c0ef48137b1a0b1c3f95 +a1ffb30eb8ef0e3ea749b5f300241ebe748ed7cf480e283dfcda7380aa1c15347491be97e65bc96bdf3fe62d8b74b3ae +b8954a826c59d18c6bfab24719f8730cc901868a95438838cd61dac468a2d79b1d42f77284e86e3382bf4f2a22044927 +818e7e7c59b6b5e22b3c2c19c163f2e787f2ff3758d395a4da02766948935eb44413c3ddd2bf45804a3c19744aa332f3 +a29556e49866e4e6f01d4f042eed803beeda781462884a603927791bd3750331a11bc013138f3270c216ab3aa5d39221 +b40885fa0287dc92859b8b030c7cca4497e96c387dcfe6ed13eb7f596b1eb18fb813e4ae139475d692f196431acb58fe +89cd634682fd99ee74843ae619832780cf7cd717f230ea30f0b1821caf2f312b41c91f459bdba723f780c7e3eed15676 +b48c550db835750d45a7f3f06c58f8f3bf8766a441265ca80089ead0346f2e17cbb1a5e843557216f5611978235e0f83 +90936ee810039783c09392857164ab732334be3a3b9c6776b8b19f5685379c623b1997fb0cdd43af5061d042247bc72f +a6258a6bae36525794432f058d4b3b7772ba6a37f74ef1c1106c80a380fc894cbeac4f340674b4e2f7a0f9213b001afd +8f26943a32cf239c4e2976314e97f2309a1c775777710393c672a4aab042a8c6ee8aa9ac168aed7c408a436965a47aeb +820f793573ca5cc3084fe5cef86894c5351b6078df9807d4e1b9341f9d5422dd29d19a73b0843a14ad63e8827a75d2da +a3c4fca786603cd28f2282ba02afe7cf9287529e0e924ca90d6cdfd1a3912478ebb3076b370ee72e00df5517134fe17f +8f3cdabd0b64a35b9ee9c6384d3a8426cc49ae6063632fb1a56a0ae94affa833955f458976ff309dafd0b2dd540786ae +945a0630cd8fa111cfd776471075e5d2bbe8eb7512408b5c79c8999bfaeca6c097f988fb1c38fa9c1048bac2bca19f2e +8a7f6c4e0ba1920c98d0b0235b4dda73b631f511e209b10c05c550f51e91b4ba3893996d1562f04ac7105a141464e0e9 +ab3c13d8b78203b4980412edc8a8f579e999bf79569e028993da9138058711d19417cf20b477ef7ed627fa4a234c727a +82b00d9a3e29ed8d14c366f7bb25b8cfe953b7be275db9590373a7d8a86ea927d56dc3070a09ef7f265f6dd99a7c896e +b6e48a282de57949821e0c06bc9ba686f79e76fb7cbf50ea8b4651ccd29bc4b6da67efea4662536ba9912d197b78d915 +a749e9edcba6b4f72880d3f84a493f4e8146c845637009f6ff227ff98521dbbe556a3446340483c705a87e40d07364bc +b9b93c94bd0603ce5922e9c4c29a60066b64a767b3aed81d8f046f48539469f5886f14c09d83b5c4742f1b03f84bb619 +afa70b349988f85ed438faafa982df35f242dd7869bda95ae630b7fd48b5674ef0f2b4d7a1ca8d3a2041eff9523e9333 +a8e7e09b93010982f50bd0930842898c0dcd30cdb9b123923e9d5ef662b31468222fc50f559edc57fcfdc597151ebb6e +8ce73be5ac29b0c2f5ab17cae32c715a91380288137d7f8474610d2f28d06d458495d42b9cb156fb1b2a7dfdcc437e1c +85596c1d81f722826d778e62b604eb0867337b0204c9fae636399fa25bb81204b501e5a5912654d215ec28ff48b2cb07 +96ff380229393ea94d9d07e96d15233f76467b43a3e245ca100cbecbdbb6ad8852046ea91b95bb03d8c91750b1dfe6e1 +b7417d9860b09f788eb95ef89deb8e528befcfa24efddbc18deaf0b8b9867b92361662db49db8121aeea85a9396f64fd +97b07705332a59cdba830cc8490da53624ab938e76869b2ce56452e696dcc18eb63c95da6dffa933fb5ffb7585070e2d +971f757d08504b154f9fc1c5fd88e01396175b36acf7f7abcfed4fff0e421b859879ed268e2ac13424c043b96fbe99fc +b9adb5d3605954943a7185bddf847d4dbe7bafe970e55dc0ec84d484967124c26dd60f57800d0a8d38833b91e4da476a +b4856741667bb45cae466379d9d6e1e4191f319b5001b4f963128b0c4f01819785732d990b2f5db7a3452722a61cd8cc +a81ec9f2ab890d099fb078a0c430d64e1d06cbbe00b1f140d75fc24c99fe35c13020af22de25bbe3acf6195869429ba5 +99dcea976c093a73c08e574d930d7b2ae49d7fe43064c3c52199307e54db9e048abe3a370b615798b05fe8425a260ba0 +a1f7437c0588f8958b06beb07498e55cd6553429a68cd807082aa4cc031ab2d998d16305a618b3d92221f446e6cd766d +806e4e0958e0b5217996d6763293f39c4f4f77016b3373b9a88f7b1221728d14227fce01b885a43b916ff6c7a8bc2e06 +8e210b7d1aff606a6fc9e02898168d48ec39bc687086a7fe4be79622dd12284a5991eb53c4adfe848251f20d5bfe9de0 +82810111e10c654a6c07cbfd1aff66727039ebc3226eef8883d570f25117acf259b1683742f916ac287097223afc6343 +92f0e28cca06fd543f2f620cc975303b6e9a3d7c96a760e1d65b740514ccd713dc7a27a356a4be733570ca199edd17ba +900810aa4f98a0d6e13baf5403761a0aeb6422249361380c52f98b2c79c651e3c72f7807b5b5e3a30d65d6ff7a2a9203 +b0740bfefea7470c4c94e85185dbe6e20685523d870ff3ef4eb2c97735cef41a6ab9d8f074a37a81c35f3f8a7d259f0e +af022e98f2f418efbbe2de6fefb2aa133c726174f0f36925a4eafd2c6fd6c744edb91386bafb205ce13561de4294f3a6 +95e4592e21ba97e950abb463e1bc7b0d65f726e84c06a98eb200b1d8bfc75d4b8cff3f55924837009e88272542fd25ec +b13bd6b18cd8a63f76c9831d547c39bbd553bda66562c3085999c4da5e95b26b74803d7847af86b613a2e80e2f08caae +a5625658b474a95aba3e4888c57d82fb61c356859a170bc5022077aa6c1245022e94d3a800bf7bd5f2b9ab1348a8834e +a097ee9e6f1d43e686df800c6ce8cfc1962e5a39bb6de3cf5222b220a41b3d608922dae499bce5c89675c286a98fdabd +94230ba8e9a5e9749cd476257b3f14a6bf9683e534fb5c33ca21330617533c773cb80e508e96150763699ad6ecd5aee7 +b5fea7e1f4448449c4bc5f9cc01ac32333d05f464d0ed222bf20e113bab0ee7b1b778cd083ceae03fdfd43d73f690728 +a18a41a78a80a7db8860a6352642cdeef8a305714543b857ca53a0ee6bed70a69eeba8cfcf617b11586a5cc66af4fc4f +85d7f4b3ff9054944ac80a51ef43c04189d491e61a58abed3f0283d041f0855612b714a8a0736d3d25c27239ab08f2ec +b1da94f1e2aedd357cb35d152e265ccfc43120825d86733fa007fc1e291192e8ff8342306bef0c28183d1df0ccec99d0 +852893687532527d0fbeea7543ac89a37195eadab2f8f0312a77c73bdeed4ad09d0520f008d7611539425f3e1b542cfd +99e3bd4d26df088fc9019a8c0b82611fd4769003b2a262be6b880651d687257ded4b4d18ccb102cba48c5e53891535e4 +98c407bc3bbc0e8f24bedf7a24510a5d16bce1df22940515a4fbdacd20d06d522ef9405f5f9b9b55964915dd474e2b5c +80de0a12f917717c6fc9dc3ccc9732c28bae36cff4a9f229d5eaf0d3e43f0581a635ba2e38386442c973f7cb3f0fdfa7 +94f9615f51466ae4bb9c8478200634b9a3d762d63f2a16366849096f9fc57f56b2e68fe0ca5d4d1327a4f737b3c30154 +a3dcbe16499be5ccb822dfcd7c2c8848ba574f73f9912e9aa93d08d7f030b5076ca412ad4bf6225b6c67235e0ab6a748 +98f137bf2e1aea18289750978feb2e379054021e5d574f66ca7b062410dcfe7abb521fab428f5b293bbe2268a9af3aa4 +8f5021c8254ba426f646e2a15b6d96b337a588f4dfb8cbae2d593a4d49652ca2ada438878de5e7c2dbbd69b299506070 +8cc3f67dd0edcdb51dfd0c390586622e4538c7a179512f3a4f84dd7368153a28b1cf343afd848ac167cb3fcaa6aee811 +863690f09ac98484d6189c95bc0d9e8f3b01c489cb3f9f25bf7a13a9b6c1deaf8275ad74a95f519932149d9c2a41db42 +8494e70d629543de6f937b62beca44d10a04875bd782c9a457d510f82c85c52e6d34b9c3d4415dd7a461abbcc916c3c4 +925b5e1e38fbc7f20371b126d76522c0ea1649eb6f8af8efb389764ddcf2653775ef99a58a2dcf1812ce882964909798 +94d0494dcc44893c65152e7d42f4fb0dc46af5dc5674d3c607227160447939a56d9f9ea2b3d3736074eef255f7ec7566 +b0484d33f0ef80ff9b9d693c0721c77e518d0238918498ddf71f14133eb484defb9f9f7b9083d52bc6d6ba2012c7b036 +8979e41e0bb3b501a7ebbd024567ce7f0171acfea8403a530fe9e791e6e859dfbd60b742b3186d7cf5ab264b14d34d04 +af93185677d39e94a2b5d08867b44be2ba0bb50642edca906066d80facde22df4e6a7a2bd8b2460a22bdf6a6e59c5fdd +90f0ef0d7e7ab878170a196da1b8523488d33e0fde7481f6351558b312d00fa2b6b725b38539063f035d2a56a0f5e8f1 +a9ca028ccb373f9886574c2d0ea5184bc5b94d519aa07978a4814d649e1b6c93168f77ae9c6aa3872dd0eea17968ec22 +82e7aa6e2b322f9f9c180af585b9213fb9d3ad153281f456a02056f2d31b20d0f1e8807ff0c85e71e7baca8283695403 +affce186f842c547e9db2dffc0f3567b175be754891f616214e8c341213cbf7345c9ecd2f704bb0f4b6eba8845c8d8a7 +ab119eb621fade27536e98c6d1bc596388bb8f5cad65194ea75c893edbe6b4d860006160f1a9053aea2946bd663e5653 +99cd2c1c38ead1676657059dc9b43d104e8bd00ae548600d5fc5094a4d875d5b2c529fac4af601a262045e1af3892b5e +b531a43b0714cc638123487ef2f03dfb5272ff399ff1aa67e8bc6a307130d996910fb27075cbe53050c0f2902fc32ffe +923b59ac752c77d16b64a2d0a5f824e718460ef78d732b70c4c776fecc43718ecfaf35f11afbb544016232f445ecab66 +a53439cd05e6e1633cdce4a14f01221efcd3f496ac1a38331365c3cadc30013e5a71600c097965927ee824b9983a79cb +8af976ffab688d2d3f9e537e2829323dda9abf7f805f973b7e0a01e25c88425b881466dee37b25fda4ea683a0e7b2c03 +92e5f40230a9bfbb078fa965f58912abb753b236f6a5c28676fb35be9b7f525e25428160caeaf0e3645f2be01f1a6599 +8c4e7b04e2f968be527feba16f98428508a157b7b4687399df87666a86583b4446a9f4b86358b153e1660bb80bd92e8b +97cd622d4d8e94dceb753c7a4d49ea7914f2eb7d70c9f56d1d9a6e5e5cc198a3e3e29809a1d07d563c67c1f8b8a5665a +967bfa8f411e98bec142c7e379c21f5561f6fd503aaf3af1a0699db04c716c2795d1cb909cccbcb917794916fdb849f1 +b3c18a6caa5ca2be52dd500f083b02a4745e3bcaed47b6a000ce7149cee4ed7a78d2d7012bf3731b1c15c6f04cbd0bd1 +b3f651f1f84026f1936872956a88f39fcfe3e5a767233349123f52af160f6c59f2c908c2b5691255561f0e70620c8998 +ae23b59dc2d81cec2aebcaaf607d7d29cf588f0cbf7fa768c422be911985ca1f532bb39405f3653cc5bf0dcba4194298 +a1f4da396f2eec8a9b3252ea0e2d4ca205f7e003695621ae5571f62f5708d51ca3494ac09c824fca4f4d287a18beea9a +a036fa15e929abed7aac95aa2718e9f912f31e3defd224e5ed379bf6e1b43a3ad75b4b41208c43d7b2c55e8a6fedca72 +80e8372d8a2979ee90afbdb842624ace72ab3803542365a9d1a778219d47f6b01531185f5a573db72213ab69e3ffa318 +af68b5cdc39e5c4587e491b2e858a728d79ae7e5817a93b1ea39d34aec23dea452687046c8feae4714def4d0ed71da16 +b36658dfb756e7e9eec175918d3fe1f45b398679f296119cd53be6c6792d765ef5c7d5afadc5f3886e3f165042f4667f +ad831da03b759716f51099d7c046c1a8e7bf8bb45a52d2f2bfd769e171c8c6871741ef8474f06e2aca6d2b141cf2971f +8bae1202dde053c2f59efc1b05cb8268ba9876e4bd3ff1140fa0cc5fa290b13529aede965f5efdff3f72e1a579efc9cc +86344afbc9fe077021558e43d2a032fcc83b328f72948dba1a074bb1058e8a8faec85b1c019fc9836f0d11d2585d69c8 +831d1fc7aa28f069585d84c46bdc030d6cb12440cfaae28098365577fc911c4b8f566d88f80f3a3381be2ec8088bf119 +899de139797ac1c8f0135f0656f04ad4f9b0fa2c83a264d320eb855a3c0b9a4907fc3dc01521d33c07b5531e6a997064 +855bc752146d3e5b8ba7f382b198d7dc65321b93cdfc76250eabc28dba5bbf0ad1be8ccda1adf2024125107cb52c6a6e +af0aeccab48eb35f8986cabf07253c5b876dd103933e1eee0d99dc0105936236b2a6c413228490ed3db4fa69aab51a80 +ae62e9d706fbf535319c909855909b3deba3e06eaf560803fa37bce3b5aab5ea6329f7609fea84298b9da48977c00c3b +823a8d222e8282d653082d55a9508d9eaf9703ce54d0ab7e2b3c661af745a8b6571647ec5bd3809ae6dddae96a220ea7 +a4c87e0ea142fc287092bc994e013c85e884bc7c2dde771df30ca887a07f955325c387b548de3caa9efa97106da8176a +b55d925e2f614f2495651502cf4c3f17f055041fa305bb20195146d896b7b542b1e45d37fa709ca4bfc6b0d49756af92 +b0ebe8947f8c68dc381d7bd460995340efcbb4a2b89f17077f5fde3a9e76aef4a9a430d1f85b2274993afc0f17fdbead +8baaa640d654e2652808afd68772f6489df7cad37b7455b9cd9456bdddae80555a3f84b68906cc04185b8462273dcfc9 +add9aa08f827e7dc292ac80e374c593cd40ac5e34ad4391708b3db2fe89550f293181ea11b5c0a341b5e3f7813512739 +909e31846576c6bdd2c162f0f29eea819b6125098452caad42451491a7cde9fd257689858f815131194200bca54511f4 +abc4b34098db10d71ce7297658ef03edfa7377bd7ed36b2ffbab437f8fd47a60e2bcfbc93ff74c85cfce74ca9f93106c +857dbecc5879c1b952f847139484ef207cecf80a3d879849080758ef7ac96acfe16a11afffb42daf160dc4b324279d9b +aab0b49beecbcf3af7c08fbf38a6601c21061bed7c8875d6e3c2b557ecb47fd93e2114a3b09b522a114562467fcd2f7d +94306dec35e7b93d43ed7f89468b15d3ce7d7723f5179cacc8781f0cf500f66f8c9f4e196607fd14d56257d7df7bf332 +9201784d571da4a96ef5b8764f776a0b86615500d74ec72bc89e49d1e63a3763b867deca07964e2f3914e576e2ca0ded +aabe1260a638112f4280d3bdea3c84ce3c158b81266d5df480be02942cecf3de1ac1284b9964c93d2db33f3555373dcc +8ef28607ca2e0075aa07de9af5a0f2d0a97f554897cab8827dfe3623a5e9d007d92755d114b7c390d29e988b40466db9 +87a9b1b097c3a7b5055cd9cb0c35ba6251c50e21c74f6a0bca1e87e6463efc38385d3acc9d839b4698dfa2eb4cb7a2ef +aee277e90d2ffce9c090295c575e7cd3bafc214d1b5794dd145e6d02d987a015cb807bd89fd6268cd4c59350e7907ee2 +836ad3c9324eaa5e022e9835ff1418c8644a8f4cd8e4378bd4b7be5632b616bb6f6c53399752b96d77472f99ece123cd +8ffffdb67faa5f56887c834f9d489bb5b4dab613b72eac8abf7e4bcb799ccd0dbd88a2e73077cadf7e761cb159fb5ec5 +9158f6cd4f5e88e6cdb700fddcbc5a99b2d31a7a1b37dce704bd9dd3385cca69607a615483350a2b1153345526c8e05d +a7ff0958e9f0ccff76742fc6b60d2dd91c552e408c84172c3a736f64acb133633540b2b7f33bc7970220b35ce787cd4e +8f196938892e2a79f23403e1b1fb4687a62e3a951f69a7874ec0081909eb4627973a7a983f741c65438aff004f03ba6f +97e3c1981c5cdb0a388f1e4d50b9b5b5f3b86d83417831c27b143698b432bb5dba3f2e590d6d211931ed0f3d80780e77 +903a53430b87a7280d37816946245db03a49e38a789f866fe00469b7613ee7a22d455fb271d42825957282c8a4e159d9 +b78955f686254c3994f610e49f1c089717f5fb030da4f9b66e9a7f82d72381ba77e230764ab593335ff29a1874848a09 +938b6d04356b9d7c8c56be93b0049d0d0c61745af7790edf4ef04e64de2b4740b038069c95be5c91a0ba6a1bb38512a9 +a769073b9648fe21bc66893a9ef3b8848d06f4068805a43f1c180fdd0d37c176b4546f8e5e450f7b09223c2f735b006f +863c30ebe92427cdd7e72d758f2c645ab422e51ecef6c402eb1a073fd7f715017cd58a2ad1afe7edccdf4ff01309e306 +a617b0213d161964eccfc68a7ad00a3ee4365223b479576e887c41ef658f846f69edf928bd8da8785b6e9887031f6a57 +a699834bf3b20d345082f13f360c5f8a86499e498e459b9e65b5a56ae8a65a9fcb5c1f93c949391b4795ef214c952e08 +9921f1da00130f22e38908dd2e44c5f662ead6c4526ebb50011bc2f2819e8e3fca64c9428b5106fa8924db76b7651f35 +98da928be52eb5b0287912fd1c648f8bbda00f5fd0289baf161b5a7dbda685db6ad6bdc121bc9ffa7ed6ae03a13dbee3 +927b91d95676ff3c99de1312c20f19251e21878bfb47ad9f19c9791bc7fb9d6f5c03e3e61575c0760180d3445be86125 +b8e4977a892100635310dfcb46d8b74931ac59ae687b06469b3cee060888a3b6b52d89de54e173d9e1641234754b32b1 +98f6fd5f81ca6e2184abd7a3a59b764d4953d408cec155b4e5cf87cd1f6245d8bdd58b52e1e024e22903e85ae15273f1 +909aaacbbfe30950cf7587faa190dc36c05e3c8131749cc21a0c92dc4afc4002275762ca7f66f91aa751b630ad3e324d +91712141592758f0e43398c075aaa7180f245189e5308e6605a6305d01886d2b22d144976b30460d8ce17312bb819e8f +947d85cb299b189f9116431f1c5449f0f8c3f1a70061aa9ebf962aa159ab76ee2e39b4706365d44a5dbf43120a0ac255 +b39eced3e9a2e293e04d236976e7ee11e2471fe59b43e7b6dd32ab74f51a3d372afee70be1d90af017452ec635574e0e +8a4ba456491911fc17e1cadcbb3020500587c5b42cf6b538d1cb907f04c65c168add71275fbf21d3875e731404f3f529 +8f6858752363e2a94c295e0448078e9144bf033ccd4d74f4f6b95d582f3a7638b6d3f921e2d89fcd6afd878b12977a9d +b7f349aa3e8feb844a56a42f82b6b00f2bfe42cab19f5a68579a6e8a57f5cf93e3cdb56cbbb9163ab4d6b599d6c0f6aa +a4a24dc618a6b4a0857fb96338ac3e10b19336efc26986e801434c8fdde42ca8777420722f45dfe7b67b9ed9d7ce8fb1 +aafe4d415f939e0730512fc2e61e37d65c32e435991fb95fb73017493014e3f8278cd0d213379d2330b06902f21fe4e1 +845cc6f0f0a41cc6a010d5cb938c0ef8183ff5ed623b70f7ea65a8bdbc7b512ea33c0ee8b8f31fdf5f39ec88953f0c1e +811173b4dd89d761c0bdffe224cd664ef303c4647e6cf5ef0ed665d843ed556b04882c2a4adfc77709e40af1cfdea40b +93ba1db7c20bfba22da123b6813cb38c12933b680902cef3037f01f03ab003f76260acc12e01e364c0d0cf8d45fca694 +b41694db978b2cf0f4d2aa06fcfc4182d65fb7c9b5e909650705f779b28e47672c47707d0e5308cd680c5746c37e1bc7 +a0e92c4c5be56a4ccf1f94d289e453a5f80e172fc90786e5b03c1c14ce2f3c392c349f76e48a7df02c8ae535326ea8fe +96cbeb1d0693f4f0b0b71ad30def5ccc7ad9ebe58dbe9d3b077f2ac16256cde10468875e4866d63e88ce82751aaf8ef6 +935b87fd336f0bf366046e10f7c2f7c2a2148fa6f53af5607ad66f91f850894527ecec7d23d81118d3b2ee23351ed6ed +b7c2c1fa6295735f6b31510777b597bc8a7bfb014e71b4d1b5859be0d8d64f62a1587caafc669dfe865b365eb27bd94f +b25d93af43d8704ffd53b1e5c16953fd45e57a9a4b7acfcfa6dd4bf30ee2a8e98d2a76f3c8eba8dc7d08d9012b9694c6 +b5a005cd9f891e33882f5884f6662479d5190b7e2aec1aa5a6d15a8cb60c9c983d1e7928e25e4cf43ec804eaea1d97b0 +93f9f0725a06e4a0fb83892102b7375cf5438b5ebc9e7be5a655f3478d18706cf7dbb1cd1adcee7444c575516378aa1b +900d7cbf43fd6ac64961287fe593c08446874bfc1eb09231fc93de858ac7a8bca496c9c457bced5881f7bf245b6789e0 +90c198526b8b265d75160ef3ed787988e7632d5f3330e8c322b8faf2ac51eef6f0ce5a45f3b3a890b90aecf1244a3436 +b499707399009f9fe7617d8e73939cb1560037ad59ac9f343041201d7cc25379df250219fd73fa012b9ade0b04e92efa +94415f6c3a0705a9be6a414be19d478181d82752b9af760dda0dbd24a8ff0f873c4d89e61ad2c13ebf01de55892d07fa +90a9f0b9f1edb87751c696d390e5f253586aae6ebfc31eb3b2125d23877a497b4aa778de8b11ec85efe49969021eaa5a +a9942c56506e5cd8f9289be8205823b403a2ea233ba211cf72c2b3827064fd34cd9b61ff698a4158e7379891ca4120d8 +83bb2ee8c07be1ab3a488ec06b0c85e10b83a531758a2a6741c17a3ccfa6774b34336926a50e11c8543d30b56a6ac570 +8a08a3e5ebe10353e0b7fff5f887e7e25d09bb65becf7c74a03c60c166132efaada27e5aea242c8b9f43b472561ae3ed +957c7a24cefaa631fe8a28446bc44b09a3d8274591ade53ba489757b854db54820d98df47c8a0fbee0e094f8ad7a5dc4 +b63556e1f47ed3ee283777ed46b69be8585d5930960d973f8a5a43508fc56000009605662224daec2de54ea52a8dcd82 +abed2b3d16641f0f459113b105f884886d171519b1229758f846a488c7a474a718857323c3e239faa222c1ab24513766 +882d36eed6756d86335de2f7b13d753f91c0a4d42ef50e30195cc3e5e4f1441afa5ff863022434acb66854eda5de8715 +a65ea7f8745bb8a623b44e43f19158fd96e7d6b0a5406290f2c1348fc8674fbfc27beb4f724cc2b217c6042cb82bc178 +a038116a0c76af090a069ca289eb2c3a615b96093efacfe68ea1610890b291a274e26b445d34f414cfec00c333906148 +90294f452f8b80b0a47c3bcb6e30bdd6854e3b01deaf93f5e82a1889a4a1036d17ecb59b48efa7dc41412168d7a523dd +88faf969c8978a756f48c6114f7f33a1ca3fd7b5865c688aa9cd32578b1f7ba7c06120502f8dc9aee174ecd41597f055 +8883763b2762dfff0d9be9ac19428d9fd00357ac8b805efda213993152b9b7eb7ba3b1b2623015d60778bffda07a724d +a30a1a5a9213636aa9b0f8623345dc7cf5c563b906e11cc4feb97d530a1480f23211073dcb81105b55193dcde5a381d2 +b45ee93c58139a5f6be82572d6e14e937ef9fcbb6154a2d77cb4bf2e4b63c5aabc3277527ecf4e531fe3c58f521cc5e3 +ac5a73e4f686978e06131a333f089932adda6c7614217fcaf0e9423b96e16fd73e913e5e40bf8d7800bed4318b48d4b1 +b6c1e6cdd14a48a7fe27cd370d2e3f7a52a91f3e8d80fb405f142391479f6c6f31aa5c59a4a0fdc9e88247c42688e0cf +ab1760530312380152d05c650826a16c26223960fc8e3bf813161d129c01bac77583eff04ce8678ff52987a69886526b +a4252dffae7429d4f81dfaeeecc48ab922e60d6a50986cf063964f282e47407b7e9c64cf819da6f93735de000a70f0b2 +94c19f96d5ecf4a15c9c5a24598802d2d21acbbd9ee8780b1bc234b794b8442437c36badc0a24e8d2cff410e892bb1d2 +89fafe1799cf7b48a9ea24f707d912fccb99a8700d7287c6438a8879f3a3ca3e60a0f66640e31744722624139ba30396 +b0108405df25cf421c2f1873b20b28552f4d5d1b4a0bf1c202307673927931cbd59f5781e6b8748ddb1206a5ec332c0b +aa0f0e7d09f12b48f1e44d55ec3904aa5707e263774126e0b30f912e2f83df9eb933ca073752e6b86876adaf822d14ba +b0cbe8abb58876d055c8150d9fdbde4fea881a517a2499e7c2ea4d55c518a3c2d00b3494f6a8fd1a660bfca102f86d2a +b1ef80ec903bac55f58b75933dc00f1751060690fd9dfb54cf448a7a4b779c2a80391f5fda65609274bd9e0d83f36141 +8b52e05b1845498c4879bb12816097be7fc268ce1cf747f83a479c8e08a44159fc7b244cf24d55aca06dccf0b97d11e1 +b632a2fc4fdb178687e983a2876ae23587fd5b7b5e0bb8c0eb4cfe6d921a2c99894762e2aaccdc5da6c48da3c3c72f6c +953ef80ab5f74274ae70667e41363ae6e2e98ccbd6b7d21f7283f0c1cafb120338b7a8b64e7c189d935a4e5b87651587 +b929cfd311017c9731eed9d08d073f6cf7e9d4cd560cddd3fdcb1149ab20c6610a7674a66a3616785b13500f8f43ee86 +870fb0d02704b6a328e68721fb6a4b0f8647681bfcb0d92ec3e241e94b7a53aecc365ed384e721c747b13fbf251002f1 +979501159833a8ba5422ed9b86f87b5961711f5b474d8b0e891373fe2d0b98ff41a3a7a74a8b154615bb412b662a48be +b20f9c13cdeceef67f877b3878839ef425f645b16a69c785fe38f687c87a03b9de9ae31ac2edb1e1dd3a9f2c0f09d35d +8c7705ed93290731b1cf6f3bf87fc4d7159bb2c039d1a9f2246cda462d9cdf2beef62d9f658cfeea2e6aef7869a6fc00 +aa439eb15705ad729b9163daee2598d98a32a8a412777c0d12fd48dc7796d422227a014705e445cc9d66f115c96bbc24 +a32307e16f89749fe98b5df1effef0429801c067e0d8067794e56b01c4fef742ad5e7ab42a1a4cc4741808f47a0b7cb8 +b31e65c549003c1207258a2912a72f5bad9844e18f16b0773ea7af8ff124390eb33b2f715910fc156c104572d4866b91 +85608d918ed7b08a0dc03aee60ea5589713304d85eee7b4c8c762b6b34c9355d9d2e192575af0fd523318ae36e19ae1c +a6497dbaf0e7035160b7a787150971b19cf5ba272c235b0113542288611ebecefa2b22f08008d3f17db6a70a542c258d +87862adb1ac0510614ab909457c49f9ec86dc8bdf0e4682f76d2739df11f6ffcfb59975527f279e890d22964a1fba9b6 +8717ac3b483b3094c3b642f3fafe4fbafc52a5d4f2f5d43c29d9cfe02a569daee34c178ee081144494f3a2ca6e67d7b1 +855100ac1ec85c8b437fdd844abaa0ca4ac9830a5bdd065b68dafb37046fcf8625dd482dc0253476926e80a4c438c9ec +ae74821bf265ca3c8702c557cf9ef0732ede7ef6ed658283af669d19c6f6b6055aca807cf2fa1a64785ec91c42b18ae5 +812a745b1419a306f7f20429103d6813cbdea68f82ff635ac59da08630cd61bda6e0fa9a3735bfd4378f58ad179c1332 +867dbbfe0d698f89451c37ca6d0585fd71ee07c3817e362ef6779b7b1d70b27c989cdd5f85ac33a0498db1c4d14521fe +84db735d3eb4ff7f16502dccc3b604338c3a4a301220ad495991d6f507659db4b9f81bba9c528c5a6114bcdba0160252 +aadc83d1c4e5e32bf786cfb26f2f12a78c8024f1f5271427b086370cdef7a71d8a5bf7cd7690bae40df56c38b1ad2411 +a27860eb0caaea37298095507f54f7729d8930ac1929de3b7a968df9737f4c6da3173bda9d64ff797ed4c6f3a1718092 +a3cdcaa74235c0440a34171506ed03d1f72b150d55904ce60ec7b90fcd9a6f46f0e45feab0f9166708b533836686d909 +b209a30bdac5c62e95924928f9d0d0b4113ebb8b346d7f3a572c024821af7f036222a3bd38bd8efd2ee1dbf9ac9556cd +83c93987eff8bc56506e7275b6bef0946672621ded641d09b28266657db08f75846dcbde80d8abc9470e1b24db4ca65b +800c09b3ee5d0251bdaef4a82a7fe8173de997cc1603a2e8df020dd688a0c368ad1ebef016b35136db63e774b266c74c +93fb52de00d9f799a9bce3e3e31aaf49e0a4fc865473feb728217bd70f1bc8a732ec37ac3582bf30ab60e8c7fdf3cb8d +a1aff6b4a50d02f079a8895c74443539231bfdf474600910febf52c9151da7b31127242334ac63f3093e83a047769146 +8c4532d8e3abb5f0da851138bfa97599039bcd240d87bbdf4fd6553b2329abb4781074b63caf09bc724ceb4d36cb3952 +8bd9b0ae3da5acda9eb3881172d308b03beec55014cd73b15026299541c42fd38bab4983a85c06894ebb7a2af2a23d4c +979441e7f5a0e6006812f21b0d236c5f505bb30f7d023cb4eb84ec2aa54a33ac91d87ece704b8069259d237f40901356 +a1c6d2d82e89957d6a3e9fef48deb112eb00519732d66d55aa0f8161e19a01e83b9f7c42ac2b94f337dcc9865f0da837 +97a0b8e04e889d18947d5bf77d06c25bbd62b19ce4be36aaa90ddbeafd93a07353308194199ba138efaadf1b928cd8d2 +822f7fbe9d966b8ec3db0fc8169ab39334e91bf027e35b8cc7e1fe3ead894d8982505c092f15ddfe5d8f726b360ac058 +a6e517eedd216949e3a10bf12c8c8ddbfde43cddcd2c0950565360a38444459191bdbc6c0af0e2e6e98bc6a813601c6d +858b5f15c46c074adb879b6ba5520966549420cb58721273119f1f8bc335605aeb4aa6dbe64aae9e573ca7cc1c705cdc +b5191bb105b60deb10466d8114d48fb95c4d72036164dd35939976e41406dff3ee3974c49f00391abfad51b695b3258c +b1b375353ed33c734f4a366d4afad77168c4809aff1b972a078fd2257036fd6b7a7edad569533abf71bc141144a14d62 +a94c502a9cdd38c0a0e0187de1637178ad4fa0763887f97cc5bdd55cb6a840cb68a60d7dbb7e4e0e51231f7d92addcff +8fe2082c1b410486a3e24481ae0630f28eb5b488e0bb2546af3492a3d9318c0d4c52db1407e8b9b1d1f23a7ffbaf260a +b73fe7aa2b73f9cae6001af589bf8a9e73ea2bb3bb01b46743e39390c08d8e1be5e85a3d562857a9c9b802b780c78e6d +8e347f51330ae62275441ccd60f5ac14e1a925a54ced8a51893d956acc26914df1bb8595385d240aa9b0e5ada7b520ea +8dc573d6357c0113b026a0191a5807dbe42dcd2e19772d14b2ca735e1e67c70e319ef571db1f2a20e62254ed7fb5bcd6 +a5dacbe51549fe412e64af100b8b5eba5ec2258cc2a7c27a34bc10177d1894baf8707886d2f2ef438f077596a07681e9 +8349153c64961d637a5ff56f49003cb24106de19a5bbcf674016a466bfbe0877f5d1e74ccb7c2920665ef90a437b1b7e +96ad35429d40a262fdc8f34b379f2e05a411057d7852c3d77b9c6c01359421c71ef8620f23854e0f5d231a1d037e3a0d +b52385e40af0ed16e31c2154d73d1517e10a01435489fc801fbea65b92b3866ab46dab38d2c25e5fb603b029ae727317 +8e801c7a3e8fa91d9c22ebd3e14a999023a7b5beea13ec0456f7845425d28c92452922ca35ec64012276acb3bbc93515 +a8630870297d415e9b709c7f42aa4a32210b602f03a3015410123f0988aea2688d8bcfc6d07dc3602884abbf6199b23f +8cd518392e09df2a3771a736f72c05af60efc030d62dbbb9cd68dc6cbbe1fb0854eb78b6ed38337010eb1bb44a5d5d30 +921aa4c66590f6c54bf2fa2b324f08cbe866329cc31f6e3477f97f73e1a1721d5eb50ed4eacc38051fe9eda76ba17632 +a37e595cb63524cb033c5540b6343c3a292569fc115e813979f63fe1a3c384b554cecc2cae76b510b640fe3a18800c81 +b0bb57e4e31ae3ce9f28cef158ed52dabfad5aa612f5fcc75b3f7f344b7cec56b989b5690dacd294e49c922d550ee36b +a3c618ce4d091e768c7295d37e3f9b11c44c37507ae1f89867441f564bf0108f67bf64b4cf45d73c2afc17a4dc8b2c68 +999e6650eda5455e474c22a8c7a3fd5b547ec2875dc3043077ad70c332f1ccd02135e7b524fcbf3621d386dec9e614fa +b018f080888dec3c2ca7fcfeb0d3d9984699b8435d8823079fc9e1af4ca44e257fbe8da2f6f641ee6152b5c7110e3e3c +a2bcd4bcd9b40c341e9bba76b86481842f408166c9a7159205726f0776dcb7f15a033079e7589699e9e94ce24b2a77fd +b03de48f024a520bb9c54985ca356fd087ca35ac1dd6e95168694d9dae653138c9755e18d5981946a080e32004e238fe +a6c1a54973c0c32a410092441e20594aa9aa3700513ed90c8854956e98894552944b0b7ee9edf6e62e487dc4565baa2f +845d7abf577c27c4c1fafc955dcad99a1f2b84b2c978cfe4bd3cd2a6185979491f3f3b0ec693818739ed9184aba52654 +9531bcfc0d3fcd4d7459484d15607d6e6181cee440ba6344b12a21daa62ff1153a4e9a0b5c3c33d373a0a56a7ad18025 +a0bbf49b2dd581be423a23e8939528ceaae7fb8c04b362066fe7d754ca2546304a2a90e6ac25cdf6396bf0096fae9781 +a1ec264c352e34ed2bf49681b4e294ffea7d763846be62b96b234d9a28905cdece4be310a56ec6a00fc0361d615b547c +87c575e85b5dfbfd215432cb355a86f69256fff5318e8fda457763ac513b53baa90499dc37574bdfad96b117f71cb45e +9972edfdeec56897bef4123385ee643a1b9dc24e522752b5a197ce6bd2e53d4b6b782b9d529ca50592ee65b60e4c9c3c +b8bcf8d4ab6ad37bdd6ad9913a1ba0aba160cb83d1d6f33a8524064a27ba74a33984cc64beeee9d834393c2636ff831a +83082b7ec5b224422d0ff036fbb89dc68918e6fde4077dfc0b8e2ee02595195ecadb60c9ab0ad69deb1bac9be75024fa +8b061fce6df6a0e5c486fd8d8809f6f3c93bd3378a537ff844970492384fb769d3845d0805edd7f0fcd19efabf32f197 +b9597e717bb53e6afae2278dbc45d98959c7a10c87c1001ed317414803b5f707f3c559be6784119d08f0c06547ec60b1 +b9d990fd7677dd80300714cfd09336e7748bbf26f4bb0597406fcb756d8828c33695743d7a3e3bd6ddf4f508149610ef +b45f7d2b00ceea3bf6131b230b5b401e13a6c63ba8d583a4795701226bf9eb5c88506f4a93219ac90ccbceef0bfd9d49 +a8ccaa13ca7986bc34e4a4f5e477b11ae91abb45c8f8bf44a1f5e839289681495aba3daa8fb987e321d439bbf00be789 +ae0f59f7a94288a0ead9a398fdd088c2f16cccb68624de4e77b70616a17ddf7406ca9dc88769dadeb5673ff9346d6006 +b28e965dcc08c07112ae3817e98f8d8b103a279ad7e1b7c3de59d9dbd14ab5a3e3266775a5b8bbf0868a14ae4ab110f1 +84751c1a945a6db3df997fcbde9d4fe824bc7ba51aa6cb572bb5a8f9561bef144c952198a783b0b5e06f9dd8aa421be8 +a83586db6d90ef7b4fa1cbda1de1df68ee0019f9328aded59b884329b616d888f300abb90e4964021334d6afdea058fd +8fcea1ce0abf212a56c145f0b8d47376730611e012b443b3d1563498299f55cbcbe8cbd02f10b78224818bb8cbbd9aaa +8d66c30a40c34f23bae0ea0999754d19c0eb84c6c0aa1b2cf7b0740a96f55dd44b8fee82b625e2dd6c3182c021340ac6 +92c9b35076e2998f1a0f720d5a507a602bd6bd9d44ffc29ede964044b17c710d24ce3c0b4a53c12195de93278f9ec83b +a37d213913aff0b792ee93da5d7e876f211e10a027883326d582ad7c41deebdfce52f86b57d07868918585908ebd070a +a03995b4c6863f80dd02ed0169b4f1609dc48174ec736de78be1cdff386648426d031f6d81d1d2a7f2c683b31e7628c0 +b08b628d481302aa68daf0fa31fd909064380d62d8ed23a49037cb38569058e4c16c80e600e84828d37a89a33c323d1f +a0ee2e2dd8e27661d7b607c61ac36f590909aa97f80bdfd5b42463ca147b610ac31a9f173cbecdd2260f0f9ea9e56033 +967162fba8b69ffce9679aac49214debb691c6d9f604effd6493ce551abacbe4c8cc2b0ccee6c9927c3d3cfbdcb0be11 +8deab0c5ed531ce99dadb98b8d37b3ff017f07438bc6d50840577f0f3b56be3e801181333b4e8a070135f9d82872b7f2 +b1bfa00ec8c9365b3d5b4d77a718cb3a66ed6b6cf1f5cf5c5565d3aa20f63d3c06bb13d47d2524e159debf81325ba623 +90109780e53aeacd540b9fe9fc9b88e83c73eaf3507e2b76edc67f97a656c06a8a9e1ec5bce58bfd98b59a6b9f81b89d +88a1009a39a40421fdcc0ffc3c78a4fbace96a4e53420b111218091223494e780a998ebecf5a0abd0243e1523df90b28 +90b77146711ee8d91b0346de40eca2823f4e4671a12dad486a8ec104c01ef5ee7ab9bd0398f35b02b8cb62917455f8b3 +b262c5e25f24ae7e0e321b66fdb73b3bf562ded566a2d6a0152cf8bafb56138d87b6a917a82f5ace65efc73cfc177d81 +ae65a438c7ea46c82925b5ec5f71314558ca5146f5d90311431d363cfeac0537223c02cbb50fa6535d72fc2d949f4482 +8984208bfc193a6ef4720cc9d40c17f4be2f14595ef887980f2e61fa6927f9d73c00220937013b46290963116cbe66ac +a8f33a580508f667fac866456dce5d9246562188ad0f568eb1a2f28cf9fd3452dd20dc613adb1d07a5542319a37ecf1a +aedadd705fc086d8d2b647c62e209e2d499624ab37c8b19af80229f85e64a6e608d9cd414cb95ae38cf147d80ec3f894 +ae28077a235cd959f37dc3daedc3706f7a7c2ffe324e695f2e65f454bf5a9fc27b10149a6268ebfaa961ad67bb9b75d7 +a234c7f5a5e0e30f2026d62657bd92d91a9907ec6a2177f91383f86abb919778121ff78afb8f52c473fe6fb731018b52 +816a2ea7826b778f559a815267b6c6eb588558391c0a675d61bb19470d87489ba6c1e2486ea81dd5420a42ee7c35a8de +9218b61948c14234f549c438105ae98367ef6b727ad185f17ad69a6965c044bb857c585b84d72ef4c5fb46962974eed7 +a628031217a0b1330b497351758cf72d90fb87d8bdf542ea32092e14ff32d5ef4ca700653794bb78514d4b0edfd7a8d7 +ab4e977141be639a78eb9ed17366f9642f9335873aca87cce2bae0dddc161621d0e23264a54a7395ae706d748c690ee9 +b1538c4edff59bcf5668557d994bac77d508c757e382512c4368c1ded4242a41f6200b73fe8809fb528a7a0c1fc96feb +965caabe5590e2ff8c9f1048bbdda2817e7a2847e287944bfab40d94cb48389441ac42ff3a7b559760bfab42ff82e1e0 +a64b7484d22c4b8047c7a8ef54dc88cb8d110c61ef28ba853821b61e87d318b2b4226f7f0d1f3cdf086a0e1666d0212c +8915ab7e41d974eef9a651b01c2521392e8899e6ab91c22aeee61605c78fb2b052399ba1d03473aa9cfb52d1a8ba4257 +8dd26875d4a1716db2f75a621d01e971983267770e2da92399aecf08f74af1f7e73643ac6f0a9b610eda54e5460f70ed +83dabcb84c9cbce67e1a24ecbfa4473766b9519588b22288edbaa29aca34cefd9884f7310e7771f8f7a7cbced2e7eea0 +956be00c67987fb4971afca261065a7f6fcef9fb6b1fcb1939f664bbc5b704223253ebfda48565624a68fb249742c2cf +a374824a24db1ab298bee759cee8d8260e0ac92cd1c196f896600fd57484a9f9be1912ded01203976ac4fab66c0e5091 +a225f2ed0de4e06c500876e68e0c58be49535885378584a1442aae2140c38d3ca35c1bc41936a3baf8a78e7ab516f790 +8e79c8de591a6c70e2ef2de35971888ab0ca6fd926fdb6e845fb4b63eb3831c5839f084201b951984f6d66a214b946b8 +91babc849a9e67ab40192342c3d0d6ce58798101cb85c9bd7fc0ac4509ffc17b5ea19e58045cf1ca09ec0dee0e18c8f9 +8b4897fc2aef5bbe0fa3c3015ca09fc9414fdb2315f54dbecc03b9ae3099be6c0767b636b007a804d8b248c56e670713 +8f63ba42e7459ea191a8ad18de0b90b151d5acbf4751e2c790e7d8328e82c20de518132d6290ff3c23d2601f21c1558e +a1a035dc9b936587a16665ea25646d0bb2322f81960d9b6468c3234c9137f7c2b1e4f0b9dbe59e290a418007b0e7a138 +81c4904c08f7bb2ac7b6d4ac4577f10dd98c318f35aac92fc31bab05eceb80a0556a7fc82614b8d95357af8a9c85a829 +8c40e44e5e8e65f61e0a01f79057e1cb29966cc5074de790ea9c60454b25d7ea2b04c3e5decb9f27f02a7f3d3cb7014f +ad8709e357094076eb1eb601539b7bcc37247a25fbc6ada5f74bb88b1b371917c2a733522190f076c44e9b8e2ae127fb +92d43cd82c943fd71b8700977244436c696df808c34d4633f0624700a3445f3ecc15b426c850f9fb60b9aa4708f2c7c0 +b2cb8080697d1524a6dcb640b25e7255ae2e560613dbd27beaa8c5fc5c8d2524b7e6edd6db7ad0bb8a4e2e2735d4a6f7 +971ca6393d9e312bfb5c33955f0325f34946d341ff7077151f0bcafd2e6cbd23e2ad62979454f107edc6a756a443e888 +b6a563f42866afcee0df6c6c2961c800c851aa962d04543541a3cedeb3a6a2a608c1d8391cf405428cd40254e59138f3 +986bd17bad9a8596f372a0185f7f9e0fb8de587cd078ae40f3cd1048305ba00954aff886b18d0d04640b718ea1f0d5a3 +ae32dbccfb7be8e9165f4e663b26f57c407f96750e0f3a5e8e27a7c0ca36bc89e925f64ddd116263be90ace4a27872c4 +83725445ec8916c7c2dd46899241a03cf23568ac63ae2d34de3bce6d2db0bc1cfd00055d850b644a059fb26c62ed3585 +a83f7e61c05b1c6797a36ad5ded01bf857a838147f088d33eb19a5f7652b88e55734e8e884d1d1103a50d4393dfcd7a8 +aa010b4ec76260d88855347df9eaf036911d5d178302063d6fd7ecad009e353162177f92240fe5a239acd1704d188a9d +a88f4ba3cf4aff68ec1e3ded24622d4f1b9812350f6670d2909ea59928eb1d2e8d66935634d218aeac6d1a0fc6cae893 +b819112b310b8372be40b2752c6f08426ef154b53ef2814ae7d67d58586d7023ffa29d6427a044a3b288e0c779866791 +b5d1e728de5daf68e63b0bb1dee5275edae203e53614edeeeefff0f2f7ac4281191a33b7811de83b7f68111361ef42e1 +953fb3ddc6f78045e53eaacfd83c5c769d32608b29391e05612e4e75725e54e82ad4960fbef96da8b2f35ba862968a3e +936471136fb2c1b3bb986a5207a225a8bf3b206a1a9db54dc3029e408e78c95bfb7539b67006d269c09df6354d7254ac +ac353364b413cae799b13d7dc6fa09c322b47e60b9333e06499155e22d913929b92a45a0ad04ba90b29358f7b792d864 +a0177419ead02ba3f0755a32eee3fd23ec81a13c01eab462f3b0af1e2dba42f81b47b2c8b1a90d8cec5a0afa371b7f11 +b009eeb5db80d4244c130e6e3280af120917bb6fcebac73255c09f3f0c9da3b2aa718cd92d3d40e6b50737dbd23461aa +b8a43426c3746c1a5445535338c6a10b65474b684a2c81cd2f4b8ebecc91a57e2e0687df4a40add015cd12e351bbb3eb +94ff3698a6ac6e7df222675a00279c0ea42925dc6b748e3e74a62ea5d1e3fd70d5ab2d0c20b83704d389dd3a6063cf1a +90e4142e7ce15266144153e21b9893d3e14b3b4d980e5c87ce615ecd27efac87d86fa90354307857f75d7ebaeffe79ef +a5fd82c3f509ec9a36d72ba204a16f905e1e329f75cfd18aaa14fb00a212d21f3fac17e1a8e3bc5691ab0d07f8ec3cd0 +962e6bfd75ea554f304a5fee1123e5bf2e048ccd3b401716b34c52740384579188ac98bc0d91269fc814de23f4b2dd34 +b50b4e45c180badf9cd842cd769f78f963e077a9a4c016098dc19b18210580ad271ae1ba86de7760dd2e1f299c13f6a0 +84cf08858d08eca6acc86158ffda3fbe920d1d5c04ac6f1fc677760e46e66599df697397373959acf319c31e47db115c +a697a38ba21caa66b7739ed0e74fe762a3da02144b67971fcad28c1132d7b83e0ac062cc71479f99e2219086d7d23374 +ad1f6d01dd7f0de814fe5fbb6f08c1190ff37f4a50754d7b6291fc547c0820506ea629aabacf749fec9c1bbfda22d2d0 +b11fd7f8c120d8a370a223a1adc053a31bef7454b5522b848dec82de5482308fc68fdaf479875b7a4bc3fc94e1ea30eb +93ecf90ebfc190f30086bcaeee18cda972073a8469cf42a3b19f8c1ec5419dff2d6a5cc8ef412ccd9725b0f0a5f38f88 +911f25aaa5260b56b3009fa5e1346a29f13a085cf8a61b36b2d851791f7bcf8456840eccbfc23797b63ecd312e2d5e12 +a52f17a8b2db66c98291020b1db44ab23827e1790e418e078d1316185df6aa9f78292f43a12cd47131bd4b521d134060 +9646fca10bf7401e91d9a49753c72f3ecb142f5ed13aba2c510a6c5ccb8d07b8e8d1581fc81321ad5e3996b6d81b5538 +aa1da4a5665b91b62dda7f71bb19c8e3f6f49cc079d94fcd07b3604a74547e8334efa5a202822d0078158056bbda2822 +a2432ae5feeaf38252c28aa491e92a68b47d5b4c6f44c1b3d7f3abc2f10b588f64a23c3357e742a0f5e4f216e7ca5827 +83c7b47735cd0ef80658a387f34f259940096ebb9464c67919b278db4109fea294d09ea01a371b79b332cff6777c116d +a740a2959e86e413c62d6bdd1bc27efe9596ee363c2460535eab89ba1715e808b658bd9581b894b5d5997132b0c9c85c +b76947237fa9d71c3bece0b4f7119d7f94d2162d0ced52f2eac4de92b41da5b72ad332db9f31ebb2df1c02f400a76481 +a20e1f2b7e9cc1443226d2b1a29696f627c83836116d64d2a5559d08b67e7e4efa9a849f5bb93a0dadb62450f5a9eaab +b44bff680fba52443a5b3bd25f69c5640006d544fca1d3dc11482ee8e03b4463aae59d1ec9d200aa6711ce72350580fb +a9490f5643bacec7e5adcda849ab3e7ff1f89026bf7597980b13a09887376f243158d0035e9d24fdee7cb6500e53ef29 +96081010b82c04ad0bfc3605df622db27c10a91494685ef2e6e1839c218b91cbb56e043e9a25c7b18c5ddee7c6769517 +a9522d59bcf887cbbbc130d8de3ff29a86df5d9343a918f5e52c65a28e4c33f6106ac4b48ecd849a33d39eeb2319d85b +aa5e0cea1a1db2283783788b4d77c09829563b75c503c154fdaa2247c9149918edac7737ef58c079e02dca7d8397b0eb +8c03f064e777d0c07c4f04c713a86bf581cc85155afe40e9065ead15139b47a50ead5c87ac032f01b142d63ff849758a +a34d672bf33def02ee7a63e6d6519676c052fa65ca91ed0fe5fdd785c231ba7af19f1e990fc33f5d1d17e75f6af270be +8680443393e8ac45a0b07c30a82ac18e67dcc8f20254bd5ede7bf99fc03e6123f2fcd64c0ca62f69d240f23acd777482 +a4e00ab43d8ae5b13a6190f8ef5395ec17fbac4aa7dfa25b33e81b7e7bf63a4c28910b3a7dc9204dbc4168b08575a75e +8249259066ee5672b422c1889ab5ed620bddd1297f70b4197c40bb736afba05d513b91d3a82ee030336c311d952cd60c +a0651d8cf34fa971bde1ec037158a229e8e9ad4b5ca6c4a41adedb6d306a7772634f703dcfac36f9daf17289f33c23fb +b02ff6e8abff19969e265395ceaf465f43e7f1c3c9cfc91f1748042d9c352b284e49515a58078c877a37ff6915ee8bf4 +927fb7351ac28254458a1a2ea7388e1fbd831fbc2feedb230818f73cc8c505b7ff61e150898ce1567fcb0d2c40881c7b +a9d3861f72090bc61382a81286bb71af93cdeefab9a83b3c59537ad21810104e0e054859eeafa13be10f8027b6fc33b8 +a523306656730b1a31b9a370c45224b08baf45773d62952a0bf7d6c4684898ae78914cfafbd3e21406407cc39e12afdc +947a090e7703a3ea303a4a09b3ab6b6d3fda72912c9f42cc37627557028b4667f5398a6d64b9281fa2efbe16f6c61ed6 +b41d24d40c10239c85d5b9bf1a3886d514a7a06b31ca982ea983e37162293350b12428eabc9f6a460473ad811e61ba40 +b0bb9805724f4ca860e687985c0dc6b8f9017fe71147e5383cfbbbdcb2a42c93c7062ba42acdead9d992b6f48fc1d5ac +aec775aa97a78851893d3c5c209a91267f1daf4205bfb719c44a9ed2614d71854b95bb523cd04a7f818a4a70aa27d8fc +b53e52e32ca90b38987610585ad5b77ecd584bd22c55af7d7c9edf5fbcae9c9241b55200b51eaed0fbdb6f7be356368f +a2c5ac7822c2529f0201717b4922fb30fb037540ab222c97f0cdac341d09ccb1415e7908288fabef60177c0643ed21bf +92162fda0cbd1dafbed9419ae0837e470451403231ee086b49a21d20de2e3eed7ce64382153272b02cf099106688af70 +8452d5df66682396718a76f219a9333a3559231e5f7f109a1f25c1970eb7c3408a5e32a479357f148af63b7a1d352451 +831ea95d4feb520994bc4904017a557797e7ad455a431d94de03b873a57b24b127fcc9ff5b97c255c6c8d8e18c5c7e12 +93d451d5e0885ccdbb113a267c31701e7c3d9e823d735dc9dfd6cfdcd82767012dc71396af53d3bedd2e0d9210acf57f +a2126f75a768dcc7ebddf2452aebf20ad790c844442b78e4027c0b511a054c27efb987550fcab877c46f2c7be4883ae0 +aa4d2dcba2ccfc11a002639c30af6beb35e33745ecbab0627cf0f200fdae580e42d5a8569a9c971044405dfdafed4887 +ab13616069ef71d308e8bf6724e13737dc98b06a8f2d2631284429787d25d43c04b584793256ed358234e7cd9ad37d1f +9115ee0edc9f96a10edcafeb9771c74321106e7f74e48652df96e7ca5592a2f448659939291ff613dd41f42170b600ad +97b10a37243dc897ccc143da8c27e53ccc31f68220bffd344835729942bb5905ae16f71ccaed29ca189432d1c2cc09b1 +875cf9c71ae29c3bde8cdcb9af5c7aca468fbb9243718f2b946e49314221a664959140c1ebc8622e4ed0ba81526302fd +86b193afbb7ff135ce5fc7eb0ee838a22e04806ceec7e02b3fb010e938fff733fc8e3a1d4b6cba970852d6307018b738 +b3403a94f1483edce5d688e5ed4ab67933430ede39cd57e2cddb4b469479018757d37dd2687f7182b202967da12a6c16 +83edfa0a6f77974c4047b03d7930e10251e939624afa2dcafbd35a9523c6bf684e1bb7915fc2e5b3ded3e6dc78daacf2 +88ff3375fe33942e6d534f76ed0f1dfa35ae1d62c97c84e85f884da76092a83ecd08454096c83c3c67fac4cd966673d7 +af0726a2a92ee12a9411db66333c347e1a634c0ab8709cc0eab5043a2f4afac08a7ae3a15ce37f5042548c6764ae4cf6 +81cfa33bb702e2f26169a006af0af0dcaa849cec2faf0f4784a06aa3c232d85a85b8123d49a1555cca7498d65e0317e4 +910a16526176b6e01eb8fb2033ffbb8c9b48be6e65f4c52c582909681805b3d9e1c28e3b421be9b9829b32175b8d4d80 +93d23befa411ca1adbdba726f762f2403e1cc740e44c9af3e895962e4047c2782ca7f2f9878512c37afd5a5a0abbd259 +82fcf316027fedfe235905588b7651b41e703836f96cb7ac313b23b4e6c134bff39cd10b3bddb7458d418d2b9b3c471b +8febc47c5752c513c4e5573428ad0bb40e15a5e12dbfa4c1ef29453f0588f0b75c3591075fef698e5abcf4d50c818a27 +83dab521d58b976dcea1576a8e2808dfaea9fa3e545902d0e0ce184d02dca8245d549134a238ab757950ad8bc11f56eb +898cfb9bf83c1c424eca817e8d0b99f5e482865070167adab0ecf04f3deeb3c71363b9f155c67b84d5e286c28238bef8 +b845e388cc1a8e8b72a24d48219ac4fd7868ee5e30960f7074b27dada842aa206889122acfce9e28512038547b428225 +b1ce4720e07e6eecc2a652f9edbad6bd5d787fbaff2a72a5ca33fa5a054dd3b4d5952563bc6db6d1ce1757a578bba480 +8db6990dd10741cf5de36e47726d76a12ebe2235fdcb8957ab26dba9466e6707d4a795d4e12ec7400d961bd564bdee7e +a3ca7afd20e16c2a45f73fc36357763847ed0be11cb05bfd9722f92c7ba3fa708cf10d4e0ae726c3eccae23cc55fd2be +8701b085c45b36f3afb589207bbf245ef4c5c82aa967ecd0c334daa1f5a54093c5e0fcacd09be540801920f49766aa0f +84e3736727ba76191d9a6a2a3796f55bb3c3a8bbb6e41f58e892ea282c90530b53ab5490bbf1a066723399bb132160fb +87c02a01917333c7b8866f6b717b1e727b279894108f70574d1b6e9e8dc978eda8778342baf3c6464d6e0dd507163e76 +b8da532dac81fafaed759e99c3ae011d75f3fda67a8c420c3b9747281fe32e31ac3c81e539940286440704c2c3e3b53e +a0cc63c3bef75a5c02942977a68a88cd3d103d829b6c0f070f64206da7e3638f10f42452788092de8fbbc626ce17b0d4 +b5c9317b3f6b1d7ee6871506c0430cdf73e28b02c001ba6ca11061c7e121c91152d2b80c4f80e1d8f51ff5653bc0db5b +b798fb572da977dd3ef2dce64042b012a470d6bd2cb61a16267abe2b8399f74540d7c70462a6b2278d73567447e31994 +b868eda58739effda68c834745cd2cf66a09f0f215607b65685bb5ca3eba71150f43a6e47b81a0c19fb58eeae3da56e8 +9041c93a7e8f2c34812fd6e9744b154e898e1ef69db72bf36242c71e2c251f3db7e86cbd802da603a92cd0b06b62ea63 +a834d648e974230582fc17b3a449f4f65b3297038a3a5401e975b9b60ff79b2006a33e1486d3428106580276993311e1 +a3ce874da6ade9f0f854d7ae7651fc3ff63cec748a847527539fe0d67e6c99eaa3011065a4627c2192af7f9569f7ab57 +ae78ad16de150cc0400d3b6b424c608cd2b2d01a7a38ea9c4e504d8463c0af09613774dbefdd5198415b29904e0fbb63 +b966db5a961067e743212d564595ef534e71dcd79b690a5a2c642d787059fc7959b9039b650372461a1f52910f7e857b +8069904f360af3edfd6cabd9b7f2adf5b61bd7feb0e9a040dc15c2a9d20052c3e5e0158f3065ec3200d19b91db603b71 +9600917dbcd80a47f81c02c3aafecfcef77f031bf612a0f1a8bdef09de9656f4bb0f8e3e95f72ece1c22bd2824f145b6 +834a0767b7b6199496c1faee0e3580c233cc0763e71eebc5d7c112a5a5e5bd95c0cf76a32ea5bb1b74f3cf00fbd2cfb4 +99469a893579ed5da7d34ec228854c4666c58115d3cae86d4fc2d03d38f10d8c5dc8fb693763a96ab6be2045cc8d518b +a52cc0aecda6594de57d8ca13b146e77212cc55854929c03f2a8a6cdfa46296791c336aebcc2610d98612d5b4c0452df +97864434d55aa8a7aad0415d36f9558ce6e6c00452923db68a1e738232d0cb2d47e3b0b8f340c709112838adeaee4695 +a4a7f2c45db3661b6af7ec759f9455ba043b0de6fd4787e3372cba215b9f7c641d5d817a0576e7aa28a46349d2fe0ae6 +864e857652d95e1d168c1b9c294777fc9251a4d5b4b00a346b1f1c9c898af9a9b5ec0ac1f3a66f18a370b721dbd77b23 +ab8eac458fa8e7eb5539da3964ccd297a216448c3af4e4af0dcfed0ce29e877a85e29b9601dc7508a060b97a05f37e15 +a6fd0782c5629c824fcd89ac80e81d95b97d8374c82010a1c69f30cef16ffc0f19e5da2d0648d2a36a636071cb4b69a7 +ad35a75fd8832643989d51d94ee6462d729e15f6444ffdf340dfb222af5d2b6b52e5df86082dbc7728fde7c1f28ac6b4 +8e06831cc8a0c34245732ea610ea6aae6d02950299aa071a1b3df43b474e5baee815648784718b63acfd02a6655e8ea7 +994ac097f913a4ce2a65236339fe523888ee43494499c5abf4ac3bce3e4b090f45d9abd750f4142a9f8f800a0115488c +a3e6a8e5e924f3a4f93e43f3f5aafb8b5831ce8169cddde7296c319d8964a0b6322a0aa69e1da1778fcc24b7de9d8b93 +81a9bd04f4c6e75517de4b5e2713f746bd7f3f78a81a2d95adc87ba0e266d1f5e89c9cfb04b5159c1ff813f7968a27a4 +b24de8f3a5b480981c6f29607b257ded665ecd8db73e2a69a32fcf44e926fdc7e6610598e10081cf270d2f879414b1ab +adc1b3f8ed1e7d5a26b0959ffe5afc19e235028b94cb7f364f6e57b6bf7f04742986f923fae9bf3802d163d4d0ebc519 +a9fa5092b6dd0b4e1a338a06900b790abbc25e2f867b9fb319fdcdfb58600315a45a49584c614f0f9f8b844aa59dd785 +b29c06b92b14215e7ef4120562893351ae8bf97cc5c3d64f4ecd0eb365b0e464cf27beec3f3ddac17ed5e725706b6343 +adc0d532ba4c1c033da92ba31aa83c64054de79508d06ee335dcab5cabae204a05e427f6f8c2a556870a8230b4115fd0 +9737150d439e6db2471d51e006891d9687593af4e38ee8e38bfa626abcefa768ca22d39133f865d0a25b8bbf7443d7db +a10d1e6a760f54d26c923c773b963534e5c2c0826c0a7462db2ea2c34d82890f9c58f0150db00aa2679aa0fdb1afcb08 +816947dc6c08ee779e9c2229d73dbfd42c2b3b6749b98ec76dbad017f4b4d4f77b5916600b576691978287208c025d6f +a2dc52b6056219d999f07b11869c254e8b3977113fd9ba1a7f322377a5d20e16c2adf46efb7d8149e94989b3f063334a +8153900aae9cf48ebc7438b75c16f5478960ef9170e251708f0c2457967b7b31521c889b5fe843d2694a07c0e804fa48 +a9e9d8d66c8774972cc1686809ce1fa5f0e16997ef2178b49bcd8654541b5b6e234cb55188f071477ba1cebcf770da45 +b1fa775f9b2a9b05b4b1f0d6ad5635c7d7f4d3af8abaa01e28d32b62684f9921197ba040777711836bc78429bf339977 +b1afbbd522b30e1ae2adf9a22993ab28b72a86a3d68d67b1833115e513632db075d047e21dfe442d6facc7b0a1b856bf +8779b7d22f42845a06ae31ac434e0044f5f9b4e704847fb93943e118e642a8b21265505ad9d6e418405d0cb529e00691 +ab2c6cef1c4e7c410e9e8deb74c84bedeb3c454ae98e3bc228eb13f6b7081b57977b3e849ba66346250e37c86842c10c +908d6c781d7d96aa2048c83e865896c720a66fdec7b06ab4b172192fe82f9ff6167815ffb66549d72bfb540bb35c36c6 +b790440f205ece489e2703d5d1d01ba8921dd237c8814afb5cb521515ed4c3b0a6df45fd4bd65ba63592c2fe1d008df3 +aec346251f9c78336b388c4e9069a1c6c3afbbb6bfaffdad050a9e70e92fb3cae3609067b4903552936f904c804b0ea6 +a0e528cc2cb84b04cc91b4084e53ead4188682a6050b3857c34280899c8233aa8c1a9c6fa4fd6a7087acf1b36d67734a +aa8d7632be3e4340712a1461a0ad0ae90ba6d76e2916511c263f484c6c426939fa93ffbb702cd0341eea404d6ddffebb +a4ea871d8a1d4b925d890aefb9897847599b92e15ce14886b27ce5c879daa9edead26e02ccc33fcf37f40ff0783d4d9e +ab63e4dc0dbdaf2ada03b3733aafe17e719d028b30dc9a7e5783c80933a39935dbe1ef0320bb03f9564cafdf7a4b029b +8219761bbaa39b96b835f9c2b4cec0bf53801f8e4f4a4498d19638be2fa0a193b2c1fbf94e26c1058d90a9ac145a7a12 +a609ee5561828b0f634640c68a98da47cb872b714df7302ef6b24d253211e770acd0aa888802cd378e7fa036d829cd36 +90793ff0736f3c80b5e0c5098b56cda8b0b2bca5032bb153d7b3aa3def277f2fc6cea60ac03edc82e3a9d06aff7d1c56 +8760085283a479d15a72429971a0a5b885609fd61787a40adb3d3d7c139b97497aa6bcb11b08979e2354f1bc4dbf7a0d +b168ede8b9a528c60666057f746530fc52327546872dd03c8903f827d02c8313e58c38791fb46e154d4247ea4b859473 +842c1149ca212736ebe7b6b2cb9a7c3b81ae893393c20a2f1a8c8bfef16d0a473ff865a1c130d90cc3626045f9088100 +b41d0e2c7d55108a8526aa0b951a5c8d7e3734e22fe0a6a2dd25361a5d6dea45c4ab4a71440b582a2f9337940238fe20 +8380bd49677e61123506dd482cdf76a8f1877ea54ed023d1deabfc05846103cfd213de2aef331cdf1baf69cfc6767be9 +a026f92030666b723d937f507e5a40e3f3cfd414ad4b2712db0a7a245a31a46002504974ed8ba9d8e714f37353926a4e +b492e9e9917b29eb04cde0b012df15cbd04f3963d120b63c55dc4369e04f5ac7682b2c7dff8c03410936c26ca73ad34c +81fd9271b4ee36be0ba8f560d191e1b6616dd53c56d1d8deac8c1be7bc67bbc53d434cf70d04e7fa9de3e63415389693 +835c3711abe85683d2344a3ee5f70e68342fd1aec025ad248efe66aab3e3d5790fad2f45bae0d7a53a80998fde45f0aa +b46599be80b8f7dbad0b17808dd5ca91d787929c0bef96fbbcf6c767727d07ed6785bad164d733ecb015eb6c8469a16d +b36bf5c17271d39f5ccb3d82a5e002957207a0cdf9ae7108a4946e6f3ed21a5d353fa940b6fe949c39422b452339bae9 +a12f5444e602d6fb8be51a08b8bc4ec105dfd759d2afe98d51ff4edd673c92e4fc91ff32417ae8070e12169004f8aad3 +892ce3ca0a2961a01f7f0149b8a98fdc0f8871c2d85e76daf7c8aed2a18624b978a4d0a84213f81f9d2a81f7ca4826d0 +b1e6229ebd5b3d85e62d0474d1fed34564f1b5b9c5856fae36164dd0eff378d67d6717dda77536379006fb462bced9da +ac852921dcb81e54e1e315fd6226219932f7b785c2ceb2035710e814899784d7001101f1515d68e3fb74cdbb4baf9e26 +989a42d851123d708a213f3a02cfc926df15af058ec9b5a9df968fe16decbd781b5e65a4c17fbfedd2ac17126084700f +b1d0fc2f7c948e466445f307da7b64b3070057c79c07c7ebbbe6f8ed300a642b3567aed2e5f28988ac566ba62e0d2a79 +83057263b41775bc29f1d59868a05b0f76d3bdf8a13c1014496feb4c0ee379bfd0d4079785252f51fbeb641e47a89b69 +ac9e6a208aa9c557155cf82b389bb4227db5ac4b22a0c7c8d1c3d98946df8b82b0c49d093ba55c8255e024a6d67c14b4 +8294a11cd3f5111b1f8bd135be23b4de337ac45711db9566ebf6e162cd58e7859b1309eba8149b0f0a43e07f62a92411 +8c15f3388b196603c05adec195c1d2cc589e3466da3169e9afd37157fa55cd34bfafbfc5ff10ac0e04aa6a0d0b2ce3db +b8faf8ba89c3115576ab6b340f6cc09edfea8f7331f5a5e8003960c584e839fcecf401113dfbb9a5c11a13721b35c263 +955c63b1166514c02847402d0e92dccfe3c0dee3bc70d2375669afb061594c85651e6569f471a6969759e5f373277da4 +963bd4f9ae7361d6936d209592a07d9a22cc9ef330cf0c5cb845cb4085d76e114aee66d7599bf5b9f11c6b1c05dade8d +85509b3c97e06e0db113b8b40022c8989a305cec39acab36ba3a73a4b4719573e5bdb82dc4795699c26d983465cd61b0 +b870cfd7f691f88db8d1dfbe809b7b402eabd3b3299606b7dfdb7ef49415411f01d2a7e4f7ebd919ac82c7094f628166 +a5533e7b58a6a9e5c25589134f501584163551247d36f50666eeb0a0745cf33e65bb8f7a9c2dc7fe7cb392414f1ece4a +b93d1ade01ff5678fcd5b5b4f06a32b706213748076cae3a375e20a97231133ec37c1c3202cbc4896b66c3410210f446 +86ed3a58000a46fe2c37d4de515430a57d8f54ab4300294685534372fed1d68e192dd43d43ea190accf3dc9b22e1548b +a8c7d8dc30057bb8ad66b9cfda5e223334407730aeb0f51705922c18e7a07d960c470d463d1781899203e1b1ed1df484 +8d86821d006e957e8544f95a98b110c89941bcc6985562e7a97285f5826b35b690963b2c141ff3f389d92ee18ec76d24 +a4e1108cd3cf01810e74dbbf94340487011b80013b9bfdc04f019188c0d4d077a54b71a3f97a036601aad42a268531e8 +a822cd61db07f64bea00de226102f5fc0adf8fa9f05a6c7478b0ff93e48f6cc3191302d22e1f369b571877d5eb96139c +b1ad4094d0bb4c325dfe072b17711962247dd7ff7e4bce4612e80a6f3c1bde04880ba1682f60d5f1451318afd4d3ba60 +88e7beb0cfd7361288ea27f6b2cb18870e621152ff47994440c18d45284d21bad80d9806ed7d9d392a5cd791d5150ce2 +aad3724a176cf4476595cdfb9e2c3261c37052324c0b5373a30b6cbeb481bccd303720840c49a84ddca916d470eb6929 +a57983370d159e7078a273746fb22468000a6448b1a31d277272e35c6f548f97928e9015f1daf577511bd9cfee165237 +a54136e9db381cdd6dfb3fff8bdec427d4dc1072f914f6fecfec13d7b8f95bb3b5f30ad7677288c008ce134edfb039a7 +a25dfc4019f165db552f769f9c8e94fa7dbbf5c54a9b7cde76629cc08808c1039ecbd916560c2b6307696dd9db87d030 +a917d25328b0754d70f36e795fe928e71ae77e93166c5e4788716c1ef431115c966f2aad0ce016f4bacc2649f7466647 +842ce5e4ad7d8d4b8c58430e97ff40a9fce1f1c65ecba75fed2e215e101d1b2d7ab32c18df38dab722c329ab724e8866 +a8eb2ed2986ff937a26a72699eb3b87ef88119179719ff1335f53094c690020123f27e44fc6b09f7a3874bf739b97629 +96753c1f9c226f626122dad6981e9810a3cf3bbee15cfc88e617cfd42753e34593610861be147a7b8966bcdec55bba8d +94119d31606098f5b129931b51b4b42c4e3513a128b9bfb03cfeee78b77b9909b1c2fcf0a292e49d63bc4e5fe823dfef +a869654f5880d9c21a0af1ff4cfa926e03ec1f2d80fe5524605e04f484e09dc80d6769249f31fd378ff3926ab4cebc69 +b2a539bdd8de4499c5f35cd8824974c2abb1933b3f50d0175dd044563ca829eaa0fc47bdac97eafa98434d1cd05d7c5d +85f53b2bfcde1986ce7279f3a2f5f841f87d75af5d197c897f261d4874bc6868c575ecf7556a32b7b33f7b2795454591 +964f087ed02228b30f401d8aea35c1a7f76698e4075e1bb343398be74c716884e9ca1a31b81566e1ff7513cf76a2f0cd +a1c9d9c9bfbc9c4e281a2953d5991e7b22ff1a32ddaace9e8d9a42e080efb802b853d3276973b5189a5745943c9b4389 +b0c45a9852663a427d7f50c608a6419fbd00f90e8452757a45269d25c0386ec29942f48a34aafc0187ef6020e581d290 +aa3ca7b01862d5d2aea714fa06724b7dda7062b6608605cb712588b2c49fc3c7d89a8799e6e7c31e7a9ef28b1ad4d1f7 +88f5e98ae8c5ae7add42f6d358a35667e590aa80e1869593cbf597d7ee466efa35b429f1836ba2199d8280fe7f60ce3a +8a3bff472e8008f7e50362acc1a0b53c09ac60430942544532722e938470376f0672662261992146765b7c75a380c318 +b9847be7f7aee7532282c279dde928698a892a183ca3047ceda521e9e0a50d96fd3ce59f8e58f31af49508ade6d4ba51 +98065dc23ea3df6d9f8459e81887d88d5752b7e7ba6050ec5c3f0dce93e463e0bf12be3c94ec74c16e2f7ba62e447845 +994aff677b97ee790894dbdb21b1f9210734e008cee2aa2200c8f2579ea650b872f39776a13a8c31e95cc817091bae1c +b292811674e18912ebe79df1af4a132b04ab702c125c039e0213f735f658fafd36c38e5bbd7cad35842576431f5f3630 +96520d750ec10bb10f75019f8f0e4a93ecbc6b678a710d76cd10aa27a6642ad1461bd58fc2aab8e0391b3f788339ed29 +80d478da7fe246ad0e81a00141229e9d91ffb7fd1b29975c8ec358ed5e864e481bf01b927a9ba002c5ec4aa226d0cb57 +ae58049d93a11ae845dc5be2505e95657f83b95d83ff3591a3c565d587157be795ff4481f42d59eda95e6d523444e199 +85f1f5ad988b9f8a7e24b6d6a22b9de9fb3fe408f95711389c444d7ba2243987225b04318aa97a4cde2cb4c30c05508f +922092d0cb828e764ce62f86cbc55c04dce07233cff041888fae48cfe93818780b4aec9b4ff4718275bb2bfa6bd9e9ba +a85ba97125feff0590a05fb78f19a7338639ad1748802918af4d59307bc994536c0ad638b97b9acd26a08b6b4370dfbf +8c46fcaa8d13266d650bd9366180e5ebbfa002c339e4424a030de19ed922e2daa9a353ae54921a42299607ae53feb075 +b8549832230eb1ec6ee3c33c078deb47f556a0907d2a85fde7720391c82d2ed63dd753cf544a6a0a46eed4b8d1ecd9b8 +b7b96f24504c7f8fbed9c1c654a2550feeee068407b809c43f1082c9558c8665806d911d5d244308169d8a531373bf56 +81c483fd9d9ad7af7869d617ac592e7e951e39738da041d8c4110637689108eb29c8acadfc85366c70885cdf77b353c3 +acf33bcfd9080dfdba828727fe36803327a94e8a3ee5b6e445274f0e8267ad3c943994a8dd6d09b8072912b57e1e25b8 +b3475e7456ff96861bc11068198d51b69b899f5ff13022694b501d3adc8bac58a16204b12011d61e880c8459f4badbbb +8ceb9562026aa96d6e786ec2e5cd49200b5b424349a2214cd3ff5c8f1c2bf1b9872480428f5428e45cc61106cbfbd953 +af56f7e482c24a1367fd798201a20c464848ece431f2d8a31a6ef4f9bdbaa50991e748dcb4ef0c08fdac0ef8ddda3b80 +896dae8b12549909d512fd5c02a2f72dde4086aef6c8007ddb26bb04dff51a707ae94ff87e45191fc10339967fa28958 +8ed1c606840e07a2ac6ff16ac6e81ed3e1c90872ababfe68d56ed2dc50d9294579b9c3546dc63292874299a3162d59f9 +b4d7a5c0836e419a46942281ce77d0aade8e39eb1bf1190dd274ca5070898a1c02ad9d165855629d6e1c96df1a6bd5f3 +aebad8939ac117deb28b789d9846c2c80359dc260920ac8408dbae0b6228dbf496dac0023a3b4302bb9a53e8ada18e61 +812d07c74a8650dc3f318c9b2dbf265f181041fb432fee989cedabd44b933dc6590e36c71dcf9dbe7b4bbf74ea0d7c50 +87b131dd3489889e090839c392231e0ee198acac65bb2e9e63e7d6da322391d1685cfc8ba60699308054c4b0fd89c90c +8b12110ece0b99b2e653b4bc840a12bce5b85abf6fb953a2b23483b15b732a0068824f25fcaa100900e742886c7b4a0d +8765fc9b526a98512e5264c877bdca567e32fdcde95cdbcf4f4c88ce8501e1c7fab755f80b87b9b32d86d18856f1d005 +ac806a32a14019337dfdb5f781ecba5cdea8fb69b23e0e57a0f885e0082a9c330ba808621a48e24316604f6c6c550991 +a711970fa40cf067c73e3edee9a111bf00cd927112205e9d36a21897529be9a051be45c336d6b56725dca3aeea0aed15 +908adbc17fc18821f217d46c25656de811d4473779a41eacd70d2a0d7dd3010de4268a562378814e619e13ac594bb0c3 +894251b79be5ae763f44853f6999289b3a9abda64d52797c6c7d6d31ff2a79e9b3906da72f9ebb95b61d6b29479e076f +aadcf11ea15bcb6d979c3ea320cff8dfcc23c5118ed075f35e77f71459b2141253060e3a90839adbcd3d040ad3bdc5e2 +b4e55d7d2eeaaffb0267448ecce0b75166e4805dc0e261eb5634d4a3f3c08964a597302fd8f6b45ec48178619291dadc +a8e2a02c93d6bec7f42f9265269660b4b404940c3e3de9515b4d826ea7e71f18c6f90a71ce3fbe452d0713de73cb391e +8e2467accfe207cb1ba37d60662920f95338ee212927edb706228c25345734217740159310edf17687f58b333754cb65 +90376b88f653381b3bab673c48c2b84fa82a091e18f710a732fef836e0d39043fcd5527aa97a3a385c0a77cf53746993 +b16530e289198c235ab680f86851bcc177f0c16a58483d83a89213077b06d6840600b03834b6b7af0e22b1914f72de43 +8c4fc3854f938ef1c2b5df065e4e75e9f299798afae8205706439491bdf9784c756134922e77af007e349a790afa52b7 +a68aaec4341d29b92b35322f89b1ae3612e7b440c89a86135a07c261dc5799217a651460c92113d099b486817226d8cd +a653f965feefd2df24156478f0cf3755274ca395afb79e8c72d3b6e1d1f5ba7f3e4f9a4c5ee85355de6f3c81935ff579 +aaf6c8d2717b57f6b14e06c742a11a3bc736bfc0327ca4b8a005b6e924f06871141d231737698a9a59286e44f244a168 +8de32e3c104b4278e27aac695d224f134001c3619f15186466c57c0c46f67e2efe537501d0d9f52f4cdbc724a170b92d +8e9b5858b6d4ffe811f6498bd80e454f0d6b345d4729c946626c7cdc196c803a349a14515296aadb7258bb7a5b37e930 +82fc711043aaf1d7a9c712d00eafd816a710f82eb10818ba6af09f591447f36814dbff6e6a1cb2b5c7f16c73930dbbca +b2f0205327fc8ff687f751e7b97788732afaef4fcf51bb17fd7579ed07501915790b70fc36624371fe4fb87a0179d850 +add87d5b1288d30f3449d3ccfa11cba4dc7756d85cee1cb6171b493680a625a01f273d0bb8e6332d0410250036b3acdd +a411f75ef7dd8de8062331ea40929db989e4d65ae8f33d3fa6cc19c98fa8a8ec2b7c7534a5c5eee9e5051626a6a2e47c +89d40a647781e7f2e8ab3a0f7dc7133669944c0cf627376433687a2ea15c137be26f582a6b07ff94b266ac0910009f7c +b2b5f808c26b40ed507922ed119b0fb95e0d6d8b084bbbba58ca456b4354d03110c99989b93207998334ea5d1b70fe49 +8c8db028671969a1e80e595283ce5e678ee955d785043bb5fd39fdb68a00e4c15b462600a7ab1f41486b6883e725894e +958087ce0c75fe77b71770c2f645ef3360c1a9c98637693b988c5f6ce731f72b24ab8b734e8eb6258ee8b23914451f0d +aad6c00df131c1eec6c556bae642e6dcc031e70f63eee18682f711c7b2fcd9afbf1f18cf8a4af562759130add67bd4a3 +b6d23c567291f019cd9008e727704e7e6679b274feb29abba0d92e036f349b1f0fa8c5271ec7384e8d70a2c3977b1f8a +a942c770e903d4150b5684e4b94bb72d0e171df2c7cae6f46e002c41c6b04d774ac6e2753ba8dccdbba3ad1e297a9ae5 +aa542d1849390f86d797408ed7f6a31504aa65d583481a00e475028af20f8b69248a87a8ffab1dace0377db77fe5f9b2 +a1ed3f9564a97f7cabe7c67e018eaeaa42db73a2f3d2332041ca9a7bea57436d848784d6dc402862c22a47f0692b1286 +925c757750c91db8b1b3c220fcbdd80742b4a060abfb0a402071d215c780ef6b420132ec5a43043b9fd7a06bf1b323db +94e575daa7fa0bbb35b4386f510fc3877c9df57bcf15349c5923f30ad6a8df95372835cc078216b41a7192921c1e8973 +9346a41174865d9ab31c7fb9a5329f322bfce06002386d3f5a2e2193de9bfff12bd0bd93307928f7b85e1097b2aaddff +a6e54c9324baa1bff7e9bf39c94fdd308ec6f210aad937112ec727565f8a6141375c04196831873bf506294854f6a20e +98d47b662504f400f1a0e14e24b43829490d022ade02a56288aaf148d466b45d89b5fc146cef67c9ba548cd37ad5e354 +ab690dd59a69904b6b3a4d5a42d17ea4898d9b00c6753aec216d5d4ea564f9a1642697df44d5a62f2c2ab19aaabf1532 +8d0aa8d3c5ec944af49beb99e403cc0d6d1adc6003b960075358a4ff1cbfa02a83d6cb4d848d9e83b34882446a330883 +af9334b7300780c752f32eaa68f3dcecd07dc50d265083f37f9800b02c2595ba24dab89f5fc27c1ecfdbf5291b4d77bc +81c4a6aaf7d4ccee9925c512dae5da6d916a6dd59f7a4cc79d216a91201b4d300114a309e3ddb3291bb95f85bec2a8ea +8c804e810c0785789de26e12b1beff56a163769733be7a31f34f81093782d6410293768a166c9191ef8636fc8724a31e +a91222b48de238f6dfe79c84080cee618611bd0bdca15cfe44474829e42481f8511a82589e69964e19f8cba04e3f5f3f +b26a8885aa594b0c8ad4a1711d80bcf687df996442075dd1497db1b446d16c74e28bc6f0e92b2ecea9c3e15c9c7e828a +85940f45d324ad1d335bd1d7d6f81758f52213e63d5770d9fe0c0c9507d5550795e538b6a2dd463f73d789b5ce377aed +931a277c78082f416880620df3aeb6d0bff2103d19679dd092ea981f5323e438c50a0d094908034ff8a2cb47b1a44108 +88dd85e4e2aa349a757b98661fc00d4538ec1d3f53daf44b16ffcf7f943dd4f2bba5b8ba3b05c529251dfeed73f6f1e9 +b7fd7182cd33639710b8216c54a11bb02e199bbc54fe33492a809dbe17771a685d6238ea3ebcfc75e3b0d4ea5369bc9f +85d77194d910f8cdad7330e1bca9087529a40fece17492f1d17cc4790833891b6d01d24f036b6422175c732b438faeb5 +9845265892d672d9517fbd22f88be4f225711b4abafa8327cc059f000656e4737188506051565d97912a0c19c3d063c0 +90a81987aa841c7f640c298b816643a0ae00cd3609c3a31d0b01245283cc785d9bb27763131b31a4f21aeda4e50073e8 +8b1256eb41a600bda8a06ac08b98a220ebfd52f89a0e4fdce32425db7a0481e9b7873ba3b7a24ad9fb782ee217dfdbf6 +870548998deed85c59507cec7e69cc001c279bb2a99c45a4d030a35c107e69feb76afecb9e435e67965051d6d7a88220 +b1504d194a0dd8df48d431ce991f89d7a0f72f573d21bd5bb46474c5005e43820877a44e62db555f194427ac8a4b9168 +a00d7423ec2cf0c9e9da07f3dae092d09e1ff4be852e07e531aa54d62ad937bfb52c8bf44683ac3a70f6dfc125575da1 +8019625ad3d218018803aacc2efcedba3a41c24aca8c5aab2005556e58fdf2ed614831277df7937aa594e97a2fc65e7d +8595596284f3add0155ecfee3fc0b66a6b6fc7923d82ca8302952e2ed906d119a1c053aed1123b51f73e1d30d93aba57 +a8ba033f5e7d06177e9ae2d99c40ed4e99e14e1c1b61795997f62e21ed8af1531c4720f23d6a39b0f75c6cd91c58c700 +a94f4167c0f6ae214bae75dd92c63299dd954b00b0d8b0416b8af929fe5aec6a259e44f83a183412d7ba4eb3a49728c0 +a73ee3c3a0fd2a369e0a279c3e214fb662d0378eea3c95cfb91412d7213a1f05958bd0de8f2a4f80f9f80d7eef943b41 +8ef6f3e241f6a761c9ab412629a49648c08b70b837c2cd8bea620bc93056ec73754e3e11f0df50f8e9fa67a9867501a9 +80b473ac4ba8cb82b4ae684206cde124d10fcf619f55a6c90d035981e1b08b9e141b4e5fa9a9af0b7f0c281b355dd593 +a566e2be0b41f01978dfffbb32f442b5e6706f5b9901110e645cf390f6a82869e3ca16887ffa35782a004d251d29c26e +a74e01eefa03546d00afdd24bf17015eee95d36de28c03c9b055e062cd5e8d8f20473c6d7ad21c94f9058fc5e84f9628 +acefc74de146911275dfd19bbe43d72729e89e96da04aff58e5fcb90962856c0b24eb13f43e30329f5477a1b65ae9400 +b5f113ef36e75de6d6d44130f38e460ad3ffc65cb9a5606828c4f7617981fecf76f5e862d7626ccb117aa757cc3c3e52 +96d3aeb1d3a66b136244062b891fc7f93ce745b776478d361a375ae57bdba9b4fcb257becbae228c1a3aff4a1c4fb5e2 +ab26c4a110877e5495b674569a32025dad599637b5dafedcfe32f205dfa68cd46f3ddf4f132a8e5765883b5c83214a07 +922a7a738066692193af32ccbab74edef067668ce3253e18a3275afcd5a6df7168deb2f5175c5fb413dc08fdaef63b17 +a47542f8e4a3a35ef6049280d1a9442c920887d5f1a1483149e143ca412318495a36decb804f81c9f5a7672a14965a4c +8fde57991e72a2aebd3376b4d9fdd795943ba3833431e52b136683567e6ee2cc1c1847dc49dc9534983060c54bf22f7e +addb041f01a99e7238ab2f9f2f94579861d0470b93b91cfb29f3a2e4c82386c868b2cfb6f3778b8a9cf908788acafe58 +a8c4e1df726431c43703739776e2cc51f5ebac57051244991baf53582538120133a44ca603d0722a4b5193e1be3c5ec0 +846379125968d1154376c5dc63100bdcd99b9403d182e3566fe48d79099099f51523cd81d21f0d1dcd622b715bdd851a +b828bf0d936d275abb40e3d73ef57fcd7ce97e9af35e194ae61463317bac6c1b0c3e4b40afe08a1061037bb7149108fc +abd07c71754973e698fa26c5019afd9551548f8369e2249b9902513f19a097057ee7065a1d88912e8f52e6e0fbfa6d82 +a9e36b6fcc9a3cc98e76d5751c76c50e1f92b7670f8076ab6ca8a30de4ec14c34669e049fd39bd293cde8789b1ca67f0 +8c060835496a04c7b51790790035862b20547e62fa8bb4e8857fb36891ec6309520af5c0f45d5ea46e3d228747d710a4 +8cc472ec62b8dce244373f40a821db585628989b6a7c4d394edffbc6346c8be455f4528d528fff41f91f2c875bd9fc0f +b4a75571f84f93451f15b3a86479063d7324d2789b6d2f2f4f8af68c66fac32743dc09b51df29608d62aaba78f6904af +916484984743b5ac16d40d0544faf9184819d92f779254b7fb892eb68cefbe59e75be8a6336a585e120f6ccae0a1eeac +b906ae585a73119764024e9eb87d92e53ee0c673474fec43fec4d344a3bbf471ce3976d25e37d197604689bbc944f1ab +8552708487305f16f95db3e01fbbfb969398f5b6d116844cbb000c9befd03f15c767584bf9541a42141949a4dc787a3a +a6025a2773f78c247f78c0d895ade8a6baa76e5499085f6175935d98a05fc41c1359f7843e0c6c323f1be256c45f45e6 +96dac695dd9288aeb6e32dce50e51ddf1fbd41de6146e3605c7a81f2253b17babf2bfda4f5a9d0c28352b9746c0dfa2c +a215b21f8eb2290f9d308278f2859a999eb3a31f4888f84a65f9ed05e1151c17777f91054d4d0de759ac5c3547d91929 +8fd7c9a279e9b619acf927d501b35dc551979731a89eab91d38b2356c0d73569baddacb9d1096d20a75c917ecaedadd6 +b985e8baa5195e2f1ea1091122d55aa321178d597f87b732b23eccb12b891638be1a992305a1ffcf5233af34339fa02c +ae1a9604b7f569aa48d2daa1889e76d3d103065fc8c3deb9ae127a6d94145695cab3bef640fa781612e8082c6d616c47 +a8fc67f9069f753360349eb874fa4dcadb2ec48d97c61abe568faee5f370ec3c87786c7faf0f73fc0ae7181a36eb89ca +a506d13acc3a9f80509fac936aef848cd30698631fff6130ed6217512ed9527d075f653cf6ef91f68e48a24c903eeb3a +a415093755cc012863043bf586b970bafdd87653ad14d1929672e04949bae4a753d16aa3eb5bd1afe3df3691b80f240f +ace3b792a1960580348b6fae8513149242378a18382741bbc2fb2f785cb8bf87550da4b5e0df2955970ab3a31f99f5d7 +a47d7fa7522664c8f9c404c18102f6f13a1db33ba8b0a56faa31a78a3decba3168c68f410115c5d9f240b3dc046dc9b4 +a9c930db3ea948cd2dd6ea9d0f9a465a5018bbaf6e9958013f151f89a3040cc03ae0b8eaf74b0ff96b4e7a6cd8aa5b4f +88abd235e3e760166cdedff4be82cf6ba02d68f51c6d53b1de326769f1f635215890f9a4c35b06dd16a9b93f30f3a471 +8f8d7b2fcdb70bfedde1ffd7f0b94108f0fa432f6ae81097988521dd2c4da928c10c5da3c7f33f11bd5331f2da8ec219 +b7abdbd48cece30d8f795a58a94913d76842cb006892485a9382a0502826538ca4ff951cc1ef4493e45de8571360d20d +b3e7b125f350c52695f7c5ec4a30916ea6c11744f1151a18ea0510e6cf6ed6f6dba4beaa4ca56988d306bd80ec360056 +9a004423c95e1f1714f98fb97ab798d6ab16cb5f6d6cad860635585d4d4b43ffcda63d8e931351189275e5a2cef28c2f +a8eab6ef917cacdc9b1932eb312309e1f85298d63e55ed9c89ab79da99d3eb60f1643d16be920e82d9285f60c7f7cab3 +934df955485113d10c4dde476ec14a98771145aadf3c8b61af26b09b9948757fa1abcc945ac91466a18c18c2fdce40d0 +99ed9146561597cff8add2196ff3a0f161dd5302685ceb846afca6efb5225f642e8f4a0970eecb01cdf18694fa697095 +b37062dd12a81267bbbf89bc9d6e30784c0e11e713cc49c6c96440f800f2a6a2a7e7f6c7f6c9eed4bc3c8890f2787342 +83a3d70055b6044e0207b3ece4da849755ab5798317b36b20c3555a392c27982f811e1c5007697554eeedc737b37f3ef +a85392c07ff8658935fbc52acec7221cd916c5fde8537a8444eefd507220e76f600350ae8f5dc3353911087b88b91045 +b1ea23558ad805dde9cc1eade995cd8e7f46d9afa230908b5fbaaa09f48547f49c2bd277bff8ab176f1c240beedd2b09 +8a16a48b9105d94700e8e5706b8d8a1ed14cffda5558a596974ea3191c5c3449da6e7efe2059e7baf4530a15f175ce16 +ac5fa54381fc565842417558e131df26e9505027759416165035357816a7e1859a7c14c228c79b4e5ba2ef6758e12ad8 +8475e290c399cc9322c05264a516cf766bf5fdb6b9dec7283961da0b99012d499b244b33fc0eaf94b461ab777f2a9537 +a7922f3c70e6857652805af7d435646c66d94eec174be997c4fe973d8f019990c4f757eeb730b2cfdf8154e6e97f7d5b +b90deb797fba3150cf265a23ea6bd49a382855cd4efe171cbcb1664683a9f1687cfcadfdca4e39cd971ec13aa5cdc296 +91ca761dd9659007d2fe8970bbd336c19ed0d2845d0d8aaab397116affcc793de2da73d89e6625cf4dae5983cceffa56 +9121ae9b60323ab1301e97555bcc74ddba0f5b1e62bfe9eaa2c239e1d685c4a614d397b32a59febed4db9968db44f38a +8477b07da4bbfe9087975f30d2c2333fccfcd7149f90e0e6fabecee627eee3ea324df31cf6a680393f5dedf68a35c9de +946a9c0f02fa6bf9f9d4933e7fc691749f4ac2f82a9b880666b5185189d4f3432da9096d0ea4d6baacbc079e19c887ce +b24663332914ea519435874d4c42d11842ea84dd3dc55292d5b0f27f64587848d095bacaec235a37003bdb5185daa6f2 +b980f46f84ac21dea75b4650f9412f6123325842758589a9b47caa68545905061f03fcad23cc102e2ce8ffeb1ae634a8 +90e9ebb060182d3043ea4210a2d934858559522a19eab9f0ff81a367484a05ec7cce78ee6a91dfff96145869db6a4e80 +b04228a009c91847693eab29c9ea71d1d6ba07060bc2b0b3bb81c46a125baecb3e1412f6ce4305076a97d316d14e4665 +8d3268370dbf38d378c7228c7b54e91f90f43cbfddc0d8468de11a4312616ca6372619209b89114152b16f334f4d2780 +964a63ffae653e0249685e227d937937b079ec3da9c977dad2b2e052af5eb560ce7d175941f2ae0df90e3d0a20b77e75 +855604c2910be885b14b27896e16d8dc339236b975398c771d29ac74e4278a2305fcf85203050a8faffddf64ea19cf78 +8e0b1d61a4349411eec77cf3490555843187a25a93e1f45bf66ad3982b9cc141b07805f8cb252b0fcc125e0052a7c450 +a03bc9588f971a1257cd0cfd2ca406c76aaeb634001864b0e4dda91e009d3361b33fc39f34922835031a423a13619a82 +b703fa855c2c4e1641d2687717fe8c5061acab71cd2dab55cdb069a6865464c3080f7936ddfd320516b6791b36c64b8c +aad1cfa7295e463fc3d5374ea4b952020010d67a77c7a86fe2c351a5959cd50df6a0045ad588257567a99bfd0e9400b3 +97906fb82abf5c1d9be8f72add8e6f175a6a5a4300b40295cb5ec8527cc7ec700fa03a7a494122d9605d212457452e41 +a83366cf93ad9a07f617e4002a10b624270f60083559b045ab5a805aaa592ac37b90c1e8b5437158f3bd942cf33bb633 +a585168e157e111bfa329d0ed6651a96509b20b30f6bb0691c6a5875d134d4a284867ab52511cdc19e360d10638e58a1 +b17d480a0b39f2487b7f3878714658fda82f2147c5ecbccd4004eb92d267c4663b42c93bafb95ce24e2f2f0a9ea14b8f +9362297a1a3951d92db4fd8ea6b48c403d6d8d2f7e7b6310b9cf9b4e4ba9e84cfe1ae025830aab9466c32fd659144474 +b1a62fbadfd4ea4909d8d0714c1e3ee9f95237fde20720f88d5ad25c274a6792158b99966d7b93151f769c832b6a132b +8d9af736949a33fe929548abe72384281365385862821a584f5198eed63bc5388f89fc574cda35a9eaabed0d336b86b6 +90ee2235f4ec2c6089b5cb7b8a41c9bc39e4a57935022ef28bed490e2ab12680922af7395bda4f708809e2bfc62192c9 +91f3a123d420bca34d3d751119bbebc435630c6605fb59a8d80d16a4895972e56cfe4cf1998e0a527c18ee38c2796617 +a2c4fbb20e7fbaae103b86ca9d8dbc2828e6bf33d1d7ce153bd98e8880fe7ac62abbf7059194b1eee64f4526a36c63a9 +91a7f93310ac74f385f11509f4bea9a4d74f2ce91cf2024fee32a4a44d5e636a73339c6b4027ee4d014a24b90de41ecb +914a6d405fee0a15e99704efb93fd240105572335f418d95e1f2de9afeb97f5f4b80aaf20bd5bf150b9da9abc2b6d6a5 +9462cf2c7e57e224389269b9fdddc593b31e1b72ab5389346aa9759fad5d218039a4a5bc496f4bf7982481bc0086292a +b7596132d972e15dc24f2cd0cf55ee4a6cc3f5a0e66dff33021a95e5a742889e811afd1dc0cd465cee6336ad96f25162 +99409bba2548f4ece04751308f815ecee71222869d8548fa142788fb19df5366d093a5131e57560237471bbd5279bbe5 +8e7560988a844b5b844ad460b19c452a5a04346d8c51ca20d3b144a3670ecc60c064b2415c2eeebf140d6ae4ba5c5360 +8cd9e18d311e178e00eb81ca839cfaa8e64e50a197de8461f07135fca28c1d895dd9c2401b923a4175ff711853497317 +91ebf99c95e8f653402b3079ecbd533ed7cd3b6c857a710142354ce8330cebdee7cf0fd0400417883b66055bec9d0552 +a9d0cf8cc6bbdc44426dcb716df667826426b4559056d73738bf3eaa6df373403861b6bbd6fa0454b1d2730e3b0015c4 +928320b452ef21d2443dee360110550f531d7a4275b2cb227814150f3e9e360e05a884d6e3bc4415f202120ea5ac333e +b9551f2b2e7bb984618f2e7467e33b5b5303b8707f503f2e696e49c2990ea760c31e0944d52257c7a38b553a67cf621c +b2ec34126fe61345e5c6361fe55b8fb3218cdcc9103bba5b200252d50b758153cd549226b7aabedd265906401e755190 +a8cf814926082a96a921d471036a9919a58e68d02ee671c215ea304759cd92a7c2c9ccebdd5e9ec5572164ad2abb22ad +8c0563c28c261bbe9a1ec4986f8b277324bf05b4fe5e2b79a862168e646bbea50ce7c4622b2aa7ca899c1a728c226d24 +b558cdc334ea894d3a13347ea9e30f78a0a20621903d6c009c54feceba3ba81d2445a43572e088ae691f65489702e963 +a62ba0b20f46c367cfd409beb300e39f1a6cd5be95e63457b6ad3cb66374aed754fd037b8e4215d651a7d8e1a442f762 +8543e2c6135df471bd7a5c09f1313674c7f6847cb88f15eabf40b2bc9535d0ec606725b97103334a0c162a20d9f5bb53 +8c0367d7058d63b425450f8ee9252e64234c0c2e61878c7c2d4b17bab22a72f40c75ac3bf8b64f264c00d9c5963af041 +acb7207445993d563f1b6e7b179bbd6e87044399f80e6d15980acf7aaccb9d85071fecb22250afb3aba850712fbda240 +b93725e66184bb03f0ab4078c737a7fb2b10294a3a09995958de3dcf5316b476ce9b5cd8d180017196d9482abdfcab88 +afcb52bb7b8f45a945299da6fc6a877ba9f69f7f23d5f94b5f5d9a04c3cf3089333bbd50fc305e3907825003da73b9f6 +961de781cb238cef52d43bc0dc7d8e3a75bca4c27ab37a2e9353137a9aa9403444a5841b595adeca75a3de5485ab97f6 +9408c828d3ed6df40cc167d72ca9882a9c9cf8e765d6f9125e02e0d66ee0ac94f449803afb50bf1b92176feae92473d6 +a85480591e7e033b9087fd0efe5cf3c88c10a75de4a5d7da4443df1cc1fa1aa59b6cde3ce7453fcabe555495e49ef6f7 +a2611bd82344bc5d70d7e6cf3f0d25866b9f709ac4bf6f75d1006da2a11e2cd07a4c0ac71505e5062a04f71db7a3063b +ac466aaa96febb5b810ba350c7a874797ce4bd6c9585f6b9d114d646894a67c9af9526ade4f7ec834d3a69e18ab643af +b73fc98a79fe77cdbc524c76a09cb9f2d5f8b0a5508846bed1ba5ea9ae3bb62120e01d3b8fb544d90ac9ae0c3d4ccefe +aed333c3403adc899a870082f70aadc770c9f880dc057f05a46d7400be9d893354121a0a31e5475898f437bf722eefcf +97f02133c72187178a8c48db26031f0b2c0317a6648d2be5f7450f00c37391cec935bea46b8144ec9fea5327ee959f27 +940b582b41f1d0f09f0c5f51bab471e4eb143e91b1e96dde83e94650421d51f9c9baec10cc802fb83cd63b56d0b907c0 +b1286a55a74a88a75da47671994916be428be1ca3f42783e497d6478eaa6aca69d50a421b210e9ed3283d578b651b8cf +97cd4e87e21c71d11f1df1c0b6518c00e1610661be4b13cdbdbb026d60fc3f4a2b8549326a648b3fdecb7de8f6aa9fb7 +8f36bbcccee986c35328633bf6ee8f70b5dbf42d0f677c0f4e009d2289976e512af6af91a6ddcd87dc0df93bc4ecd02d +9253ad44ad182e67ab574d718733a69c05cd5bcc43e6292ef0519a9430460aa6a233fe26269da7298ea88cf406e733c0 +b616b5ea74db0dcf8f10a2db79df6ec3566c06410f68a933eff150194608c591b2b175908d4b4ccaef1018b0fefc5693 +80a712ba89394381cbb83fedcaae914cc4f21ab024b8da8a7bbad7762a22f82940451427b1a3f5d84c246d5ba0c7ccc7 +a806909a5517a970879143ad789c6cb6256b82553b649f6865cdafbbc050b1f86528241b3cb600e784186e1a672b588f +b6ae801d1f0e4adf3ce57659d7c61f94abd3c8d1635ad28133a79eff0586fc48bdc195615335449e9bfee39e8a955eb2 +b8a000561211844bef72adf3413f3b438a8789fcddf6676402ca6a1c2c63b9deed322030de2ae3a0aeb3cedbb89406c3 +8bc3615b28e33fc24a7c989f8b4f719c914c4c65b35ad3d4cf15e2196e37c62e42ca34e8b1275e0f32589b969bdfc21b +b2f9637f370a79e7591e5056dac004f56b375f33645ae9f5a192cc6b7b6b3d8a1105cc00f10d8bc8ef250ecc2ac63c39 +b51899978b9c5b737999fee1935a5b0944261e7005bea411b5903d2c16ea045a3b0bcd69395b6733752caed43bc4e343 +873c71a01009dddb9885c48658f83aa6320e74bc152e09de8b631c763c2b4e2e8cbac921418a0d9085ff5c53a2b52d39 +96470f48efd7d2ac2daea8753ef097c09c6fc128a54cc7ef758ff07e32c0b0ac7d122f97b53e88a29cc26874dfee5e0d +8dd2decbd3504b7961d65edb8d51b96377f4edd2e0d2cd8a4d98333f373c79a8d7ca8f8408718d0e7b5e48255857c339 +b536ae387bdd0f6e40850c71fcaecb1051b2c8f7bf5cf92c6bda030de72a03e9212d00390c53a72a08e9fb2bff1249c0 +b1566076f59064e3545adef74fd1acadc1bee0ae23543c30caf9e1ad1fc20ebe84ee25004c612525b26857253f5345b7 +afd180e25444cb720342923b8897d38a6537bc33a0ca1fc9c6e4d524b280193618f19e2bcfbd07606b78b734fe6114ed +89b2a6c8811e5a6d07aa74c79dd854bdfc292cc104b525bc37e4c7c1f9485e19d759c8e27cd7cd73c46346f56ce3b189 +8234196e196898b2501b79d0dc016f6df3d5878952cdb8a93735e4ce2ecf77d07924c701e084533a20f0c50a7d1ee376 +adea7ce2efc77711f50138691ef1a2b946aaba08e7e3b21378708dd5a10bae933ed121e71834b43b14e2ea30a7b306e8 +a566d406a35fae703b3d1ea1791d9207116002e5ee008d01e053a1ea4fe5af2feb63605b011ae6a14414028aa054b861 +b83bbb063682386456719179b6f6bbc8cf6f791229600b7d402167737492f99437b45886695b26a28731e952e56f1ee1 +a8f5fffc2c335d3ad5c7593e81f0862351413cc348392afa86d50921dabb929a5a1de20d604666af9e17a13bbc30bc3b +8d5dcdc1335f01847f6ef650ff64b26e7c4cecb934a7bbce11254e8ced9fa9e4fc87eec55248f69bf499180101c63f5a +83fec30b8bc62f9fc28301a03ef18158d6364738f1c42de311bbfba2e62b25d4c9ea9d6097698b24c84fff956a6748b9 +96394fbe0c2d03cdaa56e13326aeb62344238ad3043ee2fb4f18ebf0a6f7f090f410032a2d15bfbeca9449202d59f2a0 +94880f5928fe71a797362a37d05849d23e118742697f75bc87173a777e7b9d4383b8796a8a2bbee27fb781f363301dfe +af229535896ab86fdf6d2ae676a0dbf44f868f6c7f17bd9a65567631c7aa2e29758f41de050ca5311bd1528bcc811532 +8d4fa4968575b483b3ac16345e7f1ea3f81e8dad72c945a48b7b982054fe1030584be2f89b2f53af84d2490cda551b84 +8052aeb115e4d242078c8726d376a13156cc832705243f14adaa3ef3889e1f2fcdfd46e087acab6fa85a74afde5f5eef +a1349c8a22788a1937a837fceecfaada9e93a63e582a09c56b53da52c9db1600254dc85f63f5eadfa30b89b31dcbdb30 +a10178cdb263ff1a5e0cc034b6deaa160d00c3c3fe1fd1ff0c55fdf1ecb83d771070c10930f88832b75fef39a10024ea +938b17e4405934ea5ef29c2187d6787c5ff5d8c9a02665efb453117d462dbc50ef2c202cbc884305cd807a70b5cc177b +84f01f0da6b58c71788616be71fb3c259ceea7f8bd131a5661c5c03d0205feaff6dac2915919347b0559c381477b3d89 +98787f0a2fac2b04bb7aa247ac77236bbe690aae64203e553be328a2c3bffb772e7a0244e585d27558cc64b089a5ee11 +a14501d8b6b3a84b13b9006d521667e8d168f642ebf154c4e90ec8c75d11985fd0c9d86fc2efa6c7077dafecfdf0ab13 +8215dee75eed04de83a3e910129bee8c48ce01cf1317ea477ff35c09a6f9e9771a8b05aa79e6b0f3e71b9874695e7a2a +85763c3072c7400a2c5668ef5cc53e6f4b8dff474146028a8be370ca9d8af9bf9ee10cd7d23d33eb6d6e257dd3af38d6 +91bf62245c5a59d514d39bfb74db7f72ca7160c1c5d5be3844fff37e53e99d451e18a6747c65e33f98f48a55f38962c6 +8c68817c6a6ea348d9aedce99929371c440fbad72718c2d239ffcaebb26ecc8a4e8c38c2819d945fdb7f02ffda70a5e0 +a96ce2745866a22267a49faa7ea00ebf009ea8d0b0ca2c233c62759b9d5514306b5822dd2eee0124c9e28380e2f97aa4 +8b18d5757c73843dcd55f0f0dc894bcd17e0ecf4c9fd901eacd38480844a15b4ce5e9598ccee039f9d93185137630cdb +a5b45c403b6735aaae14389bcee23ca10571f5437f1f5ab0c2b4e573dfd3341c638fff2cc780166af96b118d47ff2299 +ac849a0ccd354dd46bf55ea837d509b4ae3eefcbd5b8eb2582d301fd56c27b89950c6eefdd4e98e608ef4a6b75251311 +89f13ac14bb064e9c6b49a482831ecea6344faec490bd18bb44028b83a0f22e21145861558029bd172ba7c5247c2cba7 +aa57b057a2ac32c101e442c33831630c81b2e061a542e3e1d6897b2b7ca8a7241ef717a548b3f751d60d89be384ba5da +8a43db4e12682b98230364f25c75b49002f5002bd72a1674cf2a9d53197b5ef1b95e48429af98af503b0d5c3e0e017b2 +a10cd7b8e1574d78c4e917cf833d3d845b878e8e8b60312e6a994bd4f391a5e8c38dcd774087b93c9241238f43f80937 +8b61ccb949088286216cd628811df1a362a7f5c333654ce823e63ebd04b069d5b0f627fb6c96d54c7b853de8aab05472 +887b902020ad45f70f2d5bcfa7324fcbe7be09fd2b1bd40f9ae43a89d487986e89867aee0945ea6a0fe8dfd051ffec56 +822fcd260a7876cad31f54987053aab06108de336878b91b7a15d35013d6d4d6de2d4b30397bb6f1d5c1a7b48e9d1ced +80b89ff95d725858b50e84d825ea99fb6a8866f10b91a5d364671ccbb89cb292bada9537c30dbde56b989c8bdc355baa +b53cab156006c3a1766a57dd8013f4563a2e8250995dbeda99c5286a447618e8ac33ebf25704b9245266e009a0712dc5 +b6e2da9c1156e68c15861a05cd572976b21773e60fc5f2f58c93f3e19c73ad6c2ee3239e6cb4654040c8e15df75a505d +8b7e187d473a0bd0b493adcdb91ca07c9310fd915dec46c2c9f36a5144eb7425dd35dfa50feb0e9ef747caed9f199944 +9743ec3917e953e0a420406b53f4daa433adf4ad686207e9f296e7c83d1ffdbf81191b920ba635c85416e580178c16ff +98d1476fd4504a347c5261012298ca69c8593fec91919d37ddfdf84155b6f1c600cd8dbb92b93f3262da16cf40a0b3c6 +94f50d52982a3c81ac47a7b3032dad505b4e556804f8606d63d821f2c1a4830917614630d943642ba375b30409546385 +b5c0eb5f4cf3f719be1a9ad0103349269e8b798dbffe1b5b132370b9de1188a6d71dcbc3635dfdb4b888400f790b6ea4 +b47fb45ec73392598866d27994c2feb0b0f3d7fc54303a2090757a64b6426d183ae41af16794ced349ede98b9b3fd48c +b5f45fd0aee6194dd207e11881694191e7538b830bfe10a9666493ae8b971d65bc72214a4d483de17c2530d24687d666 +a50c149ea189387740d717290064a776e2af277deafcf5f0115bbbdc73c0840d630965a4e0214b738d1cb0d75737e822 +b941afc772043928c62e5dbe5aa563fa29882bff9b5811673f72286ac04fddf9a9ed0f9faf348268fa593a57bc00ba6b +839051a7838937270bdf2f8990fd9aa7d72bfc86cffe0b057aa8eca7393abf16b70d71a6470d877f8ec6771efa5a8f26 +835bc9d049418ab24dd1cbf76ed5811381e2f0b04035f15943327771f574f723b07c2b61a67a6f9ddc1a6a20b01f990d +8935cf5634d6ae7b21c797a7d56675e50f9d50240cb2461056632420f7f466fdcd944a777437dcb3342841ad4c3834bf +b5698fe3da1f9d1e176c9919fddd0d4d7376106774aa23a7a699f631566318d59b74ae8c033eba04d06f8cdcb4edbbed +ad11421ba75d74c600e220f4bce2ca7eacb28e082b993b4368d91218e7b96029acfbdf15a2ab0b8133b7c8027b3c785b +886ef813644599051dafdaa65363795cf34a3009933c469bd66a676fdd47fc0d590c401cc2686d1ba61fce0f693426d4 +8858fdf3e98e36d644257ab6076f7956f2e7eacc8530ec1da7f3e9001036cba7a0855fb5011925cdc95a69600de58b2d +b59eca7085a2f6dfeaa6a414b5216ff0160fbea28c0e2ad4f4ffd3d388e1cc2c23a32dbe517648221b75a92500af85e3 +abec62d259bcd65b31892badad4ac8d2088366d9591cd0dab408a9b70ad517db39c2ef5df52348ba4334dce06a4e3ba5 +a9acfe8f5a310779509621ed2946166ffb6168e68ecf6d5a3b2f6008df1728c8fceb811636c50d2e419b642a848a9ca9 +9929bb1a3537362848fac3f1bcb7cfb503dac0a0b1bebbfd6ddf14c9a73731e2248cbaf0fbb16c7d9c40cc6737c3a555 +981d06c7431e6f4654e32f1c5b27e7be89e7c38d59c4e2a872a0f0934cb852c6aeff2d2eaee8302131795590b8913f5e +a6ba9dd43354320f65fd5cdd5446cfa40080bcf3ef4a083a76ad4e6a609b0b088bcf26c4957bfab829dca6064410ca5f +9367ef28def311c79adfd87e617651fcc41ad8caf047d73ce9a1f327e8871e9b35d5b203fd0c0138e32e2ef91e20ba62 +855d1bb508a9036f42116c8bbb830c576189798baee27c7c3477ef1b1fc5d7b0c2c7203457f1eb48d4b029dd6f646be2 +8539a5d0528d3d601083e162b34cb33b5bf6736b4feeeab4941f10eea127c56b7e0b8d57f34b72f8f674d89c10bf302c +a3b71a9a9ac2dfcd681bfd8f6a5d9abf5df6950821705bdfb19db25f80d9b8a89fac7a922541cc681325679c629743d2 +8e95929dfd4e5b56e5a8882aad6b7e783337e39055a228b36022646a13a853d574603de5fed12b6c1f2585621ead7afd +8b05c885575d6894cb67ba737db5915639a6f281bf249480df444ff9f02724e28ed7371ee7ec26d50d25f3966010f763 +90f1a45de0cc0641181d54ee86630b5d182d24e7c30c2615803f16de90ec7c982a00b21f250ccebc2e94ef53a13e77e6 +90f0e97a132092e51a4521c2ecaaa47e4e4f319e67a3cdbd00ed85c2f10dfb69c339bc9498e2abbffcd54b1fdc509a20 +a9995234520cab9d1bdec1897b0b67571b718d5021c0fcf913140206b50ab515273b5f8a77e88fe96f718c80dd9be048 +aebc6495d54d0e45a3c74388891dbcfab767f574fed0581566415af872dc5b3bd5d808c44f6e1fbdde7aa9ffd260b035 +ae757f8f4b1000a623a7d8e337a50c3681544520683207e09d05e08a6f39384b7aaadf72018e88b401e4a7bb636f6483 +a626a28d5ce144cc0c6a30b90ec2c1412cbbc464ee96ac49035e5b3a37bb3e4ed74e8934c489b4563f2f7db1caf8b2ad +8c994e81dfd7a5c2f9d4425636611d5dd72d0b091a5862f8bec609d0cdd3c423eb95b0c999c48faa5dbb31e510c22b61 +a1c0e59e076b908de760d9becff24883c6eb9f968eac356e719c75cce481f2f7bcb1a41ed983a00c1a3b9369a7ff18f9 +8d7e199044fe2e552bc514668fe8171c3416515f7a5019f239c0384f0ade349e88df26cd30f6b67d02b83bf005d85de8 +80190f2255199be690fb502d02ed159aa568c390a684f7840512efc3d2a62f28a49d5d1928ad99a5f975ad81a245acd5 +889d84cefef33f5714e14d558f41d406072ba66b427bf27918b669c5be46261c3de0139610a2c2eadef8e6508e937bcb +a480a686d5085b854ccf9e261e7f1f2d40d978fc30b62b1a8fa9561127745529405820df21a680ee2258b8cefa5f0201 +ae6243400d416a8c13b80b6637726959ef07b8d9b6aff2bd3bb23aaaf97337c7a6b466c5db617bf2798e01d4ccc68e4d +85e0ff143657e465f3d934ee781de5cbd2bfd24f2fbbe6d65c698cdd93204a845f6ef1fa8941c2578463a06a8a418481 +8f4f8b45f1a9f6c2a711776db70f20149dd6d0e28d125906ba9893c5e74e31c195b0906f04c922c8b556ced7cd3d611d +877b852c33483b25c4cd8da74b6b589d8aa96e217c3c4d813466c77ef83af95a94a47364aa8421f0396ce631ad87d543 +852cb06bc4222ce125287a7a55a79ad0bf55596f26830dd6d79da3c60f80e3ba7b9a9b42b126dcb99d2cb9ce142783ef +810cd64c1dfce85d509eeb57a5c84efafe1d671454ef601a040de8d46fb33bc419577f6a6c404e28ffdfe315ffec558a +b60ff8bc804d101a32079b8ed52285fdbb47fd60c3c15cef17cfe7f6b0567de6b50128b9dbc49a1d9811b62b22c99143 +a9df7068b26a6a58f7a499e67b17d34f2a2e8e5029c6e51e2b4c0d19324fb5cd9734c4c4d5034e1bfc274cd0c74a82d0 +ad93c50802ded1e21217a58b874c074ea52322492d589820691572084d8edaede8c2ce8021c6df8c0060f395f3c25ee8 +a17b98e090f7ef5800477132b436c1fccc1802f34956711bfc176e36890c7df95a108e03f34659142434cbd8aee9dccd +acb14aea5575c293dc0a2b58c5350390801d57e9bcda876d87c56565043ddde1a544a88b48ad0d8ec3d41f690aef801e +88b8e26cbc83faa053fa247e26c95d1bbb77955b336e1b0e41d080633248238de8adc9b98688c98fdfc67e7286bc5be4 +899f69823cf1b2204c8da91bb4f943c04d943137b08b1c46e160919e3378bd22a666a079a66e63d81c05336c742efdd2 +8d7ffbc0b47a32408c9e88676ac4f87683cf37c37d214163ca630aec2d3cc014d88caff35022ff3b6d036eb8343d52a3 +b7760f27db0704a6742855998a0c31333bb34d60ddebc95588e25b72445ae2030427aab088ec023f94563118980f3b74 +ad06ecc0f3745861c266bf93f00b30d41ed89d41e99ab63fedd795c970d3ad40560e57ab7333883a72e5575a059df39c +8687d28b1cbc8aa34a0e5dbdb540a517da9bda36160daaa7801fce99754f5d16eda3bc8e1df6b0722cfb49e177e9bcb6 +a38332c3ebbd7f734c8e6ab23ae9756f47afbf7d1786fe45daebc8d7d005d6d8fd22f5dbd0fa8741e1bfb2014d3f9df7 +b86f84426dee88188be9c5cc10a41599e53b7733ba6f2402392b0ea985effc7525756ca1b7b92041ae323337618b238f +958731a6f1881f652d340832728bc7fadd1acebd8daebd772b5acea634e9f7b7254b76d38a7065ea1b2cdea83b18a54f +adb90bff1f0d7d45b8ba28b536c0e0f7f4dc4b9a0354692ecf29539631d7a57d308db3e438e0f907810234c490b42153 +a5188c775ad76617d3bb6e7f1f3b2449f48b7bb7a84035c316284396529564a227e3b9762a89c7114fa47b3ca7ba418a +a3826ef63c98793a5c8c5d5159e2e00cc85fb5e5124f06421b165de68c9495e93c2f23cd446adf6e6528967aa3ed3909 +80eab97de89f3824ace5565b540b229adcc6ef9d2940e90de185af309234cd8aa4ae9c7ce1b409b3898c8fd10c8c2896 +8824f5acd4c2330c459fdb9ece9313263a8b20419f50f8d49958dc21754c21a77bcf7fbf3e0041f78d8fb667a3342188 +95091cf06911a997a09b643326c2fadbbe302555ab2521db806a762a5f4492636507ca71d7a093840236ac3c096614f7 +a392c81a546196d7e78b61f3ceaadfb2771d09fe43f862c0af65f5e55ce490a0293b9ab754cb5ab03ff642a9a8213a23 +afd76cce1dfa2c9e4af4f840376674f090af37d8c6541824963373f97b9dd1f405c50b2ff56165e1d4dde760e590738a +8fc4f513d3b40c10872603e1c29a4b2cf4c99320962644ce89f69ffb57f844344e1d472b2d43559119bdfb5a2c21749a +9951ca8e13b9a2b4a789e851c04c4f030470772da62f101074ef304612e9653b43b37d2c081b5d0a09196b3a167f5871 +b4f16fc2a113403ab5fc1b6a9afddec77be7406413b70ee126f0e84796168a572940550d61e443e5635591d4b6c46ca9 +8d71452cf39e7345c7298d514b9638a5cbe78af7652f0286d42632c5c6d7953ed284551fb40c77569a7721413cdbf79c +953625b58d52a308cb00ad87c44a3fd936786ada44000d45bb609ea9db6b156a0d0f9475e13ee5e053eaded19a09990a +a0983a3baa278ad5f5de734eb1b65a04f668408994e396fb0b054991ad2e56e27ac522b04fe37c9583b754e344f795b3 +8eaa454257f77a6754b2c1c5ff0036fa5b03e214576fabc657902c737fcbf298b1795b43c5006e18894f951f5f7cd203 +90183fdeae2ce2a295a567fa61b997b1f975d1be7b03d0101728cd707bb2a7111c222588ab22e573518fa1ef03719f54 +8abec7f31f6b897a1d497368a42733a6bd14ffbb8b21d3e49fc4cd3c802da70e8886827c1aea0b18d1b44635f81ec461 +a6d1e6fd24b0878ff264b725662e489451c590b2aadaf357d64210a3701fe763f529826fa6e0555267c1f5ecc2c52c05 +8fe6d2a4ea0d91702cb2a8a1d802f5598f26d892f1a929ff056d2b928821e4b172c1c1c0505aa245813fe67074cf9834 +82a026a408003583036f16268113ca6067ce13e89c6e9af0a760f4b2481851c62fadeeef0d361f51dcd9fa5674ec5750 +a489a574b862d4056091ef630e089c163c16c2f104d95eb79a27ae1e898b26d6c1adc23edc1490f73bb545d3a6e3b348 +939d85148547fc7b9894497841bd4430bc670bb670f0efeac424b529a9aebf2c02ac18a9d1402a12e4e590d623de09f0 +a3ab52cf911a2ba7fb0cd242d7778ec0d4fa382960c9bd5b476bb1cd44ff1430a3871bbbcea0a0db2630c39ee639fd1e +b7629509d8c3a3b88b31f1af137a25c38f536284f11a5bbbe0d05b86a86bc92ebbf70f17c256dc8b0d48374e1985e6f3 +8a8647ff33e0747dd6c6ceddcf7938a542656174a08a31b08337ea49b08d814e75f8363fb51676a2cd2746569e3bc14e +a7a7f8d94d32b7cee00b3ff272d644b8dca86b8da38c726f632c2bcdfa0afb13fd0a9a5685ddaeb6073df4d9cfa3d878 +b7136eea8d05bfee2265b0e9addb4bdf060270894de30d593627891584b9446b363973de334b6105e0495cf8cb98e8f7 +a9fcd33ea59315ad7611a3e87e8d1fd6730c8cbeeaebd254e4d59ed7d92c97670303a2d22e881ab16c58779331837529 +965fd41741a0d898c2f2048945b2aefc49c735228c25deaf17fed82c4d52cf3f8e93b3fb8825ade632dc4940311b1542 +b9f400a2c7ca7da8b36470ee5d26c672b529b98e6582012cbfc2a3c24b72e73f5633de4265c417c0d47c474155a603c6 +85f333b0b1630a688a385f48bf0175cd13ecdd92fa5499494f4ad5aea0ef1b9d180fad8f936018538d842630ff72884c +8da95a735a1a98ed8e563099bd87d13a237dd7ec6880cfac56c6416b001e983a56f3d72dda7f68684bb33e4f64cadd30 +a29b66a2095e1acce751f6aec8dfeae1e5b24187dfedb5d1635ca8deae19b580ef09329a18b3385ebb117cd71671f4dd +b001deeeaf5eaf99ac558c60677b667b9f3d57cf43a2c4d57fd74b125a6da72ea6c9dc81b110655e0df01ca7b8a7a7ed +912e11dfff77c778969836d5029747b494dd81d9f965f8be2c9db9e8b08f53858eface81862c3ee6a9aa10993d0d23f3 +ac166a00e9793cf86753aa002ca274cb6f62328869fe920f5632a69a5d30d8d3ce3f0c5487cb354165763ca41d83495a +b74df519ae1a8faeff2ccd29892886b327c7434360ab5c5355752667069a77d466a48cb57b1950d10b6c47c88b2a8538 +8751679aeffa39da55f2c2a668f7b26fb8258f70c5454b13e2483e3ad452f3ac7cc4fa075783e72b4a121cd69936c176 +ae0cc16848b8bf8fffbb44047d6f1d32b52b19d3551d443a39fb25976a89d1a5d2909a4fc42ee81a98ad09d896bd90a9 +a0c8acd6a2f0d4ab0e0a680fa4a67b076bbbf42b9ec512eb04be05fb2625f6d2ed7b4349eebe61eb9f7bd4f85e9de7fa +85c629ce0deeb75c18a3b1b4e14577b5666cf25453a89d27f1029a2984133a2b8e7766597e2ff9ee26a65649b816b650 +938dbb477840d3ed27f903d09fd9959f6fec443fbc93324bc28300dd29e602bd3861fd29508da0dfdbb0fff7f09c5a6c +a7c76cd4a42ab7904d036fe6637471d9836ad15d0d26a07b1803b7fb8988b8c9edf522e0d337a1852131d0f658565ae7 +838a30260cf341ae0cd7a9df84cbc36354c6bc7b8f50c95d154453c9e8ec5435d5f9b23de2a5d91b55adde3dbdb755b9 +8f870b1f798c0516b679273c583c266c2020b8dea7e68be4b0628b85059d49e5a680709c3d6caabe767a0f03975c4626 +89bad0b6499d671b362ae898fee34ad285aa8c77d33ca1d66e8f85b5d637bbd7ae2145caae7d9f47e94c25e9d16b8c4f +af963d3dd3d983864c54b0ed1429c52b466383f07a1504215bbf998c071a099a3a1deb08d94b54630ac76d1d40cfc3da +b5686de207c3d60d4dcfe6a109c0b2f343ed1eb785941301b827b8c07a8f1311e481a56a4baab88edb3ddc4dace6a66a +95e5978739a3e875e76d927f7c68bdf7ab20966db9fa8859f46a837760dfe529afa9a371a184dfb89d2962c95d5fcf3b +96d2855e20c37ed7bd7f736e11cfba5f61bb78a68303a7ced418c4c29a889a4798c5680be721a46d548d63525637e6b0 +b134bceb776cd5866e911f8e96016704c9a3caeadcabd7c0f37204497d789bc949e41b93e4c2d597e4c924853f1b21e3 +a1949ff397013acde0303e5d64432bf6dd7f01caa03c5fc38e7c8ae705b9d5c2646b4b02d013004e5eb58e344703260c +8036a5f79d8aeb6df4810974cf8dbd0ac778906d2f82b969ac9dcfbe7ece832a7e8aad08a4dc520f7abeb24b1610ae84 +982b6b0af8602a992c389232b525d4239edc3ae6ceea77d7729d1fffc829664dd647ff91c4cb9c7f7c25cea507f03167 +b34c7d24fa56ab6acdb8af5b4fa694a1985a1741cc53a2b0c5833611e8ed6fb3b663a4d9a126bb4a1a469f2072199d66 +8166366fec4ee2b3eda097dc200cdfa0533a742dfbe7082dfa14c1c1ecafc9d9fa71f518476634f29d06430869bd5e02 +86c0251ac00b8200618c8b7ce696d1e88c587f91e38580b2d6ae48a3ef904e0ba1b20b7f432719ca40e7995f2281a696 +afd89f3bc7843a1e45ac961e49c1971114c5238d9e21647804b1852b8f476a89c12d1edfb97fff71445e879d6bfd3b70 +911d8bec4d4c3e73a2c35469b2167569f59705404425bd95440408fb788e122f96e9b1bd695f35c6b090f10135b20cd3 +b3f6350ff7afaa0660f9dddd9559db7f164e89351a743fc695d987c88f89fc29136e3c5eb81963edabf2b6f2057120be +a371229680d1468777862e9c0e864156f9cd7c12ce7313a8de67b7bd34e3d1b6fa45ce891a81f8316f4afcbdecf3b6ca +a6a9a875ef9efe8ba72523e645b5773aa62c4fb41efd23da3fa38105472308b8d293be766342ee0a2f00758825bd3b6a +a840d495a184f4499b944ee08f07193a1e1bb8ab21f8ce7aa51d03bd8643f2bc2616c17b68d3fe7c0fb364136926a166 +b55200ae7d6ebb0b04b748051c5907293184b126cf8a1c2f357e024f1a63220b573e2875df83d9b5e0c6e2ace9300c40 +b1e0870f2e3719f42a48256ee58cc27f613308680f2d3645c0f6db0187042dddcfed0cb545423a1a0b851b3a16146d70 +b43a22ff3f838ad43786dc120b7f89a399ed432c7d3aa4e2062ad4152021b6fa01d41b7698da596d6452570c49a62062 +88b1dc50873564560affaa277b1c9d955aebdcdd4117dab1973306893b0e3f090899210102e7e1eef6f7cdf2f4e0e5db +9223c6246aa320b1b36eb1e28b5f9ccc2977e847850964f9762c7559da9546e508503050e5566ccb67262d570162b7a3 +aeeed21b932752709f43dc0c2c7d27d20263b96a54175dd675677a40a093f02bba80e2e65afe3eb22732a7617bf4ff9d +b47cae580ae84f4e4303db8f684f559382f075ef6e95698b9a629e92b67bf004f64e7cf47e401768fa170c4259efbda1 +849821e1ead81fe2dc49cd59f2bba305578c4ea0e8f4b8ae8fc275a1c4a6192f8819d5b6d7da786c94dfc16aacf3e236 +8c60d9a8baefc72a3d3f9dd2e24cca40fb5ce36b19d075122391d9b371c904a0a15d2196c0f2ac9da3acf188d15b0fe8 +946edfe168bbe5ddb0fa6c2890bb227d8418bfbebe2bafab84909825484f799407b610d8aab6a900c5ff9eb796cdc4bf +ae7bf8ae71de5d7ea644d9541e49da1ec31eca6ff4c3fbec5480d30e07ef2c2046cc0a486af7b3615a6a908846341e99 +b4d31a6f578463c9a5ccde0ea526c95b1981eb79468665395c0e550829abfdfa86689699d57830856e324092a423f231 +93415ad3a732417cca9771b056ed42db7ce50879aca7c6f71883ad297eaf5a37fd4641d44a0b7e28b90c168834141340 +98960617a413a3ba86d8257a7386355a69258943aa71834166bd624ea93b0af06178e86538e237f88fd039eacf7cb04a +881335200a487545e38d5b1ffda3080caf5729e1b980603bcdf9ea652cea7848335b83aeeaa321d3476ae4a8d9073582 +b39e84c14666d51895b7a8341fd8319f9e0a58b2a50fc3d7925cce3037f7c75367b5fb5bf25ff4720c9992cab7b8b9f4 +8ea4bab42ee3f0772d6bd24dff3643d8b61147b46ada374414d8d35c0c340e458e449d31023d96e66decf9c58e30cc34 +a5198f6759a045b6a4ba28e4bc3bb638fad44c5a139064327580e285adf38ea82a7570acebf925e81a39d9025f3a6f2e +80267097e2d27c1b19ecf95d184dcff822d34e03326b9fc139a4f8b75b3f80777bb97a9dd284d9b755f14dd401d63c0e +946f346220bd3b6f733e94b61a1ad0b44e45c356fa6036dde5882d93b5613c98e23b20e91eddc6b3c5acea38085705af +a5f559e110cad99bbcae2d9362434aee7db0f3b6d72311291649dbda3f84c10e9760b66b988db3d30067bf18ae2e5238 +8433b38e5c7b293ef532f8c70cef1ed9be7f31f60d5b532e65df7d2885203be78b7ad78ab3011bc54cd9f64c789bf837 +a5a4c0a9b0e0b6bb912cf6ecd30738b0acc0146d77442449b486c3f32d7e60244f643a5cf9cc6da2de5408d0c5f17691 +a81feb329fb51b72464bddcfcf4e02149d995b548d88c64ba143144ce16b652c9913c8ee948ee837596ec97cc43d8cc9 +88e5a7e93a738d61330425bc21ade88d33d7160d124bf174eb3e12a00283654431036977c4f1a47a1bbbf2ef8449ac89 +ac75ad7c099383069e662bfd3624b92b64b5838246902e167fc31b9411efda89b2c6bbd1d61b9eb7d304faacf438d70b +8583bcd1c7cb9bb4bb6bcff803b0a991912b8403a63c0d997761ff77295ccc357d0292318601a8c61329ab28fed7bb83 +a1f9aa0523f1dff00023a44a6c3a9e4e123be0f6722a1c6682ac3c6047efe9e62f4773daf4767e854e1fcbf8ee7339e2 +85f65ebcf5c7e574174b7c4c4166a9a5368e7986b8c0ef846c2e13b75dea7311a87483503149ebfb3cb839b3ef35c82d +abc55eeb72699031a367b9675a2b91a8434e1f01467660903ced43a0b2a11a85ebdf48f95c13ff67e4e2958065a50ff3 +a4ff77c9b86939a15647499b9412417b984bfb051e5bf27b35392a258a5dac297bbdbcf753a4be6729ffb16be924a2ff +af0d41c15b5172efa801cc85ed101b76844dcd06712d0d21160893235a2dbedd15d187a9b31cf0d0ca6c14de6ab2b707 +92661339199f18e5dd9a210783c1d173a26dfa315bd99a33d6f04bf506c871a2b47745c1909faa209d5e6c5c645124a4 +b35813dafb52df709dfa47982bfb44e1bf704f9f46085b2a0e92511dff90e5597110f614f8915830821fc5ed69ae0083 +934a05aa713fa276a4d47f1a28ef06591e5a9a69293c1651c223174df0af4927fc9cd43d374d89c1b4f7c8dc91abe44b +8f83a0ef05202c0b7170ac96f880135e2256fdf8964dae5aed5dd0f6452a6d8e123321e8c182b3aa6f1f8ab767caa735 +b92db10c21c321cf1349fd34129d7180e5088daf2bbe570de6427299aab68992c011c2e2939a44247396f5427c1d914a +95ce1892d1ce25ef2bc88a23880055a4d829a3b31f3806635fd49bec32cca4e965b129b6dd3e90f7e3a2eb293ffc548d +970cf816ee7501ade36b0b59f87c7e352957f67f1f75bbacd8ed52893f9fc40572c76f49c23db44866af7e34a63cd3f9 +a2fcd08581d3569fff699fd7ed1ede5f98f2b95956ecdf975a29af053d9f4f42600b3616ad6161e958c3ce60139c20a4 +b032688b6cc8a7e63dcb82694f71f087b1ee74c4d5fa27323b1ead3ba21722d7fc49eda765725b5553db5260005049c3 +b0b79e4329f1ad25ef6a603390baf889757cab5af10bfa6953a61f89aaace0442b9ef08e57ba778f1e97bf22f16f0ace +a2e6ac06f8973266cd0df447f82cec16614df65174c756e07f513e2c19aa82c10d8670047860960cfba3c5e4c42768c8 +811e66df0f3721a1ae0293549a0e3cd789f93fb6be2cab8e16015a6d52482af9057b1b75e9456322a5a9e87235e024cd +8744a80b3d9e37da4c50c536007981a4958d7e531cb93916dbf985cdc22f4ff482a5cc4fe50915c049d2de66530f1881 +b20b6e8c7be654c23c8ca440be2c37cf9cc9f4e81feedfd0cd7c56f37eda8f295fe5d415e9bac93d5f0a237edd8bc465 +b33fd84377f31f7819150d464b5eb3ef66e06cb8712665cf0587d61e1b1c121d11cc647f3753bbc18604941c77edbc1f +83acb8a3ec5f477b6d44cd49f9e091bc2bf7c9dfee876cde12075a7db9262314cb66ad2e7557114e0c19373e31c6eff1 +acfe4172327832ee207eb07da9cd37da3b009c776f7a8290529f0249f58da213254baddc7c3074fbaa1d226ba1e52b7c +81911b4dea863424b9d77a981987732382702e0294d8c8e1ec48e89678ecb0e64836b45205a120885fa8f8a3a4b9d4b0 +b11f61b1302579a11077bb2f1f0db371ab943573b261be288dc76172eee8a5102b992a5b526092d160ffd20aac2d4856 +ab491f7f1e002a44944c02537f365e525ebb6d5614bba8e5e8e8bd12064c702a1759571ddbeee592a0ba8b73cfce8810 +89211da3d92aed6b111de001b8b5a9231a1c2d09fb1cd2618ec457b635a6c8590fe119acca42fce76dce791c35b889c7 +a5f076c8f7164bcab8af59021ef97a0afa93d0877e52241c3ff5a9a9f81227a55c119ed6a84d34b196e94ec851ca5ca0 +80d91417d0d6c1adb5a3708165da1d54a83caaff482a4f65abf3fb335cbbc738c74ed19a8c451ca98befdf9b2d8b5f90 +aecba33a67f66401614eec5fa945e763da284edb9dc713bad4ac03972630781a09a3e2a291aac0605a9560c5f3444de5 +8a0aa1320bf5217a049b02ad02a4f892bfd6a3f5b48f472041d12f3aaab8dd197307f144f9de5f9e762c6b4971a121b4 +a4120a569e446fe4129f998e51f09c1cc7b29dc2b353d6f6f05daad1a4ef99acfcbaa4950a58aacf7ee1b3fde0af33d0 +aff71370d58b145758a5f24cf3c0c6667d22a1f950b8137c369fa845a5265cd645b422f24fa95e1cd7db1d68686120b6 +a839f075a8a702809a51fbc94595eab4f269a2e7a027aa1f4fc472e77f586138bf5aa4e5570a560e139eb6cda4cca161 +9484f1caa3e35cda0e3d36e43aff3dd8cf45a5a51fc34aafa3a63ed3543047ba9d6af2a9bc7c201c028499e6b4c41b28 +84ddb374c5c9170903bb3e1054fad071b0a147a9ca2ebe2fdb491ebb2431d53b398872a39cc385f973e38579d8e60158 +acaad8babaeaeb52c5b5a16ae689fa5ae15846f2d1f3596a52371bd8681819603822ee8d32ab8cda1bd5290d601e483f +946b69ca5361b60c3dc31db13669b05e5c0452f3c80e7e185f9667a36f351e9ed83bcb5c6dd2439ecd4490e3a87d260a +99f457221ac40df86f9b4bef0bf8812720b2f7218273a0aab08c4d4d4fb18a0fb0ef6ba9bf7fa53c116cc6f16742e44f +8bc0e812d8b718dbe48ead74a6bc7bac68897d01d097422be04110a25589bacd50d336d2c8b70d0dfde6c1b8bc372dc3 +895d118dae2fb35a4b0de22be0d000ec0f0f317b9494db7c12f10d7db81b6f3eaf6d6f3fdfe952f86ec4143d7469368d +893bf3d7e579e800526bc317438a69590d33759931830daf965cec721baa793ea335e9624a86b84b8fed5effc3e2bbac +a112d30dda88c749ca15d6dc65bcbc7fe838b2d25329d44410a9a96db195c7ce6a6921196a61ba7c9d40efdb101a164d +b88b5340af052fc3b8e1a8cf7532206801e79d878f1fb02b32ac4f8e91b64e0ec9252d808b87c4579de15886a20aaef1 +865f76475bb5da18c6a078c720c7b718e55d310876c98017c30ac31882ae347258b508ec34001918324250241d2df5b7 +b6d8a15913eb1714061d5cacbd0bb05edd83ecdb848a89b864e7411598e9f7814d0c039ebe4735437c8370d2ff183751 +a95fedce8351ae9c24d7fa06ebc5cd4e3aef87afaf04a7150e561a6a7f2347bdcec1e56b82d6e5f597fe7124f6cc503b +8526004ca0c802b073d50b0902ea69975949e7567b2e59ca2cf420bc53d91951d26096f2abb07a2955a51506e86488dd +99ccecaab68b6e5adadb9c848cb577de7e7ff4afc48d3b6b73bc0872730245b8a1c68cebf467074af6756d6226f4f4a7 +b5497d5c0cd79b7e6022e295642e1f2161254379eb78ef45e47f02c84ef5a3f6b6297718e4fac8093bf017287e456917 +b6943f30012b2093c351413c2b1b648afc14a5c4c0c338179d497e908451d2779919fe806181452ed386c1e8f8e8c25c +afdb56ce89bcd3247876c918cad68aad8da65d03c7c73ccbee0c4c39f3ad615aab87ffa0db5b3b63b4cc915d0b66deb7 +a44659d7be2f11d4d4949571d7bf84a6f27f874d3281edc34ef1098d321a4dcad9a42632b39633f8f9d20a39f54a2464 +a3e489b4db5832280dd58c62120262471b6fb4355c2ad307bd17c5c246b3f1e1b00f925930f5f5f6987de234fcbb7d16 +87a4e3a190340ed4949597703083d338e9c17263ba8a39b67100589f0dddbc420d9557f9522c17c71ae04b76876f8db0 +a35a3978e928eaac8c182a0a613c611ae7b4827c5e999f938eed06921c0294befdc21d02e68d035a2fc8d03c82641126 +a6898d90265dcf0fb215629f04b07c7918e022667583efe0bfe02f258b446954876c6ca9e369ffe1bb079e2314ebda32 +922fc52e648b6b2b6768c079c67ab425da72907a46add801715f8a2537280869d7071d527b833aa63ef562ce059a392b +8acbb7c4297196d8d1c131040c34cc7064656a148c2110b19c672abb094b1d084fafe967f7122ba9dd1523a4eaec3b42 +82dbf2cdd581fe3b81b156792228eae2485710e6c21dd5fd14614dc341bb0afbebbc0f32340eda9f094b630afcfc17e8 +907a095dca885da219e4558e9251ec765cf616e995c61546bc010963bf26f2d8adbd9b2ef61f2036e1740a627c20fbed +a7a83f849691d04640137989a2d0c90a7ed42a42b0ad328435d7e1fba557a27a58eec9170ab3d0099ec97da0c950765a +b7d435a801c2a5652cb479027f2c172eafa3df8ca0d896bbb9d49a42c42660fb382a8439bfed09ddf7e0214cb6066761 +8bc6b5e79af5512589f90de8e69bc858277055cf7243f592cc4edd193f03f71d16c9300097ddafb79752c63f135c884c +913264fca800467bee58a429e1f245ef303f5dbeea90f0ce6bb3c7ae6d1bd0f99ea75d3d309634684d2178642c81b5d8 +83ba558f9c23b785a123027c52924a1d7334c853a6165d4f5afd093b0b41951a36860ba0a20fa68f73d7db9df0e3ef38 +875b2df7cb54ecdf7ba31181b9dc7dbe02761ab8ffb61757d42a735c8e20d44bad5b904e76dcec6bb44883fdb9f4ad84 +af3dc5d2dd29565de8f4c700d5f1ab71dadb4351f06e9ee2eb5ee7a9b5da827d0c6726c6dc780748a26aa3b4d10e6c2d +a113ff09296b25f550f6d0d3f37dd4517b14cf6d5517293bd3068aa3aea765a8640fcd4bf0ba96db5c00167267fbd574 +a138c5cca485b9180ef091c9e327982bea203c165cb83564f416c36e813bea1ef1f6345f57c8a591df360541b7b758f5 +85793441e917ed520d41dda6e762269fb9f9702e5ef83cee3e90652d324536bf4233425cd05b54a383609076ab84ea13 +b422ac9de53d329e6321a8544c264d63cffc37965d627d7e180a999c3332644e21fedf10cd2f43cf6ba4fc542db91155 +a85d31d4bfa583a493681e57bfccca677ec5b85870a53de37f7be7833b573f8c8dcf029cea4ae548d83048030d77d56d +ab8a0702a371db496715a4ee8fcb6d430641b0f666d7fe3ef80c09df0bf570293cec1aa1675381c6bbd9ecc1f7cdccf9 +b308ef2b87438d35957191294782e9f5014a3394fadad3e2ccaf6ebf20fd889a36dbb8ddb3634baa8e2e131618aa4e70 +919e972e5b67cd65f377e937d67c27b4dd6fd42cfe394a34a70e8c253a1922f62ff36b9dcc7fbbc29b0960ad6a7fde88 +a0e4d4be28301af38a910971c8391ef3ec822ce35757226a7fd96955cd79afa14accba484ef4e7073e46b4b240a5863f +9422f6d424c1736b4b9bb9762aa62944085e8662c4460319dac4877b1e705aa5cd8b6b3a91268363ec3857c185685f4b +b7cf9f2053119d284a37df4e4489b632594df64e5dc846652ee26b4715e352e6333118b125021481138e4ec3e9f9987b +aea983e81c823472df8652654be8a60a8bf40147d599f87e323397f06bf88c98e9c6db0f28414f6ea4091f3eb0f6a96d +aa20bf03cd8b6ffda09fe0ef693fc0aaa3bb372603e786700e52063a4f7ee742771c41cf5e67e6248f99b7fc73f68dbf +8748a4978198071d7d5ddc08f8c8f0675d895dc19df0889e70bd86d44c469c719b93f6526c7e7e916c7bfeb9a1379aaf +b8fcd863d55dab2f7b1c93844306e00056ba17338ddfa3f02689a0b58b30239beb687b64c79b8420ecea8d0d082d9ffa +abb1a35952dc8a74dd1cdbc8ae7294c6bfd1910edab6f05c879e9ed06c636a949fe0017ec67f8f6f73effcb5817cccae +8bef43422b1c59e354b7f46c08a8eb78e26c4d01c236a4fe781cefb7465293a4444f2bdc68c6a221cd585a2494d9a1d7 +93527258940feff61befa18fcd6626fcff019d34a3ac8c6886599cbef75b15c15d689e8c1bd2177cc93c4c1792dee8d7 +b7f114eea99c8278841180ec8886ad2bab1826554a1657b9eeb17aa815f31b59c3931913ddec40aa9923bc92f8975635 +91a96446158b194a0a6ada2e37c8a45f3017c34034f757245f6f3b98c65d39d084e74d2a9dc271e5918faa53990ec63f +aea4ada0a853753db03f9790e20bab80d106f9b09e950f09aeaba5d869f0173bed673b866a96d6b0dd8123a539caac9a +b8e3e98ff0d3e512441e008a4a6783233045a4639e0c215c81984846b43ff98de99d7925cf717b1ca644f6229b6d16a2 +8987ef81a75213894e11e0310e8ba60fe06e2b264cc61655e5b51bf41cc8c3d6c10696642ea3517770f93be360207621 +8d4eff7335252f74af4a619c78625fd245df640f2086338dbb6c26b059f83fe70f3e81f5b6c12d62c0f784e572d56865 +a56f6389b0bac338f20c615d7d11e16045a76cbea23ced0a9d9067f538421c378200bfd4523b7c96094ab67f47f98d42 +83f5ab0727fd6ce8b3370ce3fac1f3a9c1930ea7ebbd16be61cc26f34aa1291ba4b5f16729d7d4f5924eaa4a1e31a04e +8cc62366874bf8751067a526ea32927584cef41174e2ec5a53079ee557067bc282f372b831cb2547c5e21a2f178c91b4 +b609e141006dc8d8649457efc03f8710d49abb34bc26a33ed4e173e51b85d7acdf18d74aed161b074f679d88f5aa2bf3 +873c7aa784c17b678443320950e494250baff8766db42619b9fc7ec4c3afa4eee290cd1f822b925d5b9e55c9cdd1af2f +859ba787f052d3665481c3dd58159ec8c238d918fb6d2787ebe275ef9acd377cb7aaa03a69820c78247bf51afee3d5bf +8eb1e6d2b0f51a3275b4a8be96957cb2d518b32c815dc0dfd5f75340c7dee73e5edc45db7c7d375c4ffaf8c59767d0c1 +85f3876ff5edbb826a9592e68db3dcc975725bfdda4fcac197758a8b27e4f493e6c531b1342ba0f5a75f965273720345 +8a1272f2678d4ba57e76c8758818965e6849971e8296b60ff85a522feeaaa3d23d3696c040d8bdaf1b380db392e988aa +85002b31ce31be7cc8757141a59a7cf9228b83144993d325b2241f5bfac09a02aca0c336307257f1a978c0bbf79fa4fe +b96bd26a6bbbc705c640285fd561943ef659fca73f25e8bf28cfcd21195752b40359d0edca0adc252d6e1784da267197 +936cfe367b83a798ab495b220f19cfe2e5bde1b879c8a130f84516ac07e3e3addcc791dc0e83a69c3afc225bed008542 +b1302f36190e204efd9b1d720bfaec162fcbba1b30400669dbcdd6e302c8c28f8b58b8bbde10f4512467dd78ed70d5e0 +8291b49f56259c8d6b4fd71525725dd1f35b87858606fc3fe7e048ac48b8a23ba3f0b1907b7c0d0c5ef6fa76cddc23f0 +97aca69d8e88ed8d468d538f863e624f6aed86424c6b7a861e3f45c8bf47c03e7b15d35e01f7add0a4157af171d9360c +b590d896e6b6f2e4dcffebfa67fc087fa518a9c8cb0834a5668cabe44e5c2b6f248f309b9cd74779030e172dba5d9e29 +97e7099bff654bcb37b051a3e8a5a7672d6ab7e93747a97b062fc7ae00c95deef51f5ced2966499217147058e00da4be +83435b739426f1b57f54ebad423939a68ad3d520db8ca5b7e28d1142ebfb4df93f418b180a6c226c0ca28fa0651163a0 +946c9144d982837c4dbc0b59544bdbc9f57e7c9ef0c82a7ad8cfddea78dedc379dbc97af54ba3ac751d844842a2990a4 +90ba1eff9c25adba8c3e6ef5b0d46c13de304632fec0646ee3a7bee69da2bc29e162dd3fb98a37ed1184ae5da359cf0a +b17b7a5c0a48eb9784efb5ff8499230b45efeb801cf68e13fe16d0d308511af5aa60e3b9a5610f96d7c2242ae57d455b +9991245e5617c4ea71575e5b2efe444f09cbbed13b130da08f8e9809d62512e8298a88d41f6aa3dbf3bcbc90654ceb18 +a1190c4cbccf2898a7fe025afd03f8652973a11cef59775fb47d69a6b4dcb9a5a0c554070421a5e10a75e43b63d37b79 +857c0a5f291eb35a76be11543a8c3d798187bd0717e2cdee50d390b66322d0d9529520fd3377136cdc93cfee99b6403f +944d11e5f9a3493c67786df94f129352d892fbdc43e98206b8dbf83cce240f65305e1768b38e5576048a31dca5c18f31 +818f361c5dae709e067a82b81beffbd9674de8df2bc1bfc3a27ddf326260e124e46b1e36697fb8de539b7736db093e9e +b07f5b737735a0d628e7ac2d335080b769bdb3acea38ad121e247a6e4307916ba1d029da5d341f079ea61eeaf7d8554e +a69e338803f3ee0fbbddc7ee481a13f6b64d25d71bae0d76f4b5145b54923cf1616c77ba0fd9ca37a3ae47208f490423 +acaee66b94e226622e28a144f93f6b1b442b9c79d7a8a1740c4d53044d0675a661e7453509b9e716e469fe11ce45ee31 +9402ca799d2e1cce0317ed49453ee0b2669b05e68ff101b89306db215c3941b3786ad3402d00369cb1dee020b56d3142 +849440c539fc0df3c8d06e23e271e6faa50234d5c057b8561e9376415f4396e548351cc677b0abeafe4f51b855a3dc83 +865b99587eb3dbc17e412647673f22b2e89185d1df1ec8ea04515585ad2edfb731be458123118dcd7b41b475026477b9 +9390618833b5adbaf24bd38cf9fc6f25104717f314259bb4da5c7a1f6963ecdc04d07bed391d8cd765c3d53567b2b6b1 +95383e8b1d0a629cec238b5ae2bda236a027f4e3b5f99ceace05f1d5a781ec1e7a43058f44ef0a5aee6b0db5697a0d89 +91739b8946d90db3a5244f7485295cc58143ba0449c9e539df1ba3c166ecf85ff914c9941192963c32d35033ae2f0980 +b5d88848d856d882db5947b9182025f0abf2bc4335b650fa0a48a578e2c87f32cc86d42d3b665ee2eab46d072bf1eccd +91f4c754549f5a53b1902ef84274ce9acf0bfd2e824e62eb127d67e3214ce05fc2430c05ea51e94dc6e8978f5d076bab +91fff8c75f8ad86afe78ec301de05e4ca71421d731419a17c747a9a0bf81129422c9499e4749107b168d1695dc90292f +99fbd7bede9cc1e2974c2a21c70788960c2dbf45a89552da8d73bb1d398b8399590707f2f4ba4b43cb356e703eb01b5e +80a51cd83e3d748c07b9ac82de1a697b09031e3edc7bf585f06cd0ffa8ea319517fcc2b735614b656677b54b4910814e +886b27de1f93311d1a31b6d698aa28b54fbd800decd8e25243d89e352ee38cb252d5648b5134a3e1ed021bae46e9da48 +976e70c94db905f83b4ef72188d840874bf005814c0c772f3832aa65b1f21927403125eea7a07b6d3305b1a781b36ab7 +b4adb9d1c49eb31462583580e3ffa625bea4f8b2a7d4927e4ff925c1759d4b3c1e43283d635b54fb0eabfbe1f4c12992 +b66b466bd48485ebeedd47e749d86cbaa3deffbbee2e69cfaa5e9f3bd28b143d7c1c0255a7a1393a2cc1490b2c485571 +8bded5bc0794513947ddb00ff6b780c5cc63a74e2a0b0284153c346a31c82e1eff07c073939da39e6f87a06c14ff1a80 +aceea8c6f799589f6b7070abf69fec724e6679514e60f1eaf9a52c37e9cebb72abcc833a81d8da1a4f5194c1a7eeff63 +89a9f76d053379687fd221ebcaf02c15c2c241bb673ef5298e32640a115d9e0f2331c3e185572cd65946dd6c5bd42412 +a57b6f1e3fdd92eadc6220760f22d0685a82cada1c7a1bda96d36e48e2852f74f3a83c757dd8857e0aee59e978da4919 +9106cf0891bb39ce87433c5f06a5c97a071d08ad44a7cbcd6918c0729c66bb317fbbee8aa45591cee332ad1234c7257d +96c18cca4a0f0299e0027ff697798085f9f698a7237052c5f191b1dba914e5a015ae356b80c17f0fdd31d08c5a939ebb +a892103c93df126c024825c07d8769bdac5f1d26ea9509ee26530dc594384b2a5095cc34e0b41ab3db0392a29792c9e8 +b7c2dbc95edb6fc25802ea051803b7bea682f87a99f8a9fdcc3091c81d914b9493dfb18a8894c964805298a6c22b07f2 +8e40948927d560a6840d7fb99802989ce72b43693e9dc7ed9dcda4bca7daedf75271cf656bcc22b3f999a550faad8648 +b354de1c6f0603df3ed9036c610281e55b51a48950ee3ce57a00b4692232de7ca57d19722700e15cbe67a91fcec2f786 +adf987b90737b933436d8036c1d3f0c9104f26c540052e22e703964f72739ac1261e4289b8f27dec47281a0f3f51378a +8ed5248e9c836fffa7c924178db593e1aaeb54bcf2e93c1983c1f3899cad538deeb2b836430fddc9b2f283e0797ea11e +907e5410e3bd5d7f55340e2f497bd1ca10bfcb4abed2c66a3cdf94dc40bbd7c43ac98754e0b4b223ea4c61eebf2f27f5 +8e81b441ea0397db28840fb4b3c3bfe6d8e31418816f7bda36f9c1cfe4556daee30c43639d90a2dc9b02a3d65e5f4ab2 +897085c477f5030f9fed06e181b05953a8cd2001d959dd6139738d40f1d673b2c7120b5348f678547acfdc90ffc9fcc6 +b0bf2784c4b3808a04be5a00a0593035ce162b3886e1500247b48365eac8ec3d27c7e5e6372e030c779c75fb79772d0d +af3fe6c75f2a1241ac885d5091ff3882cf01695d957d882e940f0c31f7a5b5e269c1a2bae7336e9a7cda2b1d23c03bd1 +a6d94e065f85736d77080a4f775885ccb0dd5efdbe747e4595280bca0ebe12450257c1beadcbec77566ef57508c5d4df +a5c50fe56b5532bf391da639a2f2b6cbb2634fc6637416fea7c29a522dea024d4adaaa29b6d472b4d2cc3e3b85c72e2a +afc35f5a03b245a6286318ef489db05d397bbd16c17b4e92eeb56509f875246c0176c01804139eb67dc4247c2a36ff9e +99ba14ab5a9612c078f9bbaa0e68fd1d52ecceb2ed19bd9abf8f98dd4ed1f9c4fa6e4d41bcef69be2ff020b291749ca8 +8018cdd3d96f331b4c470a4c3904bed44cadecbeec2544ca10e4352cf4ae1a856cf55f6383d666bf997ad3e16816006e +a9964790c318bb07b8fe61d230dd2161dd3160e186004647a925cfec4c583b4e33530bf5d93d8a14338b090055085b05 +ab89d8401df722101c2785cb3ef833017f58376ee82cedd3e9405b2534f259bb76063434a247652c7615a6de5194de65 +a72c3d320a0d40936dee8edfb36703be633aefbb8f89530df04eb6aebe0305ef4f4b6709436f8036d417272a7e47e22a +b3457661ad62634cc25e2918921a97b0bf5c59ccc7063bc8eb53194783f07659f42f8978c589228af5b12696588d8b2f +926fa35cd3ed4c8ad78af6284b87ae53b2e25a1ff50398034142a2bbed5b989ba3181ff116838931742c0fbcd8b8a56c +ae57fe506626432f27ae4f8791421c2df9efd9aaabe4b840ccf65fc3d0dd2f83e19eb63ae87bfa6898d37b5da869ddb2 +99c0a26ac74211db77918156d7ae9bea6ecf48da3ce9e53829a9ad5ed41321227c94fbd7449ae2e44aae801811552b1b +abdd2635b61cb948e51b762a256cf9d159b9fcb39b2fb11ba2fed1cb53475a03fc6e024a6a824a67a689396119a36a7b +a5ca98b98da8bb8eb07b1e5e3c85a854db42addefacd141771a0c63a8e198421dccc55ef1d94662ca99a7d83b9173fc3 +a821bb5cf1eb3aeae6318c8d554e2ea3137d73bb29d2e4450c9a33f441355ea77bb0e0e0ce7c819abc3ed119110a3a92 +95cdfb19b3f7196c26d60586e2c1efaa93352a712f8c8ef6209f6f318cecd52d7bebdfbfee4be1f5903a1595f73bc985 +aef6e6a400106e217f9888afcef0a1e1299b59017e77dc5453317dec0c32ae96873608bef3f1b504a7e4f45b06edc9c6 +96399ad093299ba26dc09ae85dbec9a1801dea4a338dd5d578bcdcb91246db0059e54098ba8a56cbb24600a40095cf79 +ad8b018ac99857ad4b38bdf6d110bbef64029a4d9f08df85a278c6ddc362a5f64e1f3a919f798ccb2f85a7f4ca1260b4 +b211f3b5dd91941d119c4fe05e2b4c7bb0ce0a8d7ef05932a96e850f549a78cd20cded0b3adb3f9f8b7058889ae2cb4e +ab780dd363671765c9c9ab0f4e7096aacf5894e042b75f40a92df8eb272a6229078cd6eadcc500eead3650860aa82177 +a4d96b16ab3abe77ead9b4477c81957e66a028f95557e390352743da53d1a7ba0c81d928a7ea8bc03b9900135ac36a6a +b4d4e028099bf0f28ac32141cd8de4ee7c3d62d4f519fad6abbb4ba39592750812220a4167d1da4c4f46df965f7cf43d +aa929c5f0bd8cb44a861bfb3d18340a58c61d82afa642447b71b1470a7b99fe3d5796bdd016b121838cb3594f5a92967 +a038e66f0a28aba19d7079643788db3eed8e412fb9ab4c0f6cacf438af4657cc386a7c22ae97ccc8c33f19a572d6431c +89c1ff879faa80428910e00b632d31c0cebb0c67e8f5ded333d41f918032282fb59fbcbe26d3156592f9692213667560 +8d899072c9d30e27065d73c79ce3130a09b6a4a4c7d9c4e4488fda4d52ad72bd5f1fd80f3a8936ef79cf362a60817453 +8ffb84a897df9031f9a8e7af06855180562f7ca796489b51bb7cca8d0ca1d9766a4de197a3eb7e298b1dfb39bc6e9778 +836ebd0b37e7ef4ff7b4fc5af157b75fa07a2244045c3852702eaafa119ca1260c654a872f1b3708b65671a2ece66ad2 +9292dfd6d5bfc95f043f4eb9855c10cbcf90fbd03e7a256c163749b23a307b46a331bdbd202236dca0e8ea29e24906de +8bc37eaa720e293e32b7986061d2ffcbd654d8143e661aabe5602adc832ab535cffbe12a7b571d423675636a74b956e4 +887455f368515340eb6f9b535f16a1cf3e22f0ceda2ead08c5caefccef4087e9f4b5d61c5b110ff3e28e4ab2ad9e97c5 +a6e5ec36e7712056fec00de15b8696952b17891e48ebe2fa90c6f782c7d927b430917b36b4a25b3d8466da3ca2a4985d +895cae36ba786104ec45740c5dc4f2416b2adce6e806815e3994e98d9e1be372eaec50094fbb7089015684874631ab7e +9687444fe6250c246b1711a8f73992f15c3cac801e79c54ffd5e243ad539fdd98727043e4f62d36daf866750de1ba926 +b17f75044c8e9ce311bb421a5427006b6fa1428706d04613bd31328f4549decd133e62f4b1917016e36eb02ea316a0ca +8538a84d2f9079dd272a7383ff03b7674f50b9c220e0399c794a2bcb825d643d0fc8095d972d5186b6f0fe9db0f7084f +af07b37644cc216e7083bac1c4e6095fa898f3417699df172c1f6e55d6c13c11f5279edd4c7714d65360b5e4c3c6731e +87eed8fe7486c0794884c344c07d3964f8fc065aebb0bb3426506ab879b2e0dfaefa5cece213ec16c7b20e6f946c0bd2 +8a4bf42f141d8bc47c9702779d692a72752510ef38e290d36f529f545a2295082a936c8420f59d74b200a8fff55167c4 +a7170e5e00a504a3b37cb19facf399c227497a0b1e9c8a161d541cb553eb8211449c6ac26fe79a7ff7b1c17f33591d74 +a9a2cc7232f07ef9f6d451680648f6b4985ecab5db0125787ac37280e4c07c8210bab254d0b758fd5e8c6bcf2ee2b9ff +8908d82ebfa78a3de5c56e052d9b5d442af67a510e88a76ba89e4919ae1620c5d15655f663810cfc0ee56c256a420737 +a9d47f3d14047ca86c5db9b71f99568768eaa8a6eb327981203fdb594bdb0a8df2a4a307f22dcea19d74801f4648ea89 +a7c287e0e202ebfc5be261c1279af71f7a2096614ee6526cd8b70e38bb5b0b7aca21a17140d0eddea2f2b849c251656a +97807451e61557d122f638c3f736ab4dab603538396dca0fcdf99f434a6e1f9def0521816b819b1c57ecdfa93bd077eb +a8486d60742446396c9d8bc0d4bed868171de4127e9a5a227f24cbf4efbbe5689bbd38f2105498706a6179340b00aed5 +a03b97c2a543dfefa1deb316db9316191ab14e3dd58255ce1027b4e65060d02fb5cb0d6ac1a2bf45bfeac72537b26429 +a7d25060f6861873410c296a4959a058174e9a1681ac41770788191df67fc1391545dab09de06b56cd73a811b676aa1b +96bb9c9aa85d205e085434d44f5021d8bbafc52cd2727b44e2a66094a4e5467b6294d24146b54c0d964c711e74a258d4 +b07b17f11267e577191e920fa5966880f85ff7089ac59d5d550e46f3a5cdadd94f438a547cd1ec66f20a447e421f96c6 +964e33e1571c97088fe7c8ca3430db60a8119f743a47aa0827e6e2fb9bae5ff3bf6cecd17b11dd34628546b6eb938372 +82a0513a05870b96509a559164e6ff26988ea8a2227ac6da9adc96fe793485a9eb6bdcab09afac7be4aef9a5ae358199 +b1185bc679623e7a37a873d90a2a6393fb5ccc86e74ba4ba6f71277df3623cde632feae4414d6429db6b4babde16dee0 +b3d77504b7032b5593a674d3c0cd2efbf56b2b44ed7fe8669f752828045e4e68202a37bf441f674b9c134886d4cee1df +95ab31749ff1f7b3f165ce45af943c6ed1f1071448c37009643a5f0281875695c16c28fc8d8011a71a108a2d8758e57d +b234dee9c56c582084af6546d1853f58e158549b28670b6783b4b5d7d52f00e805e73044a8b8bd44f3d5e10816c57ecc +86da5d2343f652715c1df58a4581e4010cf4cbe27a8c72bb92e322152000d14e44cc36e37ff6a55db890b29096c599b9 +8b7be904c50f36453eff8c6267edcb4086a2f4803777d4414c5c70c45b97541753def16833e691d6b68d9ef19a15cb23 +b1f4e81b2cdb08bd73404a4095255fa5d28bcd1992a5fd7e5d929cfd5f35645793462805a092ec621946aaf5607ef471 +a7f2ca8dacb03825ef537669baff512baf1ea39a1a0333f6af93505f37ed2e4bbd56cb9c3b246810feee7bacdf4c2759 +996d0c6c0530c44c1599ffdf7042c42698e5e9efee4feb92f2674431bbddf8cf26d109f5d54208071079dfa801e01052 +b99647e7d428f3baa450841f10e2dc704ce8125634cc5e7e72a8aa149bf1b6035adce8979a116a97c58c93e5774f72b7 +95960a7f95ad47b4a917920f1a82fbbecd17a4050e443f7f85b325929c1e1f803cf3d812d2cedeab724d11b135dde7a3 +8f9cd1efdf176b80e961c54090e114324616b2764a147a0d7538efe6b0c406ec09fd6f04a011ff40e0fa0b774dd98888 +b99431d2e946ac4be383b38a49b26e92139b17e6e0f0b0dc0481b59f1ff029fb73a0fc7e6fff3e28d7c3678d6479f5a3 +a888887a4241ce156bedf74f5e72bfa2c6d580a438e206932aefc020678d3d0eb7df4c9fe8142a7c27191837f46a6af6 +ab62224ea33b9a66722eb73cfd1434b85b63c121d92e3eebb1dff8b80dd861238acf2003f80f9341bfea6bde0bfcd38c +9115df3026971dd3efe7e33618449ff94e8fd8c165de0b08d4a9593a906bbed67ec3ed925b921752700f9e54cd00b983 +95de78c37e354decd2b80f8f5a817d153309a6a8e2f0c82a9586a32051a9af03e437a1fb03d1b147f0be489ef76b578b +a7b8a6e383de7739063f24772460e36209be9e1d367fe42153ffe1bccb788a699e1c8b27336435cd7bf85d51ba6bfdd6 +937a8af7ed18d1a55bf3bbe21e24363ae2cb4c8f000418047bf696501aaeec41f2ddf952fd80ef3373f61566faa276a9 +ab5e4931771aeb41c10fa1796d6002b06e512620e9d1c1649c282f296853c913f44e06e377a02f57192b8f09937282eb +893d88009754c84ec1c523a381d2a443cb6d3879e98a1965e41759420a088a7582e4d0456067b2f90d9d56af4ea94bba +91b2388a4146ebaaa977fec28ffbfb88ac2a1089a8a258f0451c4152877065f50402a9397ba045b896997208b46f3ebf +8ce0523192e4cc8348cd0c79354a4930137f6f08063de4a940ea66c0b31d5ea315ce9d9c5c2ec4fa6ee79d4df83840dd +b72f75c4ab77aca8df1a1b691b6ef1a3ff1c343dd9ed48212542e447d2ed3af3017c9ad6826991e9ef472348c21b72a4 +af0fa5a960f185326877daf735ad96c6bd8f8f99ab0ab22e0119c22a0939976ece5c6a878c40380497570dc397844dba +adf9f41393e1196e59b39499623da81be9f76df047ae2472ce5a45f83871bb2a0233e00233b52c5c2fa97a6870fbab0a +8d9fc3aecd8b9a9fca8951753eea8b3e6b9eb8819a31cca8c85a9606ce1bd3885edb4d8cdbc6f0c54449c12927285996 +901969c1d6cac2adcdc83818d91b41dc29ef39c3d84a6f68740b262657ec9bd7871e09b0a9b156b39fa62065c61dacb1 +9536a48ccd2c98f2dcbff3d81578bbb8f828bf94d8d846d985f575059cd7fb28dfa138b481d305a07b42fcb92bacfa11 +8d336654833833558e01b7213dc0217d7943544d36d25b46ecc1e31a2992439679205b5b3ab36a8410311109daa5aa00 +95113547163e969240701e7414bf38212140db073f90a65708c5970a6aaf3aba029590a94839618fc3f7dd4f23306734 +a959d77a159b07b0d3d41a107c24a39f7514f8ce24efa046cfcf6ace852a1d948747f59c80eb06277dce1a2ba2ec8ea9 +8d2cb52dd7f5c56ef479c0937b83b8519fa49eb19b13ea2ec67266a7b3d227fb8d0c2454c4618d63da1c8e5d4171ac7b +9941698c5078936d2c402d7db6756cc60c542682977f7e0497906a45df6b8d0ffe540f09a023c9593188ba1b8ce6dfcb +9631d9b7ec0fc2de8051c0a7b68c831ba5271c17644b815e8428e81bad056abb51b9ca2424d41819e09125baf7aaf2d4 +a0f3d27b29a63f9626e1925eec38047c92c9ab3f72504bf1d45700a612682ad4bf4a4de41d2432e27b745b1613ff22f9 +80e3701acfd01fc5b16ecfa0c6c6fd4c50fe60643c77de513f0ad7a1a2201e49479aa59056fd6c331e44292f820a6a2c +a758c81743ab68b8895db3d75030c5dd4b2ccc9f4a26e69eb54635378a2abfc21cba6ca431afb3f00be66cffba6ab616 +a397acb2e119d667f1ab5f13796fd611e1813f98f554112c4c478956c6a0ebaceef3afae7ee71f279277df19e8e4543a +a95df7d52b535044a7c3cf3b95a03bafd4466bdb905f9b5f5290a6e5c2ac0f0e295136da2625df6161ab49abcdacb40f +8639fc0c48211135909d9e999459568dbdbbc7439933bab43d503e07e796a1f008930e8a8450e8346ab110ec558bcbb9 +a837bcc0524614af9e7b677532fabfb48a50d8bec662578ba22f72462caabda93c35750eed6d77b936636bf165c6f14e +97d51535c469c867666e0e0d9ed8c2472aa27916370e6c3de7d6b2351a022e2a5330de6d23c112880b0dc5a4e90f2438 +aadb093c06bd86bd450e3eb5aa20f542d450f9f62b4510e196f2659f2e3667b0fe026517c33e268af75a9c1b2bc45619 +860cef2e0310d1a49a9dd6bc18d1ca3841ed1121d96a4f51008799b6e99eb65f48838cd1e0c134f7358a3346332f3c73 +b11c4f9e7ef56db46636474a91d6416bcb4954e34b93abf509f8c3f790b98f04bd0853104ec4a1ff5401a66f27475fce +87cb52e90a96c5ee581dc8ab241e2fd5df976fe57cc08d9ffda3925a04398e7cffaf5a74c90a7319927f27c8a1f3cef5 +b03831449f658a418a27fd91da32024fdf2b904baf1ba3b17bbf9400eaddc16c3d09ad62cc18a92b780c10b0543c9013 +94e228af11cb38532e7256fa4a293a39ffa8f3920ed1c5ad6f39ce532e789bb262b354273af062add4ca04841f99d3aa +99eb3aeb61ec15f3719145cf80501f1336f357cc79fca6981ea14320faed1d04ebe0dbce91d710d25c4e4dc5b6461ebf +920a3c4b0d0fbe379a675e8938047ea3ec8d47b94430399b69dd4f46315ee44bd62089c9a25e7fa5a13a989612fe3d09 +b6414a9a9650100a4c0960c129fa67e765fe42489e50868dd94e315e68d5471e11bfbc86faffb90670e0bec6f4542869 +94b85e0b06580a85d45e57dae1cfd9d967d35bdfcd84169ef48b333c9321f2902278c2594c2e51fecd8dbcd221951e29 +b2c0a0dd75e04a85def2a886ee1fda51f530e33b56f3c2cf61d1605d40217aa549eef3361d05975d565519c6079cc2ac +abb0ea261116c3f395360d5ac731a7514a3c290f29346dc82bacb024d5455d61c442fefe99cc94dddcae47e30c0e031f +a32d95ae590baa7956497eddf4c56bff5dfdc08c5817168196c794516610fcc4dbcd82cf9061716d880e151b455b01e0 +8bd589fb6e3041f3ef9b8c50d29aed1a39e90719681f61b75a27489256a73c78c50c09dd9d994c83f0e75dfe40b4de84 +82d01cdaf949d2c7f4db7bfadbf47e80ff9d9374c91512b5a77762488308e013689416c684528a1b16423c6b48406baf +b23e20deb7e1bbbc328cbe6e11874d6bdbb675704a55af1039b630a2866b53d4b48419db834a89b31ebed2cfc41278dd +a371559d29262abd4b13df5a6a5c23adab5a483f9a33a8d043163fcb659263322ee94f872f55b67447b0a488f88672d6 +85b33ddf4a6472cacc0ed9b5ec75ed54b3157e73a2d88986c9afa8cb542e662a74797a9a4fec9111c67e5a81c54c82b3 +af1248bc47a6426c69011694f369dc0ec445f1810b3914a2ff7b830b69c7e4eaa4bafec8b10ed00b5372b0c78655a59b +94b261ed52d5637fd4c81187000bd0e5c5398ce25797b91c61b30d7b18d614ab9a2ca83d66a51faf4c3f98714e5b0ea5 +953d4571c1b83279f6c5958727aaf9285d8b8cbdbfbaff51527b4a8cfdd73d3439ba862cdb0e2356e74987ff66d2c4d9 +b765dae55d0651aca3b3eaef4ca477f0b0fda8d25c89dccd53a5573dd0c4be7faaadaa4e90029cdd7c09a76d4ce51b91 +b6d7b7c41556c85c3894d0d350510b512a0e22089d3d1dd240ad14c2c2b0ce1f003388100f3154ad80ec50892a033294 +a64561dc4b42289c2edf121f934bc6a6e283d7dce128a703f9a9555e0df7dda2825525dbd3679cd6ba7716de230a3142 +a46c574721e8be4a3b10d41c71057270cca42eec94ca2268ee4ab5426c7ce894efa9fa525623252a6a1b97bcf855a0a5 +a66d37f1999c9c6e071d2a961074c3d9fdcf9c94bf3e6c6ed82693095538dd445f45496e4c83b5333b9c8e0e64233adc +ab13814b227a0043e7d1ff6365360e292aca65d39602d8e0a574d22d25d99ccb94417c9b73095632ff302e3d9a09d067 +b2c445b69cff70d913143b722440d2564a05558d418c8ef847483b5196d7e581c094bae1dbb91c4499501cfa2c027759 +87cbde089962d5f093324b71e2976edbe6ad54fb8834dd6e73da9585b8935fca1c597b4d525949699fdfa79686721616 +a2c7e60966acb09c56cf9ad5bdcc820dcabf21ef7784970d10353048cf3b7df7790a40395561d1064e03109eaac0df98 +8ea7b8af208678178553946b2ee9e68c0e751b34f3652409a5e66c40d3aee3a40ba6ffe2175ce16c6a81b78ecc597d02 +960234239e1e3ea262e53d256ad41b2fe73f506b3d130732d0ee48819eb8a9c85bb5106a304874d8625afae682c34015 +858459694c4e8fdafa6cdaee1184e1305ca6e102222b99b8e283dd9bb3ebf80e55d6c4d8831a072b813c8eceb8124d95 +a30a8ce0f44aeb5590dc618c81c7cac441470ce79fd7881a8f2ea4ca5f9d848ebde762fcaee985cbd3d5990367403351 +a83867643672248b07d3705813b56489453e7bc546cdba570468152d9a1bd04f0656034e7d03736ea156fc97c88dc37f +a7bb52e0fc58b940dc47ea4d0a583012ee41fad285aba1a60a6c54fa32cfe819146888c5d63222c93f90de15745efb2b +8627bcc853bdeaad37f1d0f7d6b30ada9b481ccdf79b618803673de8a142e8a4ce3e7e16caed1170a7332119bcdc10a9 +8903d9dc3716b59e8e99e469bd9fde6f4bca857ce24f3a23db817012f1ea415c2b4656c7aeca31d810582bb3e1c08cc6 +875169863a325b16f892ad8a7385be94d35e398408138bd0a8468923c05123d53dba4ce0e572ea48fcdadd9bd9faa47a +b255b98d46d6cc44235e6ce794cc0c1d3bd074c51d58436a7796ce6dc0ae69f4edaa3771b35d3b8a2a9acd2f6736fab3 +9740c4d0ee40e79715a70890efda3455633ce3a715cbfc26a53e314ebbe61937b0346b4859df5b72eb20bcba96983870 +a44ce22ab5ddc23953b02ec187a0f419db134522306a9078e1e13d5bf45d536450d48016a5e1885a346997003d024db0 +90af81c08afdccd83a33f21d0dc0305898347f8bd77cc29385b9de9d2408434857044aec3b74cb72585338c122e83bb4 +80e162a7656c9ae38efa91ae93e5bd6cb903f921f9f50874694b9a9e0e2d2595411963d0e3f0c2d536b86f83b6e4d6ef +8b49fa6babe47291f9d290df35e94e83be1946784b9c7867efd8bc97a12be453013939667164b24aeb53d8950288a442 +a1df6435d718915df3da6dda61da1532a86e196dc7632703508679630f5f14d4cb44ce89eff489d7ff3fe599cc193940 +afd44c143dbb94c71acc2a309c9c88b8847ef45d98479fccce9920db9b268e8e36f8db9f02ff4ee3cff01e548f719627 +b2cf33d65d205e944b691292c2d9b0b124c9de546076dd80630742989f1ffd07102813c64d69ba2a902a928a08bce801 +b9f295e9f9eca432b2d5c77d6316186027caca40a6d6713f41356497a507b6e8716fb471faf973aaa4e856983183c269 +b3bd50c4b034473edce4b9be1171376a522899cb0c1a1ae7dc22dd2b52d20537cf4129797235084648ac4a3afc1fa854 +8ef37683d7ca37c950ba4df72564888bedaf681931d942d0ea88ead5cc90f4cbef07985a3c55686a225f76f7d90e137d +82107855b330bc9d644129cebecf2efbfab90f81792c3928279f110250e727ce12790fd5117501c895057fa76a484fc0 +816a5474c3b545fb0b58d3118cc3088a6d83aad790dbf93025ad8b94a2659cceba4fa6a6b994cb66603cc9aef683a5e3 +8f633f9b31f3bb9b0b01ea1a8830f897ecd79c28f257a6417af6a5f64e6c78b66c586cf8d26586830bd007fb6279cd35 +acb69d55a732b51693d4b11f7d14d21258d3a3af0936385a7ce61e9d7028a8fe0dd902bda09b33fb728bc8a1bc542035 +8d099582ac1f46768c17bf5a39c13015cfe145958d7fc6ddfd2876ad3b1a55a383fbe940e797db2b2b3dc8a232f545dc +97a4dd488b70bf772348ececaca4cf87bc2875d3846f29fe6ef01190c5b030219b9e4f8137d49ea0cc50ca418024c488 +b4d81148f93fa8ec0656bbfb5f9d96bbf5879fa533004a960faac9fd9f0fe541481935fdf1f9b5dd08dff38469ef81c5 +8e9b2ae4fc57b817f9465610a77966caaff013229018f6c90fa695bd734cb713b78a345b2e9254b1aff87df58c1cd512 +99eb7126e347c636e9a906e6bfdc7c8ca0c1d08580c08e6609889a5d515848c7ca0f32ab3a90c0e346f976a7883611f7 +8ca87944aa3e398492b268bda0d97917f598bc0b28584aa629dfec1c3f5729d2874db422727d82219880577267641baa +88ab0e290dc9a6878d6b4e98891ff6bfc090e8f621d966493fcbe1336cc6848fcbb958d15abcfa77091d337da4e70e74 +8956a2e1dc3ec5eb21f4f93a5e8f0600a06e409bb5ec54e062a1290dff9ce339b53fbbfc4d42b4eed21accea07b724d6 +8d22220da9dc477af2bddb85c7073c742c4d43b7afee4761eba9346cadbcd522106ed8294281a7ef2e69883c28da0685 +90dafd9a96db7e1d6bde424245305c94251d5d07e682198ae129cd77bd2907a86d34722cbde06683cc2ca67cebe54033 +b5202e62cf8ea8e145b12394bd52fd09bda9145a5f78285b52fda4628c4e2ccfc2c208ecde4951bd0a59ac03fa8bc202 +8959856793ba4acf680fb36438c9722da74d835a9fe25a08cf9e32d7800c890a8299c7d350141d2e6b9feceb2ebb636f +ab0aa23c1cd2d095825a3456861871d298043b615ae03fcd9283f388f0deef3cc76899e7fde15899e3edf362b4b4657f +9603b333cc48fe39bea8d9824cfee6ac6c4e21668c162c196ecd1ff08ef4052ace96a785c36b8f7906fdcb6bc8802ddd +93bfecbc3c7cc03c563240e109850a74948f9fa078eb903b322368cda0b50888663a17953579578ba060b14dbf053024 +b01f843b808cf7939a474de155a45462e159eb5044f00c6d77e0f7ec812720a3153209e971a971ccbf5ebee76ec4074f +b009e0567c3c75ed767247d06fa39049a4d95df3392d35a9808cb114accf934e78f765cd18a2290efef016f1918c7aeb +ad35631df8331da3a12f059813dfa343d831225a392f9c7e641c7d23a6c1ad8df8e021201c9f6afb27c1575948d6bf68 +a89c2a631d84128471c8ef3d24b6c35c97b4b9b5dad905c1a092fb9396ae0370e215a82308e13e90e7bb6ebcc455eb2a +b59c7f5fbfeb02f8f69e6cedef7ff104982551f842c890a14834f5e834b32de1148cf4b414a11809d53dd3f002b15d6a +aa6f267305b55fede2f3547bc751ba844ce189d0b4852022712b0aee474de54a257d4abcd95efe7854e33a912c774eba +afddd668f30cce70904577f49071432c49386ec27389f30a8223b5273b37e6de9db243aceb461a7dc8f1f231517463a9 +b902a09da9157b3efa1d98f644371904397019d0c84915880628a646a3ad464a9d130fdc651315098179e11da643ad2e +b05f31957364b016c6f299ae4c62eede54cab8ea3871d49534828c8bdc6adbc6a04a708df268f50107d81d1384d983ae +b4c3f7284802e614ddf1f51640f29e7139aae891467d5f62778310372071793e56fbd770837b97d501191edd0da06572 +b4eddb7c3775fb14fac7f63bb73b3cde0efa2f9a3b70e6a65d200765f6c4b466d3d76fcd4d329baee88e2aba183b8e69 +a83e7dbae5a279f0cfd1c94e9849c58a3d4cecc6d6d44bb9b17508576ca347fca52c2c81371d946b11a09d4ed76ec846 +8018ea17e2381c0233867670f9e04c8a47ace1207fdcf72dce61b6c280ba42d0a65f4b4e0b1070cc19c7bb00734974d9 +af90b541dfed22e181ff3ef4cf11f5e385fd215c1e99d988e4d247bc9dcee9f04f2182b961797c0bcc5f2aaa05c901a9 +a37046e44cf35944e8b66df80c985b8a1aa7004a2fd0b81ac251638977d2ff1465f23f93ac0ce56296f88fdc591bbdd7 +a735bd94d3be9d41fcd764ec0d8d7e732c9fc5038463f7728fd9d59321277e2c73a45990223bd571dab831545d46e7aa +94b32dcb86f5d7e83d70a5b48fe42c50f419be2f848f2d3d32ee78bf4181ab18077a7666eedb08607eece4de90f51a46 +a7f0804cafbf513293485afc1b53117f0cbfaea10919e96d9e4eb06f0c96535e87065d93f3def1bbc42044dbb00eb523 +aaaad1166d7f19f08583dd713275a71a856ab89312f84ca8078957664924bb31994b5c9a1210d0c41b085be4058ed52e +a1757aac9f64f953e68e680985a8d97c5aac8688b7d90f4db860166dd3d6119e8fca7d700a9530a2b9ba3932c5e74e33 +98cada5db4a1430c272bfc1065fb685872e664ed200d84060ee9f797d0a00864f23943e0fb84ba122a961996a73dfb14 +a5e609f716dc7729d1247f40f9368a2e4a15067e1dd6a231fece85eeefb7e7d4a5ac8918fb376debd79d95088750b2ca +b5365eb8caab8b1118619a626ff18ce6b2e717763f04f6fa8158cdca530c5779204efa440d088083f1a3685454aa0555 +a6e01b8da5f008b3d09e51a5375d3c87c1da82dff337a212223e4d0cdb2d02576d59f4eef0652d6b5f2fc806d8c8149c +ae310f613d81477d413d19084f117248ad756572c22a85b9e4c86b432e6c602c4a6db5edf2976e11f7353743d679e82a +a1f219c0b8e8bb8a9df2c6c030acbb9bbfa17ba3db0366f547da925a6abb74e1d7eb852bd5a34bae6ac61d033c37e9dc +a2087fa121c0cdd5ea495e911b4bc0e29f1d5c725aadfb497d84434d2291c350cdaa3dc8c85285f65a7d91b163789b7a +929c63c266da73d726435fa89d47041cfe39d4efa0edce7fc6eca43638740fbc82532fd44d24c7e7dd3a208536025027 +91c1051dcc5f52ad89720a368dddd2621f470e184e746f5985908ba34e1d3e8078a32e47ab7132be780bea5277afecb0 +ae089b90ba99894d5a21016b1ea0b72a6e303d87e59fb0223f12e4bb92262e4d7e64bfdbdb71055d23344bc76e7794b2 +8b69aa29a6970f9e66243494223bad07ac8f7a12845f60c19b1963e55a337171a67bdc27622153016fce9828473a3056 +95ca6b08680f951f6f05fd0d180d5805d25caf7e5bda21c218c1344e661d0c723a4dfc2493642be153793c1b3b2caaa4 +a4789dc0f2a07c794dab7708510d3c893d82ddbd1d7e7e4bbbeca7684d9e6f4520fb019b923a06c7efab0735f94aa471 +93c4f57a3cf75085f5656b08040f4cd49c40f1aab6384a1def4c5c48a9fe4c03514f8e61aabe2cfa399ff1ccac06f869 +b6c37f92c76a96b852cd41445aa46a9c371836dd40176cc92d06666f767695d2284a2780fdfd5efc34cf6b18bcfb5430 +9113e4575e4b363479daa7203be662c13d7de2debcda1c142137228aeead2c1c9bc2d06d93a226302fa63cc75b7353ec +b70addeb5b842ac78c70272137f6a1cef6b1d3a551d3dd906d9a0e023c8f49f9b6a13029010f3309d0b4c8623a329faf +b976a5132b7eb42d5b759c2d06f87927ef66ecd6c94b1a08e4c9e02a4ce7feca3ac91f9479daa1f18da3d4a168c2ba77 +8fdab795af64b16a7ddf3fad11ab7a85d10f4057cf7716784184960013baa54e7ba2050b0e036dc978ff8c9a25dc5832 +b2c982ad13be67d5cdc1b8fac555d4d1ec5d25f84e58b0553a9836f8f9e1c37582d69ad52c086a880a08b4efcccd552e +810661d9075ae6942735215f2ab46d60763412e1f6334e4e00564b6e5f479fc48cf37225512abbccf249c0ca225fc935 +a0c4bf00a20f19feff4004004f08231b4c6c86ac4ed57921eea28d7dea32034f3f4ab5b7ded7184f6c7ffbf5847232ad +b2bb5a9eea80bf067f3686a488529d9c2abd63fc9e1d4d921b1247ef86d40cd99e0a8b74f750e85c962af84e84e163a6 +887ee493c96d50f619ba190ce23acddc5f31913e7a8f1895e6339d03794ecefd29da5f177d1d25bc8df8337ae963fc7b +b7966fb07029d040f2228efa2cfcd04341e4666c4cf0b653e6e5708631aa2dd0e8c2ac1a62b50c5a1219a2737b82f4f7 +92234cfd6b07f210b82db868f585953aafbcbc9b07b02ded73ff57295104c6f44a16e2775ca7d7d8ee79babb20160626 +8d3cd7f09c6fd1072bc326ff329e19d856e552ac2a9f20274bc9752527cd3274142aa2e32b65f285fb84bc3adaaea3cc +8caed1cb90d8cd61e7f66edc132672172f4fa315e594273bb0a7f58a75c30647ec7d52eda0394c86e6477fbc352f4fe8 +ae192194b09e9e17f35d8537f947b56f905766c31224e41c632c11cd73764d22496827859c72f4c1ab5fd73e26175a5d +8b7be56aac76d053969e46882d80a254e89f55c5ab434883cbafc634a2c882375898074a57bc24be3c7b2c56401a7842 +98bc4a7a9b05ba19f6b85f3ee82b08bed0640fd7d24d4542eb7a7f7fde443e880bdb6f5499bd8cb64e1ddd7c5f529b19 +a5a41eaa5e9c1d52b00d64ab72bc9def6b9d41972d80703e9bfe080199d4e476e8833a51079c6b0155b78c3ab195a2a7 +a0823f6f66465fd9be3769c164183f8470c74e56af617f8afd99b742909d1a51f2e0f96a84397597afbd8eeaabb51996 +801da41d47207bdd280cc4c4c9753a0f0e9d655e09e0be5f89aeed4ce875a904f3da952464399bf8efc2398940d5fba2 +a719314085fd8c9beac4706c24875833d59a9a59b55bca5da339037c0a5fc03df46dbecb2b4efcfed67830942e3c4ea1 +a75dde0a56070bb7e9237b144ea79f578d413a1cbbd1821cee04f14f533638b24f46d88a7001e92831843b37ed7a709f +a6b4ef8847a4b980146e1849e1d8ab38695635e0394ca074589f900ce41fa1bb255938dc5f37027523bac6a291779bef +b26d84dfd0b7bd60bcfdbea667350462a93dca8ff5a53d6fc226214dcb765fada0f39e446a1a87f18e4e4f4a7133155f +ae7bd66cc0b72f14ac631ff329a5ca4958a80ba7597d6da049b4eb16ac3decde919ca5f6f9083e6e541b303fb336dc2f +a69306e6bfbbc10de0621cffb13c586e2fcfd1a80935e07c746c95651289aec99066126a6c33cb8eb93e87d843fc631f +a47e4815585865218d73c68ba47139568ea7ae23bfa863cb914a68454242dd79beaec760616b48eea74ceab6df2298dd +b2da3cfb07d0721cd226c9513e5f3ace98ed2bc0b198f6626b8d8582268e441fa839f5834f650e2db797655ca2afa013 +b615d0819554f1a301a704d3fc4742bd259d04ad75d50bccee3a949b6226655f7d623301703506253cca464208a56232 +85e06ed5797207f0e7ae85909e31776eb9dae8af2ec39cc7f6a42843d94ea1de8be2a3cdadfcbe779da59394d4ffeb45 +8c3529475b5fdbc636ee21d763f5ec11b8cb040a592116fb609f8e89ca9f032b4fa158dd6e9ceab9aceb28e067419544 +accddb9c341f32be82b6fa2ef258802c9ae77cd8085c16ec6a5a83db4ab88255231b73a0e100c75b7369a330bfc82e78 +93b8e4c6e7480948fa17444b59545a5b28538b8484a75ad6bc6044a1d2dbd76e7c44970757ca53188d951dc7347d6a37 +90111721d68b29209f4dc4cfb2f75ab31d15c55701922e50a5d786fb01707ab53fcec08567cd366362c898df2d6e0e93 +b60a349767df04bd15881c60be2e5cc5864d00075150d0be3ef8f6b778715bebca8be3be2aa9dbdc49f1a485aeb76cda +b8d5a967fdd3a9bcf89a774077db39ef72ca9316242f3e5f2a350202102d494b2952e4c22badecd56b72ba1eea25e64b +8499ebd860f31f44167183b29574447b37a7ee11efcc9e086d56e107b826b64646b1454f40f748ccac93883918c89a91 +99c35e529782db30f7ccab7f31c225858cf2393571690b229ece838ec421a628f678854a1ddbd83fa57103ccebd92c7f +99817660d8b00cbe03ec363bcdc5a77885586c9e8da9e01a862aca0fc69bf900c09b4e929171bc6681681eae10450541 +8055e130964c3c2ebd980d3dc327a40a416bcdbf29f480480a89a087677a1fb51c823b57392c1db72f4093597100b8d3 +877eaddef845215f8e6f9ed24060c87e3ab6b1b8fbb8037d1a57e6a1e8ed34d00e64abb98d4bf75edb5c9788cbdccbef +b5432bbff60aeae47f2438b68b123196dfb4a65cc875b8e080501a4a44f834b739e121bec58d39ac36f908881e4aa8ab +b3c3f859b7d03ff269228c0f9a023b12e1231c73aba71ad1e6d86700b92adc28dfa3757c052bbc0ba2a1d11b7fda4643 +ab8a29f7519a465f394ef4a5b3d4924d5419ca1489e4c89455b66a63ac430c8c9d121d9d2e2ed8aa1964e02cd4ebac8c +866ae1f5c2a6e159f2e9106221402d84c059f40d166fab355d970773189241cd5ee996540d7c6fc4faf6f7bcff967dce +973a63939e8f1142a82b95e699853c1e78d6e05536782b9bb178c799b884f1bc60177163a79a9d200b5ff4628beeb9e7 +a5fc84798d3e2d7632e91673e89e968f5a67b7c8bb557ea467650d6e05e7fe370e18d9f2bdd44c244978295cf312dc27 +b328fe036bcd0645b0e6a15e79d1dd8a4e2eda128401a4e0a213d9f92d07c88201416fc76193bb5b1fe4cb4203bab194 +99239606b3725695a570ae9b6fb0fb0a34ad2f468460031cfa87aa09a0d555ff606ff204be42c1596c4b3b9e124b8bd6 +af3432337ca9d6cce3574e23e5b7e4aa8eda11d306dc612918e970cc7e5c756836605a3391f090a630bac0e2c6c42e61 +8a545b3cb962ce5f494f2de3301de99286c4d551eaa93a9a1d6fef86647321834c95bf754c62ec6c77116a21494f380d +8f9b8ea4c25469c93556f1d91be583a5f0531ac828449b793ba03c0a841c9c73f251f49dd05cbb415f5d26e6f6802c99 +a87199e33628eeffd3aff114e81f53dd54fba61ba9a9a4d7efdbff64503f25bc418969ab76ef1cf9016dd344d556bb29 +a2fda05a566480602274d7ffcaefdd9e94171286e307581142974f57e1db1fa21c30be9e3c1ac4c9f2b167f92e7c7768 +a6235d6a23304b5c797efb2b476ed02cb0f93b6021a719ae5389eb1e1d032944ae4d69aec2f29fcd6cbc71a6d789a3ba +a7f4a73215f7e99e2182c6157dd0f22e71b288e696a8cff2450689a3998f540cfb82f16b143e90add01b386cb60d8a33 +922d8f9cd55423f5f6a60d26de2f8a396ac4070a6e2dc956e50c2a911906aa364d4718aea29c5b61c12603534e331e7e +96d7fdf5465f028fc28f21fbfe14c2db2061197baf26849e6a0989a4ea7d5e09ab49a15ba43a5377b9354d01e30ce860 +8f94c4255a0fc1bd0fa60e8178c17f2a8e927cac7941c5547d2f8f539e7c6ed0653cab07e9fb1f2c56cdd03bb876512a +95984c10a2917bfa6647ebce69bf5252d9e72d9d15921f79b2c6d7c15ee61342b4fb8a6d34838e07132b904f024ded04 +93e65e765a574277d3a4d1d08ca2f2ff46e9921a7806ca8ca3d8055f22d6507744a649db7c78117d9168a1cbdb3bbc61 +8d453b7364662dc6f36faf099aa7cbbe61151d79da7e432deba7c3ed8775cfe51eaf1ba7789779713829dde6828e189a +acffa3ee6c75160286090162df0a32a123afb1f9b21e17fd8b808c2c4d51a4270cab18fba06c91ef9d22e98a8dc26cdd +a5597cc458186efa1b3545a3926f6ecaaa6664784190e50eed1feac8de56631bee645c3bac1589fa9d0e85feb2be79d4 +87ba9a898df9dfa7dabc4ab7b28450e4daf6013340e329408d1a305de959415ab7315251bad40511f917dfc43974e5f0 +a598778cf01d6eef2c6aabc2678e1b5194ee8a284ebd18a2a51a3c28a64110d5117bcbf68869147934e600572a9e4c8a +84c69a4ad95861d48709f93ade5ac3800f811b177feb852ebcd056e35f5af5201f1d8a34ab318da8fe214812d0a7d964 +9638a237e4aed623d80980d91eda45e24ebf48c57a25e389c57bd5f62fa6ffa7ca3fb7ae9887faf46d3e1288af2c153b +800f975721a942a4b259d913f25404d5b7b4c5bf14d1d7e30eee106a49cb833b92058dab851a32ee41faf4ef9cb0dea4 +b9127a34a59fed9b5b56b6d912a29b0c7d3cb9581afc9bd174fc308b86fdb076f7d436f2abc8f61cef04c4e80cd47f59 +8004eda83f3263a1ccfc8617bc4f76305325c405160fb4f8efeff0662d605e98ba2510155c74840b6fe4323704e903c4 +aa857b771660d6799ff03ccad1ab8479e7f585a1624260418fc66dc3e2b8730cfa491d9e249505141103f9c52f935463 +98b21083942400f34cde9adbe1977dee45ba52743dc54d99404ad9da5d48691ddea4946f08470a2faad347e9535690c7 +a4b766b2faec600a6305d9b2f7317b46f425442da0dc407321fc5a63d4571c26336d2bccedf61097f0172ec90fb01f5f +b9736619578276f43583de1e4ed8632322ea8a351f3e1506c5977b5031d1c8ad0646fb464010e97c4ddb30499ddc3fb0 +973444ffaff75f84c17f9a4f294a13affd10e2bceed6b4b327e4a32c07595ff891b887a9f1af34d19766d8e6cb42bfd1 +b09ce4964278eff81a976fbc552488cb84fc4a102f004c87179cb912f49904d1e785ecaf5d184522a58e9035875440ef +b80c2aa3d0e52b4d8b02c0b706e54b70c3dbca80e5e5c6a354976721166ea0ca9f59c490b3e74272ef669179f53cb50d +8e52fa5096ff960c0d7da1aa4bce80e89527cdc3883eba0c21cb9a531088b9d027aa22e210d58cf7cbc82f1ec71eb44f +969f85db95f455b03114e4d3dc1f62a58996d19036513e56bee795d57bf4ed18da555722cd77a4f6e6c1a8e5efe2f5d7 +ab84b29b04a117e53caea394a9b452338364c45a0c4444e72c44132a71820b96a6754828e7c8b52282ad8dca612d7b6a +83e97e9ab3d9e453a139c9e856392f4cef3ec1c43bce0a879b49b27a0ce16f9c69063fd8e0debbe8fabafc0621bc200c +8c138ebdf3914a50be41be8aa8e2530088fb38af087fa5e873b58b4df8e8fd560e8090c7a337a5e36ef65566409ad8f3 +a56da9db2f053516a2141c1a8ed368ae278ab33a572122450249056857376d1dffc76d1b34daf89c86b6fe1ead812a0c +a3233ea249f07531f5bc6e94e08cea085fd2b2765636d75ff5851f224f41a63085510db26f3419b031eb6b5143735914 +b034bb6767ce818371c719b84066d3583087979ba405d8fbb2090b824633241e1c001b0cb0a7856b1af7a70e9a7b397e +8722803fe88877d14a4716e59b070dd2c5956bb66b7038f6b331b650e0c31230c8639c0d87ddc3c21efc005d74a4b5cc +8afe664cb202aacf3bd4810ebf820c2179c11c997f8c396692a93656aa249a0df01207c680157e851a30330a73e386b9 +a999e86319395351d2b73ff3820f49c6516285e459224f82174df57deb3c4d11822fd92cbbed4fc5a0a977d01d241b19 +9619408e1b58b6610d746b058d7b336d178e850065ba73906e08e748651e852f5e3aab17dcadcb47cc21ff61d1f02fcf +947cf9c2ed3417cd53ea498d3f8ae891efe1f1b5cd777e64cec05aba3d97526b8322b4558749f2d8a8f17836fb6e07aa +aec2fdae2009fda6852decb6f2ff24e4f8d8ca67c59f92f4b0cf7184be72602f23753ed781cf04495c3c72c5d1056ffe +8dba3d8c09df49fbfc9506f7a71579348c51c6024430121d1c181cad7c9f7e5e9313c1d151d46d4aa85fb0f68dd45573 +b6334cb2580ae33720ebf91bb616294532a1d1640568745dcda756a3a096786e004c6375728a9c2c0fb320441e7d297a +9429224c1205d5ecd115c052b701c84c390f4e3915275bb8ce6504e08c2e9b4dd67b764dd2ea99f317b4c714f345b6ff +abe421db293f0e425cfd1b806686bdfd8fdbac67a33f4490a2dc601e0ddbf69899aa9a119360dad75de78c8c688ca08b +95c78bffed9ae3fff0f12754e2bd66eb6a9b6d66a9b7faaeb7a1c112015347374c9fe6ce14bf588f8b06a78e9a98f44c +ac08f8b96b52c77d6b48999a32b337c5ad377adf197cda18dbdf6e2a50260b4ee23ca6b983f95e33f639363e11229ee4 +911a0e85815b3b9f3ba417da064f760e84af94712184faeb9957ddd2991dee71c3f17e82a1a8fbeec192b0d73f0ebce7 +aa640bd5cb9f050568a0ad37168f53b2f2b13a91e12b6980ca47ae40289cf14b5b89ddd0b4ca452ce9b1629da0ce4b5d +907486f31b4ecea0125c1827007ea0ecb1c55cadb638e65adc9810ca331e82bb2fd87e3064045f8d2c5d93dc6c2f5368 +8cbfaf4ce0bbbf89208c980ff8b7bc8f3cfef90f0fe910f463cb1c0f8e17cce18db120142d267045a00ba6b5368f0dd3 +9286f08f4e315df470d4759dec6c9f8eacef345fc0c0b533ad487bb6cfefa8c6c3821a22265c9e77d34170e0bc0d078b +94a3c088bc1a7301579a092b8ece2cefc9633671bc941904488115cd5cb01bd0e1d2deef7bdccb44553fd123201a7a53 +8f3d0114fbf85e4828f34abb6d6fddfa12789d7029d9f1bb5e28bc161c37509afdab16c32c90ec346bc6a64a0b75726f +a8ed2d774414e590ec49cb9a3a726fafd674e9595dd8a1678484f2897d6ea0eea1a2ee8525afac097b1f35e5f8b16077 +9878789ff33b11527355a317343f34f70c7c1aa9dc1eca16ca4a21e2e15960be8a050ec616ffb97c76d756ce4bce2e90 +854e47719dae1fe5673cacf583935122139cf71a1e7936cf23e4384fbf546d48e9a7f6b65c3b7bf60028e5aa1234ba85 +af74bdda2c6772fe9a02d1b95e437787effad834c91c8174720cc6e2ea1f1f6c32a9d73094fc494c0d03eef60b1a0f05 +80a3e22139029b8be32cb167d3bc9e62d16ca446a588b644e53b5846d9d8b7ab1ad921057d99179e41515df22470fb26 +86c393afd9bd3c7f42008bba5fe433ec66c790ebd7aa15d4aeaf9bb39a42af3cfaf8c677f3580932bbd7ada47f406c8c +90433c95c9bb86a2c2ddcf10adccb521532ebd93db9e072671a4220f00df014e20cd9ce70c4397567a439b24893808dc +95b2c170f08c51d187270ddc4f619300b5f079bbc89dbca0656eae23eecc6339bf27fa5bf5fd0f5565d4021105e967d2 +8e5eced897e2535199951d4cff8383be81703bca3818837333dd41a130aa8760156af60426ceadb436f5dea32af2814c +a254a460ebefbe91d6e32394e1c8f9075f3e7a2bb078430ac6922ab14d795b7f2df1397cb8062e667d809b506b0e28d4 +ac2062e8ca7b1c6afb68af0ebab31aebd56fc0a0f949ef4ea3e36baf148681619b7a908facf962441905782d26ecbdb5 +8b96af45b283b3d7ffeec0a7585fc6b077ea5fd9e208e18e9f8997221b303ab0ce3b5bafa516666591f412109ce71aa5 +afd73baada5a27e4fa3659f70083bf728d4dc5c882540638f85ea53bf2b1a45ddf50abc2458c79f91fb36d13998c7604 +a5d2fff226e80cb2e9f456099812293333d6be31dd1899546e3ad0cd72b2a8bcb45ec5986e20faa77c2564b93983210c +a8c9b8de303328fbdaccf60f4de439cf28f5360cf4104581dc2d126bc2e706f49b7281723487ff0eaf92b4cc684bc167 +a5d0d5849102bf1451f40e8261cb71fc57a49e032773cb6cd7b137f71ee32438d9e958077ffafce080a116ccc788a2d4 +80716596f502d1c727d5d2f1469ce35f15e2dbd048d2713aa4975ee757d09c38d20665326bd63303cfe7e820b6de393d +97baf29b20f3719323cc1d5de23eaa4899dc4f4e58f6c356ec4c3ad3896a89317c612d74e0d3ab623fe73370c5972e2f +b58bdc9aa5061bf6e5add99a7443d7a8c7ba8f6875b8667d1acbe96fc3ecafbdcc2b4010cb6970a3b849fff84660e588 +b6be68728776d30c8541d743b05a9affc191ad64918fdbd991d2ddd4b32b975c4d3377f9242defef3805c0bfb80fbac7 +b0cddace33333b8a358acad84b9c83382f0569d3854b4b34450fd6f757d63c5bdab090e330b0f86e578f22c934d09c36 +854bd205d6051b87f9914c8c2494075d7620e3d61421cc80f06b13cea64fd1e16c62c01f107a5987d10b8a95a8416ad9 +80351254a353132300ba73a3d23a966f4d10ce9bf6eae82aedb6cdc30d71f9d08a9dd73cb6441e02a7b2ad93ad43159c +937aae24fb1b636929453fc308f23326b74c810f5755d9a0290652c9c2932ad52cc272b1c83bd3d758ef7da257897eae +b84d51ef758058d5694ffeac6d8ce70cef8d680a7902f867269c33717f55dd2e57b25347841d3c0872ae5f0d64f64281 +a4b31bb7c878d5585193535b51f04135108134eff860f4eac941053155f053d8f85ff47f16268a986b2853480a6e75e6 +93543f0828835186a4af1c27bdf97b5dd72b6dfa91b4bf5e759ff5327eaf93b0cb55d9797149e465a6b842c02635ffe5 +afdac9e07652bf1668183664f1dd6818ef5109ee9b91827b3d7d5970f6a03e716adcc191e3e78b0c474442a18ad3fc65 +9314077b965aa2977636ae914d4a2d3ce192641a976ffa1624c116828668edbfbe5a09e3a81cb3eed0694566c62a9757 +b395ddcf5082de6e3536825a1c352802c557b3a5118b25c29f4c4e3565ecaaf4bdd543a3794d05156f91fc4ceadc0a11 +b71f774aad394c36609b8730e5be244aaebfff22e0e849acc7ee9d33bedc3ec2e787e0b8b2ffe535560fcd9e15a0897e +92e9409fa430f943a49bce3371b35ac2efb5bc09c88f70ff7120f5e7da3258a4387dfc45c8b127f2ef2668679aeb314e +8ef55bef7b71952f05e20864b10f62be45c46e2dca0ef880a092d11069b8a4aa05f2e0251726aca1d5933d7dea98f3f8 +aad3fba9e09fae885cdeef45dfafa901419f5156fb673818f92a4acc59d0e2e9870b025e711de590a63fd481164f3aa8 +b444d52af545dd3a2d3dd94e6613816b154afea0c42b96468aceb0c721395de89e53e81a25db857ca2e692dcb24ba971 +88b279fe173007e64fe58f2c4adba68a1f538dbd3d32d175aa0d026bbb05b72a0c9f5d02b8201a94adb75fe01f6aa8b2 +88494cea4260741c198640a079e584cabfea9fcfb8bcf2520c9becd2419cde469b79021e5578a00d0f7dbc25844d2683 +94f3cce58837c76584b26426b9abdb45f05fee34dd9e5914b6eae08e78b7262ed51c4317031dab1ad716f28b287f9fc2 +b8c7ed564f54df01c0fbd5a0c741beed8183ce0d7842dc3a862a1b335de518810077314aa9d6054bb939663362f496da +81c153320d85210394d48340619d5eb41304daea65e927266f0262c8a7598321aba82ad6c3f78e5104db2afd2823baca +ab6695a8d48a179e9cd32f205608359cf8f6a9aead016252a35b74287836aa395e76572f21a3839bec6a244aa49573e5 +920ed571539b3002a9cd358095b8360400e7304e9a0717cc8c85ab4a0514a8ad3b9bf5c30cb997647066f93a7e683da9 +a7ec7c194d1e5103bc976e072bf1732d9cb995984d9a8c70a8ee55ce23007f21b8549ad693f118aa974f693ed6da0291 +87a042d6e40c2951a68afc3ccf9646baf031286377f37f6ac47e37a0ec04d5ac69043757d7dff7959e7cd57742017a8d +b9f054dd8117dd41b6e5b9d3af32ee4a9eebef8e4a5c6daa9b99c30a9024eabeae850ab90dbdb188ca32fd31fd071445 +a8386da875799a84dc519af010eaf47cdbc4a511fe7e0808da844a95a3569ce94054efd32a4d3a371f6aba72c5993902 +8b3343a7cf4ffb261d5f2dbd217fb43590e00feac82510bdf73b34595b10ee51acae878a09efebc5a597465777ef4c05 +8312a5f1ea4f9e93578e0f50169286e97884a5ed17f1780275ab2b36f0a8aa1ab2e45c1de4c8bce87e99e3896af1fa45 +b461198cb7572ac04c484a9454954e157bdd4db457816698b7290f93a10268d75a7e1211e757c6190df6144bbb605d91 +9139764a099580d6f1d462c8bf7d339c537167be92c780e76acb6e638f94d3c54b40ed0892843f6532366861e85a515a +8bb70acb3c9e041b4fc20e92ba0f3f28f0d5c677bcb017af26f9171e07d28c3c0729bef72457231e3512f909455a13a2 +93301a18e5064c55fcfe8e860fab72da1b89a824ca77c8932023b7c79e4a51df93a89665d308a8d3aa145e46ebe6a0ad +ae3bca496fbd70ce44f916e2db875b2ce2e1ded84edd2cebc0503bdfdec40ec30e1d9afb4eb58c8fa23f7b44e71d88f8 +93cb3a918c95c5d973c0cb7621b66081ed81fba109b09a5e71e81ca01ec6a8bb5657410fdec453585309ef5bf10d6263 +95a50b9b85bb0fc8ff6d5f800d683f0f645e7c2404f7f63228a15b95ce85a1f8100e2e56c0acee19c36ed3346f190e87 +816cc4d9337461caca888809b746ab3713054f5b0eac823b795a1a9de9417c58e32a9f020fef807908fa530cbf35dee8 +a9c2890c2dd0d5d7aedc4cca7f92764086c50f92f0efd2642c59920d807086031bfe2d3ba574318db236c61a8f5f69c2 +ad0d5c8c80bddfe14bdaf507da96dc01dc9941aecc8ad3b64513d0a00d67c3f4b4659defb6839b8b18d8775e5344c107 +9047c9fad6ef452e0219e58e52c686b620e2eb769571021e3524bd7eac504f03b84834b16b849d42b3d75c601fd36bb7 +a04dd988fed91fb09cb747a3ac84efe639d7d355524cd7dee5477ecbcdec44d8ac1cec2c181755dcfdb77e9594fb3c5b +b0ea0c725debd1cec496ced9ce48f456f19af36e8b027094bf38fa37de9b9b2d10282363ea211a93a34a0a5387cace5d +b5fc46e2bb3e4653ea5e6884dcb3c14e401a6005685ee5a3983644b5b92300b7066289159923118df4332aac52045b8c +841fc5b26b23226e725e29802da86b35e4f5e3babc8b394f74e30fd5dec6d3840b19a9a096625ce79a4f1edae6369700 +8fd2bbbeea452451def3659bbe0ceb396120ebe8f81eee1ea848691614422c81d7c3e6a7a38032b4120b25c5ffa8f0c2 +9131ce3d25c3d418f50c0ab99e229d4190027ee162b8ba7c6670420ea821831dec1294ac00d66c50fac61c275a9e2c71 +99ec6eafe0eb869d128158cee97b984fb589e1af07699247946e4a85db772289dff3084d224a6f208005c342f32bbd73 +ac100fbbe7c2bf00cc56fcd5aa1f27181f82c150c53bbb1e15d2c18a51ed13dcfa7bccab85821b8ddddf493603e38809 +affd73a458d70c0d9d221e0c2da4348fed731f6b34c0b3e2d5711ba432e85a1ec92e40b83b246a9031b61f5bc824be47 +8ed30ed817816a817e9e07374ef1f94405a7e22dd0096aeaae54504382fc50e7d07b4f1186c1792fc25ea442cd7edc6b +a52370cfe99a35fa1405aeca9f922ad8d31905e41f390e514ea8d22ee66469637d6c2d4d3a7ee350d59af019ae5a10a4 +8d0b439741c57b82c8e4b994cf3956b5aeaee048b17e0a1edb98253a8d7256f436d8b2f36b7e12504132dbf91f3376b1 +8caac7e1a4486c35109cff63557a0f77d0e4ca94de0817e100678098a72b3787a1c5afc7244991cebcd1f468e18d91d4 +a729a8e64b7405db5ebfb478bb83b51741569331b88de80680e9e283cc8299ba0de07fcf252127750f507e273dc4c576 +a30545a050dad030db5583c768a6e593a7d832145b669ad6c01235813da749d38094a46ac3b965700230b8deacd91f82 +9207e059a9d696c46fa95bd0925983cd8e42aefd6b3fb9d5f05420a413cbc9e7c91213648554228f76f2dd757bde0492 +a83fa862ae3a8d98c1e854a8b17181c1025f4f445fbc3af265dc99e44bbd74cfa5cc25497fb63ee9a7e1f4a624c3202c +84cdfc490343b3f26b5ad9e1d4dcf2a2d373e05eb9e9c36b6b7b5de1ce29fda51383761a47dbd96deca593a441ccb28e +881a1aa0c60bb0284a58b0a44d3f9ca914d6d8fa1437315b9ad2a4351c4da3ee3e01068aa128284a8926787ea2a618d1 +aace78e497b32fbff4df81b1b2de69dbc650645e790953d543282cb8d004a59caf17d9d385673a146a9be70bf08a2279 +aa2da4760f1261615bffd1c3771c506965c17e6c8270c0f7c636d90428c0054e092247c3373eca2fb858211fdb17f143 +acb79f291b19e0aa8edb4c4476a172834009c57e0dcc544c7ce95084488c3ad0c63ffd51c2b48855e429b6e1a9555433 +814b58773a18d50a716c40317f8b80362b6c746a531776a9251c831d34fb63e9473197c899c0277838668babc4aa0ecb +b1f69522b0f7657d78bd1ee3020bcce3447116bf62c146d20684537d36cafb5a7a1531b86932b51a70e6d3ce0808a17e +8549712c251ef382f7abe5798534f8c8394aa8bcecdca9e7aa1a688dc19dc689dcd017a78b118f3bd585673514832fe4 +912a04463e3240e0293cfc5234842a88513ff930c47bd6b60f22d6bc2d8404e10270d46bf6900fee338d8ac873ebb771 +a327cb7c3fada842e5dd05c2eeedd6fcd8cf2bfb2f90c71c6a8819fb5783c97dd01bd2169018312d33078b2bc57e19f7 +b4794f71d3eceed331024a4cee246cc427a31859c257e0287f5a3507bfbd4d3486cb7781c5c9c5537af3488d389fe03e +82ffcb418d354ed01688e2e8373a8db07197a2de702272a9f589aed08468eab0c8f14e6d0b3146e2eb8908e40e8389c5 +910b73421298f1315257f19d0dfd47e79d7d2a98310fb293f704e387a4dc84909657f0f236b70b309910271b2f2b5d46 +a15466397302ea22f240eb7316e14d88376677b060c0b0ae9a1c936eb8c62af8530732fc2359cfd64a339a1c564f749b +a8091975a0d94cdc82fbaff8091d5230a70d6ea461532050abbdfee324c0743d14445cfe6efe6959c89a7c844feaa435 +a677d1af454c7b7731840326589a22c9e81efbbf2baf3fdeaf8ea3f263a522584fbca4405032c4cdf4a2a6109344dfc8 +894e6ffa897b6e0b37237e6587a42bbc7f2dd34fb09c2e8ac79e2b25b18180e158c6dc2dd26761dba0cfed1fb4eb4080 +928d31b87f4fe8fe599d2c9889b0ff837910427ba9132d2fba311685635458041321ae178a6331ed0c398efe9d7912f0 +afc1c4a31f0db24b53ee71946c3c1e1a0884bd46f66b063a238e6b65f4e8a675faa844e4270892035ef0dae1b1442aa0 +a294fcb23d87cf5b1e4237d478cac82ba570649d425b43b1e4feead6da1f031e3af0e4df115ca46689b9315268c92336 +85d12fd4a8fcfd0d61cbf09b22a9325f0b3f41fb5eb4285b327384c9056b05422d535f74d7dc804fb4bab8fb53d556bd +91b107d9b0ea65c48128e09072acd7c5949a02dd2a68a42ff1d63cf528666966f221005c2e5ca0a4f85df28459cdede6 +89aa5dc255c910f439732fcd4e21341707e8dd6689c67c60551a8b6685bd3547e3f47db4df9dfadd212405f644c4440b +8c307d6b827fa1adcf0843537f12121d68087d686e9cc283a3907b9f9f36b7b4d05625c33dab2b8e206c7f5aabd0c1e5 +843f48dadf8523d2b4b0db4e01f3c0ea721a54d821098b578fcaa6433e8557cadfea50d16e85133fa78f044a3e8c1e5b +9942eb8bd88a8afa9c0e3154b3c16554428309624169f66606bfb2814e8bac1c93825780cf68607f3e7cffe7bf9be737 +b7edb0c7637a5beb2332f2ae242ba4732837f9da0a83f00f9e9a77cf35516e6236eb013133ddc2f958ea09218fe260d3 +9655fe4910bc1e0208afbcf0ff977a2e23faded393671218fba0d9927a70d76514a0c45d473a97ecb00cf9031b9d527c +8434bc8b4c5839d9e4404ff17865ded8dd76af56ef2a24ea194c579d41b40ed3450c4e7d52219807db93e8e6f001f8da +b6c6d844860353dab49818bed2c80536dbc932425fdaa29915405324a6368277cf94d5f4ab45ea074072fc593318edff +b2887e04047660aa5c83aad3fa29b79c5555dd4d0628832c84ba7bf1f8619df4c9591fcde122c174de16ca7e5a95d5e3 +953ba5221360444b32911c8b24689078df3fbf58b53f3eec90923f53a22c0fc934db04dd9294e9ec724056076229cf42 +926917529157063e4aade647990577394c34075d1cb682da1acf600639d53a350b33df6a569d5ebb753687374b86b227 +b37894a918d6354dd28f850d723c1c5b839f2456e2a220f64ecadac88ae5c9e9cf9ab64b53aac7d77bf3c6dfa09632dc +b9d28148c2c15d50d1d13153071d1f6e83c7bb5cb5614adf3eb9edede6f707a36c0fa0eadb6a6135ead3c605dfb75bd1 +9738d73ea0b9154ed38da9e6bd3a741be789ea882d909af93e58aa097edf0df534849f3b1ba03099a61ceb6a11f34c4d +afabbecbbf73705851382902ec5f1da88b84a06b3abfb4df8d33df6a60993867f853d0d9bd324d49a808503615c7858a +a9e395ddd855b12c87ba8fdb0ea93c5bd045e4f6f57611b27a2ee1b8129efe111e484abc27cb256ed9dcace58975d311 +b501c2f3d8898934e45e456d36a8a5b0258aeea6ff7ac46f951f36da1ec01bd6d0914c4d83305eb517545f1f35e033cc +86f79688315241fe619b727b7f426dbd27bcc8f33aef043438c95c0751ada6f4cd0831b25ae3d53bcf61324d69ea01eb +83237e42fa773a4ccaa811489964f3fab100b9eea48c98bdef05fa119a61bde9efe7d0399369f87c775f4488120b4f2e +b89f437552cab77d0cd5f87aca52dd827fb6648c033351c00ab6d40ac0b1829b4fcdf8a7dad467d4408c691223987fbe +8e21061698cb1a233792976c2d8ab2eeb6e84925d59bb34434fff688be2b5b2973d737d9dda164bd407be852d48ef43f +b17a9e43aa4580f542e00c3212fbf974f1363f433c5502f034dfd5ed8c05ac88b901729d3b822bec391cca24cc9f5348 +aac6d6cda3e207006c042a4d0823770632fc677e312255b4aff5ad1598dc1022cab871234ad3aa40b61dc033a5b0930b +b25e69f17b36a30dada96a39bc75c0d5b79d63e5088da62be9fcbddfd1230d11654890caa8206711d59836d6abbc3e03 +af59fe667dd9e7e4a9863c994fc4212de4714d01149a2072e97197f311be1f39e7ad3d472e446dcc439786bf21359ede +957952988f8c777516527b63e0c717fc637d89b0fd590bcb8c72d0e8a40901598930c5b2506ff7fea371c73a1b12a9be +a46becd9b541fc37d0857811062ca1c42c96181c7d285291aa48dc2f6d115fcff5f3dfdf4490d8c619da9b5ce7878440 +87168fbd32c01a4e0be2b46fe58b74d6e6586e66bbb4a74ad94d5975ac09aa6fa48fd9d87f1919bd0d37b8ebe02c180c +895c4aa29de9601fc01298d54cfb62dd7b137e6f4f6c69b15dc3769778bfba5fc9cbd2fc57fd3fad78d6c5a3087f6576 +b9cf19416228230319265557285f8da5b3ca503de586180f68cf055407d1588ecec2e13fc38817064425134f1c92b4d5 +9302aaef005b22f7b41a0527b36d60801ff6e8aa26fe8be74685b5f3545f902012fcade71edca7aaa0560296dac5fca5 +a0ccda9883027f6b29da1aaa359d8f2890ce1063492c875d34ff6bf2e7efea917e7369d0a2b35716e5afd68278e1a93a +a086ac36beeba9c0e5921f5a8afea87167f59670e72f98e788f72f4546af1e1b581b29fbdd9a83f24f44bd3ec14aee91 +8be471bf799cab98edf179d0718c66bbc2507d3a4dac4b271c2799113ce65645082dc49b3a02a8c490e0ef69d7edbcb1 +8a7f5b50a18baf9e9121e952b65979bda5f1c32e779117e21238fb9e7f49e15008d5c878581ac9660f6f79c73358934a +b3520a194d42b45cbab66388bee79aad895a7c2503b8d65e6483867036497d3e2e905d4d51f76871d0114ec13280d82f +8e6ca8342ec64f6dbe6523dc6d87c48065cd044ea45fa74b05fff548539fd2868eb6dd038d38d19c09d81d5a96364053 +b126a0e8263a948ba8813bf5fb95d786ae7d1aa0069a63f3e847957822b5fe79a3a1afa0ce2318b9ba1025f229a92eb7 +8e4461d6708cac53441a3d23ac4b5ff2b9a835b05008c26d7d9c0562a29403847cf760b7e9d0bcb24a6f498d2a8a9dd2 +b280a761bab256dfe7a8d617863999e3b4255ddbdc11fe7fe5b3bb9633fc8f0cb4f28e594d3b5b0b649c8e7082c4666a +a3e3043bfd7461e38088ee6a165d2ca015de98350f1cb0efc8e39ed4fcdb12a717f0ede7fbf9dadb90496c47652cc0ce +a4c1f5b1b88ae3c397d171e64395afe0cd13c717677775a01dd0461d44a04ee30ec3da58a54c89a3ca77b19b5e51062c +a268638e0655b6d5a037061808619b9ae276bb883999d60c33a9f7f872c46d83d795d1f302b4820030c57604fa3686e7 +ac20176111c5c6db065668987227658c00a1572ce21fe15f25e62d816b56472c5d847dd9c781fb293c6d49cc33b1f98f +acc0e22d9b6b45c968c22fd16b4ece85e82a1b0ab72369bdd467857fee1a12b9635f5b339a9236cbd1acc791811d0e29 +b56066e522bee1f31480ff8450f4d469ace8eb32730c55b7c9e8fa160070bdec618454e665b8cbc5483bc30b6cebbfb9 +8c1772bdfacff85f174d35c36f2d2182ae7897ad5e06097511968bbb136b626c0c7e462b08a21aca70f8e456b0204bf8 +b4de3cf4a064bf589be92513b8727df58f2da4cd891580ef79635ac8c195f15a6199327bb41864e2f614c8589b24f67e +8f3c534125613f2d17bf3e5b667c203cb3eab0dbca0638e222fe552fddf24783965aa111de844e8c3595304bfc41c33b +8e445b2711987fe0bf260521cb21a5b71db41f19396822059912743bf6ca146100c755c8b6e0e74f1bf2e34c03b19db9 +87ff9adf319adb78c9393003b5bdda08421f95551d81b37520b413fe439e42acf82d47fa3b61476b53166bf4f8544f0e +83f3c00c55632e1937dcdc1857de4eccd072efa319b3953d737e1d37382b3cf8343d54a435588eb75aa05bf413b4caa0 +b4d8ee1004bac0307030b8605a2e949ca2f8d237e9c1dcf1553bd1eb9b4156e2deb8c79331e84d2936ec5f1224b8b655 +93b2812b6377622e67bf9a624898227b56ebe3c7a1d917487fc9e4941f735f83679f7ac137065eb4098ad1a4cfbc3892 +81943d9eab6dcea8a120dde5356a0a665b1466709ebb18d1cbfa5f213a31819cb3cf2634e6d293b5b13caa158a9bb30b +a9042aae02efd4535681119e67a60211fc46851319eb389b42ebadcab1229c94199091fb1652beba3434f7b98c90785f +91db52b27fd9b1715df202106b373c4e63ce8ec7db8c818c9016ace5b08ef5f8c27e67f093395937ba4ce2f16edf9aef +83cb9b7b94bd6ead3ff2a7d40394f54612c9cb80c4e0adadffea39e301d1052305eb1fe0f7467268b5aba3b423a87246 +8720fd6712a99d92dd3fdaae922743ab53fad50d183e119a59dae47cdac6fbea6064c732d02cb341eaea10723db048fa +8d40022c1254462a2ac2380a85381c370b1221e5a202d95c75bccba6d1e52972dd5585a1294a1e487bf6ae6651867167 +b7bc06e08d8c72daba143627582f4b4f34cc2234b5cb5cd83536f2ef2e058631a3920468ea4d550aea01cad221d6a8a6 +a6e1a6f70fba42d3b9ce5f04ffdcfca46fc94041840c0066a204030cf75ea9f9856113fea3a9f69ea0037d9a68e3a9d4 +8b064c350083fce9a52da2e2e17bf44c4c9643d2d83667cbd9ad650bbeba55e2c408e746ccf693e56d08826e8a6d57fc +8d304a5405a0c0696917fcddc6795dd654567ca427f007d9b16be5de98febbf8692374e93f40822f63cf6f143c4d9499 +b968db239efec353a44f20a7cf4c0d0fca4c4c2dc21e6cbb5d669e4fe624356a8341e1eec0955b70afb893f55e9a9e32 +98971f745ce4ce5f1f398b1cd25d1697ada0cc7b329cee11d34b2d171e384b07aeb06ac7896c8283664a06d6dd82ec6b +881f5a20a80f728354fad9d0a32a79ffe0ba9bed644ed9d6a2d85444cda9821018159a3fa3d3d6b4fadbf6ea97e6aff6 +b7c76cbb82919ec08cf0bd7430b868a74cb4021e43b5e291caa0495ca579798fab1b64855e2d301f3461dd4d153adeb6 +b44c8c69b3df9b4e933fe6550982a6f76e18046e050229bd2456337e02efb75efa0dfe1b297ed9f5d7fa37fec69c8374 +a5bd7781820ba857aee07e38406538b07ab5180317689a58676f77514747672dd525ea64512a0e4958896f8df85e9d4d +a8443d1dc91b4faa20a2626505b5b4ad49cc5c1fd7a240a0e65d12f52d31df1585ba52c21e604dcec65ec00b81ae21fe +a157ae42fc6302c54bcdd774e8b8bafc4f5d221717f7bf49668c620e47051b930dce262d55668e546272dd07ca7c8d3f +8732c10448b63e907ff95f53cd746f970c946fd84fcbfe4cf9ede63afbbfc66b293bbc7c470d691bbd149bb3c78bb351 +a82192f4fd9a0c33489a0486b79d0f6c797c7eccb45f91f7f1e8e1dd1924ca9944b983951025b99ab5861d31841451fe +839efc6d199ddd43f34f6729b6b63f9ee05f18859bf8fd3f181fa71f4399a48bff7dde89b36e9dc1c572f1b9b6127cca +992ef084abe57adfd5eb65f880b411d5f4ed34c1aeb0d2cfac84fff4f92a9a855c521a965ba81b5eef2268e9a9e73048 +a2518ab712fa652e6e0bd0840307ef3831094e9a18723fb8ec052adacbb87f488d33778c6ec3fd845003af62e75125d1 +b630ac3c9e71b85dd9e9f2984bb5b762e8491d8edb99cad82c541faf5a22dd96f0fddb49d9a837b1955dea2d91284f28 +8d886d1b7f818391b473deba4a9a01acce1fe2abe9152955e17ba39adc55400590c61582c4fef37a286e2151566576ed +884f100dc437639247f85e5d638fcc7583d21bf37a66ce11e05bfc12f5dbe78685b0e51b4594e10549c92bb980512e12 +806d7bac2d24cfff6090ba9513698292d411cdea02976daa3c91c352b09f5a80a092cfa31304dcfcd9356eaf5164c81b +934ed65f8579ee458b9959295f69e4c7333775eb77084db69ad7096f07ad50ad88f65e31818b1942380f5b89e8d12f1b +aaf50ca5df249f0a7caf493334b6dca1700f34bd0c33fe8844fadd4afedbb87a09673426741ac7cbbb3bf4ab73f2d0f3 +b2868642cfa0a4a8a2553691c2bef41dab9dff87a94d100eaa41645614ab4d0e839ec2f465cc998c50cd203f0c65df22 +a326513112e0b46600d52be9aa04d8e47fe84e57b3b7263e2f3cf1a2c0e73269acb9636a99eb84417f3ae374c56e99b0 +97b93efc047896ddf381e8a3003b9e1229c438cc93a6dbef174bb74be30fac47c2d7e7dc250830459bed61d950e9c924 +b45e4f0a9806e44db75dbb80edc369be45f6e305352293bcae086f2193e3f55e6a75068de08d751151fdf9ebc6094fa1 +87f2161c130e57e8b4bb15616e63fa1f20a1b44d3e1683967a285f0d4f0b810f9202e75af2efa9fc472687c007a163f7 +8f6400a45666142752580a2dce55ef974f59235a209d32d2036c229c33a6189d51435b7ea184db36f765b0db574a9c52 +a0ee079462805f91b2200417da4900227acde0d48c98e92c8011a05b01c9db78fc5c0157d15cb084b947a68588f146f4 +ab0612d9bb228b30366b48e8d6ae11026230695f6f0607c7fa7a6e427e520121ff0edea55d1f0880a7478c4a8060872d +ad65dfde48f914de69f255bb58fa095a75afe9624fc8b7b586d23eb6cf34a4905e61186bc978e71ccb2b26b0381778a6 +8c8a4847d138d221c0b6d3194879fd462fb42ed5bd99f34ebe5f5b1e1d7902903ec55e4b52c90217b8b6e65379f005a4 +a41dca4449584353337aef1496b70e751502aeed9d51202de6d9723e155ca13be2d0db059748704653685a98eaa72a07 +ae40e5450fd994d1be245a7cd176a98dd26332b78da080159295f38802a7e7c9c17cc95da78d56558d84948cf48242cd +863878fda80ad64244b7493e3578908d4a804887ad1ad2c26f84404dcad69ea2851846ad2c6f2080e1ed64fe93bbec31 +b262fb990535f162dc2b039057a1d744409a3f41dd4b70f93ff29ba41c264c11cb78a3579aad82f3fa2163b33a8ce0e1 +a7f6eb552b9a1bb7c9cb50bc93d0dda4c7ecf2d4805535f10de0b6f2b3316688c5e19199d5c9ec2968e2d9e2bd0c6205 +a50aa5869412dc7081c8d827299237910ecec3154587692548da73e71fa398ff035656972777950ba84e472f267ba475 +924c3af750afc5dfad99d5f3ed3d6bdd359492cff81abcb6505696bb4c2b4664926cb1078a55851809f630e199955eb3 +a1acffa31323ce6b9c2135fb9b5705664de8949f8235b4889803fbd1b27eb80eb3f6a81e5b7cc44e3a67b288b747cf2f +8dec9fd48db028c33c03d4d96c5eecea2b27201f2b33d22e08529e1ae06da89449fe260703ac7bb6d794be4c0c6ea432 +aa6642922ccf912d60d678612fffe22ef4f77368a3c53a206c072ed07c024aa9dcde2df068c9821b4c12e5606cfe9be2 +a16ddf02609038fcb9655031b1cb94afe30b801739e02a5743c6cd2f79b04b2524c2085ca32ec3a39df53de0280f555d +b067d48589e9d3428c6d6129e104c681e4af376a351f502840bbea6c3e11fcbfdf54dadf6f1729621720a75ff89786c3 +b14a24079de311c729750bb4dd318590df1cd7ffc544a0a4b79432c9a2903d36a0d50ecd452b923730ade6d76a75c02c +97437bac649f70464ace93e9bec49659a7f01651bba762c4e626b5b6aa5746a3f0a8c55b555b1d0dc356d1e81f84c503 +a6f4cb2ffc83564b1170e7a9a34460a58a4d6129bd514ff23371a9e38b7da6a214ac47f23181df104c1619c57dff8fe2 +896d0f31dfc440cc6c8fde8831a2181f7257ffb73e1057fd39f1b7583ea35edf942ad67502cd895a1ad6091991eabc5e +9838007f920559af0de9c07e348939dfd9afe661b3c42053b4d9f11d79768cba268a2ee83bb07a655f8c970c0ee6844b +b41b8a47e3a19cadec18bff250068e1b543434ce94a414750852709cd603fc2e57cd9e840609890c8ff69217ea1f7593 +a0fb4396646c0a2272059b5aeb95b513e84265b89e58c87d6103229f489e2e900f4414133ed2458ddf9528461cfa8342 +ae026cfa49babc1006a3e8905d6f237a56a3db9ddf7559b0e4de8d47d08c3f172bde117cdf28dfdfd7627bd47d6a3c85 +a6a3f3e7006bc67290c0c40c1680bf9367982eb8aaf17ecb484a58c8e9c2a7c24932e2caa9aacc9b4fbf4c0abd087a46 +9093e05bd814177a01a3b8d7b733db66294e1c688c56def6e1827c0f2d9a97cf202721641bf81fb837f8581ae68cb5ce +87feef4de24942044f47d193d4efc44e39a8c0f4042fba582f2491a063e3a4640cb81f69579b6f353b9208884a4f7ce6 +975f9b94e78aac55bd4755f475e171e04f6fbddb6fd3d20a89a64a6346754a3ff64ecff8c04b612a1250e1d8d8a9e048 +87cde4d0164922d654cf2dc08df009e923c62f1a2e3b905dfde30f958e9e4dd6070d9f889712acd6c658804f48f3edb1 +ae8e22e158dda90a185eec92602831b5d826e5a19aab8c6400dba38b024c7d31c4cf265eb7b206dd45834f020b3f53cd +a4475807adc28aa086e977b65bbd7c8512119318c89d2619ea03a6739a72c3fb90c9622451896c7113ad4d12a3004de6 +97f1ae1e0d258a94532c7b73fa8ebdbbd53349a4d2d0a217fe56dfdd084dd879960bc6ff45ebb61b5dbf2054642800a4 +b3c832bd3691332a658b0caaa7717db13f5b5df2b5776b38131ac334b5fd80d0b90b6993701e5d74d2b7f6b2fd1f6b9d +a4b6af590187eb1b2cb5ae2b8cffa45c5e76abdb37cec56fc9b07a457730f5af0706d9ce0a17da792bbece5056d05670 +97b99a73a0e3145bf91f9dd611a67f894d608c954e9b8f5a4c77e07574064b3db47353eba8038062cebaad06a2500bab +8e5ca5a675de6e6d3916bd9ce5898bb379372afe3f310e70ff031bc8cc8fabfb7f3bfb784f409bb7eb06fdb4511ee477 +aabbbee4da1f16b5bbe001c19debe04745932d36dfbbf023fbf1010a2b1d54eb92fa5e266ac1e9337e26e2ddba752f40 +b13447c77496825f48e35c14f9b501c5056e6d5519f397a2580cea9a383a56a96994d88926aa681142fe2f1589c03185 +b89c55db39ff0e73dde7435b61e8a4d3e10f51dd8096cbc7f678661962e6de3d16f2f17a0e729cc699234cb847f55378 +82c36b7de53698a1bafbb311fefc6007fcefa47a806ebe33a4e7e0fc1c7b6b92a40a1860702cf9295a16c6b1433e3323 +8daeec8c88543d09c494a15cc9a83c0b918d544311fd2a7d09e06cf39cdebfa0cfc0e8fc0e3b5954960b92332f98697c +b18e55a1a7ae16be3a453d2bfa7659a7ec2d283dd46bdc82decef6d3751eeafc4f86f2416a22955c7e750c0582d4f3eb +b50c743462e2915bf773848669e50a3bcdb5a9ac5f664e97eaccf568c7d64a6493d321be0225de16142ce82ce1e24f66 +af69c9643805fb860434424b1608aababc593aaebc6a75fc017f7f62bb2b1da932b0b9bd5e6dcbba328422dafc06efd8 +b5947db4f809fd0d27af838b82eef8ab4fe78687a23ebc61c09c67eb7e8d0e6a310ecb907fd257859d5a2759a07c21cc +92c7960e163ca5bdf9196c7215102f8e9d88efc718843321c6e2a6170137b8ecec4ea5d5a5ce4c28012b6cdbd777dd01 +b63f9509ed5e798add4db43b562e8f57df50d5844af6e5c7acf6c3b71637c0a2d2433f4a0627b944f0af584892208bb8 +8ef28304a9bfe5220af6a9a6a942d2589606f5dc970d708ef18bc7ed08e433161020d36fb327c525398cd8ecb57002f9 +b722e0410f896c4462d630a84a5a14e94289fc38ed6d513ca88a09005935cec334c480028efa1943c7a5e202ae8c8379 +b56b6672b488e64d4dde43571f9ceaa7e61e336b0fd55bb769a57cd894a6300e724e5f88bad39a68bc307eb7406cb832 +8bf493da411fd41502b61a47827731193652e6ce3810709e70869d9aae49e4b17a40437a7a0dcc0547dbac21f355c0da +9613b60a144c01f6a0e7d46ddde07402e2133a1fe005c049a56415ff90401765040b2fc55971d24b94c5fd69fec58941 +85e2f02b291563d8eea3768cf6a4602c0ca36568ffcf3d93795d642044196ca6b0b28991ea5898e7974ee02831a0ec70 +b08ef66703dd9ac46e0208487566fbf8d8654d08c00f03e46f112c204782ccc02a880a3f9dffd849088693cee33b7b6d +a0b19eeda6c71b0e83b1f95dffef4d370318bdea6ea31d0845695e6b48d5c428c3dbba1a0ded80964992c4a0695f12ee +b052642e5772d2ef6f49dd35c5e765c5f305006b2add3b4bee5909ca572161edf0e9c2bc3bc3bc7f56fd596360ef2201 +8261af164c768fec80d63fca6cd07d1c0449e9ca665fe60c29babdbd8a2b20cf1f556a4b24cd7341712468a731c21b32 +8a17016a1b2fc0fa0d9e3610ea80548fcf514e0a35e327f6b5f8069b425c0f0829af7e206013eab552be92b241be5ac5 +8eea25c680172696f5600271761d27ef4c8cec9ab22f01f72b2c7c313a142fafaec39e6920b96fcace858883e02eff7a +b8e0c590106e125c5bca7e7a071cc408b93629da0d8d6381f1b73fbdf17024a0cf13f679f5203a99bbbcb664b4a94e88 +b9943b29395258b7afdf1781cfaf131297a4f325540755df73401b2ec4a549f962952e9907413c39a95585c4aff38157 +8286eab4a04f8113fb3f738a9bc9c2deaf3a22bf247151515568703da4efe6450ab3970f5c74e978a2db7e8d795331b7 +a10cf383c8a7e3f0a0a5556b57532170ff46dabdcbb6a31c4617271634b99540aa575786c636d3809207cbf1d2f364d3 +a5af7eb998140d01ba24baa0e8c71625aee6bd37db4c5ff607518f907892219ba8c9a03c326b273bfd7068232809b73c +aed5f461e38fccc8b3936f1328a9747efcbceb66312f6d6eddce57c59570852767159f1a7d9998f63342515fef4ba9bf +aec3e94b029aa692bfe2b8dbc6c3b0d132b504242e5ebe0cad79c065085e2fc05550e5cdaa2353892a40ff1a062dd9eb +87c23703960129396018d0347f5dd034abdbd57232b74195b6a29af34b6197b3cd63c60ac774d525add96ae54d5c0fb4 +97964a7768216e1c84dece71ce9202cc64b6d483650aa6f6d67215f655f66cda14df0a0f251db55832c77bfd9b6316e2 +8167aaf24c8a023d0aea16b8c24d993618b9d0c63619e11a28feab8f14952bafcb0918ed322cbc0ae1b2e1786071819b +b58318bd62852ffb712fc58f368c21b641dde7b3fa7d7269974c7a7b5b3e1641569fc7b5f32ca49de22f4f993506d92d +b172e7911d5cd3f53af388af847b928947c711185aebd3328f8e6ed1106c161ae0c1b67d3d9eb237e9e66eb0672edec0 +a6834cf69b2c4433cf6e779bfbb736b12e73e71e149c38101d13dbacf6c5048db53994a6a039381df40bbd67de40fcd0 +882604aa3bb19fffd6db744b5cf4a2431b157dac06d0617e0703684a118ca90b2d22a7758a1de7732a7144e68b11b7f7 +addc128ba52bf7553b9ba49eff42004d388a02c6b6e9809abe1c0d88f467e5ff6cb0c82a8fd901b80dfc9a001f7b9997 +abf19604a3f0cffefa7a9ced81627f6aacb8d7267b52b825f25d813d9afa24af6d70da21450ed93eaff8b4d2a9b905a9 +a3c67e7bf02dbca183d86924611a7149556ee17cb3469793624da496b6c25617a9071925dd02aab9cb028739cb79043d +b1cea4284a3ac4d5b1c6f0947c6ec8365b3281ed15495bf328a907a9a02cdd186e7cb1ef080385b3399df786855985a9 +a6edb126314559e6129caf1111dc3c82ff914efce658b11f2c9b48081be1cf3f46bde482469d493379025a158d95ab1b +9843fd7dd424da1acc6f92f87fac364a8b0d4097d74b6b451386384966c85145d43fc6ecedf04271b0f963ac731fd93f +83852bedca03a97a2e63053cb102387866cbefe6707ebb6dae2d32a59c343079f1a863f299fd64d0ecbe024d0a1247d5 +a570e645a0679ebc6f0ca03cc8f7367b03c3886f3d9c787992de7f3e93360a170d3ac9ae7720999c727a887b1dc762bb +ad644c40555238f28844eed632c8972b63d2602098031d53b5599d1a874903e0d0c428e0ab12a209ea3fb31225578f1c +b64e9f92a14812ed31075f9fdd3324659a036ef2f293ef9ca6f6feb87d0c138e1ba74bc36a910afd22ff9b3c8ec7cfa5 +8f2d75a86d517dafac09b65596f4b89c4a9c0a7003632407504153fa297c9e3228e236948a5d5224b8df49a087c8e0e3 +b02d6ab9292ae336c8a74115f33765af2c9f62c331d70c087cf4c2979792bb3c2666f6699c017f8d4c6b378fd4bda86a +a923d660d2e55228b8bc74f87d966069bd77c34a776fa96f37b48539c85634482e514e2cb76cb8eb20efd85eb9c83fae +81d7ffb53090a6d512055ecfd582ca92805525a05654e39bb12653a6a8902a16e651ba7b687b36b8bea7186632c7e9e3 +83e9b33e29b57ae53d9f72bd4622ff388252333b4fa32ad360a5b00f3ffc8813b9cb8a1361454d3bb7156c01b94b6a08 +ad7d6bffe4d67eb53b58daa3fc8a5a60790c54fa42226ae12847e94c6de3b4365b3be39855a4f6a5f12e4803cdaed96b +a7709fed85abbee5a2fa49c5238582ec565da08c132d4912821491985bf83b681eb4823634bfe826abd63a6c41a64ea7 +b8fb6ed55741132a1053b6ca77bdf892e96b048488373ba4aa2f2225fae6d578724124eb6975e7518e2bf3d25d215763 +85e0c53089529a09b5bce50f5760af6aeafef9395388aa4b6144ca59953169101783347ee46264ec0163713a25fe7c63 +8f9e47a9c37b678e56c92b38d5b4dab05defc6b9c35b05e28431d54b1d69ac31878c82c1357d016f3e57ca07d82d9c16 +a81f508136ee6ec9122c48584df51637f768ccfe8a0b812af02b122a0fafa9abcc24778bf54143abb79eccebbdde2aac +931a96d2257a4714d1ef20ac0704438481632647b993467e806b1acc4a381cc5a9dec257e63239ba285deb79f92122dd +99fb0ff747bcd44b512bf8a963b3183ce3f0e825a7b92ddd179253e65942a79494a515c0c0bc9345db136b774b0a76b0 +a9dbb940b5f8ab92f2d85fc5999e982e3d990fe9df247cfc6f3a3f8934fb7b70e2d0362ba3a71edc5d0b039db2a5f705 +99011a1e2670b1b142ec68b276ff6b38c1687eed310a79e2b902065bc798618c0cdee7b2009ad49623ed7ae0aa2b5219 +9361e9f3aa859c07924c49f3d6e9b5d39a3df2fc1c10769202ec812955d7d3814c9e6982f4df3a8f3bdbfb4550cd1819 +a8aa23f177ddc1e7a7856da3eac559791d8b3f188c0b3ae7021bcb35dfb72b0f043c3699597a9188200408bc3daf6ab7 +a5a502ff673f6dab7ae4591a7b550c04ede22a45a960c6b5499644f721c62b12b9e08248e7f8b8a59a740b058d2a67e6 +ad374f80f0b52bc5a9491f79a547ce5e4a3ce4468a35d7dbca8a64083af35ab38eff9aa774ccba2e2e1e006e45cb0b85 +ab6851827125e3f869e2b7671a80e2dff3d2d01ce5bfbeb36cbaf30c3d974a2d36fd9f7c3d331bb96d24b33dbd21f307 +96658f6a2d225a82f7ccee7f7a7e476967e31a0cd6c62859d3b13ee89702bb821547f70ffd31cb46a6a0d26a93158883 +878f59ff2590bc3d44fdc674717589800748b78d543d3c0dbb50125b1d6011d6a083f10ab396e36b79f2d89b7cf51cdd +b8bdfb97829c5d973a15172bfe4cb39620af148d496900969bd7ca35de9b0e98eec87af4e20bef1022e5fb6c73952aa0 +a292a78b452743998aee099f5a0b075e88762222da7a10398761030ffcc01128138d0f32fccf3296fcbea4f07b398b5f +85da44fdd7b852a766f66ba8804ed53e1fc54d282f9a6410106c45626df5a4380cbea2b76677fdfde32446a4d313742a +84bebf036073d121e11abc6180cba440465c6eaadc9a0c0853a5f1418f534d21cccf0cfc62533eaeae4653c7b4988046 +923dec006a6af04ef675f5351afffffd2c62a17a98f4144221927c69f4553dd105e4fcc2227b5f493653d758cd7d0352 +a51eda64f4a4410a1cfa080d1f8598e23b59856436eb20a241e11106989fbbb48f14c2251f608cbf9531c7c442b30bf7 +ac6d26ae7bab22d49b7fba7fe4b8cf6d70617977008c8290787c9da1a4759c17c5e441efb3dee706d5d64d9d2ace1de5 +ab5138b94d23c1bf920b2fb54039e8a3c41960a0fe6173261a5503da11ff7b3afdb43204f84a99e99888618a017aac1b +8c85647a91e652190eee4e98a1eec13a09a33f6532926427bf09e038f487e483f7930fbe6ff7a2126ccde989690dc668 +a6026ab87cffec3e47b4c9673957d670cb48c9b968d2ad0e3d624d81c1082dcebbc70d0815cbd0325e0a900d703a6909 +ac4f6ff6baf8374a3c62bdd5a8d207d184ff993f6055bcee1e6dcc54173d756c37c24570d6462395add6f7871d60b1ae +a0dd6bc93930d0016557588f2598b7462ca48cbed637c8190be0fb4811e4576217ca9fc3c669c2a4db82e3f8bb24acaf +a67c1d79f7e7193a23e42928a5cc6a6e8e0c48b6b286607dbcfaaa0f10a7ba29ad62d1d57ca28c486794f0908bece29c +822f411bab4882202ed24e67c84e0c9a8da5b3389804ed9dfba0f672e3e1457ea76cad0cb935dbb3d7a39500fba5fe12 +8a1198572323689300a9d7db2e2bcb7c519392e5d3d33e83cd64bcf1517a7dde52318a98203727b186597702c0eed258 +8a84141b02f1d037c68d92567d71cda3a0b805d1e200b1d3fff3caf9902457cbfbaac33157b87ab0bb9e4fe3bac882c3 +8070ace16d9eef8658fdcf21bed0d6938f948f31ca9d40b8bdb97fc20432cd2a7ef78eeefc991a87eae7f8c81adf9b19 +9522e7123b733ce9ca58ab364509f308a1ead0915421ccede48071a983fd102e81e1634ffa07a9e03766f167f5c7cb5e +82cbdf97a755e952304f5a933fd4d74a3038009f242dac149595439130a815e9cc0065597c0b362130183a4c4a444173 +81e904f9b65cd7049c75f64c7261e0cbb0cc15961ffcac063d09399d0d2b0553b19e7c233aca0f209f90cf50c7f5e0b2 +8f5f6ea87429542ea04ad3eb5fc7eeb28fcf69c01c1a5d29b0de219524f6fba90c26069bfc9092379fe18cb46274393a +a4e5815481eb33b7990d2de1a3a591c1ab545b64fbeb4cff8c71b6bcb04d28940097899062bf43b27c5a8f899616703e +a7afe6066681e312882b3b181f462a1af2139d9bd2aefffae7976f3fc357bfd8fbd6ddd4e5e321412f107736e77f0cb6 +b8ab102d7ff8d46b055095d8fb0ec2f658c9e18eee523c295b148b37f8342c120798113553b8bfebf2a11f27bc704cc4 +862175ecc7e0e294c304a0352cd0f1d11b2603d326bb0e54e02b6cc8d04d01ac31c8864e9395aa1f3b90b76bc4397f5b +a4ea51ef3d82509f0e4eb6af705fa7530921cf9512cb5bf030571e69f4504a299297219a0a7e40db1b45165a5ea3a3f2 +a6fb8b573e2ba6db0e8aba53a489e99bebe533c0fcd947dbfa732e00594f03f4e8609ccc44d8215986d38bc3d4e55d48 +93fe8e0bdd5d66df2bd18be5963e864bddfcdcd3298590e7c3b11d99a070a4948fecef46453f19960bbfeada37979613 +acbc45bc55c7080b45c69a3db80cbfc0267006dcf49c47330975aeff2a8ac07b206e1b1c3a515e50866ff510739b92c0 +94a577df0983e4ee3d6b80c73d7e8e3bb78bd8390ff56fea350e51bdf5e0176b8494e7e81dc7b1d842ada961089cd1eb +81eb1fbe9e9c89f5818d0ef98e694da86e88625f0a37cfe88e6de69f90e58297e67f1d5c9d71263b523b63e42685975a +a81a2391ea4d0f65ab4325196559d67e2648b3f1e464509430b40d9948d5b0fc01c337d9b51048a93c4d62e6b73e1e8c +849a026e55ed77135138836c9df67883763e4602357d8566da2ee2505d135d44061de0c070cf333ffb9ac2e55a0894b2 +8e272cc5734374c003c7b2e6ba833eb99b6be608da04e576df471c24705b6b2a790549c53e7971df2d9f0b88d0f570c6 +b0f9e6d985064aa311d4a147f41007fdc576b7b9194aa4b8712bf59a76a71543fec2ee3db21bd3d30d4096f25babc543 +96331837f0d74e2ba6cb1bfaddf4b1fb359bf46cb6c3c664938eb030e56bc85a5ce17bcd60b7fa7b72cb0ba1f3af0b5b +a0eaab6de4b5a551896e7d26153fb5df4bc22a37833ec864090b57b5115b0f8f1279e855cea456bb844802b294b0dbb7 +955e87d3b966edff34f28137f871881c59bbbc6d69986b739867807680ca22b5e3272ced1d25854ed9700d87f133848b +9270a6db157a8ce78a1af6bfe2b5bbe7b621d56cc8f9940a03b5a5f600848b87b05d83595b2a3a315d4b7f4687c46085 +9043328f2dd4dd85e14c91237a3478dc1eed239164924b53d1de9364d76c81315afa9639b58eedb1ab2122e2ae2e7cfb +857fe9f7d00b03bce367de7f789d755911a5f85d78044f18311ecd9b955e821b4a50228347260ba1205aef61219001fe +a0f878050367a7103fddf380908da66058ef4430eae1758335c46c24f5c22fefb0753991b3a47dba5c7eaafa4d598178 +ab5959296b1af14d2878816c7da9926484cbf8896b7eeac8a99dc255013319a67a0209025e1f8266ffd8cd7d960bdc87 +abe53abc57ea46419dbe0ac1f39eee39a4feae265e58b50928eb0695e25938a16a8b00e65c1313837dc3367297e2c258 +93e3e42ed6ba9c45d4e7a4bf21c1e469efafded1f3be9931a683dbb780db2494742fd76c9ad29fd7d12da2b778ede543 +ab3e64035c488a6e63496ddb2de9648cc63a670c5d4b610c187d8ceb144fcc50b016046f50b10e93b82937ebe932ac08 +a3a8fa898f489b313d31838ad9f0c7ffe62ef7155de5da9ffe6ecd49a984fac3c6763e8cb64e675e1c4a0e45e7daf078 +8356b26aa7c9fc9734b511480dad07b164cfec1324ad98eec9839a7943f2889d37c188d465515ad4e47c23df641c18c3 +83c4476f829e0fe91da2353d5b58091e9335157941e89ca60ccab1d7fdd014bcf21bd55249805780ddc655c5c8c2536e +814f6e66505b2cb36de92c0de8004d6d094476522e66b9537787beff8f71a1381ed9f2b7d86778979ad016a7dae6cbac +b1cd7f6da4a625b82bea475442f65d1caa881b0f7ce0d37d4b12134d3f1beb3ad4c2f25f352811e618c446185486adb6 +a71b918481b9bda667de0533292d81396853a3b7e2504edd63904400511f1a29891564d0091409f1de61276d2aebc12a +a2cd3d4104ec5fb6d75f5f34762d5e7d2ff0b261bea5f40a00deec08fbdab730721231a214e4df9b47685d5bacfe37c6 +807f2d9de1399093bf284814bc4093f448f56a9bde0169407cdc0e7d2a34ff45052aef18bcb92f0ac7a0a5e54bd843e9 +abeb03010c3ac38587be2547890a8476dd166ac7b2a92c50d442f031eaf273ad97114c38e57fe76d662c3e615334ac0b +b90a688da4b0bf65ff01bcf8699f0cba995b3397fcbe472e876ae1091a294463e4b94350ae8bd5c63b8441089e0884fd +ad88db4afb177931788fb08eff187e15ad739edc7e1a14c8b777b6bf668aec69ca4749773f94250c1fdda3b59f705f7c +9886809f9ae952797c6527c6db297d2aa3d5209b360efe6a19970575a9f78aee3c21daadb8e8dfcbeeea5290238d16d9 +930f486e95d7c053c9742e6f0b31e6d4fa2187e41229e46a074b469aafb87880aa8e972719b363049fc9fe2db8f03ce2 +8d229af4fa08bd8aeb5fd9acfee47571eb03fcd2f19073b94cd27e2a6735029d31f123249d557f8d20c32ac881eae3aa +84576ed5aebe3a9c3449243a25247628993fdb2cc327072418ea2f1d11342756e56e9a82449bc3ea6e8eaecabc62e9b5 +b775cb86cbec9c46a4a93d426379c62872c85dd08bccda39b21cb471222b85b93afd34a53337b6d258f4891c6458e502 +8be1540e6b535b416b8d21e3ecf67dfb27a10fd4010f9f19426422edaeb0a4961d43ff3afd1db0994170056ce4d77aec +b9c7438e90a5501a4d05bbb8ab68d6db7e9baa8927231a5c58715ee2ab76ca1da0e94910a076958654869148d813d0e9 +aa9bed1c4d2e7cbc2e1a884c8998773f7cc6fa9d6493c8abe8b425114a48305c3a43a1abda2292177ffd39ef02db4163 +897b395356047cd86f576cfc050f7e4546ecd4df30b2c31ed8945797b81dd4ed9b9106cfbe6d7dd8bf91882e3cf1f42e +949a37e1037d9464b2ccd3ad23eda7089570d6b5ffa18025d2548a9df8829de8d62960f04a603f21eecbca5893d45284 +b8a0642f68ff169ffbcd8cd684fae75d96f9bd76949472775bf155edc55a3d9c3e6f0299ee73a6cfb96289361fdbe9ee +a1273141510fcddd89b9b92c19a268dadd1528ad85744b8174684c9b56668e6b35dabb05f2b4cc6ef5611eaea6052f27 +97c7415c82de83ecc066eb922268b8205ad7266c65b2b8f7e0aadac87f076c738cea72f9b0f069b8d28cf9d5438b8287 +b32c7005380c848f71092a74297555dc6022369fc2a4f285e586ac8f53f6bd354fbe4b1f8a4cfb406a101103bf87bb64 +91b48eeba52f02d04f536d32112038f8ba70bb34284fbb39e0f7bae2e08b3f45ad32e2f55d1beae94b949c15652d06a1 +99e24f5ea378cb816a4436af2ee7891ac78a2e37c72590be0abd619244a190fee51fc701b6c1c073611b412cb76332c9 +9465d1e73a1a0a5f7b1cd85f4fa4f5dee008b622b14d228d5cd5baeec174451e7ae93c5de688393d37cc24ce15df4139 +a6ac3986ee01debdacb5ddc1e2550cb4f039156df15c7d5752b79f333175b840bdca89c4959a523e58cf97bbd6b2039e +b7f7a5cc1b1b6145988170d619c170c130231abbe0b5143a9bccaaebeef9ceb1c16e26749bc9dc5650fe91f92fa1b79b +854cb04f1557457383a401d79a655adfd0a4b706ea2bbc6262949c8d657efcfdc9c7960cbe1a50b5eebb361c5e378f80 +8dd199dccbdc85aeca9ddcb5a78dd741a452f7a0d3ceb6546d76624bad2fce0e7e6c47ee30d60bf773f18d98503e7f9c +889e1ca9f0582be9bf5f1aede6a7312b30ea9bed45ab02d87182a013430f16007ae477ee6a823ae86c7fef7da016a0ec +892a60e63edfb3e7a6cf2d0be184413d214401fc1e6c004ca2902c3f1423728bf759a136e6e715d26d5bb229c75cc20a +a2287cd092261b39d22dcb1fa19512590b244771bb69fb62eda72f12be37d48e408b3e37a47608f68d743834edee7f15 +b3b6afb950bbec0ff631bdf18af433e68adc63d02cb479704f24329ca6b6edd9a3d1d606563dbdce6038b676b85130b9 +847da90f37b294509de51ab6521fdff12d5a1ec3cccaf730aa744da7e54b85fd9c70618787e87c0ba9947ce6c81387fb +ad872153c00bccac75bdb30d1ab7044d814f4f8655ff26421d48fea04fb21d4dc82c1900620a57d13adc45c1062a1817 +90fa5ee98fd7ec719f2a8543bbd0ff45ac69296c2416fc8666d05de3deea1017079a68aba55540a19585925803c8335d +962ba6d029e9176d0e8c80a21f2413f7322f22a9e9a32c933697a8b0e995ce25bea5264736a75718b3d330e215a58a05 +a446f9530db30c5e9c1b3844d635e5c2cd311cc4537ff277fe83dd1a0382bcfa73beb07aaa0cf5a97d24c67e688086a4 +8766b2053f16c72db387abe18b43d7b357a542916c9b8d530ee264e921c999494d6eb1e491352ecdf53758640c7a246d +83f32f511f7b0233662acfc14f30df345af99d2d6c777ce0b4bcdc4dd110533f30b45071df17230aaec392cc482355e1 +82e3521bc9519b36f0cc020225586b263e4feb57b533b38d8e89ccf8d03f301d94da90efb4902002732fbf3876697f38 +b5d1ea69c97ceaa34a720bb67af3fcf0c24293df37a5f6d06268b1eabe441531606954ac2598a1513f64231af722b3a3 +956842696b411e6221c5064e6f16739e731497e074326ef9517b095671f52a19e792d93fe1b99b5a99a5dc29782a5deb +b19b5658e55c279eb4b0c19a0807865858cbec1255acd621f6d60c7e9c50e5d3ee57da76b133580899a97c09f1dd8dac +89e6a8b916d3fcc8607790e5da7e391f6bc9eae44cc7665eb326a230b02bc4eb4ef66e608ccc6031048fc682529833d0 +b1a210bc8070ed68b79debd0ec8f24ec5241457b2d79fd651e5d12ceb7920e0136c3e0260bc75c7ff23a470da90d8de9 +85b1954278e2c69007ad3ab9be663ad23ae37c8e7fa9bc8bd64143184d51aea913a25b954471b8badc9e49078146f5ac +98bf63c7a4b200f3ce6bf99e98543925bc02659dc76dfedebe91ec5c8877d1271973a6e75dad1d56c54d5844617313e1 +b7404b6e0f320889e2a0a9c3c8238b918b5eb37bcdab6925c9c8865e22192ba9be2b7d408e1ea921a71af3f4d46806d0 +b73cbbebf1d89801aa838475be27c15b901f27d1052072d8317dcae630ab2af0986e56e755431f1c93f96cd249f2c564 +95b2027302f7f536e009f8a63018da6c91ec2b2733c07f526cc34cbcfa2f895ccfd3cc70be89f4e92c63c7ddc2a93370 +9201d9ff5d0b1222bfa2345394f88ddf4fe9282acf51bee9b18b96bb724fdf8e736d7101acc2795a34e72f9e0545c9a8 +acbff7eb160f427d8de6f29feeddfa8994674e033a0ccdc8e8c73f9243968f1a6379da670a7340f422892d50c97113c7 +97ae8d03352c3729e1623e680dd9664f303b3bcfb844ef80d21e9c773a247967d27b86c9326af29db5eefd0bd3d4fac8 +8e53ae5c22f5bfa5fe4c414dad6a10b28a3e5b82a22e24a94e50ce3b2bf41af31e7ba017d2968811c179017b78741ef0 +b5ac7dd150247eb63dfb7dd28f64b1bf14426dc3c95c941e8e92750c206c4c7f4ad1a6b89e777cfe26ecb680dbf0acb6 +99ae2e4652ea1c1c695e7ea2022fd35bd72b1a0d145c0b050da1be48ad781a413dc20fbda1b0b538881d4421e7609286 +b8abe1fb3a7443f19cd8b687a45e68364842fc8c23d5af5ec85da41d73afb6840ef4b160d022b2dad1a75456d809e80b +842619c3547e44db805127c462f5964551f296a270ed2b922e271f9dc1074fdf1c5e45bb31686cec55cb816d77853c01 +902dff769391de4e241a98c3ed759436e018e82b2c50b57147552bb94baddd1f66530915555e45404df9e7101b20e607 +82e4f2ee7c7ca1ee8f38afa295d884e0629a509c909a5464eb9ea6b2d089205478120eed7b6049b077b2df685ec8ba48 +aa21a68b0888e4a98b919002a7e71e6876b4eb42227858bf48c82daf664c3870df49e4d5f6363c05878a9a00a0bcf178 +a8420cd71b1d8edd11ebc6a52ba7fc82da87dd0a1af386d5471b8b5362c4f42718338bcbc302d53794204a0a06b0671d +98c686bd3a994668fbbd80c472eed8aedd3ab5aa730c8d3ce72e63fb70742e58525437be1f260b7ecc6d9d18a43356a0 +aca0b2df9ec8ede0b72f03b121cded5387d9f472b8c1f3a5f1badd5879fb2d5d0bbb6af1a2dd6bdebf758cfceadbe61d +93b1abd9cb41da1422d171b4dbf6fbcb5421189c48e85c9b8492d0597838f5845198494c13032e631c32456054598e1d +a246ab3a47f7dc5caedc26c6c2f0f3f303ed24188844ab67a3da1e793d64c7c7fe3e5cc46efafbd791b751e71de0614c +b9b52095ca98f1f07f3b0f568dd8462b4056c7350c449aa6ce10e5e8e313c2516ac4b303a4fc521fe51faf9bf7766ce9 +8e2e9d26036e847c2a2e4ba25706a465ac9fbb27804a243e3f1da15dd4084f184e37808661ec929479d3c735555085ee +8b8c4f4ad5c8e57e6a7c55d70ef643083d4b8dac02716ea476d02dbbb16c702a2f2d5dd5efe3aec7704d2b8cdafe3959 +a800afea30d0df333805d295bac25419b7049d70044be00c7c85a92a0503ca471001bc1e6552323f1a719eb96616fc20 +868bced4560e1495b8527058ebc82a538b7cf806f8d8fe8eeed6981aba771de4d5e9f03cbfc7157d38b9f99cdea87b96 +86b86258b0c1feb988cc79f6c4d4b458ff39428eda292f9608a5fc4c3765782c8c23c66f82d7538e78e092cd81d69a56 +9370eac15de2555824c7d48520a678316a7bb672e66f8115ad7dbc7c7b1f35a7718e8fa0c35f37e3ef2df32dfa7ca8d1 +ae200bc5be0c1c8c6ec8e9fd28b4d256c6f806c0f270766099e191e256d67b9cceda2cc2fed46dfa2d410971a7408993 +af2428c77b2b9887ecde1ea835ed53c04891547fb79fe92e92f9c6009cdfffa0cb14de390532ad0ef81348b91798bd47 +a9069eef0316a5d13d1aa4cef0cf9431518f99b916c8d734bd27b789828ae03e5870837163ea6ad0be67c69184b31e8d +b1b1ce6d529f5a8f80728173b2f873c8357f29644b00f619c15111224377ae31a2efb98f7e0c06f5f868030aab78ed52 +b89c98beef19ee7f300e1c332a91569618ef8bf2c1d3de284fc393d45f036e2335d54917c762f7c2874a03fe4f0f6926 +8264f993dceb202f8426339183157e9e0e026d4e935efe4cf957eb14cd53edcdc866305fb1334cdf0e819b69eafbaccf +aebd113f73210b11f5ac75b474f70a2005e5c349345003989175dffa19f168abd7f0e28125b18907502fff6fcc6f769b +9993ad061066ca6c2bb29fe258a645089184c5a5a2ef22c811352749a199be3a3af3a0d5ce963febf20b7d9e63508139 +97952105000c6fc6c2dcae1ebdb2feae64f578d26a5523807d88e6caf1fe944b8185e49222d06a4553b3bdb48c3267a2 +82dd955f208957d74693bed78d479c9663f7d911f68ff033929418eb4a5c5dc467589ca210c1ba3c2e37d18f04afe887 +b816fc4763d4c8a1d64a549c4ef22918e045ea25fa394272c7e8a46dcb0c84d843d323a68cc3b2ef47a5bbb11b3913bc +a7a87ba4d12a60ee459aad306309b66b935d0c6115a5d62a8738482f89e4f80d533c7bba8503e0d53e9e11a7fd5fe72b +92b36d8fa2fdee71b7eea62a5cc739be518d0ecf5056f93e30b8169c3729a6a7ed3aa44c329aa1990809142e0e5e2b15 +8835b6cf207b4499529a9034997d2d3bc2054e35937038deb9c3e2f729ebd97125f111c12816d30b716b397016133c52 +acf14cd6d978ba905cf33b9839b386958b7a262b41cbd15e0d3a9d4ef191fcc598c5ab5681cf63bc722fe8acfda25ce6 +b31302881969c5b283c6df90971f4fb2cc8b9a5da8073662da4029f7977fbb4aaa57dd95b003a9e509c817b739f964e7 +b74669e1c3fa7f435e15b5e81f40de6cfb4ad252fcdfb29862724b0a540f373d6e26c3d600471c7421b60a1d43dbeb0f +861d01615cba6ca4e4ef86b8b90f37fa9a4cc65cef25d12370f7e3313b33bb75de0953c8e69972b3c2a54fe110f2a520 +a58a56820efaf9572fd0f487542aaff37171d5db4a5d25bfb1a5c36ca975eb5df3cb3f427589e1101494abb96b5e4031 +af13d0a6869ef95cb8025367c0a12350800c6bc4ae5b5856dcb0a3ca495211d4139f30a8682d848cb7c05c14ae9f48cb +8c385767d49ba85b25a3a00026dd6a3052e09cd28809d5a1374edf4f02dc1beed367055b0dee09102c85985492b90333 +b5129fc2fec76711449f0fcb057f9cf65add01b254900c425e89b593b8d395fc53bb0a83ddbd3166acc6d2c17f7fc2a4 +86bd01b3417d192341518ad4abf1b59190d9c1829041e6f621068bce0bef77ec3b86875b7803cf84ff93c053c2e9aad1 +a74fc276f6af05348b5fabccb03179540858e55594eb8d42417788438c574784919fb6297460f698bd0da31ce84cebfc +967ed3ec9f1fc51f76f07b956e1568d597f59840ef899472a3138f8af4b4c90861e23690c56b7db536f4dd477f23add6 +b9e678206de4fc1437c62d63814d65f3496be25a7a452e53d719981d09c7e3cae75e6475f00474e7c8a589e2e0c6bfa3 +b028eaffaa4ff2b1b508886ff13c522d0b6881998e60e06b83abe2ac1b69f036eece3ded0f95e9ae721aea02efff17b6 +935f82de9be578c12de99707af6905c04c30a993a70e20c7e9dd2088c05660e361942fa3099db14f55a73097bfd32a44 +96a1cc133997d6420a45555611af8bcd09a4c7dbddf11dbe65aab7688cc5a397485596c21d67d1c60aae9d840f2d8e48 +80d117b25aa1a78e5d92ea50e8f1e932d632d8b37bebf444dcc76cc409322fb8eface74a5dddab101e793ff0a31f0a53 +893229136d5ab555dc3217fb4e8c6d785b5e97a306cdaa62f98c95bad7b5558ed43e9a62a87af39630a1563abd56ec54 +b7ec1973ec60bd61d34201a7f8f7d89d2bc468c8edc772a0ba4b886785f4dadc979e23d37b9f7ef3ff7d2101d3aa8947 +b6080ca201d99205a90953b50fc0d1bd5efd5eadbfe5014db2aeb2e1874d645ab152fb4b0ff836f691b013b98ce7c010 +b546e66ec0c39037bbaa66b2b3f4704a6a72cf1924a561550564b6fcf41fbc2930e708cd5cac1d05e12a4b8ec93ff7eb +8abeed90a01477260f4b09fff8fa00e93afe727e8eed6f111d225c872a67e6ab61d0472ab6add3fe987744e16f7c5268 +8e02342d5cc1836ed21834b9ef81686172cc730f0412479db5f590b0ff7a729a0e986ffed16d6ecafd6b83d65922ca5e +b05660605cf8e8a10c8d3c77cccbe4e7179fa27cc829571f6b722a58e65e4e44d7fe977446118e9da2d2f40af146cc2d +942a00e006baba6d025cbd99297bdb0cbf3d84cddf849b1b5a9fe9ef1745352fad81313cce5d7622d6652096a8fa065c +aace8212b3d8dbe44ac97460a5938a3b803aca9bd00d8a643a859351daf391b22d1fd2a6b3e0ff83cc9ee272a1ad7686 +965a9885a5259197a75a19707a2f040e0fd62505e00e35ebe5041d8467596752aedf0b7ec12111689eceb3e2e01ecfc8 +81d58270a4e7ee0137cb2bf559c78c4fd5b3a613468a8157b6a9c5c0b6ca20a071b87c127d59cecc3d0359237a66d890 +af92b6354fbf35674abf005cb109edc5d95845e3d84b968e6001c4b83d548715dffc6723ac754c45a5ace8cd7dd30a24 +b112caa707f9be48fdde27f1649149d9456857f928ea73e05b64bb62d597801daac0b89165fea76074f8b5770043f673 +b6e7380746da358fc429f676b3d800341e7ab3f9072c271310626ae7f67b62562ff76c63bc9f5a1dbc0e0af87752408a +a45e9e8d0931207ebc75199aa0c983134aa97f771ff546a94a3367bcedf14486f761e7f572cf112e8c412018995fdaf4 +854381128de5bfb79c67b3820f3005555f3ee6f1200046ebbfaee4b61b3b80a9cebf059c363a76b601ff574b8dbf0e6b +aa1b828a8b015d7c879669d5b729709f20a2614be6af6ff43b9c09b031f725f15b30cde63521edda6cd4cf9e4ab4b840 +8f28f6b62c744084eeddcb756eced786c33725f0f255e5999af32b81d6c6506a3f83b99a46c68fc822643339fe1b91c5 +ac584e76a74cafe4298ca4954c5189ccc0cc92840c42f557c40e65a173ea2a5cd4ae9d9f9b4211c9e3dfd6471fc03a1b +a413365df01db91e6a9933d52ab3e5ed22d7f36a5585ad6054e96753b832e363484fb388c82d808d1e4dfb77f836eab9 +8a68c51006d45bf1454a6c48a2923a6dbeb04bd78b720bb6921a3ca64c007043937498557f0a157262aac906f84f9bf8 +b93ff8b6c8c569cc90ee00cfe2fc3c23cccea2d69cbca98a4007554878311635cb3b6582f91636006c47b97e989fe53d +b9a8a44d54592511d74c92f6a64d4a8c539a1d8949916ef3773e544f6f72c19a79577de9878433bd35bb5f14d92f411d +94f066a7e49ae88d497893e4ce6d34edc2dc0b42fe03934da5d4ed264d1620d506fcc0661faa90a6cf5083e1720beaaf +b42b102adef8f42c1059b5ca90fe3524dcd633cf49893b04b4a97a1b932ca4c7f305cebd89f466d5c79e246bad9c5ced +86b560d78d3c5fb24a81317c32912b92f6ea644e9bedfdea224a2f0e069f87d59e6680b36c18b3b955c43c52f0a9d040 +a3829fa7e017c934fa999779c50618c6fb5eafb5e6dec0183f7254708a275c94ba6d2226c5ca0c0c357b2f2b053eea93 +9337dda730076da88798fd50faed1efa062f7936a8879ea4658c41d4fcf18cee7120366100d574536e71f2f11271b574 +853d09a30f4342f5a84c4758e4f55517a9c878b9b3f8f19e1362be9ae85ca0d79c2d4a1c0c14f5eff86010ad21476a7a +b0bc74cb69bdd8fdffca647979e693ad5cbf12a9f4ead139162fa3263bfebef3d085aab424ed8c6220b655228c63c6b1 +88d8dc8faf3aab12ba7180550e6a047f00d63798775b038e4a43a3b40a421a3f5f152a7e09f28ccd7198bb8cefc40c07 +88db2e3b8746415d0c3e9f5706eda69a29d0b9ee5135ad006060be7787f4f1f7069e2e2e693c5e10b7c3d5a949085ae0 +b5bd830d2f1c722188dba2690d21b7b84b92cbdd873a55aaa966f1d08d217bfc8cffe8caea68868f3850b90b4ab68439 +b5ad4be0c9626a33fce6c8501297bdde21b07b88531451912ed41971a4c48fdd1036d8a4994a99a7fbba4a5901a7095e +b0e1337a2a1772191faa91302f1e562e7cdc69ba5b25139e7728ce778a68a7fa9817f852ec8e04a159122cff62992ec6 +b4fd4a4c1be8bc7e4e2bfd45404c35d65b75f45fb19ce55c213a8035b41f1ccbce9766f3df687c0d7cd6cdfc1abb00a5 +814bf565ece6e9e2a094ffbd101f0b9fea7f315a2f4917abe2bf7d070ed8c64a2987bd288385a42fd336ed0a70a9d132 +af860af861dc80894ed69f29c8601d986917ec4add3d3f7c933a5e9d540bc8ff8e4e79d0bb01bbc08fa19ef062f2890c +b66d33fcf3cd28f15111960ffc6ed032c3b33d4bb53d035ab460cc5fa7ce78872f0476d0bb13f1d38f2672347d2d6c4d +89603ae1a5dd7c526936b86a3b69b7b1d0bdf79ba3cc9cc2e542ec801a6126d1514c075d6ad119fe6b6e95544ffe7fbe +8a1b097f46a62d85cff354d1e38df19a9619875aad055cc6313fdb17e2866d8f837a369a9ee56d4f57995e2b0a94310e +8dc165d86c7f80b0fcd4b6f90d96cd11dc62e61d4aae27594e661d5b08ef6c91156c749de8948adfaf3265b1d13e21cf +98e3173772c3b083b728040b8e0ee01dc717b74c48b79669dd9d2f7da207af64ccd7e9244bc21438a5d4ac79b88e9822 +924d168099b6952d6fe615355851f2b474f6edfcd6a4bd3ad2972e6e45c31bf0a7fb6f7fca5879a0de3ea99830cfb5bc +95452f0b7efda93c9e7a99348e13f356bad4350f60fcd246a8f2aa5f595a9505d05ec9f88b1fe01b90ecd781027b9856 +b95e8af516bb0941fc0767ecd651ada2bc64cc3e5c67a1f70048c634260c0f2c0e55ed22948e1870c54590b36683a977 +82f7feb71e746d5ca24455e3f3e57e4eade92669ab043e877b836612efd3de82009f0555e5d8811bff9f2b75fc57a01d +87623c02caf590ea84cf4a84d1be501f89262e26eb463f2f94a2d3042889c051b058823c3367a989498e46ff25edab16 +b88da847b1ef74c66f923773ce8c920ca89751335fde17b3a98c0603862069a2afbf35b1552b43ad64dccea69f040ff8 +96b734758c823e5ce5b44625c252957e16fa09f87f869baac195956052dc92f933f377b288c7f63b8028751cbbdca609 +a23cc5fbbe5cb7c1d33d433cec4e502f6548412e2374e285d307f75e98280b0c0af4f46bba18015be88cdf7db8b1239c +8bd5bbe04bc929ca8f546e673803ec79602f66ec24298d3e3b6bf6f2c25180fc0032ea6f86c38a6e0ec20ff4eaafc7a1 +b95768ca113e5d57ad887a1cb5ef84ce89007ce34c3156cd80b9aa891f3ebaa52b74c0cb42919cfbcf0cb8bafa8085f9 +a117f99045f65e88acc5a14fc944f8363f466e4a64057eb8fc64569da5dd022a01f2860c8e21b16aff98aebdf89461b7 +895cda6503907c98c43477eaf71dfd26759032523691659f13662ca3a967d93bbc5be342d168223cef7e8a333987d6a0 +a084d77d913d3ec0586ad5df2647610c7ed1f592e06a4993a5914f41994a29c4a8492d9dce2e14d8130c872d20722920 +84a328b73c64137bb97a0a289b56b12060fa186ce178f46fe96648402f1b6a97d1c6c7b75321e4b546046c726add5a08 +b7c35087b2c95127ce1470d97bceb8d873a7ad11a8034cc1cba7b60d56f7e882fc06796048435a9586eab25880787804 +ab05e3394375ee617c39c25c0ec76e8a7f2381954650c94fbcd11063ea6772c1823c693d2d9dd18bd540a130d7b92855 +82ba5907051d84b37fd9d28f8b9abebc41fc4aaa334570516ca2e848846644016356d40fa9314543017d4f710d193901 +9170517b6e23ee2b87ff7c930cb02b3e6bd8e2ae446107b5b19e269bf88f08de5ded3d81a2ff71b632ca8b8f933253a0 +93dc0e3f6234b756cdbb3fe473b9214e970972e6bf70803f4e2bf25b195b60075177a1a16382f1dee612a4758aa076ee +b4b49fac49cdfccda33db991994a8e26ab97366545166cc7140aef3d965529f96a5dac14d038191af4fb9beb020ff6d5 +b826537670acdf7a8a45ef4a422d5ae5a1b5416ad0b938307518d103cc7ba78e495ea200adc5941414a70158a366e8a2 +8ae3588b1fbecbc769c761f0390d888e34773cf521d976ee335f6c813bf06dad38850871ac8a8e16528684f1e093d0c1 +ad9c00b8dccdb545315fbf26849135699c6aa3735f89581244281154c906aba80d20c1e7f18f41acc61e0565f8015a33 +954ce68146c05fc1c9e536add3d4f702335d93c1650b8c1fad893722a81f915eee2d38275dad00ce87f3f5bc90ef7341 +8243feaeff9a12f5aeb782e3dd68609ce04ecde897c90fd8a19c9c5dace3cf43bd5bc0f1624bf7fd2607ca0d71adbba8 +a8a1be55259cd27898d9d60a61998d8da2bf2d439ba6eedb61d6d16dacc4a81ec706b9196dfa080ba20701d2cd9fa1f4 +b0eac6212c7a62ef6062c30875fbe24b8e1a9d88854c035686f849a9eed4d17fbc9af27429eb7c3fd60b47a5e29f6783 +878561a88412e95f19f1cb8894be9d0ea4a2cdd44f343387f87dd37445e5777bceb643cebc68c910acb5e588c509cd2e +a57b6c347955d8b0057a87494223148ff9ff12b88e79dbd9d0aae352fe55e15ea57fcfb9add3d5d269ee0001d8660f20 +a07fa66340d4082585e4d72c77510c59b272e7a3345f4b1de6be7ff4a11ea95d712d035a7355fc8d2e571fa65fe8236f +b9d84a627462438e8ede6c453e3367bfaf81cff199d3e5157ef2bc582d358b28b5ccc3bc27bb73af98ef45179ea79caf +b14f26ea7ca558761cb19508e5940fbf5dcf2ad8555c5a03e8ff92481994072f523b1ab6b7176f698e2cfd83d4f8caad +800cca1cbb14e1fc230c7b420ff06864a934b082321bbf5b71f37340383923f23183d4fdc8fa2913928722b8892db28e +94790c950b92e971ec39e9396c3f32dee32a8275d78e6ea28a47130651bddc86a189ef404c5e8c210bd291186dee0df4 +ad7b3b3e377df64023b8726d43a7b6ec81e5a5e8c0943c5bebe5ab5ddd6597255f434a205c14ba90e9e5e3c462a1fe0c +86ff8156cc857a416e735009cf656b89da59b766b4c4e5a0c0165282b530c10657cc28cf5cb847696725c37ac48b69d7 +89cb64cf9294f68f01533660a2af2aec0ec34cc0b4a0cc36a128f2e0efb3da244981f69aede962f50590faeeb9a5da01 +a2ea5a94a524bb8e6f767017246cd1af9d87c9abb9894e91c4e90c34c5161be6179b49dafcab9cff877a522c76beb145 +b5d9abf29ed6030a1e0f9dc19be416c45ba8cb5ed21aff5492233e114035715d77405d574cd62f2716285e49f79b9c99 +ac441cf6104473420babdfb74c76459cbea901f56938723de7ad3c2d3fadb0c47f19c8d9cb15a3ff374e01480b78a813 +abea34bd2d36c5c15f6f1cdd906eb887f0dd89726279925dbe20546609178afd7c37676c1db9687bc7c7ea794516af03 +8140abfd0ec5ca60ef21ad1f9aabbb41c4198bac0198cb4d220e8d26864eedb77af438349a89ca4c3ff0f732709d41a9 +a5a25abf69f3acd7745facb275d85df23e0f1f4104e7a3d2d533c0b98af80477a26ac3cf5a73117db8954d08f9c67222 +b45ac8d221a7e726ad2233ba66f46e83ed7d84dbe68182a00a0cf10020b6d4872f3707d90a6da85f6440c093914c4efa +80f586dfd0ceaa8844441c3337195ba5392c1c655403a1d6375f441e89d86ce678b207be5698c120166999576611b157 +b8ce52089e687d77408d69f2d1e4f160a640778466489d93b0ec4281db68564b544ec1228b5ab03e518a12a365915e49 +8990f80bae5f61542cc07cb625d988800954aa6d3b2af1997415f35bd12d3602071503b9483c27db4197f0f1f84a97ac +8329858a37285249d37225b44b68e4e70efeef45f889d2d62de4e60bd89dde32e98e40e2422f7908e244f5bd4ffc9fe2 +8d70c66ea780c68735283ed8832dc10b99d3daeb18329c8a44a99611a3f49542e215bf4066ff4232d36ad72f1a17ccc3 +a3b2676cc8cdf4cc9e38c6cb8482c088e5e422163357da3b7586a3768030f851ad2a138eeb31584845be9ffb8067fc00 +95b1fa74e9f429c26d84a8e3c500c943c585ad8df3ce3aea1f6ab3d6c5d0ed8bb8fa5c2e50dd395fa8d4d40e30f26947 +b1185f2ac7ada67b63a06d2aa42c4970ca8ef4233d4f87c8ffa14a712a211b1ffde0752916bfafdfa739be30e39af15d +8705a8f86db7c4ecd3fd8cc42dd8c9844eab06b27d66809dc1e893ece07186c57b615eab957a623a7cf3283ddc880107 +af6356b372f0280658744c355051f38ff086f5563491fc1b3b1c22cfec41d5c42b47762baeb9ee6c2d9be59efd21d2b7 +86bdd4527b6fe79872740d399bc2ebf6c92c423f629cdfcd5ece58e8ed86e797378a2485ead87cbb5e2f91ba7b3fbda1 +a900f0be1785b7f1fda90b8aedd17172d389c55907f01c2dfb9da07c4dc4743cb385e94f1b0fc907dd0fedb6c52e0979 +a9f59f79829a9e3d9a591e4408eaec68782c30bc148d16eb6ae2efccb0e5478830bbdaa4ae6eac1f1088e7de2a60f542 +99cf54a69ad5e8c8ec2c67880900e0202bcc90c9815531d66de8866c0a06489ea750745cc3e3aa1c4d5cb55dcd1e88f7 +8676246a4710d6d73066f23078e09b3fa19411af067258e0b8790456525c02081727b585d6f428c8be285da4aa775a4b +b596c7014fe9214529c8e6b7602f501f796b545b8c70dbf3d47acc88e2f5afd65dccef2ef01010df31f03653566b16df +a12205c6c1780fc8aebdd98611e12180005b57750d40210b9eff0396d06023bd4ff7e45f36777123ff8bed7c5f52e7a3 +ae7dbd435bba81685d5eab9abc806e620253da83e56b4170952852d442648a5d8743f494a4b0fc9d606574f87895b0d6 +9786257b1726b7cdc85219ca9eec415f98f5a11e78027c67c7b38f36f29fe7a56443570fdfedc1d9293a50e4c89d89f6 +aaf0515070d1ca92aacdf5fac84193d98473d8eb2592381f391b8599bcd7503dbf23055324399d84f75b4278a601c8b2 +b31654dbf62fbbe24db4055f750f43b47f199a2f03c4d5b7155645276b2e456a218ca133743fb29d6f1a711977323f6e +8f4d39106ecdca55c1122346bdaaac7f3589d0cf0897a6b4b69e14b4d60550fd017876399401ce7c5d35f27da95f50be +8a7bfdb48cd47afe94aff705fac65f260b3a3359223cff159b4135565c04b544dd889f6c9a6686f417e6081ad01e0685 +967ba91111e5e08f9befcbaad031c4fb193776320989f8ede4018254be0e94586254432d3dbae1455014f3a2f2549d01 +a9db52352feeb76715a35c8bed49fb3a8774c9c8e58838febf800285fd6c4938ec162eb8457029e6984d8397dc79ea19 +811794e6bfe2539e8f6d5397c6058876e9e30763ad20dad942bb5dbcab2f16d51718ce52bfb4de17889ba91da1b85bcd +a6db0f65a6dc8b8cc2312a3e0146d8daf520255bb12f74874c05693914e64e92be0cd53d479c72cb2591e7725dfaf8b0 +918d21bfa06d166e9eb5b7875c600663a0f19cc88c8e14412319d7aa982e3365f2dff79c09c915fc45013f6b3a21200d +9894852b7d5d7f8d335dd5f0f3d455b98f1525ad896fdd54c020eeaf52824cc0277ecbfa242001070dc83368e219b76d +ad00acc47080c31fcc17566b29b9f1f19ccaae9e85a312a8dcc0340965c4db17e6c8bd085b327eaf867f72966bf61452 +965e74649e35696744ecc8bed1589700bae9ca83978966f602cf4d9518074a9aa7c29bc81d36e868a0161293f5a96e95 +961e29a239c2e0e0999b834e430b8edfe481eb024cc54ffaffd14edaf4b8522e6350dc32039465badfff90dcb2ba31cc +943dda8fa8237418a07e311efde8353c56dd8ec0bfa04889ccdd7faa3dee527e316fdc60d433a3b75a3e36ca2aa9d441 +a0ed4c102e3f1d6ebf52e85a2bc863c1af2f55dc48eb94e40066f96964e4d37fff86db2cff55a8d43d517e47d49b5bd7 +9045770ad4e81345bc6d9a10853ee131232bf5634ef4931b0e4ba56161585b4286876bc8a49b7b1f458d768718cb8ebf +b0dd430295ff28f81895fde7e96809630d1360009bbe555e3ac10962de217d93ead55a99fd4f84d8cadd1e8d86d7b7ef +95ced48419b870ea4d478a2c8db699b94292f03303f1bf4560b5b1e49ca9b47e7008514fe0a9cf785717f3824567e1b2 +a7986e0e389e8aef6aac4a7a95e2440a9af877ae2bc5ad4c5f29d198ec66aa0db1d58c451e76ae70275a2e44c3d3fa68 +85a8490faf32d15de12d6794c47cc48e02428af1e32205e0742f8299ea96b64bcd6d3b4655272afa595eec74ecbb047c +b790d7fb1307aacc2d303d9b6753a9773252b66c6b67763cf8841c690cbccc4866ffb5fec1c068b97601a7953fe0f7e8 +afcc4011f8c53f10d63c29b74d9779cd75c861e01974c28a4ec2cbb909b67a1b2287ead175231343c936ad75dfa416ff +918058bffdecc1ae8779dccf1d874bb9e28edbe34c8b5954a8da64a848858d2f0776437b423baf4e731f3f5fa05a2841 +ab554db549aa36dfa9f966a5ed6be8267e3aa9ced348695f3dafc96333c6dbb48ef031693aafd59d1b746ecd11a89c51 +ac4ecf746b46b26a7af49cc9cc1d381e1e49b538dbd7fb773ce6b1df63ae31c916693cca8a90fb89f1e7ec5e0e8dd467 +a8de66d48f16b016f780a25ba25bd6338fd8895a1909aabcfb6e70f04ff66f9866e6e2a339bcbfa4bfba4070a6a8db26 +b4b49374eff6dac622e49b0e9c0e334ecbec513a96297f6369696ad39e5ec0de81a1417f6544be866c9f60957a9ba09a +b8023968549ebab6c1e7a8e82954a5b213bec50bbf35b36697a8d4fd75f9e12d510b365962aace4c9978c5b04da974a7 +8d4bc016026dd19e4059d1c5784897cefa47f7ae2ed6dfa2b3c14a852fff2b64abc09549d106584e0daed861a2d6d6c2 +85e26f433d0b657a53da4c1353485e0c2efa092484c5b8adb3f63dc72ee00be79197ebef7937b37a6a006571641cd6af +abb37a917301e68328032ff4715abc0fee32e5f5be68232ca8bf7ffb8732bc47504e75b40bcc0a7c7720b71496fa80af +9837c8d2660522c0357f5222777559d40321a1377f89ca1717215195bad4a348a14764bd87fa75f08e1f6263e9d08982 +97e06f971b4c56408ed5f1de621d233e6a91c797f96ec912737be29352760a58831aaf1f64e377c3ed9f2f4dc8ad1adb +a12d211304da7b91101513d57a557b2504069b4383db8ecb88aa91e9e66e46e8139dadc1270620c0982103bc89666215 +aab74ba48991c728ba65213e8c769e6824c594a31a9b73804e53d0fda9429403ff3d9f6ea5ef60884585d46356c87390 +92f19be2b7adf031f73611282ad33e462852f778c5e072f689dd0e9458fa6ebccfae02f2b2dc021802c9225035862468 +953bb843c48d722604576cef297123755cef8daa648c30c3a678eada8718dfdb16e71cc3e042a51fedc80577235c2563 +86f509e3c1b9ee9a3b95e6da8516b47feb8c8a83403984228f4903c7ee1ee4f03addcb8fe86283af1196a54b36b9470c +903d793a377e98e2562c49de33e3fbf84bf99211925e7002a4f688470db655884e1efe92782bf970ffa55d9c418ef3b5 +a41b65681ed7f10987a7bfdf9e56b010d53683819d845d880fc21b2d525540605c5823e75c434f17b5a0d08a091c1564 +971be802de51cfc0d10a96be7977c037873f19334ed4ed4904b7675aec8bfa1f8956cd0150b07064caf18229ffd1ccd9 +b253ebe4f82cdbefbc3ef816d40c497fe426a9f0f0f170e783fa4a05ae6dabdfa8c448817a24e723a314b43e76a7c422 +86f397c95025489929ce9230b1466b5c330ec7c58a3c7e3153d6d05bcb8348a13398908e192590b8812f5c5ff09c133a +a0713983a3dc9f10b3833687cd2575de2fc63c4ad8d2f54ff85c6db23dd308daefef1bd1e51eec26732f77c1f37ba793 +8249a1d53ec92f311f4fa77e777800d777f3e9d4d452df740fc767fa7b0f36c8dce603d6e6e25f464c0399b8d0b93c30 +a73d0a206a62922f07b928501940d415e5a95716ee23bf6625b01ff2cd303f777adfa373d70279ba8a30fbb4c99a6f1f +b1106b407ecf234e73b95ff58ac9fdf6709ad2e763b58f0aacc5d41790226d441b5d41405ac03a0641f577848a4f5e8e +b009963ccc7b2d42792f09ab7cb0e929503dd1438f33b953104b4de43274ca3ce051554d10d7b37041b6f47d7a2dab6f +b744512a1b3c7ef9180b095c6a0c5bc16086a50020cf20dc2216bbff24d91ca99b95cb73070444dafc3ab45c3598960d +a0209669ffeddc074d35cc6aa2dac53acac8e870f8a8a5118e734482245b70c3175f760652e792118fdddac028642259 +8ddd3e0d313da17292fdcc1bbc6e9d81189bb1d768411c6fe99801975eddb48dbf76699dcf785cac20ab2d48e392c8fd +8392aa285b8b734aa7a6e0f5a1850b631ddf6315922e39314916e627e7078065d705ff63adbc85e281d214ec7567863e +b655a1fff4dba544a068bf944e9de35eaaa6c9a0672d193c23926776c82bebed8aa6c07c074b352882136b17abdab04b +af5095f40d1e345b3d37bebee3eb48c5d7b0547f12c030d5bfe8c0285943e0a7a53a186f33f791decba6a416cba0c5c9 +8223527f9eb3c8ff52708613cd2ee47e64c0da039cea3a0189b211dc25e9bfa3d5367a137f024abe94f98722e5c14b67 +afdb106d279273edc1ee43b4eead697f73cb0d291388f7e3fc70f0dd06513e20cc88b32056567dcc9d05364cb9ca8c58 +9319eac79ff22a2d538dcd451d69bca8aa8e639979b0d1b60d494809dbd184a60e92ad03b889037a1ac29a5547423070 +b79191ce22dbd356044e1777b6373b2d9d55d02b2cc23167642bc26d5f29fd9e2fb67dce5bd5cf81a602c3243bedd55c +988e0da1e96188ffd7c5460ecdf2321f07bc539d61c74a3292c34cb8c56dbafbca23eb4471a61e8e64e9a771a49fd967 +b0792b6cf4b10f8af89d3401c91c9833736616bb9fe1367b5f561c09d8911fb5a43b7a4fd808927b33ab06e82dd37a28 +862f68ea55206023ca470dbd08b69f0f785fcbabb575a1306ff3453c98ffcad5fd6ead42e8a1f9edf14c6fd165ffd63a +815ff0898b1330ac70610180c0f909561877888ff10def749a1e65edf9f4f7cea710a757c85241dfb13d0031efb5e54b +aa6e6ce21776ea4507d452ccdaf43a161a63687aae1cb009d340c9200e5646e9c2de4104dfd66b8e55dfa6de6ee83e4a +8e8f3d3403e0256ecc254b9b1464edca199cad3f3348002d744721c345a1a3c7f257c3587d2229774cd395e26693d1ba +90483e28985e4a0f7a3cb4bc5e865b9d408b94cd2146c04aed00b48a7ab80a28deb05efec320817d63578d4f953bd137 +84fb2a762ba29193b07f1dd84b3f69153cedb679b66ad04f8a4adf01c14f115163a107e6db23aaf0f0c9687824ded197 +b4a23922bf4302cc9a6583f252a1afa026c87c132b9ae44cc1f75a972cb6ae473447c500827906f9b677617ddd6fb473 +809bb9edbbe3a2769165f029f2a48b6e10e833eb55d8f9107c4a09ca71f0986dc28f3bf4ead9cab498086eb54c626bbf +a0459dbb08db4155d16301933ec03df77c4f835db2aa3f9697eeb2bb6fcd03337fab45fa43372a469fecc9a8be2e3119 +a638eaace7f21854de49f4db6e4ea83d2983751645e0fb200c5e56561f599fd37dac70bdbd36566fdd10d4114fbb9c2f +a3a27bc2728390643a524521bf8ef3b6437cfba6febfd8bb54f2b6ecbafafb96196d3dea279ce782efd97b212f364ef5 +b86693b3ea23ea6b2c4d52554f61ef39c0ef57e514ff6da80c6e54395df8376e2e96b9d50e4ec301c59e022c5c5610db +af4d7cd678d79e67ae19789d43331dff99346cd18efff7bab68f6170c111598d32837372e3afe3e881fd1e984648483e +b8735a555ba7fe294e7adc471145276b6525de31cda8c75aae39182915129025fb572ed10c51392e93c114f3a71bd0be +b1dfb6dbda4e0faaa90fe0154f4ddaf68ee7da19b03daad1356a8550fca78a7354a58e00adeecb364e2fd475f8242c24 +9044b73c1bd19cd8bb46d778214d047f5dd89b99b42466431b661279220af5c50c0cffecebd2b64c3d0847a9c7a8b1ec +891f0d162651a0aa0d68fb1cc39fa8d77fd9f41ff98b5d6c056c969c4bac05ba8c52cbfa7fbb6ef9adfe44543a6ec416 +8920ae1d5ac05bf4be6aba843e9fc1bc5b109817381cdd9aa13df53cabea319a34ee122dcb32086d880b20900ff28239 +abb14023142876cbc9301336dced18c7878daa830070b5515ff4ac87b7bf358aa7ff129ebbf6fb78e827570a4142661f +a74b15e178cf91cde56eab0332e62d5ff84c05fcc849b86f45f94d7978bf9c0fc72a04f24d092a9d795ca3d976467f46 +806829621a908ca9b6433f04557a305814a95d91c13152dca221e4c56bfaa3473d8bb1bacd66e5095a53070f85954278 +b09a3c185e93869aa266a0593456a5d70587712bca81983dbc9eebbb0bd4b9108a38ae1643020ecf60c39c55bb3ac062 +b2bbe8f5361a3ecdb19598dd02e85a4c4c87e009f66fee980b4819a75d61f0a5c5e0bdc882830606cb89554ef1f90ead +825e16cb54fc2e378187aedae84a037e32903467ac022deb302cf4142da3eda3ead5b9f3e188d44f004824a3b5d94fbe +8b39d4a11d9b8ba885d36bcdb6446b41da12cfd66cb22705be05ab86936464716954360cc403f8a0fd3db6d8b301cb59 +ac19d453106c9121b856c4b327ddb3e3112b3af04793df13f02d760842b93d1b1fbdff5734edc38e53103a6e429a1d1f +b1cacbb965ec563f9e07d669ffc5e84d4149f1fb9fcfbc505788c073578c8f67956fb8f603e0b9a9d65e2d41803038ce +b7612d9e7dc930bff29191d1503feb2d6451b368b69fa8ecb06353c959967daccdc262a963f01c7fb95496f1bd50d92e +93f8fceb65ea9ef2052fa8113fb6720c94f0fed3432d89014ee5ad16260aeb428aadea0d1f1e002d2f670612ba565da3 +b3eb9213752156ed1fced3bca151fd0c630554215c808b9a0938b55fed42b6b89f9b76bc698f3e37c3c348d2395dbed1 +b46ab3553ef172ae40fc21c51d1d7eab8599a67f2f89a32a971aa52c2f031664e268b976dd2f7dc2195458fcf4bf3860 +8fb66f2c67ca5b6fb371c7d04592385a15df0c343857ba8037fe2aa9f2a5d4abc1058323ff9652653261b1c7db0edc24 +a7dfdbbf0b14e4af70fdb017875cdc36ad2108f90deb30bfca49301c92cbf821645a00ade1d1ee59a1a55a346675c904 +856199cad25ec80ee0327869077f272e33d59bf2af66c972e4a5839ec3b2a689e16f7fd0a03a3138bec458fcff8edbea +a2842ac5a715c2f48394988c6f84a6644c567673806feaa575838e906138c1b25d699e1b6ffdfc9be850b15da34077e4 +814b448ada88f769de33054c3c19f988226317797acacdbe55ed2485b52cd259ac5bcbee13f9de057eee33930a7fa0c0 +b49de8dd90da916ed374ca42665464b6abe89ff4453168921f5a7e5ddd3dcfa69422782e389e586e531fd78a1f236a8b +851f9d942b4c8ffc020c02c7fbee0f65ef42b1ab210ab4668a3db6aa0f8ab9eedb16f6fd739a542cc7e3cc03172b565b +a5128c155b8062d7fa0117412f43a6fdc2de98fa5628e1f5fc1175de0fa49fc52d015ec0aff228f060628268359e299c +b0765849127cc4ce1a1668011556367d22ce46027aa3056f741c7869287abcaccf0da726a5781a03964a9ded1febf67d +984562c64f3338ffe82f840c6a98a3dc958113f7ed28ee085af6890bbc0cd025723543a126df86f379e9c4771bb69c17 +8087fe60a9a22a4333f6fbe7d070b372c428d8c5df3804bb874b6035e5602c0693757fb30a9cd5a86684b5bca6737106 +a15e195b5850f7d45674cdc3bd74f972768b46fe9473182498263edc401745a8716fc532df8fc8c1375e39e391019226 +858ec10208c14a67c4156ea9c147f36d36c4fa0a232195b647e976ba82c8e16262b2b68d31e3b4702070c3dc701bccb5 +84bf3fb83c003380ee1158e2d6b1dca75cd14c7b2a32aec89d901f0d79e1475aa0827cb07cba1784a6bb0d37f6ca5cd4 +91e69f5392648e7f7c698059a0fc4b8478ab8af166d3842fb382ec5c396daa082ee3b2cb0192da3c9d90f6523c4c039d +8f7299f451c5e641d6fd961946b7a6ba4755685b2a40164e6276c25aefc66715b92492097a191813d39bb4405dc5da36 +ade2cf04ff6c94c1019bfa1e0e8f580696230fa6ee9695c4772e5a44501b2fffdd765ec7cc71ba14b83559ad62cc0fc5 +85fc98ecf469d6f98c8b3e441680816f764de39001a249bc7162f990c5a5354683e849164d4fc9287ee516780cdcd436 +928d118188120d038c37abdbe66c05adaa87f1cf9957dee2783b09fa91c4c43a7b0d0b2b6c5f4dea57e3ec8af230e84f +8025f71cf8d3085d6ea5104dddea8fa66cdb8527e40db01472469be021632daf22721f4acf1a8698a53439fe2f82596c +83266fffb12b3c795a6b551ac2aa7d9a29c183f861e78768c11286a04e22bd423bba05a68775bd77273e3ca316a4318e +95fd0c69c2d9df4e795c7ba71ed71a9d9f2878cd7e3a64be7b671d9611649fd41d29f8bdab642ba19cbd3db660d6a7e7 +92a912cb4d5ef4b639876daf4289500c4ebdbd80aff07fd93dc3eea645f084f910e5c02c10492a37f16acaa7e646d073 +b3d2622c987189a0873932aaea8b92ebb6e9e67ff46e91a96bf733c3b84175fffe950f8f4622cc4fa50f116321c5537f +a98f9a40054b31023a8f7549a44cae853b379bbfe673c815b8726e43ecd11a96db40b20369d712cbf72ffab064ecfac5 +b4e9a38e371fc21f4b8a3d7ad173c9ffad0554530dc053365d9555ddb60f5c9063c72ff4c65d78b091af631a9e1ee430 +875a31aee4ba19e09f8c2754fab0b5530ec283c7861a4858b239a12432f09ef155a35fedb0bc33eac2117c7e62f1c7ee +95edd0d1a6e94af718590756b5c5f5492f1c3441ecc7fa22f4e37f4ec256b9fffd2fda4c11fc1a7c220daee096eb1ff8 +b35fdc435adc73e15c5aaf4e2eea795f9e590d3e3ee4066cafa9c489ee5917466c2a4c897a186b2d27b848c8a65fa8a8 +94a5ce56f8d72ec4d0f480cb8f03e52b22f7d43f949a4b50d4a688a928ffd2c9074ecbab37733c0c30759204a54f9a6a +987562d78ef42228c56074193f80de1b5a9ed625dd7c4c7df3bf5096e7d7b08e2ee864bd12d2ea563e24fa20ad4d30ef +95a8218405038c991ace2f45980dbb1efa9e4ad0d8153486b0213a89e4d7e3cac6d607100660784627c74f90a8e55482 +b6a29d566f5a924355b7f7912f55140e1b5f99f983c614b8a92814ce261f2750e8db178866651ea3b461fb8f92890b14 +afdacc0a13da0446a92455f57a42b3ba27ba707f24171727aa974d05143fae219de9e2eb7c857235dd9c7568f43be5a8 +862a7dc25f7cfa4a09aeca0ed2c9c5ee66189e119e226720b19344e231981504e37bca179aa7cad238ee3ab1386aa722 +a336364e76635f188e544613a47a85978073f1686e4ee7a8987f54da91c4193540ac448b91d07d1fc5c7a8538b1f1688 +8f1ddca9638decd8247c1ce49c1e6cf494d03d91c4f33e48a84452d12b6736e8bd18c157068dfeff3a90977af19e5b1e +96ae91b9aaf00e437c18ddfc1aef2113ee278153ba090aedeb3f48f1e66feb8897bb1ac7f5ffeffc3be29376dd51e498 +8230b5bd9067efb6089e50213f1cc84da892e6faf0b79d5e4768c29303a80b1b754cb09d17a21933aba4c5f32070878a +a79dfe217faec7b4d3cf97d8363949efbc6f3d2c6bbc25df2c7bb8b7fd2521e6d3fa76672bfc06de6f426290d0b3cc45 +8290bd36552609d6b3ac9ccb57ff8668fc8290548eecdcee9a231f1125298c20bd8e60f033214dfbd42cd3c8642c699b +8945db9e8ec437c5145add028d25936ee8823ceb300a959402d262232ae0cbd9a64c1f0a1be6aed15ff152202ea9a70c +949e232b48adeaf57bd38eacb035267d3e78333c6b4524cab86651a428a730baf9c27ff42cb172526d925de863132e82 +98917e7a5073a9c93a526399bb74af71c76958a74619caccf47949f8fd25962810a19e399b4efcba0c550c371bea3676 +b5b144e0707aefc853ea5570bd78dedc4e690cf29edc9413080f28335ac78022139bfe7f7d6986eb1f76872bb91e82ad +949945072a08de6fd5838e9d2c3dc3200d048b5d21183020240fa13e71a1a8d30e6bfee4e6895e91d87b92f1444d0589 +b351a03c7c98506ee92d7fb9476065839baa8ed8ac1dc250f5a095c0d4c8abcfab62690d29d001f0862672da29721f16 +a82d81c136bc5e418d1fba614cb40a11f39dc526e66a8b1d7609f42fea4c02b63196315014400084f31f62c24b177cbd +87d51c907fdcdf528d01291b28adfee1e5b6221c6da68fd92ab66126247cd8086a6bcffff0ea17e7b57b0ba8d01bb95d +a2a9a1a91dfd918f36c1bfeeca705ea8e926ee012f8c18d633e50ec6e50f68f3380ef2ee839e5a43cf80fbb75bfb5304 +86f22616caed13c9e9cd5568175b6b0a6a463f9a15c301b8766feca593efa6e5ee4c7066e1cd61b407c0be12b3d8236a +b57e0a2c42790d2fd0207ef6476a433fca0cf213d70840c4af1ad45833f23fca082d21a484f78af447a19a0b068ea55c +8ae9bda5d85e6e3600dde26379b7270abd088678098506b72196ac8f9ce5b0173bc9c7ff245c95cbab5b5b967bcb043b +95c7d11f6c874f59ba632b63ce07a7a9d917a74d0b89cefa043f52aa1a7fe2e81c38dea0b20378264b5b4f64039932bc +ac7dee7479f50722526ea1c9d4e2f1a4578d1b5cce2092a07722069c96bb4da295de1c4f16e21005276e3b3f1624ac5a +89b8aaa49bd18b09f78fc5a1f3dd85d69b5dfcff28fc6d5a92b1520bc54107b8b71bb71fd6e0bde10e0a5809c633e5d2 +8982cb43fe4d3488c55e8c08b935e6c8d31bb57e4f2aeb76d6319470cce99ebf7dc2f116ac15b9d845ab1bc16aa6a583 +a12c63f48e27b1a1c83a32992642f37fb5b89851a35e80f6d1f9bc483cb25acd0e12b1dcf68781ae0cc861f002368bcb +aa6da92a4b4fa229afc8007abca257ce0ff5fad3b1ccfe5d836b9b52ff6b72575a0b915a759403b993733b16a47fdb15 +8bf706a92fe54f15d633b9463926b874dd43e28aaeca3fe2353fb58ad7753c8a293c56b0e94176070e8a9ec7401073a1 +b81e86de4bb5c1046e40cca79585c5b98c8673626fd3a28e563c5a3296256c2f7086522ae95cbabfaa8f1a8f7eae6272 +ad10f895b05d35cb251f78cc042d3f0969a8b6b3f289ddb4b016e0b8e06bfffc3a3e1afa9b0cc548f8c092832bb766bc +ad993aceb68d5217cfb07f862956cde83d05dec5060fc7a8fbfd37c6bfd5429ba69bdaf478b6cd01c323a06793dcd9fa +83da9c9a8fcb2775df0777aceabe90642a2df1c6abc646566e954f42d6e43455b00b101ec5ef58850c8d4b3100222ca1 +b55484f339fe7c7d107e70432601f4a34e1cc02ae4de5d18b99e5aa995f7b3710fc745769b85c1af803d457491dd8ce3 +8009d80593e82f3e751cec9e7e495fd29ad6f45f8d3ae513bec998b43c49fed74c44229c6f27c421e80c65413b897644 +9868081bbcc71192f7ff8dcf99a91dcd40f96556fbd6f285bdbfdfc785f604d8bf75c368c59db5ac8cdcc663087db53a +a04b1e91af025b4387ee0a2d790a1afb842e46f4c3717e355578efd1f84fea78782c6f7944b4961268de7f1ac71fb92b +a7b6301ddb9738b89b28a36d29d5323264a78d93d369f57ddab4cea399c36018a1fcc2cc1bfadf956a775124ae2925bd +a6cdb469014b33c590a07a728ce48f15f17c027eb92055e1858a1f9805c8deb58491a471aaa765de86a6bda62a18aef4 +828a23280ec67384a8846376378896037bd0cb5a6927ff9422fca266ee10a6fde5b95d963a4acfa92efbb0309cdb17b4 +b498ec16bcdb50091647ae02d199d70c783d7c91348a1354661b1c42bc1266e5a5309b542ef5fdf5281d426819a671cb +806533fb603e78b63598ff390375eebe5b68380640f5e020e89a5430037db2e519ab8ae5d0d0ad3fa041921c098448e1 +9104ad119681c54cdee19f0db92ebfe1da2fa6bef4177f5a383df84512d1b0af5cbe7baf6a93ad4b89138cd51c7c5838 +ac695cde30d021d9f4f295109890c4013f7e213d2150c9d5c85a36d4abfdca4cdc88faee9891e927a82fc204b988dcd9 +a311c244df546d5dc76eccb91fe4c47055fc9d222d310b974d4c067923a29e7a7f6d5a88bfef72fd6d317471f80d5c82 +89e4518335240479ad041a0915fc4f1afaab660bd4033c5d09c6707f0cc963eb2e6872cabc4a02169893943be7f847d4 +a8ad395b784c83aacf133de50d6b23bd63b4f245bb9e180c11f568faca4c897f8dbda73335ef0f80a8cb548a0c3c48fc +93e02b6052719f607dacd3a088274f65596bd0d09920b61ab5da61bbdc7f5049334cf11213945d57e5ac7d055d042b7e024aa2b2f08f0a91260805272dc51051c6e47ad4fa403b02b4510b647ae3d1770bac0326a805bbefd48056c8c121bdb8 +99aca9fb2f7760cecb892bf7262c176b334824f5727f680bba701a33e322cb6667531410dfc7c8e4321a3f0ea8af48cb1436638a2093123f046f0f504cc2a864825542873edbbc5d7ed17af125a4f2cf6433c6f4f61b81173726981dd989761d +88e2e982982bf8231e747e9dfcd14c05bd02623d1332734d2af26246c6869fb56ee6c994843f593178a040495ba61f4a083b0e18110b1d9f5224783d8f9a895e8ee744e87929430e9ba96bd29251cbf61240b256d1525600f3d562894d93d659 +a2d33775e3d9e6af0d1b27d389e6c021a578e617a3d6627686db6288d4b3dffd7a847a00f7ef01828b7f42885b660e4204923402aca18fbae74ccd4e9c50dd8c2281b38dc09c022342ed1ac695d53f7081cb21f05fdfc0a3508c04759196fcd3 +af565445d2ad54c83a75c40e8895f5ad7219a8c728bce9d58d7a83716e095432993ebbd3f6911c66415a6f920d1a4d171478509b54a114308a020b33bf4487a7a8d0aa76ae4676a9b54e765a680f562d3a4fcb2e92c58b14b49b5b2917cc258f +8aa99cfaf514cef4801599cadd780d222194ca1ad69a34779c2bcfda93e5dbeb931e13914421b5809a6c81f12cf7038b04a35257cc9e94c33761e68565b1274aa6a6f9d66477229747a66b308b138f92aa4326a3bf23df65a1fe33b3b289bfe1 +99ba36d8b4f56bde026099278548b1afc0a987cbd7c9baa51fc8e6cbb8237a17636f1a44a385cec69b05a5802059956a11fe793cabb939c38800f9c239ca2518e898ade1ec2513c9ee492071a35aabd78182392a09123d28dbc233313c9120c4 +a7dc40c36afccb30a2eaff250860b28b227c195cf05674704c567d77d6655c446ae835f8fc8667e71147ab02afcb2dad0babe60cbfa37d7c2cddc68d2dec54f28a4142f8353590a3902d5ddaa22066ab563dd1435dda83f276387b9767d69120 +939e6cc97a8b88572852a5b7f25e4838556307f60aeafb5d2b6961edbcafd4b48cb6ac980ffbacf4be963f324ba81e3d12de4f1459d8c746d0762c66ae1b166027f7fbe641d9c48f3c7d97b06d956b0be51dcc9aab65f3e99e1388e63bdd79f9 +b391e156541dfd4003d1697cdb7ec815b309807320574906b2e652ef0175828b356d215cd374b1b34d9f470b3fa0e643113e67b2273268f922f04f072cfb89008358185b25cd631f82911a3f20f90f75758ffb99bebb8076458ae1e9d1ae898c +b9ac9c84934cc2a85c876eff65577e1dfce1935cd6392c877dd881a7d2f5c3e9344f28c04f90c62a6db4237ca00f9e0d00cb5f63e3f060fc7303916e19273b6fe455f331cabbe2fe5a22d584484f0d4176120fec9819fbb0a01e6d38695acfcd +88209eb030c5d78734bf2c2a5c539653fd3c24b4c08e624f9ddc4a6550efbdc1054a56eb0c807595aad6de56fda326aa196d032a8b4b48d40140a2d77df3c7243eda6507936389a321a5811eb38e32ee433c788deeae1eb928b00940e2944bcc +a8632ddc9cf7cbc1e8b74a05b7d4a89618c64afe30367ca0c9550ae7d320bf4e51c5a69e1501a1d8bee4240d13d7835501aa39fdc401a74f4d5734e268a7ce29a1fcfdb0a8bc64e0dd4a9e8578d6985bc2bc6a3764ce7a3703f6fb2e52557a2b +a037ac67e8bb6f4193ac967e05d080a489f58ef8d3d30a89798246f3e4936121ee445b03e410a09e8ebc0db2e2477d110aad0ade99b0887f1eb016e750f42135866907f150bd6f4f99a8cb94281474166874808ebe03b118c5daab16dafdc38b +a50d9143116bffa3b237da8e1805327e81e9cd25e658289bd727d5f9e0020172cc8690dcfe31a240e5cbc48353b88c4908baa1dd7320165556e0aa633f62fcbe7870222d345a3bbcdb7ab6c07f0fd86be559964afabf56f0a8cbc0b4b91d477e +afa988ea6fa4f40c5ad07d2d580d29025ddf56d6ef1171a8b8de3464203f70b97d6f5ace72747345204b35150e06154d1477516a989ce8eea7871cc0d0de00a077c0fb23ad4837e409d0b885bf3f2dde11a30fa6273d662e68e09f461e52932f +97fa1a943ed8b81574304a3d03f4f15907f6e6e0cd36a66bd2ad2c75afafc70a61d3ff69b77ebe4dae9ca0fcedef80081062705e60bbb6ea0f1f398c84d2f8e4a3ac142ac66426c21ad5e9994ebbcc406af474c4aec5e32fadcb21875af7c9f1 +b30a564614493886f14a5dd71c89457504f8c59a7ac01b665ed167e9a8f9ee5832198fd319ecd234196ee57031bdf3840bd5a923e203a1938bc795c704b5285389750e1fd10d7050061ba19db00a60a2c0384a7d661d7d48ebe6962272230859 +84c8dea942cfae71cb02e705ec496d967425793ce8812e7ee53c2f23713abeaff566a658cd1c73dfd18187d16253a6ee0a623e82cd18e31cd1a1875d19c078835dc9292e141686150a88065226ada264740143e87c03a0f6c4da8c187438ebf4 +8c3abae8aed60338f8c4ff80aab22f8a2ae56756a93566c906f490a97151d34a1c3318054e1c494c60cc53327ad86a2d02c6c76a406726ce4f88635bc32eff0db0b61762dc518b95fa8da82e87e4bf3de54f1d72180ef53ed7bc5413e6a9a510 +a328230c92a6b1cef6a444bcb64edb992f71e3d7b93f0b6b8b408ba7c908db746d92ddb2c7588bab438ef3bc61be1c2f0dfc86ba2ff514b42b35c80f89b2e780f813ea1dfb977fbded2cd9b553b747fa952e227ebd8f071163d421fc337f04c9 +b482cab423cd5f1c5df036070aade7aa016283d69619d664025c3feab866a0a5691d344b2ee2bedc5dedd1f9a73eae16003a3827c9e5bbe22ded32d848fba840ffad1141ad158f5c40bc8ae0d03781b9705d851a7f1391b096c576c0f4f2a6b0 +919ee1df27fabcb21237a1b7b98f53d41d849e1b6a8f9e28c3fae2841c6b5a250e4041c737e6725476e5cd715e34d3880f58d80f61efaabc261bdc703e8750f48a923e9bf8980931b9fd9e40014c66c54b3e7c98241d76d1aa47af43313a65a1 +ac94830145dbe9a8f7e6e0fc1f5fb454502d22abcafdc2dd96c6933c604461fa83b2b37385f4bc454875a02a6d4157841250956783515d11c7456e7f11b745f12856d89f5feedaf6a61a483a6c33a21cd2ba0c18eb41a1a2e7fc33bb53e4c570 +b209c699f1233735c5bb4bce848e4365fd76651ae2184d2279a90df0c2f69ffa2a24d84a9b9f274021072953c0d65e1a0202d490d6c37186af240114e445d87bff754b4824937e4f2c90a574061b1c4910fed88d90f698025a2a264e656cb8a4 +93320dc0576b0d069de63c40e5582b4486d9adf5e69e77e3ebaf3da26976fe42147a65051501bc8383f99e7ba75479c70a6726c2cd08bf98c7481f1f819712292d833a879f21a1221a9610bc748fb5e911055122fdb4055cdc84e8bfe0f4df9b +a4380b240e998cdf668591f71a0c88ed143b0185a920787627ce65095f8223dc606fa5bce93377af100de92d663e675c0736d7f1973603a84a5c4162fb5e01c88c7493503ae1d7e9fbe8ece9b418397d68c21eeb88dae226e09875d372c646dd +aab48517d69135a16b36b685adfe9b2544a709135a21ba3e75981a2cba4ec81d1fe28ac0f72fde0c0001c15300ed6a810f58d3117bdd58d0149751d6508cf8a1a1ff7b63dd02d2730a9d6fe96c77c502fe8ed46d50a181ec4bb35e37dfbd6af4 +8277265fe75ab89ce4ec65b33fb4084bec0a56d81faf2f7a9070d2ca3065678e03a790350eba56323a54e0285bc32fe8007d5259740fde226e16cbde8354eacd562294eb9b7f727ed72ffbdad86f467cf057c737b34b80a41deb92634ed866f5 +aa40a24cb2ebe606d969392c03020070f044c95088d80f57f771b837c048342d2cd3474600d7660441090ffb8d2ffb7f0eddd67eb378e3e1477a6ba0bc38096d5d2d3355bc8b60f605f57f0c1899da591457440352381d2b38c0aa9acc7fe419 +80815d10685808cb630820629bcd2fa9041c9b74433630c0b9c1b7f7e8edf1440b520217f76ec9a50c125cf4438aa66006a1928a9ed2321da7ea325c3d56b65462b72118ca2c99a0ea733aa11da9abbeda6cc71ffeed301ae70213a29e697dcd +ac235d079f91b00b1fead7523da8f73a5409fa8970907af0c5d5e4c6a0996dccfcdb0d822d08c7fbc0c24799457d011d04312d20831825f23cf988141056a6814c8a1cac9efe37bdcbfa272aed24cd92810fea7c49b0d07683a5c53643872179 +b8aa59534d75fa5ac1c2c3f963bf73899aff5210059dbde8a8635561c6249e5143affee3bd2fd57575213b52d9a73d5702525867a7dcbb1d0a49b98c2925556fc5463ff0209742046a24ab29e74257d6419401093cc4371944d811cc300b6a67 +80bbfc5b816eea29a6d84e2217dee4d547306994d39e5592515e1b0807b67fe960d1d5addb0ff1a20c158bdb294c04bf093d28996121845a2c9268e2c9ac0f4067e889c6aaca62f8535d35b45036954bd069e3afa84f04721538c26003304c20 +a535c17d0e151d0e03d42dd58ba8c715bee3fabca2890e0e016071d34184b6b34e770d2be29c8ec76b69bcc471d50f4d043c2c240e9b93a81cff7ee2724e02018dfd9b534e40be641fdb4884abcd83b76f517557ffba508f1ba2f56313f4de94 +b237eb7465df0d325a3aa58269be2627e4978f9863f4f100ed4c303cb1f6549e606f2e3c9180824d8049191965c8dacd0a0c76cc56cb22cf1bcfdb39372c8aa29b4f7b34582b1719e6bd59c930d87d5ccd838743b585d6e229d5ed42337315c0 +805c335a2a9d2de30809cf30808ef836d88e9453c510716f01696f14c72dd60505eca8f128970edc8e63a9aa1f8792ac0dd50dcc84fbf4cc8b32349c682a6a27bc7551c7aa273a94c1606d07710188d93579afe3be1781bded15a34ed6047922 +b25dadf385ddd3c39bcb0a014d3d4f66127946b1aceae8809e3a03d66cc25e27142ca108316391f857fe82fdea4db2520cc73793b695eafbf3ade00ef7ec747b0457e49303f5e1a370f5263b436566fe24a0876e5fe088238c7be37a0718d65f +b0f753081cabe2c8fce73aba82ff67dbc9842598b3e7fa3ce2a1f534536f8ac63c532fe66552ac6b7adb28c73ed4c8a4184849be7c1756a4681ce29ebf5e1c3aa806b667ee6bd68f6397aba3215dc1caec6742f21d681e32cd1160d6a3b1d7ee +b798771eeb3d7a17c62ba5916cc034bba870da6b1ac14c2e1cae71af3ad4e0c0d1ff983f691e0e55289d5a33b131f2ec12430c9566dd71f4d8be9c79155357a5c30c5efcfd75bbe1bb6d5ada4d50604ea49ed838d3641f268ca6e25c9c4b6b72 +b52554c017388b099804abbe565346591a086d9979e10140ddaccc0a3680e506db775d7cbeafde67563adf0f09f5c2420caf19629f4e8f03e6fe02e9416ecd5269989e482b90004a083967d1141387eb74865bac6bd17e7a6d5f58225e52d4b7 +b520ff694520919023d44d53f98a7de2f78ff37b2d9193dcaa35556a6a0febf767781a4c961dce7c804bfdf81935f8f0082865253da52e79dfa1c5ff74d61495b2da76e167d46114709e877a7791a3a95e33a42f56b83f5f5afe271c67ae997c +b721401983440797a03d5b99f2088a0b249aa911969c34dd6c615b0060325da555d2ad99d931170c0868b0488a2234a4114cc0013d5163b833f5c45c5eb536421c016cf85788390176bb2dc4c196d6be26bbbfceae048b82f0d8039222e71c94 +acd9d833ba0a8cbd8d1ba939a11ea0fa5607e1bc6e693ec318bdb097aedd042d76e695dcebebd142e2e4ac30b1905dff03ec36d9cc70577e4dbe5e9ed7c20c7afb13a7f0155f203c6b83b9f1ad3d20a0d4aef0fbbbcf466ffc1bcd482bc2f5e0 +8cc1795de015f2b0e72116f169f3b4624b7738ceebea354e0bd9051c27b86f647ea36cad57ea6884c1a8adf9b45cd83514fa687e68878bbd613d793aa10986d5a0411f081689229e0d72133b3667b9f3f1a02211d0e680564eb1ea43393e1f36 +aa9281c61113c343a108de1036570feefc72fb7a96ff11f73024de12b83f29631f5a8a5900e6f10b15227c6f7462881511271bf785ebdf95ce288100e5dab391f664f6ff76c72b65b34479a4f43e5e8eba292209d6654157286ad3242ac342db +aaf16866275082e59d415db317aa874267d048ee405a553e852e6d175711d31a1fee99912345915bce121f43bc3e00d81338e5fcd3c8a1012fb4f172a9fe15622dd368b4d9d5cb60d189f423b071791fe26cea7676aca8df07965cacf80b0cd0 +accc80b3d8a6ffa648487a3d3c0ce1aeeb5401edf3cf2e385ea4a6d5fc110054fcce38f01f1da7141bbed30eb7a0a6810c82212bbb9da75d6033082dbcf6bc6a5791f85aa0f045a10da5de015edbf369b4d23b32b0c058962d2ee88e6911f994 +83f1089395a16077738cc7c9a6d6a3dc9033aac4abc508af5a1f007ca92e1a80b2e6f2dbda7fdcf0d5646de790a6201d0a9cfbcb6620a1426600e3a6a425ec004384f49fb9dcd166691a47177d45dcbcb761a11d46220b0aa09fc946131f7aa5 +9246bb586d43cb817c2e15ed609156e9f1cd284ba2f4797bbfa51c0341e1ba382eaac059aa9f63fb88d228a1a932839a171e7c7d00199dc7c4d6c5ea038a02cbc3cc5297c70401520e70ebbcffacd6a703f62896f3c788f94dde3c33ab0ecbdb +a316cb7c74feb0563c56cc79015e2774fbeca458bf8e9fb07894f9d6bcd73f7fb9428e87c816e5629e4bf7f3ec567fbc091549471b75492dde08217cb334b716b4582b24384586e53388873a78a90ec01bd7c3bace9cfc52161467df16e27c33 +ade18c74bbe60d1d69f4a570f8e5fd8696c26cc9e02829040b6b14cb9c49a4b3263b5bd5e16ec0b29010b4be054c16ab09304e23442af7d7f5fcc60bc6c5634ab6e4aed7ef334b2785e4c7672d59a687278e42d310342db5e5975d716e6d1595 +b7728800bb2039acf228fa3d8028569c426cb85d28b2b5820bbef938d5ca8c4df981d3e01a309e26ca101e8295d0f6990c03b8c239798323575874a4ee5bfe46cfe99b9657189142aacd8f8d1f26cf4c0e73c6397c31ba8f18102b9ea315b638 +8fb14f2a9be193f54977ecd3021663108ea143627b9a9d9faff85d1a86b855f6c437eab435fad3304f245bd7732af07f1173494cdb802fb96e85d2db89e1643206e183f3b228ca8d3f586e71aa9308eaf0223100bf07942fc39e465016d1f775 +ac1e025e53d98fdb3380489dce82d9d4bd3a6c98f0a523b841cb09a6f26ddd4d22efd98776e78d10fd996995fd00e81e08d3c25dd14a54b25a9d483677a24bbb8d1cb41a443b2c71038e6893b1b30f70758424e0f2039a48060191389033ef55 +a4c017311b9e930868132527a9849072b91db04fd36c619ae39c98da9e2174e6201d3c2ff1246c06b1b6815bbf3ea4a1116564f55ee2fe4c4d655e2294c0ded842cba209c255ca3d7b7f82d162f97890dfdeed087aa2f87cbfc61d61815da39d +89516315a3956b455843c2555248bd94dcb19993060fe75fdd51f7aa9c9147ab13997d8a98036a8f04bee5c91d78d2990907e35a52537a8ab3ed15f1a71afdcd38044a5b6e93f662b9d36c16933a881927cacae668c4c06ee6f004c9e3989bad +a1e78a011e210400c68ca76045f7da74119bff3cbe382efd2bd2ac76567c52d68d75536a91999d084043e1ce2d07d02e0b69fb99924101d2543521747536fbc51b0454aa9a4cbbec101121f597863a5c0fee2ca5eab35dff9b9085bef8b2b0d0 +830fd8d083e39153ecab43cabb22e29d7b44a55fba467af4ddd3f069439d2972ef53c3518de788f96b3f4f64963987d0155ba27afc28643af3de8e476ff515a68285728167408f45d99e574680bda6bacdd4322e587e4aa99386e035c0e931ad +b89584da22237e3061d991b1a55a5e55dc637b8b671130d304587729348138ef87885180310efe9f9f6d3580b9d7fdcf0649e8a79d2dec8c25a9f53df0fac5d517db999029cbfdd7c2cbd3e9a5503e5d267d3d8ad752335915c92b850b14bafb +959b8030733799882c5e3735479924b013756e57b893f9792bab4043e2d362d77cf308166d782e3989caa771b8a0c0a01302cb7b5e8ca12e2d6cebd59d4cd173c9dc25f438bac597fab17b4ff44997a489c168e7204b7d7c21d0938f0a2e3b51 +a0a9e5503d9afe0027891dab890c687fd5f5fac5741418490c64d7c15f59533dd603a50163c79402afa61bd02de486761983c94501da17e6bbe78c497f2122210071602f578adc0ebe7a4679f87fe77e09c8c122de69105f13455fea25f08e6f +9811487283ad620cd7c9b303ae2f348d0e6f5ee17b504baaa817ae207adb912a00d3cc36dbf48745eb899e6b6e22f09f0f9ba29d949ecd7350fbbfe87a8c7cdd5d0e687fc807751d07634aaf7c38baf3b24a0670c38fa6ccd7431436fc95525f +8a13aa5071c526e560def7d8583393942f07d88c9d8d26c98738fd65f57af2e3326dbb1edff0f39fe98eda4a13ed4fd71844254b954690154c4804e1c4a53df9dc4643f4b7b09d0860070f6b2318d0d63d28fb56bf5b6ff456a18dfc72fdfbbe +b9c90ff6bff5dd97d90aee27ea1c61c1afe64b054c258b097709561fe00710e9e616773fc4bdedcbf91fbd1a6cf139bf14d20db07297418694c12c6c9b801638eeb537cb3741584a686d69532e3b6c12d8a376837f712032421987f1e770c258 From 7f7c8326e9c703affa1b4b591ed9d5bc0891e5c7 Mon Sep 17 00:00:00 2001 From: Mario Vega Date: Wed, 20 Sep 2023 18:33:01 +0000 Subject: [PATCH 044/387] configs/cancun: add all consensus clients --- configs/cancun.yaml | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/configs/cancun.yaml b/configs/cancun.yaml index dcaa424089..5158e5a7bf 100644 --- a/configs/cancun.yaml +++ b/configs/cancun.yaml @@ -38,3 +38,42 @@ build_args: github: paradigmxyz/reth tag: main + +- client: teku-bn +- client: teku-vc + +- client: prysm-bn + nametag: deneb + build_args: + baseimage: ethpandaops/prysm + tag: develop-linux-amd64 +- client: prysm-vc + nametag: deneb + build_args: + baseimage: ethpandaops/prysm-validator + tag: develop-linux-amd64 + +- client: lighthouse-bn + nametag: deneb + build_args: + baseimage: sigp/lighthouse + tag: deneb-modern +- client: lighthouse-vc + nametag: deneb + build_args: + baseimage: sigp/lighthouse + tag: deneb-modern + +- client: lodestar-bn + nametag: deneb + build_args: + baseimage: ethpandaops/lodestar + tag: deneb-builder +- client: lodestar-vc + nametag: deneb + build_args: + baseimage: ethpandaops/lodestar + tag: deneb-builder + +- client: nimbus-bn +- client: nimbus-vc From f29a28a2d6f8079e8e7e891b64ef6b7c4443f168 Mon Sep 17 00:00:00 2001 From: Parithosh Jayanthi Date: Mon, 25 Sep 2023 10:12:01 +0200 Subject: [PATCH 045/387] bump besu (#882) --- configs/cancun.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/configs/cancun.yaml b/configs/cancun.yaml index 5158e5a7bf..16eb785fe0 100644 --- a/configs/cancun.yaml +++ b/configs/cancun.yaml @@ -2,8 +2,8 @@ nametag: cancun-git dockerfile: git build_args: - github: Gabriel-Trintinalia/besu - tag: add-decode-type-to-transaction-decoder + github: hyperledger/besu + tag: main - client: erigon nametag: cancun-git From c1abf5648f900aed28c7c8221e192f1edf920e4b Mon Sep 17 00:00:00 2001 From: Dan Date: Tue, 26 Sep 2023 16:57:14 +0200 Subject: [PATCH 046/387] simulators/ethereum: Update beacon root address 0x000F..Beac02 (#884) * simulators/ethereum/engine: Update beacon root address 0x000F..Beac02 * simulators/ethereum/pyspec: Download latest fixtures * simulators/ethereum/engine: Update beacon root contract * simulators/ethereum/engine: Update History buffer length Co-authored-by: spencer --------- Co-authored-by: Mario Vega Co-authored-by: spencer --- simulators/ethereum/engine/config/cancun/constants.go | 4 ++-- simulators/ethereum/engine/config/cancun/genesis.go | 2 +- simulators/ethereum/pyspec/Dockerfile | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/simulators/ethereum/engine/config/cancun/constants.go b/simulators/ethereum/engine/config/cancun/constants.go index 8e5a15c2da..801c14610e 100644 --- a/simulators/ethereum/engine/config/cancun/constants.go +++ b/simulators/ethereum/engine/config/cancun/constants.go @@ -22,8 +22,8 @@ var ( BLOB_COMMITMENT_VERSION_KZG = byte(0x01) // EIP 4788 - BEACON_ROOTS_ADDRESS = common.HexToAddress("0xbEAC020008aFF7331c0A389CB2AAb67597567d7a") - HISTORY_BUFFER_LENGTH = uint64(98304) + BEACON_ROOTS_ADDRESS = common.HexToAddress("0x000F3df6D732807Ef1319fB7B8bB8522d0Beac02") + HISTORY_BUFFER_LENGTH = uint64(8191) // Test constants DATAHASH_START_ADDRESS = big.NewInt(0x20000) diff --git a/simulators/ethereum/engine/config/cancun/genesis.go b/simulators/ethereum/engine/config/cancun/genesis.go index d8a7765147..3043ccdc99 100644 --- a/simulators/ethereum/engine/config/cancun/genesis.go +++ b/simulators/ethereum/engine/config/cancun/genesis.go @@ -30,7 +30,7 @@ func ConfigGenesis(genesis *core.Genesis, forkTimestamp uint64) error { genesis.Alloc[BEACON_ROOTS_ADDRESS] = core.GenesisAccount{ Balance: common.Big0, Nonce: 1, - Code: common.Hex2Bytes("3373fffffffffffffffffffffffffffffffffffffffe14604457602036146024575f5ffd5b620180005f350680545f35146037575f5ffd5b6201800001545f5260205ff35b6201800042064281555f359062018000015500"), + Code: common.Hex2Bytes("0x3373fffffffffffffffffffffffffffffffffffffffe14604d57602036146024575f5ffd5b5f35801560495762001fff810690815414603c575f5ffd5b62001fff01545f5260205ff35b5f5ffd5b62001fff42064281555f359062001fff015500"), } return nil diff --git a/simulators/ethereum/pyspec/Dockerfile b/simulators/ethereum/pyspec/Dockerfile index 529857039d..1ce323dde1 100644 --- a/simulators/ethereum/pyspec/Dockerfile +++ b/simulators/ethereum/pyspec/Dockerfile @@ -21,8 +21,8 @@ COPY --from=builder /source/pyspec/pyspec . # To run locally generated fixtures, comment the following RUN lines and # uncomment the ADD line. # Download the latest fixture release. -RUN wget https://github.com/ethereum/execution-spec-tests/releases/download/v1.0.4/fixtures_hive.tar.gz -RUN tar -xzvf fixtures_hive.tar.gz +RUN wget https://github.com/ethereum/execution-spec-tests/releases/latest/download/fixtures_develop_hive.tar.gz +RUN tar -xzvf fixtures_develop_hive.tar.gz RUN mv fixtures /fixtures # ADD ./pyspec/fixtures /fixtures From 057bebf3b86da35cbdfe9bd8b2cefd651c25c2a4 Mon Sep 17 00:00:00 2001 From: lightclient <14004106+lightclient@users.noreply.github.com> Date: Tue, 26 Sep 2023 15:09:36 -0600 Subject: [PATCH 047/387] simulators/ethereum/engine: rm 0x prefix on 4788 code (#885) --- simulators/ethereum/engine/config/cancun/genesis.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/simulators/ethereum/engine/config/cancun/genesis.go b/simulators/ethereum/engine/config/cancun/genesis.go index 3043ccdc99..d7f0dd607d 100644 --- a/simulators/ethereum/engine/config/cancun/genesis.go +++ b/simulators/ethereum/engine/config/cancun/genesis.go @@ -30,7 +30,7 @@ func ConfigGenesis(genesis *core.Genesis, forkTimestamp uint64) error { genesis.Alloc[BEACON_ROOTS_ADDRESS] = core.GenesisAccount{ Balance: common.Big0, Nonce: 1, - Code: common.Hex2Bytes("0x3373fffffffffffffffffffffffffffffffffffffffe14604d57602036146024575f5ffd5b5f35801560495762001fff810690815414603c575f5ffd5b62001fff01545f5260205ff35b5f5ffd5b62001fff42064281555f359062001fff015500"), + Code: common.Hex2Bytes("3373fffffffffffffffffffffffffffffffffffffffe14604d57602036146024575f5ffd5b5f35801560495762001fff810690815414603c575f5ffd5b62001fff01545f5260205ff35b5f5ffd5b62001fff42064281555f359062001fff015500"), } return nil From ce8d52506051f36be7ba182c654d5b9a74cb0bc5 Mon Sep 17 00:00:00 2001 From: Somnath Date: Wed, 27 Sep 2023 19:33:20 +0530 Subject: [PATCH 048/387] clients/erigon: Increase allowed blobcount in remote txs (#890) Increase allowed blobcount in remote txs Erigon now has a built-in spam protector for blob txs, this flag would increase the count of allowed blobs per account from the default 48 to a 1000 --- clients/erigon/erigon.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/clients/erigon/erigon.sh b/clients/erigon/erigon.sh index 510a44ca3a..92e974316a 100644 --- a/clients/erigon/erigon.sh +++ b/clients/erigon/erigon.sh @@ -129,6 +129,9 @@ fi FLAGS="$FLAGS --http --http.addr=0.0.0.0 --http.api=admin,debug,eth,net,txpool,web3" FLAGS="$FLAGS --ws" +# Increase blob slots for tests +FLAGS="$FLAGS --txpool.blobslots=1000" + if [ "$HIVE_TERMINAL_TOTAL_DIFFICULTY" != "" ]; then JWT_SECRET="0x7365637265747365637265747365637265747365637265747365637265747365" echo -n $JWT_SECRET > /jwt.secret From 43e54342aef0224676970a2cf3ae6c21a1185a3a Mon Sep 17 00:00:00 2001 From: lightclient <14004106+lightclient@users.noreply.github.com> Date: Wed, 27 Sep 2023 09:24:15 -0600 Subject: [PATCH 049/387] simulators/ethereum/engine: use replaced version of geth with updated beacon root (#888) * simulators/ethereum/engine: use replaced version of geth with updated beacon root * simulators/ethereum/pyspec: use replaced version of geth with updated beacon root --------- Co-authored-by: Mario Vega --- simulators/ethereum/engine/go.mod | 2 ++ simulators/ethereum/engine/go.sum | 4 ++-- simulators/ethereum/pyspec/go.mod | 2 +- simulators/ethereum/pyspec/go.sum | 8 ++++---- 4 files changed, 9 insertions(+), 7 deletions(-) diff --git a/simulators/ethereum/engine/go.mod b/simulators/ethereum/engine/go.mod index c63908355c..7a2e541aa0 100644 --- a/simulators/ethereum/engine/go.mod +++ b/simulators/ethereum/engine/go.mod @@ -97,3 +97,5 @@ require ( gopkg.in/natefinch/lumberjack.v2 v2.0.0 // indirect rsc.io/tmplfunc v0.0.3 // indirect ) + +replace github.com/ethereum/go-ethereum => github.com/lightclient/go-ethereum v1.10.10-0.20230926150549-ae44519d720c diff --git a/simulators/ethereum/engine/go.sum b/simulators/ethereum/engine/go.sum index f1b4ad5552..9b8df9c428 100644 --- a/simulators/ethereum/engine/go.sum +++ b/simulators/ethereum/engine/go.sum @@ -86,8 +86,6 @@ github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7 github.com/etcd-io/bbolt v1.3.3/go.mod h1:ZF2nL25h33cCyBtcyWeZ2/I3HQOfTP+0PIEvHjkjCrw= github.com/ethereum/c-kzg-4844 v0.3.1 h1:sR65+68+WdnMKxseNWxSJuAv2tsUrihTpVBTfM/U5Zg= github.com/ethereum/c-kzg-4844 v0.3.1/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= -github.com/ethereum/go-ethereum v1.13.1 h1:UF2FaUKPIy5jeZk3X06ait3y2Q4wI+vJ1l7+UARp+60= -github.com/ethereum/go-ethereum v1.13.1/go.mod h1:xHQKzwkHSl0gnSjZK1mWa06XEdm9685AHqhRknOzqGQ= github.com/ethereum/hive v0.0.0-20230919110229-d58aec4a3eb5 h1:22Z+XoI2hGtYR0AMzYr9IusfYM/chALq/6oJnejJQpk= github.com/ethereum/hive v0.0.0-20230919110229-d58aec4a3eb5/go.mod h1:iKqu3dndnqdwSckyBGoZzeHhZz6X6XZws2TfZMdLdes= github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072/go.mod h1:duJ4Jxv5lDcvg4QuQr0oowTf7dz4/CR8NtyCooz9HL8= @@ -235,6 +233,8 @@ github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0 github.com/labstack/echo/v4 v4.5.0/go.mod h1:czIriw4a0C1dFun+ObrXp7ok03xON0N1awStJ6ArI7Y= github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c= +github.com/lightclient/go-ethereum v1.10.10-0.20230926150549-ae44519d720c h1:wSCiQFEiRH2qhIBrH7829p9oBvagRuT/Z0Mu0ROupFQ= +github.com/lightclient/go-ethereum v1.10.10-0.20230926150549-ae44519d720c/go.mod h1:gkQ5Ygi64ZBh9M/4iXY1R8WqoNCx1Ey0CkYn2BD4/fw= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= diff --git a/simulators/ethereum/pyspec/go.mod b/simulators/ethereum/pyspec/go.mod index c4c7fd8a48..9356100d54 100644 --- a/simulators/ethereum/pyspec/go.mod +++ b/simulators/ethereum/pyspec/go.mod @@ -68,4 +68,4 @@ require ( rsc.io/tmplfunc v0.0.3 // indirect ) -replace github.com/ethereum/go-ethereum => github.com/lightclient/go-ethereum v1.10.10-0.20230829211949-79f3c2d9c96b +replace github.com/ethereum/go-ethereum => github.com/lightclient/go-ethereum v1.10.10-0.20230926150549-ae44519d720c diff --git a/simulators/ethereum/pyspec/go.sum b/simulators/ethereum/pyspec/go.sum index c82c613b4b..a108aaab3d 100644 --- a/simulators/ethereum/pyspec/go.sum +++ b/simulators/ethereum/pyspec/go.sum @@ -164,7 +164,7 @@ github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iU github.com/holiman/uint256 v1.2.3 h1:K8UWO1HUJpRMXBxbmaY1Y8IAMZC/RsKB+ArEnnK4l5o= github.com/holiman/uint256 v1.2.3/go.mod h1:SC8Ryt4n+UBbPbIBKaG9zbbDlp4jOru9xFZmPzLUTxw= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/huin/goupnp v1.0.3 h1:N8No57ls+MnjlB+JPiCVSOyy/ot7MJTqlo7rn+NYSqQ= +github.com/huin/goupnp v1.3.0 h1:UvLUlWDNpoUdYzb2TCn+MuTWtcjXKSza2n6CBdQ0xXc= github.com/hydrogen18/memlistener v0.0.0-20200120041712-dcc25e7acd91/go.mod h1:qEIFzExnS6016fRpRfxrExeVn2gbClQA99gQhnIcdhE= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/imkira/go-interpol v1.1.0/go.mod h1:z0h2/2T3XF8kyEPpRgJ3kmNv+C43p+I/CoI+jC3w2iA= @@ -203,8 +203,8 @@ github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0 github.com/labstack/echo/v4 v4.5.0/go.mod h1:czIriw4a0C1dFun+ObrXp7ok03xON0N1awStJ6ArI7Y= github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c= -github.com/lightclient/go-ethereum v1.10.10-0.20230829211949-79f3c2d9c96b h1:dglsK4NuDRreW5+/0EoTFxCiZwkRZay/aDoOul2lca0= -github.com/lightclient/go-ethereum v1.10.10-0.20230829211949-79f3c2d9c96b/go.mod h1:UWQqzN9473khWbdvlh2QjYXX0ykhKT1OuPYus9Hgv+o= +github.com/lightclient/go-ethereum v1.10.10-0.20230926150549-ae44519d720c h1:wSCiQFEiRH2qhIBrH7829p9oBvagRuT/Z0Mu0ROupFQ= +github.com/lightclient/go-ethereum v1.10.10-0.20230926150549-ae44519d720c/go.mod h1:gkQ5Ygi64ZBh9M/4iXY1R8WqoNCx1Ey0CkYn2BD4/fw= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= @@ -322,7 +322,7 @@ github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGr github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= -github.com/urfave/cli/v2 v2.24.1 h1:/QYYr7g0EhwXEML8jO+8OYt5trPnLHS0p3mrgExJ5NU= +github.com/urfave/cli/v2 v2.25.7 h1:VAzn5oq403l5pHjc4OhD54+XGO9cdKVL/7lDjF+iKUs= github.com/urfave/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/valyala/fasthttp v1.6.0/go.mod h1:FstJa9V+Pj9vQ7OJie2qMHdwemEDaDiSdBnvPM1Su9w= From d93265fdf49a6eb9e1af57c85ccb8a1fc8720744 Mon Sep 17 00:00:00 2001 From: Mario Vega Date: Wed, 27 Sep 2023 10:44:29 -0600 Subject: [PATCH 050/387] simulators/ethereum/engine: Engine API Test Fixes (#891) * simulators/ethereum/engine: fix non-zero pre-merge fork test * simulators/ethereum/engine: fix invalid versioned hashes tests --- .../ethereum/engine/suites/cancun/tests.go | 10 +++++++++- .../engine/suites/engine/invalid_payload.go | 19 ++++++++++++++++--- .../ethereum/engine/suites/engine/misc.go | 7 +++++++ 3 files changed, 32 insertions(+), 4 deletions(-) diff --git a/simulators/ethereum/engine/suites/cancun/tests.go b/simulators/ethereum/engine/suites/cancun/tests.go index 681b93b605..71c42a82a3 100644 --- a/simulators/ethereum/engine/suites/cancun/tests.go +++ b/simulators/ethereum/engine/suites/cancun/tests.go @@ -1844,13 +1844,21 @@ func init() { invalidDetectedOnSync := (invalidField == helper.InvalidBlobGasUsed || invalidField == helper.InvalidBlobCountGasUsed || invalidField == helper.InvalidVersionedHashes || - invalidField == helper.InvalidVersionedHashesVersion) + invalidField == helper.InvalidVersionedHashesVersion || + invalidField == helper.IncompleteVersionedHashes || + invalidField == helper.ExtraVersionedHashes) + + nilLatestValidHash := (invalidField == helper.InvalidVersionedHashes || + invalidField == helper.InvalidVersionedHashesVersion || + invalidField == helper.IncompleteVersionedHashes || + invalidField == helper.ExtraVersionedHashes) Tests = append(Tests, suite_engine.InvalidPayloadTestCase{ BaseSpec: onlyBlobTxsSpec, InvalidField: invalidField, Syncing: syncing, InvalidDetectedOnSync: invalidDetectedOnSync, + NilLatestValidHash: nilLatestValidHash, }) } } diff --git a/simulators/ethereum/engine/suites/engine/invalid_payload.go b/simulators/ethereum/engine/suites/engine/invalid_payload.go index 781c4134d4..a30418d7c3 100644 --- a/simulators/ethereum/engine/suites/engine/invalid_payload.go +++ b/simulators/ethereum/engine/suites/engine/invalid_payload.go @@ -30,6 +30,8 @@ type InvalidPayloadTestCase struct { EmptyTransactions bool // If true, the payload can be detected to be invalid even when syncing InvalidDetectedOnSync bool + // If true, latest valid hash can be nil for this test. + NilLatestValidHash bool } func (s InvalidPayloadTestCase) WithMainFork(fork config.Fork) test.Spec { @@ -155,7 +157,9 @@ func (tc InvalidPayloadTestCase) Execute(t *test.Env) { } } else { r.ExpectStatus(test.Invalid) - r.ExpectLatestValidHash(&alteredPayload.ParentHash) + if !(tc.NilLatestValidHash && r.Status.LatestValidHash == nil) { + r.ExpectLatestValidHash(&alteredPayload.ParentHash) + } } // Send the forkchoiceUpdated with a reference to the invalid payload. @@ -218,7 +222,9 @@ func (tc InvalidPayloadTestCase) Execute(t *test.Env) { } else { // Otherwise the response should be INVALID. q.ExpectStatus(test.Invalid) - q.ExpectLatestValidHash(&t.CLMock.LatestExecutedPayload.BlockHash) + if !(tc.NilLatestValidHash && r.Status.LatestValidHash == nil) { + q.ExpectLatestValidHash(&t.CLMock.LatestExecutedPayload.BlockHash) + } } // Try sending the fcU again, this time we should get the proper invalid response. @@ -254,6 +260,11 @@ func (tc InvalidPayloadTestCase) Execute(t *test.Env) { t.CLMock.ProduceSingleBlock(clmock.BlockProcessCallbacks{ // Run test after the new payload has been obtained OnGetPayload: func() { + if t.CLMock.LatestPayloadBuilt.ParentHash == alteredPayload.BlockHash { + // In some instances the payload is indiscernible from the altered one because the + // difference lies in the new payload parameters, in this case skip this check. + return + } followUpAlteredPayload, err := (&helper.CustomPayloadData{ ParentHash: &alteredPayload.BlockHash, }).CustomizePayload(&t.CLMock.LatestPayloadBuilt) @@ -271,7 +282,9 @@ func (tc InvalidPayloadTestCase) Execute(t *test.Env) { if r.Status.Status == test.Accepted || r.Status.Status == test.Syncing { r.ExpectLatestValidHash(nil) } else if r.Status.Status == test.Invalid { - r.ExpectLatestValidHash(&alteredPayload.ParentHash) + if !(tc.NilLatestValidHash && r.Status.LatestValidHash == nil) { + r.ExpectLatestValidHash(&alteredPayload.ParentHash) + } } }, }) diff --git a/simulators/ethereum/engine/suites/engine/misc.go b/simulators/ethereum/engine/suites/engine/misc.go index bc3a4ceefa..a98c6cb124 100644 --- a/simulators/ethereum/engine/suites/engine/misc.go +++ b/simulators/ethereum/engine/suites/engine/misc.go @@ -1,6 +1,8 @@ package suite_engine import ( + "math/big" + "github.com/ethereum/go-ethereum/common" "github.com/ethereum/hive/simulators/ethereum/engine/clmock" "github.com/ethereum/hive/simulators/ethereum/engine/config" @@ -28,6 +30,11 @@ func (s NonZeroPreMergeFork) GetForkConfig() *config.ForkConfig { return nil } forkConfig.LondonNumber = common.Big1 + // All post merge forks must happen at the same time as the latest fork + mainFork := s.GetMainFork() + if mainFork == config.Cancun { + forkConfig.ShanghaiTimestamp = new(big.Int).Set(forkConfig.CancunTimestamp) + } return forkConfig } From a2f657c83a67451ac2e61d469ee2d34ca659e65c Mon Sep 17 00:00:00 2001 From: Sally MacFarlane Date: Thu, 28 Sep 2023 07:00:24 +1000 Subject: [PATCH 051/387] clients/besu: use ubuntu base image and install java (#889) use ubuntu base image and install java Signed-off-by: Sally MacFarlane --- clients/besu/Dockerfile.git | 14 +++++++++----- clients/besu/Dockerfile.local | 8 ++++++-- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/clients/besu/Dockerfile.git b/clients/besu/Dockerfile.git index 16bdf2e8c7..c986942082 100644 --- a/clients/besu/Dockerfile.git +++ b/clients/besu/Dockerfile.git @@ -1,24 +1,28 @@ ### Build Besu From Git: ## Builder stage: Compiles besu from a git repository -FROM openjdk:17-jdk-slim as builder +FROM ubuntu:22.04 as builder ARG tag=main ARG github=hyperledger/besu -RUN echo "Cloning: $github - $tag" && \ - apt-get update && apt-get install -y git libsodium-dev libnss3-dev \ +RUN echo "installing java on ubuntu base image" \ + && apt-get update && apt-get install -y git libsodium-dev libnss3-dev \ + && apt-get install --no-install-recommends -q --assume-yes ca-certificates-java=20190909 \ + && apt-get install --no-install-recommends -q --assume-yes openjdk-17-jre-headless=17* libjemalloc-dev=5.* \ + && echo "Cloning: $github - $tag" \ && git clone --depth 1 --branch $tag https://github.com/$github \ && cd besu && ./gradlew installDist ## Final stage: Sets up the environment for running besu -FROM openjdk:17-jdk-slim +FROM ubuntu:22.04 # Copy compiled binary from builder COPY --from=builder /besu/build/install/besu /opt/besu RUN apt-get update && apt-get install -y curl jq libsodium23 libnss3-dev \ - && apt-get clean && rm -rf /var/lib/apt/lists/* + && apt-get install --no-install-recommends -q --assume-yes openjdk-17-jre-headless=17* libjemalloc-dev=5.* \ + && apt-get clean && rm -rf /var/lib/apt/lists/* # Create version.txt RUN /opt/besu/bin/besu --version > /version.txt diff --git a/clients/besu/Dockerfile.local b/clients/besu/Dockerfile.local index a2557abd8a..8dc45342cc 100644 --- a/clients/besu/Dockerfile.local +++ b/clients/besu/Dockerfile.local @@ -1,22 +1,26 @@ ### Build Besu Locally: ## Builder stage: Compiles besu from a local directory -FROM openjdk:17-jdk-slim as builder +FROM ubuntu:22.04 as builder # Default local client path: clients/besu/ ARG local_path=besu COPY $local_path besu RUN apt-get update && apt-get install -y git libsodium-dev libnss3-dev \ + && apt-get install --no-install-recommends -q --assume-yes ca-certificates-java=20190909 \ + && apt-get install --no-install-recommends -q --assume-yes openjdk-17-jre-headless=17* libjemalloc-dev=5.* \ && cd besu && ./gradlew installDist ## Final stage: Sets up the environment for running besu -FROM openjdk:17-jdk-slim +FROM ubuntu:22.04 # Copy compiled binary from builder COPY --from=builder /besu/build/install/besu /opt/besu RUN apt-get update && apt-get install -y curl jq libsodium23 libnss3-dev \ + && apt-get install --no-install-recommends -q --assume-yes ca-certificates-java=20190909 \ + && apt-get install --no-install-recommends -q --assume-yes openjdk-17-jre-headless=17* libjemalloc-dev=5.* \ && apt-get clean && rm -rf /var/lib/apt/lists/* # Create version.txt From a39d138f4089170d0eb4e9fabc90c236687e8571 Mon Sep 17 00:00:00 2001 From: Mario Vega Date: Thu, 28 Sep 2023 13:19:45 -0600 Subject: [PATCH 052/387] simulators/ethereum/engine: Fix several tests (#886) * simulators/ethereum/engine: fix versioning tests * simulators/ethereum/engine: fix transaction replacement * simulators/ethereum/engine: CLMock: Per-client payload id map * simulators/ethereum/engine: Unique Payload ID tests in Cancun --- simulators/ethereum/engine/clmock/clmock.go | 19 +++++-- .../ethereum/engine/helper/customizer.go | 12 ++-- simulators/ethereum/engine/helper/tx.go | 6 +- .../ethereum/engine/suites/cancun/steps.go | 2 +- .../ethereum/engine/suites/cancun/tests.go | 17 ++++++ .../engine/suites/engine/payload_id.go | 9 ++- .../ethereum/engine/suites/engine/tests.go | 33 ++++++----- .../engine/suites/engine/versioning.go | 56 ------------------- 8 files changed, 66 insertions(+), 88 deletions(-) diff --git a/simulators/ethereum/engine/clmock/clmock.go b/simulators/ethereum/engine/clmock/clmock.go index 4da0b0e553..61ae26b235 100644 --- a/simulators/ethereum/engine/clmock/clmock.go +++ b/simulators/ethereum/engine/clmock/clmock.go @@ -91,7 +91,7 @@ type CLMocker struct { HeaderHistory map[uint64]*types.Header // Payload ID History - PayloadIDHistory map[api.PayloadID]interface{} + payloadIDHistory map[string]map[api.PayloadID]interface{} // PoS Chain History Information PrevRandaoHistory map[uint64]common.Hash @@ -146,7 +146,7 @@ func NewCLMocker(t *hivesim.T, genesis *core.Genesis, forkConfig *config.ForkCon PayloadProductionClientDelay: DefaultPayloadProductionClientDelay, BlockTimestampIncrement: DefaultBlockTimestampIncrement, - PayloadIDHistory: make(map[api.PayloadID]interface{}), + payloadIDHistory: make(map[string]map[api.PayloadID]interface{}), LatestHeader: nil, FirstPoSBlockNumber: nil, LatestHeadNumber: nil, @@ -442,14 +442,21 @@ func (cl *CLMocker) GeneratePayloadAttributes() { cl.PrevRandaoHistory[cl.LatestHeader.Number.Uint64()+1] = nextPrevRandao } -func (cl *CLMocker) AddPayloadID(newPayloadID *api.PayloadID) error { +func (cl *CLMocker) AddPayloadID(ec client.EngineClient, newPayloadID *api.PayloadID) error { if newPayloadID == nil { return errors.New("nil payload ID") } - if _, ok := cl.PayloadIDHistory[*newPayloadID]; ok { + // Get map for given client + if _, ok := cl.payloadIDHistory[ec.ID()]; !ok { + cl.payloadIDHistory[ec.ID()] = make(map[api.PayloadID]interface{}) + } + // Check if payload ID has been used before + if _, ok := cl.payloadIDHistory[ec.ID()][*newPayloadID]; ok { return fmt.Errorf("reused payload ID: %v", *newPayloadID) } - cl.PayloadIDHistory[*newPayloadID] = nil + // Add payload ID to history + cl.payloadIDHistory[ec.ID()][*newPayloadID] = nil + fmt.Printf("CLMocker: Added payload ID %v for client %v\n", *newPayloadID, ec.ID()) return nil } @@ -467,7 +474,7 @@ func (cl *CLMocker) RequestNextPayload() { if resp.PayloadStatus.LatestValidHash == nil || *resp.PayloadStatus.LatestValidHash != cl.LatestForkchoice.HeadBlockHash { cl.Fatalf("CLMocker: Unexpected forkchoiceUpdated LatestValidHash Response from Payload builder: %v != %v", resp.PayloadStatus.LatestValidHash, cl.LatestForkchoice.HeadBlockHash) } - if err = cl.AddPayloadID(resp.PayloadID); err != nil { + if err = cl.AddPayloadID(cl.NextBlockProducer, resp.PayloadID); err != nil { cl.Fatalf("CLMocker: Payload ID failure: %v", err) } cl.NextPayloadID = resp.PayloadID diff --git a/simulators/ethereum/engine/helper/customizer.go b/simulators/ethereum/engine/helper/customizer.go index b2be55f56c..35d7299936 100644 --- a/simulators/ethereum/engine/helper/customizer.go +++ b/simulators/ethereum/engine/helper/customizer.go @@ -137,12 +137,14 @@ type TimestampDeltaPayloadAttributesCustomizer struct { var _ PayloadAttributesCustomizer = (*TimestampDeltaPayloadAttributesCustomizer)(nil) func (customData *TimestampDeltaPayloadAttributesCustomizer) GetPayloadAttributes(basePayloadAttributes *typ.PayloadAttributes) (*typ.PayloadAttributes, error) { - customPayloadAttributes, err := customData.PayloadAttributesCustomizer.GetPayloadAttributes(basePayloadAttributes) - if err != nil { - return nil, err + if customData.PayloadAttributesCustomizer != nil { + var err error + if basePayloadAttributes, err = customData.PayloadAttributesCustomizer.GetPayloadAttributes(basePayloadAttributes); err != nil { + return nil, err + } } - customPayloadAttributes.Timestamp = uint64(int64(customPayloadAttributes.Timestamp) + customData.TimestampDelta) - return customPayloadAttributes, nil + basePayloadAttributes.Timestamp = uint64(int64(basePayloadAttributes.Timestamp) + customData.TimestampDelta) + return basePayloadAttributes, nil } // Customizer that makes no modifications to the forkchoice directive call. diff --git a/simulators/ethereum/engine/helper/tx.go b/simulators/ethereum/engine/helper/tx.go index 5f1b66c5bc..d12dabbe92 100644 --- a/simulators/ethereum/engine/helper/tx.go +++ b/simulators/ethereum/engine/helper/tx.go @@ -512,7 +512,11 @@ func (txSender *TransactionSender) GetLastNonce(ctx context.Context, node client if txSender.nonceMap != nil { txSender.nonceMapLock.Lock() defer txSender.nonceMapLock.Unlock() - return txSender.nonceMap[sender.GetAddress()], nil + nextNonce := txSender.nonceMap[sender.GetAddress()] + if nextNonce > 0 { + return nextNonce - 1, nil + } + return 0, fmt.Errorf("no previous nonce found in map for %s", sender.GetAddress().Hex()) } else { return node.GetLastAccountNonce(ctx, sender.GetAddress(), header) } diff --git a/simulators/ethereum/engine/suites/cancun/steps.go b/simulators/ethereum/engine/suites/cancun/steps.go index cdece68c71..a29cba3b54 100644 --- a/simulators/ethereum/engine/suites/cancun/steps.go +++ b/simulators/ethereum/engine/suites/cancun/steps.go @@ -439,7 +439,7 @@ func (step NewPayloads) Execute(t *CancunTestContext) error { r.ExpectPayloadStatus(expectedStatus) } if r.Response.PayloadID != nil { - t.CLMock.AddPayloadID(r.Response.PayloadID) + t.CLMock.AddPayloadID(t.Engine, r.Response.PayloadID) } } }, diff --git a/simulators/ethereum/engine/suites/cancun/tests.go b/simulators/ethereum/engine/suites/cancun/tests.go index 71c42a82a3..8461e895f8 100644 --- a/simulators/ethereum/engine/suites/cancun/tests.go +++ b/simulators/ethereum/engine/suites/cancun/tests.go @@ -1827,6 +1827,23 @@ func init() { Tests = append(Tests, t) } + // Unique Payload ID Tests + for _, t := range []suite_engine.PayloadAttributesFieldChange{ + suite_engine.PayloadAttributesParentBeaconRoot, + // TODO: Remove when withdrawals suite is refactored + suite_engine.PayloadAttributesAddWithdrawal, + suite_engine.PayloadAttributesModifyWithdrawalAmount, + suite_engine.PayloadAttributesModifyWithdrawalIndex, + suite_engine.PayloadAttributesModifyWithdrawalValidator, + suite_engine.PayloadAttributesModifyWithdrawalAddress, + suite_engine.PayloadAttributesRemoveWithdrawal, + } { + Tests = append(Tests, suite_engine.UniquePayloadIDTest{ + BaseSpec: baseSpec, + FieldModification: t, + }) + } + // Invalid Payload Tests for _, invalidField := range []helper.InvalidPayloadBlockField{ helper.InvalidParentBeaconBlockRoot, diff --git a/simulators/ethereum/engine/suites/engine/payload_id.go b/simulators/ethereum/engine/suites/engine/payload_id.go index 259c9a29a4..4e696a9e4c 100644 --- a/simulators/ethereum/engine/suites/engine/payload_id.go +++ b/simulators/ethereum/engine/suites/engine/payload_id.go @@ -80,7 +80,12 @@ func (tc UniquePayloadIDTest) Execute(t *test.Env) { } payloadAttributes.Withdrawals = append(types.Withdrawals{&modifiedWithdrawal}, payloadAttributes.Withdrawals[1:]...) case PayloadAttributesParentBeaconRoot: - payloadAttributes.BeaconRoot[0] = payloadAttributes.BeaconRoot[0] + 1 + if payloadAttributes.BeaconRoot == nil { + t.Fatalf("Cannot modify parent beacon root when there is no parent beacon root") + } + newBeaconRoot := *payloadAttributes.BeaconRoot + newBeaconRoot[0] = newBeaconRoot[0] + 1 + payloadAttributes.BeaconRoot = &newBeaconRoot default: t.Fatalf("Unknown field change: %s", tc.FieldModification) } @@ -89,7 +94,7 @@ func (tc UniquePayloadIDTest) Execute(t *test.Env) { r := t.TestEngine.TestEngineForkchoiceUpdated(&t.CLMock. LatestForkchoice, &payloadAttributes, t.CLMock.LatestHeader.Time) r.ExpectNoError() - t.CLMock.AddPayloadID(r.Response.PayloadID) + t.CLMock.AddPayloadID(t.Engine, r.Response.PayloadID) }, }) } diff --git a/simulators/ethereum/engine/suites/engine/tests.go b/simulators/ethereum/engine/suites/engine/tests.go index 91e79e6264..5f67acdafe 100644 --- a/simulators/ethereum/engine/suites/engine/tests.go +++ b/simulators/ethereum/engine/suites/engine/tests.go @@ -115,30 +115,29 @@ func init() { Tests = append(Tests, ForkchoiceUpdatedOnPayloadRequestTest{ BaseSpec: test.BaseSpec{ - Name: "Early upgrade", - ForkHeight: 2, + Name: "Early upgrade", + About: ` + Early upgrade of ForkchoiceUpdated when requesting a payload. + The test sets the fork height to 1, and the block timestamp increments to 2 + seconds each block. + CL Mock prepares the payload attributes for the first block, which should contain + the attributes of the next fork. + The test then reduces the timestamp by 1, but still uses the next forkchoice updated + version, which should result in UNSUPPORTED_FORK_ERROR error. + `, + ForkHeight: 1, + BlockTimestampIncrement: 2, }, ForkchoiceUpdatedCustomizer: &helper.UpgradeForkchoiceUpdatedVersion{ ForkchoiceUpdatedCustomizer: &helper.BaseForkchoiceUpdatedCustomizer{ + PayloadAttributesCustomizer: &helper.TimestampDeltaPayloadAttributesCustomizer{ + PayloadAttributesCustomizer: &helper.BasePayloadAttributesCustomizer{}, + TimestampDelta: -1, + }, ExpectedError: globals.UNSUPPORTED_FORK_ERROR, }, }, }, - /* - TODO: This test is failing because the upgraded version of the ForkchoiceUpdated does not contain the - expected fields of the following version. - ForkchoiceUpdatedOnHeadBlockUpdateTest{ - BaseSpec: test.BaseSpec{ - Name: "Early upgrade", - ForkHeight: 2, - }, - ForkchoiceUpdatedCustomizer: &helper.UpgradeForkchoiceUpdatedVersion{ - ForkchoiceUpdatedCustomizer: &helper.BaseForkchoiceUpdatedCustomizer{ - ExpectedError: globals.UNSUPPORTED_FORK_ERROR, - }, - }, - }, - */ ) // Payload Execution Tests diff --git a/simulators/ethereum/engine/suites/engine/versioning.go b/simulators/ethereum/engine/suites/engine/versioning.go index 52230455a6..a28517a72b 100644 --- a/simulators/ethereum/engine/suites/engine/versioning.go +++ b/simulators/ethereum/engine/suites/engine/versioning.go @@ -1,7 +1,6 @@ package suite_engine import ( - api "github.com/ethereum/go-ethereum/beacon/engine" "github.com/ethereum/hive/simulators/ethereum/engine/clmock" "github.com/ethereum/hive/simulators/ethereum/engine/config" "github.com/ethereum/hive/simulators/ethereum/engine/helper" @@ -74,58 +73,3 @@ func (tc ForkchoiceUpdatedOnPayloadRequestTest) Execute(t *test.Env) { }, }) } - -// Test modifying the ForkchoiceUpdated version on HeadBlockHash update to the previous/upcoming -// version when the timestamp payload attribute does not match the upgraded/downgraded version. -type ForkchoiceUpdatedOnHeadBlockUpdateTest struct { - test.BaseSpec - helper.ForkchoiceUpdatedCustomizer -} - -func (s ForkchoiceUpdatedOnHeadBlockUpdateTest) WithMainFork(fork config.Fork) test.Spec { - specCopy := s - specCopy.MainFork = fork - return specCopy -} - -func (tc ForkchoiceUpdatedOnHeadBlockUpdateTest) GetName() string { - return "ForkchoiceUpdated Version on Head Set: " + tc.BaseSpec.GetName() -} - -func (tc ForkchoiceUpdatedOnHeadBlockUpdateTest) Execute(t *test.Env) { - // Wait until TTD is reached by this client - t.CLMock.WaitForTTD() - - t.CLMock.ProduceSingleBlock(clmock.BlockProcessCallbacks{ - OnPayloadAttributesGenerated: func() { - var ( - forkchoiceState *api.ForkchoiceStateV1 = &api.ForkchoiceStateV1{ - HeadBlockHash: t.CLMock.LatestPayloadBuilt.BlockHash, - SafeBlockHash: t.CLMock.LatestForkchoice.SafeBlockHash, - FinalizedBlockHash: t.CLMock.LatestForkchoice.FinalizedBlockHash, - } - expectedError *int - expectedStatus test.PayloadStatus = test.Valid - err error - ) - tc.SetEngineAPIVersionResolver(t.ForkConfig) - testEngine := t.TestEngine.WithEngineAPIVersionResolver(tc.ForkchoiceUpdatedCustomizer) - expectedError, err = tc.GetExpectedError() - if err != nil { - t.Fatalf("FAIL: Error getting custom expected error: %v", err) - } - if tc.GetExpectInvalidStatus() { - expectedStatus = test.Invalid - } - - r := testEngine.TestEngineForkchoiceUpdated(forkchoiceState, nil, t.CLMock.LatestPayloadBuilt.Timestamp) - r.ExpectationDescription = tc.Expectation - if expectedError != nil { - r.ExpectErrorCode(*expectedError) - } else { - r.ExpectNoError() - r.ExpectPayloadStatus(expectedStatus) - } - }, - }) -} From 8d0f7e49d124f1546edbc746c42c4c15f00bd578 Mon Sep 17 00:00:00 2001 From: Mario Vega Date: Fri, 29 Sep 2023 08:35:44 -0600 Subject: [PATCH 053/387] clients/ethereumjs: Remove `transports` parameter (#892) --- clients/ethereumjs/ethereumjs.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clients/ethereumjs/ethereumjs.sh b/clients/ethereumjs/ethereumjs.sh index 7930200f68..a818ebb6d3 100644 --- a/clients/ethereumjs/ethereumjs.sh +++ b/clients/ethereumjs/ethereumjs.sh @@ -49,7 +49,7 @@ set -e ethereumjs="node /ethereumjs-monorepo/packages/client/dist/bin/cli.js" -FLAGS="--gethGenesis ./genesis.json --rpc --rpcEngine --saveReceipts --rpcAddr 0.0.0.0 --rpcEngineAddr 0.0.0.0 --rpcEnginePort 8551 --ws false --logLevel debug --rpcDebug --transports rlpx --isSingleNode" +FLAGS="--gethGenesis ./genesis.json --rpc --rpcEngine --saveReceipts --rpcAddr 0.0.0.0 --rpcEngineAddr 0.0.0.0 --rpcEnginePort 8551 --ws false --logLevel debug --rpcDebug --isSingleNode" # Configure the chain. From b97408ce87bd0856e054fcdc8a54cf327716a8b3 Mon Sep 17 00:00:00 2001 From: Mario Vega Date: Fri, 29 Sep 2023 12:55:48 -0600 Subject: [PATCH 054/387] simulators/ethereum/engine: Fix incomplete transactions test (#893) --- .../ethereum/engine/suites/engine/invalid_payload.go | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/simulators/ethereum/engine/suites/engine/invalid_payload.go b/simulators/ethereum/engine/suites/engine/invalid_payload.go index a30418d7c3..0346485c47 100644 --- a/simulators/ethereum/engine/suites/engine/invalid_payload.go +++ b/simulators/ethereum/engine/suites/engine/invalid_payload.go @@ -110,6 +110,7 @@ func (tc InvalidPayloadTestCase) Execute(t *test.Env) { var ( alteredPayload *typ.ExecutableData invalidDetectedOnSync bool = tc.InvalidDetectedOnSync + nilLatestValidHash bool = tc.NilLatestValidHash err error ) @@ -131,10 +132,13 @@ func (tc InvalidPayloadTestCase) Execute(t *test.Env) { t.Fatalf("FAIL (%s): Unable to modify payload (%v): %v", t.TestName, tc.InvalidField, err) } - if t.CLMock.LatestPayloadBuilt.VersionedHashes != nil && len(*t.CLMock.LatestPayloadBuilt.VersionedHashes) > 0 && tc.InvalidField == helper.RemoveTransaction { + if t.CLMock.LatestPayloadBuilt.VersionedHashes != nil && + len(*t.CLMock.LatestPayloadBuilt.VersionedHashes) > 0 && + tc.InvalidField == helper.RemoveTransaction { // If the payload has versioned hashes, and we removed any transaction, it's highly likely the client will // be able to detect the invalid payload even when syncing because of the blob gas used. invalidDetectedOnSync = true + nilLatestValidHash = true } // Depending on the field we modified, we expect a different status @@ -157,7 +161,7 @@ func (tc InvalidPayloadTestCase) Execute(t *test.Env) { } } else { r.ExpectStatus(test.Invalid) - if !(tc.NilLatestValidHash && r.Status.LatestValidHash == nil) { + if !(nilLatestValidHash && r.Status.LatestValidHash == nil) { r.ExpectLatestValidHash(&alteredPayload.ParentHash) } } @@ -222,7 +226,7 @@ func (tc InvalidPayloadTestCase) Execute(t *test.Env) { } else { // Otherwise the response should be INVALID. q.ExpectStatus(test.Invalid) - if !(tc.NilLatestValidHash && r.Status.LatestValidHash == nil) { + if !(nilLatestValidHash && r.Status.LatestValidHash == nil) { q.ExpectLatestValidHash(&t.CLMock.LatestExecutedPayload.BlockHash) } } @@ -282,7 +286,7 @@ func (tc InvalidPayloadTestCase) Execute(t *test.Env) { if r.Status.Status == test.Accepted || r.Status.Status == test.Syncing { r.ExpectLatestValidHash(nil) } else if r.Status.Status == test.Invalid { - if !(tc.NilLatestValidHash && r.Status.LatestValidHash == nil) { + if !(nilLatestValidHash && r.Status.LatestValidHash == nil) { r.ExpectLatestValidHash(&alteredPayload.ParentHash) } } From 5a9bc6403a66646b6d64f3f7fc48448e66427cad Mon Sep 17 00:00:00 2001 From: Mario Vega Date: Mon, 2 Oct 2023 17:33:41 +0000 Subject: [PATCH 055/387] simulators/ethereum/engine: Optional `INVALID` on sync --- .../ethereum/engine/suites/engine/invalid_payload.go | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/simulators/ethereum/engine/suites/engine/invalid_payload.go b/simulators/ethereum/engine/suites/engine/invalid_payload.go index 0346485c47..3277f664c2 100644 --- a/simulators/ethereum/engine/suites/engine/invalid_payload.go +++ b/simulators/ethereum/engine/suites/engine/invalid_payload.go @@ -28,7 +28,8 @@ type InvalidPayloadTestCase struct { Syncing bool // EmptyTransactions is true if the payload should not contain any transactions EmptyTransactions bool - // If true, the payload can be detected to be invalid even when syncing + // If true, the payload can be detected to be invalid even when syncing, + // but this check is optional and both `INVALID` and `SYNCING` are valid responses. InvalidDetectedOnSync bool // If true, latest valid hash can be nil for this test. NilLatestValidHash bool @@ -153,8 +154,11 @@ func (tc InvalidPayloadTestCase) Execute(t *test.Env) { // if the payload extends the canonical chain and requisite data for its validation is missing // (the client can assume the payload extends the canonical because the linking payload could be missing) if invalidDetectedOnSync { - // For some fields, the client can detect the invalid payload even when it doesn't have the parent - r.ExpectStatusEither(test.Invalid) + // For some fields, the client can detect the invalid payload even when it doesn't have the parent. + // However this behavior is up to the client, so we can't expect it to happen and syncing is also valid. + // `VALID` response is still incorrect though. + r.ExpectStatusEither(test.Invalid, test.Accepted, test.Syncing) + // TODO: It seems like latestValidHash==nil should always be expected here. } else { r.ExpectStatusEither(test.Accepted, test.Syncing) r.ExpectLatestValidHash(nil) From 3b22eecf18b0f50a0b646ec61523c1a1a16b5be7 Mon Sep 17 00:00:00 2001 From: Mario Vega Date: Mon, 2 Oct 2023 17:34:17 +0000 Subject: [PATCH 056/387] simulators/ethereum/engine: Fix invalid nonce test on zero nonce --- simulators/ethereum/engine/helper/customizer.go | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/simulators/ethereum/engine/helper/customizer.go b/simulators/ethereum/engine/helper/customizer.go index 35d7299936..09b66643bf 100644 --- a/simulators/ethereum/engine/helper/customizer.go +++ b/simulators/ethereum/engine/helper/customizer.go @@ -732,7 +732,12 @@ func GenerateInvalidPayload(basePayload *typ.ExecutableData, payloadField Invali modifiedSignature.R = modifiedSignature.R.Sub(modifiedSignature.R, common.Big1) customTxData.Signature = &modifiedSignature case InvalidTransactionNonce: - customNonce := baseTx.Nonce() - 1 + customNonce := baseTx.Nonce() + if customNonce > 0 { + customNonce = customNonce - 1 + } else { + customNonce = 2 << 32 + } customTxData.Nonce = &customNonce case InvalidTransactionGas: customGas := uint64(0) From 75ca98f65ecdd54a7cb66378c5025988bd790b3f Mon Sep 17 00:00:00 2001 From: Mario Vega Date: Mon, 2 Oct 2023 19:24:55 +0000 Subject: [PATCH 057/387] simulators/ethereum/engine: Fix invalid Tx tests to use more realistic values --- .../ethereum/engine/helper/customizer.go | 8 +++++--- simulators/ethereum/engine/helper/tx.go | 19 ++++++++++++++----- .../ethereum/engine/suites/engine/tests.go | 11 +++++++---- 3 files changed, 26 insertions(+), 12 deletions(-) diff --git a/simulators/ethereum/engine/helper/customizer.go b/simulators/ethereum/engine/helper/customizer.go index 09b66643bf..4cf22ad60f 100644 --- a/simulators/ethereum/engine/helper/customizer.go +++ b/simulators/ethereum/engine/helper/customizer.go @@ -728,7 +728,8 @@ func GenerateInvalidPayload(basePayload *typ.ExecutableData, payloadField Invali var customTxData CustomTransactionData switch payloadField { case InvalidTransactionSignature: - modifiedSignature := SignatureValuesFromRaw(baseTx.RawSignatureValues()) + baseV, baseR, baseS := baseTx.RawSignatureValues() + modifiedSignature := SignatureValuesFromRaw(baseV, baseR, baseS) modifiedSignature.R = modifiedSignature.R.Sub(modifiedSignature.R, common.Big1) customTxData.Signature = &modifiedSignature case InvalidTransactionNonce: @@ -740,10 +741,11 @@ func GenerateInvalidPayload(basePayload *typ.ExecutableData, payloadField Invali } customTxData.Nonce = &customNonce case InvalidTransactionGas: - customGas := uint64(0) + customGas := uint64(baseTx.Gas() + 1) customTxData.Gas = &customGas case InvalidTransactionGasPrice: - customTxData.GasPriceOrGasFeeCap = common.Big0 + customTxData.GasPriceOrGasFeeCap = new(big.Int).Set(baseTx.GasPrice()) + customTxData.GasPriceOrGasFeeCap.Div(customTxData.GasPriceOrGasFeeCap, big.NewInt(2)) case InvalidTransactionGasTipPrice: invalidGasTip := new(big.Int).Set(globals.GasTipPrice) invalidGasTip.Mul(invalidGasTip, big.NewInt(2)) diff --git a/simulators/ethereum/engine/helper/tx.go b/simulators/ethereum/engine/helper/tx.go index d12dabbe92..0ec633bf16 100644 --- a/simulators/ethereum/engine/helper/tx.go +++ b/simulators/ethereum/engine/helper/tx.go @@ -31,9 +31,9 @@ type SignatureValues struct { func SignatureValuesFromRaw(v *big.Int, r *big.Int, s *big.Int) SignatureValues { return SignatureValues{ - V: v, - R: r, - S: s, + V: new(big.Int).Set(v), + R: new(big.Int).Set(r), + S: new(big.Int).Set(s), } } @@ -104,6 +104,11 @@ func CustomizeTransaction(baseTransaction *types.Transaction, sender SenderAccou case types.DynamicFeeTxType: modifiedDynamicFeeTxBase := &types.DynamicFeeTx{} + if customData.ChainID != nil { + modifiedDynamicFeeTxBase.ChainID = customData.ChainID + } else { + modifiedDynamicFeeTxBase.ChainID = baseTransaction.ChainId() + } if customData.Nonce != nil { modifiedDynamicFeeTxBase.Nonce = *customData.Nonce } else { @@ -148,7 +153,11 @@ func CustomizeTransaction(baseTransaction *types.Transaction, sender SenderAccou modifiedTxData = modifiedDynamicFeeTxBase case types.BlobTxType: modifiedBlobTxBase := &types.BlobTx{} - + if customData.ChainID != nil { + modifiedBlobTxBase.ChainID = uint256.MustFromBig(customData.ChainID) + } else { + modifiedBlobTxBase.ChainID = uint256.MustFromBig(baseTransaction.ChainId()) + } if customData.Nonce != nil { modifiedBlobTxBase.Nonce = *customData.Nonce } else { @@ -206,7 +215,7 @@ func CustomizeTransaction(baseTransaction *types.Transaction, sender SenderAccou // If a custom invalid signature was not specified, simply sign the transaction again if customData.ChainID == nil { // Use the default value if an invaild chain ID was not specified - customData.ChainID = globals.ChainID + customData.ChainID = baseTransaction.ChainId() } signer := types.NewCancunSigner(customData.ChainID) var err error diff --git a/simulators/ethereum/engine/suites/engine/tests.go b/simulators/ethereum/engine/suites/engine/tests.go index 5f67acdafe..198227198c 100644 --- a/simulators/ethereum/engine/suites/engine/tests.go +++ b/simulators/ethereum/engine/suites/engine/tests.go @@ -195,6 +195,7 @@ func init() { helper.InvalidTransactionValue, helper.InvalidTransactionChainID, } { + invalidDetectedOnSync := invalidField == helper.InvalidTransactionChainID for _, syncing := range []bool{false, true} { if invalidField != helper.InvalidTransactionGasTipPrice { for _, testTxType := range []helper.TestTransactionType{helper.LegacyTxOnly, helper.DynamicFeeTxOnly} { @@ -202,8 +203,9 @@ func init() { BaseSpec: test.BaseSpec{ TestTransactionType: testTxType, }, - InvalidField: invalidField, - Syncing: syncing, + InvalidField: invalidField, + Syncing: syncing, + InvalidDetectedOnSync: invalidDetectedOnSync, }) } } else { @@ -211,8 +213,9 @@ func init() { BaseSpec: test.BaseSpec{ TestTransactionType: helper.DynamicFeeTxOnly, }, - InvalidField: invalidField, - Syncing: syncing, + InvalidField: invalidField, + Syncing: syncing, + InvalidDetectedOnSync: invalidDetectedOnSync, }) } } From 7620444b978e3c63f1f2a5417e47260326e34f4c Mon Sep 17 00:00:00 2001 From: Mario Vega Date: Mon, 2 Oct 2023 20:10:19 +0000 Subject: [PATCH 058/387] simulators/ethereum/engine: Remove blob tx on Shanghai genesis, before fork --- simulators/ethereum/engine/suites/cancun/tests.go | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/simulators/ethereum/engine/suites/cancun/tests.go b/simulators/ethereum/engine/suites/cancun/tests.go index 8461e895f8..3cb466d1c1 100644 --- a/simulators/ethereum/engine/suites/cancun/tests.go +++ b/simulators/ethereum/engine/suites/cancun/tests.go @@ -1061,14 +1061,8 @@ var Tests = []test.Spec{ }, TestSequence: TestSequence{ - // First, we send a couple of blob transactions on genesis, - // with enough data gas cost to make sure they are included in the first block. - SendBlobTransactions{ - TransactionCount: cancun.TARGET_BLOBS_PER_BLOCK, - BlobTransactionMaxBlobGasCost: big.NewInt(1), - }, NewPayloads{ - ExpectedIncludedBlobCount: cancun.TARGET_BLOBS_PER_BLOCK, + ExpectedIncludedBlobCount: 0, // This customizer only simulates requesting a Shanghai payload 1 second before cancun. // CL Mock will still request the Cancun payload afterwards FcUOnPayloadRequest: &helper.BaseForkchoiceUpdatedCustomizer{ From 0cddc8681c065dcdf6417ae2aa3fdb53f7ed9e80 Mon Sep 17 00:00:00 2001 From: Kim De Mey Date: Tue, 3 Oct 2023 17:43:06 +0200 Subject: [PATCH 059/387] clients/nimbus-el: use admin_nodeInfo instead of net_nodeInfo (#896) Most/all EL client seem to use admin_nodeInfo so we adjusted this in nimbus-eth1 --- clients/nimbus-el/enode.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clients/nimbus-el/enode.sh b/clients/nimbus-el/enode.sh index f5395afa99..0c4ad0c5ad 100644 --- a/clients/nimbus-el/enode.sh +++ b/clients/nimbus-el/enode.sh @@ -9,7 +9,7 @@ # Immediately abort the script on any error encountered set -e -TARGET_RESPONSE=$(curl -s -X POST -H "Content-Type: application/json" --data '{"jsonrpc":"2.0","method":"net_nodeInfo","params":[],"id":1}' "localhost:8545" ) +TARGET_RESPONSE=$(curl -s -X POST -H "Content-Type: application/json" --data '{"jsonrpc":"2.0","method":"admin_nodeInfo","params":[],"id":1}' "localhost:8545" ) TARGET_ENODE=$(echo ${TARGET_RESPONSE}| jq -r '.result.enode') echo "$TARGET_ENODE" From 7793325cff7879118bae65797478c49a93f4bbe2 Mon Sep 17 00:00:00 2001 From: Mario Vega Date: Tue, 3 Oct 2023 18:48:44 +0000 Subject: [PATCH 060/387] simulators/ethereum/engine: Tx Invalid Signature Modifies S --- simulators/ethereum/engine/helper/customizer.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/simulators/ethereum/engine/helper/customizer.go b/simulators/ethereum/engine/helper/customizer.go index 4cf22ad60f..ac496e11da 100644 --- a/simulators/ethereum/engine/helper/customizer.go +++ b/simulators/ethereum/engine/helper/customizer.go @@ -730,7 +730,7 @@ func GenerateInvalidPayload(basePayload *typ.ExecutableData, payloadField Invali case InvalidTransactionSignature: baseV, baseR, baseS := baseTx.RawSignatureValues() modifiedSignature := SignatureValuesFromRaw(baseV, baseR, baseS) - modifiedSignature.R = modifiedSignature.R.Sub(modifiedSignature.R, common.Big1) + modifiedSignature.S = modifiedSignature.S.Sub(modifiedSignature.S, common.Big1) customTxData.Signature = &modifiedSignature case InvalidTransactionNonce: customNonce := baseTx.Nonce() From 6819247b85588091fdba05133914071a640efa29 Mon Sep 17 00:00:00 2001 From: spencer Date: Wed, 11 Oct 2023 12:36:38 -0600 Subject: [PATCH 061/387] simulators/ethereum/engine: Update post-merge forks to activate later in pre-merge test (#901) simulators/eth/engine: Update pre-merge tests. --- clients/erigon/mapper.jq | 1 + clients/go-ethereum/mapper.jq | 2 +- clients/reth/mapper.jq | 1 + simulators/ethereum/engine/config/fork.go | 4 ++++ simulators/ethereum/engine/config/genesis.go | 20 +++++++++++++------ simulators/ethereum/engine/main.go | 9 +++++++-- .../ethereum/engine/suites/engine/misc.go | 4 +++- .../ethereum/engine/suites/engine/tests.go | 3 ++- 8 files changed, 33 insertions(+), 11 deletions(-) diff --git a/clients/erigon/mapper.jq b/clients/erigon/mapper.jq index b31bdbd493..d64d4a0c98 100644 --- a/clients/erigon/mapper.jq +++ b/clients/erigon/mapper.jq @@ -50,6 +50,7 @@ def to_bool: "muirGlacierBlock": env.HIVE_FORK_MUIR_GLACIER|to_int, "berlinBlock": env.HIVE_FORK_BERLIN|to_int, "londonBlock": env.HIVE_FORK_LONDON|to_int, + "mergeNetsplitBlock": env.HIVE_MERGE_BLOCK_ID|to_int, "terminalTotalDifficulty": env.HIVE_TERMINAL_TOTAL_DIFFICULTY|to_int, "shanghaiTime": env.HIVE_SHANGHAI_TIMESTAMP|to_int, "cancunTime": env.HIVE_CANCUN_TIMESTAMP|to_int, diff --git a/clients/go-ethereum/mapper.jq b/clients/go-ethereum/mapper.jq index 398c6eda9f..2e0ced8186 100644 --- a/clients/go-ethereum/mapper.jq +++ b/clients/go-ethereum/mapper.jq @@ -52,7 +52,7 @@ def to_bool: "yolov2Block": env.HIVE_FORK_BERLIN|to_int, "yolov3Block": env.HIVE_FORK_BERLIN|to_int, "londonBlock": env.HIVE_FORK_LONDON|to_int, - "mergeForkBlock": env.HIVE_MERGE_BLOCK_ID|to_int, + "mergeNetsplitBlock": env.HIVE_MERGE_BLOCK_ID|to_int, "terminalTotalDifficulty": env.HIVE_TERMINAL_TOTAL_DIFFICULTY|to_int, "shanghaiTime": env.HIVE_SHANGHAI_TIMESTAMP|to_int, "cancunTime": env.HIVE_CANCUN_TIMESTAMP|to_int, diff --git a/clients/reth/mapper.jq b/clients/reth/mapper.jq index 5fa2cb40ff..1556c95356 100644 --- a/clients/reth/mapper.jq +++ b/clients/reth/mapper.jq @@ -52,6 +52,7 @@ def to_bool: "londonBlock": env.HIVE_FORK_LONDON|to_int, "arrowGlacierBlock": env.HIVE_FORK_ARROW_GLACIER|to_int, "grayGlacierBlock": env.HIVE_FORK_GRAY_GLACIER|to_int, + "parisBlock": env.HIVE_MERGE_BLOCK_ID|to_int, "terminalTotalDifficulty": env.HIVE_TERMINAL_TOTAL_DIFFICULTY|to_int, "terminalTotalDifficultyPassed": env.HIVE_TERMINAL_TOTAL_DIFFICULTY_PASSED|to_bool, "shanghaiTime": env.HIVE_SHANGHAI_TIMESTAMP|to_int, diff --git a/simulators/ethereum/engine/config/fork.go b/simulators/ethereum/engine/config/fork.go index 6e4e879cb3..a02147f3db 100644 --- a/simulators/ethereum/engine/config/fork.go +++ b/simulators/ethereum/engine/config/fork.go @@ -10,6 +10,7 @@ type Fork string const ( NA Fork = "" + London Fork = "London" Paris Fork = "Paris" Shanghai Fork = "Shanghai" Cancun Fork = "Cancun" @@ -17,6 +18,8 @@ const ( func (f Fork) PreviousFork() Fork { switch f { + case Paris: + return London case Shanghai: return Paris case Cancun: @@ -28,6 +31,7 @@ func (f Fork) PreviousFork() Fork { type ForkConfig struct { LondonNumber *big.Int + ParisNumber *big.Int ShanghaiTimestamp *big.Int CancunTimestamp *big.Int } diff --git a/simulators/ethereum/engine/config/genesis.go b/simulators/ethereum/engine/config/genesis.go index 7fe0645900..3436e2e44d 100644 --- a/simulators/ethereum/engine/config/genesis.go +++ b/simulators/ethereum/engine/config/genesis.go @@ -9,16 +9,17 @@ import ( ) func (f *ForkConfig) ConfigGenesis(genesis *core.Genesis) error { + if f.ParisNumber != nil { + genesis.Config.MergeNetsplitBlock = f.ParisNumber + if genesis.Number >= f.ParisNumber.Uint64() { + removePoW(genesis) + } + } if f.ShanghaiTimestamp != nil { shanghaiTime := f.ShanghaiTimestamp.Uint64() genesis.Config.ShanghaiTime = &shanghaiTime - if genesis.Timestamp >= shanghaiTime { - // Remove PoW altogether - genesis.Difficulty = common.Big0 - genesis.Config.TerminalTotalDifficulty = common.Big0 - genesis.Config.Clique = nil - genesis.ExtraData = []byte{} + removePoW(genesis) } } if f.CancunTimestamp != nil { @@ -28,3 +29,10 @@ func (f *ForkConfig) ConfigGenesis(genesis *core.Genesis) error { } return nil } + +func removePoW(genesis *core.Genesis) { + genesis.Difficulty = common.Big0 + genesis.Config.TerminalTotalDifficulty = common.Big0 + genesis.Config.Clique = nil + genesis.ExtraData = []byte{} +} diff --git a/simulators/ethereum/engine/main.go b/simulators/ethereum/engine/main.go index 6cb74003b2..b10a279afd 100644 --- a/simulators/ethereum/engine/main.go +++ b/simulators/ethereum/engine/main.go @@ -144,10 +144,15 @@ func makeRunner(tests []test.Spec, nodeType string) func(t *hivesim.T) { if forkConfig.LondonNumber != nil { newParams = newParams.Set("HIVE_FORK_LONDON", fmt.Sprintf("%d", forkConfig.LondonNumber)) } + if forkConfig.ParisNumber != nil { + newParams = newParams.Set("HIVE_MERGE_BLOCK_ID", fmt.Sprintf("%d", forkConfig.ParisNumber)) + } if forkConfig.ShanghaiTimestamp != nil { newParams = newParams.Set("HIVE_SHANGHAI_TIMESTAMP", fmt.Sprintf("%d", forkConfig.ShanghaiTimestamp)) - // Ensure the merge transition is activated before shanghai. - newParams = newParams.Set("HIVE_MERGE_BLOCK_ID", "0") + // Ensure merge transition is activated before shanghai if not already + if forkConfig.ParisNumber == nil { + newParams = newParams.Set("HIVE_MERGE_BLOCK_ID", "0") + } if forkConfig.CancunTimestamp != nil { newParams = newParams.Set("HIVE_CANCUN_TIMESTAMP", fmt.Sprintf("%d", forkConfig.CancunTimestamp)) } diff --git a/simulators/ethereum/engine/suites/engine/misc.go b/simulators/ethereum/engine/suites/engine/misc.go index a98c6cb124..cfb569dfb0 100644 --- a/simulators/ethereum/engine/suites/engine/misc.go +++ b/simulators/ethereum/engine/suites/engine/misc.go @@ -29,8 +29,10 @@ func (s NonZeroPreMergeFork) GetForkConfig() *config.ForkConfig { if forkConfig == nil { return nil } + // Merge fork & pre-merge happen at block 1 forkConfig.LondonNumber = common.Big1 - // All post merge forks must happen at the same time as the latest fork + forkConfig.ParisNumber = common.Big1 + // Post-merge fork happens at block 2 mainFork := s.GetMainFork() if mainFork == config.Cancun { forkConfig.ShanghaiTimestamp = new(big.Int).Set(forkConfig.CancunTimestamp) diff --git a/simulators/ethereum/engine/suites/engine/tests.go b/simulators/ethereum/engine/suites/engine/tests.go index 198227198c..e6945a1678 100644 --- a/simulators/ethereum/engine/suites/engine/tests.go +++ b/simulators/ethereum/engine/suites/engine/tests.go @@ -411,9 +411,10 @@ func init() { // Misc Tests Tests = append(Tests, + // Pre-merge & merge fork occur at block 1, post-merge forks occur at block 2 NonZeroPreMergeFork{ BaseSpec: test.BaseSpec{ - ForkHeight: 1, + ForkHeight: 2, }, }, ) From 112fdfed4af7c594d3511b5562c1590f335821bc Mon Sep 17 00:00:00 2001 From: Mario Vega Date: Fri, 13 Oct 2023 10:25:11 -0600 Subject: [PATCH 062/387] simulators/ethereum/engine: Fix naming, safe/finalized on reorg tests (#907) --- .../engine/suites/engine/invalid_ancestor.go | 40 ++++++++++++------- .../ethereum/engine/suites/engine/tests.go | 7 +++- 2 files changed, 31 insertions(+), 16 deletions(-) diff --git a/simulators/ethereum/engine/suites/engine/invalid_ancestor.go b/simulators/ethereum/engine/suites/engine/invalid_ancestor.go index 2f473904e7..fa8eb46cae 100644 --- a/simulators/ethereum/engine/suites/engine/invalid_ancestor.go +++ b/simulators/ethereum/engine/suites/engine/invalid_ancestor.go @@ -5,6 +5,7 @@ import ( "encoding/json" "fmt" "math/big" + "strings" "time" api "github.com/ethereum/go-ethereum/beacon/engine" @@ -39,7 +40,16 @@ func (s InvalidMissingAncestorReOrgTest) WithMainFork(fork config.Fork) test.Spe } func (tc InvalidMissingAncestorReOrgTest) GetName() string { - return fmt.Sprintf("Invalid Missing Ancestor ReOrg, Invalid %s, Invalid P%d'", tc.InvalidField, tc.InvalidIndex) + name := []string{ + "Invalid Missing Ancestor ReOrg", + fmt.Sprintf("Invalid %s", tc.InvalidField), + } + if tc.EmptyTransactions { + name = append(name, "Empty Txs") + } + name = append(name, fmt.Sprintf("Invalid P%d'", tc.InvalidIndex)) + + return strings.Join(name, ", ") } func (tc InvalidMissingAncestorReOrgTest) Execute(t *test.Env) { @@ -128,9 +138,7 @@ func (tc InvalidMissingAncestorReOrgTest) Execute(t *test.Env) { r := t.TestEngine.TestEngineNewPayload(altChainPayloads[i]) p := t.TestEngine.TestEngineForkchoiceUpdated(&api.ForkchoiceStateV1{ - HeadBlockHash: altChainPayloads[i].BlockHash, - SafeBlockHash: altChainPayloads[i].BlockHash, - FinalizedBlockHash: common.Hash{}, + HeadBlockHash: altChainPayloads[i].BlockHash, }, nil, altChainPayloads[i].Timestamp) if i == tc.InvalidIndex { // If this is the first payload after the common ancestor, and this is the payload we invalidated, @@ -199,15 +207,21 @@ func (s InvalidMissingAncestorReOrgSyncTest) WithMainFork(fork config.Fork) test } func (tc InvalidMissingAncestorReOrgSyncTest) GetName() string { - name := fmt.Sprintf("Invalid Missing Ancestor ReOrg, Invalid %s, ", tc.InvalidField) + name := []string{ + "Invalid Missing Ancestor ReOrg", + fmt.Sprintf("Invalid %s", tc.InvalidField), + } if tc.EmptyTransactions { - name += "Empty Txs, " + name = append(name, "Empty Txs") } - name += fmt.Sprintf("Invalid P%d', Reveal using sync", tc.InvalidIndex) + name = append(name, + fmt.Sprintf("Invalid P%d'", tc.InvalidIndex), + "Reveal using sync", + ) if tc.ReOrgFromCanonical { - name += " (ReOrg from Canonical)" + name = append(name, "ReOrg from Canonical") } - return name + return strings.Join(name, ", ") } func (tc InvalidMissingAncestorReOrgSyncTest) Execute(t *test.Env) { @@ -371,9 +385,7 @@ func (tc InvalidMissingAncestorReOrgSyncTest) Execute(t *test.Env) { r.ExpectStatusEither(test.Valid, test.Accepted) s := secondaryTestClient.TestEngineForkchoiceUpdated(&api.ForkchoiceStateV1{ - HeadBlockHash: p.BlockHash, - SafeBlockHash: cA.BlockHash, - FinalizedBlockHash: common.Hash{}, + HeadBlockHash: p.BlockHash, }, nil, p.Timestamp) s.ExpectationDescription = "Sent modified payload forkchoice updated to secondary client, expected to be accepted" s.ExpectAnyPayloadStatus(test.Valid, test.Syncing) @@ -421,9 +433,7 @@ func (tc InvalidMissingAncestorReOrgSyncTest) Execute(t *test.Env) { r := t.TestEngine.TestEngineNewPayload(altChainPayloads[n]) t.Logf("INFO (%s): Response from main client: %v", t.TestName, r.Status) s := t.TestEngine.TestEngineForkchoiceUpdated(&api.ForkchoiceStateV1{ - HeadBlockHash: altChainPayloads[n].BlockHash, - SafeBlockHash: altChainPayloads[n].BlockHash, - FinalizedBlockHash: common.Hash{}, + HeadBlockHash: altChainPayloads[n].BlockHash, }, nil, altChainPayloads[n].Timestamp) t.Logf("INFO (%s): Response from main client fcu: %v", t.TestName, s.Response.PayloadStatus) diff --git a/simulators/ethereum/engine/suites/engine/tests.go b/simulators/ethereum/engine/suites/engine/tests.go index e6945a1678..cf35765ea1 100644 --- a/simulators/ethereum/engine/suites/engine/tests.go +++ b/simulators/ethereum/engine/suites/engine/tests.go @@ -240,6 +240,10 @@ func init() { for _, invalidIndex := range []int{1, 9, 10} { for _, emptyTxs := range []bool{false, true} { Tests = append(Tests, InvalidMissingAncestorReOrgTest{ + BaseSpec: test.BaseSpec{ + SlotsToSafe: big.NewInt(32), + SlotsToFinalized: big.NewInt(64), + }, SidechainLength: 10, InvalidIndex: invalidIndex, InvalidField: helper.InvalidStateRoot, @@ -251,7 +255,8 @@ func init() { // Invalid Ancestor Re-Org Tests (Reveal Via Sync) spec := test.BaseSpec{ TimeoutSeconds: 60, - SlotsToFinalized: big.NewInt(20), + SlotsToSafe: big.NewInt(32), + SlotsToFinalized: big.NewInt(64), } for _, invalidField := range []helper.InvalidPayloadBlockField{ helper.InvalidStateRoot, From c9b9a9955baf3aa654f544ad0178d19ab883554d Mon Sep 17 00:00:00 2001 From: lightclient <14004106+lightclient@users.noreply.github.com> Date: Tue, 17 Oct 2023 06:45:19 -0600 Subject: [PATCH 063/387] simulators/ethereum/engine: use generic error check for missing block (#874) simulators/ethereum/engine: use generic error check for missing block on rpc --- simulators/ethereum/engine/suites/engine/rpc.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/simulators/ethereum/engine/suites/engine/rpc.go b/simulators/ethereum/engine/suites/engine/rpc.go index 478cfb0c25..9d9ab22f35 100644 --- a/simulators/ethereum/engine/suites/engine/rpc.go +++ b/simulators/ethereum/engine/suites/engine/rpc.go @@ -50,7 +50,7 @@ func (b BlockStatus) Execute(t *test.Env) { number = Finalized } p := t.TestEngine.TestHeaderByNumber(number) - p.ExpectErrorCode(-39001) + p.ExpectError() } // Produce blocks before starting the test From 413f915a548718677afa681efa67f4e1d3784254 Mon Sep 17 00:00:00 2001 From: Delweng Date: Thu, 19 Oct 2023 23:09:08 +0800 Subject: [PATCH 064/387] clients/go-ethereum: disable min free disk check (#910) --- clients/go-ethereum/geth.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/clients/go-ethereum/geth.sh b/clients/go-ethereum/geth.sh index d35fba6a20..92cdd37db0 100644 --- a/clients/go-ethereum/geth.sh +++ b/clients/go-ethereum/geth.sh @@ -169,5 +169,7 @@ fi # Run the go-ethereum implementation with the requested flags. FLAGS="$FLAGS --nat=none" +# Disable disk space free monitor +FLAGS="$FLAGS --datadir.minfreedisk=0" echo "Running go-ethereum with flags $FLAGS" $geth $FLAGS From 0bcc58f32792a190e19b632898bb3fbbe6ed35e6 Mon Sep 17 00:00:00 2001 From: Mario Vega Date: Thu, 19 Oct 2023 09:11:56 -0600 Subject: [PATCH 065/387] internal/libhive: return clients in the order defined in the client-file (#898) --- hivesim/hive_test.go | 6 +++--- internal/libhive/api.go | 19 ++++++------------- internal/libhive/run.go | 33 ++++++++++++++++++++------------- internal/libhive/testmanager.go | 4 ++-- 4 files changed, 31 insertions(+), 31 deletions(-) diff --git a/hivesim/hive_test.go b/hivesim/hive_test.go index 48863b109e..64c5053cdb 100644 --- a/hivesim/hive_test.go +++ b/hivesim/hive_test.go @@ -400,9 +400,9 @@ func TestStartClientInitialNetworks(t *testing.T) { } func newFakeAPI(hooks *fakes.BackendHooks) (*libhive.TestManager, *httptest.Server) { - defs := map[string]*libhive.ClientDefinition{ - "client-1": {Name: "client-1", Image: "/ignored/in/api", Version: "client-1-version", Meta: libhive.ClientMetadata{Roles: []string{"eth1"}}}, - "client-2": {Name: "client-2", Image: "/not/exposed/", Version: "client-2-version", Meta: libhive.ClientMetadata{Roles: []string{"beacon"}}}, + defs := []*libhive.ClientDefinition{ + {Name: "client-1", Image: "/ignored/in/api", Version: "client-1-version", Meta: libhive.ClientMetadata{Roles: []string{"eth1"}}}, + {Name: "client-2", Image: "/not/exposed/", Version: "client-2-version", Meta: libhive.ClientMetadata{Roles: []string{"beacon"}}}, } env := libhive.SimEnv{} backend := fakes.NewContainerBackend(hooks) diff --git a/internal/libhive/api.go b/internal/libhive/api.go index d0a051e3fa..06c89876d7 100644 --- a/internal/libhive/api.go +++ b/internal/libhive/api.go @@ -10,7 +10,6 @@ import ( "net/http" "path" "path/filepath" - "sort" "strconv" "strings" "time" @@ -61,14 +60,7 @@ type simAPI struct { // getClientTypes returns all known client types. func (api *simAPI) getClientTypes(w http.ResponseWriter, r *http.Request) { - clients := make([]*ClientDefinition, 0, len(api.tm.clientDefs)) - for _, def := range api.tm.clientDefs { - clients = append(clients, def) - } - sort.Slice(clients, func(i, j int) bool { - return clients[i].Name < clients[j].Name - }) - serveJSON(w, clients) + serveJSON(w, api.tm.clientDefs) } // startSuite starts a suite. @@ -332,11 +324,12 @@ func (api *simAPI) checkClient(req *simapi.NodeConfig) (*ClientDefinition, error if req.Client == "" { return nil, errors.New("missing client type in start request") } - def, ok := api.tm.clientDefs[req.Client] - if !ok { - return nil, errors.New("unknown client type in start request") + for _, client := range api.tm.clientDefs { + if client.Name == req.Client { + return client, nil + } } - return def, nil + return nil, errors.New("unknown client type in start request") } // checkClientNetworks pre-checks the existence of initial networks for a client container. diff --git a/internal/libhive/run.go b/internal/libhive/run.go index 37e0f8bd11..42b985e834 100644 --- a/internal/libhive/run.go +++ b/internal/libhive/run.go @@ -30,7 +30,7 @@ type Runner struct { // This holds the image names of all built simulators. simImages map[string]string - clientDefs map[string]*ClientDefinition + clientDefs []*ClientDefinition } func NewRunner(inv Inventory, b Builder, cb ContainerBackend) *Runner { @@ -58,11 +58,11 @@ func (r *Runner) buildClients(ctx context.Context, clientList []ClientDesignator return errors.New("client list is empty, cannot simulate") } - r.clientDefs = make(map[string]*ClientDefinition, len(clientList)) + r.clientDefs = make([]*ClientDefinition, len(clientList)) var anyBuilt bool log15.Info(fmt.Sprintf("building %d clients...", len(clientList))) - for _, client := range clientList { + for i, client := range clientList { image, err := r.builder.BuildClientImage(ctx, client) if err != nil { continue @@ -72,7 +72,7 @@ func (r *Runner) buildClients(ctx context.Context, clientList []ClientDesignator if err != nil { log15.Warn("can't read version info of "+client.Client, "image", image, "err", err) } - r.clientDefs[client.Name()] = &ClientDefinition{ + r.clientDefs[i] = &ClientDefinition{ Name: client.Name(), Version: strings.TrimSpace(string(version)), Image: image, @@ -117,8 +117,11 @@ func (r *Runner) RunDevMode(ctx context.Context, env SimEnv, endpoint string) er if err := createWorkspace(env.LogDir); err != nil { return err } - - tm := NewTestManager(env, r.container, r.clientDefs) + clientDefs := make([]*ClientDefinition, 0) + for _, def := range r.clientDefs { + clientDefs = append(clientDefs, def) + } + tm := NewTestManager(env, r.container, clientDefs) defer func() { if err := tm.Terminate(); err != nil { log15.Error("could not terminate test manager", "error", err) @@ -159,19 +162,23 @@ HIVE_SIMULATOR=http://%v func (r *Runner) run(ctx context.Context, sim string, env SimEnv) (SimResult, error) { log15.Info(fmt.Sprintf("running simulation: %s", sim)) - clientDefs := make(map[string]*ClientDefinition) + clientDefs := make([]*ClientDefinition, 0) if env.ClientList == nil { // Unspecified, make all clients available. - for name, def := range r.clientDefs { - clientDefs[name] = def - } + clientDefs = append(clientDefs, r.clientDefs...) } else { for _, client := range env.ClientList { - def, ok := r.clientDefs[client.Client] - if !ok { + found := false + for _, def := range r.clientDefs { + if def.Name == client.Client { + clientDefs = append(clientDefs, def) + found = true + break + } + } + if !found { return SimResult{}, fmt.Errorf("unknown client %q in simulation client list", client.Client) } - clientDefs[client.Client] = def } } diff --git a/internal/libhive/testmanager.go b/internal/libhive/testmanager.go index beee5ff621..18d5ffedae 100644 --- a/internal/libhive/testmanager.go +++ b/internal/libhive/testmanager.go @@ -61,7 +61,7 @@ type SimResult struct { type TestManager struct { config SimEnv backend ContainerBackend - clientDefs map[string]*ClientDefinition + clientDefs []*ClientDefinition simContainerID string simLogFile string @@ -80,7 +80,7 @@ type TestManager struct { results map[TestSuiteID]*TestSuite } -func NewTestManager(config SimEnv, b ContainerBackend, clients map[string]*ClientDefinition) *TestManager { +func NewTestManager(config SimEnv, b ContainerBackend, clients []*ClientDefinition) *TestManager { return &TestManager{ clientDefs: clients, config: config, From 0c044053b98b9a9c8bbc26a86ff249a67182d6a6 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Thu, 19 Oct 2023 17:37:28 +0200 Subject: [PATCH 066/387] cmd/hivechain: support for newer forks, more chain outputs (#909) --- cmd/hivechain/README.md | 68 +++++ cmd/hivechain/accounts.go | 99 +++++++ cmd/hivechain/bytecode/callenv.bin | Bin 0 -> 47 bytes cmd/hivechain/bytecode/callme.bin | Bin 0 -> 83 bytes cmd/hivechain/bytecode/callrevert.bin | Bin 0 -> 142 bytes cmd/hivechain/bytecode/deployer.bin | Bin 0 -> 13 bytes cmd/hivechain/bytecode/gencode.bin | Bin 0 -> 46 bytes cmd/hivechain/bytecode/genlogs.bin | Bin 0 -> 37 bytes cmd/hivechain/bytecode/genstorage.bin | 1 + cmd/hivechain/compile.sh | 11 + cmd/hivechain/contracts.go | 26 ++ cmd/hivechain/contracts/callenv.eas | 36 +++ cmd/hivechain/contracts/callme.eas | 40 +++ cmd/hivechain/contracts/callrevert.eas | 62 +++++ cmd/hivechain/contracts/deployer.eas | 15 + cmd/hivechain/contracts/gencode.eas | 34 +++ cmd/hivechain/contracts/genlogs.eas | 21 ++ cmd/hivechain/contracts/genstorage.eas | 17 ++ cmd/hivechain/contracts/rng.eas | 32 +++ cmd/hivechain/gencode.evm | 19 -- cmd/hivechain/generate.go | 367 +++++++++---------------- cmd/hivechain/genesis.go | 174 ++++++++++++ cmd/hivechain/genlogs.evm | 42 --- cmd/hivechain/genstorage.evm | 16 -- cmd/hivechain/main.go | 155 ++++------- cmd/hivechain/mod.go | 113 ++++++++ cmd/hivechain/mod_deploy.go | 59 ++++ cmd/hivechain/mod_randtx.go | 52 ++++ cmd/hivechain/mod_uncles.go | 58 ++++ cmd/hivechain/mod_valuetransfer.go | 85 ++++++ cmd/hivechain/mod_withdrawals.go | 45 +++ cmd/hivechain/output.go | 164 +++++++++++ cmd/hivechain/output_engine.go | 125 +++++++++ 33 files changed, 1522 insertions(+), 414 deletions(-) create mode 100644 cmd/hivechain/README.md create mode 100644 cmd/hivechain/accounts.go create mode 100644 cmd/hivechain/bytecode/callenv.bin create mode 100644 cmd/hivechain/bytecode/callme.bin create mode 100644 cmd/hivechain/bytecode/callrevert.bin create mode 100644 cmd/hivechain/bytecode/deployer.bin create mode 100644 cmd/hivechain/bytecode/gencode.bin create mode 100644 cmd/hivechain/bytecode/genlogs.bin create mode 100644 cmd/hivechain/bytecode/genstorage.bin create mode 100755 cmd/hivechain/compile.sh create mode 100644 cmd/hivechain/contracts.go create mode 100644 cmd/hivechain/contracts/callenv.eas create mode 100644 cmd/hivechain/contracts/callme.eas create mode 100644 cmd/hivechain/contracts/callrevert.eas create mode 100644 cmd/hivechain/contracts/deployer.eas create mode 100644 cmd/hivechain/contracts/gencode.eas create mode 100644 cmd/hivechain/contracts/genlogs.eas create mode 100644 cmd/hivechain/contracts/genstorage.eas create mode 100644 cmd/hivechain/contracts/rng.eas delete mode 100644 cmd/hivechain/gencode.evm create mode 100644 cmd/hivechain/genesis.go delete mode 100644 cmd/hivechain/genlogs.evm delete mode 100644 cmd/hivechain/genstorage.evm create mode 100644 cmd/hivechain/mod.go create mode 100644 cmd/hivechain/mod_deploy.go create mode 100644 cmd/hivechain/mod_randtx.go create mode 100644 cmd/hivechain/mod_uncles.go create mode 100644 cmd/hivechain/mod_valuetransfer.go create mode 100644 cmd/hivechain/mod_withdrawals.go create mode 100644 cmd/hivechain/output.go create mode 100644 cmd/hivechain/output_engine.go diff --git a/cmd/hivechain/README.md b/cmd/hivechain/README.md new file mode 100644 index 0000000000..43c862ac72 --- /dev/null +++ b/cmd/hivechain/README.md @@ -0,0 +1,68 @@ +# hivechain + +Hivechain creates a non-empty blockchain for testing purposes. To facilitate good tests, +the created chain excercises many protocol features, including: + +- different types of transactions +- diverse set of contracts with interesting storage, code, etc. +- contracts to create known log events +- non-transaction chain modifications: coinbase fee payments, uncles, withdrawals... + +## Running hivechain + +Here is an example command line invocation of the tool: + + hivechain generate -fork-interval 6 -tx-interval 1 -length 500 -outdir chain -outputs genesis,chain,headfcu + +The command creates a 500-block chain where a new fork gets enabled every six blocks, and +every block contains one 'modification' (i.e. transaction). A number of output files will +be created in the `chain/` directory: + +- `genesis.json` contains the genesis block specification +- `chain.rlp` has the blocks in binary RLP format +- `headfcu.json` contains an Engine API request that sends the head block to a client + +To see all generator options, run: + + hivechain generate -help + +## -outputs + +Different kinds of output files can be created based on the generated chain. The available +output formats are documented below. + +### accounts + +Creates `accounts.json` containing accounts and corresponding private keys. + +### chain, powchain + +`chain` creates `chain.rlp` containing the chain blocks. + +`powchain` creates `powchain.rlp` containing only the pre-merge blocks. + +### fcu, headfcu, newpayload + +`fcu.json` is a JSON array of forkchoiceUpdated requests for all post-merge blocks. + +`headfcu.json` is a request for just the head block. This is useful for triggering a sync in the client. + +`newpayload.json` is a JSON array of newPayload requests for post-merge blocks. + +### genesis + +This writes the `genesis.json` file containing a go-ethereum style genesis spec. Note +this file includes the fork block numbers/timestamps. + +### headblock + +This creates `headblock.json` with a dump of the head header. + +### headstate + +This writes `headstate.json`, a dump of the complete state of the head block. + +### txinfo + +The `txinfo.json` file contains an object with a key for each block modifier, and the +value being information about the activity of the modifier. diff --git a/cmd/hivechain/accounts.go b/cmd/hivechain/accounts.go new file mode 100644 index 0000000000..8d995aef0b --- /dev/null +++ b/cmd/hivechain/accounts.go @@ -0,0 +1,99 @@ +package main + +import ( + "crypto/ecdsa" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/crypto" +) + +var knownAccounts = []genAccount{ + { + key: mustParseKey("4552dbe6ca4699322b5d923d0c9bcdd24644f5db8bf89a085b67c6c49b8a1b91"), + addr: common.HexToAddress("0x7435ed30A8b4AEb0877CEf0c6E8cFFe834eb865f"), + }, + { + key: mustParseKey("f6a8f1603b8368f3ca373292b7310c53bec7b508aecacd442554ebc1c5d0c856"), + addr: common.HexToAddress("0x84E75c28348fB86AceA1A93a39426d7D60f4CC46"), + }, + { + key: mustParseKey("6e1e16a9c15641c73bf6e237f9293ab1d4e7c12b9adf83cfc94bcf969670f72d"), + addr: common.HexToAddress("0x4ddE844b71bcdf95512Fb4Dc94e84FB67b512eD8"), + }, + { + key: mustParseKey("fc39d1c9ddbba176d806ebb42d7460189fe56ca163ad3eb6143bfc6beb6f6f72"), + addr: common.HexToAddress("0xd803681E487E6AC18053aFc5a6cD813c86Ec3E4D"), + }, + { + key: mustParseKey("a88293fefc623644969e2ce6919fb0dbd0fd64f640293b4bf7e1a81c97e7fc7f"), + addr: common.HexToAddress("0x4a0f1452281bCec5bd90c3dce6162a5995bfe9df"), + }, + { + key: mustParseKey("457075f6822ac29481154792f65c5f1ec335b4fea9ca20f3fea8fa1d78a12c68"), + addr: common.HexToAddress("0x14e46043e63D0E3cdcf2530519f4cFAf35058Cb2"), + }, + { + key: mustParseKey("9ee3fd550664b246ad7cdba07162dd25530a3b1d51476dd1d85bbc29f0592684"), + addr: common.HexToAddress("0xE7d13f7Aa2A838D24c59b40186a0aCa1e21CffCC"), + }, + { + key: mustParseKey("865898edcf43206d138c93f1bbd86311f4657b057658558888aa5ac4309626a6"), + addr: common.HexToAddress("0x16c57eDF7Fa9D9525378B0b81Bf8A3cEd0620C1c"), + }, + { + key: mustParseKey("19168cd7767604b3d19b99dc3da1302b9ccb6ee9ad61660859e07acd4a2625dd"), + addr: common.HexToAddress("0x2D389075BE5be9F2246Ad654cE152cF05990b209"), + }, + { + key: mustParseKey("ee7f7875d826d7443ccc5c174e38b2c436095018774248a8074ee92d8914dcdb"), + addr: common.HexToAddress("0x1F4924B14F34e24159387C0A4CdBaa32f3DDb0cF"), + }, + { + key: mustParseKey("bfcd0e032489319f4e5ca03e643b2025db624be6cf99cbfed90c4502e3754850"), + addr: common.HexToAddress("0x0c2c51a0990AeE1d73C1228de158688341557508"), + }, + { + key: mustParseKey("41be4e00aac79f7ffbb3455053ec05e971645440d594c047cdcc56a3c7458bd6"), + addr: common.HexToAddress("0x5f552da00dFB4d3749D9e62dCeE3c918855A86A0"), + }, + { + key: mustParseKey("71aa7d299c7607dabfc3d0e5213d612b5e4a97455b596c2f642daac43fa5eeaa"), + addr: common.HexToAddress("0x3aE75c08b4c907EB63a8960c45B86E1e9ab6123c"), + }, + { + key: mustParseKey("c825f31cd8792851e33a290b3d749e553983111fc1f36dfbbdb45f101973f6a9"), + addr: common.HexToAddress("0x654aa64f5FbEFb84c270eC74211B81cA8C44A72e"), + }, + { + key: mustParseKey("8d0faa04ae0f9bc3cd4c890aa025d5f40916f4729538b19471c0beefe11d9e19"), + addr: common.HexToAddress("0x717f8AA2b982BeE0e29f573D31Df288663e1Ce16"), + }, + { + key: mustParseKey("47f666f20e2175606355acec0ea1b37870c15e5797e962340da7ad7972a537e8"), + addr: common.HexToAddress("0x4340Ee1b812ACB40a1eb561C019c327b243b92Df"), + }, + { + key: mustParseKey("8d56bcbcf2c1b7109e1396a28d7a0234e33544ade74ea32c460ce4a443b239b1"), + addr: common.HexToAddress("0xC7B99a164Efd027a93f147376Cc7DA7C67c6bbE0"), + }, + { + key: mustParseKey("34391cbbf06956bb506f45ec179cdd84df526aa364e27bbde65db9c15d866d00"), + addr: common.HexToAddress("0x83C7e323d189f18725ac510004fdC2941F8C4A78"), + }, + { + key: mustParseKey("25e6ce8611cefb5cd338aeaa9292ed2139714668d123a4fb156cabb42051b5b7"), + addr: common.HexToAddress("0x1F5BDe34B4afC686f136c7a3CB6EC376F7357759"), + }, + { + key: mustParseKey("14cdde09d1640eb8c3cda063891b0453073f57719583381ff78811efa6d4199f"), + addr: common.HexToAddress("0xedA8645bA6948855E3B3cD596bbB07596d59c603"), + }, +} + +func mustParseKey(s string) *ecdsa.PrivateKey { + key, err := crypto.HexToECDSA(s) + if err != nil { + panic(err) + } + return key +} diff --git a/cmd/hivechain/bytecode/callenv.bin b/cmd/hivechain/bytecode/callenv.bin new file mode 100644 index 0000000000000000000000000000000000000000..6ed4b4413afa4423ed02a2abf87ada27963331df GIT binary patch literal 47 icmYdbaBd7rP+)Wela65015CPrNh2_60wxm}J_7(OFATf@ literal 0 HcmV?d00001 diff --git a/cmd/hivechain/bytecode/callme.bin b/cmd/hivechain/bytecode/callme.bin new file mode 100644 index 0000000000000000000000000000000000000000..ebddffb95157c146aa9860c94a48ad06759a9a19 GIT binary patch literal 83 zcmXp@U=m4C3NI`#%Fj#JO-{_oNl7e8EY7S-O<)L05K7?t8=b&ln(#p;@js(Tf_r!_ WszQ(=z67Da(TV@xf!It5a-RXmOdeVQ literal 0 HcmV?d00001 diff --git a/cmd/hivechain/bytecode/callrevert.bin b/cmd/hivechain/bytecode/callrevert.bin new file mode 100644 index 0000000000000000000000000000000000000000..5468f315f5deca0f1abf76599cf7aa86722c0c50 GIT binary patch literal 142 zcmYdbFclR|Fbl8u%8B7%zylH(f)WH1Sb`E%5*YqQ*Q=Z~cE+Qc0i;|3q?{{3C8)l% WIJHP2wWuh+2)mvHm!Jecpt%4bViWEF literal 0 HcmV?d00001 diff --git a/cmd/hivechain/bytecode/deployer.bin b/cmd/hivechain/bytecode/deployer.bin new file mode 100644 index 0000000000000000000000000000000000000000..89cc8aa4d632cb8f2070eba090aaf8f596ba98f2 GIT binary patch literal 13 UcmYe`wP0>Y;7wq#Okns702Ltvf&c&j literal 0 HcmV?d00001 diff --git a/cmd/hivechain/bytecode/gencode.bin b/cmd/hivechain/bytecode/gencode.bin new file mode 100644 index 0000000000000000000000000000000000000000..bc95df8500e405dd1851d7e59253513e8fb552e6 GIT binary patch literal 46 zcmZ=xU bytecode/deployer.bin +geas -bin -no-push0 contracts/callenv.eas > bytecode/callenv.bin +geas -bin -no-push0 contracts/callme.eas > bytecode/callme.bin +geas -bin -no-push0 contracts/callrevert.eas > bytecode/callrevert.bin +geas -bin -no-push0 contracts/genlogs.eas > bytecode/genlogs.bin +geas -bin -no-push0 contracts/gencode.eas > bytecode/gencode.bin +geas -bin -no-push0 contracts/genstorage.eas > bytecode/genstorage.bin diff --git a/cmd/hivechain/contracts.go b/cmd/hivechain/contracts.go new file mode 100644 index 0000000000..94ad377f3b --- /dev/null +++ b/cmd/hivechain/contracts.go @@ -0,0 +1,26 @@ +package main + +import _ "embed" + +//go:embed bytecode/gencode.bin +var gencodeCode []byte + +//go:embed bytecode/genlogs.bin +var genlogsCode []byte + +//go:embed bytecode/genstorage.bin +var genstorageCode []byte + +//go:embed bytecode/deployer.bin +var deployerCode []byte + +//go:embed bytecode/callme.bin +var callmeCode []byte + +//go:embed bytecode/callenv.bin +var callenvCode []byte + +// //go:embed bytecode/deposit.bin +// var depositCode []byte +// +// const depositContractAddr = "0x00000000219ab540356cBB839Cbe05303d7705Fa" diff --git a/cmd/hivechain/contracts/callenv.eas b/cmd/hivechain/contracts/callenv.eas new file mode 100644 index 0000000000..535f69a8a5 --- /dev/null +++ b/cmd/hivechain/contracts/callenv.eas @@ -0,0 +1,36 @@ +;;; -*- mode: asm -*- +;;; This contract returns EVM environment data. + +#define %store { ; [value, ptr] + dup2 ; [ptr, value, ptr] + mstore ; [ptr] + push 32 ; [32, ptr] + add ; [newptr] +} + +.start: + push 0 ; [ptr] + + number ; [v, ptr] + %store ; [ptr] + + chainid ; [v, ptr] + %store ; [ptr] + + coinbase ; [v, ptr] + %store ; [ptr] + + basefee ; [v, ptr] + %store ; [ptr] + + difficulty ; [v, ptr] + %store ; [ptr] + + origin ; [v, ptr] + %store ; [ptr] + + callvalue ; [v, ptr] + %store ; [ptr] + + push 0 ; [offset, ptr] + return ; [] diff --git a/cmd/hivechain/contracts/callme.eas b/cmd/hivechain/contracts/callme.eas new file mode 100644 index 0000000000..5fc04060fa --- /dev/null +++ b/cmd/hivechain/contracts/callme.eas @@ -0,0 +1,40 @@ +;;; -*- mode: asm -*- +;;; This contract returns value `theOutput` if calldata is exactly equal to `theInput`. +;;; Otherwise, reverts with an error message. + +#define theInput 0xff01 +#define theOutput 0xffee + +#define %revert(error) { ; [] + push $error ; [value] + push 0 ; [offset, value] + mstore ; [] + push .bytelen($error) ; [size] + push 32-.bytelen($error) ; [offset, size] + revert +} + +.start: + calldatasize ; [size] + push .bytelen(theInput) ; [exp, iszero] + eq ; [size==exp] + jumpi @compare ; [] + %revert("wrong-calldatasize") + +compare: + push 0 ; [offset] + calldataload ; [calldata] + push 256-.bitlen(theInput) ; [shft, calldata] + shr ; [data] + push theInput ; [expv, data] + eq ; [data==expv] + jumpi @return ; [] + %revert("wrong-calldata") + +return: + push theOutput ; [v] + push 0 ; [offset, v] + mstore ; [] + push .bytelen(theOutput) ; [size] + push 32-.bytelen(theInput) ; [offset, size] + return ; [] diff --git a/cmd/hivechain/contracts/callrevert.eas b/cmd/hivechain/contracts/callrevert.eas new file mode 100644 index 0000000000..94386d94ea --- /dev/null +++ b/cmd/hivechain/contracts/callrevert.eas @@ -0,0 +1,62 @@ +;;; -*- mode: asm -*- +;;; This contract is for testing two common Solidity revert encodings: +;;; panic(uint) and error(string). + +;;; Dispatch +.start: + push 0 ; [offset] + calldataload ; [word] + + ;; if word == 0 revert with panic + iszero ; [word==0] + iszero ; [word!=0] + jumpi @error ; [word] + +#define s_panic .selector("panic(uint)") +#define panicv 17 + +;;; Solidity ABI `panic(17)` +;;; Revert data layout: +;;; +;;; selector :: 4 || value :: 32 +;;; +.panic: + push s_panic << (28*8) ; [sel] + push 0 ; [offset, sel] + mstore ; [] + push 17 ; [panicv] + push 4 ; [offset, panicv] + mstore ; [] + + push 36 ; [length] + push 0 ; [offset, length] + revert ; [] + + +#define s_error .selector("error(string)") +#define errmsg "user error" +#define errmsg_word errmsg << (255-.bitlen(errmsg)) + +;;; Solidity ABI error +;;; +;;; Revert data layout: +;;; +;;; selector :: 4 || 0x20 :: 32 || len :: 32 || data :: len +;;; +error: + push s_error << (28*8) ; [sel] + push 0 ; [offset, sel] + mstore ; [] + push 0x20 ; [ptr] + push 4 ; [offset, ptr] + mstore ; [] + push .bytelen(errmsg) ; [len] + push 36 ; [offset, len] + mstore ; [] + push errmsg_word ; [data] + push 68 ; [offset, data] + mstore ; [] + + push 68 + .bytelen(errmsg) ; [length] + push 0 ; [offset, length] + revert diff --git a/cmd/hivechain/contracts/deployer.eas b/cmd/hivechain/contracts/deployer.eas new file mode 100644 index 0000000000..90e62b81de --- /dev/null +++ b/cmd/hivechain/contracts/deployer.eas @@ -0,0 +1,15 @@ +;;; -*- mode: asm -*- +;;; puts any data after @.end into new contract + + push @.end ; [end] + codesize ; [codesize, end] + sub ; [size] + ;; copy to memory + dup1 ; [size, size] + push @.end ; [offset, size, size] + push 0 ; [destOffset, offset, size, size] + codecopy ; [size] + ;; return memory content + push 0 ; [offset, size] + return ; [] +.end: diff --git a/cmd/hivechain/contracts/gencode.eas b/cmd/hivechain/contracts/gencode.eas new file mode 100644 index 0000000000..290355511d --- /dev/null +++ b/cmd/hivechain/contracts/gencode.eas @@ -0,0 +1,34 @@ +;;; -*- mode: asm -*- +;;; creates a contract with code based on block number. + +#include "rng.eas" + +#define outputSize 512 + +#define p_rng 0 +#define p_output p_rng + RngSize +#define p_outputEnd p_output + outputSize + +.start: + %RngInit(p_rng) ; [] + + ;; loop to create the code using rng + push p_output ; [ptr] +loop: + ;; store random word to output + %Rng(p_rng) ; [word, ptr] + dup2 ; [ptr, word, ptr] + mstore ; [ptr] + ;; increment output pointer + push 32 ; [1, ptr] + add ; [newptr] + push p_outputEnd ; [end, newptr] + dup2 ; [newptr, end, newtpr] + lt ; [newptr 0 { - prev := gen.PrevBlock(-1) - gasLimit = core.CalcGasLimit(prev.GasLimit(), cfg.genesis.GasLimit) - } - - var ( - txGasSum uint64 - txCount = 0 - accounts = make(map[common.Address]*ecdsa.PrivateKey) - ) - for addr, key := range knownAccounts { - if _, ok := cfg.genesis.Alloc[addr]; ok { - accounts[addr] = key - } - } + // for write/export + blockchain *core.BlockChain +} - for txCount <= cfg.txCount && len(accounts) > 0 { - for addr, key := range accounts { - tx := generateTx(txType, key, &cfg.genesis, gen) - // Check if account has enough balance left to cover the tx. - if gen.GetBalance(addr).Cmp(tx.Cost()) < 0 { - delete(accounts, addr) - continue - } - // Check if block gas limit reached. - if (txGasSum + tx.Gas()) > gasLimit { - return - } +type modifierInstance struct { + name string + blockModifier +} - log.Printf("adding tx (type %d) from %s in block %d", txType, addr.String(), gen.Number()) - log.Printf("%v (%d gas)", tx.Hash(), tx.Gas()) - gen.AddTx(tx) - txGasSum += tx.Gas() - txCount++ - } - } +type genAccount struct { + addr common.Address + key *ecdsa.PrivateKey } -// generateTx creates a random transaction signed by the given account. -func generateTx(txType int, key *ecdsa.PrivateKey, genesis *core.Genesis, gen *core.BlockGen) *types.Transaction { - var ( - src = crypto.PubkeyToAddress(key.PublicKey) - gasprice = big.NewInt(0) - tx *types.Transaction - ) - // Generate according to type. - switch txType { - case txTypeValue: - amount := big.NewInt(1) - var dst common.Address - rand.Read(dst[:]) - tx = types.NewTransaction(gen.TxNonce(src), dst, amount, params.TxGas, gasprice, nil) - case txTypeStorage: - gas := createTxGasLimit(gen, genesis, genstorage) + 80000 - tx = types.NewContractCreation(gen.TxNonce(src), new(big.Int), gas, gasprice, genstorage) - case txTypeLogs: - gas := createTxGasLimit(gen, genesis, genlogs) + 20000 - tx = types.NewContractCreation(gen.TxNonce(src), new(big.Int), gas, gasprice, genlogs) - case txTypeCode: - // The code generator contract deploys any data given after its own bytecode. - codesize := 128 - input := make([]byte, len(gencode)+codesize) - copy(input, gencode) - rand.Read(input[len(gencode):]) - extraGas := 10000 + params.CreateDataGas*uint64(codesize) - gas := createTxGasLimit(gen, genesis, gencode) + extraGas - tx = types.NewContractCreation(gen.TxNonce(src), new(big.Int), gas, gasprice, input) +func newGenerator(cfg generatorConfig) *generator { + genesis := cfg.createGenesis() + return &generator{ + cfg: cfg, + genesis: genesis, + td: new(big.Int).Set(genesis.Difficulty), + modlist: cfg.createBlockModifiers(), + accounts: slices.Clone(knownAccounts), } - // Sign the transaction. - signer := types.MakeSigner(genesis.Config, gen.Number(), gen.Timestamp()) - signedTx, err := types.SignTx(tx, signer, key) - if err != nil { - panic(err) - } - return signedTx } -func createTxGasLimit(gen *core.BlockGen, genesis *core.Genesis, data []byte) uint64 { - isHomestead := genesis.Config.IsHomestead(gen.Number()) - isEIP2028 := genesis.Config.IsIstanbul(gen.Number()) - isEIP3860 := genesis.Config.IsShanghai(gen.Number(), gen.Timestamp()) - igas, err := core.IntrinsicGas(data, nil, true, isHomestead, isEIP2028, isEIP3860) - if err != nil { - panic(err) - } - return igas +func (cfg *generatorConfig) createBlockModifiers() (list []*modifierInstance) { + for name, new := range modRegistry { + list = append(list, &modifierInstance{ + name: name, + blockModifier: new(), + }) + } + slices.SortFunc(list, func(a, b *modifierInstance) int { + return strings.Compare(a.name, b.name) + }) + return list } -// generateAndSave produces a chain based on the config. -func (cfg generatorConfig) generateAndSave(path string, blockModifier func(i int, gen *core.BlockGen)) error { +// run produces a chain. +func (g *generator) run() error { db := rawdb.NewMemoryDatabase() triedb := trie.NewDatabase(db, trie.HashDefaults) - genesis := cfg.genesis.MustCommit(db, triedb) - config := cfg.genesis.Config + genesis := g.genesis.MustCommit(db, triedb) + config := g.genesis.Config + powEngine := ethash.NewFaker() posEngine := beacon.New(powEngine) - engine := instaSeal{posEngine} + engine := posEngine // Create the PoW chain. - chain, _ := core.GenerateChain(config, genesis, engine, db, cfg.blockCount, blockModifier) - - // Create the PoS chain extension. - if cfg.isPoS { - // Set TTD to the head of the PoW chain. - totalDifficulty := big.NewInt(0) - for _, b := range chain { - totalDifficulty.Add(totalDifficulty, b.Difficulty()) - } - config.TerminalTotalDifficulty = totalDifficulty - - posChain, _ := core.GenerateChain(config, chain[len(chain)-1], engine, db, cfg.posBlockCount, blockModifier) - chain = append(chain, posChain...) - } + chain, _ := core.GenerateChain(config, genesis, engine, db, g.cfg.chainLength, g.modifyBlock) // Import the chain. This runs all block validation rules. - blockchain, err := core.NewBlockChain(db, nil, &cfg.genesis, nil, engine, vm.Config{}, nil, nil) + cacheconfig := core.DefaultCacheConfigWithScheme("hash") + cacheconfig.Preimages = true + vmconfig := vm.Config{EnablePreimageRecording: true} + blockchain, err := core.NewBlockChain(db, cacheconfig, g.genesis, nil, engine, vmconfig, nil, nil) if err != nil { return fmt.Errorf("can't create blockchain: %v", err) } defer blockchain.Stop() - // error out if blockchain config is nil -- avoid hanging chain generation - if blockchain.Config() == nil { - return fmt.Errorf("cannot insert chain with nil chain config") - } - if _, err := blockchain.InsertChain(chain); err != nil { - return fmt.Errorf("chain validation error: %v", err) + if i, err := blockchain.InsertChain(chain); err != nil { + return fmt.Errorf("chain validation error (block %d): %v", chain[i].Number(), err) } - headstate, _ := blockchain.State() - dump := headstate.Dump(&state.DumpConfig{}) - // Write out the generated blockchain - if err := writeChain(blockchain, filepath.Join(path, "chain.rlp"), 1, cfg.modifyBlock); err != nil { - return err - } - if err := writeChain(blockchain, filepath.Join(path, "chain_genesis.rlp"), 0, cfg.modifyBlock); err != nil { - return err - } - if err := os.WriteFile(filepath.Join(path, "chain_poststate.json"), dump, 0644); err != nil { - return err - } - return nil + // Write the outputs. + g.blockchain = blockchain + return g.write() } -// ethashDir returns the directory for storing ethash datasets. -func ethashDir() string { - home, err := os.UserHomeDir() - if err != nil { - return "" - } - return filepath.Join(home, ".ethash") +func (g *generator) modifyBlock(i int, gen *core.BlockGen) { + fmt.Println("generating block", gen.Number()) + g.setDifficulty(i, gen) + g.runModifiers(i, gen) } -// writeChain exports the given chain to a file. -func writeChain(chain *core.BlockChain, filename string, start uint64, modifyBlock func(*types.Block) *types.Block) error { - out, err := os.OpenFile(filename, os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0644) - if err != nil { - return err +func (g *generator) setDifficulty(i int, gen *core.BlockGen) { + chaincfg := g.genesis.Config + mergeblock := chaincfg.MergeNetsplitBlock + if mergeblock == nil { + mergeblock = new(big.Int).SetUint64(math.MaxUint64) } - defer out.Close() - lastBlock := chain.CurrentBlock().Number.Uint64() - return exportN(chain, out, start, lastBlock, modifyBlock) -} - -// instaSeal wraps a consensus engine with instant block sealing. When a block is produced -// using FinalizeAndAssemble, it also applies Seal. -type instaSeal struct{ consensus.Engine } - -// FinalizeAndAssemble implements consensus.Engine, accumulating the block and uncle rewards, -// setting the final state and assembling the block. -func (e instaSeal) FinalizeAndAssemble(chain consensus.ChainHeaderReader, header *types.Header, state *state.StateDB, txs []*types.Transaction, uncles []*types.Header, receipts []*types.Receipt, withdrawals []*types.Withdrawal) (*types.Block, error) { - block, err := e.Engine.FinalizeAndAssemble(chain, header, state, txs, uncles, receipts, withdrawals) - if err != nil { - return nil, err + mergecmp := gen.Number().Cmp(mergeblock) + if mergecmp > 0 { + gen.SetPoS() + return } - sealedBlock := make(chan *types.Block, 1) - if err = e.Engine.Seal(nil, block, sealedBlock, nil); err != nil { - return nil, err + + prev := gen.PrevBlock(i - 1) + diff := ethash.CalcDifficulty(g.genesis.Config, gen.Timestamp(), prev.Header()) + if mergecmp == 0 { + gen.SetPoS() + chaincfg.TerminalTotalDifficulty = new(big.Int).Set(g.td) + } else { + g.td = g.td.Add(g.td, diff) + gen.SetDifficulty(diff) } - return <-sealedBlock, nil } -func exportN(bc *core.BlockChain, w io.Writer, first uint64, last uint64, modifyBlock func(*types.Block) *types.Block) error { - fmt.Printf("Exporting batch of blocks, count %v \n", last-first+1) +// runModifiers executes the chain modifiers. +func (g *generator) runModifiers(i int, gen *core.BlockGen) { + if len(g.modlist) == 0 || g.cfg.txInterval == 0 || i%g.cfg.txInterval != 0 { + return + } - start, reported := time.Now(), time.Now() - for nr := first; nr <= last; nr++ { - block := bc.GetBlockByNumber(nr) - if block == nil { - return fmt.Errorf("export failed on #%d: not found", nr) - } - block = modifyBlock(block) - if err := block.EncodeRLP(w); err != nil { - return err - } - if time.Since(reported) >= 8*time.Second { - fmt.Printf("Exporting blocks, exported: %v, elapsed: %v \n", block.NumberU64()-first, common.PrettyDuration(time.Since(start))) - reported = time.Now() + ctx := &genBlockContext{index: i, block: gen, gen: g} + if gen.Number().Uint64() > 0 { + prev := gen.PrevBlock(-1) + ctx.gasLimit = core.CalcGasLimit(prev.GasLimit(), g.genesis.GasLimit) + } + + // Modifier scheduling: we cycle through the available modifiers until enough have + // executed successfully. It also stops when all of them return false from apply() + // because this usually means there is no gas left. + count := 0 + refused := 0 // count of consecutive times apply() returned false + for ; count < g.cfg.txCount && refused < len(g.modlist); g.modOffset++ { + index := g.modOffset % len(g.modlist) + mod := g.modlist[index] + ok := mod.apply(ctx) + if ok { + fmt.Println(" -", mod.name) + count++ + refused = 0 + } else { + refused++ } } - return nil } diff --git a/cmd/hivechain/genesis.go b/cmd/hivechain/genesis.go new file mode 100644 index 0000000000..31750f6a44 --- /dev/null +++ b/cmd/hivechain/genesis.go @@ -0,0 +1,174 @@ +package main + +import ( + "fmt" + "math/big" + "strings" + + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/params" + "golang.org/x/exp/slices" +) + +var initialBalance, _ = new(big.Int).SetString("1000000000000000000000000000000000000", 10) + +const ( + ethashMinimumDifficulty = 131072 + genesisBaseFee = params.InitialBaseFee + blocktimeSec = 10 // hard-coded in core.GenerateChain +) + +// Ethereum mainnet forks in order of introduction. +var ( + allForkNames = append(numberBasedForkNames, timeBasedForkNames...) + lastFork = allForkNames[len(allForkNames)-1] + + numberBasedForkNames = []string{ + "homestead", + "eip150", + "eip155", + "eip158", + "byzantium", + "constantinople", + "petersburg", + "istanbul", + "muirglacier", + "berlin", + "london", + "arrowglacier", + "grayglacier", + "merge", + } + + timeBasedForkNames = []string{ + "shanghai", + "cancun", + "prague", + } +) + +// createChainConfig creates a chain configuration. +func (cfg *generatorConfig) createChainConfig() *params.ChainConfig { + chaincfg := new(params.ChainConfig) + + chainid, _ := new(big.Int).SetString("35039958740849263516136087381459012528369084397061947147216452157383146382873", 10) + chaincfg.ChainID = chainid + chaincfg.Ethash = new(params.EthashConfig) + + // Apply forks. + forks := cfg.forkBlocks() + for fork, b := range forks { + timestamp := cfg.blockTimestamp(b) + + switch fork { + // number-based forks + case "homestead": + chaincfg.HomesteadBlock = new(big.Int).SetUint64(b) + case "eip150": + chaincfg.EIP150Block = new(big.Int).SetUint64(b) + case "eip155": + chaincfg.EIP155Block = new(big.Int).SetUint64(b) + case "eip158": + chaincfg.EIP158Block = new(big.Int).SetUint64(b) + case "byzantium": + chaincfg.ByzantiumBlock = new(big.Int).SetUint64(b) + case "constantinople": + chaincfg.ConstantinopleBlock = new(big.Int).SetUint64(b) + case "petersburg": + chaincfg.PetersburgBlock = new(big.Int).SetUint64(b) + case "istanbul": + chaincfg.IstanbulBlock = new(big.Int).SetUint64(b) + case "muirglacier": + chaincfg.MuirGlacierBlock = new(big.Int).SetUint64(b) + case "berlin": + chaincfg.BerlinBlock = new(big.Int).SetUint64(b) + case "london": + chaincfg.LondonBlock = new(big.Int).SetUint64(b) + case "arrowglacier": + chaincfg.ArrowGlacierBlock = new(big.Int).SetUint64(b) + case "grayglacier": + chaincfg.GrayGlacierBlock = new(big.Int).SetUint64(b) + case "merge": + chaincfg.MergeNetsplitBlock = new(big.Int).SetUint64(b) + // time-based forks + case "shanghai": + chaincfg.ShanghaiTime = ×tamp + case "cancun": + chaincfg.CancunTime = ×tamp + case "prague": + chaincfg.PragueTime = ×tamp + } + } + + // Special case for merged-from-genesis networks. + // Need to assign TTD here because the genesis block won't be processed by GenerateChain. + if chaincfg.MergeNetsplitBlock != nil && chaincfg.MergeNetsplitBlock.Sign() == 0 { + chaincfg.TerminalTotalDifficulty = big.NewInt(ethashMinimumDifficulty) + } + + return chaincfg +} + +// createGenesis creates the genesis block and config. +func (cfg *generatorConfig) createGenesis() *core.Genesis { + var g core.Genesis + g.Config = cfg.createChainConfig() + + // Block attributes. + g.Difficulty = big.NewInt(ethashMinimumDifficulty) + g.ExtraData = []byte("hivechain") + g.GasLimit = params.GenesisGasLimit * 8 + zero := new(big.Int) + if g.Config.IsLondon(zero) { + g.BaseFee = big.NewInt(genesisBaseFee) + } + + // Initialize allocation. + // Here we add balance to the known accounts. + g.Alloc = make(core.GenesisAlloc) + for _, acc := range knownAccounts { + g.Alloc[acc.addr] = core.GenesisAccount{Balance: initialBalance} + } + + // Also deploy the beacon chain deposit contract. + // dca := common.HexToAddress(depositContractAddr) + // dcc := hexutil.MustDecode("0x" + depositCode) + // g.Alloc[dca] = core.GenesisAccount{Code: dcc} + + return &g +} + +// forkBlocks computes the block numbers where forks occur. Forks get enabled based on the +// forkInterval. If the total number of requested blocks (chainLength) is lower than +// necessary, the remaining forks activate on the last chain block. +func (cfg *generatorConfig) forkBlocks() map[string]uint64 { + lastIndex := cfg.lastForkIndex() + forks := allForkNames[:lastIndex+1] + forkBlocks := make(map[string]uint64) + for block := 0; block <= cfg.chainLength && len(forks) > 0; { + fork := forks[0] + forks = forks[1:] + forkBlocks[fork] = uint64(block) + block += cfg.forkInterval + } + for _, f := range forks { + forkBlocks[f] = uint64(cfg.chainLength) + } + return forkBlocks +} + +// lastForkIndex returns the index of the latest enabled for in allForkNames. +func (cfg *generatorConfig) lastForkIndex() int { + if cfg.lastFork == "" { + return len(allForkNames) - 1 + } + index := slices.Index(allForkNames, strings.ToLower(cfg.lastFork)) + if index == -1 { + panic(fmt.Sprintf("unknown lastFork name %q", cfg.lastFork)) + } + return index +} + +func (cfg *generatorConfig) blockTimestamp(num uint64) uint64 { + return num * blocktimeSec +} diff --git a/cmd/hivechain/genlogs.evm b/cmd/hivechain/genlogs.evm deleted file mode 100644 index 0641c6a0ac..0000000000 --- a/cmd/hivechain/genlogs.evm +++ /dev/null @@ -1,42 +0,0 @@ -;;; -*- mode: asm -*- -;;; creates random logs until less than 10k gas remaining. - - ;; initialize random generator: - ;; block number at offset 0, counter at 32 - number - push 0 - mstore - push 0 - push 32 - mstore - -genlogs: - push @genlogs_emit - jump @random -genlogs_emit: - push 32 - push 32 - log1 - ;; enough gas left? loop! - gas - push 10000 - lt - jumpi @genlogs - stop - -;;; ( rdest -- x ) creates random numbers based on block number -random: - ;; increment - push 32 - mload - push 1 - add - push 32 - mstore - ;; compute - push 64 - push 0 - sha3 - ;; return to caller - swap1 - jump diff --git a/cmd/hivechain/genstorage.evm b/cmd/hivechain/genstorage.evm deleted file mode 100644 index 77d0290db4..0000000000 --- a/cmd/hivechain/genstorage.evm +++ /dev/null @@ -1,16 +0,0 @@ -;;; -*- mode: asm -*- -;;; creates storage slots until less than 25k gas remaining. - - number -genstorage: - dup1 - dup1 - sstore - push 1 - add - ;; enough gas left? loop! - gas - push 25000 - lt - jumpi @genstorage - stop diff --git a/cmd/hivechain/main.go b/cmd/hivechain/main.go index e1c109f622..2d9d373b73 100644 --- a/cmd/hivechain/main.go +++ b/cmd/hivechain/main.go @@ -24,34 +24,75 @@ import ( "fmt" "io" "os" + "strings" "github.com/ethereum/go-ethereum/core/types" ethlog "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/rlp" ) -const usage = "Usage: hivechain generate|print|print-genesis|trim [ options ] ..." - func main() { // Initialize go-ethereum logging. // This is mostly for displaying the DAG generator progress. handler := ethlog.StreamHandler(os.Stderr, ethlog.TerminalFormat(false)) - ethlog.Root().SetHandler(ethlog.LvlFilterHandler(ethlog.LvlInfo, handler)) + ethlog.Root().SetHandler(ethlog.LvlFilterHandler(ethlog.LvlWarn, handler)) + + flag.Usage = usage if len(os.Args) < 2 { - fatalf(usage) + flag.Usage() + os.Exit(1) } switch os.Args[1] { case "generate": generateCommand(os.Args[2:]) case "print": printCommand(os.Args[2:]) - case "print-genesis": - printGenesisCommand(os.Args[2:]) - case "trim": - trimCommand(os.Args[2:]) default: - fatalf(usage) + flag.Usage() + os.Exit(1) + } +} + +// generateCommand generates a test chain. +func generateCommand(args []string) { + var ( + cfg generatorConfig + outlist = flag.String("outputs", "", "Enabled output modules") + ) + flag.IntVar(&cfg.chainLength, "length", 2, "The length of the pow chain to generate") + flag.IntVar(&cfg.txInterval, "tx-interval", 10, "Add transactions to chain every n blocks") + flag.IntVar(&cfg.txCount, "tx-count", 1, "Maximum number of txs per block") + flag.IntVar(&cfg.forkInterval, "fork-interval", 0, "Number of blocks between fork activations") + flag.StringVar(&cfg.outputDir, "outdir", ".", "Destination directory") + flag.StringVar(&cfg.lastFork, "lastfork", "", "Name of the last fork to activate") + flag.CommandLine.Parse(args) + + if *outlist != "" { + if *outlist == "all" { + cfg.outputs = outputFunctionNames() + } + cfg.outputs = splitAndTrim(*outlist) + } + + cfg, err := cfg.withDefaults() + if err != nil { + panic(err) + } + g := newGenerator(cfg) + if err := g.run(); err != nil { + fatal(err) + } +} + +func usage() { + o := flag.CommandLine.Output() + fmt.Fprintln(o, "Usage: hivechain generate|print [options...]") + flag.PrintDefaults() + fmt.Fprintln(o, "") + fmt.Fprintln(o, "List of available -outputs:") + for _, name := range outputFunctionNames() { + fmt.Fprintln(o, " ", name) } } @@ -89,97 +130,15 @@ func printCommand(args []string) { } } -// printGenesisCommand displays the genesis post-state. -func printGenesisCommand(args []string) { - flag.CommandLine.Parse(args) - if flag.NArg() != 1 { - fatalf("Usage: hivechain print-genesis ") - } - - gspec, err := loadGenesis(flag.Arg(0)) - if err != nil { - fatal(err) - } - block := gspec.ToBlock() - js, _ := json.MarshalIndent(block.Header(), "", " ") - fmt.Println(string(js)) -} - -// trimCommand exports a subset of chain.rlp to a new file. -func trimCommand(args []string) { - var ( - from = flag.Uint("from", 0, "Start of block range to output") - to = flag.Uint("to", 0, "End of block range to output (0 = all blocks)") - ) - flag.CommandLine.Parse(args) - if flag.NArg() != 2 { - fatalf("Usage: hivechain trim [ options ] ") - } - if *to > 0 && *to <= *from { - fatalf("-to must be greater than -from") - } - - input, err := os.Open(flag.Arg(0)) - if err != nil { - fatal(err) - } - defer input.Close() - - output, err := os.OpenFile(flag.Arg(1), os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0644) - if err != nil { - fatal(err) - } - defer output.Close() - - s := rlp.NewStream(bufio.NewReader(input), 0) - written := 0 - for i := uint(0); ; i++ { - data, err := s.Raw() - if err == io.EOF { - break - } else if err != nil { - fatalf("block %d: %v", i, err) - } - if i >= *from { - if *to != 0 && i >= *to { - break - } - output.Write(data) - written++ +func splitAndTrim(s string) []string { + var list []string + for _, s := range strings.Split(s, ",") { + s = strings.TrimSpace(s) + if s != "" { + list = append(list, s) } } - fmt.Println(written, "blocks written to", flag.Arg(1)) -} - -// generateCommand generates a test chain. -func generateCommand(args []string) { - var ( - cfg generatorConfig - genesis = flag.String("genesis", "", "The path and filename to the source genesis.json") - outdir = flag.String("output", ".", "Chain destination folder") - pos = flag.Bool("pos", false, "Enables PoS chain") - ) - flag.IntVar(&cfg.blockCount, "length", 2, "The length of the pow chain to generate") - flag.IntVar(&cfg.posBlockCount, "poslength", 2, "The length of the pos chain to generate") - flag.IntVar(&cfg.blockTimeSec, "blocktime", 30, "The desired block time in seconds") - flag.IntVar(&cfg.txInterval, "tx-interval", 10, "Add transactions to chain every n blocks") - flag.IntVar(&cfg.txCount, "tx-count", 1, "Maximum number of txs per block") - flag.CommandLine.Parse(args) - - if *genesis == "" { - fatalf("Missing -genesis option, please supply a genesis.json file.") - } - cfg.isPoS = *pos - - gspec, err := loadGenesis(*genesis) - if err != nil { - fatal(err) - } - cfg.genesis = *gspec - - if err := cfg.writeTestChain(*outdir); err != nil { - fatal(err) - } + return list } func fatalf(format string, args ...interface{}) { diff --git a/cmd/hivechain/mod.go b/cmd/hivechain/mod.go new file mode 100644 index 0000000000..cfc8b7d16e --- /dev/null +++ b/cmd/hivechain/mod.go @@ -0,0 +1,113 @@ +package main + +import ( + "math/big" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/params" +) + +type blockModifier interface { + apply(*genBlockContext) bool + txInfo() any +} + +var modRegistry = make(map[string]func() blockModifier) + +// register adds a block modifier. +func register(name string, new func() blockModifier) { + modRegistry[name] = new +} + +type genBlockContext struct { + index int + block *core.BlockGen + gen *generator + + gasLimit uint64 + txCount int +} + +// Number returns the block number. +func (ctx *genBlockContext) Number() *big.Int { + return ctx.block.Number() +} + +// NumberU64 returns the block number. +func (ctx *genBlockContext) NumberU64() uint64 { + return ctx.block.Number().Uint64() +} + +// Timestamp returns the block timestamp. +func (ctx *genBlockContext) Timestamp() uint64 { + return ctx.block.Timestamp() +} + +// HasGas reports whether the block still has more than the given amount of gas left. +func (ctx *genBlockContext) HasGas(gas uint64) bool { + return ctx.gasLimit > gas +} + +// AddNewTx adds a transaction into the block. +func (ctx *genBlockContext) AddNewTx(sender *genAccount, data types.TxData) *types.Transaction { + tx, err := types.SignNewTx(sender.key, ctx.Signer(), data) + if err != nil { + panic(err) + } + if ctx.gasLimit < tx.Gas() { + panic("not enough gas for tx") + } + ctx.block.AddTx(tx) + ctx.gasLimit -= tx.Gas() + return tx +} + +// TxSenderAccount chooses an account to send transactions from. +func (ctx *genBlockContext) TxSenderAccount() *genAccount { + a := ctx.gen.accounts[0] + return &a +} + +// TxCreateIntrinsicGas gives the 'intrinsic gas' of a contract creation transaction. +func (ctx *genBlockContext) TxCreateIntrinsicGas(data []byte) uint64 { + genesis := ctx.gen.genesis + isHomestead := genesis.Config.IsHomestead(ctx.block.Number()) + isEIP2028 := genesis.Config.IsIstanbul(ctx.block.Number()) + isEIP3860 := genesis.Config.IsShanghai(ctx.block.Number(), ctx.block.Timestamp()) + igas, err := core.IntrinsicGas(data, nil, true, isHomestead, isEIP2028, isEIP3860) + if err != nil { + panic(err) + } + return igas +} + +// TxGasFeeCap returns the minimum gasprice that should be used for transactions. +func (ctx *genBlockContext) TxGasFeeCap() *big.Int { + fee := big.NewInt(1) + if !ctx.ChainConfig().IsLondon(ctx.block.Number()) { + return fee + } + return fee.Add(fee, ctx.block.BaseFee()) +} + +// AccountNonce returns the current nonce of an address. +func (ctx *genBlockContext) AccountNonce(addr common.Address) uint64 { + return ctx.block.TxNonce(addr) +} + +// Signer returns a signer for the current block. +func (ctx *genBlockContext) Signer() types.Signer { + return types.MakeSigner(ctx.ChainConfig(), ctx.block.Number(), ctx.block.Timestamp()) +} + +// ChainConfig returns the chain config. +func (ctx *genBlockContext) ChainConfig() *params.ChainConfig { + return ctx.gen.genesis.Config +} + +// ParentBlock returns the parent of the current block. +func (ctx *genBlockContext) ParentBlock() *types.Block { + return ctx.block.PrevBlock(ctx.index - 1) +} diff --git a/cmd/hivechain/mod_deploy.go b/cmd/hivechain/mod_deploy.go new file mode 100644 index 0000000000..b11b84951a --- /dev/null +++ b/cmd/hivechain/mod_deploy.go @@ -0,0 +1,59 @@ +package main + +import ( + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" +) + +func init() { + register("deploy-callme", func() blockModifier { + return &modDeploy{code: callmeCode} + }) + register("deploy-callenv", func() blockModifier { + return &modDeploy{code: callenvCode} + }) +} + +type modDeploy struct { + code []byte + info *deployTxInfo +} + +type deployTxInfo struct { + Contract common.Address `json:"contract"` + Block hexutil.Uint64 `json:"block"` +} + +func (m *modDeploy) apply(ctx *genBlockContext) bool { + if m.info != nil { + return false // already deployed + } + + var code []byte + code = append(code, deployerCode...) + code = append(code, m.code...) + gas := ctx.TxCreateIntrinsicGas(code) + 10000 + if !ctx.HasGas(gas) { + return false + } + + sender := ctx.TxSenderAccount() + nonce := ctx.AccountNonce(sender.addr) + ctx.AddNewTx(sender, &types.LegacyTx{ + Nonce: nonce, + Gas: gas, + GasPrice: ctx.TxGasFeeCap(), + Data: code, + }) + m.info = &deployTxInfo{ + Contract: crypto.CreateAddress(sender.addr, nonce), + Block: hexutil.Uint64(ctx.block.Number().Uint64()), + } + return true +} + +func (m *modDeploy) txInfo() any { + return m.info +} diff --git a/cmd/hivechain/mod_randtx.go b/cmd/hivechain/mod_randtx.go new file mode 100644 index 0000000000..3e91942aff --- /dev/null +++ b/cmd/hivechain/mod_randtx.go @@ -0,0 +1,52 @@ +package main + +import ( + "github.com/ethereum/go-ethereum/core/types" +) + +func init() { + register("randomlogs", func() blockModifier { + return &modCreateTx{ + code: genlogsCode, + gas: 20000, + } + }) + register("randomcode", func() blockModifier { + return &modCreateTx{ + code: gencodeCode, + gas: 30000, + } + }) + register("randomstorage", func() blockModifier { + return &modCreateTx{ + code: genstorageCode, + gas: 80000, + } + }) +} + +type modCreateTx struct { + code []byte + gas uint64 +} + +func (m *modCreateTx) apply(ctx *genBlockContext) bool { + gas := ctx.TxCreateIntrinsicGas(m.code) + m.gas + if !ctx.HasGas(gas) { + return false + } + + sender := ctx.TxSenderAccount() + txdata := &types.LegacyTx{ + Nonce: ctx.AccountNonce(sender.addr), + Gas: gas, + GasPrice: ctx.TxGasFeeCap(), + Data: m.code, + } + ctx.AddNewTx(sender, txdata) + return true +} + +func (m *modCreateTx) txInfo() any { + return nil +} diff --git a/cmd/hivechain/mod_uncles.go b/cmd/hivechain/mod_uncles.go new file mode 100644 index 0000000000..20c23afba2 --- /dev/null +++ b/cmd/hivechain/mod_uncles.go @@ -0,0 +1,58 @@ +package main + +import ( + "fmt" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/trie" +) + +func init() { + register("uncles", func() blockModifier { + return &modUncles{ + info: make(map[uint64]unclesInfo), + } + }) +} + +type modUncles struct { + info map[uint64]unclesInfo + counter int +} + +type unclesInfo struct { + Hashes []common.Hash `json:"hashes"` +} + +func (m *modUncles) apply(ctx *genBlockContext) bool { + merge := ctx.ChainConfig().MergeNetsplitBlock + if merge != nil && merge.Cmp(ctx.Number()) <= 0 { + return false // no uncles after merge + } + if ctx.NumberU64() < 3 { + return false + } + info := m.info[ctx.NumberU64()] + if len(info.Hashes) >= 2 { + return false + } + + parent := ctx.ParentBlock() + uncle := &types.Header{ + Number: parent.Number(), + ParentHash: parent.ParentHash(), + Extra: []byte(fmt.Sprintf("hivechain uncle %d", m.counter)), + } + ub := types.NewBlock(uncle, nil, nil, nil, trie.NewStackTrie(nil)) + uncle = ub.Header() + ctx.block.AddUncle(uncle) + info.Hashes = append(info.Hashes, uncle.Hash()) + m.info[ctx.NumberU64()] = info + m.counter++ + return true +} + +func (m *modUncles) txInfo() any { + return m.info +} diff --git a/cmd/hivechain/mod_valuetransfer.go b/cmd/hivechain/mod_valuetransfer.go new file mode 100644 index 0000000000..0597ecbb49 --- /dev/null +++ b/cmd/hivechain/mod_valuetransfer.go @@ -0,0 +1,85 @@ +package main + +import ( + "crypto/sha256" + "math/big" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/params" +) + +func init() { + register("valuetransfer", func() blockModifier { + return &modValueTransfer{} + }) +} + +type modValueTransfer struct { + counter int + txs []valueTransferInfo +} + +type valueTransferInfo struct { + Block hexutil.Uint64 `json:"block"` + Sender common.Address `json:"sender"` + Tx *types.Transaction `json:"tx"` +} + +func (m *modValueTransfer) apply(ctx *genBlockContext) bool { + if !ctx.HasGas(params.TxGas) { + return false + } + + sender := ctx.TxSenderAccount() + var txdata types.TxData + for txdata == nil { + switch m.counter % 2 { + case 0: + // legacy tx + r := randomRecipient(ctx.Number()) + txdata = &types.LegacyTx{ + Nonce: ctx.AccountNonce(sender.addr), + Gas: params.TxGas, + GasPrice: ctx.TxGasFeeCap(), + To: &r, + Value: big.NewInt(1), + } + case 1: + // EIP1559 tx + if !ctx.ChainConfig().IsLondon(ctx.Number()) { + m.counter++ + continue + } + r := randomRecipient(ctx.Number()) + txdata = &types.DynamicFeeTx{ + Nonce: ctx.AccountNonce(sender.addr), + Gas: params.TxGas, + GasFeeCap: ctx.TxGasFeeCap(), + GasTipCap: big.NewInt(1), + To: &r, + Value: big.NewInt(1), + } + } + } + + tx := ctx.AddNewTx(sender, txdata) + m.counter++ + m.txs = append(m.txs, valueTransferInfo{ + Block: hexutil.Uint64(ctx.NumberU64()), + Sender: sender.addr, + Tx: tx, + }) + return true +} + +func (m *modValueTransfer) txInfo() any { + return m.txs +} + +func randomRecipient(blocknum *big.Int) (a common.Address) { + h := sha256.Sum256(blocknum.Bytes()) + a.SetBytes(h[:20]) + return a +} diff --git a/cmd/hivechain/mod_withdrawals.go b/cmd/hivechain/mod_withdrawals.go new file mode 100644 index 0000000000..1154543020 --- /dev/null +++ b/cmd/hivechain/mod_withdrawals.go @@ -0,0 +1,45 @@ +package main + +import ( + "github.com/ethereum/go-ethereum/core/types" +) + +func init() { + register("withdrawals", func() blockModifier { + return &modWithdrawals{ + info: make(map[uint64]withdrawalsInfo), + } + }) +} + +type modWithdrawals struct { + info map[uint64]withdrawalsInfo +} + +type withdrawalsInfo struct { + Withdrawals []*types.Withdrawal `json:"withdrawals"` +} + +func (m *modWithdrawals) apply(ctx *genBlockContext) bool { + if !ctx.ChainConfig().IsShanghai(ctx.Number(), ctx.Timestamp()) { + return false + } + info := m.info[ctx.NumberU64()] + if len(info.Withdrawals) >= 2 { + return false + } + + w := types.Withdrawal{ + Validator: 5, + Address: randomRecipient(ctx.Number()), + Amount: 100, + } + w.Index = ctx.block.AddWithdrawal(&w) + info.Withdrawals = append(info.Withdrawals, &w) + m.info[ctx.NumberU64()] = info + return true +} + +func (m *modWithdrawals) txInfo() any { + return m.info +} diff --git a/cmd/hivechain/output.go b/cmd/hivechain/output.go new file mode 100644 index 0000000000..931f35b7bb --- /dev/null +++ b/cmd/hivechain/output.go @@ -0,0 +1,164 @@ +package main + +import ( + "encoding/json" + "fmt" + "io" + "os" + "path/filepath" + "sort" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/state" + "golang.org/x/exp/maps" +) + +var outputFunctions = map[string]func(*generator) error{ + "genesis": (*generator).writeGenesis, + "chain": (*generator).writeChain, + "powchain": (*generator).writePoWChain, + "headstate": (*generator).writeState, + "headblock": (*generator).writeHeadBlock, + "accounts": (*generator).writeAccounts, + "txinfo": (*generator).writeTxInfo, + "headfcu": (*generator).writeEngineHeadFcU, + "fcu": (*generator).writeEngineFcU, + "newpayload": (*generator).writeEngineNewPayload, +} + +func outputFunctionNames() []string { + names := maps.Keys(outputFunctions) + sort.Strings(names) + return names +} + +// write creates the generator output files. +func (g *generator) write() error { + var wf []func(*generator) error + for _, name := range g.cfg.outputs { + fmt.Println("writing", name) + f := outputFunctions[name] + if f == nil { + return fmt.Errorf("unknown output %q", name) + } + wf = append(wf, f) + } + for _, f := range wf { + if err := f(g); err != nil { + return err + } + } + return nil +} + +func (g *generator) openOutputFile(file string) (*os.File, error) { + path := filepath.Join(g.cfg.outputDir, file) + return os.OpenFile(path, os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0644) +} + +func (g *generator) writeJSON(name string, obj any) error { + jsonData, err := json.MarshalIndent(obj, "", " ") + if err != nil { + return err + } + out, err := g.openOutputFile(name) + if err != nil { + return err + } + defer out.Close() + _, err = out.Write(jsonData) + return err +} + +// writeGenesis writes the genesis.json file. +func (g *generator) writeGenesis() error { + return g.writeJSON("genesis.json", g.genesis) +} + +// writeAccounts writes the account keys file. +func (g *generator) writeAccounts() error { + type accountObj struct { + Key string `json:"key"` + } + m := make(map[common.Address]*accountObj, len(g.accounts)) + for _, a := range g.accounts { + m[a.addr] = &accountObj{ + Key: hexutil.Encode(a.key.D.Bytes()), + } + } + return g.writeJSON("accounts.json", &m) +} + +// writeState writes the chain state dump. +func (g *generator) writeState() error { + headstate, err := g.blockchain.State() + if err != nil { + return err + } + dump := headstate.RawDump(&state.DumpConfig{}) + return g.writeJSON("headstate.json", &dump) +} + +// writeHeadBlock writes information about the head block. +func (g *generator) writeHeadBlock() error { + return g.writeJSON("headblock.json", g.blockchain.CurrentHeader()) +} + +// writeChain writes all RLP blocks to a file. +func (g *generator) writeChain() error { + path := filepath.Join(g.cfg.outputDir, "chain.rlp") + out, err := os.OpenFile(path, os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0644) + if err != nil { + return err + } + defer out.Close() + lastBlock := g.blockchain.CurrentBlock().Number.Uint64() + return exportN(g.blockchain, out, 0, lastBlock) +} + +// writePoWChain writes pre-merge RLP blocks to a file. +func (g *generator) writePoWChain() error { + path := filepath.Join(g.cfg.outputDir, "powchain.rlp") + out, err := os.OpenFile(path, os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0644) + if err != nil { + return err + } + defer out.Close() + lastBlock, ok := g.mergeBlock() + if !ok { + lastBlock = g.blockchain.CurrentBlock().Number.Uint64() + } + return exportN(g.blockchain, out, 0, lastBlock) +} + +func (g *generator) mergeBlock() (uint64, bool) { + merge := g.genesis.Config.MergeNetsplitBlock + if merge != nil { + return merge.Uint64(), true + } + return 0, false +} + +func exportN(bc *core.BlockChain, w io.Writer, first uint64, last uint64) error { + for nr := first; nr <= last; nr++ { + block := bc.GetBlockByNumber(nr) + if block == nil { + return fmt.Errorf("export failed on #%d: not found", nr) + } + if err := block.EncodeRLP(w); err != nil { + return err + } + } + return nil +} + +// writeTxInfo writes information about the transactions that were added into the chain. +func (g *generator) writeTxInfo() error { + m := make(map[string]any, len(g.modlist)) + for _, inst := range g.modlist { + m[inst.name] = inst.txInfo() + } + return g.writeJSON("txinfo.json", &m) +} diff --git a/cmd/hivechain/output_engine.go b/cmd/hivechain/output_engine.go new file mode 100644 index 0000000000..ec124fdc49 --- /dev/null +++ b/cmd/hivechain/output_engine.go @@ -0,0 +1,125 @@ +package main + +import ( + "fmt" + + "github.com/ethereum/go-ethereum/beacon/engine" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" +) + +// writeEngineNewPayload writes engine API newPayload requests for the chain. +// Note this only works for post-merge blocks. +func (g *generator) writeEngineNewPayload() error { + list := make([]*rpcRequest, 0) + start, ok := g.mergeBlock() + if ok { + last := g.blockchain.CurrentBlock().Number.Uint64() + for num := start; num <= last; num++ { + b := g.blockchain.GetBlockByNumber(num) + list = append(list, g.block2newpayload(b)) + } + } + return g.writeJSON("newpayload.json", list) +} + +// writeEngineFcU writes engine API forkchoiceUpdated requests for the chain. +// Note this only works for post-merge blocks. +func (g *generator) writeEngineFcU() error { + list := make([]*rpcRequest, 0) + start, ok := g.mergeBlock() + if ok { + last := g.blockchain.CurrentBlock().Number.Uint64() + for num := start; num <= last; num++ { + b := g.blockchain.GetBlockByNumber(num) + list = append(list, g.block2fcu(b)) + } + } + return g.writeJSON("fcu.json", list) +} + +// writeEngineHeadFcU writes an engine API forkchoiceUpdated request for the head block. +func (g *generator) writeEngineHeadFcU() error { + h := g.blockchain.CurrentBlock() + b := g.blockchain.GetBlock(h.Hash(), h.Number.Uint64()) + fcu := g.block2fcu(b) + return g.writeJSON("headfcu.json", fcu) +} + +func (g *generator) block2newpayload(b *types.Block) *rpcRequest { + ed := engine.ExecutableData{ + ParentHash: b.ParentHash(), + FeeRecipient: b.Coinbase(), + StateRoot: b.Root(), + ReceiptsRoot: b.ReceiptHash(), + LogsBloom: b.Bloom().Bytes(), + Random: b.MixDigest(), + Number: b.NumberU64(), + GasLimit: b.GasLimit(), + GasUsed: b.GasUsed(), + Timestamp: b.Time(), + ExtraData: b.Extra(), + BaseFeePerGas: b.BaseFee(), + BlockHash: b.Hash(), + Transactions: [][]byte{}, + Withdrawals: b.Withdrawals(), + BlobGasUsed: b.BlobGasUsed(), + ExcessBlobGas: b.ExcessBlobGas(), + } + var blobHashes = make([]common.Hash, 0) + for _, tx := range b.Transactions() { + // Fill in transactions list. + bin, err := tx.MarshalBinary() + if err != nil { + panic(err) + } + ed.Transactions = append(ed.Transactions, bin) + + // Collect blob hashes for post-Cancun blocks. + for _, bh := range tx.BlobHashes() { + blobHashes = append(blobHashes, bh) + } + } + + var method string + var params = []any{ed} + cfg := g.genesis.Config + switch { + case cfg.IsCancun(b.Number(), b.Time()): + method = "engine_newPayloadV3" + params = append(params, blobHashes, b.BeaconRoot()) + case cfg.IsShanghai(b.Number(), b.Time()): + method = "engine_newPayloadV2" + default: + method = "engine_newPayloadV1" + } + id := fmt.Sprintf("np%d", b.NumberU64()) + return &rpcRequest{JsonRPC: "2.0", ID: id, Method: method, Params: params} +} + +func (g *generator) block2fcu(b *types.Block) *rpcRequest { + fc := engine.ForkchoiceStateV1{ + HeadBlockHash: b.Hash(), + SafeBlockHash: b.Hash(), + FinalizedBlockHash: b.Hash(), + } + var method string + cfg := g.genesis.Config + switch { + case cfg.IsCancun(b.Number(), b.Time()): + method = "engine_forkchoiceUpdatedV3" + case cfg.IsShanghai(b.Number(), b.Time()): + method = "engine_forkchoiceUpdatedV2" + default: + method = "engine_forkchoiceUpdatedV1" + } + id := fmt.Sprintf("fcu%d", b.NumberU64()) + return &rpcRequest{JsonRPC: "2.0", ID: id, Method: method, Params: []any{&fc, nil}} +} + +type rpcRequest struct { + JsonRPC string `json:"jsonrpc"` + ID string `json:"id"` + Method string `json:"method"` + Params []any `json:"params"` +} From d252d81aded011620e84298bc2b3a81b47c765fc Mon Sep 17 00:00:00 2001 From: Mario Vega Date: Thu, 19 Oct 2023 16:56:33 -0600 Subject: [PATCH 067/387] simulators/ethereum/engine,pyspec: Update Trusted Setup (#915) * simulators/ethereum/engine: Update geth branch, use mainnet trusted setup * simulators/ethereum: go.work.sum * simulators/ethereum/pyspec: Update geth branch * configs/cancun: Update geth to devnet-10 * simulators/ethereum/engine: Send different blobs depending on the sender --- configs/cancun.yaml | 2 +- simulators/ethereum/engine/devp2p/conn.go | 28 +- simulators/ethereum/engine/go.mod | 33 +- simulators/ethereum/engine/go.sum | 70 +- simulators/ethereum/engine/helper/blobs.go | 15 +- .../ethereum/engine/helper/trusted_setup.json | 4167 +++++++++++++++++ simulators/ethereum/engine/helper/tx.go | 5 +- .../ethereum/engine/suites/cancun/steps.go | 4 +- simulators/ethereum/go.work.sum | 40 + simulators/ethereum/pyspec/go.mod | 27 +- simulators/ethereum/pyspec/go.sum | 63 +- 11 files changed, 4343 insertions(+), 111 deletions(-) create mode 100644 simulators/ethereum/engine/helper/trusted_setup.json diff --git a/configs/cancun.yaml b/configs/cancun.yaml index 16eb785fe0..e0c383b558 100644 --- a/configs/cancun.yaml +++ b/configs/cancun.yaml @@ -23,7 +23,7 @@ dockerfile: git build_args: github: lightclient/go-ethereum - tag: devnet-9 + tag: devnet-10 - client: nethermind nametag: cancun-git diff --git a/simulators/ethereum/engine/devp2p/conn.go b/simulators/ethereum/engine/devp2p/conn.go index 41a9ab9d5b..2786499329 100644 --- a/simulators/ethereum/engine/devp2p/conn.go +++ b/simulators/ethereum/engine/devp2p/conn.go @@ -103,24 +103,24 @@ func (msg Transactions) Code() int { return 18 } func (msg Transactions) ReqID() uint64 { return 18 } // GetBlockHeaders represents a block header query. -type GetBlockHeaders eth.GetBlockHeadersPacket66 +type GetBlockHeaders eth.GetBlockHeadersPacket func (msg GetBlockHeaders) Code() int { return 19 } func (msg GetBlockHeaders) ReqID() uint64 { return msg.RequestId } -type BlockHeaders eth.BlockHeadersPacket66 +type BlockHeaders eth.BlockHeadersPacket func (msg BlockHeaders) Code() int { return 20 } func (msg BlockHeaders) ReqID() uint64 { return msg.RequestId } // GetBlockBodies represents a GetBlockBodies request -type GetBlockBodies eth.GetBlockBodiesPacket66 +type GetBlockBodies eth.GetBlockBodiesPacket func (msg GetBlockBodies) Code() int { return 21 } func (msg GetBlockBodies) ReqID() uint64 { return msg.RequestId } // BlockBodies is the network packet for block content distribution. -type BlockBodies eth.BlockBodiesPacket66 +type BlockBodies eth.BlockBodiesPacket func (msg BlockBodies) Code() int { return 22 } func (msg BlockBodies) ReqID() uint64 { return msg.RequestId } @@ -132,7 +132,7 @@ func (msg NewBlock) Code() int { return 23 } func (msg NewBlock) ReqID() uint64 { return 0 } // NewPooledTransactionHashes66 is the network packet for the tx hash propagation message. -type NewPooledTransactionHashes66 eth.NewPooledTransactionHashesPacket66 +type NewPooledTransactionHashes66 eth.NewPooledTransactionHashesPacket67 func (msg NewPooledTransactionHashes66) Code() int { return 24 } func (msg NewPooledTransactionHashes66) ReqID() uint64 { return 0 } @@ -143,7 +143,7 @@ type NewPooledTransactionHashes eth.NewPooledTransactionHashesPacket68 func (msg NewPooledTransactionHashes) Code() int { return 24 } func (msg NewPooledTransactionHashes) ReqID() uint64 { return 0 } -type GetPooledTransactions eth.GetPooledTransactionsPacket66 +type GetPooledTransactions eth.GetPooledTransactionsPacket func (msg GetPooledTransactions) Code() int { return 25 } func (msg GetPooledTransactions) ReqID() uint64 { return msg.RequestId } @@ -200,25 +200,25 @@ func (c *Conn) Read() (Message, error) { case (Status{}).Code(): msg = new(Status) case (GetBlockHeaders{}).Code(): - ethMsg := new(eth.GetBlockHeadersPacket66) + ethMsg := new(eth.GetBlockHeadersPacket) if err := rlp.DecodeBytes(rawData, ethMsg); err != nil { return nil, errorf("could not rlp decode message: %v, %x", err, rawData) } return (*GetBlockHeaders)(ethMsg), nil case (BlockHeaders{}).Code(): - ethMsg := new(eth.BlockHeadersPacket66) + ethMsg := new(eth.BlockHeadersPacket) if err := rlp.DecodeBytes(rawData, ethMsg); err != nil { return nil, errorf("could not rlp decode message: %v, %x", err, rawData) } return (*BlockHeaders)(ethMsg), nil case (GetBlockBodies{}).Code(): - ethMsg := new(eth.GetBlockBodiesPacket66) + ethMsg := new(eth.GetBlockBodiesPacket) if err := rlp.DecodeBytes(rawData, ethMsg); err != nil { return nil, errorf("could not rlp decode message: %v, %x", err, rawData) } return (*GetBlockBodies)(ethMsg), nil case (BlockBodies{}).Code(): - ethMsg := new(eth.BlockBodiesPacket66) + ethMsg := new(eth.BlockBodiesPacket) if err := rlp.DecodeBytes(rawData, ethMsg); err != nil { return nil, errorf("could not rlp decode message: %v, %x", err, rawData) } @@ -237,7 +237,7 @@ func (c *Conn) Read() (Message, error) { } msg = new(NewPooledTransactionHashes66) case (GetPooledTransactions{}.Code()): - ethMsg := new(eth.GetPooledTransactionsPacket66) + ethMsg := new(eth.GetPooledTransactionsPacket) if err := rlp.DecodeBytes(rawData, ethMsg); err != nil { return nil, errorf("could not rlp decode message: %v, %x", err, rawData) } @@ -422,8 +422,8 @@ func (c *Conn) readAndServe(timeout time.Duration) (Message, error) { return nil, errorf("could not get headers for inbound header request: %v", err) } resp := &BlockHeaders{ - RequestId: msg.ReqID(), - BlockHeadersPacket: eth.BlockHeadersPacket(headers), + RequestId: msg.ReqID(), + BlockHeadersRequest: eth.BlockHeadersRequest(headers), } if _, err := c.Write(resp); err != nil { return nil, errorf("could not write to connection: %v", err) @@ -455,7 +455,7 @@ func (c *Conn) headersRequest(request *GetBlockHeaders, reqID uint64) ([]*types. if !ok { return nil, fmt.Errorf("unexpected message received: %s", pretty.Sdump(msg)) } - headers := []*types.Header(resp.BlockHeadersPacket) + headers := []*types.Header(resp.BlockHeadersRequest) return headers, nil } diff --git a/simulators/ethereum/engine/go.mod b/simulators/ethereum/engine/go.mod index 7a2e541aa0..b9f1097809 100644 --- a/simulators/ethereum/engine/go.mod +++ b/simulators/ethereum/engine/go.mod @@ -3,20 +3,20 @@ module github.com/ethereum/hive/simulators/ethereum/engine go 1.20 require ( - github.com/crate-crypto/go-kzg-4844 v0.3.0 + github.com/crate-crypto/go-kzg-4844 v0.6.1-0.20231019121413-3621cc59f0c7 github.com/davecgh/go-spew v1.1.1 github.com/ethereum/go-ethereum v1.13.1 github.com/ethereum/hive v0.0.0-20230919110229-d58aec4a3eb5 - github.com/golang-jwt/jwt/v4 v4.4.3 + github.com/golang-jwt/jwt/v4 v4.5.0 github.com/holiman/uint256 v1.2.3 github.com/pkg/errors v0.9.1 - golang.org/x/exp v0.0.0-20230810033253-352e893a4cad + golang.org/x/exp v0.0.0-20230905200255-921286631fa9 ) require ( github.com/DataDog/zstd v1.5.2 // indirect github.com/Microsoft/go-winio v0.6.1 // indirect - github.com/VictoriaMetrics/fastcache v1.12.0 // indirect + github.com/VictoriaMetrics/fastcache v1.12.1 // indirect github.com/apapsch/go-jsonmerge/v2 v2.0.0 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/bits-and-blooms/bitset v1.7.0 // indirect @@ -25,15 +25,16 @@ require ( github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/cockroachdb/errors v1.9.1 // indirect github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect - github.com/cockroachdb/pebble v0.0.0-20230906160148-46873a6a7a06 // indirect + github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593 // indirect github.com/cockroachdb/redact v1.1.3 // indirect + github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect github.com/consensys/bavard v0.1.13 // indirect - github.com/consensys/gnark-crypto v0.11.0 // indirect + github.com/consensys/gnark-crypto v0.12.1 // indirect github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect github.com/deckarep/golang-set/v2 v2.1.0 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 // indirect github.com/deepmap/oapi-codegen v1.12.4 // indirect - github.com/ethereum/c-kzg-4844 v0.3.1 // indirect + github.com/ethereum/c-kzg-4844 v0.3.2-0.20231019020040-748283cced54 // indirect github.com/fjl/memsize v0.0.1 // indirect github.com/fsnotify/fsnotify v1.6.0 // indirect github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08 // indirect @@ -42,7 +43,7 @@ require ( github.com/go-stack/stack v1.8.1 // indirect github.com/gofrs/flock v0.8.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang/protobuf v1.5.2 // indirect + github.com/golang/protobuf v1.5.3 // indirect github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect github.com/google/uuid v1.3.0 // indirect github.com/gorilla/websocket v1.5.0 // indirect @@ -59,7 +60,7 @@ require ( github.com/kr/pretty v0.3.1 // indirect github.com/kr/text v0.2.0 // indirect github.com/mattn/go-colorable v0.1.13 // indirect - github.com/mattn/go-isatty v0.0.16 // indirect + github.com/mattn/go-isatty v0.0.17 // indirect github.com/mattn/go-runewidth v0.0.14 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect @@ -85,17 +86,17 @@ require ( github.com/urfave/cli/v2 v2.25.7 // indirect github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 // indirect github.com/yusufpapurcu/wmi v1.2.2 // indirect - golang.org/x/crypto v0.12.0 // indirect - golang.org/x/mod v0.11.0 // indirect - golang.org/x/net v0.10.0 // indirect + golang.org/x/crypto v0.14.0 // indirect + golang.org/x/mod v0.12.0 // indirect + golang.org/x/net v0.17.0 // indirect golang.org/x/sync v0.3.0 // indirect - golang.org/x/sys v0.11.0 // indirect - golang.org/x/text v0.12.0 // indirect + golang.org/x/sys v0.13.0 // indirect + golang.org/x/text v0.13.0 // indirect golang.org/x/time v0.3.0 // indirect - golang.org/x/tools v0.9.1 // indirect + golang.org/x/tools v0.13.0 // indirect google.golang.org/protobuf v1.28.1 // indirect gopkg.in/natefinch/lumberjack.v2 v2.0.0 // indirect rsc.io/tmplfunc v0.0.3 // indirect ) -replace github.com/ethereum/go-ethereum => github.com/lightclient/go-ethereum v1.10.10-0.20230926150549-ae44519d720c +replace github.com/ethereum/go-ethereum => github.com/lightclient/go-ethereum v1.10.10-0.20231019143932-4d161dee0c4c diff --git a/simulators/ethereum/engine/go.sum b/simulators/ethereum/engine/go.sum index 9b8df9c428..45bb28851b 100644 --- a/simulators/ethereum/engine/go.sum +++ b/simulators/ethereum/engine/go.sum @@ -11,8 +11,8 @@ github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migc github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= github.com/RaveNoX/go-jsoncommentstrip v1.0.0/go.mod h1:78ihd09MekBnJnxpICcwzCMzGrKSKYe4AqU6PDYYpjk= github.com/Shopify/goreferrer v0.0.0-20181106222321-ec9c9a553398/go.mod h1:a1uqRtAwp2Xwc6WNPJEufxJ7fx3npB4UV/JOLmbu5I0= -github.com/VictoriaMetrics/fastcache v1.12.0 h1:vnVi/y9yKDcD9akmc4NqAoqgQhJrOwUF+j9LTgn4QDE= -github.com/VictoriaMetrics/fastcache v1.12.0/go.mod h1:tjiYeEfYXCqacuvYw/7UoDIeJaNxq6132xHICNP77w8= +github.com/VictoriaMetrics/fastcache v1.12.1 h1:i0mICQuojGDL3KblA7wUNlY5lOK6a4bwt3uRKnkZU40= +github.com/VictoriaMetrics/fastcache v1.12.1/go.mod h1:tX04vaqcNoQeGLD+ra5pU5sWkuxnzWhEzLwhP9w653o= github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY= github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= github.com/allegro/bigcache v1.2.1 h1:hg1sY1raCwic3Vnsvje6TT7/pnZba83LeFck5NrFKSc= @@ -31,7 +31,6 @@ github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOF github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/cp v1.1.1 h1:nCb6ZLdB7NRaqsm91JtQTAme2SKJzXVsdPIPkyJr1MU= github.com/cespare/cp v1.1.1/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s= -github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= @@ -40,29 +39,31 @@ github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMn github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cockroachdb/datadriven v1.0.2/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= -github.com/cockroachdb/datadriven v1.0.3-0.20230801171734-e384cf455877 h1:1MLK4YpFtIEo3ZtMA5C795Wtv5VuUnrXX7mQG+aHg6o= +github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f h1:otljaYPt5hWxV3MUfO5dFPFiOXg9CyG5/kCfayTqsJ4= github.com/cockroachdb/errors v1.9.1 h1:yFVvsI0VxmRShfawbt/laCIDy/mtTqqnvoNgiy5bEV8= github.com/cockroachdb/errors v1.9.1/go.mod h1:2sxOtL2WIc096WSZqZ5h8fa17rdDq9HZOZLBCor4mBk= github.com/cockroachdb/logtags v0.0.0-20211118104740-dabe8e521a4f/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= -github.com/cockroachdb/pebble v0.0.0-20230906160148-46873a6a7a06 h1:T+Np/xtzIjYM/P5NAw0e2Rf1FGvzDau1h54MKvx8G7w= -github.com/cockroachdb/pebble v0.0.0-20230906160148-46873a6a7a06/go.mod h1:bynZ3gvVyhlvjLI7PT6dmZ7g76xzJ7HpxfjgkzCGz6s= +github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593 h1:aPEJyR4rPBvDmeyi+l/FS/VtA00IWvjeFvjen1m1l1A= +github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593/go.mod h1:6hk1eMY/u5t+Cf18q5lFMUA1Rc+Sm5I6Ra1QuPyxXCo= github.com/cockroachdb/redact v1.1.3 h1:AKZds10rFSIj7qADf0g46UixK8NNLwWTNdCIGS5wfSQ= github.com/cockroachdb/redact v1.1.3/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= +github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo= +github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ= github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0/go.mod h1:4Zcjuz89kmFXt9morQgcfYZAYZ5n8WHjt81YYWIwtTM= github.com/consensys/bavard v0.1.13 h1:oLhMLOFGTLdlda/kma4VOJazblc7IM5y5QPd2A/YjhQ= github.com/consensys/bavard v0.1.13/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI= -github.com/consensys/gnark-crypto v0.11.0 h1:QqzHQlwEqlQr5jfWblGDkwlKHpT+4QodYqqExkAtyks= -github.com/consensys/gnark-crypto v0.11.0/go.mod h1:Iq/P3HHl0ElSjsg2E1gsMwhAyxnxoKK5nVyZKd+/KhU= +github.com/consensys/gnark-crypto v0.12.1 h1:lHH39WuuFgVHONRl3J0LRBtuYdQTumFSDtJF7HpyG8M= +github.com/consensys/gnark-crypto v0.12.1/go.mod h1:v2Gy7L/4ZRosZ7Ivs+9SfUDr0f5UlG+EM5t7MPHiLuY= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/crate-crypto/go-kzg-4844 v0.3.0 h1:UBlWE0CgyFqqzTI+IFyCzA7A3Zw4iip6uzRv5NIXG0A= -github.com/crate-crypto/go-kzg-4844 v0.3.0/go.mod h1:SBP7ikXEgDnUPONgm33HtuDZEDtWa3L4QtN1ocJSEQ4= +github.com/crate-crypto/go-kzg-4844 v0.6.1-0.20231019121413-3621cc59f0c7 h1:VpZxBC99nEW8Rkz1EBBf7JmaM20H+ZkSmqdxpYEoXuo= +github.com/crate-crypto/go-kzg-4844 v0.6.1-0.20231019121413-3621cc59f0c7/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= @@ -84,8 +85,8 @@ github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.m github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/etcd-io/bbolt v1.3.3/go.mod h1:ZF2nL25h33cCyBtcyWeZ2/I3HQOfTP+0PIEvHjkjCrw= -github.com/ethereum/c-kzg-4844 v0.3.1 h1:sR65+68+WdnMKxseNWxSJuAv2tsUrihTpVBTfM/U5Zg= -github.com/ethereum/c-kzg-4844 v0.3.1/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= +github.com/ethereum/c-kzg-4844 v0.3.2-0.20231019020040-748283cced54 h1:jDyQvQjauRyb7TJAF9W7J3NOjn3ukXahd3l+rd1Fak8= +github.com/ethereum/c-kzg-4844 v0.3.2-0.20231019020040-748283cced54/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= github.com/ethereum/hive v0.0.0-20230919110229-d58aec4a3eb5 h1:22Z+XoI2hGtYR0AMzYr9IusfYM/chALq/6oJnejJQpk= github.com/ethereum/hive v0.0.0-20230919110229-d58aec4a3eb5/go.mod h1:iKqu3dndnqdwSckyBGoZzeHhZz6X6XZws2TfZMdLdes= github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072/go.mod h1:duJ4Jxv5lDcvg4QuQr0oowTf7dz4/CR8NtyCooz9HL8= @@ -129,8 +130,8 @@ github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/gogo/status v1.1.0/go.mod h1:BFv9nrluPLmrS0EmGVvLaPNmRosr9KapBYd5/hpY1WM= github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= -github.com/golang-jwt/jwt/v4 v4.4.3 h1:Hxl6lhQFj4AnOX6MLrsCb/+7tCj7DxP7VA+2rDIq5AU= -github.com/golang-jwt/jwt/v4 v4.4.3/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= +github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= +github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -145,8 +146,9 @@ github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvq github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= +github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXiurYmW7fx4GZkL8feAMVq7nEjURHk= github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= @@ -233,8 +235,8 @@ github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0 github.com/labstack/echo/v4 v4.5.0/go.mod h1:czIriw4a0C1dFun+ObrXp7ok03xON0N1awStJ6ArI7Y= github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c= -github.com/lightclient/go-ethereum v1.10.10-0.20230926150549-ae44519d720c h1:wSCiQFEiRH2qhIBrH7829p9oBvagRuT/Z0Mu0ROupFQ= -github.com/lightclient/go-ethereum v1.10.10-0.20230926150549-ae44519d720c/go.mod h1:gkQ5Ygi64ZBh9M/4iXY1R8WqoNCx1Ey0CkYn2BD4/fw= +github.com/lightclient/go-ethereum v1.10.10-0.20231019143932-4d161dee0c4c h1:UsDsJSV7/j0C4aGqECXoPvdL6a6y7myXMptcnQjflEY= +github.com/lightclient/go-ethereum v1.10.10-0.20231019143932-4d161dee0c4c/go.mod h1:CLSRGaP4Ev4DJOP+JSk3NHyJIillQLJc/ZAyCLI8NOs= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= @@ -246,8 +248,9 @@ github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hd github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= -github.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peKQ= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng= +github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.14 h1:+xnbZSEeDbOIg5/mE6JF0w6n9duR1l3/WmbinWVwUuU= @@ -351,7 +354,7 @@ github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5 github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= -github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/supranational/blst v0.3.11 h1:LyU6FolezeWAhvQk0k6O/d49jqgO52MSDDfYgbeoEm4= github.com/supranational/blst v0.3.11/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a h1:1ur3QoCqvE5fl+nylMaIr9PVV1w343YRDtsy+Rwu7XI= @@ -399,11 +402,11 @@ golang.org/x/crypto v0.0.0-20191227163750-53104e6ec876/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.12.0 h1:tFM/ta59kqch6LlvYnPa0yx5a83cL2nHflFhYKvv9Yk= -golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= +golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= +golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20230810033253-352e893a4cad h1:g0bG7Z4uG+OgH2QDODnjp6ggkk1bJDsINcuWmJN1iJU= -golang.org/x/exp v0.0.0-20230810033253-352e893a4cad/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc= +golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g= +golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= @@ -412,8 +415,8 @@ golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzB golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.11.0 h1:bUO06HqtnRcc/7l71XBe4WcqTZ+3AH1J59zWDDwLKgU= -golang.org/x/mod v0.11.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc= +golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -435,8 +438,8 @@ golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT golang.org/x/net v0.0.0-20211008194852-3b03d305991f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M= -golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= +golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -478,14 +481,15 @@ golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20211117180635-dee7805ff2e1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220405052023-b1e9470b6e64/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= +golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -494,8 +498,8 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc= -golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= +golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -513,8 +517,8 @@ golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roY golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.9.1 h1:8WMNJAz3zrtPmnYC7ISf5dEn3MT0gY7jBJfw27yrrLo= -golang.org/x/tools v0.9.1/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc= +golang.org/x/tools v0.13.0 h1:Iey4qkscZuv0VvIt8E0neZjtPVQFSc870HQ448QgEmQ= +golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/simulators/ethereum/engine/helper/blobs.go b/simulators/ethereum/engine/helper/blobs.go index 9f89d5c044..695d789a68 100644 --- a/simulators/ethereum/engine/helper/blobs.go +++ b/simulators/ethereum/engine/helper/blobs.go @@ -3,7 +3,9 @@ package helper import ( "bytes" "crypto/sha256" + "embed" "encoding/binary" + "encoding/json" "fmt" "math/big" "sync" @@ -21,12 +23,23 @@ import ( var gCryptoCtx gokzg4844.Context var initCryptoCtx sync.Once +//go:embed trusted_setup.json +var content embed.FS + // InitializeCryptoCtx initializes the global context object returned via CryptoCtx func InitializeCryptoCtx() { initCryptoCtx.Do(func() { // Initialize context to match the configurations that the // specs are using. - ctx, err := gokzg4844.NewContext4096Insecure1337() + config, err := content.ReadFile("trusted_setup.json") + if err != nil { + panic(err) + } + params := new(gokzg4844.JSONTrustedSetup) + if err = json.Unmarshal(config, params); err != nil { + panic(err) + } + ctx, err := gokzg4844.NewContext4096(params) if err != nil { panic(fmt.Sprintf("could not create context, err : %v", err)) } diff --git a/simulators/ethereum/engine/helper/trusted_setup.json b/simulators/ethereum/engine/helper/trusted_setup.json new file mode 100644 index 0000000000..32eefd75e0 --- /dev/null +++ b/simulators/ethereum/engine/helper/trusted_setup.json @@ -0,0 +1,4167 @@ +{ + "g1_lagrange": [ + "0xa0413c0dcafec6dbc9f47d66785cf1e8c981044f7d13cfe3e4fcbb71b5408dfde6312493cb3c1d30516cb3ca88c03654", + "0x8b997fb25730d661918371bb41f2a6e899cac23f04fc5365800b75433c0a953250e15e7a98fb5ca5cc56a8cd34c20c57", + "0x83302852db89424d5699f3f157e79e91dc1380f8d5895c5a772bb4ea3a5928e7c26c07db6775203ce33e62a114adaa99", + "0xa759c48b7e4a685e735c01e5aa6ef9c248705001f470f9ad856cd87806983e917a8742a3bd5ee27db8d76080269b7c83", + "0x967f8dc45ebc3be14c8705f43249a30ff48e96205fb02ae28daeab47b72eb3f45df0625928582aa1eb4368381c33e127", + "0xa418eb1e9fb84cb32b370610f56f3cb470706a40ac5a47c411c464299c45c91f25b63ae3fcd623172aa0f273c0526c13", + "0x8f44e3f0387293bc7931e978165abbaed08f53acd72a0a23ac85f6da0091196b886233bcee5b4a194db02f3d5a9b3f78", + "0x97173434b336be73c89412a6d70d416e170ea355bf1956c32d464090b107c090ef2d4e1a467a5632fbc332eeb679bf2d", + "0xa24052ad8d55ad04bc5d951f78e14213435681594110fd18173482609d5019105b8045182d53ffce4fc29fc8810516c1", + "0xb950768136b260277590b5bec3f56bbc2f7a8bc383d44ce8600e85bf8cf19f479898bcc999d96dfbd2001ede01d94949", + "0x92ab8077871037bd3b57b95cbb9fb10eb11efde9191690dcac655356986fd02841d8fdb25396faa0feadfe3f50baf56d", + "0xa79b096dff98038ac30f91112dd14b78f8ad428268af36d20c292e2b3b6d9ed4fb28480bb04e465071cc67d05786b6d1", + "0xb9ff71461328f370ce68bf591aa7fb13027044f42a575517f3319e2be4aa4843fa281e756d0aa5645428d6dfa857cef2", + "0x8d765808c00b3543ff182e2d159c38ae174b12d1314da88ea08e13bd9d1c37184cb515e6bf6420531b5d41767987d7ce", + "0xb8c9a837d20c3b53e6f578e4a257bb7ef8fc43178614ec2a154915b267ad2be135981d01ed2ee1b5fbd9d9bb27f0800a", + "0xa9773d92cf23f65f98ef68f6cf95c72b53d0683af2f9bf886bb9036e4a38184b1131b26fd24397910b494fbef856f3aa", + "0xb41ebe38962d112da4a01bf101cb248d808fbd50aaf749fc7c151cf332032eb3e3bdbd716db899724b734d392f26c412", + "0x90fbb030167fb47dcc13d604a726c0339418567c1d287d1d87423fa0cb92eec3455fbb46bcbe2e697144a2d3972142e4", + "0xb11d298bd167464b35fb923520d14832bd9ed50ed841bf6d7618424fd6f3699190af21759e351b89142d355952149da1", + "0x8bc36066f69dc89f7c4d1e58d67497675050c6aa002244cebd9fc957ec5e364c46bab4735ea3db02b73b3ca43c96e019", + "0xab7ab92c5d4d773068e485aa5831941ebd63db7118674ca38089635f3b4186833af2455a6fb9ed2b745df53b3ce96727", + "0xaf191ca3089892cb943cd97cf11a51f38e38bd9be50844a4e8da99f27e305e876f9ed4ab0628e8ae3939066b7d34a15f", + "0xa3204c1747feabc2c11339a542195e7cb6628fd3964f846e71e2e3f2d6bb379a5e51700682ea1844eba12756adb13216", + "0x903a29883846b7c50c15968b20e30c471aeac07b872c40a4d19eb1a42da18b649d5bbfde4b4cf6225d215a461b0deb6d", + "0x8e6e9c15ffbf1e16e5865a5fef7ed751dc81957a9757b535cb38b649e1098cda25d42381dc4f776778573cdf90c3e6e0", + "0xa8f6dd26100b512a8c96c52e00715c4b2cb9ac457f17aed8ffe1cf1ea524068fe5a1ddf218149845fc1417b789ecfc98", + "0xa5b0ffc819451ea639cfd1c18cbc9365cc79368d3b2e736c0ae54eba2f0801e6eb0ee14a5f373f4a70ca463bdb696c09", + "0x879f91ccd56a1b9736fbfd20d8747354da743fb121f0e308a0d298ff0d9344431890e41da66b5009af3f442c636b4f43", + "0x81bf3a2d9755e206b515a508ac4d1109bf933c282a46a4ae4a1b4cb4a94e1d23642fad6bd452428845afa155742ade7e", + "0x8de778d4742f945df40004964e165592f9c6b1946263adcdd5a88b00244bda46c7bb49098c8eb6b3d97a0dd46148a8ca", + "0xb7a57b21d13121907ee28c5c1f80ee2e3e83a3135a8101e933cf57171209a96173ff5037f5af606e9fd6d066de6ed693", + "0xb0877d1963fd9200414a38753dffd9f23a10eb3198912790d7eddbc9f6b477019d52ddd4ebdcb9f60818db076938a5a9", + "0x88da2d7a6611bc16adc55fc1c377480c828aba4496c645e3efe0e1a67f333c05a0307f7f1d2df8ac013602c655c6e209", + "0x95719eb02e8a9dede1a888c656a778b1c69b7716fbe3d1538fe8afd4a1bc972183c7d32aa7d6073376f7701df80116d8", + "0x8e8a1ca971f2444b35af3376e85dccda3abb8e8e11d095d0a4c37628dfe5d3e043a377c3de68289ef142e4308e9941a0", + "0xb720caaff02f6d798ac84c4f527203e823ff685869e3943c979e388e1c34c3f77f5c242c6daa7e3b30e511aab917b866", + "0x86040d55809afeec10e315d1ad950d269d37cfee8c144cd8dd4126459e3b15a53b3e68df5981df3c2346d23c7b4baaf4", + "0x82d8cabf13ab853db0377504f0aec00dba3a5cd3119787e8ad378ddf2c40b022ecfc67c642b7acc8c1e3dd03ab50993e", + "0xb8d873927936719d2484cd03a6687d65697e17dcf4f0d5aed6f5e4750f52ef2133d4645894e7ebfc4ef6ce6788d404c8", + "0xb1235594dbb15b674a419ff2b2deb644ad2a93791ca05af402823f87114483d6aa1689b7a9bea0f547ad12fe270e4344", + "0xa53fda86571b0651f5affb74312551a082fffc0385cfd24c1d779985b72a5b1cf7c78b42b4f7e51e77055f8e5e915b00", + "0xb579adcfd9c6ef916a5a999e77a0cb21d378c4ea67e13b7c58709d5da23a56c2e54218691fc4ac39a4a3d74f88cc31f7", + "0xab79e584011713e8a2f583e483a91a0c2a40771b77d91475825b5acbea82db4262132901cb3e4a108c46d7c9ee217a4e", + "0xa0fe58ea9eb982d7654c8aaf9366230578fc1362f6faae0594f8b9e659bcb405dff4aac0c7888bbe07f614ecf0d800a6", + "0x867e50e74281f28ecd4925560e2e7a6f8911b135557b688254623acce0dbc41e23ac3e706a184a45d54c586edc416eb0", + "0x89f81b61adda20ea9d0b387a36d0ab073dc7c7cbff518501962038be19867042f11fcc7ff78096e5d3b68c6d8dc04d9b", + "0xa58ee91bb556d43cf01f1398c5811f76dc0f11efdd569eed9ef178b3b0715e122060ec8f945b4dbf6eebfa2b90af6fa6", + "0xac460be540f4c840def2eef19fc754a9af34608d107cbadb53334cf194cc91138d53b9538fcd0ec970b5d4aa455b224a", + "0xb09b91f929de52c09d48ca0893be6eb44e2f5210a6c394689dc1f7729d4be4e11d0474b178e80cea8c2ac0d081f0e811", + "0x8d37a442a76b06a02a4e64c2504aea72c8b9b020ab7bcc94580fe2b9603c7c50d7b1e9d70d2a7daea19c68667e8f8c31", + "0xa9838d4c4e3f3a0075a952cf7dd623307ec633fcc81a7cf9e52e66c31780de33dbb3d74c320dc7f0a4b72f7a49949515", + "0xa44766b6251af458fe4f5f9ed1e02950f35703520b8656f09fc42d9a2d38a700c11a7c8a0436ac2e5e9f053d0bb8ff91", + "0xad78d9481c840f5202546bea0d13c776826feb8b1b7c72e83d99a947622f0bf38a4208551c4c41beb1270d7792075457", + "0xb619ffa8733b470039451e224b777845021e8dc1125f247a4ff2476cc774657d0ff9c5279da841fc1236047de9d81c60", + "0xaf760b0a30a1d6af3bc5cd6686f396bd41779aeeb6e0d70a09349bd5da17ca2e7965afc5c8ec22744198fbe3f02fb331", + "0xa0cc209abdb768b589fcb7b376b6e1cac07743288c95a1cf1a0354b47f0cf91fca78a75c1fcafa6f5926d6c379116608", + "0x864add673c89c41c754eeb3cd8dcff5cdde1d739fce65c30e474a082bb5d813cba6412e61154ce88fdb6c12c5d9be35b", + "0xb091443b0ce279327dc37cb484e9a5b69b257a714ce21895d67539172f95ffa326903747b64a3649e99aea7bb10d03f7", + "0xa8c452b8c4ca8e0a61942a8e08e28f17fb0ef4c5b018b4e6d1a64038280afa2bf1169202f05f14af24a06ca72f448ccd", + "0xa23c24721d18bc48d5dcf70effcbef89a7ae24e67158d70ae1d8169ee75d9a051d34b14e9cf06488bac324fe58549f26", + "0x92a730e30eb5f3231feb85f6720489dbb1afd42c43f05a1610c6b3c67bb949ec8fde507e924498f4ffc646f7b07d9123", + "0x8dbe5abf4031ec9ba6bb06d1a47dd1121fb9e03b652804069250967fd5e9577d0039e233441b7f837a7c9d67ba18c28e", + "0xaa456bcfef6a21bb88181482b279df260297b3778e84594ebddbdf337e85d9e3d46ca1d0b516622fb0b103df8ec519b7", + "0xa3b31ae621bd210a2b767e0e6f22eb28fe3c4943498a7e91753225426168b9a26da0e02f1dc5264da53a5ad240d9f51b", + "0xaa8d66857127e6e71874ce2202923385a7d2818b84cb73a6c42d71afe70972a70c6bdd2aad1a6e8c5e4ca728382a8ea8", + "0xac7e8e7a82f439127a5e40558d90d17990f8229852d21c13d753c2e97facf077cf59582b603984c3dd3faebd80aff4f5", + "0x93a8bcf4159f455d1baa73d2ef2450dcd4100420de84169bbe28b8b7a5d1746273f870091a87a057e834f754f34204b1", + "0x89d0ebb287c3613cdcae7f5acc43f17f09c0213fc40c074660120b755d664109ffb9902ed981ede79e018ddb0c845698", + "0xa87ccbfad431406aadbee878d9cf7d91b13649d5f7e19938b7dfd32645a43b114eef64ff3a13201398bd9b0337832e5a", + "0x833c51d0d0048f70c3eefb4e70e4ff66d0809c41838e8d2c21c288dd3ae9d9dfaf26d1742bf4976dab83a2b381677011", + "0x8bcd6b1c3b02fffead432e8b1680bad0a1ac5a712d4225e220690ee18df3e7406e2769e1f309e2e803b850bc96f0e768", + "0xb61e3dbd88aaf4ff1401521781e2eea9ef8b66d1fac5387c83b1da9e65c2aa2a56c262dea9eceeb4ad86c90211672db0", + "0x866d3090db944ecf190dd0651abf67659caafd31ae861bab9992c1e3915cb0952da7c561cc7e203560a610f48fae633b", + "0xa5e8971543c14274a8dc892b0be188c1b4fbc75c692ed29f166e0ea80874bc5520c2791342b7c1d2fb5dd454b03b8a5b", + "0x8f2f9fc50471bae9ea87487ebd1bc8576ef844cc42d606af5c4c0969670fdf2189afd643e4de3145864e7773d215f37f", + "0xb1bb0f2527db6d51f42b9224383c0f96048bbc03d469bf01fe1383173ef8b1cc9455d9dd8ba04d46057f46949bfc92b5", + "0xaa7c99d906b4d7922296cfe2520473fc50137c03d68b7865c5bfb8adbc316b1034310ec4b5670c47295f4a80fb8d61e9", + "0xa5d1da4d6aba555919df44cbaa8ff79378a1c9e2cfdfbf9d39c63a4a00f284c5a5724e28ecbc2d9dba27fe4ee5018bd5", + "0xa8db53224f70af4d991b9aae4ffe92d2aa5b618ad9137784b55843e9f16cefbfd25ada355d308e9bbf55f6d2f7976fb3", + "0xb6536c4232bb20e22af1a8bb12de76d5fec2ad9a3b48af1f38fa67e0f8504ef60f305a73d19385095bb6a9603fe29889", + "0x87f7e371a1817a63d6838a8cf4ab3a8473d19ce0d4f40fd013c03d5ddd5f4985df2956531cc9f187928ef54c68f4f9a9", + "0xae13530b1dbc5e4dced9d909ea61286ec09e25c12f37a1ed2f309b0eb99863d236c3b25ed3484acc8c076ad2fa8cd430", + "0x98928d850247c6f7606190e687d5c94a627550198dbdbea0161ef9515eacdb1a0f195cae3bb293112179082daccf8b35", + "0x918528bb8e6a055ad4db6230d3a405e9e55866da15c4721f5ddd1f1f37962d4904aad7a419218fe6d906fe191a991806", + "0xb71e31a06afe065773dd3f4a6e9ef81c3292e27a3b7fdfdd452d03e05af3b6dd654c355f7516b2a93553360c6681a73a", + "0x8870b83ab78a98820866f91ac643af9f3ff792a2b7fda34185a9456a63abdce42bfe8ad4dc67f08a6392f250d4062df4", + "0x91eea1b668e52f7a7a5087fabf1cab803b0316f78d9fff469fbfde2162f660c250e4336a9eea4cb0450bd30ac067bc8b", + "0x8b74990946de7b72a92147ceac1bd9d55999a8b576e8df68639e40ed5dc2062cfcd727903133de482b6dca19d0aaed82", + "0x8ebad537fece090ebbab662bdf2618e21ca30cf6329c50935e8346d1217dcbe3c1fe1ea28efca369c6003ce0a94703c1", + "0xa8640479556fb59ebd1c40c5f368fbd960932fdbb782665e4a0e24e2bdb598fc0164ce8c0726d7759cfc59e60a62e182", + "0xa9a52a6bf98ee4d749f6d38be2c60a6d54b64d5cbe4e67266633dc096cf28c97fe998596707d31968cbe2064b72256bf", + "0x847953c48a4ce6032780e9b39d0ed4384e0be202c2bbe2dfda3910f5d87aa5cd3c2ffbfcfae4dddce16d6ab657599b95", + "0xb6f6e1485d3ec2a06abaecd23028b200b2e4a0096c16144d07403e1720ff8f9ba9d919016b5eb8dc5103880a7a77a1d3", + "0x98dfc2065b1622f596dbe27131ea60bef7a193b12922cecb27f8c571404f483014f8014572e86ae2e341ab738e4887ef", + "0xacb0d205566bacc87bbe2e25d10793f63f7a1f27fd9e58f4f653ceae3ffeba511eaf658e068fad289eeb28f9edbeb35b", + "0xae4411ed5b263673cee894c11fe4abc72a4bf642d94022a5c0f3369380fcdfc1c21e277f2902972252503f91ada3029a", + "0xac4a7a27ba390a75d0a247d93d4a8ef1f0485f8d373a4af4e1139369ec274b91b3464d9738eeaceb19cd6f509e2f8262", + "0x87379c3bf231fdafcf6472a79e9e55a938d851d4dd662ab6e0d95fd47a478ed99e2ad1e6e39be3c0fc4f6d996a7dd833", + "0x81316904b035a8bcc2041199a789a2e6879486ba9fddcba0a82c745cc8dd8374a39e523b91792170cd30be7aa3005b85", + "0xb8206809c6cd027ed019f472581b45f7e12288f89047928ba32b4856b6560ad30395830d71e5e30c556f6f182b1fe690", + "0x88d76c028f534a62e019b4a52967bb8642ede6becfa3807be68fdd36d366fc84a4ac8dc176e80a68bc59eb62caf5dff9", + "0x8c3b8be685b0f8aad131ee7544d0e12f223f08a6f8edaf464b385ac644e0ddc9eff7cc7cb5c1b50ab5d71ea0f41d2213", + "0x8d91410e004f76c50fdc05784157b4d839cb5090022c629c7c97a5e0c3536eeafee17a527b54b1165c3cd81774bb54ce", + "0xb25c2863bc28ec5281ce800ddf91a7e1a53f4c6d5da1e6c86ef4616e93bcf55ed49e297216d01379f5c6e7b3c1e46728", + "0x865f7b09ac3ca03f20be90c48f6975dd2588838c2536c7a3532a6aa5187ed0b709cd03d91ff4048061c10d0aa72b69ce", + "0xb3f7477c90c11596eb4f8bbf34adbcb832638c4ff3cdd090d4d477ee50472ac9ddaf5be9ad7eca3f148960d362bbd098", + "0x8db35fd53fca04faecd1c76a8227160b3ab46ac1af070f2492445a19d8ff7c25bbaef6c9fa0c8c088444561e9f7e4eb2", + "0xa478b6e9d058a2e01d2fc053b739092e113c23a6a2770a16afbef044a3709a9e32f425ace9ba7981325f02667c3f9609", + "0x98caa6bd38916c08cf221722a675a4f7577f33452623de801d2b3429595f988090907a7e99960fff7c076d6d8e877b31", + "0xb79aaaacefc49c3038a14d2ac468cfec8c2161e88bdae91798d63552cdbe39e0e02f9225717436b9b8a40a022c633c6e", + "0x845a31006c680ee6a0cc41d3dc6c0c95d833fcf426f2e7c573fa15b2c4c641fbd6fe5ebb0e23720cc3467d6ee1d80dc4", + "0xa1bc287e272cf8b74dbf6405b3a5190883195806aa351f1dc8e525aa342283f0a35ff687e3b434324dedee74946dd185", + "0xa4fd2dc8db75d3783a020856e2b3aa266dc6926e84f5c491ef739a3bddd46dc8e9e0fc1177937839ef1b18d062ffbb9e", + "0xacbf0d3c697f57c202bb8c5dc4f3fc341b8fc509a455d44bd86acc67cad2a04495d5537bcd3e98680185e8aa286f2587", + "0xa5caf423a917352e1b8e844f5968a6da4fdeae467d10c6f4bbd82b5eea46a660b82d2f5440d3641c717b2c3c9ed0be52", + "0x8a39d763c08b926599ab1233219c49c825368fad14d9afc7c0c039224d37c00d8743293fd21645bf0b91eaf579a99867", + "0xb2b53a496def0ba06e80b28f36530fbe0fb5d70a601a2f10722e59abee529369c1ae8fd0f2db9184dd4a2519bb832d94", + "0xa73980fcef053f1b60ebbb5d78ba6332a475e0b96a0c724741a3abf3b59dd344772527f07203cf4c9cb5155ebed81fa0", + "0xa070d20acce42518ece322c9db096f16aed620303a39d8d5735a0df6e70fbeceb940e8d9f5cc38f3314b2240394ec47b", + "0xa50cf591f522f19ca337b73089557f75929d9f645f3e57d4f241e14cdd1ea3fb48d84bcf05e4f0377afbb789fbdb5d20", + "0x82a5ffce451096aca8eeb0cd2ae9d83db3ed76da3f531a80d9a70a346359bf05d74863ce6a7c848522b526156a5e20cd", + "0x88e0e84d358cbb93755a906f329db1537c3894845f32b9b0b691c29cbb455373d9452fadd1e77e20a623f6eaf624de6f", + "0xaa07ac7b84a6d6838826e0b9e350d8ec75e398a52e9824e6b0da6ae4010e5943fec4f00239e96433f291fef9d1d1e609", + "0xac8887bf39366034bc63f6cc5db0c26fd27307cbc3d6cce47894a8a019c22dd51322fb5096edc018227edfafc053a8f6", + "0xb7d26c26c5b33f77422191dca94977588ab1d4b9ce7d0e19c4a3b4cd1c25211b78c328dbf81e755e78cd7d1d622ad23e", + "0x99a676d5af49f0ba44047009298d8474cabf2d5bca1a76ba21eff7ee3c4691a102fdefea27bc948ccad8894a658abd02", + "0xb0d09a91909ab3620c183bdf1d53d43d39eb750dc7a722c661c3de3a1a5d383ad221f71bae374f8a71867505958a3f76", + "0x84681a883de8e4b93d68ac10e91899c2bbb815ce2de74bb48a11a6113b2a3f4df8aceabda1f5f67bc5aacac8c9da7221", + "0x9470259957780fa9b43521fab3644f555f5343281c72582b56d2efd11991d897b3b481cafa48681c5aeb80c9663b68f7", + "0xab1b29f7ece686e6fa968a4815da1d64f3579fed3bc92e1f3e51cd13a3c076b6cf695ed269d373300a62463dc98a4234", + "0x8ab415bfcd5f1061f7687597024c96dd9c7cb4942b5989379a7a3b5742f7d394337886317659cbeacaf030234a24f972", + "0xb9b524aad924f9acc63d002d617488f31b0016e0f0548f050cada285ce7491b74a125621638f19e9c96eabb091d945be", + "0x8c4c373e79415061837dd0def4f28a2d5d74d21cb13a76c9049ad678ca40228405ab0c3941df49249847ecdefc1a5b78", + "0xa8edf4710b5ab2929d3db6c1c0e3e242261bbaa8bcec56908ddadd7d2dad2dca9d6eb9de630b960b122ebeea41040421", + "0x8d66bb3b50b9df8f373163629f9221b3d4b6980a05ea81dc3741bfe9519cf3ebba7ab98e98390bae475e8ede5821bd5c", + "0x8d3c21bae7f0cfb97c56952bb22084b58e7bb718890935b73103f33adf5e4d99cd262f929c6eeab96209814f0dbae50a", + "0xa5c66cfab3d9ebf733c4af24bebc97070e7989fe3c73e79ac85fb0e4d40ae44fb571e0fad4ad72560e13ed453900d14f", + "0x9362e6b50b43dbefbc3254471372297b5dcce809cd3b60bf74a1268ab68bdb50e46e462cbd78f0d6c056330e982846af", + "0x854630d08e3f0243d570cc2e856234cb4c1a158d9c1883bf028a76525aaa34be897fe918d5f6da9764a3735fa9ebd24a", + "0x8c7d246985469ff252c3f4df6c7c9196fc79f05c1c66a609d84725c78001d0837c7a7049394ba5cf7e863e2d58af8417", + "0xae050271e01b528925302e71903f785b782f7bf4e4e7a7f537140219bc352dc7540c657ed03d3a297ad36798ecdb98cd", + "0x8d2ae9179fcf2b0c69850554580b52c1f4a5bd865af5f3028f222f4acad9c1ad69a8ef6c7dc7b03715ee5c506b74325e", + "0xb8ef8de6ce6369a8851cd36db0ccf00a85077e816c14c4e601f533330af9e3acf0743a95d28962ed8bfcfc2520ef3cfe", + "0xa6ecad6fdfb851b40356a8b1060f38235407a0f2706e7b8bb4a13465ca3f81d4f5b99466ac2565c60af15f022d26732e", + "0x819ff14cdea3ab89d98e133cd2d0379361e2e2c67ad94eeddcdb9232efd509f51d12f4f03ebd4dd953bd262a886281f7", + "0x8561cd0f7a6dbcddd83fcd7f472d7dbcba95b2d4fb98276f48fccf69f76d284e626d7e41314b633352df8e6333fd52a1", + "0xb42557ccce32d9a894d538c48712cb3e212d06ac05cd5e0527ccd2db1078ee6ae399bf6a601ffdab1f5913d35fc0b20c", + "0x89b4008d767aad3c6f93c349d3b956e28307311a5b1cec237e8d74bb0dee7e972c24f347fd56afd915a2342bd7bc32f0", + "0x877487384b207e53f5492f4e36c832c2227f92d1bb60542cfeb35e025a4a7afc2b885fae2528b33b40ab09510398f83e", + "0x8c411050b63c9053dd0cd81dacb48753c3d7f162028098e024d17cd6348482703a69df31ad6256e3d25a8bbf7783de39", + "0xa8506b54a88d17ac10fb1b0d1fe4aa40eae7553a064863d7f6b52ccc4236dd4b82d01dca6ba87da9a239e3069ba879fb", + "0xb1a24caef9df64750c1350789bb8d8a0db0f39474a1c74ea9ba064b1516db6923f00af8d57c632d58844fb8786c3d47a", + "0x959d6e255f212b0708c58a2f75cb1fe932248c9d93424612c1b8d1e640149656059737e4db2139afd5556bcdacf3eda2", + "0x84525af21a8d78748680b6535bbc9dc2f0cf9a1d1740d12f382f6ecb2e73811d6c1da2ad9956070b1a617c61fcff9fe5", + "0xb74417d84597a485d0a8e1be07bf78f17ebb2e7b3521b748f73935b9afbbd82f34b710fb7749e7d4ab55b0c7f9de127d", + "0xa4a9aecb19a6bab167af96d8b9d9aa5308eab19e6bfb78f5a580f9bf89bdf250a7b52a09b75f715d651cb73febd08e84", + "0x9777b30be2c5ffe7d29cc2803a562a32fb43b59d8c3f05a707ab60ec05b28293716230a7d264d7cd9dd358fc031cc13e", + "0x95dce7a3d4f23ac0050c510999f5fbf8042f771e8f8f94192e17bcbfa213470802ebdbe33a876cb621cf42e275cbfc8b", + "0xb0b963ebcbbee847ab8ae740478544350b3ac7e86887e4dfb2299ee5096247cd2b03c1de74c774d9bde94ae2ee2dcd59", + "0xa4ab20bafa316030264e13f7ef5891a2c3b29ab62e1668fcb5881f50a9acac6adbe3d706c07e62f2539715db768f6c43", + "0x901478a297669d608e406fe4989be75264b6c8be12169aa9e0ad5234f459ca377f78484ffd2099a2fe2db5e457826427", + "0x88c76e5c250810c057004a03408b85cd918e0c8903dc55a0dd8bb9b4fc2b25c87f9b8cf5943eb19fbbe99d36490050c5", + "0x91607322bbad4a4f03fc0012d0821eff5f8c516fda45d1ec1133bface6f858bf04b25547be24159cab931a7aa08344d4", + "0x843203e07fce3c6c81f84bc6dc5fb5e9d1c50c8811ace522dc66e8658433a0ef9784c947e6a62c11bf705307ef05212e", + "0x91dd8813a5d6dddcda7b0f87f672b83198cd0959d8311b2b26fb1fae745185c01f796fbd03aad9db9b58482483fdadd8", + "0x8d15911aacf76c8bcd7136e958febd6963104addcd751ce5c06b6c37213f9c4fb0ffd4e0d12c8e40c36d658999724bfd", + "0x8a36c5732d3f1b497ebe9250610605ee62a78eaa9e1a45f329d09aaa1061131cf1d9df00f3a7d0fe8ad614a1ff9caaae", + "0xa407d06affae03660881ce20dab5e2d2d6cddc23cd09b95502a9181c465e57597841144cb34d22889902aff23a76d049", + "0xb5fd856d0578620a7e25674d9503be7d97a2222900e1b4738c1d81ff6483b144e19e46802e91161e246271f90270e6cf", + "0x91b7708869cdb5a7317f88c0312d103f8ce90be14fb4f219c2e074045a2a83636fdc3e69e862049fc7c1ef000e832541", + "0xb64719cc5480709d1dae958f1d3082b32a43376da446c8f9f64cb02a301effc9c34d9102051733315a8179aed94d53cc", + "0x94347a9542ff9d18f7d9eaa2f4d9b832d0e535fe49d52aa2de08aa8192400eddabdb6444a2a78883e27c779eed7fdf5a", + "0x840ef44a733ff1376466698cd26f82cf56bb44811e196340467f932efa3ae1ef9958a0701b3b032f50fd9c1d2aed9ab5", + "0x90ab3f6f67688888a31ffc2a882bb37adab32d1a4b278951a21646f90d03385fc976715fc639a785d015751171016f10", + "0xb56f35d164c24b557dbcbc8a4bfa681ec916f8741ffcb27fb389c164f4e3ed2be325210ef5bdaeae7a172ca9599ab442", + "0xa7921a5a80d7cf6ae81ba9ee05e0579b18c20cd2852762c89d6496aa4c8ca9d1ca2434a67b2c16d333ea8e382cdab1e3", + "0xa506bcfbd7e7e5a92f68a1bd87d07ad5fe3b97aeee40af2bf2cae4efcd77fff03f872732c5b7883aa6584bee65d6f8cb", + "0xa8c46cff58931a1ce9cbe1501e1da90b174cddd6d50f3dfdfb759d1d4ad4673c0a8feed6c1f24c7af32865a7d6c984e5", + "0xb45686265a83bff69e312c5149db7bb70ac3ec790dc92e392b54d9c85a656e2bf58596ce269f014a906eafc97461aa5f", + "0x8d4009a75ccb2f29f54a5f16684b93202c570d7a56ec1a8b20173269c5f7115894f210c26b41e8d54d4072de2d1c75d0", + "0xaef8810af4fc676bf84a0d57b189760ddc3375c64e982539107422e3de2580b89bd27aa6da44e827b56db1b5555e4ee8", + "0x888f0e1e4a34f48eb9a18ef4de334c27564d72f2cf8073e3d46d881853ac1424d79e88d8ddb251914890588937c8f711", + "0xb64b0aa7b3a8f6e0d4b3499fe54e751b8c3e946377c0d5a6dbb677be23736b86a7e8a6be022411601dd75012012c3555", + "0x8d57776f519f0dd912ea14f79fbab53a30624e102f9575c0bad08d2dc754e6be54f39b11278c290977d9b9c7c0e1e0ad", + "0xa018fc00d532ceb2e4de908a15606db9b6e0665dd77190e2338da7c87a1713e6b9b61554e7c1462f0f6d4934b960b15c", + "0x8c932be83ace46f65c78e145b384f58e41546dc0395270c1397874d88626fdeda395c8a289d602b4c312fe98c1311856", + "0x89174838e21639d6bdd91a0621f04dc056907b88e305dd66e46a08f6d65f731dea72ae87ca5e3042d609e8de8de9aa26", + "0xb7b7f508bb74f7a827ac8189daa855598ff1d96fa3a02394891fd105d8f0816224cd50ac4bf2ed1cf469ace516c48184", + "0xb31877ad682583283baadd68dc1bebd83f5748b165aadd7fe9ef61a343773b88bcd3a022f36d6c92f339b7bfd72820a9", + "0xb79d77260b25daf9126dab7a193df2d7d30542786fa1733ffaf6261734770275d3ca8bae1d9915d1181a78510b3439db", + "0x91894fb94cd4c1dd2ceaf9c53a7020c5799ba1217cf2d251ea5bc91ed26e1159dd758e98282ebe35a0395ef9f1ed15a0", + "0xab59895cdafd33934ceedfc3f0d5d89880482cba6c99a6db93245f9e41987efd76e0640e80aef31782c9a8c7a83fccec", + "0xaa22ea63654315e033e09d4d4432331904a6fc5fb1732557987846e3c564668ca67c60a324b4af01663a23af11a9ce4b", + "0xb53ba3ef342601467e1f71aa280e100fbabbd38518fa0193e0099505036ee517c1ac78e96e9baeb549bb6879bb698fb0", + "0x943fd69fd656f37487cca3605dc7e5a215fddd811caf228595ec428751fc1de484a0cb84c667fe4d7c35599bfa0e5e34", + "0x9353128b5ebe0dddc555093cf3e5942754f938173541033e8788d7331fafc56f68d9f97b4131e37963ab7f1c8946f5f1", + "0xa76cd3c566691f65cfb86453b5b31dbaf3cab8f84fe1f795dd1e570784b9b01bdd5f0b3c1e233942b1b5838290e00598", + "0x983d84b2e53ffa4ae7f3ba29ef2345247ea2377686b74a10479a0ef105ecf90427bf53b74c96dfa346d0f842b6ffb25b", + "0x92e0fe9063306894a2c6970c001781cff416c87e87cb5fbac927a3192655c3da4063e6fa93539f6ff58efac6adcc5514", + "0xb00a81f03c2b8703acd4e2e4c21e06973aba696415d0ea1a648ace2b0ea19b242fede10e4f9d7dcd61c546ab878bc8f9", + "0xb0d08d880f3b456a10bf65cff983f754f545c840c413aea90ce7101a66eb0a0b9b1549d6c4d57725315828607963f15a", + "0x90cb64d03534f913b411375cce88a9e8b1329ce67a9f89ca5df8a22b8c1c97707fec727dbcbb9737f20c4cf751359277", + "0x8327c2d42590dfcdb78477fc18dcf71608686ad66c49bce64d7ee874668be7e1c17cc1042a754bbc77c9daf50b2dae07", + "0x8532171ea13aa7e37178e51a6c775da469d2e26ec854eb16e60f3307db4acec110d2155832c202e9ba525fc99174e3b0", + "0x83ca44b15393d021de2a511fa5511c5bd4e0ac7d67259dce5a5328f38a3cce9c3a269405959a2486016bc27bb140f9ff", + "0xb1d36e8ca812be545505c8214943b36cabee48112cf0de369957afa796d37f86bf7249d9f36e8e990f26f1076f292b13", + "0x9803abf45be5271e2f3164c328d449efc4b8fc92dfc1225d38e09630909fe92e90a5c77618daa5f592d23fc3ad667094", + "0xb268ad68c7bf432a01039cd889afae815c3e120f57930d463aece10af4fd330b5bd7d8869ef1bcf6b2e78e4229922edc", + "0xa4c91a0d6f16b1553264592b4cbbbf3ca5da32ab053ffbdd3dbb1aed1afb650fb6e0dc5274f71a51d7160856477228db", + "0xad89d043c2f0f17806277ffdf3ecf007448e93968663f8a0b674254f36170447b7527d5906035e5e56f4146b89b5af56", + "0x8b6964f757a72a22a642e4d69102951897e20c21449184e44717bd0681d75f7c5bfa5ee5397f6e53febf85a1810d6ed1", + "0xb08f5cdaabec910856920cd6e836c830b863eb578423edf0b32529488f71fe8257d90aed4a127448204df498b6815d79", + "0xaf26bb3358be9d280d39b21d831bb53145c4527a642446073fee5a86215c4c89ff49a3877a7a549486262f6f57a0f476", + "0xb4010b37ec4d7c2af20800e272539200a6b623ae4636ecbd0e619484f4ab9240d02bc5541ace3a3fb955dc0a3d774212", + "0x82752ab52bdcc3cc2fc405cb05a2e694d3df4a3a68f2179ec0652536d067b43660b96f85f573f26fbd664a9ef899f650", + "0x96d392dde067473a81faf2d1fea55b6429126b88b160e39b4210d31d0a82833ffd3a80e07d24d495aea2d96be7251547", + "0xa76d8236d6671204d440c33ac5b8deb71fa389f6563d80e73be8b043ec77d4c9b06f9a586117c7f957f4af0331cbc871", + "0xb6c90961f68b5e385d85c9830ec765d22a425f506904c4d506b87d8944c2b2c09615e740ed351df0f9321a7b93979cae", + "0xa6ec5ea80c7558403485b3b1869cdc63bde239bafdf936d9b62a37031628402a36a2cfa5cfbb8e26ac922cb0a209b3ba", + "0x8c3195bbdbf9bc0fc95fa7e3d7f739353c947f7767d1e3cb24d8c8602d8ea0a1790ac30b815be2a2ba26caa5227891e2", + "0xa7f8a63d809f1155722c57f375ea00412b00147776ae4444f342550279ef4415450d6f400000a326bf11fea6c77bf941", + "0x97fa404df48433a00c85793440e89bb1af44c7267588ae937a1f5d53e01e1c4d4fc8e4a6d517f3978bfdd6c2dfde012f", + "0xa984a0a3836de3d8d909c4629a2636aacb85393f6f214a2ef68860081e9db05ad608024762db0dc35e895dc00e2d4cdd", + "0x9526cf088ab90335add1db4d3a4ac631b58cbfbe88fa0845a877d33247d1cfeb85994522e1eb8f8874651bfb1df03e2a", + "0xac83443fd0afe99ad49de9bf8230158c118e2814c9c89db5ac951c240d6c2ce45e7677221279d9e97848ec466b99aafe", + "0xaeeefdbaba612e971697798ceaf63b247949dc823a0ad771ae5b988a5e882b338a98d3d0796230f49d533ec5ba411b39", + "0xae3f248b5a7b0f92b7820a6c5ae21e5bd8f4265d4f6e21a22512079b8ee9be06393fd3133ce8ebac0faf23f4f8517e36", + "0xa64a831b908eee784b8388b45447d2885ec0551b26b0c2b15e5f417d0a12c79e867fb7bd3d008d0af98b44336f8ec1ad", + "0xb242238cd8362b6e440ba21806905714dd55172db25ec7195f3fc4937b2aba146d5cbf3cf691a1384b4752dc3b54d627", + "0x819f97f337eea1ffb2a678cc25f556f1aab751c6b048993a1d430fe1a3ddd8bb411c152e12ca60ec6e057c190cd1db9a", + "0xb9d7d187407380df54ee9fef224c54eec1bfabf17dc8abf60765b7951f538f59aa26fffd5846cfe05546c35f59b573f4", + "0xaa6e3c14efa6a5962812e3f94f8ce673a433f4a82d07a67577285ea0eaa07f8be7115853122d12d6d4e1fdf64c504be1", + "0x82268bee9c1662d3ddb5fb785abfae6fb8b774190f30267f1d47091d2cd4b3874db4372625aa36c32f27b0eee986269b", + "0xb236459565b7b966166c4a35b2fa71030b40321821b8e96879d95f0e83a0baf33fa25721f30af4a631df209e25b96061", + "0x8708d752632d2435d2d5b1db4ad1fa2558d776a013655f88e9a3556d86b71976e7dfe5b8834fdec97682cd94560d0d0d", + "0xae1424a68ae2dbfb0f01211f11773732a50510b5585c1fb005cb892b2c6a58f4a55490b5c5b4483c6fce40e9d3236a52", + "0xb3f5f722af9dddb07293c871ce97abbccba0093ca98c8d74b1318fa21396fc1b45b69c15084f63d728f9908442024506", + "0x9606f3ce5e63886853ca476dc0949e7f1051889d529365c0cb0296fdc02abd088f0f0318ecd2cf36740a3634132d36f6", + "0xb11a833a49fa138db46b25ff8cdda665295226595bc212c0931b4931d0a55c99da972c12b4ef753f7e37c6332356e350", + "0xafede34e7dab0a9e074bc19a7daddb27df65735581ca24ad70c891c98b1349fcebbcf3ba6b32c2617fe06a5818dabc2d", + "0x97993d456e459e66322d01f8eb13918979761c3e8590910453944bdff90b24091bb018ac6499792515c9923be289f99f", + "0x977e3e967eff19290a192cd11df3667d511b398fb3ac9a5114a0f3707e25a0edcb56105648b1b85a8b7519fc529fc6f6", + "0xb873a7c88bf58731fe1bf61ff6828bf114cf5228f254083304a4570e854e83748fc98683ddba62d978fff7909f2c5c47", + "0xad4b2691f6f19da1d123aaa23cca3e876247ed9a4ab23c599afdbc0d3aa49776442a7ceaa996ac550d0313d9b9a36cee", + "0xb9210713c78e19685608c6475bfa974b57ac276808a443f8b280945c5d5f9c39da43effa294bfb1a6c6f7b6b9f85bf6c", + "0xa65152f376113e61a0e468759de38d742caa260291b4753391ee408dea55927af08a4d4a9918600a3bdf1df462dffe76", + "0x8bf8c27ad5140dde7f3d2280fd4cc6b29ab76537e8d7aa7011a9d2796ee3e56e9a60c27b5c2da6c5e14fc866301dc195", + "0x92fde8effc9f61393a2771155812b863cff2a0c5423d7d40aa04d621d396b44af94ddd376c28e7d2f53c930aea947484", + "0x97a01d1dd9ee30553ce676011aea97fa93d55038ada95f0057d2362ae9437f3ed13de8290e2ff21e3167dd7ba10b9c3f", + "0x89affffaa63cb2df3490f76f0d1e1d6ca35c221dd34057176ba739fa18d492355e6d2a5a5ad93a136d3b1fed0bb8aa19", + "0x928b8e255a77e1f0495c86d3c63b83677b4561a5fcbbe5d3210f1e0fc947496e426d6bf3b49394a5df796c9f25673fc4", + "0x842a0af91799c9b533e79ee081efe2a634cac6c584c2f054fb7d1db67dde90ae36de36cbf712ec9cd1a0c7ee79e151ea", + "0xa65b946cf637e090baf2107c9a42f354b390e7316beb8913638130dbc67c918926eb87bec3b1fe92ef72bc77a170fa3b", + "0xaafc0f19bfd71ab5ae4a8510c7861458b70ad062a44107b1b1dbacbfa44ba3217028c2824bd7058e2fa32455f624040b", + "0x95269dc787653814e0be899c95dba8cfa384f575a25e671c0806fd80816ad6797dc819d30ae06e1d0ed9cb01c3950d47", + "0xa1e760f7fa5775a1b2964b719ff961a92083c5c617f637fc46e0c9c20ab233f8686f7f38c3cb27d825c54dd95e93a59b", + "0xac3b8a7c2317ea967f229eddc3e23e279427f665c4705c7532ed33443f1243d33453c1088f57088d2ab1e3df690a9cc9", + "0xb787beeddfbfe36dd51ec4efd9cf83e59e84d354c3353cc9c447be53ae53d366ed1c59b686e52a92f002142c8652bfe0", + "0xb7a64198300cb6716aa7ac6b25621f8bdec46ad5c07a27e165b3f774cdf65bcfdbf31e9bae0c16b44de4b00ada7a4244", + "0xb8ae9f1452909e0c412c7a7fe075027691ea8df1347f65a5507bc8848f1d2c833d69748076db1129e5b4fb912f65c86c", + "0x9682e41872456b9fa67def89e71f06d362d6c8ca85c9c48536615bc401442711e1c9803f10ab7f8ab5feaec0f9df20a6", + "0x88889ff4e271dc1c7e21989cc39f73cde2f0475acd98078281591ff6c944fadeb9954e72334319050205d745d4df73df", + "0x8f79b5b8159e7fd0d93b0645f3c416464f39aec353b57d99ecf24f96272df8a068ad67a6c90c78d82c63b40bb73989bb", + "0x838c01a009a3d8558a3f0bdd5e22de21af71ca1aefc8423c91dc577d50920e9516880e87dce3e6d086e11cd45c9052d9", + "0xb97f1c6eee8a78f137c840667cc288256e39294268a3009419298a04a1d0087c9c9077b33c917c65caf76637702dda8a", + "0x972284ce72f96a61c899260203dfa06fc3268981732bef74060641c1a5068ead723e3399431c247ca034b0dae861e8df", + "0x945a8d52d6d3db6663dbd3110c6587f9e9c44132045eeffba15621576d178315cb52870fa5861669f84f0bee646183fe", + "0xa0a547b5f0967b1c3e5ec6c6a9a99f0578521489180dfdfbb5561f4d166baac43a2f06f950f645ce991664e167537eed", + "0xa0592cda5cdddf1340033a745fd13a6eff2021f2e26587116c61c60edead067e0f217bc2bef4172a3c9839b0b978ab35", + "0xb9c223b65a3281587fa44ec829e609154b32f801fd1de6950e01eafb07a8324243b960d5735288d0f89f0078b2c42b5b", + "0x99ebfc3b8f9f98249f4d37a0023149ed85edd7a5abe062c8fb30c8c84555258b998bdcdd1d400bc0fa2a4aaa8b224466", + "0x955b68526e6cb3937b26843270f4e60f9c6c8ece2fa9308fe3e23afa433309c068c66a4bc16ee2cf04220f095e9afce4", + "0xb766caeafcc00378135ae53397f8a67ed586f5e30795462c4a35853de6681b1f17401a1c40958de32b197c083b7279c1", + "0x921bf87cad947c2c33fa596d819423c10337a76fe5a63813c0a9dc78a728207ae7b339407a402fc4d0f7cba3af6da6fc", + "0xa74ba1f3bc3e6c025db411308f49b347ec91da1c916bda9da61e510ec8d71d25e0ac0f124811b7860e5204f93099af27", + "0xa29b4d144e0bf17a7e8353f2824cef0ce85621396babe8a0b873ca1e8a5f8d508b87866cf86da348470649fceefd735c", + "0xa8040e12ffc3480dd83a349d06741d1572ef91932c46f5cf03aee8454254156ee95786fd013d5654725e674c920cec32", + "0x8c4cf34ca60afd33923f219ffed054f90cd3f253ffeb2204a3b61b0183417e366c16c07fae860e362b0f2bfe3e1a1d35", + "0x8195eede4ddb1c950459df6c396b2e99d83059f282b420acc34220cadeed16ab65c856f2c52568d86d3c682818ed7b37", + "0x91fff19e54c15932260aa990c7fcb3c3c3da94845cc5aa8740ef56cf9f58d19b4c3c55596f8d6c877f9f4d22921d93aa", + "0xa3e0bf7e5d02a80b75cf75f2db7e66cb625250c45436e3c136d86297d652590ec97c2311bafe407ad357c79ab29d107b", + "0x81917ff87e5ed2ae4656b481a63ced9e6e5ff653b8aa6b7986911b8bc1ee5b8ef4f4d7882c3f250f2238e141b227e510", + "0x915fdbe5e7de09c66c0416ae14a8750db9412e11dc576cf6158755fdcaf67abdbf0fa79b554cac4fe91c4ec245be073f", + "0x8df27eafb5c3996ba4dc5773c1a45ca77e626b52e454dc1c4058aa94c2067c18332280630cc3d364821ee53bf2b8c130", + "0x934f8a17c5cbb827d7868f5c8ca00cb027728a841000a16a3428ab16aa28733f16b52f58c9c4fbf75ccc45df72d9c4df", + "0xb83f4da811f9183c25de8958bc73b504cf790e0f357cbe74ef696efa7aca97ad3b7ead1faf76e9f982c65b6a4d888fc2", + "0x87188213c8b5c268dc2b6da413f0501c95749e953791b727450af3e43714149c115b596b33b63a2f006a1a271b87efd0", + "0x83e9e888ab9c3e30761de635d9aabd31248cdd92f7675fc43e4b21fd96a03ec1dc4ad2ec94fec857ffb52683ac98e360", + "0xb4b9a1823fe2d983dc4ec4e3aaea297e581c3fc5ab4b4af5fa1370caa37af2d1cc7fc6bfc5e7da60ad8fdce27dfe4b24", + "0x856388bc78aef465dbcdd1f559252e028c9e9a2225c37d645c138e78f008f764124522705822a61326a6d1c79781e189", + "0xa6431b36db93c3b47353ba22e7c9592c9cdfb9cbdd052ecf2cc3793f5b60c1e89bc96e6bae117bfd047f2308da00dd2f", + "0xb619972d48e7e4291542dcde08f7a9cdc883c892986ded2f23ccb216e245cd8d9ad1d285347b0f9d7611d63bf4cee2bc", + "0x8845cca6ff8595955f37440232f8e61d5351500bd016dfadd182b9d39544db77a62f4e0102ff74dd4173ae2c181d24ef", + "0xb2f5f7fa26dcd3b6550879520172db2d64ee6aaa213cbef1a12befbce03f0973a22eb4e5d7b977f466ac2bf8323dcedd", + "0x858b7f7e2d44bdf5235841164aa8b4f3d33934e8cb122794d90e0c1cac726417b220529e4f896d7b77902ab0ccd35b3a", + "0x80b0408a092dae2b287a5e32ea1ad52b78b10e9c12f49282976cd738f5d834e03d1ad59b09c5ccaccc39818b87d06092", + "0xb996b0a9c6a2d14d984edcd6ab56bc941674102980d65b3ad9733455f49473d3f587c8cbf661228a7e125ddbe07e3198", + "0x90224fcebb36865293bd63af786e0c5ade6b67c4938d77eb0cbae730d514fdd0fe2d6632788e858afd29d46310cf86df", + "0xb71351fdfff7168b0a5ec48397ecc27ac36657a8033d9981e97002dcca0303e3715ce6dd3f39423bc8ef286fa2e9e669", + "0xae2a3f078b89fb753ce4ed87e0c1a58bb19b4f0cfb6586dedb9fcab99d097d659a489fb40e14651741e1375cfc4b6c5f", + "0x8ef476b118e0b868caed297c161f4231bbeb863cdfa5e2eaa0fc6b6669425ce7af50dc374abceac154c287de50c22307", + "0x92e46ab472c56cfc6458955270d3c72b7bde563bb32f7d4ab4d959db6f885764a3d864e1aa19802fefaa5e16b0cb0b54", + "0x96a3f68323d1c94e73d5938a18a377af31b782f56212de3f489d22bc289cf24793a95b37f1d6776edf88114b5c1fa695", + "0x962cc068cfce6faaa27213c4e43e44eeff0dfbb6d25b814e82c7da981fb81d7d91868fa2344f05fb552362f98cfd4a72", + "0x895d4e4c4ad670abf66d43d59675b1add7afad7438ada8f42a0360c704cee2060f9ac15b4d27e9b9d0996bb801276fe3", + "0xb3ad18d7ece71f89f2ef749b853c45dc56bf1c796250024b39a1e91ed11ca32713864049c9aaaea60cde309b47486bbf", + "0x8f05404e0c0258fdbae50e97ccb9b72ee17e0bd2400d9102c0dad981dac8c4c71585f03e9b5d50086d0a2d3334cb55d1", + "0x8bd877e9d4591d02c63c6f9fc9976c109de2d0d2df2bfa5f6a3232bab5b0b8b46e255679520480c2d7a318545efa1245", + "0x8d4c16b5d98957c9da13d3f36c46f176e64e5be879f22be3179a2c0e624fe4758a82bf8c8027410002f973a3b84cd55a", + "0x86e2a8dea86427b424fa8eada881bdff896907084a495546e66556cbdf070b78ba312bf441eb1be6a80006d25d5097a3", + "0x8608b0c117fd8652fdab0495b08fadbeba95d9c37068e570de6fddfef1ba4a1773b42ac2be212836141d1bdcdef11a17", + "0xa13d6febf5fb993ae76cae08423ca28da8b818d6ef0fde32976a4db57839cd45b085026b28ee5795f10a9a8e3098c683", + "0x8e261967fa6de96f00bc94a199d7f72896a6ad8a7bbb1d6187cca8fad824e522880e20f766620f4f7e191c53321d70f9", + "0x8b8e8972ac0218d7e3d922c734302803878ad508ca19f5f012bc047babd8a5c5a53deb5fe7c15a4c00fd6d1cb9b1dbd0", + "0xb5616b233fb3574a2717d125a434a2682ff68546dccf116dd8a3b750a096982f185614b9fb6c7678107ff40a451f56fa", + "0xaa6adf9b0c3334b0d0663f583a4914523b2ac2e7adffdb026ab9109295ff6af003ef8357026dbcf789896d2afded8d73", + "0xacb72df56a0b65496cd534448ed4f62950bb1e11e50873b6ed349c088ee364441821294ce0f7c61bd7d38105bea3b442", + "0xabae12df83e01ec947249fedd0115dc501d2b03ff7232092979eda531dbbca29ace1d46923427c7dde4c17bdf3fd7708", + "0x820b4fc2b63a9fda7964acf5caf19a2fc4965007cb6d6b511fcafcb1f71c3f673a1c0791d3f86e3a9a1eb6955b191cc0", + "0xaf277259d78c6b0f4f030a10c53577555df5e83319ddbad91afbd7c30bc58e7671c56d00d66ec3ab5ef56470cd910cee", + "0xad4a861c59f1f5ca1beedd488fb3d131dea924fffd8e038741a1a7371fad7370ca5cf80dc01f177fbb9576713bb9a5b3", + "0xb67a5162982ce6a55ccfb2f177b1ec26b110043cf18abd6a6c451cf140b5af2d634591eb4f28ad92177d8c7e5cd0a5e8", + "0x96176d0a83816330187798072d449cbfccff682561e668faf6b1220c9a6535b32a6e4f852e8abb00f79abb87493df16b", + "0xb0afe6e7cb672e18f0206e4423f51f8bd0017bf464c4b186d46332c5a5847647f89ff7fa4801a41c1b0b42f6135bcc92", + "0x8fc5e7a95ef20c1278c645892811f6fe3f15c431ebc998a32ec0da44e7213ea934ed2be65239f3f49b8ec471e9914160", + "0xb7793e41adda6c82ba1f2a31f656f6205f65bf8a3d50d836ee631bc7ce77c153345a2d0fc5c60edf8b37457c3729c4ec", + "0xa504dd7e4d6b2f4379f22cc867c65535079c75ccc575955f961677fa63ecb9f74026fa2f60c9fb6323c1699259e5e9c8", + "0xab899d00ae693649cc1afdf30fb80d728973d2177c006e428bf61c7be01e183866614e05410041bc82cb14a33330e69c", + "0x8a3bd8b0b1be570b65c4432a0f6dc42f48a2000e30ab089cf781d38f4090467b54f79c0d472fcbf18ef6a00df69cc6f3", + "0xb4d7028f7f76a96a3d7803fca7f507ae11a77c5346e9cdfccb120a833a59bda1f4264e425aa588e7a16f8e7638061d84", + "0xb9c7511a76ea5fb105de905d44b02edb17008335766ee357ed386b7b3cf19640a98b38785cb14603c1192bee5886c9b6", + "0x8563afb12e53aed71ac7103ab8602bfa8371ae095207cb0d59e8fd389b6ad1aff0641147e53cb6a7ca16c7f37c9c5e6b", + "0x8e108be614604e09974a9ed90960c28c4ea330a3d9a0cb4af6dd6f193f84ab282b243ecdf549b3131036bebc8905690c", + "0xb794d127fbedb9c5b58e31822361706ffac55ce023fbfe55716c3c48c2fd2f2c7660a67346864dfe588812d369cb50b6", + "0xb797a3442fc3b44f41baefd30346f9ac7f96e770d010d53c146ce74ce424c10fb62758b7e108b8abfdc5fafd89d745cb", + "0x993bb71e031e8096442e6205625e1bfddfe6dd6a83a81f3e2f84fafa9e5082ab4cad80a099f21eff2e81c83457c725c3", + "0x8711ab833fc03e37acf2e1e74cfd9133b101ff4144fe30260654398ae48912ab46549d552eb9d15d2ea57760d35ac62e", + "0xb21321fd2a12083863a1576c5930e1aecb330391ef83326d9d92e1f6f0d066d1394519284ddab55b2cb77417d4b0292f", + "0x877d98f731ffe3ee94b0b5b72d127630fa8a96f6ca4f913d2aa581f67732df6709493693053b3e22b0181632ac6c1e3b", + "0xae391c12e0eb8c145103c62ea64f41345973311c3bf7281fa6bf9b7faafac87bcf0998e5649b9ef81e288c369c827e07", + "0xb83a2842f36998890492ab1cd5a088d9423d192681b9a3a90ec518d4c541bce63e6c5f4df0f734f31fbfdd87785a2463", + "0xa21b6a790011396e1569ec5b2a423857b9bec16f543e63af28024e116c1ea24a3b96e8e4c75c6537c3e4611fd265e896", + "0xb4251a9c4aab3a495da7a42e684ba4860dbcf940ad1da4b6d5ec46050cbe8dab0ab9ae6b63b5879de97b905723a41576", + "0x8222f70aebfe6ac037f8543a08498f4cadb3edaac00336fc00437eb09f2cba758f6c38e887cc634b4d5b7112b6334836", + "0x86f05038e060594c46b5d94621a1d9620aa8ba59a6995baf448734e21f58e23c1ea2993d3002ad5250d6edd5ba59b34f", + "0xa7c0c749baef811ab31b973c39ceb1d94750e2bc559c90dc5eeb20d8bb6b78586a2b363c599ba2107d6be65cd435f24e", + "0x861d46a5d70b38d6c1cd72817a2813803d9f34c00320c8b62f8b9deb67f5b5687bc0b37c16d28fd017367b92e05da9ca", + "0xb3365d3dab639bffbe38e35383686a435c8c88b397b717cd4aeced2772ea1053ceb670f811f883f4e02975e5f1c4ac58", + "0xa5750285f61ab8f64cd771f6466e2c0395e01b692fd878f2ef2d5c78bdd8212a73a3b1dfa5e4c8d9e1afda7c84857d3b", + "0x835a10809ccf939bc46cf950a33b36d71be418774f51861f1cd98a016ade30f289114a88225a2c11e771b8b346cbe6ef", + "0xa4f59473a037077181a0a62f1856ec271028546ca9452b45cedfcb229d0f4d1aabfc13062b07e536cc8a0d4b113156a2", + "0x95cd14802180b224d44a73cc1ed599d6c4ca62ddcaa503513ccdc80aaa8be050cc98bd4b4f3b639549beb4587ac6caf9", + "0x973b731992a3e69996253d7f36dd7a0af1982b5ed21624b77a7965d69e9a377b010d6dabf88a8a97eec2a476259859cc", + "0xaf8a1655d6f9c78c8eb9a95051aa3baaf9c811adf0ae8c944a8d3fcba87b15f61021f3baf6996fa0aa51c81b3cb69de1", + "0x835aad5c56872d2a2d6c252507b85dd742bf9b8c211ccb6b25b52d15c07245b6d89b2a40f722aeb5083a47cca159c947", + "0xabf4e970b02bef8a102df983e22e97e2541dd3650b46e26be9ee394a3ea8b577019331857241d3d12b41d4eacd29a3ac", + "0xa13c32449dbedf158721c13db9539ae076a6ce5aeaf68491e90e6ad4e20e20d1cdcc4a89ed9fd49cb8c0dd50c17633c1", + "0x8c8f78f88b7e22dd7e9150ab1c000f10c28e696e21d85d6469a6fe315254740f32e73d81ab1f3c1cf8f544c86df506e8", + "0xb4b77f2acfe945abf81f2605f906c10b88fb4d28628487fb4feb3a09f17f28e9780445dfcee4878349d4c6387a9d17d4", + "0x8d255c235f3812c6ecc646f855fa3832be5cb4dbb9c9e544989fafdf3f69f05bfd370732eaf954012f0044aa013fc9c6", + "0xb982efd3f34b47df37c910148ac56a84e8116647bea24145a49e34e0a6c0176e3284d838dae6230cb40d0be91c078b85", + "0x983f365aa09bd85df2a6a2ad8e4318996b1e27d02090755391d4486144e40d80b1fbfe1c798d626db92f52e33aa634da", + "0x95fd1981271f3ea3a41d654cf497e6696730d9ff7369f26bc4d7d15c7adb4823dd0c42e4a005a810af12d234065e5390", + "0xa9f5219bd4b913c186ef30c02f995a08f0f6f1462614ea5f236964e02bdaa33db9d9b816c4aee5829947840a9a07ba60", + "0x9210e6ceb05c09b46fd09d036287ca33c45124ab86315e5d6911ff89054f1101faaa3e83d123b7805056d388bcec6664", + "0x8ed9cbf69c6ff3a5c62dd9fe0d7264578c0f826a29e614bc2fb4d621d90c8c9992438accdd7a614b1dca5d1bb73dc315", + "0x85cf2a8cca93e00da459e3cecd22c342d697eee13c74d5851634844fc215f60053cf84b0e03c327cb395f48d1c71a8a4", + "0x8818a18e9a2ec90a271b784400c1903089ffb0e0b40bc5abbbe12fbebe0f731f91959d98c5519ef1694543e31e2016d4", + "0x8dabc130f296fa7a82870bf9a8405aaf542b222ed9276bba9bd3c3555a0f473acb97d655ee7280baff766a827a8993f0", + "0xac7952b84b0dc60c4d858f034093b4d322c35959605a3dad2b806af9813a4680cb038c6d7f4485b4d6b2ff502aaeca25", + "0xad65cb6d57b48a2602568d2ec8010baed0eb440eec7638c5ec8f02687d764e9de5b5d42ad5582934e592b48471c22d26", + "0xa02ab8bd4c3d114ea23aebdd880952f9495912817da8c0c08eabc4e6755439899d635034413d51134c72a6320f807f1c", + "0x8319567764b8295402ec1ebef4c2930a138480b37e6d7d01c8b4c9cd1f2fc3f6e9a44ae6e380a0c469b25b06db23305f", + "0xafec53b2301dc0caa8034cd9daef78c48905e6068d692ca23d589b84a6fa9ddc2ed24a39480597e19cb3e83eec213b3f", + "0xac0b4ffdb5ae08e586a9cdb98f9fe56f4712af3a97065e89e274feacfb52b53c839565aee93c4cfaaccfe51432c4fab0", + "0x8972cbf07a738549205b1094c5987818124144bf187bc0a85287c94fdb22ce038c0f11df1aa16ec5992e91b44d1af793", + "0xb7267aa6f9e3de864179b7da30319f1d4cb2a3560f2ea980254775963f1523b44c680f917095879bebfa3dc2b603efcf", + "0x80f68f4bfc337952e29504ee5149f15093824ea7ab02507efd1317a670f6cbc3611201848560312e3e52e9d9af72eccf", + "0x8897fee93ce8fc1e1122e46b6d640bba309384dbd92e46e185e6364aa8210ebf5f9ee7e5e604b6ffba99aa80a10dd7d0", + "0xb58ea6c02f2360be60595223d692e82ee64874fda41a9f75930f7d28586f89be34b1083e03bbc1575bbfdda2d30db1ea", + "0x85a523a33d903280d70ac5938770453a58293480170c84926457ac2df45c10d5ff34322ab130ef4a38c916e70d81af53", + "0xa2cbf045e1bed38937492c1f2f93a5ba41875f1f262291914bc1fc40c60bd0740fb3fea428faf6da38b7c180fe8ac109", + "0x8c09328770ed8eb17afc6ac7ddd87bb476de18ed63cab80027234a605806895959990c47bd10d259d7f3e2ecb50074c9", + "0xb4b9e19edb4a33bde8b7289956568a5b6b6557404e0a34584b5721fe6f564821091013fbb158e2858c6d398293bb4b59", + "0x8a47377df61733a2aa5a0e945fce00267f8e950f37e109d4487d92d878fb8b573317bb382d902de515b544e9e233458d", + "0xb5804c9d97efeff5ca94f3689b8088c62422d92a1506fd1d8d3b1b30e8a866ad0d6dad4abfa051dfc4471250cac4c5d9", + "0x9084a6ee8ec22d4881e9dcc8a9eb3c2513523d8bc141942370fd191ad2601bf9537a0b1e84316f3209b3d8a54368051e", + "0x85447eea2fa26656a649f8519fa67279183044791d61cf8563d0783d46d747d96af31d0a93507bbb2242666aa87d3720", + "0x97566a84481027b60116c751aec552adfff2d9038e68d48c4db9811fb0cbfdb3f1d91fc176a0b0d988a765f8a020bce1", + "0xae87e5c1b9e86c49a23dceda4ecfd1dcf08567f1db8e5b6ec752ebd45433c11e7da4988573cdaebbb6f4135814fc059e", + "0xabee05cf9abdbc52897ac1ce9ed157f5466ed6c383d6497de28616238d60409e5e92619e528af8b62cc552bf09970dc2", + "0xae6d31cd7bf9599e5ee0828bab00ceb4856d829bba967278a73706b5f388465367aa8a6c7da24b5e5f1fdd3256ef8e63", + "0xac33e7b1ee47e1ee4af472e37ab9e9175260e506a4e5ce449788075da1b53c44cb035f3792d1eea2aa24b1f688cc6ed3", + "0x80f65b205666b0e089bb62152251c48c380a831e5f277f11f3ef4f0d52533f0851c1b612267042802f019ec900dc0e8f", + "0x858520ad7aa1c9fed738e3b583c84168f2927837ad0e1d326afe9935c26e9b473d7f8c382e82ef1fe37d2b39bb40a1ee", + "0xb842dd4af8befe00a97c2d0f0c33c93974761e2cb9e5ab8331b25170318ddd5e4bdbc02d8f90cbfdd5f348f4f371c1f7", + "0x8bf2cb79bc783cb57088aae7363320cbeaabd078ffdec9d41bc74ff49e0043d0dad0086a30e5112b689fd2f5a606365d", + "0x982eb03bbe563e8850847cd37e6a3306d298ab08c4d63ab6334e6b8c1fa13fce80cf2693b09714c7621d74261a0ff306", + "0xb143edb113dec9f1e5105d4a93fbe502b859e587640d3db2f628c09a17060e6aec9e900e2c8c411cda99bc301ff96625", + "0xaf472d9befa750dcebc5428fe1a024f18ec1c07bca0f95643ce6b5f4189892a910285afb03fd7ed7068fbe614e80d33c", + "0xa97e3bc57ede73ecd1bbf02de8f51b4e7c1a067da68a3cd719f4ba26a0156cbf1cef2169fd35a18c5a4cced50d475998", + "0xa862253c937cf3d75d7183e5f5be6a4385d526aeda5171c1c60a8381fea79f88f5f52a4fab244ecc70765d5765e6dfd5", + "0x90cb776f8e5a108f1719df4a355bebb04bf023349356382cae55991b31720f0fd03206b895fa10c56c98f52453be8778", + "0xa7614e8d0769dccd520ea4b46f7646e12489951efaef5176bc889e9eb65f6e31758df136b5bf1e9107e68472fa9b46ec", + "0xac3a9b80a3254c42e5ed3a090a0dd7aee2352f480de96ad187027a3bb6c791eddfc3074b6ffd74eea825188f107cda4d", + "0x82a01d0168238ef04180d4b6e0a0e39024c02c2d75b065017c2928039e154d093e1af4503f4d1f3d8a948917abb5d09f", + "0x8fab000a2b0eef851a483aec8d2dd85fe60504794411a2f73ed82e116960547ac58766cb73df71aea71079302630258d", + "0x872451a35c6db61c63e9b8bb9f16b217f985c20be4451c14282c814adb29d7fb13f201367c664435c7f1d4d9375d7a58", + "0x887d9ff54cc96b35d562df4a537ff972d7c4b3fd91ab06354969a4cfede0b9fc68bbffb61d0dbf1a58948dc701e54f5a", + "0x8cb5c2a6bd956875d88f41ae24574434f1308514d44057b55c9c70f13a3366ed054150eed0955a38fda3f757be73d55f", + "0x89ad0163cad93e24129d63f8e38422b7674632a8d0a9016ee8636184cab177659a676c4ee7efba3abe1a68807c656d60", + "0xb9ec01c7cab6d00359b5a0b4a1573467d09476e05ca51a9227cd16b589a9943d161eef62dcc73f0de2ec504d81f4d252", + "0x8031d17635d39dfe9705c485d2c94830b6fc9bc67b91300d9d2591b51e36a782e77ab5904662effa9382d9cca201f525", + "0x8be5a5f6bc8d680e5092d6f9a6585acbaaaa2ddc671da560dcf5cfa4472f4f184b9597b5b539438accd40dda885687cc", + "0xb1fc0f052fae038a2e3de3b3a96b0a1024b009de8457b8b3adb2d315ae68a89af905720108a30038e5ab8d0d97087785", + "0x8b8bdc77bd3a6bc7ca5492b6f8c614852c39a70d6c8a74916eaca0aeb4533b11898b8820a4c2620a97bf35e275480029", + "0xaf35f4dc538d4ad5cdf710caa38fd1eb496c3fa890a047b6a659619c5ad3054158371d1e88e0894428282eed9f47f76b", + "0x8166454a7089cc07758ad78724654f4e7a1a13e305bbf88ddb86f1a4b2904c4fc8ab872d7da364cdd6a6c0365239e2ad", + "0xab287c7d3addce74ce40491871c768abe01daaa0833481276ff2e56926b38a7c6d2681ffe837d2cc323045ad1a4414f9", + "0xb90317f4505793094d89365beb35537f55a6b5618904236258dd04ca61f21476837624a2f45fef8168acf732cab65579", + "0x98ae5ea27448e236b6657ab5ef7b1cccb5372f92ab25f5fa651fbac97d08353a1dae1b280b1cd42b17d2c6a70a63ab9d", + "0xadcf54e752d32cbaa6cb98fbca48d8cd087b1db1d131d465705a0d8042c8393c8f4d26b59006eb50129b21e6240f0c06", + "0xb591a3e4db18a7345fa935a8dd7994bbac5cc270b8ebd84c8304c44484c7a74afb45471fdbe4ab22156a30fae1149b40", + "0x806b53ac049a42f1dcc1d6335505371da0bf27c614f441b03bbf2e356be7b2fb4eed7117eabcce9e427a542eaa2bf7d8", + "0x800482e7a772d49210b81c4a907f5ce97f270b959e745621ee293cf8c71e8989363d61f66a98f2d16914439544ca84c7", + "0x99de9eafdad3617445312341644f2bb888680ff01ce95ca9276b1d2e5ef83fa02dab5e948ebf66c17df0752f1bd37b70", + "0x961ee30810aa4c93ae157fbe9009b8e443c082192bd36a73a6764ff9b2ad8b0948fe9a73344556e01399dd77badb4257", + "0xae0a361067c52efbe56c8adf982c00432cd478929459fc7f74052c8ee9531cd031fe1335418fde53f7c2ef34254eb7ac", + "0xa3503d16b6b27eb20c1b177bcf90d13706169220523a6271b85b2ce35a9a2b9c5bed088540031c0a4ebfdae3a4c6ab04", + "0x909420122c3e723289ca4e7b81c2df5aff312972a2203f4c45821b176e7c862bf9cac7f7df3adf1d59278f02694d06e7", + "0x989f42380ae904b982f85d0c6186c1aef5d6bcba29bcfbb658e811b587eb2749c65c6e4a8cc6409c229a107499a4f5d7", + "0x8037a6337195c8e26a27ea4ef218c6e7d79a9720aaab43932d343192abc2320fe72955f5e431c109093bda074103330a", + "0xb312e168663842099b88445e940249cc508f080ab0c94331f672e7760258dbd86be5267e4cf25ea25facb80bff82a7e9", + "0xaaa3ff8639496864fcdbfdda1ac97edc4f08e3c9288b768f6c8073038c9fbbf7e1c4bea169b4d45c31935cdf0680d45e", + "0x97dbd3df37f0b481a311dfc5f40e59227720f367912200d71908ef6650f32cc985cb05b981e3eea38958f7e48d10a15d", + "0xa89d49d1e267bb452d6cb621b9a90826fe55e9b489c0427b94442d02a16f390eed758e209991687f73f6b5a032321f42", + "0x9530dea4e0e19d6496f536f2e75cf7d814d65fde567055eb20db48fd8d20d501cd2a22fb506db566b94c9ee10f413d43", + "0x81a7009b9e67f1965fa7da6a57591c307de91bf0cd35ab4348dc4a98a4961e096d004d7e7ad318000011dc4342c1b809", + "0x83440a9402b766045d7aca61a58bba2aa29cac1cf718199e472ba086f5d48093d9dda4d135292ba51d049a23964eceae", + "0xa06c9ce5e802df14f6b064a3d1a0735d429b452f0e2e276042800b0a4f16df988fd94cf3945921d5dd3802ab2636f867", + "0xb1359e358b89936dee9e678a187aad3e9ab14ac40e96a0a68f70ee2583cdcf467ae03bef4215e92893f4e12f902adec8", + "0x835304f8619188b4d14674d803103d5a3fa594d48e96d9699e653115dd05fdc2dda6ba3641cf7ad53994d448da155f02", + "0x8327cba5a9ff0d3f5cd0ae55e77167448926d5fcf76550c0ad978092a14122723090c51c415e88e42a2b62eb07cc3981", + "0xb373dcdaea85f85ce9978b1426a7ef4945f65f2d3467a9f1cc551a99766aac95df4a09e2251d3f89ca8c9d1a7cfd7b0e", + "0xab1422dc41af2a227b973a6fd124dfcb2367e2a11a21faa1d381d404f51b7257e5bc82e9cf20cd7fe37d7ae761a2ab37", + "0xa93774a03519d2f20fdf2ef46547b0a5b77c137d6a3434b48d56a2cbef9e77120d1b85d0092cf8842909213826699477", + "0x8eb967a495a38130ea28711580b7e61bcd1d051cd9e4f2dbf62f1380bd86e0d60e978d72f6f31e909eb97b3b9a2b867c", + "0xae8213378da1287ba1fe4242e1acaec19b877b6fe872400013c6eac1084b8d03156792fa3020201725b08228a1e80f49", + "0xb143daf6893d674d607772b3b02d8ac48f294237e2f2c87963c0d4e26d9227d94a2a13512457c3d5883544bbc259f0ef", + "0xb343bd2aca8973888e42542218924e2dda2e938fd1150d06878af76f777546213912b7c7a34a0f94186817d80ffa185c", + "0xb188ebc6a8c3007001aa347ae72cc0b15d09bc6c19a80e386ee4b334734ec0cc2fe8b493c2422f38d1e6d133cc3db6fe", + "0xb795f6a8b9b826aaeee18ccd6baf6c5adeeec85f95eb5b6d19450085ec7217e95a2d9e221d77f583b297d0872073ba0e", + "0xb1c7dbd998ad32ae57bfa95deafa147024afd57389e98992c36b6e52df915d3d5a39db585141ec2423173e85d212fed8", + "0x812bcdeb9fe5f12d0e1df9964798056e1f1c3de3b17b6bd2919b6356c4b86d8e763c01933efbe0224c86a96d5198a4be", + "0xb19ebeda61c23d255cbf472ef0b8a441f4c55b70f0d8ed47078c248b1d3c7c62e076b43b95c00a958ec8b16d5a7cb0d7", + "0xb02adc9aaa20e0368a989c2af14ff48b67233d28ebee44ff3418bb0473592e6b681af1cc45450bd4b175df9051df63d9", + "0x8d87f0714acee522eb58cec00360e762adc411901dba46adc9227124fa70ee679f9a47e91a6306d6030dd4eb8de2f3c1", + "0x8be54cec21e74bcc71de29dc621444263737db15f16d0bb13670f64e42f818154e04b484593d19ef95f2ee17e4b3fe21", + "0xab8e20546c1db38d31493b5d5f535758afb17e459645c1b70813b1cf7d242fd5d1f4354a7c929e8f7259f6a25302e351", + "0x89f035a1ed8a1e302ac893349ba8ddf967580fcb6e73d44af09e3929cde445e97ff60c87dafe489e2c0ab9c9986cfa00", + "0x8b2b0851a795c19191a692af55f7e72ad2474efdc5401bc3733cfdd910e34c918aaebe69d5ea951bdddf3c01cabbfc67", + "0xa4edb52c2b51495ccd1ee6450fc14b7b3ede8b3d106808929d02fb31475bacb403e112ba9c818d2857651e508b3a7dd1", + "0x9569341fded45d19f00bcf3cbf3f20eb2b4d82ef92aba3c8abd95866398438a2387437e580d8b646f17cf6fde8c5af23", + "0xaa4b671c6d20f72f2f18a939a6ff21cc37e0084b44b4a717f1be859a80b39fb1be026b3205adec2a66a608ec2bcd578f", + "0x94902e980de23c4de394ad8aec91b46f888d18f045753541492bfbb92c59d3daa8de37ae755a6853744af8472ba7b72b", + "0xaf651ef1b2a0d30a7884557edfad95b6b5d445a7561caebdc46a485aedd25932c62c0798465c340a76f6feaa196dd712", + "0xb7b669b8e5a763452128846dd46b530dca4893ace5cc5881c7ddcd3d45969d7e73fbebdb0e78aa81686e5f7b22ec5759", + "0x82507fd4ebe9fa656a7f2e084d64a1fa6777a2b0bc106d686e2d9d2edafc58997e58cb6bfd0453b2bf415704aa82ae62", + "0xb40bce2b42b88678400ecd52955bbdadd15f8b9e1b3751a1a3375dc0efb5ca3ee258cf201e1140b3c09ad41217d1d49e", + "0xb0210d0cbb3fbf3b8cdb39e862f036b0ff941cd838e7aaf3a8354e24246e64778d22f3de34572e6b2a580614fb6425be", + "0x876693cba4301b251523c7d034108831df3ce133d8be5a514e7a2ca494c268ca0556fa2ad8310a1d92a16b55bcd99ea9", + "0x8660281406d22a4950f5ef050bf71dd3090edb16eff27fa29ef600cdea628315e2054211ed2cc6eaf8f2a1771ef689fd", + "0xa610e7e41e41ab66955b809ba4ade0330b8e9057d8efc9144753caed81995edeb1a42a53f93ce93540feca1fae708dac", + "0xa49e2c176a350251daef1218efaccc07a1e06203386ede59c136699d25ca5cb2ac1b800c25b28dd05678f14e78e51891", + "0x83e0915aa2b09359604566080d411874af8c993beba97d4547782fdbe1a68e59324b800ff1f07b8db30c71adcbd102a8", + "0xa19e84e3541fb6498e9bb8a099c495cbfcad113330e0262a7e4c6544495bb8a754b2208d0c2d895c93463558013a5a32", + "0x87f2bd49859a364912023aca7b19a592c60214b8d6239e2be887ae80b69ebdeb59742bdebcfa73a586ab23b2c945586c", + "0xb8e8fdddae934a14b57bc274b8dcd0d45ebb95ddbaabef4454e0f6ce7d3a5a61c86181929546b3d60c447a15134d08e1", + "0x87e0c31dcb736ea4604727e92dc1d9a3cf00adcff79df3546e02108355260f3dd171531c3c0f57be78d8b28058fcc8c0", + "0x9617d74e8f808a4165a8ac2e30878c349e1c3d40972006f0787b31ea62d248c2d9f3fc3da83181c6e57e95feedfd0e8c", + "0x8949e2cee582a2f8db86e89785a6e46bc1565c2d8627d5b6bf43ba71ffadfab7e3c5710f88dcb5fb2fc6edf6f4fae216", + "0xad3fa7b0edceb83118972a2935a09f409d09a8db3869f30be3a76f67aa9fb379cabb3a3aff805ba023a331cad7d7eb64", + "0x8c95718a4112512c4efbd496be38bf3ca6cdcaad8a0d128f32a3f9aae57f3a57bdf295a3b372a8c549fda8f4707cffed", + "0x88f3261d1e28a58b2dee3fcc799777ad1c0eb68b3560f9b4410d134672d9533532a91ea7be28a041784872632d3c9d80", + "0xb47472a41d72dd2e8b72f5c4f8ad626737dde3717f63d6bc776639ab299e564cbad0a2ad5452a07f02ff49a359c437e5", + "0x9896d21dc2e8aad87b76d6df1654f10cd7bceed4884159d50a818bea391f8e473e01e14684814c7780235f28e69dca6e", + "0x82d47c332bbd31bbe83b5eb44a23da76d4a7a06c45d7f80f395035822bc27f62f59281d5174e6f8e77cc9b5c3193d6f0", + "0x95c74cd46206e7f70c9766117c34c0ec45c2b0f927a15ea167901a160e1530d8522943c29b61e03568aa0f9c55926c53", + "0xa89d7757825ae73a6e81829ff788ea7b3d7409857b378ebccd7df73fdbe62c8d9073741cf038314971b39af6c29c9030", + "0x8c1cd212d0b010905d560688cfc036ae6535bc334fa8b812519d810b7e7dcf1bb7c5f43deaa40f097158358987324a7f", + "0xb86993c383c015ed8d847c6b795164114dd3e9efd25143f509da318bfba89389ea72a420699e339423afd68b6512fafb", + "0x8d06bd379c6d87c6ed841d8c6e9d2d0de21653a073725ff74be1934301cc3a79b81ef6dd0aad4e7a9dc6eac9b73019bc", + "0x81af4d2d87219985b9b1202d724fe39ef988f14fef07dfe3c3b11714e90ffba2a97250838e8535eb63f107abfe645e96", + "0x8c5e0af6330a8becb787e4b502f34f528ef5756e298a77dc0c7467433454347f3a2e0bd2641fbc2a45b95e231c6e1c02", + "0x8e2a8f0f04562820dc8e7da681d5cad9fe2e85dd11c785fb6fba6786c57a857e0b3bd838fb849b0376c34ce1665e4837", + "0xa39be8269449bfdfc61b1f62077033649f18dae9bef7c6163b9314ca8923691fb832f42776f0160b9e8abd4d143aa4e1", + "0x8c154e665706355e1cc98e0a4cabf294ab019545ba9c4c399d666e6ec5c869ca9e1faf8fb06cd9c0a5c2f51a7d51b70a", + "0xa046a7d4de879d3ebd4284f08f24398e9e3bf006cd4e25b5c67273ade248689c69affff92ae810c07941e4904296a563", + "0xafd94c1cb48758e5917804df03fb38a6da0e48cd9b6262413ea13b26973f9e266690a1b7d9d24bbaf7e82718e0e594b0", + "0x859e21080310c8d6a38e12e2ac9f90a156578cdeb4bb2e324700e97d9a5511cd6045dc39d1d0de3f94aeed043a24119d", + "0xa219fb0303c379d0ab50893264919f598e753aac9065e1f23ef2949abc992577ab43c636a1d2c089203ec9ddb941e27d", + "0xb0fdb639d449588a2ca730afcba59334e7c387342d56defdfb7ef79c493f7fd0e5277eff18e7203e756c7bdda5803047", + "0x87f9c3b7ed01f54368aca6dbcf2f6e06bff96e183c4b2c65f8baa23b377988863a0a125d5cdd41a072da8462ced4c070", + "0x99ef7a5d5ac2f1c567160e1f8c95f2f38d41881850f30c461a205f7b1b9fb181277311333839b13fb3ae203447e17727", + "0xaeaca9b1c2afd24e443326cc68de67b4d9cedb22ad7b501a799d30d39c85bb2ea910d4672673e39e154d699e12d9b3dc", + "0xa11675a1721a4ba24dd3d0e4c3c33a6edf4cd1b9f6b471070b4386c61f77452266eae6e3f566a40cfc885eada9a29f23", + "0xb228334445e37b9b49cb4f2cc56b454575e92173ddb01370a553bba665adadd52df353ad74470d512561c2c3473c7bb9", + "0xa18177087c996572d76f81178d18ed1ceebc8362a396348ce289f1d8bd708b9e99539be6fccd4acb1112381cfc5749b4", + "0x8e7b8bf460f0d3c99abb19803b9e43422e91507a1c0c22b29ee8b2c52d1a384da4b87c292e28eff040db5be7b1f8641f", + "0xb03d038d813e29688b6e6f444eb56fec3abba64c3d6f890a6bcf2e916507091cdb2b9d2c7484617be6b26552ed1c56cb", + "0xa1c88ccd30e934adfc5494b72655f8afe1865a84196abfb376968f22ddc07761210b6a9fb7638f1413d1b4073d430290", + "0x961b714faebf172ad2dbc11902461e286e4f24a99a939152a53406117767682a571057044decbeb3d3feef81f4488497", + "0xa03dc4059b46effdd786a0a03cc17cfee8585683faa35bb07936ded3fa3f3a097f518c0b8e2db92fd700149db1937789", + "0xadf60180c99ca574191cbcc23e8d025b2f931f98ca7dfcebfc380226239b6329347100fcb8b0fcb12db108c6ad101c07", + "0x805d4f5ef24d46911cbf942f62cb84b0346e5e712284f82b0db223db26d51aabf43204755eb19519b00e665c7719fcaa", + "0x8dea7243e9c139662a7fe3526c6c601eee72fd8847c54c8e1f2ad93ef7f9e1826b170afe58817dac212427164a88e87f", + "0xa2ba42356606d651b077983de1ad643650997bb2babb188c9a3b27245bb65d2036e46667c37d4ce02cb1be5ae8547abe", + "0xaf2ae50b392bdc013db2d12ce2544883472d72424fc767d3f5cb0ca2d973fc7d1f425880101e61970e1a988d0670c81b", + "0x98e6bec0568d3939b31d00eb1040e9b8b2a35db46ddf4369bdaee41bbb63cc84423d29ee510a170fb5b0e2df434ba589", + "0x822ff3cd12fbef4f508f3ca813c04a2e0b9b799c99848e5ad3563265979e753ee61a48f6adc2984a850f1b46c1a43d35", + "0x891e8b8b92a394f36653d55725ef514bd2e2a46840a0a2975c76c2a935577f85289026aaa74384da0afe26775cbddfb9", + "0xb2a3131a5d2fe7c8967047aa66e4524babae941d90552171cc109527f345f42aa0df06dcbb2fa01b33d0043917bbed69", + "0x80c869469900431f3eeefafdbe07b8afd8cee7739e659e6d0109b397cacff85a88247698f87dc4e2fe39a592f250ac64", + "0x9091594f488b38f9d2bb5df49fd8b4f8829d9c2f11a197dd1431ed5abbc5c954bbde3387088f9ee3a5a834beb7619bce", + "0xb472e241e6956146cca57b97a8a204668d050423b4e76f857bad5b47f43b203a04c8391ba9d9c3e95093c071f9d376a1", + "0xb7dd2de0284844392f7dfb56fe7ca3ede41e27519753ffc579a0a8d2d65ceb8108d06b6b0d4c3c1a2588951297bd1a1e", + "0x902116ce70d0a079ac190321c1f48701318c05f8e69ee09694754885d33a835a849cafe56f499a2f49f6cda413ddf9a7", + "0xb18105cc736787fafaf7c3c11c448bce9466e683159dff52723b7951dff429565e466e4841d982e3aaa9ee2066838666", + "0x97ab9911f3f659691762d568ae0b7faa1047b0aed1009c319fa79d15d0db8db9f808fc385dc9a68fa388c10224985379", + "0xb2a2cba65f5b927e64d2904ba412e2bac1cf18c9c3eda9c72fb70262497ecf505b640827e2afebecf10eebbcf48ccd3e", + "0xb36a3fd677baa0d3ef0dac4f1548ff50a1730286b8c99d276a0a45d576e17b39b3cbadd2fe55e003796d370d4be43ce3", + "0xa5dfec96ca3c272566e89dc453a458909247e3895d3e44831528130bc47cc9d0a0dac78dd3cad680a4351d399d241967", + "0x8029382113909af6340959c3e61db27392531d62d90f92370a432aec3eb1e4c36ae1d4ef2ba8ec6edb4d7320c7a453f6", + "0x971d85121ea108e6769d54f9c51299b0381ece8b51d46d49c89f65bedc123bab4d5a8bc14d6f67f4f680077529cbae4c", + "0x98ff6afc01d0bec80a278f25912e1b1ebff80117adae72e31d5b9fa4d9624db4ba2065b444df49b489b0607c45e26c4c", + "0x8fa29be10fb3ab30ce25920fec0187e6e91e458947009dabb869aade7136c8ba23602682b71e390c251f3743164cbdaa", + "0xb3345c89eb1653418fe3940cf3e56a9a9c66526389b98f45ca02dd62bfb37baa69a4baaa7132d7320695f8ea6ad1fd94", + "0xb72c7f5541c9ac6b60a7ec9f5415e7fb14da03f7164ea529952a29399f3a071576608dbbcc0d45994f21f92ddbeb1e19", + "0xaa3450bb155a5f9043d0ef95f546a2e6ade167280bfb75c9f09c6f9cdb1fffb7ce8181436161a538433afa3681c7a141", + "0x92a18fecaded7854b349f441e7102b638ababa75b1b0281dd0bded6541abe7aa37d96693595be0b01fe0a2e2133d50f9", + "0x980756ddf9d2253cfe6c94960b516c94889d09e612810935150892627d2ecee9a2517e04968eea295d0106850c04ca44", + "0xae68c6ccc454318cdd92f32b11d89116a3b8350207a36d22a0f626718cad671d960090e054c0c77ac3162ae180ecfd4b", + "0x99f31f66eaaa551749ad91d48a0d4e3ff4d82ef0e8b28f3184c54e852422ba1bdafd53b1e753f3a070f3b55f3c23b6a2", + "0xa44eaeaa6589206069e9c0a45ff9fc51c68da38d4edff1d15529b7932e6f403d12b9387019c44a1488a5d5f27782a51f", + "0xb80b5d54d4b344840e45b79e621bd77a3f83fb4ce6d8796b7d6915107b3f3c34d2e7d95bdafd120f285669e5acf2437a", + "0xb36c069ec085a612b5908314d6b84c00a83031780261d1c77a0384c406867c9847d5b0845deddfa512cc04a8df2046fb", + "0xb09dbe501583220f640d201acea7ee3e39bf9eda8b91aa07b5c50b7641d86d71acb619b38d27835ce97c3759787f08e9", + "0x87403d46a2bf63170fff0b857acacf42ee801afe9ccba8e5b4aea967b68eac73a499a65ca46906c2eb4c8f27bc739faa", + "0x82b93669f42a0a2aa5e250ffe6097269da06a9c02fcd1801abbad415a7729a64f830754bafc702e64600ba47671c2208", + "0x8e3a3029be7edb8dd3ab1f8216664c8dc50d395f603736061d802cef77627db7b859ef287ed850382c13b4d22d6a2d80", + "0x968e9ec7194ff424409d182ce0259acd950c384c163c04463bc8700a40b79beba6146d22b7fa7016875a249b7b31c602", + "0x8b42c984bbe4996e0c20862059167c6bdc5164b1ffcd928f29512664459212d263e89f0f0e30eed4e672ffa5ed0b01b5", + "0x96bac54062110dada905363211133f1f15dc7e4fd80a4c6e4a83bc9a0bcbbaba11cd2c7a13debcf0985e1a954c1da66b", + "0xa16dc8a653d67a7cd7ae90b2fffac0bf1ca587005430fe5ba9403edd70ca33e38ba5661d2ed6e9d2864400d997626a62", + "0xa68ab11a570a27853c8d67e491591dcba746bfbee08a2e75ae0790399130d027ed387f41ef1d7de8df38b472df309161", + "0x92532b74886874447c0300d07eda9bbe4b41ed25349a3da2e072a93fe32c89d280f740d8ff70d5816793d7f2b97373cc", + "0x88e35711b471e89218fd5f4d0eadea8a29405af1cd81974427bc4a5fb26ed60798daaf94f726c96e779b403a2cd82820", + "0xb5c72aa4147c19f8c4f3a0a62d32315b0f4606e0a7025edc5445571eaf4daff64f4b7a585464821574dd50dbe1b49d08", + "0x9305d9b4095258e79744338683fd93f9e657367b3ab32d78080e51d54eec331edbc224fad5093ebf8ee4bd4286757eb8", + "0xb2a17abb3f6a05bcb14dc7b98321fa8b46d299626c73d7c6eb12140bf4c3f8e1795250870947af817834f033c88a59d6", + "0xb3477004837dbd8ba594e4296f960fc91ab3f13551458445e6c232eb04b326da803c4d93e2e8dcd268b4413305ff84da", + "0x924b4b2ebaafdcfdfedb2829a8bf46cd32e1407d8d725a5bd28bdc821f1bafb3614f030ea4352c671076a63494275a3f", + "0x8b81b9ef6125c82a9bece6fdcb9888a767ac16e70527753428cc87c56a1236e437da8be4f7ecfe57b9296dc3ae7ba807", + "0x906e19ec8b8edd58bdf9ae05610a86e4ea2282b1bbc1e8b00b7021d093194e0837d74cf27ac9916bdb8ec308b00da3da", + "0xb41c5185869071760ac786078a57a2ab4e2af60a890037ac0c0c28d6826f15c2cf028fddd42a9b6de632c3d550bfbc14", + "0xa646e5dec1b713ae9dfdf7bdc6cd474d5731a320403c7dfcfd666ffc9ae0cff4b5a79530e8df3f4aa9cb80568cb138e9", + "0xb0efad22827e562bd3c3e925acbd0d9425d19057868608d78c2209a531cccd0f2c43dc5673acf9822247428ffa2bb821", + "0xa94c19468d14b6f99002fc52ac06bbe59e5c472e4a0cdb225144a62f8870b3f10593749df7a2de0bd3c9476ce682e148", + "0x803864a91162f0273d49271dafaab632d93d494d1af935aefa522768af058fce52165018512e8d6774976d52bd797e22", + "0xa08711c2f7d45c68fb340ac23597332e1bcaec9198f72967b9921204b9d48a7843561ff318f87908c05a44fc35e3cc9d", + "0x91c3cad94a11a3197ae4f9461faab91a669e0dddb0371d3cab3ed9aeb1267badc797d8375181130e461eadd05099b2a2", + "0x81bdaaf48aae4f7b480fc13f1e7f4dd3023a41439ba231760409ce9292c11128ab2b0bdbbf28b98af4f97b3551f363af", + "0x8d60f9df9fd303f625af90e8272c4ecb95bb94e6efc5da17b8ab663ee3b3f673e9f6420d890ccc94acf4d2cae7a860d8", + "0xa7b75901520c06e9495ab983f70b61483504c7ff2a0980c51115d11e0744683ce022d76e3e09f4e99e698cbd21432a0d", + "0x82956072df0586562fda7e7738226f694e1c73518dd86e0799d2e820d7f79233667192c9236dcb27637e4c65ef19d493", + "0xa586beb9b6ffd06ad200957490803a7cd8c9bf76e782734e0f55e04a3dc38949de75dc607822ec405736c576cf83bca3", + "0xa179a30d00def9b34a7e85607a447eea0401e32ab5abeee1a281f2acd1cf6ec81a178020666f641d9492b1bdf66f05a3", + "0x83e129705c538787ed8e0fdc1275e6466a3f4ee21a1e6abedd239393b1df72244723b92f9d9d9339a0cab6ebf28f5a16", + "0x811bd8d1e3722b64cd2f5b431167e7f91456e8bba2cc669d3fbbce7d553e29c3c19f629fcedd2498bc26d33a24891d17", + "0xa243c030c858f1f60cccd26b45b024698cc6d9d9e6198c1ed4964a235d9f8d0baf9cde10c8e63dfaa47f8e74e51a6e85", + "0xab839eb82e23ca52663281f863b55b0a3d6d4425c33ffb4eeb1d7979488ab068bf99e2a60e82cea4dc42c56c26cbfebe", + "0x8b896f9bb21d49343e67aec6ad175b58c0c81a3ca73d44d113ae4354a0065d98eb1a5cafedaf232a2bb9cdc62152f309", + "0xaf6230340cc0b66f5bf845540ed4fc3e7d6077f361d60762e488d57834c3e7eb7eacc1b0ed73a7d134f174a01410e50c", + "0x88975e1b1af678d1b5179f72300a30900736af580dd748fd9461ef7afccc91ccd9bed33f9da55c8711a7635b800e831f", + "0xa97486bb9047391661718a54b8dd5a5e363964e495eae6c692730264478c927cf3e66dd3602413189a3699fbeae26e15", + "0xa5973c161ab38732885d1d2785fd74bf156ba34881980cba27fe239caef06b24a533ffe6dbbbeca5e6566682cc00300a", + "0xa24776e9a840afda0003fa73b415d5bd6ecd9b5c2cc842b643ee51b8c6087f4eead4d0bfbd987eb174c489a7b952ff2a", + "0xa8a6ee06e3af053b705a12b59777267c546f33ba8a0f49493af8e6df4e15cf8dd2d4fb4daf7e84c6b5d3a7363118ff03", + "0xa28e59ce6ad02c2ce725067c0123117e12ac5a52c8f5af13eec75f4a9efc4f696777db18a374fa33bcae82e0734ebd16", + "0x86dfc3b78e841c708aff677baa8ee654c808e5d257158715097c1025d46ece94993efe12c9d188252ad98a1e0e331fec", + "0xa88d0275510f242eab11fdb0410ff6e1b9d7a3cbd3658333539815f1b450a84816e6613d15aa8a8eb15d87cdad4b27a2", + "0x8440acea2931118a5b481268ff9f180ee4ede85d14a52c026adc882410825b8275caa44aff0b50c2b88d39f21b1a0696", + "0xa7c3182eab25bd6785bacf12079d0afb0a9b165d6ed327814e2177148539f249eb9b5b2554538f54f3c882d37c0a8abe", + "0x85291fbe10538d7da38efdd55a7acebf03b1848428a2f664c3ce55367aece60039f4f320b1771c9c89a35941797f717c", + "0xa2c6414eeb1234728ab0de94aa98fc06433a58efa646ca3fcbd97dbfb8d98ae59f7ce6d528f669c8149e1e13266f69c9", + "0x840c8462785591ee93aee2538d9f1ec44ba2ca61a569ab51d335ac873f5d48099ae8d7a7efa0725d9ff8f9475bfa4f56", + "0xa7065a9d02fb3673acf7702a488fbc01aa69580964932f6f40b6c2d1c386b19e50b0e104fcac24ea26c4e723611d0238", + "0xb72db6d141267438279e032c95e6106c2ccb3164b842ba857a2018f3a35f4b040da92680881eb17cd61d0920d5b8f006", + "0xa8005d6c5960e090374747307ef0be2871a7a43fa4e76a16c35d2baab808e9777b496e9f57a4218b23390887c33a0b55", + "0x8e152cea1e00a451ca47c20a1e8875873419700af15a5f38ee2268d3fbc974d4bd5f4be38008fa6f404dbdedd6e6e710", + "0xa3391aed1fcd68761f06a7d1008ec62a09b1cb3d0203cd04e300a0c91adfed1812d8bc1e4a3fd7976dc0aae0e99f52f1", + "0x967eb57bf2aa503ee0c6e67438098149eac305089c155f1762cf5e84e31f0fbf27c34a9af05621e34645c1ec96afaec8", + "0x88af97ddc4937a95ec0dcd25e4173127260f91c8db2f6eac84afb789b363705fb3196235af631c70cafd09411d233589", + "0xa32df75b3f2c921b8767638fd289bcfc61e08597170186637a7128ffedd52c798c434485ac2c7de07014f9e895c2c3d8", + "0xb0a783832153650aa0d766a3a73ec208b6ce5caeb40b87177ffc035ab03c7705ecdd1090b6456a29f5fb7e90e2fa8930", + "0xb59c8e803b4c3486777d15fc2311b97f9ded1602fa570c7b0200bada36a49ee9ef4d4c1474265af8e1c38a93eb66b18b", + "0x982f2c85f83e852022998ff91bafbb6ff093ef22cf9d5063e083a48b29175ccbd51b9c6557151409e439096300981a6c", + "0x939e3b5989fefebb9d272a954659a4eb125b98c9da6953f5e628d26266bd0525ec38304b8d56f08d65abc4d6da4a8dbb", + "0x8898212fe05bc8de7d18503cb84a1c1337cc2c09d1eeef2b475aa79185b7322bf1f8e065f1bf871c0c927dd19faf1f6d", + "0x94b0393a41cd00f724aee2d4bc72103d626a5aecb4b5486dd1ef8ac27528398edf56df9db5c3d238d8579af368afeb09", + "0x96ac564450d998e7445dd2ea8e3fc7974d575508fa19e1c60c308d83b645864c029f2f6b7396d4ff4c1b24e92e3bac37", + "0x8adf6638e18aff3eb3b47617da696eb6c4bdfbecbbc3c45d3d0ab0b12cbad00e462fdfbe0c35780d21aa973fc150285e", + "0xb53f94612f818571b5565bbb295e74bada9b5f9794b3b91125915e44d6ddcc4da25510eab718e251a09c99534d6042d9", + "0x8b96462508d77ee083c376cd90807aebad8de96bca43983c84a4a6f196d5faf6619a2351f43bfeec101864c3bf255519", + "0xaeadf34657083fc71df33bd44af73bf5281c9ca6d906b9c745536e1819ea90b56107c55e2178ebad08f3ba75b3f81c86", + "0x9784ba29b2f0057b5af1d3ab2796d439b8753f1f749c73e791037461bdfc3f7097394283105b8ab01788ea5255a96710", + "0x8756241bda159d4a33bf74faba0d4594d963c370fb6a18431f279b4a865b070b0547a6d1613cf45b8cfb5f9236bbf831", + "0xb03ebfd6b71421dfd49a30460f9f57063eebfe31b9ceaa2a05c37c61522b35bdc09d7db3ad75c76c253c00ba282d3cd2", + "0xb34e7e6341fa9d854b2d3153bdda0c4ae2b2f442ab7af6f99a0975d45725aa48e36ae5f7011edd249862e91f499687d4", + "0xb462ee09dc3963a14354244313e3444de5cc37ea5ccfbf14cd9aca8027b59c4cb2a949bc30474497cab8123e768460e6", + "0xaea753290e51e2f6a21a9a0ee67d3a2713f95c2a5c17fe41116c87d3aa77b1683761264d704df1ac34f8b873bc88ef7b", + "0x98430592afd414394f98ddfff9f280fcb1c322dbe3510f45e1e9c4bb8ee306b3e0cf0282c0ee73ebb8ba087d4d9e0858", + "0xb95d3b5aaf54ffca11f4be8d57f76e14afdb20afc859dc7c7471e0b42031e8f3d461b726ecb979bdb2f353498dfe95ea", + "0x984d17f9b11a683132e0b5a9ee5945e3ff7054c2d5c716be73b29078db1d36f54c6e652fd2f52a19da313112e97ade07", + "0xab232f756b3fff3262be418a1af61a7e0c95ceebbc775389622a8e10610508cd6784ab7960441917a83cc191c58829ea", + "0xa28f41678d6e60de76b0e36ab10e4516e53e02e9c77d2b5af3cfeee3ce94cfa30c5797bd1daab20c98e1cad83ad0f633", + "0xb55395fca84dd3ccc05dd480cb9b430bf8631ff06e24cb51d54519703d667268c2f8afcde4ba4ed16bece8cc7bc8c6e0", + "0x8a8a5392a0e2ea3c7a8c51328fab11156004e84a9c63483b64e8f8ebf18a58b6ffa8fe8b9d95af0a2f655f601d096396", + "0xab480000fe194d23f08a7a9ec1c392334e9c687e06851f083845121ce502c06b54dda8c43092bcc1035df45cc752fe9b", + "0xb265644c29f628d1c7e8e25a5e845cabb21799371814730a41a363e1bda8a7be50fee7c3996a365b7fcba4642add10db", + "0xb8a915a3c685c2d4728f6931c4d29487cad764c5ce23c25e64b1a3259ac27235e41b23bfe7ae982921b4cb84463097df", + "0x8efa7338442a4b6318145a5440fc213b97869647eeae41b9aa3c0a27ee51285b73e3ae3b4a9423df255e6add58864aa9", + "0x9106d65444f74d217f4187dfc8fcf3810b916d1e4275f94f6a86d1c4f3565b131fd6cde1fa708bc05fe183c49f14941a", + "0x948252dac8026bbbdb0a06b3c9d66ec4cf9532163bab68076fda1bd2357b69e4b514729c15aaa83b5618b1977bbc60c4", + "0xae6596ccfdf5cbbc5782efe3bb0b101bb132dbe1d568854ca24cacc0b2e0e9fabcb2ca7ab42aecec412efd15cf8cb7a2", + "0x84a0b6c198ff64fd7958dfd1b40eac9638e8e0b2c4cd8cf5d8cdf80419baee76a05184bce6c5b635f6bf2d30055476a7", + "0x8893118be4a055c2b3da593dbca51b1ae2ea2469911acfb27ee42faf3e6c3ad0693d3914c508c0b05b36a88c8b312b76", + "0xb097479e967504deb6734785db7e60d1d8034d6ca5ba9552887e937f5e17bb413fccac2c1d1082154ed76609127860ad", + "0xa0294e6b9958f244d29943debf24b00b538b3da1116269b6e452bb12dc742226712fd1a15b9c88195afeb5d2415f505c", + "0xb3cc15f635080bc038f61b615f62b5b5c6f2870586191f59476e8368a73641d6ac2f7d0c1f54621982defdb318020230", + "0x99856f49b9fe1604d917c94d09cc0ed753d13d015d30587a94e6631ffd964b214e607deb8a69a8b5e349a7edf4309206", + "0xa8571e113ea22b4b4fce41a094da8c70de37830ae32e62c65c2fa5ad06a9bc29e884b945e73d448c72b176d6ecebfb58", + "0xa9e9c6e52beb0013273c29844956b3ce291023678107cdc785f7b44eff5003462841ad8780761b86aefc6b734adde7cf", + "0x80a784b0b27edb51ef2bad3aee80e51778dcaa0f3f5d3dcb5dc5d4f4b2cf7ae35b08de6680ea9dac53f8438b92eb09ef", + "0x827b543e609ea328e97e373f70ad72d4915a2d1daae0c60d44ac637231070e164c43a2a58db80a64df1c624a042b38f9", + "0xb449c65e8195202efdcb9bdb4e869a437313b118fef8b510cbbf8b79a4e99376adb749b37e9c20b51b31ed3310169e27", + "0x8ea3028f4548a79a94c717e1ed28ad4d8725b8d6ab18b021063ce46f665c79da3c49440c6577319dab2d036b7e08f387", + "0x897798431cfb17fe39f08f5f854005dc37b1c1ec1edba6c24bc8acb3b88838d0534a75475325a5ea98b326ad47dbad75", + "0x89cf232e6303b0751561960fd4dea5754a28c594daf930326b4541274ffb03c7dd75938e411eb9a375006a70ce38097f", + "0x9727c6ae7f0840f0b6c8bfb3a1a5582ceee705e0b5c59b97def7a7a2283edd4d3f47b7971e902a3a2079e40b53ff69b8", + "0xb76ed72b122c48679d221072efc0eeea063cb205cbf5f9ef0101fd10cb1075b8628166c83577cced654e1c001c7882f7", + "0xae908c42d208759da5ee9b405df85a6532ea35c6f0f6a1288d22870f59d98edc896841b8ac890a538e6c8d1e8b02d359", + "0x809d12fe4039a0ec80dc9be6a89acaab7797e5f7f9b163378f52f9a75a1d73b2e9ae6e3dd49e32ced439783c1cabbef5", + "0xa4149530b7f85d1098ba534d69548c6c612c416e8d35992fc1f64f4deeb41e09e49c6cf7aadbed7e846b91299358fe2d", + "0xa49342eacd1ec1148b8df1e253b1c015f603c39de11fa0a364ccb86ea32d69c34fd7aa6980a1fadcd8e785a57fa46f60", + "0x87d43eff5a006dc4dddcf76cc96c656a1f3a68f19f124181feab86c6cc9a52cb9189cdbb423414defdd9bb0ca8ff1ddc", + "0x861367e87a9aa2f0f68296ba50aa5dbc5713008d260cc2c7e62d407c2063064749324c4e8156dc21b749656cfebce26b", + "0xb5303c2f72e84e170e66ae1b0fbd51b8c7a6f27476eaf5694b64e8737d5c84b51fe90100b256465a4c4156dd873cddb0", + "0xb62849a4f891415d74f434cdc1d23c4a69074487659ca96e1762466b2b7a5d8525b056b891d0feea6fe6845cba8bc7fb", + "0x923dd9e0d6590a9307e8c4c23f13bae3306b580e297a937711a8b13e8de85e41a61462f25b7d352b682e8437bf2b4ab3", + "0x9147379860cd713cd46c94b8cdf75125d36c37517fbecf81ace9680b98ce6291cd1c3e472f84249cc3b2b445e314b1b6", + "0xa808a4f17ac21e3fb5cfef404e61fae3693ca3e688d375f99b6116779696059a146c27b06de3ac36da349b0649befd56", + "0x87787e9322e1b75e66c1f0d9ea0915722a232770930c2d2a95e9478c4b950d15ab767e30cea128f9ed65893bfc2d0743", + "0x9036a6ee2577223be105defe1081c48ea7319e112fff9110eb9f61110c319da25a6cea0464ce65e858635b079691ef1f", + "0xaf5548c7c24e1088c23b57ee14d26c12a83484c9fd9296edf1012d8dcf88243f20039b43c8c548c265ef9a1ffe9c1c88", + "0xa0fff520045e14065965fb8accd17e878d3fcaf9e0af2962c8954e50be6683d31fa0bf4816ab68f08630dbac6bfce52a", + "0xb4c1b249e079f6ae1781af1d97a60b15855f49864c50496c09c91fe1946266915b799f0406084d7783f5b1039116dd8b", + "0x8b0ffa5e7c498cb3879dddca34743b41eee8e2dea3d4317a6e961b58adb699ef0c92400c068d5228881a2b08121226bf", + "0x852ae8b19a1d80aa8ae5382e7ee5c8e7670ceb16640871c56b20b96b66b3b60e00015a3dde039446972e57b49a999ddd", + "0xa49942f04234a7d8492169da232cfff8051df86e8e1ba3db46aede02422c689c87dc1d99699c25f96cb763f5ca0983e5", + "0xb04b597b7760cf5dcf411ef896d1661e6d5b0db3257ac2cf64b20b60c6cc18fa10523bb958a48d010b55bac7b02ab3b1", + "0xa494591b51ea8285daecc194b5e5bd45ae35767d0246ac94fae204d674ee180c8e97ff15f71f28b7aeb175b8aea59710", + "0x97d2624919e78406e7460730680dea8e71c8571cf988e11441aeea54512b95bd820e78562c99372d535d96f7e200d20d", + "0xac693ddb00e48f76e667243b9b6a7008424043fb779e4f2252330285232c3fccac4da25cbd6d95fe9ad959ff305a91f6", + "0x8d20ca0a71a64a3f702a0825bb46bd810d03bebfb227683680d474a52f965716ff99e19a165ebaf6567987f4f9ee3c94", + "0xa5c516a438f916d1d68ca76996404792e0a66e97b7f18fc54c917bf10cf3211b62387932756e39e67e47b0bd6e88385a", + "0xb089614d830abc0afa435034cec7f851f2f095d479cacf1a3fb57272da826c499a52e7dcbc0eb85f4166fb94778e18e9", + "0xa8dacc943765d930848288192f4c69e2461c4b9bc6e79e30eeef9a543318cf9ae9569d6986c65c5668a89d49993f8e07", + "0xab5a9361fa339eec8c621bdad0a58078983abd8942d4282b22835d7a3a47e132d42414b7c359694986f7db39386c2e19", + "0x94230517fb57bd8eb26c6f64129b8b2abd0282323bf7b94b8bac7fab27b4ecc2c4290c294275e1a759de19f2216134f3", + "0xb8f158ea5006bc3b90b285246625faaa6ac9b5f5030dc69701b12f3b79a53ec7e92eeb5a63bbd1f9509a0a3469ff3ffc", + "0x8b6944fd8cb8540957a91a142fdcda827762aa777a31e8810ca6d026e50370ee1636fc351724767e817ca38804ebe005", + "0x82d1ee40fe1569c29644f79fa6c4033b7ed45cd2c3b343881f6eb0de2e79548fded4787fae19bed6ee76ed76ff9f2f11", + "0xa8924c7035e99eaed244ca165607e7e568b6c8085510dcdbaf6ebdbed405af2e6c14ee27d94ffef10d30aa52a60bf66d", + "0x956f82a6c2ae044635e85812581e4866c5fa2f427b01942047d81f6d79a14192f66fbbe77c9ffeaef4e6147097fdd2b5", + "0xb1100255a1bcf5e05b6aff1dfeb6e1d55b5d68d43a7457ba10cc76b61885f67f4d0d5179abda786e037ae95deb8eea45", + "0x99510799025e3e5e8fbf06dedb14c060c6548ba2bda824f687d3999dc395e794b1fb6514b9013f3892b6cf65cb0d65aa", + "0x8f9091cebf5e9c809aab415942172258f894e66e625d7388a05289183f01b8d994d52e05a8e69f784fba41db9ea357f0", + "0xa13d2eeb0776bdee9820ecb6693536720232848c51936bb4ef4fe65588d3f920d08a21907e1fdb881c1ad70b3725e726", + "0xa68b8f18922d550284c5e5dc2dda771f24c21965a6a4d5e7a71678178f46df4d8a421497aad8fcb4c7e241aba26378a0", + "0x8b7601f0a3c6ad27f03f2d23e785c81c1460d60100f91ea9d1cab978aa03b523150206c6d52ce7c7769c71d2c8228e9e", + "0xa8e02926430813caa851bb2b46de7f0420f0a64eb5f6b805401c11c9091d3b6d67d841b5674fa2b1dce0867714124cd8", + "0xb7968ecba568b8193b3058400af02c183f0a6df995a744450b3f7e0af7a772454677c3857f99c140bbdb2a09e832e8e0", + "0x8f20b1e9ba87d0a3f35309b985f3c18d2e8800f1ca7f0c52cadef773f1496b6070c936eea48c4a1cae83fd2524e9d233", + "0x88aef260042db0d641a51f40639dbeeefa9e9811df30bee695f3791f88a2f84d318f04e8926b7f47bf25956cb9e3754f", + "0x9725345893b647e9ba4e6a29e12f96751f1ae25fcaec2173e9a259921a1a7edb7a47159b3c8767e44d9e2689f5aa0f72", + "0x8c281e6f72752cb11e239e4df9341c45106eb7993c160e54423c2bffe10bc39d42624b45a1f673936ef2e1a02fc92f1a", + "0x90aba2f68bddb2fcce6c51430dacdfeec43ea8dc379660c99095df11017691ccf5faa27665cf4b9f0eea7728ae53c327", + "0xb7022695c16521c5704f49b7ddbdbec9b5f57ce0ceebe537bc0ebb0906d8196cc855a9afeb8950a1710f6a654464d93f", + "0x8fe1b9dd3c6a258116415d36e08374e094b22f0afb104385a5da48be17123e86fb8327baacc4f0d9ebae923d55d99bb5", + "0x817e85d8e3d19a4cbc1dec31597142c2daa4871bda89c2177fa719c00eda3344eb08b82eb92d4aa91a9eaacb3fc09783", + "0xb59053e1081d2603f1ca0ba553804d6fa696e1fd996631db8f62087b26a40dfef02098b0326bb75f99ec83b9267ca738", + "0x990a173d857d3ba81ff3789b931bfc9f5609cde0169b7f055fa3cb56451748d593d62d46ba33f80f9cafffe02b68dd14", + "0xb0c538dbba4954b809ab26f9f94a3cf1dcb77ce289eaec1d19f556c0ae4be1fa03af4a9b7057837541c3cc0a80538736", + "0xac3ba42f5f44f9e1fc453ce49c4ab79d0e1d5c42d3b30b1e098f3ab3f414c4c262fa12fb2be249f52d4aaf3c5224beb9", + "0xaf47467eb152e59870e21f0d4da2f43e093daf40180ab01438030684b114d025326928eaab12c41b81a066d94fce8436", + "0x98d1b58ba22e7289b1c45c79a24624f19b1d89e00f778eef327ec4856a9a897278e6f1a9a7e673844b31dde949153000", + "0x97ccb15dfadc7c59dca08cfe0d22df2e52c684cf97de1d94bc00d7ba24e020025130b0a39c0f4d46e4fc872771ee7875", + "0xb699e4ed9a000ff96ca296b2f09dce278832bc8ac96851ff3cff99ed3f6f752cfc0fea8571be28cd9b5a7ec36f1a08ee", + "0xb9f49f0edb7941cc296435ff0a912e3ad16848ee8765ab5f60a050b280d6ea585e5b34051b15f6b8934ef01ceb85f648", + "0xac3893df7b4ceab23c6b9054e48e8ba40d6e5beda8fbe90b814f992f52494186969b35d8c4cdc3c99890a222c9c09008", + "0xa41293ad22fae81dea94467bc1488c3707f3d4765059173980be93995fa4fcc3c9340796e3eed0beeb0ba0d9bb4fa3aa", + "0xa0543e77acd2aeecde13d18d258aeb2c7397b77f17c35a1992e8666ea7abcd8a38ec6c2741bd929abba2f766138618cc", + "0x92e79b22bc40e69f6527c969500ca543899105837b6b1075fa1796755c723462059b3d1b028e0b3df2559fa440e09175", + "0xa1fa1eac8f41a5197a6fb4aa1eae1a031c89f9c13ff9448338b222780cf9022e0b0925d930c37501a0ef7b2b00fdaf83", + "0xb3cb29ff73229f0637335f28a08ad8c5f166066f27c6c175164d0f26766a927f843b987ee9b309ed71cbf0a65d483831", + "0x84d4ab787f0ac00f104f4a734dc693d62d48c2aeb03913153da62c2ae2c27d11b1110dcef8980368dd84682ea2c1a308", + "0xab6a8e4bbc78d4a7b291ad3e9a8fe2d65f640524ba3181123b09d2d18a9e300e2509ccf7000fe47e75b65f3e992a2e7e", + "0xb7805ebe4f1a4df414003dc10bca805f2ab86ca75820012653e8f9b79c405196b0e2cab099f2ab953d67f0d60d31a0f9", + "0xb12c582454148338ea605d22bd00a754109063e22617f1f8ac8ddf5502c22a181c50c216c3617b9852aa5f26af56b323", + "0x86333ad9f898947e31ce747728dc8c887479e18d36ff3013f69ebef807d82c6981543b5c3788af93c4d912ba084d3cba", + "0xb514efa310dc4ad1258add138891e540d8c87142a881b5f46563cc58ecd1488e6d3a2fca54c0b72a929f3364ca8c333e", + "0xaa0a30f92843cf2f484066a783a1d75a7aa6f41f00b421d4baf20a6ac7886c468d0eea7ca8b17dd22f4f74631b62b640", + "0xb3b7dc63baec9a752e8433c0cdee4d0f9bc41f66f2b8d132faf925eef9cf89aae756fc132c45910f057122462605dc10", + "0xb9b8190dac5bfdeb59fd44f4da41a57e7f1e7d2c21faba9da91fa45cbeca06dcf299c9ae22f0c89ece11ac46352d619f", + "0x89f8cf36501ad8bdfeab863752a9090e3bfda57cf8fdeca2944864dc05925f501e252c048221bcc57136ab09a64b64b2", + "0xb0cbfaf317f05f97be47fc9d69eda2dd82500e00d42612f271a1fe24626408c28881f171e855bd5bd67409f9847502b4", + "0xa7c21a8fcede581bfd9847b6835eda62ba250bea81f1bb17372c800a19c732abe03064e64a2f865d974fb636cab4b859", + "0x95f9df524ba7a4667351696c4176b505d8ea3659f5ff2701173064acc624af69a0fad4970963736383b979830cb32260", + "0x856a74fe8b37a2e3afeac858c8632200485d438422a16ae3b29f359e470e8244995c63ad79c7e007ed063f178d0306fd", + "0xb37faa4d78fdc0bb9d403674dbea0176c2014a171c7be8527b54f7d1a32a76883d3422a3e7a5f5fcc5e9b31b57822eeb", + "0x8d37234d8594ec3fe75670b5c9cc1ec3537564d4739b2682a75b18b08401869a4264c0f264354219d8d896cded715db4", + "0xb5289ee5737f0e0bde485d32096d23387d68dab8f01f47821ab4f06cc79a967afe7355e72dc0c751d96b2747b26f6255", + "0x9085e1fdf9f813e9c3b8232d3c8863cd84ab30d45e8e0d3d6a0abd9ebc6fd70cdf749ff4d04390000e14c7d8c6655fc7", + "0x93a388c83630331eca4da37ea4a97b3b453238af474817cc0a0727fd3138dcb4a22de38c04783ec829c22cb459cb4e8e", + "0xa5377116027c5d061dbe24c240b891c08cdd8cd3f0899e848d682c873aff5b8132c1e7cfe76d2e5ed97ee0eb1d42cb68", + "0xa274c84b04338ed28d74683e2a7519c2591a3ce37c294d6f6e678f7d628be2db8eff253ede21823e2df7183e6552f622", + "0x8bc201147a842453a50bec3ac97671397bc086d6dfc9377fa38c2124cdc286abda69b7324f47d64da094ae011d98d9d9", + "0x9842d0c066c524592b76fbec5132bc628e5e1d21c424bec4555efca8619cc1fd8ea3161febcb8b9e8ab54702f4e815e2", + "0xa19191b713a07efe85c266f839d14e25660ee74452e6c691cd9997d85ae4f732052d802d3deb018bdd847caa298a894b", + "0xa24f71fc0db504da4e287dd118a4a74301cbcd16033937ba2abc8417956fcb4ae19b8e63b931795544a978137eff51cb", + "0xa90eec4a6a3a4b8f9a5b93d978b5026fcf812fe65585b008d7e08c4aaf21195a1d0699f12fc16f79b6a18a369af45771", + "0x8b551cf89737d7d06d9b3b9c4c1c73b41f2ea0af4540999c70b82dabff8580797cf0a3caf34c86c59a7069eb2e38f087", + "0xb8d312e6c635e7a216a1cda075ae77ba3e1d2fd501dc31e83496e6e81ed5d9c7799f8e578869c2e0e256fb29f5de10a7", + "0x8d144bdb8cae0b2cdb5b33d44bbc96984a5925202506a8cc65eb67ac904b466f5a7fe3e1cbf04aa785bbb7348c4bb73c", + "0xa101b3d58b7a98659244b88de0b478b3fb87dc5fc6031f6e689b99edf498abd43e151fd32bd4bbd240e0b3e59c440359", + "0x907453abca7d8e7151a05cc3d506c988007692fe7401395dc93177d0d07d114ab6cca0cc658eb94c0223fe8658295cad", + "0x825329ffbe2147ddb68f63a0a67f32d7f309657b8e5d9ab5bb34b3730bfa2c77a23eaaadb05def7d9f94a9e08fdc1e96", + "0x88ee923c95c1dac99ae7ed6067906d734d793c5dc5d26339c1bb3314abe201c5dccb33b9007351885eb2754e9a8ea06c", + "0x98bc9798543f5f1adc9f2cfcfa72331989420e9c3f6598c45269f0dc9b7c8607bbeaf03faa0aea2ddde2b8f17fdceff5", + "0x8ee87877702a79aef923ab970db6fa81561b3c07d5bf1a072af0a7bad765b4cbaec910afe1a91703feacc7822fa38a94", + "0x8060b9584aa294fe8adc2b22f67e988bc6da768eae91e429dcc43ddc53cfcc5d6753fdc1b420b268c7eb2fb50736a970", + "0xb344a5524d80a2f051870c7001f74fcf348a70fcf78dbd20c6ff9ca85d81567d2318c8b8089f2c4f195d6aec9fc15fa6", + "0x8f5a5d893e1936ed062149d20eb73d98b62b7f50ab5d93a6429c03656b36688d1c80cb5010e4977491e51fa0d7dd35d5", + "0x86fa32ebbf97328c5f5f15564e1238297e289ec3219b9a741724e9f3ae8d5c15277008f555863a478b247ba5dc601d44", + "0x9557e55377e279f4b6b5e0ffe01eca037cc13aac242d67dfcd0374a1e775c5ed5cb30c25fe21143fee54e3302d34a3ea", + "0x8cb6bcbc39372d23464a416ea7039f57ba8413cf3f00d9a7a5b356ab20dcb8ed11b3561f7bce372b8534d2870c7ee270", + "0xb5d59075cb5abde5391f64b6c3b8b50adc6e1f654e2a580b6d6d6eff3f4fbdd8fffc92e06809c393f5c8eab37f774c4b", + "0xafcfb6903ef13e493a1f7308675582f15af0403b6553e8c37afb8b2808ad21b88b347dc139464367dc260df075fea1ad", + "0x810fbbe808375735dd22d5bc7fc3828dc49fdd22cc2d7661604e7ac9c4535c1df578780affb3b895a0831640a945bcad", + "0x8056b0c678803b416f924e09a6299a33cf9ad7da6fe1ad7accefe95c179e0077da36815fde3716711c394e2c5ea7127f", + "0x8b67403702d06979be19f1d6dc3ec73cc2e81254d6b7d0cc49cd4fdda8cd51ab0835c1d2d26fc0ecab5df90585c2f351", + "0x87f97f9e6d4be07e8db250e5dd2bffdf1390665bc5709f2b631a6fa69a7fca958f19bd7cc617183da1f50ee63e9352b5", + "0xae151310985940471e6803fcf37600d7fa98830613e381e00dab943aec32c14162d51c4598e8847148148000d6e5af5c", + "0x81eb537b35b7602c45441cfc61b27fa9a30d3998fad35a064e05bc9479e9f10b62eba2b234b348219eea3cadcaac64bb", + "0x8a441434934180ab6f5bc541f86ebd06eadbee01f438836d797e930fa803a51510e005c9248cecc231a775b74d12b5e9", + "0x81f3c250a27ba14d8496a5092b145629eb2c2e6a5298438670375363f57e2798207832c8027c3e9238ad94ecdadfc4df", + "0xa6217c311f2f3db02ceaa5b6096849fe92b6f4b6f1491535ef8525f6ccee6130bed2809e625073ecbaddd4a3eb3df186", + "0x82d1c396f0388b942cf22b119d7ef1ad03d3dad49a74d9d01649ee284f377c8daddd095d596871669e16160299a210db", + "0xa40ddf7043c5d72a7246bd727b07f7fff1549f0e443d611de6f9976c37448b21664c5089c57f20105102d935ab82f27b", + "0xb6c03c1c97adf0c4bf4447ec71366c6c1bff401ba46236cd4a33d39291e7a1f0bb34bd078ba3a18d15c98993b153a279", + "0x8a94f5f632068399c359c4b3a3653cb6df2b207379b3d0cdace51afdf70d6d5cce6b89a2b0fee66744eba86c98fb21c2", + "0xb2f19e78ee85073f680c3bba1f07fd31b057c00b97040357d97855b54a0b5accb0d3b05b2a294568fcd6a4be6f266950", + "0xa74632d13bbe2d64b51d7a9c3ae0a5a971c19f51cf7596a807cea053e6a0f3719700976d4e394b356c0329a2dced9aa2", + "0xafef616d341a9bc94393b8dfba68ff0581436aa3a3adb7c26a1bbf2cf19fa877066191681f71f17f3cd6f9cf6bf70b5a", + "0x8ce96d93ae217408acf7eb0f9cbb9563363e5c7002e19bbe1e80760bc9d449daee2118f3878b955163ed664516b97294", + "0x8414f79b496176bc8b8e25f8e4cfee28f4f1c2ddab099d63d2aca1b6403d26a571152fc3edb97794767a7c4686ad557c", + "0xb6c61d01fd8ce087ef9f079bf25bf10090db483dd4f88c4a786d31c1bdf52065651c1f5523f20c21e75cea17df69ab73", + "0xa5790fd629be70545093631efadddc136661f63b65ec682609c38ef7d3d7fa4e56bdf94f06e263bc055b90cb1c6bcefe", + "0xb515a767e95704fb7597bca9e46f1753abacdc0e56e867ee3c6f4cd382643c2a28e65312c05ad040eaa3a8cbe7217a65", + "0x8135806a02ead6aa92e9adb6fefb91349837ab73105aaa7be488ef966aa8dfaafdfa64bbae30fcbfa55dd135a036a863", + "0x8f22435702716d76b1369750694540742d909d5e72b54d0878245fab7c269953b1c6f2b29c66f08d5e0263ca3a731771", + "0x8e0f8a8e8753e077dac95848212aeffd51c23d9b6d611df8b102f654089401954413ecbedc6367561ca599512ae5dda7", + "0x815a9084e3e2345f24c5fa559deec21ee1352fb60f4025c0779be65057f2d528a3d91593bd30d3a185f5ec53a9950676", + "0x967e6555ccba395b2cc1605f8484c5112c7b263f41ce8439a99fd1c71c5ed14ad02684d6f636364199ca48afbbde13be", + "0x8cd0ccf17682950b34c796a41e2ea7dd5367aba5e80a907e01f4cdc611e4a411918215e5aebf4292f8b24765d73314a6", + "0xa58bf1bbb377e4b3915df6f058a0f53b8fb8130fdec8c391f6bc82065694d0be59bb67ffb540e6c42cc8b380c6e36359", + "0x92af3151d9e6bfb3383d85433e953c0160859f759b0988431ec5893542ba40288f65db43c78a904325ef8d324988f09d", + "0x8011bbb05705167afb47d4425065630f54cb86cd462095e83b81dfebf348f846e4d8fbcf1c13208f5de1931f81da40b9", + "0x81c743c104fc3cb047885c9fa0fb9705c3a83ee24f690f539f4985509c3dafd507af3f6a2128276f45d5939ef70c167f", + "0xa2c9679b151c041aaf5efeac5a737a8f70d1631d931609fca16be1905682f35e291292874cb3b03f14994f98573c6f44", + "0xa4949b86c4e5b1d5c82a337e5ce6b2718b1f7c215148c8bfb7e7c44ec86c5c9476048fc5c01f57cb0920876478c41ad6", + "0x86c2495088bd1772152e527a1da0ef473f924ea9ab0e5b8077df859c28078f73c4e22e3a906b507fdf217c3c80808b5c", + "0x892e0a910dcf162bcea379763c3e2349349e4cda9402949255ac4a78dd5a47e0bf42f5bd0913951576b1d206dc1e536a", + "0xa7009b2c6b396138afe4754b7cc10dee557c51c7f1a357a11486b3253818531f781ea8107360c8d4c3b1cd96282353c0", + "0x911763ef439c086065cc7b4e57484ed6d693ea44acee4b18c9fd998116da55fbe7dcb8d2a0f0f9b32132fca82d73dff6", + "0xa722000b95a4a2d40bed81870793f15ba2af633f9892df507f2842e52452e02b5ea8dea6a043c2b2611d82376e33742a", + "0x9387ac49477bd719c2f92240d0bdfcf9767aad247ca93dc51e56106463206bc343a8ec855eb803471629a66fffb565d6", + "0x92819a1fa48ab4902939bb72a0a4e6143c058ea42b42f9bc6cea5df45f49724e2530daf3fc4f097cceefa2a8b9db0076", + "0x98eac7b04537653bc0f4941aae732e4b1f84bd276c992c64a219b8715eb1fb829b5cbd997d57feb15c7694c468f95f70", + "0xb275e7ba848ce21bf7996e12dbeb8dadb5d0e4f1cb5a0248a4f8f9c9fe6c74e3c93f4b61edbcb0a51af5a141e1c14bc7", + "0x97243189285aba4d49c53770c242f2faf5fd3914451da4931472e3290164f7663c726cf86020f8f181e568c72fd172d1", + "0x839b0b3c25dd412bee3dc24653b873cc65454f8f16186bb707bcd58259c0b6765fa4c195403209179192a4455c95f3b8", + "0x8689d1a870514568a074a38232e2ceb4d7df30fabeb76cff0aed5b42bf7f02baea12c5fadf69f4713464dbd52aafa55f", + "0x8958ae7b290f0b00d17c3e9fdb4dbf168432b457c7676829299dd428984aba892de1966fc106cfc58a772862ecce3976", + "0xa422bc6bd68b8870cfa5bc4ce71781fd7f4368b564d7f1e0917f6013c8bbb5b240a257f89ecfdbecb40fe0f3aa31d310", + "0xaa61f78130cebe09bc9a2c0a37f0dd57ed2d702962e37d38b1df7f17dc554b1d4b7a39a44182a452ce4c5eb31fa4cfcc", + "0xb7918bd114f37869bf1a459023386825821bfadce545201929d13ac3256d92a431e34f690a55d944f77d0b652cefeffc", + "0x819bba35fb6ace1510920d4dcff30aa682a3c9af9022e287751a6a6649b00c5402f14b6309f0aeef8fce312a0402915e", + "0x8b7c9ad446c6f63c11e1c24e24014bd570862b65d53684e107ba9ad381e81a2eaa96731b4b33536efd55e0f055071274", + "0x8fe79b53f06d33386c0ec7d6d521183c13199498594a46d44a8a716932c3ec480c60be398650bbfa044fa791c4e99b65", + "0x9558e10fb81250b9844c99648cf38fa05ec1e65d0ccbb18aa17f2d1f503144baf59d802c25be8cc0879fff82ed5034ad", + "0xb538a7b97fbd702ba84645ca0a63725be1e2891c784b1d599e54e3480e4670d0025526674ef5cf2f87dddf2290ba09f0", + "0x92eafe2e869a3dd8519bbbceb630585c6eb21712b2f31e1b63067c0acb5f9bdbbcbdb612db4ea7f9cc4e7be83d31973f", + "0xb40d21390bb813ab7b70a010dff64c57178418c62685761784e37d327ba3cb9ef62df87ecb84277c325a637fe3709732", + "0xb349e6fbf778c4af35fbed33130bd8a7216ed3ba0a79163ebb556e8eb8e1a7dad3456ddd700dad9d08d202491c51b939", + "0xa8fdaedecb251f892b66c669e34137f2650509ade5d38fbe8a05d9b9184bb3b2d416186a3640429bd1f3e4b903c159dd", + "0xac6167ebfee1dbab338eff7642f5e785fc21ef0b4ddd6660333fe398068cbd6c42585f62e81e4edbb72161ce852a1a4f", + "0x874b1fbf2ebe140c683bd7e4e0ab017afa5d4ad38055aaa83ee6bbef77dbc88a6ce8eb0dcc48f0155244af6f86f34c2d", + "0x903c58e57ddd9c446afab8256a6bb6c911121e6ccfb4f9b4ed3e2ed922a0e500a5cb7fa379d5285bc16e11dac90d1fda", + "0x8dae7a0cffa2fd166859cd1bf10ff82dd1932e488af377366b7efc0d5dec85f85fe5e8150ff86a79a39cefc29631733a", + "0xaa047857a47cc4dfc08585f28640420fcf105b881fd59a6cf7890a36516af0644d143b73f3515ab48faaa621168f8c31", + "0x864508f7077c266cc0cb3f7f001cb6e27125ebfe79ab57a123a8195f2e27d3799ff98413e8483c533b46a816a3557f1f", + "0x8bcd45ab1f9cbab36937a27e724af819838f66dfeb15923f8113654ff877bd8667c54f6307aaf0c35027ca11b6229bfd", + "0xb21aa34da9ab0a48fcfdd291df224697ce0c1ebc0e9b022fdee8750a1a4b5ba421c419541ed5c98b461eecf363047471", + "0xa9a18a2ab2fae14542dc336269fe612e9c1af6cf0c9ac933679a2f2cb77d3c304114f4d219ca66fe288adde30716775b", + "0xb5205989b92c58bdda71817f9a897e84100b5c4e708de1fced5c286f7a6f01ae96b1c8d845f3a320d77c8e2703c0e8b1", + "0xa364059412bbcc17b8907d43ac8e5df90bc87fd1724b5f99832d0d24559fae6fa76a74cff1d1eac8cbac6ec80b44af20", + "0xae709f2c339886b31450834cf29a38b26eb3b0779bd77c9ac269a8a925d1d78ea3837876c654b61a8fe834b3b6940808", + "0x8802581bba66e1952ac4dab36af371f66778958f4612901d95e5cac17f59165e6064371d02de8fb6fccf89c6dc8bd118", + "0xa313252df653e29c672cbcfd2d4f775089cb77be1077381cf4dc9533790e88af6cedc8a119158e7da5bf6806ad9b91a1", + "0x992a065b4152c7ef11515cd54ba9d191fda44032a01aed954acff3443377ee16680c7248d530b746b8c6dee2d634e68c", + "0xb627b683ee2b32c1ab4ccd27b9f6cce2fe097d96386fa0e5c182ad997c4c422ab8dfc03870cd830b8c774feb66537282", + "0xb823cf8a9aee03dadd013eb9efe40a201b4b57ef67efaae9f99683005f5d1bf55e950bf4af0774f50859d743642d3fea", + "0xb8a7449ffac0a3f206677097baf7ce00ca07a4d2bd9b5356fbcb83f3649b0fda07cfebad220c1066afba89e5a52abf4b", + "0xb2dd1a2f986395bb4e3e960fbbe823dbb154f823284ebc9068502c19a7609790ec0073d08bfa63f71e30c7161b6ef966", + "0x98e5236de4281245234f5d40a25b503505af140b503a035fc25a26159a9074ec81512b28f324c56ea2c9a5aa7ce90805", + "0x89070847dc8bbf5bc4ed073aa2e2a1f699cf0c2ca226f185a0671cecc54e7d3e14cd475c7752314a7a8e7476829da4bc", + "0xa9402dc9117fdb39c4734c0688254f23aed3dce94f5f53f5b7ef2b4bf1b71a67f85ab1a38ec224a59691f3bee050aeb3", + "0x957288f9866a4bf56a4204218ccc583f717d7ce45c01ea27142a7e245ad04a07f289cc044f8cf1f21d35e67e39299e9c", + "0xb2fb31ccb4e69113763d7247d0fc8edaae69b550c5c56aecacfd780c7217dc672f9fb7496edf4aba65dacf3361268e5b", + "0xb44a4526b2f1d6eb2aa8dba23bfa385ff7634572ab2afddd0546c3beb630fbfe85a32f42dd287a7fec069041411537f7", + "0x8db5a6660c3ac7fd7a093573940f068ee79a82bc17312af900b51c8c439336bc86ca646c6b7ab13aaaa008a24ca508ab", + "0x8f9899a6d7e8eb4367beb5c060a1f8e94d8a21099033ae582118477265155ba9e72176a67f7f25d7bad75a152b56e21a", + "0xa67de0e91ade8d69a0e00c9ff33ee2909b8a609357095fa12319e6158570c232e5b6f4647522efb7345ce0052aa9d489", + "0x82eb2414898e9c3023d57907a2b17de8e7eea5269029d05a94bfd7bf5685ac4a799110fbb375eb5e0e2bd16acf6458ae", + "0x94451fc7fea3c5a89ba701004a9693bab555cb622caf0896b678faba040409fdfd14a978979038b2a81e8f0abc4994d2", + "0xac879a5bb433998e289809a4a966bd02b4bf6a9c1cc276454e39c886efcf4fc68baebed575826bde577ab5aa71d735a9", + "0x880c0f8f49c875dfd62b4ddedde0f5c8b19f5687e693717f7e5c031bc580e58e13ab497d48b4874130a18743c59fdce3", + "0xb582af8d8ff0bf76f0a3934775e0b54c0e8fed893245d7d89cae65b03c8125b7237edc29dc45b4fe1a3fe6db45d280ee", + "0x89f337882ed3ae060aaee98efa20d79b6822bde9708c1c5fcee365d0ec9297f694cae37d38fd8e3d49717c1e86f078e7", + "0x826d2c1faea54061848b484e288a5f4de0d221258178cf87f72e14baaa4acc21322f8c9eab5dde612ef497f2d2e1d60b", + "0xa5333d4f227543e9cd741ccf3b81db79f2f03ca9e649e40d6a6e8ff9073e06da83683566d3b3c8d7b258c62970fb24d1", + "0xa28f08c473db06aaf4c043a2fae82b3c8cfaa160bce793a4c208e4e168fb1c65115ff8139dea06453c5963d95e922b94", + "0x8162546135cc5e124e9683bdfaa45833c18553ff06a0861c887dc84a5b12ae8cd4697f6794c7ef6230492c32faba7014", + "0xb23f0d05b74c08d6a7df1760792be83a761b36e3f8ae360f3c363fb196e2a9dd2de2e492e49d36561366e14daa77155c", + "0xb6f70d6c546722d3907c708d630dbe289771d2c8bf059c2e32b77f224696d750b4dda9b3a014debda38e7d02c9a77585", + "0x83bf4c4a9f3ca022c631017e7a30ea205ba97f7f5927cba8fc8489a4646eac6712cb821c5668c9ffe94d69d524374a27", + "0xb0371475425a8076d0dd5f733f55aabbe42d20a7c8ea7da352e736d4d35a327b2beb370dfcb05284e22cfd69c5f6c4cc", + "0xa0031ba7522c79211416c2cca3aa5450f96f8fee711552a30889910970ba13608646538781a2c08b834b140aadd7166f", + "0x99d273c80c7f2dc6045d4ed355d9fc6f74e93549d961f4a3b73cd38683f905934d359058cd1fc4da8083c7d75070487f", + "0xb0e4b0efa3237793e9dcce86d75aafe9879c5fa23f0d628649aef2130454dcf72578f9bf227b9d2b9e05617468e82588", + "0xa5ab076fa2e1c5c51f3ae101afdd596ad9d106bba7882b359c43d8548b64f528af19afa76cd6f40da1e6c5fca4def3fa", + "0x8ce2299e570331d60f6a6eff1b271097cd5f1c0e1113fc69b89c6a0f685dabea3e5bc2ac6bd789aa492ab189f89be494", + "0x91b829068874d911a310a5f9dee001021f97471307b5a3de9ec336870ec597413e1d92010ce320b619f38bed7c4f7910", + "0xb14fe91f4b07bf33b046e9285b66cb07927f3a8da0af548ac2569b4c4fb1309d3ced76d733051a20814e90dd5b75ffd1", + "0xabaab92ea6152d40f82940277c725aa768a631ee0b37f5961667f82fb990fc11e6d3a6a2752b0c6f94563ed9bb28265c", + "0xb7fe28543eca2a716859a76ab9092f135337e28109544f6bd2727728d0a7650428af5713171ea60bfc273d1c821d992c", + "0x8a4917b2ab749fc7343fc64bdf51b6c0698ff15d740cc7baf248c030475c097097d5a473bcc00d8c25817563fe0447b4", + "0xaa96156d1379553256350a0a3250166add75948fb9cde62aa555a0a9dc0a9cb7f2f7b8428aff66097bf6bfedaf14bbe2", + "0xae4ffeb9bdc76830d3eca2b705f30c1bdede6412fa064260a21562c8850c7fb611ec62bc68479fe48f692833e6f66d8d", + "0xb96543caaba9d051600a14997765d49e4ab10b07c7a92cccf0c90b309e6da334fdd6d18c96806cbb67a7801024fbd3c7", + "0x97b2b9ad76f19f500fcc94ca8e434176249f542ac66e5881a3dccd07354bdab6a2157018b19f8459437a68d8b86ba8e0", + "0xa8d206f6c5a14c80005849474fde44b1e7bcf0b2d52068f5f97504c3c035b09e65e56d1cf4b5322791ae2c2fdbd61859", + "0x936bad397ad577a70cf99bf9056584a61bd7f02d2d5a6cf219c05d770ae30a5cd902ba38366ce636067fc1dd10108d31", + "0xa77e30195ee402b84f3882e2286bf5380c0ed374a112dbd11e16cef6b6b61ab209d4635e6f35cdaaa72c1a1981d5dabe", + "0xa46ba4d3947188590a43c180757886a453a0503f79cc435322d92490446f37419c7b999fdf868a023601078070e03346", + "0x80d8d4c5542f223d48240b445d4d8cf6a75d120b060bc08c45e99a13028b809d910b534d2ac47fb7068930c54efd8da9", + "0x803be9c68c91b42b68e1f55e58917a477a9a6265e679ca44ee30d3eb92453f8c89c64eafc04c970d6831edd33d066902", + "0xb14b2b3d0dfe2bb57cee4cd72765b60ac33c1056580950be005790176543826c1d4fbd737f6cfeada6c735543244ab57", + "0xa9e480188bba1b8fb7105ff12215706665fd35bf1117bacfb6ab6985f4dbc181229873b82e5e18323c2b8f5de03258e0", + "0xa66a0f0779436a9a3999996d1e6d3000f22c2cac8e0b29cddef9636393c7f1457fb188a293b6c875b05d68d138a7cc4a", + "0x848397366300ab40c52d0dbbdafbafef6cd3dadf1503bb14b430f52bb9724188928ac26f6292a2412bc7d7aa620763c8", + "0x95466cc1a78c9f33a9aaa3829a4c8a690af074916b56f43ae46a67a12bb537a5ac6dbe61590344a25b44e8512355a4a7", + "0x8b5f7a959f818e3baf0887f140f4575cac093d0aece27e23b823cf421f34d6e4ff4bb8384426e33e8ec7b5eed51f6b5c", + "0x8d5e1368ec7e3c65640d216bcc5d076f3d9845924c734a34f3558ac0f16e40597c1a775a25bf38b187213fbdba17c93b", + "0xb4647c1b823516880f60d20c5cc38c7f80b363c19d191e8992226799718ee26b522a12ecb66556ed3d483aa4824f3326", + "0xac3abaea9cd283eb347efda4ed9086ea3acf495043e08d0d19945876329e8675224b685612a6badf8fd72fb6274902b1", + "0x8eae1ce292d317aaa71bcf6e77e654914edd5090e2e1ebab78b18bb41b9b1bc2e697439f54a44c0c8aa0d436ebe6e1a9", + "0x94dc7d1aec2c28eb43d93b111fa59aaa0d77d5a09501220bd411768c3e52208806abf973c6a452fd8292ff6490e0c9e2", + "0x8fd8967f8e506fef27d17b435d6b86b232ec71c1036351f12e6fb8a2e12daf01d0ee04451fb944d0f1bf7fd20e714d02", + "0x824e6865be55d43032f0fec65b3480ea89b0a2bf860872237a19a54bc186a85d2f8f9989cc837fbb325b7c72d9babe2c", + "0x8bd361f5adb27fd6f4e3f5de866e2befda6a8454efeb704aacc606f528c03f0faae888f60310e49440496abd84083ce2", + "0xb098a3c49f2aaa28b6b3e85bc40ce6a9cdd02134ee522ae73771e667ad7629c8d82c393fba9f27f5416986af4c261438", + "0xb385f5ca285ff2cfe64dcaa32dcde869c28996ed091542600a0b46f65f3f5a38428cca46029ede72b6cf43e12279e3d3", + "0x8196b03d011e5be5288196ef7d47137d6f9237a635ab913acdf9c595fa521d9e2df722090ec7eb0203544ee88178fc5f", + "0x8ed1270211ef928db18e502271b7edf24d0bbd11d97f2786aee772d70c2029e28095cf8f650b0328cc8a4c38d045316d", + "0xa52ab60e28d69b333d597a445884d44fd2a7e1923dd60f763951e1e45f83e27a4dac745f3b9eff75977b3280e132c15d", + "0x91e9fe78cdac578f4a4687f71b800b35da54b824b1886dafec073a3c977ce7a25038a2f3a5b1e35c2c8c9d1a7312417c", + "0xa42832173f9d9491c7bd93b21497fbfa4121687cd4d2ab572e80753d7edcbb42cfa49f460026fbde52f420786751a138", + "0x97b947126d84dcc70c97be3c04b3de3f239b1c4914342fa643b1a4bb8c4fe45c0fcb585700d13a7ed50784790c54bef9", + "0x860e407d353eac070e2418ef6cb80b96fc5f6661d6333e634f6f306779651588037be4c2419562c89c61f9aa2c4947f5", + "0xb2c9d93c3ba4e511b0560b55d3501bf28a510745fd666b3cb532db051e6a8617841ea2f071dda6c9f15619c7bfd2737f", + "0x8596f4d239aeeac78311207904d1bd863ef68e769629cc379db60e019aaf05a9d5cd31dc8e630b31e106a3a93e47cbc5", + "0x8b26e14e2e136b65c5e9e5c2022cee8c255834ea427552f780a6ca130a6446102f2a6f334c3f9a0308c53df09e3dba7e", + "0xb54724354eb515a3c8bed0d0677ff1db94ac0a07043459b4358cb90e3e1aa38ac23f2caa3072cf9647275d7cd61d0e80", + "0xb7ce9fe0e515e7a6b2d7ddcb92bc0196416ff04199326aea57996eef8c5b1548bd8569012210da317f7c0074691d01b7", + "0xa1a13549c82c877253ddefa36a29ea6a23695ee401fdd48e65f6f61e5ebd956d5e0edeff99484e9075cb35071fec41e2", + "0x838ba0c1e5bd1a6da05611ff1822b8622457ebd019cb065ece36a2d176bd2d889511328120b8a357e44569e7f640c1e6", + "0xb916eccff2a95519400bbf76b5f576cbe53cf200410370a19d77734dc04c05b585cfe382e8864e67142d548cd3c4c2f4", + "0xa610447cb7ca6eea53a6ff1f5fe562377dcb7f4aaa7300f755a4f5e8eba61e863c51dc2aa9a29b35525b550fbc32a0fe", + "0x9620e8f0f0ee9a4719aa9685eeb1049c5c77659ba6149ec4c158f999cfd09514794b23388879931fe26fea03fa471fd3", + "0xa9dcf8b679e276583cf5b9360702a185470d09aea463dc474ee9c8aee91ef089dacb073e334e47fbc78ec5417c90465c", + "0x8c9adee8410bdd99e5b285744cee61e2593b6300ff31a8a83b0ec28da59475a5c6fb9346fe43aadea2e6c3dad2a8e30a", + "0x97d5afe9b3897d7b8bb628b7220cf02d8ee4e9d0b78f5000d500aaf4c1df9251aaaabfd1601626519f9d66f00a821d4e", + "0x8a382418157b601ce4c3501d3b8409ca98136a4ef6abcbf62885e16e215b76b035c94d149cc41ff92e42ccd7c43b9b3d", + "0xb64b8d11fb3b01abb2646ac99fdb9c02b804ce15d98f9fe0fbf1c9df8440c71417487feb6cdf51e3e81d37104b19e012", + "0x849d7d044f9d8f0aab346a9374f0b3a5d14a9d1faa83dbacccbdc629ad1ef903a990940255564770537f8567521d17f0", + "0x829dbb0c76b996c2a91b4cbbe93ba455ca0d5729755e5f0c92aaee37dff7f36fcdc06f33aca41f1b609c784127b67d88", + "0x85a7c0069047b978422d264d831ab816435f63938015d2e977222b6b5746066c0071b7f89267027f8a975206ed25c1b0", + "0x84b9fbc1cfb302df1acdcf3dc5d66fd1edfe7839f7a3b2fb3a0d5548656249dd556104d7c32b73967bccf0f5bdcf9e3b", + "0x972220ac5b807f53eac37dccfc2ad355d8b21ea6a9c9b011c09fe440ddcdf7513e0b43d7692c09ded80d7040e26aa28f", + "0x855885ed0b21350baeca890811f344c553cf9c21024649c722453138ba29193c6b02c4b4994cd414035486f923472e28", + "0x841874783ae6d9d0e59daea03e96a01cbbe4ecaced91ae4f2c8386e0d87b3128e6d893c98d17c59e4de1098e1ad519dd", + "0x827e50fc9ce56f97a4c3f2f4cbaf0b22f1c3ce6f844ff0ef93a9c57a09b8bf91ebfbd2ba9c7f83c442920bffdaf288cc", + "0xa441f9136c7aa4c08d5b3534921b730e41ee91ab506313e1ba5f7c6f19fd2d2e1594e88c219834e92e6fb95356385aa7", + "0x97d75b144471bf580099dd6842b823ec0e6c1fb86dd0da0db195e65524129ea8b6fd4a7a9bbf37146269e938a6956596", + "0xa4b6fa87f09d5a29252efb2b3aaab6b3b6ea9fab343132a651630206254a25378e3e9d6c96c3d14c150d01817d375a8e", + "0xa31a671876d5d1e95fe2b8858dc69967231190880529d57d3cab7f9f4a2b9b458ac9ee5bdaa3289158141bf18f559efb", + "0x90bee6fff4338ba825974021b3b2a84e36d617e53857321f13d2b3d4a28954e6de3b3c0e629d61823d18a9763313b3bf", + "0x96b622a63153f393bb419bfcf88272ea8b3560dbd46b0aa07ada3a6223990d0abdd6c2adb356ef4be5641688c8d83941", + "0x84c202adeaff9293698022bc0381adba2cd959f9a35a4e8472288fd68f96f6de8be9da314c526d88e291c96b1f3d6db9", + "0x8ca01a143b8d13809e5a8024d03e6bc9492e22226073ef6e327edf1328ef4aff82d0bcccee92cb8e212831fa35fe1204", + "0xb2f970dbad15bfbefb38903c9bcc043d1367055c55dc1100a850f5eb816a4252c8c194b3132c929105511e14ea10a67d", + "0xa5e36556472a95ad57eb90c3b6623671b03eafd842238f01a081997ffc6e2401f76e781d049bb4aa94d899313577a9cf", + "0x8d1057071051772f7c8bedce53a862af6fd530dd56ae6321eaf2b9fc6a68beff5ed745e1c429ad09d5a118650bfd420a", + "0x8aadc4f70ace4fcb8d93a78610779748dcffc36182d45b932c226dc90e48238ea5daa91f137c65ed532352c4c4d57416", + "0xa2ea05ae37e673b4343232ae685ee14e6b88b867aef6dfac35db3589cbcd76f99540fed5c2641d5bb5a4a9f808e9bf0d", + "0x947f1abad982d65648ae4978e094332b4ecb90f482c9be5741d5d1cf5a28acf4680f1977bf6e49dd2174c37f11e01296", + "0xa27b144f1565e4047ba0e3f4840ef19b5095d1e281eaa463c5358f932114cbd018aa6dcf97546465cf2946d014d8e6d6", + "0x8574e1fc3acade47cd4539df578ce9205e745e161b91e59e4d088711a7ab5aa3b410d517d7304b92109924d9e2af8895", + "0xa48ee6b86b88015d6f0d282c1ae01d2a5b9e8c7aa3d0c18b35943dceb1af580d08a65f54dc6903cde82fd0d73ce94722", + "0x8875650cec543a7bf02ea4f2848a61d167a66c91ffaefe31a9e38dc8511c6a25bde431007eefe27a62af3655aca208dc", + "0x999b0a6e040372e61937bf0d68374e230346b654b5a0f591a59d33a4f95bdb2f3581db7c7ccb420cd7699ed709c50713", + "0x878c9e56c7100c5e47bbe77dc8da5c5fe706cec94d37fa729633bca63cace7c40102eee780fcdabb655f5fa47a99600e", + "0x865006fb5b475ada5e935f27b96f9425fc2d5449a3c106aa366e55ebed3b4ee42adc3c3f0ac19fd129b40bc7d6bc4f63", + "0xb7a7da847f1202e7bc1672553e68904715e84fd897d529243e3ecda59faa4e17ba99c649a802d53f6b8dfdd51f01fb74", + "0x8b2fb4432c05653303d8c8436473682933a5cb604da10c118ecfcd2c8a0e3132e125afef562bdbcc3df936164e5ce4f2", + "0x808d95762d33ddfa5d0ee3d7d9f327de21a994d681a5f372e2e3632963ea974da7f1f9e5bac8ccce24293509d1f54d27", + "0x932946532e3c397990a1df0e94c90e1e45133e347a39b6714c695be21aeb2d309504cb6b1dde7228ff6f6353f73e1ca2", + "0x9705e7c93f0cdfaa3fa96821f830fe53402ad0806036cd1b48adc2f022d8e781c1fbdab60215ce85c653203d98426da3", + "0xaa180819531c3ec1feb829d789cb2092964c069974ae4faad60e04a6afcce5c3a59aec9f11291e6d110a788d22532bc6", + "0x88f755097f7e25cb7dd3c449520c89b83ae9e119778efabb54fbd5c5714b6f37c5f9e0346c58c6ab09c1aef2483f895d", + "0x99fc03ab7810e94104c494f7e40b900f475fde65bdec853e60807ffd3f531d74de43335c3b2646b5b8c26804a7448898", + "0xaf2dea9683086bed1a179110efb227c9c00e76cd00a2015b089ccbcee46d1134aa18bda5d6cab6f82ae4c5cd2461ac21", + "0xa500f87ba9744787fdbb8e750702a3fd229de6b8817594348dec9a723b3c4240ddfa066262d002844b9e38240ce55658", + "0x924d0e45c780f5bc1c1f35d15dfc3da28036bdb59e4c5440606750ecc991b85be18bc9a240b6c983bc5430baa4c68287", + "0x865b11e0157b8bf4c5f336024b016a0162fc093069d44ac494723f56648bc4ded13dfb3896e924959ea11c96321afefc", + "0x93672d8607d4143a8f7894f1dcca83fb84906dc8d6dd7dd063bb0049cfc20c1efd933e06ca7bd03ea4cb5a5037990bfe", + "0x826891efbdff0360446825a61cd1fa04326dd90dae8c33dfb1ed97b045e165766dd070bd7105560994d0b2044bdea418", + "0x93c4a4a8bcbc8b190485cc3bc04175b7c0ed002c28c98a540919effd6ed908e540e6594f6db95cd65823017258fb3b1c", + "0xaeb2a0af2d2239fda9aa6b8234b019708e8f792834ff0dd9c487fa09d29800ddceddd6d7929faa9a3edcb9e1b3aa0d6b", + "0x87f11de7236d387863ec660d2b04db9ac08143a9a2c4dfff87727c95b4b1477e3bc473a91e5797313c58754905079643", + "0x80dc1db20067a844fe8baceca77f80db171a5ca967acb24e2d480eae9ceb91a3343c31ad1c95b721f390829084f0eae6", + "0x9825c31f1c18da0de3fa84399c8b40f8002c3cae211fb6a0623c76b097b4d39f5c50058f57a16362f7a575909d0a44a2", + "0xa99fc8de0c38dbf7b9e946de83943a6b46a762167bafe2a603fb9b86f094da30d6de7ed55d639aafc91936923ee414b3", + "0xad594678b407db5d6ea2e90528121f84f2b96a4113a252a30d359a721429857c204c1c1c4ff71d8bb5768c833f82e80e", + "0xb33d985e847b54510b9b007e31053732c8a495e43be158bd2ffcea25c6765bcbc7ca815f7c60b36ad088b955dd6e9350", + "0x815f8dfc6f90b3342ca3fbd968c67f324dae8f74245cbf8bc3bef10e9440c65d3a2151f951e8d18959ba01c1b50b0ec1", + "0x94c608a362dd732a1abc56e338637c900d59013db8668e49398b3c7a0cae3f7e2f1d1bf94c0299eeafe6af7f76c88618", + "0x8ebd8446b23e5adfcc393adc5c52fe172f030a73e63cd2d515245ca0dd02782ceed5bcdd9ccd9c1b4c5953dfac9c340c", + "0x820437f3f6f9ad0f5d7502815b221b83755eb8dc56cd92c29e9535eb0b48fb8d08c9e4fcc26945f9c8cca60d89c44710", + "0x8910e4e8a56bf4be9cc3bbf0bf6b1182a2f48837a2ed3c2aaec7099bfd7f0c83e14e608876b17893a98021ff4ab2f20d", + "0x9633918fde348573eec15ce0ad53ac7e1823aac86429710a376ad661002ae6d049ded879383faaa139435122f64047c6", + "0xa1f5e3fa558a9e89318ca87978492f0fb4f6e54a9735c1b8d2ecfb1d1c57194ded6e0dd82d077b2d54251f3bee1279e1", + "0xb208e22d04896abfd515a95c429ff318e87ff81a5d534c8ac2c33c052d6ffb73ef1dccd39c0bbe0734b596c384014766", + "0x986d5d7d2b5bde6d16336f378bd13d0e671ad23a8ec8a10b3fc09036faeeb069f60662138d7a6df3dfb8e0d36180f770", + "0xa2d4e6c5f5569e9cef1cddb569515d4b6ace38c8aed594f06da7434ba6b24477392cc67ba867c2b079545ca0c625c457", + "0xb5ac32b1d231957d91c8b7fc43115ce3c5c0d8c13ca633374402fa8000b6d9fb19499f9181844f0c10b47357f3f757ce", + "0x96b8bf2504b4d28fa34a4ec378e0e0b684890c5f44b7a6bb6e19d7b3db2ab27b1e2686389d1de9fbd981962833a313ea", + "0x953bfd7f6c3a0469ad432072b9679a25486f5f4828092401eff494cfb46656c958641a4e6d0d97d400bc59d92dba0030", + "0x876ab3cea7484bbfd0db621ec085b9ac885d94ab55c4bb671168d82b92e609754b86aaf472c55df3d81421d768fd108a", + "0x885ff4e67d9ece646d02dd425aa5a087e485c3f280c3471b77532b0db6145b69b0fbefb18aa2e3fa5b64928b43a94e57", + "0xb91931d93f806d0b0e6cc62a53c718c099526140f50f45d94b8bbb57d71e78647e06ee7b42aa5714aed9a5c05ac8533f", + "0xa0313eeadd39c720c9c27b3d671215331ab8d0a794e71e7e690f06bcd87722b531d6525060c358f35f5705dbb7109ccb", + "0x874c0944b7fedc6701e53344100612ddcb495351e29305c00ec40a7276ea5455465ffb7bded898886c1853139dfb1fc7", + "0x8dc31701a01ee8137059ca1874a015130d3024823c0576aa9243e6942ec99d377e7715ed1444cd9b750a64b85dcaa3e5", + "0x836d2a757405e922ec9a2dfdcf489a58bd48b5f9683dd46bf6047688f778c8dee9bc456de806f70464df0b25f3f3d238", + "0xb30b0a1e454a503ea3e2efdec7483eaf20b0a5c3cefc42069e891952b35d4b2c955cf615f3066285ed8fafd9fcfbb8f6", + "0x8e6d4044b55ab747e83ec8762ea86845f1785cc7be0279c075dadf08aca3ccc5a096c015bb3c3f738f647a4eadea3ba5", + "0xad7735d16ab03cbe09c029610aa625133a6daecfc990b297205b6da98eda8c136a7c50db90f426d35069708510d5ae9c", + "0x8d62d858bbb59ec3c8cc9acda002e08addab4d3ad143b3812098f3d9087a1b4a1bb255dcb1635da2402487d8d0249161", + "0x805beec33238b832e8530645a3254aeef957e8f7ea24bcfc1054f8b9c69421145ebb8f9d893237e8a001c857fedfc77e", + "0xb1005644be4b085e3f5775aa9bd3e09a283e87ddada3082c04e7a62d303dcef3b8cf8f92944c200c7ae6bb6bdf63f832", + "0xb4ba0e0790dc29063e577474ffe3b61f5ea2508169f5adc1e394934ebb473e356239413a17962bc3e5d3762d72cce8c2", + "0xa157ba9169c9e3e6748d9f1dd67fbe08b9114ade4c5d8fc475f87a764fb7e6f1d21f66d7905cd730f28a1c2d8378682a", + "0x913e52b5c93989b5d15e0d91aa0f19f78d592bc28bcfdfddc885a9980c732b1f4debb8166a7c4083c42aeda93a702898", + "0x90fbfc1567e7cd4e096a38433704d3f96a2de2f6ed3371515ccc30bc4dd0721a704487d25a97f3c3d7e4344472702d8d", + "0x89646043028ffee4b69d346907586fd12c2c0730f024acb1481abea478e61031966e72072ff1d5e65cb8c64a69ad4eb1", + "0xb125a45e86117ee11d2fb42f680ab4a7894edd67ff927ae2c808920c66c3e55f6a9d4588eee906f33a05d592e5ec3c04", + "0xaad47f5b41eae9be55fb4f67674ff1e4ae2482897676f964a4d2dcb6982252ee4ff56aac49578b23f72d1fced707525e", + "0xb9ddff8986145e33851b4de54d3e81faa3352e8385895f357734085a1616ef61c692d925fe62a5ed3be8ca49f5d66306", + "0xb3cb0963387ed28c0c0adf7fe645f02606e6e1780a24d6cecef5b7c642499109974c81a7c2a198b19862eedcea2c2d8c", + "0xac9c53c885457aaf5cb36c717a6f4077af701e0098eebd7aa600f5e4b14e6c1067255b3a0bc40e4a552025231be7de60", + "0x8e1a8d823c4603f6648ec21d064101094f2a762a4ed37dd2f0a2d9aa97b2d850ce1e76f4a4b8cae58819b058180f7031", + "0xb268b73bf7a179b6d22bd37e5e8cb514e9f5f8968c78e14e4f6d5700ca0d0ca5081d0344bb73b028970eebde3cb4124e", + "0xa7f57d71940f0edbd29ed8473d0149cae71d921dd15d1ff589774003e816b54b24de2620871108cec1ab9fa956ad6ce6", + "0x8053e6416c8b120e2b999cc2fc420a6a55094c61ac7f2a6c6f0a2c108a320890e389af96cbe378936132363c0d551277", + "0xb3823f4511125e5aa0f4269e991b435a0d6ceb523ebd91c04d7add5534e3df5fc951c504b4fd412a309fd3726b7f940b", + "0xae6eb04674d04e982ca9a6add30370ab90e303c71486f43ed3efbe431af1b0e43e9d06c11c3412651f304c473e7dbf39", + "0x96ab55e641ed2e677591f7379a3cd126449614181fce403e93e89b1645d82c4af524381ff986cae7f9cebe676878646d", + "0xb52423b4a8c37d3c3e2eca8f0ddbf7abe0938855f33a0af50f117fab26415fb0a3da5405908ec5fdc22a2c1f2ca64892", + "0x82a69ce1ee92a09cc709d0e3cd22116c9f69d28ea507fe5901f5676000b5179b9abe4c1875d052b0dd42d39925e186bb", + "0xa84c8cb84b9d5cfb69a5414f0a5283a5f2e90739e9362a1e8c784b96381b59ac6c18723a4aa45988ee8ef5c1f45cc97d", + "0xafd7efce6b36813082eb98257aae22a4c1ae97d51cac7ea9c852d4a66d05ef2732116137d8432e3f117119725a817d24", + "0xa0f5fe25af3ce021b706fcff05f3d825384a272284d04735574ce5fb256bf27100fad0b1f1ba0e54ae9dcbb9570ecad3", + "0x8751786cb80e2e1ff819fc7fa31c2833d25086534eb12b373d31f826382430acfd87023d2a688c65b5e983927e146336", + "0x8cf5c4b17fa4f3d35c78ce41e1dc86988fd1135cd5e6b2bb0c108ee13538d0d09ae7102609c6070f39f937b439b31e33", + "0xa9108967a2fedd7c322711eca8159c533dd561bedcb181b646de98bf5c3079449478eab579731bee8d215ae8852c7e21", + "0xb54c5171704f42a6f0f4e70767cdb3d96ffc4888c842eece343a01557da405961d53ffdc34d2f902ea25d3e1ed867cad", + "0xae8d4b764a7a25330ba205bf77e9f46182cd60f94a336bbd96773cf8064e3d39caf04c310680943dc89ed1fbad2c6e0d", + "0xaa5150e911a8e1346868e1b71c5a01e2a4bb8632c195861fb6c3038a0e9b85f0e09b3822e9283654a4d7bb17db2fc5f4", + "0x9685d3756ce9069bf8bb716cf7d5063ebfafe37e15b137fc8c3159633c4e006ff4887ddd0ae90360767a25c3f90cba7f", + "0x82155fd70f107ab3c8e414eadf226c797e07b65911508c76c554445422325e71af8c9a8e77fd52d94412a6fc29417cd3", + "0xabfae52f53a4b6e00760468d973a267f29321997c3dbb5aee36dc1f20619551229c0c45b9d9749f410e7f531b73378e8", + "0x81a76d921f8ef88e774fd985e786a4a330d779b93fad7def718c014685ca0247379e2e2a007ad63ee7f729cd9ed6ce1b", + "0x81947c84bc5e28e26e2e533af5ae8fe10407a7b77436dbf8f1d5b0bbe86fc659eae10f974659dc7c826c6dabd03e3a4b", + "0x92b8c07050d635b8dd4fd09df9054efe4edae6b86a63c292e73cc819a12a21dd7d104ce51fa56af6539dedf6dbe6f7b6", + "0xb44c579e3881f32b32d20c82c207307eca08e44995dd2aac3b2692d2c8eb2a325626c80ac81c26eeb38c4137ff95add5", + "0x97efab8941c90c30860926dea69a841f2dcd02980bf5413b9fd78d85904588bf0c1021798dbc16c8bbb32cce66c82621", + "0x913363012528b50698e904de0588bf55c8ec5cf6f0367cfd42095c4468fcc64954fbf784508073e542fee242d0743867", + "0x8ed203cf215148296454012bd10fddaf119203db1919a7b3d2cdc9f80e66729464fdfae42f1f2fc5af1ed53a42b40024", + "0xab84312db7b87d711e9a60824f4fe50e7a6190bf92e1628688dfcb38930fe87b2d53f9e14dd4de509b2216856d8d9188", + "0x880726def069c160278b12d2258eac8fa63f729cd351a710d28b7e601c6712903c3ac1e7bbd0d21e4a15f13ca49db5aa", + "0x980699cd51bac6283959765f5174e543ed1e5f5584b5127980cbc2ef18d984ecabba45042c6773b447b8e694db066028", + "0xaeb019cb80dc4cb4207430d0f2cd24c9888998b6f21d9bf286cc638449668d2eec0018a4cf3fe6448673cd6729335e2b", + "0xb29852f6aa6c60effdffe96ae88590c88abae732561d35cc19e82d3a51e26cb35ea00986193e07f90060756240f5346e", + "0xa0fa855adc5ba469f35800c48414b8921455950a5c0a49945d1ef6e8f2a1881f2e2dfae47de6417270a6bf49deeb091d", + "0xb6c7332e3b14813641e7272d4f69ecc7e09081df0037d6dab97ce13a9e58510f5c930d300633f208181d9205c5534001", + "0x85a6c050f42fce560b5a8d54a11c3bbb8407abbadd859647a7b0c21c4b579ec65671098b74f10a16245dc779dff7838e", + "0x8f3eb34bb68759d53c6677de4de78a6c24dd32c8962a7fb355ed362572ef8253733e6b52bc21c9f92ecd875020a9b8de", + "0xa17dd44181e5dab4dbc128e1af93ec22624b57a448ca65d2d9e246797e4af7d079e09c6e0dfb62db3a9957ce92f098d5", + "0xa56a1b854c3183082543a8685bb34cae1289f86cfa8123a579049dbd059e77982886bfeb61bf6e05b4b1fe4e620932e7", + "0xaedae3033cb2fb7628cb4803435bdd7757370a86f808ae4cecb9a268ad0e875f308c048c80cbcac523de16b609683887", + "0x9344905376aa3982b1179497fac5a1d74b14b7038fd15e3b002db4c11c8bfc7c39430db492cdaf58b9c47996c9901f28", + "0xa3bfafdae011a19f030c749c3b071f83580dee97dd6f949e790366f95618ca9f828f1daaeabad6dcd664fcef81b6556d", + "0x81c03d8429129e7e04434dee2c529194ddb01b414feda3adee2271eb680f6c85ec872a55c9fa9d2096f517e13ed5abcc", + "0x98205ef3a72dff54c5a9c82d293c3e45d908946fa74bb749c3aabe1ab994ea93c269bcce1a266d2fe67a8f02133c5985", + "0x85a70aeed09fda24412fadbafbbbf5ba1e00ac92885df329e147bfafa97b57629a3582115b780d8549d07d19b7867715", + "0xb0fbe81c719f89a57d9ea3397705f898175808c5f75f8eb81c2193a0b555869ba7bd2e6bc54ee8a60cea11735e21c68c", + "0xb03a0bd160495ee626ff3a5c7d95bc79d7da7e5a96f6d10116600c8fa20bedd1132f5170f25a22371a34a2d763f2d6d0", + "0xa90ab04091fbca9f433b885e6c1d60ab45f6f1daf4b35ec22b09909d493a6aab65ce41a6f30c98239cbca27022f61a8b", + "0xb66f92aa3bf2549f9b60b86f99a0bd19cbdd97036d4ae71ca4b83d669607f275260a497208f6476cde1931d9712c2402", + "0xb08e1fdf20e6a9b0b4942f14fa339551c3175c1ffc5d0ab5b226b6e6a322e9eb0ba96adc5c8d59ca4259e2bdd04a7eb0", + "0xa2812231e92c1ce74d4f5ac3ab6698520288db6a38398bb38a914ac9326519580af17ae3e27cde26607e698294022c81", + "0xabfcbbcf1d3b9e84c02499003e490a1d5d9a2841a9e50c7babbef0b2dd20d7483371d4dc629ba07faf46db659459d296", + "0xb0fe9f98c3da70927c23f2975a9dc4789194d81932d2ad0f3b00843dd9cbd7fb60747a1da8fe5a79f136a601becf279d", + "0xb130a6dba7645165348cb90f023713bed0eefbd90a976b313521c60a36d34f02032e69a2bdcf5361e343ed46911297ec", + "0x862f0cffe3020cea7a5fd4703353aa1eb1be335e3b712b29d079ff9f7090d1d8b12013011e1bdcbaa80c44641fd37c9f", + "0x8c6f11123b26633e1abb9ed857e0bce845b2b3df91cc7b013b2fc77b477eee445da0285fc6fc793e29d5912977f40916", + "0x91381846126ea819d40f84d3005e9fb233dc80071d1f9bb07f102bf015f813f61e5884ffffb4f5cd333c1b1e38a05a58", + "0x8add7d908de6e1775adbd39c29a391f06692b936518db1f8fde74eb4f533fc510673a59afb86e3a9b52ade96e3004c57", + "0x8780e086a244a092206edcde625cafb87c9ab1f89cc3e0d378bc9ee776313836160960a82ec397bc3800c0a0ec3da283", + "0xa6cb4cd9481e22870fdd757fae0785edf4635e7aacb18072fe8dc5876d0bab53fb99ce40964a7d3e8bcfff6f0ab1332f", + "0xaf30ff47ecc5b543efba1ba4706921066ca8bb625f40e530fb668aea0551c7647a9d126e8aba282fbcce168c3e7e0130", + "0x91b0bcf408ce3c11555dcb80c4410b5bc2386d3c05caec0b653352377efdcb6bab4827f2018671fc8e4a0e90d772acc1", + "0xa9430b975ef138b6b2944c7baded8fe102d31da4cfe3bd3d8778bda79189c99d38176a19c848a19e2d1ee0bddd9a13c1", + "0xaa5a4eef849d7c9d2f4b018bd01271c1dd83f771de860c4261f385d3bdcc130218495860a1de298f14b703ec32fa235f", + "0xb0ce79e7f9ae57abe4ff366146c3b9bfb38b0dee09c28c28f5981a5d234c6810ad4d582751948affb480d6ae1c8c31c4", + "0xb75122748560f73d15c01a8907d36d06dc068e82ce22b84b322ac1f727034493572f7907dec34ebc3ddcc976f2f89ed7", + "0xb0fc7836369a3e4411d34792d6bd5617c14f61d9bba023dda64e89dc5fb0f423244e9b48ee64869258931daa9753a56f", + "0x8956d7455ae9009d70c6e4a0bcd7610e55f37494cf9897a8f9e1b904cc8febc3fd2d642ebd09025cfff4609ad7e3bc52", + "0xad741efe9e472026aa49ae3d9914cb9c1a6f37a54f1a6fe6419bebd8c7d68dca105a751c7859f4389505ede40a0de786", + "0xb52f418797d719f0d0d0ffb0846788b5cba5d0454a69a2925de4b0b80fa4dd7e8c445e5eac40afd92897ed28ca650566", + "0xa0ab65fb9d42dd966cd93b1de01d7c822694669dd2b7a0c04d99cd0f3c3de795f387b9c92da11353412f33af5c950e9a", + "0xa0052f44a31e5741a331f7cac515a08b3325666d388880162d9a7b97598fde8b61f9ff35ff220df224eb5c4e40ef0567", + "0xa0101cfdc94e42b2b976c0d89612a720e55d145a5ef6ef6f1f78cf6de084a49973d9b5d45915349c34ce712512191e3c", + "0xa0dd99fcf3f5cead5aaf08e82212df3a8bb543c407a4d6fab88dc5130c1769df3f147e934a46f291d6c1a55d92b86917", + "0xa5939153f0d1931bbda5cf6bdf20562519ea55fbfa978d6dbc6828d298260c0da7a50c37c34f386e59431301a96c2232", + "0x9568269f3f5257200f9ca44afe1174a5d3cf92950a7f553e50e279c239e156a9faaa2a67f288e3d5100b4142efe64856", + "0xb746b0832866c23288e07f24991bbf687cad794e7b794d3d3b79367566ca617d38af586cdc8d6f4a85a34835be41d54f", + "0xa871ce28e39ab467706e32fec1669fda5a4abba2f8c209c6745df9f7a0fa36bbf1919cf14cb89ea26fa214c4c907ae03", + "0xa08dacdd758e523cb8484f6bd070642c0c20e184abdf8e2a601f61507e93952d5b8b0c723c34fcbdd70a8485eec29db2", + "0x85bdb78d501382bb95f1166b8d032941005661aefd17a5ac32df9a3a18e9df2fc5dc2c1f07075f9641af10353cecc0c9", + "0x98d730c28f6fa692a389e97e368b58f4d95382fad8f0baa58e71a3d7baaea1988ead47b13742ce587456f083636fa98e", + "0xa557198c6f3d5382be9fb363feb02e2e243b0c3c61337b3f1801c4a0943f18e38ce1a1c36b5c289c8fa2aa9d58742bab", + "0x89174f79201742220ac689c403fc7b243eed4f8e3f2f8aba0bf183e6f5d4907cb55ade3e238e3623d9885f03155c4d2b", + "0xb891d600132a86709e06f3381158db300975f73ea4c1f7c100358e14e98c5fbe792a9af666b85c4e402707c3f2db321e", + "0xb9e5b2529ef1043278c939373fc0dbafe446def52ddd0a8edecd3e4b736de87e63e187df853c54c28d865de18a358bb6", + "0x8589b2e9770340c64679062c5badb7bbef68f55476289b19511a158a9a721f197da03ece3309e059fc4468b15ac33aa3", + "0xaad8c6cd01d785a881b446f06f1e9cd71bca74ba98674c2dcddc8af01c40aa7a6d469037498b5602e76e9c91a58d3dbd", + "0xabaccb1bd918a8465f1bf8dbe2c9ad4775c620b055550b949a399f30cf0d9eb909f3851f5b55e38f9e461e762f88f499", + "0xae62339d26db46e85f157c0151bd29916d5cc619bd4b832814b3fd2f00af8f38e7f0f09932ffe5bba692005dab2d9a74", + "0x93a6ff30a5c0edf8058c89aba8c3259e0f1b1be1b80e67682de651e5346f7e1b4b4ac3d87cbaebf198cf779524aff6bf", + "0x8980a2b1d8f574af45b459193c952400b10a86122b71fca2acb75ee0dbd492e7e1ef5b959baf609a5172115e371f3177", + "0x8c2f49f3666faee6940c75e8c7f6f8edc3f704cca7a858bbb7ee5e96bba3b0cf0993996f781ba6be3b0821ef4cb75039", + "0xb14b9e348215b278696018330f63c38db100b0542cfc5be11dc33046e3bca6a13034c4ae40d9cef9ea8b34fef0910c4e", + "0xb59bc3d0a30d66c16e6a411cb641f348cb1135186d5f69fda8b0a0934a5a2e7f6199095ba319ec87d3fe8f1ec4a06368", + "0x8874aca2a3767aa198e4c3fec2d9c62d496bc41ff71ce242e9e082b7f38cdf356089295f80a301a3cf1182bde5308c97", + "0xb1820ebd61376d91232423fc20bf008b2ba37e761199f4ef0648ea2bd70282766799b4de814846d2f4d516d525c8daa7", + "0xa6b202e5dedc16a4073e04a11af3a8509b23dfe5a1952f899adeb240e75c3f5bde0c424f811a81ea48d343591faffe46", + "0xa69becee9c93734805523b92150a59a62eed4934f66056b645728740d42223f2925a1ad38359ba644da24d9414f4cdda", + "0xad72f0f1305e37c7e6b48c272323ee883320994cb2e0d850905d6655fafc9f361389bcb9c66b3ff8d2051dbb58c8aa96", + "0xb563600bd56fad7c8853af21c6a02a16ed9d8a8bbeea2c31731d63b976d83cb05b9779372d898233e8fd597a75424797", + "0xb0abb78ce465bf7051f563c62e8be9c57a2cc997f47c82819300f36e301fefd908894bb2053a9d27ce2d0f8c46d88b5b", + "0xa071a85fb8274bac2202e0cb8e0e2028a5e138a82d6e0374d39ca1884a549c7c401312f00071b91f455c3a2afcfe0cda", + "0xb931c271513a0f267b9f41444a5650b1918100b8f1a64959c552aff4e2193cc1b9927906c6fa7b8a8c68ef13d79aaa52", + "0xa6a1bb9c7d32cb0ca44d8b75af7e40479fbce67d216b48a2bb680d3f3a772003a49d3cd675fc64e9e0f8fabeb86d6d61", + "0xb98d609858671543e1c3b8564162ad828808bb50ded261a9f8690ded5b665ed8368c58f947365ed6e84e5a12e27b423d", + "0xb3dca58cd69ec855e2701a1d66cad86717ff103ef862c490399c771ad28f675680f9500cb97be48de34bcdc1e4503ffd", + "0xb34867c6735d3c49865e246ddf6c3b33baf8e6f164db3406a64ebce4768cb46b0309635e11be985fee09ab7a31d81402", + "0xacb966c554188c5b266624208f31fab250b3aa197adbdd14aee5ab27d7fb886eb4350985c553b20fdf66d5d332bfd3fe", + "0x943c36a18223d6c870d54c3b051ef08d802b85e9dd6de37a51c932f90191890656c06adfa883c87b906557ae32d09da0", + "0x81bca7954d0b9b6c3d4528aadf83e4bc2ef9ea143d6209bc45ae9e7ae9787dbcd8333c41f12c0b6deee8dcb6805e826a", + "0xaba176b92256efb68f574e543479e5cf0376889fb48e3db4ebfb7cba91e4d9bcf19dcfec444c6622d9398f06de29e2b9", + "0xb9f743691448053216f6ece7cd699871fff4217a1409ceb8ab7bdf3312d11696d62c74b0664ba0a631b1e0237a8a0361", + "0xa383c2b6276fa9af346b21609326b53fb14fdf6f61676683076e80f375b603645f2051985706d0401e6fbed7eb0666b6", + "0xa9ef2f63ec6d9beb8f3d04e36807d84bda87bdd6b351a3e4a9bf7edcb5618c46c1f58cfbf89e64b40f550915c6988447", + "0xa141b2d7a82f5005eaea7ae7d112c6788b9b95121e5b70b7168d971812f3381de8b0082ac1f0a82c7d365922ebd2d26a", + "0xb1b76ef8120e66e1535c17038b75255a07849935d3128e3e99e56567b842fb1e8d56ef932d508d2fb18b82f7868fe1a9", + "0x8e2e234684c81f21099f5c54f6bbe2dd01e3b172623836c77668a0c49ce1fe218786c3827e4d9ae2ea25c50a8924fb3c", + "0xa5caf5ff948bfd3c4ca3ffbdfcd91eec83214a6c6017235f309a0bbf7061d3b0b466307c00b44a1009cf575163898b43", + "0x986415a82ca16ebb107b4c50b0c023c28714281db0bcdab589f6cb13d80e473a3034b7081b3c358e725833f6d845cb14", + "0xb94836bf406ac2cbacb10e6df5bcdfcc9d9124ae1062767ca4e322d287fd5e353fdcebd0e52407cb3cd68571258a8900", + "0x83c6d70a640b33087454a4788dfd9ef3ed00272da084a8d36be817296f71c086b23b576f98178ab8ca6a74f04524b46b", + "0xad4115182ad784cfe11bcfc5ce21fd56229cc2ce77ac82746e91a2f0aa53ca6593a22efd2dc4ed8d00f84542643d9c58", + "0xab1434c5e5065da826d10c2a2dba0facccab0e52b506ce0ce42fbe47ced5a741797151d9ecc99dc7d6373cfa1779bbf6", + "0x8a8b591d82358d55e6938f67ea87a89097ab5f5496f7260adb9f649abb289da12b498c5b2539c2f9614fb4e21b1f66b0", + "0x964f355d603264bc1f44c64d6d64debca66f37dff39c971d9fc924f2bc68e6c187b48564a6dc82660a98b035f8addb5d", + "0xb66235eaaf47456bc1dc4bde454a028e2ce494ece6b713a94cd6bf27cf18c717fd0c57a5681caaa2ad73a473593cdd7a", + "0x9103e3bb74304186fa4e3e355a02da77da4aca9b7e702982fc2082af67127ebb23a455098313c88465bc9b7d26820dd5", + "0xb6a42ff407c9dd132670cdb83cbad4b20871716e44133b59a932cd1c3f97c7ac8ff7f61acfaf8628372508d8dc8cad7c", + "0x883a9c21c16a167a4171b0f084565c13b6f28ba7c4977a0de69f0a25911f64099e7bbb4da8858f2e93068f4155d04e18", + "0x8dbb3220abc6a43220adf0331e3903d3bfd1d5213aadfbd8dfcdf4b2864ce2e96a71f35ecfb7a07c3bbabf0372b50271", + "0xb4ad08aee48e176bda390b7d9acf2f8d5eb008f30d20994707b757dc6a3974b2902d29cd9b4d85e032810ad25ac49e97", + "0x865bb0f33f7636ec501bb634e5b65751c8a230ae1fa807a961a8289bbf9c7fe8c59e01fbc4c04f8d59b7f539cf79ddd5", + "0x86a54d4c12ad1e3605b9f93d4a37082fd26e888d2329847d89afa7802e815f33f38185c5b7292293d788ad7d7da1df97", + "0xb26c8615c5e47691c9ff3deca3021714662d236c4d8401c5d27b50152ce7e566266b9d512d14eb63e65bc1d38a16f914", + "0x827639d5ce7db43ba40152c8a0eaad443af21dc92636cc8cc2b35f10647da7d475a1e408901cd220552fddad79db74df", + "0xa2b79a582191a85dbe22dc384c9ca3de345e69f6aa370aa6d3ff1e1c3de513e30b72df9555b15a46586bd27ea2854d9d", + "0xae0d74644aba9a49521d3e9553813bcb9e18f0b43515e4c74366e503c52f47236be92dfbd99c7285b3248c267b1de5a0", + "0x80fb0c116e0fd6822a04b9c25f456bdca704e2be7bdc5d141dbf5d1c5eeb0a2c4f5d80db583b03ef3e47517e4f9a1b10", + "0xac3a1fa3b4a2f30ea7e0a114cdc479eb51773573804c2a158d603ad9902ae8e39ffe95df09c0d871725a5d7f9ba71a57", + "0xb56b2b0d601cba7f817fa76102c68c2e518c6f20ff693aad3ff2e07d6c4c76203753f7f91686b1801e8c4659e4d45c48", + "0x89d50c1fc56e656fb9d3915964ebce703cb723fe411ab3c9eaa88ccc5d2b155a9b2e515363d9c600d3c0cee782c43f41", + "0xb24207e61462f6230f3cd8ccf6828357d03e725769f7d1de35099ef9ee4dca57dbce699bb49ed994462bee17059d25ce", + "0xb886f17fcbcbfcd08ac07f04bb9543ef58510189decaccea4b4158c9174a067cb67d14b6be3c934e6e2a18c77efa9c9c", + "0xb9c050ad9cafd41c6e2e192b70d080076eed59ed38ea19a12bd92fa17b5d8947d58d5546aaf5e8e27e1d3b5481a6ce51", + "0xaaf7a34d3267e3b1ddbc54c641e3922e89303f7c86ebebc7347ebca4cffad5b76117dac0cbae1a133053492799cd936f", + "0xa9ee604ada50adef82e29e893070649d2d4b7136cc24fa20e281ce1a07bd736bf0de7c420369676bcbcecff26fb6e900", + "0x9855315a12a4b4cf80ab90b8bd13003223ba25206e52fd4fe6a409232fbed938f30120a3db23eab9c53f308bd8b9db81", + "0x8cd488dd7a24f548a3cf03c54dec7ff61d0685cb0f6e5c46c2d728e3500d8c7bd6bba0156f4bf600466fda53e5b20444", + "0x890ad4942ebac8f5b16c777701ab80c68f56fa542002b0786f8fea0fb073154369920ac3dbfc07ea598b82f4985b8ced", + "0x8de0cf9ddc84c9b92c59b9b044387597799246b30b9f4d7626fc12c51f6e423e08ee4cbfe9289984983c1f9521c3e19d", + "0xb474dfb5b5f4231d7775b3c3a8744956b3f0c7a871d835d7e4fd9cc895222c7b868d6c6ce250de568a65851151fac860", + "0x86433b6135d9ed9b5ee8cb7a6c40e5c9d30a68774cec04988117302b8a02a11a71a1e03fd8e0264ef6611d219f103007", + "0x80b9ed4adbe9538fb1ef69dd44ec0ec5b57cbfea820054d8d445b4261962624b4c70ac330480594bc5168184378379c3", + "0x8b2e83562ccd23b7ad2d17f55b1ab7ef5fbef64b3a284e6725b800f3222b8bdf49937f4a873917ada9c4ddfb090938c2", + "0xabe78cebc0f5a45d754140d1f685e387489acbfa46d297a8592aaa0d676a470654f417a4f7d666fc0b2508fab37d908e", + "0xa9c5f8ff1f8568e252b06d10e1558326db9901840e6b3c26bbd0cd5e850cb5fb3af3f117dbb0f282740276f6fd84126f", + "0x975f8dc4fb55032a5df3b42b96c8c0ffecb75456f01d4aef66f973cb7270d4eff32c71520ceefc1adcf38d77b6b80c67", + "0xb043306ed2c3d8a5b9a056565afd8b5e354c8c4569fda66b0d797a50a3ce2c08cffbae9bbe292da69f39e89d5dc7911e", + "0x8d2afc36b1e44386ba350c14a6c1bb31ff6ea77128a0c5287584ac3584282d18516901ce402b4644a53db1ed8e7fa581", + "0x8c294058bed53d7290325c363fe243f6ec4f4ea2343692f4bac8f0cb86f115c069ccb8334b53d2e42c067691ad110dba", + "0xb92157b926751aaf7ef82c1aa8c654907dccab6376187ee8b3e8c0c82811eae01242832de953faa13ebaff7da8698b3e", + "0xa780c4bdd9e4ba57254b09d745075cecab87feda78c88ffee489625c5a3cf96aa6b3c9503a374a37927d9b78de9bd22b", + "0x811f548ef3a2e6a654f7dcb28ac9378de9515ed61e5a428515d9594a83e80b35c60f96a5cf743e6fab0d3cb526149f49", + "0x85a4dccf6d90ee8e094731eec53bd00b3887aec6bd81a0740efddf812fd35e3e4fe4f983afb49a8588691c202dabf942", + "0xb152c2da6f2e01c8913079ae2b40a09b1f361a80f5408a0237a8131b429677c3157295e11b365b1b1841924b9efb922e", + "0x849b9efee8742502ffd981c4517c88ed33e4dd518a330802caff168abae3cd09956a5ee5eda15900243bc2e829016b74", + "0x955a933f3c18ec0f1c0e38fa931e4427a5372c46a3906ebe95082bcf878c35246523c23f0266644ace1fa590ffa6d119", + "0x911989e9f43e580c886656377c6f856cdd4ff1bd001b6db3bbd86e590a821d34a5c6688a29b8d90f28680e9fdf03ba69", + "0xb73b8b4f1fd6049fb68d47cd96a18fcba3f716e0a1061aa5a2596302795354e0c39dea04d91d232aec86b0bf2ba10522", + "0x90f87456d9156e6a1f029a833bf3c7dbed98ca2f2f147a8564922c25ae197a55f7ea9b2ee1f81bf7383197c4bad2e20c", + "0x903cba8b1e088574cb04a05ca1899ab00d8960580c884bd3c8a4c98d680c2ad11410f2b75739d6050f91d7208cac33a5", + "0x9329987d42529c261bd15ecedd360be0ea8966e7838f32896522c965adfc4febf187db392bd441fb43bbd10c38fdf68b", + "0x8178ee93acf5353baa349285067b20e9bb41aa32d77b5aeb7384fe5220c1fe64a2461bd7a83142694fe673e8bbf61b7c", + "0xa06a8e53abcff271b1394bcc647440f81fb1c1a5f29c27a226e08f961c3353f4891620f2d59b9d1902bf2f5cc07a4553", + "0xaaf5fe493b337810889e777980e6bbea6cac39ac66bc0875c680c4208807ac866e9fda9b5952aa1d04539b9f4a4bec57", + "0xaa058abb1953eceac14ccfa7c0cc482a146e1232905dcecc86dd27f75575285f06bbae16a8c9fe8e35d8713717f5f19f", + "0x8f15dd732799c879ca46d2763453b359ff483ca33adb1d0e0a57262352e0476c235987dc3a8a243c74bc768f93d3014c", + "0xa61cc8263e9bc03cce985f1663b8a72928a607121005a301b28a278e9654727fd1b22bc8a949af73929c56d9d3d4a273", + "0x98d6dc78502d19eb9f921225475a6ebcc7b44f01a2df6f55ccf6908d65b27af1891be2a37735f0315b6e0f1576c1f8d8", + "0x8bd258b883f3b3793ec5be9472ad1ff3dc4b51bc5a58e9f944acfb927349ead8231a523cc2175c1f98e7e1e2b9f363b8", + "0xaeacc2ecb6e807ad09bedd99654b097a6f39840e932873ace02eabd64ccfbb475abdcb62939a698abf17572d2034c51e", + "0xb8ccf78c08ccd8df59fd6eda2e01de328bc6d8a65824d6f1fc0537654e9bc6bf6f89c422dd3a295cce628749da85c864", + "0x8f91fd8cb253ba2e71cc6f13da5e05f62c2c3b485c24f5d68397d04665673167fce1fc1aec6085c69e87e66ec555d3fd", + "0xa254baa10cb26d04136886073bb4c159af8a8532e3fd36b1e9c3a2e41b5b2b6a86c4ebc14dbe624ee07b7ccdaf59f9ab", + "0x94e3286fe5cd68c4c7b9a7d33ae3d714a7f265cf77cd0e9bc19fc51015b1d1c34ad7e3a5221c459e89f5a043ee84e3a9", + "0xa279da8878af8d449a9539bec4b17cea94f0242911f66fab275b5143ab040825f78c89cb32a793930609415cfa3a1078", + "0xac846ceb89c9e5d43a2991c8443079dc32298cd63e370e64149cec98cf48a6351c09c856f2632fd2f2b3d685a18bbf8b", + "0xa847b27995c8a2e2454aaeb983879fb5d3a23105c33175839f7300b7e1e8ec3efd6450e9fa3f10323609dee7b98c6fd5", + "0xa2f432d147d904d185ff4b2de8c6b82fbea278a2956bc406855b44c18041854c4f0ecccd472d1d0dff1d8aa8e281cb1d", + "0x94a48ad40326f95bd63dff4755f863a1b79e1df771a1173b17937f9baba57b39e651e7695be9f66a472f098b339364fc", + "0xa12a0ccd8f96e96e1bc6494341f7ebce959899341b3a084aa1aa87d1c0d489ac908552b7770b887bb47e7b8cbc3d8e66", + "0x81a1f1681bda923bd274bfe0fbb9181d6d164fe738e54e25e8d4849193d311e2c4253614ed673c98af2c798f19a93468", + "0xabf71106a05d501e84cc54610d349d7d5eae21a70bd0250f1bebbf412a130414d1c8dbe673ffdb80208fd72f1defa4d4", + "0x96266dc2e0df18d8136d79f5b59e489978eee0e6b04926687fe389d4293c14f36f055c550657a8e27be4118b64254901", + "0x8df5dcbefbfb4810ae3a413ca6b4bf08619ca53cd50eb1dde2a1c035efffc7b7ac7dff18d403253fd80104bd83dc029e", + "0x9610b87ff02e391a43324a7122736876d5b3af2a137d749c52f75d07b17f19900b151b7f439d564f4529e77aa057ad12", + "0xa90a5572198b40fe2fcf47c422274ff36c9624df7db7a89c0eb47eb48a73a03c985f4ac5016161c76ca317f64339bce1", + "0x98e5e61a6ab6462ba692124dba7794b6c6bde4249ab4fcc98c9edd631592d5bc2fb5e38466691a0970a38e48d87c2e43", + "0x918cefb8f292f78d4db81462c633daf73b395e772f47b3a7d2cea598025b1d8c3ec0cbff46cdb23597e74929981cde40", + "0xa98918a5dc7cf610fe55f725e4fd24ce581d594cb957bb9b4e888672e9c0137003e1041f83e3f1d7b9caab06462c87d4", + "0xb92b74ac015262ca66c33f2d950221e19d940ba3bf4cf17845f961dc1729ae227aa9e1f2017829f2135b489064565c29", + "0xa053ee339f359665feb178b4e7ee30a85df37debd17cacc5a27d6b3369d170b0114e67ad1712ed26d828f1df641bcd99", + "0x8c3c8bad510b35da5ce5bd84b35c958797fbea024ad1c97091d2ff71d9b962e9222f65a9b776e5b3cc29c36e1063d2ee", + "0xaf99dc7330fe7c37e850283eb47cc3257888e7c197cb0d102edf94439e1e02267b6a56306d246c326c4c79f9dc8c6986", + "0xafecb2dc34d57a725efbd7eb93d61eb29dbe8409b668ab9ea040791f5b796d9be6d4fc10d7f627bf693452f330cf0435", + "0x93334fedf19a3727a81a6b6f2459db859186227b96fe7a391263f69f1a0884e4235de64d29edebc7b99c44d19e7c7d7a", + "0x89579c51ac405ad7e9df13c904061670ce4b38372492764170e4d3d667ed52e5d15c7cd5c5991bbfa3a5e4e3fa16363e", + "0x9778f3e8639030f7ef1c344014f124e375acb8045bd13d8e97a92c5265c52de9d1ffebaa5bc3e1ad2719da0083222991", + "0x88f77f34ee92b3d36791bdf3326532524a67d544297dcf1a47ff00b47c1b8219ff11e34034eab7d23b507caa2fd3c6b9", + "0xa699c1e654e7c484431d81d90657892efeb4adcf72c43618e71ca7bd7c7a7ebbb1db7e06e75b75dc4c74efd306b5df3f", + "0x81d13153baebb2ef672b5bdb069d3cd669ce0be96b742c94e04038f689ff92a61376341366b286eee6bf3ae85156f694", + "0x81efb17de94400fdacc1deec2550cbe3eecb27c7af99d8207e2f9be397e26be24a40446d2a09536bb5172c28959318d9", + "0x989b21ebe9ceab02488992673dc071d4d5edec24bff0e17a4306c8cb4b3c83df53a2063d1827edd8ed16d6e837f0d222", + "0x8d6005d6536825661b13c5fdce177cb37c04e8b109b7eb2b6d82ea1cb70efecf6a0022b64f84d753d165edc2bba784a3", + "0xa32607360a71d5e34af2271211652d73d7756d393161f4cf0da000c2d66a84c6826e09e759bd787d4fd0305e2439d342", + "0xaaad8d6f6e260db45d51b2da723be6fa832e76f5fbcb77a9a31e7f090dd38446d3b631b96230d78208cae408c288ac4e", + "0xabcfe425255fd3c5cffd3a818af7650190c957b6b07b632443f9e33e970a8a4c3bf79ac9b71f4d45f238a04d1c049857", + "0xaeabf026d4c783adc4414b5923dbd0be4b039cc7201219f7260d321f55e9a5b166d7b5875af6129c034d0108fdc5d666", + "0xaf49e740c752d7b6f17048014851f437ffd17413c59797e5078eaaa36f73f0017c3e7da020310cfe7d3c85f94a99f203", + "0x8854ca600d842566e3090040cd66bb0b3c46dae6962a13946f0024c4a8aca447e2ccf6f240045f1ceee799a88cb9210c", + "0xb6c03b93b1ab1b88ded8edfa1b487a1ed8bdce8535244dddb558ffb78f89b1c74058f80f4db2320ad060d0c2a9c351cc", + "0xb5bd7d17372faff4898a7517009b61a7c8f6f0e7ed4192c555db264618e3f6e57fb30a472d169fea01bf2bf0362a19a8", + "0x96eb1d38319dc74afe7e7eb076fcd230d19983f645abd14a71e6103545c01301b31c47ae931e025f3ecc01fb3d2f31fa", + "0xb55a8d30d4403067def9b65e16f867299f8f64c9b391d0846d4780bc196569622e7e5b64ce799b5aefac8f965b2a7a7b", + "0x8356d199a991e5cbbff608752b6291731b6b6771aed292f8948b1f41c6543e4ab1bedc82dd26d10206c907c03508df06", + "0x97f4137445c2d98b0d1d478049de952610ad698c91c9d0f0e7227d2aae690e9935e914ec4a2ea1fbf3fc1dddfeeacebb", + "0xaf5621707e0938320b15ddfc87584ab325fbdfd85c30efea36f8f9bd0707d7ec12c344eff3ec21761189518d192df035", + "0x8ac7817e71ea0825b292687928e349da7140285d035e1e1abff0c3704fa8453faaae343a441b7143a74ec56539687cc4", + "0x8a5e0a9e4758449489df10f3386029ada828d1762e4fb0a8ffe6b79e5b6d5d713cb64ed95960e126398b0cdb89002bc9", + "0x81324be4a71208bbb9bca74b77177f8f1abb9d3d5d9db195d1854651f2cf333cd618d35400da0f060f3e1b025124e4b2", + "0x849971d9d095ae067525b3cbc4a7dfae81f739537ade6d6cec1b42fb692d923176197a8770907c58069754b8882822d6", + "0x89f830825416802477cc81fdf11084885865ee6607aa15aa4eb28e351c569c49b8a1b9b5e95ddc04fa0ebafe20071313", + "0x9240aeeaff37a91af55f860b9badd466e8243af9e8c96a7aa8cf348cd270685ab6301bc135b246dca9eda696f8b0e350", + "0xacf74db78cc33138273127599eba35b0fb4e7b9a69fe02dae18fc6692d748ca332bd00b22afa8e654ed587aab11833f3", + "0xb091e6d37b157b50d76bd297ad752220cd5c9390fac16dc838f8557aed6d9833fc920b61519df21265406216315e883f", + "0xa6446c429ebf1c7793c622250e23594c836b2fbcaf6c5b3d0995e1595a37f50ea643f3e549b0be8bbdadd69044d72ab9", + "0x93e675353bd60e996bf1c914d5267eeaa8a52fc3077987ccc796710ef9becc6b7a00e3d82671a6bdfb8145ee3c80245a", + "0xa2f731e43251d04ed3364aa2f072d05355f299626f2d71a8a38b6f76cf08c544133f7d72dd0ab4162814b674b9fc7fa6", + "0x97a8b791a5a8f6e1d0de192d78615d73d0c38f1e557e4e15d15adc663d649e655bc8da3bcc499ef70112eafe7fb45c7a", + "0x98cd624cbbd6c53a94469be4643c13130916b91143425bcb7d7028adbbfede38eff7a21092af43b12d4fab703c116359", + "0x995783ce38fd5f6f9433027f122d4cf1e1ff3caf2d196ce591877f4a544ce9113ead60de2de1827eaff4dd31a20d79a8", + "0x8cf251d6f5229183b7f3fe2f607a90b4e4b6f020fb4ba2459d28eb8872426e7be8761a93d5413640a661d73e34a5b81f", + "0xb9232d99620652a3aa7880cad0876f153ff881c4ed4c0c2e7b4ea81d5d42b70daf1a56b869d752c3743c6d4c947e6641", + "0x849716f938f9d37250cccb1bf77f5f9fde53096cdfc6f2a25536a6187029a8f1331cdbed08909184b201f8d9f04b792f", + "0x80c7c4de098cbf9c6d17b14eba1805e433b5bc905f6096f8f63d34b94734f2e4ebf4bce8a177efd1186842a61204a062", + "0xb790f410cf06b9b8daadceeb4fd5ff40a2deda820c8df2537e0a7554613ae3948e149504e3e79aa84889df50c8678eeb", + "0x813aab8bd000299cd37485b73cd7cba06e205f8efb87f1efc0bae8b70f6db2bc7702eb39510ad734854fb65515fe9d0f", + "0x94f0ab7388ac71cdb67f6b85dfd5945748afb2e5abb622f0b5ad104be1d4d0062b651f134ba22385c9e32c2dfdcccce1", + "0xab6223dca8bd6a4f969e21ccd9f8106fc5251d321f9e90cc42cea2424b3a9c4e5060a47eeef6b23c7976109b548498e8", + "0x859c56b71343fce4d5c5b87814c47bf55d581c50fd1871a17e77b5e1742f5af639d0e94d19d909ec7dfe27919e954e0c", + "0xaae0d632b6191b8ad71b027791735f1578e1b89890b6c22e37de0e4a6074886126988fe8319ae228ac9ef3b3bcccb730", + "0x8ca9f32a27a024c3d595ecfaf96b0461de57befa3b331ab71dc110ec3be5824fed783d9516597537683e77a11d334338", + "0xa061df379fb3f4b24816c9f6cd8a94ecb89b4c6dc6cd81e4b8096fa9784b7f97ab3540259d1de9c02eb91d9945af4823", + "0x998603102ac63001d63eb7347a4bb2bf4cf33b28079bb48a169076a65c20d511ccd3ef696d159e54cc8e772fb5d65d50", + "0x94444d96d39450872ac69e44088c252c71f46be8333a608a475147752dbb99db0e36acfc5198f158509401959c12b709", + "0xac1b51b6c09fe055c1d7c9176eea9adc33f710818c83a1fbfa073c8dc3a7eb3513cbdd3f5960b7845e31e3e83181e6ba", + "0x803d530523fc9e1e0f11040d2412d02baef3f07eeb9b177fa9bfa396af42eea898a4276d56e1db998dc96ae47b644cb2", + "0x85a3c9fc7638f5bf2c3e15ba8c2fa1ae87eb1ceb44c6598c67a2948667a9dfa41e61f66d535b4e7fda62f013a5a8b885", + "0xa961cf5654c46a1a22c29baf7a4e77837a26b7f138f410e9d1883480ed5fa42411d522aba32040b577046c11f007388e", + "0xad1154142344f494e3061ef45a34fab1aaacf5fdf7d1b26adbb5fbc3d795655fa743444e39d9a4119b4a4f82a6f30441", + "0xb1d6c30771130c77806e7ab893b73d4deb590b2ff8f2f8b5e54c2040c1f3e060e2bd99afc668cf706a2df666a508bbf6", + "0xa00361fd440f9decabd98d96c575cd251dc94c60611025095d1201ef2dedde51cb4de7c2ece47732e5ed9b3526c2012c", + "0xa85c5ab4d17d328bda5e6d839a9a6adcc92ff844ec25f84981e4f44a0e8419247c081530f8d9aa629c7eb4ca21affba6", + "0xa4ddd3eab4527a2672cf9463db38bc29f61460e2a162f426b7852b7a7645fbd62084fd39a8e4d60e1958cce436dd8f57", + "0x811648140080fe55b8618f4cf17f3c5a250adb0cd53d885f2ddba835d2b4433188e41fc0661faac88e4ff910b16278c0", + "0xb85c7f1cfb0ed29addccf7546023a79249e8f15ac2d14a20accbfef4dd9dc11355d599815fa09d2b6b4e966e6ea8cff1", + "0xa10b5d8c260b159043b020d5dd62b3467df2671afea6d480ca9087b7e60ed170c82b121819d088315902842d66c8fb45", + "0x917e191df1bcf3f5715419c1e2191da6b8680543b1ba41fe84ed07ef570376e072c081beb67b375fca3565a2565bcabb", + "0x881fd967407390bfd7badc9ab494e8a287559a01eb07861f527207c127eadea626e9bcc5aa9cca2c5112fbac3b3f0e9c", + "0x959fd71149af82cc733619e0e5bf71760ca2650448c82984b3db74030d0e10f8ab1ce1609a6de6f470fe8b5bd90df5b3", + "0xa3370898a1c5f33d15adb4238df9a6c945f18b9ada4ce2624fc32a844f9ece4c916a64e9442225b6592afa06d2e015f2", + "0x817efb8a791435e4236f7d7b278181a5fa34587578c629dbc14fbf9a5c26772290611395eecd20222a4c58649fc256d8", + "0xa04c9876acf2cfdc8ef96de4879742709270fa1d03fe4c8511fbef2d59eb0aaf0336fa2c7dfe41a651157377fa217813", + "0x81e15875d7ea7f123e418edf14099f2e109d4f3a6ce0eb65f67fe9fb10d2f809a864a29f60ad3fc949f89e2596b21783", + "0xb49f529975c09e436e6bc202fdc16e3fdcbe056db45178016ad6fdece9faad4446343e83aed096209690b21a6910724f", + "0x879e8eda589e1a279f7f49f6dd0580788c040d973748ec4942dbe51ea8fbd05983cc919b78f0c6b92ef3292ae29db875", + "0x81a2b74b2118923f34139a102f3d95e7eee11c4c2929c2576dee200a5abfd364606158535a6c9e4178a6a83dbb65f3c4", + "0x8913f281d8927f2b45fc815d0f7104631cb7f5f7278a316f1327d670d15868daadd2a64e3eb98e1f53fe7e300338cc80", + "0xa6f815fba7ef9af7fbf45f93bc952e8b351f5de6568a27c7c47a00cb39a254c6b31753794f67940fc7d2e9cc581529f4", + "0xb3722a15c66a0014ce4d082de118def8d39190c15678a472b846225585f3a83756ae1b255b2e3f86a26168878e4773b2", + "0x817ae61ab3d0dd5b6e24846b5a5364b1a7dc2e77432d9fed587727520ae2f307264ea0948c91ad29f0aea3a11ff38624", + "0xb3db467464415fcad36dc1de2d6ba7686772a577cc2619242ac040d6734881a45d3b40ed4588db124e4289cfeec4bbf6", + "0xad66a14f5a54ac69603b16e5f1529851183da77d3cc60867f10aea41339dd5e06a5257982e9e90a352cdd32750f42ee4", + "0xadafa3681ef45d685555601a25a55cf23358319a17f61e2179e704f63df83a73bdd298d12cf6cef86db89bd17119e11d", + "0xa379dc44cb6dd3b9d378c07b2ec654fec7ca2f272de6ba895e3d00d20c9e4c5550498a843c8ac67e4221db2115bedc1c", + "0xb7bf81c267a78efc6b9e5a904574445a6487678d7ef70054e3e93ea6a23f966c2b68787f9164918e3b16d2175459ed92", + "0xb41d66a13a4afafd5760062b77f79de7e6ab8ccacde9c6c5116a6d886912fb491dc027af435b1b44aacc6af7b3c887f2", + "0x9904d23a7c1c1d2e4bab85d69f283eb0a8e26d46e8b7b30224438015c936729b2f0af7c7c54c03509bb0500acb42d8a4", + "0xae30d65e9e20c3bfd603994ae2b175ff691d51f3e24b2d058b3b8556d12ca4c75087809062dddd4aaac81c94d15d8a17", + "0x9245162fab42ac01527424f6013310c3eb462982518debef6c127f46ba8a06c705d7dc9f0a41e796ba8d35d60ae6cc64", + "0x87fab853638d7a29a20f3ba2b1a7919d023e9415bfa78ebb27973d8cbc7626f584dc5665d2e7ad71f1d760eba9700d88", + "0x85aac46ecd330608e5272430970e6081ff02a571e8ea444f1e11785ea798769634a22a142d0237f67b75369d3c484a8a", + "0x938c85ab14894cc5dfce3d80456f189a2e98eddbc8828f4ff6b1df1dcb7b42b17ca2ff40226a8a1390a95d63dca698dd", + "0xa18ce1f846e3e3c4d846822f60271eecf0f5d7d9f986385ac53c5ace9589dc7c0188910448c19b91341a1ef556652fa9", + "0x8611608a9d844f0e9d7584ad6ccf62a5087a64f764caf108db648a776b5390feb51e5120f0ef0e9e11301af3987dd7dc", + "0x8106333ba4b4de8d1ae43bc9735d3fea047392e88efd6a2fa6f7b924a18a7a265ca6123c3edc0f36307dd7fb7fe89257", + "0xa91426fa500951ff1b051a248c050b7139ca30dde8768690432d597d2b3c4357b11a577be6b455a1c5d145264dcf81fc", + "0xb7f9f90e0e450f37b081297f7f651bad0496a8b9afd2a4cf4120a2671aaaa8536dce1af301258bfbfdb122afa44c5048", + "0x84126da6435699b0c09fa4032dec73d1fca21d2d19f5214e8b0bea43267e9a8dd1fc44f8132d8315e734c8e2e04d7291", + "0xaff064708103884cb4f1a3c1718b3fc40a238d35cf0a7dc24bdf9823693b407c70da50df585bf5bc4e9c07d1c2d203e8", + "0xa8b40fc6533752983a5329c31d376c7a5c13ce6879cc7faee648200075d9cd273537001fb4c86e8576350eaac6ba60c2", + "0xa02db682bdc117a84dcb9312eb28fcbde12d49f4ce915cc92c610bb6965ec3cc38290f8c5b5ec70afe153956692cda95", + "0x86decd22b25d300508472c9ce75d3e465b737e7ce13bc0fcce32835e54646fe12322ba5bc457be18bfd926a1a6ca4a38", + "0xa18666ef65b8c2904fd598791f5627207165315a85ee01d5fb0e6b2e10bdd9b00babc447da5bd63445e3337de33b9b89", + "0x89bb0c06effadefdaf34ffe4b123e1678a90d4451ee856c863df1e752eef41fd984689ded8f0f878bf8916d5dd8e8024", + "0x97cfcba08ebec05d0073992a66b1d7d6fb9d95871f2cdc36db301f78bf8069294d1c259efef5c93d20dc937eedae3a1a", + "0xac2643b14ece79dcb2e289c96776a47e2bebd40dd6dc74fd035df5bb727b5596f40e3dd2d2202141e69b0993717ede09", + "0xa5e6fd88a2f9174d9bd4c6a55d9c30974be414992f22aa852f552c7648f722ed8077acf5aba030abd47939bb451b2c60", + "0x8ad40a612824a7994487731a40b311b7349038c841145865539c6ada75c56de6ac547a1c23df190e0caaafecddd80ccc", + "0x953a7cea1d857e09202c438c6108060961f195f88c32f0e012236d7a4b39d840c61b162ec86436e8c38567328bea0246", + "0x80d8b47a46dae1868a7b8ccfe7029445bbe1009dad4a6c31f9ef081be32e8e1ac1178c3c8fb68d3e536c84990cc035b1", + "0x81ecd99f22b3766ce0aca08a0a9191793f68c754fdec78b82a4c3bdc2db122bbb9ebfd02fc2dcc6e1567a7d42d0cc16a", + "0xb1dd0446bccc25846fb95d08c1c9cc52fb51c72c4c5d169ffde56ecfe800f108dc1106d65d5c5bd1087c656de3940b63", + "0xb87547f0931e164e96de5c550ca5aa81273648fe34f6e193cd9d69cf729cb432e17aa02e25b1c27a8a0d20a3b795e94e", + "0x820a94e69a927e077082aae66f6b292cfbe4589d932edf9e68e268c9bd3d71ef76cf7d169dd445b93967c25db11f58f1", + "0xb0d07ddf2595270c39adfa0c8cf2ab1322979b0546aa4d918f641be53cd97f36c879bb75d205e457c011aca3bbd9f731", + "0x8700b876b35b4b10a8a9372c5230acecd39539c1bb87515640293ad4464a9e02929d7d6a6a11112e8a29564815ac0de4", + "0xa61a601c5bb27dcb97e37c8e2b9ce479c6b192a5e04d9ed5e065833c5a1017ee5f237b77d1a17be5d48f8e7cc0bcacf6", + "0x92fb88fe774c1ba1d4a08cae3c0e05467ad610e7a3f1d2423fd47751759235fe0a3036db4095bd6404716aa03820f484", + "0xb274f140d77a3ce0796f5e09094b516537ccaf27ae1907099bff172e6368ba85e7c3ef8ea2a07457cac48ae334da95b3", + "0xb2292d9181f16581a9a9142490b2bdcdfb218ca6315d1effc8592100d792eb89d5356996c890441f04f2b4a95763503e", + "0x8897e73f576d86bc354baa3bd96e553107c48cf5889dcc23c5ba68ab8bcd4e81f27767be2233fdfa13d39f885087e668", + "0xa29eac6f0829791c728d71abc49569df95a4446ecbfc534b39f24f56c88fe70301838dfc1c19751e7f3c5c1b8c6af6a0", + "0x9346dc3720adc5df500a8df27fd9c75ef38dc5c8f4e8ed66983304750e66d502c3c59b8e955be781b670a0afc70a2167", + "0x9566d534e0e30a5c5f1428665590617e95fd05d45f573715f58157854ad596ece3a3cfec61356aee342308d623e029d5", + "0xa464fb8bffe6bd65f71938c1715c6e296cc6d0311a83858e4e7eb5873b7f2cf0c584d2101e3407b85b64ca78b2ac93ce", + "0xb54088f7217987c87e9498a747569ac5b2f8afd5348f9c45bf3fd9fbf713a20f495f49c8572d087efe778ac7313ad6d3", + "0x91fa9f5f8000fe050f5b224d90b59fcce13c77e903cbf98ded752e5b3db16adb2bc1f8c94be48b69f65f1f1ad81d6264", + "0x92d04a5b0ac5d8c8e313709b432c9434ecd3e73231f01e9b4e7952b87df60cbfa97b5dedd2200bd033b4b9ea8ba45cc1", + "0xa94b90ad3c3d6c4bbe169f8661a790c40645b40f0a9d1c7220f01cf7fc176e04d80bab0ced9323fcafb93643f12b2760", + "0x94d86149b9c8443b46196f7e5a3738206dd6f3be7762df488bcbb9f9ee285a64c997ed875b7b16b26604fa59020a8199", + "0x82efe4ae2c50a2d7645240c173a047f238536598c04a2c0b69c96e96bd18e075a99110f1206bc213f39edca42ba00cc1", + "0xab8667685f831bc14d4610f84a5da27b4ea5b133b4d991741a9e64dceb22cb64a3ce8f1b6e101d52af6296df7127c9ad", + "0x83ba433661c05dcc5d562f4a9a261c8110dac44b8d833ae1514b1fc60d8b4ee395b18804baea04cb10adb428faf713c3", + "0xb5748f6f660cc5277f1211d2b8649493ed8a11085b871cd33a5aea630abd960a740f08c08be5f9c21574600ac9bf5737", + "0xa5c8dd12af48fb710642ad65ebb97ca489e8206741807f7acfc334f8035d3c80593b1ff2090c9bb7bd138f0c48714ca8", + "0xa2b382fd5744e3babf454b1d806cc8783efeb4761bc42b6914ea48a46a2eae835efbe0a18262b6bc034379e03cf1262b", + "0xb3145ffaf603f69f15a64936d32e3219eea5ed49fdfd2f5bf40ea0dfd974b36fb6ff12164d4c2282d892db4cf3ff3ce1", + "0x87a316fb213f4c5e30c5e3face049db66be4f28821bd96034714ec23d3e97849d7b301930f90a4323c7ccf53de23050c", + "0xb9de09a919455070fed6220fc179c8b7a4c753062bcd27acf28f5b9947a659c0b364298daf7c85c4ca6fca7f945add1f", + "0x806fbd98d411b76979464c40ad88bc07a151628a27fcc1012ba1dfbaf5b5cc9d962fb9b3386008978a12515edce934bc", + "0xa15268877fae0d21610ae6a31061ed7c20814723385955fac09fdc9693a94c33dea11db98bb89fdfe68f933490f5c381", + "0x8d633fb0c4da86b2e0b37d8fad5972d62bff2ac663c5ec815d095cd4b7e1fe66ebef2a2590995b57eaf941983c7ad7a4", + "0x8139e5dd9cf405e8ef65f11164f0440827d98389ce1b418b0c9628be983a9ddd6cf4863036ccb1483b40b8a527acd9ed", + "0x88b15fa94a08eac291d2b94a2b30eb851ff24addf2cc30b678e72e32cfcb3424cf4b33aa395d741803f3e578ddf524de", + "0xb5eaf0c8506e101f1646bcf049ee38d99ea1c60169730da893fd6020fd00a289eb2f415947e44677af49e43454a7b1be", + "0x8489822ad0647a7e06aa2aa5595960811858ddd4542acca419dd2308a8c5477648f4dd969a6740bb78aa26db9bfcc555", + "0xb1e9a7b9f3423c220330d45f69e45fa03d7671897cf077f913c252e3e99c7b1b1cf6d30caad65e4228d5d7b80eb86e5e", + "0xb28fe9629592b9e6a55a1406903be76250b1c50c65296c10c5e48c64b539fb08fe11f68cf462a6edcbba71b0cee3feb2", + "0xa41acf96a02c96cd8744ff6577c244fc923810d17ade133587e4c223beb7b4d99fa56eae311a500d7151979267d0895c", + "0x880798938fe4ba70721be90e666dfb62fcab4f3556fdb7b0dc8ec5bc34f6b4513df965eae78527136eb391889fe2caf9", + "0x98d4d89d358e0fb7e212498c73447d94a83c1b66e98fc81427ab13acddb17a20f52308983f3a5a8e0aaacec432359604", + "0x81430b6d2998fc78ba937a1639c6020199c52da499f68109da227882dc26d005b73d54c5bdcac1a04e8356a8ca0f7017", + "0xa8d906a4786455eb74613aba4ce1c963c60095ffb8658d368df9266fdd01e30269ce10bf984e7465f34b4fd83beba26a", + "0xaf54167ac1f954d10131d44a8e0045df00d581dd9e93596a28d157543fbe5fb25d213806ed7fb3cba6b8f5b5423562db", + "0x8511e373a978a12d81266b9afbd55035d7bc736835cfa921903a92969eeba3624437d1346b55382e61415726ab84a448", + "0x8cf43eea93508ae586fa9a0f1354a1e16af659782479c2040874a46317f9e8d572a23238efa318fdfb87cc63932602b7", + "0xb0bdd3bacff077173d302e3a9678d1d37936188c7ecc34950185af6b462b7c679815176f3cce5db19aac8b282f2d60ad", + "0xa355e9b87f2f2672052f5d4d65b8c1c827d24d89b0d8594641fccfb69aef1b94009105f3242058bb31c8bf51caae5a41", + "0xb8baa9e4b950b72ff6b88a6509e8ed1304bc6fd955748b2e59a523a1e0c5e99f52aec3da7fa9ff407a7adf259652466c", + "0x840bc3dbb300ea6f27d1d6dd861f15680bd098be5174f45d6b75b094d0635aced539fa03ddbccb453879de77fb5d1fe9", + "0xb4bc7e7e30686303856472bae07e581a0c0bfc815657c479f9f5931cff208d5c12930d2fd1ff413ebd8424bcd7a9b571", + "0x89b5d514155d7999408334a50822508b9d689add55d44a240ff2bdde2eee419d117031f85e924e2a2c1ca77db9b91eea", + "0xa8604b6196f87a04e1350302e8aa745bba8dc162115d22657b37a1d1a98cb14876ddf7f65840b5dbd77e80cd22b4256c", + "0x83cb7acdb9e03247515bb2ce0227486ccf803426717a14510f0d59d45e998b245797d356f10abca94f7a14e1a2f0d552", + "0xaeb3266a9f16649210ab2df0e1908ac259f34ce1f01162c22b56cf1019096ee4ea5854c36e30bb2feb06c21a71e8a45c", + "0x89e72e86edf2aa032a0fc9acf4d876a40865fbb2c8f87cb7e4d88856295c4ac14583e874142fd0c314a49aba68c0aa3c", + "0x8c3576eba0583c2a7884976b4ed11fe1fda4f6c32f6385d96c47b0e776afa287503b397fa516a455b4b8c3afeedc76db", + "0xa31e5b633bda9ffa174654fee98b5d5930a691c3c42fcf55673d927dbc8d91c58c4e42e615353145431baa646e8bbb30", + "0x89f2f3f7a8da1544f24682f41c68114a8f78c86bd36b066e27da13acb70f18d9f548773a16bd8e24789420e17183f137", + "0xada27fa4e90a086240c9164544d2528621a415a5497badb79f8019dc3dce4d12eb6b599597e47ec6ac39c81efda43520", + "0x90dc1eb21bf21c0187f359566fc4bf5386abea52799306a0e5a1151c0817c5f5bc60c86e76b1929c092c0f3ff48cedd2", + "0xb702a53ebcc17ae35d2e735a347d2c700e9cbef8eadbece33cac83df483b2054c126593e1f462cfc00a3ce9d737e2af5", + "0x9891b06455ec925a6f8eafffba05af6a38cc5e193acaaf74ffbf199df912c5197106c5e06d72942bbb032ce277b6417f", + "0x8c0ee71eb01197b019275bcf96cae94e81d2cdc3115dbf2d8e3080074260318bc9303597e8f72b18f965ad601d31ec43", + "0x8aaf580aaf75c1b7a5f99ccf60503506e62058ef43b28b02f79b8536a96be3f019c9f71caf327b4e6730134730d1bef5", + "0xae6f9fc21dd7dfa672b25a87eb0a41644f7609fab5026d5cedb6e43a06dbbfd6d6e30322a2598c8dedde88c52eaed626", + "0x8159b953ffece5693edadb2e906ebf76ff080ee1ad22698950d2d3bfc36ac5ea78f58284b2ca180664452d55bd54716c", + "0xab7647c32ca5e9856ac283a2f86768d68de75ceeba9e58b74c5324f8298319e52183739aba4340be901699d66ac9eb3f", + "0xa4d85a5701d89bcfaf1572db83258d86a1a0717603d6f24ac2963ffcf80f1265e5ab376a4529ca504f4396498791253c", + "0x816080c0cdbfe61b4d726c305747a9eb58ac26d9a35f501dd32ba43c098082d20faf3ccd41aad24600aa73bfa453dfac", + "0x84f3afac024f576b0fd9acc6f2349c2fcefc3f77dbe5a2d4964d14b861b88e9b1810334b908cf3427d9b67a8aee74b18", + "0x94b390655557b1a09110018e9b5a14490681ade275bdc83510b6465a1218465260d9a7e2a6e4ec700f58c31dc3659962", + "0xa8c66826b1c04a2dd4c682543242e7a57acae37278bd09888a3d17747c5b5fec43548101e6f46d703638337e2fd3277b", + "0x86e6f4608a00007fa533c36a5b054c5768ccafe41ad52521d772dcae4c8a4bcaff8f7609be30d8fab62c5988cbbb6830", + "0x837da4cf09ae8aa0bceb16f8b3bfcc3b3367aecac9eed6b4b56d7b65f55981ef066490764fb4c108792623ecf8cad383", + "0x941ff3011462f9b5bf97d8cbdb0b6f5d37a1b1295b622f5485b7d69f2cb2bcabc83630dae427f0259d0d9539a77d8424", + "0xb99e5d6d82aa9cf7d5970e7f710f4039ac32c2077530e4c2779250c6b9b373bc380adb0a03b892b652f649720672fc8c", + "0xa791c78464b2d65a15440b699e1e30ebd08501d6f2720adbc8255d989a82fcded2f79819b5f8f201bed84a255211b141", + "0x84af7ad4a0e31fcbb3276ab1ad6171429cf39adcf78dc03750dc5deaa46536d15591e26d53e953dfb31e1622bc0743ab", + "0xa833e62fe97e1086fae1d4917fbaf09c345feb6bf1975b5cb863d8b66e8d621c7989ab3dbecda36bc9eaffc5eaa6fa66", + "0xb4ef79a46a2126f53e2ebe62770feb57fd94600be29459d70a77c5e9cc260fa892be06cd60f886bf48459e48eb50d063", + "0xb43b8f61919ea380bf151c294e54d3a3ff98e20d1ee5efbfe38aa2b66fafbc6a49739793bd5cb1c809f8b30466277c3a", + "0xab37735af2412d2550e62df9d8b3b5e6f467f20de3890bf56faf1abf2bf3bd1d98dc3fa0ad5e7ab3fce0fa20409eb392", + "0x82416b74b1551d484250d85bb151fabb67e29cce93d516125533df585bc80779ab057ea6992801a3d7d5c6dcff87a018", + "0x8145d0787f0e3b5325190ae10c1d6bee713e6765fb6a0e9214132c6f78f4582bb2771aaeae40d3dad4bafb56bf7e36d8", + "0xb6935886349ecbdd5774e12196f4275c97ec8279fdf28ccf940f6a022ebb6de8e97d6d2173c3fe402cbe9643bed3883b", + "0x87ef9b4d3dc71ac86369f8ed17e0dd3b91d16d14ae694bc21a35b5ae37211b043d0e36d8ff07dcc513fb9e6481a1f37f", + "0xae1d0ded32f7e6f1dc8fef495879c1d9e01826f449f903c1e5034aeeabc5479a9e323b162b688317d46d35a42d570d86", + "0xa40d16497004db4104c6794e2f4428d75bdf70352685944f3fbe17526df333e46a4ca6de55a4a48c02ecf0bde8ba03c0", + "0x8d45121efba8cc308a498e8ee39ea6fa5cae9fb2e4aab1c2ff9d448aa8494ccbec9a078f978a86fcd97b5d5e7be7522a", + "0xa8173865c64634ba4ac2fa432740f5c05056a9deaf6427cb9b4b8da94ca5ddbc8c0c5d3185a89b8b28878194de9cdfcd", + "0xb6ec06a74d690f6545f0f0efba236e63d1fdfba54639ca2617408e185177ece28901c457d02b849fd00f1a53ae319d0a", + "0xb69a12df293c014a40070e3e760169b6f3c627caf9e50b35a93f11ecf8df98b2bc481b410eecb7ab210bf213bbe944de", + "0x97e7dc121795a533d4224803e591eef3e9008bab16f12472210b73aaf77890cf6e3877e0139403a0d3003c12c8f45636", + "0xacdfa6fdd4a5acb7738cc8768f7cba84dbb95c639399b291ae8e4e63df37d2d4096900a84d2f0606bf534a9ccaa4993f", + "0x86ee253f3a9446a33e4d1169719b7d513c6b50730988415382faaf751988c10a421020609f7bcdef91be136704b906e2", + "0xaac9438382a856caf84c5a8a234282f71b5fc5f65219103b147e7e6cf565522285fbfd7417b513bdad8277a00f652ca1", + "0x83f3799d8e5772527930f5dc071a2e0a65471618993ec8990a96ccdeee65270e490bda9d26bb877612475268711ffd80", + "0x93f28a81ac8c0ec9450b9d762fae9c7f8feaace87a6ee6bd141ef1d2d0697ef1bbd159fe6e1de640dbdab2b0361fca8a", + "0xa0825c95ba69999b90eac3a31a3fd830ea4f4b2b7409bde5f202b61d741d6326852ce790f41de5cb0eccec7af4db30c1", + "0x83924b0e66233edd603c3b813d698daa05751fc34367120e3cf384ea7432e256ccee4d4daf13858950549d75a377107d", + "0x956fd9fa58345277e06ba2ec72f49ed230b8d3d4ff658555c52d6cddeb84dd4e36f1a614f5242d5ca0192e8daf0543c2", + "0x944869912476baae0b114cced4ff65c0e4c90136f73ece5656460626599051b78802df67d7201c55d52725a97f5f29fe", + "0x865cb25b64b4531fb6fe4814d7c8cd26b017a6c6b72232ff53defc18a80fe3b39511b23f9e4c6c7249d06e03b2282ed2", + "0x81e09ff55214960775e1e7f2758b9a6c4e4cd39edf7ec1adfaad51c52141182b79fe2176b23ddc7df9fd153e5f82d668", + "0xb31006896f02bc90641121083f43c3172b1039334501fbaf1672f7bf5d174ddd185f945adf1a9c6cf77be34c5501483d", + "0x88b92f6f42ae45e9f05b16e52852826e933efd0c68b0f2418ac90957fd018df661bc47c8d43c2a7d7bfcf669dab98c3c", + "0x92fc68f595853ee8683930751789b799f397135d002eda244fe63ecef2754e15849edde3ba2f0cc8b865c9777230b712", + "0x99ca06a49c5cd0bb097c447793fcdd809869b216a34c66c78c7e41e8c22f05d09168d46b8b1f3390db9452d91bc96dea", + "0xb48b9490a5d65296802431852d548d81047bbefc74fa7dc1d4e2a2878faacdfcb365ae59209cb0ade01901a283cbd15d", + "0xaff0fdbef7c188b120a02bc9085d7b808e88f73973773fef54707bf2cd772cd066740b1b6f4127b5c349f657bd97e738", + "0x966fd4463b4f43dd8ccba7ad50baa42292f9f8b2e70da23bb6780e14155d9346e275ef03ddaf79e47020dcf43f3738bd", + "0x9330c3e1fadd9e08ac85f4839121ae20bbeb0a5103d84fa5aadbd1213805bdcda67bf2fb75fc301349cbc851b5559d20", + "0x993bb99867bd9041a71a55ad5d397755cfa7ab6a4618fc526179bfc10b7dc8b26e4372fe9a9b4a15d64f2b63c1052dda", + "0xa29b59bcfab51f9b3c490a3b96f0bf1934265c315349b236012adbd64a56d7f6941b2c8cc272b412044bc7731f71e1dc", + "0xa65c9cefe1fc35d089fe8580c2e7671ebefdb43014ac291528ff4deefd4883fd4df274af83711dad610dad0d615f9d65", + "0x944c78c56fb227ae632805d448ca3884cd3d2a89181cead3d2b7835e63297e6d740aa79a112edb1d4727824991636df5", + "0xa73d782da1db7e4e65d7b26717a76e16dd9fab4df65063310b8e917dc0bc24e0d6755df5546c58504d04d9e68c3b474a", + "0xaf80f0b87811ae3124f68108b4ca1937009403f87928bbc53480e7c5408d072053ace5eeaf5a5aba814dab8a45502085", + "0x88aaf1acfc6e2e19b8387c97da707cb171c69812fefdd4650468e9b2c627bd5ccfb459f4d8e56bdfd84b09ddf87e128f", + "0x92c97276ff6f72bab6e9423d02ad6dc127962dbce15a0dd1e4a393b4510c555df6aa27be0f697c0d847033a9ca8b8dfd", + "0xa0e07d43d96e2d85b6276b3c60aadb48f0aedf2de8c415756dc597249ea64d2093731d8735231dadc961e5682ac59479", + "0xadc9e6718a8f9298957d1da3842a7751c5399bbdf56f8de6c1c4bc39428f4aee6f1ba6613d37bf46b9403345e9d6fc81", + "0x951da434da4b20d949b509ceeba02e24da7ed2da964c2fcdf426ec787779c696b385822c7dbea4df3e4a35921f1e912c", + "0xa04cbce0d2b2e87bbf038c798a12ec828423ca6aca08dc8d481cf6466e3c9c73d4d4a7fa47df9a7e2e15aae9e9f67208", + "0x8f855cca2e440d248121c0469de1f94c2a71b8ee2682bbad3a78243a9e03da31d1925e6760dbc48a1957e040fae9abe8", + "0xb642e5b17c1df4a4e101772d73851180b3a92e9e8b26c918050f51e6dd3592f102d20b0a1e96f0e25752c292f4c903ff", + "0xa92454c300781f8ae1766dbbb50a96192da7d48ef4cbdd72dd8cbb44c6eb5913c112cc38e9144615fdc03684deb99420", + "0x8b74f7e6c2304f8e780df4649ef8221795dfe85fdbdaa477a1542d135b75c8be45bf89adbbb6f3ddf54ca40f02e733e9", + "0x85cf66292cbb30cec5fd835ab10c9fcb3aea95e093aebf123e9a83c26f322d76ebc89c4e914524f6c5f6ee7d74fc917d", + "0xae0bfe0cdc97c09542a7431820015f2d16067b30dca56288013876025e81daa8c519e5e347268e19aa1a85fa1dc28793", + "0x921322fc6a47dc091afa0ad6df18ed14cde38e48c6e71550aa513918b056044983aee402de21051235eecf4ce8040fbe", + "0x96c030381e97050a45a318d307dcb3c8377b79b4dd5daf6337cded114de26eb725c14171b9b8e1b3c08fe1f5ea6b49e0", + "0x90c23b86b6111818c8baaf53a13eaee1c89203b50e7f9a994bf0edf851919b48edbac7ceef14ac9414cf70c486174a77", + "0x8bf6c301240d2d1c8d84c71d33a6dfc6d9e8f1cfae66d4d0f7a256d98ae12b0bcebfa94a667735ee89f810bcd7170cff", + "0xa41a4ffbbea0e36874d65c009ee4c3feffff322f6fc0e30d26ee4dbc1f46040d05e25d9d0ecb378cef0d24a7c2c4b850", + "0xa8d4cdd423986bb392a0a92c12a8bd4da3437eec6ef6af34cf5310944899287452a2eb92eb5386086d5063381189d10e", + "0xa81dd26ec057c4032a4ed7ad54d926165273ed51d09a1267b2e477535cf6966835a257c209e4e92d165d74fa75695fa3", + "0x8d7f708c3ee8449515d94fc26b547303b53d8dd55f177bc3b25d3da2768accd9bc8e9f09546090ebb7f15c66e6c9c723", + "0x839ba65cffcd24cfffa7ab3b21faabe3c66d4c06324f07b2729c92f15cad34e474b0f0ddb16cd652870b26a756b731d3", + "0x87f1a3968afec354d92d77e2726b702847c6afcabb8438634f9c6f7766de4c1504317dc4fa9a4a735acdbf985e119564", + "0x91a8a7fd6542f3e0673f07f510d850864b34ac087eb7eef8845a1d14b2b1b651cbdc27fa4049bdbf3fea54221c5c8549", + "0xaef3cf5f5e3a2385ead115728d7059e622146c3457d266c612e778324b6e06fbfb8f98e076624d2f3ce1035d65389a07", + "0x819915d6232e95ccd7693fdd78d00492299b1983bc8f96a08dcb50f9c0a813ed93ae53c0238345d5bea0beda2855a913", + "0x8e9ba68ded0e94935131b392b28218315a185f63bf5e3c1a9a9dd470944509ca0ba8f6122265f8da851b5cc2abce68f1", + "0xb28468e9b04ee9d69003399a3cf4457c9bf9d59f36ab6ceeb8e964672433d06b58beeea198fedc7edbaa1948577e9fa2", + "0xa633005e2c9f2fd94c8bce2dd5bb708fe946b25f1ec561ae65e54e15cdd88dc339f1a083e01f0d39610c8fe24151aaf0", + "0x841d0031e22723f9328dd993805abd13e0c99b0f59435d2426246996b08d00ce73ab906f66c4eab423473b409e972ce0", + "0x85758d1b084263992070ec8943f33073a2d9b86a8606672550c17545507a5b3c88d87382b41916a87ee96ff55a7aa535", + "0x8581b06b0fc41466ef94a76a1d9fb8ae0edca6d018063acf6a8ca5f4b02d76021902feba58972415691b4bdbc33ae3b4", + "0x83539597ff5e327357ee62bc6bf8c0bcaec2f227c55c7c385a4806f0d37fb461f1690bad5066b8a5370950af32fafbef", + "0xaee3557290d2dc10827e4791d00e0259006911f3f3fce4179ed3c514b779160613eca70f720bff7804752715a1266ffa", + "0xb48d2f0c4e90fc307d5995464e3f611a9b0ef5fe426a289071f4168ed5cc4f8770c9332960c2ca5c8c427f40e6bb389f", + "0x847af8973b4e300bb06be69b71b96183fd1a0b9d51b91701bef6fcfde465068f1eb2b1503b07afda380f18d69de5c9e1", + "0xa70a6a80ce407f07804c0051ac21dc24d794b387be94eb24e1db94b58a78e1bcfb48cd0006db8fc1f9bedaece7a44fbe", + "0xb40e942b8fa5336910ff0098347df716bff9d1fa236a1950c16eeb966b3bc1a50b8f7b0980469d42e75ae13ced53cead", + "0xb208fabaa742d7db3148515330eb7a3577487845abdb7bd9ed169d0e081db0a5816595c33d375e56aeac5b51e60e49d3", + "0xb7c8194b30d3d6ef5ab66ec88ad7ebbc732a3b8a41731b153e6f63759a93f3f4a537eab9ad369705bd730184bdbbdc34", + "0x9280096445fe7394d04aa1bc4620c8f9296e991cc4d6c131bd703cb1cc317510e6e5855ac763f4d958c5edfe7eebeed7", + "0xabc2aa4616a521400af1a12440dc544e3c821313d0ab936c86af28468ef8bbe534837e364598396a81cf8d06274ed5a6", + "0xb18ca8a3325adb0c8c18a666d4859535397a1c3fe08f95eebfac916a7a99bbd40b3c37b919e8a8ae91da38bc00fa56c0", + "0x8a40c33109ecea2a8b3558565877082f79121a432c45ec2c5a5e0ec4d1c203a6788e6b69cb37f1fd5b8c9a661bc5476d", + "0x88c47301dd30998e903c84e0b0f2c9af2e1ce6b9f187dab03528d44f834dc991e4c86d0c474a2c63468cf4020a1e24a0", + "0x920c832853e6ab4c851eecfa9c11d3acc7da37c823be7aa1ab15e14dfd8beb5d0b91d62a30cec94763bd8e4594b66600", + "0x98e1addbe2a6b8edc7f12ecb9be81c3250aeeca54a1c6a7225772ca66549827c15f3950d01b8eb44aecb56fe0fff901a", + "0x8cfb0fa1068be0ec088402f5950c4679a2eb9218c729da67050b0d1b2d7079f3ddf4bf0f57d95fe2a8db04bc6bcdb20c", + "0xb70f381aafe336b024120453813aeab70baac85b9c4c0f86918797b6aee206e6ed93244a49950f3d8ec9f81f4ac15808", + "0xa4c8edf4aa33b709a91e1062939512419711c1757084e46f8f4b7ed64f8e682f4e78b7135920c12f0eb0422fe9f87a6a", + "0xb4817e85fd0752d7ebb662d3a51a03367a84bac74ebddfba0e5af5e636a979500f72b148052d333b3dedf9edd2b4031b", + "0xa87430169c6195f5d3e314ff2d1c2f050e766fd5d2de88f5207d72dba4a7745bb86d0baca6e9ae156582d0d89e5838c7", + "0x991b00f8b104566b63a12af4826b61ce7aa40f4e5b8fff3085e7a99815bdb4471b6214da1e480214fac83f86a0b93cc5", + "0xb39966e3076482079de0678477df98578377a094054960ee518ef99504d6851f8bcd3203e8da5e1d4f6f96776e1fe6eb", + "0xa448846d9dc2ab7a0995fa44b8527e27f6b3b74c6e03e95edb64e6baa4f1b866103f0addb97c84bef1d72487b2e21796", + "0x894bec21a453ae84b592286e696c35bc30e820e9c2fd3e63dd4fbe629e07df16439c891056070faa490155f255bf7187", + "0xa9ec652a491b11f6a692064e955f3f3287e7d2764527e58938571469a1e29b5225b9415bd602a45074dfbfe9c131d6ca", + "0xb39d37822e6cbe28244b5f42ce467c65a23765bd16eb6447c5b3e942278069793763483dafd8c4dd864f8917aad357fe", + "0x88dba51133f2019cb266641c56101e3e5987d3b77647a2e608b5ff9113dfc5f85e2b7c365118723131fbc0c9ca833c9c", + "0xb566579d904b54ecf798018efcb824dccbebfc6753a0fd2128ac3b4bd3b038c2284a7c782b5ca6f310eb7ea4d26a3f0a", + "0xa97a55c0a492e53c047e7d6f9d5f3e86fb96f3dddc68389c0561515343b66b4bc02a9c0d5722dff1e3445308240b27f7", + "0xa044028ab4bcb9e1a2b9b4ca4efbf04c5da9e4bf2fff0e8bd57aa1fc12a71e897999c25d9117413faf2f45395dee0f13", + "0xa78dc461decbeaeed8ebd0909369b491a5e764d6a5645a7dac61d3140d7dc0062526f777b0eb866bff27608429ebbdde", + "0xb2c2a8991f94c39ca35fea59f01a92cb3393e0eccb2476dfbf57261d406a68bd34a6cff33ed80209991688c183609ef4", + "0x84189eefb521aff730a4fd3fd5b10ddfd29f0d365664caef63bb015d07e689989e54c33c2141dd64427805d37a7e546e", + "0x85ac80bd734a52235da288ff042dea9a62e085928954e8eacd2c751013f61904ed110e5b3afe1ab770a7e6485efb7b5e", + "0x9183a560393dcb22d0d5063e71182020d0fbabb39e32493eeffeb808df084aa243eb397027f150b55a247d1ed0c8513e", + "0x81c940944df7ecc58d3c43c34996852c3c7915ed185d7654627f7af62abae7e0048dd444a6c09961756455000bd96d09", + "0xaa8c34e164019743fd8284b84f06c3b449aae7996e892f419ee55d82ad548cb300fd651de329da0384243954c0ef6a60", + "0x89a7b7bdfc7e300d06a14d463e573d6296d8e66197491900cc9ae49504c4809ff6e61b758579e9091c61085ba1237b83", + "0x878d21809ba540f50bd11f4c4d9590fb6f3ab9de5692606e6e2ef4ed9d18520119e385be5e1f4b3f2e2b09c319f0e8fc", + "0x8eb248390193189cf0355365e630b782cd15751e672dc478b39d75dc681234dcd9309df0d11f4610dbb249c1e6be7ef9", + "0xa1d7fb3aecb896df3a52d6bd0943838b13f1bd039c936d76d03de2044c371d48865694b6f532393b27fd10a4cf642061", + "0xa34bca58a24979be442238cbb5ece5bee51ae8c0794dd3efb3983d4db713bc6f28a96e976ac3bd9a551d3ed9ba6b3e22", + "0x817c608fc8cacdd178665320b5a7587ca21df8bdd761833c3018b967575d25e3951cf3d498a63619a3cd2ad4406f5f28", + "0x86c95707db0495689afd0c2e39e97f445f7ca0edffad5c8b4cacd1421f2f3cc55049dfd504f728f91534e20383955582", + "0x99c3b0bb15942c301137765d4e19502f65806f3b126dc01a5b7820c87e8979bce6a37289a8f6a4c1e4637227ad5bf3bf", + "0x8aa1518a80ea8b074505a9b3f96829f5d4afa55a30efe7b4de4e5dbf666897fdd2cf31728ca45921e21a78a80f0e0f10", + "0x8d74f46361c79e15128ac399e958a91067ef4cec8983408775a87eca1eed5b7dcbf0ddf30e66f51780457413496c7f07", + "0xa41cde4a786b55387458a1db95171aca4fd146507b81c4da1e6d6e495527c3ec83fc42fad1dfe3d92744084a664fd431", + "0x8c352852c906fae99413a84ad11701f93f292fbf7bd14738814f4c4ceab32db02feb5eb70bc73898b0bc724a39d5d017", + "0xa5993046e8f23b71ba87b7caa7ace2d9023fb48ce4c51838813174880d918e9b4d2b0dc21a2b9c6f612338c31a289df8", + "0x83576d3324bf2d8afbfb6eaecdc5d767c8e22e7d25160414924f0645491df60541948a05e1f4202e612368e78675de8a", + "0xb43749b8df4b15bc9a3697e0f1c518e6b04114171739ef1a0c9c65185d8ec18e40e6954d125cbc14ebc652cf41ad3109", + "0xb4eebd5d80a7327a040cafb9ccdb12b2dfe1aa86e6bc6d3ac8a57fadfb95a5b1a7332c66318ff72ba459f525668af056", + "0x9198be7f1d413c5029b0e1c617bcbc082d21abe2c60ec8ce9b54ca1a85d3dba637b72fda39dae0c0ae40d047eab9f55a", + "0x8d96a0232832e24d45092653e781e7a9c9520766c3989e67bbe86b3a820c4bf621ea911e7cd5270a4bfea78b618411f6", + "0x8d7160d0ea98161a2d14d46ef01dff72d566c330cd4fabd27654d300e1bc7644c68dc8eabf2a20a59bfe7ba276545f9b", + "0xabb60fce29dec7ba37e3056e412e0ec3e05538a1fc0e2c68877378c867605966108bc5742585ab6a405ce0c962b285b6", + "0x8fabffa3ed792f05e414f5839386f6449fd9f7b41a47595c5d71074bd1bb3784cc7a1a7e1ad6b041b455035957e5b2dc", + "0x90ff017b4804c2d0533b72461436b10603ab13a55f86fd4ec11b06a70ef8166f958c110519ca1b4cc7beba440729fe2d", + "0xb340cfd120f6a4623e3a74cf8c32bfd7cd61a280b59dfd17b15ca8fae4d82f64a6f15fbde4c02f424debc72b7db5fe67", + "0x871311c9c7220c932e738d59f0ecc67a34356d1429fe570ca503d340c9996cb5ee2cd188fad0e3bd16e4c468ec1dbebd", + "0xa772470262186e7b94239ba921b29f2412c148d6f97c4412e96d21e55f3be73f992f1ad53c71008f0558ec3f84e2b5a7", + "0xb2a897dcb7ffd6257f3f2947ec966f2077d57d5191a88840b1d4f67effebe8c436641be85524d0a21be734c63ab5965d", + "0xa044f6eacc48a4a061fa149500d96b48cbf14853469aa4d045faf3dca973be1bd4b4ce01646d83e2f24f7c486d03205d", + "0x981af5dc2daa73f7fa9eae35a93d81eb6edba4a7f673b55d41f6ecd87a37685d31bb40ef4f1c469b3d72f2f18b925a17", + "0x912d2597a07864de9020ac77083eff2f15ceb07600f15755aba61251e8ce3c905a758453b417f04d9c38db040954eb65", + "0x9642b7f6f09394ba5e0805734ef6702c3eddf9eea187ba98c676d5bbaec0e360e3e51dc58433aaa1e2da6060c8659cb7", + "0x8ab3836e0a8ac492d5e707d056310c4c8e0489ca85eb771bff35ba1d658360084e836a6f51bb990f9e3d2d9aeb18fbb5", + "0x879e058e72b73bb1f4642c21ffdb90544b846868139c6511f299aafe59c2d0f0b944dffc7990491b7c4edcd6a9889250", + "0xb9e60b737023f61479a4a8fd253ed0d2a944ea6ba0439bbc0a0d3abf09b0ad1f18d75555e4a50405470ae4990626f390", + "0xb9c2535d362796dcd673640a9fa2ebdaec274e6f8b850b023153b0a7a30fffc87f96e0b72696f647ebe7ab63099a6963", + "0x94aeff145386a087b0e91e68a84a5ede01f978f9dd9fe7bebca78941938469495dc30a96bba9508c0d017873aeea9610", + "0x98b179f8a3d9f0d0a983c30682dd425a2ddc7803be59bd626c623c8951a5179117d1d2a68254c95c9952989877d0ee55", + "0x889ecf5f0ee56938273f74eb3e9ecfb5617f04fb58e83fe4c0e4aef51615cf345bc56f3f61b17f6eed3249d4afd54451", + "0xa0f2b2c39bcea4b50883e2587d16559e246248a66ecb4a4b7d9ab3b51fb39fe98d83765e087eee37a0f86b0ba4144c02", + "0xb2a61e247ed595e8a3830f7973b07079cbda510f28ad8c78c220b26cb6acde4fbb5ee90c14a665f329168ee951b08cf0", + "0x95bd0fcfb42f0d6d8a8e73d7458498a85bcddd2fb132fd7989265648d82ac2707d6d203fac045504977af4f0a2aca4b7", + "0x843e5a537c298666e6cf50fcc044f13506499ef83c802e719ff2c90e85003c132024e04711be7234c04d4b0125512d5d", + "0xa46d1797c5959dcd3a5cfc857488f4d96f74277c3d13b98b133620192f79944abcb3a361d939a100187f1b0856eae875", + "0xa1c7786736d6707a48515c38660615fcec67eb8a2598f46657855215f804fd72ab122d17f94fcffad8893f3be658dca7", + "0xb23dc9e610abc7d8bd21d147e22509a0fa49db5be6ea7057b51aae38e31654b3aa044df05b94b718153361371ba2f622", + "0xb00cc8f257d659c22d30e6d641f79166b1e752ea8606f558e4cad6fc01532e8319ea4ee12265ba4140ac45aa4613c004", + "0xac7019af65221b0cc736287b32d7f1a3561405715ba9a6a122342e04e51637ba911c41573de53e4781f2230fdcb2475f", + "0x81a630bc41b3da8b3eb4bf56cba10cd9f93153c3667f009dc332287baeb707d505fb537e6233c8e53d299ec0f013290c", + "0xa6b7aea5c545bb76df0f230548539db92bc26642572cb7dd3d5a30edca2b4c386f44fc8466f056b42de2a452b81aff5b", + "0x8271624ff736b7b238e43943c81de80a1612207d32036d820c11fc830c737972ccc9c60d3c2359922b06652311e3c994", + "0x8a684106458cb6f4db478170b9ad595d4b54c18bf63b9058f095a2fa1b928c15101472c70c648873d5887880059ed402", + "0xa5cc3c35228122f410184e4326cf61a37637206e589fcd245cb5d0cec91031f8f7586b80503070840fdfd8ce75d3c88b", + "0x9443fc631aed8866a7ed220890911057a1f56b0afe0ba15f0a0e295ab97f604b134b1ed9a4245e46ee5f9a93aa74f731", + "0x984b6f7d79835dffde9558c6bb912d992ca1180a2361757bdba4a7b69dc74b056e303adc69fe67414495dd9c2dd91e64", + "0xb15a5c8cba5de080224c274d31c68ed72d2a7126d347796569aef0c4e97ed084afe3da4d4b590b9dda1a07f0c2ff3dfb", + "0x991708fe9650a1f9a4e43938b91d45dc68c230e05ee999c95dbff3bf79b1c1b2bb0e7977de454237c355a73b8438b1d9", + "0xb4f7edc7468b176a4a7c0273700c444fa95c726af6697028bed4f77eee887e3400f9c42ee15b782c0ca861c4c3b8c98a", + "0x8c60dcc16c51087eb477c13e837031d6c6a3dc2b8bf8cb43c23f48006bc7173151807e866ead2234b460c2de93b31956", + "0x83ad63e9c910d1fc44bc114accfb0d4d333b7ebe032f73f62d25d3e172c029d5e34a1c9d547273bf6c0fead5c8801007", + "0x85de73213cc236f00777560756bdbf2b16841ba4b55902cf2cad9742ecaf5d28209b012ceb41f337456dfeca93010cd7", + "0xa7561f8827ccd75b6686ba5398bb8fc3083351c55a589b18984e186820af7e275af04bcd4c28e1dc11be1e8617a0610b", + "0x88c0a4febd4068850557f497ea888035c7fc9f404f6cc7794e7cc8722f048ad2f249e7dc62743e7a339eb7473ad3b0cd", + "0x932b22b1d3e6d5a6409c34980d176feb85ada1bf94332ef5c9fc4d42b907dabea608ceef9b5595ef3feee195151f18d8", + "0xa2867bb3f5ab88fbdae3a16c9143ab8a8f4f476a2643c505bb9f37e5b1fd34d216cab2204c9a017a5a67b7ad2dda10e8", + "0xb573d5f38e4e9e8a3a6fd82f0880dc049efa492a946d00283019bf1d5e5516464cf87039e80aef667cb86fdea5075904", + "0xb948f1b5ab755f3f5f36af27d94f503b070696d793b1240c1bdfd2e8e56890d69e6904688b5f8ff5a4bdf5a6abfe195f", + "0x917eae95ebc4109a2e99ddd8fec7881d2f7aaa0e25fda44dec7ce37458c2ee832f1829db7d2dcfa4ca0f06381c7fe91d", + "0x95751d17ed00a3030bce909333799bb7f4ab641acf585807f355b51d6976dceee410798026a1a004ef4dcdff7ec0f5b8", + "0xb9b7bd266f449a79bbfe075e429613e76c5a42ac61f01c8f0bbbd34669650682efe01ff9dbbc400a1e995616af6aa278", + "0xac1722d097ce9cd7617161f8ec8c23d68f1fb1c9ca533e2a8b4f78516c2fd8fb38f23f834e2b9a03bb06a9d655693ca9", + "0xa7ad9e96ffd98db2ecdb6340c5d592614f3c159abfd832fe27ee9293519d213a578e6246aae51672ee353e3296858873", + "0x989b8814d5de7937c4acafd000eec2b4cd58ba395d7b25f98cafd021e8efa37029b29ad8303a1f6867923f5852a220eb", + "0xa5bfe6282c771bc9e453e964042d44eff4098decacb89aecd3be662ea5b74506e1357ab26f3527110ba377711f3c9f41", + "0x8900a7470b656639721d2abbb7b06af0ac4222ab85a1976386e2a62eb4b88bfb5b72cf7921ddb3cf3a395d7eeb192a2e", + "0x95a71b55cd1f35a438cf5e75f8ff11c5ec6a2ebf2e4dba172f50bfad7d6d5dca5de1b1afc541662c81c858f7604c1163", + "0x82b5d62fea8db8d85c5bc3a76d68dedd25794cf14d4a7bc368938ffca9e09f7e598fdad2a5aac614e0e52f8112ae62b9", + "0x997173f07c729202afcde3028fa7f52cefc90fda2d0c8ac2b58154a5073140683e54c49ed1f254481070d119ce0ce02a", + "0xaeffb91ccc7a72bbd6ffe0f9b99c9e66e67d59cec2e02440465e9636a613ab3017278cfa72ea8bc4aba9a8dc728cb367", + "0x952743b06e8645894aeb6440fc7a5f62dd3acf96dab70a51e20176762c9751ea5f2ba0b9497ccf0114dc4892dc606031", + "0x874c63baeddc56fbbca2ff6031f8634b745f6e34ea6791d7c439201aee8f08ef5ee75f7778700a647f3b21068513fce6", + "0x85128fec9c750c1071edfb15586435cc2f317e3e9a175bb8a9697bcda1eb9375478cf25d01e7fed113483b28f625122d", + "0x85522c9576fd9763e32af8495ae3928ed7116fb70d4378448926bc9790e8a8d08f98cf47648d7da1b6e40d6a210c7924", + "0x97d0f37a13cfb723b848099ca1c14d83e9aaf2f7aeb71829180e664b7968632a08f6a85f557d74b55afe6242f2a36e7c", + "0xabaa472d6ad61a5fccd1a57c01aa1bc081253f95abbcba7f73923f1f11c4e79b904263890eeb66926de3e2652f5d1c70", + "0xb3c04945ba727a141e5e8aec2bf9aa3772b64d8fd0e2a2b07f3a91106a95cbcb249adcd074cbe498caf76fffac20d4ef", + "0x82c46781a3d730d9931bcabd7434a9171372dde57171b6180e5516d4e68db8b23495c8ac3ab96994c17ddb1cf249b9fb", + "0xa202d8b65613c42d01738ccd68ed8c2dbc021631f602d53f751966e04182743ebc8e0747d600b8a8676b1da9ae7f11ab", + "0xae73e7256e9459db04667a899e0d3ea5255211fb486d084e6550b6dd64ca44af6c6b2d59d7aa152de9f96ce9b58d940d", + "0xb67d87b176a9722945ec7593777ee461809861c6cfd1b945dde9ee4ff009ca4f19cf88f4bbb5c80c9cbab2fe25b23ac8", + "0x8f0b7a317a076758b0dac79959ee4a06c08b07d0f10538a4b53d3da2eda16e2af26922feb32c090330dc4d969cf69bd3", + "0x90b36bf56adbd8c4b6cb32febc3a8d5f714370c2ac3305c10fa6d168dffb2a026804517215f9a2d4ec8310cdb6bb459b", + "0xaa80c19b0682ead69934bf18cf476291a0beddd8ef4ed75975d0a472e2ab5c70f119722a8574ae4973aceb733d312e57", + "0xa3fc9abb12574e5c28dcb51750b4339b794b8e558675eef7d26126edf1de920c35e992333bcbffcbf6a5f5c0d383ce62", + "0xa1573ff23ab972acdcd08818853b111fc757fdd35aa070186d3e11e56b172fb49d840bf297ac0dd222e072fc09f26a81", + "0x98306f2be4caa92c2b4392212d0cbf430b409b19ff7d5b899986613bd0e762c909fc01999aa94be3bd529d67f0113d7f", + "0x8c1fc42482a0819074241746d17dc89c0304a2acdae8ed91b5009e9e3e70ff725ba063b4a3e68fdce05b74f5180c545e", + "0xa6c6113ebf72d8cf3163b2b8d7f3fa24303b13f55752522c660a98cd834d85d8c79214d900fa649499365e2e7641f77a", + "0xab95eea424f8a2cfd9fb1c78bb724e5b1d71a0d0d1e4217c5d0f98b0d8bbd3f8400a2002abc0a0e4576d1f93f46fefad", + "0x823c5a4fd8cf4a75fdc71d5f2dd511b6c0f189b82affeacd2b7cfcad8ad1a5551227dcc9bfdb2e34b2097eaa00efbb51", + "0xb97314dfff36d80c46b53d87a61b0e124dc94018a0bb680c32765b9a2d457f833a7c42bbc90b3b1520c33a182580398d", + "0xb17566ee3dcc6bb3b004afe4c0136dfe7dd27df9045ae896dca49fb36987501ae069eb745af81ba3fc19ff037e7b1406", + "0xb0bdc0f55cfd98d331e3a0c4fbb776a131936c3c47c6bffdc3aaf7d8c9fa6803fbc122c2fefbb532e634228687d52174", + "0xaa5d9e60cc9f0598559c28bb9bdd52aa46605ab4ffe3d192ba982398e72cec9a2a44c0d0d938ce69935693cabc0887ea", + "0x802b6459d2354fa1d56c592ac1346c428dadea6b6c0a87bf7d309bab55c94e1cf31dd98a7a86bd92a840dd51f218b91b", + "0xa526914efdc190381bf1a73dd33f392ecf01350b9d3f4ae96b1b1c3d1d064721c7d6eec5788162c933245a3943f5ee51", + "0xb3b8fcf637d8d6628620a1a99dbe619eabb3e5c7ce930d6efd2197e261bf394b74d4e5c26b96c4b8009c7e523ccfd082", + "0x8f7510c732502a93e095aba744535f3928f893f188adc5b16008385fb9e80f695d0435bfc5b91cdad4537e87e9d2551c", + "0x97b90beaa56aa936c3ca45698f79273a68dd3ccd0076eab48d2a4db01782665e63f33c25751c1f2e070f4d1a8525bf96", + "0xb9fb798324b1d1283fdc3e48288e3861a5449b2ab5e884b34ebb8f740225324af86e4711da6b5cc8361c1db15466602f", + "0xb6d52b53cea98f1d1d4c9a759c25bf9d8a50b604b144e4912acbdbdc32aab8b9dbb10d64a29aa33a4f502121a6fb481c", + "0x9174ffff0f2930fc228f0e539f5cfd82c9368d26b074467f39c07a774367ff6cccb5039ac63f107677d77706cd431680", + "0xa33b6250d4ac9e66ec51c063d1a6a31f253eb29bbaed12a0d67e2eccfffb0f3a52750fbf52a1c2aaba8c7692346426e7", + "0xa97025fd5cbcebe8ef865afc39cd3ea707b89d4e765ec817fd021d6438e02fa51e3544b1fd45470c58007a08efac6edd", + "0xb32a78480edd9ff6ba2f1eec4088db5d6ceb2d62d7e59e904ecaef7bb4a2e983a4588e51692b3be76e6ffbc0b5f911a5", + "0xb5ab590ef0bb77191f00495b33d11c53c65a819f7d0c1f9dc4a2caa147a69c77a4fff7366a602d743ee1f395ce934c1e", + "0xb3fb0842f9441fb1d0ee0293b6efbc70a8f58d12d6f769b12872db726b19e16f0f65efbc891cf27a28a248b0ef9c7e75", + "0x9372ad12856fefb928ccb0d34e198df99e2f8973b07e9d417a3134d5f69e12e79ff572c4e03ccd65415d70639bc7c73e", + "0xaa8d6e83d09ce216bfe2009a6b07d0110d98cf305364d5529c170a23e693aabb768b2016befb5ada8dabdd92b4d012bb", + "0xa954a75791eeb0ce41c85200c3763a508ed8214b5945a42c79bfdcfb1ec4f86ad1dd7b2862474a368d4ac31911a2b718", + "0x8e2081cfd1d062fe3ab4dab01f68062bac802795545fede9a188f6c9f802cb5f884e60dbe866710baadbf55dc77c11a4", + "0xa2f06003b9713e7dd5929501ed485436b49d43de80ea5b15170763fd6346badf8da6de8261828913ee0dacd8ff23c0e1", + "0x98eecc34b838e6ffd1931ca65eec27bcdb2fdcb61f33e7e5673a93028c5865e0d1bf6d3bec040c5e96f9bd08089a53a4", + "0x88cc16019741b341060b95498747db4377100d2a5bf0a5f516f7dec71b62bcb6e779de2c269c946d39040e03b3ae12b7", + "0xad1135ccbc3019d5b2faf59a688eef2500697642be8cfbdf211a1ab59abcc1f24483e50d653b55ff1834675ac7b4978f", + "0xa946f05ed9972f71dfde0020bbb086020fa35b482cce8a4cc36dd94355b2d10497d7f2580541bb3e81b71ac8bba3c49f", + "0xa83aeed488f9a19d8cfd743aa9aa1982ab3723560b1cd337fc2f91ad82f07afa412b3993afb845f68d47e91ba4869840", + "0x95eebe006bfc316810cb71da919e5d62c2cebb4ac99d8e8ef67be420302320465f8b69873470982de13a7c2e23516be9", + "0xa55f8961295a11e91d1e5deadc0c06c15dacbfc67f04ccba1d069cba89d72aa3b3d64045579c3ea8991b150ac29366ae", + "0xb321991d12f6ac07a5de3c492841d1a27b0d3446082fbce93e7e1f9e8d8fe3b45d41253556261c21b70f5e189e1a7a6f", + "0xa0b0822f15f652ce7962a4f130104b97bf9529797c13d6bd8e24701c213cc37f18157bd07f3d0f3eae6b7cd1cb40401f", + "0x96e2fa4da378aa782cc2d5e6e465fc9e49b5c805ed01d560e9b98abb5c0de8b74a2e7bec3aa5e2887d25cccb12c66f0c", + "0x97e4ab610d414f9210ed6f35300285eb3ccff5b0b6a95ed33425100d7725e159708ea78704497624ca0a2dcabce3a2f9", + "0x960a375b17bdb325761e01e88a3ea57026b2393e1d887b34b8fa5d2532928079ce88dc9fd06a728b26d2bb41b12b9032", + "0x8328a1647398e832aadc05bd717487a2b6fcdaa0d4850d2c4da230c6a2ed44c3e78ec4837b6094f3813f1ee99414713f", + "0xaa283834ebd18e6c99229ce4b401eda83f01d904f250fedd4e24f1006f8fa0712a6a89a7296a9bf2ce8de30e28d1408e", + "0xb29e097f2caadae3e0f0ae3473c072b0cd0206cf6d2e9b22c1a5ad3e07d433e32bd09ed1f4e4276a2da4268633357b7f", + "0x9539c5cbba14538b2fe077ecf67694ef240da5249950baaabea0340718b882a966f66d97f08556b08a4320ceb2cc2629", + "0xb4529f25e9b42ae8cf8338d2eface6ba5cd4b4d8da73af502d081388135c654c0b3afb3aa779ffc80b8c4c8f4425dd2b", + "0x95be0739c4330619fbe7ee2249c133c91d6c07eab846c18c5d6c85fc21ac5528c5d56dcb0145af68ed0c6a79f68f2ccd", + "0xac0c83ea802227bfc23814a24655c9ff13f729619bcffdb487ccbbf029b8eaee709f8bddb98232ef33cd70e30e45ca47", + "0xb503becb90acc93b1901e939059f93e671900ca52c6f64ae701d11ac891d3a050b505d89324ce267bc43ab8275da6ffe", + "0x98e3811b55b1bacb70aa409100abb1b870f67e6d059475d9f278c751b6e1e2e2d6f2e586c81a9fb6597fda06e7923274", + "0xb0b0f61a44053fa6c715dbb0731e35d48dba257d134f851ee1b81fd49a5c51a90ebf5459ec6e489fce25da4f184fbdb1", + "0xb1d2117fe811720bb997c7c93fe9e4260dc50fca8881b245b5e34f724aaf37ed970cdad4e8fcb68e05ac8cf55a274a53", + "0xa10f502051968f14b02895393271776dee7a06db9de14effa0b3471825ba94c3f805302bdddac4d397d08456f620999d", + "0xa3dbad2ef060ae0bb7b02eaa4a13594f3f900450faa1854fc09620b01ac94ab896321dfb1157cf2374c27e5718e8026a", + "0xb550fdec503195ecb9e079dcdf0cad559d64d3c30818ef369b4907e813e689da316a74ad2422e391b4a8c2a2bef25fc0", + "0xa25ba865e2ac8f28186cea497294c8649a201732ecb4620c4e77b8e887403119910423df061117e5f03fc5ba39042db1", + "0xb3f88174e03fdb443dd6addd01303cf88a4369352520187c739fc5ae6b22fa99629c63c985b4383219dab6acc5f6f532", + "0x97a7503248e31e81b10eb621ba8f5210c537ad11b539c96dfb7cf72b846c7fe81bd7532c5136095652a9618000b7f8d3", + "0xa8bcdc1ce5aa8bfa683a2fc65c1e79de8ff5446695dcb8620f7350c26d2972a23da22889f9e2b1cacb3f688c6a2953dc", + "0x8458c111df2a37f5dd91a9bee6c6f4b79f4f161c93fe78075b24a35f9817da8dde71763218d627917a9f1f0c4709c1ed", + "0xac5f061a0541152b876cbc10640f26f1cc923c9d4ae1b6621e4bb3bf2cec59bbf87363a4eb72fb0e5b6d4e1c269b52d5", + "0xa9a25ca87006e8a9203cbb78a93f50a36694aa4aad468b8d80d3feff9194455ca559fcc63838128a0ab75ad78c07c13a", + "0xa450b85f5dfffa8b34dfd8bc985f921318efacf8857cf7948f93884ba09fb831482ee90a44224b1a41e859e19b74962f", + "0x8ed91e7f92f5c6d7a71708b6132f157ac226ecaf8662af7d7468a4fa25627302efe31e4620ad28719318923e3a59bf82", + "0xab524165fd4c71b1fd395467a14272bd2b568592deafa039d8492e9ef36c6d3f96927c95c72d410a768dc0b6d1fbbc9b", + "0xb662144505aa8432c75ffb8d10318526b6d5777ac7af9ebfad87d9b0866c364f7905a6352743bd8fd79ffd9d5dd4f3e6", + "0xa48f1677550a5cd40663bb3ba8f84caaf8454f332d0ceb1d94dbea52d0412fe69c94997f7749929712fd3995298572f7", + "0x8391cd6e2f6b0c242de1117a612be99776c3dc95cb800b187685ea5bf7e2722275eddb79fd7dfc8be8e389c4524cdf70", + "0x875d3acb9af47833b72900bc0a2448999d638f153c5e97e8a14ec02d0c76f6264353a7e275e1f1a5855daced523d243b", + "0x91f1823657d30b59b2f627880a9a9cb530f5aca28a9fd217fe6f2f5133690dfe7ad5a897872e400512db2e788b3f7628", + "0xad3564332aa56cea84123fc7ca79ea70bb4fef2009fa131cb44e4b15e8613bd11ca1d83b9d9bf456e4b7fee9f2e8b017", + "0x8c530b84001936d5ab366c84c0b105241a26d1fb163669f17c8f2e94776895c2870edf3e1bc8ccd04d5e65531471f695", + "0x932d01fa174fdb0c366f1230cffde2571cc47485f37f23ba5a1825532190cc3b722aeb1f15aed62cf83ccae9403ba713", + "0x88b28c20585aca50d10752e84b901b5c2d58efef5131479fbbe53de7bce2029e1423a494c0298e1497669bd55be97a5d", + "0xb914148ca717721144ebb3d3bf3fcea2cd44c30c5f7051b89d8001502f3856fef30ec167174d5b76265b55d70f8716b5", + "0x81d0173821c6ddd2a068d70766d9103d1ee961c475156e0cbd67d54e668a796310474ef698c7ab55abe6f2cf76c14679", + "0x8f28e8d78e2fe7fa66340c53718e0db4b84823c8cfb159c76eac032a62fb53da0a5d7e24ca656cf9d2a890cb2a216542", + "0x8a26360335c73d1ab51cec3166c3cf23b9ea51e44a0ad631b0b0329ef55aaae555420348a544e18d5760969281759b61", + "0x94f326a32ed287545b0515be9e08149eb0a565025074796d72387cc3a237e87979776410d78339e23ef3172ca43b2544", + "0xa785d2961a2fa5e70bffa137858a92c48fe749fee91b02599a252b0cd50d311991a08efd7fa5e96b78d07e6e66ffe746", + "0x94af9030b5ac792dd1ce517eaadcec1482206848bea4e09e55cc7f40fd64d4c2b3e9197027c5636b70d6122c51d2235d", + "0x9722869f7d1a3992850fe7be405ec93aa17dc4d35e9e257d2e469f46d2c5a59dbd504056c85ab83d541ad8c13e8bcd54", + "0xb13c4088b61a06e2c03ac9813a75ff1f68ffdfee9df6a8f65095179a475e29cc49119cad2ce05862c3b1ac217f3aace9", + "0x8c64d51774753623666b10ca1b0fe63ae42f82ed6aa26b81dc1d48c86937c5772eb1402624c52a154b86031854e1fb9f", + "0xb47e4df18002b7dac3fee945bf9c0503159e1b8aafcce2138818e140753011b6d09ef1b20894e08ba3006b093559061b", + "0x93cb5970076522c5a0483693f6a35ffd4ea2aa7aaf3730c4eccd6af6d1bebfc1122fc4c67d53898ae13eb6db647be7e2", + "0xa68873ef80986795ea5ed1a597d1cd99ed978ec25e0abb57fdcc96e89ef0f50aeb779ff46e3dce21dc83ada3157a8498", + "0x8cab67f50949cc8eee6710e27358aea373aae3c92849f8f0b5531c080a6300cdf2c2094fe6fecfef6148de0d28446919", + "0x993e932bcb616dbaa7ad18a4439e0565211d31071ef1b85a0627db74a05d978c60d507695eaeea5c7bd9868a21d06923", + "0xacdadff26e3132d9478a818ef770e9fa0d2b56c6f5f48bd3bd674436ccce9bdfc34db884a73a30c04c5f5e9764cb2218", + "0xa0d3e64c9c71f84c0eef9d7a9cb4fa184224b969db5514d678e93e00f98b41595588ca802643ea225512a4a272f5f534", + "0x91c9140c9e1ba6e330cb08f6b2ce4809cd0d5a0f0516f70032bf30e912b0ed684d07b413b326ab531ee7e5b4668c799b", + "0x87bc2ee7a0c21ba8334cd098e35cb703f9af57f35e091b8151b9b63c3a5b0f89bd7701dbd44f644ea475901fa6d9ef08", + "0x9325ccbf64bf5d71b303e31ee85d486298f9802c5e55b2c3d75427097bf8f60fa2ab4fcaffa9b60bf922c3e24fbd4b19", + "0x95d0506e898318f3dc8d28d16dfd9f0038b54798838b3c9be2a2ae3c2bf204eb496166353fc042220b0bd4f6673b9285", + "0x811de529416331fe9c416726d45df9434c29dcd7e949045eb15740f47e97dde8f31489242200e19922cac2a8b7c6fd1f", + "0xade632d04a4c8bbab6ca7df370b2213cb9225023e7973f0e29f4f5e52e8aeaabc65171306bbdd12a67b195dfbb96d48f", + "0x88b7f029e079b6ae956042c0ea75d53088c5d0efd750dd018adaeacf46be21bf990897c58578c491f41afd3978d08073", + "0x91f477802de507ffd2be3f4319903119225b277ad24f74eb50f28b66c14d32fae53c7edb8c7590704741af7f7f3e3654", + "0x809838b32bb4f4d0237e98108320d4b079ee16ed80c567e7548bd37e4d7915b1192880f4812ac0e00476d246aec1dbc8", + "0x84183b5fc4a7997a8ae5afedb4d21dce69c480d5966b5cbdafd6dd10d29a9a6377f3b90ce44da0eb8b176ac3af0253bb", + "0x8508abbf6d3739a16b9165caf0f95afb3b3ac1b8c38d6d374cf0c91296e2c1809a99772492b539cda184510bce8a0271", + "0x8722054e59bab2062e6419a6e45fc803af77fde912ef2cd23055ad0484963de65a816a2debe1693d93c18218d2b8e81a", + "0x8e895f80e485a7c4f56827bf53d34b956281cdc74856c21eb3b51f6288c01cc3d08565a11cc6f3e2604775885490e8c5", + "0xafc92714771b7aa6e60f3aee12efd9c2595e9659797452f0c1e99519f67c8bc3ac567119c1ddfe82a3e961ee9defea9a", + "0x818ff0fd9cefd32db87b259e5fa32967201016fc02ef44116cdca3c63ce5e637756f60477a408709928444a8ad69c471", + "0x8251e29af4c61ae806fc5d032347fb332a94d472038149225298389495139ce5678fae739d02dfe53a231598a992e728", + "0xa0ea39574b26643f6f1f48f99f276a8a64b5481989cfb2936f9432a3f8ef5075abfe5c067dc5512143ce8bf933984097", + "0xaf67a73911b372bf04e57e21f289fc6c3dfac366c6a01409b6e76fea4769bdb07a6940e52e8d7d3078f235c6d2f632c6", + "0xb5291484ef336024dd2b9b4cf4d3a6b751133a40656d0a0825bcc6d41c21b1c79cb50b0e8f4693f90c29c8f4358641f9", + "0x8bc0d9754d70f2cb9c63f991902165a87c6535a763d5eece43143b5064ae0bcdce7c7a8f398f2c1c29167b2d5a3e6867", + "0x8d7faff53579ec8f6c92f661c399614cc35276971752ce0623270f88be937c414eddcb0997e14724a783905a026c8883", + "0x9310b5f6e675fdf60796f814dbaa5a6e7e9029a61c395761e330d9348a7efab992e4e115c8be3a43d08e90d21290c892", + "0xb5eb4f3eb646038ad2a020f0a42202532d4932e766da82b2c1002bf9c9c2e5336b54c8c0ffcc0e02d19dde2e6a35b6cc", + "0x91dabfd30a66710f1f37a891136c9be1e23af4abf8cb751f512a40c022a35f8e0a4fb05b17ec36d4208de02d56f0d53a", + "0xb3ded14e82d62ac7a5a036122a62f00ff8308498f3feae57d861babaff5a6628d43f0a0c5fc903f10936bcf4e2758ceb", + "0xa88e8348fed2b26acca6784d19ef27c75963450d99651d11a950ea81d4b93acd2c43e0ecce100eaf7e78508263d5baf3", + "0xb1f5bbf7c4756877b87bb42163ac570e08c6667c4528bf68b5976680e19beeff7c5effd17009b0718797077e2955457a", + "0xad2e7b516243f915d4d1415326e98b1a7390ae88897d0b03b66c2d9bd8c3fba283d7e8fe44ed3333296a736454cef6d8", + "0x8f82eae096d5b11f995de6724a9af895f5e1c58d593845ad16ce8fcae8507e0d8e2b2348a0f50a1f66a17fd6fac51a5c", + "0x890e4404d0657c6c1ee14e1aac132ecf7a568bb3e04137b85ac0f84f1d333bd94993e8750f88eee033a33fb00f85dcc7", + "0x82ac7d3385e035115f1d39a99fc73e5919de44f5e6424579776d118d711c8120b8e5916372c6f27bed4cc64cac170b6c", + "0x85ee16d8901c272cfbbe966e724b7a891c1bd5e68efd5d863043ad8520fc409080af61fd726adc680b3f1186fe0ac8b8", + "0x86dc564c9b545567483b43a38f24c41c6551a49cabeebb58ce86404662a12dbfafd0778d30d26e1c93ce222e547e3898", + "0xa29f5b4522db26d88f5f95f18d459f8feefab02e380c2edb65aa0617a82a3c1a89474727a951cef5f15050bcf7b380fb", + "0xa1ce039c8f6cac53352899edb0e3a72c76da143564ad1a44858bd7ee88552e2fe6858d1593bbd74aeee5a6f8034b9b9d", + "0x97f10d77983f088286bd7ef3e7fdd8fa275a56bec19919adf33cf939a90c8f2967d2b1b6fc51195cb45ad561202a3ed7", + "0xa25e2772e8c911aaf8712bdac1dd40ee061c84d3d224c466cfaae8e5c99604053f940cde259bd1c3b8b69595781dbfec", + "0xb31bb95a0388595149409c48781174c340960d59032ab2b47689911d03c68f77a2273576fbe0c2bf4553e330656058c7", + "0xb8b2e9287ad803fb185a13f0d7456b397d4e3c8ad5078f57f49e8beb2e85f661356a3392dbd7bcf6a900baa5582b86a1", + "0xa3d0893923455eb6e96cc414341cac33d2dbc88fba821ac672708cce131761d85a0e08286663a32828244febfcae6451", + "0x82310cb42f647d99a136014a9f881eb0b9791efd2e01fc1841907ad3fc8a9654d3d1dab6689c3607214b4dc2aca01cee", + "0x874022d99c16f60c22de1b094532a0bc6d4de700ad01a31798fac1d5088b9a42ad02bef8a7339af7ed9c0d4f16b186ee", + "0x94981369e120265aed40910eebc37eded481e90f4596b8d57c3bec790ab7f929784bd33ddd05b7870aad6c02e869603b", + "0xa4f1f50e1e2a73f07095e0dd31cb45154f24968dae967e38962341c1241bcd473102fff1ff668b20c6547e9732d11701", + "0xae2328f3b0ad79fcda807e69a1b5278145225083f150f67511dafc97e079f860c3392675f1752ae7e864c056e592205b", + "0x875d8c971e593ca79552c43d55c8c73b17cd20c81ff2c2fed1eb19b1b91e4a3a83d32df150dbfd5db1092d0aebde1e1f", + "0xadd2e80aa46aae95da73a11f130f4bda339db028e24c9b11e5316e75ba5e63bc991d2a1da172c7c8e8fee038baae3433", + "0xb46dbe1cb3424002aa7de51e82f600852248e251465c440695d52538d3f36828ff46c90ed77fc1d11534fe3c487df8ef", + "0xa5e5045d28b4e83d0055863c30c056628c58d4657e6176fd0536f5933f723d60e851bb726d5bf3c546b8ce4ac4a57ef8", + "0x91fec01e86dd1537e498fff7536ea3ca012058b145f29d9ada49370cd7b7193ac380e116989515df1b94b74a55c45df3", + "0xa7428176d6918cd916a310bdc75483c72de660df48cac4e6e7478eef03205f1827ea55afc0df5d5fa7567d14bbea7fc9", + "0x851d89bef45d9761fe5fdb62972209335193610015e16a675149519f9911373bac0919add226ef118d9f3669cfdf4734", + "0xb74acf5c149d0042021cb2422ea022be4c4f72a77855f42393e71ffd12ebb3eec16bdf16f812159b67b79a9706e7156d", + "0x99f35dce64ec99aa595e7894b55ce7b5a435851b396e79036ffb249c28206087db4c85379df666c4d95857db02e21ff9", + "0xb6b9a384f70db9e298415b8ab394ee625dafff04be2886476e59df8d052ca832d11ac68a9b93fba7ab055b7bc36948a4", + "0x898ee4aefa923ffec9e79f2219c7389663eb11eb5b49014e04ed4a336399f6ea1691051d86991f4c46ca65bcd4fdf359", + "0xb0f948217b0d65df7599a0ba4654a5e43c84db477936276e6f11c8981efc6eaf14c90d3650107ed4c09af4cc8ec11137", + "0xaa6286e27ac54f73e63dbf6f41865dd94d24bc0cf732262fcaff67319d162bb43af909f6f8ee27b1971939cfbba08141", + "0x8bca7cdf730cf56c7b2c8a2c4879d61361a6e1dba5a3681a1a16c17a56e168ace0e99cf0d15826a1f5e67e6b8a8a049a", + "0xa746d876e8b1ce225fcafca603b099b36504846961526589af977a88c60d31ba2cc56e66a3dec8a77b3f3531bf7524c9", + "0xa11e2e1927e6704cdb8874c75e4f1842cef84d7d43d7a38e339e61dc8ba90e61bbb20dd3c12e0b11d2471d58eed245be", + "0xa36395e22bc1d1ba8b0459a235203177737397da5643ce54ded3459d0869ff6d8d89f50c73cb62394bf66a959cde9b90", + "0x8b49f12ba2fdf9aca7e5f81d45c07d47f9302a2655610e7634d1e4bd16048381a45ef2c95a8dd5b0715e4b7cf42273af", + "0x91cffa2a17e64eb7f76bccbe4e87280ee1dd244e04a3c9eac12e15d2d04845d876eb24fe2ec6d6d266cce9efb281077f", + "0xa6b8afabf65f2dee01788114e33a2f3ce25376fb47a50b74da7c3c25ff1fdc8aa9f41307534abbf48acb6f7466068f69", + "0x8d13db896ccfea403bd6441191995c1a65365cab7d0b97fbe9526da3f45a877bd1f4ef2edef160e8a56838cd1586330e", + "0x98c717de9e01bef8842c162a5e757fe8552d53269c84862f4d451e7c656ae6f2ae473767b04290b134773f63be6fdb9d", + "0x8c2036ace1920bd13cf018e82848c49eb511fad65fd0ff51f4e4b50cf3bfc294afb63cba682c16f52fb595a98fa84970", + "0xa3520fdff05dbad9e12551b0896922e375f9e5589368bcb2cc303bde252743b74460cb5caf99629325d3620f13adc796", + "0x8d4f83a5bfec05caf5910e0ce538ee9816ee18d0bd44c1d0da2a87715a23cd2733ad4d47552c6dc0eb397687d611dd19", + "0xa7b39a0a6a02823452d376533f39d35029867b3c9a6ad6bca181f18c54132d675613a700f9db2440fb1b4fa13c8bf18a", + "0x80bcb114b2544b80f404a200fc36860ed5e1ad31fe551acd4661d09730c452831751baa9b19d7d311600d267086a70bc", + "0x90dcce03c6f88fc2b08f2b42771eedde90cc5330fe0336e46c1a7d1b5a6c1641e5fcc4e7b3d5db00bd8afca9ec66ed81", + "0xaec15f40805065c98e2965b1ae12a6c9020cfdb094c2d0549acfc7ea2401a5fb48d3ea7d41133cf37c4e096e7ff53eb9", + "0x80e129b735dba49fa627a615d6c273119acec8e219b2f2c4373a332b5f98d66cbbdd688dfbe72a8f8bfefaccc02c50c1", + "0xa9b596da3bdfe23e6799ece5f7975bf7a1979a75f4f546deeaf8b34dfe3e0d623217cb4cf4ccd504cfa3625b88cd53f1", + "0xabcbbb70b16f6e517c0ab4363ab76b46e4ff58576b5f8340e5c0e8cc0e02621b6e23d742d73b015822a238b17cfd7665", + "0xa046937cc6ea6a2e1adae543353a9fe929c1ae4ad655be1cc051378482cf88b041e28b1e9a577e6ccff2d3570f55e200", + "0x831279437282f315e65a60184ef158f0a3dddc15a648dc552bdc88b3e6fe8288d3cfe9f0031846d81350f5e7874b4b33", + "0x993d7916fa213c6d66e7c4cafafc1eaec9a2a86981f91c31eb8a69c5df076c789cbf498a24c84e0ee77af95b42145026", + "0x823907a3b6719f8d49b3a4b7c181bd9bb29fcf842d7c70660c4f351852a1e197ca46cf5e879b47fa55f616fa2b87ce5e", + "0x8d228244e26132b234930ee14c75d88df0943cdb9c276a8faf167d259b7efc1beec2a87c112a6c608ad1600a239e9aae", + "0xab6e55766e5bfb0cf0764ed909a8473ab5047d3388b4f46faeba2d1425c4754c55c6daf6ad4751e634c618b53e549529", + "0xab0cab6860e55a84c5ad2948a7e0989e2b4b1fd637605634b118361497332df32d9549cb854b2327ca54f2bcb85eed8f", + "0xb086b349ae03ef34f4b25a57bcaa5d1b29bd94f9ebf87e22be475adfe475c51a1230c1ebe13506cb72c4186192451658", + "0x8a0b49d8a254ca6d91500f449cbbfbb69bb516c6948ac06808c65595e46773e346f97a5ce0ef7e5a5e0de278af22709c", + "0xac49de11edaaf04302c73c578cc0824bdd165c0d6321be1c421c1950e68e4f3589aa3995448c9699e93c6ebae8803e27", + "0x884f02d841cb5d8f4c60d1402469216b114ab4e93550b5bc1431756e365c4f870a9853449285384a6fa49e12ce6dc654", + "0xb75f3a28fa2cc8d36b49130cb7448a23d73a7311d0185ba803ad55c8219741d451c110f48b786e96c728bc525903a54f", + "0x80ae04dbd41f4a35e33f9de413b6ad518af0919e5a30cb0fa1b061b260420780bb674f828d37fd3b52b5a31673cbd803", + "0xb9a8011eb5fcea766907029bf743b45262db3e49d24f84503687e838651ed11cb64c66281e20a0ae9f6aa51acc552263", + "0x90bfdd75e2dc9cf013e22a5d55d2d2b8a754c96103a17524488e01206e67f8b6d52b1be8c4e3d5307d4fe06d0e51f54c", + "0xb4af353a19b06203a815ec43e79a88578cc678c46f5a954b85bc5c53b84059dddba731f3d463c23bfd5273885c7c56a4", + "0xaa125e96d4553b64f7140e5453ff5d2330318b69d74d37d283e84c26ad672fa00e3f71e530eb7e28be1e94afb9c4612e", + "0xa18e060aee3d49cde2389b10888696436bb7949a79ca7d728be6456a356ea5541b55492b2138da90108bd1ce0e6f5524", + "0x93e55f92bdbccc2de655d14b1526836ea2e52dba65eb3f87823dd458a4cb5079bf22ce6ef625cb6d6bfdd0995ab9a874", + "0x89f5a683526b90c1c3ceebbb8dc824b21cff851ce3531b164f6626e326d98b27d3e1d50982e507d84a99b1e04e86a915", + "0x83d1c38800361633a3f742b1cb2bfc528129496e80232611682ddbe403e92c2ac5373aea0bca93ecb5128b0b2b7a719e", + "0x8ecba560ac94905e19ce8d9c7af217bf0a145d8c8bd38e2db82f5e94cc3f2f26f55819176376b51f154b4aab22056059", + "0xa7e2a4a002b60291924850642e703232994acb4cfb90f07c94d1e0ecd2257bb583443283c20fc6017c37e6bfe85b7366", + "0x93ed7316fa50b528f1636fc6507683a672f4f4403e55e94663f91221cc198199595bd02eef43d609f451acc9d9b36a24", + "0xa1220a8ebc5c50ceed76a74bc3b7e0aa77f6884c71b64b67c4310ac29ce5526cb8992d6abc13ef6c8413ce62486a6795", + "0xb2f6eac5c869ad7f4a25161d3347093e2f70e66cd925032747e901189355022fab3038bca4d610d2f68feb7e719c110b", + "0xb703fa11a4d511ca01c7462979a94acb40b5d933759199af42670eb48f83df202fa0c943f6ab3b4e1cc54673ea3aab1e", + "0xb5422912afbfcb901f84791b04f1ddb3c3fbdc76d961ee2a00c5c320e06d3cc5b5909c3bb805df66c5f10c47a292b13d", + "0xad0934368da823302e1ac08e3ede74b05dfdbfffca203e97ffb0282c226814b65c142e6e15ec1e754518f221f01b30f7", + "0xa1dd302a02e37df15bf2f1147efe0e3c06933a5a767d2d030e1132f5c3ce6b98e216b6145eb39e1e2f74e76a83165b8d", + "0xa346aab07564432f802ae44738049a36f7ca4056df2d8f110dbe7fef4a3e047684dea609b2d03dc6bf917c9c2a47608f", + "0xb96c5f682a5f5d02123568e50f5d0d186e4b2c4c9b956ec7aabac1b3e4a766d78d19bd111adb5176b898e916e49be2aa", + "0x8a96676d56876fc85538db2e806e1cba20fd01aeb9fa3cb43ca6ca94a2c102639f65660db330e5d74a029bb72d6a0b39", + "0xab0048336bd5c3def1a4064eadd49e66480c1f2abb4df46e03afbd8a3342c2c9d74ee35d79f08f4768c1646681440984", + "0x888427bdf76caec90814c57ee1c3210a97d107dd88f7256f14f883ad0f392334b82be11e36dd8bfec2b37935177c7831", + "0xb622b282becf0094a1916fa658429a5292ba30fb48a4c8066ce1ddcefb71037948262a01c95bab6929ed3a76ba5db9fe", + "0xb5b9e005c1f456b6a368a3097634fb455723abe95433a186e8278dceb79d4ca2fbe21f8002e80027b3c531e5bf494629", + "0xa3c6707117a1e48697ed41062897f55d8119403eea6c2ee88f60180f6526f45172664bfee96bf61d6ec0b7fbae6aa058", + "0xb02a9567386a4fbbdb772d8a27057b0be210447348efe6feb935ceec81f361ed2c0c211e54787dc617cdffed6b4a6652", + "0xa9b8364e40ef15c3b5902e5534998997b8493064fa2bea99600def58279bb0f64574c09ba11e9f6f669a8354dd79dc85", + "0x9998a2e553a9aa9a206518fae2bc8b90329ee59ab23005b10972712389f2ec0ee746033c733092ffe43d73d33abbb8ef", + "0x843a4b34d9039bf79df96d79f2d15e8d755affb4d83d61872daf540b68c0a3888cf8fc00d5b8b247b38524bcb3b5a856", + "0x84f7128920c1b0bb40eee95701d30e6fc3a83b7bb3709f16d97e72acbb6057004ee7ac8e8f575936ca9dcb7866ab45f7", + "0x918d3e2222e10e05edb34728162a899ad5ada0aaa491aeb7c81572a9c0d506e31d5390e1803a91ff3bd8e2bb15d47f31", + "0x9442d18e2489613a7d47bb1cb803c8d6f3259d088cd079460976d87f7905ee07dea8f371b2537f6e1d792d36d7e42723", + "0xb491976970fe091995b2ed86d629126523ccf3e9daf8145302faca71b5a71a5da92e0e05b62d7139d3efac5c4e367584", + "0xaa628006235dc77c14cef4c04a308d66b07ac92d377df3de1a2e6ecfe3144f2219ad6d7795e671e1cb37a3641910b940", + "0x99d386adaea5d4981d7306feecac9a555b74ffdc218c907c5aa7ac04abaead0ec2a8237300d42a3fbc464673e417ceed", + "0x8f78e8b1556f9d739648ea3cab9606f8328b52877fe72f9305545a73b74d49884044ba9c1f1c6db7d9b7c7b7c661caba", + "0x8fb357ae49932d0babdf74fc7aa7464a65d3b6a2b3acf4f550b99601d3c0215900cfd67f2b6651ef94cfc323bac79fae", + "0x9906f2fa25c0290775aa001fb6198113d53804262454ae8b83ef371b5271bde189c0460a645829cb6c59f9ee3a55ce4d", + "0x8f4379b3ebb50e052325b27655ca6a82e6f00b87bf0d2b680d205dd2c7afdc9ff32a9047ae71a1cdf0d0ce6b9474d878", + "0xa85534e88c2bd43c043792eaa75e50914b21741a566635e0e107ae857aed0412035f7576cf04488ade16fd3f35fdbb87", + "0xb4ce93199966d3c23251ca7f28ec5af7efea1763d376b0385352ffb2e0a462ef95c69940950278cf0e3dafd638b7bd36", + "0xb10cb3d0317dd570aa73129f4acf63c256816f007607c19b423fb42f65133ce21f2f517e0afb41a5378cccf893ae14d0", + "0xa9b231c9f739f7f914e5d943ed9bff7eba9e2c333fbd7c34eb1648a362ee01a01af6e2f7c35c9fe962b11152cddf35de", + "0x99ff6a899e156732937fb81c0cced80ae13d2d44c40ba99ac183aa246103b31ec084594b1b7feb96da58f4be2dd5c0ed", + "0x8748d15d18b75ff2596f50d6a9c4ce82f61ecbcee123a6ceae0e43cab3012a29b6f83cf67b48c22f6f9d757c6caf76b2", + "0xb88ab05e4248b7fb634cf640a4e6a945d13e331237410f7217d3d17e3e384ddd48897e7a91e4516f1b9cbd30f35f238b", + "0x8d826deaeeb84a3b2d2c04c2300ca592501f992810582d6ae993e0d52f6283a839dba66c6c72278cff5871802b71173b", + "0xb36fed027c2f05a5ef625ca00b0364b930901e9e4420975b111858d0941f60e205546474bb25d6bfa6928d37305ae95f", + "0xaf2fcfc6b87967567e8b8a13a4ed914478185705724e56ce68fb2df6d1576a0cf34a61e880997a0d35dc2c3276ff7501", + "0xac351b919cd1fbf106feb8af2c67692bfcddc84762d18cea681cfa7470a5644839caace27efee5f38c87d3df306f4211", + "0x8d6665fb1d4d8d1fa23bd9b8a86e043b8555663519caac214d1e3e3effbc6bee7f2bcf21e645f77de0ced279d69a8a8b", + "0xa9fc1c2061756b2a1a169c1b149f212ff7f0d2488acd1c5a0197eba793cffa593fc6d1d1b40718aa75ca3ec77eff10e1", + "0xaff64f0fa009c7a6cf0b8d7a22ddb2c8170c3cb3eec082e60d5aadb00b0040443be8936d728d99581e33c22178c41c87", + "0x82e0b181adc5e3b1c87ff8598447260e839d53debfae941ebea38265575546c3a74a14b4325a030833a62ff6c52d9365", + "0xb7ad43cbb22f6f892c2a1548a41dc120ab1f4e1b8dea0cb6272dd9cb02054c542ecabc582f7e16de709d48f5166cae86", + "0x985e0c61094281532c4afb788ecb2dfcba998e974b5d4257a22040a161883908cdd068fe80f8eb49b8953cfd11acf43a", + "0xae46895c6d67ea6d469b6c9c07b9e5d295d9ae73b22e30da4ba2c973ba83a130d7eef39717ec9d0f36e81d56bf742671", + "0x8600177ea1f7e7ef90514b38b219a37dedfc39cb83297e4c7a5b479817ef56479d48cf6314820960c751183f6edf8b0e", + "0xb9208ec1c1d7a1e99b59c62d3e4e61dfb706b0e940d09d3abfc3454c19749083260614d89cfd7e822596c3cdbcc6bb95", + "0xa1e94042c796c2b48bc724352d2e9f3a22291d9a34705993357ddb6adabd76da6fc25dac200a8cb0b5bbd99ecddb7af6", + "0xb29c3adedd0bcad8a930625bc4dfdc3552a9afd5ca6dd9c0d758f978068c7982b50b711aa0eb5b97f2b84ee784637835", + "0xaf0632a238bb1f413c7ea8e9b4c3d68f2827bd2e38cd56024391fba6446ac5d19a780d0cfd4a78fe497d537b766a591a", + "0xaaf6e7f7d54f8ef5e2e45dd59774ecbeecf8683aa70483b2a75be6a6071b5981bbaf1627512a65d212817acdfab2e428", + "0x8c751496065da2e927cf492aa5ca9013b24f861d5e6c24b30bbf52ec5aaf1905f40f9a28175faef283dd4ed4f2182a09", + "0x8952377d8e80a85cf67d6b45499f3bad5fd452ea7bcd99efc1b066c4720d8e5bff1214cea90fd1f972a7f0baac3d29be", + "0xa1946ee543d1a6e21f380453be4d446e4130950c5fc3d075794eb8260f6f52d0a795c1ff91d028a648dc1ce7d9ab6b47", + "0x89f3fefe37af31e0c17533d2ca1ce0884cc1dc97c15cbfab9c331b8debd94781c9396abef4bb2f163d09277a08d6adf0", + "0xa2753f1e6e1a154fb117100a5bd9052137add85961f8158830ac20541ab12227d83887d10acf7fd36dcaf7c2596d8d23", + "0x814955b4198933ee11c3883863b06ff98c7eceb21fc3e09df5f916107827ccf3323141983e74b025f46ae00284c9513b", + "0x8cc5c6bb429073bfef47cae7b3bfccb0ffa076514d91a1862c6bda4d581e0df87db53cc6c130bf8a7826304960f5a34e", + "0x909f22c1f1cdc87f7be7439c831a73484a49acbf8f23d47087d7cf867c64ef61da3bde85dc57d705682b4c3fc710d36e", + "0x8048fee7f276fcd504aed91284f28e73693615e0eb3858fa44bcf79d7285a9001c373b3ef71d9a3054817ba293ebe28c", + "0x94400e5cf5d2700ca608c5fe35ce14623f71cc24959f2bc27ca3684092850f76b67fb1f07ca9e5b2ca3062cf8ad17bd4", + "0x81c2ae7d4d1b17f8b6de6a0430acc0d58260993980fe48dc2129c4948269cdc74f9dbfbf9c26b19360823fd913083d48", + "0x8c41fe765128e63f6889d6a979f6a4342300327c8b245a8cfe3ecfbcac1e09c3da30e2a1045b24b78efc6d6d50c8c6ac", + "0xa5dd4ae51ae48c8be4b218c312ade226cffce671cf121cb77810f6c0990768d6dd767badecb5c69921d5574d5e8433d3", + "0xb7642e325f4ba97ae2a39c1c9d97b35aafd49d53dba36aed3f3cb0ca816480b3394079f46a48252d46596559c90f4d58", + "0xae87375b40f35519e7bd4b1b2f73cd0b329b0c2cb9d616629342a71c6c304338445eda069b78ea0fbe44087f3de91e09", + "0xb08918cb6f736855e11d3daca1ddfbdd61c9589b203b5493143227bf48e2c77c2e8c94b0d1aa2fab2226e0eae83f2681", + "0xac36b84a4ac2ebd4d6591923a449c564e3be8a664c46092c09e875c2998eba16b5d32bfd0882fd3851762868e669f0b1", + "0xa44800a3bb192066fa17a3f29029a23697240467053b5aa49b9839fb9b9b8b12bcdcbfc557f024b61f4f51a9aacdefcb", + "0x9064c688fec23441a274cdf2075e5a449caf5c7363cc5e8a5dc9747183d2e00a0c69f2e6b3f6a7057079c46014c93b3b", + "0xaa367b021469af9f5b764a79bb3afbe2d87fe1e51862221672d1a66f954b165778b7c27a705e0f93841fab4c8468344d", + "0xa1a8bfc593d4ab71f91640bc824de5c1380ab2591cfdafcbc78a14b32de3c0e15f9d1b461d85c504baa3d4232c16bb53", + "0x97df48da1799430f528184d30b6baa90c2a2f88f34cdfb342d715339c5ebd6d019aa693cea7c4993daafc9849063a3aa", + "0xabd923831fbb427e06e0dd335253178a9e5791395c84d0ab1433c07c53c1209161097e9582fb8736f8a60bde62d8693e", + "0x84cd1a43f1a438b43dc60ffc775f646937c4f6871438163905a3cebf1115f814ccd38a6ccb134130bff226306e412f32", + "0x91426065996b0743c5f689eb3ca68a9f7b9e4d01f6c5a2652b57fa9a03d8dc7cd4bdbdab0ca5a891fee1e97a7f00cf02", + "0xa4bee50249db3df7fd75162b28f04e57c678ba142ce4d3def2bc17bcb29e4670284a45f218dad3969af466c62a903757", + "0x83141ebcc94d4681404e8b67a12a46374fded6df92b506aff3490d875919631408b369823a08b271d006d5b93136f317", + "0xa0ea1c8883d58d5a784da3d8c8a880061adea796d7505c1f903d07c287c5467f71e4563fc0faafbc15b5a5538b0a7559", + "0x89d9d480574f201a87269d26fb114278ed2c446328df431dc3556e3500e80e4cd01fcac196a2459d8646361ebda840df", + "0x8bf302978973632dd464bec819bdb91304712a3ec859be071e662040620422c6e75eba6f864f764cffa2799272efec39", + "0x922f666bc0fd58b6d7d815c0ae4f66d193d32fc8382c631037f59eeaeae9a8ca6c72d08e72944cf9e800b8d639094e77", + "0x81ad8714f491cdff7fe4399f2eb20e32650cff2999dd45b9b3d996d54a4aba24cc6c451212e78c9e5550368a1a38fb3f", + "0xb58fcf4659d73edb73175bd9139d18254e94c3e32031b5d4b026f2ed37aa19dca17ec2eb54c14340231615277a9d347e", + "0xb365ac9c2bfe409b710928c646ea2fb15b28557e0f089d39878e365589b9d1c34baf5566d20bb28b33bb60fa133f6eff", + "0x8fcae1d75b53ab470be805f39630d204853ca1629a14158bac2f52632277d77458dec204ff84b7b2d77e641c2045be65", + "0xa03efa6bebe84f4f958a56e2d76b5ba4f95dd9ed7eb479edc7cc5e646c8d4792e5b0dfc66cc86aa4b4afe2f7a4850760", + "0xaf1c823930a3638975fb0cc5c59651771b2719119c3cd08404fbd4ce77a74d708cefbe3c56ea08c48f5f10e6907f338f", + "0x8260c8299b17898032c761c325ac9cabb4c5b7e735de81eacf244f647a45fb385012f4f8df743128888c29aefcaaad16", + "0xab2f37a573c82e96a8d46198691cd694dfa860615625f477e41f91b879bc58a745784fccd8ffa13065834ffd150d881d", + "0x986c746c9b4249352d8e5c629e8d7d05e716b3c7aab5e529ca969dd1e984a14b5be41528baef4c85d2369a42d7209216", + "0xb25e32da1a8adddf2a6080725818b75bc67240728ad1853d90738485d8924ea1e202df0a3034a60ffae6f965ec55cf63", + "0xa266e627afcebcefea6b6b44cbc50f5c508f7187e87d047b0450871c2a030042c9e376f3ede0afcf9d1952f089582f71", + "0x86c3bbca4c0300606071c0a80dbdec21ce1dd4d8d4309648151c420854032dff1241a1677d1cd5de4e4de4385efda986", + "0xb9a21a1fe2d1f3273a8e4a9185abf2ff86448cc98bfa435e3d68306a2b8b4a6a3ea33a155be3cb62a2170a86f77679a5", + "0xb117b1ea381adce87d8b342cba3a15d492ff2d644afa28f22424cb9cbc820d4f7693dfc1a4d1b3697046c300e1c9b4c8", + "0x9004c425a2e68870d6c69b658c344e3aa3a86a8914ee08d72b2f95c2e2d8a4c7bb0c6e7e271460c0e637cec11117bf8e", + "0x86a18aa4783b9ebd9131580c8b17994825f27f4ac427b0929a1e0236907732a1c8139e98112c605488ee95f48bbefbfc", + "0x84042243b955286482ab6f0b5df4c2d73571ada00716d2f737ca05a0d2e88c6349e8ee9e67934cfee4a1775dbf7f4800", + "0x92c2153a4733a62e4e1d5b60369f3c26777c7d01cd3c8679212660d572bd3bac9b8a8a64e1f10f7dbf5eaa7579c4e423", + "0x918454b6bb8e44a2afa144695ba8d48ae08d0cdfef4ad078f67709eddf3bb31191e8b006f04e82ea45a54715ef4d5817", + "0xacf0b54f6bf34cf6ed6c2b39cf43194a40d68de6bcf1e4b82c34c15a1343e9ac3737885e1a30b78d01fa3a5125463db8", + "0xa7d60dbe4b6a7b054f7afe9ee5cbbfeca0d05dc619e6041fa2296b549322529faddb8a11e949562309aecefb842ac380", + "0x91ffb53e6d7e5f11159eaf13e783d6dbdfdb1698ed1e6dbf3413c6ea23492bbb9e0932230a9e2caac8fe899a17682795", + "0xb6e8d7be5076ee3565d5765a710c5ecf17921dd3cf555c375d01e958a365ae087d4a88da492a5fb81838b7b92bf01143", + "0xa8c6b763de2d4b2ed42102ef64eccfef31e2fb2a8a2776241c82912fa50fc9f77f175b6d109a97ede331307c016a4b1a", + "0x99839f86cb700c297c58bc33e28d46b92931961548deac29ba8df91d3e11721b10ea956c8e16984f9e4acf1298a79b37", + "0x8c2e2c338f25ea5c25756b7131cde0d9a2b35abf5d90781180a00fe4b8e64e62590dc63fe10a57fba3a31c76d784eb01", + "0x9687d7df2f41319ca5469d91978fed0565a5f11f829ebadaa83db92b221755f76c6eacd7700735e75c91e257087512e3", + "0x8795fdfb7ff8439c58b9bf58ed53873d2780d3939b902b9ddaaa4c99447224ced9206c3039a23c2c44bcc461e2bb637f", + "0xa803697b744d2d087f4e2307218d48fa88620cf25529db9ce71e2e3bbcc65bac5e8bb9be04777ef7bfb5ed1a5b8e6170", + "0x80f3d3efbbb9346ddd413f0a8e36b269eb5d7ff6809d5525ff9a47c4bcab2c01b70018b117f6fe05253775612ff70c6b", + "0x9050e0e45bcc83930d4c505af35e5e4d7ca01cd8681cba92eb55821aececcebe32bb692ebe1a4daac4e7472975671067", + "0x8d206812aac42742dbaf233e0c080b3d1b30943b54b60283515da005de05ea5caa90f91fedcfcba72e922f64d7040189", + "0xa2d44faaeb2eff7915c83f32b13ca6f31a6847b1c1ce114ea240bac3595eded89f09b2313b7915ad882292e2b586d5b4", + "0x961776c8576030c39f214ea6e0a3e8b3d32f023d2600958c098c95c8a4e374deeb2b9dc522adfbd6bda5949bdc09e2a2", + "0x993fa7d8447407af0fbcd9e6d77f815fa5233ab00674efbcf74a1f51c37481445ae291cc7b76db7c178f9cb0e570e0fc", + "0xabd5b1c78e05f9d7c8cc99bdaef8b0b6a57f2daf0f02bf492bec48ea4a27a8f1e38b5854da96efff11973326ff980f92", + "0x8f15af4764bc275e6ccb892b3a4362cacb4e175b1526a9a99944e692fe6ccb1b4fc19abf312bb2a089cb1f344d91a779", + "0xa09b27ccd71855512aba1d0c30a79ffbe7f6707a55978f3ced50e674b511a79a446dbc6d7946add421ce111135a460af", + "0x94b2f98ce86a9271fbd4153e1fc37de48421fe3490fb3840c00f2d5a4d0ba8810c6a32880b002f6374b59e0a7952518b", + "0x8650ac644f93bbcb88a6a0f49fee2663297fd4bc6fd47b6a89b9d8038d32370438ab3a4775ec9b58cb10aea8a95ef7b6", + "0x95e5c2f2e84eed88c6980bbba5a1c0bb375d5a628bff006f7516d45bb7d723da676add4fdd45956f312e7bab0f052644", + "0xb3278a3fa377ac93af7cfc9453f8cb594aae04269bbc99d2e0e45472ff4b6a2f97a26c4c57bf675b9d86f5e77a5d55d1", + "0xb4bcbe6eb666a206e2ea2f877912c1d3b5bdbd08a989fc4490eb06013e1a69ad1ba08bcdac048bf29192312be399077b", + "0xa76d70b78c99fffcbf9bb9886eab40f1ea4f99a309710b660b64cbf86057cbcb644d243f6e341711bb7ef0fedf0435a7", + "0xb2093c1ee945dca7ac76ad5aed08eae23af31dd5a77c903fd7b6f051f4ab84425d33a03c3d45bf2907bc93c02d1f3ad8", + "0x904b1f7534e053a265b22d20be859912b9c9ccb303af9a8d6f1d8f6ccdc5c53eb4a45a1762b880d8444d9be0cd55e7f9", + "0x8f664a965d65bc730c9ef1ec7467be984d4b8eb46bd9b0d64e38e48f94e6e55dda19aeac82cbcf4e1473440e64c4ca18", + "0x8bcee65c4cc7a7799353d07b114c718a2aae0cd10a3f22b7eead5185d159dafd64852cb63924bf87627d176228878bce", + "0x8c78f2e3675096fef7ebaa898d2615cd50d39ca3d8f02b9bdfb07e67da648ae4be3da64838dffc5935fd72962c4b96c7", + "0x8c40afd3701629421fec1df1aac4e849384ef2e80472c0e28d36cb1327acdf2826f99b357f3d7afdbc58a6347fc40b3c", + "0xa197813b1c65a8ea5754ef782522a57d63433ef752215ecda1e7da76b0412ee619f58d904abd2e07e0c097048b6ae1dd", + "0xa670542629e4333884ad7410f9ea3bd6f988df4a8f8a424ca74b9add2312586900cf9ae8bd50411f9146e82626b4af56", + "0xa19875cc07ab84e569d98b8b67fb1dbbdfb59093c7b748fae008c8904a6fd931a63ca8d03ab5fea9bc8d263568125a9b", + "0xb57e7f68e4eb1bd04aafa917b1db1bdab759a02aa8a9cdb1cba34ba8852b5890f655645c9b4e15d5f19bf37e9f2ffe9f", + "0x8abe4e2a4f6462b6c64b3f10e45db2a53c2b0d3c5d5443d3f00a453e193df771eda635b098b6c8604ace3557514027af", + "0x8459e4fb378189b22b870a6ef20183deb816cefbf66eca1dc7e86d36a2e011537db893729f500dc154f14ce24633ba47", + "0x930851df4bc7913c0d8c0f7bd3b071a83668987ed7c397d3d042fdc0d9765945a39a3bae83da9c88cb6b686ed8aeeb26", + "0x8078c9e5cd05e1a8c932f8a1d835f61a248b6e7133fcbb3de406bf4ffc0e584f6f9f95062740ba6008d98348886cf76b", + "0xaddff62bb29430983fe578e3709b0949cdc0d47a13a29bc3f50371a2cb5c822ce53e2448cfaa01bcb6e0aa850d5a380e", + "0x9433add687b5a1e12066721789b1db2edf9b6558c3bdc0f452ba33b1da67426abe326e9a34d207bfb1c491c18811bde1", + "0x822beda3389963428cccc4a2918fa9a8a51cf0919640350293af70821967108cded5997adae86b33cb917780b097f1ca", + "0xa7a9f52bda45e4148ed56dd176df7bd672e9b5ed18888ccdb405f47920fdb0844355f8565cefb17010b38324edd8315f", + "0xb35c3a872e18e607b2555c51f9696a17fa18da1f924d503b163b4ec9fe22ed0c110925275cb6c93ce2d013e88f173d6a", + "0xadf34b002b2b26ab84fc1bf94e05bd8616a1d06664799ab149363c56a6e0c807fdc473327d25632416e952ea327fcd95", + "0xae4a6b9d22a4a3183fac29e2551e1124a8ce4a561a9a2afa9b23032b58d444e6155bb2b48f85c7b6d70393274e230db7", + "0xa2ea3be4fc17e9b7ce3110284038d46a09e88a247b6971167a7878d9dcf36925d613c382b400cfa4f37a3ebea3699897", + "0x8e5863786b641ce3140fbfe37124d7ad3925472e924f814ebfc45959aaf3f61dc554a597610b5defaecc85b59a99b50f", + "0xaefde3193d0f700d0f515ab2aaa43e2ef1d7831c4f7859f48e52693d57f97fa9e520090f3ed700e1c966f4b76048e57f", + "0x841a50f772956622798e5cd208dc7534d4e39eddee30d8ce133383d66e5f267e389254a0cdae01b770ecd0a9ca421929", + "0x8fbc2bfd28238c7d47d4c03b1b910946c0d94274a199575e5b23242619b1de3497784e646a92aa03e3e24123ae4fcaba", + "0x926999579c8eec1cc47d7330112586bdca20b4149c8b2d066f527c8b9f609e61ce27feb69db67eea382649c6905efcf9", + "0xb09f31f305efcc65589adf5d3690a76cf339efd67cd43a4e3ced7b839507466e4be72dd91f04e89e4bbef629d46e68c0", + "0xb917361f6b95f759642638e0b1d2b3a29c3bdef0b94faa30de562e6078c7e2d25976159df3edbacbf43614635c2640b4", + "0x8e7e8a1253bbda0e134d62bfe003a2669d471b47bd2b5cde0ff60d385d8e62279d54022f5ac12053b1e2d3aaa6910b4c", + "0xb69671a3c64e0a99d90b0ed108ce1912ff8ed983e4bddd75a370e9babde25ee1f5efb59ec707edddd46793207a8b1fe7", + "0x910b2f4ebd37b7ae94108922b233d0920b4aba0bd94202c70f1314418b548d11d8e9caa91f2cd95aff51b9432d122b7f", + "0x82f645c90dfb52d195c1020346287c43a80233d3538954548604d09fbab7421241cde8593dbc4acc4986e0ea39a27dd9", + "0x8fee895f0a140d88104ce442fed3966f58ff9d275e7373483f6b4249d64a25fb5374bbdc6bce6b5ab0270c2847066f83", + "0x84f5bd7aab27b2509397aeb86510dd5ac0a53f2c8f73799bf720f2f87a52277f8d6b0f77f17bc80739c6a7119b7eb062", + "0x9903ceced81099d7e146e661bcf01cbaccab5ba54366b85e2177f07e2d8621e19d9c9c3eee14b9266de6b3f9b6ea75ae", + "0xb9c16ea2a07afa32dd6c7c06df0dec39bca2067a9339e45475c98917f47e2320f6f235da353fd5e15b477de97ddc68dd", + "0x9820a9bbf8b826bec61ebf886de2c4f404c1ebdc8bab82ee1fea816d9de29127ce1852448ff717a3fe8bbfe9e92012e5", + "0x817224d9359f5da6f2158c2c7bf9165501424f063e67ba9859a07ab72ee2ee62eb00ca6da821cfa19065c3282ca72c74", + "0x94b95c465e6cb00da400558a3c60cfec4b79b27e602ca67cbc91aead08de4b6872d8ea096b0dc06dca4525c8992b8547", + "0xa2b539a5bccd43fa347ba9c15f249b417997c6a38c63517ca38394976baa08e20be384a360969ff54e7e721db536b3e5", + "0x96caf707e34f62811ee8d32ccf28d8d6ec579bc33e424d0473529af5315c456fd026aa910c1fed70c91982d51df7d3ca", + "0x8a77b73e890b644c6a142bdbac59b22d6a676f3b63ddafb52d914bb9d395b8bf5aedcbcc90429337df431ebd758a07a6", + "0x8857830a7351025617a08bc44caec28d2fae07ebf5ffc9f01d979ce2a53839a670e61ae2783e138313929129790a51a1", + "0xaa3e420321ed6f0aa326d28d1a10f13facec6f605b6218a6eb9cbc074801f3467bf013a456d1415a5536f12599efa3d3", + "0x824aed0951957b00ea2f3d423e30328a3527bf6714cf9abbae84cf27e58e5c35452ba89ccc011de7c68c75d6e021d8f1", + "0xa2e87cc06bf202e953fb1081933d8b4445527dde20e38ed1a4f440144fd8fa464a2b73e068b140562e9045e0f4bd3144", + "0xae3b8f06ad97d7ae3a5e5ca839efff3e4824dc238c0c03fc1a8d2fc8aa546cdfd165b784a31bb4dec7c77e9305b99a4b", + "0xb30c3e12395b1fb8b776f3ec9f87c70e35763a7b2ddc68f0f60a4982a84017f27c891a98561c830038deb033698ed7fc", + "0x874e507757cd1177d0dff0b0c62ce90130324442a33da3b2c8ee09dbca5d543e3ecfe707e9f1361e7c7db641c72794bb", + "0xb53012dd10b5e7460b57c092eaa06d6502720df9edbbe3e3f61a9998a272bf5baaac4a5a732ad4efe35d6fac6feca744", + "0x85e6509d711515534d394e6cacbed6c81da710074d16ef3f4950bf2f578d662a494d835674f79c4d6315bced4defc5f0", + "0xb6132b2a34b0905dcadc6119fd215419a7971fe545e52f48b768006944b4a9d7db1a74b149e2951ea48c083b752d0804", + "0x989867da6415036d19b4bacc926ce6f4df7a556f50a1ba5f3c48eea9cefbb1c09da81481c8009331ee83f0859185e164", + "0x960a6c36542876174d3fbc1505413e29f053ed87b8d38fef3af180491c7eff25200b45dd5fe5d4d8e63c7e8c9c00f4c8", + "0x9040b59bd739d9cc2e8f6e894683429e4e876a8106238689ff4c22770ae5fdae1f32d962b30301fa0634ee163b524f35", + "0xaf3fcd0a45fe9e8fe256dc7eab242ef7f582dd832d147444483c62787ac820fafc6ca55d639a73f76bfa5e7f5462ab8f", + "0xb934c799d0736953a73d91e761767fdb78454355c4b15c680ce08accb57ccf941b13a1236980001f9e6195801cffd692", + "0x8871e8e741157c2c326b22cf09551e78da3c1ec0fc0543136f581f1550f8bab03b0a7b80525c1e99812cdbf3a9698f96", + "0xa8a977f51473a91d178ee8cfa45ffef8d6fd93ab1d6e428f96a3c79816d9c6a93cd70f94d4deda0125fd6816e30f3bea", + "0xa7688b3b0a4fc1dd16e8ba6dc758d3cfe1b7cf401c31739484c7fa253cce0967df1b290769bcefc9d23d3e0cb19e6218", + "0x8ae84322662a57c6d729e6ff9d2737698cc2da2daeb1f39e506618750ed23442a6740955f299e4a15dda6db3e534d2c6", + "0xa04a961cdccfa4b7ef83ced17ab221d6a043b2c718a0d6cc8e6f798507a31f10bf70361f70a049bc8058303fa7f96864", + "0xb463e39732a7d9daec8a456fb58e54b30a6e160aa522a18b9a9e836488cce3342bcbb2e1deab0f5e6ec0a8796d77197d", + "0xb1434a11c6750f14018a2d3bcf94390e2948f4f187e93bb22070ca3e5393d339dc328cbfc3e48815f51929465ffe7d81", + "0x84ff81d73f3828340623d7e3345553610aa22a5432217ef0ebd193cbf4a24234b190c65ca0873c22d10ea7b63bd1fbed", + "0xb6fe2723f0c47757932c2ddde7a4f8434f665612f7b87b4009c2635d56b6e16b200859a8ade49276de0ef27a2b6c970a", + "0x9742884ed7cd52b4a4a068a43d3faa02551a424136c85a9313f7cb58ea54c04aa83b0728fd741d1fe39621e931e88f8f", + "0xb7d2d65ea4d1ad07a5dee39e40d6c03a61264a56b1585b4d76fc5b2a68d80a93a42a0181d432528582bf08d144c2d6a9", + "0x88c0f66bada89f8a43e5a6ead2915088173d106c76f724f4a97b0f6758aed6ae5c37c373c6b92cdd4aea8f6261f3a374", + "0x81f9c43582cb42db3900747eb49ec94edb2284999a499d1527f03315fd330e5a509afa3bff659853570e9886aab5b28b", + "0x821f9d27d6beb416abf9aa5c79afb65a50ed276dbda6060103bc808bcd34426b82da5f23e38e88a55e172f5c294b4d40", + "0x8ba307b9e7cb63a6c4f3851b321aebfdb6af34a5a4c3bd949ff7d96603e59b27ff4dc4970715d35f7758260ff942c9e9", + "0xb142eb6c5f846de33227d0bda61d445a7c33c98f0a8365fe6ab4c1fabdc130849be597ef734305894a424ea715372d08", + "0xa732730ae4512e86a741c8e4c87fee8a05ee840fec0e23b2e037d58dba8dde8d10a9bc5191d34d00598941becbbe467f", + "0xadce6f7c30fd221f6b10a0413cc76435c4bb36c2d60bca821e5c67409fe9dbb2f4c36ef85eb3d734695e4be4827e9fd3", + "0xa74f00e0f9b23aff7b2527ce69852f8906dab9d6abe62ecd497498ab21e57542e12af9918d4fd610bb09e10b0929c510", + "0xa593b6b0ef26448ce4eb3ab07e84238fc020b3cb10d542ff4b16d4e2be1bcde3797e45c9cf753b8dc3b0ffdb63984232", + "0xaed3913afccf1aa1ac0eb4980eb8426d0baccebd836d44651fd72af00d09fac488a870223c42aca3ceb39752070405ae", + "0xb2c44c66a5ea7fde626548ba4cef8c8710191343d3dadfd3bb653ce715c0e03056a5303a581d47dde66e70ea5a2d2779", + "0x8e5029b2ccf5128a12327b5103f7532db599846e422531869560ceaff392236434d87159f597937dbf4054f810c114f4", + "0x82beed1a2c4477e5eb39fc5b0e773b30cfec77ef2b1bf17eadaf60eb35b6d0dd9d8cf06315c48d3546badb3f21cd0cca", + "0x90077bd6cc0e4be5fff08e5d07a5a158d36cebd1d1363125bc4fae0866ffe825b26f933d4ee5427ba5cd0c33c19a7b06", + "0xa7ec0d8f079970e8e34f0ef3a53d3e0e45428ddcef9cc776ead5e542ef06f3c86981644f61c5a637e4faf001fb8c6b3e", + "0xae6d4add6d1a6f90b22792bc9d40723ee6850c27d0b97eefafd5b7fd98e424aa97868b5287cc41b4fbd7023bca6a322c", + "0x831aa917533d077da07c01417feaa1408846363ba2b8d22c6116bb858a95801547dd88b7d7fa1d2e3f0a02bdeb2e103d", + "0x96511b860b07c8a5ed773f36d4aa9d02fb5e7882753bf56303595bcb57e37ccc60288887eb83bef08c657ec261a021a2", + "0x921d2a3e7e9790f74068623de327443666b634c8443aba80120a45bba450df920b2374d96df1ce3fb1b06dd06f8cf6e3", + "0xaa74451d51fe82b4581ead8e506ec6cd881010f7e7dd51fc388eb9a557db5d3c6721f81c151d08ebd9c2591689fbc13e", + "0xa972bfbcf4033d5742d08716c927c442119bdae336bf5dff914523b285ccf31953da2733759aacaa246a9af9f698342c", + "0xad1fcd0cae0e76840194ce4150cb8a56ebed728ec9272035f52a799d480dfc85840a4d52d994a18b6edb31e79be6e8ad", + "0xa2c69fe1d36f235215432dad48d75887a44c99dfa0d78149acc74087da215a44bdb5f04e6eef88ff7eff80a5a7decc77", + "0xa94ab2af2b6ee1bc6e0d4e689ca45380d9fbd3c5a65b9bd249d266a4d4c07bf5d5f7ef2ae6000623aee64027892bf8fe", + "0x881ec1fc514e926cdc66480ac59e139148ff8a2a7895a49f0dff45910c90cdda97b66441a25f357d6dd2471cddd99bb3", + "0x884e6d3b894a914c8cef946a76d5a0c8351843b2bffa2d1e56c6b5b99c84104381dd1320c451d551c0b966f4086e60f9", + "0x817c6c10ce2677b9fc5223500322e2b880583254d0bb0d247d728f8716f5e05c9ff39f135854342a1afecd9fbdcf7c46", + "0xaaf4a9cb686a14619aa1fc1ac285dd3843ac3dd99f2b2331c711ec87b03491c02f49101046f3c5c538dc9f8dba2a0ac2", + "0x97ecea5ce53ca720b5d845227ae61d70269a2f53540089305c86af35f0898bfd57356e74a8a5e083fa6e1ea70080bd31", + "0xa22d811e1a20a75feac0157c418a4bfe745ccb5d29466ffa854dca03e395b6c3504a734341746b2846d76583a780b32e", + "0x940cbaa0d2b2db94ae96b6b9cf2deefbfd059e3e5745de9aec4a25f0991b9721e5cd37ef71c631575d1a0c280b01cd5b", + "0xae33cb4951191258a11044682de861bf8d92d90ce751b354932dd9f3913f542b6a0f8a4dc228b3cd9244ac32c4582832", + "0xa580df5e58c4274fe0f52ac2da1837e32f5c9db92be16c170187db4c358f43e5cfdda7c5911dcc79d77a5764e32325f5", + "0x81798178cb9d8affa424f8d3be67576ba94d108a28ccc01d330c51d5a63ca45bb8ca63a2f569b5c5fe1303cecd2d777f", + "0x89975b91b94c25c9c3660e4af4047a8bacf964783010820dbc91ff8281509379cb3b24c25080d5a01174dd9a049118d5", + "0xa7327fcb3710ed3273b048650bde40a32732ef40a7e58cf7f2f400979c177944c8bc54117ba6c80d5d4260801dddab79", + "0x92b475dc8cb5be4b90c482f122a51bcb3b6c70593817e7e2459c28ea54a7845c50272af38119406eaadb9bcb993368d0", + "0x9645173e9ecefc4f2eae8363504f7c0b81d85f8949a9f8a6c01f2d49e0a0764f4eacecf3e94016dd407fc14494fce9f9", + "0x9215fd8983d7de6ae94d35e6698226fc1454977ae58d42d294be9aad13ac821562ad37d5e7ee5cdfe6e87031d45cd197", + "0x810360a1c9b88a9e36f520ab5a1eb8bed93f52deefbe1312a69225c0a08edb10f87cc43b794aced9c74220cefcc57e7d", + "0xad7e810efd61ed4684aeda9ed8bb02fb9ae4b4b63fda8217d37012b94ff1b91c0087043bfa4e376f961fff030c729f3b", + "0x8b07c95c6a06db8738d10bb03ec11b89375c08e77f0cab7e672ce70b2685667ca19c7e1c8b092821d31108ea18dfd4c7", + "0x968825d025ded899ff7c57245250535c732836f7565eab1ae23ee7e513201d413c16e1ba3f5166e7ac6cf74de8ceef4f", + "0x908243370c5788200703ade8164943ad5f8c458219186432e74dbc9904a701ea307fd9b94976c866e6c58595fd891c4b", + "0x959969d16680bc535cdc6339e6186355d0d6c0d53d7bbfb411641b9bf4b770fd5f575beef5deec5c4fa4d192d455c350", + "0xad177f4f826a961adeac76da40e2d930748effff731756c797eddc4e5aa23c91f070fb69b19221748130b0961e68a6bb", + "0x82f8462bcc25448ef7e0739425378e9bb8a05e283ce54aae9dbebaf7a3469f57833c9171672ad43a79778366c72a5e37", + "0xa28fb275b1845706c2814d9638573e9bc32ff552ebaed761fe96fdbce70395891ca41c400ae438369264e31a2713b15f", + "0x8a9c613996b5e51dadb587a787253d6081ea446bf5c71096980bf6bd3c4b69905062a8e8a3792de2d2ece3b177a71089", + "0x8d5aefef9f60cb27c1db2c649221204dda48bb9bf8bf48f965741da051340e8e4cab88b9d15c69f3f84f4c854709f48a", + "0x93ebf2ca6ad85ab6deace6de1a458706285b31877b1b4d7dcb9d126b63047efaf8c06d580115ec9acee30c8a7212fa55", + "0xb3ee46ce189956ca298057fa8223b7fd1128cf52f39159a58bca03c71dd25161ac13f1472301f72aef3e1993fe1ab269", + "0xa24d7a8d066504fc3f5027ccb13120e2f22896860e02c45b5eba1dbd512d6a17c28f39155ea581619f9d33db43a96f92", + "0xae9ceacbfe12137db2c1a271e1b34b8f92e4816bad1b3b9b6feecc34df0f8b3b0f7ed0133acdf59c537d43d33fc8d429", + "0x83967e69bf2b361f86361bd705dce0e1ad26df06da6c52b48176fe8dfcbeb03c462c1a4c9e649eff8c654b18c876fdef", + "0x9148e6b814a7d779c19c31e33a068e97b597de1f8100513db3c581190513edc4d544801ce3dd2cf6b19e0cd6daedd28a", + "0x94ccdafc84920d320ed22de1e754adea072935d3c5f8c2d1378ebe53d140ea29853f056fb3fb1e375846061a038cc9bc", + "0xafb43348498c38b0fa5f971b8cdd3a62c844f0eb52bc33daf2f67850af0880fce84ecfb96201b308d9e6168a0d443ae3", + "0x86d5736520a83538d4cd058cc4b4e84213ed00ebd6e7af79ae787adc17a92ba5359e28ba6c91936d967b4b28d24c3070", + "0xb5210c1ff212c5b1e9ef9126e08fe120a41e386bb12c22266f7538c6d69c7fd8774f11c02b81fd4e88f9137b020801fe", + "0xb78cfd19f94d24e529d0f52e18ce6185cb238edc6bd43086270fd51dd99f664f43dd4c7d2fe506762fbd859028e13fcf", + "0xa6e7220598c554abdcc3fdc587b988617b32c7bb0f82c06205467dbedb58276cc07cae317a190f19d19078773f4c2bbb", + "0xb88862809487ee430368dccd85a5d72fa4d163ca4aad15c78800e19c1a95be2192719801e315d86cff7795e0544a77e4", + "0x87ecb13a03921296f8c42ceb252d04716f10e09c93962239fcaa0a7fef93f19ab3f2680bc406170108bc583e9ff2e721", + "0xa810cd473832b6581c36ec4cb403f2849357ba2d0b54df98ef3004b8a530c078032922a81d40158f5fb0043d56477f6e", + "0xa247b45dd85ca7fbb718b328f30a03f03c84aef2c583fbdc9fcc9eb8b52b34529e8c8f535505c10598b1b4dac3d7c647", + "0x96ee0b91313c68bac4aa9e065ce9e1d77e51ca4cff31d6a438718c58264dee87674bd97fc5c6b8008be709521e4fd008", + "0x837567ad073e42266951a9a54750919280a2ac835a73c158407c3a2b1904cf0d17b7195a393c71a18ad029cbd9cf79ee", + "0xa6a469c44b67ebf02196213e7a63ad0423aab9a6e54acc6fcbdbb915bc043586993454dc3cd9e4be8f27d67c1050879b", + "0x8712d380a843b08b7b294f1f06e2f11f4ad6bcc655fdde86a4d8bc739c23916f6fad2b902fe47d6212f03607907e9f0e", + "0x920adfb644b534789943cdae1bdd6e42828dda1696a440af2f54e6b97f4f97470a1c6ea9fa6a2705d8f04911d055acd1", + "0xa161c73adf584a0061e963b062f59d90faac65c9b3a936b837a10d817f02fcabfa748824607be45a183dd40f991fe83f", + "0x874f4ecd408c76e625ea50bc59c53c2d930ee25baf4b4eca2440bfbffb3b8bc294db579caa7c68629f4d9ec24187c1ba", + "0x8bff18087f112be7f4aa654e85c71fef70eee8ae480f61d0383ff6f5ab1a0508f966183bb3fc4d6f29cb7ca234aa50d3", + "0xb03b46a3ca3bc743a173cbc008f92ab1aedd7466b35a6d1ca11e894b9482ea9dc75f8d6db2ddd1add99bfbe7657518b7", + "0x8b4f3691403c3a8ad9e097f02d130769628feddfa8c2b3dfe8cff64e2bed7d6e5d192c1e2ba0ac348b8585e94acd5fa1", + "0xa0d9ca4a212301f97591bf65d5ef2b2664766b427c9dd342e23cb468426e6a56be66b1cb41fea1889ac5d11a8e3c50a5", + "0x8c93ed74188ca23b3df29e5396974b9cc135c91fdefdea6c0df694c8116410e93509559af55533a3776ac11b228d69b1", + "0x82dd331fb3f9e344ebdeeb557769b86a2cc8cc38f6c298d7572a33aea87c261afa9dbd898989139b9fc16bc1e880a099", + "0xa65faedf326bcfd8ef98a51410c78b021d39206704e8291cd1f09e096a66b9b0486be65ff185ca224c45918ac337ddeb", + "0xa188b37d363ac072a766fd5d6fa27df07363feff1342217b19e3c37385e42ffde55e4be8355aceaa2f267b6d66b4ac41", + "0x810fa3ba3e96d843e3bafd3f2995727f223d3567c8ba77d684c993ba1773c66551eb5009897c51b3fe9b37196984f5ec", + "0x87631537541852da323b4353af45a164f68b304d24c01183bf271782e11687f3fcf528394e1566c2a26cb527b3148e64", + "0xb721cb2b37b3c477a48e3cc0044167d51ff568a5fd2fb606e5aec7a267000f1ddc07d3db919926ae12761a8e017c767c", + "0x904dfad4ba2cc1f6e60d1b708438a70b1743b400164cd981f13c064b8328d5973987d4fb9cf894068f29d3deaf624dfb", + "0xa70491538893552c20939fae6be2f07bfa84d97e2534a6bbcc0f1729246b831103505e9f60e97a8fa7d2e6c1c2384579", + "0x8726cf1b26b41f443ff7485adcfddc39ace2e62f4d65dd0bb927d933e262b66f1a9b367ded5fbdd6f3b0932553ac1735", + "0xae8a11cfdf7aa54c08f80cb645e3339187ab3886babe9fae5239ba507bb3dd1c0d161ca474a2df081dcd3d63e8fe445e", + "0x92328719e97ce60e56110f30a00ac5d9c7a2baaf5f8d22355d53c1c77941e3a1fec7d1405e6fbf8959665fe2ba7a8cad", + "0x8d9d6255b65798d0018a8cccb0b6343efd41dc14ff2058d3eed9451ceaad681e4a0fa6af67b0a04318aa628024e5553d", + "0xb70209090055459296006742d946a513f0cba6d83a05249ee8e7a51052b29c0ca9722dc4af5f9816a1b7938a5dac7f79", + "0xaab7b766b9bf91786dfa801fcef6d575dc6f12b77ecc662eb4498f0312e54d0de9ea820e61508fc8aeee5ab5db529349", + "0xa8104b462337748b7f086a135d0c3f87f8e51b7165ca6611264b8fb639d9a2f519926cb311fa2055b5fadf03da70c678", + "0xb0d2460747d5d8b30fc6c6bd0a87cb343ddb05d90a51b465e8f67d499cfc5e3a9e365da05ae233bbee792cdf90ec67d5", + "0xaa55f5bf3815266b4a149f85ed18e451c93de9163575e3ec75dd610381cc0805bb0a4d7c4af5b1f94d10231255436d2c", + "0x8d4c6a1944ff94426151909eb5b99cfd92167b967dabe2bf3aa66bb3c26c449c13097de881b2cfc1bf052862c1ef7b03", + "0x8862296162451b9b6b77f03bf32e6df71325e8d7485cf3335d66fd48b74c2a8334c241db8263033724f26269ad95b395", + "0x901aa96deb26cda5d9321190ae6624d357a41729d72ef1abfd71bebf6139af6d690798daba53b7bc5923462115ff748a", + "0x96c195ec4992728a1eb38cdde42d89a7bce150db43adbc9e61e279ea839e538deec71326b618dd39c50d589f78fc0614", + "0xb6ff8b8aa0837b99a1a8b46fb37f20ad4aecc6a98381b1308697829a59b8442ffc748637a88cb30c9b1f0f28a926c4f6", + "0x8d807e3dca9e7bef277db1d2cfb372408dd587364e8048b304eff00eacde2c723bfc84be9b98553f83cba5c7b3cba248", + "0x8800c96adb0195c4fc5b24511450dee503c32bf47044f5e2e25bd6651f514d79a2dd9b01cd8c09f3c9d3859338490f57", + "0x89fe366096097e38ec28dd1148887112efa5306cc0c3da09562aafa56f4eb000bf46ff79bf0bdd270cbde6bf0e1c8957", + "0xaf409a90c2776e1e7e3760b2042507b8709e943424606e31e791d42f17873a2710797f5baaab4cc4a19998ef648556b0", + "0x8d761863c9b6edbd232d35ab853d944f5c950c2b643f84a1a1327ebb947290800710ff01dcfa26dc8e9828481240e8b1", + "0x90b95e9be1e55c463ed857c4e0617d6dc3674e99b6aa62ed33c8e79d6dfcf7d122f4f4cc2ee3e7c5a49170cb617d2e2e", + "0xb3ff381efefabc4db38cc4727432e0301949ae4f16f8d1dea9b4f4de611cf5a36d84290a0bef160dac4e1955e516b3b0", + "0xa8a84564b56a9003adcadb3565dc512239fc79572762cda7b5901a255bc82656bb9c01212ad33d6bef4fbbce18dacc87", + "0x90a081890364b222eef54bf0075417f85e340d2fec8b7375995f598aeb33f26b44143ebf56fca7d8b4ebb36b5747b0eb", + "0xade6ee49e1293224ddf2d8ab7f14bb5be6bc6284f60fd5b3a1e0cf147b73cff57cf19763b8a36c5083badc79c606b103", + "0xb2fa99806dd2fa3de09320b615a2570c416c9bcdb052e592b0aead748bbe407ec9475a3d932ae48b71c2627eb81986a6", + "0x91f3b7b73c8ccc9392542711c45fe6f236057e6efad587d661ad5cb4d6e88265f86b807bb1151736b1009ab74fd7acb4", + "0x8800e2a46af96696dfbdcbf2ca2918b3dcf28ad970170d2d1783b52b8d945a9167d052beeb55f56c126da7ffa7059baa", + "0x9862267a1311c385956b977c9aa08548c28d758d7ba82d43dbc3d0a0fd1b7a221d39e8399997fea9014ac509ff510ac4", + "0xb7d24f78886fd3e2d283e18d9ad5a25c1a904e7d9b9104bf47da469d74f34162e27e531380dbbe0a9d051e6ffd51d6e7", + "0xb0f445f9d143e28b9df36b0f2c052da87ee2ca374d9d0fbe2eff66ca6fe5fe0d2c1951b428d58f7314b7e74e45d445ea", + "0xb63fc4083eabb8437dafeb6a904120691dcb53ce2938b820bb553da0e1eecd476f72495aacb72600cf9cad18698fd3db", + "0xb9ffd8108eaebd582d665f8690fe8bb207fd85185e6dd9f0b355a09bac1bbff26e0fdb172bc0498df025414e88fe2eda", + "0x967ed453e1f1a4c5b7b6834cc9f75c13f6889edc0cc91dc445727e9f408487bbf05c337103f61397a10011dfbe25d61d", + "0x98ceb673aff36e1987d5521a3984a07079c3c6155974bb8b413e8ae1ce84095fe4f7862fba7aefa14753eb26f2a5805f", + "0x85f01d28603a8fdf6ce6a50cb5c44f8a36b95b91302e3f4cd95c108ce8f4d212e73aec1b8d936520d9226802a2bd9136", + "0x88118e9703200ca07910345fbb789e7a8f92bd80bbc79f0a9e040e8767d33df39f6eded403a9b636eabf9101e588482a", + "0x90833a51eef1b10ed74e8f9bbd6197e29c5292e469c854eed10b0da663e2bceb92539710b1858bbb21887bd538d28d89", + "0xb513b905ec19191167c6193067b5cfdf5a3d3828375360df1c7e2ced5815437dfd37f0c4c8f009d7fb29ff3c8793f560", + "0xb1b6d405d2d18f9554b8a358cc7e2d78a3b34269737d561992c8de83392ac9a2857be4bf15de5a6c74e0c9d0f31f393c", + "0xb828bd3e452b797323b798186607849f85d1fb20c616833c0619360dfd6b3e3aa000fd09dafe4b62d74abc41072ff1a9", + "0x8efde67d0cca56bb2c464731879c9ac46a52e75bac702a63200a5e192b4f81c641f855ca6747752b84fe469cb7113b6c", + "0xb2762ba1c89ac3c9a983c242e4d1c2610ff0528585ed5c0dfc8a2c0253551142af9b59f43158e8915a1da7cc26b9df67", + "0x8a3f1157fb820d1497ef6b25cd70b7e16bb8b961b0063ad340d82a79ee76eb2359ca9e15e6d42987ed7f154f5eeaa2da", + "0xa75e29f29d38f09c879f971c11beb5368affa084313474a5ecafa2896180b9e47ea1995c2733ec46f421e395a1d9cffe", + "0x8e8c3dd3e7196ef0b4996b531ec79e4a1f211db5d5635e48ceb80ff7568b2ff587e845f97ee703bb23a60945ad64314a", + "0x8e7f32f4a3e3c584af5e3d406924a0aa34024c42eca74ef6cc2a358fd3c9efaf25f1c03aa1e66bb94b023a2ee2a1cace", + "0xab7dce05d59c10a84feb524fcb62478906b3fa045135b23afbede3bb32e0c678d8ebe59feabccb5c8f3550ea76cae44b", + "0xb38bb4b44d827f6fd3bd34e31f9186c59e312dbfadd4a7a88e588da10146a78b1f8716c91ad8b806beb8da65cab80c4c", + "0x9490ce9442bbbd05438c7f5c4dea789f74a7e92b1886a730544b55ba377840740a3ae4f2f146ee73f47c9278b0e233bc", + "0x83c003fab22a7178eed1a668e0f65d4fe38ef3900044e9ec63070c23f2827d36a1e73e5c2b883ec6a2afe2450171b3b3", + "0x9982f02405978ddc4fca9063ebbdb152f524c84e79398955e66fe51bc7c1660ec1afc3a86ec49f58d7b7dde03505731c", + "0xab337bd83ccdd2322088ffa8d005f450ced6b35790f37ab4534313315ee84312adc25e99cce052863a8bedee991729ed", + "0x8312ce4bec94366d88f16127a17419ef64285cd5bf9e5eda010319b48085966ed1252ed2f5a9fd3e0259b91bb65f1827", + "0xa60d5a6327c4041b0c00a1aa2f0af056520f83c9ce9d9ccd03a0bd4d9e6a1511f26a422ea86bd858a1f77438adf07e6c", + "0xb84a0a0b030bdad83cf5202aa9afe58c9820e52483ab41f835f8c582c129ee3f34aa096d11c1cd922eda02ea1196a882", + "0x8077d105317f4a8a8f1aadeb05e0722bb55f11abcb490c36c0904401107eb3372875b0ac233144829e734f0c538d8c1d", + "0x9202503bd29a6ec198823a1e4e098f9cfe359ed51eb5174d1ca41368821bfeebcbd49debfd02952c41359d1c7c06d2b1", + "0xabc28c155e09365cb77ffead8dc8f602335ef93b2f44e4ef767ce8fc8ef9dd707400f3a722e92776c2e0b40192c06354", + "0xb0f6d1442533ca45c9399e0a63a11f85ff288d242cea6cb3b68c02e77bd7d158047cae2d25b3bcd9606f8f66d9b32855", + "0xb01c3d56a0db84dc94575f4b6ee2de4beca3230e86bed63e2066beb22768b0a8efb08ebaf8ac3dedb5fe46708b084807", + "0x8c8634b0432159f66feaabb165842d1c8ac378f79565b1b90c381aa8450eb4231c3dad11ec9317b9fc2b155c3a771e32", + "0x8e67f623d69ecd430c9ee0888520b6038f13a2b6140525b056dc0951f0cfed2822e62cf11d952a483107c5c5acac4826", + "0x9590bb1cba816dd6acd5ac5fba5142c0a19d53573e422c74005e0bcf34993a8138c83124cad35a3df65879dba6134edd", + "0x801cd96cde0749021a253027118d3ea135f3fcdbe895db08a6c145641f95ebd368dd6a1568d995e1d0084146aebe224a", + "0x848b5d196427f6fc1f762ee3d36e832b64a76ec1033cfedc8b985dea93932a7892b8ef1035c653fb9dcd9ab2d9a44ac8", + "0xa1017eb83d5c4e2477e7bd2241b2b98c4951a3b391081cae7d75965cadc1acaec755cf350f1f3d29741b0828e36fedea", + "0x8d6d2785e30f3c29aad17bd677914a752f831e96d46caf54446d967cb2432be2c849e26f0d193a60bee161ea5c6fe90a", + "0x935c0ba4290d4595428e034b5c8001cbd400040d89ab00861108e8f8f4af4258e41f34a7e6b93b04bc253d3b9ffc13bf", + "0xaac02257146246998477921cef2e9892228590d323b839f3e64ea893b991b463bc2f47e1e5092ddb47e70b2f5bce7622", + "0xb921fde9412970a5d4c9a908ae8ce65861d06c7679af577cf0ad0d5344c421166986bee471fd6a6cecb7d591f06ec985", + "0x8ef4c37487b139d6756003060600bb6ebac7ea810b9c4364fc978e842f13ac196d1264fbe5af60d76ff6d9203d8e7d3f", + "0x94b65e14022b5cf6a9b95f94be5ace2711957c96f4211c3f7bb36206bd39cfbd0ea82186cab5ad0577a23214a5c86e9e", + "0xa31c166d2a2ca1d5a75a5920fef7532681f62191a50d8555fdaa63ba4581c3391cc94a536fc09aac89f64eafceec3f90", + "0x919a8cc128de01e9e10f5d83b08b52293fdd41bde2b5ae070f3d95842d4a16e5331cf2f3d61c765570c8022403610fa4", + "0xb23d6f8331eef100152d60483cfa14232a85ee712c8538c9b6417a5a7c5b353c2ac401390c6c215cb101f5cee6b5f43e", + "0xab357160c08a18319510a571eafff154298ce1020de8e1dc6138a09fcb0fcbcdd8359f7e9386bda00b7b9cdea745ffdc", + "0xab55079aea34afa5c0bd1124b9cdfe01f325b402fdfa017301bf87812eaa811ea5798c3aaf818074d420d1c782b10ada", + "0xade616010dc5009e7fc4f8d8b00dc716686a5fa0a7816ad9e503e15839d3b909b69d9dd929b7575376434ffec0d2bea8", + "0x863997b97ed46898a8a014599508fa3079f414b1f4a0c4fdc6d74ae8b444afa350f327f8bfc2a85d27f9e2d049c50135", + "0x8d602ff596334efd4925549ed95f2aa762b0629189f0df6dbb162581657cf3ea6863cd2287b4d9c8ad52813d87fcd235", + "0xb70f68c596dcdeed92ad5c6c348578b26862a51eb5364237b1221e840c47a8702f0fbc56eb520a22c0eed99795d3903e", + "0x9628088f8e0853cefadee305a8bf47fa990c50fa96a82511bbe6e5dc81ef4b794e7918a109070f92fc8384d77ace226f", + "0x97e26a46e068b605ce96007197ecd943c9a23881862f4797a12a3e96ba2b8d07806ad9e2a0646796b1889c6b7d75188c", + "0xb1edf467c068cc163e2d6413cc22b16751e78b3312fe47b7ea82b08a1206d64415b2c8f2a677fa89171e82cc49797150", + "0xa44d15ef18745b251429703e3cab188420e2d974de07251501799b016617f9630643fcd06f895634d8ecdd579e1bf000", + "0xabd126df3917ba48c618ee4dbdf87df506193462f792874439043fa1b844466f6f4e0ff2e42516e63b5b23c0892b2695", + "0xa2a67f57c4aa3c2aa1eeddbfd5009a89c26c2ce8fa3c96a64626aba19514beb125f27df8559506f737de3eae0f1fc18f", + "0xa633e0132197e6038197304b296ab171f1d8e0d0f34dcf66fe9146ac385b0239232a8470b9205a4802ab432389f4836d", + "0xa914b3a28509a906c3821463b936455d58ff45dcbe158922f9efb2037f2eb0ce8e92532d29b5d5a3fcd0d23fa773f272", + "0xa0e1412ce4505daf1a2e59ce4f0fc0e0023e335b50d2b204422f57cd65744cc7a8ed35d5ef131a42c70b27111d3115b7", + "0xa2339e2f2b6072e88816224fdd612c04d64e7967a492b9f8829db15367f565745325d361fd0607b0def1be384d010d9e", + "0xa7309fc41203cb99382e8193a1dcf03ac190a7ce04835304eb7e341d78634e83ea47cb15b885601956736d04cdfcaa01", + "0x81f3ccd6c7f5b39e4e873365f8c37b214e8ab122d04a606fbb7339dc3298c427e922ec7418002561d4106505b5c399ee", + "0x92c121cf914ca549130e352eb297872a63200e99b148d88fbc9506ad882bec9d0203d65f280fb5b0ba92e336b7f932e8", + "0xa4b330cf3f064f5b131578626ad7043ce2a433b6f175feb0b52d36134a454ca219373fd30d5e5796410e005b69082e47", + "0x86fe5774112403ad83f9c55d58317eeb17ad8e1176d9f2f69c2afb7ed83bc718ed4e0245ceab4b377f5f062dcd4c00e7", + "0x809d152a7e2654c7fd175b57f7928365a521be92e1ed06c05188a95864ddb25f7cab4c71db7d61bbf4cae46f3a1d96ce", + "0xb82d663e55c2a5ada7e169e9b1a87bc1c0177baf1ec1c96559b4cb1c5214ce1ddf2ab8d345014cab6402f3774235cf5a", + "0x86580af86df1bd2c385adb8f9a079e925981b7184db66fc5fe5b14cddb82e7d836b06eaeef14924ac529487b23dae111", + "0xb5f5f4c5c94944ecc804df6ab8687d64e27d988cbfeae1ba7394e0f6adbf778c5881ead7cd8082dd7d68542b9bb4ecd5", + "0xa6016916146c2685c46e8fdd24186394e2d5496e77e08c0c6a709d4cd7dfa97f1efcef94922b89196819076a91ad37b5", + "0xb778e7367ded3b6eab53d5fc257f7a87e8faf74a593900f2f517220add2125be3f6142022660d8181df8d164ad9441ce", + "0x8581b2d36abe6f553add4d24be761bec1b8efaa2929519114346615380b3c55b59e6ad86990e312f7e234d0203bdf59b", + "0x9917e74fd45c3f71a829ff5498a7f6b5599b48c098dda2339bf04352bfc7f368ccf1a407f5835901240e76452ae807d7", + "0xafd196ce6f9335069138fd2e3d133134da253978b4ce373152c0f26affe77a336505787594022e610f8feb722f7cc1fb", + "0xa477491a1562e329764645e8f24d8e228e5ef28c9f74c6b5b3abc4b6a562c15ffb0f680d372aed04d9e1bf944dece7be", + "0x9767440d58c57d3077319d3a330e5322b9ba16981ec74a5a14d53462eab59ae7fd2b14025bfc63b268862094acb444e6", + "0x80986d921be3513ef69264423f351a61cb48390c1be8673aee0f089076086aaebea7ebe268fd0aa7182695606116f679", + "0xa9554c5c921c07b450ee04e34ec58e054ac1541b26ce2ce5a393367a97348ba0089f53db6660ad76b60278b66fd12e3e", + "0x95097e7d2999b3e84bf052c775581cf361325325f4a50192521d8f4693c830bed667d88f482dc1e3f833aa2bd22d2cbf", + "0x9014c91d0f85aefd28436b5228c12f6353c055a9326c7efbf5e071e089e2ee7c070fcbc84c5fafc336cbb8fa6fec1ca1", + "0x90f57ba36ee1066b55d37384942d8b57ae00f3cf9a3c1d6a3dfee1d1af42d4b5fa9baeb0cd7e46687d1d6d090ddb931d", + "0x8e4b1db12fd760a17214c9e47f1fce6e43c0dbb4589a827a13ac61aaae93759345697bb438a00edab92e0b7b62414683", + "0x8022a959a513cdc0e9c705e0fc04eafd05ff37c867ae0f31f6d01cddd5df86138a426cab2ff0ac8ff03a62e20f7e8f51", + "0x914e9a38829834c7360443b8ed86137e6f936389488eccf05b4b4db7c9425611705076ecb3f27105d24b85c852be7511", + "0x957fb10783e2bd0db1ba66b18e794df710bc3b2b05776be146fa5863c15b1ebdd39747b1a95d9564e1772cdfc4f37b8a", + "0xb6307028444daed8ed785ac9d0de76bc3fe23ff2cc7e48102553613bbfb5afe0ebe45e4212a27021c8eb870721e62a1f", + "0x8f76143597777d940b15a01b39c5e1b045464d146d9a30a6abe8b5d3907250e6c7f858ff2308f8591e8b0a7b3f3c568a", + "0x96163138ac0ce5fd00ae9a289648fd9300a0ca0f63a88481d703ecd281c06a52a3b5178e849e331f9c85ca4ba398f4cc", + "0xa63ef47c3e18245b0482596a09f488a716df3cbd0f9e5cfabed0d742843e65db8961c556f45f49762f3a6ac8b627b3ef", + "0x8cb595466552e7c4d42909f232d4063e0a663a8ef6f6c9b7ce3a0542b2459cde04e0e54c7623d404acb5b82775ac04f6", + "0xb47fe69960eb45f399368807cff16d941a5a4ebad1f5ec46e3dc8a2e4d598a7e6114d8f0ca791e9720fd786070524e2b", + "0x89eb5ff83eea9df490e5beca1a1fbbbbcf7184a37e2c8c91ede7a1e654c81e8cd41eceece4042ea7918a4f4646b67fd6", + "0xa84f5d155ed08b9054eecb15f689ba81e44589e6e7207a99790c598962837ca99ec12344105b16641ca91165672f7153", + "0xa6cc8f25c2d5b2d2f220ec359e6a37a52b95fa6af6e173c65e7cd55299eff4aa9e6d9e6f2769e6459313f1f2aecb0fab", + "0xafcde944411f017a9f7979755294981e941cc41f03df5e10522ef7c7505e5f1babdd67b3bf5258e8623150062eb41d9b", + "0x8fab39f39c0f40182fcd996ade2012643fe7731808afbc53f9b26900b4d4d1f0f5312d9d40b3df8baa4739970a49c732", + "0xae193af9726da0ebe7df1f9ee1c4846a5b2a7621403baf8e66c66b60f523e719c30c6b4f897bb14b27d3ff3da8392eeb", + "0x8ac5adb82d852eba255764029f42e6da92dcdd0e224d387d1ef94174038db9709ac558d90d7e7c57ad4ce7f89bbfc38c", + "0xa2066b3458fdf678ee487a55dd5bfb74fde03b54620cb0e25412a89ee28ad0d685e309a51e3e4694be2fa6f1593a344c", + "0x88d031745dd0ae07d61a15b594be5d4b2e2a29e715d081649ad63605e3404b0c3a5353f0fd9fad9c05c18e93ce674fa1", + "0x8283cfb0ef743a043f2b77ecaeba3005e2ca50435585b5dd24777ee6bce12332f85e21b446b536da38508807f0f07563", + "0xb376de22d5f6b0af0b59f7d9764561f4244cf8ffe22890ecd3dcf2ff1832130c9b821e068c9d8773136f4796721e5963", + "0xae3afc50c764f406353965363840bf28ee85e7064eb9d5f0bb3c31c64ab10f48c853e942ee2c9b51bae59651eaa08c2f", + "0x948b204d103917461a01a6c57a88f2d66b476eae5b00be20ec8c747650e864bc8a83aee0aff59cb7584b7a3387e0ee48", + "0x81ab098a082b07f896c5ffd1e4446cb7fb44804cbbf38d125208b233fc82f8ec9a6a8d8dd1c9a1162dc28ffeec0dde50", + "0xa149c6f1312821ced2969268789a3151bdda213451760b397139a028da609c4134ac083169feb0ee423a0acafd10eceb", + "0xb0ac9e27a5dadaf523010f730b28f0ebac01f460d3bbbe277dc9d44218abb5686f4fac89ae462682fef9edbba663520a", + "0x8d0e0073cca273daaaa61b6fc54bfe5a009bc3e20ae820f6c93ba77b19eca517d457e948a2de5e77678e4241807157cb", + "0xad61d3a2edf7c7533a04964b97499503fd8374ca64286dba80465e68fe932e96749b476f458c6fc57cb1a7ca85764d11", + "0x90eb5e121ae46bc01a30881eaa556f46bd8457a4e80787cf634aab355082de34ac57d7f497446468225f7721e68e2a47", + "0x8cdac557de7c42d1f3780e33dec1b81889f6352279be81c65566cdd4952d4c15d79e656cbd46035ab090b385e90245ef", + "0x82b67e61b88b84f4f4d4f65df37b3e3dcf8ec91ea1b5c008fdccd52da643adbe6468a1cfdb999e87d195afe2883a3b46", + "0x8503b467e8f5d6048a4a9b78496c58493a462852cab54a70594ae3fd064cfd0deb4b8f336a262155d9fedcaa67d2f6fd", + "0x8db56c5ac763a57b6ce6832930c57117058e3e5a81532b7d19346346205e2ec614eb1a2ee836ef621de50a7bc9b7f040", + "0xad344699198f3c6e8c0a3470f92aaffc805b76266734414c298e10b5b3797ca53578de7ccb2f458f5e0448203f55282b", + "0x80602032c43c9e2a09154cc88b83238343b7a139f566d64cb482d87436b288a98f1ea244fd3bff8da3c398686a900c14", + "0xa6385bd50ecd548cfb37174cdbb89e10025b5cadaf3cff164c95d7aef5a33e3d6a9bf0c681b9e11db9ef54ebeee2a0c1", + "0xabf2d95f4aa34b0581eb9257a0cc8462b2213941a5deb8ba014283293e8b36613951b61261cc67bbd09526a54cbbff76", + "0xa3d5de52f48df72c289ff713e445991f142390798cd42bd9d9dbefaee4af4f5faf09042d126b975cf6b98711c3072553", + "0x8e627302ff3d686cff8872a1b7c2a57b35f45bf2fc9aa42b049d8b4d6996a662b8e7cbac6597f0cb79b0cc4e29fbf133", + "0x8510702e101b39a1efbf4e504e6123540c34b5689645e70d0bac1ecc1baf47d86c05cef6c4317a4e99b4edaeb53f2d00", + "0xaa173f0ecbcc6088f878f8726d317748c81ebf501bba461f163b55d66099b191ec7c55f7702f351a9c8eb42cfa3280e2", + "0xb560a697eafab695bcef1416648a0a664a71e311ecbe5823ae903bd0ed2057b9d7574b9a86d3fe22aa3e6ddce38ea513", + "0x8df6304a3d9cf40100f3f687575419c998cd77e5cc27d579cf4f8e98642de3609af384a0337d145dd7c5635172d26a71", + "0x8105c7f3e4d30a29151849673853b457c1885c186c132d0a98e63096c3774bc9deb956cf957367e633d0913680bda307", + "0x95373fc22c0917c3c2044ac688c4f29a63ed858a45c0d6d2d0fe97afd6f532dcb648670594290c1c89010ecc69259bef", + "0x8c2fae9bcadab341f49b55230310df93cac46be42d4caa0d42e45104148a91e527af1b4209c0d972448162aed28fab64", + "0xb05a77baab70683f76209626eaefdda2d36a0b66c780a20142d23c55bd479ddd4ad95b24579384b6cf62c8eb4c92d021", + "0x8e6bc6a7ea2755b4aaa19c1c1dee93811fcde514f03485fdc3252f0ab7f032c315614f6336e57cea25dcfb8fb6084eeb", + "0xb656a27d06aade55eadae2ad2a1059198918ea6cc3fd22c0ed881294d34d5ac7b5e4700cc24350e27d76646263b223aa", + "0xa296469f24f6f56da92d713afcd4dd606e7da1f79dc4e434593c53695847eefc81c7c446486c4b3b8c8d00c90c166f14", + "0x87a326f57713ac2c9dffeb3af44b9f3c613a8f952676fc46343299122b47ee0f8d792abaa4b5db6451ced5dd153aabd0", + "0xb689e554ba9293b9c1f6344a3c8fcb6951d9f9eac4a2e2df13de021aade7c186be27500e81388e5b8bcab4c80f220a31", + "0x87ae0aa0aa48eac53d1ca5a7b93917de12db9e40ceabf8fdb40884ae771cfdf095411deef7c9f821af0b7070454a2608", + "0xa71ffa7eae8ace94e6c3581d4cb2ad25d48cbd27edc9ec45baa2c8eb932a4773c3272b2ffaf077b40f76942a1f3af7f2", + "0x94c218c91a9b73da6b7a495b3728f3028df8ad9133312fc0c03e8c5253b7ccb83ed14688fd4602e2fd41f29a0bc698bd", + "0xae1e77b90ca33728af07a4c03fb2ef71cd92e2618e7bf8ed4d785ce90097fc4866c29999eb84a6cf1819d75285a03af2", + "0xb7a5945b277dab9993cf761e838b0ac6eaa903d7111fca79f9fde3d4285af7a89bf6634a71909d095d7619d913972c9c", + "0x8c43b37be02f39b22029b20aca31bff661abce4471dca88aa3bddefd9c92304a088b2dfc8c4795acc301ca3160656af2", + "0xb32e5d0fba024554bd5fe8a793ebe8003335ddd7f585876df2048dcf759a01285fecb53daae4950ba57f3a282a4d8495", + "0x85ea7fd5e10c7b659df5289b2978b2c89e244f269e061b9a15fcab7983fc1962b63546e82d5731c97ec74b6804be63ef", + "0x96b89f39181141a7e32986ac02d7586088c5a9662cec39843f397f3178714d02f929af70630c12cbaba0268f8ba2d4fa", + "0x929ab1a2a009b1eb37a2817c89696a06426529ebe3f306c586ab717bd34c35a53eca2d7ddcdef36117872db660024af9", + "0xa696dccf439e9ca41511e16bf3042d7ec0e2f86c099e4fc8879d778a5ea79e33aa7ce96b23dc4332b7ba26859d8e674d", + "0xa8fe69a678f9a194b8670a41e941f0460f6e2dbc60470ab4d6ae2679cc9c6ce2c3a39df2303bee486dbfde6844e6b31a", + "0x95f58f5c82de2f2a927ca99bf63c9fc02e9030c7e46d0bf6b67fe83a448d0ae1c99541b59caf0e1ccab8326231af09a5", + "0xa57badb2c56ca2c45953bd569caf22968f76ed46b9bac389163d6fe22a715c83d5e94ae8759b0e6e8c2f27bff7748f3f", + "0x868726fd49963b24acb5333364dffea147e98f33aa19c7919dc9aca0fd26661cfaded74ede7418a5fadbe7f5ae67b67b", + "0xa8d8550dcc64d9f1dd7bcdab236c4122f2b65ea404bb483256d712c7518f08bb028ff8801f1da6aed6cbfc5c7062e33b", + "0x97e25a87dae23155809476232178538d4bc05d4ff0882916eb29ae515f2a62bfce73083466cc0010ca956aca200aeacc", + "0xb4ea26be3f4bd04aa82d7c4b0913b97bcdf5e88b76c57eb1a336cbd0a3eb29de751e1bc47c0e8258adec3f17426d0c71", + "0x99ee555a4d9b3cf2eb420b2af8e3bc99046880536116d0ce7193464ac40685ef14e0e3c442f604e32f8338cb0ef92558", + "0x8c64efa1da63cd08f319103c5c7a761221080e74227bbc58b8fb35d08aa42078810d7af3e60446cbaff160c319535648", + "0x8d9fd88040076c28420e3395cbdfea402e4077a3808a97b7939d49ecbcf1418fe50a0460e1c1b22ac3f6e7771d65169a", + "0xae3c19882d7a9875d439265a0c7003c8d410367627d21575a864b9cb4918de7dbdb58a364af40c5e045f3df40f95d337", + "0xb4f7bfacab7b2cafe393f1322d6dcc6f21ffe69cd31edc8db18c06f1a2b512c27bd0618091fd207ba8df1808e9d45914", + "0x94f134acd0007c623fb7934bcb65ef853313eb283a889a3ffa79a37a5c8f3665f3d5b4876bc66223610c21dc9b919d37", + "0xaa15f74051171daacdc1f1093d3f8e2d13da2833624b80a934afec86fc02208b8f55d24b7d66076444e7633f46375c6a", + "0xa32d6bb47ef9c836d9d2371807bafbbbbb1ae719530c19d6013f1d1f813c49a60e4fa51d83693586cba3a840b23c0404", + "0xb61b3599145ea8680011aa2366dc511a358b7d67672d5b0c5be6db03b0efb8ca5a8294cf220ea7409621f1664e00e631", + "0x859cafc3ee90b7ececa1ed8ef2b2fc17567126ff10ca712d5ffdd16aa411a5a7d8d32c9cab1fbf63e87dce1c6e2f5f53", + "0xa2fef1b0b2874387010e9ae425f3a9676d01a095d017493648bcdf3b31304b087ccddb5cf76abc4e1548b88919663b6b", + "0x939e18c73befc1ba2932a65ede34c70e4b91e74cc2129d57ace43ed2b3af2a9cc22a40fbf50d79a63681b6d98852866d", + "0xb3b4259d37b1b14aee5b676c9a0dd2d7f679ab95c120cb5f09f9fbf10b0a920cb613655ddb7b9e2ba5af4a221f31303c", + "0x997255fe51aaca6e5a9cb3359bcbf25b2bb9e30649bbd53a8a7c556df07e441c4e27328b38934f09c09d9500b5fabf66", + "0xabb91be2a2d860fd662ed4f1c6edeefd4da8dc10e79251cf87f06029906e7f0be9b486462718f0525d5e049472692cb7", + "0xb2398e593bf340a15f7801e1d1fbda69d93f2a32a889ec7c6ae5e8a37567ac3e5227213c1392ee86cfb3b56ec2787839", + "0x8ddf10ccdd72922bed36829a36073a460c2118fc7a56ff9c1ac72581c799b15c762cb56cb78e3d118bb9f6a7e56cb25e", + "0x93e6bc0a4708d16387cacd44cf59363b994dc67d7ada7b6d6dbd831c606d975247541b42b2a309f814c1bfe205681fc6", + "0xb93fc35c05998cffda2978e12e75812122831523041f10d52f810d34ff71944979054b04de0117e81ddf5b0b4b3e13c0", + "0x92221631c44d60d68c6bc7b287509f37ee44cbe5fdb6935cee36b58b17c7325098f98f7910d2c3ca5dc885ad1d6dabc7", + "0xa230124424a57fad3b1671f404a94d7c05f4c67b7a8fbacfccea28887b78d7c1ed40b92a58348e4d61328891cd2f6cee", + "0xa6a230edb8518a0f49d7231bc3e0bceb5c2ac427f045819f8584ba6f3ae3d63ed107a9a62aad543d7e1fcf1f20605706", + "0x845be1fe94223c7f1f97d74c49d682472585d8f772762baad8a9d341d9c3015534cc83d102113c51a9dea2ab10d8d27b", + "0xb44262515e34f2db597c8128c7614d33858740310a49cdbdf9c8677c5343884b42c1292759f55b8b4abc4c86e4728033", + "0x805592e4a3cd07c1844bc23783408310accfdb769cca882ad4d07d608e590a288b7370c2cb327f5336e72b7083a0e30f", + "0x95153e8b1140df34ee864f4ca601cb873cdd3efa634af0c4093fbaede36f51b55571ab271e6a133020cd34db8411241f", + "0x82878c1285cfa5ea1d32175c9401f3cc99f6bb224d622d3fd98cc7b0a27372f13f7ab463ce3a33ec96f9be38dbe2dfe3", + "0xb7588748f55783077c27fc47d33e20c5c0f5a53fc0ac10194c003aa09b9f055d08ec971effa4b7f760553997a56967b3", + "0xb36b4de6d1883b6951f59cfae381581f9c6352fcfcf1524fccdab1571a20f80441d9152dc6b48bcbbf00371337ca0bd5", + "0x89c5523f2574e1c340a955cbed9c2f7b5fbceb260cb1133160dabb7d41c2f613ec3f6e74bbfab3c4a0a6f0626dbe068f", + "0xa52f58cc39f968a9813b1a8ddc4e83f4219e4dd82c7aa1dd083bea7edf967151d635aa9597457f879771759b876774e4", + "0x8300a67c2e2e123f89704abfde095463045dbd97e20d4c1157bab35e9e1d3d18f1f4aaba9cbe6aa2d544e92578eaa1b6", + "0xac6a7f2918768eb6a43df9d3a8a04f8f72ee52f2e91c064c1c7d75cad1a3e83e5aba9fe55bb94f818099ac91ccf2e961", + "0x8d64a2b0991cf164e29835c8ddef6069993a71ec2a7de8157bbfa2e00f6367be646ed74cbaf524f0e9fe13fb09fa15fd", + "0x8b2ffe5a545f9f680b49d0a9797a4a11700a2e2e348c34a7a985fc278f0f12def6e06710f40f9d48e4b7fbb71e072229", + "0x8ab8f71cd337fa19178924e961958653abf7a598e3f022138b55c228440a2bac4176cea3aea393549c03cd38a13eb3fc", + "0x8419d28318c19ea4a179b7abb43669fe96347426ef3ac06b158d79c0acf777a09e8e770c2fb10e14b3a0421705990b23", + "0x8bacdac310e1e49660359d0a7a17fe3d334eb820e61ae25e84cb52f863a2f74cbe89c2e9fc3283745d93a99b79132354", + "0xb57ace3fa2b9f6b2db60c0d861ace7d7e657c5d35d992588aeed588c6ce3a80b6f0d49f8a26607f0b17167ab21b675e4", + "0x83e265cde477f2ecc164f49ddc7fb255bb05ff6adc347408353b7336dc3a14fdedc86d5a7fb23f36b8423248a7a67ed1", + "0xa60ada971f9f2d79d436de5d3d045f5ab05308cae3098acaf5521115134b2a40d664828bb89895840db7f7fb499edbc5", + "0xa63eea12efd89b62d3952bf0542a73890b104dd1d7ff360d4755ebfa148fd62de668edac9eeb20507967ea37fb220202", + "0xa0275767a270289adc991cc4571eff205b58ad6d3e93778ddbf95b75146d82517e8921bd0d0564e5b75fa0ccdab8e624", + "0xb9b03fd3bf07201ba3a039176a965d736b4ef7912dd9e9bf69fe1b57c330a6aa170e5521fe8be62505f3af81b41d7806", + "0xa95f640e26fb1106ced1729d6053e41a16e4896acac54992279ff873e5a969aad1dcfa10311e28b8f409ac1dab7f03bb", + "0xb144778921742418053cb3c70516c63162c187f00db2062193bb2c14031075dbe055d020cde761b26e8c58d0ea6df2c1", + "0x8432fbb799e0435ef428d4fefc309a05dd589bce74d7a87faf659823e8c9ed51d3e42603d878e80f439a38be4321c2fa", + "0xb08ddef14e42d4fd5d8bf39feb7485848f0060d43b51ed5bdda39c05fe154fb111d29719ee61a23c392141358c0cfcff", + "0x8ae3c5329a5e025b86b5370e06f5e61177df4bda075856fade20a17bfef79c92f54ed495f310130021ba94fb7c33632b", + "0x92b6d3c9444100b4d7391febfc1dddaa224651677c3695c47a289a40d7a96d200b83b64e6d9df51f534564f272a2c6c6", + "0xb432bc2a3f93d28b5e506d68527f1efeb2e2570f6be0794576e2a6ef9138926fdad8dd2eabfa979b79ab7266370e86bc", + "0x8bc315eacedbcfc462ece66a29662ca3dcd451f83de5c7626ef8712c196208fb3d8a0faf80b2e80384f0dd9772f61a23", + "0xa72375b797283f0f4266dec188678e2b2c060dfed5880fc6bb0c996b06e91a5343ea2b695adaab0a6fd183b040b46b56", + "0xa43445036fbaa414621918d6a897d3692fdae7b2961d87e2a03741360e45ebb19fcb1703d23f1e15bb1e2babcafc56ac", + "0xb9636b2ffe305e63a1a84bd44fb402442b1799bd5272638287aa87ca548649b23ce8ce7f67be077caed6aa2dbc454b78", + "0x99a30bf0921d854c282b83d438a79f615424f28c2f99d26a05201c93d10378ab2cd94a792b571ddae5d4e0c0013f4006", + "0x8648e3c2f93d70b392443be116b48a863e4b75991bab5db656a4ef3c1e7f645e8d536771dfe4e8d1ceda3be8d32978b0", + "0xab50dc9e6924c1d2e9d2e335b2d679fc7d1a7632e84964d3bac0c9fe57e85aa5906ec2e7b0399d98ddd022e9b19b5904", + "0xab729328d98d295f8f3272afaf5d8345ff54d58ff9884da14f17ecbdb7371857fdf2f3ef58080054e9874cc919b46224", + "0x83fa5da7592bd451cad3ad7702b4006332b3aae23beab4c4cb887fa6348317d234bf62a359e665b28818e5410c278a09", + "0x8bdbff566ae9d368f114858ef1f009439b3e9f4649f73efa946e678d6c781d52c69af195df0a68170f5f191b2eac286b", + "0x91245e59b4425fd4edb2a61d0d47c1ccc83d3ced8180de34887b9655b5dcda033d48cde0bdc3b7de846d246c053a02e8", + "0xa2cb00721e68f1cad8933947456f07144dc69653f96ceed845bd577d599521ba99cdc02421118971d56d7603ed118cbf", + "0xaf8cd66d303e808b22ec57860dd909ca64c27ec2c60e26ffecfdc1179d8762ffd2739d87b43959496e9fee4108df71df", + "0x9954136812dffcd5d3f167a500e7ab339c15cfc9b3398d83f64b0daa3dd5b9a851204f424a3493b4e326d3de81e50a62", + "0x93252254d12511955f1aa464883ad0da793f84d900fea83e1df8bca0f2f4cf5b5f9acbaec06a24160d33f908ab5fea38", + "0x997cb55c26996586ba436a95566bd535e9c22452ca5d2a0ded2bd175376557fa895f9f4def4519241ff386a063f2e526", + "0xa12c78ad451e0ac911260ade2927a768b50cb4125343025d43474e7f465cdc446e9f52a84609c5e7e87ae6c9b3f56cda", + "0xa789d4ca55cbba327086563831b34487d63d0980ba8cf55197c016702ed6da9b102b1f0709ce3da3c53ff925793a3d73", + "0xa5d76acbb76741ce85be0e655b99baa04f7f587347947c0a30d27f8a49ae78cce06e1cde770a8b618d3db402be1c0c4b", + "0x873c0366668c8faddb0eb7c86f485718d65f8c4734020f1a18efd5fa123d3ea8a990977fe13592cd01d17e60809cb5ff", + "0xb659b71fe70f37573ff7c5970cc095a1dc0da3973979778f80a71a347ef25ad5746b2b9608bad4ab9a4a53a4d7df42d7", + "0xa34cbe05888e5e5f024a2db14cb6dcdc401a9cbd13d73d3c37b348f68688f87c24ca790030b8f84fef9e74b4eab5e412", + "0x94ce8010f85875c045b0f014db93ef5ab9f1f6842e9a5743dce9e4cb872c94affd9e77c1f1d1ab8b8660b52345d9acb9", + "0xadefa9b27a62edc0c5b019ddd3ebf45e4de846165256cf6329331def2e088c5232456d3de470fdce3fa758bfdd387512", + "0xa6b83821ba7c1f83cc9e4529cf4903adb93b26108e3d1f20a753070db072ad5a3689643144bdd9c5ea06bb9a7a515cd0", + "0xa3a9ddedc2a1b183eb1d52de26718151744db6050f86f3580790c51d09226bf05f15111691926151ecdbef683baa992c", + "0xa64bac89e7686932cdc5670d07f0b50830e69bfb8c93791c87c7ffa4913f8da881a9d8a8ce8c1a9ce5b6079358c54136", + "0xa77b5a63452cb1320b61ab6c7c2ef9cfbcade5fd4727583751fb2bf3ea330b5ca67757ec1f517bf4d503ec924fe32fbd", + "0x8746fd8d8eb99639d8cd0ca34c0d9c3230ed5a312aab1d3d925953a17973ee5aeb66e68667e93caf9cb817c868ea8f3d", + "0x88a2462a26558fc1fbd6e31aa8abdc706190a17c27fdc4217ffd2297d1b1f3321016e5c4b2384c5454d5717dc732ed03", + "0xb78893a97e93d730c8201af2e0d3b31cb923d38dc594ffa98a714e627c473d42ea82e0c4d2eeb06862ee22a9b2c54588", + "0x920cc8b5f1297cf215a43f6fc843e379146b4229411c44c0231f6749793d40f07b9af7699fd5d21fd69400b97febe027", + "0xa0f0eafce1e098a6b58c7ad8945e297cd93aaf10bc55e32e2e32503f02e59fc1d5776936577d77c0b1162cb93b88518b", + "0x98480ba0064e97a2e7a6c4769b4d8c2a322cfc9a3b2ca2e67e9317e2ce04c6e1108169a20bd97692e1cb1f1423b14908", + "0x83dbbb2fda7e287288011764a00b8357753a6a44794cc8245a2275237f11affdc38977214e463ad67aec032f3dfa37e9", + "0x86442fff37598ce2b12015ff19b01bb8a780b40ad353d143a0f30a06f6d23afd5c2b0a1253716c855dbf445cc5dd6865", + "0xb8a4c60c5171189414887847b9ed9501bff4e4c107240f063e2d254820d2906b69ef70406c585918c4d24f1dd052142b", + "0x919f33a98e84015b2034b57b5ffe9340220926b2c6e45f86fd79ec879dbe06a148ae68b77b73bf7d01bd638a81165617", + "0x95c13e78d89474a47fbc0664f6f806744b75dede95a479bbf844db4a7f4c3ae410ec721cb6ffcd9fa9c323da5740d5ae", + "0xab7151acc41fffd8ec6e90387700bcd7e1cde291ea669567295bea1b9dd3f1df2e0f31f3588cd1a1c08af8120aca4921", + "0x80e74c5c47414bd6eeef24b6793fb1fa2d8fb397467045fcff887c52476741d5bc4ff8b6d3387cb53ad285485630537f", + "0xa296ad23995268276aa351a7764d36df3a5a3cffd7dbeddbcea6b1f77adc112629fdeffa0918b3242b3ccd5e7587e946", + "0x813d2506a28a2b01cb60f49d6bd5e63c9b056aa56946faf2f33bd4f28a8d947569cfead3ae53166fc65285740b210f86", + "0x924b265385e1646287d8c09f6c855b094daaee74b9e64a0dddcf9ad88c6979f8280ba30c8597b911ef58ddb6c67e9fe3", + "0x8d531513c70c2d3566039f7ca47cd2352fd2d55b25675a65250bdb8b06c3843db7b2d29c626eed6391c238fc651cf350", + "0x82b338181b62fdc81ceb558a6843df767b6a6e3ceedc5485664b4ea2f555904b1a45fbb35f6cf5d96f27da10df82a325", + "0x92e62faaedea83a37f314e1d3cb4faaa200178371d917938e59ac35090be1db4b4f4e0edb78b9c991de202efe4f313d8", + "0x99d645e1b642c2dc065bac9aaa0621bc648c9a8351efb6891559c3a41ba737bd155fb32d7731950514e3ecf4d75980e4", + "0xb34a13968b9e414172fb5d5ece9a39cf2eb656128c3f2f6cc7a9f0c69c6bae34f555ecc8f8837dc34b5e470e29055c78", + "0xa2a0bb7f3a0b23a2cbc6585d59f87cd7e56b2bbcb0ae48f828685edd9f7af0f5edb4c8e9718a0aaf6ef04553ba71f3b7", + "0x8e1a94bec053ed378e524b6685152d2b52d428266f2b6eadd4bcb7c4e162ed21ab3e1364879673442ee2162635b7a4d8", + "0x9944adaff14a85eab81c73f38f386701713b52513c4d4b838d58d4ffa1d17260a6d056b02334850ea9a31677c4b078bd", + "0xa450067c7eceb0854b3eca3db6cf38669d72cb7143c3a68787833cbca44f02c0be9bfbe082896f8a57debb13deb2afb1", + "0x8be4ad3ac9ef02f7df09254d569939757101ee2eda8586fefcd8c847adc1efe5bdcb963a0cafa17651befaafb376a531", + "0x90f6de91ea50255f148ac435e08cf2ac00c772a466e38155bd7e8acf9197af55662c7b5227f88589b71abe9dcf7ba343", + "0x86e5a24f0748b106dee2d4d54e14a3b0af45a96cbee69cac811a4196403ebbee17fd24946d7e7e1b962ac7f66dbaf610", + "0xafdd96fbcda7aa73bf9eeb2292e036c25753d249caee3b9c013009cc22e10d3ec29e2aa6ddbb21c4e949b0c0bccaa7f4", + "0xb5a4e7436d5473647c002120a2cb436b9b28e27ad4ebdd7c5f122b91597c507d256d0cbd889d65b3a908531936e53053", + "0xb632414c3da704d80ac2f3e5e0e9f18a3637cdc2ebeb613c29300745582427138819c4e7b0bec3099c1b8739dac1807b", + "0xa28df1464d3372ce9f37ef1db33cc010f752156afae6f76949d98cd799c0cf225c20228ae86a4da592d65f0cffe3951b", + "0x898b93d0a31f7d3f11f253cb7a102db54b669fd150da302d8354d8e02b1739a47cb9bd88015f3baf12b00b879442464e", + "0x96fb88d89a12049091070cb0048a381902965e67a8493e3991eaabe5d3b7ff7eecd5c94493a93b174df3d9b2c9511755", + "0xb899cb2176f59a5cfba3e3d346813da7a82b03417cad6342f19cc8f12f28985b03bf031e856a4743fd7ebe16324805b0", + "0xa60e2d31bc48e0c0579db15516718a03b73f5138f15037491f4dae336c904e312eda82d50862f4debd1622bb0e56d866", + "0x979fc8b987b5cef7d4f4b58b53a2c278bd25a5c0ea6f41c715142ea5ff224c707de38451b0ad3aa5e749aa219256650a", + "0xb2a75bff18e1a6b9cf2a4079572e41205741979f57e7631654a3c0fcec57c876c6df44733c9da3d863db8dff392b44a3", + "0xb7a0f0e811222c91e3df98ff7f286b750bc3b20d2083966d713a84a2281744199e664879401e77470d44e5a90f3e5181", + "0x82b74ba21c9d147fbc338730e8f1f8a6e7fc847c3110944eb17a48bea5e06eecded84595d485506d15a3e675fd0e5e62", + "0xa7f44eef817d5556f0d1abcf420301217d23c69dd2988f44d91ea1f1a16c322263cbacd0f190b9ba22b0f141b9267b4f", + "0xaadb68164ede84fc1cb3334b3194d84ba868d5a88e4c9a27519eef4923bc4abf81aab8114449496c073c2a6a0eb24114", + "0xb5378605fabe9a8c12a5dc55ef2b1de7f51aedb61960735c08767a565793cea1922a603a6983dc25f7cea738d0f7c40d", + "0xa97a4a5cd8d51302e5e670aee78fe6b5723f6cc892902bbb4f131e82ca1dfd5de820731e7e3367fb0c4c1922a02196e3", + "0x8bdfeb15c29244d4a28896f2b2cb211243cd6a1984a3f5e3b0ebe5341c419beeab3304b390a009ffb47588018034b0ea", + "0xa9af3022727f2aa2fca3b096968e97edad3f08edcbd0dbca107b892ae8f746a9c0485e0d6eb5f267999b23a845923ed0", + "0x8e7594034feef412f055590fbb15b6322dc4c6ab7a4baef4685bd13d71a83f7d682b5781bdfa0d1c659489ce9c2b8000", + "0x84977ca6c865ebee021c58106c1a4ad0c745949ecc5332948002fd09bd9b890524878d0c29da96fd11207621136421fe", + "0x8687551a79158e56b2375a271136756313122132a6670fa51f99a1b5c229ed8eea1655a734abae13228b3ebfd2a825dd", + "0xa0227d6708979d99edfc10f7d9d3719fd3fc68b0d815a7185b60307e4c9146ad2f9be2b8b4f242e320d4288ceeb9504c", + "0x89f75583a16735f9dd8b7782a130437805b34280ccea8dac6ecaee4b83fe96947e7b53598b06fecfffdf57ffc12cc445", + "0xa0056c3353227f6dd9cfc8e3399aa5a8f1d71edf25d3d64c982910f50786b1e395c508d3e3727ac360e3e040c64b5298", + "0xb070e61a6d813626144b312ded1788a6d0c7cec650a762b2f8df6e4743941dd82a2511cd956a3f141fc81e15f4e092da", + "0xb4e6db232e028a1f989bb5fc13416711f42d389f63564d60851f009dcffac01acfd54efa307aa6d4c0f932892d4e62b0", + "0x89b5991a67db90024ddd844e5e1a03ef9b943ad54194ae0a97df775dde1addf31561874f4e40fbc37a896630f3bbda58", + "0xad0e8442cb8c77d891df49cdb9efcf2b0d15ac93ec9be1ad5c3b3cca1f4647b675e79c075335c1f681d56f14dc250d76", + "0xb5d55a6ae65bb34dd8306806cb49b5ccb1c83a282ee47085cf26c4e648e19a52d9c422f65c1cd7e03ca63e926c5e92ea", + "0xb749501347e5ec07e13a79f0cb112f1b6534393458b3678a77f02ca89dca973fa7b30e55f0b25d8b92b97f6cb0120056", + "0x94144b4a3ffc5eec6ba35ce9c245c148b39372d19a928e236a60e27d7bc227d18a8cac9983851071935d8ffb64b3a34f", + "0x92bb4f9f85bc8c028a3391306603151c6896673135f8a7aefedd27acb322c04ef5dac982fc47b455d6740023e0dd3ea3", + "0xb9633a4a101461a782fc2aa092e9dbe4e2ad00987578f18cd7cf0021a909951d60fe79654eb7897806795f93c8ff4d1c", + "0x809f0196753024821b48a016eca5dbb449a7c55750f25981bb7a4b4c0e0846c09b8f6128137905055fc43a3f0deb4a74", + "0xa27dc9cdd1e78737a443570194a03d89285576d3d7f3a3cf15cc55b3013e42635d4723e2e8fe1d0b274428604b630db9", + "0x861f60f0462e04cd84924c36a28163def63e777318d00884ab8cb64c8df1df0bce5900342163edb60449296484a6c5bf", + "0xb7bc23fb4e14af4c4704a944253e760adefeca8caee0882b6bbd572c84434042236f39ae07a8f21a560f486b15d82819", + "0xb9a6eb492d6dd448654214bd01d6dc5ff12067a11537ab82023fc16167507ee25eed2c91693912f4155d1c07ed9650b3", + "0x97678af29c68f9a5e213bf0fb85c265303714482cfc4c2c00b4a1e8a76ed08834ee6af52357b143a1ca590fb0265ea5a", + "0x8a15b499e9eca5b6cac3070b5409e8296778222018ad8b53a5d1f6b70ad9bb10c68a015d105c941ed657bf3499299e33", + "0xb487fefede2e8091f2c7bfe85770db2edff1db83d4effe7f7d87bff5ab1ace35e9b823a71adfec6737fede8d67b3c467", + "0x8b51b916402aa2c437fce3bcad6dad3be8301a1a7eab9d163085b322ffb6c62abf28637636fe6114573950117fc92898", + "0xb06a2106d031a45a494adec0881cb2f82275dff9dcdd2bc16807e76f3bec28a6734edd3d54f0be8199799a78cd6228ad", + "0xaf0a185391bbe2315eb97feac98ad6dd2e5d931d012c621abd6e404a31cc188b286fef14871762190acf086482b2b5e2", + "0x8e78ee8206506dd06eb7729e32fceda3bebd8924a64e4d8621c72e36758fda3d0001af42443851d6c0aea58562870b43", + "0xa1ba52a569f0461aaf90b49b92be976c0e73ec4a2c884752ee52ffb62dd137770c985123d405dfb5de70692db454b54a", + "0x8d51b692fa1543c51f6b62b9acb8625ed94b746ef96c944ca02859a4133a5629da2e2ce84e111a7af8d9a5b836401c64", + "0xa7a20d45044cf6492e0531d0b8b26ffbae6232fa05a96ed7f06bdb64c2b0f5ca7ec59d5477038096a02579e633c7a3ff", + "0x84df867b98c53c1fcd4620fef133ee18849c78d3809d6aca0fb6f50ff993a053a455993f216c42ab6090fa5356b8d564", + "0xa7227c439f14c48e2577d5713c97a5205feb69acb0b449152842e278fa71e8046adfab468089c8b2288af1fc51fa945b", + "0x855189b3a105670779997690876dfaa512b4a25a24931a912c2f0f1936971d2882fb4d9f0b3d9daba77eaf660e9d05d5", + "0xb5696bd6706de51c502f40385f87f43040a5abf99df705d6aac74d88c913b8ecf7a99a63d7a37d9bdf3a941b9e432ff5", + "0xab997beb0d6df9c98d5b49864ef0b41a2a2f407e1687dfd6089959757ba30ed02228940b0e841afe6911990c74d536c4", + "0xb36b65f85546ebfdbe98823d5555144f96b4ab39279facd19c0de3b8919f105ba0315a0784dce4344b1bc62d8bb4a5a3", + "0xb8371f0e4450788720ac5e0f6cd3ecc5413d33895083b2c168d961ec2b5c3de411a4cc0712481cbe8df8c2fa1a7af006", + "0x98325d8026b810a8b7a114171ae59a57e8bbc9848e7c3df992efc523621729fd8c9f52114ce01d7730541a1ada6f1df1", + "0x8d0e76dbd37806259486cd9a31bc8b2306c2b95452dc395546a1042d1d17863ef7a74c636b782e214d3aa0e8d717f94a", + "0xa4e15ead76da0214d702c859fb4a8accdcdad75ed08b865842bd203391ec4cba2dcc916455e685f662923b96ee0c023f", + "0x8618190972086ebb0c4c1b4a6c94421a13f378bc961cc8267a301de7390c5e73c3333864b3b7696d81148f9d4843fd02", + "0x85369d6cc7342e1aa15b59141517d8db8baaaeb7ab9670f3ba3905353948d575923d283b7e5a05b13a30e7baf1208a86", + "0x87c51ef42233c24a6da901f28c9a075d9ba3c625687c387ad6757b72ca6b5a8885e6902a3082da7281611728b1e45f26", + "0xaa6348a4f71927a3106ad0ea8b02fc8d8c65531e4ab0bd0a17243e66f35afe252e40ab8eef9f13ae55a72566ffdaff5c", + "0x96a3bc976e9d03765cc3fee275fa05b4a84c94fed6b767e23ca689394501e96f56f7a97cffddc579a6abff632bf153be", + "0x97dbf96c6176379fdb2b888be4e757b2bca54e74124bd068d3fa1dbd82a011bbeb75079da38e0cd22a761fe208ecad9b", + "0xb70cf0a1d14089a4129ec4e295313863a59da8c7e26bf74cc0e704ed7f0ee4d7760090d0ddf7728180f1bf2c5ac64955", + "0x882d664714cc0ffe53cbc9bef21f23f3649824f423c4dbad1f893d22c4687ab29583688699efc4d5101aa08b0c3e267a", + "0x80ecb7cc963e677ccaddbe3320831dd6ee41209acf4ed41b16dc4817121a3d86a1aac9c4db3d8c08a55d28257088af32", + "0xa25ba667d832b145f9ce18c3f9b1bd00737aa36db020e1b99752c8ef7d27c6c448982bd8d352e1b6df266b8d8358a8d5", + "0x83734841c13dee12759d40bdd209b277e743b0d08cc0dd1e0b7afd2d65bfa640400eefcf6be4a52e463e5b3d885eeac6", + "0x848d16505b04804afc773aebabb51b36fd8aacfbb0e09b36c0d5d57df3c0a3b92f33e7d5ad0a7006ec46ebb91df42b8c", + "0x909a8d793f599e33bb9f1dc4792a507a97169c87cd5c087310bc05f30afcd247470b4b56dec59894c0fb1d48d39bb54e", + "0x8e558a8559df84a1ba8b244ece667f858095c50bb33a5381e60fcc6ba586b69693566d8819b4246a27287f16846c1dfa", + "0x84d6b69729f5aaa000cd710c2352087592cfbdf20d5e1166977e195818e593fa1a50d1e04566be23163a2523dc1612f1", + "0x9536d262b7a42125d89f4f32b407d737ba8d9242acfc99d965913ab3e043dcac9f7072a43708553562cac4cba841df30", + "0x9598548923ca119d6a15fd10861596601dd1dedbcccca97bb208cdc1153cf82991ea8cc17686fbaa867921065265970c", + "0xb87f2d4af6d026e4d2836bc3d390a4a18e98a6e386282ce96744603bab74974272e97ac2da281afa21885e2cbb3a8001", + "0x991ece62bf07d1a348dd22191868372904b9f8cf065ae7aa4e44fd24a53faf6d851842e35fb472895963aa1992894918", + "0xa8c53dea4c665b30e51d22ca6bc1bc78aaf172b0a48e64a1d4b93439b053877ec26cb5221c55efd64fa841bbf7d5aff4", + "0x93487ec939ed8e740f15335b58617c3f917f72d07b7a369befd479ae2554d04deb240d4a14394b26192efae4d2f4f35d", + "0xa44793ab4035443f8f2968a40e043b4555960193ffa3358d22112093aadfe2c136587e4139ffd46d91ed4107f61ea5e0", + "0xb13fe033da5f0d227c75927d3dacb06dbaf3e1322f9d5c7c009de75cdcba5e308232838785ab69a70f0bedea755e003f", + "0x970a29b075faccd0700fe60d1f726bdebf82d2cc8252f4a84543ebd3b16f91be42a75c9719a39c4096139f0f31393d58", + "0xa4c3eb1f7160f8216fc176fb244df53008ff32f2892363d85254002e66e2de21ccfe1f3b1047589abee50f29b9d507e3", + "0x8c552885eab04ba40922a8f0c3c38c96089c95ff1405258d3f1efe8d179e39e1295cbf67677894c607ae986e4e6b1fb0", + "0xb3671746fa7f848c4e2ae6946894defadd815230b906b419143523cc0597bc1d6c0a4c1e09d49b66b4a2c11cde3a4de3", + "0x937a249a95813a5e2ef428e355efd202e15a37d73e56cfb7e57ea9f943f2ce5ca8026f2f1fd25bf164ba89d07077d858", + "0x83646bdf6053a04aa9e2f112499769e5bd5d0d10f2e13db3ca89bd45c0b3b7a2d752b7d137fb3909f9c62b78166c9339", + "0xb4eac4b91e763666696811b7ed45e97fd78310377ebea1674b58a2250973f80492ac35110ed1240cd9bb2d17493d708c", + "0x82db43a99bc6573e9d92a3fd6635dbbb249ac66ba53099c3c0c8c8080b121dd8243cd5c6e36ba0a4d2525bae57f5c89c", + "0xa64d6a264a681b49d134c655d5fc7756127f1ee7c93d328820f32bca68869f53115c0d27fef35fe71f7bc4fdaed97348", + "0x8739b7a9e2b4bc1831e7f04517771bc7cde683a5e74e052542517f8375a2f64e53e0d5ac925ef722327e7bb195b4d1d9", + "0x8f337cdd29918a2493515ebb5cf702bbe8ecb23b53c6d18920cc22f519e276ca9b991d3313e2d38ae17ae8bdfa4f8b7e", + "0xb0edeab9850e193a61f138ef2739fc42ceec98f25e7e8403bfd5fa34a7bc956b9d0898250d18a69fa4625a9b3d6129da", + "0xa9920f26fe0a6d51044e623665d998745c9eca5bce12051198b88a77d728c8238f97d4196f26e43b24f8841500b998d0", + "0x86e655d61502b979eeeeb6f9a7e1d0074f936451d0a1b0d2fa4fb3225b439a3770767b649256fe481361f481a8dbc276", + "0x84d3b32fa62096831cc3bf013488a9f3f481dfe293ae209ed19585a03f7db8d961a7a9dd0db82bd7f62d612707575d9c", + "0x81c827826ec9346995ffccf62a241e3b2d32f7357acd1b1f8f7a7dbc97022d3eb51b8a1230e23ce0b401d2e535e8cd78", + "0x94a1e40c151191c5b055b21e86f32e69cbc751dcbdf759a48580951834b96a1eed75914c0d19a38aefd21fb6c8d43d0c", + "0xab890222b44bc21b71f7c75e15b6c6e16bb03371acce4f8d4353ff3b8fcd42a14026589c5ed19555a3e15e4d18bfc3a3", + "0xaccb0be851e93c6c8cc64724cdb86887eea284194b10e7a43c90528ed97e9ec71ca69c6fac13899530593756dd49eab2", + "0xb630220aa9e1829c233331413ee28c5efe94ea8ea08d0c6bfd781955078b43a4f92915257187d8526873e6c919c6a1de", + "0xadd389a4d358c585f1274b73f6c3c45b58ef8df11f9d11221f620e241bf3579fba07427b288c0c682885a700cc1fa28d", + "0xa9fe6ca8bf2961a3386e8b8dcecc29c0567b5c0b3bcf3b0f9169f88e372b80151af883871fc5229815f94f43a6f5b2b0", + "0xad839ae003b92b37ea431fa35998b46a0afc3f9c0dd54c3b3bf7a262467b13ff3c323ada1c1ae02ac7716528bdf39e3e", + "0x9356d3fd0edcbbb65713c0f2a214394f831b26f792124b08c5f26e7f734b8711a87b7c4623408da6a091c9aef1f6af3c", + "0x896b25b083c35ac67f0af3784a6a82435b0e27433d4d74cd6d1eafe11e6827827799490fb1c77c11de25f0d75f14e047", + "0x8bfa019391c9627e8e5f05c213db625f0f1e51ec68816455f876c7e55b8f17a4f13e5aae9e3fb9e1cf920b1402ee2b40", + "0x8ba3a6faa6a860a8f3ce1e884aa8769ceded86380a86520ab177ab83043d380a4f535fe13884346c5e51bee68da6ab41", + "0xa8292d0844084e4e3bb7af92b1989f841a46640288c5b220fecfad063ee94e86e13d3d08038ec2ac82f41c96a3bfe14d", + "0x8229bb030b2fc566e11fd33c7eab7a1bb7b49fed872ea1f815004f7398cb03b85ea14e310ec19e1f23e0bdaf60f8f76c", + "0x8cfbf869ade3ec551562ff7f63c2745cc3a1f4d4dc853a0cd42dd5f6fe54228f86195ea8fe217643b32e9f513f34a545", + "0xac52a3c8d3270ddfe1b5630159da9290a5ccf9ccbdef43b58fc0a191a6c03b8a5974cf6e2bbc7bd98d4a40a3581482d7", + "0xab13decb9e2669e33a7049b8eca3ca327c40dea15ad6e0e7fa63ed506db1d258bc36ac88b35f65cae0984e937eb6575d", + "0xb5e748eb1a7a1e274ff0cc56311c198f2c076fe4b7e73e5f80396fe85358549df906584e6bb2c8195b3e2be7736850a5", + "0xb5cb911325d8f963c41f691a60c37831c7d3bbd92736efa33d1f77a22b3fde7f283127256c2f47e197571e6fe0b46149", + "0x8a01dc6ed1b55f26427a014faa347130738b191a06b800e32042a46c13f60b49534520214359d68eb2e170c31e2b8672", + "0xa72fa874866e19b2efb8e069328362bf7921ec375e3bcd6b1619384c3f7ee980f6cf686f3544e9374ff54b4d17a1629c", + "0x8db21092f7c5f110fba63650b119e82f4b42a997095d65f08f8237b02dd66fdf959f788df2c35124db1dbd330a235671", + "0x8c65d50433d9954fe28a09fa7ba91a70a590fe7ba6b3060f5e4be0f6cef860b9897fa935fb4ebc42133524eb071dd169", + "0xb4614058e8fa21138fc5e4592623e78b8982ed72aa35ee4391b164f00c68d277fa9f9eba2eeefc890b4e86eba5124591", + "0xab2ad3a1bce2fbd55ca6b7c23786171fe1440a97d99d6df4d80d07dd56ac2d7203c294b32fc9e10a6c259381a73f24a1", + "0x812ae3315fdc18774a8da3713a4679e8ed10b9405edc548c00cacbe25a587d32040566676f135e4723c5dc25df5a22e9", + "0xa464b75f95d01e5655b54730334f443c8ff27c3cb79ec7af4b2f9da3c2039c609908cd128572e1fd0552eb597e8cef8d", + "0xa0db3172e93ca5138fe419e1c49a1925140999f6eff7c593e5681951ee0ec1c7e454c851782cbd2b8c9bc90d466e90e0", + "0x806db23ba7d00b87d544eed926b3443f5f9c60da6b41b1c489fba8f73593b6e3b46ebfcab671ee009396cd77d5e68aa1", + "0x8bfdf2c0044cc80260994e1c0374588b6653947b178e8b312be5c2a05e05767e98ea15077278506aee7df4fee1aaf89e", + "0x827f6558c16841b5592ff089c9c31e31eb03097623524394813a2e4093ad2d3f8f845504e2af92195aaa8a1679d8d692", + "0x925c4f8eab2531135cd71a4ec88e7035b5eea34ba9d799c5898856080256b4a15ed1a746e002552e2a86c9c157e22e83", + "0xa9f9a368f0e0b24d00a35b325964c85b69533013f9c2cfad9708be5fb87ff455210f8cb8d2ce3ba58ca3f27495552899", + "0x8ac0d3bebc1cae534024187e7c71f8927ba8fcc6a1926cb61c2b6c8f26bb7831019e635a376146c29872a506784a4aaa", + "0x97c577be2cbbfdb37ad754fae9df2ada5fc5889869efc7e18a13f8e502fbf3f4067a509efbd46fd990ab47ce9a70f5a8", + "0x935e7d82bca19f16614aa43b4a3474e4d20d064e4bfdf1cea2909e5c9ab72cfe3e54dc50030e41ee84f3588cebc524e9", + "0x941aafc08f7c0d94cebfbb1f0aad5202c02e6e37f2c12614f57e727efa275f3926348f567107ee6d8914dd71e6060271", + "0xaf0fbc1ba05b4b5b63399686df3619968be5d40073de0313cbf5f913d3d4b518d4c249cdd2176468ccaa36040a484f58", + "0xa0c414f23f46ca6d69ce74c6f8a00c036cb0edd098af0c1a7d39c802b52cfb2d5dbdf93fb0295453d4646e2af7954d45", + "0x909cf39e11b3875bb63b39687ae1b5d1f5a15445e39bf164a0b14691b4ddb39a8e4363f584ef42213616abc4785b5d66", + "0xa92bac085d1194fbd1c88299f07a061d0bdd3f980b663e81e6254dbb288bf11478c0ee880e28e01560f12c5ccb3c0103", + "0x841705cd5cd76b943e2b7c5e845b9dd3c8defe8ef67e93078d6d5e67ade33ad4b0fd413bc196f93b0a4073c855cd97d4", + "0x8e7eb8364f384a9161e81d3f1d52ceca9b65536ae49cc35b48c3e2236322ba4ae9973e0840802d9fa4f4d82ea833544f", + "0xaed3ab927548bc8bec31467ba80689c71a168e34f50dcb6892f19a33a099f5aa6b3f9cb79f5c0699e837b9a8c7f27efe", + "0xb8fbf7696210a36e20edabd77839f4dfdf50d6d015cdf81d587f90284a9bcef7d2a1ff520728d7cc69a4843d6c20dedd", + "0xa9d533769ce6830211c884ae50a82a7bf259b44ac71f9fb11f0296fdb3981e6b4c1753fe744647b247ebc433a5a61436", + "0x8b4bdf90d33360b7f428c71cde0a49fb733badba8c726876945f58c620ce7768ae0e98fc8c31fa59d8955a4823336bb1", + "0x808d42238e440e6571c59e52a35ae32547d502dc24fd1759d8ea70a7231a95859baf30b490a4ba55fa2f3aaa11204597", + "0x85594701f1d2fee6dc1956bc44c7b31db93bdeec2f3a7d622c1a08b26994760773e3d57521a44cfd7e407ac3fd430429", + "0xa66de045ce7173043a6825e9dc440ac957e2efb6df0a337f4f8003eb0c719d873a52e6eba3cb0d69d977ca37d9187674", + "0x87a1c6a1fdff993fa51efa5c3ba034c079c0928a7d599b906336af7c2dcab9721ceaf3108c646490af9dff9a754f54b3", + "0x926424223e462ceb75aed7c22ade8a7911a903b7e5dd4bc49746ddce8657f4616325cd12667d4393ac52cdd866396d0e", + "0xb5dc96106593b42b30f06f0b0a1e0c1aafc70432e31807252d3674f0b1ea5e58eac8424879d655c9488d85a879a3e572", + "0x997ca0987735cc716507cb0124b1d266d218b40c9d8e0ecbf26a1d65719c82a637ce7e8be4b4815d307df717bde7c72a", + "0x92994d3f57a569b7760324bb5ae4e8e14e1633d175dab06aa57b8e391540e05f662fdc08b8830f489a063f59b689a688", + "0xa8087fcc6aa4642cb998bea11facfe87eb33b90a9aa428ab86a4124ad032fc7d2e57795311a54ec9f55cc120ebe42df1", + "0xa9bd7d1de6c0706052ca0b362e2e70e8c8f70f1f026ea189b4f87a08ce810297ebfe781cc8004430776c54c1a05ae90c", + "0x856d33282e8a8e33a3d237fb0a0cbabaf77ba9edf2fa35a831fdafcadf620561846aa6cbb6bdc5e681118e1245834165", + "0x9524a7aa8e97a31a6958439c5f3339b19370f03e86b89b1d02d87e4887309dbbe9a3a8d2befd3b7ed5143c8da7e0a8ad", + "0x824fdf433e090f8acbd258ac7429b21f36f9f3b337c6d0b71d1416a5c88a767883e255b2888b7c906dd2e9560c4af24c", + "0x88c7fee662ca7844f42ed5527996b35723abffd0d22d4ca203b9452c639a5066031207a5ae763dbc0865b3299d19b1ec", + "0x919dca5c5595082c221d5ab3a5bc230f45da7f6dec4eb389371e142c1b9c6a2c919074842479c2844b72c0d806170c0c", + "0xb939be8175715e55a684578d8be3ceff3087f60fa875fff48e52a6e6e9979c955efef8ff67cfa2b79499ea23778e33b0", + "0x873b6db725e7397d11bc9bed9ac4468e36619135be686790a79bc6ed4249058f1387c9a802ea86499f692cf635851066", + "0xaeae06db3ec47e9e5647323fa02fac44e06e59b885ad8506bf71b184ab3895510c82f78b6b22a5d978e8218e7f761e9f", + "0xb99c0a8359c72ab88448bae45d4bf98797a26bca48b0d4460cd6cf65a4e8c3dd823970ac3eb774ae5d0cea4e7fadf33e", + "0x8f10c8ec41cdfb986a1647463076a533e6b0eec08520c1562401b36bb063ac972aa6b28a0b6ce717254e35940b900e3c", + "0xa106d9be199636d7add43b942290269351578500d8245d4aae4c083954e4f27f64740a3138a66230391f2d0e6043a8de", + "0xa469997908244578e8909ff57cffc070f1dbd86f0098df3cfeb46b7a085cfecc93dc69ee7cad90ff1dc5a34d50fe580c", + "0xa4ef087bea9c20eb0afc0ee4caba7a9d29dfa872137828c721391273e402fb6714afc80c40e98bbd8276d3836bffa080", + "0xb07a013f73cd5b98dae0d0f9c1c0f35bff8a9f019975c4e1499e9bee736ca6fcd504f9bc32df1655ff333062382cff04", + "0xb0a77188673e87cc83348c4cc5db1eecf6b5184e236220c8eeed7585e4b928db849944a76ec60ef7708ef6dac02d5592", + "0xb1284b37e59b529f0084c0dacf0af6c0b91fc0f387bf649a8c74819debf606f7b07fc3e572500016fb145ec2b24e9f17", + "0x97b20b5b4d6b9129da185adfbf0d3d0b0faeba5b9715f10299e48ea0521709a8296a9264ce77c275a59c012b50b6519a", + "0xb9d37e946fae5e4d65c1fbfacc8a62e445a1c9d0f882e60cca649125af303b3b23af53c81d7bac544fb7fcfc7a314665", + "0x8e5acaac379f4bb0127efbef26180f91ff60e4c525bc9b798fc50dfaf4fe8a5aa84f18f3d3cfb8baead7d1e0499af753", + "0xb0c0b8ab1235bf1cda43d4152e71efc1a06c548edb964eb4afceb201c8af24240bf8ab5cae30a08604e77432b0a5faf0", + "0x8cc28d75d5c8d062d649cbc218e31c4d327e067e6dbd737ec0a35c91db44fbbd0d40ec424f5ed79814add16947417572", + "0x95ae6219e9fd47efaa9cb088753df06bc101405ba50a179d7c9f7c85679e182d3033f35b00dbba71fdcd186cd775c52e", + "0xb5d28fa09f186ebc5aa37453c9b4d9474a7997b8ae92748ecb940c14868792292ac7d10ade01e2f8069242b308cf97e5", + "0x8c922a0faa14cc6b7221f302df3342f38fc8521ec6c653f2587890192732c6da289777a6cd310747ea7b7d104af95995", + "0xb9ad5f660b65230de54de535d4c0fcae5bc6b59db21dea5500fdc12eea4470fb8ea003690fdd16d052523418d5e01e8c", + "0xa39a9dd41a0ff78c82979483731f1cd68d3921c3e9965869662c22e02dde3877802e180ba93f06e7346f96d9fa9261d2", + "0x8b32875977ec372c583b24234c27ed73aef00cdff61eb3c3776e073afbdeade548de9497c32ec6d703ff8ad0a5cb7fe4", + "0x9644cbe755a5642fe9d26cfecf170d3164f1848c2c2e271d5b6574a01755f3980b3fc870b98cf8528fef6ecef4210c16", + "0x81ea9d1fdd9dd66d60f40ce0712764b99da9448ae0b300f8324e1c52f154e472a086dda840cb2e0b9813dc8ce8afd4b5", + "0x906aaa4a7a7cdf01909c5cfbc7ded2abc4b869213cbf7c922d4171a4f2e637e56f17020b852ad339d83b8ac92f111666", + "0x939b5f11acbdeff998f2a080393033c9b9d8d5c70912ea651c53815c572d36ee822a98d6dfffb2e339f29201264f2cf4", + "0xaba4898bf1ccea9b9e2df1ff19001e05891581659c1cbbde7ee76c349c7fc7857261d9785823c9463a8aea3f40e86b38", + "0x83ca1a56b8a0be4820bdb5a9346357c68f9772e43f0b887729a50d2eb2a326bbcede676c8bf2e51d7c89bbd8fdb778a6", + "0x94e86e9fe6addfe2c3ee3a547267ed921f4230d877a85bb4442c2d9350c2fa9a9c54e6fe662de82d1a2407e4ab1691c2", + "0xa0cc3bdef671a59d77c6984338b023fa2b431b32e9ed2abe80484d73edc6540979d6f10812ecc06d4d0c5d4eaca7183c", + "0xb5343413c1b5776b55ea3c7cdd1f3af1f6bd802ea95effe3f2b91a523817719d2ecc3f8d5f3cc2623ace7e35f99ca967", + "0x92085d1ed0ed28d8cabe3e7ff1905ed52c7ceb1eac5503760c52fb5ee3a726aba7c90b483c032acc3f166b083d7ec370", + "0x8ec679520455275cd957fca8122724d287db5df7d29f1702a322879b127bff215e5b71d9c191901465d19c86c8d8d404", + "0xb65eb2c63d8a30332eb24ee8a0c70156fc89325ebbb38bacac7cf3f8636ad8a472d81ccca80423772abc00192d886d8a", + "0xa9fe1c060b974bee4d590f2873b28635b61bfcf614e61ff88b1be3eee4320f4874e21e8d666d8ac8c9aba672efc6ecae", + "0xb3fe2a9a389c006a831dea7e777062df84b5c2803f9574d7fbe10b7e1c125817986af8b6454d6be9d931a5ac94cfe963", + "0x95418ad13b734b6f0d33822d9912c4c49b558f68d08c1b34a0127fcfa666bcae8e6fda8832d2c75bb9170794a20e4d7c", + "0xa9a7df761e7f18b79494bf429572140c8c6e9d456c4d4e336184f3f51525a65eb9582bea1e601bdb6ef8150b7ca736a5", + "0xa0de03b1e75edf7998c8c1ac69b4a1544a6fa675a1941950297917366682e5644a4bda9cdeedfaf9473d7fccd9080b0c", + "0xa61838af8d95c95edf32663a68f007d95167bf6e41b0c784a30b22d8300cfdd5703bd6d16e86396638f6db6ae7e42a85", + "0x8866d62084d905c145ff2d41025299d8b702ac1814a7dec4e277412c161bc9a62fed735536789cb43c88693c6b423882", + "0x91da22c378c81497fe363e7f695c0268443abee50f8a6625b8a41e865638a643f07b157ee566de09ba09846934b4e2d7", + "0x941d21dd57c9496aa68f0c0c05507405fdd413acb59bc668ce7e92e1936c68ec4b065c3c30123319884149e88228f0b2", + "0xa77af9b094bc26966ddf2bf9e1520c898194a5ccb694915950dadc204facbe3066d3d89f50972642d76b14884cfbaa21", + "0x8e76162932346869f4618bde744647f7ab52ab498ad654bdf2a4feeb986ac6e51370841e5acbb589e38b6e7142bb3049", + "0xb60979ace17d6937ece72e4f015da4657a443dd01cebc7143ef11c09e42d4aa8855999a65a79e2ea0067f31c9fc2ab0f", + "0xb3e2ffdd5ee6fd110b982fd4fad4b93d0fca65478f986d086eeccb0804960bfaa1919afa743c2239973ea65091fe57d2", + "0x8ce0ce05e7d7160d44574011da687454dbd3c8b8290aa671731b066e2c82f8cf2d63cb8e932d78c6122ec610e44660e6", + "0xab005dd8d297045c39e2f72fb1c48edb501ccf3575d3d04b9817b3afee3f0bb0f3f53f64bda37d1d9cde545aae999bae", + "0x95bd7edb4c4cd60e3cb8a72558845a3cce6bb7032ccdf33d5a49ebb6ddf203bc3c79e7b7e550735d2d75b04c8b2441e8", + "0x889953ee256206284094e4735dbbb17975bafc7c3cb94c9fbfee4c3e653857bfd49e818f64a47567f721b98411a3b454", + "0xb188423e707640ab0e75a061e0b62830cde8afab8e1ad3dae30db69ffae4e2fc005bababbdcbd7213b918ed4f70e0c14", + "0xa97e0fafe011abd70d4f99a0b36638b3d6e7354284588f17a88970ed48f348f88392779e9a038c6cbc9208d998485072", + "0x87db11014a91cb9b63e8dfaa82cdebca98272d89eb445ee1e3ff9dbaf2b3fad1a03b888cffc128e4fe208ed0dddece0f", + "0xaad2e40364edd905d66ea4ac9d51f9640d6fda9a54957d26ba233809851529b32c85660fa401dbee3679ec54fa6dd966", + "0x863e99336ca6edf03a5a259e59a2d0f308206e8a2fb320cfc0be06057366df8e0f94b33a28f574092736b3c5ada84270", + "0xb34bcc56a057589f34939a1adc51de4ff6a9f4fee9c7fa9aa131e28d0cf0759a0c871b640162acdfbf91f3f1b59a3703", + "0x935dd28f2896092995c5eff1618e5b6efe7a40178888d7826da9b0503c2d6e68a28e7fac1a334e166d0205f0695ef614", + "0xb842cd5f8f5de5ca6c68cb4a5c1d7b451984930eb4cc18fd0934d52fdc9c3d2d451b1c395594d73bc3451432bfba653f", + "0x9014537885ce2debad736bc1926b25fdab9f69b216bf024f589c49dc7e6478c71d595c3647c9f65ff980b14f4bb2283b", + "0x8e827ccca1dd4cd21707140d10703177d722be0bbe5cac578db26f1ef8ad2909103af3c601a53795435b27bf95d0c9ed", + "0x8a0b8ad4d466c09d4f1e9167410dbe2edc6e0e6229d4b3036d30f85eb6a333a18b1c968f6ca6d6889bb08fecde017ef4", + "0x9241ee66c0191b06266332dc9161dede384c4bb4e116dbd0890f3c3790ec5566da4568243665c4725b718ac0f6b5c179", + "0xaeb4d5fad81d2b505d47958a08262b6f1b1de9373c2c9ba6362594194dea3e002ab03b8cbb43f867be83065d3d370f19", + "0x8781bc83bb73f7760628629fe19e4714b494dbed444c4e4e4729b7f6a8d12ee347841a199888794c2234f51fa26fc2b9", + "0xb58864f0acd1c2afa29367e637cbde1968d18589245d9936c9a489c6c495f54f0113ecdcbe4680ac085dd3c397c4d0c3", + "0x94a24284afaeead61e70f3e30f87248d76e9726759445ca18cdb9360586c60cc9f0ec1c397f9675083e0b56459784e2e", + "0xaed358853f2b54dcbddf865e1816c2e89be12e940e1abfa661e2ee63ffc24a8c8096be2072fa83556482c0d89e975124", + "0xb95374e6b4fc0765708e370bc881e271abf2e35c08b056a03b847e089831ef4fe3124b9c5849d9c276eb2e35b3daf264", + "0xb834cdbcfb24c8f84bfa4c552e7fadc0028a140952fd69ed13a516e1314a4cd35d4b954a77d51a1b93e1f5d657d0315d", + "0x8fb6d09d23bfa90e7443753d45a918d91d75d8e12ec7d016c0dfe94e5c592ba6aaf483d2f16108d190822d955ad9cdc3", + "0xaa315cd3c60247a6ad4b04f26c5404c2713b95972843e4b87b5a36a89f201667d70f0adf20757ebe1de1b29ae27dda50", + "0xa116862dca409db8beff5b1ccd6301cdd0c92ca29a3d6d20eb8b87f25965f42699ca66974dd1a355200157476b998f3b", + "0xb4c2f5fe173c4dc8311b60d04a65ce1be87f070ac42e13cd19c6559a2931c6ee104859cc2520edebbc66a13dc7d30693", + "0x8d4a02bf99b2260c334e7d81775c5cf582b00b0c982ce7745e5a90624919028278f5e9b098573bad5515ce7fa92a80c8", + "0x8543493bf564ce6d97bd23be9bff1aba08bd5821ca834f311a26c9139c92a48f0c2d9dfe645afa95fec07d675d1fd53b", + "0x9344239d13fde08f98cb48f1f87d34cf6abe8faecd0b682955382a975e6eed64e863fa19043290c0736261622e00045c", + "0xaa49d0518f343005ca72b9e6c7dcaa97225ce6bb8b908ebbe7b1a22884ff8bfb090890364e325a0d414ad180b8f161d1", + "0x907d7fd3e009355ab326847c4a2431f688627faa698c13c03ffdd476ecf988678407f029b8543a475dcb3dafdf2e7a9c", + "0x845f1f10c6c5dad2adc7935f5cd2e2b32f169a99091d4f1b05babe7317b9b1cdce29b5e62f947dc621b9acbfe517a258", + "0x8f3be8e3b380ea6cdf9e9c237f5e88fd5a357e5ded80ea1fc2019810814de82501273b4da38916881125b6fa0cfd4459", + "0xb9c7f487c089bf1d20c822e579628db91ed9c82d6ca652983aa16d98b4270c4da19757f216a71b9c13ddee3e6e43705f", + "0x8ba2d8c88ad2b872db104ea8ddbb006ec2f3749fd0e19298a804bb3a5d94de19285cc7fb19fee58a66f7851d1a66c39f", + "0x9375ecd3ed16786fe161af5d5c908f56eeb467a144d3bbddfc767e90065b7c94fc53431adebecba2b6c9b5821184d36e", + "0xa49e069bfadb1e2e8bff6a4286872e2a9765d62f0eaa4fcb0e5af4bbbed8be3510fb19849125a40a8a81d1e33e81c3eb", + "0x9522cc66757b386aa6b88619525c8ce47a5c346d590bb3647d12f991e6c65c3ab3c0cfc28f0726b6756c892eae1672be", + "0xa9a0f1f51ff877406fa83a807aeb17b92a283879f447b8a2159653db577848cc451cbadd01f70441e351e9ed433c18bc", + "0x8ff7533dcff6be8714df573e33f82cf8e9f2bcaaa43e939c4759d52b754e502717950de4b4252fb904560fc31dce94a4", + "0x959724671e265a28d67c29d95210e97b894b360da55e4cf16e6682e7912491ed8ca14bfaa4dce9c25a25b16af580494f", + "0x92566730c3002f4046c737032487d0833c971e775de59fe02d9835c9858e2e3bc37f157424a69764596c625c482a2219", + "0xa84b47ceff13ed9c3e5e9cdf6739a66d3e7c2bd8a6ba318fefb1a9aecf653bb2981da6733ddb33c4b0a4523acc429d23", + "0xb4ddf571317e44f859386d6140828a42cf94994e2f1dcbcc9777f4eebbfc64fc1e160b49379acc27c4672b8e41835c5d", + "0x8ab95c94072b853d1603fdd0a43b30db617d13c1d1255b99075198e1947bfa5f59aed2b1147548a1b5e986cd9173d15c", + "0x89511f2eab33894fd4b3753d24249f410ff7263052c1fef6166fc63a79816656b0d24c529e45ccce6be28de6e375d916", + "0xa0866160ca63d4f2be1b4ea050dac6b59db554e2ebb4e5b592859d8df339b46fd7cb89aaed0951c3ee540aee982c238a", + "0x8fcc5cbba1b94970f5ff2eb1922322f5b0aa7d918d4b380c9e7abfd57afd8b247c346bff7b87af82efbce3052511cd1b", + "0x99aeb2a5e846b0a2874cca02c66ed40d5569eb65ab2495bc3f964a092e91e1517941f2688e79f8cca49cd3674c4e06dc", + "0xb7a096dc3bad5ca49bee94efd884aa3ff5615cf3825cf95fbe0ce132e35f46581d6482fa82666c7ef5f1643eaee8f1ca", + "0x94393b1da6eaac2ffd186b7725eca582f1ddc8cdd916004657f8a564a7c588175cb443fc6943b39029f5bbe0add3fad8", + "0x884b85fe012ccbcd849cb68c3ad832d83b3ef1c40c3954ffdc97f103b1ed582c801e1a41d9950f6bddc1d11f19d5ec76", + "0xb00061c00131eded8305a7ce76362163deb33596569afb46fe499a7c9d7a0734c084d336b38d168024c2bb42b58e7660", + "0xa439153ac8e6ca037381e3240e7ba08d056c83d7090f16ed538df25901835e09e27de2073646e7d7f3c65056af6e4ce7", + "0x830fc9ca099097d1f38b90e6843dc86f702be9d20bdacc3e52cae659dc41df5b8d2c970effa6f83a5229b0244a86fe22", + "0xb81ea2ffaaff2bb00dd59a9ab825ba5eed4db0d8ac9c8ed1a632ce8f086328a1cddd045fbe1ace289083c1325881b7e7", + "0xb51ea03c58daf2db32c99b9c4789b183365168cb5019c72c4cc91ac30b5fb7311d3db76e6fa41b7cd4a8c81e2f6cdc94", + "0xa4170b2c6d09ca5beb08318730419b6f19215ce6c631c854116f904be3bc30dd85a80c946a8ab054d3e307afaa3f8fbc", + "0x897cc42ff28971ff54d2a55dd6b35cfb8610ac902f3c06e3a5cea0e0a257e870c471236a8e84709211c742a09c5601a6", + "0xa18f2e98d389dace36641621488664ecbb422088ab03b74e67009b8b8acacaaa24fdcf42093935f355207d934adc52a8", + "0x92adcfb678cc2ba19c866f3f2b988fdcb4610567f3ab436cc0cb9acaf5a88414848d71133ebdbec1983e38e6190f1b5f", + "0xa86d43c2ce01b366330d3b36b3ca85f000c3548b8297e48478da1ee7d70d8576d4650cba7852ed125c0d7cb6109aa7f3", + "0x8ed31ceed9445437d7732dce78a762d72ff32a7636bfb3fd7974b7ae15db414d8184a1766915244355deb354fbc5803b", + "0x9268f70032584f416e92225d65af9ea18c466ebc7ae30952d56a4e36fd9ea811dde0a126da9220ba3c596ec54d8a335e", + "0x9433b99ee94f2d3fbdd63b163a2bdf440379334c52308bd24537f7defd807145a062ff255a50d119a7f29f4b85d250e3", + "0x90ce664f5e4628a02278f5cf5060d1a34f123854634b1870906e5723ac9afd044d48289be283b267d45fcbf3f4656aaf", + "0xaaf21c4d59378bb835d42ae5c5e5ab7a3c8c36a59e75997989313197752b79a472d866a23683b329ea69b048b87fa13e", + "0xb83c0589b304cec9ede549fde54f8a7c2a468c6657da8c02169a6351605261202610b2055c639b9ed2d5b8c401fb8f56", + "0x9370f326ea0f170c2c05fe2c5a49189f20aec93b6b18a5572a818cd4c2a6adb359e68975557b349fb54f065d572f4c92", + "0xac3232fa5ce6f03fca238bef1ce902432a90b8afce1c85457a6bee5571c033d4bceefafc863af04d4e85ac72a4d94d51", + "0x80d9ea168ff821b22c30e93e4c7960ce3ad3c1e6deeebedd342a36d01bd942419b187e2f382dbfd8caa34cca08d06a48", + "0xa387a3c61676fb3381eefa2a45d82625635a666e999aba30e3b037ec9e040f414f9e1ad9652abd3bcad63f95d85038db", + "0xa1b229fe32121e0b391b0f6e0180670b9dc89d79f7337de4c77ea7ad0073e9593846f06797c20e923092a08263204416", + "0x92164a9d841a2b828cedf2511213268b698520f8d1285852186644e9a0c97512cafa4bfbe29af892c929ebccd102e998", + "0x82ee2fa56308a67c7db4fd7ef539b5a9f26a1c2cc36da8c3206ba4b08258fbb3cec6fe5cdbd111433fb1ba2a1e275927", + "0x8c77bfe9e191f190a49d46f05600603fa42345592539b82923388d72392404e0b29a493a15e75e8b068dddcd444c2928", + "0x80b927f93ccf79dcf5c5b20bcf5a7d91d7a17bc0401bb7cc9b53a6797feac31026eb114257621f5a64a52876e4474cc1", + "0xb6b68b6501c37804d4833d5a063dd108a46310b1400549074e3cac84acc6d88f73948b7ad48d686de89c1ec043ae8c1a", + "0xab3da00f9bdc13e3f77624f58a3a18fc3728956f84b5b549d62f1033ae4b300538e53896e2d943f160618e05af265117", + "0xb6830e87233b8eace65327fdc764159645b75d2fd4024bf8f313b2dd5f45617d7ecfb4a0b53ccafb5429815a9a1adde6", + "0xb9251cfe32a6dc0440615aadcd98b6b1b46e3f4e44324e8f5142912b597ee3526bea2431e2b0282bb58f71be5b63f65e", + "0xaf8d70711e81cdddfb39e67a1b76643292652584c1ce7ce4feb1641431ad596e75c9120e85f1a341e7a4da920a9cdd94", + "0x98cd4e996594e89495c078bfd52a4586b932c50a449a7c8dfdd16043ca4cda94dafbaa8ad1b44249c99bbcc52152506e", + "0xb9fc6d1c24f48404a4a64fbe3e43342738797905db46e4132aee5f086aaa4c704918ad508aaefa455cfe1b36572e6242", + "0xa365e871d30ba9291cedaba1be7b04e968905d003e9e1af7e3b55c5eb048818ae5b913514fb08b24fb4fbdccbb35d0b8", + "0x93bf99510971ea9af9f1e364f1234c898380677c8e8de9b0dd24432760164e46c787bc9ec42a7ad450500706cf247b2d", + "0xb872f825a5b6e7b9c7a9ddfeded3516f0b1449acc9b4fd29fc6eba162051c17416a31e5be6d3563f424d28e65bab8b8f", + "0xb06b780e5a5e8eb4f4c9dc040f749cf9709c8a4c9ef15e925f442b696e41e5095db0778a6c73bcd329b265f2c6955c8b", + "0x848f1a981f5fc6cd9180cdddb8d032ad32cdfa614fc750d690dbae36cc0cd355cbf1574af9b3ffc8b878f1b2fafb9544", + "0xa03f48cbff3e9e8a3a655578051a5ae37567433093ac500ed0021c6250a51b767afac9bdb194ee1e3eac38a08c0eaf45", + "0xb5be78ce638ff8c4aa84352b536628231d3f7558c5be3bf010b28feac3022e64691fa672f358c8b663904aebe24a54ed", + "0xa9d4da70ff676fa55d1728ba6ab03b471fa38b08854d99e985d88c2d050102d8ccffbe1c90249a5607fa7520b15fe791", + "0x8fe9f7092ffb0b69862c8e972fb1ecf54308c96d41354ed0569638bb0364f1749838d6d32051fff1599112978c6e229c", + "0xae6083e95f37770ecae0df1e010456f165d96cfe9a7278c85c15cffd61034081ce5723e25e2bede719dc9341ec8ed481", + "0xa260891891103089a7afbd9081ea116cfd596fd1015f5b65e10b0961eb37fab7d09c69b7ce4be8bf35e4131848fb3fe4", + "0x8d729fa32f6eb9fd2f6a140bef34e8299a2f3111bffd0fe463aa8622c9d98bfd31a1df3f3e87cd5abc52a595f96b970e", + "0xa30ec6047ae4bc7da4daa7f4c28c93aedb1112cfe240e681d07e1a183782c9ff6783ac077c155af23c69643b712a533f", + "0xac830726544bfe7b5467339e5114c1a75f2a2a8d89453ce86115e6a789387e23551cd64620ead6283dfa4538eb313d86", + "0x8445c135b7a48068d8ed3e011c6d818cfe462b445095e2fbf940301e50ded23f272d799eea47683fc027430ce14613ef", + "0x95785411715c9ae9d8293ce16a693a2aa83e3cb1b4aa9f76333d0da2bf00c55f65e21e42e50e6c5772ce213dd7b4f7a0", + "0xb273b024fa18b7568c0d1c4d2f0c4e79ec509dafac8c5951f14192d63ddbcf2d8a7512c1c1b615cc38fa3e336618e0c5", + "0xa78b9d3ea4b6a90572eb27956f411f1d105fdb577ee2ffeec9f221da9b45db84bfe866af1f29597220c75e0c37a628d8", + "0xa4be2bf058c36699c41513c4d667681ce161a437c09d81383244fc55e1c44e8b1363439d0cce90a3e44581fb31d49493", + "0xb6eef13040f17dd4eba22aaf284d2f988a4a0c4605db44b8d2f4bf9567ac794550b543cc513c5f3e2820242dd704152e", + "0x87eb00489071fa95d008c5244b88e317a3454652dcb1c441213aa16b28cd3ecaa9b22fec0bdd483c1df71c37119100b1", + "0x92d388acdcb49793afca329cd06e645544d2269234e8b0b27d2818c809c21726bc9cf725651b951e358a63c83dedee24", + "0xae27e219277a73030da27ab5603c72c8bd81b6224b7e488d7193806a41343dff2456132274991a4722fdb0ef265d04cd", + "0x97583e08ecb82bbc27c0c8476d710389fa9ffbead5c43001bd36c1b018f29faa98de778644883e51870b69c5ffb558b5", + "0x90a799a8ce73387599babf6b7da12767c0591cadd36c20a7990e7c05ea1aa2b9645654ec65308ee008816623a2757a6a", + "0xa1b47841a0a2b06efd9ab8c111309cc5fc9e1d5896b3e42ed531f6057e5ade8977c29831ce08dbda40348386b1dcc06d", + "0xb92b8ef59bbddb50c9457691bc023d63dfcc54e0fd88bd5d27a09e0d98ac290fc90e6a8f6b88492043bf7c87fac8f3e4", + "0xa9d6240b07d62e22ec8ab9b1f6007c975a77b7320f02504fc7c468b4ee9cfcfd945456ff0128bc0ef2174d9e09333f8d", + "0x8e96534c94693226dc32bca79a595ca6de503af635f802e86442c67e77564829756961d9b701187fe91318da515bf0e6", + "0xb6ba290623cd8dd5c2f50931c0045d1cfb0c30877bc8fe58cbc3ff61ee8da100045a39153916efa1936f4aee0892b473", + "0xb43baa7717fac02d4294f5b3bb5e58a65b3557747e3188b482410388daac7a9c177f762d943fd5dcf871273921213da8", + "0xb9cf00f8fb5e2ef2b836659fece15e735060b2ea39b8e901d3dcbdcf612be8bf82d013833718c04cd46ffaa70b85f42e", + "0x8017d0c57419e414cbba504368723e751ef990cc6f05dad7b3c2de6360adc774ad95512875ab8337d110bf39a42026fa", + "0xae7401048b838c0dcd4b26bb6c56d79d51964a0daba780970b6c97daee4ea45854ea0ac0e4139b3fe60dac189f84df65", + "0x887b237b0cd0f816b749b21db0b40072f9145f7896c36916296973f9e6990ede110f14e5976c906d08987c9836cca57f", + "0xa88c3d5770148aee59930561ca1223aceb2c832fb5417e188dca935905301fc4c6c2c9270bc1dff7add490a125eb81c6", + "0xb6cf9b02c0cd91895ad209e38c54039523f137b5848b9d3ad33ae43af6c20c98434952db375fe378de7866f2d0e8b18a", + "0x84ef3d322ff580c8ad584b1fe4fe346c60866eb6a56e982ba2cf3b021ecb1fdb75ecc6c29747adda86d9264430b3f816", + "0xa0561c27224baf0927ad144cb71e31e54a064c598373fcf0d66aebf98ab7af1d8e2f343f77baefff69a6da750a219e11", + "0xaa5cc43f5b8162b016f5e1b61214c0c9d15b1078911c650b75e6cdfb49b85ee04c6739f5b1687d15908444f691f732de", + "0xad4ac099b935589c7b8fdfdf3db332b7b82bb948e13a5beb121ebd7db81a87d278024a1434bcf0115c54ca5109585c3d", + "0x8a00466abf3f109a1dcd19e643b603d3af23d42794ef8ca2514dd507ecea44a031ac6dbc18bd02f99701168b25c1791e", + "0xb00b5900dfad79645f8bee4e5adc7b84eb22e5b1e67df77ccb505b7fc044a6c08a8ea5faca662414eb945f874f884cea", + "0x950e204e5f17112250b22ea6bb8423baf522fc0af494366f18fe0f949f51d6e6812074a80875cf1ed9c8e7420058d541", + "0x91e5cbf8bb1a1d50c81608c9727b414d0dd2fb467ebc92f100882a3772e54f94979cfdf8e373fdef7c7fcdd60fec9e00", + "0xa093f6a857b8caaff80599c2e89c962b415ecbaa70d8fd973155fa976a284c6b29a855f5f7a3521134d00d2972755188", + "0xb4d55a3551b00da54cc010f80d99ddd2544bde9219a3173dfaadf3848edc7e4056ab532fb75ac26f5f7141e724267663", + "0xa03ea050fc9b011d1b04041b5765d6f6453a93a1819cd9bd6328637d0b428f08526466912895dcc2e3008ee58822e9a7", + "0x99b12b3665e473d01bc6985844f8994fb65cb15745024fb7af518398c4a37ff215da8f054e8fdf3286984ae36a73ca5e", + "0x9972c7e7a7fb12e15f78d55abcaf322c11249cd44a08f62c95288f34f66b51f146302bce750ff4d591707075d9123bd2", + "0xa64b4a6d72354e596d87cda213c4fc2814009461570ccb27d455bbe131f8d948421a71925425b546d8cf63d5458cd64b", + "0x91c215c73b195795ede2228b7ed1f6e37892e0c6b0f4a0b5a16c57aa1100c84df9239054a173b6110d6c2b7f4bf1ce52", + "0x88807198910ec1303480f76a3683870246a995e36adaeadc29c22f0bdba8152fe705bd070b75de657b04934f7d0ccf80", + "0xb37c0026c7b32eb02cacac5b55cb5fe784b8e48b2945c64d3037af83ece556a117f0ff053a5968c2f5fa230e291c1238", + "0x94c768384ce212bc2387e91ce8b45e4ff120987e42472888a317abc9dcdf3563b62e7a61c8e98d7cdcbe272167d91fc6", + "0xa10c2564936e967a390cb14ef6e8f8b04ea9ece5214a38837eda09e79e0c7970b1f83adf017c10efd6faa8b7ffa2c567", + "0xa5085eed3a95f9d4b1269182ea1e0d719b7809bf5009096557a0674bde4201b0ddc1f0f16a908fc468846b3721748ce3", + "0x87468eb620b79a0a455a259a6b4dfbc297d0d53336537b771254dd956b145dc816b195b7002647ea218552e345818a3f", + "0xace2b77ffb87366af0a9cb5d27d6fc4a14323dbbf1643f5f3c4559306330d86461bb008894054394cbfaefeaa0bc2745", + "0xb27f56e840a54fbd793f0b7a7631aa4cee64b5947e4382b2dfb5eb1790270288884c2a19afebe5dc0c6ef335d4531c1c", + "0x876e438633931f7f895062ee16c4b9d10428875f7bc79a8e156a64d379a77a2c45bf5430c5ab94330f03da352f1e9006", + "0xa2512a252587d200d2092b44c914df54e04ff8bcef36bf631f84bde0cf5a732e3dc7f00f662842cfd74b0b0f7f24180e", + "0x827f1bc8f54a35b7a4bd8154f79bcc055e45faed2e74adf7cf21cca95df44d96899e847bd70ead6bb27b9c0ed97bbd8b", + "0xa0c92cf5a9ed843714f3aea9fe7b880f622d0b4a3bf66de291d1b745279accf6ba35097849691370f41732ba64b5966b", + "0xa63f5c1e222775658421c487b1256b52626c6f79cb55a9b7deb2352622cedffb08502042d622eb3b02c97f9c09f9c957", + "0x8cc093d52651e65fb390e186db6cc4de559176af4624d1c44cb9b0e836832419dacac7b8db0627b96288977b738d785d", + "0xaa7b6a17dfcec146134562d32a12f7bd7fe9522e300859202a02939e69dbd345ed7ff164a184296268f9984f9312e8fc", + "0x8ac76721f0d2b679f023d06cbd28c85ae5f4b43c614867ccee88651d4101d4fd352dbdb65bf36bfc3ebc0109e4b0c6f9", + "0x8d350f7c05fc0dcd9a1170748846fb1f5d39453e4cb31e6d1457bed287d96fc393b2ecc53793ca729906a33e59c6834a", + "0xb9913510dfc5056d7ec5309f0b631d1ec53e3a776412ada9aefdaf033c90da9a49fdde6719e7c76340e86599b1f0eec2", + "0x94955626bf4ce87612c5cfffcf73bf1c46a4c11a736602b9ba066328dc52ad6d51e6d4f53453d4ed55a51e0aad810271", + "0xb0fcab384fd4016b2f1e53f1aafd160ae3b1a8865cd6c155d7073ecc1664e05b1d8bca1def39c158c7086c4e1103345e", + "0x827de3f03edfbde08570b72de6662c8bfa499b066a0a27ebad9b481c273097d17a5a0a67f01553da5392ec3f149b2a78", + "0xab7940384c25e9027c55c40df20bd2a0d479a165ced9b1046958353cd69015eeb1e44ed2fd64e407805ba42df10fc7bf", + "0x8ad456f6ff8cd58bd57567d931f923d0c99141978511b17e03cab7390a72b9f62498b2893e1b05c7c22dd274e9a31919", + "0xac75399e999effe564672db426faa17a839e57c5ef735985c70cd559a377adec23928382767b55ed5a52f7b11b54b756", + "0xb17f975a00b817299ac7af5f2024ea820351805df58b43724393bfb3920a8cd747a3bbd4b8286e795521489db3657168", + "0xa2bed800a6d95501674d9ee866e7314063407231491d794f8cf57d5be020452729c1c7cefd8c50dc1540181f5caab248", + "0x9743f5473171271ffdd3cc59a3ae50545901a7b45cd4bc3570db487865f3b73c0595bebabbfe79268809ee1862e86e4a", + "0xb7eab77c2d4687b60d9d7b04e842b3880c7940140012583898d39fcc22d9b9b0a9be2c2e3788b3e6f30319b39c338f09", + "0x8e2b8f797a436a1b661140e9569dcf3e1eea0a77c7ff2bc4ff0f3e49af04ed2de95e255df8765f1d0927fb456a9926b1", + "0x8aefea201d4a1f4ff98ffce94e540bb313f2d4dfe7e9db484a41f13fc316ed02b282e1acc9bc6f56cad2dc2e393a44c9", + "0xb950c17c0e5ca6607d182144aa7556bb0efe24c68f06d79d6413a973b493bfdf04fd147a4f1ab03033a32004cc3ea66f", + "0xb7b8dcbb179a07165f2dc6aa829fad09f582a71b05c3e3ea0396bf9e6fe73076f47035c031c2101e8e38e0d597eadd30", + "0xa9d77ed89c77ec1bf8335d08d41c3c94dcca9fd1c54f22837b4e54506b212aa38d7440126c80648ab7723ff18e65ed72", + "0xa819d6dfd4aef70e52b8402fe5d135f8082d40eb7d3bb5c4d7997395b621e2bb10682a1bad2c9caa33dd818550fc3ec6", + "0x8f6ee34128fac8bbf13ce2d68b2bb363eb4fd65b297075f88e1446ddeac242500eeb4ef0735e105882ff5ba8c44c139b", + "0xb4440e48255c1644bcecf3a1e9958f1ec4901cb5b1122ee5b56ffd02cad1c29c4266999dbb85aa2605c1b125490074d4", + "0xa43304a067bede5f347775d5811cf65a6380a8d552a652a0063580b5c5ef12a0867a39c7912fa219e184f4538eba1251", + "0xa891ad67a790089ffc9f6d53e6a3d63d3556f5f693e0cd8a7d0131db06fd4520e719cfcc3934f0a8f62a95f90840f1d4", + "0xaea6df8e9bb871081aa0fc5a9bafb00be7d54012c5baf653791907d5042a326aeee966fd9012a582cc16695f5baf7042", + "0x8ffa2660dc52ed1cd4eff67d6a84a8404f358a5f713d04328922269bee1e75e9d49afeec0c8ad751620f22352a438e25", + "0x87ec6108e2d63b06abed350f8b363b7489d642486f879a6c3aa90e5b0f335efc2ff2834eef9353951a42136f8e6a1b32", + "0x865619436076c2760d9e87ddc905023c6de0a8d56eef12c98a98c87837f2ca3f27fd26a2ad752252dbcbe2b9f1d5a032", + "0x980437dce55964293cb315c650c5586ffd97e7a944a83f6618af31c9d92c37b53ca7a21bb5bc557c151b9a9e217e7098", + "0x95d128fc369df4ad8316b72aea0ca363cbc7b0620d6d7bb18f7076a8717a6a46956ff140948b0cc4f6d2ce33b5c10054", + "0x8c7212d4a67b9ec70ebbca04358ad2d36494618d2859609163526d7b3acc2fc935ca98519380f55e6550f70a9bc76862", + "0x893a2968819401bf355e85eee0f0ed0406a6d4a7d7f172d0017420f71e00bb0ba984f6020999a3cdf874d3cd8ebcd371", + "0x9103c1af82dece25d87274e89ea0acd7e68c2921c4af3d8d7c82ab0ed9990a5811231b5b06113e7fa43a6bd492b4564f", + "0x99cfd87a94eab7d35466caa4ed7d7bb45e5c932b2ec094258fb14bf205659f83c209b83b2f2c9ccb175974b2a33e7746", + "0x874b6b93e4ee61be3f00c32dd84c897ccd6855c4b6251eb0953b4023634490ed17753cd3223472873cbc6095b2945075", + "0x84a32c0dc4ea60d33aac3e03e70d6d639cc9c4cc435c539eff915017be3b7bdaba33349562a87746291ebe9bc5671f24", + "0xa7057b24208928ad67914e653f5ac1792c417f413d9176ba635502c3f9c688f7e2ee81800d7e3dc0a340c464da2fd9c5", + "0xa03fb9ed8286aacfa69fbd5d953bec591c2ae4153400983d5dbb6cd9ea37fff46ca9e5cceb9d117f73e9992a6c055ad2", + "0x863b2de04e89936c9a4a2b40380f42f20aefbae18d03750fd816c658aee9c4a03df7b12121f795c85d01f415baaeaa59", + "0x8526eb9bd31790fe8292360d7a4c3eed23be23dd6b8b8f01d2309dbfdc0cfd33ad1568ddd7f8a610f3f85a9dfafc6a92", + "0xb46ab8c5091a493d6d4d60490c40aa27950574a338ea5bbc045be3a114af87bdcb160a8c80435a9b7ad815f3cb56a3f3", + "0xaeadc47b41a8d8b4176629557646202f868b1d728b2dda58a347d937e7ffc8303f20d26d6c00b34c851b8aeec547885d", + "0xaebb19fc424d72c1f1822aa7adc744cd0ef7e55727186f8df8771c784925058c248406ebeeaf3c1a9ee005a26e9a10c6", + "0x8ff96e81c1a4a2ab1b4476c21018fae0a67e92129ee36120cae8699f2d7e57e891f5c624902cb1b845b944926a605cc3", + "0x8251b8d2c43fadcaa049a9e7aff838dae4fb32884018d58d46403ac5f3beb5c518bfd45f03b8abb710369186075eb71c", + "0xa8b2a64f865f51a5e5e86a66455c093407933d9d255d6b61e1fd81ffafc9538d73caaf342338a66ba8ee166372a3d105", + "0xaad915f31c6ba7fdc04e2aaac62e84ef434b7ee76a325f07dc430d12c84081999720181067b87d792efd0117d7ee1eab", + "0xa13db3bb60389883fd41d565c54fb5180d9c47ce2fe7a169ae96e01d17495f7f4fa928d7e556e7c74319c4c25d653eb2", + "0xa4491b0198459b3f552855d680a59214eb74e6a4d6c5fa3b309887dc50ebea2ecf6d26c040550f7dc478b452481466fb", + "0x8f017f13d4b1e3f0c087843582b52d5f8d13240912254d826dd11f8703a99a2f3166dfbdfdffd9a3492979d77524276b", + "0x96c3d5dcd032660d50d7cd9db2914f117240a63439966162b10c8f1f3cf74bc83b0f15451a43b31dbd85e4a7ce0e4bb1", + "0xb479ec4bb79573d32e0ec93b92bdd7ec8c26ddb5a2d3865e7d4209d119fd3499eaac527615ffac78c440e60ef3867ae0", + "0xb2c49c4a33aa94b52b6410b599e81ff15490aafa7e43c8031c865a84e4676354a9c81eb4e7b8be6825fdcefd1e317d44", + "0x906dc51d6a90c089b6704b47592805578a6eed106608eeb276832f127e1b8e858b72e448edcbefb497d152447e0e68ff", + "0xb0e81c63b764d7dfbe3f3fddc9905aef50f3633e5d6a4af6b340495124abedcff5700dfd1577bbbed7b6bf97d02719cb", + "0x9304c64701e3b4ed6d146e48a881f7d83a17f58357cca0c073b2bb593afd2d94f6e2a7a1ec511d0a67ad6ff4c3be5937", + "0xb6fdbd12ba05aa598d80b83f70a15ef90e5cba7e6e75fa038540ee741b644cd1f408a6cecfd2a891ef8d902de586c6b5", + "0xb80557871a6521b1b3c74a1ba083ae055b575df607f1f7b04c867ba8c8c181ea68f8d90be6031f4d25002cca27c44da2", + "0xaa7285b8e9712e06b091f64163f1266926a36607f9d624af9996856ed2aaf03a580cb22ce407d1ade436c28b44ca173f", + "0x8148d72b975238b51e6ea389e5486940d22641b48637d7dfadfa603a605bfc6d74a016480023945d0b85935e396aea5d", + "0x8a014933a6aea2684b5762af43dcf4bdbb633cd0428d42d71167a2b6fc563ece5e618bff22f1db2ddb69b845b9a2db19", + "0x990d91740041db770d0e0eb9d9d97d826f09fd354b91c41e0716c29f8420e0e8aac0d575231efba12fe831091ec38d5a", + "0x9454d0d32e7e308ddec57cf2522fb1b67a2706e33fb3895e9e1f18284129ab4f4c0b7e51af25681d248d7832c05eb698", + "0xa5bd434e75bac105cb3e329665a35bce6a12f71dd90c15165777d64d4c13a82bceedb9b48e762bd24034e0fc9fbe45f4", + "0xb09e3b95e41800d4dc29c6ffdaab2cd611a0050347f6414f154a47ee20ee59bf8cf7181454169d479ebce1eb5c777c46", + "0xb193e341d6a047d15eea33766d656d807b89393665a783a316e9ba10518e5515c8e0ade3d6e15641d917a8a172a5a635", + "0xade435ec0671b3621dde69e07ead596014f6e1daa1152707a8c18877a8b067bde2895dd47444ffa69db2bbef1f1d8816", + "0xa7fd3d6d87522dfc56fb47aef9ce781a1597c56a8bbfd796baba907afdc872f753d732bfda1d3402aee6c4e0c189f52d", + "0xa298cb4f4218d0464b2fab393e512bbc477c3225aa449743299b2c3572f065bc3a42d07e29546167ed9e1b6b3b3a3af3", + "0xa9ee57540e1fd9c27f4f0430d194b91401d0c642456c18527127d1f95e2dba41c2c86d1990432eb38a692fda058fafde", + "0x81d6c1a5f93c04e6d8e5a7e0678c1fc89a1c47a5c920bcd36180125c49fcf7c114866b90e90a165823560b19898a7c16", + "0xa4b7a1ec9e93c899b9fd9aaf264c50e42c36c0788d68296a471f7a3447af4dbc81e4fa96070139941564083ec5b5b5a1", + "0xb3364e327d381f46940c0e11e29f9d994efc6978bf37a32586636c0070b03e4e23d00650c1440f448809e1018ef9f6d8", + "0x8056e0913a60155348300e3a62e28b5e30629a90f7dd4fe11289097076708110a1d70f7855601782a3cdc5bdb1ca9626", + "0xb4980fd3ea17bac0ba9ee1c470b17e575bb52e83ebdd7d40c93f4f87bebeaff1c8a679f9d3d09d635f068d37d5bd28bd", + "0x905a9299e7e1853648e398901dfcd437aa575c826551f83520df62984f5679cb5f0ea86aa45ed3e18b67ddc0dfafe809", + "0xab99553bf31a84f2e0264eb34a08e13d8d15e2484aa9352354becf9a15999c76cc568d68274b70a65e49703fc23540d0", + "0xa43681597bc574d2dae8964c9a8dc1a07613d7a1272bdcb818d98c85d44e16d744250c33f3b5e4d552d97396b55e601f", + "0xa54e5a31716fccb50245898c99865644405b8dc920ded7a11f3d19bdc255996054b268e16f2e40273f11480e7145f41e", + "0x8134f3ad5ef2ad4ba12a8a4e4d8508d91394d2bcdc38b7c8c8c0b0a820357ac9f79d286c65220f471eb1adca1d98fc68", + "0x94e2f755e60471578ab2c1adb9e9cea28d4eec9b0e92e0140770bca7002c365fcabfe1e5fb4fe6cfe79a0413712aa3ef", + "0xad48f8d0ce7eb3cc6e2a3086ad96f562e5bed98a360721492ae2e74dc158586e77ec8c35d5fd5927376301b7741bad2b", + "0x8614f0630bdd7fbad3a31f55afd9789f1c605dc85e7dc67e2edfd77f5105f878bb79beded6e9f0b109e38ea7da67e8d5", + "0x9804c284c4c5e77dabb73f655b12181534ca877c3e1e134aa3f47c23b7ec92277db34d2b0a5d38d2b69e5d1c3008a3e3", + "0xa51b99c3088e473afdaa9e0a9f7e75a373530d3b04e44e1148da0726b95e9f5f0c7e571b2da000310817c36f84b19f7f", + "0xac4ff909933b3b76c726b0a382157cdc74ab851a1ac6cef76953c6444441804cc43abb883363f416592e8f6cfbc4550b", + "0xae7d915eb9fc928b65a29d6edbc75682d08584d0014f7bcf17d59118421ae07d26a02137d1e4de6938bcd1ab8ef48fad", + "0x852f7e453b1af89b754df6d11a40d5d41ea057376e8ecacd705aacd2f917457f4a093d6b9a8801837fa0f62986ad7149", + "0x92c6bf5ada5d0c3d4dd8058483de36c215fa98edab9d75242f3eff9db07c734ad67337da6f0eefe23a487bf75a600dee", + "0xa2b42c09d0db615853763552a48d2e704542bbd786aae016eb58acbf6c0226c844f5fb31e428cb6450b9db855f8f2a6f", + "0x880cc07968266dbfdcfbc21815cd69e0eddfee239167ac693fb0413912d816f2578a74f7716eecd6deefa68c6eccd394", + "0xb885b3ace736cd373e8098bf75ba66fa1c6943ca1bc4408cd98ac7074775c4478594f91154b8a743d9c697e1b29f5840", + "0xa51ce78de512bd87bfa0835de819941dffbf18bec23221b61d8096fc9436af64e0693c335b54e7bfc763f287bdca2db6", + "0xa3c76166a3bdb9b06ef696e57603b58871bc72883ee9d45171a30fe6e1d50e30bc9c51b4a0f5a7270e19a77b89733850", + "0xacefc5c6f8a1e7c24d7b41e0fc7f6f3dc0ede6cf3115ffb9a6e54b1d954cbca9bda8ad7a084be9be245a1b8e9770d141", + "0xb420ed079941842510e31cfad117fa11fb6b4f97dfbc6298cb840f27ebaceba23eeaf3f513bcffbf5e4aae946310182d", + "0x95c3bb5ef26c5ed2f035aa5d389c6b3c15a6705b9818a3fefaed28922158b35642b2e8e5a1a620fdad07e75ad4b43af4", + "0x825149f9081ecf07a2a4e3e8b5d21bade86c1a882475d51c55ee909330b70c5a2ac63771c8600c6f38df716af61a3ea1", + "0x873b935aae16d9f08adbc25353cee18af2f1b8d5f26dec6538d6bbddc515f2217ed7d235dcfea59ae61b428798b28637", + "0x9294150843a2bedcedb3bb74c43eb28e759cf9499582c5430bccefb574a8ddd4f11f9929257ff4c153990f9970a2558f", + "0xb619563a811cc531da07f4f04e5c4c6423010ff9f8ed7e6ec9449162e3d501b269fb1c564c09c0429431879b0f45df02", + "0x91b509b87eb09f007d839627514658c7341bc76d468920fe8a740a8cb96a7e7e631e0ea584a7e3dc1172266f641d0f5c", + "0x8b8aceace9a7b9b4317f1f01308c3904d7663856946afbcea141a1c615e21ccad06b71217413e832166e9dd915fbe098", + "0x87b3b36e725833ea0b0f54753c3728c0dbc87c52d44d705ffc709f2d2394414c652d3283bab28dcce09799504996cee0", + "0xb2670aad5691cbf308e4a6a77a075c4422e6cbe86fdba24e9f84a313e90b0696afb6a067eebb42ba2d10340d6a2f6e51", + "0x876784a9aff3d54faa89b2bacd3ff5862f70195d0b2edc58e8d1068b3c9074c0da1cfa23671fe12f35e33b8a329c0ccd", + "0x8b48b9e758e8a8eae182f5cbec96f67d20cca6d3eee80a2d09208eb1d5d872e09ef23d0df8ebbb9b01c7449d0e3e3650", + "0xb79303453100654c04a487bdcadc9e3578bc80930c489a7069a52e8ca1dba36c492c8c899ce025f8364599899baa287d", + "0x961b35a6111da54ece6494f24dacd5ea46181f55775b5f03df0e370c34a5046ac2b4082925855325bb42bc2a2c98381d", + "0xa31feb1be3f5a0247a1f7d487987eb622e34fca817832904c6ee3ee60277e5847945a6f6ea1ac24542c72e47bdf647df", + "0xa12a2aa3e7327e457e1aae30e9612715dd2cfed32892c1cd6dcda4e9a18203af8a44afb46d03b2eed89f6b9c5a2c0c23", + "0xa08265a838e69a2ca2f80fead6ccf16f6366415b920c0b22ee359bcd8d4464ecf156f400a16a7918d52e6d733dd64211", + "0xb723d6344e938d801cca1a00032af200e541d4471fd6cbd38fb9130daa83f6a1dffbbe7e67fc20f9577f884acd7594b2", + "0xa6733d83ec78ba98e72ddd1e7ff79b7adb0e559e256760d0c590a986e742445e8cdf560d44b29439c26d87edd0b07c8c", + "0xa61c2c27d3f7b9ff4695a17afedf63818d4bfba390507e1f4d0d806ce8778d9418784430ce3d4199fd3bdbc2504d2af3", + "0x8332f3b63a6dc985376e8b1b25eeae68be6160fbe40053ba7bcf6f073204f682da72321786e422d3482fd60c9e5aa034", + "0xa280f44877583fbb6b860d500b1a3f572e3ee833ec8f06476b3d8002058e25964062feaa1e5bec1536d734a5cfa09145", + "0xa4026a52d277fcea512440d2204f53047718ebfcae7b48ac57ea7f6bfbc5de9d7304db9a9a6cbb273612281049ddaec5", + "0x95cdf69c831ab2fad6c2535ede9c07e663d2ddccc936b64e0843d2df2a7b1c31f1759c3c20f1e7a57b1c8f0dbb21b540", + "0x95c96cec88806469c277ab567863c5209027cecc06c7012358e5f555689c0d9a5ffb219a464f086b45817e8536b86d2f", + "0xafe38d4684132a0f03d806a4c8df556bf589b25271fbc6fe2e1ed16de7962b341c5003755da758d0959d2e6499b06c68", + "0xa9b77784fda64987f97c3a23c5e8f61b918be0f7c59ba285084116d60465c4a2aaafc8857eb16823282cc83143eb9126", + "0xa830f05881ad3ce532a55685877f529d32a5dbe56cea57ffad52c4128ee0fad0eeaf0da4362b55075e77eda7babe70e5", + "0x992b3ad190d6578033c13ed5abfee4ef49cbc492babb90061e3c51ee4b5790cdd4c8fc1abff1fa2c00183b6b64f0bbbe", + "0xb1015424d9364aeff75de191652dc66484fdbec3e98199a9eb9671ec57bec6a13ff4b38446e28e4d8aedb58dd619cd90", + "0xa745304604075d60c9db36cada4063ac7558e7ec2835d7da8485e58d8422e817457b8da069f56511b02601289fbb8981", + "0xa5ba4330bc5cb3dbe0486ddf995632a7260a46180a08f42ae51a2e47778142132463cc9f10021a9ad36986108fefa1a9", + "0xb419e9fd4babcaf8180d5479db188bb3da232ae77a1c4ed65687c306e6262f8083070a9ac32220cddb3af2ec73114092", + "0xa49e23dc5f3468f3bf3a0bb7e4a114a788b951ff6f23a3396ae9e12cbff0abd1240878a3d1892105413dbc38818e807c", + "0xb7ecc7b4831f650202987e85b86bc0053f40d983f252e9832ef503aea81c51221ce93279da4aa7466c026b2d2070e55d", + "0x96a8c35cb87f84fa84dcd6399cc2a0fd79cc9158ef4bdde4bae31a129616c8a9f2576cd19baa3f497ca34060979aed7d", + "0x8681b2c00aa62c2b519f664a95dcb8faef601a3b961bb4ce5d85a75030f40965e2983871d41ea394aee934e859581548", + "0x85c229a07efa54a713d0790963a392400f55fbb1a43995a535dc6c929f20d6a65cf4efb434e0ad1cb61f689b8011a3bc", + "0x90856f7f3444e5ad44651c28e24cc085a5db4d2ffe79aa53228c26718cf53a6e44615f3c5cda5aa752d5f762c4623c66", + "0x978999b7d8aa3f28a04076f74d11c41ef9c89fdfe514936c4238e0f13c38ec97e51a5c078ebc6409e517bfe7ccb42630", + "0xa099914dd7ed934d8e0d363a648e9038eb7c1ec03fa04dbcaa40f7721c618c3ef947afef7a16b4d7ac8c12aa46637f03", + "0xab2a104fed3c83d16f2cda06878fa5f30c8c9411de71bfb67fd2fc9aa454dcbcf3d299d72f8cc12e919466a50fcf7426", + "0xa4471d111db4418f56915689482f6144efc4664cfb0311727f36c864648d35734351becc48875df96f4abd3cfcf820f9", + "0x83be11727cd30ea94ccc8fa31b09b81c9d6a9a5d3a4686af9da99587332fe78c1f94282f9755854bafd6033549afec91", + "0x88020ff971dc1a01a9e993cd50a5d2131ffdcbb990c1a6aaa54b20d8f23f9546a70918ea57a21530dcc440c1509c24ad", + "0xae24547623465e87905eaffa1fa5d52bb7c453a8dbd89614fa8819a2abcedaf455c2345099b7324ae36eb0ad7c8ef977", + "0xb59b0c60997de1ee00b7c388bc7101d136c9803bf5437b1d589ba57c213f4f835a3e4125b54738e78abbc21b000f2016", + "0xa584c434dfe194546526691b68fa968c831c31da42303a1d735d960901c74011d522246f37f299555416b8cf25c5a548", + "0x80408ce3724f4837d4d52376d255e10f69eb8558399ae5ca6c11b78b98fe67d4b93157d2b9b639f1b5b64198bfe87713", + "0xabb941e8d406c2606e0ddc35c113604fdd9d249eacc51cb64e2991e551b8639ce44d288cc92afa7a1e7fc599cfc84b22", + "0xb223173f560cacb1c21dba0f1713839e348ad02cbfdef0626748604c86f89e0f4c919ed40b583343795bdd519ba952c8", + "0xaf1c70512ec3a19d98b8a1fc3ff7f7f5048a27d17d438d43f561974bbdd116fcd5d5c21040f3447af3f0266848d47a15", + "0x8a44809568ebe50405bede19b4d2607199159b26a1b33e03d180e6840c5cf59d991a4fb150d111443235d75ecad085b7", + "0xb06207cdca46b125a27b3221b5b50cf27af4c527dd7c80e2dbcebbb09778a96df3af67e50f07725239ce3583dad60660", + "0x993352d9278814ec89b26a11c4a7c4941bf8f0e6781ae79559d14749ee5def672259792db4587f85f0100c7bb812f933", + "0x9180b8a718b971fd27bc82c8582d19c4b4f012453e8c0ffeeeffe745581fc6c07875ab28be3af3fa3896d19f0c89ac5b", + "0x8b8e1263eb48d0fe304032dd5ea1f30e73f0121265f7458ba9054d3626894e8a5fef665340abd2ede9653045c2665938", + "0x99a2beee4a10b7941c24b2092192faf52b819afd033e4a2de050fd6c7f56d364d0cf5f99764c3357cf32399e60fc5d74", + "0x946a4aad7f8647ea60bee2c5fcdeb6f9a58fb2cfca70c4d10e458027a04846e13798c66506151be3df9454b1e417893f", + "0xa672a88847652d260b5472d6908d1d57e200f1e492d30dd1cecc441cdfc9b76e016d9bab560efd4d7f3c30801de884a9", + "0x9414e1959c156cde1eb24e628395744db75fc24b9df4595350aaad0bc38e0246c9b4148f6443ef68b8e253a4a6bcf11c", + "0x9316e9e4ec5fab4f80d6540df0e3a4774db52f1d759d2e5b5bcd3d7b53597bb007eb1887cb7dc61f62497d51ffc8d996", + "0x902d6d77bb49492c7a00bc4b70277bc28c8bf9888f4307bb017ac75a962decdedf3a4e2cf6c1ea9f9ba551f4610cbbd7", + "0xb07025a18b0e32dd5e12ec6a85781aa3554329ea12c4cd0d3b2c22e43d777ef6f89876dd90a9c8fb097ddf61cf18adc5", + "0xb355a849ad3227caa4476759137e813505ec523cbc2d4105bc7148a4630f9e81918d110479a2d5f5e4cd9ccec9d9d3e3", + "0xb49532cfdf02ee760109881ad030b89c48ee3bb7f219ccafc13c93aead754d29bdafe345be54c482e9d5672bd4505080", + "0x9477802410e263e4f938d57fa8f2a6cac7754c5d38505b73ee35ea3f057aad958cb9722ba6b7b3cfc4524e9ca93f9cdc", + "0x9148ea83b4436339580f3dbc9ba51509e9ab13c03063587a57e125432dd0915f5d2a8f456a68f8fff57d5f08c8f34d6e", + "0xb00b6b5392b1930b54352c02b1b3b4f6186d20bf21698689bbfc7d13e86538a4397b90e9d5c93fd2054640c4dbe52a4f", + "0x926a9702500441243cd446e7cbf15dde16400259726794694b1d9a40263a9fc9e12f7bcbf12a27cb9aaba9e2d5848ddc", + "0xa0c6155f42686cbe7684a1dc327100962e13bafcf3db97971fc116d9f5c0c8355377e3d70979cdbd58fd3ea52440901c", + "0xa277f899f99edb8791889d0817ea6a96c24a61acfda3ad8c3379e7c62b9d4facc4b965020b588651672fd261a77f1bfc", + "0x8f528cebb866b501f91afa50e995234bef5bf20bff13005de99cb51eaac7b4f0bf38580cfd0470de40f577ead5d9ba0f", + "0x963fc03a44e9d502cc1d23250efef44d299befd03b898d07ce63ca607bb474b5cf7c965a7b9b0f32198b04a8393821f7", + "0xab087438d0a51078c378bf4a93bd48ef933ff0f1fa68d02d4460820df564e6642a663b5e50a5fe509527d55cb510ae04", + "0xb0592e1f2c54746bb076be0fa480e1c4bebc4225e1236bcda3b299aa3853e3afb401233bdbcfc4a007b0523a720fbf62", + "0x851613517966de76c1c55a94dc4595f299398a9808f2d2f0a84330ba657ab1f357701d0895f658c18a44cb00547f6f57", + "0xa2fe9a1dd251e72b0fe4db27be508bb55208f8f1616b13d8be288363ec722826b1a1fd729fc561c3369bf13950bf1fd6", + "0xb896cb2bc2d0c77739853bc59b0f89b2e008ba1f701c9cbe3bef035f499e1baee8f0ff1e794854a48c320586a2dfc81a", + "0xa1b60f98e5e5106785a9b81a85423452ee9ef980fa7fa8464f4366e73f89c50435a0c37b2906052b8e58e212ebd366cf", + "0xa853b0ebd9609656636df2e6acd5d8839c0fda56f7bf9288a943b06f0b67901a32b95e016ca8bc99bd7b5eab31347e72", + "0xb290fa4c1346963bd5225235e6bdf7c542174dab4c908ab483d1745b9b3a6015525e398e1761c90e4b49968d05e30eea", + "0xb0f65a33ad18f154f1351f07879a183ad62e5144ad9f3241c2d06533dad09cbb2253949daff1bb02d24d16a3569f7ef0", + "0xa00db59b8d4218faf5aeafcd39231027324408f208ec1f54d55a1c41228b463b88304d909d16b718cfc784213917b71e", + "0xb8d695dd33dc2c3bc73d98248c535b2770ad7fa31aa726f0aa4b3299efb0295ba9b4a51c71d314a4a1bd5872307534d1", + "0xb848057cca2ca837ee49c42b88422303e58ea7d2fc76535260eb5bd609255e430514e927cc188324faa8e657396d63ec", + "0x92677836061364685c2aaf0313fa32322746074ed5666fd5f142a7e8f87135f45cd10e78a17557a4067a51dfde890371", + "0xa854b22c9056a3a24ab164a53e5c5cf388616c33e67d8ebb4590cb16b2e7d88b54b1393c93760d154208b5ca822dc68f", + "0x86fff174920388bfab841118fb076b2b0cdec3fdb6c3d9a476262f82689fb0ed3f1897f7be9dbf0932bb14d346815c63", + "0x99661cf4c94a74e182752bcc4b98a8c2218a8f2765642025048e12e88ba776f14f7be73a2d79bd21a61def757f47f904", + "0x8a8893144d771dca28760cba0f950a5d634195fd401ec8cf1145146286caffb0b1a6ba0c4c1828d0a5480ce49073c64c", + "0x938a59ae761359ee2688571e7b7d54692848eb5dde57ffc572b473001ea199786886f8c6346a226209484afb61d2e526", + "0x923f68a6aa6616714cf077cf548aeb845bfdd78f2f6851d8148cba9e33a374017f2f3da186c39b82d14785a093313222", + "0xac923a93d7da7013e73ce8b4a2b14b8fd0cc93dc29d5de941a70285bdd19be4740fedfe0c56b046689252a3696e9c5bc", + "0xb49b32c76d4ec1a2c68d4989285a920a805993bc6fcce6dacd3d2ddae73373050a5c44ba8422a3781050682fa0ef6ba2", + "0x8a367941c07c3bdca5712524a1411bad7945c7c48ffc7103b1d4dff2c25751b0624219d1ccde8c3f70c465f954be5445", + "0xb838f029df455efb6c530d0e370bbbf7d87d61a9aea3d2fe5474c5fe0a39cf235ceecf9693c5c6c5820b1ba8f820bd31", + "0xa8983b7c715eaac7f13a001d2abc462dfc1559dab4a6b554119c271aa8fe00ffcf6b6949a1121f324d6d26cb877bcbae", + "0xa2afb24ad95a6f14a6796315fbe0d8d7700d08f0cfaf7a2abe841f5f18d4fecf094406cbd54da7232a159f9c5b6e805e", + "0x87e8e95ad2d62f947b2766ff405a23f7a8afba14e7f718a691d95369c79955cdebe24c54662553c60a3f55e6322c0f6f", + "0x87c2cbcecb754e0cc96128e707e5c5005c9de07ffd899efa3437cadc23362f5a1d3fcdd30a1f5bdc72af3fb594398c2a", + "0x91afd6ee04f0496dc633db88b9370d41c428b04fd991002502da2e9a0ef051bcd7b760e860829a44fbe5539fa65f8525", + "0x8c50e5d1a24515a9dd624fe08b12223a75ca55196f769f24748686315329b337efadca1c63f88bee0ac292dd0a587440", + "0x8a07e8f912a38d94309f317c32068e87f68f51bdfa082d96026f5f5f8a2211621f8a3856dda8069386bf15fb2d28c18f", + "0x94ad1dbe341c44eeaf4dc133eed47d8dbfe752575e836c075745770a6679ff1f0e7883b6aa917462993a7f469d74cab5", + "0x8745f8bd86c2bb30efa7efb7725489f2654f3e1ac4ea95bd7ad0f3cfa223055d06c187a16192d9d7bdaea7b050c6a324", + "0x900d149c8d79418cda5955974c450a70845e02e5a4ecbcc584a3ca64d237df73987c303e3eeb79da1af83bf62d9e579f", + "0x8f652ab565f677fb1a7ba03b08004e3cda06b86c6f1b0b9ab932e0834acf1370abb2914c15b0d08327b5504e5990681c", + "0x9103097d088be1f75ab9d3da879106c2f597e2cc91ec31e73430647bdd5c33bcfd771530d5521e7e14df6acda44f38a6", + "0xb0fec7791cfb0f96e60601e1aeced9a92446b61fedab832539d1d1037558612d78419efa87ff5f6b7aab8fd697d4d9de", + "0xb9d2945bdb188b98958854ba287eb0480ef614199c4235ce5f15fc670b8c5ffe8eeb120c09c53ea8a543a022e6a321ac", + "0xa9461bb7d5490973ebaa51afc0bb4a5e42acdccb80e2f939e88b77ac28a98870e103e1042899750f8667a8cc9123bae9", + "0xa37fdf11d4bcb2aed74b9f460a30aa34afea93386fa4cdb690f0a71bc58f0b8df60bec56e7a24f225978b862626fa00e", + "0xa214420e183e03d531cf91661466ea2187d84b6e814b8b20b3730a9400a7d25cf23181bb85589ebc982cec414f5c2923", + "0xad09a45a698a6beb3e0915f540ef16e9af7087f53328972532d6b5dfe98ce4020555ece65c6cbad8bd6be8a4dfefe6fd", + "0xab6742800b02728c92d806976764cb027413d6f86edd08ad8bb5922a2969ee9836878cd39db70db0bd9a2646862acc4f", + "0x974ca9305bd5ea1dc1755dff3b63e8bfe9f744321046c1395659bcea2a987b528e64d5aa96ac7b015650b2253b37888d", + "0x84eee9d6bce039c52c2ebc4fccc0ad70e20c82f47c558098da4be2f386a493cbc76adc795b5488c8d11b6518c2c4fab8", + "0x875d7bda46efcb63944e1ccf760a20144df3b00d53282b781e95f12bfc8f8316dfe6492c2efbf796f1150e36e436e9df", + "0xb68a2208e0c587b5c31b5f6cb32d3e6058a9642e2d9855da4f85566e1412db528475892060bb932c55b3a80877ad7b4a", + "0xba006368ecab5febb6ab348644d9b63de202293085ed468df8bc24d992ae8ce468470aa37f36a73630c789fb9c819b30", + "0x90a196035150846cd2b482c7b17027471372a8ce7d914c4d82b6ea7fa705d8ed5817bd42d63886242585baf7d1397a1c", + "0xa223b4c85e0daa8434b015fd9170b5561fe676664b67064974a1e9325066ecf88fc81f97ab5011c59fad28cedd04b240", + "0x82e8ec43139cf15c6bbeed484b62e06cded8a39b5ce0389e4cbe9c9e9c02f2f0275d8d8d4e8dfec8f69a191bef220408", + "0x81a3fc07a7b68d92c6ee4b6d28f5653ee9ec85f7e2ee1c51c075c1b130a8c5097dc661cf10c5aff1c7114b1a6a19f11a", + "0x8ed2ef8331546d98819a5dd0e6c9f8cb2630d0847671314a28f277faf68da080b53891dd75c82cbcf7788b255490785d", + "0xacecabf84a6f9bbed6b2fc2e7e4b48f02ef2f15e597538a73aea8f98addc6badda15e4695a67ecdb505c1554e8f345ec", + "0xb8f51019b2aa575f8476e03dcadf86cc8391f007e5f922c2a36b2daa63f5a503646a468990cd5c65148d323942193051", + "0xaaa595a84b403ec65729bc1c8055a94f874bf9adddc6c507b3e1f24f79d3ad359595a672b93aab3394db4e2d4a7d8970", + "0x895144c55fcbd0f64d7dd69e6855cfb956e02b5658eadf0f026a70703f3643037268fdd673b0d21b288578a83c6338dd", + "0xa2e92ae6d0d237d1274259a8f99d4ea4912a299816350b876fba5ebc60b714490e198a916e1c38c6e020a792496fa23c", + "0xa45795fda3b5bb0ad1d3c628f6add5b2a4473a1414c1a232e80e70d1cfffd7f8a8d9861f8df2946999d7dbb56bf60113", + "0xb6659bf7f6f2fef61c39923e8c23b8c70e9c903028d8f62516d16755cd3fba2fe41c285aa9432dc75ab08f8a1d8a81fc", + "0xa735609a6bc5bfd85e58234fc439ff1f58f1ff1dd966c5921d8b649e21f006bf2b8642ad8a75063c159aaf6935789293", + "0xa3c622eb387c9d15e7bda2e3e84d007cb13a6d50d655c3f2f289758e49d3b37b9a35e4535d3cc53d8efd51f407281f19", + "0x8afe147b53ad99220f5ef9d763bfc91f9c20caecbcf823564236fb0e6ede49414c57d71eec4772c8715cc65a81af0047", + "0xb5f0203233cf71913951e9c9c4e10d9243e3e4a1f2cb235bf3f42009120ba96e04aa414c9938ea8873b63148478927e8", + "0x93c52493361b458d196172d7ba982a90a4f79f03aa8008edc322950de3ce6acf4c3977807a2ffa9e924047e02072b229", + "0xb9e72b805c8ac56503f4a86c82720afbd5c73654408a22a2ac0b2e5caccdfb0e20b59807433a6233bc97ae58cf14c70a", + "0xaf0475779b5cee278cca14c82da2a9f9c8ef222eb885e8c50cca2315fea420de6e04146590ed0dd5a29c0e0812964df5", + "0xb430ccab85690db02c2d0eb610f3197884ca12bc5f23c51e282bf3a6aa7e4a79222c3d8761454caf55d6c01a327595f9", + "0x830032937418b26ee6da9b5206f3e24dc76acd98589e37937e963a8333e5430abd6ce3dd93ef4b8997bd41440eed75d6", + "0x8820a6d73180f3fe255199f3f175c5eb770461ad5cfdde2fb11508041ed19b8c4ce66ad6ecebf7d7e836cc2318df47ca", + "0xaef1393e7d97278e77bbf52ef6e1c1d5db721ccf75fe753cf47a881fa034ca61eaa5098ee5a344c156d2b14ff9e284ad", + "0x8a4a26c07218948c1196c45d927ef4d2c42ade5e29fe7a91eaebe34a29900072ce5194cf28d51f746f4c4c649daf4396", + "0x84011dc150b7177abdcb715efbd8c201f9cb39c36e6069af5c50a096021768ba40cef45b659c70915af209f904ede3b6", + "0xb1bd90675411389bb66910b21a4bbb50edce5330850c5ab0b682393950124252766fc81f5ecfc72fb7184387238c402e", + "0x8dfdcd30583b696d2c7744655f79809f451a60c9ad5bf1226dc078b19f4585d7b3ef7fa9d54e1ac09520d95cbfd20928", + "0xb351b4dc6d98f75b8e5a48eb7c6f6e4b78451991c9ba630e5a1b9874c15ac450cd409c1a024713bf2cf82dc400e025ef", + "0xa462b8bc97ac668b97b28b3ae24b9f5de60e098d7b23ecb600d2194cd35827fb79f77c3e50d358f5bd72ee83fef18fa0", + "0xa183753265c5f7890270821880cce5f9b2965b115ba783c6dba9769536f57a04465d7da5049c7cf8b3fcf48146173c18", + "0xa8a771b81ed0d09e0da4d79f990e58eabcd2be3a2680419502dd592783fe52f657fe55125b385c41d0ba3b9b9cf54a83", + "0xa71ec577db46011689d073245e3b1c3222a9b1fe6aa5b83629adec5733dd48617ebea91346f0dd0e6cdaa86e4931b168", + "0xa334b8b244f0d598a02da6ae0f918a7857a54dce928376c4c85df15f3b0f2ba3ac321296b8b7c9dd47d770daf16c8f8c", + "0xa29037f8ef925c417c90c4df4f9fb27fb977d04e2b3dd5e8547d33e92ab72e7a00f5461de21e28835319eae5db145eb7", + "0xb91054108ae78b00e3298d667b913ebc44d8f26e531eae78a8fe26fdfb60271c97efb2dee5f47ef5a3c15c8228138927", + "0x926c13efbe90604f6244be9315a34f72a1f8d1aab7572df431998949c378cddbf2fe393502c930fff614ff06ae98a0ce", + "0x995c758fd5600e6537089b1baa4fbe0376ab274ff3e82a17768b40df6f91c2e443411de9cafa1e65ea88fb8b87d504f4", + "0x9245ba307a7a90847da75fca8d77ec03fdfc812c871e7a2529c56a0a79a6de16084258e7a9ac4ae8a3756f394336e21c", + "0x99e0cfa2bb57a7e624231317044c15e52196ecce020db567c8e8cb960354a0be9862ee0c128c60b44777e65ac315e59f", + "0xad4f6b3d27bbbb744126601053c3dc98c07ff0eb0b38a898bd80dce778372846d67e5ab8fb34fb3ad0ef3f235d77ba7f", + "0xa0f12cae3722bbbca2e539eb9cc7614632a2aefe51410430070a12b5bc5314ecec5857b7ff8f41e9980cac23064f7c56", + "0xb487f1bc59485848c98222fd3bc36c8c9bb3d2912e2911f4ceca32c840a7921477f9b1fe00877e05c96c75d3eecae061", + "0xa6033db53925654e18ecb3ce715715c36165d7035db9397087ac3a0585e587998a53973d011ac6d48af439493029cee6", + "0xa6b4d09cd01c70a3311fd131d3710ccf97bde3e7b80efd5a8c0eaeffeb48cca0f951ced905290267b115b06d46f2693b", + "0xa9dff1df0a8f4f218a98b6f818a693fb0d611fed0fc3143537cbd6578d479af13a653a8155e535548a2a0628ae24fa58", + "0xa58e469f65d366b519f9a394cacb7edaddac214463b7b6d62c2dbc1316e11c6c5184ce45c16de2d77f990dcdd8b55430", + "0x989e71734f8119103586dc9a3c5f5033ddc815a21018b34c1f876cdfc112efa868d5751bf6419323e4e59fa6a03ece1c", + "0xa2da00e05036c884369e04cf55f3de7d659cd5fa3f849092b2519dd263694efe0f051953d9d94b7e121f0aee8b6174d7", + "0x968f3c029f57ee31c4e1adea89a7f92e28483af9a74f30fbdb995dc2d40e8e657dff8f8d340d4a92bf65f54440f2859f", + "0x932778df6f60ac1639c1453ef0cbd2bf67592759dcccb3e96dcc743ff01679e4c7dd0ef2b0833dda548d32cb4eba49e2", + "0xa805a31139f8e0d6dae1ac87d454b23a3dc9fc653d4ca18d4f8ebab30fc189c16e73981c2cb7dd6f8c30454a5208109d", + "0xa9ba0991296caa2aaa4a1ceacfb205544c2a2ec97088eace1d84ee5e2767656a172f75d2f0c4e16a3640a0e0dec316e0", + "0xb1e49055c968dced47ec95ae934cf45023836d180702e20e2df57e0f62fb85d7ac60d657ba3ae13b8560b67210449459", + "0xa94e1da570a38809c71e37571066acabff7bf5632737c9ab6e4a32856924bf6211139ab3cedbf083850ff2d0e0c0fcfc", + "0x88ef1bb322000c5a5515b310c838c9af4c1cdbb32eab1c83ac3b2283191cd40e9573747d663763a28dad0d64adc13840", + "0xa987ce205f923100df0fbd5a85f22c9b99b9b9cbe6ddfa8dfda1b8fe95b4f71ff01d6c5b64ca02eb24edb2b255a14ef0", + "0x84fe8221a9e95d9178359918a108de4763ebfa7a6487facb9c963406882a08a9a93f492f8e77cf9e7ea41ae079c45993", + "0xaa1cf3dc7c5dcfa15bbbc811a4bb6dbac4fba4f97fb1ed344ab60264d7051f6eef19ea9773441d89929ee942ed089319", + "0x8f6a7d610d59d9f54689bbe6a41f92d9f6096cde919c1ab94c3c7fcecf0851423bc191e5612349e10f855121c0570f56", + "0xb5af1fa7894428a53ea520f260f3dc3726da245026b6d5d240625380bfb9c7c186df0204bb604efac5e613a70af5106e", + "0xa5bce6055ff812e72ce105f147147c7d48d7a2313884dd1f488b1240ee320f13e8a33f5441953a8e7a3209f65b673ce1", + "0xb9b55b4a1422677d95821e1d042ab81bbf0bf087496504021ec2e17e238c2ca6b44fb3b635a5c9eac0871a724b8d47c3", + "0x941c38e533ce4a673a3830845b56786585e5fe49c427f2e5c279fc6db08530c8f91db3e6c7822ec6bb4f956940052d18", + "0xa38e191d66c625f975313c7007bbe7431b5a06ed2da1290a7d5d0f2ec73770d476efd07b8e632de64597d47df175cbb0", + "0x94ba76b667abf055621db4c4145d18743a368d951565632ed4e743dd50dd3333507c0c34f286a5c5fdbf38191a2255cd", + "0xa5ca38c60be5602f2bfa6e00c687ac96ac36d517145018ddbee6f12eb0faa63dd57909b9eeed26085fe5ac44e55d10ab", + "0xb00fea3b825e60c1ed1c5deb4b551aa65a340e5af36b17d5262c9cd2c508711e4dc50dc2521a2c16c7c901902266e64a", + "0x971b86fc4033485e235ccb0997a236206ba25c6859075edbcdf3c943116a5030b7f75ebca9753d863a522ba21a215a90", + "0xb3b31f52370de246ee215400975b674f6da39b2f32514fe6bd54e747752eedca22bb840493b44a67df42a3639c5f901f", + "0xaffbbfac9c1ba7cbfa1839d2ae271dd6149869b75790bf103230637da41857fc326ef3552ff31c15bda0694080198143", + "0xa95d42aa7ef1962520845aa3688f2752d291926f7b0d73ea2ee24f0612c03b43f2b0fe3c9a9a99620ffc8d487b981bc2", + "0x914a266065caf64985e8c5b1cb2e3f4e3fe94d7d085a1881b1fefa435afef4e1b39a98551d096a62e4f5cc1a7f0fdc2e", + "0x81a0b4a96e2b75bc1bf2dbd165d58d55cfd259000a35504d1ffb18bc346a3e6f07602c683723864ffb980f840836fd8d", + "0x91c1556631cddd4c00b65b67962b39e4a33429029d311c8acf73a18600e362304fb68bccb56fde40f49e95b7829e0b87", + "0x8befbacc19e57f7c885d1b7a6028359eb3d80792fe13b92a8400df21ce48deb0bb60f2ddb50e3d74f39f85d7eab23adc", + "0x92f9458d674df6e990789690ec9ca73dacb67fc9255b58c417c555a8cc1208ace56e8e538f86ba0f3615573a0fbac00d", + "0xb4b1b3062512d6ae7417850c08c13f707d5838e43d48eb98dd4621baf62eee9e82348f80fe9b888a12874bfa538771f8", + "0xa13c4a3ac642ede37d9c883f5319e748d2b938f708c9d779714108a449b343f7b71a6e3ef4080fee125b416762920273", + "0xaf44983d5fc8cceee0551ef934e6e653f2d3efa385e5c8a27a272463a6f333e290378cc307c2b664eb923c78994e706e", + "0xa389fd6c59fe2b4031cc244e22d3991e541bd203dd5b5e73a6159e72df1ab41d49994961500dcde7989e945213184778", + "0x8d2141e4a17836c548de9598d7b298b03f0e6c73b7364979a411c464e0628e21cff6ac3d6decdba5d1c4909eff479761", + "0x980b22ef53b7bdf188a3f14bc51b0dbfdf9c758826daa3cbc1e3986022406a8aa9a6a79e400567120b88c67faa35ce5f", + "0xa28882f0a055f96df3711de5d0aa69473e71245f4f3e9aa944e9d1fb166e02caa50832e46da6d3a03b4801735fd01b29", + "0x8db106a37d7b88f5d995c126abb563934dd8de516af48e85695d02b1aea07f79217e3cdd03c6f5ca57421830186c772b", + "0xb5a7e50da0559a675c472f7dfaee456caab6695ab7870541b2be8c2b118c63752427184aad81f0e1afc61aef1f28c46f", + "0x9962118780e20fe291d10b64f28d09442a8e1b5cffd0f3dd68d980d0614050a626c616b44e9807fbee7accecae00686a", + "0xb38ddf33745e8d2ad6a991aefaf656a33c5f8cbe5d5b6b6fd03bd962153d8fd0e01b5f8f96d80ae53ab28d593ab1d4e7", + "0x857dc12c0544ff2c0c703761d901aba636415dee45618aba2e3454ff9cbc634a85c8b05565e88520ff9be2d097c8b2b1", + "0xa80d465c3f8cc63af6d74a6a5086b626c1cb4a8c0fee425964c3bd203d9d7094e299f81ce96d58afc20c8c9a029d9dae", + "0x89e1c8fbde8563763be483123a3ed702efac189c6d8ab4d16c85e74bbaf856048cc42d5d6e138633a38572ba5ec3f594", + "0x893a594cf495535f6d216508f8d03c317dcf03446668cba688da90f52d0111ac83d76ad09bf5ea47056846585ee5c791", + "0xaadbd8be0ae452f7f9450c7d2957598a20cbf10139a4023a78b4438172d62b18b0de39754dd2f8862dbd50a3a0815e53", + "0xae7d39670ecca3eb6db2095da2517a581b0e8853bdfef619b1fad9aacd443e7e6a40f18209fadd44038a55085c5fe8b2", + "0x866ef241520eacb6331593cfcb206f7409d2f33d04542e6e52cba5447934e02d44c471f6c9a45963f9307e9809ab91d9", + "0xb1a09911ad3864678f7be79a9c3c3eb5c84a0a45f8dcb52c67148f43439aeaaa9fd3ed3471276b7e588b49d6ebe3033a", + "0xadd07b7f0dbb34049cd8feeb3c18da5944bf706871cfd9f14ff72f6c59ad217ebb1f0258b13b167851929387e4e34cfe", + "0xae048892d5c328eefbdd4fba67d95901e3c14d974bfc0a1fc68155ca9f0d59e61d7ba17c6c9948b120cf35fd26e6fee9", + "0x9185b4f3b7da0ddb4e0d0f09b8a9e0d6943a4611e43f13c3e2a767ed8592d31e0ba3ebe1914026a3627680274291f6e5", + "0xa9c022d4e37b0802284ce3b7ee9258628ab4044f0db4de53d1c3efba9de19d15d65cc5e608dbe149c21c2af47d0b07b5", + "0xb24dbd5852f8f24921a4e27013b6c3fa8885b973266cb839b9c388efad95821d5d746348179dcc07542bd0d0aefad1ce", + "0xb5fb4f279300876a539a27a441348764908bc0051ebd66dc51739807305e73db3d2f6f0f294ffb91b508ab150eaf8527", + "0xace50841e718265b290c3483ed4b0fdd1175338c5f1f7530ae9a0e75d5f80216f4de37536adcbc8d8c95982e88808cd0", + "0xb19cadcde0f63bd1a9c24bd9c2806f53c14c0b9735bf351601498408ba503ddbd2037c891041cbba47f58b8c483f3b21", + "0xb6061e63558d312eb891b97b39aa552fa218568d79ee26fe6dd5b864aea9e3216d8f2e2f3b093503be274766dac41426", + "0x89730fdb2876ab6f0fe780d695f6e12090259027e789b819956d786e977518057e5d1d7f5ab24a3ae3d5d4c97773bd2b", + "0xb6fa841e81f9f2cad0163a02a63ae96dc341f7ae803b616efc6e1da2fbea551c1b96b11ad02c4afbdf6d0cc9f23da172", + "0x8fb66187182629c861ddb6896d7ed3caf2ad050c3dba8ab8eb0d7a2c924c3d44c48d1a148f9e33fb1f061b86972f8d21", + "0x86022ac339c1f84a7fa9e05358c1a5b316b4fc0b83dbe9c8c7225dc514f709d66490b539359b084ce776e301024345fa", + "0xb50b9c321468da950f01480bb62b6edafd42f83c0001d6e97f2bd523a1c49a0e8574fb66380ea28d23a7c4d54784f9f0", + "0xa31c05f7032f30d1dac06678be64d0250a071fd655e557400e4a7f4c152be4d5c7aa32529baf3e5be7c4bd49820054f6", + "0xb95ac0848cd322684772119f5b682d90a66bbf9dac411d9d86d2c34844bbd944dbaf8e47aa41380455abd51687931a78", + "0xae4a6a5ce9553b65a05f7935e61e496a4a0f6fd8203367a2c627394c9ce1e280750297b74cdc48fd1d9a31e93f97bef4", + "0xa22daf35f6e9b05e52e0b07f7bd1dbbebd2c263033fb0e1b2c804e2d964e2f11bc0ece6aca6af079dd3a9939c9c80674", + "0x902150e0cb1f16b9b59690db35281e28998ce275acb313900da8b2d8dfd29fa1795f8ca3ff820c31d0697de29df347c1", + "0xb17b5104a5dc665cdd7d47e476153d715eb78c6e5199303e4b5445c21a7fa7cf85fe7cfd08d7570f4e84e579b005428c", + "0xa03f49b81c15433f121680aa02d734bb9e363af2156654a62bcb5b2ba2218398ccb0ff61104ea5d7df5b16ea18623b1e", + "0x802101abd5d3c88876e75a27ffc2f9ddcce75e6b24f23dba03e5201281a7bd5cc7530b6a003be92d225093ca17d3c3bb", + "0xa4d183f63c1b4521a6b52226fc19106158fc8ea402461a5cccdaa35fee93669df6a8661f45c1750cd01308149b7bf08e", + "0x8d17c22e0c8403b69736364d460b3014775c591032604413d20a5096a94d4030d7c50b9fe3240e31d0311efcf9816a47", + "0x947225acfcce5992eab96276f668c3cbe5f298b90a59f2bb213be9997d8850919e8f496f182689b5cbd54084a7332482", + "0x8df6f4ed216fc8d1905e06163ba1c90d336ab991a18564b0169623eb39b84e627fa267397da15d3ed754d1f3423bff07", + "0x83480007a88f1a36dea464c32b849a3a999316044f12281e2e1c25f07d495f9b1710b4ba0d88e9560e72433addd50bc2", + "0xb3019d6e591cf5b33eb972e49e06c6d0a82a73a75d78d383dd6f6a4269838289e6e07c245f54fed67f5c9bb0fd5e1c5f", + "0x92e8ce05e94927a9fb02debadb99cf30a26172b2705003a2c0c47b3d8002bf1060edb0f6a5750aad827c98a656b19199", + "0xac2aff801448dbbfc13cca7d603fd9c69e82100d997faf11f465323b97255504f10c0c77401e4d1890339d8b224f5803", + "0xb0453d9903d08f508ee27e577445dc098baed6cde0ac984b42e0f0efed62760bd58d5816cf1e109d204607b7b175e30c", + "0xae68dc4ba5067e825d46d2c7c67f1009ceb49d68e8d3e4c57f4bcd299eb2de3575d42ea45e8722f8f28497a6e14a1cfe", + "0xb22486c2f5b51d72335ce819bbafb7fa25eb1c28a378a658f13f9fc79cd20083a7e573248d911231b45a5cf23b561ca7", + "0x89d1201d1dbd6921867341471488b4d2fd0fc773ae1d4d074c78ae2eb779a59b64c00452c2a0255826fca6b3d03be2b1", + "0xa2998977c91c7a53dc6104f5bc0a5b675e5350f835e2f0af69825db8af4aeb68435bdbcc795f3dd1f55e1dd50bc0507f", + "0xb0be4937a925b3c05056ed621910d535ccabf5ab99fd3b9335080b0e51d9607d0fd36cb5781ff340018f6acfca4a9736", + "0xaea145a0f6e0ba9df8e52e84bb9c9de2c2dc822f70d2724029b153eb68ee9c17de7d35063dcd6a39c37c59fdd12138f7", + "0x91cb4545d7165ee8ffbc74c874baceca11fdebbc7387908d1a25877ca3c57f2c5def424dab24148826832f1e880bede0", + "0xb3b579cb77573f19c571ad5eeeb21f65548d7dff9d298b8d7418c11f3e8cd3727c5b467f013cb87d6861cfaceee0d2e3", + "0xb98a1eeec2b19fecc8378c876d73645aa52fb99e4819903735b2c7a885b242787a30d1269a04bfb8573d72d9bbc5f0f0", + "0x940c1f01ed362bd588b950c27f8cc1d52276c71bb153d47f07ec85b038c11d9a8424b7904f424423e714454d5e80d1cd", + "0xaa343a8ecf09ce11599b8cf22f7279cf80f06dbf9f6d62cb05308dbbb39c46fd0a4a1240b032665fbb488a767379b91b", + "0x87c3ac72084aca5974599d3232e11d416348719e08443acaba2b328923af945031f86432e170dcdd103774ec92e988c9", + "0x91d6486eb5e61d2b9a9e742c20ec974a47627c6096b3da56209c2b4e4757f007e793ebb63b2b246857c9839b64dc0233", + "0xaebcd3257d295747dd6fc4ff910d839dd80c51c173ae59b8b2ec937747c2072fa85e3017f9060aa509af88dfc7529481", + "0xb3075ba6668ca04eff19efbfa3356b92f0ab12632dcda99cf8c655f35b7928c304218e0f9799d68ef9f809a1492ff7db", + "0x93ba7468bb325639ec2abd4d55179c69fd04eaaf39fc5340709227bbaa4ad0a54ea8b480a1a3c8d44684e3be0f8d1980", + "0xa6aef86c8c0d92839f38544d91b767c582568b391071228ff5a5a6b859c87bf4f81a7d926094a4ada1993ddbd677a920", + "0x91dcd6d14207aa569194aa224d1e5037b999b69ade52843315ca61ba26abe9a76412c9e88259bc5cf5d7b95b97d9c3bc", + "0xb3b483d31c88f78d49bd065893bc1e3d2aa637e27dedb46d9a7d60be7660ce7a10aaaa7deead362284a52e6d14021178", + "0x8e5730070acf8371461ef301cc4523e8e672aa0e3d945d438a0e0aa6bdf8cb9c685dcf38df429037b0c8aff3955c6f5b", + "0xb8c6d769890a8ee18dc4f9e917993315877c97549549b34785a92543cbeec96a08ae3a28d6e809c4aacd69de356c0012", + "0x95ca86cd384eaceaa7c077c5615736ca31f36824bd6451a16142a1edc129fa42b50724aeed7c738f08d7b157f78b569e", + "0x94df609c6d71e8eee7ab74226e371ccc77e01738fe0ef1a6424435b4570fe1e5d15797b66ed0f64eb88d4a3a37631f0e", + "0x89057b9783212add6a0690d6bb99097b182738deff2bd9e147d7fd7d6c8eacb4c219923633e6309ad993c24572289901", + "0x83a0f9f5f265c5a0e54defa87128240235e24498f20965009fef664f505a360b6fb4020f2742565dfc7746eb185bcec0", + "0x91170da5306128931349bc3ed50d7df0e48a68b8cc8420975170723ac79d8773e4fa13c5f14dc6e3fafcad78379050b1", + "0xb7178484d1b55f7e56a4cc250b6b2ec6040437d96bdfddfa7b35ed27435860f3855c2eb86c636f2911b012eb83b00db8", + "0xac0b00c4322d1e4208e09cd977b4e54d221133ff09551f75b32b0b55d0e2be80941dda26257b0e288c162e63c7e9cf68", + "0x9690ed9e7e53ed37ff362930e4096b878b12234c332fd19d5d064824084245952eda9f979e0098110d6963e468cf513e", + "0xb6fa547bb0bb83e5c5be0ed462a8783fba119041c136a250045c09d0d2af330c604331e7de960df976ff76d67f8000cd", + "0x814603907c21463bcf4e59cfb43066dfe1a50344ae04ef03c87c0f61b30836c3f4dea0851d6fa358c620045b7f9214c8", + "0x9495639e3939fad2a3df00a88603a5a180f3c3a0fe4d424c35060e2043e0921788003689887b1ed5be424d9a89bb18bb", + "0xaba4c02d8d57f2c92d5bc765885849e9ff8393d6554f5e5f3e907e5bfac041193a0d8716d7861104a4295d5a03c36b03", + "0x8ead0b56c1ca49723f94a998ba113b9058059321da72d9e395a667e6a63d5a9dac0f5717cec343f021695e8ced1f72af", + "0xb43037f7e3852c34ed918c5854cd74e9d5799eeddfe457d4f93bb494801a064735e326a76e1f5e50a339844a2f4a8ec9", + "0x99db8422bb7302199eb0ff3c3d08821f8c32f53a600c5b6fb43e41205d96adae72be5b460773d1280ad1acb806af9be8", + "0x8a9be08eae0086c0f020838925984df345c5512ff32e37120b644512b1d9d4fecf0fd30639ca90fc6cf334a86770d536", + "0x81b43614f1c28aa3713a309a88a782fb2bdfc4261dd52ddc204687791a40cf5fd6a263a8179388596582cccf0162efc2", + "0xa9f3a8b76912deb61d966c75daf5ddb868702ebec91bd4033471c8e533183df548742a81a2671de5be63a502d827437d", + "0x902e2415077f063e638207dc7e14109652e42ab47caccd6204e2870115791c9defac5425fd360b37ac0f7bd8fe7011f8", + "0xaa18e4fdc1381b59c18503ae6f6f2d6943445bd00dd7d4a2ad7e5adad7027f2263832690be30d456e6d772ad76f22350", + "0xa348b40ba3ba7d81c5d4631f038186ebd5e5f314f1ea737259151b07c3cc8cf0c6ed4201e71bcc1c22fefda81a20cde6", + "0xaa1306f7ac1acbfc47dc6f7a0cb6d03786cec8c8dc8060388ccda777bca24bdc634d03e53512c23dba79709ff64f8620", + "0x818ccfe46e700567b7f3eb400e5a35f6a5e39b3db3aa8bc07f58ace35d9ae5a242faf8dbccd08d9a9175bbce15612155", + "0xb7e3da2282b65dc8333592bb345a473f03bd6df69170055fec60222de9897184536bf22b9388b08160321144d0940279", + "0xa4d976be0f0568f4e57de1460a1729129252b44c552a69fceec44e5b97c96c711763360d11f9e5bf6d86b4976bf40d69", + "0x85d185f0397c24c2b875b09b6328a23b87982b84ee880f2677a22ff4c9a1ba9f0fea000bb3f7f66375a00d98ebafce17", + "0xb4ccbb8c3a2606bd9b87ce022704663af71d418351575f3b350d294f4efc68c26f9a2ce49ff81e6ff29c3b63d746294e", + "0x93ffd3265fddb63724dfde261d1f9e22f15ecf39df28e4d89e9fea03221e8e88b5dd9b77628bacaa783c6f91802d47cc", + "0xb1fd0f8d7a01378e693da98d03a2d2fda6b099d03454b6f2b1fa6472ff6bb092751ce6290059826b74ac0361eab00e1e", + "0xa89f440c71c561641589796994dd2769616b9088766e983c873fae0716b95c386c8483ab8a4f367b6a68b72b7456dd32", + "0xaf4fe92b01d42d03dd5d1e7fa55e96d4bbcb7bf7d4c8c197acd16b3e0f3455807199f683dcd263d74547ef9c244b35cc", + "0xa8227f6e0a344dfe76bfbe7a1861be32c4f4bed587ccce09f9ce2cf481b2dda8ae4f566154bc663d15f962f2d41761bd", + "0xa7b361663f7495939ed7f518ba45ea9ff576c4e628995b7aea026480c17a71d63fc2c922319f0502eb7ef8f14a406882", + "0x8ddcf382a9f39f75777160967c07012cfa89e67b19714a7191f0c68eaf263935e5504e1104aaabd0899348c972a8d3c6", + "0x98c95b9f6f5c91f805fb185eedd06c6fc4457d37dd248d0be45a6a168a70031715165ea20606245cbdf8815dc0ac697f", + "0x805b44f96e001e5909834f70c09be3efcd3b43632bcac5b6b66b6d227a03a758e4b1768ce2a723045681a1d34562aaeb", + "0xb0e81b07cdc45b3dca60882676d9badb99f25c461b7efe56e3043b80100bb62d29e1873ae25eb83087273160ece72a55", + "0xb0c53f0abe78ee86c7b78c82ae1f7c070bb0b9c45c563a8b3baa2c515d482d7507bb80771e60b38ac13f78b8af92b4a9", + "0xa7838ef6696a9e4d2e5dfd581f6c8d6a700467e8fd4e85adabb5f7a56f514785dd4ab64f6f1b48366f7d94728359441b", + "0x88c76f7700a1d23c30366a1d8612a796da57b2500f97f88fdf2d76b045a9d24e7426a8ffa2f4e86d3046937a841dad58", + "0xad8964baf98c1f02e088d1d9fcb3af6b1dfa44cdfe0ed2eae684e7187c33d3a3c28c38e8f4e015f9c04d451ed6f85ff6", + "0x90e9d00a098317ececaa9574da91fc149eda5b772dedb3e5a39636da6603aa007804fa86358550cfeff9be5a2cb7845e", + "0xa56ff4ddd73d9a6f5ab23bb77efa25977917df63571b269f6a999e1ad6681a88387fcc4ca3b26d57badf91b236503a29", + "0x97ad839a6302c410a47e245df84c01fb9c4dfef86751af3f9340e86ff8fc3cd52fa5ff0b9a0bd1d9f453e02ca80658a6", + "0xa4c8c44cbffa804129e123474854645107d1f0f463c45c30fd168848ebea94880f7c0c5a45183e9eb837f346270bdb35", + "0xa72e53d0a1586d736e86427a93569f52edd2f42b01e78aee7e1961c2b63522423877ae3ac1227a2cf1e69f8e1ff15bc3", + "0x8559f88a7ef13b4f09ac82ae458bbae6ab25671cfbf52dae7eac7280d6565dd3f0c3286aec1a56a8a16dc3b61d78ce47", + "0x8221503f4cdbed550876c5dc118a3f2f17800c04e8be000266633c83777b039a432d576f3a36c8a01e8fd18289ebc10b", + "0x99bfbe5f3e46d4d898a578ba86ed26de7ed23914bd3bcdf3c791c0bcd49398a52419077354a5ab75cea63b6c871c6e96", + "0xaa134416d8ff46f2acd866c1074af67566cfcf4e8be8d97329dfa0f603e1ff208488831ce5948ac8d75bfcba058ddcaa", + "0xb02609d65ebfe1fe8e52f21224a022ea4b5ea8c1bd6e7b9792eed8975fc387cdf9e3b419b8dd5bcce80703ab3a12a45f", + "0xa4f14798508698fa3852e5cac42a9db9797ecee7672a54988aa74037d334819aa7b2ac7b14efea6b81c509134a6b7ad2", + "0x884f01afecbcb987cb3e7c489c43155c416ed41340f61ecb651d8cba884fb9274f6d9e7e4a46dd220253ae561614e44c", + "0xa05523c9e71dce1fe5307cc71bd721feb3e1a0f57a7d17c7d1c9fb080d44527b7dbaa1f817b1af1c0b4322e37bc4bb1e", + "0x8560aec176a4242b39f39433dd5a02d554248c9e49d3179530815f5031fee78ba9c71a35ceeb2b9d1f04c3617c13d8f0", + "0x996aefd402748d8472477cae76d5a2b92e3f092fc834d5222ae50194dd884c9fb8b6ed8e5ccf8f6ed483ddbb4e80c747", + "0x8fd09900320000cbabc40e16893e2fcf08815d288ec19345ad7b6bb22f7d78a52b6575a3ca1ca2f8bc252d2eafc928ec", + "0x939e51f73022bc5dc6862a0adf8fb8a3246b7bfb9943cbb4b27c73743926cc20f615a036c7e5b90c80840e7f1bfee0e7", + "0xa0a6258700cadbb9e241f50766573bf9bdb7ad380b1079dc3afb4054363d838e177b869cad000314186936e40359b1f2", + "0x972699a4131c8ed27a2d0e2104d54a65a7ff1c450ad9da3a325c662ab26869c21b0a84d0700b98c8b5f6ce3b746873d7", + "0xa454c7fe870cb8aa6491eafbfb5f7872d6e696033f92e4991d057b59d70671f2acdabef533e229878b60c7fff8f748b1", + "0xa167969477214201f09c79027b10221e4707662e0c0fde81a0f628249f2f8a859ce3d30a7dcc03b8ecca8f7828ad85c7", + "0x8ff6b7265175beb8a63e1dbf18c9153fb2578c207c781282374f51b40d57a84fd2ef2ea2b9c6df4a54646788a62fd17f", + "0xa3d7ebeccde69d73d8b3e76af0da1a30884bb59729503ff0fb0c3bccf9221651b974a6e72ea33b7956fc3ae758226495", + "0xb71ef144c9a98ce5935620cb86c1590bd4f48e5a2815d25c0cdb008fde628cf628c31450d3d4f67abbfeb16178a74cfd", + "0xb5e0a16d115134f4e2503990e3f2035ed66b9ccf767063fe6747870d97d73b10bc76ed668550cb82eedc9a2ca6f75524", + "0xb30ffaaf94ee8cbc42aa2c413175b68afdb207dbf351fb20be3852cb7961b635c22838da97eaf43b103aff37e9e725cc", + "0x98aa7d52284f6c1f22e272fbddd8c8698cf8f5fbb702d5de96452141fafb559622815981e50b87a72c2b1190f59a7deb", + "0x81fbacda3905cfaf7780bb4850730c44166ed26a7c8d07197a5d4dcd969c09e94a0461638431476c16397dd7bdc449f9", + "0x95e47021c1726eac2e5853f570d6225332c6e48e04c9738690d53e07c6b979283ebae31e2af1fc9c9b3e59f87e5195b1", + "0xac024a661ba568426bb8fce21780406537f518075c066276197300841e811860696f7588188bc01d90bace7bc73d56e3", + "0xa4ebcaf668a888dd404988ab978594dee193dad2d0aec5cdc0ccaf4ec9a7a8228aa663db1da8ddc52ec8472178e40c32", + "0xa20421b8eaf2199d93b083f2aff37fb662670bd18689d046ae976d1db1fedd2c2ff897985ecc6277b396db7da68bcb27", + "0x8bc33d4b40197fd4d49d1de47489d10b90d9b346828f53a82256f3e9212b0cbc6930b895e879da9cec9fedf026aadb3e", + "0xaaafdd1bec8b757f55a0433eddc0a39f818591954fd4e982003437fcceb317423ad7ee74dbf17a2960380e7067a6b4e2", + "0xaad34277ebaed81a6ec154d16736866f95832803af28aa5625bf0461a71d02b1faba02d9d9e002be51c8356425a56867", + "0x976e9c8b150d08706079945bd0e84ab09a648ecc6f64ded9eb5329e57213149ae409ae93e8fbd8eda5b5c69f5212b883", + "0x8097fae1653247d2aed4111533bc378171d6b2c6d09cbc7baa9b52f188d150d645941f46d19f7f5e27b7f073c1ebd079", + "0x83905f93b250d3184eaba8ea7d727c4464b6bdb027e5cbe4f597d8b9dc741dcbea709630bd4fd59ce24023bec32fc0f3", + "0x8095030b7045cff28f34271386e4752f9a9a0312f8df75de4f424366d78534be2b8e1720a19cb1f9a2d21105d790a225", + "0xa7b7b73a6ae2ed1009c49960374b0790f93c74ee03b917642f33420498c188a169724945a975e5adec0a1e83e07fb1b2", + "0x856a41c54df393b6660b7f6354572a4e71c8bfca9cabaffb3d4ef2632c015e7ee2bc10056f3eccb3dbed1ad17d939178", + "0xa8f7a55cf04b38cd4e330394ee6589da3a07dc9673f74804fdf67b364e0b233f14aec42e783200a2e4666f7c5ff62490", + "0x82c529f4e543c6bca60016dc93232c115b359eaee2798a9cf669a654b800aafe6ab4ba58ea8b9cdda2b371c8d62fa845", + "0x8caab020c1baddce77a6794113ef1dfeafc5f5000f48e97f4351b588bf02f1f208101745463c480d37f588d5887e6d8c", + "0x8fa91b3cc400f48b77b6fd77f3b3fbfb3f10cdff408e1fd22d38f77e087b7683adad258804409ba099f1235b4b4d6fea", + "0x8aa02787663d6be9a35677d9d8188b725d5fcd770e61b11b64e3def8808ea5c71c0a9afd7f6630c48634546088fcd8e2", + "0xb5635b7b972e195cab878b97dea62237c7f77eb57298538582a330b1082f6207a359f2923864630136d8b1f27c41b9aa", + "0x8257bb14583551a65975946980c714ecd6e5b629672bb950b9caacd886fbd22704bc9e3ba7d30778adab65dc74f0203a", + "0xab5fe1cd12634bfa4e5c60d946e2005cbd38f1063ec9a5668994a2463c02449a0a185ef331bd86b68b6e23a8780cb3ba", + "0xa7d3487da56cda93570cc70215d438204f6a2709bfb5fda6c5df1e77e2efc80f4235c787e57fbf2c74aaff8cbb510a14", + "0xb61cff7b4c49d010e133319fb828eb900f8a7e55114fc86b39c261a339c74f630e1a7d7e1350244ada566a0ff3d46c4b", + "0x8d4d1d55d321d278db7a85522ccceca09510374ca81d4d73e3bb5249ace7674b73900c35a531ec4fa6448fabf7ad00dc", + "0x966492248aee24f0f56c8cfca3c8ec6ba3b19abb69ae642041d4c3be8523d22c65c4dafcab4c58989ccc4e0bd2f77919", + "0xb20c320a90cb220b86e1af651cdc1e21315cd215da69f6787e28157172f93fc8285dcd59b039c626ed8ca4633cba1a47", + "0xaae9e6b22f018ceb5c0950210bb8182cb8cb61014b7e14581a09d36ebd1bbfebdb2b82afb7fdb0cf75e58a293d9c456d", + "0x875547fb67951ad37b02466b79f0c9b985ccbc500cfb431b17823457dc79fb9597ec42cd9f198e15523fcd88652e63a4", + "0x92afce49773cb2e20fb21e4f86f18e0959ebb9c33361547ddb30454ee8e36b1e234019cbdca0e964cb292f7f77df6b90", + "0x8af85343dfe1821464c76ba11c216cbef697b5afc69c4d821342e55afdac047081ec2e3f7b09fc14b518d9a23b78c003", + "0xb7de4a1648fd63f3a918096ea669502af5357438e69dac77cb8102b6e6c15c76e033cfaa80dafc806e535ede5c1a20aa", + "0xac80e9b545e8bd762951d96c9ce87f629d01ffcde07efc2ef7879ca011f1d0d8a745abf26c9d452541008871304fac00", + "0xa4cf0f7ed724e481368016c38ea5816698a5f68eb21af4d3c422d2ba55f96a33e427c2aa40de1b56a7cfac7f7cf43ab0", + "0x899b0a678bb2db2cae1b44e75a661284844ebcdd87abf308fedeb2e4dbe5c5920c07db4db7284a7af806a2382e8b111a", + "0xaf0588a2a4afce2b1b13c1230816f59e8264177e774e4a341b289a101dcf6af813638fed14fb4d09cb45f35d5d032609", + "0xa4b8df79e2be76e9f5fc5845f06fe745a724cf37c82fcdb72719b77bdebea3c0e763f37909373e3a94480cc5e875cba0", + "0x83e42c46d88930c8f386b19fd999288f142d325e2ebc86a74907d6d77112cb0d449bc511c95422cc810574031a8cbba9", + "0xb5e39534070de1e5f6e27efbdd3dc917d966c2a9b8cf2d893f964256e95e954330f2442027dc148c776d63a95bcde955", + "0x958607569dc28c075e658cd4ae3927055c6bc456eef6212a6fea8205e48ed8777a8064f584cda38fe5639c371e2e7fba", + "0x812adf409fa63575113662966f5078a903212ffb65c9b0bbe62da0f13a133443a7062cb8fd70f5e5dd5559a32c26d2c8", + "0xa679f673e5ce6a3cce7fa31f22ee3785e96bcb55e5a776e2dd3467bef7440e3555d1a9b87cb215e86ee9ed13a090344b", + "0xafedbb34508b159eb25eb2248d7fe328f86ef8c7d84c62d5b5607d74aae27cc2cc45ee148eb22153b09898a835c58df4", + "0xb75505d4f6b67d31e665cfaf5e4acdb5838ae069166b7fbcd48937c0608a59e40a25302fcc1873d2e81c1782808c70f0", + "0xb62515d539ec21a155d94fc00ea3c6b7e5f6636937bce18ed5b618c12257fb82571886287fd5d1da495296c663ebc512", + "0xab8e1a9446bbdd588d1690243b1549d230e6149c28f59662b66a8391a138d37ab594df38e7720fae53217e5c3573b5be", + "0xb31e8abf4212e03c3287bb2c0a153065a7290a16764a0bac8f112a72e632185a654bb4e88fdd6053e6c7515d9719fadb", + "0xb55165477fe15b6abd2d0f4fddaa9c411710dcc4dd712daba3d30e303c9a3ee5415c256f9dc917ecf18c725b4dbab059", + "0xa0939d4f57cacaae549b78e87cc234de4ff6a35dc0d9cd5d7410abc30ebcd34c135e008651c756e5a9d2ca79c40ef42b", + "0x8cf10e50769f3443340844aad4d56ec790850fed5a41fcbd739abac4c3015f0a085a038fbe7fae9f5ad899cce5069f6b", + "0x924055e804d82a99ea4bb160041ea4dc14b568abf379010bc1922fde5d664718c31d103b8b807e3a1ae809390e708c73", + "0x8ec0f9d26f71b0f2e60a179e4fd1778452e2ffb129d50815e5d7c7cb9415fa69ae5890578086e8ef6bfde35ad2a74661", + "0x98c7f12b15ec4426b59f737f73bf5faea4572340f4550b7590dfb7f7ffedb2372e3e555977c63946d579544c53210ad0", + "0x8a935f7a955c78f69d66f18eee0092e5e833fa621781c9581058e219af4d7ceee48b84e472e159dda6199715fb2f9acf", + "0xb78d4219f95a2dbfaa7d0c8a610c57c358754f4f43c2af312ab0fe8f10a5f0177e475332fb8fd23604e474fc2abeb051", + "0x8d086a14803392b7318c28f1039a17e3cfdcece8abcaca3657ec3d0ac330842098a85c0212f889fabb296dfb133ce9aa", + "0xa53249f417aac82f2c2a50c244ce21d3e08a5e5a8bd33bec2a5ab0d6cd17793e34a17edfa3690899244ce201e2fb9986", + "0x8619b0264f9182867a1425be514dc4f1ababc1093138a728a28bd7e4ecc99b9faaff68c23792264bc6e4dce5f52a5c52", + "0x8c171edbbbde551ec19e31b2091eb6956107dd9b1f853e1df23bff3c10a3469ac77a58335eee2b79112502e8e163f3de", + "0xa9d19ec40f0ca07c238e9337c6d6a319190bdba2db76fb63902f3fb459aeeb50a1ac30db5b25ee1b4201f3ca7164a7f4", + "0xb9c6ec14b1581a03520b8d2c1fbbc31fb8ceaef2c0f1a0d0080b6b96e18442f1734bea7ef7b635d787c691de4765d469", + "0x8cb437beb4cfa013096f40ccc169a713dc17afee6daa229a398e45fd5c0645a9ad2795c3f0cd439531a7151945d7064d", + "0xa6e8740cc509126e146775157c2eb278003e5bb6c48465c160ed27888ca803fa12eee1f6a8dd7f444f571664ed87fdc1", + "0xb75c1fecc85b2732e96b3f23aefb491dbd0206a21d682aee0225838dc057d7ed3b576176353e8e90ae55663f79e986e4", + "0xad8d249b0aea9597b08358bce6c77c1fd552ef3fbc197d6a1cfe44e5e6f89b628b12a6fb04d5dcfcbacc51f46e4ae7bb", + "0xb998b2269932cbd58d04b8e898d373ac4bb1a62e8567484f4f83e224061bc0f212459f1daae95abdbc63816ae6486a55", + "0x827988ef6c1101cddc96b98f4a30365ff08eea2471dd949d2c0a9b35c3bbfa8c07054ad1f4c88c8fbf829b20bb5a9a4f", + "0x8692e638dd60babf7d9f2f2d2ce58e0ac689e1326d88311416357298c6a2bffbfebf55d5253563e7b3fbbf5072264146", + "0xa685d75b91aea04dbc14ab3c1b1588e6de96dae414c8e37b8388766029631b28dd860688079b12d09cd27f2c5af11adf", + "0xb57eced93eec3371c56679c259b34ac0992286be4f4ff9489d81cf9712403509932e47404ddd86f89d7c1c3b6391b28c", + "0xa1c8b4e42ebcbd8927669a97f1b72e236fb19249325659e72be7ddaaa1d9e81ca2abb643295d41a8c04a2c01f9c0efd7", + "0x877c33de20d4ed31674a671ba3e8f01a316581e32503136a70c9c15bf0b7cb7b1cba6cd4eb641fad165fb3c3c6c235fd", + "0xa2a469d84ec478da40838f775d11ad38f6596eb41caa139cc190d6a10b5108c09febae34ffdafac92271d2e73c143693", + "0x972f817caedb254055d52e963ed28c206848b6c4cfdb69dbc961c891f8458eaf582a6d4403ce1177d87bc2ea410ef60a", + "0xaccbd739e138007422f28536381decc54bb6bd71d93edf3890e54f9ef339f83d2821697d1a4ac1f5a98175f9a9ecb9b5", + "0x8940f8772e05389f823b62b3adc3ed541f91647f0318d7a0d3f293aeeb421013de0d0a3664ea53dd24e5fbe02d7efef6", + "0x8ecce20f3ef6212edef07ec4d6183fda8e0e8cad2c6ccd0b325e75c425ee1faba00b5c26b4d95204238931598d78f49d", + "0x97cc72c36335bd008afbed34a3b0c7225933faba87f7916d0a6d2161e6f82e0cdcda7959573a366f638ca75d30e9dab1", + "0x9105f5de8699b5bdb6bd3bb6cc1992d1eac23929c29837985f83b22efdda92af64d9c574aa9640475087201bbbe5fd73", + "0x8ffb33c4f6d05c413b9647eb6933526a350ed2e4278ca2ecc06b0e8026d8dbe829c476a40e45a6df63a633090a3f82ef", + "0x8bfc6421fdc9c2d2aaa68d2a69b1a2728c25b84944cc3e6a57ff0c94bfd210d1cbf4ff3f06702d2a8257024d8be7de63", + "0xa80e1dc1dddfb41a70220939b96dc6935e00b32fb8be5dff4eed1f1c650002ff95e4af481c43292e3827363b7ec4768a", + "0x96f714ebd54617198bd636ba7f7a7f8995a61db20962f2165078d9ed8ee764d5946ef3cbdc7ebf8435bb8d5dd4c1deac", + "0x8cdb0890e33144d66391d2ae73f5c71f5a861f72bc93bff6cc399fc25dd1f9e17d8772592b44593429718784802ac377", + "0x8ccf9a7f80800ee770b92add734ed45a73ecc31e2af0e04364eefc6056a8223834c7c0dc9dfc52495bdec6e74ce69994", + "0xaa0875f423bd68b5f10ba978ddb79d3b96ec093bfbac9ff366323193e339ed7c4578760fb60f60e93598bdf1e5cc4995", + "0xa9214f523957b59c7a4cb61a40251ad72aba0b57573163b0dc0f33e41d2df483fb9a1b85a5e7c080e9376c866790f8cb", + "0xb6224b605028c6673a536cc8ff9aeb94e7a22e686fda82cf16068d326469172f511219b68b2b3affb7933af0c1f80d07", + "0xb6d58968d8a017c6a34e24c2c09852f736515a2c50f37232ac6b43a38f8faa7572cc31dade543b594b61b5761c4781d0", + "0x8a97cefe5120020c38deeb861d394404e6c993c6cbd5989b6c9ebffe24f46ad11b4ba6348e2991cbf3949c28cfc3c99d", + "0x95bf046f8c3a9c0ce2634be4de3713024daec3fc4083e808903b25ce3ac971145af90686b451efcc72f6b22df0216667", + "0xa6a4e2f71b8fa28801f553231eff2794c0f10d12e7e414276995e21195abc9c2983a8997e41af41e78d19ff6fbb2680b", + "0x8e5e62a7ca9c2f58ebaab63db2ff1fb1ff0877ae94b7f5e2897f273f684ae639dff44cc65718f78a9c894787602ab26a", + "0x8542784383eec4f565fcb8b9fc2ad8d7a644267d8d7612a0f476fc8df3aff458897a38003d506d24142ad18f93554f2b", + "0xb7db68ba4616ea072b37925ec4fb39096358c2832cc6d35169e032326b2d6614479f765ae98913c267105b84afcb9bf2", + "0x8b31dbb9457d23d416c47542c786e07a489af35c4a87dadb8ee91bea5ac4a5315e65625d78dad2cf8f9561af31b45390", + "0xa8545a1d91ac17257732033d89e6b7111db8242e9c6ebb0213a88906d5ef407a2c6fdb444e29504b06368b6efb4f4839", + "0xb1bd85d29ebb28ccfb05779aad8674906b267c2bf8cdb1f9a0591dd621b53a4ee9f2942687ee3476740c0b4a7621a3ae", + "0xa2b54534e152e46c50d91fff03ae9cd019ff7cd9f4168b2fe7ac08ef8c3bbc134cadd3f9d6bd33d20ae476c2a8596c8a", + "0xb19b571ff4ae3e9f5d95acda133c455e72c9ea9973cae360732859836c0341c4c29ab039224dc5bc3deb824e031675d8", + "0x940b5f80478648bac025a30f3efeb47023ce20ee98be833948a248bca6979f206bb28fc0f17b90acf3bb4abd3d14d731", + "0x8f106b40588586ac11629b96d57808ad2808915d89539409c97414aded90b4ff23286a692608230a52bff696055ba5d6", + "0xae6bda03aa10da3d2abbc66d764ca6c8d0993e7304a1bdd413eb9622f3ca1913baa6da1e9f4f9e6cf847f14f44d6924d", + "0xa18e7796054a340ef826c4d6b5a117b80927afaf2ebd547794c400204ae2caf277692e2eabb55bc2f620763c9e9da66d", + "0x8d2d25180dc2c65a4844d3e66819ccfcf48858f0cc89e1c77553b463ec0f7feb9a4002ce26bc618d1142549b9850f232", + "0x863f413a394de42cc8166c1c75d513b91d545fff1de6b359037a742c70b008d34bf8e587afa2d62c844d0c6f0ea753e7", + "0x83cd0cf62d63475e7fcad18a2e74108499cdbf28af2113cfe005e3b5887794422da450b1944d0a986eb7e1f4c3b18f25", + "0xb4f8b350a6d88fea5ab2e44715a292efb12eb52df738c9b2393da3f1ddee68d0a75b476733ccf93642154bceb208f2b8", + "0xb3f52aaa4cd4221cb9fc45936cc67fd3864bf6d26bf3dd86aa85aa55ecfc05f5e392ecce5e7cf9406b4b1c4fce0398c8", + "0xb33137084422fb643123f40a6df2b498065e65230fc65dc31791c330e898c51c3a65ff738930f32c63d78f3c9315f85b", + "0x91452bfa75019363976bb7337fe3a73f1c10f01637428c135536b0cdc7da5ce558dae3dfc792aa55022292600814a8ef", + "0xad6ba94c787cd4361ca642c20793ea44f1f127d4de0bb4a77c7fbfebae0fcadbf28e2cb6f0c12c12a07324ec8c19761d", + "0x890aa6248b17f1501b0f869c556be7bf2b1d31a176f9978bb97ab7a6bd4138eed32467951c5ef1871944b7f620542f43", + "0x82111db2052194ee7dd22ff1eafffac0443cf969d3762cceae046c9a11561c0fdce9c0711f88ac01d1bed165f8a7cee3", + "0xb1527b71df2b42b55832f72e772a466e0fa05743aacc7814f4414e4bcc8d42a4010c9e0fd940e6f254cafedff3cd6543", + "0x922370fa49903679fc565f09c16a5917f8125e72acfeb060fcdbadbd1644eb9f4016229756019c93c6d609cda5d5d174", + "0xaa4c7d98a96cab138d2a53d4aee8ebff6ef903e3b629a92519608d88b3bbd94de5522291a1097e6acf830270e64c8ee1", + "0xb3dc21608a389a72d3a752883a382baaafc61ecc44083b832610a237f6a2363f24195acce529eb4aed4ef0e27a12b66e", + "0x94619f5de05e07b32291e1d7ab1d8b7337a2235e49d4fb5f3055f090a65e932e829efa95db886b32b153bdd05a53ec8c", + "0xade1e92722c2ffa85865d2426fb3d1654a16477d3abf580cfc45ea4b92d5668afc9d09275d3b79283e13e6b39e47424d", + "0xb7201589de7bed094911dd62fcd25c459a8e327ac447b69f541cdba30233063e5ddffad0b67e9c3e34adcffedfd0e13d", + "0x809d325310f862d6549e7cb40f7e5fc9b7544bd751dd28c4f363c724a0378c0e2adcb5e42ec8f912f5f49f18f3365c07", + "0xa79c20aa533de7a5d671c99eb9eb454803ba54dd4f2efa3c8fec1a38f8308e9905c71e9282955225f686146388506ff6", + "0xa85eeacb5e8fc9f3ed06a3fe2dc3108ab9f8c5877b148c73cf26e4e979bf5795edbe2e63a8d452565fd1176ed40402b2", + "0x97ef55662f8a1ec0842b22ee21391227540adf7708f491436044f3a2eb18c471525e78e1e14fa292507c99d74d7437c6", + "0x93110d64ed5886f3d16ce83b11425576a3a7a9bb831cd0de3f9a0b0f2270a730d68136b4ef7ff035ede004358f419b5c", + "0xac9ed0a071517f0ae4f61ce95916a90ba9a77a3f84b0ec50ef7298acdcd44d1b94525d191c39d6bd1bb68f4471428760", + "0x98abd6a02c7690f5a339adf292b8c9368dfc12e0f8069cf26a5e0ce54b4441638f5c66ea735142f3c28e00a0024267e6", + "0xb51efb73ba6d44146f047d69b19c0722227a7748b0e8f644d0fc9551324cf034c041a2378c56ce8b58d06038fb8a78de", + "0x8f115af274ef75c1662b588b0896b97d71f8d67986ae846792702c4742ab855952865ce236b27e2321967ce36ff93357", + "0xb3c4548f14d58b3ab03c222da09e4381a0afe47a72d18d50a94e0008797f78e39e99990e5b4757be62310d400746e35a", + "0xa9b1883bd5f31f909b8b1b6dcb48c1c60ed20aa7374b3ffa7f5b2ed036599b5bef33289d23c80a5e6420d191723b92f7", + "0x85d38dffd99487ae5bb41ab4a44d80a46157bbbe8ef9497e68f061721f74e4da513ccc3422936b059575975f6787c936", + "0xadf870fcb96e972c033ab7a35d28ae79ee795f82bc49c3bd69138f0e338103118d5529c53f2d72a9c0d947bf7d312af2", + "0xab4c7a44e2d9446c6ff303eb49aef0e367a58b22cc3bb27b4e69b55d1d9ee639c9234148d2ee95f9ca8079b1457d5a75", + "0xa386420b738aba2d7145eb4cba6d643d96bda3f2ca55bb11980b318d43b289d55a108f4bc23a9606fb0bccdeb3b3bb30", + "0x847020e0a440d9c4109773ecca5d8268b44d523389993b1f5e60e541187f7c597d79ebd6e318871815e26c96b4a4dbb1", + "0xa530aa7e5ca86fcd1bec4b072b55cc793781f38a666c2033b510a69e110eeabb54c7d8cbcb9c61fee531a6f635ffa972", + "0x87364a5ea1d270632a44269d686b2402da737948dac27f51b7a97af80b66728b0256547a5103d2227005541ca4b7ed04", + "0x8816fc6e16ea277de93a6d793d0eb5c15e9e93eb958c5ef30adaf8241805adeb4da8ce19c3c2167f971f61e0b361077d", + "0x8836a72d301c42510367181bb091e4be377777aed57b73c29ef2ce1d475feedd7e0f31676284d9a94f6db01cc4de81a2", + "0xb0d9d8b7116156d9dde138d28aa05a33e61f8a85839c1e9071ccd517b46a5b4b53acb32c2edd7150c15bc1b4bd8db9e3", + "0xae931b6eaeda790ba7f1cd674e53dc87f6306ff44951fa0df88d506316a5da240df9794ccbd7215a6470e6b31c5ea193", + "0x8c6d5bdf87bd7f645419d7c6444e244fe054d437ed1ba0c122fde7800603a5fadc061e5b836cb22a6cfb2b466f20f013", + "0x90d530c6d0cb654999fa771b8d11d723f54b8a8233d1052dc1e839ea6e314fbed3697084601f3e9bbb71d2b4eaa596df", + "0xb0d341a1422588c983f767b1ed36c18b141774f67ef6a43cff8e18b73a009da10fc12120938b8bba27f225bdfd3138f9", + "0xa131b56f9537f460d304e9a1dd75702ace8abd68cb45419695cb8dee76998139058336c87b7afd6239dc20d7f8f940cc", + "0xaa6c51fa28975f709329adee1bbd35d49c6b878041841a94465e8218338e4371f5cb6c17f44a63ac93644bf28f15d20f", + "0x88440fb584a99ebd7f9ea04aaf622f6e44e2b43bbb49fb5de548d24a238dc8f26c8da2ccf03dd43102bda9f16623f609", + "0x9777b8695b790e702159a4a750d5e7ff865425b95fa0a3c15495af385b91c90c00a6bd01d1b77bffe8c47d01baae846f", + "0x8b9d764ece7799079e63c7f01690c8eff00896a26a0d095773dea7a35967a8c40db7a6a74692f0118bf0460c26739af4", + "0x85808c65c485520609c9e61fa1bb67b28f4611d3608a9f7a5030ee61c3aa3c7e7dc17fff48af76b4aecee2cb0dbd22ac", + "0xad2783a76f5b3db008ef5f7e67391fda4e7e36abde6b3b089fc4835b5c339370287935af6bd53998bed4e399eda1136d", + "0x96f18ec03ae47c205cc4242ca58e2eff185c9dca86d5158817e2e5dc2207ab84aadda78725f8dc080a231efdc093b940", + "0x97de1ab6c6cc646ae60cf7b86df73b9cf56cc0cd1f31b966951ebf79fc153531af55ca643b20b773daa7cab784b832f7", + "0x870ba266a9bfa86ef644b1ef025a0f1b7609a60de170fe9508de8fd53170c0b48adb37f19397ee8019b041ce29a16576", + "0xad990e888d279ac4e8db90619d663d5ae027f994a3992c2fbc7d262b5990ae8a243e19157f3565671d1cb0de17fe6e55", + "0x8d9d5adcdd94c5ba3be4d9a7428133b42e485f040a28d16ee2384758e87d35528f7f9868de9bd23d1a42a594ce50a567", + "0x85a33ed75d514ece6ad78440e42f7fcdb59b6f4cff821188236d20edae9050b3a042ce9bc7d2054296e133d033e45022", + "0x92afd2f49a124aaba90de59be85ff269457f982b54c91b06650c1b8055f9b4b0640fd378df02a00e4fc91f7d226ab980", + "0x8c0ee09ec64bd831e544785e3d65418fe83ed9c920d9bb4d0bf6dd162c1264eb9d6652d2def0722e223915615931581c", + "0x8369bedfa17b24e9ad48ebd9c5afea4b66b3296d5770e09b00446c5b0a8a373d39d300780c01dcc1c6752792bccf5fd0", + "0x8b9e960782576a59b2eb2250d346030daa50bbbec114e95cdb9e4b1ba18c3d34525ae388f859708131984976ca439d94", + "0xb682bface862008fea2b5a07812ca6a28a58fd151a1d54c708fc2f8572916e0d678a9cb8dc1c10c0470025c8a605249e", + "0xa38d5e189bea540a824b36815fc41e3750760a52be0862c4cac68214febdc1a754fb194a7415a8fb7f96f6836196d82a", + "0xb9e7fbda650f18c7eb8b40e42cc42273a7298e65e8be524292369581861075c55299ce69309710e5b843cb884de171bd", + "0xb6657e5e31b3193874a1bace08f42faccbd3c502fb73ad87d15d18a1b6c2a146f1baa929e6f517db390a5a47b66c0acf", + "0xae15487312f84ed6265e4c28327d24a8a0f4d2d17d4a5b7c29b974139cf93223435aaebe3af918f5b4bb20911799715f", + "0x8bb4608beb06bc394e1a70739b872ce5a2a3ffc98c7547bf2698c893ca399d6c13686f6663f483894bccaabc3b9c56ad", + "0xb58ac36bc6847077584308d952c5f3663e3001af5ecf2e19cb162e1c58bd6c49510205d453cffc876ca1dc6b8e04a578", + "0x924f65ced61266a79a671ffb49b300f0ea44c50a0b4e3b02064faa99fcc3e4f6061ea8f38168ab118c5d47bd7804590e", + "0x8d67d43b8a06b0ff4fafd7f0483fa9ed1a9e3e658a03fb49d9d9b74e2e24858dc1bed065c12392037b467f255d4e5643", + "0xb4d4f87813125a6b355e4519a81657fa97c43a6115817b819a6caf4823f1d6a1169683fd68f8d025cdfa40ebf3069acb", + "0xa7fd4d2c8e7b59b8eed3d4332ae94b77a89a2616347402f880bc81bde072220131e6dbec8a605be3a1c760b775375879", + "0x8d4a7d8fa6f55a30df37bcf74952e2fa4fd6676a2e4606185cf154bdd84643fd01619f8fb8813a564f72e3f574f8ce30", + "0x8086fb88e6260e9a9c42e9560fde76315ff5e5680ec7140f2a18438f15bc2cc7d7d43bfb5880b180b738c20a834e6134", + "0x916c4c54721de03934fee6f43de50bb04c81f6f8dd4f6781e159e71c40c60408aa54251d457369d133d4ba3ed7c12cb4", + "0x902e5bf468f11ed9954e2a4a595c27e34abe512f1d6dc08bbca1c2441063f9af3dc5a8075ab910a10ff6c05c1c644a35", + "0xa1302953015e164bf4c15f7d4d35e3633425a78294406b861675667eec77765ff88472306531e5d3a4ec0a2ff0dd6a9e", + "0x87874461df3c9aa6c0fa91325576c0590f367075f2f0ecfeb34afe162c04c14f8ce9d608c37ac1adc8b9985bc036e366", + "0x84b50a8a61d3cc609bfb0417348133e698fe09a6d37357ce3358de189efcf35773d78c57635c2d26c3542b13cc371752", + "0xacaed2cff8633d12c1d12bb7270c54d65b0b0733ab084fd47f81d0a6e1e9b6f300e615e79538239e6160c566d8bb8d29", + "0x889e6a0e136372ca4bac90d1ab220d4e1cad425a710e8cdd48b400b73bb8137291ceb36a39440fa84305783b1d42c72f", + "0x90952e5becec45b2b73719c228429a2c364991cf1d5a9d6845ae5b38018c2626f4308daa322cab1c72e0f6c621bb2b35", + "0x8f5a97a801b6e9dcd66ccb80d337562c96f7914e7169e8ff0fda71534054c64bf2a9493bb830623d612cfe998789be65", + "0x84f3df8b9847dcf1d63ca470dc623154898f83c25a6983e9b78c6d2d90a97bf5e622445be835f32c1e55e6a0a562ea78", + "0x91d12095cd7a88e7f57f254f02fdb1a1ab18984871dead2f107404bcf8069fe68258c4e6f6ebd2477bddf738135400bb", + "0xb771a28bc04baef68604d4723791d3712f82b5e4fe316d7adc2fc01b935d8e644c06d59b83bcb542afc40ebafbee0683", + "0x872f6341476e387604a7e93ae6d6117e72d164e38ebc2b825bc6df4fcce815004d7516423c190c1575946b5de438c08d", + "0x90d6b4aa7d40a020cdcd04e8b016d041795961a8e532a0e1f4041252131089114a251791bf57794cadb7d636342f5d1c", + "0x899023ba6096a181448d927fed7a0fe858be4eac4082a42e30b3050ee065278d72fa9b9d5ce3bc1372d4cbd30a2f2976", + "0xa28f176571e1a9124f95973f414d5bdbf5794d41c3839d8b917100902ac4e2171eb940431236cec93928a60a77ede793", + "0x838dbe5bcd29c4e465d02350270fa0036cd46f8730b13d91e77afb7f5ed16525d0021d3b2ae173a76c378516a903e0cb", + "0x8e105d012dd3f5d20f0f1c4a7e7f09f0fdd74ce554c3032e48da8cce0a77260d7d47a454851387770f5c256fa29bcb88", + "0x8f4df0f9feeb7a487e1d138d13ea961459a6402fd8f8cabb226a92249a0d04ded5971f3242b9f90d08da5ff66da28af6", + "0xad1cfda4f2122a20935aa32fb17c536a3653a18617a65c6836700b5537122af5a8206befe9eaea781c1244c43778e7f1", + "0x832c6f01d6571964ea383292efc8c8fa11e61c0634a25fa180737cc7ab57bc77f25e614aac9a2a03d98f27b3c1c29de2", + "0x903f89cc13ec6685ac7728521898781fecb300e9094ef913d530bf875c18bcc3ceed7ed51e7b482d45619ab4b025c2e9", + "0xa03c474bb915aad94f171e8d96f46abb2a19c9470601f4c915512ec8b9e743c3938450a2a5b077b4618b9df8809e1dc1", + "0x83536c8456f306045a5f38ae4be2e350878fa7e164ea408d467f8c3bc4c2ee396bd5868008c089183868e4dfad7aa50b", + "0x88f26b4ea1b236cb326cd7ad7e2517ec8c4919598691474fe15d09cabcfc37a8d8b1b818f4d112432ee3a716b0f37871", + "0xa44324e3fe96e9c12b40ded4f0f3397c8c7ee8ff5e96441118d8a6bfad712d3ac990b2a6a23231a8f691491ac1fd480f", + "0xb0de4693b4b9f932191a21ee88629964878680152a82996c0019ffc39f8d9369bbe2fe5844b68d6d9589ace54af947e4", + "0x8e5d8ba948aea5fd26035351a960e87f0d23efddd8e13236cc8e4545a3dda2e9a85e6521efb8577e03772d3637d213d9", + "0x93efc82d2017e9c57834a1246463e64774e56183bb247c8fc9dd98c56817e878d97b05f5c8d900acf1fbbbca6f146556", + "0x8731176363ad7658a2862426ee47a5dce9434216cef60e6045fa57c40bb3ce1e78dac4510ae40f1f31db5967022ced32", + "0xb10c9a96745722c85bdb1a693100104d560433d45b9ac4add54c7646a7310d8e9b3ca9abd1039d473ae768a18e489845", + "0xa2ac374dfbb464bf850b4a2caf15b112634a6428e8395f9c9243baefd2452b4b4c61b0cb2836d8eae2d57d4900bf407e", + "0xb69fe3ded0c4f5d44a09a0e0f398221b6d1bf5dbb8bc4e338b93c64f1a3cac1e4b5f73c2b8117158030ec03787f4b452", + "0x8852cdbaf7d0447a8c6f211b4830711b3b5c105c0f316e3a6a18dcfbb9be08bd6f4e5c8ae0c3692da08a2dfa532f9d5c", + "0x93bbf6d7432a7d98ade3f94b57bf9f4da9bc221a180a370b113066dd42601bb9e09edd79e2e6e04e00423399339eebda", + "0xa80941c391f1eeafc1451c59e4775d6a383946ff22997aeaadf806542ba451d3b0f0c6864eeba954174a296efe2c1550", + "0xa045fe2bb011c2a2f71a0181a8f457a3078470fb74c628eab8b59aef69ffd0d649723bf74d6885af3f028bc5a104fb39", + "0xb9d8c35911009c4c8cad64692139bf3fc16b78f5a19980790cb6a7aea650a25df4231a4437ae0c351676a7e42c16134f", + "0x94c79501ded0cfcbab99e1841abe4a00a0252b3870e20774c3da16c982d74c501916ec28304e71194845be6e3113c7ab", + "0x900a66418b082a24c6348d8644ddb1817df5b25cb33044a519ef47cc8e1f7f1e38d2465b7b96d32ed472d2d17f8414c6", + "0xb26f45d393b8b2fcb29bdbb16323dc7f4b81c09618519ab3a39f8ee5bd148d0d9f3c0b5dfab55b5ce14a1cb9206d777b", + "0xaa1a87735fc493a80a96a9a57ca40a6d9c32702bfcaa9869ce1a116ae65d69cefe2f3e79a12454b4590353e96f8912b4", + "0xa922b188d3d0b69b4e4ea2a2aa076566962844637da12c0832105d7b31dea4a309eee15d12b7a336be3ea36fcbd3e3b7", + "0x8f3841fcf4105131d8c4d9885e6e11a46c448226401cf99356c291fadb864da9fa9d30f3a73c327f23f9fd99a11d633e", + "0x9791d1183fae270e226379af6c497e7da803ea854bb20afa74b253239b744c15f670ee808f708ede873e78d79a626c9a", + "0xa4cad52e3369491ada61bf28ada9e85de4516d21c882e5f1cd845bea9c06e0b2887b0c5527fcff6fc28acd3c04f0a796", + "0xb9ac86a900899603452bd11a7892a9bfed8054970bfcbeaa8c9d1930db891169e38d6977f5258c25734f96c8462eee3b", + "0xa3a154c28e5580656a859f4efc2f5ebfa7eaa84ca40e3f134fa7865e8581586db74992dbfa4036aa252fba103773ddde", + "0x95cc2a0c1885a029e094f5d737e3ecf4d26b99036453a8773c77e360101f9f98676ee246f6f732a377a996702d55691f", + "0x842651bbe99720438d8d4b0218feb60481280c05beb17750e9ca0d8c0599a60f873b7fbdcc7d8835ba9a6d57b16eec03", + "0x81ee54699da98f5620307893dcea8f64670609fa20e5622265d66283adeac122d458b3308c5898e6c57c298db2c8b24f", + "0xb97868b0b2bc98032d68352a535a1b341b9ff3c7af4e3a7f3ebc82d3419daa1b5859d6aedc39994939623c7cd878bd9b", + "0xb60325cd5d36461d07ef253d826f37f9ee6474a760f2fff80f9873d01fd2b57711543cdc8d7afa1c350aa753c2e33dea", + "0x8c205326c11d25a46717b780c639d89714c7736c974ae71287e3f4b02e6605ac2d9b4928967b1684f12be040b7bf2dd3", + "0x95a392d82db51e26ade6c2ccd3396d7e40aff68fa570b5951466580d6e56dda51775dce5cf3a74a7f28c3cb2eb551c4d", + "0x8f2cc8071eb56dffb70bda6dd433b556221dc8bba21c53353c865f00e7d4d86c9e39f119ea9a8a12ef583e9a55d9a6b6", + "0x9449a71af9672aaf8856896d7e3d788b22991a7103f75b08c0abbcc2bfe60fda4ed8ce502cea4511ff0ea52a93e81222", + "0x857090ab9fdb7d59632d068f3cc8cf27e61f0d8322d30e6b38e780a1f05227199b4cd746aac1311c36c659ef20931f28", + "0x98a891f4973e7d9aaf9ac70854608d4f7493dffc7e0987d7be9dd6029f6ea5636d24ef3a83205615ca1ff403750058e1", + "0xa486e1365bbc278dd66a2a25d258dc82f46b911103cb16aab3945b9c95ae87b386313a12b566df5b22322ede0afe25ad", + "0xa9a1eb399ed95d396dccd8d1ac718043446f8b979ec62bdce51c617c97a312f01376ab7fb87d27034e5f5570797b3c33", + "0xb7abc3858d7a74bb446218d2f5a037e0fae11871ed9caf44b29b69c500c1fa1dcfad64c9cdccc9d80d5e584f06213deb", + "0x8cfb09fe2e202faa4cebad932b1d35f5ca204e1c2a0c740a57812ac9a6792130d1312aabd9e9d4c58ca168bfebd4c177", + "0xa90a305c2cd0f184787c6be596fa67f436afd1f9b93f30e875f817ac2aae8bdd2e6e656f6be809467e6b3ad84adb86b1", + "0x80a9ef993c2b009ae172cc8f7ec036f5734cf4f4dfa06a7db4d54725e7fbfae5e3bc6f22687bdbb6961939d6f0c87537", + "0x848ade1901931e72b955d7db1893f07003e1708ff5d93174bac5930b9a732640f0578839203e9b77eb27965c700032d3", + "0x93fdf4697609c5ae9c33b9ca2f5f1af44abeb2b98dc4fdf732cf7388de086f410730dc384d9b7a7f447bb009653c8381", + "0x89ce3fb805aea618b5715c0d22a9f46da696b6fa86794f56fdf1d44155a33d42daf1920bcbe36cbacf3cf4c92df9cbc7", + "0x829ce2c342cf82aa469c65f724f308f7a750bd1494adc264609cd790c8718b8b25b5cab5858cf4ee2f8f651d569eea67", + "0xaf2f0cee7bf413204be8b9df59b9e4991bc9009e0d6dbe6815181df0ec2ca93ab8f4f3135b1c14d8f53d74bff0bd6f27", + "0xb87998cecf7b88cde93d1779f10a521edd5574a2fbd240102978639ec57433ba08cdb53849038a329cebbe74657268d2", + "0xa64542a1261a6ed3d720c2c3a802303aad8c4c110c95d0f12e05c1065e66f42da494792b6bfc5b9272363f3b1d457f58", + "0x86a6fd042e4f282fadf07a4bfee03fc96a3aea49f7a00f52bf249a20f1ec892326855410e61f37fbb27d9305eb2fc713", + "0x967ea5bc403b6db269682f7fd0df90659350d7e1aa66bc4fab4c9dfcd75ed0bba4b52f1cebc5f34dc8ba810793727629", + "0xa52990f9f3b8616ce3cdc2c74cd195029e6a969753dcf2d1630438700e7d6ebde36538532b3525ac516f5f2ce9dd27a3", + "0xa64f7ff870bab4a8bf0d4ef6f5c744e9bf1021ed08b4c80903c7ad318e80ba1817c3180cc45cb5a1cae1170f0241655f", + "0xb00f706fa4de1f663f021e8ad3d155e84ce6084a409374b6e6cd0f924a0a0b51bebaaaf1d228c77233a73b0a5a0df0e9", + "0x8b882cc3bff3e42babdb96df95fb780faded84887a0a9bab896bef371cdcf169d909f5658649e93006aa3c6e1146d62e", + "0x9332663ef1d1dcf805c3d0e4ce7a07d9863fb1731172e766b3cde030bf81682cc011e26b773fb9c68e0477b4ae2cfb79", + "0xa8aa8151348dbd4ef40aaeb699b71b4c4bfd3218560c120d85036d14f678f6736f0ec68e80ce1459d3d35feccc575164", + "0xa16cd8b729768f51881c213434aa28301fa78fcb554ddd5f9012ee1e4eae7b5cb3dd88d269d53146dea92d10790faf0b", + "0x86844f0ef9d37142faf3b1e196e44fbe280a3ba4189aa05c356778cb9e3b388a2bff95eed305ada8769935c9974e4c57", + "0xae2eec6b328fccf3b47bcdac32901ac2744a51beb410b04c81dea34dee4912b619466a4f5e2780d87ecefaebbe77b46d", + "0x915df4c38d301c8a4eb2dc5b1ba0ffaad67cbb177e0a80095614e9c711f4ef24a4cef133f9d982a63d2a943ba6c8669d", + "0xae6a2a4dedfc2d1811711a8946991fede972fdf2a389b282471280737536ffc0ac3a6d885b1f8bda0366eb0b229b9979", + "0xa9b628c63d08b8aba6b1317f6e91c34b2382a6c85376e8ef2410a463c6796740ae936fc4e9e0737cb9455d1daa287bd8", + "0x848e30bf7edf2546670b390d5cf9ab71f98fcb6add3c0b582cb34996c26a446dee5d1bde4fdcde4fc80c10936e117b29", + "0x907d6096c7c8c087d1808dd995d5d2b9169b3768c3f433475b50c2e2bd4b082f4d543afd8b0b0ddffa9c66222a72d51d", + "0xa59970a2493b07339124d763ac9d793c60a03354539ecbcf6035bc43d1ea6e35718202ae6d7060b7d388f483d971573c", + "0xb9cfef2af9681b2318f119d8611ff6d9485a68d8044581b1959ab1840cbca576dbb53eec17863d2149966e9feb21122f", + "0xad47271806161f61d3afa45cdfe2babceef5e90031a21779f83dc8562e6076680525b4970b2f11fe9b2b23c382768323", + "0x8e425a99b71677b04fe044625d338811fbb8ee32368a424f6ab2381c52e86ee7a6cecedf777dc97181519d41c351bc22", + "0x86b55b54d7adefc12954a9252ee23ae83efe8b5b4b9a7dc307904413e5d69868c7087a818b2833f9b004213d629be8ad", + "0xa14fda6b93923dd11e564ae4457a66f397741527166e0b16a8eb91c6701c244fd1c4b63f9dd3515193ec88fa6c266b35", + "0xa9b17c36ae6cd85a0ed7f6cabc5b47dc8f80ced605db327c47826476dc1fb8f8669aa7a7dc679fbd4ee3d8e8b4bd6a6f", + "0x82a0829469c1458d959c821148f15dacae9ea94bf56c59a6ab2d4dd8b3d16d73e313b5a3912a6c1f131d73a8f06730c4", + "0xb22d56d549a53eaef549595924bdb621ff807aa4513feedf3fdcbf7ba8b6b9cfa4481c2f67fc642db397a6b794a8b63a", + "0x974c59c24392e2cb9294006cbe3c52163e255f3bd0c2b457bdc68a6338e6d5b6f87f716854492f8d880a6b896ccf757c", + "0xb70d247ba7cad97c50b57f526c2ba915786e926a94e8f8c3eebc2e1be6f4255411b9670e382060049c8f4184302c40b2", + "0xad80201fe75ef21c3ddbd98cf23591e0d7a3ba1036dfe77785c32f44755a212c31f0ceb0a0b6f5ee9b6dc81f358d30c3", + "0x8c656e841f9bb90b9a42d425251f3fdbc022a604d75f5845f479ed4be23e02aaf9e6e56cde351dd7449c50574818a199", + "0x8b88dd3fa209d3063b7c5b058f7249ee9900fbc2287d16da61a0704a0a1d71e45d9c96e1cda7fdf9654534ec44558b22", + "0x961da00cc8750bd84d253c08f011970ae1b1158ad6778e8ed943d547bceaf52d6d5a212a7de3bf2706688c4389b827d2", + "0xa5dd379922549a956033e3d51a986a4b1508e575042b8eaa1df007aa77cf0b8c2ab23212f9c075702788fa9c53696133", + "0xac8fcfde3a349d1e93fc8cf450814e842005c545c4844c0401bc80e6b96cdb77f29285a14455e167c191d4f312e866cd", + "0xac63d79c799783a8466617030c59dd5a8f92ee6c5204676fd8d881ce5f7f8663bdbeb0379e480ea9b6340ab0dc88e574", + "0x805874fde19ce359041ae2bd52a39e2841acabfd31f965792f2737d7137f36d4e4722ede8340d8c95afa6af278af8acb", + "0x8d2f323a228aa8ba7b7dc1399138f9e6b41df1a16a7069003ab8104b8b68506a45141bc5fe66acf430e23e13a545190b", + "0xa1610c721a2d9af882bb6b39bea97cff1527a3aea041d25934de080214ae77c959e79957164440686d15ab301e897d4d", + "0xaba16d29a47fc36f12b654fde513896723e2c700c4190f11b26aa4011da57737ad717daa02794aa3246e4ae5f0b0cc3a", + "0xa406db2f15fdd135f346cc4846623c47edd195e80ba8c7cb447332095314d565e4040694ca924696bb5ee7f8996ea0ba", + "0x8b30e2cd9b47d75ba57b83630e40f832249af6c058d4f490416562af451993eec46f3e1f90bc4d389e4c06abd1b32a46", + "0xaacf9eb7036e248e209adbfc3dd7ce386569ea9b312caa4b240726549db3c68c4f1c8cbf8ed5ea9ea60c7e57c9df3b8e", + "0xb20fcac63bf6f5ee638a42d7f89be847f348c085ddcbec3fa318f4323592d136c230495f188ef2022aa355cc2b0da6f9", + "0x811eff750456a79ec1b1249d76d7c1547065b839d8d4aaad860f6d4528eb5b669473dcceeeea676cddbc3980b68461b7", + "0xb52d14ae33f4ab422f953392ae76a19c618cc31afc96290bd3fe2fb44c954b5c92c4789f3f16e8793f2c0c1691ade444", + "0xa7826dafeeba0db5b66c4dfcf2b17fd7b40507a5a53ac2e42942633a2cb30b95ba1739a6e9f3b7a0e0f1ec729bf274e2", + "0x8acfd83ddf7c60dd7c8b20c706a3b972c65d336b8f9b3d907bdd8926ced271430479448100050b1ef17578a49c8fa616", + "0xaf0c69f65184bb06868029ad46f8465d75c36814c621ac20a5c0b06a900d59305584f5a6709683d9c0e4b6cd08d650a6", + "0xb6cc8588191e00680ee6c3339bd0f0a17ad8fd7f4be57d5d7075bede0ea593a19e67f3d7c1a20114894ee5bfcab71063", + "0xa82fd4f58635129dbb6cc3eb9391cf2d28400018b105fc41500fbbd12bd890b918f97d3d359c29dd3b4c4e34391dfab0", + "0x92fc544ed65b4a3625cf03c41ddff7c039bc22d22c0d59dcc00efd5438401f2606adb125a1d5de294cca216ec8ac35a3", + "0x906f67e4a32582b71f15940523c0c7ce370336935e2646bdaea16a06995256d25e99df57297e39d6c39535e180456407", + "0x97510337ea5bbd5977287339197db55c60533b2ec35c94d0a460a416ae9f60e85cee39be82abeeacd5813cf54df05862", + "0x87e6894643815c0ea48cb96c607266c5ee4f1f82ba5fe352fb77f9b6ed14bfc2b8e09e80a99ac9047dfcf62b2ae26795", + "0xb6fd55dd156622ad7d5d51b7dde75e47bd052d4e542dd6449e72411f68275775c846dde301e84613312be8c7bce58b07", + "0xb98461ac71f554b2f03a94e429b255af89eec917e208a8e60edf5fc43b65f1d17a20de3f31d2ce9f0cb573c25f2f4d98", + "0x96f0dea40ca61cefbee41c4e1fe9a7d81fbe1f49bb153d083ab70f5d0488a1f717fd28cedcf6aa18d07cce2c62801898", + "0x8d7c3ab310184f7dc34b6ce4684e4d29a31e77b09940448ea4daac730b7eb308063125d4dd229046cf11bfd521b771e0", + "0x96f0564898fe96687918bbf0a6adead99cf72e3a35ea3347e124af9d006221f8e82e5a9d2fe80094d5e8d48e610f415e", + "0xad50fcb92c2675a398cf07d4c40a579e44bf8d35f27cc330b57e54d5ea59f7d898af0f75dccfe3726e5471133d70f92b", + "0x828beed62020361689ae7481dd8f116902b522fb0c6c122678e7f949fdef70ead011e0e6bffd25678e388744e17cdb69", + "0x8349decac1ca16599eee2efc95bcaabf67631107da1d34a2f917884bd70dfec9b4b08ab7bc4379d6c73b19c0b6e54fb8", + "0xb2a6a2e50230c05613ace9e58bb2e98d94127f196f02d9dddc53c43fc68c184549ca12d713cb1b025d8260a41e947155", + "0x94ff52181aadae832aed52fc3b7794536e2a31a21fc8be3ea312ca5c695750d37f08002f286b33f4023dba1e3253ecfa", + "0xa21d56153c7e5972ee9a319501be4faff199fdf09bb821ea9ce64aa815289676c00f105e6f00311b3a5b627091b0d0fc", + "0xa27a60d219f1f0c971db73a7f563b371b5c9fc3ed1f72883b2eac8a0df6698400c9954f4ca17d7e94e44bd4f95532afb", + "0xa2fc56fae99b1f18ba5e4fe838402164ce82f8a7f3193d0bbd360c2bac07c46f9330c4c7681ffb47074c6f81ee6e7ac6", + "0xb748e530cd3afb96d879b83e89c9f1a444f54e55372ab1dcd46a0872f95ce8f49cf2363fc61be82259e04f555937ed16", + "0x8bf8993e81080c7cbba1e14a798504af1e4950b2f186ab3335b771d6acaee4ffe92131ae9c53d74379d957cb6344d9cd", + "0x96774d0ef730d22d7ab6d9fb7f90b9ead44285219d076584a901960542756700a2a1603cdf72be4708b267200f6c36a9", + "0xb47703c2ab17be1e823cc7bf3460db1d6760c0e33862c90ca058845b2ff234b0f9834ddba2efb2ee1770eb261e7d8ffd", + "0x84319e67c37a9581f8b09b5e4d4ae88d0a7fb4cbb6908971ab5be28070c3830f040b1de83ee663c573e0f2f6198640e4", + "0x96811875fa83133e0b3c0e0290f9e0e28bca6178b77fdf5350eb19344d453dbd0d71e55a0ef749025a5a2ca0ad251e81", + "0x81a423423e9438343879f2bfd7ee9f1c74ebebe7ce3cfffc8a11da6f040cc4145c3b527bd3cf63f9137e714dbcb474ef", + "0xb8c3535701ddbeec2db08e17a4fa99ba6752d32ece5331a0b8743676f421fcb14798afc7c783815484f14693d2f70db8", + "0x81aee980c876949bf40782835eec8817d535f6f3f7e00bf402ddd61101fdcd60173961ae90a1cf7c5d060339a18c959d", + "0x87e67b928d97b62c49dac321ce6cb680233f3a394d4c9a899ac2e8db8ccd8e00418e66cdfd68691aa3cb8559723b580c", + "0x8eac204208d99a2b738648df96353bbb1b1065e33ee4f6bba174b540bbbd37d205855e1f1e69a6b7ff043ca377651126", + "0x848e6e7a54ad64d18009300b93ea6f459ce855971dddb419b101f5ac4c159215626fadc20cc3b9ab1701d8f6dfaddd8b", + "0x88aa123d9e0cf309d46dddb6acf634b1ade3b090a2826d6e5e78669fa1220d6df9a6697d7778cd9b627db17eea846126", + "0x9200c2a629b9144d88a61151b661b6c4256cc5dadfd1e59a8ce17a013c2d8f7e754aabe61663c3b30f1bc47784c1f8cf", + "0xb6e1a2827c3bdda91715b0e1b1f10dd363cef337e7c80cac1f34165fc0dea7c8b69747e310563db5818390146ce3e231", + "0x92c333e694f89f0d306d54105b2a5dcc912dbe7654d9e733edab12e8537350815be472b063e56cfde5286df8922fdecb", + "0xa6fac04b6d86091158ebb286586ccfec2a95c9786e14d91a9c743f5f05546073e5e3cc717635a0c602cad8334e922346", + "0xa581b4af77feebc1fb897d49b5b507c6ad513d8f09b273328efbb24ef0d91eb740d01b4d398f2738125dacfe550330cd", + "0x81c4860cccf76a34f8a2bc3f464b7bfd3e909e975cce0d28979f457738a56e60a4af8e68a3992cf273b5946e8d7f76e2", + "0x8d1eaa09a3180d8af1cbaee673db5223363cc7229a69565f592fa38ba0f9d582cedf91e15dabd06ebbf2862fc0feba54", + "0x9832f49b0147f4552402e54593cfa51f99540bffada12759b71fcb86734be8e500eea2d8b3d036710bdf04c901432de9", + "0x8bdb0e8ec93b11e5718e8c13cb4f5de545d24829fd76161216340108098dfe5148ed25e3b57a89a516f09fa79043734d", + "0xab96f06c4b9b0b2c0571740b24fca758e6976315053a7ecb20119150a9fa416db2d3a2e0f8168b390bb063f0c1caf785", + "0xab777f5c52acd62ecf4d1f168b9cc8e1a9b45d4ec6a8ff52c583e867c2239aba98d7d3af977289b367edce03d9c2dfb1", + "0xa09d3ce5e748da84802436951acc3d3ea5d8ec1d6933505ed724d6b4b0d69973ab0930daec9c6606960f6e541e4a3ce2", + "0x8ef94f7be4d85d5ad3d779a5cf4d7b2fc3e65c52fb8e1c3c112509a4af77a0b5be994f251e5e40fabeeb1f7d5615c22b", + "0xa7406a5bf5708d9e10922d3c5c45c03ef891b8d0d74ec9f28328a72be4cdc05b4f2703fa99366426659dfca25d007535", + "0xb7f52709669bf92a2e070bfe740f422f0b7127392c5589c7f0af71bb5a8428697c762d3c0d74532899da24ea7d8695c2", + "0xb9dfb0c8df84104dbf9239ccefa4672ef95ddabb8801b74997935d1b81a78a6a5669a3c553767ec19a1281f6e570f4ff", + "0xae4d5c872156061ce9195ac640190d8d71dd406055ee43ffa6f9893eb24b870075b74c94d65bc1d5a07a6573282b5520", + "0xafe6bd3eb72266d333f1807164900dcfa02a7eb5b1744bb3c86b34b3ee91e3f05e38fa52a50dc64eeb4bdb1dd62874b8", + "0x948043cf1bc2ef3c01105f6a78dc06487f57548a3e6ef30e6ebc51c94b71e4bf3ff6d0058c72b6f3ecc37efd7c7fa8c0", + "0xa22fd17c2f7ffe552bb0f23fa135584e8d2d8d75e3f742d94d04aded2a79e22a00dfe7acbb57d44e1cdb962fb22ae170", + "0x8cd0f4e9e4fb4a37c02c1bde0f69359c43ab012eb662d346487be0c3758293f1ca560122b059b091fddce626383c3a8f", + "0x90499e45f5b9c81426f3d735a52a564cafbed72711d9279fdd88de8038e953bc48c57b58cba85c3b2e4ce56f1ddb0e11", + "0x8c30e4c034c02958384564cac4f85022ef36ab5697a3d2feaf6bf105049675bbf23d01b4b6814711d3d9271abff04cac", + "0x81f7999e7eeea30f3e1075e6780bbf054f2fb6f27628a2afa4d41872a385b4216dd5f549da7ce6cf39049b2251f27fb7", + "0xb36a7191f82fc39c283ffe53fc1f5a9a00b4c64eee7792a8443475da9a4d226cf257f226ea9d66e329af15d8f04984ec", + "0xaad4da528fdbb4db504f3041c747455baff5fcd459a2efd78f15bdf3aea0bdb808343e49df88fe7a7c8620009b7964a3", + "0x99ebd8c6dd5dd299517fb6381cfc2a7f443e6e04a351440260dd7c2aee3f1d8ef06eb6c18820b394366ecdfd2a3ce264", + "0x8873725b81871db72e4ec3643084b1cdce3cbf80b40b834b092767728605825c19b6847ad3dcf328438607e8f88b4410", + "0xb008ee2f895daa6abd35bd39b6f7901ae4611a11a3271194e19da1cdcc7f1e1ea008fe5c5440e50d2c273784541ad9c5", + "0x9036feafb4218d1f576ef89d0e99124e45dacaa6d816988e34d80f454d10e96809791d5b78f7fd65f569e90d4d7238c5", + "0x92073c1d11b168e4fa50988b0288638b4868e48bbc668c5a6dddf5499875d53be23a285acb5e4bad60114f6cf6c556e9", + "0x88c87dfcb8ba6cbfe7e1be081ccfadbd589301db2cb7c99f9ee5d7db90aa297ed1538d5a867678a763f2deede5fd219a", + "0xb42a562805c661a50f5dea63108002c0f27c0da113da6a9864c9feb5552225417c0356c4209e8e012d9bcc9d182c7611", + "0x8e6317d00a504e3b79cd47feb4c60f9df186467fe9ca0f35b55c0364db30528f5ff071109dabb2fc80bb9cd4949f0c24", + "0xb7b1ea6a88694f8d2f539e52a47466695e39e43a5eb9c6f23bca15305fe52939d8755cc3ac9d6725e60f82f994a3772f", + "0xa3cd55161befe795af93a38d33290fb642b8d80da8b786c6e6fb02d393ea308fbe87f486994039cbd7c7b390414594b6", + "0xb416d2d45b44ead3b1424e92c73c2cf510801897b05d1724ff31cbd741920cd858282fb5d6040fe1f0aa97a65bc49424", + "0x950ee01291754feace97c2e933e4681e7ddfbc4fcd079eb6ff830b0e481d929c93d0c7fb479c9939c28ca1945c40da09", + "0x869bd916aee8d86efe362a49010382674825d49195b413b4b4018e88ce43fe091b475d0b863ff0ba2259400f280c2b23", + "0x9782f38cd9c9d3385ec286ebbc7cba5b718d2e65a5890b0a5906b10a89dc8ed80d417d71d7c213bf52f2af1a1f513ea7", + "0x91cd33bc2628d096269b23faf47ee15e14cb7fdc6a8e3a98b55e1031ea0b68d10ba30d97e660f7e967d24436d40fad73", + "0x8becc978129cc96737034c577ae7225372dd855da8811ae4e46328e020c803833b5bdbc4a20a93270e2b8bd1a2feae52", + "0xa36b1d8076783a9522476ce17f799d78008967728ce920531fdaf88303321bcaf97ecaa08e0c01f77bc32e53c5f09525", + "0xb4720e744943f70467983aa34499e76de6d59aa6fadf86f6b787fdce32a2f5b535b55db38fe2da95825c51002cfe142d", + "0x91ad21fc502eda3945f6de874d1b6bf9a9a7711f4d61354f9e5634fc73f9c06ada848de15ab0a75811d3250be862827d", + "0x84f78e2ebf5fc077d78635f981712daf17e2475e14c2a96d187913006ad69e234746184a51a06ef510c9455b38acb0d7", + "0x960aa7906e9a2f11db64a26b5892ac45f20d2ccb5480f4888d89973beb6fa0dfdc06d68d241ff5ffc7f1b82b1aac242d", + "0xa99365dcd1a00c66c9db6924b97c920f5c723380e823b250db85c07631b320ec4e92e586f7319e67a522a0578f7b6d6c", + "0xa25d92d7f70cf6a88ff317cfec071e13774516da664f5fac0d4ecaa65b8bf4eb87a64a4d5ef2bd97dfae98d388dbf5cc", + "0xa7af47cd0041295798f9779020a44653007444e8b4ef0712982b06d0dcdd434ec4e1f7c5f7a049326602cb605c9105b7", + "0xaefe172eac5568369a05980931cc476bebd9dea573ba276d59b9d8c4420784299df5a910033b7e324a6c2dfc62e3ef05", + "0xb69bc9d22ffa645baa55e3e02522e9892bb2daa7fff7c15846f13517d0799766883ee09ae0869df4139150c5b843ca8a", + "0x95a10856140e493354fdd12722c7fdded21b6a2ffbc78aa2697104af8ad0c8e2206f44b0bfee077ef3949d46bbf7c16b", + "0x891f2fcd2c47cbea36b7fa715968540c233313f05333f09d29aba23c193f462ed490dd4d00969656e89c53155fdfe710", + "0xa6c33e18115e64e385c843dde34e8a228222795c7ca90bc2cc085705d609025f3351d9be61822c69035a49fb3e48f2d5", + "0xb87fb12f12c0533b005adad0487f03393ff682e13575e3cb57280c3873b2c38ba96a63c49eef7a442753d26b7005230b", + "0xb905c02ba451bfd411c135036d92c27af3b0b1c9c2f1309d6948544a264b125f39dd41afeff4666b12146c545adc168a", + "0x8b29c513f43a78951cf742231cf5457a6d9d55edf45df5481a0f299a418d94effef561b15d2c1a01d1b8067e7153fda9", + "0xb9941cccd51dc645920d2781c81a317e5a33cb7cf76427b60396735912cb6d2ca9292bb4d36b6392467d390d2c58d9f3", + "0xa8546b627c76b6ef5c93c6a98538d8593dbe21cb7673fd383d5401b0c935eea0bdeeefeb1af6ad41bad8464fb87bbc48", + "0xaa286b27de2812de63108a1aec29d171775b69538dc6198640ac1e96767c2b83a50391f49259195957d457b493b667c9", + "0xa932fb229f641e9abbd8eb2bd874015d97b6658ab6d29769fc23b7db9e41dd4f850382d4c1f08af8f156c5937d524473", + "0xa1412840fcc86e2aeec175526f2fb36e8b3b8d21a78412b7266daf81e51b3f68584ed8bd42a66a43afdd8c297b320520", + "0x89c78be9efb624c97ebca4fe04c7704fa52311d183ffd87737f76b7dadc187c12c982bd8e9ed7cd8beb48cdaafd2fd01", + "0xa3f5ddec412a5bec0ce15e3bcb41c6214c2b05d4e9135a0d33c8e50a78eaba71e0a5a6ea8b45854dec5c2ed300971fc2", + "0x9721f9cec7a68b7758e3887548790de49fa6a442d0396739efa20c2f50352a7f91d300867556d11a703866def2d5f7b5", + "0xa23764e140a87e5991573521af039630dd28128bf56eed2edbed130fd4278e090b60cf5a1dca9de2910603d44b9f6d45", + "0xa1a6494a994215e48ab55c70efa8ffdddce6e92403c38ae7e8dd2f8288cad460c6c7db526bbdf578e96ca04d9fe12797", + "0xb1705ea4cb7e074efe0405fc7b8ee2ec789af0426142f3ec81241cacd4f7edcd88e39435e4e4d8e7b1df64f3880d6613", + "0x85595d061d677116089a6064418b93eb44ff79e68d12bd9625078d3bbc440a60d0b02944eff6054433ee34710ae6fbb4", + "0x9978d5e30bedb7526734f9a1febd973a70bfa20890490e7cc6f2f9328feab1e24f991285dbc3711d892514e2d7d005ad", + "0xaf30243c66ea43b9f87a061f947f7bce745f09194f6e95f379c7582b9fead920e5d6957eaf05c12ae1282ada4670652f", + "0xa1930efb473f88001e47aa0b2b2a7566848cccf295792e4544096ecd14ee5d7927c173a8576b405bfa2eec551cd67eb5", + "0xb0446d1c590ee5a45f7e22d269c044f3848c97aec1d226b44bfd0e94d9729c28a38bccddc3a1006cc5fe4e3c24f001f2", + "0xb8a8380172df3d84b06176df916cf557966d4f2f716d3e9437e415d75b646810f79f2b2b71d857181b7fc944018883a3", + "0xa563afec25b7817bfa26e19dc9908bc00aa8fc3d19be7d6de23648701659009d10e3e4486c28e9c6b13d48231ae29ac5", + "0xa5a8e80579de886fb7d6408f542791876885947b27ad6fa99a8a26e381f052598d7b4e647b0115d4b5c64297e00ce28e", + "0x8f87afcc7ad33c51ac719bade3cd92da671a37a82c14446b0a2073f4a0a23085e2c8d31913ed2d0be928f053297de8f6", + "0xa43c455ce377e0bc434386c53c752880687e017b2f5ae7f8a15c044895b242dffde4c92fb8f8bb50b18470b17351b156", + "0x8368f8b12a5bceb1dba25adb3a2e9c7dc9b1a77a1f328e5a693f5aec195cd1e06b0fe9476b554c1c25dac6c4a5b640a3", + "0x919878b27f3671fc78396f11531c032f3e2bd132d04cc234fa4858676b15fb1db3051c0b1db9b4fc49038216f11321ce", + "0xb48cd67fb7f1242696c1f877da4bdf188eac676cd0e561fbac1a537f7b8229aff5a043922441d603a26aae56a15faee4", + "0xa3e0fdfd4d29ea996517a16f0370b54787fefe543c2fe73bfc6f9e560c1fd30dad8409859e2d7fa2d44316f24746c712", + "0x8bb156ade8faf149df7bea02c140c7e392a4742ae6d0394d880a849127943e6f26312033336d3b9fdc0092d71b5efe87", + "0x8845e5d5cc555ca3e0523244300f2c8d7e4d02aaebcb5bd749d791208856c209a6f84dd99fd55968c9f0ab5f82916707", + "0xa3e90bb5c97b07789c2f32dff1aec61d0a2220928202f5ad5355ae71f8249237799d6c8a22602e32e572cb12eabe0c17", + "0xb150bcc391884c996149dc3779ce71f15dda63a759ee9cc05871f5a8379dcb62b047098922c0f26c7bd04deb394c33f9", + "0x95cd4ad88d51f0f2efcfd0c2df802fe252bb9704d1afbf9c26a248df22d55da87bdfaf41d7bc6e5df38bd848f0b13f42", + "0xa05a49a31e91dff6a52ac8b9c2cfdd646a43f0d488253f9e3cfbce52f26667166bbb9b608fc358763a65cbf066cd6d05", + "0xa59c3c1227fdd7c2e81f5e11ef5c406da44662987bac33caed72314081e2eed66055d38137e01b2268e58ec85dd986c0", + "0xb7020ec3bd73a99861f0f1d88cf5a19abab1cbe14b7de77c9868398c84bb8e18dbbe9831838a96b6d6ca06e82451c67b", + "0x98d1ff2525e9718ee59a21d8900621636fcd873d9a564b8dceb4be80a194a0148daf1232742730b3341514b2e5a5436c", + "0x886d97b635975fc638c1b6afc493e5998ca139edba131b75b65cfe5a8e814f11bb678e0eeee5e6e5cd913ad3f2fefdfc", + "0x8fb9fd928d38d5d813b671c924edd56601dd7163b686c13f158645c2f869d9250f3859aa5463a39258c90fef0f41190a", + "0xaac35e1cd655c94dec3580bb3800bd9c2946c4a9856f7d725af15fbea6a2d8ca51c8ad2772abed60ee0e3fb9cb24046b", + "0xb8d71fa0fa05ac9e443c9b4929df9e7f09a919be679692682e614d24227e04894bfc14a5c73a62fb927fedff4a0e4aa7", + "0xa45a19f11fbbb531a704badbb813ed8088ab827c884ee4e4ebf363fa1132ff7cfa9d28be9c85b143e4f7cdbc94e7cf1a", + "0x82b54703a4f295f5471b255ab59dce00f0fe90c9fb6e06b9ee48b15c91d43f4e2ef4a96c3118aeb03b08767be58181bb", + "0x8283264c8e6d2a36558f0d145c18576b6600ff45ff99cc93eca54b6c6422993cf392668633e5df396b9331e873d457e5", + "0x8c549c03131ead601bc30eb6b9537b5d3beb7472f5bb1bcbbfd1e9f3704477f7840ab3ab7f7dc13bbbbcdff886a462d4", + "0xafbb0c520ac1b5486513587700ad53e314cb74bfbc12e0b5fbdcfdaac36d342e8b59856196a0d84a25cff6e6e1d17e76", + "0x89e4c22ffb51f2829061b3c7c1983c5c750cad158e3a825d46f7cf875677da5d63f653d8a297022b5db5845c9271b32b", + "0xafb27a86c4c2373088c96b9adf4433f2ebfc78ac5c526e9f0510670b6e4e5e0057c0a4f75b185e1a30331b9e805c1c15", + "0xa18e16b57445f88730fc5d3567bf5a176861dc14c7a08ed2996fe80eed27a0e7628501bcb78a1727c5e9ac55f29c12c4", + "0x93d61bf88b192d6825cf4e1120af1c17aa0f994d158b405e25437eaeefae049f7b721a206e7cc8a04fdc29d3c42580a1", + "0xa99f2995a2e3ed2fd1228d64166112038de2f516410aa439f4c507044e2017ea388604e2d0f7121256fadf7fbe7023d1", + "0x914fd91cffc23c32f1c6d0e98bf660925090d873367d543034654389916f65f552e445b0300b71b61b721a72e9a5983c", + "0xb42a578a7787b71f924e7def425d849c1c777156b1d4170a8ee7709a4a914e816935131afd9a0412c4cb952957b20828", + "0x82fb30590e84b9e45db1ec475a39971cf554dc01bcc7050bc89265740725c02e2be5a972168c5170c86ae83e5b0ad2c0", + "0xb14f8d8e1e93a84976289e0cf0dfa6f3a1809e98da16ee5c4932d0e1ed6bf8a07697fdd4dd86a3df84fb0003353cdcc0", + "0x85d7a2f4bda31aa2cb208b771fe03291a4ebdaf6f1dc944c27775af5caec412584c1f45bc741fca2a6a85acb3f26ad7d", + "0xaf02e56ce886ff2253bc0a68faad76f25ead84b2144e5364f3fb9b648f03a50ee9dc0b2c33ebacf7c61e9e43201ef9ef", + "0x87e025558c8a0b0abd06dfc350016847ea5ced7af2d135a5c9eec9324a4858c4b21510fb0992ec52a73447f24945058e", + "0x80fff0bafcd058118f5e7a4d4f1ae0912efeb281d2cbe4d34ba8945cc3dbe5d8baf47fb077343b90b8d895c90b297aca", + "0xb6edcf3a40e7b1c3c0148f47a263cd819e585a51ef31c2e35a29ce6f04c53e413f743034c0d998d9c00a08ba00166f31", + "0xabb87ed86098c0c70a76e557262a494ff51a30fb193f1c1a32f8e35eafa34a43fcc07aa93a3b7a077d9e35afa07b1a3d", + "0xa280214cd3bb0fb7ecd2d8bcf518cbd9078417f2b91d2533ec2717563f090fb84f2a5fcfdbbeb2a2a1f8a71cc5aa5941", + "0xa63083ca7238ea2b57d15a475963cf1d4f550d8cd76db290014a0461b90351f1f26a67d674c837b0b773b330c7c3d534", + "0xa8fa39064cb585ece5263e2f42f430206476bf261bd50f18d2b694889bd79d04d56410664cecad62690e5c5a20b3f6ff", + "0x85ba52ce9d700a5dcf6c5b00559acbe599d671ce5512467ff4b6179d7fad550567ce2a9c126a50964e3096458ea87920", + "0xb913501e1008f076e5eac6d883105174f88b248e1c9801e568fefaffa1558e4909364fc6d9512aa4d125cbd7cc895f05", + "0x8eb33b5266c8f2ed4725a6ad147a322e44c9264cf261c933cbbe230a43d47fca0f29ec39756b20561dabafadd5796494", + "0x850ebc8b661a04318c9db5a0515066e6454fa73865aa4908767a837857ecd717387f614acb614a88e075d4edc53a2f5a", + "0xa08d6b92d866270f29f4ce23a3f5d99b36b1e241a01271ede02817c8ec3f552a5c562db400766c07b104a331835c0c64", + "0x8131804c89bb3e74e9718bfc4afa547c1005ff676bd4db9604335032b203390cfa54478d45c6c78d1fe31a436ed4be9f", + "0x9106d94f23cc1eacec8316f16d6f0a1cc160967c886f51981fdb9f3f12ee1182407d2bb24e5b873de58cb1a3ee915a6b", + "0xa13806bfc3eae7a7000c9d9f1bd25e10218d4e67f59ae798b145b098bca3edad2b1040e3fc1e6310e612fb8818f459ac", + "0x8c69fbca502046cb5f6db99900a47b34117aef3f4b241690cdb3b84ca2a2fc7833e149361995dc41fa78892525bce746", + "0x852c473150c91912d58ecb05769222fa18312800c3f56605ad29eec9e2d8667b0b81c379048d3d29100ed2773bb1f3c5", + "0xb1767f6074426a00e01095dbb1795beb4e4050c6411792cbad6537bc444c3165d1058bafd1487451f9c5ddd209e0ae7e", + "0x80c600a5fe99354ce59ff0f84c760923dc8ff66a30bf47dc0a086181785ceb01f9b951c4e66df800ea6d705e8bc47055", + "0xb5cf19002fbc88a0764865b82afcb4d64a50196ea361e5c71dff7de084f4dcbbc34ec94a45cc9e0247bd51da565981aa", + "0x93e67a254ea8ce25e112d93cc927fadaa814152a2c4ec7d9a56eaa1ed47aec99b7e9916b02e64452cc724a6641729bbb", + "0xace70b32491bda18eee4a4d041c3bc9effae9340fe7e6c2f5ad975ee0874c17f1a7da7c96bd85fccff9312c518fac6e9", + "0xab4cfa02065017dd7f1aadc66f2c92f78f0f11b8597c03a5d69d82cb2eaf95a4476a836ac102908f137662472c8d914b", + "0xa40b8cd8deb8ae503d20364d64cab7c2801b7728a9646ed19c65edea6a842756a2f636283494299584ad57f4bb12cd0b", + "0x8594e11d5fc2396bcd9dbf5509ce4816dbb2b7305168021c426171fb444d111da5a152d6835ad8034542277011c26c0e", + "0x8024de98c26b4c994a66628dc304bb737f4b6859c86ded552c5abb81fd4c6c2e19d5a30beed398a694b9b2fdea1dd06a", + "0x8843f5872f33f54df8d0e06166c1857d733995f67bc54abb8dfa94ad92407cf0179bc91b0a50bbb56cdc2b350d950329", + "0xb8bab44c7dd53ef9edf497dcb228e2a41282c90f00ba052fc52d57e87b5c8ab132d227af1fcdff9a12713d1f980bcaae", + "0x982b4d7b29aff22d527fd82d2a52601d95549bfb000429bb20789ed45e5abf1f4b7416c7b7c4b79431eb3574b29be658", + "0x8eb1f571b6a1878e11e8c1c757e0bc084bab5e82e897ca9be9b7f4b47b91679a8190bf0fc8f799d9b487da5442415857", + "0xa6e74b588e5af935c8b243e888582ef7718f8714569dd4992920740227518305eb35fab674d21a5551cca44b3e511ef2", + "0xa30fc2f3a4cb4f50566e82307de73cd7bd8fe2c1184e9293c136a9b9e926a018d57c6e4f308c95b9eb8299e94d90a2a1", + "0xa50c5869ca5d2b40722c056a32f918d47e0b65ca9d7863ca7d2fb4a7b64fe523fe9365cf0573733ceaadebf20b48fff8", + "0x83bbdd32c04d17581418cf360749c7a169b55d54f2427390defd9f751f100897b2d800ce6636c5bbc046c47508d60c8c", + "0xa82904bdf614de5d8deaff688c8a5e7ac5b3431687acbcda8fa53960b7c417a39c8b2e462d7af91ce6d79260f412db8e", + "0xa4362e31ff4b05d278b033cf5eebea20de01714ae16d4115d04c1da4754269873afc8171a6f56c5104bfd7b0db93c3e7", + "0xb5b8daa63a3735581e74a021b684a1038cea77168fdb7fdf83c670c2cfabcfc3ab2fc7359069b5f9048188351aef26b5", + "0xb48d723894b7782d96ac8433c48faca1bdfa5238019c451a7f47d958097cce3ae599b876cf274269236b9d6ff8b6d7ca", + "0x98ffff6a61a3a6205c7820a91ca2e7176fab5dba02bc194c4d14942ac421cb254183c705506ab279e4f8db066f941c6c", + "0xae7db24731da2eaa6efc4f7fcba2ecc26940ddd68038dce43acf2cee15b72dc4ef42a7bfdd32946d1ed78786dd7696b3", + "0xa656db14f1de9a7eb84f6301b4acb2fbf78bfe867f48a270e416c974ab92821eb4df1cb881b2d600cfed0034ac784641", + "0xaa315f8ecba85a5535e9a49e558b15f39520fce5d4bf43131bfbf2e2c9dfccc829074f9083e8d49f405fb221d0bc4c3c", + "0x90bffba5d9ff40a62f6c8e9fc402d5b95f6077ed58d030c93e321b8081b77d6b8dac3f63a92a7ddc01585cf2c127d66c", + "0xabdd733a36e0e0f05a570d0504e73801bf9b5a25ff2c78786f8b805704997acb2e6069af342538c581144d53149fa6d3", + "0xb4a723bb19e8c18a01bd449b1bb3440ddb2017f10bb153da27deb7a6a60e9bb37619d6d5435fbb1ba617687838e01dd0", + "0x870016b4678bab3375516db0187a2108b2e840bae4d264b9f4f27dbbc7cc9cac1d7dc582d7a04d6fd1ed588238e5e513", + "0x80d33d2e20e8fc170aa3cb4f69fffb72aeafb3b5bb4ea0bc79ab55da14142ca19b2d8b617a6b24d537366e3b49cb67c3", + "0xa7ee76aec273aaae03b3b87015789289551969fb175c11557da3ab77e39ab49d24634726f92affae9f4d24003050d974", + "0x8415ea4ab69d779ebd42d0fe0c6aef531d6a465a5739e429b1fcf433ec45aa8296c527e965a20f0ec9f340c9273ea3cf", + "0x8c7662520794e8b4405d0b33b5cac839784bc86a5868766c06cbc1fa306dbe334978177417b31baf90ce7b0052a29c56", + "0x902b2abecc053a3dbdea9897ee21e74821f3a1b98b2d560a514a35799f4680322550fd3a728d4f6d64e1de98033c32b8", + "0xa05e84ed9ecab8d508d670c39f2db61ad6e08d2795ec32a3c9d0d3737ef3801618f4fc2a95f90ec2f068606131e076c5", + "0x8b9208ff4d5af0c2e3f53c9375da666773ac57197dfabb0d25b1c8d0588ba7f3c15ee9661bb001297f322ea2fbf6928b", + "0xa3c827741b34a03254d4451b5ab74a96f2b9f7fb069e2f5adaf54fd97cc7a4d516d378db5ca07da87d8566d6eef13726", + "0x8509d8a3f4a0ed378e0a1e28ea02f6bf1d7f6c819c6c2f5297c7df54c895b848f841653e32ba2a2c22c2ff739571acb8", + "0xa0ce988b7d3c40b4e496aa83a09e4b5472a2d98679622f32bea23e6d607bc7de1a5374fb162bce0549a67dad948519be", + "0xaa8a3dd12bd60e3d2e05f9c683cdcb8eab17fc59134815f8d197681b1bcf65108cba63ac5c58ee632b1e5ed6bba5d474", + "0x8b955f1d894b3aefd883fb4b65f14cd37fc2b9db77db79273f1700bef9973bf3fd123897ea2b7989f50003733f8f7f21", + "0xac79c00ddac47f5daf8d9418d798d8af89fc6f1682e7e451f71ea3a405b0d36af35388dd2a332af790bc83ca7b819328", + "0xa0d44dd2a4438b809522b130d0938c3fe7c5c46379365dbd1810a170a9aa5818e1c783470dd5d0b6d4ac7edbb7330910", + "0xa30b69e39ad43dd540a43c521f05b51b5f1b9c4eed54b8162374ae11eac25da4f5756e7b70ce9f3c92c2eeceee7431ed", + "0xac43220b762c299c7951222ea19761ab938bf38e4972deef58ed84f4f9c68c230647cf7506d7cbfc08562fcca55f0485", + "0xb28233b46a8fb424cfa386a845a3b5399d8489ceb83c8f3e05c22c934798d639c93718b7b68ab3ce24c5358339e41cbb", + "0xac30d50ee8ce59a10d4b37a3a35e62cdb2273e5e52232e202ca7d7b8d09d28958ee667fae41a7bb6cdc6fe8f6e6c9c85", + "0xb199842d9141ad169f35cc7ff782b274cbaa645fdb727761e0a89edbf0d781a15f8218b4bf4eead326f2903dd88a9cc1", + "0x85e018c7ddcad34bb8285a737c578bf741ccd547e68c734bdb3808380e12c5d4ef60fc896b497a87d443ff9abd063b38", + "0x8c856e6ba4a815bdb891e1276f93545b7072f6cb1a9aa6aa5cf240976f29f4dee01878638500a6bf1daf677b96b54343", + "0xb8a47555fa8710534150e1a3f13eab33666017be6b41005397afa647ea49708565f2b86b77ad4964d140d9ced6b4d585", + "0x8cd1f1db1b2f4c85a3f46211599caf512d5439e2d8e184663d7d50166fd3008f0e9253272f898d81007988435f715881", + "0xb1f34b14612c973a3eceb716dc102b82ab18afef9de7630172c2780776679a7706a4874e1df3eaadf541fb009731807f", + "0xb25464af9cff883b55be2ff8daf610052c02df9a5e147a2cf4df6ce63edcdee6dc535c533590084cc177da85c5dc0baa", + "0x91c3c4b658b42d8d3448ae1415d4541d02379a40dc51e36a59bd6e7b9ba3ea51533f480c7c6e8405250ee9b96a466c29", + "0x86dc027b95deb74c36a58a1333a03e63cb5ae22d3b29d114cfd2271badb05268c9d0c819a977f5e0c6014b00c1512e3a", + "0xae0e6ff58eb5fa35da5107ebeacf222ab8f52a22bb1e13504247c1dfa65320f40d97b0e6b201cb6613476687cb2f0681", + "0x8f13415d960b9d7a1d93ef28afc2223e926639b63bdefce0f85e945dfc81670a55df288893a0d8b3abe13c5708f82f91", + "0x956f67ca49ad27c1e3a68c1faad5e7baf0160c459094bf6b7baf36b112de935fdfd79fa4a9ea87ea8de0ac07272969f4", + "0x835e45e4a67df9fb51b645d37840b3a15c171d571a10b03a406dd69d3c2f22df3aa9c5cbe1e73f8d767ce01c4914ea9a", + "0x919b938e56d4b32e2667469d0bdccb95d9dda3341aa907683ee70a14bbbe623035014511c261f4f59b318b610ac90aa3", + "0x96b48182121ccd9d689bf1dfdc228175564cd68dc904a99c808a7f0053a6f636c9d953e12198bdf2ea49ea92772f2e18", + "0xac5e5a941d567fa38fdbcfa8cf7f85bb304e3401c52d88752bcd516d1fa9bac4572534ea2205e38423c1df065990790f", + "0xac0bd594fb85a8d4fc26d6df0fa81f11919401f1ecf9168b891ec7f061a2d9368af99f7fd8d9b43b2ce361e7b8482159", + "0x83d92c69ca540d298fe80d8162a1c7af3fa9b49dfb69e85c1d136a3ec39fe419c9fa78e0bb6d96878771fbd37fe92e40", + "0xb35443ae8aa66c763c2db9273f908552fe458e96696b90e41dd509c17a5c04ee178e3490d9c6ba2dc0b8f793c433c134", + "0x923b2d25aa45b2e580ffd94cbb37dc8110f340f0f011217ee1bd81afb0714c0b1d5fb4db86006cdd2457563276f59c59", + "0x96c9125d38fca1a61ac21257b696f8ac3dae78def50285e44d90ea293d591d1c58f703540a7e4e99e070afe4646bbe15", + "0xb57946b2332077fbcdcb406b811779aefd54473b5559a163cd65cb8310679b7e2028aa55c12a1401fdcfcac0e6fae29a", + "0x845daedc5cf972883835d7e13c937b63753c2200324a3b8082a6c4abb4be06c5f7c629d4abe4bfaf1d80a1f073eb6ce6", + "0x91a55dfd0efefcd03dc6dacc64ec93b8d296cb83c0ee72400a36f27246e7f2a60e73b7b70ba65819e9cfb73edb7bd297", + "0x8874606b93266455fe8fdd25df9f8d2994e927460af06f2e97dd4d2d90db1e6b06d441b72c2e76504d753badca87fb37", + "0x8ee99e6d231274ff9252c0f4e84549da173041299ad1230929c3e3d32399731c4f20a502b4a307642cac9306ccd49d3c", + "0x8836497714a525118e20849d6933bb8535fb6f72b96337d49e3133d936999c90a398a740f42e772353b5f1c63581df6d", + "0xa6916945e10628f7497a6cdc5e2de113d25f7ade3e41e74d3de48ccd4fce9f2fa9ab69645275002e6f49399b798c40af", + "0x9597706983107eb23883e0812e1a2c58af7f3499d50c6e29b455946cb9812fde1aa323d9ed30d1c0ffd455abe32303cd", + "0xa24ee89f7f515cc33bdbdb822e7d5c1877d337f3b2162303cfc2dae028011c3a267c5cb4194afa63a4856a6e1c213448", + "0x8cd25315e4318801c2776824ae6e7d543cb85ed3bc2498ba5752df2e8142b37653cf9e60104d674be3aeb0a66912e97a", + "0xb5085ecbe793180b40dbeb879f4c976eaaccaca3a5246807dced5890e0ed24d35f3f86955e2460e14fb44ff5081c07ba", + "0x960188cc0b4f908633a6840963a6fa2205fc42c511c6c309685234911c5304ef4c304e3ae9c9c69daa2fb6a73560c256", + "0xa32d0a70bf15d569b4cda5aebe3e41e03c28bf99cdd34ffa6c5d58a097f322772acca904b3a47addb6c7492a7126ebac", + "0x977f72d06ad72d4aa4765e0f1f9f4a3231d9f030501f320fe7714cc5d329d08112789fa918c60dd7fdb5837d56bb7fc6", + "0x99fa038bb0470d45852bb871620d8d88520adb701712fcb1f278fed2882722b9e729e6cdce44c82caafad95e37d0e6f7", + "0xb855e8f4fc7634ada07e83b6c719a1e37acb06394bc8c7dcab7747a8c54e5df3943915f021364bd019fdea103864e55f", + "0x88bc2cd7458532e98c596ef59ea2cf640d7cc31b4c33cef9ed065c078d1d4eb49677a67de8e6229cc17ea48bace8ee5a", + "0xaaa78a3feaa836d944d987d813f9b9741afb076e6aca1ffa42682ab06d46d66e0c07b8f40b9dbd63e75e81efa1ef7b08", + "0xb7b080420cc4d808723b98b2a5b7b59c81e624ab568ecdfdeb8bf3aa151a581b6f56e983ef1b6f909661e25db40b0c69", + "0xabee85c462ac9a2c58e54f06c91b3e5cd8c5f9ab5b5deb602b53763c54826ed6deb0d6db315a8d7ad88733407e8d35e2", + "0x994d075c1527407547590df53e9d72dd31f037c763848d1662eebd4cefec93a24328c986802efa80e038cb760a5300f5", + "0xab8777640116dfb6678e8c7d5b36d01265dfb16321abbfc277da71556a34bb3be04bc4ae90124ed9c55386d2bfb3bda0", + "0x967e3a828bc59409144463bcf883a3a276b5f24bf3cbfdd7a42343348cba91e00b46ac285835a9b91eef171202974204", + "0x875a9f0c4ffe5bb1d8da5e3c8e41d0397aa6248422a628bd60bfae536a651417d4e8a7d2fb98e13f2dad3680f7bd86d3", + "0xacaa330c3e8f95d46b1880126572b238dbb6d04484d2cd4f257ab9642d8c9fc7b212188b9c7ac9e0fd135c520d46b1bf", + "0xaceb762edbb0f0c43dfcdb01ea7a1ac5918ca3882b1e7ebc4373521742f1ed5250d8966b498c00b2b0f4d13212e6dd0b", + "0x81d072b4ad258b3646f52f399bced97c613b22e7ad76373453d80b1650c0ca87edb291a041f8253b649b6e5429bb4cff", + "0x980a47d27416ac39c7c3a0ebe50c492f8c776ea1de44d5159ac7d889b6d554357f0a77f0e5d9d0ff41aae4369eba1fc2", + "0x8b4dfd5ef5573db1476d5e43aacfb5941e45d6297794508f29c454fe50ea622e6f068b28b3debe8635cf6036007de2e3", + "0xa60831559d6305839515b68f8c3bc7abbd8212cc4083502e19dd682d56ca37c9780fc3ce4ec2eae81ab23b221452dc57", + "0x951f6b2c1848ced9e8a2339c65918e00d3d22d3e59a0a660b1eca667d18f8430d737884e9805865ef3ed0fe1638a22d9", + "0xb02e38fe790b492aa5e89257c4986c9033a8b67010fa2add9787de857d53759170fdd67715ca658220b4e14b0ca48124", + "0xa51007e4346060746e6b0e4797fc08ef17f04a34fe24f307f6b6817edbb8ce2b176f40771d4ae8a60d6152cbebe62653", + "0xa510005b05c0b305075b27b243c9d64bcdce85146b6ed0e75a3178b5ff9608213f08c8c9246f2ca6035a0c3e31619860", + "0xaaff4ef27a7a23be3419d22197e13676d6e3810ceb06a9e920d38125745dc68a930f1741c9c2d9d5c875968e30f34ab5", + "0x864522a9af9857de9814e61383bebad1ba9a881696925a0ea6bfc6eff520d42c506bbe5685a9946ed710e889765be4a0", + "0xb63258c080d13f3b7d5b9f3ca9929f8982a6960bdb1b0f8676f4dca823971601672f15e653917bf5d3746bb220504913", + "0xb51ce0cb10869121ae310c7159ee1f3e3a9f8ad498827f72c3d56864808c1f21fa2881788f19ece884d3f705cd7bd0c5", + "0x95d9cecfc018c6ed510e441cf84c712d9909c778c16734706c93222257f64dcd2a9f1bd0b400ca271e22c9c487014274", + "0x8beff4d7d0140b86380ff4842a9bda94c2d2be638e20ac68a4912cb47dbe01a261857536375208040c0554929ced1ddc", + "0x891ff49258749e2b57c1e9b8e04b12c77d79c3308b1fb615a081f2aacdfb4b39e32d53e069ed136fdbd43c53b87418fa", + "0x9625cad224e163d387738825982d1e40eeff35fe816d10d7541d15fdc4d3eee48009090f3faef4024b249205b0b28f72", + "0x8f3947433d9bd01aa335895484b540a9025a19481a1c40b4f72dd676bfcf332713714fd4010bde936eaf9470fd239ed0", + "0xa00ec2d67789a7054b53f0e858a8a232706ccc29a9f3e389df7455f1a51a2e75801fd78469a13dbc25d28399ae4c6182", + "0xa3f65884506d4a62b8775a0ea0e3d78f5f46bc07910a93cd604022154eabdf1d73591e304d61edc869e91462951975e1", + "0xa14eef4fd5dfac311713f0faa9a60415e3d30b95a4590cbf95f2033dffb4d16c02e7ceff3dcd42148a4e3bc49cce2dd4", + "0x8afa11c0eef3c540e1e3460bc759bb2b6ea90743623f88e62950c94e370fe4fd01c22b6729beba4dcd4d581198d9358f", + "0xafb05548a69f0845ffcc5f5dc63e3cdb93cd270f5655173b9a950394b0583663f2b7164ba6df8d60c2e775c1d9f120af", + "0x97f179e01a947a906e1cbeafa083960bc9f1bade45742a3afee488dfb6011c1c6e2db09a355d77f5228a42ccaa7bdf8e", + "0x8447fca4d35f74b3efcbd96774f41874ca376bf85b79b6e66c92fa3f14bdd6e743a051f12a7fbfd87f319d1c6a5ce217", + "0xa57ca39c23617cd2cf32ff93b02161bd7baf52c4effb4679d9d5166406e103bc8f3c6b5209e17c37dbb02deb8bc72ddd", + "0x9667c7300ff80f0140be002b0e36caab07aaee7cce72679197c64d355e20d96196acaf54e06e1382167d081fe6f739c1", + "0x828126bb0559ce748809b622677267ca896fa2ee76360fd2c02990e6477e06a667241379ca7e65d61a5b64b96d7867de", + "0x8b8835dea6ba8cf61c91f01a4b3d2f8150b687a4ee09b45f2e5fc8f80f208ae5d142d8e3a18153f0722b90214e60c5a7", + "0xa98e8ff02049b4da386e3ee93db23bbb13dfeb72f1cfde72587c7e6d962780b7671c63e8ac3fbaeb1a6605e8d79e2f29", + "0x87a4892a0026d7e39ef3af632172b88337cb03669dea564bcdb70653b52d744730ebb5d642e20cb627acc9dbb547a26b", + "0x877352a22fc8052878a57effc159dac4d75fe08c84d3d5324c0bab6d564cdf868f33ceee515eee747e5856b62cfa0cc7", + "0x8b801ba8e2ff019ee62f64b8cb8a5f601fc35423eb0f9494b401050103e1307dc584e4e4b21249cd2c686e32475e96c3", + "0xa9e7338d6d4d9bfec91b2af28a8ed13b09415f57a3a00e5e777c93d768fdb3f8e4456ae48a2c6626b264226e911a0e28", + "0x99c05fedf40ac4726ed585d7c1544c6e79619a0d3fb6bda75a08c7f3c0008e8d5e19ed4da48de3216135f34a15eba17c", + "0xa61cce8a1a8b13a4a650fdbec0eeea8297c352a8238fb7cac95a0df18ed16ee02a3daa2de108fa122aca733bd8ad7855", + "0xb97f37da9005b440b4cb05870dd881bf8491fe735844f2d5c8281818583b38e02286e653d9f2e7fa5e74c3c3eb616540", + "0xa72164a8554da8e103f692ac5ebb4aece55d5194302b9f74b6f2a05335b6e39beede0bf7bf8c5bfd4d324a784c5fb08c", + "0xb87e8221c5341cd9cc8bb99c10fe730bc105550f25ed4b96c0d45e6142193a1b2e72f1b3857373a659b8c09be17b3d91", + "0xa41fb1f327ef91dcb7ac0787918376584890dd9a9675c297c45796e32d6e5985b12f9b80be47fc3a8596c245f419d395", + "0x90dafa3592bdbb3465c92e2a54c2531822ba0459d45d3e7a7092fa6b823f55af28357cb51896d4ec2d66029c82f08e26", + "0xa0a9adc872ebc396557f484f1dd21954d4f4a21c4aa5eec543f5fa386fe590839735c01f236574f7ff95407cd12de103", + "0xb8c5c940d58be7538acf8672852b5da3af34f82405ef2ce8e4c923f1362f97fc50921568d0fd2fe846edfb0823e62979", + "0x85aaf06a8b2d0dac89dafd00c28533f35dbd074978c2aaa5bef75db44a7b12aeb222e724f395513b9a535809a275e30b", + "0x81f3cbe82fbc7028c26a6c1808c604c63ba023a30c9f78a4c581340008dbda5ec07497ee849a2183fcd9124f7936af32", + "0xa11ac738de75fd60f15a34209d3825d5e23385796a4c7fc5931822f3f380af977dd0f7b59fbd58eed7777a071e21b680", + "0x85a279c493de03db6fa6c3e3c1b1b29adc9a8c4effc12400ae1128da8421954fa8b75ad19e5388fe4543b76fb0812813", + "0x83a217b395d59ab20db6c4adb1e9713fc9267f5f31a6c936042fe051ce8b541f579442f3dcf0fa16b9e6de9fd3518191", + "0x83a0b86e7d4ed8f9ccdc6dfc8ff1484509a6378fa6f09ed908e6ab9d1073f03011dc497e14304e4e3d181b57de06a5ab", + "0xa63ad69c9d25704ce1cc8e74f67818e5ed985f8f851afa8412248b2df5f833f83b95b27180e9e7273833ed0d07113d3b", + "0x99b1bc2021e63b561fe44ddd0af81fcc8627a91bfeecbbc989b642bc859abc0c8d636399701aad7bbaf6a385d5f27d61", + "0xb53434adb66f4a807a6ad917c6e856321753e559b1add70824e5c1e88191bf6993fccb9b8b911fc0f473fb11743acacd", + "0x97ed3b9e6fb99bf5f945d4a41f198161294866aa23f2327818cdd55cb5dc4c1a8eff29dd8b8d04902d6cd43a71835c82", + "0xb1e808260e368a18d9d10bdea5d60223ba1713b948c782285a27a99ae50cc5fc2c53d407de07155ecc16fb8a36d744a0", + "0xa3eb4665f18f71833fec43802730e56b3ee5a357ea30a888ad482725b169d6f1f6ade6e208ee081b2e2633079b82ba7d", + "0xab8beb2c8353fc9f571c18fdd02bdb977fc883313469e1277b0372fbbb33b80dcff354ca41de436d98d2ed710faa467e", + "0xaa9071cfa971e4a335a91ad634c98f2be51544cb21f040f2471d01bb97e1df2277ae1646e1ea8f55b7ba9f5c8c599b39", + "0x80b7dbfdcaf40f0678012acc634eba44ea51181475180d9deb2050dc4f2de395289edd0223018c81057ec79b04b04c49", + "0x89623d7f6cb17aa877af14de842c2d4ab7fd576d61ddd7518b5878620a01ded40b6010de0da3cdf31d837eecf30e9847", + "0xa773bb024ae74dd24761f266d4fb27d6fd366a8634febe8235376b1ae9065c2fe12c769f1d0407867dfbe9f5272c352f", + "0x8455a561c3aaa6ba64c881a5e13921c592b3a02e968f4fb24a2243c36202795d0366d9cc1a24e916f84d6e158b7aeac7", + "0x81d8bfc4b283cf702a40b87a2b96b275bdbf0def17e67d04842598610b67ea08c804d400c3e69fa09ea001eaf345b276", + "0xb8f8f82cb11fea1c99467013d7e167ff03deb0c65a677fab76ded58826d1ba29aa7cf9fcd7763615735ea3ad38e28719", + "0x89a6a04baf9cccc1db55179e1650b1a195dd91fb0aebc197a25143f0f393524d2589975e3fbfc2547126f0bced7fd6f2", + "0xb81b2162df045390f04df07cbd0962e6b6ca94275a63edded58001a2f28b2ae2af2c7a6cba4ecd753869684e77e7e799", + "0xa3757f722776e50de45c62d9c4a2ee0f5655a512344c4cbec542d8045332806568dd626a719ef21a4eb06792ca70f204", + "0x8c5590df96ec22179a4e8786de41beb44f987a1dcc508eb341eecbc0b39236fdfad47f108f852e87179ccf4e10091e59", + "0x87502f026ed4e10167419130b88c3737635c5b9074c364e1dd247cef5ef0fc064b4ae99b187e33301e438bbd2fe7d032", + "0xaf925a2165e980ced620ff12289129fe17670a90ae0f4db9d4b39bd887ccb1f5d2514ac9ecf910f6390a8fc66bd5be17", + "0x857fca899828cf5c65d26e3e8a6e658542782fc72762b3b9c73514919f83259e0f849a9d4838b40dc905fe43024d0d23", + "0x87ffebdbfb69a9e1007ebac4ffcb4090ff13705967b73937063719aa97908986effcb7262fdadc1ae0f95c3690e3245d", + "0xa9ff6c347ac6f4c6ab993b748802e96982eaf489dc69032269568412fc9a79e7c2850dfc991b28211b3522ee4454344b", + "0xa65b3159df4ec48bebb67cb3663cd744027ad98d970d620e05bf6c48f230fa45bf17527fe726fdf705419bb7a1bb913e", + "0x84b97b1e6408b6791831997b03cd91f027e7660fd492a93d95daafe61f02427371c0e237c75706412f442991dfdff989", + "0xab761c26527439b209af0ae6afccd9340bbed5fbe098734c3145b76c5d2cd7115d9227b2eb523882b7317fbb09180498", + "0xa0479a8da06d7a69c0b0fee60df4e691c19c551f5e7da286dab430bfbcabf31726508e20d26ea48c53365a7f00a3ad34", + "0xa732dfc9baa0f4f40b5756d2e8d8937742999623477458e0bc81431a7b633eefc6f53b3b7939fe0a020018549c954054", + "0x901502436a1169ba51dc479a5abe7c8d84e0943b16bc3c6a627b49b92cd46263c0005bc324c67509edd693f28e612af1", + "0xb627aee83474e7f84d1bab9b7f6b605e33b26297ac6bbf52d110d38ba10749032bd551641e73a383a303882367af429b", + "0x95108866745760baef4a46ef56f82da6de7e81c58b10126ebd2ba2cd13d339f91303bf2fb4dd104a6956aa3b13739503", + "0x899ed2ade37236cec90056f3569bc50f984f2247792defafcceb49ad0ca5f6f8a2f06573705300e07f0de0c759289ff5", + "0xa9f5eee196d608efe4bcef9bf71c646d27feb615e21252cf839a44a49fd89da8d26a758419e0085a05b1d59600e2dc42", + "0xb36c6f68fed6e6c85f1f4a162485f24817f2843ec5cbee45a1ebfa367d44892e464949c6669f7972dc7167af08d55d25", + "0xaaaede243a9a1b6162afbc8f571a52671a5a4519b4062e3f26777664e245ba873ed13b0492c5dbf0258c788c397a0e9e", + "0x972b4fb39c31cbe127bf9a32a5cc10d621ebdd9411df5e5da3d457f03b2ab2cd1f6372d8284a4a9400f0b06ecdbfd38e", + "0x8f6ca1e110e959a4b1d9a5ce5f212893cec21db40d64d5ac4d524f352d72198f923416a850bf845bc5a22a79c0ea2619", + "0xa0f3c93b22134f66f04b2553a53b738644d1665ceb196b8494b315a4c28236fb492017e4a0de4224827c78e42f9908b7", + "0x807fb5ee74f6c8735b0b5ca07e28506214fe4047dbeb00045d7c24f7849e98706aea79771241224939cb749cf1366c7d", + "0x915eb1ff034224c0b645442cdb7d669303fdc00ca464f91aaf0b6fde0b220a3a74ff0cb043c26c9f3a5667b3fdaa9420", + "0x8fda6cef56ed33fefffa9e6ac8e6f76b1af379f89761945c63dd448801f7bb8ca970504a7105fac2f74f652ccff32327", + "0x87380cffdcffb1d0820fa36b63cc081e72187f86d487315177d4d04da4533eb19a0e2ff6115ceab528887819c44a5164", + "0x8cd89e03411a18e7f16f968b89fb500c36d47d229f6487b99e62403a980058db5925ce249206743333538adfad168330", + "0x974451b1df33522ce7056de9f03e10c70bf302c44b0741a59df3d6877d53d61a7394dcee1dd46e013d7cb9d73419c092", + "0x98c35ddf645940260c490f384a49496a7352bb8e3f686feed815b1d38f59ded17b1ad6e84a209e773ed08f7b8ff1e4c2", + "0x963f386cf944bb9b2ddebb97171b64253ea0a2894ac40049bdd86cda392292315f3a3d490ca5d9628c890cfb669f0acb", + "0x8d507712152babd6d142ee682638da8495a6f3838136088df9424ef50d5ec28d815a198c9a4963610b22e49b4cdf95e9", + "0x83d4bc6b0be87c8a4f1e9c53f257719de0c73d85b490a41f7420e777311640937320557ff2f1d9bafd1daaa54f932356", + "0x82f5381c965b7a0718441131c4d13999f4cdce637698989a17ed97c8ea2e5bdb5d07719c5f7be8688edb081b23ede0f4", + "0xa6ebecab0b72a49dfd01d69fa37a7f74d34fb1d4fef0aa10e3d6fceb9eccd671225c230af89f6eb514250e41a5f91f52", + "0x846d185bdad6e11e604df7f753b7a08a28b643674221f0e750ebdb6b86ec584a29c869e131bca868972a507e61403f6a", + "0x85a98332292acb744bd1c0fd6fdcf1f889a78a2c9624d79413ffa194cc8dfa7821a4b60cde8081d4b5f71f51168dd67f", + "0x8f7d97c3b4597880d73200d074eb813d95432306e82dafc70b580b8e08cb8098b70f2d07b4b3ac6a4d77e92d57035031", + "0x8185439c8751e595825d7053518cbe121f191846a38d4dbcb558c3f9d7a3104f3153401adaaaf27843bbe2edb504bfe3", + "0xb3c00d8ece1518fca6b1215a139b0a0e26d9cba1b3a424f7ee59f30ce800a5db967279ed60958dd1f3ee69cf4dd1b204", + "0xa2e6cb6978e883f9719c3c0d44cfe8de0cc6f644b98f98858433bea8bbe7b612c8aca5952fccce4f195f9d54f9722dc2", + "0x99663087e3d5000abbec0fbda4e7342ec38846cc6a1505191fb3f1a337cb369455b7f8531a6eb8b0f7b2c4baf83cbe2b", + "0xab0836c6377a4dbc7ca6a4d6cf021d4cd60013877314dd05f351706b128d4af6337711ed3443cb6ca976f40d74070a9a", + "0x87abfd5126152fd3bac3c56230579b489436755ea89e0566aa349490b36a5d7b85028e9fb0710907042bcde6a6f5d7e3", + "0x974ba1033f75f60e0cf7c718a57ae1da3721cf9d0fb925714c46f027632bdd84cd9e6de4cf4d00bc55465b1c5ebb7384", + "0xa607b49d73689ac64f25cec71221d30d53e781e1100d19a2114a21da6507a60166166369d860bd314acb226596525670", + "0xa7c2b0b915d7beba94954f2aa7dd08ec075813661e2a3ecca5d28a0733e59583247fed9528eb28aba55b972cdbaf06eb", + "0xb8b3123e44128cc8efbe3270f2f94e50ca214a4294c71c3b851f8cbb70cb67fe9536cf07d04bf7fe380e5e3a29dd3c15", + "0xa59a07e343b62ad6445a0859a32b58c21a593f9ddbfe52049650f59628c93715aa1f4e1f45b109321756d0eeec8a5429", + "0x94f51f8a4ed18a6030d0aaa8899056744bd0e9dc9ac68f62b00355cddab11da5da16798db75f0bfbce0e5bdfe750c0b6", + "0x97460a97ca1e1fa5ce243b81425edc0ec19b7448e93f0b55bc9785eedeeafe194a3c8b33a61a5c72990edf375f122777", + "0x8fa859a089bc17d698a7ee381f37ce9beadf4e5b44fce5f6f29762bc04f96faff5d58c48c73631290325f05e9a1ecf49", + "0xabdf38f3b20fc95eff31de5aa9ef1031abfa48f1305ee57e4d507594570401503476d3bcc493838fc24d6967a3082c7f", + "0xb8914bfb82815abb86da35c64d39ab838581bc0bf08967192697d9663877825f2b9d6fbdcf9b410463482b3731361aef", + "0xa8187f9d22b193a5f578999954d6ec9aa9b32338ccadb8a3e1ce5bad5ea361d69016e1cdfac44e9d6c54e49dd88561b9", + "0xaac262cb7cba7fd62c14daa7b39677cabc1ef0947dd06dd89cac8570006a200f90d5f0353e84f5ff03179e3bebe14231", + "0xa630ef5ece9733b8c46c0a2df14a0f37647a85e69c63148e79ffdcc145707053f9f9d305c3f1cf3c7915cb46d33abd07", + "0xb102c237cb2e254588b6d53350dfda6901bd99493a3fbddb4121d45e0b475cf2663a40d7b9a75325eda83e4ba1e68cb3", + "0x86a930dd1ddcc16d1dfa00aa292cb6c2607d42c367e470aa920964b7c17ab6232a7108d1c2c11fc40fb7496547d0bbf8", + "0xa832fdc4500683e72a96cce61e62ac9ee812c37fe03527ad4cf893915ca1962cee80e72d4f82b20c8fc0b764376635a1", + "0x88ad985f448dabb04f8808efd90f273f11f5e6d0468b5489a1a6a3d77de342992a73eb842d419034968d733f101ff683", + "0x98a8538145f0d86f7fbf9a81c9140f6095c5bdd8960b1c6f3a1716428cd9cca1bf8322e6d0af24e6169abcf7df2b0ff6", + "0x9048c6eba5e062519011e177e955a200b2c00b3a0b8615bdecdebc217559d41058d3315f6d05617be531ef0f6aef0e51", + "0x833bf225ab6fc68cdcacf1ec1b50f9d05f5410e6cdcd8d56a3081dc2be8a8d07b81534d1ec93a25c2e270313dfb99e3b", + "0xa84bcd24c3da5e537e64a811b93c91bfc84d7729b9ead7f79078989a6eb76717d620c1fad17466a0519208651e92f5ff", + "0xb7cdd0a3fbd79aed93e1b5a44ca44a94e7af5ed911e4492f332e3a5ed146c7286bde01b52276a2fcc02780d2109874dd", + "0x8a19a09854e627cb95750d83c20c67442b66b35896a476358f993ba9ac114d32c59c1b3d0b8787ee3224cf3888b56c64", + "0xa9abd5afb8659ee52ada8fa5d57e7dd355f0a7350276f6160bec5fbf70d5f99234dd179eb221c913e22a49ec6d267846", + "0x8c13c4274c0d30d184e73eaf812200094bbbd57293780bdadbceb262e34dee5b453991e7f37c7333a654fc71c69d6445", + "0xa4320d73296ff8176ce0127ca1921c450e2a9c06eff936681ebaffb5a0b05b17fded24e548454de89aca2dcf6d7a9de4", + "0xb2b8b3e15c1f645f07783e5628aba614e60157889db41d8161d977606788842b67f83f361eae91815dc0abd84e09abd5", + "0xad26c3aa35ddfddc15719b8bb6c264aaec7065e88ac29ba820eb61f220fef451609a7bb037f3722d022e6c86e4f1dc88", + "0xb8615bf43e13ae5d7b8dd903ce37190800cd490f441c09b22aa29d7a29ed2c0417b7a08ead417868f1de2589deaadd80", + "0x8d3425e1482cd1e76750a76239d33c06b3554c3c3c87c15cb7ab58b1cee86a4c5c4178b44e23f36928365a1b484bde02", + "0x806893a62e38c941a7dd6f249c83af16596f69877cc737d8f73f6b8cd93cbc01177a7a276b2b8c6b0e5f2ad864db5994", + "0x86618f17fa4b0d65496b661bbb5ba3bc3a87129d30a4b7d4f515b904f4206ca5253a41f49fd52095861e5e065ec54f21", + "0x9551915da1304051e55717f4c31db761dcdcf3a1366c89a4af800a9e99aca93a357bf928307f098e62b44a02cb689a46", + "0x8f79c4ec0ec1146cb2a523b52fe33def90d7b5652a0cb9c2d1c8808a32293e00aec6969f5b1538e3a94cd1efa3937f86", + "0xa0c03e329a707300081780f1e310671315b4c6a4cedcb29697aedfabb07a9d5df83f27b20e9c44cf6b16e39d9ded5b98", + "0x86a7cfa7c8e7ce2c01dd0baec2139e97e8e090ad4e7b5f51518f83d564765003c65968f85481bbb97cb18f005ccc7d9f", + "0xa33811770c6dfda3f7f74e6ad0107a187fe622d61b444bbd84fd7ef6e03302e693b093df76f6ab39bb4e02afd84a575a", + "0x85480f5c10d4162a8e6702b5e04f801874d572a62a130be94b0c02b58c3c59bdcd48cd05f0a1c2839f88f06b6e3cd337", + "0x8e181011564b17f7d787fe0e7f3c87f6b62da9083c54c74fd6c357a1f464c123c1d3d8ade3cf72475000b464b14e2be3", + "0x8ee178937294b8c991337e0621ab37e9ffa4ca2bdb3284065c5e9c08aad6785d50cf156270ff9daf9a9127289710f55b", + "0x8bd1e8e2d37379d4b172f1aec96f2e41a6e1393158d7a3dbd9a95c8dd4f8e0b05336a42efc11a732e5f22b47fc5c271d", + "0x8f3da353cd487c13136a85677de8cedf306faae0edec733cf4f0046f82fa4639db4745b0095ff33a9766aba50de0cbcf", + "0x8d187c1e97638df0e4792b78e8c23967dac43d98ea268ca4aabea4e0fa06cb93183fd92d4c9df74118d7cc27bf54415e", + "0xa4c992f08c2f8bac0b74b3702fb0c75c9838d2ce90b28812019553d47613c14d8ce514d15443159d700b218c5a312c49", + "0xa6fd1874034a34c3ea962a316c018d9493d2b3719bb0ec4edbc7c56b240802b2228ab49bee6f04c8a3e9f6f24a48c1c2", + "0xb2efed8e799f8a15999020900dc2c58ece5a3641c90811b86a5198e593d7318b9d53b167818ccdfbe7df2414c9c34011", + "0x995ff7de6181ddf95e3ead746089c6148da3508e4e7a2323c81785718b754d356789b902e7e78e2edc6b0cbd4ff22c78", + "0x944073d24750a9068cbd020b834afc72d2dde87efac04482b3287b40678ad07588519a4176b10f2172a2c463d063a5cd", + "0x99db4b1bb76475a6fd75289986ef40367960279524378cc917525fb6ba02a145a218c1e9caeb99332332ab486a125ac0", + "0x89fce4ecd420f8e477af4353b16faabb39e063f3f3c98fde2858b1f2d1ef6eed46f0975a7c08f233b97899bf60ccd60a", + "0x8c09a4f07a02b80654798bc63aada39fd638d3e3c4236ccd8a5ca280350c31e4a89e5f4c9aafb34116e71da18c1226b8", + "0x85325cfa7ded346cc51a2894257eab56e7488dbff504f10f99f4cd2b630d913003761a50f175ed167e8073f1b6b63fb0", + "0xb678b4fbec09a8cc794dcbca185f133578f29e354e99c05f6d07ac323be20aecb11f781d12898168e86f2e0f09aca15e", + "0xa249cfcbca4d9ba0a13b5f6aac72bf9b899adf582f9746bb2ad043742b28915607467eb794fca3704278f9136f7642be", + "0x9438e036c836a990c5e17af3d78367a75b23c37f807228362b4d13e3ddcb9e431348a7b552d09d11a2e9680704a4514f", + "0x925ab70450af28c21a488bfb5d38ac994f784cf249d7fd9ad251bb7fd897a23e23d2528308c03415074d43330dc37ef4", + "0xa290563904d5a8c0058fc8330120365bdd2ba1fdbaef7a14bc65d4961bb4217acfaed11ab82669e359531f8bf589b8db", + "0xa7e07a7801b871fc9b981a71e195a3b4ba6b6313bc132b04796a125157e78fe5c11a3a46cf731a255ac2d78a4ae78cd0", + "0xb26cd2501ee72718b0eebab6fb24d955a71f363f36e0f6dff0ab1d2d7836dab88474c0cef43a2cc32701fca7e82f7df3", + "0xa1dc3b6c968f3de00f11275092290afab65b2200afbcfa8ddc70e751fa19dbbc300445d6d479a81bda3880729007e496", + "0xa9bc213e28b630889476a095947d323b9ac6461dea726f2dc9084473ae8e196d66fb792a21905ad4ec52a6d757863e7d", + "0xb25d178df8c2df8051e7c888e9fa677fde5922e602a95e966db9e4a3d6b23ce043d7dc48a5b375c6b7c78e966893e8c3", + "0xa1c8d88d72303692eaa7adf68ea41de4febec40cc14ae551bb4012afd786d7b6444a3196b5d9d5040655a3366d96b7cd", + "0xb22bd44f9235a47118a9bbe2ba5a2ba9ec62476061be2e8e57806c1a17a02f9a51403e849e2e589520b759abd0117683", + "0xb8add766050c0d69fe81d8d9ea73e1ed05f0135d093ff01debd7247e42dbb86ad950aceb3b50b9af6cdc14ab443b238f", + "0xaf2cf95f30ef478f018cf81d70d47d742120b09193d8bb77f0d41a5d2e1a80bfb467793d9e2471b4e0ad0cb2c3b42271", + "0x8af5ef2107ad284e246bb56e20fef2a255954f72de791cbdfd3be09f825298d8466064f3c98a50496c7277af32b5c0bc", + "0x85dc19558572844c2849e729395a0c125096476388bd1b14fa7f54a7c38008fc93e578da3aac6a52ff1504d6ca82db05", + "0xae8c9b43c49572e2e166d704caf5b4b621a3b47827bb2a3bcd71cdc599bba90396fd9a405261b13e831bb5d44c0827d7", + "0xa7ba7efede25f02e88f6f4cbf70643e76784a03d97e0fbd5d9437c2485283ad7ca3abb638a5f826cd9f6193e5dec0b6c", + "0x94a9d122f2f06ef709fd8016fd4b712d88052245a65a301f5f177ce22992f74ad05552b1f1af4e70d1eac62cef309752", + "0x82d999b3e7cf563833b8bc028ff63a6b26eb357dfdb3fd5f10e33a1f80a9b2cfa7814d871b32a7ebfbaa09e753e37c02", + "0xaec6edcde234df502a3268dd2c26f4a36a2e0db730afa83173f9c78fcb2b2f75510a02b80194327b792811caefda2725", + "0x94c0bfa66c9f91d462e9194144fdd12d96f9bbe745737e73bab8130607ee6ea9d740e2cfcbbd00a195746edb6369ee61", + "0xab7573dab8c9d46d339e3f491cb2826cabe8b49f85f1ede78d845fc3995537d1b4ab85140b7d0238d9c24daf0e5e2a7e", + "0x87e8b16832843251fe952dadfd01d41890ed4bb4b8fa0254550d92c8cced44368225eca83a6c3ad47a7f81ff8a80c984", + "0x9189d2d9a7c64791b19c0773ad4f0564ce6bea94aa275a917f78ad987f150fdb3e5e26e7fef9982ac184897ecc04683f", + "0xb3661bf19e2da41415396ae4dd051a9272e8a2580b06f1a1118f57b901fa237616a9f8075af1129af4eabfefedbe2f1c", + "0xaf43c86661fb15daf5d910a4e06837225e100fb5680bd3e4b10f79a2144c6ec48b1f8d6e6b98e067d36609a5d038889a", + "0x82ac0c7acaa83ddc86c5b4249aae12f28155989c7c6b91e5137a4ce05113c6cbc16f6c44948b0efd8665362d3162f16a", + "0x8f268d1195ab465beeeb112cd7ffd5d5548559a8bc01261106d3555533fc1971081b25558d884d552df0db1cddda89d8", + "0x8ef7caa5521f3e037586ce8ac872a4182ee20c7921c0065ed9986c047e3dda08294da1165f385d008b40d500f07d895f", + "0x8c2f98f6880550573fad46075d3eba26634b5b025ce25a0b4d6e0193352c8a1f0661064027a70fe8190b522405f9f4e3", + "0xb7653f353564feb164f0f89ec7949da475b8dad4a4d396d252fc2a884f6932d027b7eb2dc4d280702c74569319ed701a", + "0xa026904f4066333befd9b87a8fad791d014096af60cdd668ef919c24dbe295ff31f7a790e1e721ba40cf5105abca67f4", + "0x988f982004ada07a22dd345f2412a228d7a96b9cae2c487de42e392afe1e35c2655f829ce07a14629148ce7079a1f142", + "0x9616add009067ed135295fb74d5b223b006b312bf14663e547a0d306694ff3a8a7bb9cfc466986707192a26c0bce599f", + "0xad4c425de9855f6968a17ee9ae5b15e0a5b596411388cf976df62ecc6c847a6e2ddb2cea792a5f6e9113c2445dba3e5c", + "0xb698ac9d86afa3dc69ff8375061f88e3b0cff92ff6dfe747cebaf142e813c011851e7a2830c10993b715e7fd594604a9", + "0xa386fa189847bb3b798efca917461e38ead61a08b101948def0f82cd258b945ed4d45b53774b400af500670149e601b7", + "0x905c95abda2c68a6559d8a39b6db081c68cef1e1b4be63498004e1b2f408409be9350b5b5d86a30fd443e2b3e445640a", + "0x9116dade969e7ce8954afcdd43e5cab64dc15f6c1b8da9d2d69de3f02ba79e6c4f6c7f54d6bf586d30256ae405cd1e41", + "0xa3084d173eacd08c9b5084a196719b57e47a0179826fda73466758235d7ecdb87cbcf097bd6b510517d163a85a7c7edd", + "0x85bb00415ad3c9be99ff9ba83672cc59fdd24356b661ab93713a3c8eab34e125d8867f628a3c3891b8dc056e69cd0e83", + "0x8d58541f9f39ed2ee4478acce5d58d124031338ec11b0d55551f00a5a9a6351faa903a5d7c132dc5e4bb026e9cbd18e4", + "0xa622adf72dc250e54f672e14e128c700166168dbe0474cecb340da175346e89917c400677b1bc1c11fcc4cc26591d9db", + "0xb3f865014754b688ca8372e8448114fff87bf3ca99856ab9168894d0c4679782c1ced703f5b74e851b370630f5e6ee86", + "0xa7e490b2c40c2446fcd91861c020da9742c326a81180e38110558bb5d9f2341f1c1885e79b364e6419023d1cbdc47380", + "0xb3748d472b1062e54572badbb8e87ac36534407f74932e7fc5b8392d008e8e89758f1671d1e4d30ab0fa40551b13bb5e", + "0x89898a5c5ec4313aabc607b0049fd1ebad0e0c074920cf503c9275b564d91916c2c446d3096491c950b7af3ac5e4b0ed", + "0x8eb8c83fef2c9dd30ea44e286e9599ec5c20aba983f702e5438afe2e5b921884327ad8d1566c72395587efac79ca7d56", + "0xb92479599e806516ce21fb0bd422a1d1d925335ebe2b4a0a7e044dd275f30985a72b97292477053ac5f00e081430da80", + "0xa34ae450a324fe8a3c25a4d653a654f9580ed56bbea213b8096987bbad0f5701d809a17076435e18017fea4d69f414bc", + "0x81381afe6433d62faf62ea488f39675e0091835892ecc238e02acf1662669c6d3962a71a3db652f6fe3bc5f42a0e5dc5", + "0xa430d475bf8580c59111103316fe1aa79c523ea12f1d47a976bbfae76894717c20220e31cf259f08e84a693da6688d70", + "0xb842814c359754ece614deb7d184d679d05d16f18a14b288a401cef5dad2cf0d5ee90bad487b80923fc5573779d4e4e8", + "0x971d9a2627ff2a6d0dcf2af3d895dfbafca28b1c09610c466e4e2bff2746f8369de7f40d65b70aed135fe1d72564aa88", + "0x8f4ce1c59e22b1ce7a0664caaa7e53735b154cfba8d2c5cc4159f2385843de82ab58ed901be876c6f7fce69cb4130950", + "0x86cc9dc321b6264297987000d344fa297ef45bcc2a4df04e458fe2d907ad304c0ea2318e32c3179af639a9a56f3263cf", + "0x8229e0876dfe8f665c3fb19b250bd89d40f039bbf1b331468b403655be7be2e104c2fd07b9983580c742d5462ca39a43", + "0x99299d73066e8eb128f698e56a9f8506dfe4bd014931e86b6b487d6195d2198c6c5bf15cccb40ccf1f8ddb57e9da44a2", + "0xa3a3be37ac554c574b393b2f33d0a32a116c1a7cfeaf88c54299a4da2267149a5ecca71f94e6c0ef6e2f472b802f5189", + "0xa91700d1a00387502cdba98c90f75fbc4066fefe7cc221c8f0e660994c936badd7d2695893fde2260c8c11d5bdcdd951", + "0x8e03cae725b7f9562c5c5ab6361644b976a68bada3d7ca508abca8dfc80a469975689af1fba1abcf21bc2a190dab397d", + "0xb01461ad23b2a8fa8a6d241e1675855d23bc977dbf4714add8c4b4b7469ccf2375cec20e80cedfe49361d1a30414ac5b", + "0xa2673bf9bc621e3892c3d7dd4f1a9497f369add8cbaa3472409f4f86bd21ac67cfac357604828adfee6ada1835365029", + "0xa042dff4bf0dfc33c178ba1b335e798e6308915128de91b12e5dbbab7c4ac8d60a01f6aea028c3a6d87b9b01e4e74c01", + "0x86339e8a75293e4b3ae66b5630d375736b6e6b6b05c5cda5e73fbf7b2f2bd34c18a1d6cefede08625ce3046e77905cb8", + "0xaf2ebe1b7d073d03e3d98bc61af83bf26f7a8c130fd607aa92b75db22d14d016481b8aa231e2c9757695f55b7224a27f", + "0xa00ee882c9685e978041fd74a2c465f06e2a42ffd3db659053519925be5b454d6f401e3c12c746e49d910e4c5c9c5e8c", + "0x978a781c0e4e264e0dad57e438f1097d447d891a1e2aa0d5928f79a9d5c3faae6f258bc94fdc530b7b2fa6a9932bb193", + "0xaa4b7ce2e0c2c9e9655bf21e3e5651c8503bce27483017b0bf476be743ba06db10228b3a4c721219c0779747f11ca282", + "0xb003d1c459dacbcf1a715551311e45d7dbca83a185a65748ac74d1800bbeaba37765d9f5a1a221805c571910b34ebca8", + "0x95b6e531b38648049f0d19de09b881baa1f7ea3b2130816b006ad5703901a05da57467d1a3d9d2e7c73fb3f2e409363c", + "0xa6cf9c06593432d8eba23a4f131bb7f72b9bd51ab6b4b772a749fe03ed72b5ced835a349c6d9920dba2a39669cb7c684", + "0xaa3d59f6e2e96fbb66195bc58c8704e139fa76cd15e4d61035470bd6e305db9f98bcbf61ac1b95e95b69ba330454c1b3", + "0xb57f97959c208361de6d7e86dff2b873068adb0f158066e646f42ae90e650079798f165b5cd713141cd3a2a90a961d9a", + "0xa76ee8ed9052f6a7a8c69774bb2597be182942f08115baba03bf8faaeaee526feba86120039fe8ca7b9354c3b6e0a8e6", + "0x95689d78c867724823f564627d22d25010f278674c6d2d0cdb10329169a47580818995d1d727ce46c38a1e47943ebb89", + "0xab676d2256c6288a88e044b3d9ffd43eb9d5aaee00e8fc60ac921395fb835044c71a26ca948e557fed770f52d711e057", + "0x96351c72785c32e5d004b6f4a1259fb8153d631f0c93fed172f18e8ba438fbc5585c1618deeabd0d6d0b82173c2e6170", + "0x93dd8d3db576418e22536eba45ab7f56967c6c97c64260d6cddf38fb19c88f2ec5cd0e0156f50e70855eee8a2b879ffd", + "0xad6ff16f40f6de3d7a737f8e6cebd8416920c4ff89dbdcd75eabab414af9a6087f83ceb9aff7680aa86bff98bd09c8cc", + "0x84de53b11671abc9c38710e19540c5c403817562aeb22a88404cdaff792c1180f717dbdfe8f54940c062c4d032897429", + "0x872231b9efa1cdd447b312099a5c164c560440a9441d904e70f5abfc3b2a0d16be9a01aca5e0a2599a61e19407587e3d", + "0x88f44ac27094a2aa14e9dc40b099ee6d68f97385950f303969d889ee93d4635e34dff9239103bdf66a4b7cbba3e7eb7a", + "0xa59afebadf0260e832f6f44468443562f53fbaf7bcb5e46e1462d3f328ac437ce56edbca617659ac9883f9e13261fad7", + "0xb1990e42743a88de4deeacfd55fafeab3bc380cb95de43ed623d021a4f2353530bcab9594389c1844b1c5ea6634c4555", + "0x85051e841149a10e83f56764e042182208591396d0ce78c762c4a413e6836906df67f38c69793e158d64fef111407ba3", + "0x9778172bbd9b1f2ec6bbdd61829d7b39a7df494a818e31c654bf7f6a30139899c4822c1bf418dd4f923243067759ce63", + "0x9355005b4878c87804fc966e7d24f3e4b02bed35b4a77369d01f25a3dcbff7621b08306b1ac85b76fe7b4a3eb5f839b1", + "0x8f9dc6a54fac052e236f8f0e1f571ac4b5308a43acbe4cc8183bce26262ddaf7994e41cf3034a4cbeca2c505a151e3b1", + "0x8cc59c17307111723fe313046a09e0e32ea0cce62c13814ab7c6408c142d6a0311d801be4af53fc9240523f12045f9ef", + "0x8e6057975ed40a1932e47dd3ac778f72ee2a868d8540271301b1aa6858de1a5450f596466494a3e0488be4fbeb41c840", + "0x812145efbd6559ae13325d56a15940ca4253b17e72a9728986b563bb5acc13ec86453796506ac1a8f12bd6f9e4a288c3", + "0x911da0a6d6489eb3dab2ec4a16e36127e8a291ae68a6c2c9de33e97f3a9b1f00da57a94e270a0de79ecc5ecb45d19e83", + "0xb72ea85973f4b2a7e6e71962b0502024e979a73c18a9111130e158541fa47bbaaf53940c8f846913a517dc69982ba9e1", + "0xa7a56ad1dbdc55f177a7ad1d0af78447dc2673291e34e8ab74b26e2e2e7d8c5fe5dc89e7ef60f04a9508847b5b3a8188", + "0xb52503f6e5411db5d1e70f5fb72ccd6463fa0f197b3e51ca79c7b5a8ab2e894f0030476ada72534fa4eb4e06c3880f90", + "0xb51c7957a3d18c4e38f6358f2237b3904618d58b1de5dec53387d25a63772e675a5b714ad35a38185409931157d4b529", + "0xb86b4266e719d29c043d7ec091547aa6f65bbf2d8d831d1515957c5c06513b72aa82113e9645ad38a7bc3f5383504fa6", + "0xb95b547357e6601667b0f5f61f261800a44c2879cf94e879def6a105b1ad2bbf1795c3b98a90d588388e81789bd02681", + "0xa58fd4c5ae4673fa350da6777e13313d5d37ed1dafeeb8f4f171549765b84c895875d9d3ae6a9741f3d51006ef81d962", + "0x9398dc348d078a604aadc154e6eef2c0be1a93bb93ba7fe8976edc2840a3a318941338cc4d5f743310e539d9b46613d2", + "0x902c9f0095014c4a2f0dccaaab543debba6f4cc82c345a10aaf4e72511725dbed7a34cd393a5f4e48a3e5142b7be84ed", + "0xa7c0447849bb44d04a0393a680f6cd390093484a79a147dd238f5d878030d1c26646d88211108e59fe08b58ad20c6fbd", + "0x80db045535d6e67a422519f5c89699e37098449d249698a7cc173a26ccd06f60238ae6cc7242eb780a340705c906790c", + "0x8e52b451a299f30124505de2e74d5341e1b5597bdd13301cc39b05536c96e4380e7f1b5c7ef076f5b3005a868657f17c", + "0x824499e89701036037571761e977654d2760b8ce21f184f2879fda55d3cda1e7a95306b8abacf1caa79d3cc075b9d27f", + "0x9049b956b77f8453d2070607610b79db795588c0cec12943a0f5fe76f358dea81e4f57a4692112afda0e2c05c142b26f", + "0x81911647d818a4b5f4990bfd4bc13bf7be7b0059afcf1b6839333e8569cdb0172fd2945410d88879349f677abaed5eb3", + "0xad4048f19b8194ed45b6317d9492b71a89a66928353072659f5ce6c816d8f21e69b9d1817d793effe49ca1874daa1096", + "0x8d22f7b2ddb31458661abd34b65819a374a1f68c01fc6c9887edeba8b80c65bceadb8f57a3eb686374004b836261ef67", + "0x92637280c259bc6842884db3d6e32602a62252811ae9b019b3c1df664e8809ffe86db88cfdeb8af9f46435c9ee790267", + "0xa2f416379e52e3f5edc21641ea73dc76c99f7e29ea75b487e18bd233856f4c0183429f378d2bfc6cd736d29d6cadfa49", + "0x882cb6b76dbdc188615dcf1a8439eba05ffca637dd25197508156e03c930b17b9fed2938506fdd7b77567cb488f96222", + "0xb68b621bb198a763fb0634eddb93ed4b5156e59b96c88ca2246fd1aea3e6b77ed651e112ac41b30cd361fadc011d385e", + "0xa3cb22f6b675a29b2d1f827cacd30df14d463c93c3502ef965166f20d046af7f9ab7b2586a9c64f4eae4fad2d808a164", + "0x8302d9ce4403f48ca217079762ce42cee8bc30168686bb8d3a945fbd5acd53b39f028dce757b825eb63af2d5ae41169d", + "0xb2eef1fbd1a176f1f4cd10f2988c7329abe4eb16c7405099fb92baa724ab397bc98734ef7d4b24c0f53dd90f57520d04", + "0xa1bbef0bd684a3f0364a66bde9b29326bac7aa3dde4caed67f14fb84fed3de45c55e406702f1495a3e2864d4ee975030", + "0x976acdb0efb73e3a3b65633197692dedc2adaed674291ae3df76b827fc866d214e9cac9ca46baefc4405ff13f953d936", + "0xb9fbf71cc7b6690f601f0b1c74a19b7d14254183a2daaafec7dc3830cba5ae173d854bbfebeca985d1d908abe5ef0cda", + "0x90591d7b483598c94e38969c4dbb92710a1a894bcf147807f1bcbd8aa3ac210b9f2be65519aa829f8e1ccdc83ad9b8cf", + "0xa30568577c91866b9c40f0719d46b7b3b2e0b4a95e56196ac80898a2d89cc67880e1229933f2cd28ee3286f8d03414d7", + "0x97589a88c3850556b359ec5e891f0937f922a751ac7c95949d3bbc7058c172c387611c0f4cb06351ef02e5178b3dd9e4", + "0x98e7bbe27a1711f4545df742f17e3233fbcc63659d7419e1ca633f104cb02a32c84f2fac23ca2b84145c2672f68077ab", + "0xa7ddb91636e4506d8b7e92aa9f4720491bb71a72dadc47c7f4410e15f93e43d07d2b371951a0e6a18d1bd087aa96a5c4", + "0xa7c006692227a06db40bceac3d5b1daae60b5692dd9b54772bedb5fea0bcc91cbcdb530cac31900ffc70c5b3ffadc969", + "0x8d3ec6032778420dfa8be52066ba0e623467df33e4e1901dbadd586c5d750f4ccde499b5197e26b9ea43931214060f69", + "0x8d9a8410518ea64f89df319bfd1fc97a0971cdb9ad9b11d1f8fe834042ea7f8dce4db56eeaf179ff8dda93b6db93e5ce", + "0xa3c533e9b3aa04df20b9ff635cb1154ce303e045278fcf3f10f609064a5445552a1f93989c52ce852fd0bbd6e2b6c22e", + "0x81934f3a7f8c1ae60ec6e4f212986bcc316118c760a74155d06ce0a8c00a9b9669ec4e143ca214e1b995e41271774fd9", + "0xab8e2d01a71192093ef8fafa7485e795567cc9db95a93fb7cc4cf63a391ef89af5e2bfad4b827fffe02b89271300407f", + "0x83064a1eaa937a84e392226f1a60b7cfad4efaa802f66de5df7498962f7b2649924f63cd9962d47906380b97b9fe80e1", + "0xb4f5e64a15c6672e4b55417ee5dc292dcf93d7ea99965a888b1cc4f5474a11e5b6520eacbcf066840b343f4ceeb6bf33", + "0xa63d278b842456ef15c278b37a6ea0f27c7b3ffffefca77c7a66d2ea06c33c4631eb242bbb064d730e70a8262a7b848a", + "0x83a41a83dbcdf0d22dc049de082296204e848c453c5ab1ba75aa4067984e053acf6f8b6909a2e1f0009ed051a828a73b", + "0x819485b036b7958508f15f3c19436da069cbe635b0318ebe8c014cf1ef9ab2df038c81161b7027475bcfa6fff8dd9faf", + "0xaa40e38172806e1e045e167f3d1677ef12d5dcdc89b43639a170f68054bd196c4fae34c675c1644d198907a03f76ba57", + "0x969bae484883a9ed1fbed53b26b3d4ee4b0e39a6c93ece5b3a49daa01444a1c25727dabe62518546f36b047b311b177c", + "0x80a9e73a65da99664988b238096a090d313a0ee8e4235bc102fa79bb337b51bb08c4507814eb5baec22103ec512eaab0", + "0x86604379aec5bddda6cbe3ef99c0ac3a3c285b0b1a15b50451c7242cd42ae6b6c8acb717dcca7917838432df93a28502", + "0xa23407ee02a495bed06aa7e15f94cfb05c83e6d6fba64456a9bbabfa76b2b68c5c47de00ba169e710681f6a29bb41a22", + "0x98cff5ecc73b366c6a01b34ac9066cb34f7eeaf4f38a5429bad2d07e84a237047e2a065c7e8a0a6581017dadb4695deb", + "0x8de9f68a938f441f3b7ab84bb1f473c5f9e5c9e139e42b7ccee1d254bd57d0e99c2ccda0f3198f1fc5737f6023dd204e", + "0xb0ce48d815c2768fb472a315cad86aa033d0e9ca506f146656e2941829e0acb735590b4fbc713c2d18d3676db0a954ac", + "0x82f485cdefd5642a6af58ac6817991c49fac9c10ace60f90b27f1788cc026c2fe8afc83cf499b3444118f9f0103598a8", + "0x82c24550ed512a0d53fc56f64cc36b553823ae8766d75d772dacf038c460f16f108f87a39ceef7c66389790f799dbab3", + "0x859ffcf1fe9166388316149b9acc35694c0ea534d43f09dae9b86f4aa00a23b27144dda6a352e74b9516e8c8d6fc809c", + "0xb8f7f353eec45da77fb27742405e5ad08d95ec0f5b6842025be9def3d9892f85eb5dd0921b41e6eff373618dba215bca", + "0x8ccca4436f9017e426229290f5cd05eac3f16571a4713141a7461acfe8ae99cd5a95bf5b6df129148693c533966145da", + "0xa2c67ecc19c0178b2994846fea4c34c327a5d786ac4b09d1d13549d5be5996d8a89021d63d65cb814923388f47cc3a03", + "0xaa0ff87d676b418ec08f5cbf577ac7e744d1d0e9ebd14615b550eb86931eafd2a36d4732cc5d6fab1713fd7ab2f6f7c0", + "0x8aef4730bb65e44efd6bb9441c0ae897363a2f3054867590a2c2ecf4f0224e578c7a67f10b40f8453d9f492ac15a9b2d", + "0x86a187e13d8fba5addcfdd5b0410cedd352016c930f913addd769ee09faa6be5ca3e4b1bdb417a965c643a99bd92be42", + "0xa0a4e9632a7a094b14b29b78cd9c894218cdf6783e61671e0203865dc2a835350f465fbaf86168f28af7c478ca17bc89", + "0xa8c7b02d8deff2cd657d8447689a9c5e2cd74ef57c1314ac4d69084ac24a7471954d9ff43fe0907d875dcb65fd0d3ce5", + "0x97ded38760aa7be6b6960b5b50e83b618fe413cbf2bcc1da64c05140bcc32f5e0e709cd05bf8007949953fac5716bad9", + "0xb0d293835a24d64c2ae48ce26e550b71a8c94a0883103757fb6b07e30747f1a871707d23389ba2b2065fa6bafe220095", + "0x8f9e291bf849feaa575592e28e3c8d4b7283f733d41827262367ea1c40f298c7bcc16505255a906b62bf15d9f1ba85fb", + "0x998f4e2d12708b4fd85a61597ca2eddd750f73c9e0c9b3cf0825d8f8e01f1628fd19797dcaed3b16dc50331fc6b8b821", + "0xb30d1f8c115d0e63bf48f595dd10908416774c78b3bbb3194192995154d80ea042d2e94d858de5f8aa0261b093c401fd", + "0xb5d9c75bb41f964cbff3f00e96d9f1480c91df8913f139f0d385d27a19f57a820f838eb728e46823cbff00e21c660996", + "0xa6edec90b5d25350e2f5f0518777634f9e661ec9d30674cf5b156c4801746d62517751d90074830ac0f4b09911c262f1", + "0x82f98da1264b6b75b8fbeb6a4d96d6a05b25c24db0d57ba3a38efe3a82d0d4e331b9fc4237d6494ccfe4727206457519", + "0xb89511843453cf4ecd24669572d6371b1e529c8e284300c43e0d5bb6b3aaf35aeb634b3cb5c0a2868f0d5e959c1d0772", + "0xa82bf065676583e5c1d3b81987aaae5542f522ba39538263a944bb33ea5b514c649344a96c0205a3b197a3f930fcda6c", + "0xa37b47ea527b7e06c460776aa662d9a49ff4149d3993f1a974b0dd165f7171770d189b0e2ea54fd5fccb6a14b116e68a", + "0xa1017677f97dda818274d47556d09d0e4ccacb23a252f82a6cfe78c630ad46fb9806307445a59fb61262182de3a2b29c", + "0xb01e9fcac239ba270e6877b79273ddd768bf8a51d2ed8a051b1c11e18eff3de5920e2fcbfbd26f06d381eddd3b1f1e1b", + "0x82fcd53d803b1c8e4ed76adc339b7f3a5962d37042b9683aabac7513ac68775d4a566a9460183926a6a95dbe7d551a1f", + "0xa763e78995d55cd21cdb7ef75d9642d6e1c72453945e346ab6690c20a4e1eeec61bb848ef830ae4b56182535e3c71d8f", + "0xb769f4db602251d4b0a1186782799bdcef66de33c110999a5775c50b349666ffd83d4c89714c4e376f2efe021a5cfdb2", + "0xa59cbd1b785efcfa6e83fc3b1d8cf638820bc0c119726b5368f3fba9dce8e3414204fb1f1a88f6c1ff52e87961252f97", + "0x95c8c458fd01aa23ecf120481a9c6332ebec2e8bb70a308d0576926a858457021c277958cf79017ddd86a56cacc2d7db", + "0x82eb41390800287ae56e77f2e87709de5b871c8bdb67c10a80fc65f3acb9f7c29e8fa43047436e8933f27449ea61d94d", + "0xb3ec25e3545eb83aed2a1f3558d1a31c7edde4be145ecc13b33802654b77dc049b4f0065069dd9047b051e52ab11dcdd", + "0xb78a0c715738f56f0dc459ab99e252e3b579b208142836b3c416b704ca1de640ca082f29ebbcee648c8c127df06f6b1e", + "0xa4083149432eaaf9520188ebf4607d09cf664acd1f471d4fb654476e77a9eaae2251424ffda78d09b6cb880df35c1219", + "0x8c52857d68d6e9672df3db2df2dbf46b516a21a0e8a18eec09a6ae13c1ef8f369d03233320dd1c2c0bbe00abfc1ea18b", + "0x8c856089488803066bff3f8d8e09afb9baf20cecc33c8823c1c0836c3d45498c3de37e87c016b705207f60d2b00f8609", + "0x831a3df39be959047b2aead06b4dcd3012d7b29417f642b83c9e8ce8de24a3dbbd29c6fdf55e2db3f7ea04636c94e403", + "0xaed84d009f66544addabe404bf6d65af7779ce140dc561ff0c86a4078557b96b2053b7b8a43432ffb18cd814f143b9da", + "0x93282e4d72b0aa85212a77b336007d8ba071eea17492da19860f1ad16c1ea8867ccc27ef5c37c74b052465cc11ea4f52", + "0xa7b78b8c8d057194e8d68767f1488363f77c77bddd56c3da2bc70b6354c7aa76247c86d51f7371aa38a4aa7f7e3c0bb7", + "0xb1c77283d01dcd1bde649b5b044eac26befc98ff57cbee379fb5b8e420134a88f2fc7f0bf04d15e1fbd45d29e7590fe6", + "0xa4aa8de70330a73b2c6458f20a1067eed4b3474829b36970a8df125d53bbdda4f4a2c60063b7cccb0c80fc155527652f", + "0x948a6c79ba1b8ad7e0bed2fae2f0481c4e41b4d9bbdd9b58164e28e9065700e83f210c8d5351d0212e0b0b68b345b3a5", + "0x86a48c31dcbbf7b082c92d28e1f613a2378a910677d7db3a349dc089e4a1e24b12eee8e8206777a3a8c64748840b7387", + "0x976adb1af21e0fc34148917cf43d933d7bfd3fd12ed6c37039dcd5a4520e3c6cf5868539ba5bf082326430deb8a4458d", + "0xb93e1a4476f2c51864bb4037e7145f0635eb2827ab91732b98d49b6c07f6ac443111aa1f1da76d1888665cb897c3834e", + "0x8afd46fb23bf869999fa19784b18a432a1f252d09506b8dbb756af900518d3f5f244989b3d7c823d9029218c655d3dc6", + "0x83f1e59e3abeed18cdc632921672673f1cb6e330326e11c4e600e13e0d5bc11bdc970ae12952e15103a706fe720bf4d6", + "0x90ce4cc660714b0b673d48010641c09c00fc92a2c596208f65c46073d7f349dd8e6e077ba7dcef9403084971c3295b76", + "0x8b09b0f431a7c796561ecf1549b85048564de428dac0474522e9558b6065fede231886bc108539c104ce88ebd9b5d1b0", + "0x85d6e742e2fb16a7b0ba0df64bc2c0dbff9549be691f46a6669bca05e89c884af16822b85faefefb604ec48c8705a309", + "0xa87989ee231e468a712c66513746fcf03c14f103aadca0eac28e9732487deb56d7532e407953ab87a4bf8961588ef7b0", + "0xb00da10efe1c29ee03c9d37d5918e391ae30e48304e294696b81b434f65cf8c8b95b9d1758c64c25e534d045ba28696f", + "0x91c0e1fb49afe46c7056400baa06dbb5f6e479db78ee37e2d76c1f4e88994357e257b83b78624c4ef6091a6c0eb8254d", + "0x883fb797c498297ccbf9411a3e727c3614af4eccde41619b773dc7f3259950835ee79453debf178e11dec4d3ada687a0", + "0xa14703347e44eb5059070b2759297fcfcfc60e6893c0373eea069388eba3950aa06f1c57cd2c30984a2d6f9e9c92c79e", + "0xafebc7585b304ceba9a769634adff35940e89cd32682c78002822aab25eec3edc29342b7f5a42a56a1fec67821172ad5", + "0xaea3ff3822d09dba1425084ca95fd359718d856f6c133c5fabe2b2eed8303b6e0ba0d8698b48b93136a673baac174fd9", + "0xaf2456a09aa777d9e67aa6c7c49a1845ea5cdda2e39f4c935c34a5f8280d69d4eec570446998cbbe31ede69a91e90b06", + "0x82cada19fed16b891ef3442bafd49e1f07c00c2f57b2492dd4ee36af2bd6fd877d6cb41188a4d6ce9ec8d48e8133d697", + "0x82a21034c832287f616619a37c122cee265cc34ae75e881fcaea4ea7f689f3c2bc8150bbf7dbcfd123522bfb7f7b1d68", + "0x86877217105f5d0ec3eeff0289fc2a70d505c9fdf7862e8159553ef60908fb1a27bdaf899381356a4ef4649072a9796c", + "0x82b196e49c6e861089a427c0b4671d464e9d15555ffb90954cd0d630d7ae02eb3d98ceb529d00719c2526cd96481355a", + "0xa29b41d0d43d26ce76d4358e0db2b77df11f56e389f3b084d8af70a636218bd3ac86b36a9fe46ec9058c26a490f887f7", + "0xa4311c4c20c4d7dd943765099c50f2fd423e203ccfe98ff00087d205467a7873762510cac5fdce7a308913ed07991ed7", + "0xb1f040fc5cc51550cb2c25cf1fd418ecdd961635a11f365515f0cb4ffb31da71f48128c233e9cc7c0cf3978d757ec84e", + "0xa9ebae46f86d3bd543c5f207ed0d1aed94b8375dc991161d7a271f01592912072e083e2daf30c146430894e37325a1b9", + "0x826418c8e17ad902b5fe88736323a47e0ca7a44bce4cbe27846ec8fe81de1e8942455dda6d30e192cdcc73e11df31256", + "0x85199db563427c5edcbac21f3d39fec2357be91fb571982ddcdc4646b446ad5ced84410de008cb47b3477ee0d532daf8", + "0xb7eed9cd400b2ca12bf1d9ae008214b8561fb09c8ad9ff959e626ffde00fee5ff2f5b6612e231f2a1a9b1646fcc575e3", + "0x8b40bf12501dcbac78f5a314941326bfcddf7907c83d8d887d0bb149207f85d80cd4dfbd7935439ea7b14ea39a3fded7", + "0x83e3041af302485399ba6cd5120e17af61043977083887e8d26b15feec4a6b11171ac5c06e6ad0971d4b58a81ff12af3", + "0x8f5b9a0eecc589dbf8c35a65d5e996a659277ef6ea509739c0cb7b3e2da9895e8c8012de662e5b23c5fa85d4a8f48904", + "0x835d71ed5e919d89d8e6455f234f3ff215462c4e3720c371ac8c75e83b19dfe3ae15a81547e4dc1138e5f5997f413cc9", + "0x8b7d2e4614716b1db18e9370176ea483e6abe8acdcc3dcdf5fb1f4d22ca55d652feebdccc171c6de38398d9f7bfdec7a", + "0x93eace72036fe57d019676a02acf3d224cf376f166658c1bf705db4f24295881d477d6fdd7916efcfceff8c7a063deda", + "0xb1ac460b3d516879a84bc886c54f020a9d799e7c49af3e4d7de5bf0d2793c852254c5d8fe5616147e6659512e5ccb012", + "0xacd0947a35cb167a48bcd9667620464b54ac0e78f9316b4aa92dcaab5422d7a732087e52e1c827faa847c6b2fe6e7766", + "0x94ac33d21c3d12ff762d32557860e911cd94d666609ddcc42161b9c16f28d24a526e8b10bb03137257a92cec25ae637d", + "0x832e02058b6b994eadd8702921486241f9a19e68ed1406dad545e000a491ae510f525ccf9d10a4bba91c68f2c53a0f58", + "0x9471035d14f78ff8f463b9901dd476b587bb07225c351161915c2e9c6114c3c78a501379ab6fb4eb03194c457cbd22bf", + "0xab64593e034c6241d357fcbc32d8ea5593445a5e7c24cac81ad12bd2ef01843d477a36dc1ba21dbe63b440750d72096a", + "0x9850f3b30045e927ad3ec4123a32ed2eb4c911f572b6abb79121873f91016f0d80268de8b12e2093a4904f6e6cab7642", + "0x987212c36b4722fe2e54fa30c52b1e54474439f9f35ca6ad33c5130cd305b8b54b532dd80ffd2c274105f20ce6d79f6e", + "0x8b4d0c6abcb239b5ed47bef63bc17efe558a27462c8208fa652b056e9eae9665787cd1aee34fbb55beb045c8bfdb882b", + "0xa9f3483c6fee2fe41312d89dd4355d5b2193ac413258993805c5cbbf0a59221f879386d3e7a28e73014f10e65dd503d9", + "0xa2225da3119b9b7c83d514b9f3aeb9a6d9e32d9cbf9309cbb971fd53c4b2c001d10d880a8ad8a7c281b21d85ceca0b7c", + "0xa050be52e54e676c151f7a54453bbb707232f849beab4f3bf504b4d620f59ed214409d7c2bd3000f3ff13184ccda1c35", + "0xadbccf681e15b3edb6455a68d292b0a1d0f5a4cb135613f5e6db9943f02181341d5755875db6ee474e19ace1c0634a28", + "0x8b6eff675632a6fad0111ec72aacc61c7387380eb87933fd1d098856387d418bd38e77d897e65d6fe35951d0627c550b", + "0xaabe2328ddf90989b15e409b91ef055cb02757d34987849ae6d60bef2c902bf8251ed21ab30acf39e500d1d511e90845", + "0x92ba4eb1f796bc3d8b03515f65c045b66e2734c2da3fc507fdd9d6b5d1e19ab3893726816a32141db7a31099ca817d96", + "0x8a98b3cf353138a1810beb60e946183803ef1d39ac4ea92f5a1e03060d35a4774a6e52b14ead54f6794d5f4022b8685c", + "0x909f8a5c13ec4a59b649ed3bee9f5d13b21d7f3e2636fd2bb3413c0646573fdf9243d63083356f12f5147545339fcd55", + "0x9359d914d1267633141328ed0790d81c695fea3ddd2d406c0df3d81d0c64931cf316fe4d92f4353c99ff63e2aefc4e34", + "0xb88302031681b54415fe8fbfa161c032ea345c6af63d2fb8ad97615103fd4d4281c5a9cae5b0794c4657b97571a81d3b", + "0x992c80192a519038082446b1fb947323005b275e25f2c14c33cc7269e0ec038581cc43705894f94bad62ae33a8b7f965", + "0xa78253e3e3eece124bef84a0a8807ce76573509f6861d0b6f70d0aa35a30a123a9da5e01e84969708c40b0669eb70aa6", + "0x8d5724de45270ca91c94792e8584e676547d7ac1ac816a6bb9982ee854eb5df071d20545cdfd3771cd40f90e5ba04c8e", + "0x825a6f586726c68d45f00ad0f5a4436523317939a47713f78fd4fe81cd74236fdac1b04ecd97c2d0267d6f4981d7beb1" + ], + "g2_monomial": [ + "0x93e02b6052719f607dacd3a088274f65596bd0d09920b61ab5da61bbdc7f5049334cf11213945d57e5ac7d055d042b7e024aa2b2f08f0a91260805272dc51051c6e47ad4fa403b02b4510b647ae3d1770bac0326a805bbefd48056c8c121bdb8", + "0xb5bfd7dd8cdeb128843bc287230af38926187075cbfbefa81009a2ce615ac53d2914e5870cb452d2afaaab24f3499f72185cbfee53492714734429b7b38608e23926c911cceceac9a36851477ba4c60b087041de621000edc98edada20c1def2", + "0xb5337ba0ce5d37224290916e268e2060e5c14f3f9fc9e1ec3af5a958e7a0303122500ce18f1a4640bf66525bd10e763501fe986d86649d8d45143c08c3209db3411802c226e9fe9a55716ac4a0c14f9dcef9e70b2bb309553880dc5025eab3cc", + "0xb3c1dcdc1f62046c786f0b82242ef283e7ed8f5626f72542aa2c7a40f14d9094dd1ebdbd7457ffdcdac45fd7da7e16c51200b06d791e5e43e257e45efdf0bd5b06cd2333beca2a3a84354eb48662d83aef5ecf4e67658c851c10b13d8d87c874", + "0x954d91c7688983382609fca9e211e461f488a5971fd4e40d7e2892037268eacdfd495cfa0a7ed6eb0eb11ac3ae6f651716757e7526abe1e06c64649d80996fd3105c20c4c94bc2b22d97045356fe9d791f21ea6428ac48db6f9e68e30d875280", + "0x88a6b6bb26c51cf9812260795523973bb90ce80f6820b6c9048ab366f0fb96e48437a7f7cb62aedf64b11eb4dfefebb0147608793133d32003cb1f2dc47b13b5ff45f1bb1b2408ea45770a08dbfaec60961acb8119c47b139a13b8641e2c9487", + "0x85cd7be9728bd925d12f47fb04b32d9fad7cab88788b559f053e69ca18e463113ecc8bbb6dbfb024835f901b3a957d3108d6770fb26d4c8be0a9a619f6e3a4bf15cbfd48e61593490885f6cee30e4300c5f9cf5e1c08e60a2d5b023ee94fcad0", + "0x80477dba360f04399821a48ca388c0fa81102dd15687fea792ee8c1114e00d1bc4839ad37ac58900a118d863723acfbe08126ea883be87f50e4eabe3b5e72f5d9e041db8d9b186409fd4df4a7dde38c0e0a3b1ae29b098e5697e7f110b6b27e4", + "0xb7a6aec08715a9f8672a2b8c367e407be37e59514ac19dd4f0942a68007bba3923df22da48702c63c0d6b3efd3c2d04e0fe042d8b5a54d562f9f33afc4865dcbcc16e99029e25925580e87920c399e710d438ac1ce3a6dc9b0d76c064a01f6f7", + "0xac1b001edcea02c8258aeffbf9203114c1c874ad88dae1184fadd7d94cd09053649efd0ca413400e6e9b5fa4eac33261000af88b6bd0d2abf877a4f0355d2fb4d6007adb181695201c5432e50b850b51b3969f893bddf82126c5a71b042b7686", + "0x90043fda4de53fb364fab2c04be5296c215599105ecff0c12e4917c549257125775c29f2507124d15f56e30447f367db0596c33237242c02d83dfd058735f1e3c1ff99069af55773b6d51d32a68bf75763f59ec4ee7267932ae426522b8aaab6", + "0xa8660ce853e9dc08271bf882e29cd53397d63b739584dda5263da4c7cc1878d0cf6f3e403557885f557e184700575fee016ee8542dec22c97befe1d10f414d22e84560741cdb3e74c30dda9b42eeaaf53e27822de2ee06e24e912bf764a9a533", + "0x8fe3921a96d0d065e8aa8fce9aa42c8e1461ca0470688c137be89396dd05103606dab6cdd2a4591efd6addf72026c12e065da7be276dee27a7e30afa2bd81c18f1516e7f068f324d0bad9570b95f6bd02c727cd2343e26db0887c3e4e26dceda", + "0x8ae1ad97dcb9c192c9a3933541b40447d1dc4eebf380151440bbaae1e120cc5cdf1bcea55180b128d8e180e3af623815191d063cc0d7a47d55fb7687b9d87040bf7bc1a7546b07c61db5ccf1841372d7c2fe4a5431ffff829f3c2eb590b0b710", + "0x8c2fa96870a88150f7876c931e2d3cc2adeaaaf5c73ef5fa1cf9dfa0991ae4819f9321af7e916e5057d87338e630a2f21242c29d76963cf26035b548d2a63d8ad7bd6efefa01c1df502cbdfdfe0334fb21ceb9f686887440f713bf17a89b8081", + "0xb9aa98e2f02bb616e22ee5dd74c7d1049321ac9214d093a738159850a1dbcc7138cb8d26ce09d8296368fd5b291d74fa17ac7cc1b80840fdd4ee35e111501e3fa8485b508baecda7c1ab7bd703872b7d64a2a40b3210b6a70e8a6ffe0e5127e3", + "0x9292db67f8771cdc86854a3f614a73805bf3012b48f1541e704ea4015d2b6b9c9aaed36419769c87c49f9e3165f03edb159c23b3a49c4390951f78e1d9b0ad997129b17cdb57ea1a6638794c0cca7d239f229e589c5ae4f9fe6979f7f8cba1d7", + "0x91cd9e86550f230d128664f7312591fee6a84c34f5fc7aed557bcf986a409a6de722c4330453a305f06911d2728626e611acfdf81284f77f60a3a1595053a9479964fd713117e27c0222cc679674b03bc8001501aaf9b506196c56de29429b46", + "0xa9516b73f605cc31b89c68b7675dc451e6364595243d235339437f556cf22d745d4250c1376182273be2d99e02c10eee047410a43eff634d051aeb784e76cb3605d8e079b9eb6ad1957dfdf77e1cd32ce4a573c9dfcc207ca65af6eb187f6c3d", + "0xa9667271f7d191935cc8ad59ef3ec50229945faea85bfdfb0d582090f524436b348aaa0183b16a6231c00332fdac2826125b8c857a2ed9ec66821cfe02b3a2279be2412441bc2e369b255eb98614e4be8490799c4df22f18d47d24ec70bba5f7", + "0xa4371144d2aa44d70d3cb9789096d3aa411149a6f800cb46f506461ee8363c8724667974252f28aea61b6030c05930ac039c1ee64bb4bd56532a685cae182bf2ab935eee34718cffcb46cae214c77aaca11dbb1320faf23c47247db1da04d8dc", + "0x89a7eb441892260b7e81168c386899cd84ffc4a2c5cad2eae0d1ab9e8b5524662e6f660fe3f8bfe4c92f60b060811bc605b14c5631d16709266886d7885a5eb5930097127ec6fb2ebbaf2df65909cf48f253b3d5e22ae48d3e9a2fd2b01f447e", + "0x9648c42ca97665b5eccb49580d8532df05eb5a68db07f391a2340769b55119eaf4c52fe4f650c09250fa78a76c3a1e271799b8333cc2628e3d4b4a6a3e03da1f771ecf6516dd63236574a7864ff07e319a6f11f153406280d63af9e2b5713283", + "0x9663bf6dd446ea7a90658ee458578d4196dc0b175ef7fcfa75f44d41670850774c2e46c5a6be132a2c072a3c0180a24f0305d1acac49d2d79878e5cda80c57feda3d01a6af12e78b5874e2a4b3717f11c97503b41a4474e2e95b179113726199", + "0xb212aeb4814e0915b432711b317923ed2b09e076aaf558c3ae8ef83f9e15a83f9ea3f47805b2750ab9e8106cb4dc6ad003522c84b03dc02829978a097899c773f6fb31f7fe6b8f2d836d96580f216fec20158f1590c3e0d7850622e15194db05", + "0x925f005059bf07e9ceccbe66c711b048e236ade775720d0fe479aebe6e23e8af281225ad18e62458dc1b03b42ad4ca290d4aa176260604a7aad0d9791337006fbdebe23746f8060d42876f45e4c83c3643931392fde1cd13ff8bddf8111ef974", + "0x9553edb22b4330c568e156a59ef03b26f5c326424f830fe3e8c0b602f08c124730ffc40bc745bec1a22417adb22a1a960243a10565c2be3066bfdb841d1cd14c624cd06e0008f4beb83f972ce6182a303bee3fcbcabc6cfe48ec5ae4b7941bfc", + "0x935f5a404f0a78bdcce709899eda0631169b366a669e9b58eacbbd86d7b5016d044b8dfc59ce7ed8de743ae16c2343b50e2f925e88ba6319e33c3fc76b314043abad7813677b4615c8a97eb83cc79de4fedf6ccbcfa4d4cbf759a5a84e4d9742", + "0xa5b014ab936eb4be113204490e8b61cd38d71da0dec7215125bcd131bf3ab22d0a32ce645bca93e7b3637cf0c2db3d6601a0ddd330dc46f9fae82abe864ffc12d656c88eb50c20782e5bb6f75d18760666f43943abb644b881639083e122f557", + "0x935b7298ae52862fa22bf03bfc1795b34c70b181679ae27de08a9f5b4b884f824ef1b276b7600efa0d2f1d79e4a470d51692fd565c5cf8343dd80e5d3336968fc21c09ba9348590f6206d4424eb229e767547daefa98bc3aa9f421158dee3f2a", + "0x9830f92446e708a8f6b091cc3c38b653505414f8b6507504010a96ffda3bcf763d5331eb749301e2a1437f00e2415efb01b799ad4c03f4b02de077569626255ac1165f96ea408915d4cf7955047620da573e5c439671d1fa5c833fb11de7afe6", + "0x840dcc44f673fff3e387af2bb41e89640f2a70bcd2b92544876daa92143f67c7512faf5f90a04b7191de01f3e2b1bde00622a20dc62ca23bbbfaa6ad220613deff43908382642d4d6a86999f662efd64b1df448b68c847cfa87630a3ffd2ec76", + "0x92950c895ed54f7f876b2fda17ecc9c41b7accfbdd42c210cc5b475e0737a7279f558148531b5c916e310604a1de25a80940c94fe5389ae5d6a5e9c371be67bceea1877f5401725a6595bcf77ece60905151b6dfcb68b75ed2e708c73632f4fd", + "0x8010246bf8e94c25fd029b346b5fbadb404ef6f44a58fd9dd75acf62433d8cc6db66974f139a76e0c26dddc1f329a88214dbb63276516cf325c7869e855d07e0852d622c332ac55609ba1ec9258c45746a2aeb1af0800141ee011da80af175d4", + "0xb0f1bad257ebd187bdc3f37b23f33c6a5d6a8e1f2de586080d6ada19087b0e2bf23b79c1b6da1ee82271323f5bdf3e1b018586b54a5b92ab6a1a16bb3315190a3584a05e6c37d5ca1e05d702b9869e27f513472bcdd00f4d0502a107773097da", + "0x9636d24f1ede773ce919f309448dd7ce023f424afd6b4b69cb98c2a988d849a283646dc3e469879daa1b1edae91ae41f009887518e7eb5578f88469321117303cd3ac2d7aee4d9cb5f82ab9ae3458e796dfe7c24284b05815acfcaa270ff22e2", + "0xb373feb5d7012fd60578d7d00834c5c81df2a23d42794fed91aa9535a4771fde0341c4da882261785e0caca40bf83405143085e7f17e55b64f6c5c809680c20b050409bf3702c574769127c854d27388b144b05624a0e24a1cbcc4d08467005b", + "0xb15680648949ce69f82526e9b67d9b55ce5c537dc6ab7f3089091a9a19a6b90df7656794f6edc87fb387d21573ffc847062623685931c2790a508cbc8c6b231dd2c34f4d37d4706237b1407673605a604bcf6a50cc0b1a2db20485e22b02c17e", + "0x8817e46672d40c8f748081567b038a3165f87994788ec77ee8daea8587f5540df3422f9e120e94339be67f186f50952504cb44f61e30a5241f1827e501b2de53c4c64473bcc79ab887dd277f282fbfe47997a930dd140ac08b03efac88d81075", + "0xa6e4ef6c1d1098f95aae119905f87eb49b909d17f9c41bcfe51127aa25fee20782ea884a7fdf7d5e9c245b5a5b32230b07e0dbf7c6743bf52ee20e2acc0b269422bd6cf3c07115df4aa85b11b2c16630a07c974492d9cdd0ec325a3fabd95044", + "0x8634aa7c3d00e7f17150009698ce440d8e1b0f13042b624a722ace68ead870c3d2212fbee549a2c190e384d7d6ac37ce14ab962c299ea1218ef1b1489c98906c91323b94c587f1d205a6edd5e9d05b42d591c26494a6f6a029a2aadb5f8b6f67", + "0x821a58092900bdb73decf48e13e7a5012a3f88b06288a97b855ef51306406e7d867d613d9ec738ebacfa6db344b677d21509d93f3b55c2ebf3a2f2a6356f875150554c6fff52e62e3e46f7859be971bf7dd9d5b3e1d799749c8a97c2e04325df", + "0x8dba356577a3a388f782e90edb1a7f3619759f4de314ad5d95c7cc6e197211446819c4955f99c5fc67f79450d2934e3c09adefc91b724887e005c5190362245eec48ce117d0a94d6fa6db12eda4ba8dde608fbbd0051f54dcf3bb057adfb2493", + "0xa32a690dc95c23ed9fb46443d9b7d4c2e27053a7fcc216d2b0020a8cf279729c46114d2cda5772fd60a97016a07d6c5a0a7eb085a18307d34194596f5b541cdf01b2ceb31d62d6b55515acfd2b9eec92b27d082fbc4dc59fc63b551eccdb8468", + "0xa040f7f4be67eaf0a1d658a3175d65df21a7dbde99bfa893469b9b43b9d150fc2e333148b1cb88cfd0447d88fa1a501d126987e9fdccb2852ecf1ba907c2ca3d6f97b055e354a9789854a64ecc8c2e928382cf09dda9abde42bbdf92280cdd96", + "0x864baff97fa60164f91f334e0c9be00a152a416556b462f96d7c43b59fe1ebaff42f0471d0bf264976f8aa6431176eb905bd875024cf4f76c13a70bede51dc3e47e10b9d5652d30d2663b3af3f08d5d11b9709a0321aba371d2ef13174dcfcaf", + "0x95a46f32c994133ecc22db49bad2c36a281d6b574c83cfee6680b8c8100466ca034b815cfaedfbf54f4e75188e661df901abd089524e1e0eb0bf48d48caa9dd97482d2e8c1253e7e8ac250a32fd066d5b5cb08a8641bdd64ecfa48289dca83a3", + "0xa2cce2be4d12144138cb91066e0cd0542c80b478bf467867ebef9ddaf3bd64e918294043500bf5a9f45ee089a8d6ace917108d9ce9e4f41e7e860cbce19ac52e791db3b6dde1c4b0367377b581f999f340e1d6814d724edc94cb07f9c4730774", + "0xb145f203eee1ac0a1a1731113ffa7a8b0b694ef2312dabc4d431660f5e0645ef5838e3e624cfe1228cfa248d48b5760501f93e6ab13d3159fc241427116c4b90359599a4cb0a86d0bb9190aa7fabff482c812db966fd2ce0a1b48cb8ac8b3bca", + "0xadabe5d215c608696e03861cbd5f7401869c756b3a5aadc55f41745ad9478145d44393fec8bb6dfc4ad9236dc62b9ada0f7ca57fe2bae1b71565dbf9536d33a68b8e2090b233422313cc96afc7f1f7e0907dc7787806671541d6de8ce47c4cd0", + "0xae7845fa6b06db53201c1080e01e629781817f421f28956589c6df3091ec33754f8a4bd4647a6bb1c141ac22731e3c1014865d13f3ed538dcb0f7b7576435133d9d03be655f8fbb4c9f7d83e06d1210aedd45128c2b0c9bab45a9ddde1c862a5", + "0x9159eaa826a24adfa7adf6e8d2832120ebb6eccbeb3d0459ffdc338548813a2d239d22b26451fda98cc0c204d8e1ac69150b5498e0be3045300e789bcb4e210d5cd431da4bdd915a21f407ea296c20c96608ded0b70d07188e96e6c1a7b9b86b", + "0xa9fc6281e2d54b46458ef564ffaed6944bff71e389d0acc11fa35d3fcd8e10c1066e0dde5b9b6516f691bb478e81c6b20865281104dcb640e29dc116daae2e884f1fe6730d639dbe0e19a532be4fb337bf52ae8408446deb393d224eee7cfa50", + "0x84291a42f991bfb36358eedead3699d9176a38f6f63757742fdbb7f631f2c70178b1aedef4912fed7b6cf27e88ddc7eb0e2a6aa4b999f3eb4b662b93f386c8d78e9ac9929e21f4c5e63b12991fcde93aa64a735b75b535e730ff8dd2abb16e04", + "0xa1b7fcacae181495d91765dfddf26581e8e39421579c9cbd0dd27a40ea4c54af3444a36bf85a11dda2114246eaddbdd619397424bb1eb41b5a15004b902a590ede5742cd850cf312555be24d2df8becf48f5afba5a8cd087cb7be0a521728386", + "0x92feaaf540dbd84719a4889a87cdd125b7e995a6782911931fef26da9afcfbe6f86aaf5328fe1f77631491ce6239c5470f44c7791506c6ef1626803a5794e76d2be0af92f7052c29ac6264b7b9b51f267ad820afc6f881460521428496c6a5f1", + "0xa525c925bfae1b89320a5054acc1fa11820f73d0cf28d273092b305467b2831fab53b6daf75fb926f332782d50e2522a19edcd85be5eb72f1497193c952d8cd0bcc5d43b39363b206eae4cb1e61668bde28a3fb2fc1e0d3d113f6dfadb799717", + "0x98752bb6f5a44213f40eda6aa4ff124057c1b13b6529ab42fe575b9afa66e59b9c0ed563fb20dff62130c436c3e905ee17dd8433ba02c445b1d67182ab6504a90bbe12c26a754bbf734665c622f76c62fe2e11dd43ce04fd2b91a8463679058b", + "0xa9aa9a84729f7c44219ff9e00e651e50ddea3735ef2a73fdf8ed8cd271961d8ed7af5cd724b713a89a097a3fe65a3c0202f69458a8b4c157c62a85668b12fc0d3957774bc9b35f86c184dd03bfefd5c325da717d74192cc9751c2073fe9d170e", + "0xb221c1fd335a4362eff504cd95145f122bf93ea02ae162a3fb39c75583fc13a932d26050e164da97cff3e91f9a7f6ff80302c19dd1916f24acf6b93b62f36e9665a8785413b0c7d930c7f1668549910f849bca319b00e59dd01e5dec8d2edacc", + "0xa71e2b1e0b16d754b848f05eda90f67bedab37709550171551050c94efba0bfc282f72aeaaa1f0330041461f5e6aa4d11537237e955e1609a469d38ed17f5c2a35a1752f546db89bfeff9eab78ec944266f1cb94c1db3334ab48df716ce408ef", + "0xb990ae72768779ba0b2e66df4dd29b3dbd00f901c23b2b4a53419226ef9232acedeb498b0d0687c463e3f1eead58b20b09efcefa566fbfdfe1c6e48d32367936142d0a734143e5e63cdf86be7457723535b787a9cfcfa32fe1d61ad5a2617220", + "0x8d27e7fbff77d5b9b9bbc864d5231fecf817238a6433db668d5a62a2c1ee1e5694fdd90c3293c06cc0cb15f7cbeab44d0d42be632cb9ff41fc3f6628b4b62897797d7b56126d65b694dcf3e298e3561ac8813fbd7296593ced33850426df42db", + "0xa92039a08b5502d5b211a7744099c9f93fa8c90cedcb1d05e92f01886219dd464eb5fb0337496ad96ed09c987da4e5f019035c5b01cc09b2a18b8a8dd419bc5895388a07e26958f6bd26751929c25f89b8eb4a299d822e2d26fec9ef350e0d3c", + "0x92dcc5a1c8c3e1b28b1524e3dd6dbecd63017c9201da9dbe077f1b82adc08c50169f56fc7b5a3b28ec6b89254de3e2fd12838a761053437883c3e01ba616670cea843754548ef84bcc397de2369adcca2ab54cd73c55dc68d87aec3fc2fe4f10" + ] + } \ No newline at end of file diff --git a/simulators/ethereum/engine/helper/tx.go b/simulators/ethereum/engine/helper/tx.go index 0ec633bf16..d2c1602662 100644 --- a/simulators/ethereum/engine/helper/tx.go +++ b/simulators/ethereum/engine/helper/tx.go @@ -258,6 +258,8 @@ type TransactionCreator interface { MakeTransaction(sender SenderAccount, nonce uint64, blockTimestamp uint64) (typ.Transaction, error) } +const BLOBS_PER_SENDER_ACCOUNT = 10000 + type BaseTransactionCreator struct { Recipient *common.Address GasFee *big.Int @@ -371,7 +373,8 @@ func (tc *BaseTransactionCreator) MakeTransaction(sender SenderAccount, nonce ui } // Need tx wrap data that will pass blob verification - hashes, blobData, err := BlobDataGenerator(BlobID(nonce), blobCount) + blobID := BlobID((nonce * cancun.MAX_BLOBS_PER_BLOCK) + (sender.GetIndex() * BLOBS_PER_SENDER_ACCOUNT)) + hashes, blobData, err := BlobDataGenerator(blobID, blobCount) if err != nil { return nil, err } diff --git a/simulators/ethereum/engine/suites/cancun/steps.go b/simulators/ethereum/engine/suites/cancun/steps.go index a29cba3b54..6c3ab0f67f 100644 --- a/simulators/ethereum/engine/suites/cancun/steps.go +++ b/simulators/ethereum/engine/suites/cancun/steps.go @@ -890,8 +890,8 @@ func (step DevP2PRequestPooledTransactionHash) Execute(t *CancunTestContext) err // Send the request for the pooled transactions getTxReq := &devp2p.GetPooledTransactions{ - RequestId: 1234, - GetPooledTransactionsPacket: txHashes, + RequestId: 1234, + GetPooledTransactionsRequest: txHashes, } if size, err := conn.Write(getTxReq); err != nil { return errors.Wrap(err, "could not write to conn") diff --git a/simulators/ethereum/go.work.sum b/simulators/ethereum/go.work.sum index cf8b303272..43e6afdd62 100644 --- a/simulators/ethereum/go.work.sum +++ b/simulators/ethereum/go.work.sum @@ -56,10 +56,13 @@ github.com/Azure/azure-sdk-for-go v16.2.1+incompatible h1:KnPIugL51v3N3WwvaSmZbx github.com/Azure/azure-sdk-for-go v16.2.1+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= github.com/Azure/azure-sdk-for-go/sdk/azcore v0.21.1 h1:qoVeMsc9/fh/yhxVaA0obYjVH/oI/ihrOoMwsLS9KSA= github.com/Azure/azure-sdk-for-go/sdk/azcore v0.21.1/go.mod h1:fBF9PQNqB8scdgpZ3ufzaLntG0AG7C1WjPMsiFOmfHM= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.0/go.mod h1:bjGvMhVMb+EEm3VRNQawDMUyMMjo+S5ewNjflkep/0Q= github.com/Azure/azure-sdk-for-go/sdk/internal v0.8.3 h1:E+m3SkZCN0Bf5q7YdTs5lSm2CYY3CK4spn5OmUIiQtk= github.com/Azure/azure-sdk-for-go/sdk/internal v0.8.3/go.mod h1:KLF4gFr6DcKFZwSuH8w8yEK6DpFl3LP5rhdvAb7Yz5I= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0/go.mod h1:okt5dMMTOFjX/aovMlrjvvXoPMBVSPzk9185BT0+eZM= github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v0.3.0 h1:Px2UA+2RvSSvv+RvJNuUB6n7rs5Wsel4dXLe90Um2n4= github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v0.3.0/go.mod h1:tPaiy8S5bQ+S5sOiDlINkp7+Ef339+Nz5L5XO+cnOHo= +github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.2.0/go.mod h1:+6KLcKIVgxoBDMqMO/Nvy7bZ9a0nbU3I1DtFQK3YvB4= github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8= github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= @@ -82,6 +85,7 @@ github.com/Azure/go-autorest/tracing v0.6.0 h1:TYi4+3m5t6K48TGI9AUdb+IzbnSxvnvUM github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= github.com/BurntSushi/toml v1.2.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= github.com/BurntSushi/toml v1.2.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= +github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802 h1:1BDTz0u9nC3//pOCMdNH+CiXJVYJh5UQNCOBG7jbELc= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/CloudyKit/fastprinter v0.0.0-20170127035650-74b38d55f37a/go.mod h1:EFZQ978U7x8IRnstaskI3IysnWY5Ao3QgZUKOXlsAdw= @@ -139,6 +143,7 @@ github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d/go.mod h1:H github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6 h1:fLjPD/aNc3UIOA6tDi6QXUemppXK3P9BI7mr2hd6gx8= github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= github.com/StackExchange/wmi v0.0.0-20210224194228-fe8f1750fd46/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= +github.com/StackExchange/wmi v1.2.1/go.mod h1:rcmrprowKIVzvc+NUiLncP2uuArMWLCbu9SBzvHz7e8= github.com/VictoriaMetrics/fastcache v1.6.0/go.mod h1:0qHz5QP0GMX4pfmMA/zt5RgfNuXJrTP0zS7DqpHGGTw= github.com/aclements/go-gg v0.0.0-20170118225347-6dbb4e4fefb0/go.mod h1:55qNq4vcpkIuHowELi5C8e+1yUHtoLoOUR9QU5j7Tes= github.com/aclements/go-moremath v0.0.0-20210112150236-f10218a38794/go.mod h1:7e+I0LQFUI9AXWxOfsQROs9xPhoJtbsyWcjJqDd4KPY= @@ -156,14 +161,27 @@ github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kd github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= github.com/aws/aws-sdk-go v1.15.11/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= github.com/aws/aws-sdk-go-v2 v1.2.0/go.mod h1:zEQs02YRBw1DjK0PoJv3ygDYOFTre1ejlJWl8FwAuQo= +github.com/aws/aws-sdk-go-v2 v1.21.2/go.mod h1:ErQhvNuEMhJjweavOYhxVkn2RUx7kQXVATHrjKtxIpM= github.com/aws/aws-sdk-go-v2/config v1.1.1/go.mod h1:0XsVy9lBI/BCXm+2Tuvt39YmdHwS5unDQmxZOYe8F5Y= +github.com/aws/aws-sdk-go-v2/config v1.18.45/go.mod h1:ZwDUgFnQgsazQTnWfeLWk5GjeqTQTL8lMkoE1UXzxdE= github.com/aws/aws-sdk-go-v2/credentials v1.1.1/go.mod h1:mM2iIjwl7LULWtS6JCACyInboHirisUUdkBPoTHMOUo= +github.com/aws/aws-sdk-go-v2/credentials v1.13.43/go.mod h1:zWJBz1Yf1ZtX5NGax9ZdNjhhI4rgjfgsyk6vTY1yfVg= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.0.2/go.mod h1:3hGg3PpiEjHnrkrlasTfxFqUsZ2GCk/fMUn4CbKgSkM= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.13/go.mod h1:f/Ib/qYjhV2/qdsf79H3QP/eRE4AkVyEf6sk7XfZ1tg= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.43/go.mod h1:auo+PiyLl0n1l8A0e8RIeR8tOzYPfZZH/JNlrJ8igTQ= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.37/go.mod h1:Qe+2KtKml+FEsQF/DHmDV+xjtche/hwoF75EG4UlHW8= +github.com/aws/aws-sdk-go-v2/internal/ini v1.3.45/go.mod h1:lD5M20o09/LCuQ2mE62Mb/iSdSlCNuj6H5ci7tW7OsE= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.0.2/go.mod h1:45MfaXZ0cNbeuT0KQ1XJylq8A6+OpVV2E5kvY/Kq+u8= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.37/go.mod h1:vBmDnwWXWxNPFRMmG2m/3MKOe+xEcMDo1tanpaWCcck= github.com/aws/aws-sdk-go-v2/service/route53 v1.1.1/go.mod h1:rLiOUrPLW/Er5kRcQ7NkwbjlijluLsrIbu/iyl35RO4= +github.com/aws/aws-sdk-go-v2/service/route53 v1.30.2/go.mod h1:TQZBt/WaQy+zTHoW++rnl8JBrmZ0VO6EUbVua1+foCA= github.com/aws/aws-sdk-go-v2/service/sso v1.1.1/go.mod h1:SuZJxklHxLAXgLTc1iFXbEWkXs7QRTQpCLGaKIprQW0= +github.com/aws/aws-sdk-go-v2/service/sso v1.15.2/go.mod h1:gsL4keucRCgW+xA85ALBpRFfdSLH4kHOVSnLMSuBECo= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.17.3/go.mod h1:a7bHA82fyUXOm+ZSWKU6PIoBxrjSprdLoM8xPYvzYVg= github.com/aws/aws-sdk-go-v2/service/sts v1.1.1/go.mod h1:Wi0EBZwiz/K44YliU0EKxqTCJGUfYTWXrrBwkq736bM= +github.com/aws/aws-sdk-go-v2/service/sts v1.23.2/go.mod h1:Eows6e1uQEsc4ZaHANmsPRzAKcVDrcmjjWiih2+HUUQ= github.com/aws/smithy-go v1.1.0/go.mod h1:EzMw8dbp/YJL4A5/sbhGddag+NPT7q084agLbB9LgIw= +github.com/aws/smithy-go v1.15.0/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4= github.com/beorn7/perks v0.0.0-20160804104726-4c0e84591b9a/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= @@ -204,6 +222,7 @@ github.com/cilium/ebpf v0.4.0/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJ github.com/cilium/ebpf v0.6.2/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs= github.com/cilium/ebpf v0.7.0/go.mod h1:/oI2+1shJiTGAMgl6/RgJr36Eo1jzrRcAWbcXO2usCA= github.com/cloudflare/cloudflare-go v0.14.0/go.mod h1:EnwdgGMaFOruiPZRFSgn+TsQ3hQ7C/YWzIGLeu5c304= +github.com/cloudflare/cloudflare-go v0.79.0/go.mod h1:gkHQf9xEubaQPEuerBuoinR9P8bf8a05Lq0X6WKy1Oc= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= @@ -212,6 +231,7 @@ github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWH github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= github.com/cockroachdb/datadriven v1.0.0/go.mod h1:5Ib8Meh+jk1RlHIXej6Pzevx/NLlNvQB9pmSBZErGA4= +github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= github.com/cockroachdb/datadriven v1.0.3-0.20230801171734-e384cf455877/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= github.com/cockroachdb/errors v1.6.1/go.mod h1:tm6FTP5G81vwJ5lC0SizQo374JNCOPrHyXGitRJoDqM= github.com/cockroachdb/errors v1.8.1/go.mod h1:qGwQn6JmZ+oMjuLwjWzUNqblqk0xl4CVV3SQbGwK7Ac= @@ -370,6 +390,7 @@ github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c/go.mod h1:Uw6Uezg github.com/docker/go-metrics v0.0.0-20180209012529-399ea8c73916/go.mod h1:/u0gXw0Gay3ceNrsHubL3BtdOL2fHf93USgMTe0W5dI= github.com/docker/go-metrics v0.0.1/go.mod h1:cG1hvH2utMXtqgqqYE9plW6lDxS3/5ayHzueweSI3Vw= github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/docker/libtrust v0.0.0-20150114040149-fa567046d9b1/go.mod h1:cyGadeNEkKy96OOhEzfZl+yxihPEzKnqJwvfuSUqbZE= github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= @@ -395,7 +416,9 @@ github.com/ethereum/go-ethereum v1.12.1-0.20230724161334-2274a03e339f/go.mod h1: github.com/ethereum/hive/hiveproxy v0.0.0-20230313101845-c7dfe88c8138/go.mod h1:1LWNU6/EYsIOXZGa2KdklD1ET77gLTeEyhq+WTZ+37o= github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanw/esbuild v0.17.6/go.mod h1:iINY06rn799hi48UqEnaQvVfZWe6W9bET78LbvN8VWk= +github.com/evanw/esbuild v0.18.11/go.mod h1:iINY06rn799hi48UqEnaQvVfZWe6W9bET78LbvN8VWk= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= github.com/fjl/gencodec v0.0.0-20230517082657-f9840df7b83e h1:bBLctRc7kr01YGvaDfgLbTwjFNW5jdp5y5rj8XXBHfY= github.com/fjl/gencodec v0.0.0-20230517082657-f9840df7b83e/go.mod h1:AzA8Lj6YtixmJWL+wkKoBGsLWy9gFrAzi4g+5bCKwpY= github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= @@ -406,6 +429,7 @@ github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzP github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= github.com/fsouza/go-dockerclient v1.8.1/go.mod h1:zmA2ogSxRnXmbZcy0Aq7yhRoCdP/bDns/qghCK9SWtM= +github.com/fsouza/go-dockerclient v1.9.8/go.mod h1:74lNReDQxrOaogajs51IvZgkDME4qe9yPJAUEUTJtHw= github.com/fullsailor/pkcs7 v0.0.0-20190404230743-d7302db945fa/go.mod h1:KnogPXtdwXqoenmZCw6S+25EAm2MkxbG0deNDu4cbSA= github.com/garslo/gogen v0.0.0-20170306192744-1d203ffc1f61 h1:IZqZOB2fydHte3kUgxrzK5E1fW7RQGeDwE8F/ZZnUYc= github.com/garslo/gogen v0.0.0-20170306192744-1d203ffc1f61/go.mod h1:Q0X6pkwTILDlzrGEckF6HKjXe48EgsY/l7K7vhY4MW8= @@ -474,6 +498,7 @@ github.com/gobwas/pool v0.2.1/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6Wezm github.com/gobwas/ws v1.1.0/go.mod h1:nzvNcVha5eUziGrbxFCo6qFIojQHjJV5cLYIbezhfL0= github.com/goccy/go-json v0.9.7/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= github.com/goccy/go-json v0.9.11/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= github.com/godbus/dbus v0.0.0-20151105175453-c7fdd8b5cd55/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= github.com/godbus/dbus v0.0.0-20180201030542-885f9cc04c9c/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= @@ -571,9 +596,11 @@ github.com/hashicorp/errwrap v0.0.0-20141028054710-7554cd9344ce/go.mod h1:YH+1FK github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/go-bexpr v0.1.10/go.mod h1:oxlubA2vC/gFVfX1A6JGp7ls7uCDlfJn732ehYYg+g0= +github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= github.com/hashicorp/go-multierror v0.0.0-20161216184304-ed905158d874/go.mod h1:JMRHfdO9jKNzS/+BTlxCjKNQHg/jZAft8U7LloJvN7I= github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= +github.com/hashicorp/go-retryablehttp v0.7.4/go.mod h1:Jy/gPYAdjqffZ/yFGCFV2doI5wjtH1ewM9u8iYVjtX8= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/yamux v0.1.1/go.mod h1:CtWFDAQgb7dxtzFs4tWbplKIe2jSi3+5vKbgIO0SLnQ= @@ -603,6 +630,7 @@ github.com/iris-contrib/jade v1.1.4/go.mod h1:EDqR+ur9piDl6DUgs6qRrlfzmlx/D5Uybo github.com/iris-contrib/schema v0.0.6/go.mod h1:iYszG0IOsuIsfzjymw1kMzTL8YQcCWlm65f3wX8J5iA= github.com/j-keck/arping v0.0.0-20160618110441-2cf9dc699c56/go.mod h1:ymszkNOg6tORTn+6F6j+Jc8TOr5osrynvN6ivFWZ2GA= github.com/jedisct1/go-minisign v0.0.0-20190909160543-45766022959e/go.mod h1:G1CVv03EnqU1wYL2dFwXxW2An0az9JTl/ZsqXQeBlkU= +github.com/jedisct1/go-minisign v0.0.0-20230811132847-661be99b8267/go.mod h1:h1nSAbGFqGVzn6Jyl1R/iCcBUHN4g+gW1u9CoBTrb9E= github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmespath/go-jmespath v0.0.0-20160803190731-bd40a432e4c7/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= @@ -705,12 +733,14 @@ github.com/mistifyio/go-zfs v2.1.2-0.20190413222219-f784269be439+incompatible/go github.com/mitchellh/osext v0.0.0-20151018003038-5e2d6d41470f/go.mod h1:OkQIRizQZAeMln+1tSwduZz7+Af5oFlKirV/MSYes2A= github.com/mitchellh/pointerstructure v1.2.0/go.mod h1:BRAsLI5zgXmw97Lf6s25bs8ohIXc3tViBH44KcwB2g4= github.com/moby/locker v1.0.1/go.mod h1:S7SDdo5zpBK84bzzVlKr2V0hz+7x9hWbYC/kq7oQppc= +github.com/moby/patternmatcher v0.6.0/go.mod h1:hDPoyOpDY7OrrMDLaYoY3hf52gNCR/YOUYxkhApJIxc= github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= github.com/moby/sys/mount v0.3.3/go.mod h1:PBaEorSNTLG5t/+4EgukEQVlAvVEc6ZjTySwKdqp5K0= github.com/moby/sys/mountinfo v0.4.0/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2JI+6q0qou+A= github.com/moby/sys/mountinfo v0.4.1/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2JI+6q0qou+A= github.com/moby/sys/mountinfo v0.5.0/go.mod h1:3bMD3Rg+zkqx8MRYPi7Pyb0Ie97QEBmdxbhnCLlSvSU= github.com/moby/sys/mountinfo v0.6.2/go.mod h1:IJb6JQeOklcdMU9F5xQ8ZALD+CUr5VlGpwtX+VE0rpI= +github.com/moby/sys/sequential v0.5.0/go.mod h1:tH2cOOs5V9MlPiXcQzRC+eEyab644PWKGRYaaV5ZZlo= github.com/moby/sys/signal v0.6.0/go.mod h1:GQ6ObYZfqacOwTtlXvcmh9A26dVRul/hbOZn88Kg8Tg= github.com/moby/sys/symlink v0.1.0/go.mod h1:GGDODQmbFOjFsXvfLVn3+ZRxkch54RkSiGqsZeMYowQ= github.com/moby/sys/symlink v0.2.0/go.mod h1:7uZVF2dqJjG/NsClqul95CqKOBRQyYSNnJ6BMgR/gFs= @@ -880,6 +910,8 @@ github.com/stretchr/testify v0.0.0-20180303142811-b89eecf5ca5d/go.mod h1:a8OnRci github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/syndtr/gocapability v0.0.0-20170704070218-db04d3cc01c8/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= github.com/syndtr/gocapability v0.0.0-20180916011248-d98352740cb2/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= @@ -969,6 +1001,7 @@ golang.org/x/crypto v0.0.0-20220427172511-eb4f295cb31f/go.mod h1:IxCIyHEi3zRg3s0 golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220926161630-eccd6366d1be/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= +golang.org/x/crypto v0.10.0/go.mod h1:o4eNf7Ede1fv+hwOwZsTHl9EsPFO6q6ZvYR8vYfY45I= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -984,6 +1017,7 @@ golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EH golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= golang.org/x/exp v0.0.0-20200513190911-00229845015e/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw= golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1/go.mod h1:V1LtkGg67GoY2N1AnLN78QLrzxkLyJw7RJb1gzOOz9w= +golang.org/x/exp v0.0.0-20230626212559-97b1e661b5df/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc= golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= @@ -1058,6 +1092,8 @@ golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= golang.org/x/net v0.3.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= golang.org/x/net v0.4.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= golang.org/x/oauth2 v0.0.0-20170207211851-4464e7848382/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -1153,9 +1189,13 @@ golang.org/x/sys v0.0.0-20220928140112-f11e5e49a4ec/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= +golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= diff --git a/simulators/ethereum/pyspec/go.mod b/simulators/ethereum/pyspec/go.mod index 9356100d54..e19db81628 100644 --- a/simulators/ethereum/pyspec/go.mod +++ b/simulators/ethereum/pyspec/go.mod @@ -11,28 +11,29 @@ require ( require ( github.com/DataDog/zstd v1.5.2 // indirect github.com/Microsoft/go-winio v0.6.1 // indirect - github.com/VictoriaMetrics/fastcache v1.12.0 // indirect + github.com/VictoriaMetrics/fastcache v1.12.1 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/bits-and-blooms/bitset v1.7.0 // indirect github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/cockroachdb/errors v1.9.1 // indirect github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect - github.com/cockroachdb/pebble v0.0.0-20230906160148-46873a6a7a06 // indirect + github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593 // indirect github.com/cockroachdb/redact v1.1.3 // indirect + github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect github.com/consensys/bavard v0.1.13 // indirect - github.com/consensys/gnark-crypto v0.11.0 // indirect - github.com/crate-crypto/go-kzg-4844 v0.3.0 // indirect + github.com/consensys/gnark-crypto v0.12.1 // indirect + github.com/crate-crypto/go-kzg-4844 v0.6.1-0.20231019121413-3621cc59f0c7 // indirect github.com/deckarep/golang-set/v2 v2.1.0 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 // indirect - github.com/ethereum/c-kzg-4844 v0.3.1 // indirect + github.com/ethereum/c-kzg-4844 v0.3.2-0.20231019020040-748283cced54 // indirect github.com/getsentry/sentry-go v0.18.0 // indirect github.com/go-ole/go-ole v1.2.6 // indirect github.com/go-stack/stack v1.8.1 // indirect github.com/gofrs/flock v0.8.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang-jwt/jwt/v4 v4.5.0 // indirect - github.com/golang/protobuf v1.5.2 // indirect + github.com/golang/protobuf v1.5.3 // indirect github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect github.com/gorilla/websocket v1.5.0 // indirect github.com/holiman/bloomfilter/v2 v2.0.3 // indirect @@ -57,15 +58,15 @@ require ( github.com/tklauser/go-sysconf v0.3.12 // indirect github.com/tklauser/numcpus v0.6.1 // indirect github.com/yusufpapurcu/wmi v1.2.2 // indirect - golang.org/x/crypto v0.12.0 // indirect - golang.org/x/exp v0.0.0-20230810033253-352e893a4cad // indirect - golang.org/x/mod v0.11.0 // indirect + golang.org/x/crypto v0.14.0 // indirect + golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect + golang.org/x/mod v0.12.0 // indirect golang.org/x/sync v0.3.0 // indirect - golang.org/x/sys v0.11.0 // indirect - golang.org/x/text v0.12.0 // indirect - golang.org/x/tools v0.9.1 // indirect + golang.org/x/sys v0.13.0 // indirect + golang.org/x/text v0.13.0 // indirect + golang.org/x/tools v0.13.0 // indirect google.golang.org/protobuf v1.28.1 // indirect rsc.io/tmplfunc v0.0.3 // indirect ) -replace github.com/ethereum/go-ethereum => github.com/lightclient/go-ethereum v1.10.10-0.20230926150549-ae44519d720c +replace github.com/ethereum/go-ethereum => github.com/lightclient/go-ethereum v1.10.10-0.20231019143932-4d161dee0c4c diff --git a/simulators/ethereum/pyspec/go.sum b/simulators/ethereum/pyspec/go.sum index a108aaab3d..3e45062083 100644 --- a/simulators/ethereum/pyspec/go.sum +++ b/simulators/ethereum/pyspec/go.sum @@ -9,8 +9,8 @@ github.com/Joker/hpp v1.0.0/go.mod h1:8x5n+M1Hp5hC0g8okX3sR3vFQwynaX/UgSOM9MeBKz github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= github.com/Shopify/goreferrer v0.0.0-20181106222321-ec9c9a553398/go.mod h1:a1uqRtAwp2Xwc6WNPJEufxJ7fx3npB4UV/JOLmbu5I0= -github.com/VictoriaMetrics/fastcache v1.12.0 h1:vnVi/y9yKDcD9akmc4NqAoqgQhJrOwUF+j9LTgn4QDE= -github.com/VictoriaMetrics/fastcache v1.12.0/go.mod h1:tjiYeEfYXCqacuvYw/7UoDIeJaNxq6132xHICNP77w8= +github.com/VictoriaMetrics/fastcache v1.12.1 h1:i0mICQuojGDL3KblA7wUNlY5lOK6a4bwt3uRKnkZU40= +github.com/VictoriaMetrics/fastcache v1.12.1/go.mod h1:tX04vaqcNoQeGLD+ra5pU5sWkuxnzWhEzLwhP9w653o= github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY= github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= github.com/allegro/bigcache v1.2.1 h1:hg1sY1raCwic3Vnsvje6TT7/pnZba83LeFck5NrFKSc= @@ -24,7 +24,6 @@ github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= @@ -33,29 +32,31 @@ github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMn github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cockroachdb/datadriven v1.0.2/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= -github.com/cockroachdb/datadriven v1.0.3-0.20230801171734-e384cf455877 h1:1MLK4YpFtIEo3ZtMA5C795Wtv5VuUnrXX7mQG+aHg6o= +github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f h1:otljaYPt5hWxV3MUfO5dFPFiOXg9CyG5/kCfayTqsJ4= github.com/cockroachdb/errors v1.9.1 h1:yFVvsI0VxmRShfawbt/laCIDy/mtTqqnvoNgiy5bEV8= github.com/cockroachdb/errors v1.9.1/go.mod h1:2sxOtL2WIc096WSZqZ5h8fa17rdDq9HZOZLBCor4mBk= github.com/cockroachdb/logtags v0.0.0-20211118104740-dabe8e521a4f/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= -github.com/cockroachdb/pebble v0.0.0-20230906160148-46873a6a7a06 h1:T+Np/xtzIjYM/P5NAw0e2Rf1FGvzDau1h54MKvx8G7w= -github.com/cockroachdb/pebble v0.0.0-20230906160148-46873a6a7a06/go.mod h1:bynZ3gvVyhlvjLI7PT6dmZ7g76xzJ7HpxfjgkzCGz6s= +github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593 h1:aPEJyR4rPBvDmeyi+l/FS/VtA00IWvjeFvjen1m1l1A= +github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593/go.mod h1:6hk1eMY/u5t+Cf18q5lFMUA1Rc+Sm5I6Ra1QuPyxXCo= github.com/cockroachdb/redact v1.1.3 h1:AKZds10rFSIj7qADf0g46UixK8NNLwWTNdCIGS5wfSQ= github.com/cockroachdb/redact v1.1.3/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= +github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo= +github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ= github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0/go.mod h1:4Zcjuz89kmFXt9morQgcfYZAYZ5n8WHjt81YYWIwtTM= github.com/consensys/bavard v0.1.13 h1:oLhMLOFGTLdlda/kma4VOJazblc7IM5y5QPd2A/YjhQ= github.com/consensys/bavard v0.1.13/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI= -github.com/consensys/gnark-crypto v0.11.0 h1:QqzHQlwEqlQr5jfWblGDkwlKHpT+4QodYqqExkAtyks= -github.com/consensys/gnark-crypto v0.11.0/go.mod h1:Iq/P3HHl0ElSjsg2E1gsMwhAyxnxoKK5nVyZKd+/KhU= +github.com/consensys/gnark-crypto v0.12.1 h1:lHH39WuuFgVHONRl3J0LRBtuYdQTumFSDtJF7HpyG8M= +github.com/consensys/gnark-crypto v0.12.1/go.mod h1:v2Gy7L/4ZRosZ7Ivs+9SfUDr0f5UlG+EM5t7MPHiLuY= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/cpuguy83/go-md2man v1.0.10 h1:BSKMNlYxDvnunlTymqtgONjNnaRV1sTpcovwwjF22jk= github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= -github.com/crate-crypto/go-kzg-4844 v0.3.0 h1:UBlWE0CgyFqqzTI+IFyCzA7A3Zw4iip6uzRv5NIXG0A= -github.com/crate-crypto/go-kzg-4844 v0.3.0/go.mod h1:SBP7ikXEgDnUPONgm33HtuDZEDtWa3L4QtN1ocJSEQ4= +github.com/crate-crypto/go-kzg-4844 v0.6.1-0.20231019121413-3621cc59f0c7 h1:VpZxBC99nEW8Rkz1EBBf7JmaM20H+ZkSmqdxpYEoXuo= +github.com/crate-crypto/go-kzg-4844 v0.6.1-0.20231019121413-3621cc59f0c7/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= @@ -74,8 +75,8 @@ github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.m github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/etcd-io/bbolt v1.3.3/go.mod h1:ZF2nL25h33cCyBtcyWeZ2/I3HQOfTP+0PIEvHjkjCrw= -github.com/ethereum/c-kzg-4844 v0.3.1 h1:sR65+68+WdnMKxseNWxSJuAv2tsUrihTpVBTfM/U5Zg= -github.com/ethereum/c-kzg-4844 v0.3.1/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= +github.com/ethereum/c-kzg-4844 v0.3.2-0.20231019020040-748283cced54 h1:jDyQvQjauRyb7TJAF9W7J3NOjn3ukXahd3l+rd1Fak8= +github.com/ethereum/c-kzg-4844 v0.3.2-0.20231019020040-748283cced54/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= github.com/ethereum/hive v0.0.0-20230919110229-d58aec4a3eb5 h1:22Z+XoI2hGtYR0AMzYr9IusfYM/chALq/6oJnejJQpk= github.com/ethereum/hive v0.0.0-20230919110229-d58aec4a3eb5/go.mod h1:iKqu3dndnqdwSckyBGoZzeHhZz6X6XZws2TfZMdLdes= github.com/ethereum/hive/simulators/ethereum/engine v0.0.0-20230919054339-322945164a97 h1:A1bYQxUbl4ZM6q5E8RcDYGm/UIxO5u03ypN8mxX9oKY= @@ -131,8 +132,9 @@ github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvq github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= +github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXiurYmW7fx4GZkL8feAMVq7nEjURHk= github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= @@ -203,8 +205,8 @@ github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0 github.com/labstack/echo/v4 v4.5.0/go.mod h1:czIriw4a0C1dFun+ObrXp7ok03xON0N1awStJ6ArI7Y= github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c= -github.com/lightclient/go-ethereum v1.10.10-0.20230926150549-ae44519d720c h1:wSCiQFEiRH2qhIBrH7829p9oBvagRuT/Z0Mu0ROupFQ= -github.com/lightclient/go-ethereum v1.10.10-0.20230926150549-ae44519d720c/go.mod h1:gkQ5Ygi64ZBh9M/4iXY1R8WqoNCx1Ey0CkYn2BD4/fw= +github.com/lightclient/go-ethereum v1.10.10-0.20231019143932-4d161dee0c4c h1:UsDsJSV7/j0C4aGqECXoPvdL6a6y7myXMptcnQjflEY= +github.com/lightclient/go-ethereum v1.10.10-0.20231019143932-4d161dee0c4c/go.mod h1:CLSRGaP4Ev4DJOP+JSk3NHyJIillQLJc/ZAyCLI8NOs= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= @@ -215,7 +217,7 @@ github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hd github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= -github.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peKQ= +github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.14 h1:+xnbZSEeDbOIg5/mE6JF0w6n9duR1l3/WmbinWVwUuU= github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= @@ -308,7 +310,7 @@ github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81P github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= -github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/supranational/blst v0.3.11 h1:LyU6FolezeWAhvQk0k6O/d49jqgO52MSDDfYgbeoEm4= github.com/supranational/blst v0.3.11/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a h1:1ur3QoCqvE5fl+nylMaIr9PVV1w343YRDtsy+Rwu7XI= @@ -351,11 +353,11 @@ golang.org/x/crypto v0.0.0-20191227163750-53104e6ec876/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.12.0 h1:tFM/ta59kqch6LlvYnPa0yx5a83cL2nHflFhYKvv9Yk= -golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= +golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= +golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20230810033253-352e893a4cad h1:g0bG7Z4uG+OgH2QDODnjp6ggkk1bJDsINcuWmJN1iJU= -golang.org/x/exp v0.0.0-20230810033253-352e893a4cad/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc= +golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g= +golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= @@ -364,8 +366,8 @@ golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzB golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.11.0 h1:bUO06HqtnRcc/7l71XBe4WcqTZ+3AH1J59zWDDwLKgU= -golang.org/x/mod v0.11.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc= +golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -387,7 +389,7 @@ golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT golang.org/x/net v0.0.0-20211008194852-3b03d305991f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M= +golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -428,12 +430,13 @@ golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220405052023-b1e9470b6e64/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= +golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -442,8 +445,8 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc= -golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= +golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -460,8 +463,8 @@ golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roY golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.9.1 h1:8WMNJAz3zrtPmnYC7ISf5dEn3MT0gY7jBJfw27yrrLo= -golang.org/x/tools v0.9.1/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc= +golang.org/x/tools v0.13.0 h1:Iey4qkscZuv0VvIt8E0neZjtPVQFSc870HQ448QgEmQ= +golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= From 90c3cbd652844d67cdaa7a5bd29e443ca5980604 Mon Sep 17 00:00:00 2001 From: lightclient <14004106+lightclient@users.noreply.github.com> Date: Fri, 20 Oct 2023 06:19:16 -0600 Subject: [PATCH 068/387] cmd/hivechain: export chain starting after genesis (#912) --- cmd/hivechain/output.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cmd/hivechain/output.go b/cmd/hivechain/output.go index 931f35b7bb..1084156d83 100644 --- a/cmd/hivechain/output.go +++ b/cmd/hivechain/output.go @@ -115,7 +115,7 @@ func (g *generator) writeChain() error { } defer out.Close() lastBlock := g.blockchain.CurrentBlock().Number.Uint64() - return exportN(g.blockchain, out, 0, lastBlock) + return exportN(g.blockchain, out, 1, lastBlock) } // writePoWChain writes pre-merge RLP blocks to a file. @@ -130,7 +130,7 @@ func (g *generator) writePoWChain() error { if !ok { lastBlock = g.blockchain.CurrentBlock().Number.Uint64() } - return exportN(g.blockchain, out, 0, lastBlock) + return exportN(g.blockchain, out, 1, lastBlock) } func (g *generator) mergeBlock() (uint64, bool) { From 2dff98366f757ada109f40ad30a0336795a780cb Mon Sep 17 00:00:00 2001 From: lightclient <14004106+lightclient@users.noreply.github.com> Date: Fri, 20 Oct 2023 06:20:01 -0600 Subject: [PATCH 069/387] cmd/hivechain: write ttd passed to genesis if merged (#913) --- cmd/hivechain/genesis.go | 1 + 1 file changed, 1 insertion(+) diff --git a/cmd/hivechain/genesis.go b/cmd/hivechain/genesis.go index 31750f6a44..82540fed16 100644 --- a/cmd/hivechain/genesis.go +++ b/cmd/hivechain/genesis.go @@ -90,6 +90,7 @@ func (cfg *generatorConfig) createChainConfig() *params.ChainConfig { chaincfg.GrayGlacierBlock = new(big.Int).SetUint64(b) case "merge": chaincfg.MergeNetsplitBlock = new(big.Int).SetUint64(b) + chaincfg.TerminalTotalDifficultyPassed = true // time-based forks case "shanghai": chaincfg.ShanghaiTime = ×tamp From 9ed3d89782fde61a1da8abe7959662a9317589aa Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Fri, 20 Oct 2023 14:38:36 +0200 Subject: [PATCH 070/387] cmd/hivechain: add forkenv output (#921) --- cmd/hivechain/README.md | 4 +++ cmd/hivechain/genesis.go | 12 ++++----- cmd/hivechain/output.go | 1 + cmd/hivechain/output_forkenv.go | 43 +++++++++++++++++++++++++++++++++ 4 files changed, 54 insertions(+), 6 deletions(-) create mode 100644 cmd/hivechain/output_forkenv.go diff --git a/cmd/hivechain/README.md b/cmd/hivechain/README.md index 43c862ac72..39456d6f7f 100644 --- a/cmd/hivechain/README.md +++ b/cmd/hivechain/README.md @@ -54,6 +54,10 @@ Creates `accounts.json` containing accounts and corresponding private keys. This writes the `genesis.json` file containing a go-ethereum style genesis spec. Note this file includes the fork block numbers/timestamps. +### forkenv + +This writes `forkenv.json` with fork configuration environment variables for hive tests. + ### headblock This creates `headblock.json` with a dump of the head header. diff --git a/cmd/hivechain/genesis.go b/cmd/hivechain/genesis.go index 82540fed16..2a82ef37cf 100644 --- a/cmd/hivechain/genesis.go +++ b/cmd/hivechain/genesis.go @@ -25,9 +25,8 @@ var ( numberBasedForkNames = []string{ "homestead", - "eip150", - "eip155", - "eip158", + "tangerinewhistle", + "spuriousdragon", "byzantium", "constantinople", "petersburg", @@ -64,11 +63,10 @@ func (cfg *generatorConfig) createChainConfig() *params.ChainConfig { // number-based forks case "homestead": chaincfg.HomesteadBlock = new(big.Int).SetUint64(b) - case "eip150": + case "tangerinewhistle": chaincfg.EIP150Block = new(big.Int).SetUint64(b) - case "eip155": + case "spuriousdragon": chaincfg.EIP155Block = new(big.Int).SetUint64(b) - case "eip158": chaincfg.EIP158Block = new(big.Int).SetUint64(b) case "byzantium": chaincfg.ByzantiumBlock = new(big.Int).SetUint64(b) @@ -98,6 +96,8 @@ func (cfg *generatorConfig) createChainConfig() *params.ChainConfig { chaincfg.CancunTime = ×tamp case "prague": chaincfg.PragueTime = ×tamp + default: + panic(fmt.Sprintf("unknown fork name %q", fork)) } } diff --git a/cmd/hivechain/output.go b/cmd/hivechain/output.go index 1084156d83..1d0daf021c 100644 --- a/cmd/hivechain/output.go +++ b/cmd/hivechain/output.go @@ -17,6 +17,7 @@ import ( var outputFunctions = map[string]func(*generator) error{ "genesis": (*generator).writeGenesis, + "forkenv": (*generator).writeForkEnv, "chain": (*generator).writeChain, "powchain": (*generator).writePoWChain, "headstate": (*generator).writeState, diff --git a/cmd/hivechain/output_forkenv.go b/cmd/hivechain/output_forkenv.go new file mode 100644 index 0000000000..f13b3f2234 --- /dev/null +++ b/cmd/hivechain/output_forkenv.go @@ -0,0 +1,43 @@ +package main + +import ( + "fmt" + "math/big" +) + +// writeForkEnv writes chain fork configuration in the form that hive expects. +func (g *generator) writeForkEnv() error { + cfg := g.genesis.Config + env := make(map[string]string) + env["HIVE_CHAIN_ID"] = fmt.Sprint(cfg.ChainID) + + setNum := func(hive string, blocknum *big.Int) { + if blocknum != nil { + env[hive] = blocknum.Text(10) + } + } + setTime := func(hive string, timestamp *uint64) { + if timestamp != nil { + env[hive] = fmt.Sprintf("%d", *timestamp) + } + } + setNum("HIVE_FORK_HOMESTEAD", cfg.HomesteadBlock) + setNum("HIVE_FORK_TANGERINE", cfg.EIP150Block) + setNum("HIVE_FORK_SPURIOUS", cfg.EIP155Block) + setNum("HIVE_FORK_BYZANTIUM", cfg.ByzantiumBlock) + setNum("HIVE_FORK_CONSTANTINOPLE", cfg.ConstantinopleBlock) + setNum("HIVE_FORK_PETERSBURG", cfg.PetersburgBlock) + setNum("HIVE_FORK_ISTANBUL", cfg.IstanbulBlock) + setNum("HIVE_FORK_MUIR_GLACIER", cfg.MuirGlacierBlock) + setNum("HIVE_FORK_ARROW_GLACIER", cfg.ArrowGlacierBlock) + setNum("HIVE_FORK_GRAY_GLACIER", cfg.GrayGlacierBlock) + setNum("HIVE_FORK_BERLIN", cfg.BerlinBlock) + setNum("HIVE_FORK_LONDON", cfg.LondonBlock) + setNum("HIVE_MERGE_BLOCK_ID", cfg.MergeNetsplitBlock) + setNum("HIVE_TERMINAL_TOTAL_DIFFICULTY", cfg.TerminalTotalDifficulty) + setTime("HIVE_SHANGHAI_TIMESTAMP", cfg.ShanghaiTime) + setTime("HIVE_CANCUN_TIMESTAMP", cfg.CancunTime) + setTime("HIVE_PRAGUE_TIMESTAMP", cfg.PragueTime) + + return g.writeJSON("forkenv.json", env) +} From ca194017b7f06da4970ec412de439300f5202558 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Fri, 20 Oct 2023 14:48:46 +0000 Subject: [PATCH 071/387] cmd/hivechain: add HIVE_NETWORK_ID in forkenv output --- cmd/hivechain/output_forkenv.go | 1 + 1 file changed, 1 insertion(+) diff --git a/cmd/hivechain/output_forkenv.go b/cmd/hivechain/output_forkenv.go index f13b3f2234..162d1dec56 100644 --- a/cmd/hivechain/output_forkenv.go +++ b/cmd/hivechain/output_forkenv.go @@ -10,6 +10,7 @@ func (g *generator) writeForkEnv() error { cfg := g.genesis.Config env := make(map[string]string) env["HIVE_CHAIN_ID"] = fmt.Sprint(cfg.ChainID) + env["HIVE_NETWORK_ID"] = fmt.Sprint(cfg.ChainID) setNum := func(hive string, blocknum *big.Int) { if blocknum != nil { From 09e27fe2f2acc7f5d459f1c44d53d5ac9dc580aa Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Fri, 20 Oct 2023 14:48:58 +0000 Subject: [PATCH 072/387] cmd/hivechain: use smaller network ID jq doesn't like it when numbers are > 64bit --- cmd/hivechain/genesis.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/hivechain/genesis.go b/cmd/hivechain/genesis.go index 2a82ef37cf..2bdca7aeb3 100644 --- a/cmd/hivechain/genesis.go +++ b/cmd/hivechain/genesis.go @@ -50,7 +50,7 @@ var ( func (cfg *generatorConfig) createChainConfig() *params.ChainConfig { chaincfg := new(params.ChainConfig) - chainid, _ := new(big.Int).SetString("35039958740849263516136087381459012528369084397061947147216452157383146382873", 10) + chainid, _ := new(big.Int).SetString("350399587408492635", 10) chaincfg.ChainID = chainid chaincfg.Ethash = new(params.EthashConfig) From ed9bd2199ae2f37b926fede93fdc99ab831d8417 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Fri, 20 Oct 2023 17:00:57 +0200 Subject: [PATCH 073/387] cmd/hivechain: even smaller chainid --- cmd/hivechain/genesis.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/hivechain/genesis.go b/cmd/hivechain/genesis.go index 2bdca7aeb3..d45d1e5571 100644 --- a/cmd/hivechain/genesis.go +++ b/cmd/hivechain/genesis.go @@ -50,7 +50,7 @@ var ( func (cfg *generatorConfig) createChainConfig() *params.ChainConfig { chaincfg := new(params.ChainConfig) - chainid, _ := new(big.Int).SetString("350399587408492635", 10) + chainid, _ := new(big.Int).SetString("3503995874084926", 10) chaincfg.ChainID = chainid chaincfg.Ethash = new(params.EthashConfig) From 00c4d141015f0ff5643ffe4862146f796022cc2e Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Fri, 20 Oct 2023 15:57:51 +0000 Subject: [PATCH 074/387] cmd/hivechain: add headnewpayload output --- cmd/hivechain/output.go | 23 ++++++++++++----------- cmd/hivechain/output_engine.go | 8 ++++++++ 2 files changed, 20 insertions(+), 11 deletions(-) diff --git a/cmd/hivechain/output.go b/cmd/hivechain/output.go index 1d0daf021c..724241bf2a 100644 --- a/cmd/hivechain/output.go +++ b/cmd/hivechain/output.go @@ -16,17 +16,18 @@ import ( ) var outputFunctions = map[string]func(*generator) error{ - "genesis": (*generator).writeGenesis, - "forkenv": (*generator).writeForkEnv, - "chain": (*generator).writeChain, - "powchain": (*generator).writePoWChain, - "headstate": (*generator).writeState, - "headblock": (*generator).writeHeadBlock, - "accounts": (*generator).writeAccounts, - "txinfo": (*generator).writeTxInfo, - "headfcu": (*generator).writeEngineHeadFcU, - "fcu": (*generator).writeEngineFcU, - "newpayload": (*generator).writeEngineNewPayload, + "genesis": (*generator).writeGenesis, + "forkenv": (*generator).writeForkEnv, + "chain": (*generator).writeChain, + "powchain": (*generator).writePoWChain, + "headstate": (*generator).writeState, + "headblock": (*generator).writeHeadBlock, + "accounts": (*generator).writeAccounts, + "txinfo": (*generator).writeTxInfo, + "fcu": (*generator).writeEngineFcU, + "newpayload": (*generator).writeEngineNewPayload, + "headfcu": (*generator).writeEngineHeadFcU, + "headnewpayload": (*generator).writeEngineHeadNewPayload, } func outputFunctionNames() []string { diff --git a/cmd/hivechain/output_engine.go b/cmd/hivechain/output_engine.go index ec124fdc49..67d4815e9a 100644 --- a/cmd/hivechain/output_engine.go +++ b/cmd/hivechain/output_engine.go @@ -38,6 +38,14 @@ func (g *generator) writeEngineFcU() error { return g.writeJSON("fcu.json", list) } +// writeEngineHeadNewPayload writes an engine API newPayload request for the head block. +func (g *generator) writeEngineHeadNewPayload() error { + h := g.blockchain.CurrentBlock() + b := g.blockchain.GetBlock(h.Hash(), h.Number.Uint64()) + np := g.block2newpayload(b) + return g.writeJSON("headnewpayload.json", np) +} + // writeEngineHeadFcU writes an engine API forkchoiceUpdated request for the head block. func (g *generator) writeEngineHeadFcU() error { h := g.blockchain.CurrentBlock() From 2331194e1a090d029a77418bc513f8e06e371ca4 Mon Sep 17 00:00:00 2001 From: lightclient <14004106+lightclient@users.noreply.github.com> Date: Sun, 22 Oct 2023 07:51:58 -0600 Subject: [PATCH 075/387] cmd/hivechain: track preimages during generation (#924) --- cmd/hivechain/generate.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cmd/hivechain/generate.go b/cmd/hivechain/generate.go index fb6fcdc68e..73a3b43d28 100644 --- a/cmd/hivechain/generate.go +++ b/cmd/hivechain/generate.go @@ -14,6 +14,7 @@ import ( "github.com/ethereum/go-ethereum/core/rawdb" "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/trie" + "github.com/ethereum/go-ethereum/trie/triedb/hashdb" "golang.org/x/exp/slices" ) @@ -98,7 +99,7 @@ func (cfg *generatorConfig) createBlockModifiers() (list []*modifierInstance) { // run produces a chain. func (g *generator) run() error { db := rawdb.NewMemoryDatabase() - triedb := trie.NewDatabase(db, trie.HashDefaults) + triedb := trie.NewDatabase(db, &trie.Config{Preimages: true, HashDB: hashdb.Defaults}) genesis := g.genesis.MustCommit(db, triedb) config := g.genesis.Config From e7b7d042c957edaa67023e6123d74fedec86407b Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Sun, 22 Oct 2023 16:07:07 +0200 Subject: [PATCH 076/387] cmd/hivechain: remove trie/triedb/hashdb package dependency --- cmd/hivechain/generate.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/cmd/hivechain/generate.go b/cmd/hivechain/generate.go index 73a3b43d28..3e8d11476f 100644 --- a/cmd/hivechain/generate.go +++ b/cmd/hivechain/generate.go @@ -14,7 +14,6 @@ import ( "github.com/ethereum/go-ethereum/core/rawdb" "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/trie" - "github.com/ethereum/go-ethereum/trie/triedb/hashdb" "golang.org/x/exp/slices" ) @@ -99,7 +98,9 @@ func (cfg *generatorConfig) createBlockModifiers() (list []*modifierInstance) { // run produces a chain. func (g *generator) run() error { db := rawdb.NewMemoryDatabase() - triedb := trie.NewDatabase(db, &trie.Config{Preimages: true, HashDB: hashdb.Defaults}) + trieconfig := *trie.HashDefaults + trieconfig.Preimages = true + triedb := trie.NewDatabase(db, &trieconfig) genesis := g.genesis.MustCommit(db, triedb) config := g.genesis.Config From 5027ac75548d16819328e561abd33e71d11f201f Mon Sep 17 00:00:00 2001 From: Alexey Date: Mon, 23 Oct 2023 19:37:07 +0300 Subject: [PATCH 077/387] Nethermind to use master branch (#925) --- configs/cancun.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configs/cancun.yaml b/configs/cancun.yaml index e0c383b558..5e8674eaba 100644 --- a/configs/cancun.yaml +++ b/configs/cancun.yaml @@ -30,7 +30,7 @@ dockerfile: git build_args: github: NethermindEth/nethermind - tag: cancun + tag: master - client: reth nametag: cancun-git From e0801380783dbb9975d01efcc34d974310aa7a63 Mon Sep 17 00:00:00 2001 From: Mario Vega Date: Mon, 23 Oct 2023 12:55:44 -0600 Subject: [PATCH 078/387] simulators/ethereum/engine,pyspec: Use `golang:1.20-alpine` (#926) --- simulators/ethereum/engine/Dockerfile | 2 +- simulators/ethereum/pyspec/Dockerfile | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/simulators/ethereum/engine/Dockerfile b/simulators/ethereum/engine/Dockerfile index 84ee104173..7353bbd9f3 100644 --- a/simulators/ethereum/engine/Dockerfile +++ b/simulators/ethereum/engine/Dockerfile @@ -1,5 +1,5 @@ # This simulation runs Engine API tests. -FROM golang:1-alpine as builder +FROM golang:1.20-alpine as builder RUN apk add --update gcc musl-dev linux-headers # Build the simulator executable. diff --git a/simulators/ethereum/pyspec/Dockerfile b/simulators/ethereum/pyspec/Dockerfile index 1ce323dde1..2c5c5cedb1 100644 --- a/simulators/ethereum/pyspec/Dockerfile +++ b/simulators/ethereum/pyspec/Dockerfile @@ -3,7 +3,7 @@ # ---------------------------------------------------------------# # 1) Create pyspec builder container. -FROM golang:1-alpine as builder +FROM golang:1.20-alpine as builder RUN apk add --update git ca-certificates gcc musl-dev linux-headers # Build the pyspec simulator executable. From 384794ebcdf9361f5e464e920e349c3a5102afca Mon Sep 17 00:00:00 2001 From: Mario Vega Date: Mon, 23 Oct 2023 21:34:17 -0600 Subject: [PATCH 079/387] simulators/ethereum/engine: Trim log output of requests (#928) --- simulators/ethereum/engine/helper/helper.go | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/simulators/ethereum/engine/helper/helper.go b/simulators/ethereum/engine/helper/helper.go index 0904fced5d..349a732b4c 100644 --- a/simulators/ethereum/engine/helper/helper.go +++ b/simulators/ethereum/engine/helper/helper.go @@ -43,6 +43,8 @@ type LoggingRoundTrip struct { Inner http.RoundTripper } +const MAX_LOG_BYTES = 1024 * 4 + func (rt *LoggingRoundTrip) RoundTrip(req *http.Request) (*http.Response, error) { // Read and log the request body. reqBytes, err := io.ReadAll(req.Body) @@ -50,7 +52,12 @@ func (rt *LoggingRoundTrip) RoundTrip(req *http.Request) (*http.Response, error) if err != nil { return nil, err } - rt.Logger.Logf(">> (%s) %s", rt.ID, bytes.TrimSpace(reqBytes)) + reqLogBytes := bytes.TrimSpace(reqBytes[:]) + if len(reqLogBytes) > MAX_LOG_BYTES { + rt.Logger.Logf(">> (%s) %s... (Log trimmed)", rt.ID, reqLogBytes[:MAX_LOG_BYTES]) + } else { + rt.Logger.Logf(">> (%s) %s", rt.ID, reqLogBytes) + } reqCopy := *req reqCopy.Body = io.NopCloser(bytes.NewReader(reqBytes)) @@ -68,7 +75,12 @@ func (rt *LoggingRoundTrip) RoundTrip(req *http.Request) (*http.Response, error) } respCopy := *resp respCopy.Body = io.NopCloser(bytes.NewReader(respBytes)) - rt.Logger.Logf("<< (%s) %s", rt.ID, bytes.TrimSpace(respBytes)) + respLogBytes := bytes.TrimSpace(respBytes[:]) + if len(respLogBytes) > MAX_LOG_BYTES { + rt.Logger.Logf("<< (%s) %s... (Log trimmed)", rt.ID, respLogBytes[:MAX_LOG_BYTES]) + } else { + rt.Logger.Logf("<< (%s) %s", rt.ID, respLogBytes) + } return &respCopy, nil } From 6763ab37e0f494b6e1c6c6954cf9065ddbeda385 Mon Sep 17 00:00:00 2001 From: Alexey Osipov Date: Tue, 24 Oct 2023 10:56:23 +0300 Subject: [PATCH 080/387] Enable blob tx pool for Nethermind --- clients/nethermind/mkconfig.jq | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/clients/nethermind/mkconfig.jq b/clients/nethermind/mkconfig.jq index 5b64909cbb..ed2e74fee2 100644 --- a/clients/nethermind/mkconfig.jq +++ b/clients/nethermind/mkconfig.jq @@ -69,6 +69,19 @@ def sync_config: end ; +def txpool_config: + if env.HIVE_CANCUN_TIMESTAMP != null then + { + "TxPool": { + "BlobSupportEnabled": true, + "PersistentBlobStorageEnabled": true + } + } + else + {} + end +; + def base_config: { "Init": { @@ -101,4 +114,4 @@ def base_config: ; # This is the main expression that outputs the config. -base_config * keystore_config * merge_config * json_rpc_config * sync_config +base_config * keystore_config * merge_config * json_rpc_config * sync_config * txpool_config From b18f5156e5c28905cfa46422b28a5407c2e24629 Mon Sep 17 00:00:00 2001 From: spencer Date: Tue, 24 Oct 2023 16:45:59 -0600 Subject: [PATCH 081/387] simulators/ethereum/engine: Fix engine-cancun fcu version tests (#902) * simulators/ethereum/engine: Fix bugs within fcu version tests (Shanghai/Cancun). * simulators/ethereum/engine: Fix Cancun fcUV2 tests bugs --------- Co-authored-by: jangko --- .../ethereum/engine/suites/cancun/tests.go | 49 ++++++++++--------- 1 file changed, 25 insertions(+), 24 deletions(-) diff --git a/simulators/ethereum/engine/suites/cancun/tests.go b/simulators/ethereum/engine/suites/cancun/tests.go index 3cb466d1c1..6fed388079 100644 --- a/simulators/ethereum/engine/suites/cancun/tests.go +++ b/simulators/ethereum/engine/suites/cancun/tests.go @@ -499,13 +499,13 @@ var Tests = []test.Spec{ // ForkchoiceUpdatedV3 before cancun &CancunBaseSpec{ BaseSpec: test.BaseSpec{ - Name: "ForkchoiceUpdatedV3 Set Head to Shanghai Payload, Nil Payload Attributes", + Name: "ForkchoiceUpdatedV3 Set Head to Shanghai Payload, Null Payload Attributes", About: ` Test sending ForkchoiceUpdatedV3 to set the head of the chain to a Shanghai payload: - Send NewPayloadV2 with Shanghai payload on block 1 - - Use ForkchoiceUpdatedV3 to set the head to the payload, with nil payload attributes + - Use ForkchoiceUpdatedV3 to set the head to the payload, with null payload attributes - Verify that client returns no error. + Verify that client returns no error `, MainFork: config.Cancun, ForkHeight: 2, @@ -525,11 +525,11 @@ var Tests = []test.Spec{ &CancunBaseSpec{ BaseSpec: test.BaseSpec{ - Name: "ForkchoiceUpdatedV3 To Request Shanghai Payload, Nil Beacon Root", + Name: "ForkchoiceUpdatedV3 To Request Shanghai Payload, Null Beacon Root", About: ` Test sending ForkchoiceUpdatedV3 to request a Shanghai payload: - Payload Attributes uses Shanghai timestamp - - Payload Attributes' Beacon Root is nil + - Payload Attributes Beacon Root is null Verify that client returns INVALID_PARAMS_ERROR. `, @@ -545,7 +545,7 @@ var Tests = []test.Spec{ }, }, ExpectationDescription: fmt.Sprintf(` - ForkchoiceUpdatedV3 before Cancun with any nil field must return INVALID_PARAMS_ERROR (code %d) + ForkchoiceUpdatedV3 before Cancun with any null field must return INVALID_PARAMS_ERROR (code %d) `, *globals.INVALID_PARAMS_ERROR), }, }, @@ -553,11 +553,11 @@ var Tests = []test.Spec{ &CancunBaseSpec{ BaseSpec: test.BaseSpec{ - Name: "ForkchoiceUpdatedV3 To Request Shanghai Payload, Zero Beacon Root", + Name: "ForkchoiceUpdatedV3 To Request Shanghai Payload, Non-Null Beacon Root", About: ` Test sending ForkchoiceUpdatedV3 to request a Shanghai payload: - Payload Attributes uses Shanghai timestamp - - Payload Attributes' Beacon Root zero + - Payload Attributes Beacon Root is non-null Verify that client returns UNSUPPORTED_FORK_ERROR. `, @@ -576,7 +576,7 @@ var Tests = []test.Spec{ }, }, ExpectationDescription: fmt.Sprintf(` - ForkchoiceUpdatedV3 before Cancun with beacon root must return UNSUPPORTED_FORK_ERROR (code %d) + ForkchoiceUpdatedV3 before Cancun with beacon root field present must return UNSUPPORTED_FORK_ERROR (code %d) `, *globals.UNSUPPORTED_FORK_ERROR), }, }, @@ -585,27 +585,25 @@ var Tests = []test.Spec{ // ForkchoiceUpdatedV2 before cancun with beacon root &CancunBaseSpec{ BaseSpec: test.BaseSpec{ - Name: "ForkchoiceUpdatedV2 To Request Shanghai Payload, Zero Beacon Root", + Name: "ForkchoiceUpdatedV2 To Request Shanghai Payload, Non-Null Beacon Root ", About: ` - Test sending ForkchoiceUpdatedV2 to request a Cancun payload: + Test sending ForkchoiceUpdatedV2 to request a Shanghai payload: - Payload Attributes uses Shanghai timestamp - - Payload Attributes' Beacon Root zero + - Payload Attributes Beacon Root is non-null Verify that client returns INVALID_PARAMS_ERROR. `, MainFork: config.Cancun, - ForkHeight: 1, + ForkHeight: 2, }, TestSequence: TestSequence{ NewPayloads{ - FcUOnPayloadRequest: &helper.DowngradeForkchoiceUpdatedVersion{ - ForkchoiceUpdatedCustomizer: &helper.BaseForkchoiceUpdatedCustomizer{ - PayloadAttributesCustomizer: &helper.BasePayloadAttributesCustomizer{ - BeaconRoot: &(common.Hash{}), - }, - ExpectedError: globals.INVALID_PARAMS_ERROR, + FcUOnPayloadRequest: &helper.BaseForkchoiceUpdatedCustomizer{ + PayloadAttributesCustomizer: &helper.BasePayloadAttributesCustomizer{ + BeaconRoot: &(common.Hash{}), }, + ExpectedError: globals.INVALID_PARAMS_ERROR, }, ExpectationDescription: fmt.Sprintf(` ForkchoiceUpdatedV2 before Cancun with beacon root field must return INVALID_PARAMS_ERROR (code %d) @@ -614,14 +612,14 @@ var Tests = []test.Spec{ }, }, - // ForkchoiceUpdatedV2 after cancun + // ForkchoiceUpdatedV2 after cancun with beacon root &CancunBaseSpec{ BaseSpec: test.BaseSpec{ - Name: "ForkchoiceUpdatedV2 To Request Cancun Payload, Zero Beacon Root", + Name: "ForkchoiceUpdatedV2 To Request Cancun Payload, Non-Null Beacon Root", About: ` Test sending ForkchoiceUpdatedV2 to request a Cancun payload: - Payload Attributes uses Cancun timestamp - - Payload Attributes' Beacon Root zero + - Payload Attributes Beacon Root is non-null Verify that client returns INVALID_PARAMS_ERROR. `, @@ -633,6 +631,9 @@ var Tests = []test.Spec{ NewPayloads{ FcUOnPayloadRequest: &helper.DowngradeForkchoiceUpdatedVersion{ ForkchoiceUpdatedCustomizer: &helper.BaseForkchoiceUpdatedCustomizer{ + PayloadAttributesCustomizer: &helper.BasePayloadAttributesCustomizer{ + BeaconRoot: &(common.Hash{}), + }, ExpectedError: globals.INVALID_PARAMS_ERROR, }, }, @@ -644,11 +645,11 @@ var Tests = []test.Spec{ }, &CancunBaseSpec{ BaseSpec: test.BaseSpec{ - Name: "ForkchoiceUpdatedV2 To Request Cancun Payload, Nil Beacon Root", + Name: "ForkchoiceUpdatedV2 To Request Cancun Payload, Missing Beacon Root", About: ` Test sending ForkchoiceUpdatedV2 to request a Cancun payload: - Payload Attributes uses Cancun timestamp - - Payload Attributes' Beacon Root nil (not provided) + - Payload Attributes Beacon Root is missing Verify that client returns UNSUPPORTED_FORK_ERROR. `, From 87b2e388a39209c464587cbab439a8016b256050 Mon Sep 17 00:00:00 2001 From: spencer Date: Tue, 24 Oct 2023 16:51:53 -0600 Subject: [PATCH 082/387] clients: only output full genesis file at high log levels (#927) * clients: Trim genesis output for low log levels. * clients: Specific echo for trimmed genesis output. --- clients/besu/besu.sh | 16 +++++++++++++--- clients/erigon/erigon.sh | 11 ++++++++--- clients/ethereumjs/ethereumjs.sh | 13 ++++++++----- clients/go-ethereum/geth.sh | 11 ++++++++--- clients/nethermind/nethermind.sh | 11 +++++++++-- clients/nimbus-el/nimbus.sh | 14 +++++++++++--- clients/reth/reth.sh | 11 ++++++++--- 7 files changed, 65 insertions(+), 22 deletions(-) diff --git a/clients/besu/besu.sh b/clients/besu/besu.sh index 31dad9ed9b..28f46f3d59 100644 --- a/clients/besu/besu.sh +++ b/clients/besu/besu.sh @@ -63,9 +63,19 @@ esac FLAGS="--logging=$LOG --data-storage-format=BONSAI" # Configure the chain. -jq -f /mapper.jq /genesis.json > /besugenesis.json -echo -n "Genesis: "; cat /besugenesis.json -FLAGS="$FLAGS --genesis-file=/besugenesis.json " +mv /genesis.json /genesis-input.json +jq -f /mapper.jq /genesis-input.json > /genesis.json +FLAGS="$FLAGS --genesis-file=/genesis.json " + +# Dump genesis. +if [ "$HIVE_LOGLEVEL" -lt 4 ]; then + echo "Supplied genesis state (trimmed, use --sim.loglevel 4 or 5 for full output):" + jq 'del(.alloc[] | select(.balance == "0x123450000000000000000"))' /genesis.json +else + echo "Supplied genesis state:" + cat /genesis.json +fi + # Enable experimental 'berlin' hard-fork features if configured. #if [ -n "$HIVE_FORK_BERLIN" ]; then diff --git a/clients/erigon/erigon.sh b/clients/erigon/erigon.sh index 92e974316a..a942935417 100644 --- a/clients/erigon/erigon.sh +++ b/clients/erigon/erigon.sh @@ -67,9 +67,14 @@ fi mv /genesis.json /genesis-input.json jq -f /mapper.jq /genesis-input.json > /genesis.json -# Dump genesis -echo "Supplied genesis state:" -cat /genesis.json +# Dump genesis. +if [ "$HIVE_LOGLEVEL" -lt 4 ]; then + echo "Supplied genesis state (trimmed, use --sim.loglevel 4 or 5 for full output):" + jq 'del(.alloc[] | select(.balance == "0x123450000000000000000"))' /genesis.json +else + echo "Supplied genesis state:" + cat /genesis.json +fi echo "Command flags till now:" echo $FLAGS diff --git a/clients/ethereumjs/ethereumjs.sh b/clients/ethereumjs/ethereumjs.sh index a818ebb6d3..f27cc9970c 100644 --- a/clients/ethereumjs/ethereumjs.sh +++ b/clients/ethereumjs/ethereumjs.sh @@ -51,14 +51,18 @@ set -e ethereumjs="node /ethereumjs-monorepo/packages/client/dist/bin/cli.js" FLAGS="--gethGenesis ./genesis.json --rpc --rpcEngine --saveReceipts --rpcAddr 0.0.0.0 --rpcEngineAddr 0.0.0.0 --rpcEnginePort 8551 --ws false --logLevel debug --rpcDebug --isSingleNode" - # Configure the chain. mv /genesis.json /genesis-input.json jq -f /mapper.jq /genesis-input.json > /genesis.json -# Dump genesis -echo "Supplied genesis state:" -cat /genesis.json +# Dump genesis. +if [ "$HIVE_LOGLEVEL" -lt 4 ]; then + echo "Supplied genesis state (trimmed, use --sim.loglevel 4 or 5 for full output):" + jq 'del(.alloc[] | select(.balance == "0x123450000000000000000"))' /genesis.json +else + echo "Supplied genesis state:" + cat /genesis.json +fi # Import clique signing key. if [ "$HIVE_CLIQUE_PRIVATEKEY" != "" ]; then @@ -75,7 +79,6 @@ if [ "$HIVE_TERMINAL_TOTAL_DIFFICULTY" != "" ]; then FLAGS="$FLAGS --jwt-secret ./jwtsecret" fi - # Load the test chain if present echo "Loading initial blockchain..." if [ -f /chain.rlp ]; then diff --git a/clients/go-ethereum/geth.sh b/clients/go-ethereum/geth.sh index 92cdd37db0..38204d4a73 100644 --- a/clients/go-ethereum/geth.sh +++ b/clients/go-ethereum/geth.sh @@ -93,9 +93,14 @@ fi mv /genesis.json /genesis-input.json jq -f /mapper.jq /genesis-input.json > /genesis.json -# Dump genesis -echo "Supplied genesis state:" -cat /genesis.json +# Dump genesis. +if [ "$HIVE_LOGLEVEL" -lt 4 ]; then + echo "Supplied genesis state (trimmed, use --sim.loglevel 4 or 5 for full output):" + jq 'del(.alloc[] | select(.balance == "0x123450000000000000000"))' /genesis.json +else + echo "Supplied genesis state:" + cat /genesis.json +fi # Initialize the local testchain with the genesis state echo "Initializing database with genesis state..." diff --git a/clients/nethermind/nethermind.sh b/clients/nethermind/nethermind.sh index fe6418110c..e65bb44736 100644 --- a/clients/nethermind/nethermind.sh +++ b/clients/nethermind/nethermind.sh @@ -57,9 +57,16 @@ fi # Generate the genesis and chainspec file. mkdir -p /chainspec -echo "Supplied genesis state:" jq -f /mapper.jq /genesis.json > /chainspec/test.json -jq . /chainspec/test.json + +# Dump genesis. +if [ "$HIVE_LOGLEVEL" -lt 4 ]; then + echo "Supplied genesis state (trimmed, use --sim.loglevel 4 or 5 for full output):" + jq 'del(.accounts[] | select(.balance == "0x123450000000000000000" or has("builtin")))' /chainspec/test.json +else + echo "Supplied genesis state:" + cat /chainspec/test.json +fi # Generate the config file. mkdir /configs diff --git a/clients/nimbus-el/nimbus.sh b/clients/nimbus-el/nimbus.sh index ea3cc9dac4..94bdeebb84 100644 --- a/clients/nimbus-el/nimbus.sh +++ b/clients/nimbus-el/nimbus.sh @@ -81,11 +81,19 @@ if [ "$HIVE_CLIQUE_PRIVATEKEY" != "" ]; then fi fi -# Configure the genesis chain and use it as start block and dump it to stdout -echo "Supplied genesis state:" -jq -f /mapper.jq /genesis.json | tee /genesis-start.json +# Configure the chain. +jq -f /mapper.jq /genesis.json > /genesis-start.json FLAGS="$FLAGS --custom-network:/genesis-start.json" +# Dump genesis. +if [ "$HIVE_LOGLEVEL" -lt 4 ]; then + echo "Supplied genesis state (trimmed, use --sim.loglevel 4 or 5 for full output):" + jq 'del(.genesis.alloc[] | select(.balance == "0x123450000000000000000"))' /genesis-start.json +else + echo "Supplied genesis state:" + cat /genesis-start.json +fi + # Don't immediately abort, some imports are meant to fail set +e diff --git a/clients/reth/reth.sh b/clients/reth/reth.sh index a643f4acc0..6adf995d4b 100644 --- a/clients/reth/reth.sh +++ b/clients/reth/reth.sh @@ -66,9 +66,14 @@ FLAGS="$FLAGS --datadir /reth-hive-datadir" mv /genesis.json /genesis-input.json jq -f /mapper.jq /genesis-input.json > /genesis.json -# Dump genesis -echo "Supplied genesis state:" -cat /genesis.json +# Dump genesis. +if [ "$HIVE_LOGLEVEL" -lt 4 ]; then + echo "Supplied genesis state (trimmed, use --sim.loglevel 4 or 5 for full output):" + jq 'del(.alloc[] | select(.balance == "0x123450000000000000000"))' /genesis.json +else + echo "Supplied genesis state:" + cat /genesis.json +fi echo "Command flags till now:" echo $FLAGS From 9099fd0adfc53df8c1f047c458b4e7d89bdeda9c Mon Sep 17 00:00:00 2001 From: spencer Date: Wed, 25 Oct 2023 06:07:55 -0600 Subject: [PATCH 083/387] clients: remove openethereum as its deprecated (#932) --- clients/openethereum/Dockerfile | 41 ----- clients/openethereum/chain.json | 160 ----------------- clients/openethereum/enode.sh | 21 --- clients/openethereum/genesis.json | 15 -- clients/openethereum/mapper.jq | 248 --------------------------- clients/openethereum/openethereum.sh | 152 ---------------- docs/clients.md | 6 +- docs/commandline.md | 4 +- docs/overview.md | 2 +- docs/simulators.md | 2 +- test.sh | 7 +- 11 files changed, 8 insertions(+), 650 deletions(-) delete mode 100644 clients/openethereum/Dockerfile delete mode 100644 clients/openethereum/chain.json delete mode 100644 clients/openethereum/enode.sh delete mode 100644 clients/openethereum/genesis.json delete mode 100644 clients/openethereum/mapper.jq delete mode 100644 clients/openethereum/openethereum.sh diff --git a/clients/openethereum/Dockerfile b/clients/openethereum/Dockerfile deleted file mode 100644 index c78d90d3ef..0000000000 --- a/clients/openethereum/Dockerfile +++ /dev/null @@ -1,41 +0,0 @@ -# This dockerfile builds OpenEthereum for Hive. -ARG tag=latest -ARG baseimage=openethereum/openethereum - -# The runner script needs a tool to convert raw private keys -# to keystore files. We use the ethkey tool from geth for this. -FROM ethereum/client-go:alltools-latest AS keytool-builder - -# Now pull OpenEthereum. -FROM $baseimage:$tag -USER root - -# Copy keystore tool. -COPY --from=keytool-builder /usr/local/bin/ethkey /ethkey - -# Install additional tools. -RUN apk add --no-cache bash bc jq curl - -ADD openethereum.sh /openethereum.sh -RUN chmod +x /openethereum.sh -ADD mapper.jq /mapper.jq - -# Inject the enode id retriever script -RUN mkdir /hive-bin -ADD enode.sh /hive-bin/enode.sh -RUN chmod +x /hive-bin/enode.sh - -# Add dummy /version.json -RUN ./openethereum --version > /raw_version.txt -RUN head -n 2 /raw_version.txt | tail -1 > /version.txt -RUN sed -i 's/\//g' /version.txt -RUN sed -i 's/^[[:space:]]*//' /version.txt - -# Export the usual networking ports to allow outside access to the node -EXPOSE 8545 8547 30303 30303/udp - -# Add default genesis.json -ADD genesis.json /genesis.json -RUN chmod 777 /genesis.json - -ENTRYPOINT ["/openethereum.sh"] diff --git a/clients/openethereum/chain.json b/clients/openethereum/chain.json deleted file mode 100644 index de5978955d..0000000000 --- a/clients/openethereum/chain.json +++ /dev/null @@ -1,160 +0,0 @@ -{ - "name": "Hive", - "engine": { - "Ethash": { - "params": { - "minimumDifficulty": "0x020000", - "blockReward": { - "0": "0x4563918244F40000" - }, - "difficultyBombDelays": {}, - "difficultyBoundDivisor": "0x0800", - "durationLimit": "0x0d", - "daoHardforkBeneficiary": "0xbf4ed7b27f1d666546e30d74d50d173d20bca754", - "daoHardforkAccounts": [ - "0xd4fe7bc31cedb7bfb8a345f31e668033056b2728", - "0xb3fb0e5aba0e20e5c49d252dfd30e102b171a425", - "0x2c19c7f9ae8b751e37aeb2d93a699722395ae18f", - "0xecd135fa4f61a655311e86238c92adcd779555d2", - "0x1975bd06d486162d5dc297798dfc41edd5d160a7", - "0xa3acf3a1e16b1d7c315e23510fdd7847b48234f6", - "0x319f70bab6845585f412ec7724b744fec6095c85", - "0x06706dd3f2c9abf0a21ddcc6941d9b86f0596936", - "0x5c8536898fbb74fc7445814902fd08422eac56d0", - "0x6966ab0d485353095148a2155858910e0965b6f9", - "0x779543a0491a837ca36ce8c635d6154e3c4911a6", - "0x2a5ed960395e2a49b1c758cef4aa15213cfd874c", - "0x5c6e67ccd5849c0d29219c4f95f1a7a93b3f5dc5", - "0x9c50426be05db97f5d64fc54bf89eff947f0a321", - "0x200450f06520bdd6c527622a273333384d870efb", - "0xbe8539bfe837b67d1282b2b1d61c3f723966f049", - "0x6b0c4d41ba9ab8d8cfb5d379c69a612f2ced8ecb", - "0xf1385fb24aad0cd7432824085e42aff90886fef5", - "0xd1ac8b1ef1b69ff51d1d401a476e7e612414f091", - "0x8163e7fb499e90f8544ea62bbf80d21cd26d9efd", - "0x51e0ddd9998364a2eb38588679f0d2c42653e4a6", - "0x627a0a960c079c21c34f7612d5d230e01b4ad4c7", - "0xf0b1aa0eb660754448a7937c022e30aa692fe0c5", - "0x24c4d950dfd4dd1902bbed3508144a54542bba94", - "0x9f27daea7aca0aa0446220b98d028715e3bc803d", - "0xa5dc5acd6a7968a4554d89d65e59b7fd3bff0f90", - "0xd9aef3a1e38a39c16b31d1ace71bca8ef58d315b", - "0x63ed5a272de2f6d968408b4acb9024f4cc208ebf", - "0x6f6704e5a10332af6672e50b3d9754dc460dfa4d", - "0x77ca7b50b6cd7e2f3fa008e24ab793fd56cb15f6", - "0x492ea3bb0f3315521c31f273e565b868fc090f17", - "0x0ff30d6de14a8224aa97b78aea5388d1c51c1f00", - "0x9ea779f907f0b315b364b0cfc39a0fde5b02a416", - "0xceaeb481747ca6c540a000c1f3641f8cef161fa7", - "0xcc34673c6c40e791051898567a1222daf90be287", - "0x579a80d909f346fbfb1189493f521d7f48d52238", - "0xe308bd1ac5fda103967359b2712dd89deffb7973", - "0x4cb31628079fb14e4bc3cd5e30c2f7489b00960c", - "0xac1ecab32727358dba8962a0f3b261731aad9723", - "0x4fd6ace747f06ece9c49699c7cabc62d02211f75", - "0x440c59b325d2997a134c2c7c60a8c61611212bad", - "0x4486a3d68fac6967006d7a517b889fd3f98c102b", - "0x9c15b54878ba618f494b38f0ae7443db6af648ba", - "0x27b137a85656544b1ccb5a0f2e561a5703c6a68f", - "0x21c7fdb9ed8d291d79ffd82eb2c4356ec0d81241", - "0x23b75c2f6791eef49c69684db4c6c1f93bf49a50", - "0x1ca6abd14d30affe533b24d7a21bff4c2d5e1f3b", - "0xb9637156d330c0d605a791f1c31ba5890582fe1c", - "0x6131c42fa982e56929107413a9d526fd99405560", - "0x1591fc0f688c81fbeb17f5426a162a7024d430c2", - "0x542a9515200d14b68e934e9830d91645a980dd7a", - "0xc4bbd073882dd2add2424cf47d35213405b01324", - "0x782495b7b3355efb2833d56ecb34dc22ad7dfcc4", - "0x58b95c9a9d5d26825e70a82b6adb139d3fd829eb", - "0x3ba4d81db016dc2890c81f3acec2454bff5aada5", - "0xb52042c8ca3f8aa246fa79c3feaa3d959347c0ab", - "0xe4ae1efdfc53b73893af49113d8694a057b9c0d1", - "0x3c02a7bc0391e86d91b7d144e61c2c01a25a79c5", - "0x0737a6b837f97f46ebade41b9bc3e1c509c85c53", - "0x97f43a37f595ab5dd318fb46e7a155eae057317a", - "0x52c5317c848ba20c7504cb2c8052abd1fde29d03", - "0x4863226780fe7c0356454236d3b1c8792785748d", - "0x5d2b2e6fcbe3b11d26b525e085ff818dae332479", - "0x5f9f3392e9f62f63b8eac0beb55541fc8627f42c", - "0x057b56736d32b86616a10f619859c6cd6f59092a", - "0x9aa008f65de0b923a2a4f02012ad034a5e2e2192", - "0x304a554a310c7e546dfe434669c62820b7d83490", - "0x914d1b8b43e92723e64fd0a06f5bdb8dd9b10c79", - "0x4deb0033bb26bc534b197e61d19e0733e5679784", - "0x07f5c1e1bc2c93e0402f23341973a0e043f7bf8a", - "0x35a051a0010aba705c9008d7a7eff6fb88f6ea7b", - "0x4fa802324e929786dbda3b8820dc7834e9134a2a", - "0x9da397b9e80755301a3b32173283a91c0ef6c87e", - "0x8d9edb3054ce5c5774a420ac37ebae0ac02343c6", - "0x0101f3be8ebb4bbd39a2e3b9a3639d4259832fd9", - "0x5dc28b15dffed94048d73806ce4b7a4612a1d48f", - "0xbcf899e6c7d9d5a215ab1e3444c86806fa854c76", - "0x12e626b0eebfe86a56d633b9864e389b45dcb260", - "0xa2f1ccba9395d7fcb155bba8bc92db9bafaeade7", - "0xec8e57756626fdc07c63ad2eafbd28d08e7b0ca5", - "0xd164b088bd9108b60d0ca3751da4bceb207b0782", - "0x6231b6d0d5e77fe001c2a460bd9584fee60d409b", - "0x1cba23d343a983e9b5cfd19496b9a9701ada385f", - "0xa82f360a8d3455c5c41366975bde739c37bfeb8a", - "0x9fcd2deaff372a39cc679d5c5e4de7bafb0b1339", - "0x005f5cee7a43331d5a3d3eec71305925a62f34b6", - "0x0e0da70933f4c7849fc0d203f5d1d43b9ae4532d", - "0xd131637d5275fd1a68a3200f4ad25c71a2a9522e", - "0xbc07118b9ac290e4622f5e77a0853539789effbe", - "0x47e7aa56d6bdf3f36be34619660de61275420af8", - "0xacd87e28b0c9d1254e868b81cba4cc20d9a32225", - "0xadf80daec7ba8dcf15392f1ac611fff65d94f880", - "0x5524c55fb03cf21f549444ccbecb664d0acad706", - "0x40b803a9abce16f50f36a77ba41180eb90023925", - "0xfe24cdd8648121a43a7c86d289be4dd2951ed49f", - "0x17802f43a0137c506ba92291391a8a8f207f487d", - "0x253488078a4edf4d6f42f113d1e62836a942cf1a", - "0x86af3e9626fce1957c82e88cbf04ddf3a2ed7915", - "0xb136707642a4ea12fb4bae820f03d2562ebff487", - "0xdbe9b615a3ae8709af8b93336ce9b477e4ac0940", - "0xf14c14075d6c4ed84b86798af0956deef67365b5", - "0xca544e5c4687d109611d0f8f928b53a25af72448", - "0xaeeb8ff27288bdabc0fa5ebb731b6f409507516c", - "0xcbb9d3703e651b0d496cdefb8b92c25aeb2171f7", - "0x6d87578288b6cb5549d5076a207456a1f6a63dc0", - "0xb2c6f0dfbb716ac562e2d85d6cb2f8d5ee87603e", - "0xaccc230e8a6e5be9160b8cdf2864dd2a001c28b6", - "0x2b3455ec7fedf16e646268bf88846bd7a2319bb2", - "0x4613f3bca5c44ea06337a9e439fbc6d42e501d0a", - "0xd343b217de44030afaa275f54d31a9317c7f441e", - "0x84ef4b2357079cd7a7c69fd7a37cd0609a679106", - "0xda2fef9e4a3230988ff17df2165440f37e8b1708", - "0xf4c64518ea10f995918a454158c6b61407ea345c", - "0x7602b46df5390e432ef1c307d4f2c9ff6d65cc97", - "0xbb9bc244d798123fde783fcc1c72d3bb8c189413", - "0x807640a13483f8ac783c557fcdf27be11ea4ac7a" - ] - - } - } - }, - "params": { - "registrar": "", - "gasLimitBoundDivisor": "0x0400", - "accountStartNonce": "0x0", - "maxCodeSize": 24576, - "maximumExtraDataSize": "0x20", - "minGasLimit": "0x1388", - "networkID" : "0x1", - "eip98Transition": "0x7fffffffffffff", - "eip1014Transition": "0x7fffffffffffff", - "eip155Transition": "0x7fffffffffffffff", - "eip150Transition": "0x7fffffffffffffff", - "eip160Transition": "0x7fffffffffffffff", - "eip161abcTransition": "0x7fffffffffffffff", - "eip161dTransition": "0x7fffffffffffffff" - - }, - "nodes": [], - "accounts": { - "0000000000000000000000000000000000000001": { "builtin": { "name": "ecrecover", "pricing": { "linear": { "base": 3000, "word": 0 } } } }, - "0000000000000000000000000000000000000002": { "builtin": { "name": "sha256", "pricing": { "linear": { "base": 60, "word": 12 } } } }, - "0000000000000000000000000000000000000003": { "builtin": { "name": "ripemd160", "pricing": { "linear": { "base": 600, "word": 120 } } } }, - "0000000000000000000000000000000000000004": { "builtin": { "name": "identity", "pricing": { "linear": { "base": 15, "word": 3 } } } } - } -} diff --git a/clients/openethereum/enode.sh b/clients/openethereum/enode.sh deleted file mode 100644 index 85d4761a36..0000000000 --- a/clients/openethereum/enode.sh +++ /dev/null @@ -1,21 +0,0 @@ -#!/bin/bash - -# Script to retrieve the enode -# -# This is copied into the validator container by Hive -# and used to provide a client-specific enode id retriever -# - -# Immediately abort the script on any error encountered -set -e - - -# This script errors at times, so we add a little sleep here to -# give the node some more time -sleep 1 -TARGET_RESPONSE=$(curl --data '{"method":"parity_enode","params":[],"id":1,"jsonrpc":"2.0"}' -H "Content-Type: application/json" -X POST "localhost:8545" ) - - -TARGET_ENODE=$(echo ${TARGET_RESPONSE}| jq -r '.result') - -echo "$TARGET_ENODE" \ No newline at end of file diff --git a/clients/openethereum/genesis.json b/clients/openethereum/genesis.json deleted file mode 100644 index 7ca6f39f73..0000000000 --- a/clients/openethereum/genesis.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "coinbase" : "0x8888f1f195afa192cfee860698584c030f4c9db1", - "difficulty" : "0x020000", - "extraData" : "0x42", - "gasLimit" : "0x2fefd8", - "mixHash" : "0x2c85bcbce56429100b2108254bb56906257582aeafcbd682bc9af67a9f5aee46", - "nonce" : "0x78cc16f7b4f65485", - "parentHash" : "0x0000000000000000000000000000000000000000000000000000000000000000", - "timestamp" : "0x54c98c81", - "alloc" : { - "a94f5374fce5edbc8e2a8697c15331677e6ebf0b": { - "balance" : "0x09184e72a000" - } - } -} diff --git a/clients/openethereum/mapper.jq b/clients/openethereum/mapper.jq deleted file mode 100644 index 9a27d2d074..0000000000 --- a/clients/openethereum/mapper.jq +++ /dev/null @@ -1,248 +0,0 @@ -# Removes all empty keys and values in input. -def remove_empty: - . | walk( - if type == "object" then - with_entries( - select( - .value != null and - .value != "" and - .key != null and - .key != "" - ) - ) - else . - end - ) -; - -# Converts number to hex, from https://rosettacode.org/wiki/Non-decimal_radices/Convert#jq -def int_to_hex: - def stream: - recurse(if . > 0 then ./16|floor else empty end) | . % 16 ; - if . == 0 then "0x0" - else "0x" + ([stream] | reverse | .[1:] | map(if .<10 then 48+. else 87+. end) | implode) - end -; - -# Converts decimal number in string to hex. -def to_hex: - if . != null and startswith("0x") then . else - if (. != null and . != "") then .|tonumber|int_to_hex else . end - end -; - -# Zero-pads hex string. -def infix_zeros_to_length(s;l): - if . != null then - (.[0:s])+("0"*(l-(.|length)))+(.[s:l]) - else . - end -; - -# This gives the consensus engine definition for the ethash engine. -def ethash_engine: - { - "Ethash": { - "params": { - "minimumDifficulty": "0x20000", - "difficultyBoundDivisor": "0x800", - "durationLimit": "0x0d", - "homesteadTransition": env.HIVE_FORK_HOMESTEAD|to_hex, - "eip100bTransition": env.HIVE_FORK_BYZANTIUM|to_hex, - "daoHardforkTransition": env.HIVE_FORK_DAO_BLOCK|to_hex, - "daoHardforkBeneficiary": "0xbf4ed7b27f1d666546e30d74d50d173d20bca754", - "blockReward": { - "0x0": "0x4563918244F40000", - (env.HIVE_FORK_BYZANTIUM|to_hex//""): "0x29A2241AF62C0000", - (env.HIVE_FORK_CONSTANTINOPLE|to_hex//""): "0x1BC16D674EC80000", - }, - "difficultyBombDelays": { - (env.HIVE_FORK_BYZANTIUM|to_hex//""): 3000000, - (env.HIVE_FORK_CONSTANTINOPLE|to_hex//""): 2000000, - (env.HIVE_FORK_MUIR_GLACIER|to_hex//""): 4000000, - (env.HIVE_FORK_LONDON|to_hex//""): 700000, - } - } - } - } -; - -# This gives the consensus engine definition for the clique PoA engine. -def clique_engine: - { - "clique": { - "params": { - "period": env.HIVE_CLIQUE_PERIOD|tonumber, - "epoch": 30000, - "blockReward": "0x0" - } - } - } -; - -{ - "name": "Hive", - "engine": (if env.HIVE_CLIQUE_PERIOD then clique_engine else ethash_engine end), - "genesis": { - "seal": { - "ethereum": { - "nonce": (.nonce|infix_zeros_to_length(2;18) // "0x0000000000000000"), - "mixHash": (.mixHash // "0x0000000000000000000000000000000000000000000000000000000000000000"), - }, - }, - "difficulty": .difficulty, - "author": .coinbase, - "timestamp": .timestamp, - "parentHash": .parentHash, - "extraData": .extraData, - "gasLimit": .gasLimit, - "baseFeePerGas": .baseFeePerGas, - }, - "params": { - # Tangerine Whistle - "eip150Transition": env.HIVE_FORK_TANGERINE|to_hex, - - # Spurious Dragon - "eip160Transition": env.HIVE_FORK_SPURIOUS|to_hex, - "eip161abcTransition": env.HIVE_FORK_SPURIOUS|to_hex, - "eip161dTransition": env.HIVE_FORK_SPURIOUS|to_hex, - "eip155Transition": env.HIVE_FORK_SPURIOUS|to_hex, - "maxCodeSizeTransition": env.HIVE_FORK_SPURIOUS|to_hex, - "maxCodeSize": "0x6000", - - # Byzantium - "eip140Transition": env.HIVE_FORK_BYZANTIUM|to_hex, - "eip211Transition": env.HIVE_FORK_BYZANTIUM|to_hex, - "eip214Transition": env.HIVE_FORK_BYZANTIUM|to_hex, - "eip658Transition": env.HIVE_FORK_BYZANTIUM|to_hex, - - # Constantinople - "eip145Transition": env.HIVE_FORK_CONSTANTINOPLE|to_hex, - "eip1014Transition": env.HIVE_FORK_CONSTANTINOPLE|to_hex, - "eip1052Transition": env.HIVE_FORK_CONSTANTINOPLE|to_hex, - - # Petersburg - "eip1283Transition": (if env.HIVE_FORK_ISTANBUL|to_hex == "0x0" then "0x0" else env.HIVE_FORK_CONSTANTINOPLE|to_hex end), - "eip1283DisableTransition": (if env.HIVE_FORK_ISTANBUL|to_hex == "0x0" then "0x0" else env.HIVE_FORK_PETERSBURG|to_hex end), - - # Istanbul - "eip1283ReenableTransition": env.HIVE_FORK_ISTANBUL|to_hex, - "eip1344Transition": env.HIVE_FORK_ISTANBUL|to_hex, - "eip1884Transition": env.HIVE_FORK_ISTANBUL|to_hex, - "eip2028Transition": env.HIVE_FORK_ISTANBUL|to_hex, - "eip1706Transition": env.HIVE_FORK_ISTANBUL|to_hex, - # "eip2200AdvanceTransition": env.HIVE_FORK_ISTANBUL|to_hex, - - # Berlin - "eip2929Transition": env.HIVE_FORK_BERLIN|to_hex, - "eip2930Transition": env.HIVE_FORK_BERLIN|to_hex, - - # London - "eip1559Transition": env.HIVE_FORK_LONDON|to_hex, - "eip3198Transition": env.HIVE_FORK_LONDON|to_hex, - "eip3541Transition": env.HIVE_FORK_LONDON|to_hex, - "eip3529Transition": env.HIVE_FORK_LONDON|to_hex, - "eip1559BaseFeeMaxChangeDenominator": "0x8", - "eip1559ElasticityMultiplier": "0x2", - "eip1559BaseFeeInitialValue": "0x3B9ACA00", - - # Other chain parameters. - "networkID": (env.HIVE_NETWORK_ID|to_hex // "0x539"), - "chainID": (env.HIVE_CHAIN_ID|to_hex // "0x539"), - "accountStartNonce": "0x0", - "maximumExtraDataSize": "0x20", - "minGasLimit": "0x0", - "gasLimitBoundDivisor": "0x400", - "registrar": "0x0000000000000000000000000000000000000000", - }, - "accounts": ((.alloc|with_entries(.key|="0x"+.)) * { - "0x0000000000000000000000000000000000000001": { - "builtin": { - "name": "ecrecover", - "pricing": {"linear": {"base": 3000, "word": 0}} - } - }, - "0x0000000000000000000000000000000000000002": { - "builtin": { - "name": "sha256", - "pricing": {"linear": {"base": 60, "word": 12}} - } - }, - "0x0000000000000000000000000000000000000003": { - "builtin": { - "name": "ripemd160", - "pricing": {"linear": {"base": 600, "word": 120}} - } - }, - "0x0000000000000000000000000000000000000004": { - "builtin": { - "name": "identity", - "pricing": {"linear": {"base": 15, "word": 3}} - } - }, - "0x0000000000000000000000000000000000000005": { - "builtin": { - "name": "modexp", - "pricing":{ - (env.HIVE_FORK_BYZANTIUM|to_hex // ""): { - "info": "EIP-198: Big integer modular exponentiation. Byzantium hardfork", - "price": {"modexp": {"divisor": 20}} - }, - (env.HIVE_FORK_BERLIN|to_hex // ""): { - "info": "EIP-2565: Big integer modular exponentiation. Berlin hardfork", - "price": {"modexp2565": {}} - } - } - } - }, - "0x0000000000000000000000000000000000000006": { - "builtin": { - "name": "alt_bn128_add", - "activate_at": (env.HIVE_FORK_BYZANTIUM|to_hex // "0x7fffffffffffff"), - "pricing": { - (env.HIVE_FORK_BYZANTIUM|to_hex // ""): { - "price": {"alt_bn128_const_operations": {"price": 500}} - }, - (env.HIVE_FORK_ISTANBUL|to_hex // ""): { - "price": {"alt_bn128_const_operations": {"price": 150}} - } - } - } - }, - "0x0000000000000000000000000000000000000007": { - "builtin": { - "name": "alt_bn128_mul", - "activate_at": (env.HIVE_FORK_BYZANTIUM|to_hex // "0x7fffffffffffff"), - "pricing": { - (env.HIVE_FORK_BYZANTIUM|to_hex // ""): { - "price": {"alt_bn128_const_operations": {"price": 40000}} - }, - (env.HIVE_FORK_ISTANBUL|to_hex // ""): { - "price": {"alt_bn128_const_operations": {"price": 6000}} - } - } - } - }, - "0x0000000000000000000000000000000000000008": { - "builtin": { - "name": "alt_bn128_pairing", - "activate_at": (env.HIVE_FORK_BYZANTIUM|to_hex // "0x7fffffffffffff"), - "pricing": { - (env.HIVE_FORK_BYZANTIUM|to_hex // ""): { - "price": {"alt_bn128_pairing": {"base": 100000, "pair": 80000}} - }, - (env.HIVE_FORK_ISTANBUL|to_hex // ""): { - "price": {"alt_bn128_pairing": {"base": 45000, "pair": 34000}} - } - } - } - }, - "0x0000000000000000000000000000000000000009": { - "builtin": { - "name": "blake2_f", - "activate_at": (env.HIVE_FORK_ISTANBUL|to_hex // "0x7fffffffffffff"), - "pricing": {"blake2_f": {"gas_per_round": 1}} - } - }, - }), -}|remove_empty diff --git a/clients/openethereum/openethereum.sh b/clients/openethereum/openethereum.sh deleted file mode 100644 index 8cba4709f3..0000000000 --- a/clients/openethereum/openethereum.sh +++ /dev/null @@ -1,152 +0,0 @@ -#!/bin/bash - -# Startup script to initialize and boot a parity instance. -# -# This script assumes the following files: -# - `openethereum` binary is located in the filesystem root -# - `genesis.json` file is located in the filesystem root (mandatory) -# - `chain.rlp` file is located in the filesystem root (optional) -# - `blocks` folder is located in the filesystem root (optional) -# - `keys` folder is located in the filesystem root (optional) -# -# This script assumes the following environment variables: -# -# - HIVE_BOOTNODE enode URL of the remote bootstrap node -# - HIVE_NETWORK_ID network ID number to use for the eth protocol -# - HIVE_CHAIN_ID network ID number to use for the eth protocol -# - HIVE_NODETYPE sync and pruning selector (archive, full, light) -# - HIVE_SKIP_POW if set, skip PoW verification during block import -# -# Forks: -# -# - HIVE_FORK_HOMESTEAD block number of the DAO hard-fork transition -# - HIVE_FORK_DAO_BLOCK block number of the DAO hard-fork transition -# - HIVE_FORK_TANGERINE block number of TangerineWhistle -# - HIVE_FORK_SPURIOUS block number of SpuriousDragon -# - HIVE_FORK_BYZANTIUM block number for Byzantium transition -# - HIVE_FORK_CONSTANTINOPLE block number for Constantinople transition -# - HIVE_FORK_PETERSBURG block number for ConstantinopleFix/PetersBurg transition -# - HIVE_FORK_BERLIN block number for Berlin transition -# -# Clique PoA: -# -# - HIVE_CLIQUE_PERIOD enables clique support. value is block time in seconds. -# - HIVE_CLIQUE_PRIVATEKEY private key for clique mining -# -# Other: -# -# - HIVE_MINER enables mining. value is coinbase address. -# - HIVE_MINER_EXTRA extra-data field to set for newly minted blocks -# - HIVE_SKIP_POW If set, skip PoW verification -# - HIVE_LOGLEVEL Client log level -# -# These variables are not supported by OpenEthereum: -# -# - HIVE_FORK_DAO_VOTE whether the node support (or opposes) the DAO fork -# - HIVE_GRAPHQL_ENABLED if set, GraphQL is enabled on port 8545 -# - HIVE_TESTNET whether testnet nonces (2^20) are needed - -# Immediately abort the script on any error encountered -set -e - -# Configure and set the chain definition for the node -jq -f /mapper.jq /genesis.json > /chain.json -echo -n "Chain spec: " -cat /chain.json -echo "----------" - -OE="/home/openethereum/openethereum" -FLAGS="--chain /chain.json" - -LOG=info -case "$HIVE_LOGLEVEL" in - 0|1) LOG=error ;; - 2) LOG=warn ;; - 3) LOG=info ;; - 4|5) LOG=debug ;; - # OpenEthereum trace logging is INSANE, that's why it's disabled here. - # 5) LOG=trace ;; -esac -FLAGS="$FLAGS -l $LOG" - -# Disable PoW for import if set. -if [ "$HIVE_SKIP_POW" != "" ]; then - FLAGS="$FLAGS --no-seal-check" -fi - -# If a specific network ID is requested, use that -if [ "$HIVE_NETWORK_ID" != "" ]; then - FLAGS="$FLAGS --network-id $HIVE_NETWORK_ID" -else - FLAGS="$FLAGS --network-id 1337" -fi - -# Don't immediately abort, some imports are meant to fail -set +e - -# Load the test chain if present -echo "Loading initial blockchain..." -if [ -f /chain.rlp ]; then - $OE $FLAGS import /chain.rlp -fi - -# Load the remainder of the test chain -echo "Loading remaining individual blocks..." -if [ -d /blocks ]; then - for block in `ls /blocks | sort -n`; do - echo "openethereum $FLAGS import /blocks/$block" - $OE $FLAGS import /blocks/$block - done -fi - -# Immediately abort the script on any error encountered -set -e - -# Configure p2p networking. -FLAGS="$FLAGS --nat none" -if [ "$HIVE_BOOTNODE" != "" ]; then - FLAGS="$FLAGS --bootnodes $HIVE_BOOTNODE" -fi - -# Import clique private key. -if [ "$HIVE_CLIQUE_PRIVATEKEY" != "" ]; then - echo "Importing clique private key..." - - # OpenEthereum does not support importing raw private keys directly. - # The private key needs to be turned into an encrypted keystore file first. - echo "$HIVE_CLIQUE_PRIVATEKEY" > /tmp/clique-key - echo "very secret" > /tmp/clique-key-password.txt - /ethkey generate --lightkdf --privatekey /tmp/clique-key --passwordfile /tmp/clique-key-password.txt /tmp/clique-key.json - - # Now we can import it. - $OE account import --chain /chain.json /tmp/clique-key.json - - # Set the password file flag so OE can decrypt the key later. - FLAGS="$FLAGS --password=/tmp/clique-key-password.txt" -fi - -# Configure mining. -if [ "$HIVE_MINER" != "" ]; then - if [ "$HIVE_CLIQUE_PERIOD" != "" ]; then - # Clique mining requested, set signer address. - FLAGS="$FLAGS --engine-signer $HIVE_MINER --force-sealing" - else - # PoW mining requested, run ethminer. - FLAGS="$FLAGS --author $HIVE_MINER" - ethminer --mining-threads 1 & - fi -fi -if [ "$HIVE_MINER_EXTRA" != "" ]; then - FLAGS="$FLAGS --extra-data $HIVE_MINER_EXTRA" -fi -FLAGS="$FLAGS --min-gas-price=16000000000" - -# Configure RPC. -FLAGS="$FLAGS --jsonrpc-interface all --jsonrpc-hosts all --jsonrpc-apis all --ws-origins all --ws-interface all" - -# Disable eth price lookup. -FLAGS="$FLAGS --usd-per-eth 1" - -# Run OpenEthereum! -echo "running $OE $FLAGS" -$OE $FLAGS diff --git a/docs/clients.md b/docs/clients.md index e7a3bc956b..61ef4e3dc7 100644 --- a/docs/clients.md +++ b/docs/clients.md @@ -98,8 +98,8 @@ container: On startup, the entry point script must first load the genesis block and state into the client implementation from `/genesis.json`. To do this, the script needs to translate from Geth genesis format into a format appropriate for the specific client implementation. The -translation is usually done using a jq script. See the [openethereum genesis -translator][oe-genesis-jq], for example. +translation is usually done using a jq script. See the [go-ethereum genesis +translator][geth-genesis-jq], for example. After the genesis state, the client should import the blocks from `/chain.rlp` if it is present, and finally import the individual blocks from `/blocks` in file name order. The @@ -165,7 +165,7 @@ For the server role, the following additional variables should be supported: [LES]: https://github.com/ethereum/devp2p/blob/master/caps/les.md [geth-docker]: ../clients/go-ethereum/Dockerfile [hive-client-yaml]: ./commandline.md#client-build-parameters -[oe-genesis-jq]: ../clients/openethereum/mapper.jq +[geth-genesis-jq]: ../clients/go-ethereum/mapper.jq [EIP-155]: https://eips.ethereum.org/EIPS/eip-155 [EIP-606]: https://eips.ethereum.org/EIPS/eip-606 [EIP-607]: https://eips.ethereum.org/EIPS/eip-607 diff --git a/docs/commandline.md b/docs/commandline.md index d19c6e31bd..61af913d24 100644 --- a/docs/commandline.md +++ b/docs/commandline.md @@ -29,10 +29,10 @@ simulation, use the following command: ./hive --sim --client -For example, if you want to run the `discv4` test against geth and openethereum, here is +For example, if you want to run the `discv4` test against geth, here is how the command would look: - ./hive --sim devp2p --sim.limit discv4 --client go-ethereum,openethereum + ./hive --sim devp2p --sim.limit discv4 --client go-ethereum,nethermind The client list may contain any number of clients. You can select a specific client version by appending it to the client name with `_`, for example: diff --git a/docs/overview.md b/docs/overview.md index 6548467fde..e4661fedef 100644 --- a/docs/overview.md +++ b/docs/overview.md @@ -71,7 +71,7 @@ This section explains what happens during a simulation run. For a single run, the user provides the name of the simulator to run, and a set of client names to run against. For example: - ./hive --sim ethereum/sync --client go-ethereum,besu,openethereum + ./hive --sim ethereum/sync --client go-ethereum,besu,nethermind Hive first builds simulator and client images using docker. It expects a Dockerfile in the `./simulators/ethereum/sync` directory as well as a Dockerfile for each client (in diff --git a/docs/simulators.md b/docs/simulators.md index 4c464312f0..7acdaa492c 100644 --- a/docs/simulators.md +++ b/docs/simulators.md @@ -179,7 +179,7 @@ You can test this build by running `docker build .` in the simulator directory. Finally, go back to the root of the repository (`cd ../../..`) and run the simulation. - ./hive --sim my-simulation --client go-ethereum,openethereum + ./hive --sim my-simulation --client go-ethereum,besu You can check the results using [hiveview]. diff --git a/test.sh b/test.sh index 10c785f28e..4364d10210 100644 --- a/test.sh +++ b/test.sh @@ -57,10 +57,8 @@ mkdir $RESULTS # Sync are quick tests # -# These three can succsessfully sync with themselves -#testsync openethereum_latest +# These can succsessfully sync with themselves #testsync go-ethereum_latest -testsync openethereum_latest,go-ethereum_latest # These two are failing - even against themselves testsync besu_latest # fails @@ -69,7 +67,6 @@ testsync nethermind_latest # fails #testsync besu_latest,nethermind_latest #testsync go-ethereum_latest go-ethereum_stable -#testsync go-ethereum_latest openethereum_latest #testsync go-ethereum_latest nethermind_latest #testsync go-ethereum_latest besu_latest @@ -84,12 +81,10 @@ testgraphql besu_latest #testdevp2p go-ethereum_latest #testdevp2p nethermind_latest #testdevp2p besu_latest -#testdevp2p openethereum_latest # These take an extremely long time to run #testconsensus go-ethereum_latest -#testconsensus openethereum_latest #testconsensus nethermind_latest #testconsensus besu_latest From aa37003ff2a2553a5bc5552eac78b9848b587666 Mon Sep 17 00:00:00 2001 From: spencer Date: Wed, 25 Oct 2023 07:44:46 -0600 Subject: [PATCH 084/387] simulators/ethereum/engine: update test names for distinction (#914) --- simulators/ethereum/engine/README.md | 6 +-- .../ethereum/engine/suites/cancun/tests.go | 44 +++++++++---------- .../ethereum/engine/suites/engine/bad_hash.go | 6 ++- .../ethereum/engine/suites/engine/fork_id.go | 10 +++-- .../engine/suites/engine/invalid_ancestor.go | 39 ++++++++-------- .../engine/suites/engine/invalid_payload.go | 20 ++++++--- .../suites/engine/payload_attributes.go | 6 ++- .../engine/suites/engine/payload_execution.go | 6 ++- .../engine/suites/engine/payload_id.go | 2 +- .../engine/suites/engine/prev_randao.go | 2 +- .../ethereum/engine/suites/engine/reorg.go | 20 +++++---- .../suites/engine/suggested_fee_recipient.go | 2 +- 12 files changed, 90 insertions(+), 73 deletions(-) diff --git a/simulators/ethereum/engine/README.md b/simulators/ethereum/engine/README.md index 6db893d6c7..7933a2917c 100644 --- a/simulators/ethereum/engine/README.md +++ b/simulators/ethereum/engine/README.md @@ -114,7 +114,7 @@ Send a NewPayload directive to the client including an incorrect BlockHash, shou - NewPayload while syncing, on canonical chain - NewPayload while syncing, on side chain -- ParentHash==BlockHash on NewPayload: +- ParentHash equals BlockHash on NewPayload: Send a NewPayload directive to the client including ParentHash that is equal to the BlockHash (Incorrect hash). - Invalid Transition Payload: @@ -176,10 +176,10 @@ Test that performing a re-org back into a previous block of the canonical chain Build an alternative chain of 10 payloads. Perform `newPayload(P10')` + `fcU(P10')`, which should result in client `SYNCING`. Verify that the client can re-org back to the canonical chain after sending `newPayload(P11)` + `fcU(P11)`. -- Import and re-org to previously validated payload on a side chain: +- Re-org to Previously Validated Sidechain Payload: Attempt to re-org to one of the sidechain (previously validated) payloads, but not the leaf, and also build a new payload from this sidechain. -- Safe Re-Org to Side Chain +- Safe Re-Org to Side Chain: Perform a re-org of the safe block (and head block) to a valid sidechain. ### Suggested Fee Recipient in Payload creation diff --git a/simulators/ethereum/engine/suites/cancun/tests.go b/simulators/ethereum/engine/suites/cancun/tests.go index 6fed388079..da272edc46 100644 --- a/simulators/ethereum/engine/suites/cancun/tests.go +++ b/simulators/ethereum/engine/suites/cancun/tests.go @@ -158,7 +158,7 @@ var Tests = []test.Spec{ &CancunBaseSpec{ BaseSpec: test.BaseSpec{ - Name: "Blob Transaction Ordering, Single Account", + Name: "Blob Transaction Ordering, Single Account, Single Blob", About: ` Send N blob transactions with cancun.MAX_BLOBS_PER_BLOCK-1 blobs each, using account A. @@ -203,7 +203,7 @@ var Tests = []test.Spec{ &CancunBaseSpec{ BaseSpec: test.BaseSpec{ - Name: "Blob Transaction Ordering, Single Account 2", + Name: "Blob Transaction Ordering, Single Account, Dual Blob", About: ` Send N blob transactions with cancun.MAX_BLOBS_PER_BLOCK-1 blobs each, using account A. @@ -1085,7 +1085,7 @@ var Tests = []test.Spec{ &CancunBaseSpec{ BaseSpec: test.BaseSpec{ - Name: "NewPayloadV3 Versioned Hashes, Missing Hash", + Name: "NewPayloadV3 Versioned Hashes, Missing Hash, Syncing=False", About: ` Tests VersionedHashes in Engine API NewPayloadV3 where the array is missing one of the hashes. @@ -1117,7 +1117,7 @@ var Tests = []test.Spec{ &CancunBaseSpec{ BaseSpec: test.BaseSpec{ - Name: "NewPayloadV3 Versioned Hashes, Extra Hash", + Name: "NewPayloadV3 Versioned Hashes, Extra Hash, Syncing=False", About: ` Tests VersionedHashes in Engine API NewPayloadV3 where the array is has an extra hash for a blob that is not in the payload. @@ -1151,7 +1151,7 @@ var Tests = []test.Spec{ &CancunBaseSpec{ BaseSpec: test.BaseSpec{ - Name: "NewPayloadV3 Versioned Hashes, Out of Order", + Name: "NewPayloadV3 Versioned Hashes, Out of Order, Syncing=False", About: ` Tests VersionedHashes in Engine API NewPayloadV3 where the array is out of order. @@ -1183,7 +1183,7 @@ var Tests = []test.Spec{ &CancunBaseSpec{ BaseSpec: test.BaseSpec{ - Name: "NewPayloadV3 Versioned Hashes, Repeated Hash", + Name: "NewPayloadV3 Versioned Hashes, Repeated Hash, Syncing=False", About: ` Tests VersionedHashes in Engine API NewPayloadV3 where the array has a blob that is repeated in the array. @@ -1215,7 +1215,7 @@ var Tests = []test.Spec{ &CancunBaseSpec{ BaseSpec: test.BaseSpec{ - Name: "NewPayloadV3 Versioned Hashes, Incorrect Hash", + Name: "NewPayloadV3 Versioned Hashes, Incorrect Hash, Syncing=False", About: ` Tests VersionedHashes in Engine API NewPayloadV3 where the array has a blob hash that does not belong to any blob contained in the payload. @@ -1246,7 +1246,7 @@ var Tests = []test.Spec{ }, &CancunBaseSpec{ BaseSpec: test.BaseSpec{ - Name: "NewPayloadV3 Versioned Hashes, Incorrect Version", + Name: "NewPayloadV3 Versioned Hashes, Incorrect Version, Syncing=False", About: ` Tests VersionedHashes in Engine API NewPayloadV3 where the array has a single blob that has an incorrect version. @@ -1279,7 +1279,7 @@ var Tests = []test.Spec{ &CancunBaseSpec{ BaseSpec: test.BaseSpec{ - Name: "NewPayloadV3 Versioned Hashes, Nil Hashes", + Name: "NewPayloadV3 Versioned Hashes, Nil Hashes, Syncing=False", About: ` Tests VersionedHashes in Engine API NewPayloadV3 where the array is nil, even though the fork has already happened. @@ -1311,7 +1311,7 @@ var Tests = []test.Spec{ &CancunBaseSpec{ BaseSpec: test.BaseSpec{ - Name: "NewPayloadV3 Versioned Hashes, Empty Hashes", + Name: "NewPayloadV3 Versioned Hashes, Empty Hashes, Syncing=False", About: ` Tests VersionedHashes in Engine API NewPayloadV3 where the array is empty, even though there are blobs in the payload. @@ -1343,7 +1343,7 @@ var Tests = []test.Spec{ &CancunBaseSpec{ BaseSpec: test.BaseSpec{ - Name: "NewPayloadV3 Versioned Hashes, Non-Empty Hashes", + Name: "NewPayloadV3 Versioned Hashes, Non-Empty Hashes, Syncing=False", About: ` Tests VersionedHashes in Engine API NewPayloadV3 where the array is contains hashes, even though there are no blobs in the payload. @@ -1372,7 +1372,7 @@ var Tests = []test.Spec{ &CancunBaseSpec{ BaseSpec: test.BaseSpec{ - Name: "NewPayloadV3 Versioned Hashes, Missing Hash (Syncing)", + Name: "NewPayloadV3 Versioned Hashes, Missing Hash, Syncing=True", About: ` Tests VersionedHashes in Engine API NewPayloadV3 where the array is missing one of the hashes. @@ -1411,7 +1411,7 @@ var Tests = []test.Spec{ &CancunBaseSpec{ BaseSpec: test.BaseSpec{ - Name: "NewPayloadV3 Versioned Hashes, Extra Hash (Syncing)", + Name: "NewPayloadV3 Versioned Hashes, Extra Hash, Syncing=True", About: ` Tests VersionedHashes in Engine API NewPayloadV3 where the array is has an extra hash for a blob that is not in the payload. @@ -1452,7 +1452,7 @@ var Tests = []test.Spec{ &CancunBaseSpec{ BaseSpec: test.BaseSpec{ - Name: "NewPayloadV3 Versioned Hashes, Out of Order (Syncing)", + Name: "NewPayloadV3 Versioned Hashes, Out of Order, Syncing=True", About: ` Tests VersionedHashes in Engine API NewPayloadV3 where the array is out of order. @@ -1490,7 +1490,7 @@ var Tests = []test.Spec{ &CancunBaseSpec{ BaseSpec: test.BaseSpec{ - Name: "NewPayloadV3 Versioned Hashes, Repeated Hash (Syncing)", + Name: "NewPayloadV3 Versioned Hashes, Repeated Hash, Syncing=True", About: ` Tests VersionedHashes in Engine API NewPayloadV3 where the array has a blob that is repeated in the array. @@ -1529,7 +1529,7 @@ var Tests = []test.Spec{ &CancunBaseSpec{ BaseSpec: test.BaseSpec{ - Name: "NewPayloadV3 Versioned Hashes, Incorrect Hash (Syncing)", + Name: "NewPayloadV3 Versioned Hashes, Incorrect Hash, Syncing=True", About: ` Tests VersionedHashes in Engine API NewPayloadV3 where the array has a blob that is repeated in the array. @@ -1567,7 +1567,7 @@ var Tests = []test.Spec{ }, &CancunBaseSpec{ BaseSpec: test.BaseSpec{ - Name: "NewPayloadV3 Versioned Hashes, Incorrect Version (Syncing)", + Name: "NewPayloadV3 Versioned Hashes, Incorrect Version, Syncing=True", About: ` Tests VersionedHashes in Engine API NewPayloadV3 where the array has a single blob that has an incorrect version. @@ -1607,7 +1607,7 @@ var Tests = []test.Spec{ &CancunBaseSpec{ BaseSpec: test.BaseSpec{ - Name: "NewPayloadV3 Versioned Hashes, Nil Hashes (Syncing)", + Name: "NewPayloadV3 Versioned Hashes, Nil Hashes, Syncing=True", About: ` Tests VersionedHashes in Engine API NewPayloadV3 where the array is nil, even though the fork has already happened. @@ -1646,7 +1646,7 @@ var Tests = []test.Spec{ &CancunBaseSpec{ BaseSpec: test.BaseSpec{ - Name: "NewPayloadV3 Versioned Hashes, Empty Hashes (Syncing)", + Name: "NewPayloadV3 Versioned Hashes, Empty Hashes, Syncing=True", About: ` Tests VersionedHashes in Engine API NewPayloadV3 where the array is empty, even though there are blobs in the payload. @@ -1685,7 +1685,7 @@ var Tests = []test.Spec{ &CancunBaseSpec{ BaseSpec: test.BaseSpec{ - Name: "NewPayloadV3 Versioned Hashes, Non-Empty Hashes (Syncing)", + Name: "NewPayloadV3 Versioned Hashes, Non-Empty Hashes, Syncing=True", About: ` Tests VersionedHashes in Engine API NewPayloadV3 where the array is contains hashes, even though there are no blobs in the payload. @@ -1722,7 +1722,7 @@ var Tests = []test.Spec{ // and can be executed using `pyspec` simulator. &CancunBaseSpec{ BaseSpec: test.BaseSpec{ - Name: "Incorrect BlobGasUsed: Non-Zero on Zero Blobs", + Name: "Incorrect BlobGasUsed, Non-Zero on Zero Blobs", About: ` Send a payload with zero blobs, but non-zero BlobGasUsed. `, @@ -1742,7 +1742,7 @@ var Tests = []test.Spec{ &CancunBaseSpec{ BaseSpec: test.BaseSpec{ - Name: "Incorrect BlobGasUsed: GAS_PER_BLOB on Zero Blobs", + Name: "Incorrect BlobGasUsed, GAS_PER_BLOB on Zero Blobs", About: ` Send a payload with zero blobs, but non-zero BlobGasUsed. `, diff --git a/simulators/ethereum/engine/suites/engine/bad_hash.go b/simulators/ethereum/engine/suites/engine/bad_hash.go index a9a2008996..f484843cf8 100644 --- a/simulators/ethereum/engine/suites/engine/bad_hash.go +++ b/simulators/ethereum/engine/suites/engine/bad_hash.go @@ -152,9 +152,11 @@ func (s ParentHashOnNewPayload) WithMainFork(fork config.Fork) test.Spec { } func (p ParentHashOnNewPayload) GetName() string { - name := "ParentHash==BlockHash on NewPayload" + name := "ParentHash equals BlockHash on NewPayload," if p.Syncing { - name += " (Syncing)" + name += " Syncing=True" + } else { + name += " Syncing=False" } return name } diff --git a/simulators/ethereum/engine/suites/engine/fork_id.go b/simulators/ethereum/engine/suites/engine/fork_id.go index d862c22064..1606caf9a4 100644 --- a/simulators/ethereum/engine/suites/engine/fork_id.go +++ b/simulators/ethereum/engine/suites/engine/fork_id.go @@ -2,6 +2,7 @@ package suite_engine import ( "fmt" + "strings" "time" "github.com/ethereum/hive/simulators/ethereum/engine/clmock" @@ -22,14 +23,15 @@ func (s ForkIDSpec) WithMainFork(fork config.Fork) test.Spec { } func (ft ForkIDSpec) GetName() string { - name := fmt.Sprintf("Fork ID: Genesis at %d, %s at %d", ft.GetGenesisTimestamp(), ft.MainFork, ft.ForkTime) + var name []string + name = append(name, fmt.Sprintf("Fork ID: Genesis=%d, %s=%d", ft.GetGenesisTimestamp(), ft.MainFork, ft.ForkTime)) if ft.PreviousForkTime != 0 { - name += fmt.Sprintf(", %s at %d", ft.MainFork.PreviousFork(), ft.PreviousForkTime) + name = append(name, fmt.Sprintf("%s=%d", ft.MainFork.PreviousFork(), ft.PreviousForkTime)) } if ft.ProduceBlocksBeforePeering > 0 { - name += fmt.Sprintf(", Produce %d blocks before peering", ft.ProduceBlocksBeforePeering) + name = append(name, fmt.Sprintf("BlocksBeforePeering=%d", ft.ProduceBlocksBeforePeering)) } - return name + return strings.Join(name, ", ") } func (ft ForkIDSpec) Execute(t *test.Env) { diff --git a/simulators/ethereum/engine/suites/engine/invalid_ancestor.go b/simulators/ethereum/engine/suites/engine/invalid_ancestor.go index fa8eb46cae..ca39d251d7 100644 --- a/simulators/ethereum/engine/suites/engine/invalid_ancestor.go +++ b/simulators/ethereum/engine/suites/engine/invalid_ancestor.go @@ -5,7 +5,6 @@ import ( "encoding/json" "fmt" "math/big" - "strings" "time" api "github.com/ethereum/go-ethereum/beacon/engine" @@ -40,16 +39,16 @@ func (s InvalidMissingAncestorReOrgTest) WithMainFork(fork config.Fork) test.Spe } func (tc InvalidMissingAncestorReOrgTest) GetName() string { - name := []string{ - "Invalid Missing Ancestor ReOrg", - fmt.Sprintf("Invalid %s", tc.InvalidField), - } + emptyTxsStatus := "False" if tc.EmptyTransactions { - name = append(name, "Empty Txs") + emptyTxsStatus = "True" } - name = append(name, fmt.Sprintf("Invalid P%d'", tc.InvalidIndex)) - - return strings.Join(name, ", ") + return fmt.Sprintf( + "Invalid Missing Ancestor ReOrg, %s, EmptyTxs=%s, Invalid P%d", + tc.InvalidField, + emptyTxsStatus, + tc.InvalidIndex, + ) } func (tc InvalidMissingAncestorReOrgTest) Execute(t *test.Env) { @@ -207,21 +206,21 @@ func (s InvalidMissingAncestorReOrgSyncTest) WithMainFork(fork config.Fork) test } func (tc InvalidMissingAncestorReOrgSyncTest) GetName() string { - name := []string{ - "Invalid Missing Ancestor ReOrg", - fmt.Sprintf("Invalid %s", tc.InvalidField), - } + emptyTxsStatus := "False" if tc.EmptyTransactions { - name = append(name, "Empty Txs") + emptyTxsStatus = "True" } - name = append(name, - fmt.Sprintf("Invalid P%d'", tc.InvalidIndex), - "Reveal using sync", - ) + canonicalReOrgStatus := "False" if tc.ReOrgFromCanonical { - name = append(name, "ReOrg from Canonical") + canonicalReOrgStatus = "True" } - return strings.Join(name, ", ") + return fmt.Sprintf( + "Invalid Missing Ancestor Syncing ReOrg, %s, EmptyTxs=%s, CanonicalReOrg=%s, Invalid P%d", + tc.InvalidField, + emptyTxsStatus, + canonicalReOrgStatus, + tc.InvalidIndex, + ) } func (tc InvalidMissingAncestorReOrgSyncTest) Execute(t *test.Env) { diff --git a/simulators/ethereum/engine/suites/engine/invalid_payload.go b/simulators/ethereum/engine/suites/engine/invalid_payload.go index 3277f664c2..d38856eee3 100644 --- a/simulators/ethereum/engine/suites/engine/invalid_payload.go +++ b/simulators/ethereum/engine/suites/engine/invalid_payload.go @@ -42,17 +42,25 @@ func (s InvalidPayloadTestCase) WithMainFork(fork config.Fork) test.Spec { } func (i InvalidPayloadTestCase) GetName() string { - name := fmt.Sprintf("Invalid %s NewPayload", i.InvalidField) + syncStatus := "False" if i.Syncing { - name += " - Syncing" + syncStatus = "True" } + emptyTxsStatus := "False" if i.EmptyTransactions { - name += " - Empty Transactions" + emptyTxsStatus = "True" } + dynFeeTxsStatus := "False" if i.BaseSpec.TestTransactionType == helper.DynamicFeeTxOnly { - name += fmt.Sprintf(" - %s", i.BaseSpec.TestTransactionType) + dynFeeTxsStatus = "True" } - return name + return fmt.Sprintf( + "Invalid NewPayload, %s, Syncing=%s, EmptyTxs=%s, DynFeeTxs=%s", + i.InvalidField, + syncStatus, + emptyTxsStatus, + dynFeeTxsStatus, + ) } func (tc InvalidPayloadTestCase) Execute(t *test.Env) { @@ -400,7 +408,7 @@ func (s InvalidTxChainIDTest) WithMainFork(fork config.Fork) test.Spec { } func (s InvalidTxChainIDTest) GetName() string { - name := fmt.Sprintf("Build Payload with Invalid ChainID Transaction (%s)", s.TestTransactionType) + name := fmt.Sprintf("Build Payload with Invalid ChainID Transaction, %s", s.TestTransactionType) return name } diff --git a/simulators/ethereum/engine/suites/engine/payload_attributes.go b/simulators/ethereum/engine/suites/engine/payload_attributes.go index 4ab3f15099..9bbdeedb35 100644 --- a/simulators/ethereum/engine/suites/engine/payload_attributes.go +++ b/simulators/ethereum/engine/suites/engine/payload_attributes.go @@ -25,9 +25,11 @@ func (s InvalidPayloadAttributesTest) WithMainFork(fork config.Fork) test.Spec { } func (tc InvalidPayloadAttributesTest) GetName() string { - name := fmt.Sprintf("Invalid PayloadAttributes: %s", tc.Description) + name := fmt.Sprintf("Invalid PayloadAttributes, %s,", tc.Description) if tc.Syncing { - name += " (Syncing)" + name += " Syncing=True" + } else { + name += " Syncing=False" } return name } diff --git a/simulators/ethereum/engine/suites/engine/payload_execution.go b/simulators/ethereum/engine/suites/engine/payload_execution.go index 466eb31771..e01995aaea 100644 --- a/simulators/ethereum/engine/suites/engine/payload_execution.go +++ b/simulators/ethereum/engine/suites/engine/payload_execution.go @@ -222,9 +222,11 @@ func (s MultiplePayloadsExtendingCanonicalChainTest) WithMainFork(fork config.Fo } func (s MultiplePayloadsExtendingCanonicalChainTest) GetName() string { - name := "Multiple New Payloads Extending Canonical Chain" + name := "Multiple New Payloads Extending Canonical Chain," if s.SetHeadToFirstPayloadReceived { - name += " (FcU to first payload received)" + name += " Set Head to First Payload Received" + } else { + name += " Wait for Canonical Payload" } return name } diff --git a/simulators/ethereum/engine/suites/engine/payload_id.go b/simulators/ethereum/engine/suites/engine/payload_id.go index 4e696a9e4c..e2afe766bc 100644 --- a/simulators/ethereum/engine/suites/engine/payload_id.go +++ b/simulators/ethereum/engine/suites/engine/payload_id.go @@ -36,7 +36,7 @@ func (s UniquePayloadIDTest) WithMainFork(fork config.Fork) test.Spec { } func (tc UniquePayloadIDTest) GetName() string { - return fmt.Sprintf("Unique Payload ID - %s", tc.FieldModification) + return fmt.Sprintf("Unique Payload ID, %s", tc.FieldModification) } // Check that the payload id returned on a forkchoiceUpdated call is different diff --git a/simulators/ethereum/engine/suites/engine/prev_randao.go b/simulators/ethereum/engine/suites/engine/prev_randao.go index 0faa404501..6b6906f01d 100644 --- a/simulators/ethereum/engine/suites/engine/prev_randao.go +++ b/simulators/ethereum/engine/suites/engine/prev_randao.go @@ -25,7 +25,7 @@ func (s PrevRandaoTransactionTest) WithMainFork(fork config.Fork) test.Spec { } func (t PrevRandaoTransactionTest) GetName() string { - return fmt.Sprintf("PrevRandao Opcode Transactions Test (%s)", t.TestTransactionType) + return fmt.Sprintf("PrevRandao Opcode Transactions Test, %s", t.TestTransactionType) } func (tc PrevRandaoTransactionTest) Execute(t *test.Env) { diff --git a/simulators/ethereum/engine/suites/engine/reorg.go b/simulators/ethereum/engine/suites/engine/reorg.go index 57813e25be..5e45f8dcff 100644 --- a/simulators/ethereum/engine/suites/engine/reorg.go +++ b/simulators/ethereum/engine/suites/engine/reorg.go @@ -130,17 +130,19 @@ func (s TransactionReOrgTest) WithMainFork(fork config.Fork) test.Spec { } func (s TransactionReOrgTest) GetName() string { - name := "Transaction Re-Org" - if s.ReorgOut { - name += ", Re-Org Out" - } + reOrgType := "Out Of Block" if s.ReorgDifferentBlock { - name += ", Re-Org to Different Block" + reOrgType = "To Different Block" } + payloadOnRevertStatus := "False" if s.NewPayloadOnRevert { - name += ", New Payload on Revert Back" + payloadOnRevertStatus = "True" } - return name + return fmt.Sprintf( + "Transaction ReOrg %s, NewPayloadOnRevert=%s", + reOrgType, + payloadOnRevertStatus, + ) } // Test transaction status after a forkchoiceUpdated re-orgs to an alternative hash where a transaction is not present @@ -323,7 +325,7 @@ func (s ReOrgBackToCanonicalTest) WithMainFork(fork config.Fork) test.Spec { } func (s ReOrgBackToCanonicalTest) GetName() string { - name := fmt.Sprintf("Re-Org Back into Canonical Chain (Depth: %d)", s.ReOrgDepth) + name := fmt.Sprintf("Re-Org Back into Canonical Chain, Depth=%d", s.ReOrgDepth) if s.ExecuteSidePayloadOnReOrg { name += ", Execute Side Payload on Re-Org" @@ -544,7 +546,7 @@ func (s ReOrgPrevValidatedPayloadOnSideChainTest) WithMainFork(fork config.Fork) } func (s ReOrgPrevValidatedPayloadOnSideChainTest) GetName() string { - name := "Import and re-org to previously validated payload on a side chain" + name := "Re-org to Previously Validated Sidechain Payload" return name } diff --git a/simulators/ethereum/engine/suites/engine/suggested_fee_recipient.go b/simulators/ethereum/engine/suites/engine/suggested_fee_recipient.go index 4ef344395f..9b8c834b8f 100644 --- a/simulators/ethereum/engine/suites/engine/suggested_fee_recipient.go +++ b/simulators/ethereum/engine/suites/engine/suggested_fee_recipient.go @@ -26,7 +26,7 @@ func (s SuggestedFeeRecipientTest) WithMainFork(fork config.Fork) test.Spec { } func (t SuggestedFeeRecipientTest) GetName() string { - return fmt.Sprintf("Suggested Fee Recipient Test (%s)", t.TestTransactionType) + return fmt.Sprintf("Suggested Fee Recipient Test, %s", t.TestTransactionType) } func (tc SuggestedFeeRecipientTest) Execute(t *test.Env) { From 0b8343e6e1d09b3a3ec6203dd351a0a16b029a64 Mon Sep 17 00:00:00 2001 From: vuittont60 <81072379+vuittont60@users.noreply.github.com> Date: Thu, 26 Oct 2023 18:51:50 +0800 Subject: [PATCH 085/387] simulators: fix typos in comments (#933) --- clients/besu/besu.sh | 2 +- simulators/ethereum/consensus/main.go | 2 +- simulators/ethereum/pyspec/README.md | 2 +- simulators/ethereum/pyspec/main.go | 2 +- simulators/ethereum/pyspec/runner.go | 20 ++++++++++---------- 5 files changed, 14 insertions(+), 14 deletions(-) diff --git a/clients/besu/besu.sh b/clients/besu/besu.sh index 28f46f3d59..c169fceee1 100644 --- a/clients/besu/besu.sh +++ b/clients/besu/besu.sh @@ -163,7 +163,7 @@ if [ "$HIVE_TERMINAL_TOTAL_DIFFICULTY" != "" ]; then RPCFLAGS="$RPCFLAGS --engine-host-allowlist=* --engine-jwt-enabled --engine-jwt-secret /jwtsecret" fi -# Enable KZG trusted setup if cancun timestamp is set, needed for custom genesis on Besu wtih Cancun +# Enable KZG trusted setup if cancun timestamp is set, needed for custom genesis on Besu with Cancun if [ "$HIVE_CANCUN_TIMESTAMP" != "" ]; then FLAGS="$FLAGS --kzg-trusted-setup=/trusted_setup.txt" fi diff --git a/simulators/ethereum/consensus/main.go b/simulators/ethereum/consensus/main.go index fca0e5ab9f..b68ddda3fa 100644 --- a/simulators/ethereum/consensus/main.go +++ b/simulators/ethereum/consensus/main.go @@ -331,7 +331,7 @@ func main() { suite := hivesim.Suite{ Name: "consensus", Description: "The 'consensus' test suite executes BlockchainTests from the " + - "offical test repository (https://github.com/ethereum/tests). For every test, it starts an instance of the client, " + + "official test repository (https://github.com/ethereum/tests). For every test, it starts an instance of the client, " + "and makes it import the RLP blocks. After import phase, the node is queried about it's latest blocks, which is matched " + "to the expected last blockhash according to the test.", } diff --git a/simulators/ethereum/pyspec/README.md b/simulators/ethereum/pyspec/README.md index 20b358cb49..9310c3991e 100644 --- a/simulators/ethereum/pyspec/README.md +++ b/simulators/ethereum/pyspec/README.md @@ -19,7 +19,7 @@ By default all test fixtures will run. To run a specific test or set of test fix This can utilised in `pyspec` for running tests exclusive to a specific fork. The pattern must match at least one hive simulation test name within the `pyspec` suite. -Test names are of the type `_` omiting `fixtures` from the path. For example, the fixture test `000_push0_key_sstore_shanghai` within `push0.json` will have a hive test name of: `eips_eip3855_000_push0_key_sstore_shanghai`. +Test names are of the type `_` omitting `fixtures` from the path. For example, the fixture test `000_push0_key_sstore_shanghai` within `push0.json` will have a hive test name of: `eips_eip3855_000_push0_key_sstore_shanghai`. 1) To run only this test, an example pattern could be: - `./hive --sim ethereum/pyspec --sim.limit /0_push0_key_sstore` diff --git a/simulators/ethereum/pyspec/main.go b/simulators/ethereum/pyspec/main.go index 545f2bc210..e725efb987 100644 --- a/simulators/ethereum/pyspec/main.go +++ b/simulators/ethereum/pyspec/main.go @@ -22,7 +22,7 @@ func main() { Name: "pyspec", Description: "The pyspec test suite runs every fixture from " + "the execution-spec-tests repo (https://github.com/ethereum/execution-spec-tests) where the fork >= Merge. " + - "For each test clients are first fed the fixture genesis data followed by engine new payloads specfic to the test.", + "For each test clients are first fed the fixture genesis data followed by engine new payloads specific to the test.", } suite.Add(hivesim.TestSpec{ Name: "pytest_fixture_runner", diff --git a/simulators/ethereum/pyspec/runner.go b/simulators/ethereum/pyspec/runner.go index 4c6d7a9a19..275ff1312b 100644 --- a/simulators/ethereum/pyspec/runner.go +++ b/simulators/ethereum/pyspec/runner.go @@ -79,7 +79,7 @@ func loadFixtureTests(t *hivesim.T, root string, re *regexp.Regexp, fn func(test // run executes a testcase against the client, called within a test channel from // fixtureRunner, all testcase payloads are sent and executed using the EngineAPI. for // verification all fixture nonce, balance and storage values are checked against the -// response recieved from the lastest block. +// response received from the lastest block. func (tc *testcase) run(t *hivesim.T) { start := time.Now() @@ -178,15 +178,15 @@ func (tc *testcase) run(t *hivesim.T) { } // check final nonce & balance matches expected in fixture if genesisAccount.Nonce != gotNonce { - tc.failedErr = errors.New("nonce recieved doesn't match expected from fixture") - t.Errorf(`nonce recieved from account %v doesn't match expected from fixture in test %s: - recieved from block: %v + tc.failedErr = errors.New("nonce received doesn't match expected from fixture") + t.Errorf(`nonce received from account %v doesn't match expected from fixture in test %s: + received from block: %v expected in fixture: %v`, account, tc.name, gotNonce, genesisAccount.Nonce) } if genesisAccount.Balance.Cmp(gotBalance) != 0 { - tc.failedErr = errors.New("balance recieved doesn't match expected from fixture") - t.Errorf(`balance recieved from account %v doesn't match expected from fixture in test %s: - recieved from block: %v + tc.failedErr = errors.New("balance received doesn't match expected from fixture") + t.Errorf(`balance received from account %v doesn't match expected from fixture in test %s: + received from block: %v expected in fixture: %v`, account, tc.name, gotBalance, genesisAccount.Balance) } // check final storage @@ -205,9 +205,9 @@ func (tc *testcase) run(t *hivesim.T) { // check values in storage match with fixture for _, key := range keys { if genesisAccount.Storage[key] != *gotStorage[key] { - tc.failedErr = errors.New("storage recieved doesn't match expected from fixture") - t.Errorf(`storage recieved from account %v doesn't match expected from fixture in test %s: from storage address: %v - recieved from block: %v + tc.failedErr = errors.New("storage received doesn't match expected from fixture") + t.Errorf(`storage received from account %v doesn't match expected from fixture in test %s: from storage address: %v + received from block: %v expected in fixture: %v`, account, tc.name, key, gotStorage[key], genesisAccount.Storage[key]) } } From 82e8954851fd240ed93dead4247aef530c84bf81 Mon Sep 17 00:00:00 2001 From: Mario Vega Date: Thu, 26 Oct 2023 12:39:56 -0600 Subject: [PATCH 086/387] simulators/ethereum/engine: Add test to re-org to mempool and back in (#900) simulators/ethereum/engine: Add re-org to mempool and back intest --- .../ethereum/engine/suites/engine/reorg.go | 296 ++++++++++++------ .../ethereum/engine/suites/engine/tests.go | 10 +- 2 files changed, 204 insertions(+), 102 deletions(-) diff --git a/simulators/ethereum/engine/suites/engine/reorg.go b/simulators/ethereum/engine/suites/engine/reorg.go index 5e45f8dcff..a36f296b95 100644 --- a/simulators/ethereum/engine/suites/engine/reorg.go +++ b/simulators/ethereum/engine/suites/engine/reorg.go @@ -116,11 +116,19 @@ func (spec SidechainReOrgTest) Execute(t *test.Env) { } // Test performing a re-org that involves removing or modifying a transaction +type TransactionReOrgScenario string + +const ( + TransactionReOrgScenarioReOrgOut TransactionReOrgScenario = "Re-Org Out" + TransactionReOrgScenarioReOrgBackIn TransactionReOrgScenario = "Re-Org Back In" + TransactionReOrgScenarioReOrgDifferentBlock TransactionReOrgScenario = "Re-Org to Different Block" + TransactionReOrgScenarioNewPayloadOnRevert TransactionReOrgScenario = "New Payload on Revert Back" +) + type TransactionReOrgTest struct { test.BaseSpec - ReorgOut bool - ReorgDifferentBlock bool - NewPayloadOnRevert bool + TransactionCount int + Scenario TransactionReOrgScenario } func (s TransactionReOrgTest) WithMainFork(fork config.Fork) test.Spec { @@ -130,19 +138,11 @@ func (s TransactionReOrgTest) WithMainFork(fork config.Fork) test.Spec { } func (s TransactionReOrgTest) GetName() string { - reOrgType := "Out Of Block" - if s.ReorgDifferentBlock { - reOrgType = "To Different Block" + name := "Transaction Re-Org" + if s.Scenario != "" { + name = fmt.Sprintf("%s, %s", name, s.Scenario) } - payloadOnRevertStatus := "False" - if s.NewPayloadOnRevert { - payloadOnRevertStatus = "True" - } - return fmt.Sprintf( - "Transaction ReOrg %s, NewPayloadOnRevert=%s", - reOrgType, - payloadOnRevertStatus, - ) + return name } // Test transaction status after a forkchoiceUpdated re-orgs to an alternative hash where a transaction is not present @@ -155,20 +155,48 @@ func (spec TransactionReOrgTest) Execute(t *test.Env) { // Create transactions that modify the state in order to check after the reorg. var ( - txCount = 5 + err error + txCount = spec.TransactionCount sstoreContractAddr = common.HexToAddress("0000000000000000000000000000000000000317") ) - for i := 0; i < txCount; i++ { - var ( - altPayload *typ.ExecutableData - tx typ.Transaction + if txCount == 0 { + // Default is to send 5 transactions + txCount = 5 + } + + // Send a transaction on each payload of the canonical chain + sendTransaction := func(i int) (typ.Transaction, error) { + data := common.LeftPadBytes([]byte{byte(i)}, 32) + t.Logf("transactionReorg, i=%v, data=%v\n", i, data) + return t.SendNextTransaction( + t.TestContext, + t.Engine, + &helper.BaseTransactionCreator{ + Recipient: &sstoreContractAddr, + Amount: big0, + Payload: data, + TxType: t.TestTransactionType, + GasLimit: 75000, + ForkConfig: t.ForkConfig, + }, ) + + } + + var ( + altPayload *typ.ExecutableData + nextTx typ.Transaction + tx typ.Transaction + ) + + for i := 0; i < txCount; i++ { + // Generate two payloads, one with the transaction and the other one without it t.CLMock.ProduceSingleBlock(clmock.BlockProcessCallbacks{ OnPayloadAttributesGenerated: func() { // At this point we have not broadcast the transaction. - if spec.ReorgOut { + if spec.Scenario == TransactionReOrgScenarioReOrgOut { // Any payload we get should not contain any payloadAttributes := t.CLMock.LatestPayloadAttributes rand.Read(payloadAttributes.Random[:]) @@ -186,41 +214,33 @@ func (spec TransactionReOrgTest) Execute(t *test.Env) { } } - // At this point we can broadcast the transaction and it will be included in the next payload - // Data is the key where a `1` will be stored - data := common.LeftPadBytes([]byte{byte(i)}, 32) - t.Logf("transactionReorg, i=%v, data=%v\n", i, data) - var err error - tx, err = t.SendNextTransaction( - t.TestContext, - t.Engine, - &helper.BaseTransactionCreator{ - Recipient: &sstoreContractAddr, - Amount: big0, - Payload: data, - TxType: t.TestTransactionType, - GasLimit: 75000, - ForkConfig: t.ForkConfig, - }, - ) - if err != nil { - t.Fatalf("FAIL (%s): Error trying to send transaction: %v", t.TestName, err) - } + if spec.Scenario != TransactionReOrgScenarioReOrgBackIn { + // At this point we can broadcast the transaction and it will be included in the next payload + // Data is the key where a `1` will be stored + tx, err = sendTransaction(i) + if err != nil { + t.Fatalf("FAIL (%s): Error trying to send transaction: %v", t.TestName, err) + } - // Get the receipt - ctx, cancel := context.WithTimeout(t.TestContext, globals.RPCTimeout) - defer cancel() - receipt, _ := t.Eth.TransactionReceipt(ctx, tx.Hash()) - if receipt != nil { - t.Fatalf("FAIL (%s): Receipt obtained before tx included in block: %v", t.TestName, receipt) + // Get the receipt + ctx, cancel := context.WithTimeout(t.TestContext, globals.RPCTimeout) + defer cancel() + receipt, _ := t.Eth.TransactionReceipt(ctx, tx.Hash()) + if receipt != nil { + t.Fatalf("FAIL (%s): Receipt obtained before tx included in block: %v", t.TestName, receipt) + } } + }, OnGetPayload: func() { // Check that indeed the payload contains the transaction - if !helper.TransactionInPayload(&t.CLMock.LatestPayloadBuilt, tx) { - t.Fatalf("FAIL (%s): Payload built does not contain the transaction: %v", t.TestName, t.CLMock.LatestPayloadBuilt) + if tx != nil { + if !helper.TransactionInPayload(&t.CLMock.LatestPayloadBuilt, tx) { + t.Fatalf("FAIL (%s): Payload built does not contain the transaction: %v", t.TestName, t.CLMock.LatestPayloadBuilt) + } } - if spec.ReorgDifferentBlock { + + if spec.Scenario == TransactionReOrgScenarioReOrgDifferentBlock || spec.Scenario == TransactionReOrgScenarioNewPayloadOnRevert { // Create side payload with different hash var err error customizer := &helper.CustomPayloadData{ @@ -237,68 +257,148 @@ func (spec TransactionReOrgTest) Execute(t *test.Env) { if altPayload.BlockHash == t.CLMock.LatestPayloadBuilt.BlockHash { t.Fatalf("FAIL (%s): Incorrect hash for payloads: %v == %v", t.TestName, altPayload.BlockHash, t.CLMock.LatestPayloadBuilt.BlockHash) } + } else if spec.Scenario == TransactionReOrgScenarioReOrgBackIn { + // At this point we broadcast the transaction and request a new payload from the client that must + // contain the transaction. + // Since we are re-orging out and back in on the next block, the verification of this transaction + // being included happens on the next block + nextTx, err = sendTransaction(i) + if err != nil { + t.Fatalf("FAIL (%s): Error trying to send transaction: %v", t.TestName, err) + } + + if i == 0 { + // We actually can only do this once because the transaction carries over and we cannot + // impede it from being included in the next payload + forkchoiceUpdated := t.CLMock.LatestForkchoice + payloadAttributes := t.CLMock.LatestPayloadAttributes + rand.Read(payloadAttributes.SuggestedFeeRecipient[:]) + f := t.TestEngine.TestEngineForkchoiceUpdated( + &forkchoiceUpdated, + &payloadAttributes, + t.CLMock.LatestHeader.Time, + ) + f.ExpectPayloadStatus(test.Valid) + + // Wait a second for the client to prepare the payload with the included transaction + + time.Sleep(t.CLMock.PayloadProductionClientDelay) + + g := t.TestEngine.TestEngineGetPayload(f.Response.PayloadID, &t.CLMock.LatestPayloadAttributes) + g.ExpectNoError() + + if !helper.TransactionInPayload(&g.Payload, nextTx) { + t.Fatalf("FAIL (%s): Payload built does not contain the transaction: %v", t.TestName, g.Payload) + } + + // Send the new payload and forkchoiceUpdated to it + n := t.TestEngine.TestEngineNewPayload(&g.Payload) + n.ExpectStatus(test.Valid) + + forkchoiceUpdated.HeadBlockHash = g.Payload.BlockHash + + s := t.TestEngine.TestEngineForkchoiceUpdated(&forkchoiceUpdated, nil, g.Payload.Timestamp) + s.ExpectPayloadStatus(test.Valid) + } } }, OnNewPayloadBroadcast: func() { - // Get the receipt - ctx, cancel := context.WithTimeout(t.TestContext, globals.RPCTimeout) - defer cancel() - receipt, _ := t.Eth.TransactionReceipt(ctx, tx.Hash()) - if receipt != nil { - t.Fatalf("FAIL (%s): Receipt obtained before tx included in block (NewPayload): %v", t.TestName, receipt) + if tx != nil { + // Get the receipt + ctx, cancel := context.WithTimeout(t.TestContext, globals.RPCTimeout) + defer cancel() + receipt, _ := t.Eth.TransactionReceipt(ctx, tx.Hash()) + if receipt != nil { + t.Fatalf("FAIL (%s): Receipt obtained before tx included in block (NewPayload): %v", t.TestName, receipt) + } } }, OnForkchoiceBroadcast: func() { - // Transaction is now in the head of the canonical chain, re-org and verify it's removed - // Get the receipt - txt := t.TestEngine.TestTransactionReceipt(tx.Hash()) - txt.ExpectBlockHash(t.CLMock.LatestForkchoice.HeadBlockHash) + if spec.Scenario != TransactionReOrgScenarioReOrgBackIn { + // Transaction is now in the head of the canonical chain, re-org and verify it's removed + // Get the receipt + txt := t.TestEngine.TestTransactionReceipt(tx.Hash()) + txt.ExpectBlockHash(t.CLMock.LatestForkchoice.HeadBlockHash) - if altPayload.ParentHash != t.CLMock.LatestPayloadBuilt.ParentHash { - t.Fatalf("FAIL (%s): Incorrect parent hash for payloads: %v != %v", t.TestName, altPayload.ParentHash, t.CLMock.LatestPayloadBuilt.ParentHash) - } - if altPayload.BlockHash == t.CLMock.LatestPayloadBuilt.BlockHash { - t.Fatalf("FAIL (%s): Incorrect hash for payloads: %v == %v", t.TestName, altPayload.BlockHash, t.CLMock.LatestPayloadBuilt.BlockHash) - } + if altPayload.ParentHash != t.CLMock.LatestPayloadBuilt.ParentHash { + t.Fatalf("FAIL (%s): Incorrect parent hash for payloads: %v != %v", t.TestName, altPayload.ParentHash, t.CLMock.LatestPayloadBuilt.ParentHash) + } + if altPayload.BlockHash == t.CLMock.LatestPayloadBuilt.BlockHash { + t.Fatalf("FAIL (%s): Incorrect hash for payloads: %v == %v", t.TestName, altPayload.BlockHash, t.CLMock.LatestPayloadBuilt.BlockHash) + } - if altPayload == nil { - t.Fatalf("FAIL (%s): No payload to re-org to", t.TestName) + if altPayload == nil { + t.Fatalf("FAIL (%s): No payload to re-org to", t.TestName) + } + r := t.TestEngine.TestEngineNewPayload(altPayload) + r.ExpectStatus(test.Valid) + r.ExpectLatestValidHash(&altPayload.BlockHash) + + s := t.TestEngine.TestEngineForkchoiceUpdated(&api.ForkchoiceStateV1{ + HeadBlockHash: altPayload.BlockHash, + SafeBlockHash: t.CLMock.LatestForkchoice.SafeBlockHash, + FinalizedBlockHash: t.CLMock.LatestForkchoice.FinalizedBlockHash, + }, nil, altPayload.Timestamp) + s.ExpectPayloadStatus(test.Valid) + + p := t.TestEngine.TestHeaderByNumber(Head) + p.ExpectHash(altPayload.BlockHash) + + txt = t.TestEngine.TestTransactionReceipt(tx.Hash()) + if spec.Scenario == TransactionReOrgScenarioReOrgOut { + if txt.Receipt != nil { + receiptJson, _ := json.MarshalIndent(txt.Receipt, "", " ") + t.Fatalf("FAIL (%s): Receipt was obtained when the tx had been re-org'd out: %s", t.TestName, receiptJson) + } + } else if spec.Scenario == TransactionReOrgScenarioReOrgDifferentBlock || spec.Scenario == TransactionReOrgScenarioNewPayloadOnRevert { + txt.ExpectBlockHash(altPayload.BlockHash) + } + + // Re-org back + if spec.Scenario == TransactionReOrgScenarioNewPayloadOnRevert { + r = t.TestEngine.TestEngineNewPayload(&t.CLMock.LatestPayloadBuilt) + r.ExpectStatus(test.Valid) + r.ExpectLatestValidHash(&t.CLMock.LatestPayloadBuilt.BlockHash) + } + t.CLMock.BroadcastForkchoiceUpdated(&t.CLMock.LatestForkchoice, nil, 1) } - r := t.TestEngine.TestEngineNewPayload(altPayload) - r.ExpectStatus(test.Valid) - r.ExpectLatestValidHash(&altPayload.BlockHash) - - s := t.TestEngine.TestEngineForkchoiceUpdated(&api.ForkchoiceStateV1{ - HeadBlockHash: altPayload.BlockHash, - SafeBlockHash: t.CLMock.LatestForkchoice.SafeBlockHash, - FinalizedBlockHash: t.CLMock.LatestForkchoice.FinalizedBlockHash, - }, nil, altPayload.Timestamp) - s.ExpectPayloadStatus(test.Valid) - - p := t.TestEngine.TestHeaderByNumber(Head) - p.ExpectHash(altPayload.BlockHash) - - txt = t.TestEngine.TestTransactionReceipt(tx.Hash()) - if spec.ReorgOut { - if txt.Receipt != nil { - receiptJson, _ := json.MarshalIndent(txt.Receipt, "", " ") - t.Fatalf("FAIL (%s): Receipt was obtained when the tx had been re-org'd out: %s", t.TestName, receiptJson) + + if tx != nil { + // Now it should be back with main payload + txt := t.TestEngine.TestTransactionReceipt(tx.Hash()) + txt.ExpectBlockHash(t.CLMock.LatestForkchoice.HeadBlockHash) + + if spec.Scenario != TransactionReOrgScenarioReOrgBackIn { + tx = nil } - } else if spec.ReorgDifferentBlock { - txt.ExpectBlockHash(altPayload.BlockHash) } - // Re-org back - if spec.NewPayloadOnRevert { - r = t.TestEngine.TestEngineNewPayload(&t.CLMock.LatestPayloadBuilt) - r.ExpectStatus(test.Valid) - r.ExpectLatestValidHash(&t.CLMock.LatestPayloadBuilt.BlockHash) + if spec.Scenario == TransactionReOrgScenarioReOrgBackIn && i > 0 { + // Reasoning: Most of the clients do not re-add blob transactions to the pool + // after a re-org, so we need to wait until the next tx is sent to actually + // verify. + tx = nextTx } - t.CLMock.BroadcastForkchoiceUpdated(&t.CLMock.LatestForkchoice, nil, 1) - // Not it should be back with main payload - txt = t.TestEngine.TestTransactionReceipt(tx.Hash()) - txt.ExpectBlockHash(t.CLMock.LatestForkchoice.HeadBlockHash) + }, + }) + + } + + if tx != nil { + // Produce one last block and verify that the block contains the transaction + t.CLMock.ProduceSingleBlock(clmock.BlockProcessCallbacks{ + OnForkchoiceBroadcast: func() { + if !helper.TransactionInPayload(&t.CLMock.LatestPayloadBuilt, tx) { + t.Fatalf("FAIL (%s): Payload built does not contain the transaction: %v", t.TestName, t.CLMock.LatestPayloadBuilt) + } + // Get the receipt + ctx, cancel := context.WithTimeout(t.TestContext, globals.RPCTimeout) + defer cancel() + receipt, _ := t.Eth.TransactionReceipt(ctx, tx.Hash()) + if receipt == nil { + t.Fatalf("FAIL (%s): Receipt not obtained after tx included in block: %v", t.TestName, receipt) + } }, }) diff --git a/simulators/ethereum/engine/suites/engine/tests.go b/simulators/ethereum/engine/suites/engine/tests.go index cf35765ea1..e90c12158f 100644 --- a/simulators/ethereum/engine/suites/engine/tests.go +++ b/simulators/ethereum/engine/suites/engine/tests.go @@ -329,14 +329,16 @@ func init() { // Re-org a transaction out of a block, or into a new block Tests = append(Tests, TransactionReOrgTest{ - ReorgOut: true, + Scenario: TransactionReOrgScenarioReOrgOut, }, TransactionReOrgTest{ - ReorgDifferentBlock: true, + Scenario: TransactionReOrgScenarioReOrgDifferentBlock, }, TransactionReOrgTest{ - ReorgDifferentBlock: true, - NewPayloadOnRevert: true, + Scenario: TransactionReOrgScenarioNewPayloadOnRevert, + }, + TransactionReOrgTest{ + Scenario: TransactionReOrgScenarioReOrgBackIn, }, ) From 6eb7d4eddf86fec7647a09f1be82af1ca9502a9e Mon Sep 17 00:00:00 2001 From: Mario Vega Date: Fri, 27 Oct 2023 16:58:50 -0600 Subject: [PATCH 087/387] simulators/ethereum/engine: Minor fix to re-org tests (#934) simulators/ethereum/engine: minor fix to re-org tests --- simulators/ethereum/engine/suites/engine/reorg.go | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/simulators/ethereum/engine/suites/engine/reorg.go b/simulators/ethereum/engine/suites/engine/reorg.go index a36f296b95..19eebe7882 100644 --- a/simulators/ethereum/engine/suites/engine/reorg.go +++ b/simulators/ethereum/engine/suites/engine/reorg.go @@ -529,13 +529,17 @@ func (spec ReOrgBackToCanonicalTest) Execute(t *test.Env) { // Send a fcU with the HeadBlockHash pointing back to the previous block forkchoiceUpdatedBack := api.ForkchoiceStateV1{ HeadBlockHash: previousHash, - SafeBlockHash: previousHash, - FinalizedBlockHash: previousHash, + SafeBlockHash: t.CLMock.LatestForkchoice.SafeBlockHash, + FinalizedBlockHash: t.CLMock.LatestForkchoice.FinalizedBlockHash, } // It is only expected that the client does not produce an error and the CL Mocker is able to progress after the re-org r := t.TestEngine.TestEngineForkchoiceUpdated(&forkchoiceUpdatedBack, nil, previousTimestamp) r.ExpectNoError() + + // Re-send the ForkchoiceUpdated that the CLMock had sent + r = t.TestEngine.TestEngineForkchoiceUpdated(&t.CLMock.LatestForkchoice, nil, t.CLMock.LatestExecutedPayload.Timestamp) + r.ExpectNoError() }, }) } From 2b61c385a59eece93dcd4d08adbb404fb99f17b2 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Mon, 30 Oct 2023 21:51:01 +0000 Subject: [PATCH 088/387] clients/besu: remove HIVE_SKIP_POW --- clients/besu/besu.sh | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/clients/besu/besu.sh b/clients/besu/besu.sh index c169fceee1..f74ab1f515 100644 --- a/clients/besu/besu.sh +++ b/clients/besu/besu.sh @@ -35,7 +35,6 @@ # # - HIVE_MINER enables mining. value is coinbase. # - HIVE_MINER_EXTRA extra-data field to set for newly minted blocks -# - HIVE_SKIP_POW If set, skip PoW verification # - HIVE_LOGLEVEL Client log level # - HIVE_GRAPHQL_ENABLED If set, GraphQL is enabled on port 8545 and RPC is disabled # @@ -85,10 +84,8 @@ fi # The client should start after loading the blocks, this option configures it. IMPORTFLAGS="--run" -# Disable PoW check if requested. -if [ -n "$HIVE_SKIP_POW" ]; then - IMPORTFLAGS="$IMPORTFLAGS --skip-pow-validation-enabled" -fi +# Skip PoW checks on import. +IMPORTFLAGS="$IMPORTFLAGS --skip-pow-validation-enabled" # Load chain.rlp if present. if [ -f /chain.rlp ]; then From 0787e06864068119a5b258863b57c0150b42e862 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Mon, 30 Oct 2023 21:51:27 +0000 Subject: [PATCH 089/387] clients/erigon: remove HIVE_SKIP_POW --- clients/erigon/erigon.sh | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/clients/erigon/erigon.sh b/clients/erigon/erigon.sh index a942935417..2cd5d1874a 100644 --- a/clients/erigon/erigon.sh +++ b/clients/erigon/erigon.sh @@ -21,8 +21,6 @@ # - HIVE_FORK_PETERSBURG block number for ConstantinopleFix/Petersburg transition # - HIVE_FORK_ISTANBUL block number for Istanbul transition # - HIVE_FORK_MUIR_GLACIER block number for MuirGlacier transition -# - HIVE_SKIP_POW If set, skip PoW verification during block import -# - HIVE_LOGLEVEL client log level # - HIVE_MINER address to credit with mining rewards # - HIVE_MINER_EXTRA extra-data field to set for newly minted blocks # @@ -47,9 +45,8 @@ if [ "$HIVE_BOOTNODE" != "" ]; then FLAGS="$FLAGS --staticpeers $HIVE_BOOTNODE --nodiscover" fi -if [ "$HIVE_SKIP_POW" != "" ]; then - FLAGS="$FLAGS --fakepow" -fi +# Disable PoW validation. +FLAGS="$FLAGS --fakepow" # Create the data directory. mkdir /erigon-hive-datadir From 681738d79349209c0ddcea9526e37554be66f3a1 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Mon, 30 Oct 2023 21:51:46 +0000 Subject: [PATCH 090/387] clients/erigon: set terminalTotalDifficultyPassed --- clients/erigon/mapper.jq | 1 + 1 file changed, 1 insertion(+) diff --git a/clients/erigon/mapper.jq b/clients/erigon/mapper.jq index d64d4a0c98..6f9be7b87d 100644 --- a/clients/erigon/mapper.jq +++ b/clients/erigon/mapper.jq @@ -52,6 +52,7 @@ def to_bool: "londonBlock": env.HIVE_FORK_LONDON|to_int, "mergeNetsplitBlock": env.HIVE_MERGE_BLOCK_ID|to_int, "terminalTotalDifficulty": env.HIVE_TERMINAL_TOTAL_DIFFICULTY|to_int, + "terminalTotalDifficultyPassed": true, "shanghaiTime": env.HIVE_SHANGHAI_TIMESTAMP|to_int, "cancunTime": env.HIVE_CANCUN_TIMESTAMP|to_int, }|remove_empty From d5dccbb9dd180dc81c99b7d44d226b40096fe2bc Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Mon, 30 Oct 2023 21:52:02 +0000 Subject: [PATCH 091/387] clients/ethereumjs: remove mention of HIVE_SKIP_POW --- clients/ethereumjs/ethereumjs.sh | 1 - 1 file changed, 1 deletion(-) diff --git a/clients/ethereumjs/ethereumjs.sh b/clients/ethereumjs/ethereumjs.sh index f27cc9970c..7cd7e5109d 100644 --- a/clients/ethereumjs/ethereumjs.sh +++ b/clients/ethereumjs/ethereumjs.sh @@ -39,7 +39,6 @@ # # - HIVE_MINER enable mining. value is coinbase address. # - HIVE_MINER_EXTRA extra-data field to set for newly minted blocks -# - HIVE_SKIP_POW if set, skip PoW verification during block import # - HIVE_LOGLEVEL client loglevel (0-5) # - HIVE_GRAPHQL_ENABLED enables graphql on port 8545 # - HIVE_LES_SERVER set to '1' to enable LES server From f4039a610628dfad55ebfee66be0ceb4d4ac95e9 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Mon, 30 Oct 2023 21:52:16 +0000 Subject: [PATCH 092/387] clients/go-ethereum: remove -gcmode=archive in import --- clients/go-ethereum/geth.sh | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/clients/go-ethereum/geth.sh b/clients/go-ethereum/geth.sh index 38204d4a73..c2e4dc15a0 100644 --- a/clients/go-ethereum/geth.sh +++ b/clients/go-ethereum/geth.sh @@ -40,7 +40,6 @@ # # - HIVE_MINER enable mining. value is coinbase address. # - HIVE_MINER_EXTRA extra-data field to set for newly minted blocks -# - HIVE_SKIP_POW if set, skip PoW verification during block import # - HIVE_LOGLEVEL client loglevel (0-5) # - HIVE_GRAPHQL_ENABLED enables graphql on port 8545 # - HIVE_LES_SERVER set to '1' to enable LES server @@ -112,7 +111,7 @@ set +e # Load the test chain if present echo "Loading initial blockchain..." if [ -f /chain.rlp ]; then - $geth $FLAGS --gcmode=archive import /chain.rlp + $geth $FLAGS import /chain.rlp else echo "Warning: chain.rlp not found." fi From 0e035cab1c10db1226903981f4875d45104c7aeb Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Mon, 30 Oct 2023 21:52:42 +0000 Subject: [PATCH 093/387] clients/nethermind: remove mentions of HIVE_SKIP_POW --- clients/nethermind/nethermind.sh | 1 - 1 file changed, 1 deletion(-) diff --git a/clients/nethermind/nethermind.sh b/clients/nethermind/nethermind.sh index e65bb44736..11fc9d7613 100644 --- a/clients/nethermind/nethermind.sh +++ b/clients/nethermind/nethermind.sh @@ -15,7 +15,6 @@ # - HIVE_NETWORK_ID network ID number to use for the eth protocol # - HIVE_CHAIN_ID network ID number to use for the eth protocol # - HIVE_NODETYPE sync and pruning selector (archive, full, light) -# - HIVE_SKIP_POW If set, skip PoW verification during block import # # Forks: # From 26ba1585e1465bb675d1d590a98f4cca0c6924dc Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Mon, 30 Oct 2023 21:53:00 +0000 Subject: [PATCH 094/387] clients/nimbus-el: remove mentions of HIVE_SKIP_POW --- clients/nimbus-el/nimbus.sh | 1 - 1 file changed, 1 deletion(-) diff --git a/clients/nimbus-el/nimbus.sh b/clients/nimbus-el/nimbus.sh index 94bdeebb84..ce5d975765 100644 --- a/clients/nimbus-el/nimbus.sh +++ b/clients/nimbus-el/nimbus.sh @@ -42,7 +42,6 @@ # # - [x] HIVE_MINER enable mining. value is coinbase address. # - [ ] HIVE_MINER_EXTRA extra-data field to set for newly minted blocks -# - [ ] HIVE_SKIP_POW if set, skip PoW verification during block import # - [x] HIVE_LOGLEVEL client loglevel (0-5) # - [x] HIVE_GRAPHQL_ENABLED enables graphql on port 8545 From c4e42b9ce2a96b9c3bd8a38066ee6414ceb447e7 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Mon, 30 Oct 2023 21:53:19 +0000 Subject: [PATCH 095/387] clients/reth: remove mention of HIVE_SKIP_POW --- clients/reth/reth.sh | 1 - 1 file changed, 1 deletion(-) diff --git a/clients/reth/reth.sh b/clients/reth/reth.sh index 6adf995d4b..0058f53f88 100644 --- a/clients/reth/reth.sh +++ b/clients/reth/reth.sh @@ -31,7 +31,6 @@ # - HIVE_GRAPHQL_ENABLED turns on GraphQL server # - HIVE_CLIQUE_PRIVATEKEY private key for clique mining # - HIVE_NODETYPE sync and pruning selector (archive, full, light) -# - HIVE_SKIP_POW If set, skip PoW verification during block import # - HIVE_MINER address to credit with mining rewards # - HIVE_MINER_EXTRA extra-data field to set for newly minted blocks From 77664fad37e15e976066f9c2c9eb873b6ce09f6b Mon Sep 17 00:00:00 2001 From: spencer Date: Tue, 31 Oct 2023 05:08:50 -0600 Subject: [PATCH 096/387] hivesim: only log test and suite skips at high log levels (#923) --- hivesim/hive.go | 9 +++++++-- hivesim/testapi.go | 15 +++++++++------ 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/hivesim/hive.go b/hivesim/hive.go index c70c4d445b..ba29d5d2f1 100644 --- a/hivesim/hive.go +++ b/hivesim/hive.go @@ -12,6 +12,7 @@ import ( "net/http" "os" "path/filepath" + "strconv" "strings" "github.com/ethereum/go-ethereum/p2p/enode" @@ -20,8 +21,9 @@ import ( // Simulation wraps the simulation HTTP API provided by hive. type Simulation struct { - url string - m testMatcher + url string + m testMatcher + ll int } // New looks up the hive host URI using the HIVE_SIMULATOR environment variable @@ -42,6 +44,9 @@ func New() *Simulation { } sim.m = m } + if ll := os.Getenv("HIVE_LOGLEVEL"); ll != "" { + sim.ll, _ = strconv.Atoi(ll) + } return sim } diff --git a/hivesim/testapi.go b/hivesim/testapi.go index 9485f33c8d..4b4f052a63 100644 --- a/hivesim/testapi.go +++ b/hivesim/testapi.go @@ -50,7 +50,9 @@ func MustRun(host *Simulation, suites ...Suite) { // RunSuite runs all tests in a suite. func RunSuite(host *Simulation, suite Suite) error { if !host.m.match(suite.Name, "") { - fmt.Fprintf(os.Stderr, "skipping suite %q because it doesn't match test pattern %s\n", suite.Name, host.m.pattern) + if host.ll > 3 { // hive log level > 3 + fmt.Fprintf(os.Stderr, "skipping suite %q because it doesn't match test pattern %s\n", suite.Name, host.m.pattern) + } return nil } @@ -82,13 +84,12 @@ func MustRunSuite(host *Simulation, suite Suite) { // Using this test type doesn't launch any clients by default. To interact with clients, // you can launch them using the t.Client method: // -// c := t.Client() -// c.RPC().Call(...) +// c := t.Client() +// c.RPC().Call(...) // // or run a subtest using t.RunClientTest(): // -// t.RunClientTest(hivesim.ClientTestSpec{...}) -// +// t.RunClientTest(hivesim.ClientTestSpec{...}) type TestSpec struct { // These fields are displayed in the UI. Be sure to add // a meaningful description here. @@ -306,7 +307,9 @@ type testSpec struct { func runTest(host *Simulation, test testSpec, runit func(t *T)) error { if !test.alwaysRun && !host.m.match(test.suite.Name, test.name) { - fmt.Fprintf(os.Stderr, "skipping test %q because it doesn't match test pattern %s\n", test.name, host.m.pattern) + if host.ll > 3 { // hive log level > 3 + fmt.Fprintf(os.Stderr, "skipping test %q because it doesn't match test pattern %s\n", test.name, host.m.pattern) + } return nil } From a15bd62914d502f81073f9e83ce0ff6c88965fd2 Mon Sep 17 00:00:00 2001 From: Sina Mahmoodi <1591639+s1na@users.noreply.github.com> Date: Tue, 31 Oct 2023 12:15:04 +0100 Subject: [PATCH 097/387] graphql: add test case for eip-4844 fields (#894) --- clients/go-ethereum/.gitignore | 1 + simulators/ethereum/graphql/README.md | 7 + simulators/ethereum/graphql/go.mod | 43 ++- simulators/ethereum/graphql/go.sum | 325 ++++++++++++++++++ simulators/ethereum/graphql/graphql.go | 65 ++-- .../graphql/init/testBlockchain.blocks | Bin 24039 -> 24815 bytes .../ethereum/graphql/init/testGenesis.json | 22 +- .../testcases/51_eth_getBlock_4844.json | 25 ++ 8 files changed, 463 insertions(+), 25 deletions(-) create mode 100644 clients/go-ethereum/.gitignore create mode 100644 simulators/ethereum/graphql/README.md create mode 100644 simulators/ethereum/graphql/testcases/51_eth_getBlock_4844.json diff --git a/clients/go-ethereum/.gitignore b/clients/go-ethereum/.gitignore new file mode 100644 index 0000000000..643fd89ff2 --- /dev/null +++ b/clients/go-ethereum/.gitignore @@ -0,0 +1 @@ +go-ethereum \ No newline at end of file diff --git a/simulators/ethereum/graphql/README.md b/simulators/ethereum/graphql/README.md new file mode 100644 index 0000000000..73225707ec --- /dev/null +++ b/simulators/ethereum/graphql/README.md @@ -0,0 +1,7 @@ +# GraphQL + +This simulator tests the GraphQL endpoint of Ethereum clients to validate they are following the [specification](https://github.com/ethereum/execution-apis/tree/main#graphql). + +## Adding a test + +This step-by-step [example](https://notes.ethereum.org/@s1na/By9rdtex6) shows how to add a new test to the GraphQL simulator. \ No newline at end of file diff --git a/simulators/ethereum/graphql/go.mod b/simulators/ethereum/graphql/go.mod index 68b2773a8f..5ef249a405 100644 --- a/simulators/ethereum/graphql/go.mod +++ b/simulators/ethereum/graphql/go.mod @@ -2,20 +2,55 @@ module github.com/ethereum/hive/simulators/ethereum/graphql go 1.18 -require github.com/ethereum/hive v0.0.0-20230919110229-d58aec4a3eb5 +require ( + github.com/ethereum/go-ethereum v1.13.1 + github.com/ethereum/hive v0.0.0-20230919110229-d58aec4a3eb5 +) require ( + github.com/DataDog/zstd v1.5.2 // indirect github.com/Microsoft/go-winio v0.6.1 // indirect + github.com/VictoriaMetrics/fastcache v1.12.0 // indirect + github.com/beorn7/perks v1.0.1 // indirect + github.com/bits-and-blooms/bitset v1.5.0 // indirect github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect + github.com/cespare/xxhash/v2 v2.2.0 // indirect + github.com/cockroachdb/errors v1.9.1 // indirect + github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect + github.com/cockroachdb/pebble v0.0.0-20230906160148-46873a6a7a06 // indirect + github.com/cockroachdb/redact v1.1.3 // indirect + github.com/consensys/bavard v0.1.13 // indirect + github.com/consensys/gnark-crypto v0.10.0 // indirect + github.com/crate-crypto/go-kzg-4844 v0.3.0 // indirect github.com/deckarep/golang-set/v2 v2.1.0 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 // indirect - github.com/ethereum/go-ethereum v1.13.1 // indirect + github.com/ethereum/c-kzg-4844 v0.3.1 // indirect + github.com/getsentry/sentry-go v0.18.0 // indirect github.com/go-ole/go-ole v1.2.6 // indirect github.com/go-stack/stack v1.8.1 // indirect + github.com/gofrs/flock v0.8.1 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/protobuf v1.5.2 // indirect github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect github.com/gorilla/websocket v1.5.0 // indirect + github.com/holiman/bloomfilter/v2 v2.0.3 // indirect github.com/holiman/uint256 v1.2.3 // indirect + github.com/klauspost/compress v1.15.15 // indirect + github.com/kr/pretty v0.3.1 // indirect + github.com/kr/text v0.2.0 // indirect + github.com/mattn/go-runewidth v0.0.14 // indirect + github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect + github.com/mmcloughlin/addchain v0.4.0 // indirect + github.com/olekukonko/tablewriter v0.0.5 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/prometheus/client_golang v1.14.0 // indirect + github.com/prometheus/client_model v0.3.0 // indirect + github.com/prometheus/common v0.39.0 // indirect + github.com/prometheus/procfs v0.9.0 // indirect + github.com/rivo/uniseg v0.4.3 // indirect + github.com/rogpeppe/go-internal v1.9.0 // indirect github.com/shirou/gopsutil v3.21.11+incompatible // indirect + github.com/supranational/blst v0.3.11 // indirect github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a // indirect github.com/tklauser/go-sysconf v0.3.12 // indirect github.com/tklauser/numcpus v0.6.1 // indirect @@ -23,6 +58,10 @@ require ( golang.org/x/crypto v0.12.0 // indirect golang.org/x/exp v0.0.0-20230810033253-352e893a4cad // indirect golang.org/x/mod v0.11.0 // indirect + golang.org/x/sync v0.3.0 // indirect golang.org/x/sys v0.11.0 // indirect + golang.org/x/text v0.12.0 // indirect golang.org/x/tools v0.9.1 // indirect + google.golang.org/protobuf v1.28.1 // indirect + rsc.io/tmplfunc v0.0.3 // indirect ) diff --git a/simulators/ethereum/graphql/go.sum b/simulators/ethereum/graphql/go.sum index 385d52e663..9cdde93436 100644 --- a/simulators/ethereum/graphql/go.sum +++ b/simulators/ethereum/graphql/go.sum @@ -1,11 +1,58 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/CloudyKit/fastprinter v0.0.0-20200109182630-33d98a066a53/go.mod h1:+3IMCy2vIlbG1XG/0ggNQv0SvxCAIpPM5b1nCz56Xno= +github.com/CloudyKit/jet/v3 v3.0.0/go.mod h1:HKQPgSJmdK8hdoAbKUUWajkHyHo4RaU5rMdUywE7VMo= +github.com/DataDog/zstd v1.5.2 h1:vUG4lAyuPCXO0TLbXvPv7EB7cNK1QV/luu55UHLrrn8= +github.com/DataDog/zstd v1.5.2/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= +github.com/Joker/hpp v1.0.0/go.mod h1:8x5n+M1Hp5hC0g8okX3sR3vFQwynaX/UgSOM9MeBKzY= github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= +github.com/Shopify/goreferrer v0.0.0-20181106222321-ec9c9a553398/go.mod h1:a1uqRtAwp2Xwc6WNPJEufxJ7fx3npB4UV/JOLmbu5I0= +github.com/VictoriaMetrics/fastcache v1.12.0 h1:vnVi/y9yKDcD9akmc4NqAoqgQhJrOwUF+j9LTgn4QDE= +github.com/VictoriaMetrics/fastcache v1.12.0/go.mod h1:tjiYeEfYXCqacuvYw/7UoDIeJaNxq6132xHICNP77w8= +github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY= +github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= +github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= +github.com/aymerick/raymond v2.0.3-0.20180322193309-b565731e1464+incompatible/go.mod h1:osfaiScAUVup+UC9Nfq76eWqDhXlp+4UYaA8uhTBO6g= +github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= +github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/bits-and-blooms/bitset v1.5.0 h1:NpE8frKRLGHIcEzkR+gZhiioW1+WbYV6fKwD6ZIpQT8= +github.com/bits-and-blooms/bitset v1.5.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U= github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= +github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cockroachdb/datadriven v1.0.2/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= +github.com/cockroachdb/errors v1.9.1 h1:yFVvsI0VxmRShfawbt/laCIDy/mtTqqnvoNgiy5bEV8= +github.com/cockroachdb/errors v1.9.1/go.mod h1:2sxOtL2WIc096WSZqZ5h8fa17rdDq9HZOZLBCor4mBk= +github.com/cockroachdb/logtags v0.0.0-20211118104740-dabe8e521a4f/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= +github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE= +github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= +github.com/cockroachdb/pebble v0.0.0-20230906160148-46873a6a7a06 h1:T+Np/xtzIjYM/P5NAw0e2Rf1FGvzDau1h54MKvx8G7w= +github.com/cockroachdb/pebble v0.0.0-20230906160148-46873a6a7a06/go.mod h1:bynZ3gvVyhlvjLI7PT6dmZ7g76xzJ7HpxfjgkzCGz6s= +github.com/cockroachdb/redact v1.1.3 h1:AKZds10rFSIj7qADf0g46UixK8NNLwWTNdCIGS5wfSQ= +github.com/cockroachdb/redact v1.1.3/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= +github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0/go.mod h1:4Zcjuz89kmFXt9morQgcfYZAYZ5n8WHjt81YYWIwtTM= +github.com/consensys/bavard v0.1.13 h1:oLhMLOFGTLdlda/kma4VOJazblc7IM5y5QPd2A/YjhQ= +github.com/consensys/bavard v0.1.13/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI= +github.com/consensys/gnark-crypto v0.10.0 h1:zRh22SR7o4K35SoNqouS9J/TKHTyU2QWaj5ldehyXtA= +github.com/consensys/gnark-crypto v0.10.0/go.mod h1:Iq/P3HHl0ElSjsg2E1gsMwhAyxnxoKK5nVyZKd+/KhU= +github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= +github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= +github.com/crate-crypto/go-kzg-4844 v0.3.0 h1:UBlWE0CgyFqqzTI+IFyCzA7A3Zw4iip6uzRv5NIXG0A= +github.com/crate-crypto/go-kzg-4844 v0.3.0/go.mod h1:SBP7ikXEgDnUPONgm33HtuDZEDtWa3L4QtN1ocJSEQ4= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -14,49 +61,171 @@ github.com/deckarep/golang-set/v2 v2.1.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpO github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 h1:HbphB4TFFXpv7MNrT52FGrrgVXF1owhMVTHFZIlnvd4= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0/go.mod h1:DZGJHZMqrU4JJqFAWUS2UO1+lbSKsdiOoYi9Zzey7Fc= +github.com/dgraph-io/badger v1.6.0/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6psNgSztDR4= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385/go.mod h1:0vRUJqYpeSZifjYj7uP3BG/gKcuzL9xWVV/Y+cK33KM= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/etcd-io/bbolt v1.3.3/go.mod h1:ZF2nL25h33cCyBtcyWeZ2/I3HQOfTP+0PIEvHjkjCrw= +github.com/ethereum/c-kzg-4844 v0.3.1 h1:sR65+68+WdnMKxseNWxSJuAv2tsUrihTpVBTfM/U5Zg= +github.com/ethereum/c-kzg-4844 v0.3.1/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= github.com/ethereum/go-ethereum v1.13.1 h1:UF2FaUKPIy5jeZk3X06ait3y2Q4wI+vJ1l7+UARp+60= github.com/ethereum/go-ethereum v1.13.1/go.mod h1:xHQKzwkHSl0gnSjZK1mWa06XEdm9685AHqhRknOzqGQ= github.com/ethereum/hive v0.0.0-20230919110229-d58aec4a3eb5 h1:22Z+XoI2hGtYR0AMzYr9IusfYM/chALq/6oJnejJQpk= github.com/ethereum/hive v0.0.0-20230919110229-d58aec4a3eb5/go.mod h1:iKqu3dndnqdwSckyBGoZzeHhZz6X6XZws2TfZMdLdes= +github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072/go.mod h1:duJ4Jxv5lDcvg4QuQr0oowTf7dz4/CR8NtyCooz9HL8= +github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= +github.com/gavv/httpexpect v2.0.0+incompatible/go.mod h1:x+9tiU1YnrOvnB725RkpoLv1M62hOWzwo5OXotisrKc= +github.com/getsentry/sentry-go v0.12.0/go.mod h1:NSap0JBYWzHND8oMbyi0+XZhUalc1TBdRL1M71JZW2c= +github.com/getsentry/sentry-go v0.18.0 h1:MtBW5H9QgdcJabtZcuJG80BMOwaBpkRDZkxRkNC1sN0= +github.com/getsentry/sentry-go v0.18.0/go.mod h1:Kgon4Mby+FJ7ZWHFUAZgVaIa8sxHtnRJRLTXZr51aKQ= +github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3/go.mod h1:VJ0WA2NBN22VlZ2dKZQPAPnyWw5XTlK1KymzLKsr59s= +github.com/gin-gonic/gin v1.4.0/go.mod h1:OW2EZn3DO8Ln9oIKOvM++LBO+5UPHJJDH72/q/3rZdM= +github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= +github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= +github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab/go.mod h1:/P9AEU963A2AYjv4d1V5eVL1CQbEJq6aCNHDDjibzu8= github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-stack/stack v1.8.1 h1:ntEHSVwIt7PNXNpgPmVfMrNhLtgjlmnZha2kOpuRiDw= github.com/go-stack/stack v1.8.1/go.mod h1:dcoOX6HbPZSZptuspn9bctJ+N/CnF5gGygcUP3XYfe4= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= +github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= +github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= +github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= +github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= +github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= +github.com/gogo/googleapis v0.0.0-20180223154316-0cd9801be74a/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= +github.com/gogo/googleapis v1.4.1/go.mod h1:2lpHqI5OcWCtVElxXnPt+s8oJvMpySlOyM6xDCrzib4= +github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/gogo/status v1.1.0/go.mod h1:BFv9nrluPLmrS0EmGVvLaPNmRosr9KapBYd5/hpY1WM= +github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXiurYmW7fx4GZkL8feAMVq7nEjURHk= github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/gomodule/redigo v1.7.1-0.20190724094224-574c33c3df38/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= +github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao= +github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA= github.com/holiman/uint256 v1.2.3 h1:K8UWO1HUJpRMXBxbmaY1Y8IAMZC/RsKB+ArEnnK4l5o= github.com/holiman/uint256 v1.2.3/go.mod h1:SC8Ryt4n+UBbPbIBKaG9zbbDlp4jOru9xFZmPzLUTxw= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/hydrogen18/memlistener v0.0.0-20200120041712-dcc25e7acd91/go.mod h1:qEIFzExnS6016fRpRfxrExeVn2gbClQA99gQhnIcdhE= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/imkira/go-interpol v1.1.0/go.mod h1:z0h2/2T3XF8kyEPpRgJ3kmNv+C43p+I/CoI+jC3w2iA= +github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/iris-contrib/blackfriday v2.0.0+incompatible/go.mod h1:UzZ2bDEoaSGPbkg6SAB4att1aAwTmVIx/5gCVqeyUdI= +github.com/iris-contrib/go.uuid v2.0.0+incompatible/go.mod h1:iz2lgM/1UnEf1kP0L/+fafWORmlnuysV2EMP8MW+qe0= +github.com/iris-contrib/jade v1.1.3/go.mod h1:H/geBymxJhShH5kecoiOCSssPX7QWYH7UaeZTSWddIk= +github.com/iris-contrib/pongo2 v0.0.1/go.mod h1:Ssh+00+3GAZqSQb30AvBRNxBx7rf0GqwkjqxNd0u65g= +github.com/iris-contrib/schema v0.0.1/go.mod h1:urYA3uvUNG1TIIjOSCzHr9/LmbQo8LrOcOqfqxa4hXw= +github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= +github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88/go.mod h1:3w7q1U84EfirKl04SVQ/s7nPm1ZPhiXd34z40TNz36k= +github.com/kataras/golog v0.0.10/go.mod h1:yJ8YKCmyL+nWjERB90Qwn+bdyBZsaQwU3bTVFgkFIp8= +github.com/kataras/iris/v12 v12.1.8/go.mod h1:LMYy4VlP67TQ3Zgriz8RE2h2kMZV2SgMYbq3UhfoFmE= +github.com/kataras/neffos v0.0.14/go.mod h1:8lqADm8PnbeFfL7CLXh1WHw53dG27MC3pgi2R1rmoTE= +github.com/kataras/pio v0.0.2/go.mod h1:hAoW0t9UmXi4R5Oyq5Z4irTbaTsOemSrDGUtaTl7Dro= +github.com/kataras/sitemap v0.0.5/go.mod h1:KY2eugMKiPwsJgx7+U103YZehfvNGOXURubcGyk0Bz8= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.8.2/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= +github.com/klauspost/compress v1.9.7/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= +github.com/klauspost/compress v1.15.15 h1:EF27CXIuDsYJ6mmvtBRlEuB2UVOqHG1tAXgZ7yIO+lw= +github.com/klauspost/compress v1.15.15/go.mod h1:ZcK2JAFqKOpnBlxcLsJzYfrS9X1akm9fHZNnD9+Vo/4= +github.com/klauspost/cpuid v1.2.1/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/labstack/echo/v4 v4.5.0/go.mod h1:czIriw4a0C1dFun+ObrXp7ok03xON0N1awStJ6ArI7Y= +github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= +github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.11/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= +github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= +github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peKQ= +github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/mattn/go-runewidth v0.0.14 h1:+xnbZSEeDbOIg5/mE6JF0w6n9duR1l3/WmbinWVwUuU= +github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw= +github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= +github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= +github.com/mediocregopher/radix/v3 v3.4.2/go.mod h1:8FL3F6UQRXHXIBSPUs5h0RybMF8i4n7wVopoX3x7Bv8= +github.com/microcosm-cc/bluemonday v1.0.2/go.mod h1:iVP4YcDBq+n/5fb23BhYFvIMq/leAFZyRl6bYmGDlGc= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mmcloughlin/addchain v0.4.0 h1:SobOdjm2xLj1KkXN5/n0xTIWyZA2+s99UCY1iPfkHRY= +github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqkyU72HC5wJ4RlU= +github.com/mmcloughlin/profile v0.1.1/go.mod h1:IhHD7q1ooxgwTgjxQYkACGA77oFTDdFVejUS1/tS/qU= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/moul/http2curl v1.0.0/go.mod h1:8UbvGypXm98wA/IqH45anm5Y2Z6ep6O31QGOAZ3H0fQ= +github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= +github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= +github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= +github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= +github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= +github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= @@ -67,61 +236,170 @@ github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1y github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= github.com/onsi/gomega v1.19.0 h1:4ieX6qQjPP/BfC3mpsAtIGGlxTWPeA3Inl/7DtXw1tw= github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= +github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= +github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/prometheus/client_golang v1.14.0 h1:nJdhIvne2eSX/XRAFV9PcvFFRbrjbcTUj0VP62TMhnw= +github.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4= +github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= +github.com/prometheus/common v0.39.0 h1:oOyhkDq05hPZKItWVBkJ6g6AtGxi+fy7F4JvUV8uhsI= +github.com/prometheus/common v0.39.0/go.mod h1:6XBZ7lYdLCbkAVhwRsWTZn+IN5AB9F/NXd5w0BbEX0Y= +github.com/prometheus/procfs v0.9.0 h1:wzCHvIvM5SxWqYvwgVL7yJY8Lz3PKn49KQtpgMYJfhI= +github.com/prometheus/procfs v0.9.0/go.mod h1:+pB4zwohETzFnmlpe6yd2lSc+0/46IYZRB/chUwxUZY= +github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/rivo/uniseg v0.4.3 h1:utMvzDsuh3suAEnhH0RdHmoPbU648o6CvXxTx4SBMOw= +github.com/rivo/uniseg v0.4.3/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= +github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= +github.com/rogpeppe/go-internal v1.8.1/go.mod h1:JeRgkft04UBgHMgCIwADu4Pn6Mtm5d4nPKWu0nJ5d+o= +github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= +github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= +github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= +github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/schollz/closestmatch v2.1.0+incompatible/go.mod h1:RtP1ddjLong6gTkbtmuhtR2uUrrJOpYzYRvbcPAid+g= +github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI= github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= +github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= +github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= +github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= +github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= +github.com/supranational/blst v0.3.11 h1:LyU6FolezeWAhvQk0k6O/d49jqgO52MSDDfYgbeoEm4= +github.com/supranational/blst v0.3.11/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a h1:1ur3QoCqvE5fl+nylMaIr9PVV1w343YRDtsy+Rwu7XI= github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a/go.mod h1:RRCYJbIwD5jmqPI9XoAFR0OcDxqUctll6zUj/+B4S48= github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= +github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= +github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= +github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= +github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= +github.com/urfave/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4= +github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= +github.com/valyala/fasthttp v1.6.0/go.mod h1:FstJa9V+Pj9vQ7OJie2qMHdwemEDaDiSdBnvPM1Su9w= +github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= +github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= +github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio= +github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= +github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= +github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= +github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0/go.mod h1:/LWChgwKmvncFJFHJ7Gvn9wZArjbV5/FppcK2fKk/tI= +github.com/yudai/gojsondiff v1.0.0/go.mod h1:AY32+k2cwILAkW1fbgxQ5mUmMiZFgLIV+FBNExI05xg= +github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82/go.mod h1:lgjkn3NuSvDfVJdfcVVdX+jpBxNmX4rDAzaS45IcYoM= +github.com/yudai/pp v2.0.1+incompatible/go.mod h1:PuxR/8QJ7cyCkFp/aUDS+JY727OFEZkTdatxwunjIkc= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yusufpapurcu/wmi v1.2.2 h1:KBNDSne4vP5mbSWnJbO+51IMOXJB67QiYCSBrubbPRg= github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191227163750-53104e6ec876/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.12.0 h1:tFM/ta59kqch6LlvYnPa0yx5a83cL2nHflFhYKvv9Yk= golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20230810033253-352e893a4cad h1:g0bG7Z4uG+OgH2QDODnjp6ggkk1bJDsINcuWmJN1iJU= golang.org/x/exp v0.0.0-20230810033253-352e893a4cad/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.11.0 h1:bUO06HqtnRcc/7l71XBe4WcqTZ+3AH1J59zWDDwLKgU= golang.org/x/mod v0.11.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190327091125-710a502c58a2/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= +golang.org/x/net v0.0.0-20211008194852-3b03d305991f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= +golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220405052023-b1e9470b6e64/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -130,13 +408,28 @@ golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc= +golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181221001348-537d06c36207/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190327201419-c70d86f8b7cf/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.9.1 h1:8WMNJAz3zrtPmnYC7ISf5dEn3MT0gY7jBJfw27yrrLo= golang.org/x/tools v0.9.1/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -144,17 +437,42 @@ golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/genproto v0.0.0-20180518175338-11a468237815/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= +google.golang.org/grpc v1.12.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= +google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= +gopkg.in/go-playground/validator.v8 v8.18.2/go.mod h1:RX2a/7Ha8BgOhfk7j780h4/u/RRjR0eouCJSH80/M2Y= gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1 h1:iiHuQZCNgYPmFQxd3BBN/Nc5+dAwzZuq5y40s20oQw0= +gopkg.in/ini.v1 v1.51.1/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= @@ -162,5 +480,12 @@ gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.0-20191120175047-4206685974f2/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +rsc.io/tmplfunc v0.0.3 h1:53XFQh69AfOa8Tw0Jm7t+GV7KZhOi6jzsCzTtKbMvzU= +rsc.io/tmplfunc v0.0.3/go.mod h1:AG3sTPzElb1Io3Yg4voV9AGZJuleGAwaVRxL9M49PhA= diff --git a/simulators/ethereum/graphql/graphql.go b/simulators/ethereum/graphql/graphql.go index 0ef3a6aca9..86059bee2e 100644 --- a/simulators/ethereum/graphql/graphql.go +++ b/simulators/ethereum/graphql/graphql.go @@ -14,10 +14,17 @@ import ( "strings" "sync" + "github.com/ethereum/go-ethereum/core" "github.com/ethereum/hive/hivesim" ) func main() { + var ( + genesisPath = "./init/testGenesis.json" + genesis = loadGenesis(genesisPath) + params = getParameters(genesis) + ) + suite := hivesim.Suite{ Name: "graphql", Description: `Test suite covering the graphql API surface. @@ -29,28 +36,11 @@ The GraphQL tests were initially imported from the Besu codebase.`, Description: `This is a meta-test. It launches the client with the test chain and reads the test case files. The individual test cases are run as sub-tests against the client launched by this test.`, - Parameters: hivesim.Params{ - // The graphql chain comes from the Besu codebase, and is built on Frontier. - "HIVE_CHAIN_ID": "1", - "HIVE_GRAPHQL_ENABLED": "1", - "HIVE_ALLOW_UNPROTECTED_TX": "1", - "HIVE_FORK_FRONTIER": "0", - "HIVE_FORK_HOMESTEAD": "33", - "HIVE_FORK_TANGERINE": "33", - "HIVE_FORK_SPURIOUS": "33", - "HIVE_FORK_BYZANTIUM": "33", - "HIVE_FORK_CONSTANTINOPLE": "33", - "HIVE_FORK_PETERSBURG": "33", - "HIVE_FORK_ISTANBUL": "33", - "HIVE_FORK_MUIR_GLACIER": "33", - "HIVE_FORK_BERLIN": "33", - "HIVE_FORK_LONDON": "33", - "HIVE_MERGE_BLOCK_ID": "33", - "HIVE_TERMINAL_TOTAL_DIFFICULTY": "4357120", - "HIVE_SHANGHAI_TIMESTAMP": "1444660030", - }, + Parameters: params, Files: map[string]string{ - "/genesis.json": "./init/testGenesis.json", + // The chain has originated from the Besu client. It consisted of Frontier blocks. + // It has been since extended with post-merge blocks. + "/genesis.json": genesisPath, "/chain.rlp": "./init/testBlockchain.blocks", }, Run: graphqlTest, @@ -217,3 +207,36 @@ func reindentJSON(text string) (string, bool) { indented, _ := json.MarshalIndent(&obj, "", " ") return string(indented), true } + +func loadGenesis(path string) core.Genesis { + contents, err := os.ReadFile(path) + if err != nil { + panic(fmt.Errorf("can't to read genesis file: %v", err)) + } + var genesis core.Genesis + if err := json.Unmarshal(contents, &genesis); err != nil { + panic(fmt.Errorf("can't parse genesis JSON: %v", err)) + } + return genesis +} + +func getParameters(genesis core.Genesis) hivesim.Params { + return hivesim.Params{ + "HIVE_CHAIN_ID": genesis.Config.ChainID.String(), + "HIVE_GRAPHQL_ENABLED": "1", + "HIVE_ALLOW_UNPROTECTED_TX": "1", + "HIVE_FORK_FRONTIER": "0", + "HIVE_FORK_HOMESTEAD": genesis.Config.HomesteadBlock.String(), + "HIVE_FORK_TANGERINE": genesis.Config.EIP150Block.String(), + "HIVE_FORK_SPURIOUS": genesis.Config.EIP155Block.String(), + "HIVE_FORK_BYZANTIUM": genesis.Config.ByzantiumBlock.String(), + "HIVE_FORK_CONSTANTINOPLE": genesis.Config.ConstantinopleBlock.String(), + "HIVE_FORK_PETERSBURG": genesis.Config.PetersburgBlock.String(), + "HIVE_FORK_ISTANBUL": genesis.Config.IstanbulBlock.String(), + "HIVE_FORK_MUIR_GLACIER": genesis.Config.MuirGlacierBlock.String(), + "HIVE_FORK_BERLIN": genesis.Config.BerlinBlock.String(), + "HIVE_FORK_LONDON": genesis.Config.LondonBlock.String(), + "HIVE_TERMINAL_TOTAL_DIFFICULTY": genesis.Config.TerminalTotalDifficulty.String(), + "HIVE_SHANGHAI_TIMESTAMP": fmt.Sprintf("%d", *genesis.Config.ShanghaiTime), + } +} diff --git a/simulators/ethereum/graphql/init/testBlockchain.blocks b/simulators/ethereum/graphql/init/testBlockchain.blocks index 480efc87d9fcf4bb02cebf943897e5fec7d18226..8504fd7a8c4f6d2ce1a0de17a65ed7319c1df72e 100755 GIT binary patch delta 329 zcmV-P0k;0ML z1qpZ%lfe`slR#S)Vl;Ak|0L1H9M(VF6j56h-KrIDpl2LdscdqwRX7=xU7!|bA7fxr zX{2h<#jS;wb6KZHnoTQ3sD;dEzstvUIq zo?ikv%$tL=kq!d^5P%|sU*E8TTOx#38^ck6pp(G@Ad~7`3IsGa07{XcAqIm4004lX zlfeQY7Wlllx&!#P0U?Atn#ur#vd~@tg2PagpcoYofP@mKxfH;JJDSP>_(GtO!5{;m z0Rof30v<(xplaY@Ed8W9n?_3zw1^yU!sNn5GtY^;;CVFKWy7vX&Y%)ghpw_B>`@a8 b`JBD0@=MgHfss$H)}JL#N Date: Tue, 31 Oct 2023 12:46:36 +0100 Subject: [PATCH 098/387] cmd/hivechain: add ability to create valid clique chain (#938) The hivechain tool can now create a signed clique chain. It can be important to have a chain with actually valid block seal in some test scenarios, and go-ethereum can't mine ethash blocks anymore, so clique was the only option. This pulls in a go-ethereum update to get access to an improved GenerateChain implementation. --- cmd/hivechain/generate.go | 118 +++++++++++++++++++++++--------- cmd/hivechain/genesis.go | 52 +++++++++++--- cmd/hivechain/main.go | 1 + cmd/hivechain/mod.go | 11 +-- cmd/hivechain/output_forkenv.go | 10 +++ go.mod | 39 ++++++----- go.sum | 102 +++++++++++++++++---------- 7 files changed, 234 insertions(+), 99 deletions(-) diff --git a/cmd/hivechain/generate.go b/cmd/hivechain/generate.go index 3e8d11476f..ea1860eabe 100644 --- a/cmd/hivechain/generate.go +++ b/cmd/hivechain/generate.go @@ -7,12 +7,19 @@ import ( "math/big" "strings" + "github.com/ethereum/go-ethereum/accounts" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/consensus" "github.com/ethereum/go-ethereum/consensus/beacon" + "github.com/ethereum/go-ethereum/consensus/clique" "github.com/ethereum/go-ethereum/consensus/ethash" "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/core/rawdb" + "github.com/ethereum/go-ethereum/core/state" + "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/core/vm" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/ethdb" "github.com/ethereum/go-ethereum/trie" "golang.org/x/exp/slices" ) @@ -22,6 +29,7 @@ type generatorConfig struct { // genesis options forkInterval int // number of blocks between forks lastFork string // last enabled fork + clique bool // create a clique chain // chain options txInterval int // frequency of blocks containing transactions @@ -95,66 +103,100 @@ func (cfg *generatorConfig) createBlockModifiers() (list []*modifierInstance) { return list } -// run produces a chain. +// run produces a chain and writes it. func (g *generator) run() error { db := rawdb.NewMemoryDatabase() + engine := g.createConsensusEngine(db) + + // Init genesis block. trieconfig := *trie.HashDefaults trieconfig.Preimages = true triedb := trie.NewDatabase(db, &trieconfig) genesis := g.genesis.MustCommit(db, triedb) - config := g.genesis.Config - - powEngine := ethash.NewFaker() - posEngine := beacon.New(powEngine) - engine := posEngine - // Create the PoW chain. - chain, _ := core.GenerateChain(config, genesis, engine, db, g.cfg.chainLength, g.modifyBlock) + // Create the blocks. + chain, _ := core.GenerateChain(g.genesis.Config, genesis, engine, db, g.cfg.chainLength, g.modifyBlock) // Import the chain. This runs all block validation rules. + bc, err := g.importChain(engine, chain) + if err != nil { + return err + } + + g.blockchain = bc + return g.write() +} + +func (g *generator) createConsensusEngine(db ethdb.Database) consensus.Engine { + var inner consensus.Engine + if g.genesis.Config.Clique != nil { + cliqueEngine := clique.New(g.genesis.Config.Clique, db) + cliqueEngine.Authorize(cliqueSignerAddr, func(signer accounts.Account, mimeType string, message []byte) ([]byte, error) { + sig, err := crypto.Sign(crypto.Keccak256(message), cliqueSignerKey) + return sig, err + }) + inner = instaSeal{cliqueEngine} + } else { + inner = ethash.NewFaker() + } + return beacon.New(inner) +} + +func (g *generator) importChain(engine consensus.Engine, chain []*types.Block) (*core.BlockChain, error) { + db := rawdb.NewMemoryDatabase() cacheconfig := core.DefaultCacheConfigWithScheme("hash") cacheconfig.Preimages = true vmconfig := vm.Config{EnablePreimageRecording: true} blockchain, err := core.NewBlockChain(db, cacheconfig, g.genesis, nil, engine, vmconfig, nil, nil) if err != nil { - return fmt.Errorf("can't create blockchain: %v", err) - } - defer blockchain.Stop() - if i, err := blockchain.InsertChain(chain); err != nil { - return fmt.Errorf("chain validation error (block %d): %v", chain[i].Number(), err) + return nil, fmt.Errorf("can't create blockchain: %v", err) } - // Write the outputs. - g.blockchain = blockchain - return g.write() + i, err := blockchain.InsertChain(chain) + if err != nil { + blockchain.Stop() + return nil, fmt.Errorf("chain validation error (block %d): %v", chain[i].Number(), err) + } + return blockchain, nil } func (g *generator) modifyBlock(i int, gen *core.BlockGen) { fmt.Println("generating block", gen.Number()) + if g.genesis.Config.Clique != nil { + g.setClique(i, gen) + } g.setDifficulty(i, gen) g.runModifiers(i, gen) } +func (g *generator) setClique(i int, gen *core.BlockGen) { + mergeblock := g.genesis.Config.MergeNetsplitBlock + if mergeblock != nil && gen.Number().Cmp(mergeblock) >= 0 { + return + } + + gen.SetCoinbase(cliqueSignerAddr) + // Add a positive vote to keep the signer in the set. + gen.SetNonce(types.BlockNonce{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}) + // The clique engine requires the block to have blank extra-data of the correct length + // before sealing. + gen.SetExtra(make([]byte, 32+65)) +} + func (g *generator) setDifficulty(i int, gen *core.BlockGen) { chaincfg := g.genesis.Config mergeblock := chaincfg.MergeNetsplitBlock if mergeblock == nil { mergeblock = new(big.Int).SetUint64(math.MaxUint64) } - mergecmp := gen.Number().Cmp(mergeblock) - if mergecmp > 0 { + switch gen.Number().Cmp(mergeblock) { + case 1: gen.SetPoS() - return - } - - prev := gen.PrevBlock(i - 1) - diff := ethash.CalcDifficulty(g.genesis.Config, gen.Timestamp(), prev.Header()) - if mergecmp == 0 { + case 0: gen.SetPoS() chaincfg.TerminalTotalDifficulty = new(big.Int).Set(g.td) - } else { - g.td = g.td.Add(g.td, diff) - gen.SetDifficulty(diff) + default: + g.td = g.td.Add(g.td, gen.Difficulty()) } } @@ -165,10 +207,6 @@ func (g *generator) runModifiers(i int, gen *core.BlockGen) { } ctx := &genBlockContext{index: i, block: gen, gen: g} - if gen.Number().Uint64() > 0 { - prev := gen.PrevBlock(-1) - ctx.gasLimit = core.CalcGasLimit(prev.GasLimit(), g.genesis.GasLimit) - } // Modifier scheduling: we cycle through the available modifiers until enough have // executed successfully. It also stops when all of them return false from apply() @@ -188,3 +226,21 @@ func (g *generator) runModifiers(i int, gen *core.BlockGen) { } } } + +// instaSeal wraps a consensus engine with instant block sealing. When a block is produced +// using FinalizeAndAssemble, it also applies Seal. +type instaSeal struct{ consensus.Engine } + +// FinalizeAndAssemble implements consensus.Engine, accumulating the block and uncle rewards, +// setting the final state and assembling the block. +func (e instaSeal) FinalizeAndAssemble(chain consensus.ChainHeaderReader, header *types.Header, state *state.StateDB, txs []*types.Transaction, uncles []*types.Header, receipts []*types.Receipt, withdrawals []*types.Withdrawal) (*types.Block, error) { + block, err := e.Engine.FinalizeAndAssemble(chain, header, state, txs, uncles, receipts, withdrawals) + if err != nil { + return nil, err + } + sealedBlock := make(chan *types.Block, 1) + if err = e.Engine.Seal(chain, block, sealedBlock, nil); err != nil { + return nil, err + } + return <-sealedBlock, nil +} diff --git a/cmd/hivechain/genesis.go b/cmd/hivechain/genesis.go index d45d1e5571..c482280268 100644 --- a/cmd/hivechain/genesis.go +++ b/cmd/hivechain/genesis.go @@ -1,11 +1,13 @@ package main import ( + "crypto/ecdsa" "fmt" "math/big" "strings" "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/params" "golang.org/x/exp/slices" ) @@ -13,9 +15,14 @@ import ( var initialBalance, _ = new(big.Int).SetString("1000000000000000000000000000000000000", 10) const ( - ethashMinimumDifficulty = 131072 - genesisBaseFee = params.InitialBaseFee - blocktimeSec = 10 // hard-coded in core.GenerateChain + genesisBaseFee = params.InitialBaseFee + blocktimeSec = 10 // hard-coded in core.GenerateChain + cliqueEpoch = 30000 +) + +var ( + cliqueSignerKey = knownAccounts[8].key + cliqueSignerAddr = crypto.PubkeyToAddress(cliqueSignerKey.PublicKey) ) // Ethereum mainnet forks in order of introduction. @@ -52,7 +59,16 @@ func (cfg *generatorConfig) createChainConfig() *params.ChainConfig { chainid, _ := new(big.Int).SetString("3503995874084926", 10) chaincfg.ChainID = chainid - chaincfg.Ethash = new(params.EthashConfig) + + // Set consensus algorithm. + if cfg.clique { + chaincfg.Clique = ¶ms.CliqueConfig{ + Period: blocktimeSec, + Epoch: cliqueEpoch, + } + } else { + chaincfg.Ethash = new(params.EthashConfig) + } // Apply forks. forks := cfg.forkBlocks() @@ -104,20 +120,31 @@ func (cfg *generatorConfig) createChainConfig() *params.ChainConfig { // Special case for merged-from-genesis networks. // Need to assign TTD here because the genesis block won't be processed by GenerateChain. if chaincfg.MergeNetsplitBlock != nil && chaincfg.MergeNetsplitBlock.Sign() == 0 { - chaincfg.TerminalTotalDifficulty = big.NewInt(ethashMinimumDifficulty) + chaincfg.TerminalTotalDifficulty = cfg.genesisDifficulty() } return chaincfg } +func (cfg *generatorConfig) genesisDifficulty() *big.Int { + if cfg.clique { + return big.NewInt(1) + } + return new(big.Int).Set(params.MinimumDifficulty) +} + // createGenesis creates the genesis block and config. func (cfg *generatorConfig) createGenesis() *core.Genesis { var g core.Genesis g.Config = cfg.createChainConfig() // Block attributes. - g.Difficulty = big.NewInt(ethashMinimumDifficulty) - g.ExtraData = []byte("hivechain") + g.Difficulty = cfg.genesisDifficulty() + if cfg.clique { + g.ExtraData = cliqueInit(cliqueSignerKey) + } else { + g.ExtraData = []byte("hivechain") + } g.GasLimit = params.GenesisGasLimit * 8 zero := new(big.Int) if g.Config.IsLondon(zero) { @@ -160,7 +187,7 @@ func (cfg *generatorConfig) forkBlocks() map[string]uint64 { // lastForkIndex returns the index of the latest enabled for in allForkNames. func (cfg *generatorConfig) lastForkIndex() int { - if cfg.lastFork == "" { + if cfg.lastFork == "" || cfg.lastFork == "frontier" { return len(allForkNames) - 1 } index := slices.Index(allForkNames, strings.ToLower(cfg.lastFork)) @@ -173,3 +200,12 @@ func (cfg *generatorConfig) lastForkIndex() int { func (cfg *generatorConfig) blockTimestamp(num uint64) uint64 { return num * blocktimeSec } + +// cliqueInit creates the genesis extradata for a clique network with one signer. +func cliqueInit(signer *ecdsa.PrivateKey) []byte { + vanity := make([]byte, 32) + copy(vanity, "hivechain") + d := append(vanity, cliqueSignerAddr[:]...) + d = append(d, make([]byte, 65)...) // signature + return d +} diff --git a/cmd/hivechain/main.go b/cmd/hivechain/main.go index 2d9d373b73..e742871859 100644 --- a/cmd/hivechain/main.go +++ b/cmd/hivechain/main.go @@ -66,6 +66,7 @@ func generateCommand(args []string) { flag.IntVar(&cfg.forkInterval, "fork-interval", 0, "Number of blocks between fork activations") flag.StringVar(&cfg.outputDir, "outdir", ".", "Destination directory") flag.StringVar(&cfg.lastFork, "lastfork", "", "Name of the last fork to activate") + flag.BoolVar(&cfg.clique, "clique", false, "Create a clique chain") flag.CommandLine.Parse(args) if *outlist != "" { diff --git a/cmd/hivechain/mod.go b/cmd/hivechain/mod.go index cfc8b7d16e..37b5f89acf 100644 --- a/cmd/hivechain/mod.go +++ b/cmd/hivechain/mod.go @@ -25,9 +25,6 @@ type genBlockContext struct { index int block *core.BlockGen gen *generator - - gasLimit uint64 - txCount int } // Number returns the block number. @@ -47,7 +44,7 @@ func (ctx *genBlockContext) Timestamp() uint64 { // HasGas reports whether the block still has more than the given amount of gas left. func (ctx *genBlockContext) HasGas(gas uint64) bool { - return ctx.gasLimit > gas + return ctx.block.Gas() > gas } // AddNewTx adds a transaction into the block. @@ -56,11 +53,7 @@ func (ctx *genBlockContext) AddNewTx(sender *genAccount, data types.TxData) *typ if err != nil { panic(err) } - if ctx.gasLimit < tx.Gas() { - panic("not enough gas for tx") - } ctx.block.AddTx(tx) - ctx.gasLimit -= tx.Gas() return tx } @@ -99,7 +92,7 @@ func (ctx *genBlockContext) AccountNonce(addr common.Address) uint64 { // Signer returns a signer for the current block. func (ctx *genBlockContext) Signer() types.Signer { - return types.MakeSigner(ctx.ChainConfig(), ctx.block.Number(), ctx.block.Timestamp()) + return ctx.block.Signer() } // ChainConfig returns the chain config. diff --git a/cmd/hivechain/output_forkenv.go b/cmd/hivechain/output_forkenv.go index 162d1dec56..25f7f65d40 100644 --- a/cmd/hivechain/output_forkenv.go +++ b/cmd/hivechain/output_forkenv.go @@ -9,9 +9,19 @@ import ( func (g *generator) writeForkEnv() error { cfg := g.genesis.Config env := make(map[string]string) + + // basic settings env["HIVE_CHAIN_ID"] = fmt.Sprint(cfg.ChainID) env["HIVE_NETWORK_ID"] = fmt.Sprint(cfg.ChainID) + // config consensus algorithm + if cfg.Clique != nil { + env["HIVE_CLIQUE_PERIOD"] = fmt.Sprint(cfg.Clique.Period) + } else { + env["HIVE_SKIP_POW"] = "1" + } + + // forks setNum := func(hive string, blocknum *big.Int) { if blocknum != nil { env[hive] = blocknum.Text(10) diff --git a/go.mod b/go.mod index 01582a1704..db59039cba 100644 --- a/go.mod +++ b/go.mod @@ -4,13 +4,13 @@ go 1.20 require ( github.com/davecgh/go-spew v1.1.1 - github.com/ethereum/go-ethereum v1.13.1 + github.com/ethereum/go-ethereum v1.13.5-0.20231031113925-bc42e88415d3 github.com/ethereum/hive/hiveproxy v0.0.0-20230919105823-37cbbe1ef86d github.com/evanw/esbuild v0.18.11 github.com/fsouza/go-dockerclient v1.9.8 github.com/gorilla/mux v1.8.0 - golang.org/x/exp v0.0.0-20230810033253-352e893a4cad - golang.org/x/net v0.10.0 + golang.org/x/exp v0.0.0-20230905200255-921286631fa9 + golang.org/x/net v0.17.0 gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1 gopkg.in/yaml.v3 v3.0.1 ) @@ -19,33 +19,37 @@ require ( github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 // indirect github.com/DataDog/zstd v1.5.2 // indirect github.com/Microsoft/go-winio v0.6.1 // indirect - github.com/VictoriaMetrics/fastcache v1.12.0 // indirect + github.com/VictoriaMetrics/fastcache v1.12.1 // indirect github.com/allegro/bigcache v1.2.1 // indirect github.com/beorn7/perks v1.0.1 // indirect - github.com/bits-and-blooms/bitset v1.5.0 // indirect + github.com/bits-and-blooms/bitset v1.7.0 // indirect github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/cockroachdb/errors v1.9.1 // indirect github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect - github.com/cockroachdb/pebble v0.0.0-20230906160148-46873a6a7a06 // indirect + github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593 // indirect github.com/cockroachdb/redact v1.1.3 // indirect + github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect github.com/consensys/bavard v0.1.13 // indirect - github.com/consensys/gnark-crypto v0.10.0 // indirect + github.com/consensys/gnark-crypto v0.12.1 // indirect github.com/containerd/containerd v1.6.18 // indirect - github.com/crate-crypto/go-kzg-4844 v0.3.0 // indirect + github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect + github.com/crate-crypto/go-kzg-4844 v0.7.0 // indirect github.com/deckarep/golang-set/v2 v2.1.0 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 // indirect github.com/docker/docker v24.0.5+incompatible // indirect github.com/docker/go-connections v0.4.0 // indirect github.com/docker/go-units v0.5.0 // indirect - github.com/ethereum/c-kzg-4844 v0.3.1 // indirect + github.com/ethereum/c-kzg-4844 v0.4.0 // indirect + github.com/fsnotify/fsnotify v1.6.0 // indirect github.com/getsentry/sentry-go v0.18.0 // indirect github.com/go-ole/go-ole v1.2.6 // indirect github.com/go-stack/stack v1.8.1 // indirect github.com/gofrs/flock v0.8.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang/protobuf v1.5.2 // indirect + github.com/golang/protobuf v1.5.3 // indirect github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect + github.com/google/uuid v1.3.0 // indirect github.com/gorilla/websocket v1.5.0 // indirect github.com/hashicorp/yamux v0.1.1 // indirect github.com/holiman/bloomfilter/v2 v2.0.3 // indirect @@ -54,7 +58,7 @@ require ( github.com/kr/pretty v0.3.1 // indirect github.com/kr/text v0.2.0 // indirect github.com/mattn/go-colorable v0.1.13 // indirect - github.com/mattn/go-isatty v0.0.16 // indirect + github.com/mattn/go-isatty v0.0.17 // indirect github.com/mattn/go-runewidth v0.0.14 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect github.com/mmcloughlin/addchain v0.4.0 // indirect @@ -73,19 +77,22 @@ require ( github.com/prometheus/procfs v0.9.0 // indirect github.com/rivo/uniseg v0.4.3 // indirect github.com/rogpeppe/go-internal v1.9.0 // indirect + github.com/russross/blackfriday/v2 v2.1.0 // indirect github.com/shirou/gopsutil v3.21.11+incompatible // indirect github.com/sirupsen/logrus v1.9.0 // indirect github.com/supranational/blst v0.3.11 // indirect github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a // indirect github.com/tklauser/go-sysconf v0.3.12 // indirect github.com/tklauser/numcpus v0.6.1 // indirect + github.com/urfave/cli/v2 v2.25.7 // indirect + github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 // indirect github.com/yusufpapurcu/wmi v1.2.2 // indirect - golang.org/x/crypto v0.12.0 // indirect - golang.org/x/mod v0.11.0 // indirect + golang.org/x/crypto v0.14.0 // indirect + golang.org/x/mod v0.12.0 // indirect golang.org/x/sync v0.3.0 // indirect - golang.org/x/sys v0.11.0 // indirect - golang.org/x/text v0.12.0 // indirect - golang.org/x/tools v0.9.1 // indirect + golang.org/x/sys v0.13.0 // indirect + golang.org/x/text v0.13.0 // indirect + golang.org/x/tools v0.13.0 // indirect google.golang.org/protobuf v1.28.1 // indirect rsc.io/tmplfunc v0.0.3 // indirect ) diff --git a/go.sum b/go.sum index c2c5cd16fe..d6d14b5d43 100644 --- a/go.sum +++ b/go.sum @@ -13,8 +13,8 @@ github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migc github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= github.com/Microsoft/hcsshim v0.9.6 h1:VwnDOgLeoi2du6dAznfmspNqTiwczvjv4K7NxuY9jsY= github.com/Shopify/goreferrer v0.0.0-20181106222321-ec9c9a553398/go.mod h1:a1uqRtAwp2Xwc6WNPJEufxJ7fx3npB4UV/JOLmbu5I0= -github.com/VictoriaMetrics/fastcache v1.12.0 h1:vnVi/y9yKDcD9akmc4NqAoqgQhJrOwUF+j9LTgn4QDE= -github.com/VictoriaMetrics/fastcache v1.12.0/go.mod h1:tjiYeEfYXCqacuvYw/7UoDIeJaNxq6132xHICNP77w8= +github.com/VictoriaMetrics/fastcache v1.12.1 h1:i0mICQuojGDL3KblA7wUNlY5lOK6a4bwt3uRKnkZU40= +github.com/VictoriaMetrics/fastcache v1.12.1/go.mod h1:tX04vaqcNoQeGLD+ra5pU5sWkuxnzWhEzLwhP9w653o= github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY= github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= github.com/allegro/bigcache v1.2.1 h1:hg1sY1raCwic3Vnsvje6TT7/pnZba83LeFck5NrFKSc= @@ -23,13 +23,13 @@ github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5 github.com/aymerick/raymond v2.0.3-0.20180322193309-b565731e1464+incompatible/go.mod h1:osfaiScAUVup+UC9Nfq76eWqDhXlp+4UYaA8uhTBO6g= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bits-and-blooms/bitset v1.5.0 h1:NpE8frKRLGHIcEzkR+gZhiioW1+WbYV6fKwD6ZIpQT8= -github.com/bits-and-blooms/bitset v1.5.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= +github.com/bits-and-blooms/bitset v1.7.0 h1:YjAGVd3XmtK9ktAbX8Zg2g2PwLIMjGREZJHlV4j7NEo= +github.com/bits-and-blooms/bitset v1.7.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U= github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/cp v0.1.0 h1:SE+dxFebS7Iik5LK0tsi1k9ZCxEaFX4AjQmoyA+1dJk= github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/checkpoint-restore/go-criu/v5 v5.3.0/go.mod h1:E/eQpaFtUKGOOSEBZgmKAcn+zUUwWxqcaKZlF54wK8E= @@ -40,21 +40,23 @@ github.com/cilium/ebpf v0.7.0/go.mod h1:/oI2+1shJiTGAMgl6/RgJr36Eo1jzrRcAWbcXO2u github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cockroachdb/datadriven v1.0.2/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= -github.com/cockroachdb/datadriven v1.0.3-0.20230801171734-e384cf455877 h1:1MLK4YpFtIEo3ZtMA5C795Wtv5VuUnrXX7mQG+aHg6o= +github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f h1:otljaYPt5hWxV3MUfO5dFPFiOXg9CyG5/kCfayTqsJ4= github.com/cockroachdb/errors v1.9.1 h1:yFVvsI0VxmRShfawbt/laCIDy/mtTqqnvoNgiy5bEV8= github.com/cockroachdb/errors v1.9.1/go.mod h1:2sxOtL2WIc096WSZqZ5h8fa17rdDq9HZOZLBCor4mBk= github.com/cockroachdb/logtags v0.0.0-20211118104740-dabe8e521a4f/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= -github.com/cockroachdb/pebble v0.0.0-20230906160148-46873a6a7a06 h1:T+Np/xtzIjYM/P5NAw0e2Rf1FGvzDau1h54MKvx8G7w= -github.com/cockroachdb/pebble v0.0.0-20230906160148-46873a6a7a06/go.mod h1:bynZ3gvVyhlvjLI7PT6dmZ7g76xzJ7HpxfjgkzCGz6s= +github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593 h1:aPEJyR4rPBvDmeyi+l/FS/VtA00IWvjeFvjen1m1l1A= +github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593/go.mod h1:6hk1eMY/u5t+Cf18q5lFMUA1Rc+Sm5I6Ra1QuPyxXCo= github.com/cockroachdb/redact v1.1.3 h1:AKZds10rFSIj7qADf0g46UixK8NNLwWTNdCIGS5wfSQ= github.com/cockroachdb/redact v1.1.3/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= +github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo= +github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ= github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0/go.mod h1:4Zcjuz89kmFXt9morQgcfYZAYZ5n8WHjt81YYWIwtTM= github.com/consensys/bavard v0.1.13 h1:oLhMLOFGTLdlda/kma4VOJazblc7IM5y5QPd2A/YjhQ= github.com/consensys/bavard v0.1.13/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI= -github.com/consensys/gnark-crypto v0.10.0 h1:zRh22SR7o4K35SoNqouS9J/TKHTyU2QWaj5ldehyXtA= -github.com/consensys/gnark-crypto v0.10.0/go.mod h1:Iq/P3HHl0ElSjsg2E1gsMwhAyxnxoKK5nVyZKd+/KhU= +github.com/consensys/gnark-crypto v0.12.1 h1:lHH39WuuFgVHONRl3J0LRBtuYdQTumFSDtJF7HpyG8M= +github.com/consensys/gnark-crypto v0.12.1/go.mod h1:v2Gy7L/4ZRosZ7Ivs+9SfUDr0f5UlG+EM5t7MPHiLuY= github.com/containerd/console v1.0.3/go.mod h1:7LqA/THxQ86k76b8c/EMSiaJ3h1eZkMkXar0TQ1gf3U= github.com/containerd/containerd v1.6.18 h1:qZbsLvmyu+Vlty0/Ex5xc0z2YtKpIsb5n45mAMI+2Ns= github.com/containerd/containerd v1.6.18/go.mod h1:1RdCUu95+gc2v9t3IL+zIlpClSmew7/0YS8O5eQZrOw= @@ -64,8 +66,10 @@ github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3Ee github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/crate-crypto/go-kzg-4844 v0.3.0 h1:UBlWE0CgyFqqzTI+IFyCzA7A3Zw4iip6uzRv5NIXG0A= -github.com/crate-crypto/go-kzg-4844 v0.3.0/go.mod h1:SBP7ikXEgDnUPONgm33HtuDZEDtWa3L4QtN1ocJSEQ4= +github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= +github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/crate-crypto/go-kzg-4844 v0.7.0 h1:C0vgZRk4q4EZ/JgPfzuSoxdCq3C3mOZMBShovmncxvA= +github.com/crate-crypto/go-kzg-4844 v0.7.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/creack/pty v1.1.11 h1:07n33Z8lZxZ2qwegKbObQohDhXDQxiMMz1NOUGYlesw= github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= @@ -94,22 +98,25 @@ github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.m github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/etcd-io/bbolt v1.3.3/go.mod h1:ZF2nL25h33cCyBtcyWeZ2/I3HQOfTP+0PIEvHjkjCrw= -github.com/ethereum/c-kzg-4844 v0.3.1 h1:sR65+68+WdnMKxseNWxSJuAv2tsUrihTpVBTfM/U5Zg= -github.com/ethereum/c-kzg-4844 v0.3.1/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= -github.com/ethereum/go-ethereum v1.13.1 h1:UF2FaUKPIy5jeZk3X06ait3y2Q4wI+vJ1l7+UARp+60= -github.com/ethereum/go-ethereum v1.13.1/go.mod h1:xHQKzwkHSl0gnSjZK1mWa06XEdm9685AHqhRknOzqGQ= +github.com/ethereum/c-kzg-4844 v0.4.0 h1:3MS1s4JtA868KpJxroZoepdV0ZKBp3u/O5HcZ7R3nlY= +github.com/ethereum/c-kzg-4844 v0.4.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= +github.com/ethereum/go-ethereum v1.13.5-0.20231031113925-bc42e88415d3 h1:i4TE0DmzMYcr2IiCdlTGGk+7Q/EzXvBKbbG4uRxMjJ0= +github.com/ethereum/go-ethereum v1.13.5-0.20231031113925-bc42e88415d3/go.mod h1:yMTu38GSuyxaYzQMViqNmQ1s3cE84abZexQmTgenWk0= github.com/evanw/esbuild v0.18.11 h1:Mb0qb9KyJQraob0Y7LA0DOdD8ijJs2TxhqgqrDeGq4w= github.com/evanw/esbuild v0.18.11/go.mod h1:iINY06rn799hi48UqEnaQvVfZWe6W9bET78LbvN8VWk= github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072/go.mod h1:duJ4Jxv5lDcvg4QuQr0oowTf7dz4/CR8NtyCooz9HL8= github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= +github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5 h1:FtmdgXiUlNeRsoNMFlKLDt+S+6hbjVMEW6RGQ7aUf7c= github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= +github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= github.com/fsouza/go-dockerclient v1.9.8 h1:UdfyV4/w8VthS2VS0muJqUSPL/e6XSj49jqPnbuUOWA= github.com/fsouza/go-dockerclient v1.9.8/go.mod h1:74lNReDQxrOaogajs51IvZgkDME4qe9yPJAUEUTJtHw= github.com/gavv/httpexpect v2.0.0+incompatible/go.mod h1:x+9tiU1YnrOvnB725RkpoLv1M62hOWzwo5OXotisrKc= +github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff h1:tY80oXqGNY4FhTFhk+o9oFHGINQ/+vhlm8HFzi6znCI= github.com/getsentry/sentry-go v0.12.0/go.mod h1:NSap0JBYWzHND8oMbyi0+XZhUalc1TBdRL1M71JZW2c= github.com/getsentry/sentry-go v0.18.0 h1:MtBW5H9QgdcJabtZcuJG80BMOwaBpkRDZkxRkNC1sN0= github.com/getsentry/sentry-go v0.18.0/go.mod h1:Kgon4Mby+FJ7ZWHFUAZgVaIa8sxHtnRJRLTXZr51aKQ= @@ -137,7 +144,9 @@ github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7a github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/gogo/status v1.1.0/go.mod h1:BFv9nrluPLmrS0EmGVvLaPNmRosr9KapBYd5/hpY1WM= +github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY= github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= +github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -152,8 +161,9 @@ github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvq github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= +github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXiurYmW7fx4GZkL8feAMVq7nEjURHk= github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= @@ -171,21 +181,26 @@ github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/ github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= +github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/hashicorp/go-bexpr v0.1.10 h1:9kuI5PFotCboP3dkDYFr/wi0gg0QVbSNz5oFRpxn4uE= github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hashicorp/yamux v0.1.1 h1:yrQxtgseBDrq9Y652vSRDvsKCJKOUD+GzTS4Y0Y8pvE= github.com/hashicorp/yamux v0.1.1/go.mod h1:CtWFDAQgb7dxtzFs4tWbplKIe2jSi3+5vKbgIO0SLnQ= +github.com/holiman/billy v0.0.0-20230718173358-1c7e68d277a7 h1:3JQNjnMRil1yD0IfZKHF9GxxWKDJGj8I0IqOUol//sw= github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao= github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA= github.com/holiman/uint256 v1.2.3 h1:K8UWO1HUJpRMXBxbmaY1Y8IAMZC/RsKB+ArEnnK4l5o= github.com/holiman/uint256 v1.2.3/go.mod h1:SC8Ryt4n+UBbPbIBKaG9zbbDlp4jOru9xFZmPzLUTxw= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/huin/goupnp v1.3.0 h1:UvLUlWDNpoUdYzb2TCn+MuTWtcjXKSza2n6CBdQ0xXc= github.com/hydrogen18/memlistener v0.0.0-20200120041712-dcc25e7acd91/go.mod h1:qEIFzExnS6016fRpRfxrExeVn2gbClQA99gQhnIcdhE= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/imkira/go-interpol v1.1.0/go.mod h1:z0h2/2T3XF8kyEPpRgJ3kmNv+C43p+I/CoI+jC3w2iA= @@ -195,6 +210,7 @@ github.com/iris-contrib/go.uuid v2.0.0+incompatible/go.mod h1:iz2lgM/1UnEf1kP0L/ github.com/iris-contrib/jade v1.1.3/go.mod h1:H/geBymxJhShH5kecoiOCSssPX7QWYH7UaeZTSWddIk= github.com/iris-contrib/pongo2 v0.0.1/go.mod h1:Ssh+00+3GAZqSQb30AvBRNxBx7rf0GqwkjqxNd0u65g= github.com/iris-contrib/schema v0.0.1/go.mod h1:urYA3uvUNG1TIIjOSCzHr9/LmbQo8LrOcOqfqxa4hXw= +github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= @@ -235,8 +251,9 @@ github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hd github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= -github.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peKQ= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng= +github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.14 h1:+xnbZSEeDbOIg5/mE6JF0w6n9duR1l3/WmbinWVwUuU= github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= @@ -247,6 +264,8 @@ github.com/mediocregopher/radix/v3 v3.4.2/go.mod h1:8FL3F6UQRXHXIBSPUs5h0RybMF8i github.com/microcosm-cc/bluemonday v1.0.2/go.mod h1:iVP4YcDBq+n/5fb23BhYFvIMq/leAFZyRl6bYmGDlGc= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.4.1 h1:CpVNEelQCZBooIPDn+AR3NpivK/TIKU8bDxdASFVQag= +github.com/mitchellh/pointerstructure v1.2.0 h1:O+i9nHnXS3l/9Wu7r4NrEdwA2VFTicjUEN1uBnDo34A= github.com/mmcloughlin/addchain v0.4.0 h1:SobOdjm2xLj1KkXN5/n0xTIWyZA2+s99UCY1iPfkHRY= github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqkyU72HC5wJ4RlU= github.com/mmcloughlin/profile v0.1.1/go.mod h1:IhHD7q1ooxgwTgjxQYkACGA77oFTDdFVejUS1/tS/qU= @@ -319,8 +338,11 @@ github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTE github.com/rogpeppe/go-internal v1.8.1/go.mod h1:JeRgkft04UBgHMgCIwADu4Pn6Mtm5d4nPKWu0nJ5d+o= github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= +github.com/rs/cors v1.7.0 h1:+88SsELBHx5r+hZ8TCkggzSstaWNbDvThkVK8H6f9ik= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/schollz/closestmatch v2.1.0+incompatible/go.mod h1:RtP1ddjLong6gTkbtmuhtR2uUrrJOpYzYRvbcPAid+g= github.com/seccomp/libseccomp-golang v0.9.2-0.20220502022130-f33da4d89646/go.mod h1:JA8cRccbGaA1s33RQf7Y1+q9gHmZX1yB/z9WDN1C6fg= @@ -339,6 +361,7 @@ github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tL github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= +github.com/status-im/keycard-go v0.2.0 h1:QDLFswOQu1r5jsycloeQh3bVU8n/NatHHaZobtDnDzA= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= @@ -346,7 +369,7 @@ github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81P github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= -github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/supranational/blst v0.3.11 h1:LyU6FolezeWAhvQk0k6O/d49jqgO52MSDDfYgbeoEm4= github.com/supranational/blst v0.3.11/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= @@ -356,11 +379,14 @@ github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFA github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= +github.com/tyler-smith/go-bip39 v1.1.0 h1:5eUemwrMargf3BSLRRCalXT93Ns6pQJIjYQN2nyfOP8= github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +github.com/urfave/cli/v2 v2.25.7 h1:VAzn5oq403l5pHjc4OhD54+XGO9cdKVL/7lDjF+iKUs= +github.com/urfave/cli/v2 v2.25.7/go.mod h1:8qnjx1vcq5s2/wpsqoZFndg2CE5tNFyrTvS6SinrnYQ= github.com/urfave/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/valyala/fasthttp v1.6.0/go.mod h1:FstJa9V+Pj9vQ7OJie2qMHdwemEDaDiSdBnvPM1Su9w= @@ -373,6 +399,8 @@ github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2 github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= +github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU= +github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8= github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0/go.mod h1:/LWChgwKmvncFJFHJ7Gvn9wZArjbV5/FppcK2fKk/tI= github.com/yudai/gojsondiff v1.0.0/go.mod h1:AY32+k2cwILAkW1fbgxQ5mUmMiZFgLIV+FBNExI05xg= github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82/go.mod h1:lgjkn3NuSvDfVJdfcVVdX+jpBxNmX4rDAzaS45IcYoM= @@ -390,11 +418,11 @@ golang.org/x/crypto v0.0.0-20191227163750-53104e6ec876/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.12.0 h1:tFM/ta59kqch6LlvYnPa0yx5a83cL2nHflFhYKvv9Yk= -golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= +golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= +golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20230810033253-352e893a4cad h1:g0bG7Z4uG+OgH2QDODnjp6ggkk1bJDsINcuWmJN1iJU= -golang.org/x/exp v0.0.0-20230810033253-352e893a4cad/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc= +golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g= +golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= @@ -403,8 +431,8 @@ golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzB golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.11.0 h1:bUO06HqtnRcc/7l71XBe4WcqTZ+3AH1J59zWDDwLKgU= -golang.org/x/mod v0.11.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc= +golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -427,8 +455,8 @@ golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT golang.org/x/net v0.0.0-20211008194852-3b03d305991f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M= -golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= +golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -477,26 +505,29 @@ golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20211116061358-0a5406a5449c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220405052023-b1e9470b6e64/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= +golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.11.0 h1:F9tnn/DA/Im8nCwm+fX+1/eBwi4qFjRT++MhtVC4ZX0= +golang.org/x/term v0.13.0 h1:bb+I9cTfFazGW51MZqBVmZy7+JEJMouUHTUSKVQLBek= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc= -golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= +golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181221001348-537d06c36207/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -512,8 +543,8 @@ golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roY golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.9.1 h1:8WMNJAz3zrtPmnYC7ISf5dEn3MT0gY7jBJfw27yrrLo= -golang.org/x/tools v0.9.1/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc= +golang.org/x/tools v0.13.0 h1:Iey4qkscZuv0VvIt8E0neZjtPVQFSc870HQ448QgEmQ= +golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -558,6 +589,7 @@ gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1 h1:iiHuQZCN gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= gopkg.in/ini.v1 v1.51.1/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= +gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= @@ -571,7 +603,7 @@ gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= -gotest.tools/v3 v3.5.0 h1:Ljk6PdHdOhAb5aDMWXjDLMMhph+BpztA4v1QdqEW2eY= +gotest.tools/v3 v3.5.1 h1:EENdUnS3pdur5nybKYIh2Vfgc8IUNBjxDPSjtiJcOzU= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= rsc.io/tmplfunc v0.0.3 h1:53XFQh69AfOa8Tw0Jm7t+GV7KZhOi6jzsCzTtKbMvzU= From d6e9de94f19d20dbbaa431fed701debc472669cb Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Tue, 31 Oct 2023 13:16:40 +0100 Subject: [PATCH 099/387] simulators/ethereum/sync: use engine API to trigger sync (#922) This updates the ethereum/sync simulator to use a newer post-merge chain. Sync is now triggered via the engine API. --- simulators/ethereum/sync/chain/chain.rlp | Bin 0 -> 1128420 bytes simulators/ethereum/sync/chain/forkenv.json | 20 + simulators/ethereum/sync/chain/genesis.json | 98 +++++ simulators/ethereum/sync/chain/headblock.json | 23 ++ simulators/ethereum/sync/chain/headfcu.json | 13 + .../ethereum/sync/chain/headnewpayload.json | 26 ++ simulators/ethereum/sync/go.mod | 50 ++- simulators/ethereum/sync/go.sum | 341 +++++++++++++++++- simulators/ethereum/sync/mkchain.sh | 12 + .../ethereum/sync/simplechain/chain.rlp | Bin 1544806 -> 0 bytes .../sync/simplechain/chain_poststate.json | 245 ------------- .../ethereum/sync/simplechain/genesis.json | 26 -- simulators/ethereum/sync/sync.go | 149 ++++++-- 13 files changed, 680 insertions(+), 323 deletions(-) create mode 100644 simulators/ethereum/sync/chain/chain.rlp create mode 100644 simulators/ethereum/sync/chain/forkenv.json create mode 100644 simulators/ethereum/sync/chain/genesis.json create mode 100644 simulators/ethereum/sync/chain/headblock.json create mode 100644 simulators/ethereum/sync/chain/headfcu.json create mode 100644 simulators/ethereum/sync/chain/headnewpayload.json create mode 100644 simulators/ethereum/sync/mkchain.sh delete mode 100644 simulators/ethereum/sync/simplechain/chain.rlp delete mode 100644 simulators/ethereum/sync/simplechain/chain_poststate.json delete mode 100644 simulators/ethereum/sync/simplechain/genesis.json diff --git a/simulators/ethereum/sync/chain/chain.rlp b/simulators/ethereum/sync/chain/chain.rlp new file mode 100644 index 0000000000000000000000000000000000000000..480bf3e508edb0e3d571f3745e9ee5b2c34fede4 GIT binary patch literal 1128420 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

AN_LdR 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

-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�)UURpbtqj`QV?!Z^YccH&$_Q8 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 GKK>sZuY;rj literal 0 HcmV?d00001 diff --git a/simulators/ethereum/sync/chain/forkenv.json b/simulators/ethereum/sync/chain/forkenv.json new file mode 100644 index 0000000000..d1bcbac15b --- /dev/null +++ b/simulators/ethereum/sync/chain/forkenv.json @@ -0,0 +1,20 @@ +{ + "HIVE_CHAIN_ID": "3503995874084926", + "HIVE_FORK_ARROW_GLACIER": "0", + "HIVE_FORK_BERLIN": "0", + "HIVE_FORK_BYZANTIUM": "0", + "HIVE_FORK_CONSTANTINOPLE": "0", + "HIVE_FORK_GRAY_GLACIER": "0", + "HIVE_FORK_HOMESTEAD": "0", + "HIVE_FORK_ISTANBUL": "0", + "HIVE_FORK_LONDON": "0", + "HIVE_FORK_MUIR_GLACIER": "0", + "HIVE_FORK_PETERSBURG": "0", + "HIVE_FORK_SPURIOUS": "0", + "HIVE_FORK_TANGERINE": "0", + "HIVE_MERGE_BLOCK_ID": "0", + "HIVE_NETWORK_ID": "3503995874084926", + "HIVE_SHANGHAI_TIMESTAMP": "0", + "HIVE_SKIP_POW": "1", + "HIVE_TERMINAL_TOTAL_DIFFICULTY": "131072" +} \ No newline at end of file diff --git a/simulators/ethereum/sync/chain/genesis.json b/simulators/ethereum/sync/chain/genesis.json new file mode 100644 index 0000000000..2bdaa811a8 --- /dev/null +++ b/simulators/ethereum/sync/chain/genesis.json @@ -0,0 +1,98 @@ +{ + "config": { + "chainId": 3503995874084926, + "homesteadBlock": 0, + "eip150Block": 0, + "eip155Block": 0, + "eip158Block": 0, + "byzantiumBlock": 0, + "constantinopleBlock": 0, + "petersburgBlock": 0, + "istanbulBlock": 0, + "muirGlacierBlock": 0, + "berlinBlock": 0, + "londonBlock": 0, + "arrowGlacierBlock": 0, + "grayGlacierBlock": 0, + "mergeNetsplitBlock": 0, + "shanghaiTime": 0, + "terminalTotalDifficulty": 131072, + "terminalTotalDifficultyPassed": true, + "ethash": {} + }, + "nonce": "0x0", + "timestamp": "0x0", + "extraData": "0x68697665636861696e", + "gasLimit": "0x23f3e20", + "difficulty": "0x20000", + "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "coinbase": "0x0000000000000000000000000000000000000000", + "alloc": { + "0c2c51a0990aee1d73c1228de158688341557508": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "14e46043e63d0e3cdcf2530519f4cfaf35058cb2": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "16c57edf7fa9d9525378b0b81bf8a3ced0620c1c": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "1f4924b14f34e24159387c0a4cdbaa32f3ddb0cf": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "1f5bde34b4afc686f136c7a3cb6ec376f7357759": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "2d389075be5be9f2246ad654ce152cf05990b209": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "3ae75c08b4c907eb63a8960c45b86e1e9ab6123c": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "4340ee1b812acb40a1eb561c019c327b243b92df": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "4a0f1452281bcec5bd90c3dce6162a5995bfe9df": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "4dde844b71bcdf95512fb4dc94e84fb67b512ed8": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "5f552da00dfb4d3749d9e62dcee3c918855a86a0": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "654aa64f5fbefb84c270ec74211b81ca8c44a72e": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "717f8aa2b982bee0e29f573d31df288663e1ce16": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "7435ed30a8b4aeb0877cef0c6e8cffe834eb865f": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "83c7e323d189f18725ac510004fdc2941f8c4a78": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "84e75c28348fb86acea1a93a39426d7d60f4cc46": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "c7b99a164efd027a93f147376cc7da7c67c6bbe0": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "d803681e487e6ac18053afc5a6cd813c86ec3e4d": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "e7d13f7aa2a838d24c59b40186a0aca1e21cffcc": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "eda8645ba6948855e3b3cd596bbb07596d59c603": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + } + }, + "number": "0x0", + "gasUsed": "0x0", + "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "baseFeePerGas": "0x3b9aca00", + "excessBlobGas": null, + "blobGasUsed": null +} \ No newline at end of file diff --git a/simulators/ethereum/sync/chain/headblock.json b/simulators/ethereum/sync/chain/headblock.json new file mode 100644 index 0000000000..3edbfa8d89 --- /dev/null +++ b/simulators/ethereum/sync/chain/headblock.json @@ -0,0 +1,23 @@ +{ + "parentHash": "0x3303c6e3577579843c427f795d7485abdddc55694b5a37af0b32b48259ebe103", + "sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", + "miner": "0x0000000000000000000000000000000000000000", + "stateRoot": "0xfcb007db24cf6a31105b3382273fcf9ee3168acb2a3356d32a598302a4fc448d", + "transactionsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "difficulty": "0x0", + "number": "0x7d0", + "gasLimit": "0x23f3e20", + "gasUsed": "0x0", + "timestamp": "0x4e20", + "extraData": "0x", + "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "nonce": "0x0000000000000000", + "baseFeePerGas": "0x7", + "withdrawalsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "blobGasUsed": null, + "excessBlobGas": null, + "parentBeaconBlockRoot": null, + "hash": "0x07f7d3c5744ffddc5441cf31074c91a934afbf6ddb7e8234a081ee1f21140455" +} \ No newline at end of file diff --git a/simulators/ethereum/sync/chain/headfcu.json b/simulators/ethereum/sync/chain/headfcu.json new file mode 100644 index 0000000000..7a1e7f2e28 --- /dev/null +++ b/simulators/ethereum/sync/chain/headfcu.json @@ -0,0 +1,13 @@ +{ + "jsonrpc": "2.0", + "id": "fcu2000", + "method": "engine_forkchoiceUpdatedV2", + "params": [ + { + "headBlockHash": "0x07f7d3c5744ffddc5441cf31074c91a934afbf6ddb7e8234a081ee1f21140455", + "safeBlockHash": "0x07f7d3c5744ffddc5441cf31074c91a934afbf6ddb7e8234a081ee1f21140455", + "finalizedBlockHash": "0x07f7d3c5744ffddc5441cf31074c91a934afbf6ddb7e8234a081ee1f21140455" + }, + null + ] +} \ No newline at end of file diff --git a/simulators/ethereum/sync/chain/headnewpayload.json b/simulators/ethereum/sync/chain/headnewpayload.json new file mode 100644 index 0000000000..11b37ba909 --- /dev/null +++ b/simulators/ethereum/sync/chain/headnewpayload.json @@ -0,0 +1,26 @@ +{ + "jsonrpc": "2.0", + "id": "np2000", + "method": "engine_newPayloadV2", + "params": [ + { + "parentHash": "0x3303c6e3577579843c427f795d7485abdddc55694b5a37af0b32b48259ebe103", + "feeRecipient": "0x0000000000000000000000000000000000000000", + "stateRoot": "0xfcb007db24cf6a31105b3382273fcf9ee3168acb2a3356d32a598302a4fc448d", + "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000", + "blockNumber": "0x7d0", + "gasLimit": "0x23f3e20", + "gasUsed": "0x0", + "timestamp": "0x4e20", + "extraData": "0x", + "baseFeePerGas": "0x7", + "blockHash": "0x07f7d3c5744ffddc5441cf31074c91a934afbf6ddb7e8234a081ee1f21140455", + "transactions": [], + "withdrawals": [], + "blobGasUsed": null, + "excessBlobGas": null + } + ] +} \ No newline at end of file diff --git a/simulators/ethereum/sync/go.mod b/simulators/ethereum/sync/go.mod index d2da75adaf..8d9bc8529f 100644 --- a/simulators/ethereum/sync/go.mod +++ b/simulators/ethereum/sync/go.mod @@ -1,6 +1,6 @@ module github.com/ethereum/hive/simulators/ethereum/sync -go 1.18 +go 1.20 require ( github.com/ethereum/go-ethereum v1.13.1 @@ -8,38 +8,74 @@ require ( ) require ( + github.com/DataDog/zstd v1.5.2 // indirect github.com/Microsoft/go-winio v0.6.1 // indirect + github.com/VictoriaMetrics/fastcache v1.12.0 // indirect + github.com/beorn7/perks v1.0.1 // indirect github.com/bits-and-blooms/bitset v1.5.0 // indirect github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect + github.com/cespare/xxhash/v2 v2.2.0 // indirect + github.com/cockroachdb/errors v1.9.1 // indirect + github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect + github.com/cockroachdb/pebble v0.0.0-20230906160148-46873a6a7a06 // indirect + github.com/cockroachdb/redact v1.1.3 // indirect github.com/consensys/bavard v0.1.13 // indirect github.com/consensys/gnark-crypto v0.10.0 // indirect + github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect github.com/crate-crypto/go-kzg-4844 v0.3.0 // indirect github.com/deckarep/golang-set/v2 v2.1.0 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 // indirect github.com/ethereum/c-kzg-4844 v0.3.1 // indirect - github.com/fjl/memsize v0.0.1 // indirect - github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08 // indirect + github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5 // indirect + github.com/getsentry/sentry-go v0.18.0 // indirect github.com/go-ole/go-ole v1.2.6 // indirect github.com/go-stack/stack v1.8.1 // indirect - github.com/golang-jwt/jwt/v4 v4.4.3 // indirect + github.com/gofrs/flock v0.8.1 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang-jwt/jwt/v4 v4.3.0 // indirect + github.com/golang/protobuf v1.5.2 // indirect github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect github.com/gorilla/websocket v1.5.0 // indirect - github.com/hashicorp/go-bexpr v0.1.11 // indirect + github.com/hashicorp/go-bexpr v0.1.10 // indirect github.com/holiman/uint256 v1.2.3 // indirect - github.com/mitchellh/mapstructure v1.5.0 // indirect + github.com/huin/goupnp v1.3.0 // indirect + github.com/jackpal/go-nat-pmp v1.0.2 // indirect + github.com/klauspost/compress v1.15.15 // indirect + github.com/kr/pretty v0.3.1 // indirect + github.com/kr/text v0.2.0 // indirect + github.com/mattn/go-colorable v0.1.13 // indirect + github.com/mattn/go-isatty v0.0.16 // indirect + github.com/mattn/go-runewidth v0.0.14 // indirect + github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect + github.com/mitchellh/mapstructure v1.4.1 // indirect + github.com/mitchellh/pointerstructure v1.2.0 // indirect github.com/mmcloughlin/addchain v0.4.0 // indirect - github.com/rs/cors v1.8.2 // indirect + github.com/olekukonko/tablewriter v0.0.5 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/prometheus/client_golang v1.14.0 // indirect + github.com/prometheus/client_model v0.3.0 // indirect + github.com/prometheus/common v0.39.0 // indirect + github.com/prometheus/procfs v0.9.0 // indirect + github.com/rivo/uniseg v0.4.3 // indirect + github.com/rogpeppe/go-internal v1.9.0 // indirect + github.com/rs/cors v1.7.0 // indirect + github.com/russross/blackfriday/v2 v2.1.0 // indirect github.com/shirou/gopsutil v3.21.11+incompatible // indirect github.com/supranational/blst v0.3.11 // indirect github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a // indirect github.com/tklauser/go-sysconf v0.3.12 // indirect github.com/tklauser/numcpus v0.6.1 // indirect + github.com/urfave/cli/v2 v2.25.7 // indirect + github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 // indirect github.com/yusufpapurcu/wmi v1.2.2 // indirect golang.org/x/crypto v0.12.0 // indirect golang.org/x/exp v0.0.0-20230810033253-352e893a4cad // indirect golang.org/x/mod v0.11.0 // indirect golang.org/x/sync v0.3.0 // indirect golang.org/x/sys v0.11.0 // indirect + golang.org/x/text v0.12.0 // indirect golang.org/x/tools v0.9.1 // indirect + google.golang.org/protobuf v1.28.1 // indirect + gopkg.in/natefinch/lumberjack.v2 v2.0.0 // indirect rsc.io/tmplfunc v0.0.3 // indirect ) diff --git a/simulators/ethereum/sync/go.sum b/simulators/ethereum/sync/go.sum index cca7f3eeae..7a4db83220 100644 --- a/simulators/ethereum/sync/go.sum +++ b/simulators/ethereum/sync/go.sum @@ -1,66 +1,144 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/toml v1.3.2 h1:o7IhLm0Msx3BaB+n3Ag7L8EVlByGnpq14C4YWiu/gL8= +github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= +github.com/CloudyKit/fastprinter v0.0.0-20200109182630-33d98a066a53/go.mod h1:+3IMCy2vIlbG1XG/0ggNQv0SvxCAIpPM5b1nCz56Xno= +github.com/CloudyKit/jet/v3 v3.0.0/go.mod h1:HKQPgSJmdK8hdoAbKUUWajkHyHo4RaU5rMdUywE7VMo= github.com/DataDog/zstd v1.5.2 h1:vUG4lAyuPCXO0TLbXvPv7EB7cNK1QV/luu55UHLrrn8= +github.com/DataDog/zstd v1.5.2/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= +github.com/Joker/hpp v1.0.0/go.mod h1:8x5n+M1Hp5hC0g8okX3sR3vFQwynaX/UgSOM9MeBKzY= github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= +github.com/Shopify/goreferrer v0.0.0-20181106222321-ec9c9a553398/go.mod h1:a1uqRtAwp2Xwc6WNPJEufxJ7fx3npB4UV/JOLmbu5I0= github.com/VictoriaMetrics/fastcache v1.12.0 h1:vnVi/y9yKDcD9akmc4NqAoqgQhJrOwUF+j9LTgn4QDE= +github.com/VictoriaMetrics/fastcache v1.12.0/go.mod h1:tjiYeEfYXCqacuvYw/7UoDIeJaNxq6132xHICNP77w8= +github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY= +github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= +github.com/allegro/bigcache v1.2.1 h1:hg1sY1raCwic3Vnsvje6TT7/pnZba83LeFck5NrFKSc= +github.com/allegro/bigcache v1.2.1/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= +github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= +github.com/aymerick/raymond v2.0.3-0.20180322193309-b565731e1464+incompatible/go.mod h1:osfaiScAUVup+UC9Nfq76eWqDhXlp+4UYaA8uhTBO6g= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= +github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bits-and-blooms/bitset v1.5.0 h1:NpE8frKRLGHIcEzkR+gZhiioW1+WbYV6fKwD6ZIpQT8= github.com/bits-and-blooms/bitset v1.5.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U= github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= +github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= +github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cockroachdb/datadriven v1.0.2/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= +github.com/cockroachdb/datadriven v1.0.3-0.20230801171734-e384cf455877 h1:1MLK4YpFtIEo3ZtMA5C795Wtv5VuUnrXX7mQG+aHg6o= +github.com/cockroachdb/datadriven v1.0.3-0.20230801171734-e384cf455877/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= github.com/cockroachdb/errors v1.9.1 h1:yFVvsI0VxmRShfawbt/laCIDy/mtTqqnvoNgiy5bEV8= +github.com/cockroachdb/errors v1.9.1/go.mod h1:2sxOtL2WIc096WSZqZ5h8fa17rdDq9HZOZLBCor4mBk= +github.com/cockroachdb/logtags v0.0.0-20211118104740-dabe8e521a4f/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE= +github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= github.com/cockroachdb/pebble v0.0.0-20230906160148-46873a6a7a06 h1:T+Np/xtzIjYM/P5NAw0e2Rf1FGvzDau1h54MKvx8G7w= +github.com/cockroachdb/pebble v0.0.0-20230906160148-46873a6a7a06/go.mod h1:bynZ3gvVyhlvjLI7PT6dmZ7g76xzJ7HpxfjgkzCGz6s= github.com/cockroachdb/redact v1.1.3 h1:AKZds10rFSIj7qADf0g46UixK8NNLwWTNdCIGS5wfSQ= +github.com/cockroachdb/redact v1.1.3/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= +github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0/go.mod h1:4Zcjuz89kmFXt9morQgcfYZAYZ5n8WHjt81YYWIwtTM= github.com/consensys/bavard v0.1.13 h1:oLhMLOFGTLdlda/kma4VOJazblc7IM5y5QPd2A/YjhQ= github.com/consensys/bavard v0.1.13/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI= github.com/consensys/gnark-crypto v0.10.0 h1:zRh22SR7o4K35SoNqouS9J/TKHTyU2QWaj5ldehyXtA= github.com/consensys/gnark-crypto v0.10.0/go.mod h1:Iq/P3HHl0ElSjsg2E1gsMwhAyxnxoKK5nVyZKd+/KhU= +github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= +github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= +github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/crate-crypto/go-kzg-4844 v0.3.0 h1:UBlWE0CgyFqqzTI+IFyCzA7A3Zw4iip6uzRv5NIXG0A= github.com/crate-crypto/go-kzg-4844 v0.3.0/go.mod h1:SBP7ikXEgDnUPONgm33HtuDZEDtWa3L4QtN1ocJSEQ4= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/deckarep/golang-set/v2 v2.1.0 h1:g47V4Or+DUdzbs8FxCCmgb6VYd+ptPAngjM6dtGktsI= github.com/deckarep/golang-set/v2 v2.1.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0= +github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 h1:HbphB4TFFXpv7MNrT52FGrrgVXF1owhMVTHFZIlnvd4= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0/go.mod h1:DZGJHZMqrU4JJqFAWUS2UO1+lbSKsdiOoYi9Zzey7Fc= +github.com/dgraph-io/badger v1.6.0/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6psNgSztDR4= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385/go.mod h1:0vRUJqYpeSZifjYj7uP3BG/gKcuzL9xWVV/Y+cK33KM= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/etcd-io/bbolt v1.3.3/go.mod h1:ZF2nL25h33cCyBtcyWeZ2/I3HQOfTP+0PIEvHjkjCrw= github.com/ethereum/c-kzg-4844 v0.3.1 h1:sR65+68+WdnMKxseNWxSJuAv2tsUrihTpVBTfM/U5Zg= github.com/ethereum/c-kzg-4844 v0.3.1/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= github.com/ethereum/go-ethereum v1.13.1 h1:UF2FaUKPIy5jeZk3X06ait3y2Q4wI+vJ1l7+UARp+60= github.com/ethereum/go-ethereum v1.13.1/go.mod h1:xHQKzwkHSl0gnSjZK1mWa06XEdm9685AHqhRknOzqGQ= github.com/ethereum/hive v0.0.0-20230919110229-d58aec4a3eb5 h1:22Z+XoI2hGtYR0AMzYr9IusfYM/chALq/6oJnejJQpk= github.com/ethereum/hive v0.0.0-20230919110229-d58aec4a3eb5/go.mod h1:iKqu3dndnqdwSckyBGoZzeHhZz6X6XZws2TfZMdLdes= -github.com/fjl/memsize v0.0.1 h1:+zhkb+dhUgx0/e+M8sF0QqiouvMQUiKR+QYvdxIOKcQ= -github.com/fjl/memsize v0.0.1/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= +github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072/go.mod h1:duJ4Jxv5lDcvg4QuQr0oowTf7dz4/CR8NtyCooz9HL8= +github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= +github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5 h1:FtmdgXiUlNeRsoNMFlKLDt+S+6hbjVMEW6RGQ7aUf7c= +github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= -github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08 h1:f6D9Hr8xV8uYKlyuj8XIruxlh9WjVjdh1gIicAS7ays= -github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= +github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= +github.com/gavv/httpexpect v2.0.0+incompatible/go.mod h1:x+9tiU1YnrOvnB725RkpoLv1M62hOWzwo5OXotisrKc= +github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff h1:tY80oXqGNY4FhTFhk+o9oFHGINQ/+vhlm8HFzi6znCI= +github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= +github.com/getsentry/sentry-go v0.12.0/go.mod h1:NSap0JBYWzHND8oMbyi0+XZhUalc1TBdRL1M71JZW2c= github.com/getsentry/sentry-go v0.18.0 h1:MtBW5H9QgdcJabtZcuJG80BMOwaBpkRDZkxRkNC1sN0= +github.com/getsentry/sentry-go v0.18.0/go.mod h1:Kgon4Mby+FJ7ZWHFUAZgVaIa8sxHtnRJRLTXZr51aKQ= +github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3/go.mod h1:VJ0WA2NBN22VlZ2dKZQPAPnyWw5XTlK1KymzLKsr59s= +github.com/gin-gonic/gin v1.4.0/go.mod h1:OW2EZn3DO8Ln9oIKOvM++LBO+5UPHJJDH72/q/3rZdM= +github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= +github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= +github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= +github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= +github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab/go.mod h1:/P9AEU963A2AYjv4d1V5eVL1CQbEJq6aCNHDDjibzu8= github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-stack/stack v1.8.1 h1:ntEHSVwIt7PNXNpgPmVfMrNhLtgjlmnZha2kOpuRiDw= github.com/go-stack/stack v1.8.1/go.mod h1:dcoOX6HbPZSZptuspn9bctJ+N/CnF5gGygcUP3XYfe4= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= +github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= +github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= +github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= +github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= +github.com/gogo/googleapis v0.0.0-20180223154316-0cd9801be74a/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= +github.com/gogo/googleapis v1.4.1/go.mod h1:2lpHqI5OcWCtVElxXnPt+s8oJvMpySlOyM6xDCrzib4= +github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= -github.com/golang-jwt/jwt/v4 v4.4.3 h1:Hxl6lhQFj4AnOX6MLrsCb/+7tCj7DxP7VA+2rDIq5AU= -github.com/golang-jwt/jwt/v4 v4.4.3/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/gogo/status v1.1.0/go.mod h1:BFv9nrluPLmrS0EmGVvLaPNmRosr9KapBYd5/hpY1WM= +github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= +github.com/golang-jwt/jwt/v4 v4.3.0 h1:kHL1vqdqWNfATmA0FNMdmZNMyZI1U6O31X4rlIPoBog= +github.com/golang-jwt/jwt/v4 v4.3.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= @@ -68,48 +146,128 @@ github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiu github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXiurYmW7fx4GZkL8feAMVq7nEjURHk= github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/gomodule/redigo v1.7.1-0.20190724094224-574c33c3df38/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= +github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= +github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= +github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= +github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/hashicorp/go-bexpr v0.1.11 h1:6DqdA/KBjurGby9yTY0bmkathya0lfwF2SeuubCI7dY= -github.com/hashicorp/go-bexpr v0.1.11/go.mod h1:f03lAo0duBlDIUMGCuad8oLcgejw4m7U+N8T+6Kz1AE= +github.com/hashicorp/go-bexpr v0.1.10 h1:9kuI5PFotCboP3dkDYFr/wi0gg0QVbSNz5oFRpxn4uE= +github.com/hashicorp/go-bexpr v0.1.10/go.mod h1:oxlubA2vC/gFVfX1A6JGp7ls7uCDlfJn732ehYYg+g0= +github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/holiman/billy v0.0.0-20230718173358-1c7e68d277a7 h1:3JQNjnMRil1yD0IfZKHF9GxxWKDJGj8I0IqOUol//sw= +github.com/holiman/billy v0.0.0-20230718173358-1c7e68d277a7/go.mod h1:5GuXa7vkL8u9FkFuWdVvfR5ix8hRB7DbOAaYULamFpc= github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao= +github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA= github.com/holiman/uint256 v1.2.3 h1:K8UWO1HUJpRMXBxbmaY1Y8IAMZC/RsKB+ArEnnK4l5o= github.com/holiman/uint256 v1.2.3/go.mod h1:SC8Ryt4n+UBbPbIBKaG9zbbDlp4jOru9xFZmPzLUTxw= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/huin/goupnp v1.3.0 h1:UvLUlWDNpoUdYzb2TCn+MuTWtcjXKSza2n6CBdQ0xXc= +github.com/huin/goupnp v1.3.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8= +github.com/hydrogen18/memlistener v0.0.0-20200120041712-dcc25e7acd91/go.mod h1:qEIFzExnS6016fRpRfxrExeVn2gbClQA99gQhnIcdhE= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/imkira/go-interpol v1.1.0/go.mod h1:z0h2/2T3XF8kyEPpRgJ3kmNv+C43p+I/CoI+jC3w2iA= +github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/iris-contrib/blackfriday v2.0.0+incompatible/go.mod h1:UzZ2bDEoaSGPbkg6SAB4att1aAwTmVIx/5gCVqeyUdI= +github.com/iris-contrib/go.uuid v2.0.0+incompatible/go.mod h1:iz2lgM/1UnEf1kP0L/+fafWORmlnuysV2EMP8MW+qe0= +github.com/iris-contrib/jade v1.1.3/go.mod h1:H/geBymxJhShH5kecoiOCSssPX7QWYH7UaeZTSWddIk= +github.com/iris-contrib/pongo2 v0.0.1/go.mod h1:Ssh+00+3GAZqSQb30AvBRNxBx7rf0GqwkjqxNd0u65g= +github.com/iris-contrib/schema v0.0.1/go.mod h1:urYA3uvUNG1TIIjOSCzHr9/LmbQo8LrOcOqfqxa4hXw= github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= +github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= +github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= +github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88/go.mod h1:3w7q1U84EfirKl04SVQ/s7nPm1ZPhiXd34z40TNz36k= +github.com/kataras/golog v0.0.10/go.mod h1:yJ8YKCmyL+nWjERB90Qwn+bdyBZsaQwU3bTVFgkFIp8= +github.com/kataras/iris/v12 v12.1.8/go.mod h1:LMYy4VlP67TQ3Zgriz8RE2h2kMZV2SgMYbq3UhfoFmE= +github.com/kataras/neffos v0.0.14/go.mod h1:8lqADm8PnbeFfL7CLXh1WHw53dG27MC3pgi2R1rmoTE= +github.com/kataras/pio v0.0.2/go.mod h1:hAoW0t9UmXi4R5Oyq5Z4irTbaTsOemSrDGUtaTl7Dro= +github.com/kataras/sitemap v0.0.5/go.mod h1:KY2eugMKiPwsJgx7+U103YZehfvNGOXURubcGyk0Bz8= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.8.2/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= +github.com/klauspost/compress v1.9.7/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= github.com/klauspost/compress v1.15.15 h1:EF27CXIuDsYJ6mmvtBRlEuB2UVOqHG1tAXgZ7yIO+lw= +github.com/klauspost/compress v1.15.15/go.mod h1:ZcK2JAFqKOpnBlxcLsJzYfrS9X1akm9fHZNnD9+Vo/4= +github.com/klauspost/cpuid v1.2.1/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= +github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= +github.com/labstack/echo/v4 v4.5.0/go.mod h1:czIriw4a0C1dFun+ObrXp7ok03xON0N1awStJ6ArI7Y= +github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c= +github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= +github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.11/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= +github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peKQ= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.14 h1:+xnbZSEeDbOIg5/mE6JF0w6n9duR1l3/WmbinWVwUuU= +github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw= github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= +github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= +github.com/mediocregopher/radix/v3 v3.4.2/go.mod h1:8FL3F6UQRXHXIBSPUs5h0RybMF8i4n7wVopoX3x7Bv8= +github.com/microcosm-cc/bluemonday v1.0.2/go.mod h1:iVP4YcDBq+n/5fb23BhYFvIMq/leAFZyRl6bYmGDlGc= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.4.1 h1:CpVNEelQCZBooIPDn+AR3NpivK/TIKU8bDxdASFVQag= github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= -github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/pointerstructure v1.2.1 h1:ZhBBeX8tSlRpu/FFhXH4RC4OJzFlqsQhoHZAz4x7TIw= -github.com/mitchellh/pointerstructure v1.2.1/go.mod h1:BRAsLI5zgXmw97Lf6s25bs8ohIXc3tViBH44KcwB2g4= +github.com/mitchellh/pointerstructure v1.2.0 h1:O+i9nHnXS3l/9Wu7r4NrEdwA2VFTicjUEN1uBnDo34A= +github.com/mitchellh/pointerstructure v1.2.0/go.mod h1:BRAsLI5zgXmw97Lf6s25bs8ohIXc3tViBH44KcwB2g4= github.com/mmcloughlin/addchain v0.4.0 h1:SobOdjm2xLj1KkXN5/n0xTIWyZA2+s99UCY1iPfkHRY= github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqkyU72HC5wJ4RlU= github.com/mmcloughlin/profile v0.1.1/go.mod h1:IhHD7q1ooxgwTgjxQYkACGA77oFTDdFVejUS1/tS/qU= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/moul/http2curl v1.0.0/go.mod h1:8UbvGypXm98wA/IqH45anm5Y2Z6ep6O31QGOAZ3H0fQ= +github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= +github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= +github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= +github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= +github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= @@ -120,26 +278,61 @@ github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1y github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= github.com/onsi/gomega v1.19.0 h1:4ieX6qQjPP/BfC3mpsAtIGGlxTWPeA3Inl/7DtXw1tw= github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= +github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= +github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= +github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_golang v1.14.0 h1:nJdhIvne2eSX/XRAFV9PcvFFRbrjbcTUj0VP62TMhnw= +github.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4= +github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= github.com/prometheus/common v0.39.0 h1:oOyhkDq05hPZKItWVBkJ6g6AtGxi+fy7F4JvUV8uhsI= +github.com/prometheus/common v0.39.0/go.mod h1:6XBZ7lYdLCbkAVhwRsWTZn+IN5AB9F/NXd5w0BbEX0Y= github.com/prometheus/procfs v0.9.0 h1:wzCHvIvM5SxWqYvwgVL7yJY8Lz3PKn49KQtpgMYJfhI= +github.com/prometheus/procfs v0.9.0/go.mod h1:+pB4zwohETzFnmlpe6yd2lSc+0/46IYZRB/chUwxUZY= +github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.3 h1:utMvzDsuh3suAEnhH0RdHmoPbU648o6CvXxTx4SBMOw= +github.com/rivo/uniseg v0.4.3/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= +github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= +github.com/rogpeppe/go-internal v1.8.1/go.mod h1:JeRgkft04UBgHMgCIwADu4Pn6Mtm5d4nPKWu0nJ5d+o= github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= -github.com/rs/cors v1.8.2 h1:KCooALfAYGs415Cwu5ABvv9n9509fSiG5SQJn/AQo4U= -github.com/rs/cors v1.8.2/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= +github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= +github.com/rs/cors v1.7.0 h1:+88SsELBHx5r+hZ8TCkggzSstaWNbDvThkVK8H6f9ik= +github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= +github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/schollz/closestmatch v2.1.0+incompatible/go.mod h1:RtP1ddjLong6gTkbtmuhtR2uUrrJOpYzYRvbcPAid+g= +github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI= github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= +github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= +github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= +github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= +github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= github.com/status-im/keycard-go v0.2.0 h1:QDLFswOQu1r5jsycloeQh3bVU8n/NatHHaZobtDnDzA= +github.com/status-im/keycard-go v0.2.0/go.mod h1:wlp8ZLbsmrF6g6WjugPAx+IzoLrkdf9+mHxBEeo3Hbg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/supranational/blst v0.3.11 h1:LyU6FolezeWAhvQk0k6O/d49jqgO52MSDDfYgbeoEm4= github.com/supranational/blst v0.3.11/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a h1:1ur3QoCqvE5fl+nylMaIr9PVV1w343YRDtsy+Rwu7XI= @@ -149,66 +342,154 @@ github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0h github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= github.com/tyler-smith/go-bip39 v1.1.0 h1:5eUemwrMargf3BSLRRCalXT93Ns6pQJIjYQN2nyfOP8= +github.com/tyler-smith/go-bip39 v1.1.0/go.mod h1:gUYDtqQw1JS3ZJ8UWVcGTGqqr6YIN3CWg+kkNaLt55U= +github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= +github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= +github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= +github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= github.com/urfave/cli/v2 v2.25.7 h1:VAzn5oq403l5pHjc4OhD54+XGO9cdKVL/7lDjF+iKUs= +github.com/urfave/cli/v2 v2.25.7/go.mod h1:8qnjx1vcq5s2/wpsqoZFndg2CE5tNFyrTvS6SinrnYQ= +github.com/urfave/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4= +github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= +github.com/valyala/fasthttp v1.6.0/go.mod h1:FstJa9V+Pj9vQ7OJie2qMHdwemEDaDiSdBnvPM1Su9w= +github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= +github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= +github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio= +github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= +github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= +github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU= +github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8= +github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0/go.mod h1:/LWChgwKmvncFJFHJ7Gvn9wZArjbV5/FppcK2fKk/tI= +github.com/yudai/gojsondiff v1.0.0/go.mod h1:AY32+k2cwILAkW1fbgxQ5mUmMiZFgLIV+FBNExI05xg= +github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82/go.mod h1:lgjkn3NuSvDfVJdfcVVdX+jpBxNmX4rDAzaS45IcYoM= +github.com/yudai/pp v2.0.1+incompatible/go.mod h1:PuxR/8QJ7cyCkFp/aUDS+JY727OFEZkTdatxwunjIkc= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yusufpapurcu/wmi v1.2.2 h1:KBNDSne4vP5mbSWnJbO+51IMOXJB67QiYCSBrubbPRg= github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191227163750-53104e6ec876/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.12.0 h1:tFM/ta59kqch6LlvYnPa0yx5a83cL2nHflFhYKvv9Yk= golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20230810033253-352e893a4cad h1:g0bG7Z4uG+OgH2QDODnjp6ggkk1bJDsINcuWmJN1iJU= golang.org/x/exp v0.0.0-20230810033253-352e893a4cad/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.11.0 h1:bUO06HqtnRcc/7l71XBe4WcqTZ+3AH1J59zWDDwLKgU= golang.org/x/mod v0.11.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190327091125-710a502c58a2/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= +golang.org/x/net v0.0.0-20211008194852-3b03d305991f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220405052023-b1e9470b6e64/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc= +golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= +golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181221001348-537d06c36207/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190327201419-c70d86f8b7cf/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.9.1 h1:8WMNJAz3zrtPmnYC7ISf5dEn3MT0gY7jBJfw27yrrLo= golang.org/x/tools v0.9.1/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -216,19 +497,47 @@ golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/genproto v0.0.0-20180518175338-11a468237815/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= +google.golang.org/grpc v1.12.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= +google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= +gopkg.in/go-playground/validator.v8 v8.18.2/go.mod h1:RX2a/7Ha8BgOhfk7j780h4/u/RRjR0eouCJSH80/M2Y= gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1 h1:iiHuQZCNgYPmFQxd3BBN/Nc5+dAwzZuq5y40s20oQw0= +gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= +gopkg.in/ini.v1 v1.51.1/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8= +gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= @@ -236,8 +545,12 @@ gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.0-20191120175047-4206685974f2/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= rsc.io/tmplfunc v0.0.3 h1:53XFQh69AfOa8Tw0Jm7t+GV7KZhOi6jzsCzTtKbMvzU= rsc.io/tmplfunc v0.0.3/go.mod h1:AG3sTPzElb1Io3Yg4voV9AGZJuleGAwaVRxL9M49PhA= diff --git a/simulators/ethereum/sync/mkchain.sh b/simulators/ethereum/sync/mkchain.sh new file mode 100644 index 0000000000..ba8363ed5a --- /dev/null +++ b/simulators/ethereum/sync/mkchain.sh @@ -0,0 +1,12 @@ +#!/bin/sh + +wd="$(pwd)" +cd ../../.. +go build ./cmd/hivechain +./hivechain generate \ + -outdir "$wd/chain" \ + -length 2000 \ + -lastfork shanghai \ + -tx-interval 5 \ + -fork-interval 0 \ + -outputs forkenv,genesis,chain,headblock,headfcu,headnewpayload diff --git a/simulators/ethereum/sync/simplechain/chain.rlp b/simulators/ethereum/sync/simplechain/chain.rlp deleted file mode 100644 index 9d9ae43f92433b99d84b45c2cc722c3fc3b0b6a5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1544806 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%0DXvDkuF$evB)2d!IfBBGyB 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 z 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%0D=hU7D;Vja2dUM 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%0D})Fjnt1{{0L)Ppoq^+h^Cx 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 z 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 Xeu}7`CIgoOytuR#$>>?<>jwW1rKczL diff --git a/simulators/ethereum/sync/simplechain/chain_poststate.json b/simulators/ethereum/sync/simplechain/chain_poststate.json deleted file mode 100644 index f550da9a5b..0000000000 --- a/simulators/ethereum/sync/simplechain/chain_poststate.json +++ /dev/null @@ -1,245 +0,0 @@ -{ - "root": "e3f5a72cc1c86d794fd190473c775a774605059a45775c96e4df01205e40c007", - "accounts": { - "0x0000000000000000000000000000000000000000": { - "balance": "9000000000000000000000", - "nonce": 0, - "root": "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "codeHash": "c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", - "key": "0x5380c7b7ae81a58eb98d9c78de4a1fd7fd9535fc953ed2be602daaa41767312a" - }, - "0x13cf0d18bcb898efd4e85ae2bb65a443ab86023c": { - "balance": "0", - "nonce": 1, - "root": "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "codeHash": "c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470" - }, - "0x154c5e3762fbb57427d6b03e7302bda04c497226": { - "balance": "0", - "nonce": 1, - "root": "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "codeHash": "8989ef1c92efc73ad0995dc1bffcbcc591360cced5525bb9fec8478f611790ce", - "code": "8fa6daee792eb752deb500a22b1a9d9ddd0817bc7ceaaa8504fcc379fb3b6901d9124510446239fd90e1d7798b5713fdf1ab3c454b4772c5c150d28935ec785f0be4855add63baff7fcd55a303d22482888ad3f0d58ce374a9dfc65893f27478e70884e3383554172ae27d7df5e4c27b138ffb88bb8ffe7f9f897c420ed05883" - }, - "0x1acdf9985559919b7de44d86a6faf7852a62f146": { - "balance": "0", - "nonce": 1, - "root": "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "codeHash": "ea6d81ce620fbdb1d13c21931b5929cf59a8b00ed9cb09d3b7a00c9a665e3752", - "code": "8640f2c5dfc3f41e33e3cc6f78424f47adc88b8ca5b7ef54bfb1a36f827bfffd9294bb10be008f1ccdaee8234eaba971fe3b27f1bf4ed0dd018da6fe93b7adde862822120e9a24ba716872e3a2bf3d60bd4681ac6d3bb45dbf9670762e4fa17caf4201cefdaa24606553546b56ff17f4f4a13a382bc9067c78ee7f3026f7d368" - }, - "0x2074f91470365144df78c333948814fe4158af5a": { - "balance": "0", - "nonce": 1, - "root": "be3d75a1729be157e79c3b77f00206db4d54e3ea14375a015451c88ec067c790", - "codeHash": "c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", - "storage": { - "0x0000000000000000000000000000000000000000000000000000000000000001": "01", - "0x0000000000000000000000000000000000000000000000000000000000000002": "02", - "0x0000000000000000000000000000000000000000000000000000000000000003": "03" - } - }, - "0x2139b5baf855eee55cdb5f19df50583585581ead": { - "balance": "0", - "nonce": 1, - "root": "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "codeHash": "711edeb38acc70ef404e68ea0d9bae8c1f58684637c374e036bc22eb6344c372", - "code": "9813944fb30dd8120b89752b9de54b5f33570f8c23c86bfee522bbb9451c75327e9e4eae053cb8c02262a3f47cfda3d1dd3b509cc18232a4cb7857a0d6ce3b1a3adea2f8097547272a15653d418ca056ce79b5f998d00ed9c84bfb3840add7b354ddee53ea3fdd22e1aa1d03cd4545aa7e3fc171cbffc01659e8b38208c8d303" - }, - "0x2342449c1451eca9c79598f6e1c5a44ad39c3873": { - "balance": "1", - "nonce": 0, - "root": "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "codeHash": "c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470" - }, - "0x303778f1cb5a2177e5ef682329074d1fdcfc3f98": { - "balance": "0", - "nonce": 1, - "root": "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "codeHash": "c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470" - }, - "0x319b4b3b71398eabadae47ccea2e1e6be3e83056": { - "balance": "0", - "nonce": 1, - "root": "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "codeHash": "c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470" - }, - "0x3693da93b9d5e63cb4804b8813c8214a76724485": { - "balance": "0", - "nonce": 1, - "root": "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "codeHash": "d8b9866a1c8d0e4188c551a1e38cf22d7ad0cda51a07a830ebbfec59ac273414", - "code": "eb25626eac2911a4e3c771a41200865e8117272e0882bc03621f39381358e9604906e0a405564201c4f73bc7968cb546bfeb7460379ede9ef7ea42408894e57f79375c5c33b6fec5a89248ddb04ecc205afe31025a4cc9087bdb5ed023149826a93499b705e0808c6a475fe6519a4234d9ea47da874c34fc0e972a8a4ec39500" - }, - "0x3a8f94a097ac10014c63547fafaf50ff94b31760": { - "balance": "1", - "nonce": 0, - "root": "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "codeHash": "c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470" - }, - "0x4888515ebdf0fbe37f0798097a59b281bfe06b23": { - "balance": "1", - "nonce": 0, - "root": "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "codeHash": "c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470" - }, - "0x537e697c7ab75a26f9ecf0ce810e3154dfcaaf44": { - "balance": "0", - "nonce": 1, - "root": "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "codeHash": "c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470" - }, - "0x5dd3b493c018519303654a439129ea01197ba012": { - "balance": "0", - "nonce": 1, - "root": "be3d75a1729be157e79c3b77f00206db4d54e3ea14375a015451c88ec067c790", - "codeHash": "c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", - "storage": { - "0x0000000000000000000000000000000000000000000000000000000000000001": "01", - "0x0000000000000000000000000000000000000000000000000000000000000002": "02", - "0x0000000000000000000000000000000000000000000000000000000000000003": "03" - } - }, - "0x62bf7a56fc243cf6572bb91643f6e7b0de5a2a3a": { - "balance": "1", - "nonce": 0, - "root": "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "codeHash": "c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470" - }, - "0x71562b71999873db5b286df957af199ec94617f7": { - "balance": "4294967287", - "nonce": 30, - "root": "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "codeHash": "c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470" - }, - "0x772f9dd7c0e7ac2397600614540581d953811742": { - "balance": "0", - "nonce": 1, - "root": "be3d75a1729be157e79c3b77f00206db4d54e3ea14375a015451c88ec067c790", - "codeHash": "c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", - "storage": { - "0x0000000000000000000000000000000000000000000000000000000000000001": "01", - "0x0000000000000000000000000000000000000000000000000000000000000002": "02", - "0x0000000000000000000000000000000000000000000000000000000000000003": "03" - } - }, - "0x82567a6f6e3abe246f62350322a07af7f413cfe6": { - "balance": "0", - "nonce": 1, - "root": "be3d75a1729be157e79c3b77f00206db4d54e3ea14375a015451c88ec067c790", - "codeHash": "c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", - "storage": { - "0x0000000000000000000000000000000000000000000000000000000000000001": "01", - "0x0000000000000000000000000000000000000000000000000000000000000002": "02", - "0x0000000000000000000000000000000000000000000000000000000000000003": "03" - } - }, - "0x880ec53af800b5cd051531672ef4fc4de233bd5d": { - "balance": "0", - "nonce": 1, - "root": "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "codeHash": "279b340779adbab26f2e1b1627162a74e063ba09aaa696fdd6fb1d9681e49491", - "code": "0d023b14ded2b184ded4f0eb1a128b24ff452c690373ddb4fcae72d7610595052972badd41f97d922e1e25f007a20827a35fd3f28f21025f845d23e2b06490eafb457b8722ec08e0d898aff2682fbc67d8174c079029be74b9e9f2bd92ba76bfa3e686d4316ebd33de766acced0ad0e380684ff820ec31e48f79f32273269d89" - }, - "0x9c2d8780308e6d2e039107a87846df7acf640b98": { - "balance": "0", - "nonce": 1, - "root": "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "codeHash": "c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470" - }, - "0x9f47649eac9513b76957946ba9c1e929dda330cc": { - "balance": "0", - "nonce": 1, - "root": "be3d75a1729be157e79c3b77f00206db4d54e3ea14375a015451c88ec067c790", - "codeHash": "c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", - "storage": { - "0x0000000000000000000000000000000000000000000000000000000000000001": "01", - "0x0000000000000000000000000000000000000000000000000000000000000002": "02", - "0x0000000000000000000000000000000000000000000000000000000000000003": "03" - } - }, - "0xaa442e4116dcbe0c20181939bfdcc41523bdd260": { - "balance": "1", - "nonce": 0, - "root": "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "codeHash": "c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470" - }, - "0xb1e667a6c115fcdf38eaaf0acb762d63b664986b": { - "balance": "1", - "nonce": 0, - "root": "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "codeHash": "c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470" - }, - "0xbee64cb1c6f569bac8a143518bdf4e061150cafb": { - "balance": "0", - "nonce": 1, - "root": "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "codeHash": "cab14fc4adbed8e7660768d9b8c2fe9cad46282aa5194fa0d0440078745a6e70", - "code": "d70b4e383708fe9f3badd66c1481871fd30144ad5f4d8e6f1d79d3414dc1a697127fab49aaff13198746c772f878ae324244734743e691b71b7d7f1a4023a108512e572dae92d711315181e4e54b2bfcd4440f4d63771b6263a84b5c0a57dbe97aca0d788a94d5e194061a0cc0972e793990348a1ea9b8566eefd56b05c58cfb" - }, - "0xcf950f044e11d2e0318314ecd940ec19abf51130": { - "balance": "0", - "nonce": 1, - "root": "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "codeHash": "c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470" - }, - "0xd91fb8750ea1decef4cee9d8314f4a60de039457": { - "balance": "0", - "nonce": 1, - "root": "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "codeHash": "c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470" - }, - "0xdb7d6ab1f17c6b31909ae466702703daef9269cf": { - "balance": "0", - "nonce": 1, - "root": "be3d75a1729be157e79c3b77f00206db4d54e3ea14375a015451c88ec067c790", - "codeHash": "c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", - "storage": { - "0x0000000000000000000000000000000000000000000000000000000000000001": "01", - "0x0000000000000000000000000000000000000000000000000000000000000002": "02", - "0x0000000000000000000000000000000000000000000000000000000000000003": "03" - } - }, - "0xe213d8b68ca3d01e51a6dba669de59ac9a8359ee": { - "balance": "0", - "nonce": 1, - "root": "be3d75a1729be157e79c3b77f00206db4d54e3ea14375a015451c88ec067c790", - "codeHash": "c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", - "storage": { - "0x0000000000000000000000000000000000000000000000000000000000000001": "01", - "0x0000000000000000000000000000000000000000000000000000000000000002": "02", - "0x0000000000000000000000000000000000000000000000000000000000000003": "03" - } - }, - "0xe4bb31b917654f396a9ef9af117cf4430a027709": { - "balance": "1", - "nonce": 0, - "root": "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "codeHash": "c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470" - }, - "0xe654a1bfc5d17402681daf37acfb82da53b2258a": { - "balance": "0", - "nonce": 1, - "root": "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "codeHash": "af5196b4171207cc404de37e2d6278c653d7f0326216069815b11a9c54507566", - "code": "33da8b1e4fb2f4acb59dc518b295ccbfffda0f5e7f580935346adcd1364a6ac4fb7b3c8d2fe84b14bc2d25e2f2a64d7bea674ac66e301873773c4707ba5d70c4c419c788d3416cf28a37245f057b09b84aa183e1bf85a2dfc1b81888acb5257c2ee3e1c8df89bf0c80df9fc0bf77166813fffa5e71cba0212d575a069c9737b1" - }, - "0xe74a3c7427cda785e0000d42a705b1f3fd371e09": { - "balance": "0", - "nonce": 1, - "root": "be3d75a1729be157e79c3b77f00206db4d54e3ea14375a015451c88ec067c790", - "codeHash": "c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", - "storage": { - "0x0000000000000000000000000000000000000000000000000000000000000001": "01", - "0x0000000000000000000000000000000000000000000000000000000000000002": "02", - "0x0000000000000000000000000000000000000000000000000000000000000003": "03" - } - }, - "0xfebe1c82c5e4f13e912964ac168492188951af85": { - "balance": "1", - "nonce": 0, - "root": "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "codeHash": "c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470" - } - } -} \ No newline at end of file diff --git a/simulators/ethereum/sync/simplechain/genesis.json b/simulators/ethereum/sync/simplechain/genesis.json deleted file mode 100644 index ed78488b67..0000000000 --- a/simulators/ethereum/sync/simplechain/genesis.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "config": { - "chainId": 19763, - "homesteadBlock": 0, - "eip150Block": 0, - "eip155Block": 0, - "eip158Block": 0, - "byzantiumBlock": 0, - "ethash": {} - }, - "nonce": "0xdeadbeefdeadbeef", - "timestamp": "0x0", - "extraData": "0x0000000000000000000000000000000000000000000000000000000000000000", - "gasLimit": "0x80000000", - "difficulty": "0x20000", - "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000", - "coinbase": "0x0000000000000000000000000000000000000000", - "alloc": { - "71562b71999873db5b286df957af199ec94617f7": { - "balance": "0xffffffff" - } - }, - "number": "0x0", - "gasUsed": "0x0", - "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000" -} diff --git a/simulators/ethereum/sync/sync.go b/simulators/ethereum/sync/sync.go index 841c8f952a..adc34cc4e7 100644 --- a/simulators/ethereum/sync/sync.go +++ b/simulators/ethereum/sync/sync.go @@ -2,42 +2,39 @@ package main import ( "context" + "encoding/json" "fmt" "time" + "github.com/ethereum/go-ethereum/beacon/engine" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/ethclient" + gnode "github.com/ethereum/go-ethereum/node" + "github.com/ethereum/go-ethereum/rpc" "github.com/ethereum/hive/hivesim" ) var ( // the number of seconds before a sync is considered stalled or failed - syncTimeout = 45 * time.Second - params = hivesim.Params{ - "HIVE_NETWORK_ID": "19763", - "HIVE_CHAIN_ID": "19763", - "HIVE_FORK_HOMESTEAD": "0", - "HIVE_FORK_TANGERINE": "0", - "HIVE_FORK_SPURIOUS": "0", - "HIVE_FORK_BYZANTIUM": "0", - "HIVE_NODETYPE": "", - } + syncTimeout = 60 * time.Second sourceFiles = map[string]string{ - "genesis.json": "./simplechain/genesis.json", - "chain.rlp": "./simplechain/chain.rlp", + "genesis.json": "./chain/genesis.json", + "chain.rlp": "./chain/chain.rlp", } sinkFiles = map[string]string{ - "genesis.json": "./simplechain/genesis.json", + "genesis.json": "./chain/genesis.json", } ) -var ( - testchainHeadNumber = uint64(3000) - testchainHeadHash = common.HexToHash("0xc95596f4707fb382554b660b4847c599eb5f8fdcf99be2c5654aaadd4ec97840") -) - func main() { + // Load fork environment. + var params hivesim.Params + err := common.LoadJSON("chain/forkenv.json", ¶ms) + if err != nil { + panic(err) + } + var suite = hivesim.Suite{ Name: "sync", Description: `This suite of tests verifies that clients can sync from each other in different modes. @@ -49,15 +46,23 @@ For each client, we test if it can serve as a sync source for all other clients Description: "This loads the test chain into the client and verifies whether it was imported correctly.", Parameters: params, Files: sourceFiles, - Run: runSourceTest, + Run: func(t *hivesim.T, c *hivesim.Client) { + runSourceTest(t, c, params) + }, }) hivesim.MustRunSuite(hivesim.New(), suite) } -func runSourceTest(t *hivesim.T, c *hivesim.Client) { +func runSourceTest(t *hivesim.T, c *hivesim.Client, params hivesim.Params) { // Check whether the source has imported its chain.rlp correctly. source := &node{c} - if err := source.checkHead(testchainHeadNumber, testchainHeadHash); err != nil { + if err := source.checkHead(); err != nil { + t.Fatal(err) + } + + // Send forkchoiceUpdated to the source. This is to make the client really + // consider itself synced. + if err := source.sendForkchoiceUpdated(t); err != nil { t.Fatal(err) } @@ -81,7 +86,7 @@ func runSourceTest(t *hivesim.T, c *hivesim.Client) { func runSyncTest(t *hivesim.T, c *hivesim.Client) { node := &node{c} - err := node.checkSync(t, testchainHeadNumber, testchainHeadHash) + err := node.checkSync(t) if err != nil { t.Fatal("sync failed:", err) } @@ -92,7 +97,18 @@ type node struct { } // checkSync waits for the node to reach the head of the chain. -func (n *node) checkSync(t *hivesim.T, wantNumber uint64, wantHash common.Hash) error { +func (n *node) checkSync(t *hivesim.T) error { + var expectedHead types.Header + err := common.LoadJSON("chain/headblock.json", &expectedHead) + if err != nil { + return fmt.Errorf("can't load expected header: %v", err) + } + wantHash := expectedHead.Hash() + + if err := n.triggerSync(t); err != nil { + return err + } + var ( timeout = time.After(syncTimeout) current = uint64(0) @@ -111,7 +127,7 @@ func (n *node) checkSync(t *hivesim.T, wantNumber uint64, wantHash common.Hash) if blockNumber != current { t.Logf("%s has new head %d", n.Type, blockNumber) } - if current == wantNumber { + if current == expectedHead.Number.Uint64() { if block.Hash() != wantHash { return fmt.Errorf("wrong head hash %x, want %x", block.Hash(), wantHash) } @@ -124,20 +140,91 @@ func (n *node) checkSync(t *hivesim.T, wantNumber uint64, wantHash common.Hash) } } -// head returns the node's chain head. -func (n *node) head() (*types.Header, error) { - ctx, _ := context.WithTimeout(context.Background(), 5*time.Second) - return ethclient.NewClient(n.RPC()).HeaderByNumber(ctx, nil) +type rpcRequest struct { + Method string + Params []json.RawMessage +} + +func (n *node) triggerSync(t *hivesim.T) error { + // Load the engine requests generated by hivechain. + var newpayload rpcRequest + if err := common.LoadJSON("chain/headnewpayload.json", &newpayload); err != nil { + return err + } + c := n.engineClient() + + // deliver newPayload + t.Logf("%s: %s", newpayload.Method, jsonString(newpayload.Params)) + var resp engine.PayloadStatusV1 + if err := c.Call(&resp, newpayload.Method, conv2any(newpayload.Params)...); err != nil { + return err + } + t.Logf("response: %+v", jsonString(resp)) + + return n.sendForkchoiceUpdated(t) +} + +func (n *node) sendForkchoiceUpdated(t *hivesim.T) error { + var fcu rpcRequest + if err := common.LoadJSON("chain/headfcu.json", &fcu); err != nil { + return err + } + c := n.engineClient() + + t.Logf("%s: %s", fcu.Method, jsonString(fcu.Params)) + var fcuresp engine.ForkChoiceResponse + if err := c.Call(&fcuresp, fcu.Method, conv2any(fcu.Params)...); err != nil { + return err + } + t.Logf("response: %s", jsonString(&fcuresp)) + return nil +} + +func (n *node) engineClient() *rpc.Client { + // engine client setup + token := [32]byte{0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x65} + engineURL := fmt.Sprintf("http://%v:8551/", n.IP) + ctx := context.Background() + c, _ := rpc.DialOptions(ctx, engineURL, rpc.WithHTTPAuth(gnode.NewJWTAuth(token))) + return c } // checkHead checks whether the remote chain head matches the given values. -func (n *node) checkHead(num uint64, hash common.Hash) error { +func (n *node) checkHead() error { + var expected types.Header + err := common.LoadJSON("chain/headblock.json", &expected) + if err != nil { + return fmt.Errorf("can't load expected header: %v", err) + } + head, err := n.head() if err != nil { return fmt.Errorf("can't query chain head: %v", err) } - if head.Hash() != hash { - return fmt.Errorf("wrong chain head %d (%s), want %d (%s)", head.Number, head.Hash().TerminalString(), num, hash.TerminalString()) + if head.Hash() != expected.Hash() { + return fmt.Errorf("wrong chain head %d (%s), want %d (%s)", head.Number, head.Hash().TerminalString(), expected.Number, expected.Hash().TerminalString()) } return nil } + +// head returns the node's chain head. +func (n *node) head() (*types.Header, error) { + ctx, _ := context.WithTimeout(context.Background(), 5*time.Second) + return ethclient.NewClient(n.RPC()).HeaderByNumber(ctx, nil) +} + +func conv2any[T any](s []T) []any { + cpy := make([]any, len(s)) + for i := range s { + cpy[i] = s[i] + } + return cpy +} + +func jsonString(v any) string { + enc, err := json.MarshalIndent(v, "", " ") + if err != nil { + return fmt.Sprint(v) + } + return string(enc) +} From dcd7ddb75960c7ce19b063424d5480a430851322 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Tue, 31 Oct 2023 14:37:32 +0100 Subject: [PATCH 100/387] go.mod: upgrade github.com/docker/docker --- go.mod | 8 +------- go.sum | 34 +++------------------------------- 2 files changed, 4 insertions(+), 38 deletions(-) diff --git a/go.mod b/go.mod index db59039cba..cc020945ae 100644 --- a/go.mod +++ b/go.mod @@ -33,15 +33,13 @@ require ( github.com/consensys/bavard v0.1.13 // indirect github.com/consensys/gnark-crypto v0.12.1 // indirect github.com/containerd/containerd v1.6.18 // indirect - github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect github.com/crate-crypto/go-kzg-4844 v0.7.0 // indirect github.com/deckarep/golang-set/v2 v2.1.0 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 // indirect - github.com/docker/docker v24.0.5+incompatible // indirect + github.com/docker/docker v24.0.7+incompatible // indirect github.com/docker/go-connections v0.4.0 // indirect github.com/docker/go-units v0.5.0 // indirect github.com/ethereum/c-kzg-4844 v0.4.0 // indirect - github.com/fsnotify/fsnotify v1.6.0 // indirect github.com/getsentry/sentry-go v0.18.0 // indirect github.com/go-ole/go-ole v1.2.6 // indirect github.com/go-stack/stack v1.8.1 // indirect @@ -49,7 +47,6 @@ require ( github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/protobuf v1.5.3 // indirect github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect - github.com/google/uuid v1.3.0 // indirect github.com/gorilla/websocket v1.5.0 // indirect github.com/hashicorp/yamux v0.1.1 // indirect github.com/holiman/bloomfilter/v2 v2.0.3 // indirect @@ -77,15 +74,12 @@ require ( github.com/prometheus/procfs v0.9.0 // indirect github.com/rivo/uniseg v0.4.3 // indirect github.com/rogpeppe/go-internal v1.9.0 // indirect - github.com/russross/blackfriday/v2 v2.1.0 // indirect github.com/shirou/gopsutil v3.21.11+incompatible // indirect github.com/sirupsen/logrus v1.9.0 // indirect github.com/supranational/blst v0.3.11 // indirect github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a // indirect github.com/tklauser/go-sysconf v0.3.12 // indirect github.com/tklauser/numcpus v0.6.1 // indirect - github.com/urfave/cli/v2 v2.25.7 // indirect - github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 // indirect github.com/yusufpapurcu/wmi v1.2.2 // indirect golang.org/x/crypto v0.14.0 // indirect golang.org/x/mod v0.12.0 // indirect diff --git a/go.sum b/go.sum index d6d14b5d43..dde2612f42 100644 --- a/go.sum +++ b/go.sum @@ -29,7 +29,6 @@ github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/cespare/cp v0.1.0 h1:SE+dxFebS7Iik5LK0tsi1k9ZCxEaFX4AjQmoyA+1dJk= github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/checkpoint-restore/go-criu/v5 v5.3.0/go.mod h1:E/eQpaFtUKGOOSEBZgmKAcn+zUUwWxqcaKZlF54wK8E= @@ -66,8 +65,6 @@ github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3Ee github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= -github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/crate-crypto/go-kzg-4844 v0.7.0 h1:C0vgZRk4q4EZ/JgPfzuSoxdCq3C3mOZMBShovmncxvA= github.com/crate-crypto/go-kzg-4844 v0.7.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= @@ -84,8 +81,8 @@ github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 h1:HbphB4TFFXpv7MNrT52FGrrgVXF1 github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0/go.mod h1:DZGJHZMqrU4JJqFAWUS2UO1+lbSKsdiOoYi9Zzey7Fc= github.com/dgraph-io/badger v1.6.0/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6psNgSztDR4= github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= -github.com/docker/docker v24.0.5+incompatible h1:WmgcE4fxyI6EEXxBRxsHnZXrO1pQ3smi0k/jho4HLeY= -github.com/docker/docker v24.0.5+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v24.0.7+incompatible h1:Wo6l37AuwP3JaMnZa226lzVXGA3F9Ig1seQen0cKYlM= +github.com/docker/docker v24.0.7+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= @@ -106,17 +103,14 @@ github.com/evanw/esbuild v0.18.11 h1:Mb0qb9KyJQraob0Y7LA0DOdD8ijJs2TxhqgqrDeGq4w github.com/evanw/esbuild v0.18.11/go.mod h1:iINY06rn799hi48UqEnaQvVfZWe6W9bET78LbvN8VWk= github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072/go.mod h1:duJ4Jxv5lDcvg4QuQr0oowTf7dz4/CR8NtyCooz9HL8= github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= -github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5 h1:FtmdgXiUlNeRsoNMFlKLDt+S+6hbjVMEW6RGQ7aUf7c= github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= -github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= github.com/fsouza/go-dockerclient v1.9.8 h1:UdfyV4/w8VthS2VS0muJqUSPL/e6XSj49jqPnbuUOWA= github.com/fsouza/go-dockerclient v1.9.8/go.mod h1:74lNReDQxrOaogajs51IvZgkDME4qe9yPJAUEUTJtHw= github.com/gavv/httpexpect v2.0.0+incompatible/go.mod h1:x+9tiU1YnrOvnB725RkpoLv1M62hOWzwo5OXotisrKc= -github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff h1:tY80oXqGNY4FhTFhk+o9oFHGINQ/+vhlm8HFzi6znCI= github.com/getsentry/sentry-go v0.12.0/go.mod h1:NSap0JBYWzHND8oMbyi0+XZhUalc1TBdRL1M71JZW2c= github.com/getsentry/sentry-go v0.18.0 h1:MtBW5H9QgdcJabtZcuJG80BMOwaBpkRDZkxRkNC1sN0= github.com/getsentry/sentry-go v0.18.0/go.mod h1:Kgon4Mby+FJ7ZWHFUAZgVaIa8sxHtnRJRLTXZr51aKQ= @@ -144,9 +138,7 @@ github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7a github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/gogo/status v1.1.0/go.mod h1:BFv9nrluPLmrS0EmGVvLaPNmRosr9KapBYd5/hpY1WM= -github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY= github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= -github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -181,26 +173,21 @@ github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/ github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= -github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/hashicorp/go-bexpr v0.1.10 h1:9kuI5PFotCboP3dkDYFr/wi0gg0QVbSNz5oFRpxn4uE= github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hashicorp/yamux v0.1.1 h1:yrQxtgseBDrq9Y652vSRDvsKCJKOUD+GzTS4Y0Y8pvE= github.com/hashicorp/yamux v0.1.1/go.mod h1:CtWFDAQgb7dxtzFs4tWbplKIe2jSi3+5vKbgIO0SLnQ= -github.com/holiman/billy v0.0.0-20230718173358-1c7e68d277a7 h1:3JQNjnMRil1yD0IfZKHF9GxxWKDJGj8I0IqOUol//sw= github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao= github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA= github.com/holiman/uint256 v1.2.3 h1:K8UWO1HUJpRMXBxbmaY1Y8IAMZC/RsKB+ArEnnK4l5o= github.com/holiman/uint256 v1.2.3/go.mod h1:SC8Ryt4n+UBbPbIBKaG9zbbDlp4jOru9xFZmPzLUTxw= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/huin/goupnp v1.3.0 h1:UvLUlWDNpoUdYzb2TCn+MuTWtcjXKSza2n6CBdQ0xXc= github.com/hydrogen18/memlistener v0.0.0-20200120041712-dcc25e7acd91/go.mod h1:qEIFzExnS6016fRpRfxrExeVn2gbClQA99gQhnIcdhE= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/imkira/go-interpol v1.1.0/go.mod h1:z0h2/2T3XF8kyEPpRgJ3kmNv+C43p+I/CoI+jC3w2iA= @@ -210,7 +197,6 @@ github.com/iris-contrib/go.uuid v2.0.0+incompatible/go.mod h1:iz2lgM/1UnEf1kP0L/ github.com/iris-contrib/jade v1.1.3/go.mod h1:H/geBymxJhShH5kecoiOCSssPX7QWYH7UaeZTSWddIk= github.com/iris-contrib/pongo2 v0.0.1/go.mod h1:Ssh+00+3GAZqSQb30AvBRNxBx7rf0GqwkjqxNd0u65g= github.com/iris-contrib/schema v0.0.1/go.mod h1:urYA3uvUNG1TIIjOSCzHr9/LmbQo8LrOcOqfqxa4hXw= -github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= @@ -264,8 +250,6 @@ github.com/mediocregopher/radix/v3 v3.4.2/go.mod h1:8FL3F6UQRXHXIBSPUs5h0RybMF8i github.com/microcosm-cc/bluemonday v1.0.2/go.mod h1:iVP4YcDBq+n/5fb23BhYFvIMq/leAFZyRl6bYmGDlGc= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.4.1 h1:CpVNEelQCZBooIPDn+AR3NpivK/TIKU8bDxdASFVQag= -github.com/mitchellh/pointerstructure v1.2.0 h1:O+i9nHnXS3l/9Wu7r4NrEdwA2VFTicjUEN1uBnDo34A= github.com/mmcloughlin/addchain v0.4.0 h1:SobOdjm2xLj1KkXN5/n0xTIWyZA2+s99UCY1iPfkHRY= github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqkyU72HC5wJ4RlU= github.com/mmcloughlin/profile v0.1.1/go.mod h1:IhHD7q1ooxgwTgjxQYkACGA77oFTDdFVejUS1/tS/qU= @@ -338,11 +322,8 @@ github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTE github.com/rogpeppe/go-internal v1.8.1/go.mod h1:JeRgkft04UBgHMgCIwADu4Pn6Mtm5d4nPKWu0nJ5d+o= github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= -github.com/rs/cors v1.7.0 h1:+88SsELBHx5r+hZ8TCkggzSstaWNbDvThkVK8H6f9ik= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= -github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/schollz/closestmatch v2.1.0+incompatible/go.mod h1:RtP1ddjLong6gTkbtmuhtR2uUrrJOpYzYRvbcPAid+g= github.com/seccomp/libseccomp-golang v0.9.2-0.20220502022130-f33da4d89646/go.mod h1:JA8cRccbGaA1s33RQf7Y1+q9gHmZX1yB/z9WDN1C6fg= @@ -361,7 +342,6 @@ github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tL github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= -github.com/status-im/keycard-go v0.2.0 h1:QDLFswOQu1r5jsycloeQh3bVU8n/NatHHaZobtDnDzA= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= @@ -379,14 +359,11 @@ github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFA github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= -github.com/tyler-smith/go-bip39 v1.1.0 h1:5eUemwrMargf3BSLRRCalXT93Ns6pQJIjYQN2nyfOP8= github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/urfave/cli/v2 v2.25.7 h1:VAzn5oq403l5pHjc4OhD54+XGO9cdKVL/7lDjF+iKUs= -github.com/urfave/cli/v2 v2.25.7/go.mod h1:8qnjx1vcq5s2/wpsqoZFndg2CE5tNFyrTvS6SinrnYQ= github.com/urfave/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/valyala/fasthttp v1.6.0/go.mod h1:FstJa9V+Pj9vQ7OJie2qMHdwemEDaDiSdBnvPM1Su9w= @@ -399,8 +376,6 @@ github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2 github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= -github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU= -github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8= github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0/go.mod h1:/LWChgwKmvncFJFHJ7Gvn9wZArjbV5/FppcK2fKk/tI= github.com/yudai/gojsondiff v1.0.0/go.mod h1:AY32+k2cwILAkW1fbgxQ5mUmMiZFgLIV+FBNExI05xg= github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82/go.mod h1:lgjkn3NuSvDfVJdfcVVdX+jpBxNmX4rDAzaS45IcYoM= @@ -509,7 +484,6 @@ golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -527,7 +501,6 @@ golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181221001348-537d06c36207/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -589,7 +562,6 @@ gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1 h1:iiHuQZCN gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= gopkg.in/ini.v1 v1.51.1/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= -gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= @@ -603,7 +575,7 @@ gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= -gotest.tools/v3 v3.5.1 h1:EENdUnS3pdur5nybKYIh2Vfgc8IUNBjxDPSjtiJcOzU= +gotest.tools/v3 v3.0.3 h1:4AuOwCGf4lLR9u3YOe2awrHygurzhO/HeQ6laiA6Sx0= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= rsc.io/tmplfunc v0.0.3 h1:53XFQh69AfOa8Tw0Jm7t+GV7KZhOi6jzsCzTtKbMvzU= From 4051342ecaee14b1237fe21f43121ebdd4a24ba9 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Tue, 31 Oct 2023 14:41:45 +0100 Subject: [PATCH 101/387] simulators/devp2p: upgrade hivesim --- simulators/devp2p/go.mod | 14 +++++++------- simulators/devp2p/go.sum | 35 ++++++++++++++++++----------------- 2 files changed, 25 insertions(+), 24 deletions(-) diff --git a/simulators/devp2p/go.mod b/simulators/devp2p/go.mod index 3590f24b5d..81d3f87a73 100644 --- a/simulators/devp2p/go.mod +++ b/simulators/devp2p/go.mod @@ -3,7 +3,7 @@ module github.com/ethereum/hive/simulators/devp2p go 1.18 require ( - github.com/ethereum/hive v0.0.0-20230919110229-d58aec4a3eb5 + github.com/ethereum/hive v0.0.0-20231031133732-dcd7ddb75960 github.com/shogo82148/go-tap v0.0.3 ) @@ -12,7 +12,7 @@ require ( github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect github.com/deckarep/golang-set/v2 v2.1.0 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 // indirect - github.com/ethereum/go-ethereum v1.13.1 // indirect + github.com/ethereum/go-ethereum v1.13.5-0.20231031113925-bc42e88415d3 // indirect github.com/go-ole/go-ole v1.2.6 // indirect github.com/go-stack/stack v1.8.1 // indirect github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect @@ -23,9 +23,9 @@ require ( github.com/tklauser/go-sysconf v0.3.12 // indirect github.com/tklauser/numcpus v0.6.1 // indirect github.com/yusufpapurcu/wmi v1.2.2 // indirect - golang.org/x/crypto v0.12.0 // indirect - golang.org/x/exp v0.0.0-20230810033253-352e893a4cad // indirect - golang.org/x/mod v0.11.0 // indirect - golang.org/x/sys v0.11.0 // indirect - golang.org/x/tools v0.9.1 // indirect + golang.org/x/crypto v0.14.0 // indirect + golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect + golang.org/x/mod v0.12.0 // indirect + golang.org/x/sys v0.13.0 // indirect + golang.org/x/tools v0.13.0 // indirect ) diff --git a/simulators/devp2p/go.sum b/simulators/devp2p/go.sum index 252c21b56d..97a50bfc35 100644 --- a/simulators/devp2p/go.sum +++ b/simulators/devp2p/go.sum @@ -14,10 +14,10 @@ github.com/deckarep/golang-set/v2 v2.1.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpO github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 h1:HbphB4TFFXpv7MNrT52FGrrgVXF1owhMVTHFZIlnvd4= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0/go.mod h1:DZGJHZMqrU4JJqFAWUS2UO1+lbSKsdiOoYi9Zzey7Fc= -github.com/ethereum/go-ethereum v1.13.1 h1:UF2FaUKPIy5jeZk3X06ait3y2Q4wI+vJ1l7+UARp+60= -github.com/ethereum/go-ethereum v1.13.1/go.mod h1:xHQKzwkHSl0gnSjZK1mWa06XEdm9685AHqhRknOzqGQ= -github.com/ethereum/hive v0.0.0-20230919110229-d58aec4a3eb5 h1:22Z+XoI2hGtYR0AMzYr9IusfYM/chALq/6oJnejJQpk= -github.com/ethereum/hive v0.0.0-20230919110229-d58aec4a3eb5/go.mod h1:iKqu3dndnqdwSckyBGoZzeHhZz6X6XZws2TfZMdLdes= +github.com/ethereum/go-ethereum v1.13.5-0.20231031113925-bc42e88415d3 h1:i4TE0DmzMYcr2IiCdlTGGk+7Q/EzXvBKbbG4uRxMjJ0= +github.com/ethereum/go-ethereum v1.13.5-0.20231031113925-bc42e88415d3/go.mod h1:yMTu38GSuyxaYzQMViqNmQ1s3cE84abZexQmTgenWk0= +github.com/ethereum/hive v0.0.0-20231031133732-dcd7ddb75960 h1:7H9z2o/KImWQ/1PACU3ewsSFNxT/lzwYRnwit2YFqMg= +github.com/ethereum/hive v0.0.0-20231031133732-dcd7ddb75960/go.mod h1:sV7LrFBlEii71kI9udVbUVj7SXIifZ2VzFjQ8S6rZns= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= @@ -52,7 +52,7 @@ github.com/holiman/uint256 v1.2.3/go.mod h1:SC8Ryt4n+UBbPbIBKaG9zbbDlp4jOru9xFZm github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= -github.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peKQ= +github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= @@ -76,7 +76,7 @@ github.com/shogo82148/go-tap v0.0.3/go.mod h1:H6vRVOZ2uqX/Epmer6MnielLhU3ybUIPm6 github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= -github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a h1:1ur3QoCqvE5fl+nylMaIr9PVV1w343YRDtsy+Rwu7XI= github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a/go.mod h1:RRCYJbIwD5jmqPI9XoAFR0OcDxqUctll6zUj/+B4S48= github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= @@ -89,13 +89,13 @@ github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQ golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.12.0 h1:tFM/ta59kqch6LlvYnPa0yx5a83cL2nHflFhYKvv9Yk= -golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= -golang.org/x/exp v0.0.0-20230810033253-352e893a4cad h1:g0bG7Z4uG+OgH2QDODnjp6ggkk1bJDsINcuWmJN1iJU= -golang.org/x/exp v0.0.0-20230810033253-352e893a4cad/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc= +golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= +golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= +golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g= +golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.11.0 h1:bUO06HqtnRcc/7l71XBe4WcqTZ+3AH1J59zWDDwLKgU= -golang.org/x/mod v0.11.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc= +golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -104,7 +104,7 @@ golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwY golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M= +golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -127,20 +127,21 @@ golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= +golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc= +golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.9.1 h1:8WMNJAz3zrtPmnYC7ISf5dEn3MT0gY7jBJfw27yrrLo= -golang.org/x/tools v0.9.1/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc= +golang.org/x/tools v0.13.0 h1:Iey4qkscZuv0VvIt8E0neZjtPVQFSc870HQ448QgEmQ= +golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= From 5f97eab5ab8cc28c0ffd413cb1ae5e27240fd668 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Tue, 31 Oct 2023 14:42:18 +0100 Subject: [PATCH 102/387] simulators/smoke: upgrade hivesim --- simulators/smoke/clique/go.mod | 14 ++++++------- simulators/smoke/clique/go.sum | 35 +++++++++++++++++---------------- simulators/smoke/genesis/go.mod | 14 ++++++------- simulators/smoke/genesis/go.sum | 35 +++++++++++++++++---------------- simulators/smoke/network/go.mod | 14 ++++++------- simulators/smoke/network/go.sum | 35 +++++++++++++++++---------------- 6 files changed, 75 insertions(+), 72 deletions(-) diff --git a/simulators/smoke/clique/go.mod b/simulators/smoke/clique/go.mod index 6b31297503..bbec5ed65e 100644 --- a/simulators/smoke/clique/go.mod +++ b/simulators/smoke/clique/go.mod @@ -2,14 +2,14 @@ module github.com/ethereum/hive/simulators/smoke/clique go 1.18 -require github.com/ethereum/hive v0.0.0-20230919110229-d58aec4a3eb5 +require github.com/ethereum/hive v0.0.0-20231031133732-dcd7ddb75960 require ( github.com/Microsoft/go-winio v0.6.1 // indirect github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect github.com/deckarep/golang-set/v2 v2.1.0 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 // indirect - github.com/ethereum/go-ethereum v1.13.1 // indirect + github.com/ethereum/go-ethereum v1.13.5-0.20231031113925-bc42e88415d3 // indirect github.com/go-ole/go-ole v1.2.6 // indirect github.com/go-stack/stack v1.8.1 // indirect github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect @@ -20,9 +20,9 @@ require ( github.com/tklauser/go-sysconf v0.3.12 // indirect github.com/tklauser/numcpus v0.6.1 // indirect github.com/yusufpapurcu/wmi v1.2.2 // indirect - golang.org/x/crypto v0.12.0 // indirect - golang.org/x/exp v0.0.0-20230810033253-352e893a4cad // indirect - golang.org/x/mod v0.11.0 // indirect - golang.org/x/sys v0.11.0 // indirect - golang.org/x/tools v0.9.1 // indirect + golang.org/x/crypto v0.14.0 // indirect + golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect + golang.org/x/mod v0.12.0 // indirect + golang.org/x/sys v0.13.0 // indirect + golang.org/x/tools v0.13.0 // indirect ) diff --git a/simulators/smoke/clique/go.sum b/simulators/smoke/clique/go.sum index 385d52e663..ad328b19d0 100644 --- a/simulators/smoke/clique/go.sum +++ b/simulators/smoke/clique/go.sum @@ -14,10 +14,10 @@ github.com/deckarep/golang-set/v2 v2.1.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpO github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 h1:HbphB4TFFXpv7MNrT52FGrrgVXF1owhMVTHFZIlnvd4= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0/go.mod h1:DZGJHZMqrU4JJqFAWUS2UO1+lbSKsdiOoYi9Zzey7Fc= -github.com/ethereum/go-ethereum v1.13.1 h1:UF2FaUKPIy5jeZk3X06ait3y2Q4wI+vJ1l7+UARp+60= -github.com/ethereum/go-ethereum v1.13.1/go.mod h1:xHQKzwkHSl0gnSjZK1mWa06XEdm9685AHqhRknOzqGQ= -github.com/ethereum/hive v0.0.0-20230919110229-d58aec4a3eb5 h1:22Z+XoI2hGtYR0AMzYr9IusfYM/chALq/6oJnejJQpk= -github.com/ethereum/hive v0.0.0-20230919110229-d58aec4a3eb5/go.mod h1:iKqu3dndnqdwSckyBGoZzeHhZz6X6XZws2TfZMdLdes= +github.com/ethereum/go-ethereum v1.13.5-0.20231031113925-bc42e88415d3 h1:i4TE0DmzMYcr2IiCdlTGGk+7Q/EzXvBKbbG4uRxMjJ0= +github.com/ethereum/go-ethereum v1.13.5-0.20231031113925-bc42e88415d3/go.mod h1:yMTu38GSuyxaYzQMViqNmQ1s3cE84abZexQmTgenWk0= +github.com/ethereum/hive v0.0.0-20231031133732-dcd7ddb75960 h1:7H9z2o/KImWQ/1PACU3ewsSFNxT/lzwYRnwit2YFqMg= +github.com/ethereum/hive v0.0.0-20231031133732-dcd7ddb75960/go.mod h1:sV7LrFBlEii71kI9udVbUVj7SXIifZ2VzFjQ8S6rZns= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= @@ -52,7 +52,7 @@ github.com/holiman/uint256 v1.2.3/go.mod h1:SC8Ryt4n+UBbPbIBKaG9zbbDlp4jOru9xFZm github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= -github.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peKQ= +github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= @@ -74,7 +74,7 @@ github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMT github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= -github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a h1:1ur3QoCqvE5fl+nylMaIr9PVV1w343YRDtsy+Rwu7XI= github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a/go.mod h1:RRCYJbIwD5jmqPI9XoAFR0OcDxqUctll6zUj/+B4S48= github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= @@ -87,13 +87,13 @@ github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQ golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.12.0 h1:tFM/ta59kqch6LlvYnPa0yx5a83cL2nHflFhYKvv9Yk= -golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= -golang.org/x/exp v0.0.0-20230810033253-352e893a4cad h1:g0bG7Z4uG+OgH2QDODnjp6ggkk1bJDsINcuWmJN1iJU= -golang.org/x/exp v0.0.0-20230810033253-352e893a4cad/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc= +golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= +golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= +golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g= +golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.11.0 h1:bUO06HqtnRcc/7l71XBe4WcqTZ+3AH1J59zWDDwLKgU= -golang.org/x/mod v0.11.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc= +golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -102,7 +102,7 @@ golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwY golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M= +golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -125,20 +125,21 @@ golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= +golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc= +golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.9.1 h1:8WMNJAz3zrtPmnYC7ISf5dEn3MT0gY7jBJfw27yrrLo= -golang.org/x/tools v0.9.1/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc= +golang.org/x/tools v0.13.0 h1:Iey4qkscZuv0VvIt8E0neZjtPVQFSc870HQ448QgEmQ= +golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/simulators/smoke/genesis/go.mod b/simulators/smoke/genesis/go.mod index f2ab53d455..7c713dd956 100644 --- a/simulators/smoke/genesis/go.mod +++ b/simulators/smoke/genesis/go.mod @@ -2,14 +2,14 @@ module github.com/ethereum/hive/simulators/smoke/genesis go 1.18 -require github.com/ethereum/hive v0.0.0-20230919110229-d58aec4a3eb5 +require github.com/ethereum/hive v0.0.0-20231031133732-dcd7ddb75960 require ( github.com/Microsoft/go-winio v0.6.1 // indirect github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect github.com/deckarep/golang-set/v2 v2.1.0 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 // indirect - github.com/ethereum/go-ethereum v1.13.1 // indirect + github.com/ethereum/go-ethereum v1.13.5-0.20231031113925-bc42e88415d3 // indirect github.com/go-ole/go-ole v1.2.6 // indirect github.com/go-stack/stack v1.8.1 // indirect github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect @@ -20,9 +20,9 @@ require ( github.com/tklauser/go-sysconf v0.3.12 // indirect github.com/tklauser/numcpus v0.6.1 // indirect github.com/yusufpapurcu/wmi v1.2.2 // indirect - golang.org/x/crypto v0.12.0 // indirect - golang.org/x/exp v0.0.0-20230810033253-352e893a4cad // indirect - golang.org/x/mod v0.11.0 // indirect - golang.org/x/sys v0.11.0 // indirect - golang.org/x/tools v0.9.1 // indirect + golang.org/x/crypto v0.14.0 // indirect + golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect + golang.org/x/mod v0.12.0 // indirect + golang.org/x/sys v0.13.0 // indirect + golang.org/x/tools v0.13.0 // indirect ) diff --git a/simulators/smoke/genesis/go.sum b/simulators/smoke/genesis/go.sum index 385d52e663..ad328b19d0 100644 --- a/simulators/smoke/genesis/go.sum +++ b/simulators/smoke/genesis/go.sum @@ -14,10 +14,10 @@ github.com/deckarep/golang-set/v2 v2.1.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpO github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 h1:HbphB4TFFXpv7MNrT52FGrrgVXF1owhMVTHFZIlnvd4= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0/go.mod h1:DZGJHZMqrU4JJqFAWUS2UO1+lbSKsdiOoYi9Zzey7Fc= -github.com/ethereum/go-ethereum v1.13.1 h1:UF2FaUKPIy5jeZk3X06ait3y2Q4wI+vJ1l7+UARp+60= -github.com/ethereum/go-ethereum v1.13.1/go.mod h1:xHQKzwkHSl0gnSjZK1mWa06XEdm9685AHqhRknOzqGQ= -github.com/ethereum/hive v0.0.0-20230919110229-d58aec4a3eb5 h1:22Z+XoI2hGtYR0AMzYr9IusfYM/chALq/6oJnejJQpk= -github.com/ethereum/hive v0.0.0-20230919110229-d58aec4a3eb5/go.mod h1:iKqu3dndnqdwSckyBGoZzeHhZz6X6XZws2TfZMdLdes= +github.com/ethereum/go-ethereum v1.13.5-0.20231031113925-bc42e88415d3 h1:i4TE0DmzMYcr2IiCdlTGGk+7Q/EzXvBKbbG4uRxMjJ0= +github.com/ethereum/go-ethereum v1.13.5-0.20231031113925-bc42e88415d3/go.mod h1:yMTu38GSuyxaYzQMViqNmQ1s3cE84abZexQmTgenWk0= +github.com/ethereum/hive v0.0.0-20231031133732-dcd7ddb75960 h1:7H9z2o/KImWQ/1PACU3ewsSFNxT/lzwYRnwit2YFqMg= +github.com/ethereum/hive v0.0.0-20231031133732-dcd7ddb75960/go.mod h1:sV7LrFBlEii71kI9udVbUVj7SXIifZ2VzFjQ8S6rZns= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= @@ -52,7 +52,7 @@ github.com/holiman/uint256 v1.2.3/go.mod h1:SC8Ryt4n+UBbPbIBKaG9zbbDlp4jOru9xFZm github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= -github.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peKQ= +github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= @@ -74,7 +74,7 @@ github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMT github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= -github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a h1:1ur3QoCqvE5fl+nylMaIr9PVV1w343YRDtsy+Rwu7XI= github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a/go.mod h1:RRCYJbIwD5jmqPI9XoAFR0OcDxqUctll6zUj/+B4S48= github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= @@ -87,13 +87,13 @@ github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQ golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.12.0 h1:tFM/ta59kqch6LlvYnPa0yx5a83cL2nHflFhYKvv9Yk= -golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= -golang.org/x/exp v0.0.0-20230810033253-352e893a4cad h1:g0bG7Z4uG+OgH2QDODnjp6ggkk1bJDsINcuWmJN1iJU= -golang.org/x/exp v0.0.0-20230810033253-352e893a4cad/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc= +golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= +golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= +golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g= +golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.11.0 h1:bUO06HqtnRcc/7l71XBe4WcqTZ+3AH1J59zWDDwLKgU= -golang.org/x/mod v0.11.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc= +golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -102,7 +102,7 @@ golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwY golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M= +golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -125,20 +125,21 @@ golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= +golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc= +golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.9.1 h1:8WMNJAz3zrtPmnYC7ISf5dEn3MT0gY7jBJfw27yrrLo= -golang.org/x/tools v0.9.1/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc= +golang.org/x/tools v0.13.0 h1:Iey4qkscZuv0VvIt8E0neZjtPVQFSc870HQ448QgEmQ= +golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/simulators/smoke/network/go.mod b/simulators/smoke/network/go.mod index 3069cb477e..00fc5dca21 100644 --- a/simulators/smoke/network/go.mod +++ b/simulators/smoke/network/go.mod @@ -2,14 +2,14 @@ module github.com/ethereum/hive/simulators/smoke/network go 1.18 -require github.com/ethereum/hive v0.0.0-20230919110229-d58aec4a3eb5 +require github.com/ethereum/hive v0.0.0-20231031133732-dcd7ddb75960 require ( github.com/Microsoft/go-winio v0.6.1 // indirect github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect github.com/deckarep/golang-set/v2 v2.1.0 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 // indirect - github.com/ethereum/go-ethereum v1.13.1 // indirect + github.com/ethereum/go-ethereum v1.13.5-0.20231031113925-bc42e88415d3 // indirect github.com/go-ole/go-ole v1.2.6 // indirect github.com/go-stack/stack v1.8.1 // indirect github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect @@ -20,9 +20,9 @@ require ( github.com/tklauser/go-sysconf v0.3.12 // indirect github.com/tklauser/numcpus v0.6.1 // indirect github.com/yusufpapurcu/wmi v1.2.2 // indirect - golang.org/x/crypto v0.12.0 // indirect - golang.org/x/exp v0.0.0-20230810033253-352e893a4cad // indirect - golang.org/x/mod v0.11.0 // indirect - golang.org/x/sys v0.11.0 // indirect - golang.org/x/tools v0.9.1 // indirect + golang.org/x/crypto v0.14.0 // indirect + golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect + golang.org/x/mod v0.12.0 // indirect + golang.org/x/sys v0.13.0 // indirect + golang.org/x/tools v0.13.0 // indirect ) diff --git a/simulators/smoke/network/go.sum b/simulators/smoke/network/go.sum index 385d52e663..ad328b19d0 100644 --- a/simulators/smoke/network/go.sum +++ b/simulators/smoke/network/go.sum @@ -14,10 +14,10 @@ github.com/deckarep/golang-set/v2 v2.1.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpO github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 h1:HbphB4TFFXpv7MNrT52FGrrgVXF1owhMVTHFZIlnvd4= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0/go.mod h1:DZGJHZMqrU4JJqFAWUS2UO1+lbSKsdiOoYi9Zzey7Fc= -github.com/ethereum/go-ethereum v1.13.1 h1:UF2FaUKPIy5jeZk3X06ait3y2Q4wI+vJ1l7+UARp+60= -github.com/ethereum/go-ethereum v1.13.1/go.mod h1:xHQKzwkHSl0gnSjZK1mWa06XEdm9685AHqhRknOzqGQ= -github.com/ethereum/hive v0.0.0-20230919110229-d58aec4a3eb5 h1:22Z+XoI2hGtYR0AMzYr9IusfYM/chALq/6oJnejJQpk= -github.com/ethereum/hive v0.0.0-20230919110229-d58aec4a3eb5/go.mod h1:iKqu3dndnqdwSckyBGoZzeHhZz6X6XZws2TfZMdLdes= +github.com/ethereum/go-ethereum v1.13.5-0.20231031113925-bc42e88415d3 h1:i4TE0DmzMYcr2IiCdlTGGk+7Q/EzXvBKbbG4uRxMjJ0= +github.com/ethereum/go-ethereum v1.13.5-0.20231031113925-bc42e88415d3/go.mod h1:yMTu38GSuyxaYzQMViqNmQ1s3cE84abZexQmTgenWk0= +github.com/ethereum/hive v0.0.0-20231031133732-dcd7ddb75960 h1:7H9z2o/KImWQ/1PACU3ewsSFNxT/lzwYRnwit2YFqMg= +github.com/ethereum/hive v0.0.0-20231031133732-dcd7ddb75960/go.mod h1:sV7LrFBlEii71kI9udVbUVj7SXIifZ2VzFjQ8S6rZns= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= @@ -52,7 +52,7 @@ github.com/holiman/uint256 v1.2.3/go.mod h1:SC8Ryt4n+UBbPbIBKaG9zbbDlp4jOru9xFZm github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= -github.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peKQ= +github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= @@ -74,7 +74,7 @@ github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMT github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= -github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a h1:1ur3QoCqvE5fl+nylMaIr9PVV1w343YRDtsy+Rwu7XI= github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a/go.mod h1:RRCYJbIwD5jmqPI9XoAFR0OcDxqUctll6zUj/+B4S48= github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= @@ -87,13 +87,13 @@ github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQ golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.12.0 h1:tFM/ta59kqch6LlvYnPa0yx5a83cL2nHflFhYKvv9Yk= -golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= -golang.org/x/exp v0.0.0-20230810033253-352e893a4cad h1:g0bG7Z4uG+OgH2QDODnjp6ggkk1bJDsINcuWmJN1iJU= -golang.org/x/exp v0.0.0-20230810033253-352e893a4cad/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc= +golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= +golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= +golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g= +golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.11.0 h1:bUO06HqtnRcc/7l71XBe4WcqTZ+3AH1J59zWDDwLKgU= -golang.org/x/mod v0.11.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc= +golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -102,7 +102,7 @@ golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwY golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M= +golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -125,20 +125,21 @@ golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= +golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc= +golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.9.1 h1:8WMNJAz3zrtPmnYC7ISf5dEn3MT0gY7jBJfw27yrrLo= -golang.org/x/tools v0.9.1/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc= +golang.org/x/tools v0.13.0 h1:Iey4qkscZuv0VvIt8E0neZjtPVQFSc870HQ448QgEmQ= +golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= From b1501ed6d0b06b3acbfe0b1badf175abbdafc532 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Tue, 31 Oct 2023 14:42:36 +0100 Subject: [PATCH 103/387] simulators/ethereum/sync: upgrade hivesim --- simulators/ethereum/sync/go.mod | 35 ++++++------ simulators/ethereum/sync/go.sum | 98 ++++++++++++++------------------- 2 files changed, 58 insertions(+), 75 deletions(-) diff --git a/simulators/ethereum/sync/go.mod b/simulators/ethereum/sync/go.mod index 8d9bc8529f..b6657206ff 100644 --- a/simulators/ethereum/sync/go.mod +++ b/simulators/ethereum/sync/go.mod @@ -3,37 +3,38 @@ module github.com/ethereum/hive/simulators/ethereum/sync go 1.20 require ( - github.com/ethereum/go-ethereum v1.13.1 - github.com/ethereum/hive v0.0.0-20230919110229-d58aec4a3eb5 + github.com/ethereum/go-ethereum v1.13.5-0.20231031113925-bc42e88415d3 + github.com/ethereum/hive v0.0.0-20231031133732-dcd7ddb75960 ) require ( github.com/DataDog/zstd v1.5.2 // indirect github.com/Microsoft/go-winio v0.6.1 // indirect - github.com/VictoriaMetrics/fastcache v1.12.0 // indirect + github.com/VictoriaMetrics/fastcache v1.12.1 // indirect github.com/beorn7/perks v1.0.1 // indirect - github.com/bits-and-blooms/bitset v1.5.0 // indirect + github.com/bits-and-blooms/bitset v1.7.0 // indirect github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/cockroachdb/errors v1.9.1 // indirect github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect - github.com/cockroachdb/pebble v0.0.0-20230906160148-46873a6a7a06 // indirect + github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593 // indirect github.com/cockroachdb/redact v1.1.3 // indirect + github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect github.com/consensys/bavard v0.1.13 // indirect - github.com/consensys/gnark-crypto v0.10.0 // indirect + github.com/consensys/gnark-crypto v0.12.1 // indirect github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect - github.com/crate-crypto/go-kzg-4844 v0.3.0 // indirect + github.com/crate-crypto/go-kzg-4844 v0.7.0 // indirect github.com/deckarep/golang-set/v2 v2.1.0 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 // indirect - github.com/ethereum/c-kzg-4844 v0.3.1 // indirect + github.com/ethereum/c-kzg-4844 v0.4.0 // indirect github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5 // indirect github.com/getsentry/sentry-go v0.18.0 // indirect github.com/go-ole/go-ole v1.2.6 // indirect github.com/go-stack/stack v1.8.1 // indirect github.com/gofrs/flock v0.8.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang-jwt/jwt/v4 v4.3.0 // indirect - github.com/golang/protobuf v1.5.2 // indirect + github.com/golang-jwt/jwt/v4 v4.5.0 // indirect + github.com/golang/protobuf v1.5.3 // indirect github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect github.com/gorilla/websocket v1.5.0 // indirect github.com/hashicorp/go-bexpr v0.1.10 // indirect @@ -44,7 +45,7 @@ require ( github.com/kr/pretty v0.3.1 // indirect github.com/kr/text v0.2.0 // indirect github.com/mattn/go-colorable v0.1.13 // indirect - github.com/mattn/go-isatty v0.0.16 // indirect + github.com/mattn/go-isatty v0.0.17 // indirect github.com/mattn/go-runewidth v0.0.14 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect github.com/mitchellh/mapstructure v1.4.1 // indirect @@ -68,13 +69,13 @@ require ( github.com/urfave/cli/v2 v2.25.7 // indirect github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 // indirect github.com/yusufpapurcu/wmi v1.2.2 // indirect - golang.org/x/crypto v0.12.0 // indirect - golang.org/x/exp v0.0.0-20230810033253-352e893a4cad // indirect - golang.org/x/mod v0.11.0 // indirect + golang.org/x/crypto v0.14.0 // indirect + golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect + golang.org/x/mod v0.12.0 // indirect golang.org/x/sync v0.3.0 // indirect - golang.org/x/sys v0.11.0 // indirect - golang.org/x/text v0.12.0 // indirect - golang.org/x/tools v0.9.1 // indirect + golang.org/x/sys v0.13.0 // indirect + golang.org/x/text v0.13.0 // indirect + golang.org/x/tools v0.13.0 // indirect google.golang.org/protobuf v1.28.1 // indirect gopkg.in/natefinch/lumberjack.v2 v2.0.0 // indirect rsc.io/tmplfunc v0.0.3 // indirect diff --git a/simulators/ethereum/sync/go.sum b/simulators/ethereum/sync/go.sum index 7a4db83220..53ffa0f90d 100644 --- a/simulators/ethereum/sync/go.sum +++ b/simulators/ethereum/sync/go.sum @@ -2,7 +2,6 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMT github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/toml v1.3.2 h1:o7IhLm0Msx3BaB+n3Ag7L8EVlByGnpq14C4YWiu/gL8= -github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= github.com/CloudyKit/fastprinter v0.0.0-20200109182630-33d98a066a53/go.mod h1:+3IMCy2vIlbG1XG/0ggNQv0SvxCAIpPM5b1nCz56Xno= github.com/CloudyKit/jet/v3 v3.0.0/go.mod h1:HKQPgSJmdK8hdoAbKUUWajkHyHo4RaU5rMdUywE7VMo= github.com/DataDog/zstd v1.5.2 h1:vUG4lAyuPCXO0TLbXvPv7EB7cNK1QV/luu55UHLrrn8= @@ -11,24 +10,21 @@ github.com/Joker/hpp v1.0.0/go.mod h1:8x5n+M1Hp5hC0g8okX3sR3vFQwynaX/UgSOM9MeBKz github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= github.com/Shopify/goreferrer v0.0.0-20181106222321-ec9c9a553398/go.mod h1:a1uqRtAwp2Xwc6WNPJEufxJ7fx3npB4UV/JOLmbu5I0= -github.com/VictoriaMetrics/fastcache v1.12.0 h1:vnVi/y9yKDcD9akmc4NqAoqgQhJrOwUF+j9LTgn4QDE= -github.com/VictoriaMetrics/fastcache v1.12.0/go.mod h1:tjiYeEfYXCqacuvYw/7UoDIeJaNxq6132xHICNP77w8= +github.com/VictoriaMetrics/fastcache v1.12.1 h1:i0mICQuojGDL3KblA7wUNlY5lOK6a4bwt3uRKnkZU40= +github.com/VictoriaMetrics/fastcache v1.12.1/go.mod h1:tX04vaqcNoQeGLD+ra5pU5sWkuxnzWhEzLwhP9w653o= github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY= github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= github.com/allegro/bigcache v1.2.1 h1:hg1sY1raCwic3Vnsvje6TT7/pnZba83LeFck5NrFKSc= -github.com/allegro/bigcache v1.2.1/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/aymerick/raymond v2.0.3-0.20180322193309-b565731e1464+incompatible/go.mod h1:osfaiScAUVup+UC9Nfq76eWqDhXlp+4UYaA8uhTBO6g= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bits-and-blooms/bitset v1.5.0 h1:NpE8frKRLGHIcEzkR+gZhiioW1+WbYV6fKwD6ZIpQT8= -github.com/bits-and-blooms/bitset v1.5.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= +github.com/bits-and-blooms/bitset v1.7.0 h1:YjAGVd3XmtK9ktAbX8Zg2g2PwLIMjGREZJHlV4j7NEo= +github.com/bits-and-blooms/bitset v1.7.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U= github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= -github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= @@ -37,30 +33,31 @@ github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMn github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cockroachdb/datadriven v1.0.2/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= -github.com/cockroachdb/datadriven v1.0.3-0.20230801171734-e384cf455877 h1:1MLK4YpFtIEo3ZtMA5C795Wtv5VuUnrXX7mQG+aHg6o= -github.com/cockroachdb/datadriven v1.0.3-0.20230801171734-e384cf455877/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= +github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f h1:otljaYPt5hWxV3MUfO5dFPFiOXg9CyG5/kCfayTqsJ4= github.com/cockroachdb/errors v1.9.1 h1:yFVvsI0VxmRShfawbt/laCIDy/mtTqqnvoNgiy5bEV8= github.com/cockroachdb/errors v1.9.1/go.mod h1:2sxOtL2WIc096WSZqZ5h8fa17rdDq9HZOZLBCor4mBk= github.com/cockroachdb/logtags v0.0.0-20211118104740-dabe8e521a4f/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= -github.com/cockroachdb/pebble v0.0.0-20230906160148-46873a6a7a06 h1:T+Np/xtzIjYM/P5NAw0e2Rf1FGvzDau1h54MKvx8G7w= -github.com/cockroachdb/pebble v0.0.0-20230906160148-46873a6a7a06/go.mod h1:bynZ3gvVyhlvjLI7PT6dmZ7g76xzJ7HpxfjgkzCGz6s= +github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593 h1:aPEJyR4rPBvDmeyi+l/FS/VtA00IWvjeFvjen1m1l1A= +github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593/go.mod h1:6hk1eMY/u5t+Cf18q5lFMUA1Rc+Sm5I6Ra1QuPyxXCo= github.com/cockroachdb/redact v1.1.3 h1:AKZds10rFSIj7qADf0g46UixK8NNLwWTNdCIGS5wfSQ= github.com/cockroachdb/redact v1.1.3/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= +github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo= +github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ= github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0/go.mod h1:4Zcjuz89kmFXt9morQgcfYZAYZ5n8WHjt81YYWIwtTM= github.com/consensys/bavard v0.1.13 h1:oLhMLOFGTLdlda/kma4VOJazblc7IM5y5QPd2A/YjhQ= github.com/consensys/bavard v0.1.13/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI= -github.com/consensys/gnark-crypto v0.10.0 h1:zRh22SR7o4K35SoNqouS9J/TKHTyU2QWaj5ldehyXtA= -github.com/consensys/gnark-crypto v0.10.0/go.mod h1:Iq/P3HHl0ElSjsg2E1gsMwhAyxnxoKK5nVyZKd+/KhU= +github.com/consensys/gnark-crypto v0.12.1 h1:lHH39WuuFgVHONRl3J0LRBtuYdQTumFSDtJF7HpyG8M= +github.com/consensys/gnark-crypto v0.12.1/go.mod h1:v2Gy7L/4ZRosZ7Ivs+9SfUDr0f5UlG+EM5t7MPHiLuY= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/crate-crypto/go-kzg-4844 v0.3.0 h1:UBlWE0CgyFqqzTI+IFyCzA7A3Zw4iip6uzRv5NIXG0A= -github.com/crate-crypto/go-kzg-4844 v0.3.0/go.mod h1:SBP7ikXEgDnUPONgm33HtuDZEDtWa3L4QtN1ocJSEQ4= +github.com/crate-crypto/go-kzg-4844 v0.7.0 h1:C0vgZRk4q4EZ/JgPfzuSoxdCq3C3mOZMBShovmncxvA= +github.com/crate-crypto/go-kzg-4844 v0.7.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= @@ -68,7 +65,6 @@ github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs github.com/deckarep/golang-set/v2 v2.1.0 h1:g47V4Or+DUdzbs8FxCCmgb6VYd+ptPAngjM6dtGktsI= github.com/deckarep/golang-set/v2 v2.1.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0= -github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 h1:HbphB4TFFXpv7MNrT52FGrrgVXF1owhMVTHFZIlnvd4= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0/go.mod h1:DZGJHZMqrU4JJqFAWUS2UO1+lbSKsdiOoYi9Zzey7Fc= github.com/dgraph-io/badger v1.6.0/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6psNgSztDR4= @@ -80,12 +76,12 @@ github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.m github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/etcd-io/bbolt v1.3.3/go.mod h1:ZF2nL25h33cCyBtcyWeZ2/I3HQOfTP+0PIEvHjkjCrw= -github.com/ethereum/c-kzg-4844 v0.3.1 h1:sR65+68+WdnMKxseNWxSJuAv2tsUrihTpVBTfM/U5Zg= -github.com/ethereum/c-kzg-4844 v0.3.1/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= -github.com/ethereum/go-ethereum v1.13.1 h1:UF2FaUKPIy5jeZk3X06ait3y2Q4wI+vJ1l7+UARp+60= -github.com/ethereum/go-ethereum v1.13.1/go.mod h1:xHQKzwkHSl0gnSjZK1mWa06XEdm9685AHqhRknOzqGQ= -github.com/ethereum/hive v0.0.0-20230919110229-d58aec4a3eb5 h1:22Z+XoI2hGtYR0AMzYr9IusfYM/chALq/6oJnejJQpk= -github.com/ethereum/hive v0.0.0-20230919110229-d58aec4a3eb5/go.mod h1:iKqu3dndnqdwSckyBGoZzeHhZz6X6XZws2TfZMdLdes= +github.com/ethereum/c-kzg-4844 v0.4.0 h1:3MS1s4JtA868KpJxroZoepdV0ZKBp3u/O5HcZ7R3nlY= +github.com/ethereum/c-kzg-4844 v0.4.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= +github.com/ethereum/go-ethereum v1.13.5-0.20231031113925-bc42e88415d3 h1:i4TE0DmzMYcr2IiCdlTGGk+7Q/EzXvBKbbG4uRxMjJ0= +github.com/ethereum/go-ethereum v1.13.5-0.20231031113925-bc42e88415d3/go.mod h1:yMTu38GSuyxaYzQMViqNmQ1s3cE84abZexQmTgenWk0= +github.com/ethereum/hive v0.0.0-20231031133732-dcd7ddb75960 h1:7H9z2o/KImWQ/1PACU3ewsSFNxT/lzwYRnwit2YFqMg= +github.com/ethereum/hive v0.0.0-20231031133732-dcd7ddb75960/go.mod h1:sV7LrFBlEii71kI9udVbUVj7SXIifZ2VzFjQ8S6rZns= github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072/go.mod h1:duJ4Jxv5lDcvg4QuQr0oowTf7dz4/CR8NtyCooz9HL8= github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5 h1:FtmdgXiUlNeRsoNMFlKLDt+S+6hbjVMEW6RGQ7aUf7c= @@ -94,10 +90,8 @@ github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMo github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= -github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= github.com/gavv/httpexpect v2.0.0+incompatible/go.mod h1:x+9tiU1YnrOvnB725RkpoLv1M62hOWzwo5OXotisrKc= github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff h1:tY80oXqGNY4FhTFhk+o9oFHGINQ/+vhlm8HFzi6znCI= -github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= github.com/getsentry/sentry-go v0.12.0/go.mod h1:NSap0JBYWzHND8oMbyi0+XZhUalc1TBdRL1M71JZW2c= github.com/getsentry/sentry-go v0.18.0 h1:MtBW5H9QgdcJabtZcuJG80BMOwaBpkRDZkxRkNC1sN0= github.com/getsentry/sentry-go v0.18.0/go.mod h1:Kgon4Mby+FJ7ZWHFUAZgVaIa8sxHtnRJRLTXZr51aKQ= @@ -106,7 +100,6 @@ github.com/gin-gonic/gin v1.4.0/go.mod h1:OW2EZn3DO8Ln9oIKOvM++LBO+5UPHJJDH72/q/ github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= -github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab/go.mod h1:/P9AEU963A2AYjv4d1V5eVL1CQbEJq6aCNHDDjibzu8= github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= @@ -125,8 +118,8 @@ github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/gogo/status v1.1.0/go.mod h1:BFv9nrluPLmrS0EmGVvLaPNmRosr9KapBYd5/hpY1WM= github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= -github.com/golang-jwt/jwt/v4 v4.3.0 h1:kHL1vqdqWNfATmA0FNMdmZNMyZI1U6O31X4rlIPoBog= -github.com/golang-jwt/jwt/v4 v4.3.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= +github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= +github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -141,8 +134,9 @@ github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvq github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= +github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXiurYmW7fx4GZkL8feAMVq7nEjURHk= github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= @@ -154,17 +148,14 @@ github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= -github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= -github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= @@ -173,9 +164,7 @@ github.com/hashicorp/go-bexpr v0.1.10/go.mod h1:oxlubA2vC/gFVfX1A6JGp7ls7uCDlfJn github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/holiman/billy v0.0.0-20230718173358-1c7e68d277a7 h1:3JQNjnMRil1yD0IfZKHF9GxxWKDJGj8I0IqOUol//sw= -github.com/holiman/billy v0.0.0-20230718173358-1c7e68d277a7/go.mod h1:5GuXa7vkL8u9FkFuWdVvfR5ix8hRB7DbOAaYULamFpc= github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao= -github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA= github.com/holiman/uint256 v1.2.3 h1:K8UWO1HUJpRMXBxbmaY1Y8IAMZC/RsKB+ArEnnK4l5o= github.com/holiman/uint256 v1.2.3/go.mod h1:SC8Ryt4n+UBbPbIBKaG9zbbDlp4jOru9xFZmPzLUTxw= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= @@ -217,11 +206,9 @@ github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= -github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/labstack/echo/v4 v4.5.0/go.mod h1:czIriw4a0C1dFun+ObrXp7ok03xON0N1awStJ6ArI7Y= github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c= -github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= @@ -233,8 +220,9 @@ github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hd github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= -github.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peKQ= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng= +github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.14 h1:+xnbZSEeDbOIg5/mE6JF0w6n9duR1l3/WmbinWVwUuU= github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= @@ -323,7 +311,6 @@ github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb6 github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= github.com/status-im/keycard-go v0.2.0 h1:QDLFswOQu1r5jsycloeQh3bVU8n/NatHHaZobtDnDzA= -github.com/status-im/keycard-go v0.2.0/go.mod h1:wlp8ZLbsmrF6g6WjugPAx+IzoLrkdf9+mHxBEeo3Hbg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= @@ -331,8 +318,7 @@ github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81P github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= -github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= -github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/supranational/blst v0.3.11 h1:LyU6FolezeWAhvQk0k6O/d49jqgO52MSDDfYgbeoEm4= github.com/supranational/blst v0.3.11/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a h1:1ur3QoCqvE5fl+nylMaIr9PVV1w343YRDtsy+Rwu7XI= @@ -342,7 +328,6 @@ github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0h github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= github.com/tyler-smith/go-bip39 v1.1.0 h1:5eUemwrMargf3BSLRRCalXT93Ns6pQJIjYQN2nyfOP8= -github.com/tyler-smith/go-bip39 v1.1.0/go.mod h1:gUYDtqQw1JS3ZJ8UWVcGTGqqr6YIN3CWg+kkNaLt55U= github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= @@ -378,11 +363,11 @@ golang.org/x/crypto v0.0.0-20191227163750-53104e6ec876/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.12.0 h1:tFM/ta59kqch6LlvYnPa0yx5a83cL2nHflFhYKvv9Yk= -golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= +golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= +golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20230810033253-352e893a4cad h1:g0bG7Z4uG+OgH2QDODnjp6ggkk1bJDsINcuWmJN1iJU= -golang.org/x/exp v0.0.0-20230810033253-352e893a4cad/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc= +golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g= +golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= @@ -391,8 +376,8 @@ golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzB golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.11.0 h1:bUO06HqtnRcc/7l71XBe4WcqTZ+3AH1J59zWDDwLKgU= -golang.org/x/mod v0.11.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc= +golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -414,8 +399,7 @@ golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT golang.org/x/net v0.0.0-20211008194852-3b03d305991f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M= -golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -456,13 +440,14 @@ golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220405052023-b1e9470b6e64/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= +golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -471,11 +456,10 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc= -golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= +golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= -golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181221001348-537d06c36207/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -490,8 +474,8 @@ golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roY golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.9.1 h1:8WMNJAz3zrtPmnYC7ISf5dEn3MT0gY7jBJfw27yrrLo= -golang.org/x/tools v0.9.1/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc= +golang.org/x/tools v0.13.0 h1:Iey4qkscZuv0VvIt8E0neZjtPVQFSc870HQ448QgEmQ= +golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -527,13 +511,11 @@ gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8 gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= gopkg.in/go-playground/validator.v8 v8.18.2/go.mod h1:RX2a/7Ha8BgOhfk7j780h4/u/RRjR0eouCJSH80/M2Y= gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1 h1:iiHuQZCNgYPmFQxd3BBN/Nc5+dAwzZuq5y40s20oQw0= -gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= gopkg.in/ini.v1 v1.51.1/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8= From ed683366e16e8bf8a379cb27dbc5ca922d486b53 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Tue, 31 Oct 2023 14:45:11 +0100 Subject: [PATCH 104/387] simulators/ethereum/rpc: upgrade hivesim --- simulators/ethereum/rpc/go.mod | 32 +++++++-------- simulators/ethereum/rpc/go.sum | 75 ++++++++++++++++++---------------- 2 files changed, 55 insertions(+), 52 deletions(-) diff --git a/simulators/ethereum/rpc/go.mod b/simulators/ethereum/rpc/go.mod index 76707877f2..5450dfb20f 100644 --- a/simulators/ethereum/rpc/go.mod +++ b/simulators/ethereum/rpc/go.mod @@ -3,30 +3,31 @@ module github.com/ethereum/hive/simulators/ethereum/rpc go 1.18 require ( - github.com/ethereum/go-ethereum v1.13.1 - github.com/ethereum/hive v0.0.0-20230919110229-d58aec4a3eb5 + github.com/ethereum/go-ethereum v1.13.5-0.20231031113925-bc42e88415d3 + github.com/ethereum/hive v0.0.0-20231031133732-dcd7ddb75960 github.com/kr/pretty v0.3.1 ) require ( github.com/DataDog/zstd v1.5.2 // indirect github.com/Microsoft/go-winio v0.6.1 // indirect - github.com/VictoriaMetrics/fastcache v1.12.0 // indirect + github.com/VictoriaMetrics/fastcache v1.12.1 // indirect github.com/beorn7/perks v1.0.1 // indirect - github.com/bits-and-blooms/bitset v1.5.0 // indirect + github.com/bits-and-blooms/bitset v1.7.0 // indirect github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect github.com/cespare/cp v1.1.1 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/cockroachdb/errors v1.9.1 // indirect github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect - github.com/cockroachdb/pebble v0.0.0-20230906160148-46873a6a7a06 // indirect + github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593 // indirect github.com/cockroachdb/redact v1.1.3 // indirect + github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect github.com/consensys/bavard v0.1.13 // indirect - github.com/consensys/gnark-crypto v0.10.0 // indirect - github.com/crate-crypto/go-kzg-4844 v0.3.0 // indirect + github.com/consensys/gnark-crypto v0.12.1 // indirect + github.com/crate-crypto/go-kzg-4844 v0.7.0 // indirect github.com/deckarep/golang-set/v2 v2.1.0 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 // indirect - github.com/ethereum/c-kzg-4844 v0.3.1 // indirect + github.com/ethereum/c-kzg-4844 v0.4.0 // indirect github.com/fjl/memsize v0.0.1 // indirect github.com/fsnotify/fsnotify v1.6.0 // indirect github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08 // indirect @@ -35,8 +36,7 @@ require ( github.com/go-stack/stack v1.8.1 // indirect github.com/gofrs/flock v0.8.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang-jwt/jwt/v4 v4.4.3 // indirect - github.com/golang/protobuf v1.5.2 // indirect + github.com/golang/protobuf v1.5.3 // indirect github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect github.com/google/uuid v1.3.0 // indirect github.com/gorilla/websocket v1.5.0 // indirect @@ -64,13 +64,13 @@ require ( github.com/tklauser/go-sysconf v0.3.12 // indirect github.com/tklauser/numcpus v0.6.1 // indirect github.com/yusufpapurcu/wmi v1.2.2 // indirect - golang.org/x/crypto v0.12.0 // indirect - golang.org/x/exp v0.0.0-20230810033253-352e893a4cad // indirect - golang.org/x/mod v0.11.0 // indirect + golang.org/x/crypto v0.14.0 // indirect + golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect + golang.org/x/mod v0.12.0 // indirect golang.org/x/sync v0.3.0 // indirect - golang.org/x/sys v0.11.0 // indirect - golang.org/x/text v0.12.0 // indirect - golang.org/x/tools v0.9.1 // indirect + golang.org/x/sys v0.13.0 // indirect + golang.org/x/text v0.13.0 // indirect + golang.org/x/tools v0.13.0 // indirect google.golang.org/protobuf v1.28.1 // indirect rsc.io/tmplfunc v0.0.3 // indirect ) diff --git a/simulators/ethereum/rpc/go.sum b/simulators/ethereum/rpc/go.sum index 3dca035dbc..3d25c04512 100644 --- a/simulators/ethereum/rpc/go.sum +++ b/simulators/ethereum/rpc/go.sum @@ -9,8 +9,8 @@ github.com/Joker/hpp v1.0.0/go.mod h1:8x5n+M1Hp5hC0g8okX3sR3vFQwynaX/UgSOM9MeBKz github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= github.com/Shopify/goreferrer v0.0.0-20181106222321-ec9c9a553398/go.mod h1:a1uqRtAwp2Xwc6WNPJEufxJ7fx3npB4UV/JOLmbu5I0= -github.com/VictoriaMetrics/fastcache v1.12.0 h1:vnVi/y9yKDcD9akmc4NqAoqgQhJrOwUF+j9LTgn4QDE= -github.com/VictoriaMetrics/fastcache v1.12.0/go.mod h1:tjiYeEfYXCqacuvYw/7UoDIeJaNxq6132xHICNP77w8= +github.com/VictoriaMetrics/fastcache v1.12.1 h1:i0mICQuojGDL3KblA7wUNlY5lOK6a4bwt3uRKnkZU40= +github.com/VictoriaMetrics/fastcache v1.12.1/go.mod h1:tX04vaqcNoQeGLD+ra5pU5sWkuxnzWhEzLwhP9w653o= github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY= github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= github.com/allegro/bigcache v1.2.1 h1:hg1sY1raCwic3Vnsvje6TT7/pnZba83LeFck5NrFKSc= @@ -18,15 +18,14 @@ github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5 github.com/aymerick/raymond v2.0.3-0.20180322193309-b565731e1464+incompatible/go.mod h1:osfaiScAUVup+UC9Nfq76eWqDhXlp+4UYaA8uhTBO6g= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bits-and-blooms/bitset v1.5.0 h1:NpE8frKRLGHIcEzkR+gZhiioW1+WbYV6fKwD6ZIpQT8= -github.com/bits-and-blooms/bitset v1.5.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= +github.com/bits-and-blooms/bitset v1.7.0 h1:YjAGVd3XmtK9ktAbX8Zg2g2PwLIMjGREZJHlV4j7NEo= +github.com/bits-and-blooms/bitset v1.7.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U= github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/cp v1.1.1 h1:nCb6ZLdB7NRaqsm91JtQTAme2SKJzXVsdPIPkyJr1MU= github.com/cespare/cp v1.1.1/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s= -github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= @@ -35,29 +34,31 @@ github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMn github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cockroachdb/datadriven v1.0.2/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= -github.com/cockroachdb/datadriven v1.0.3-0.20230801171734-e384cf455877 h1:1MLK4YpFtIEo3ZtMA5C795Wtv5VuUnrXX7mQG+aHg6o= +github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f h1:otljaYPt5hWxV3MUfO5dFPFiOXg9CyG5/kCfayTqsJ4= github.com/cockroachdb/errors v1.9.1 h1:yFVvsI0VxmRShfawbt/laCIDy/mtTqqnvoNgiy5bEV8= github.com/cockroachdb/errors v1.9.1/go.mod h1:2sxOtL2WIc096WSZqZ5h8fa17rdDq9HZOZLBCor4mBk= github.com/cockroachdb/logtags v0.0.0-20211118104740-dabe8e521a4f/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= -github.com/cockroachdb/pebble v0.0.0-20230906160148-46873a6a7a06 h1:T+Np/xtzIjYM/P5NAw0e2Rf1FGvzDau1h54MKvx8G7w= -github.com/cockroachdb/pebble v0.0.0-20230906160148-46873a6a7a06/go.mod h1:bynZ3gvVyhlvjLI7PT6dmZ7g76xzJ7HpxfjgkzCGz6s= +github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593 h1:aPEJyR4rPBvDmeyi+l/FS/VtA00IWvjeFvjen1m1l1A= +github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593/go.mod h1:6hk1eMY/u5t+Cf18q5lFMUA1Rc+Sm5I6Ra1QuPyxXCo= github.com/cockroachdb/redact v1.1.3 h1:AKZds10rFSIj7qADf0g46UixK8NNLwWTNdCIGS5wfSQ= github.com/cockroachdb/redact v1.1.3/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= +github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo= +github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ= github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0/go.mod h1:4Zcjuz89kmFXt9morQgcfYZAYZ5n8WHjt81YYWIwtTM= github.com/consensys/bavard v0.1.13 h1:oLhMLOFGTLdlda/kma4VOJazblc7IM5y5QPd2A/YjhQ= github.com/consensys/bavard v0.1.13/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI= -github.com/consensys/gnark-crypto v0.10.0 h1:zRh22SR7o4K35SoNqouS9J/TKHTyU2QWaj5ldehyXtA= -github.com/consensys/gnark-crypto v0.10.0/go.mod h1:Iq/P3HHl0ElSjsg2E1gsMwhAyxnxoKK5nVyZKd+/KhU= +github.com/consensys/gnark-crypto v0.12.1 h1:lHH39WuuFgVHONRl3J0LRBtuYdQTumFSDtJF7HpyG8M= +github.com/consensys/gnark-crypto v0.12.1/go.mod h1:v2Gy7L/4ZRosZ7Ivs+9SfUDr0f5UlG+EM5t7MPHiLuY= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/cpuguy83/go-md2man v1.0.10 h1:BSKMNlYxDvnunlTymqtgONjNnaRV1sTpcovwwjF22jk= github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= -github.com/crate-crypto/go-kzg-4844 v0.3.0 h1:UBlWE0CgyFqqzTI+IFyCzA7A3Zw4iip6uzRv5NIXG0A= -github.com/crate-crypto/go-kzg-4844 v0.3.0/go.mod h1:SBP7ikXEgDnUPONgm33HtuDZEDtWa3L4QtN1ocJSEQ4= +github.com/crate-crypto/go-kzg-4844 v0.7.0 h1:C0vgZRk4q4EZ/JgPfzuSoxdCq3C3mOZMBShovmncxvA= +github.com/crate-crypto/go-kzg-4844 v0.7.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= @@ -76,12 +77,12 @@ github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.m github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/etcd-io/bbolt v1.3.3/go.mod h1:ZF2nL25h33cCyBtcyWeZ2/I3HQOfTP+0PIEvHjkjCrw= -github.com/ethereum/c-kzg-4844 v0.3.1 h1:sR65+68+WdnMKxseNWxSJuAv2tsUrihTpVBTfM/U5Zg= -github.com/ethereum/c-kzg-4844 v0.3.1/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= -github.com/ethereum/go-ethereum v1.13.1 h1:UF2FaUKPIy5jeZk3X06ait3y2Q4wI+vJ1l7+UARp+60= -github.com/ethereum/go-ethereum v1.13.1/go.mod h1:xHQKzwkHSl0gnSjZK1mWa06XEdm9685AHqhRknOzqGQ= -github.com/ethereum/hive v0.0.0-20230919110229-d58aec4a3eb5 h1:22Z+XoI2hGtYR0AMzYr9IusfYM/chALq/6oJnejJQpk= -github.com/ethereum/hive v0.0.0-20230919110229-d58aec4a3eb5/go.mod h1:iKqu3dndnqdwSckyBGoZzeHhZz6X6XZws2TfZMdLdes= +github.com/ethereum/c-kzg-4844 v0.4.0 h1:3MS1s4JtA868KpJxroZoepdV0ZKBp3u/O5HcZ7R3nlY= +github.com/ethereum/c-kzg-4844 v0.4.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= +github.com/ethereum/go-ethereum v1.13.5-0.20231031113925-bc42e88415d3 h1:i4TE0DmzMYcr2IiCdlTGGk+7Q/EzXvBKbbG4uRxMjJ0= +github.com/ethereum/go-ethereum v1.13.5-0.20231031113925-bc42e88415d3/go.mod h1:yMTu38GSuyxaYzQMViqNmQ1s3cE84abZexQmTgenWk0= +github.com/ethereum/hive v0.0.0-20231031133732-dcd7ddb75960 h1:7H9z2o/KImWQ/1PACU3ewsSFNxT/lzwYRnwit2YFqMg= +github.com/ethereum/hive v0.0.0-20231031133732-dcd7ddb75960/go.mod h1:sV7LrFBlEii71kI9udVbUVj7SXIifZ2VzFjQ8S6rZns= github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072/go.mod h1:duJ4Jxv5lDcvg4QuQr0oowTf7dz4/CR8NtyCooz9HL8= github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= github.com/fjl/memsize v0.0.1 h1:+zhkb+dhUgx0/e+M8sF0QqiouvMQUiKR+QYvdxIOKcQ= @@ -119,9 +120,9 @@ github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7a github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/gogo/status v1.1.0/go.mod h1:BFv9nrluPLmrS0EmGVvLaPNmRosr9KapBYd5/hpY1WM= +github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY= github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= -github.com/golang-jwt/jwt/v4 v4.4.3 h1:Hxl6lhQFj4AnOX6MLrsCb/+7tCj7DxP7VA+2rDIq5AU= -github.com/golang-jwt/jwt/v4 v4.4.3/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= +github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -136,8 +137,9 @@ github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvq github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= +github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXiurYmW7fx4GZkL8feAMVq7nEjURHk= github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= @@ -220,7 +222,7 @@ github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hd github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= -github.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peKQ= +github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.14 h1:+xnbZSEeDbOIg5/mE6JF0w6n9duR1l3/WmbinWVwUuU= github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= @@ -317,7 +319,7 @@ github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81P github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= -github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/supranational/blst v0.3.11 h1:LyU6FolezeWAhvQk0k6O/d49jqgO52MSDDfYgbeoEm4= github.com/supranational/blst v0.3.11/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a h1:1ur3QoCqvE5fl+nylMaIr9PVV1w343YRDtsy+Rwu7XI= @@ -360,11 +362,11 @@ golang.org/x/crypto v0.0.0-20191227163750-53104e6ec876/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.12.0 h1:tFM/ta59kqch6LlvYnPa0yx5a83cL2nHflFhYKvv9Yk= -golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= +golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= +golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20230810033253-352e893a4cad h1:g0bG7Z4uG+OgH2QDODnjp6ggkk1bJDsINcuWmJN1iJU= -golang.org/x/exp v0.0.0-20230810033253-352e893a4cad/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc= +golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g= +golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= @@ -373,8 +375,8 @@ golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzB golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.11.0 h1:bUO06HqtnRcc/7l71XBe4WcqTZ+3AH1J59zWDDwLKgU= -golang.org/x/mod v0.11.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc= +golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -396,7 +398,7 @@ golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT golang.org/x/net v0.0.0-20211008194852-3b03d305991f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M= +golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -437,13 +439,14 @@ golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220405052023-b1e9470b6e64/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= +golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -452,8 +455,8 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc= -golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= +golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -470,8 +473,8 @@ golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roY golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.9.1 h1:8WMNJAz3zrtPmnYC7ISf5dEn3MT0gY7jBJfw27yrrLo= -golang.org/x/tools v0.9.1/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc= +golang.org/x/tools v0.13.0 h1:Iey4qkscZuv0VvIt8E0neZjtPVQFSc870HQ448QgEmQ= +golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= From 1966b9dd3ba0a8aa26b2c55a1621f4b374ec8ac7 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Tue, 31 Oct 2023 14:45:22 +0100 Subject: [PATCH 105/387] simulators/ethereum/rpc-compat: upgrade hivesim --- simulators/ethereum/rpc-compat/go.mod | 14 +++++------ simulators/ethereum/rpc-compat/go.sum | 35 ++++++++++++++------------- 2 files changed, 25 insertions(+), 24 deletions(-) diff --git a/simulators/ethereum/rpc-compat/go.mod b/simulators/ethereum/rpc-compat/go.mod index 5ff677b770..46eb27822c 100644 --- a/simulators/ethereum/rpc-compat/go.mod +++ b/simulators/ethereum/rpc-compat/go.mod @@ -3,7 +3,7 @@ module github.com/ethereum/hive/simulators/ethereum/rpc-compat go 1.18 require ( - github.com/ethereum/hive v0.0.0-20230919110229-d58aec4a3eb5 + github.com/ethereum/hive v0.0.0-20231031133732-dcd7ddb75960 github.com/yudai/gojsondiff v1.0.0 ) @@ -12,7 +12,7 @@ require ( github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect github.com/deckarep/golang-set/v2 v2.1.0 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 // indirect - github.com/ethereum/go-ethereum v1.13.1 // indirect + github.com/ethereum/go-ethereum v1.13.5-0.20231031113925-bc42e88415d3 // indirect github.com/go-ole/go-ole v1.2.6 // indirect github.com/go-stack/stack v1.8.1 // indirect github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect @@ -26,9 +26,9 @@ require ( github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82 // indirect github.com/yudai/pp v2.0.1+incompatible // indirect github.com/yusufpapurcu/wmi v1.2.2 // indirect - golang.org/x/crypto v0.12.0 // indirect - golang.org/x/exp v0.0.0-20230810033253-352e893a4cad // indirect - golang.org/x/mod v0.11.0 // indirect - golang.org/x/sys v0.11.0 // indirect - golang.org/x/tools v0.9.1 // indirect + golang.org/x/crypto v0.14.0 // indirect + golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect + golang.org/x/mod v0.12.0 // indirect + golang.org/x/sys v0.13.0 // indirect + golang.org/x/tools v0.13.0 // indirect ) diff --git a/simulators/ethereum/rpc-compat/go.sum b/simulators/ethereum/rpc-compat/go.sum index db893f6416..31c1b552ee 100644 --- a/simulators/ethereum/rpc-compat/go.sum +++ b/simulators/ethereum/rpc-compat/go.sum @@ -14,10 +14,10 @@ github.com/deckarep/golang-set/v2 v2.1.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpO github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 h1:HbphB4TFFXpv7MNrT52FGrrgVXF1owhMVTHFZIlnvd4= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0/go.mod h1:DZGJHZMqrU4JJqFAWUS2UO1+lbSKsdiOoYi9Zzey7Fc= -github.com/ethereum/go-ethereum v1.13.1 h1:UF2FaUKPIy5jeZk3X06ait3y2Q4wI+vJ1l7+UARp+60= -github.com/ethereum/go-ethereum v1.13.1/go.mod h1:xHQKzwkHSl0gnSjZK1mWa06XEdm9685AHqhRknOzqGQ= -github.com/ethereum/hive v0.0.0-20230919110229-d58aec4a3eb5 h1:22Z+XoI2hGtYR0AMzYr9IusfYM/chALq/6oJnejJQpk= -github.com/ethereum/hive v0.0.0-20230919110229-d58aec4a3eb5/go.mod h1:iKqu3dndnqdwSckyBGoZzeHhZz6X6XZws2TfZMdLdes= +github.com/ethereum/go-ethereum v1.13.5-0.20231031113925-bc42e88415d3 h1:i4TE0DmzMYcr2IiCdlTGGk+7Q/EzXvBKbbG4uRxMjJ0= +github.com/ethereum/go-ethereum v1.13.5-0.20231031113925-bc42e88415d3/go.mod h1:yMTu38GSuyxaYzQMViqNmQ1s3cE84abZexQmTgenWk0= +github.com/ethereum/hive v0.0.0-20231031133732-dcd7ddb75960 h1:7H9z2o/KImWQ/1PACU3ewsSFNxT/lzwYRnwit2YFqMg= +github.com/ethereum/hive v0.0.0-20231031133732-dcd7ddb75960/go.mod h1:sV7LrFBlEii71kI9udVbUVj7SXIifZ2VzFjQ8S6rZns= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= @@ -55,7 +55,7 @@ github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORN github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= -github.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peKQ= +github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= @@ -80,7 +80,7 @@ github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+ github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= -github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a h1:1ur3QoCqvE5fl+nylMaIr9PVV1w343YRDtsy+Rwu7XI= github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a/go.mod h1:RRCYJbIwD5jmqPI9XoAFR0OcDxqUctll6zUj/+B4S48= github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= @@ -99,13 +99,13 @@ github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQ golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.12.0 h1:tFM/ta59kqch6LlvYnPa0yx5a83cL2nHflFhYKvv9Yk= -golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= -golang.org/x/exp v0.0.0-20230810033253-352e893a4cad h1:g0bG7Z4uG+OgH2QDODnjp6ggkk1bJDsINcuWmJN1iJU= -golang.org/x/exp v0.0.0-20230810033253-352e893a4cad/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc= +golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= +golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= +golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g= +golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.11.0 h1:bUO06HqtnRcc/7l71XBe4WcqTZ+3AH1J59zWDDwLKgU= -golang.org/x/mod v0.11.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc= +golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -114,7 +114,7 @@ golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwY golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M= +golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -137,20 +137,21 @@ golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= +golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc= +golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.9.1 h1:8WMNJAz3zrtPmnYC7ISf5dEn3MT0gY7jBJfw27yrrLo= -golang.org/x/tools v0.9.1/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc= +golang.org/x/tools v0.13.0 h1:Iey4qkscZuv0VvIt8E0neZjtPVQFSc870HQ448QgEmQ= +golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= From f64eb646ee671be768b973bd0554a3a490a77627 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Tue, 31 Oct 2023 14:45:44 +0100 Subject: [PATCH 106/387] simulators/ethereum/pyspec: upgrade hivesim --- simulators/ethereum/pyspec/go.mod | 8 ++++---- simulators/ethereum/pyspec/go.sum | 12 ++++++------ 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/simulators/ethereum/pyspec/go.mod b/simulators/ethereum/pyspec/go.mod index e19db81628..aaaa1e7a1e 100644 --- a/simulators/ethereum/pyspec/go.mod +++ b/simulators/ethereum/pyspec/go.mod @@ -3,8 +3,8 @@ module github.com/ethereum/hive/simulators/ethereum/pyspec go 1.20 require ( - github.com/ethereum/go-ethereum v1.13.1 - github.com/ethereum/hive v0.0.0-20230919110229-d58aec4a3eb5 + github.com/ethereum/go-ethereum v1.13.5-0.20231031113925-bc42e88415d3 + github.com/ethereum/hive v0.0.0-20231031133732-dcd7ddb75960 github.com/ethereum/hive/simulators/ethereum/engine v0.0.0-20230919054339-322945164a97 ) @@ -23,10 +23,10 @@ require ( github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect github.com/consensys/bavard v0.1.13 // indirect github.com/consensys/gnark-crypto v0.12.1 // indirect - github.com/crate-crypto/go-kzg-4844 v0.6.1-0.20231019121413-3621cc59f0c7 // indirect + github.com/crate-crypto/go-kzg-4844 v0.7.0 // indirect github.com/deckarep/golang-set/v2 v2.1.0 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 // indirect - github.com/ethereum/c-kzg-4844 v0.3.2-0.20231019020040-748283cced54 // indirect + github.com/ethereum/c-kzg-4844 v0.4.0 // indirect github.com/getsentry/sentry-go v0.18.0 // indirect github.com/go-ole/go-ole v1.2.6 // indirect github.com/go-stack/stack v1.8.1 // indirect diff --git a/simulators/ethereum/pyspec/go.sum b/simulators/ethereum/pyspec/go.sum index 3e45062083..0978f4689d 100644 --- a/simulators/ethereum/pyspec/go.sum +++ b/simulators/ethereum/pyspec/go.sum @@ -55,8 +55,8 @@ github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3Ee github.com/cpuguy83/go-md2man v1.0.10 h1:BSKMNlYxDvnunlTymqtgONjNnaRV1sTpcovwwjF22jk= github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= -github.com/crate-crypto/go-kzg-4844 v0.6.1-0.20231019121413-3621cc59f0c7 h1:VpZxBC99nEW8Rkz1EBBf7JmaM20H+ZkSmqdxpYEoXuo= -github.com/crate-crypto/go-kzg-4844 v0.6.1-0.20231019121413-3621cc59f0c7/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= +github.com/crate-crypto/go-kzg-4844 v0.7.0 h1:C0vgZRk4q4EZ/JgPfzuSoxdCq3C3mOZMBShovmncxvA= +github.com/crate-crypto/go-kzg-4844 v0.7.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= @@ -75,10 +75,10 @@ github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.m github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/etcd-io/bbolt v1.3.3/go.mod h1:ZF2nL25h33cCyBtcyWeZ2/I3HQOfTP+0PIEvHjkjCrw= -github.com/ethereum/c-kzg-4844 v0.3.2-0.20231019020040-748283cced54 h1:jDyQvQjauRyb7TJAF9W7J3NOjn3ukXahd3l+rd1Fak8= -github.com/ethereum/c-kzg-4844 v0.3.2-0.20231019020040-748283cced54/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= -github.com/ethereum/hive v0.0.0-20230919110229-d58aec4a3eb5 h1:22Z+XoI2hGtYR0AMzYr9IusfYM/chALq/6oJnejJQpk= -github.com/ethereum/hive v0.0.0-20230919110229-d58aec4a3eb5/go.mod h1:iKqu3dndnqdwSckyBGoZzeHhZz6X6XZws2TfZMdLdes= +github.com/ethereum/c-kzg-4844 v0.4.0 h1:3MS1s4JtA868KpJxroZoepdV0ZKBp3u/O5HcZ7R3nlY= +github.com/ethereum/c-kzg-4844 v0.4.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= +github.com/ethereum/hive v0.0.0-20231031133732-dcd7ddb75960 h1:7H9z2o/KImWQ/1PACU3ewsSFNxT/lzwYRnwit2YFqMg= +github.com/ethereum/hive v0.0.0-20231031133732-dcd7ddb75960/go.mod h1:sV7LrFBlEii71kI9udVbUVj7SXIifZ2VzFjQ8S6rZns= github.com/ethereum/hive/simulators/ethereum/engine v0.0.0-20230919054339-322945164a97 h1:A1bYQxUbl4ZM6q5E8RcDYGm/UIxO5u03ypN8mxX9oKY= github.com/ethereum/hive/simulators/ethereum/engine v0.0.0-20230919054339-322945164a97/go.mod h1:zCFJyLJJjLDT5/R9l8Rqrwt9i9irgg94d2n4kpehTno= github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072/go.mod h1:duJ4Jxv5lDcvg4QuQr0oowTf7dz4/CR8NtyCooz9HL8= From b872dc85c5cd0149d9f052ba555c93d58396b79e Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Tue, 31 Oct 2023 14:45:59 +0100 Subject: [PATCH 107/387] simulators/ethereum/graphql: upgrade hivesim --- simulators/ethereum/graphql/go.mod | 31 ++++++------ simulators/ethereum/graphql/go.sum | 77 +++++++++++++++++------------- 2 files changed, 60 insertions(+), 48 deletions(-) diff --git a/simulators/ethereum/graphql/go.mod b/simulators/ethereum/graphql/go.mod index 5ef249a405..0143390520 100644 --- a/simulators/ethereum/graphql/go.mod +++ b/simulators/ethereum/graphql/go.mod @@ -3,34 +3,35 @@ module github.com/ethereum/hive/simulators/ethereum/graphql go 1.18 require ( - github.com/ethereum/go-ethereum v1.13.1 - github.com/ethereum/hive v0.0.0-20230919110229-d58aec4a3eb5 + github.com/ethereum/go-ethereum v1.13.5-0.20231031113925-bc42e88415d3 + github.com/ethereum/hive v0.0.0-20231031133732-dcd7ddb75960 ) require ( github.com/DataDog/zstd v1.5.2 // indirect github.com/Microsoft/go-winio v0.6.1 // indirect - github.com/VictoriaMetrics/fastcache v1.12.0 // indirect + github.com/VictoriaMetrics/fastcache v1.12.1 // indirect github.com/beorn7/perks v1.0.1 // indirect - github.com/bits-and-blooms/bitset v1.5.0 // indirect + github.com/bits-and-blooms/bitset v1.7.0 // indirect github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/cockroachdb/errors v1.9.1 // indirect github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect - github.com/cockroachdb/pebble v0.0.0-20230906160148-46873a6a7a06 // indirect + github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593 // indirect github.com/cockroachdb/redact v1.1.3 // indirect + github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect github.com/consensys/bavard v0.1.13 // indirect - github.com/consensys/gnark-crypto v0.10.0 // indirect - github.com/crate-crypto/go-kzg-4844 v0.3.0 // indirect + github.com/consensys/gnark-crypto v0.12.1 // indirect + github.com/crate-crypto/go-kzg-4844 v0.7.0 // indirect github.com/deckarep/golang-set/v2 v2.1.0 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 // indirect - github.com/ethereum/c-kzg-4844 v0.3.1 // indirect + github.com/ethereum/c-kzg-4844 v0.4.0 // indirect github.com/getsentry/sentry-go v0.18.0 // indirect github.com/go-ole/go-ole v1.2.6 // indirect github.com/go-stack/stack v1.8.1 // indirect github.com/gofrs/flock v0.8.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang/protobuf v1.5.2 // indirect + github.com/golang/protobuf v1.5.3 // indirect github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect github.com/gorilla/websocket v1.5.0 // indirect github.com/holiman/bloomfilter/v2 v2.0.3 // indirect @@ -55,13 +56,13 @@ require ( github.com/tklauser/go-sysconf v0.3.12 // indirect github.com/tklauser/numcpus v0.6.1 // indirect github.com/yusufpapurcu/wmi v1.2.2 // indirect - golang.org/x/crypto v0.12.0 // indirect - golang.org/x/exp v0.0.0-20230810033253-352e893a4cad // indirect - golang.org/x/mod v0.11.0 // indirect + golang.org/x/crypto v0.14.0 // indirect + golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect + golang.org/x/mod v0.12.0 // indirect golang.org/x/sync v0.3.0 // indirect - golang.org/x/sys v0.11.0 // indirect - golang.org/x/text v0.12.0 // indirect - golang.org/x/tools v0.9.1 // indirect + golang.org/x/sys v0.13.0 // indirect + golang.org/x/text v0.13.0 // indirect + golang.org/x/tools v0.13.0 // indirect google.golang.org/protobuf v1.28.1 // indirect rsc.io/tmplfunc v0.0.3 // indirect ) diff --git a/simulators/ethereum/graphql/go.sum b/simulators/ethereum/graphql/go.sum index 9cdde93436..3e0d7fbc2c 100644 --- a/simulators/ethereum/graphql/go.sum +++ b/simulators/ethereum/graphql/go.sum @@ -9,21 +9,21 @@ github.com/Joker/hpp v1.0.0/go.mod h1:8x5n+M1Hp5hC0g8okX3sR3vFQwynaX/UgSOM9MeBKz github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= github.com/Shopify/goreferrer v0.0.0-20181106222321-ec9c9a553398/go.mod h1:a1uqRtAwp2Xwc6WNPJEufxJ7fx3npB4UV/JOLmbu5I0= -github.com/VictoriaMetrics/fastcache v1.12.0 h1:vnVi/y9yKDcD9akmc4NqAoqgQhJrOwUF+j9LTgn4QDE= -github.com/VictoriaMetrics/fastcache v1.12.0/go.mod h1:tjiYeEfYXCqacuvYw/7UoDIeJaNxq6132xHICNP77w8= +github.com/VictoriaMetrics/fastcache v1.12.1 h1:i0mICQuojGDL3KblA7wUNlY5lOK6a4bwt3uRKnkZU40= +github.com/VictoriaMetrics/fastcache v1.12.1/go.mod h1:tX04vaqcNoQeGLD+ra5pU5sWkuxnzWhEzLwhP9w653o= github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY= github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= +github.com/allegro/bigcache v1.2.1 h1:hg1sY1raCwic3Vnsvje6TT7/pnZba83LeFck5NrFKSc= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/aymerick/raymond v2.0.3-0.20180322193309-b565731e1464+incompatible/go.mod h1:osfaiScAUVup+UC9Nfq76eWqDhXlp+4UYaA8uhTBO6g= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bits-and-blooms/bitset v1.5.0 h1:NpE8frKRLGHIcEzkR+gZhiioW1+WbYV6fKwD6ZIpQT8= -github.com/bits-and-blooms/bitset v1.5.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= +github.com/bits-and-blooms/bitset v1.7.0 h1:YjAGVd3XmtK9ktAbX8Zg2g2PwLIMjGREZJHlV4j7NEo= +github.com/bits-and-blooms/bitset v1.7.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U= github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= @@ -32,26 +32,29 @@ github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMn github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cockroachdb/datadriven v1.0.2/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= +github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f h1:otljaYPt5hWxV3MUfO5dFPFiOXg9CyG5/kCfayTqsJ4= github.com/cockroachdb/errors v1.9.1 h1:yFVvsI0VxmRShfawbt/laCIDy/mtTqqnvoNgiy5bEV8= github.com/cockroachdb/errors v1.9.1/go.mod h1:2sxOtL2WIc096WSZqZ5h8fa17rdDq9HZOZLBCor4mBk= github.com/cockroachdb/logtags v0.0.0-20211118104740-dabe8e521a4f/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= -github.com/cockroachdb/pebble v0.0.0-20230906160148-46873a6a7a06 h1:T+Np/xtzIjYM/P5NAw0e2Rf1FGvzDau1h54MKvx8G7w= -github.com/cockroachdb/pebble v0.0.0-20230906160148-46873a6a7a06/go.mod h1:bynZ3gvVyhlvjLI7PT6dmZ7g76xzJ7HpxfjgkzCGz6s= +github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593 h1:aPEJyR4rPBvDmeyi+l/FS/VtA00IWvjeFvjen1m1l1A= +github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593/go.mod h1:6hk1eMY/u5t+Cf18q5lFMUA1Rc+Sm5I6Ra1QuPyxXCo= github.com/cockroachdb/redact v1.1.3 h1:AKZds10rFSIj7qADf0g46UixK8NNLwWTNdCIGS5wfSQ= github.com/cockroachdb/redact v1.1.3/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= +github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo= +github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ= github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0/go.mod h1:4Zcjuz89kmFXt9morQgcfYZAYZ5n8WHjt81YYWIwtTM= github.com/consensys/bavard v0.1.13 h1:oLhMLOFGTLdlda/kma4VOJazblc7IM5y5QPd2A/YjhQ= github.com/consensys/bavard v0.1.13/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI= -github.com/consensys/gnark-crypto v0.10.0 h1:zRh22SR7o4K35SoNqouS9J/TKHTyU2QWaj5ldehyXtA= -github.com/consensys/gnark-crypto v0.10.0/go.mod h1:Iq/P3HHl0ElSjsg2E1gsMwhAyxnxoKK5nVyZKd+/KhU= +github.com/consensys/gnark-crypto v0.12.1 h1:lHH39WuuFgVHONRl3J0LRBtuYdQTumFSDtJF7HpyG8M= +github.com/consensys/gnark-crypto v0.12.1/go.mod h1:v2Gy7L/4ZRosZ7Ivs+9SfUDr0f5UlG+EM5t7MPHiLuY= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= -github.com/crate-crypto/go-kzg-4844 v0.3.0 h1:UBlWE0CgyFqqzTI+IFyCzA7A3Zw4iip6uzRv5NIXG0A= -github.com/crate-crypto/go-kzg-4844 v0.3.0/go.mod h1:SBP7ikXEgDnUPONgm33HtuDZEDtWa3L4QtN1ocJSEQ4= +github.com/crate-crypto/go-kzg-4844 v0.7.0 h1:C0vgZRk4q4EZ/JgPfzuSoxdCq3C3mOZMBShovmncxvA= +github.com/crate-crypto/go-kzg-4844 v0.7.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= @@ -70,12 +73,12 @@ github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.m github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/etcd-io/bbolt v1.3.3/go.mod h1:ZF2nL25h33cCyBtcyWeZ2/I3HQOfTP+0PIEvHjkjCrw= -github.com/ethereum/c-kzg-4844 v0.3.1 h1:sR65+68+WdnMKxseNWxSJuAv2tsUrihTpVBTfM/U5Zg= -github.com/ethereum/c-kzg-4844 v0.3.1/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= -github.com/ethereum/go-ethereum v1.13.1 h1:UF2FaUKPIy5jeZk3X06ait3y2Q4wI+vJ1l7+UARp+60= -github.com/ethereum/go-ethereum v1.13.1/go.mod h1:xHQKzwkHSl0gnSjZK1mWa06XEdm9685AHqhRknOzqGQ= -github.com/ethereum/hive v0.0.0-20230919110229-d58aec4a3eb5 h1:22Z+XoI2hGtYR0AMzYr9IusfYM/chALq/6oJnejJQpk= -github.com/ethereum/hive v0.0.0-20230919110229-d58aec4a3eb5/go.mod h1:iKqu3dndnqdwSckyBGoZzeHhZz6X6XZws2TfZMdLdes= +github.com/ethereum/c-kzg-4844 v0.4.0 h1:3MS1s4JtA868KpJxroZoepdV0ZKBp3u/O5HcZ7R3nlY= +github.com/ethereum/c-kzg-4844 v0.4.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= +github.com/ethereum/go-ethereum v1.13.5-0.20231031113925-bc42e88415d3 h1:i4TE0DmzMYcr2IiCdlTGGk+7Q/EzXvBKbbG4uRxMjJ0= +github.com/ethereum/go-ethereum v1.13.5-0.20231031113925-bc42e88415d3/go.mod h1:yMTu38GSuyxaYzQMViqNmQ1s3cE84abZexQmTgenWk0= +github.com/ethereum/hive v0.0.0-20231031133732-dcd7ddb75960 h1:7H9z2o/KImWQ/1PACU3ewsSFNxT/lzwYRnwit2YFqMg= +github.com/ethereum/hive v0.0.0-20231031133732-dcd7ddb75960/go.mod h1:sV7LrFBlEii71kI9udVbUVj7SXIifZ2VzFjQ8S6rZns= github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072/go.mod h1:duJ4Jxv5lDcvg4QuQr0oowTf7dz4/CR8NtyCooz9HL8= github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= @@ -90,6 +93,7 @@ github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3/go.mod h1:VJ0WA2NB github.com/gin-gonic/gin v1.4.0/go.mod h1:OW2EZn3DO8Ln9oIKOvM++LBO+5UPHJJDH72/q/3rZdM= github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= +github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab/go.mod h1:/P9AEU963A2AYjv4d1V5eVL1CQbEJq6aCNHDDjibzu8= github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= @@ -122,8 +126,9 @@ github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvq github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= +github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXiurYmW7fx4GZkL8feAMVq7nEjURHk= github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= @@ -134,6 +139,7 @@ github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMyw github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= @@ -184,8 +190,10 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/labstack/echo/v4 v4.5.0/go.mod h1:czIriw4a0C1dFun+ObrXp7ok03xON0N1awStJ6ArI7Y= github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= +github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= @@ -196,7 +204,7 @@ github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hd github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= -github.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peKQ= +github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.14 h1:+xnbZSEeDbOIg5/mE6JF0w6n9duR1l3/WmbinWVwUuU= github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= @@ -237,6 +245,7 @@ github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAl github.com/onsi/gomega v1.19.0 h1:4ieX6qQjPP/BfC3mpsAtIGGlxTWPeA3Inl/7DtXw1tw= github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= +github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= @@ -282,7 +291,7 @@ github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81P github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= -github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/supranational/blst v0.3.11 h1:LyU6FolezeWAhvQk0k6O/d49jqgO52MSDDfYgbeoEm4= github.com/supranational/blst v0.3.11/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a h1:1ur3QoCqvE5fl+nylMaIr9PVV1w343YRDtsy+Rwu7XI= @@ -322,11 +331,11 @@ golang.org/x/crypto v0.0.0-20191227163750-53104e6ec876/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.12.0 h1:tFM/ta59kqch6LlvYnPa0yx5a83cL2nHflFhYKvv9Yk= -golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= +golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= +golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20230810033253-352e893a4cad h1:g0bG7Z4uG+OgH2QDODnjp6ggkk1bJDsINcuWmJN1iJU= -golang.org/x/exp v0.0.0-20230810033253-352e893a4cad/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc= +golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g= +golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= @@ -335,8 +344,8 @@ golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzB golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.11.0 h1:bUO06HqtnRcc/7l71XBe4WcqTZ+3AH1J59zWDDwLKgU= -golang.org/x/mod v0.11.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc= +golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -358,7 +367,7 @@ golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT golang.org/x/net v0.0.0-20211008194852-3b03d305991f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M= +golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -399,12 +408,13 @@ golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220405052023-b1e9470b6e64/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= +golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -413,8 +423,8 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc= -golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= +golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181221001348-537d06c36207/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -430,8 +440,8 @@ golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roY golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.9.1 h1:8WMNJAz3zrtPmnYC7ISf5dEn3MT0gY7jBJfw27yrrLo= -golang.org/x/tools v0.9.1/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc= +golang.org/x/tools v0.13.0 h1:Iey4qkscZuv0VvIt8E0neZjtPVQFSc870HQ448QgEmQ= +golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -466,6 +476,7 @@ google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqw gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= From a762de8fd32516e11dbe57908db48077ec463d71 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Tue, 31 Oct 2023 14:46:10 +0100 Subject: [PATCH 108/387] simulators/ethereum/engine: upgrade hivesim --- simulators/ethereum/engine/go.mod | 8 ++++---- simulators/ethereum/engine/go.sum | 14 +++++++------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/simulators/ethereum/engine/go.mod b/simulators/ethereum/engine/go.mod index b9f1097809..1c391d7b94 100644 --- a/simulators/ethereum/engine/go.mod +++ b/simulators/ethereum/engine/go.mod @@ -3,10 +3,10 @@ module github.com/ethereum/hive/simulators/ethereum/engine go 1.20 require ( - github.com/crate-crypto/go-kzg-4844 v0.6.1-0.20231019121413-3621cc59f0c7 + github.com/crate-crypto/go-kzg-4844 v0.7.0 github.com/davecgh/go-spew v1.1.1 - github.com/ethereum/go-ethereum v1.13.1 - github.com/ethereum/hive v0.0.0-20230919110229-d58aec4a3eb5 + github.com/ethereum/go-ethereum v1.13.5-0.20231031113925-bc42e88415d3 + github.com/ethereum/hive v0.0.0-20231031133732-dcd7ddb75960 github.com/golang-jwt/jwt/v4 v4.5.0 github.com/holiman/uint256 v1.2.3 github.com/pkg/errors v0.9.1 @@ -34,7 +34,7 @@ require ( github.com/deckarep/golang-set/v2 v2.1.0 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 // indirect github.com/deepmap/oapi-codegen v1.12.4 // indirect - github.com/ethereum/c-kzg-4844 v0.3.2-0.20231019020040-748283cced54 // indirect + github.com/ethereum/c-kzg-4844 v0.4.0 // indirect github.com/fjl/memsize v0.0.1 // indirect github.com/fsnotify/fsnotify v1.6.0 // indirect github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08 // indirect diff --git a/simulators/ethereum/engine/go.sum b/simulators/ethereum/engine/go.sum index 45bb28851b..173d09f875 100644 --- a/simulators/ethereum/engine/go.sum +++ b/simulators/ethereum/engine/go.sum @@ -62,8 +62,8 @@ github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3Ee github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/crate-crypto/go-kzg-4844 v0.6.1-0.20231019121413-3621cc59f0c7 h1:VpZxBC99nEW8Rkz1EBBf7JmaM20H+ZkSmqdxpYEoXuo= -github.com/crate-crypto/go-kzg-4844 v0.6.1-0.20231019121413-3621cc59f0c7/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= +github.com/crate-crypto/go-kzg-4844 v0.7.0 h1:C0vgZRk4q4EZ/JgPfzuSoxdCq3C3mOZMBShovmncxvA= +github.com/crate-crypto/go-kzg-4844 v0.7.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= @@ -77,7 +77,7 @@ github.com/deepmap/oapi-codegen v1.12.4 h1:pPmn6qI9MuOtCz82WY2Xaw46EQjgvxednXXrP github.com/deepmap/oapi-codegen v1.12.4/go.mod h1:3lgHGMu6myQ2vqbbTXH2H1o4eXFTGnFiDaOaKKl5yas= github.com/dgraph-io/badger v1.6.0/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6psNgSztDR4= github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= -github.com/docker/docker v24.0.5+incompatible h1:WmgcE4fxyI6EEXxBRxsHnZXrO1pQ3smi0k/jho4HLeY= +github.com/docker/docker v24.0.7+incompatible h1:Wo6l37AuwP3JaMnZa226lzVXGA3F9Ig1seQen0cKYlM= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385/go.mod h1:0vRUJqYpeSZifjYj7uP3BG/gKcuzL9xWVV/Y+cK33KM= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= @@ -85,10 +85,10 @@ github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.m github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/etcd-io/bbolt v1.3.3/go.mod h1:ZF2nL25h33cCyBtcyWeZ2/I3HQOfTP+0PIEvHjkjCrw= -github.com/ethereum/c-kzg-4844 v0.3.2-0.20231019020040-748283cced54 h1:jDyQvQjauRyb7TJAF9W7J3NOjn3ukXahd3l+rd1Fak8= -github.com/ethereum/c-kzg-4844 v0.3.2-0.20231019020040-748283cced54/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= -github.com/ethereum/hive v0.0.0-20230919110229-d58aec4a3eb5 h1:22Z+XoI2hGtYR0AMzYr9IusfYM/chALq/6oJnejJQpk= -github.com/ethereum/hive v0.0.0-20230919110229-d58aec4a3eb5/go.mod h1:iKqu3dndnqdwSckyBGoZzeHhZz6X6XZws2TfZMdLdes= +github.com/ethereum/c-kzg-4844 v0.4.0 h1:3MS1s4JtA868KpJxroZoepdV0ZKBp3u/O5HcZ7R3nlY= +github.com/ethereum/c-kzg-4844 v0.4.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= +github.com/ethereum/hive v0.0.0-20231031133732-dcd7ddb75960 h1:7H9z2o/KImWQ/1PACU3ewsSFNxT/lzwYRnwit2YFqMg= +github.com/ethereum/hive v0.0.0-20231031133732-dcd7ddb75960/go.mod h1:sV7LrFBlEii71kI9udVbUVj7SXIifZ2VzFjQ8S6rZns= github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072/go.mod h1:duJ4Jxv5lDcvg4QuQr0oowTf7dz4/CR8NtyCooz9HL8= github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= github.com/fjl/memsize v0.0.1 h1:+zhkb+dhUgx0/e+M8sF0QqiouvMQUiKR+QYvdxIOKcQ= From 4e14aa4811d7211110fd5129b04a35f5d8d0c869 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Tue, 31 Oct 2023 14:46:29 +0100 Subject: [PATCH 109/387] simulators/ethereum/consensus: upgrade hivesim --- simulators/ethereum/consensus/go.mod | 31 ++++++------ simulators/ethereum/consensus/go.sum | 71 +++++++++++++++------------- 2 files changed, 53 insertions(+), 49 deletions(-) diff --git a/simulators/ethereum/consensus/go.mod b/simulators/ethereum/consensus/go.mod index f3322fb1b3..c92fbf7f16 100644 --- a/simulators/ethereum/consensus/go.mod +++ b/simulators/ethereum/consensus/go.mod @@ -3,34 +3,35 @@ module github.com/ethereum/hive/simulators/ethereum/consensus go 1.18 require ( - github.com/ethereum/go-ethereum v1.13.1 - github.com/ethereum/hive v0.0.0-20230919110229-d58aec4a3eb5 + github.com/ethereum/go-ethereum v1.13.5-0.20231031113925-bc42e88415d3 + github.com/ethereum/hive v0.0.0-20231031133732-dcd7ddb75960 ) require ( github.com/DataDog/zstd v1.5.2 // indirect github.com/Microsoft/go-winio v0.6.1 // indirect - github.com/VictoriaMetrics/fastcache v1.12.0 // indirect + github.com/VictoriaMetrics/fastcache v1.12.1 // indirect github.com/beorn7/perks v1.0.1 // indirect - github.com/bits-and-blooms/bitset v1.5.0 // indirect + github.com/bits-and-blooms/bitset v1.7.0 // indirect github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/cockroachdb/errors v1.9.1 // indirect github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect - github.com/cockroachdb/pebble v0.0.0-20230906160148-46873a6a7a06 // indirect + github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593 // indirect github.com/cockroachdb/redact v1.1.3 // indirect + github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect github.com/consensys/bavard v0.1.13 // indirect - github.com/consensys/gnark-crypto v0.10.0 // indirect - github.com/crate-crypto/go-kzg-4844 v0.3.0 // indirect + github.com/consensys/gnark-crypto v0.12.1 // indirect + github.com/crate-crypto/go-kzg-4844 v0.7.0 // indirect github.com/deckarep/golang-set/v2 v2.1.0 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 // indirect - github.com/ethereum/c-kzg-4844 v0.3.1 // indirect + github.com/ethereum/c-kzg-4844 v0.4.0 // indirect github.com/getsentry/sentry-go v0.18.0 // indirect github.com/go-ole/go-ole v1.2.6 // indirect github.com/go-stack/stack v1.8.1 // indirect github.com/gofrs/flock v0.8.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang/protobuf v1.5.2 // indirect + github.com/golang/protobuf v1.5.3 // indirect github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect github.com/gorilla/websocket v1.5.0 // indirect github.com/holiman/bloomfilter/v2 v2.0.3 // indirect @@ -55,13 +56,13 @@ require ( github.com/tklauser/go-sysconf v0.3.12 // indirect github.com/tklauser/numcpus v0.6.1 // indirect github.com/yusufpapurcu/wmi v1.2.2 // indirect - golang.org/x/crypto v0.12.0 // indirect - golang.org/x/exp v0.0.0-20230810033253-352e893a4cad // indirect - golang.org/x/mod v0.11.0 // indirect + golang.org/x/crypto v0.14.0 // indirect + golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect + golang.org/x/mod v0.12.0 // indirect golang.org/x/sync v0.3.0 // indirect - golang.org/x/sys v0.11.0 // indirect - golang.org/x/text v0.12.0 // indirect - golang.org/x/tools v0.9.1 // indirect + golang.org/x/sys v0.13.0 // indirect + golang.org/x/text v0.13.0 // indirect + golang.org/x/tools v0.13.0 // indirect google.golang.org/protobuf v1.28.1 // indirect rsc.io/tmplfunc v0.0.3 // indirect ) diff --git a/simulators/ethereum/consensus/go.sum b/simulators/ethereum/consensus/go.sum index 0c4c27122c..3e0d7fbc2c 100644 --- a/simulators/ethereum/consensus/go.sum +++ b/simulators/ethereum/consensus/go.sum @@ -9,8 +9,8 @@ github.com/Joker/hpp v1.0.0/go.mod h1:8x5n+M1Hp5hC0g8okX3sR3vFQwynaX/UgSOM9MeBKz github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= github.com/Shopify/goreferrer v0.0.0-20181106222321-ec9c9a553398/go.mod h1:a1uqRtAwp2Xwc6WNPJEufxJ7fx3npB4UV/JOLmbu5I0= -github.com/VictoriaMetrics/fastcache v1.12.0 h1:vnVi/y9yKDcD9akmc4NqAoqgQhJrOwUF+j9LTgn4QDE= -github.com/VictoriaMetrics/fastcache v1.12.0/go.mod h1:tjiYeEfYXCqacuvYw/7UoDIeJaNxq6132xHICNP77w8= +github.com/VictoriaMetrics/fastcache v1.12.1 h1:i0mICQuojGDL3KblA7wUNlY5lOK6a4bwt3uRKnkZU40= +github.com/VictoriaMetrics/fastcache v1.12.1/go.mod h1:tX04vaqcNoQeGLD+ra5pU5sWkuxnzWhEzLwhP9w653o= github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY= github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= github.com/allegro/bigcache v1.2.1 h1:hg1sY1raCwic3Vnsvje6TT7/pnZba83LeFck5NrFKSc= @@ -18,13 +18,12 @@ github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5 github.com/aymerick/raymond v2.0.3-0.20180322193309-b565731e1464+incompatible/go.mod h1:osfaiScAUVup+UC9Nfq76eWqDhXlp+4UYaA8uhTBO6g= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bits-and-blooms/bitset v1.5.0 h1:NpE8frKRLGHIcEzkR+gZhiioW1+WbYV6fKwD6ZIpQT8= -github.com/bits-and-blooms/bitset v1.5.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= +github.com/bits-and-blooms/bitset v1.7.0 h1:YjAGVd3XmtK9ktAbX8Zg2g2PwLIMjGREZJHlV4j7NEo= +github.com/bits-and-blooms/bitset v1.7.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U= github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= @@ -33,27 +32,29 @@ github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMn github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cockroachdb/datadriven v1.0.2/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= -github.com/cockroachdb/datadriven v1.0.3-0.20230801171734-e384cf455877 h1:1MLK4YpFtIEo3ZtMA5C795Wtv5VuUnrXX7mQG+aHg6o= +github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f h1:otljaYPt5hWxV3MUfO5dFPFiOXg9CyG5/kCfayTqsJ4= github.com/cockroachdb/errors v1.9.1 h1:yFVvsI0VxmRShfawbt/laCIDy/mtTqqnvoNgiy5bEV8= github.com/cockroachdb/errors v1.9.1/go.mod h1:2sxOtL2WIc096WSZqZ5h8fa17rdDq9HZOZLBCor4mBk= github.com/cockroachdb/logtags v0.0.0-20211118104740-dabe8e521a4f/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= -github.com/cockroachdb/pebble v0.0.0-20230906160148-46873a6a7a06 h1:T+Np/xtzIjYM/P5NAw0e2Rf1FGvzDau1h54MKvx8G7w= -github.com/cockroachdb/pebble v0.0.0-20230906160148-46873a6a7a06/go.mod h1:bynZ3gvVyhlvjLI7PT6dmZ7g76xzJ7HpxfjgkzCGz6s= +github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593 h1:aPEJyR4rPBvDmeyi+l/FS/VtA00IWvjeFvjen1m1l1A= +github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593/go.mod h1:6hk1eMY/u5t+Cf18q5lFMUA1Rc+Sm5I6Ra1QuPyxXCo= github.com/cockroachdb/redact v1.1.3 h1:AKZds10rFSIj7qADf0g46UixK8NNLwWTNdCIGS5wfSQ= github.com/cockroachdb/redact v1.1.3/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= +github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo= +github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ= github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0/go.mod h1:4Zcjuz89kmFXt9morQgcfYZAYZ5n8WHjt81YYWIwtTM= github.com/consensys/bavard v0.1.13 h1:oLhMLOFGTLdlda/kma4VOJazblc7IM5y5QPd2A/YjhQ= github.com/consensys/bavard v0.1.13/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI= -github.com/consensys/gnark-crypto v0.10.0 h1:zRh22SR7o4K35SoNqouS9J/TKHTyU2QWaj5ldehyXtA= -github.com/consensys/gnark-crypto v0.10.0/go.mod h1:Iq/P3HHl0ElSjsg2E1gsMwhAyxnxoKK5nVyZKd+/KhU= +github.com/consensys/gnark-crypto v0.12.1 h1:lHH39WuuFgVHONRl3J0LRBtuYdQTumFSDtJF7HpyG8M= +github.com/consensys/gnark-crypto v0.12.1/go.mod h1:v2Gy7L/4ZRosZ7Ivs+9SfUDr0f5UlG+EM5t7MPHiLuY= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= -github.com/crate-crypto/go-kzg-4844 v0.3.0 h1:UBlWE0CgyFqqzTI+IFyCzA7A3Zw4iip6uzRv5NIXG0A= -github.com/crate-crypto/go-kzg-4844 v0.3.0/go.mod h1:SBP7ikXEgDnUPONgm33HtuDZEDtWa3L4QtN1ocJSEQ4= +github.com/crate-crypto/go-kzg-4844 v0.7.0 h1:C0vgZRk4q4EZ/JgPfzuSoxdCq3C3mOZMBShovmncxvA= +github.com/crate-crypto/go-kzg-4844 v0.7.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= @@ -72,12 +73,12 @@ github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.m github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/etcd-io/bbolt v1.3.3/go.mod h1:ZF2nL25h33cCyBtcyWeZ2/I3HQOfTP+0PIEvHjkjCrw= -github.com/ethereum/c-kzg-4844 v0.3.1 h1:sR65+68+WdnMKxseNWxSJuAv2tsUrihTpVBTfM/U5Zg= -github.com/ethereum/c-kzg-4844 v0.3.1/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= -github.com/ethereum/go-ethereum v1.13.1 h1:UF2FaUKPIy5jeZk3X06ait3y2Q4wI+vJ1l7+UARp+60= -github.com/ethereum/go-ethereum v1.13.1/go.mod h1:xHQKzwkHSl0gnSjZK1mWa06XEdm9685AHqhRknOzqGQ= -github.com/ethereum/hive v0.0.0-20230919110229-d58aec4a3eb5 h1:22Z+XoI2hGtYR0AMzYr9IusfYM/chALq/6oJnejJQpk= -github.com/ethereum/hive v0.0.0-20230919110229-d58aec4a3eb5/go.mod h1:iKqu3dndnqdwSckyBGoZzeHhZz6X6XZws2TfZMdLdes= +github.com/ethereum/c-kzg-4844 v0.4.0 h1:3MS1s4JtA868KpJxroZoepdV0ZKBp3u/O5HcZ7R3nlY= +github.com/ethereum/c-kzg-4844 v0.4.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= +github.com/ethereum/go-ethereum v1.13.5-0.20231031113925-bc42e88415d3 h1:i4TE0DmzMYcr2IiCdlTGGk+7Q/EzXvBKbbG4uRxMjJ0= +github.com/ethereum/go-ethereum v1.13.5-0.20231031113925-bc42e88415d3/go.mod h1:yMTu38GSuyxaYzQMViqNmQ1s3cE84abZexQmTgenWk0= +github.com/ethereum/hive v0.0.0-20231031133732-dcd7ddb75960 h1:7H9z2o/KImWQ/1PACU3ewsSFNxT/lzwYRnwit2YFqMg= +github.com/ethereum/hive v0.0.0-20231031133732-dcd7ddb75960/go.mod h1:sV7LrFBlEii71kI9udVbUVj7SXIifZ2VzFjQ8S6rZns= github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072/go.mod h1:duJ4Jxv5lDcvg4QuQr0oowTf7dz4/CR8NtyCooz9HL8= github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= @@ -125,8 +126,9 @@ github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvq github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= +github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXiurYmW7fx4GZkL8feAMVq7nEjURHk= github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= @@ -202,7 +204,7 @@ github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hd github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= -github.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peKQ= +github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.14 h1:+xnbZSEeDbOIg5/mE6JF0w6n9duR1l3/WmbinWVwUuU= github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= @@ -289,7 +291,7 @@ github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81P github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= -github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/supranational/blst v0.3.11 h1:LyU6FolezeWAhvQk0k6O/d49jqgO52MSDDfYgbeoEm4= github.com/supranational/blst v0.3.11/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a h1:1ur3QoCqvE5fl+nylMaIr9PVV1w343YRDtsy+Rwu7XI= @@ -329,11 +331,11 @@ golang.org/x/crypto v0.0.0-20191227163750-53104e6ec876/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.12.0 h1:tFM/ta59kqch6LlvYnPa0yx5a83cL2nHflFhYKvv9Yk= -golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= +golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= +golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20230810033253-352e893a4cad h1:g0bG7Z4uG+OgH2QDODnjp6ggkk1bJDsINcuWmJN1iJU= -golang.org/x/exp v0.0.0-20230810033253-352e893a4cad/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc= +golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g= +golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= @@ -342,8 +344,8 @@ golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzB golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.11.0 h1:bUO06HqtnRcc/7l71XBe4WcqTZ+3AH1J59zWDDwLKgU= -golang.org/x/mod v0.11.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc= +golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -365,7 +367,7 @@ golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT golang.org/x/net v0.0.0-20211008194852-3b03d305991f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M= +golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -406,12 +408,13 @@ golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220405052023-b1e9470b6e64/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= +golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -420,8 +423,8 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc= -golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= +golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181221001348-537d06c36207/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -437,8 +440,8 @@ golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roY golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.9.1 h1:8WMNJAz3zrtPmnYC7ISf5dEn3MT0gY7jBJfw27yrrLo= -golang.org/x/tools v0.9.1/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc= +golang.org/x/tools v0.13.0 h1:Iey4qkscZuv0VvIt8E0neZjtPVQFSc870HQ448QgEmQ= +golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= From 5c3420f6eab08f01c72947a5ae33efce45e0d2f9 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Tue, 31 Oct 2023 14:47:34 +0100 Subject: [PATCH 110/387] simulators/ethereum: remove go.work Having a Go workspace file ties all the simulators together in terms of their dependency versions. This is a problem when one of them wants to replace a dependency version. When building the simulator, hive will not use the workspace file, so it makes little sense to have it. --- simulators/ethereum/go.work | 11 - simulators/ethereum/go.work.sum | 1434 ------------------------------- 2 files changed, 1445 deletions(-) delete mode 100644 simulators/ethereum/go.work delete mode 100644 simulators/ethereum/go.work.sum diff --git a/simulators/ethereum/go.work b/simulators/ethereum/go.work deleted file mode 100644 index 537e04a1c4..0000000000 --- a/simulators/ethereum/go.work +++ /dev/null @@ -1,11 +0,0 @@ -go 1.20 - -use ( - ./consensus - ./engine - ./graphql - ./pyspec - ./rpc - ./rpc-compat - ./sync -) diff --git a/simulators/ethereum/go.work.sum b/simulators/ethereum/go.work.sum deleted file mode 100644 index 43e6afdd62..0000000000 --- a/simulators/ethereum/go.work.sum +++ /dev/null @@ -1,1434 +0,0 @@ -bazil.org/fuse v0.0.0-20160811212531-371fbbdaa898 h1:SC+c6A1qTFstO9qmB86mPV2IpYme/2ZoEQ0hrP+wo+Q= -bazil.org/fuse v0.0.0-20160811212531-371fbbdaa898/go.mod h1:Xbm+BRKSBEpa4q4hTSxohYNQpsxXPbPry4JJWOB3LB8= -cloud.google.com/go v0.0.0-20170206221025-ce650573d812/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -cloud.google.com/go v0.43.0/go.mod h1:BOSR3VbTLkk6FDC/TcffxP4NF/FFBGA5ku+jvKOP7pg= -cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= -cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= -cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= -cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= -cloud.google.com/go v0.51.0/go.mod h1:hWtGJ6gnXH+KgDv+V0zFGDvpi07n3z8ZNj3T1RW0Gcw= -cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= -cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= -cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= -cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= -cloud.google.com/go v0.57.0 h1:EpMNVUorLiZIELdMZbCYX/ByTFCdoYopYAGxaGVz9ms= -cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= -cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= -cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= -cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= -cloud.google.com/go/bigquery v1.3.0 h1:sAbMqjY1PEQKZBWfbu6Y6bsupJ9c4QdHnzg/VvYTLcE= -cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= -cloud.google.com/go/bigquery v1.4.0 h1:xE3CPsOgttP4ACBePh79zTKALtXwn/Edhcr16R5hMWU= -cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= -cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= -cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= -cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/bigtable v1.2.0 h1:F4cCmA4nuV84V5zYQ3MKY+M1Cw1avHDuf3S/LcZPA9c= -cloud.google.com/go/compute/metadata v0.2.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= -cloud.google.com/go/datastore v1.0.0 h1:Kt+gOPPp2LEPWp8CSfxhsM8ik9CcyE/gYu+0r+RnZvM= -cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= -cloud.google.com/go/datastore v1.1.0 h1:/May9ojXjRkPBNVrq+oWLqmWCkr4OU5uRY29bu0mRyQ= -cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= -cloud.google.com/go/pubsub v1.1.0 h1:9/vpR43S4aJaROxqQHQ3nH9lfyKKV0dC3vOmnw8ebQQ= -cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= -cloud.google.com/go/pubsub v1.2.0 h1:Lpy6hKgdcl7a3WGSfJIFmxmcdjSpP6OmBEfcOv1Y680= -cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= -cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= -cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= -cloud.google.com/go/storage v1.5.0 h1:RPUcBvDeYgQFMfQu1eBMq6piD1SXmLH+vK3qjewZPus= -cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= -cloud.google.com/go/storage v1.6.0 h1:UDpwYIwla4jHGzZJaEJYx1tOejbgSoNqsAfHAUYe2r8= -cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= -cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= -cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -collectd.org v0.3.0 h1:iNBHGw1VvPJxH2B6RiFWFZ+vsjo1lCdRszBeOuwGi00= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9 h1:VpgP7xuJadIUuKccphEpTJnWhS2jkQyMt6Y7pJCD7fY= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -gioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8= -github.com/AdaLogics/go-fuzz-headers v0.0.0-20210715213245-6c3934b029d8 h1:V8krnnfGj4pV65YLUm3C0/8bl7V5Nry2Pwvy3ru/wLc= -github.com/AdaLogics/go-fuzz-headers v0.0.0-20210715213245-6c3934b029d8/go.mod h1:CzsSbkDixRphAF5hS6wbMKq0eI6ccJRb7/A0M6JBnwg= -github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9 h1:HD8gA2tkByhMAwYaFAX9w2l7vxvBQ5NMoxDrkhqhtn4= -github.com/Azure/azure-sdk-for-go v16.2.1+incompatible h1:KnPIugL51v3N3WwvaSmZbxukD1WuWXOiE9fRdu32f2I= -github.com/Azure/azure-sdk-for-go v16.2.1+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/azure-sdk-for-go/sdk/azcore v0.21.1 h1:qoVeMsc9/fh/yhxVaA0obYjVH/oI/ihrOoMwsLS9KSA= -github.com/Azure/azure-sdk-for-go/sdk/azcore v0.21.1/go.mod h1:fBF9PQNqB8scdgpZ3ufzaLntG0AG7C1WjPMsiFOmfHM= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.0/go.mod h1:bjGvMhVMb+EEm3VRNQawDMUyMMjo+S5ewNjflkep/0Q= -github.com/Azure/azure-sdk-for-go/sdk/internal v0.8.3 h1:E+m3SkZCN0Bf5q7YdTs5lSm2CYY3CK4spn5OmUIiQtk= -github.com/Azure/azure-sdk-for-go/sdk/internal v0.8.3/go.mod h1:KLF4gFr6DcKFZwSuH8w8yEK6DpFl3LP5rhdvAb7Yz5I= -github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0/go.mod h1:okt5dMMTOFjX/aovMlrjvvXoPMBVSPzk9185BT0+eZM= -github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v0.3.0 h1:Px2UA+2RvSSvv+RvJNuUB6n7rs5Wsel4dXLe90Um2n4= -github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v0.3.0/go.mod h1:tPaiy8S5bQ+S5sOiDlINkp7+Ef339+Nz5L5XO+cnOHo= -github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.2.0/go.mod h1:+6KLcKIVgxoBDMqMO/Nvy7bZ9a0nbU3I1DtFQK3YvB4= -github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= -github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8= -github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= -github.com/Azure/go-autorest v10.8.1+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest v14.2.0+incompatible h1:V5VMDjClD3GiElqLWO7mz2MxNAK/vTfRHdAubSIPRgs= -github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest/autorest v0.11.1 h1:eVvIXUKiTgv++6YnWb42DUA1YL7qDugnKP0HljexdnQ= -github.com/Azure/go-autorest/autorest v0.11.1/go.mod h1:JFgpikqFJ/MleTTxwepExTKnFUKKszPS8UavbQYUMuw= -github.com/Azure/go-autorest/autorest/adal v0.9.0/go.mod h1:/c022QCutn2P7uY+/oQWWNcK9YU+MH96NgK+jErpbcg= -github.com/Azure/go-autorest/autorest/adal v0.9.5 h1:Y3bBUV4rTuxenJJs41HU3qmqsb+auo+a3Lz+PlJPpL0= -github.com/Azure/go-autorest/autorest/adal v0.9.5/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A= -github.com/Azure/go-autorest/autorest/date v0.3.0 h1:7gUk1U5M/CQbp9WoqinNzJar+8KY+LPI6wiWrP/myHw= -github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= -github.com/Azure/go-autorest/autorest/mocks v0.4.0/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= -github.com/Azure/go-autorest/autorest/mocks v0.4.1 h1:K0laFcLE6VLTOwNgSxaGbUcLPuGXlNkbVvq4cW4nIHk= -github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= -github.com/Azure/go-autorest/logger v0.2.0 h1:e4RVHVZKC5p6UANLJHkM4OfR1UKZPj8Wt8Pcx+3oqrE= -github.com/Azure/go-autorest/logger v0.2.0/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= -github.com/Azure/go-autorest/tracing v0.6.0 h1:TYi4+3m5t6K48TGI9AUdb+IzbnSxvnvUMfuitfgcfuo= -github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= -github.com/BurntSushi/toml v1.2.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= -github.com/BurntSushi/toml v1.2.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= -github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802 h1:1BDTz0u9nC3//pOCMdNH+CiXJVYJh5UQNCOBG7jbELc= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/CloudyKit/fastprinter v0.0.0-20170127035650-74b38d55f37a/go.mod h1:EFZQ978U7x8IRnstaskI3IysnWY5Ao3QgZUKOXlsAdw= -github.com/CloudyKit/fastprinter v0.0.0-20200109182630-33d98a066a53 h1:sR+/8Yb4slttB4vD+b9btVEnWgL3Q00OBTzVT8B9C0c= -github.com/CloudyKit/jet v2.1.3-0.20180809161101-62edd43e4f88+incompatible/go.mod h1:HPYO+50pSWkPoj9Q/eq0aRGByCL6ScRlUmiEX5Zgm+w= -github.com/CloudyKit/jet/v3 v3.0.0 h1:1PwO5w5VCtlUUl+KTOBsTGZlhjWkcybsGaAau52tOy8= -github.com/CloudyKit/jet/v6 v6.1.0 h1:hvO96X345XagdH1fAoBjpBYG4a1ghhL/QzalkduPuXk= -github.com/CloudyKit/jet/v6 v6.1.0/go.mod h1:d3ypHeIRNo2+XyqnGA8s+aphtcVpjP5hPwP/Lzo7Ro4= -github.com/DATA-DOG/go-sqlmock v1.3.3 h1:CWUqKXe0s8A2z6qCgkP4Kru7wC11YoAnoupUKFDnH08= -github.com/DataDog/zstd v1.4.5/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo= -github.com/GoogleCloudPlatform/cloudsql-proxy v0.0.0-20190129172621-c8b1d7a94ddf/go.mod h1:aJ4qN3TfrelA6NZ6AXsXRfmEVaYin3EDbSPJrKS8OXo= -github.com/HdrHistogram/hdrhistogram-go v1.1.2 h1:5IcZpTvzydCQeHzK4Ef/D5rrSqwxob0t8PQPMybUNFM= -github.com/HdrHistogram/hdrhistogram-go v1.1.2/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo= -github.com/Joker/hpp v1.0.0 h1:65+iuJYdRXv/XyN62C1uEmmOx3432rNG/rKlX6V7Kkc= -github.com/Joker/jade v1.0.1-0.20190614124447-d475f43051e7/go.mod h1:6E6s8o2AE4KhCrqr6GRJjdC/gNfTdxkIXvuGZZda2VM= -github.com/MariusVanDerWijden/go-ethereum v1.8.22-0.20230621084717-62fbdf5a95dc h1:QdOMSeSuN8LUchUJOMo8H+FqKah5mhku0/4GFerNiVY= -github.com/MariusVanDerWijden/go-ethereum v1.8.22-0.20230621084717-62fbdf5a95dc/go.mod h1:gBJi25HIQ0kgf76prZGagCKFeKKjBu5Q2XX1KMaIxug= -github.com/Microsoft/go-winio v0.4.11/go.mod h1:VhR8bwka0BXejwEJY73c50VrPtXAaKcyvVC4A4RozmA= -github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= -github.com/Microsoft/go-winio v0.4.15-0.20190919025122-fc70bd9a86b5/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw= -github.com/Microsoft/go-winio v0.4.16-0.20201130162521-d1ffc52c7331/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0= -github.com/Microsoft/go-winio v0.4.16/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0= -github.com/Microsoft/go-winio v0.4.17-0.20210211115548-6eac466e5fa3/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= -github.com/Microsoft/go-winio v0.4.17-0.20210324224401-5516f17a5958/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= -github.com/Microsoft/go-winio v0.4.17/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= -github.com/Microsoft/go-winio v0.5.2 h1:a9IhgEQBCUEk6QCdml9CiJGhAws+YwffDHEMp1VMrpA= -github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY= -github.com/Microsoft/hcsshim v0.8.6/go.mod h1:Op3hHsoHPAvb6lceZHDtd9OkTew38wNoXnJs8iY7rUg= -github.com/Microsoft/hcsshim v0.8.7-0.20190325164909-8abdbb8205e4/go.mod h1:Op3hHsoHPAvb6lceZHDtd9OkTew38wNoXnJs8iY7rUg= -github.com/Microsoft/hcsshim v0.8.7/go.mod h1:OHd7sQqRFrYd3RmSgbgji+ctCwkbq2wbEYNSzOYtcBQ= -github.com/Microsoft/hcsshim v0.8.9/go.mod h1:5692vkUqntj1idxauYlpoINNKeqCiG6Sg38RRsjT5y8= -github.com/Microsoft/hcsshim v0.8.14/go.mod h1:NtVKoYxQuTLx6gEq0L96c9Ju4JbRJ4nY2ow3VK6a9Lg= -github.com/Microsoft/hcsshim v0.8.15/go.mod h1:x38A4YbHbdxJtc0sF6oIz+RG0npwSCAvn69iY6URG00= -github.com/Microsoft/hcsshim v0.8.16/go.mod h1:o5/SZqmR7x9JNKsW3pu+nqHm0MF8vbA+VxGOoXdC600= -github.com/Microsoft/hcsshim v0.8.21/go.mod h1:+w2gRZ5ReXQhFOrvSQeNfhrYB/dg3oDwTOcER2fw4I4= -github.com/Microsoft/hcsshim v0.9.6 h1:VwnDOgLeoi2du6dAznfmspNqTiwczvjv4K7NxuY9jsY= -github.com/Microsoft/hcsshim v0.9.6/go.mod h1:7pLA8lDk46WKDWlVsENo92gC0XFa8rbKfyFRBqxEbCc= -github.com/Microsoft/hcsshim/test v0.0.0-20201218223536-d3e5debf77da/go.mod h1:5hlzMzRKMLyo42nCZ9oml8AdTlq/0cvIaBv6tK1RehU= -github.com/Microsoft/hcsshim/test v0.0.0-20210227013316-43a75bb4edd3 h1:4FA+QBaydEHlwxg0lMN3rhwoDaQy6LKhVWR4qvq4BuA= -github.com/Microsoft/hcsshim/test v0.0.0-20210227013316-43a75bb4edd3/go.mod h1:mw7qgWloBUl75W/gVH3cQszUg1+gUITj7D6NY7ywVnY= -github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46 h1:lsxEuwrXEAokXB9qhlbKWPpo3KMLZQ5WB5WLQRW1uq0= -github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI= -github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/RaveNoX/go-jsoncommentstrip v1.0.0 h1:t527LHHE3HmiHrq74QMpNPZpGCIJzTx+apLkMKt4HC0= -github.com/Shopify/goreferrer v0.0.0-20220729165902-8cddb4f5de06 h1:KkH3I3sJuOLP3TjA/dfr4NAY8bghDwnXiU7cTKxQqo0= -github.com/Shopify/goreferrer v0.0.0-20220729165902-8cddb4f5de06/go.mod h1:7erjKLwalezA0k99cWs5L11HWOAPNjdUZ6RxH1BXbbM= -github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d h1:UrqY+r/OJnIp5u0s1SbQ8dVfLCZJsnvazdBP5hS4iRs= -github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d/go.mod h1:HI8ITrYtUY+O+ZhtlqUnD8+KwNPOyugEhfP9fdUIaEQ= -github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6 h1:fLjPD/aNc3UIOA6tDi6QXUemppXK3P9BI7mr2hd6gx8= -github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= -github.com/StackExchange/wmi v0.0.0-20210224194228-fe8f1750fd46/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= -github.com/StackExchange/wmi v1.2.1/go.mod h1:rcmrprowKIVzvc+NUiLncP2uuArMWLCbu9SBzvHz7e8= -github.com/VictoriaMetrics/fastcache v1.6.0/go.mod h1:0qHz5QP0GMX4pfmMA/zt5RgfNuXJrTP0zS7DqpHGGTw= -github.com/aclements/go-gg v0.0.0-20170118225347-6dbb4e4fefb0/go.mod h1:55qNq4vcpkIuHowELi5C8e+1yUHtoLoOUR9QU5j7Tes= -github.com/aclements/go-moremath v0.0.0-20210112150236-f10218a38794/go.mod h1:7e+I0LQFUI9AXWxOfsQROs9xPhoJtbsyWcjJqDd4KPY= -github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= -github.com/ajstarks/svgo v0.0.0-20210923152817-c3b6e2f0c527/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= -github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= -github.com/alexflint/go-filemutex v0.0.0-20171022225611-72bdc8eae2ae/go.mod h1:CgnQgUtFrFz9mxFNtED3jI5tLDjKlOM+oUF/sTk6ps0= -github.com/allegro/bigcache v1.2.1/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= -github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= -github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= -github.com/aws/aws-sdk-go v1.15.11/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= -github.com/aws/aws-sdk-go-v2 v1.2.0/go.mod h1:zEQs02YRBw1DjK0PoJv3ygDYOFTre1ejlJWl8FwAuQo= -github.com/aws/aws-sdk-go-v2 v1.21.2/go.mod h1:ErQhvNuEMhJjweavOYhxVkn2RUx7kQXVATHrjKtxIpM= -github.com/aws/aws-sdk-go-v2/config v1.1.1/go.mod h1:0XsVy9lBI/BCXm+2Tuvt39YmdHwS5unDQmxZOYe8F5Y= -github.com/aws/aws-sdk-go-v2/config v1.18.45/go.mod h1:ZwDUgFnQgsazQTnWfeLWk5GjeqTQTL8lMkoE1UXzxdE= -github.com/aws/aws-sdk-go-v2/credentials v1.1.1/go.mod h1:mM2iIjwl7LULWtS6JCACyInboHirisUUdkBPoTHMOUo= -github.com/aws/aws-sdk-go-v2/credentials v1.13.43/go.mod h1:zWJBz1Yf1ZtX5NGax9ZdNjhhI4rgjfgsyk6vTY1yfVg= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.0.2/go.mod h1:3hGg3PpiEjHnrkrlasTfxFqUsZ2GCk/fMUn4CbKgSkM= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.13/go.mod h1:f/Ib/qYjhV2/qdsf79H3QP/eRE4AkVyEf6sk7XfZ1tg= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.43/go.mod h1:auo+PiyLl0n1l8A0e8RIeR8tOzYPfZZH/JNlrJ8igTQ= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.37/go.mod h1:Qe+2KtKml+FEsQF/DHmDV+xjtche/hwoF75EG4UlHW8= -github.com/aws/aws-sdk-go-v2/internal/ini v1.3.45/go.mod h1:lD5M20o09/LCuQ2mE62Mb/iSdSlCNuj6H5ci7tW7OsE= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.0.2/go.mod h1:45MfaXZ0cNbeuT0KQ1XJylq8A6+OpVV2E5kvY/Kq+u8= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.37/go.mod h1:vBmDnwWXWxNPFRMmG2m/3MKOe+xEcMDo1tanpaWCcck= -github.com/aws/aws-sdk-go-v2/service/route53 v1.1.1/go.mod h1:rLiOUrPLW/Er5kRcQ7NkwbjlijluLsrIbu/iyl35RO4= -github.com/aws/aws-sdk-go-v2/service/route53 v1.30.2/go.mod h1:TQZBt/WaQy+zTHoW++rnl8JBrmZ0VO6EUbVua1+foCA= -github.com/aws/aws-sdk-go-v2/service/sso v1.1.1/go.mod h1:SuZJxklHxLAXgLTc1iFXbEWkXs7QRTQpCLGaKIprQW0= -github.com/aws/aws-sdk-go-v2/service/sso v1.15.2/go.mod h1:gsL4keucRCgW+xA85ALBpRFfdSLH4kHOVSnLMSuBECo= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.17.3/go.mod h1:a7bHA82fyUXOm+ZSWKU6PIoBxrjSprdLoM8xPYvzYVg= -github.com/aws/aws-sdk-go-v2/service/sts v1.1.1/go.mod h1:Wi0EBZwiz/K44YliU0EKxqTCJGUfYTWXrrBwkq736bM= -github.com/aws/aws-sdk-go-v2/service/sts v1.23.2/go.mod h1:Eows6e1uQEsc4ZaHANmsPRzAKcVDrcmjjWiih2+HUUQ= -github.com/aws/smithy-go v1.1.0/go.mod h1:EzMw8dbp/YJL4A5/sbhGddag+NPT7q084agLbB9LgIw= -github.com/aws/smithy-go v1.15.0/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= -github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4= -github.com/beorn7/perks v0.0.0-20160804104726-4c0e84591b9a/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= -github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/bitly/go-simplejson v0.5.0/go.mod h1:cXHtHw4XUPsvGaxgjIAn8PhEWG9NfngEKAMDJEczWVA= -github.com/bits-and-blooms/bitset v1.2.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= -github.com/blang/semver v3.1.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= -github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= -github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= -github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= -github.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= -github.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= -github.com/bshuster-repo/logrus-logstash-hook v0.4.1/go.mod h1:zsTqEiSzDgAa/8GZR7E1qaXrhYNDKBYy5/dWPTIflbk= -github.com/btcsuite/btcd/btcec/v2 v2.2.0/go.mod h1:U7MHm051Al6XmscBQ0BoNydpOTsFAn707034b5nY8zU= -github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= -github.com/buger/jsonparser v0.0.0-20180808090653-f4dd9f5a6b44/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s= -github.com/bugsnag/bugsnag-go v0.0.0-20141110184014-b1d153021fcd/go.mod h1:2oa8nejYd4cQ/b0hMIopN0lCRxU0bueqREvZLWFrtK8= -github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b/go.mod h1:obH5gd0BsqsP2LwDJ9aOkm/6J86V6lyAXCoQWGw3K50= -github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0/go.mod h1:D/8v3kj0zr8ZAKg1AQ6crr+5VwKN5eIywRkfhyM/+dE= -github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= -github.com/cenkalti/backoff/v4 v4.1.2/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= -github.com/cespare/cp v0.1.0/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s= -github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/checkpoint-restore/go-criu/v4 v4.1.0/go.mod h1:xUQBLp4RLc5zJtWY++yjOoMoB5lihDt7fai+75m+rGw= -github.com/checkpoint-restore/go-criu/v5 v5.0.0/go.mod h1:cfwC0EG7HMUenopBsUf9d89JlCLQIfgVcNsNN0t6T2M= -github.com/checkpoint-restore/go-criu/v5 v5.3.0/go.mod h1:E/eQpaFtUKGOOSEBZgmKAcn+zUUwWxqcaKZlF54wK8E= -github.com/cheekybits/is v0.0.0-20150225183255-68e9c0620927/go.mod h1:h/aW8ynjgkuj+NQRlZcDbAbM1ORAbXjXX77sX7T289U= -github.com/chzyer/logex v1.2.0/go.mod h1:9+9sk7u7pGNWYMkh0hdiL++6OeibzJccyQU4p4MedaY= -github.com/chzyer/readline v1.5.0/go.mod h1:x22KAscuvRqlLoK9CsoYsmxoXZMMFVyOl86cAH8qUic= -github.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/cilium/ebpf v0.0.0-20200110133405-4032b1d8aae3/go.mod h1:MA5e5Lr8slmEg9bt0VpxxWqJlO4iwu3FBdHUzV7wQVg= -github.com/cilium/ebpf v0.0.0-20200702112145-1c8d4c9ef775/go.mod h1:7cR51M8ViRLIdUjrmSXlK9pkrsDlLHbO8jiB8X8JnOc= -github.com/cilium/ebpf v0.2.0/go.mod h1:To2CFviqOWL/M0gIMsvSMlqe7em/l1ALkX1PyjrX2Qs= -github.com/cilium/ebpf v0.4.0/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs= -github.com/cilium/ebpf v0.6.2/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs= -github.com/cilium/ebpf v0.7.0/go.mod h1:/oI2+1shJiTGAMgl6/RgJr36Eo1jzrRcAWbcXO2usCA= -github.com/cloudflare/cloudflare-go v0.14.0/go.mod h1:EnwdgGMaFOruiPZRFSgn+TsQ3hQ7C/YWzIGLeu5c304= -github.com/cloudflare/cloudflare-go v0.79.0/go.mod h1:gkHQf9xEubaQPEuerBuoinR9P8bf8a05Lq0X6WKy1Oc= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= -github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= -github.com/cockroachdb/datadriven v1.0.0/go.mod h1:5Ib8Meh+jk1RlHIXej6Pzevx/NLlNvQB9pmSBZErGA4= -github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= -github.com/cockroachdb/datadriven v1.0.3-0.20230801171734-e384cf455877/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= -github.com/cockroachdb/errors v1.6.1/go.mod h1:tm6FTP5G81vwJ5lC0SizQo374JNCOPrHyXGitRJoDqM= -github.com/cockroachdb/errors v1.8.1/go.mod h1:qGwQn6JmZ+oMjuLwjWzUNqblqk0xl4CVV3SQbGwK7Ac= -github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI= -github.com/cockroachdb/redact v1.0.8/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= -github.com/cockroachdb/sentry-go v0.6.1-cockroachdb.2/go.mod h1:8BT+cPK6xvFOcRlk0R8eg+OTkcqI6baNH4xAkpiYVvQ= -github.com/containerd/aufs v0.0.0-20200908144142-dab0cbea06f4/go.mod h1:nukgQABAEopAHvB6j7cnP5zJ+/3aVcE7hCYqvIwAHyE= -github.com/containerd/aufs v0.0.0-20201003224125-76a6863f2989/go.mod h1:AkGGQs9NM2vtYHaUen+NljV0/baGCAPELGm2q9ZXpWU= -github.com/containerd/aufs v0.0.0-20210316121734-20793ff83c97/go.mod h1:kL5kd6KM5TzQjR79jljyi4olc1Vrx6XBlcyj3gNv2PU= -github.com/containerd/aufs v1.0.0/go.mod h1:kL5kd6KM5TzQjR79jljyi4olc1Vrx6XBlcyj3gNv2PU= -github.com/containerd/btrfs v0.0.0-20201111183144-404b9149801e/go.mod h1:jg2QkJcsabfHugurUvvPhS3E08Oxiuh5W/g1ybB4e0E= -github.com/containerd/btrfs v0.0.0-20210316141732-918d888fb676/go.mod h1:zMcX3qkXTAi9GI50+0HOeuV8LU2ryCE/V2vG/ZBiTss= -github.com/containerd/btrfs v1.0.0/go.mod h1:zMcX3qkXTAi9GI50+0HOeuV8LU2ryCE/V2vG/ZBiTss= -github.com/containerd/cgroups v0.0.0-20190717030353-c4b9ac5c7601/go.mod h1:X9rLEHIqSf/wfK8NsPqxJmeZgW4pcfzdXITDrUSJ6uI= -github.com/containerd/cgroups v0.0.0-20190919134610-bf292b21730f/go.mod h1:OApqhQ4XNSNC13gXIwDjhOQxjWa/NxkwZXJ1EvqT0ko= -github.com/containerd/cgroups v0.0.0-20200531161412-0dbf7f05ba59/go.mod h1:pA0z1pT8KYB3TCXK/ocprsh7MAkoW8bZVzPdih9snmM= -github.com/containerd/cgroups v0.0.0-20200710171044-318312a37340/go.mod h1:s5q4SojHctfxANBDvMeIaIovkq29IP48TKAxnhYRxvo= -github.com/containerd/cgroups v0.0.0-20200824123100-0b889c03f102/go.mod h1:s5q4SojHctfxANBDvMeIaIovkq29IP48TKAxnhYRxvo= -github.com/containerd/cgroups v0.0.0-20210114181951-8a68de567b68/go.mod h1:ZJeTFisyysqgcCdecO57Dj79RfL0LNeGiFUqLYQRYLE= -github.com/containerd/cgroups v1.0.1/go.mod h1:0SJrPIenamHDcZhEcJMNBB85rHcUsw4f25ZfBiPYRkU= -github.com/containerd/cgroups v1.0.4/go.mod h1:nLNQtsF7Sl2HxNebu77i1R0oDlhiTG+kO4JTrUzo6IA= -github.com/containerd/console v0.0.0-20180822173158-c12b1e7919c1/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw= -github.com/containerd/console v0.0.0-20181022165439-0650fd9eeb50/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw= -github.com/containerd/console v0.0.0-20191206165004-02ecf6a7291e/go.mod h1:8Pf4gM6VEbTNRIT26AyyU7hxdQU3MvAvxVI0sc00XBE= -github.com/containerd/console v1.0.1/go.mod h1:XUsP6YE/mKtz6bxc+I8UiKKTP04qjQL4qcS3XoQ5xkw= -github.com/containerd/console v1.0.2/go.mod h1:ytZPjGgY2oeTkAONYafi2kSj0aYggsf8acV1PGKCbzQ= -github.com/containerd/console v1.0.3/go.mod h1:7LqA/THxQ86k76b8c/EMSiaJ3h1eZkMkXar0TQ1gf3U= -github.com/containerd/containerd v1.2.10/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.3.0-beta.2.0.20190828155532-0293cbd26c69/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.3.0/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.3.1-0.20191213020239-082f7e3aed57/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.3.2/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.4.0-beta.2.0.20200729163537-40b22ef07410/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.4.1/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.4.3/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.5.0-beta.1/go.mod h1:5HfvG1V2FsKesEGQ17k5/T7V960Tmcumvqn8Mc+pCYQ= -github.com/containerd/containerd v1.5.0-beta.3/go.mod h1:/wr9AVtEM7x9c+n0+stptlo/uBBoBORwEx6ardVcmKU= -github.com/containerd/containerd v1.5.0-beta.4/go.mod h1:GmdgZd2zA2GYIBZ0w09ZvgqEq8EfBp/m3lcVZIvPHhI= -github.com/containerd/containerd v1.5.0-rc.0/go.mod h1:V/IXoMqNGgBlabz3tHD2TWDoTJseu1FGOKuoA4nNb2s= -github.com/containerd/containerd v1.5.1/go.mod h1:0DOxVqwDy2iZvrZp2JUx/E+hS0UNTVn7dJnIOwtYR4g= -github.com/containerd/containerd v1.5.7/go.mod h1:gyvv6+ugqY25TiXxcZC3L5yOeYgEw0QMhscqVp1AR9c= -github.com/containerd/containerd v1.6.18/go.mod h1:1RdCUu95+gc2v9t3IL+zIlpClSmew7/0YS8O5eQZrOw= -github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= -github.com/containerd/continuity v0.0.0-20190815185530-f2a389ac0a02/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= -github.com/containerd/continuity v0.0.0-20191127005431-f65d91d395eb/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= -github.com/containerd/continuity v0.0.0-20200710164510-efbc4488d8fe/go.mod h1:cECdGN1O8G9bgKTlLhuPJimka6Xb/Gg7vYzCTNVxhvo= -github.com/containerd/continuity v0.0.0-20201208142359-180525291bb7/go.mod h1:kR3BEg7bDFaEddKm54WSmrol1fKWDU1nKYkgrcgZT7Y= -github.com/containerd/continuity v0.0.0-20210208174643-50096c924a4e/go.mod h1:EXlVlkqNba9rJe3j7w3Xa924itAMLgZH4UD/Q4PExuQ= -github.com/containerd/continuity v0.1.0/go.mod h1:ICJu0PwR54nI0yPEnJ6jcS+J7CZAUXrLh8lPo2knzsM= -github.com/containerd/continuity v0.3.0/go.mod h1:wJEAIwKOm/pBZuBd0JmeTvnLquTB1Ag8espWhkykbPM= -github.com/containerd/fifo v0.0.0-20180307165137-3d5202aec260/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI= -github.com/containerd/fifo v0.0.0-20190226154929-a9fb20d87448/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI= -github.com/containerd/fifo v0.0.0-20200410184934-f15a3290365b/go.mod h1:jPQ2IAeZRCYxpS/Cm1495vGFww6ecHmMk1YJH2Q5ln0= -github.com/containerd/fifo v0.0.0-20201026212402-0724c46b320c/go.mod h1:jPQ2IAeZRCYxpS/Cm1495vGFww6ecHmMk1YJH2Q5ln0= -github.com/containerd/fifo v0.0.0-20210316144830-115abcc95a1d/go.mod h1:ocF/ME1SX5b1AOlWi9r677YJmCPSwwWnQ9O123vzpE4= -github.com/containerd/fifo v1.0.0/go.mod h1:ocF/ME1SX5b1AOlWi9r677YJmCPSwwWnQ9O123vzpE4= -github.com/containerd/go-cni v1.0.1/go.mod h1:+vUpYxKvAF72G9i1WoDOiPGRtQpqsNW/ZHtSlv++smU= -github.com/containerd/go-cni v1.0.2/go.mod h1:nrNABBHzu0ZwCug9Ije8hL2xBCYh/pjfMb1aZGrrohk= -github.com/containerd/go-cni v1.1.6/go.mod h1:BWtoWl5ghVymxu6MBjg79W9NZrCRyHIdUtk4cauMe34= -github.com/containerd/go-runc v0.0.0-20180907222934-5a6d9f37cfa3/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0= -github.com/containerd/go-runc v0.0.0-20190911050354-e029b79d8cda/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0= -github.com/containerd/go-runc v0.0.0-20200220073739-7016d3ce2328/go.mod h1:PpyHrqVs8FTi9vpyHwPwiNEGaACDxT/N/pLcvMSRA9g= -github.com/containerd/go-runc v0.0.0-20201020171139-16b287bc67d0/go.mod h1:cNU0ZbCgCQVZK4lgG3P+9tn9/PaJNmoDXPpoJhDR+Ok= -github.com/containerd/go-runc v1.0.0/go.mod h1:cNU0ZbCgCQVZK4lgG3P+9tn9/PaJNmoDXPpoJhDR+Ok= -github.com/containerd/imgcrypt v1.0.1/go.mod h1:mdd8cEPW7TPgNG4FpuP3sGBiQ7Yi/zak9TYCG3juvb0= -github.com/containerd/imgcrypt v1.0.4-0.20210301171431-0ae5c75f59ba/go.mod h1:6TNsg0ctmizkrOgXRNQjAPFWpMYRWuiB6dSF4Pfa5SA= -github.com/containerd/imgcrypt v1.1.1-0.20210312161619-7ed62a527887/go.mod h1:5AZJNI6sLHJljKuI9IHnw1pWqo/F0nGDOuR9zgTs7ow= -github.com/containerd/imgcrypt v1.1.1/go.mod h1:xpLnwiQmEUJPvQoAapeb2SNCxz7Xr6PJrXQb0Dpc4ms= -github.com/containerd/imgcrypt v1.1.4/go.mod h1:LorQnPtzL/T0IyCeftcsMEO7AqxUDbdO8j/tSUpgxvo= -github.com/containerd/nri v0.0.0-20201007170849-eb1350a75164/go.mod h1:+2wGSDGFYfE5+So4M5syatU0N0f0LbWpuqyMi4/BE8c= -github.com/containerd/nri v0.0.0-20210316161719-dbaa18c31c14/go.mod h1:lmxnXF6oMkbqs39FiCt1s0R2HSMhcLel9vNL3m4AaeY= -github.com/containerd/nri v0.1.0/go.mod h1:lmxnXF6oMkbqs39FiCt1s0R2HSMhcLel9vNL3m4AaeY= -github.com/containerd/stargz-snapshotter/estargz v0.4.1/go.mod h1:x7Q9dg9QYb4+ELgxmo4gBUeJB0tl5dqH1Sdz0nJU1QM= -github.com/containerd/ttrpc v0.0.0-20190828154514-0e0f228740de/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o= -github.com/containerd/ttrpc v0.0.0-20190828172938-92c8520ef9f8/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o= -github.com/containerd/ttrpc v0.0.0-20191028202541-4f1b8fe65a5c/go.mod h1:LPm1u0xBw8r8NOKoOdNMeVHSawSsltak+Ihv+etqsE8= -github.com/containerd/ttrpc v1.0.1/go.mod h1:UAxOpgT9ziI0gJrmKvgcZivgxOp8iFPSk8httJEt98Y= -github.com/containerd/ttrpc v1.0.2/go.mod h1:UAxOpgT9ziI0gJrmKvgcZivgxOp8iFPSk8httJEt98Y= -github.com/containerd/ttrpc v1.1.0/go.mod h1:XX4ZTnoOId4HklF4edwc4DcqskFZuvXB1Evzy5KFQpQ= -github.com/containerd/typeurl v0.0.0-20180627222232-a93fcdb778cd/go.mod h1:Cm3kwCdlkCfMSHURc+r6fwoGH6/F1hH3S4sg0rLFWPc= -github.com/containerd/typeurl v0.0.0-20190911142611-5eb25027c9fd/go.mod h1:GeKYzf2pQcqv7tJ0AoCuuhtnqhva5LNU3U+OyKxxJpk= -github.com/containerd/typeurl v1.0.1/go.mod h1:TB1hUtrpaiO88KEK56ijojHS1+NeF0izUACaJW2mdXg= -github.com/containerd/typeurl v1.0.2/go.mod h1:9trJWW2sRlGub4wZJRTW83VtbOLS6hwcDZXTn6oPz9s= -github.com/containerd/zfs v0.0.0-20200918131355-0a33824f23a2/go.mod h1:8IgZOBdv8fAgXddBT4dBXJPtxyRsejFIpXoklgxgEjw= -github.com/containerd/zfs v0.0.0-20210301145711-11e8f1707f62/go.mod h1:A9zfAbMlQwE+/is6hi0Xw8ktpL+6glmqZYtevJgaB8Y= -github.com/containerd/zfs v0.0.0-20210315114300-dde8f0fda960/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY= -github.com/containerd/zfs v0.0.0-20210324211415-d5c4544f0433/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY= -github.com/containerd/zfs v1.0.0/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY= -github.com/containernetworking/cni v0.7.1/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= -github.com/containernetworking/cni v0.8.0/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= -github.com/containernetworking/cni v0.8.1/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= -github.com/containernetworking/cni v1.1.1/go.mod h1:sDpYKmGVENF3s6uvMvGgldDWeG8dMxakj/u+i9ht9vw= -github.com/containernetworking/plugins v0.8.6/go.mod h1:qnw5mN19D8fIwkqW7oHHYDHVlzhJpcY6TQxn/fUyDDM= -github.com/containernetworking/plugins v0.9.1/go.mod h1:xP/idU2ldlzN6m4p5LmGiwRDjeJr6FLK6vuiUwoH7P8= -github.com/containernetworking/plugins v1.1.1/go.mod h1:Sr5TH/eBsGLXK/h71HeLfX19sZPp3ry5uHSkI4LPxV8= -github.com/containers/ocicrypt v1.0.1/go.mod h1:MeJDzk1RJHv89LjsH0Sp5KTY3ZYkjXO/C+bKAeWFIrc= -github.com/containers/ocicrypt v1.1.0/go.mod h1:b8AOe0YR67uU8OqfVNcznfFpAzu3rdgUV4GP9qXPfu4= -github.com/containers/ocicrypt v1.1.1/go.mod h1:Dm55fwWm1YZAjYRaJ94z2mfZikIyIN4B0oB3dj3jFxY= -github.com/containers/ocicrypt v1.1.3/go.mod h1:xpdkbVAuaH3WzbEabUd5yDsl9SwJA5pABH85425Es2g= -github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= -github.com/coreos/go-iptables v0.4.5/go.mod h1:/mVI274lEDI2ns62jHCDnCyBF9Iwsmekav8Dbxlm1MU= -github.com/coreos/go-iptables v0.5.0/go.mod h1:/mVI274lEDI2ns62jHCDnCyBF9Iwsmekav8Dbxlm1MU= -github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= -github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-systemd v0.0.0-20161114122254-48702e0da86b/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd/v22 v22.0.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= -github.com/coreos/go-systemd/v22 v22.1.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= -github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/crate-crypto/go-ipa v0.0.0-20220523130400-f11357ae11c7/go.mod h1:gFnFS95y8HstDP6P9pPwzrxOOC5TRDkwbM+ao15ChAI= -github.com/crate-crypto/go-ipa v0.0.0-20230601170251-1830d0757c80/go.mod h1:gzbVz57IDJgQ9rLQwfSk696JGWof8ftznEL9GoAv3NI= -github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= -github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/cyberdelia/templates v0.0.0-20141128023046-ca7fffd4298c/go.mod h1:GyV+0YP4qX0UQ7r2MoYZ+AvYDp12OF5yg4q8rGnyNh4= -github.com/cyphar/filepath-securejoin v0.2.2/go.mod h1:FpkQEhXnPnOthhzymB7CGsFk2G9VLXONKD9G7QGMM+4= -github.com/cyphar/filepath-securejoin v0.2.3/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= -github.com/d2g/dhcp4 v0.0.0-20170904100407-a1d1b6c41b1c/go.mod h1:Ct2BUK8SB0YC1SMSibvLzxjeJLnrYEVLULFNiHY9YfQ= -github.com/d2g/dhcp4client v1.0.0/go.mod h1:j0hNfjhrt2SxUOw55nL0ATM/z4Yt3t2Kd1mW34z5W5s= -github.com/d2g/dhcp4server v0.0.0-20181031114812-7d4a0a7f59a5/go.mod h1:Eo87+Kg/IX2hfWJfwxMzLyuSZyxSoAug2nGa1G2QAi8= -github.com/d2g/hardwareaddr v0.0.0-20190221164911-e7d9fbe030e4/go.mod h1:bMl4RjIciD2oAxI7DmWRx6gbeqrkoLqv3MV0vzNad+I= -github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= -github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.0-20210816181553-5444fa50b93d/go.mod h1:tmAIfUFEirG/Y8jhZ9M+h36obRZAk/1fcSpXwAVlfqE= -github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs= -github.com/deepmap/oapi-codegen v1.6.0/go.mod h1:ryDa9AgbELGeB+YEXE1dR53yAjHwFvE9iAUlWl9Al3M= -github.com/deepmap/oapi-codegen v1.8.2/go.mod h1:YLgSKSDv/bZQB7N4ws6luhozi3cEdRktEqrX88CvjIw= -github.com/denverdino/aliyungo v0.0.0-20190125010748-a747050bb1ba/go.mod h1:dV8lFg6daOBZbT6/BDGIz6Y3WFGn8juu6G+CQ6LHtl0= -github.com/dgraph-io/badger/v2 v2.2007.4/go.mod h1:vSw/ax2qojzbN6eXHIx6KPKtCSHJN/Uz0X0VPruTIhk= -github.com/dgraph-io/ristretto v0.0.3-0.20200630154024-f66de99634de/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= -github.com/dgrijalva/jwt-go v0.0.0-20170104182250-a601269ab70c/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= -github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= -github.com/djherbis/atime v1.1.0/go.mod h1:28OF6Y8s3NQWwacXc5eZTsEsiMzp7LF8MbXE+XJPdBE= -github.com/dlclark/regexp2 v1.4.1-0.20201116162257-a2a8dda75c91/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= -github.com/dlclark/regexp2 v1.7.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= -github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E= -github.com/dnaeon/go-vcr v1.1.0/go.mod h1:M7tiix8f0r6mKKJ3Yq/kqU1OYf3MnfmBWVbPx/yU9ko= -github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= -github.com/docker/cli v0.0.0-20191017083524-a8ff7f821017/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= -github.com/docker/distribution v0.0.0-20190905152932-14b96e55d84c/go.mod h1:0+TTO4EOBfRPhZXAeF1Vu+W3hHZ8eLp8PgKVZlcvtFY= -github.com/docker/distribution v2.7.1-0.20190205005809-0d3efadf0154+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/docker v1.4.2-0.20190924003213-a8608b5b67c7/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/docker v1.6.2/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/docker v20.10.17+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/docker v24.0.5+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/docker-credential-helpers v0.6.3/go.mod h1:WRaJzqw3CTB9bk10avuGsjVBZsD05qeibJ1/TYlvc0Y= -github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= -github.com/docker/go-events v0.0.0-20170721190031-9461782956ad/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA= -github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA= -github.com/docker/go-metrics v0.0.0-20180209012529-399ea8c73916/go.mod h1:/u0gXw0Gay3ceNrsHubL3BtdOL2fHf93USgMTe0W5dI= -github.com/docker/go-metrics v0.0.1/go.mod h1:cG1hvH2utMXtqgqqYE9plW6lDxS3/5ayHzueweSI3Vw= -github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= -github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= -github.com/docker/libtrust v0.0.0-20150114040149-fa567046d9b1/go.mod h1:cyGadeNEkKy96OOhEzfZl+yxihPEzKnqJwvfuSUqbZE= -github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= -github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= -github.com/dop251/goja v0.0.0-20211022113120-dc8c55024d06/go.mod h1:R9ET47fwRVRPZnOGvHxxhuZcbrMCuiqOz3Rlrh4KSnk= -github.com/dop251/goja v0.0.0-20230122112309-96b1610dd4f7/go.mod h1:yRkwfj0CBpOGre+TwBsqPV0IH0Pk73e4PXJOeNDboGs= -github.com/dop251/goja v0.0.0-20230605162241-28ee0ee714f3/go.mod h1:QMWlm50DNe14hD7t24KEqZuUdC9sOTy8W6XbCU1mlw4= -github.com/dop251/goja v0.0.0-20230806174421-c933cf95e127/go.mod h1:QMWlm50DNe14hD7t24KEqZuUdC9sOTy8W6XbCU1mlw4= -github.com/dop251/goja_nodejs v0.0.0-20210225215109-d91c329300e7/go.mod h1:hn7BA7c8pLvoGndExHudxTDKZ84Pyvv+90pbBjbTz0Y= -github.com/dop251/goja_nodejs v0.0.0-20211022123610-8dd9abb0616d/go.mod h1:DngW8aVqWbuLRMHItjPUyqdj+HWPvnQe8V8y1nDpIbM= -github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/edsrzf/mmap-go v1.1.0/go.mod h1:19H/e8pUPLicwkyNgOykDXkJ9F0MHE+Z52B8EIth78Q= -github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= -github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= -github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= -github.com/ethereum/c-kzg-4844 v0.2.0/go.mod h1:WI2Nd82DMZAAZI1wV2neKGost9EKjvbpQR9OqE5Qqa8= -github.com/ethereum/go-ethereum v1.12.0/go.mod h1:/oo2X/dZLJjf2mJ6YT9wcWxa4nNJDBKDBU6sFIpx1Gs= -github.com/ethereum/go-ethereum v1.12.1-0.20230724161334-2274a03e339f h1:b/1ztbo5mQzQuuyO8A3mVAHOjgiIf7wE8B9/r1Ul4OQ= -github.com/ethereum/go-ethereum v1.12.1-0.20230724161334-2274a03e339f/go.mod h1:WII7EML+9n033+WEChHAzFzZOVFB+md+oaonHFG8XQQ= -github.com/ethereum/hive/hiveproxy v0.0.0-20230313101845-c7dfe88c8138/go.mod h1:1LWNU6/EYsIOXZGa2KdklD1ET77gLTeEyhq+WTZ+37o= -github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanw/esbuild v0.17.6/go.mod h1:iINY06rn799hi48UqEnaQvVfZWe6W9bET78LbvN8VWk= -github.com/evanw/esbuild v0.18.11/go.mod h1:iINY06rn799hi48UqEnaQvVfZWe6W9bET78LbvN8VWk= -github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= -github.com/fjl/gencodec v0.0.0-20230517082657-f9840df7b83e h1:bBLctRc7kr01YGvaDfgLbTwjFNW5jdp5y5rj8XXBHfY= -github.com/fjl/gencodec v0.0.0-20230517082657-f9840df7b83e/go.mod h1:AzA8Lj6YtixmJWL+wkKoBGsLWy9gFrAzi4g+5bCKwpY= -github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= -github.com/flosch/pongo2 v0.0.0-20190707114632-bbf5a6c351f4/go.mod h1:T9YF2M40nIgbVgp3rreNmTged+9HrbNTIQf1PsaIiTA= -github.com/flosch/pongo2/v4 v4.0.2/go.mod h1:B5ObFANs/36VwxxlgKpdchIJHMvHB562PW+BWPhwZD8= -github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= -github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= -github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= -github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= -github.com/fsouza/go-dockerclient v1.8.1/go.mod h1:zmA2ogSxRnXmbZcy0Aq7yhRoCdP/bDns/qghCK9SWtM= -github.com/fsouza/go-dockerclient v1.9.8/go.mod h1:74lNReDQxrOaogajs51IvZgkDME4qe9yPJAUEUTJtHw= -github.com/fullsailor/pkcs7 v0.0.0-20190404230743-d7302db945fa/go.mod h1:KnogPXtdwXqoenmZCw6S+25EAm2MkxbG0deNDu4cbSA= -github.com/garslo/gogen v0.0.0-20170306192744-1d203ffc1f61 h1:IZqZOB2fydHte3kUgxrzK5E1fW7RQGeDwE8F/ZZnUYc= -github.com/garslo/gogen v0.0.0-20170306192744-1d203ffc1f61/go.mod h1:Q0X6pkwTILDlzrGEckF6HKjXe48EgsY/l7K7vhY4MW8= -github.com/garyburd/redigo v0.0.0-20150301180006-535138d7bcd7/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY= -github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= -github.com/gballet/go-verkle v0.0.0-20220902153445-097bd83b7732/go.mod h1:o/XfIXWi4/GqbQirfRm5uTbXMG5NpqxkxblnbZ+QM9I= -github.com/gballet/go-verkle v0.0.0-20230607174250-df487255f46b/go.mod h1:CDncRYVRSDqwakm282WEkjfaAj1hxU/v5RXxk5nXOiI= -github.com/getkin/kin-openapi v0.53.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW6yheSwk8Yi4= -github.com/getkin/kin-openapi v0.61.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW6yheSwk8Yi4= -github.com/getkin/kin-openapi v0.107.0/go.mod h1:9Dhr+FasATJZjS4iOLvB0hkaxgYdulrNYm2e9epLWOo= -github.com/ghemawat/stream v0.0.0-20171120220530-696b145b53b9/go.mod h1:106OIgooyS7OzLDOpUGgm9fA3bQENb/cFSyyBmMoJDs= -github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= -github.com/gin-gonic/gin v1.8.1/go.mod h1:ji8BvRH1azfM+SYow9zQ6SZMvR8qOMZHmsCuWR9tTTk= -github.com/go-chi/chi/v5 v5.0.0/go.mod h1:BBug9lr0cqtdAhsu6R4AAdvufI0/XBzAQSsUqJpoZOs= -github.com/go-chi/chi/v5 v5.0.7/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= -github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= -github.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g= -github.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks= -github.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= -github.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= -github.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY= -github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-ini/ini v1.25.4/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= -github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= -github.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= -github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= -github.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U= -github.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk= -github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= -github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= -github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= -github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= -github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= -github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8= -github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0= -github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= -github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9/go.mod h1:W3Z9FmVs9qj+KR4zFKmDPGiLdk1D9Rlm7cyMvf57TTg= -github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= -github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= -github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501/go.mod h1:J8+jY1nAiCcj+friV/PDoE1/3eeccG9LYBs0tYvLOWc= -github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= -github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87/go.mod h1:DXUve3Dpr1UfpPtxFw+EFuQ41HhCWZfha5jSVRG7C7I= -github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.21.1/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= -github.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M= -github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= -github.com/go-playground/locales v0.14.0/go.mod h1:sawfccIbzZTqEDETgFXqTho0QybSa7l++s0DH+LDiLs= -github.com/go-playground/universal-translator v0.18.0/go.mod h1:UvRDBj+xPUEGrFYl+lu/H90nyDXpg0fqeB/AQUGNTVA= -github.com/go-playground/validator/v10 v10.11.1/go.mod h1:i+3WkQ1FvaUjjxh1kSvIA4dMGDBiPU55YFDl0WbKdWU= -github.com/go-redis/redis/v8 v8.11.5/go.mod h1:gREzHqY1hg6oD9ngVRbLStwAWKhA0FEgq8Jd4h5lpwo= -github.com/go-sourcemap/sourcemap v2.1.3+incompatible/go.mod h1:F8jJfvm2KbVjc5NqelyYJmf/v5J0dwNLS2mL4sNA1Jg= -github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/gobwas/httphead v0.1.0/go.mod h1:O/RXo79gxV8G+RqlR/otEwx4Q36zl9rqC5u12GKvMCM= -github.com/gobwas/pool v0.2.1/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= -github.com/gobwas/ws v1.1.0/go.mod h1:nzvNcVha5eUziGrbxFCo6qFIojQHjJV5cLYIbezhfL0= -github.com/goccy/go-json v0.9.7/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= -github.com/goccy/go-json v0.9.11/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= -github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= -github.com/godbus/dbus v0.0.0-20151105175453-c7fdd8b5cd55/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= -github.com/godbus/dbus v0.0.0-20180201030542-885f9cc04c9c/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= -github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= -github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/godbus/dbus/v5 v5.0.6/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/gogo/googleapis v1.2.0/go.mod h1:Njal3psf3qN6dwBtQfUmBZh2ybovJ0tlu3o/AC7HYjU= -github.com/gogo/googleapis v1.4.0/go.mod h1:5YRNX2z1oM5gXdAkurHa942MDgEJyk02w4OecKY87+c= -github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= -github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/gogo/protobuf v1.3.0/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY= -github.com/golang-jwt/jwt/v4 v4.3.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= -github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= -github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= -github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= -github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= -github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golangci/lint-1 v0.0.0-20181222135242-d2cdd8c08219/go.mod h1:/X8TswGSh1pIozq4ZwCfxS0WA5JGXguxk94ar/4c87Y= -github.com/gonum/blas v0.0.0-20181208220705-f22b278b28ac/go.mod h1:P32wAyui1PQ58Oce/KYkOqQv8cVw1zAapXOl+dRFGbc= -github.com/gonum/floats v0.0.0-20181209220543-c233463c7e82/go.mod h1:PxC8OnwL11+aosOB5+iEPoV3picfs8tUpkVd0pDo+Kg= -github.com/gonum/internal v0.0.0-20181124074243-f884aa714029/go.mod h1:Pu4dmpkhSyOzRwuXkOgAvijx4o+4YMUJJo9OvPYMkks= -github.com/gonum/lapack v0.0.0-20181123203213-e4cdc5a0bff9/go.mod h1:XA3DeT6rxh2EAE789SSiSJNqxPaC0aE9J8NTOI0Jo/A= -github.com/gonum/matrix v0.0.0-20181209220409-c518dec07be9/go.mod h1:0EXg4mc1CNP0HCqCz+K4ts155PXIlUywf0wqN+GfPZw= -github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-containerregistry v0.5.1/go.mod h1:Ct15B4yir3PLOP5jsy0GNeYVaIZs/MK/Jz5any1wFW0= -github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= -github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/gofuzz v1.1.1-0.20200604201612-c04b05f3adfa/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20230207041349-798e818bf904/go.mod h1:uglQLonpP8qtYCYyzA+8c/9qtqgA3qsXGYqCPKARAFg= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/safehtml v0.0.2/go.mod h1:L4KWwDsUJdECRAEpZoBn3O64bQaywRscowZjJAzjHnU= -github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/gax-go v0.0.0-20161107002406-da06d194a00e/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY= -github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= -github.com/gopherjs/gopherjs v1.17.2/go.mod h1:pRRIvn/QzFLrKfvEz3qUuEhtE/zLCWfreZ6J5gM2i+k= -github.com/gorilla/css v1.0.0/go.mod h1:Dn721qIggHpt4+EFCcTLTU/vk5ySda2ReITrtgBl60c= -github.com/gorilla/handlers v0.0.0-20150720190736-60c7bfde3e33/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= -github.com/gorilla/mux v1.7.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= -github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= -github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= -github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= -github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/graph-gophers/graphql-go v1.3.0/go.mod h1:9CQHMSxwO4MprSdzoIEobiHpoLtHm77vfxsvsIN5Vuc= -github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= -github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= -github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/guptarohit/asciigraph v0.5.5/go.mod h1:dYl5wwK4gNsnFf9Zp+l06rFiDZ5YtXM6x7SRWZ3KGag= -github.com/hashicorp/errwrap v0.0.0-20141028054710-7554cd9344ce/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-bexpr v0.1.10/go.mod h1:oxlubA2vC/gFVfX1A6JGp7ls7uCDlfJn732ehYYg+g0= -github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= -github.com/hashicorp/go-multierror v0.0.0-20161216184304-ed905158d874/go.mod h1:JMRHfdO9jKNzS/+BTlxCjKNQHg/jZAft8U7LloJvN7I= -github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= -github.com/hashicorp/go-retryablehttp v0.7.4/go.mod h1:Jy/gPYAdjqffZ/yFGCFV2doI5wjtH1ewM9u8iYVjtX8= -github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/yamux v0.1.1/go.mod h1:CtWFDAQgb7dxtzFs4tWbplKIe2jSi3+5vKbgIO0SLnQ= -github.com/holiman/billy v0.0.0-20230616073924-97ff6efa2b93/go.mod h1:5GuXa7vkL8u9FkFuWdVvfR5ix8hRB7DbOAaYULamFpc= -github.com/holiman/uint256 v1.2.0/go.mod h1:y4ga/t+u+Xwd7CpDgZESaRcWy0I7XMlTMA25ApIH5Jw= -github.com/holiman/uint256 v1.2.2-0.20230321075855-87b91420868c/go.mod h1:SC8Ryt4n+UBbPbIBKaG9zbbDlp4jOru9xFZmPzLUTxw= -github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= -github.com/huin/goutil v0.0.0-20170803182201-1ca381bf3150 h1:vlNjIqmUZ9CMAWsbURYl3a6wZbw7q5RHVvlXTNS/Bs8= -github.com/hydrogen18/memlistener v0.0.0-20141126152155-54553eb933fb/go.mod h1:qEIFzExnS6016fRpRfxrExeVn2gbClQA99gQhnIcdhE= -github.com/hydrogen18/memlistener v0.0.0-20200120041712-dcc25e7acd91 h1:KyZDvZ/GGn+r+Y3DKZ7UOQ/TP4xV6HNkrwiVMB1GnNY= -github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w= -github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/imdario/mergo v0.3.10/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= -github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= -github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= -github.com/influxdata/influxdb v1.8.3/go.mod h1:JugdFhsvvI8gadxOI6noqNeeBHvWNTbfYGtiAn+2jhI= -github.com/influxdata/influxdb-client-go/v2 v2.4.0/go.mod h1:vLNHdxTJkIf2mSLvGrpj8TCcISApPoXkaxP8g9uRlW8= -github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo= -github.com/influxdata/line-protocol v0.0.0-20210311194329-9aa0e372d097/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo= -github.com/intel/goresctrl v0.2.0/go.mod h1:+CZdzouYFn5EsxgqAQTEzMfwKwuc0fVdMrT9FCCAVRQ= -github.com/invopop/yaml v0.1.0/go.mod h1:2XuRLgs/ouIrW3XNzuNj7J3Nvu/Dig5MXvbCEdiBN3Q= -github.com/iris-contrib/httpexpect/v2 v2.3.1/go.mod h1:ICTf89VBKSD3KB0fsyyHviKF8G8hyepP0dOXJPWz3T0= -github.com/iris-contrib/i18n v0.0.0-20171121225848-987a633949d0/go.mod h1:pMCz62A0xJL6I+umB2YTlFRwWXaDFA0jy+5HzGiJjqI= -github.com/iris-contrib/jade v1.1.4/go.mod h1:EDqR+ur9piDl6DUgs6qRrlfzmlx/D5UybogqrXvJTBE= -github.com/iris-contrib/schema v0.0.6/go.mod h1:iYszG0IOsuIsfzjymw1kMzTL8YQcCWlm65f3wX8J5iA= -github.com/j-keck/arping v0.0.0-20160618110441-2cf9dc699c56/go.mod h1:ymszkNOg6tORTn+6F6j+Jc8TOr5osrynvN6ivFWZ2GA= -github.com/jedisct1/go-minisign v0.0.0-20190909160543-45766022959e/go.mod h1:G1CVv03EnqU1wYL2dFwXxW2An0az9JTl/ZsqXQeBlkU= -github.com/jedisct1/go-minisign v0.0.0-20230811132847-661be99b8267/go.mod h1:h1nSAbGFqGVzn6Jyl1R/iCcBUHN4g+gW1u9CoBTrb9E= -github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= -github.com/jmespath/go-jmespath v0.0.0-20160803190731-bd40a432e4c7/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= -github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= -github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= -github.com/joefitzgerald/rainbow-reporter v0.1.0/go.mod h1:481CNgqmVHQZzdIbN52CupLJyoVwB10FQ/IQlF1pdL8= -github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= -github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= -github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= -github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= -github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= -github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= -github.com/juju/errors v0.0.0-20181118221551-089d3ea4e4d5/go.mod h1:W54LbzXuIE0boCoNJfwqpmkKJ1O4TCTZMetAt6jGk7Q= -github.com/juju/loggo v0.0.0-20180524022052-584905176618/go.mod h1:vgyd7OREkbtVEN/8IXZe5Ooef3LQePvuBm9UWj6ZL8U= -github.com/juju/testing v0.0.0-20180920084828-472a3e8b2073/go.mod h1:63prj8cnj0tU0S9OHjGJn+b1h0ZghCndfnbQolrYTwA= -github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= -github.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= -github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= -github.com/karalabe/usb v0.0.2/go.mod h1:Od972xHfMJowv7NGVDiWVxk2zxnWgjLlJzE+F4F7AGU= -github.com/karalabe/usb v0.0.3-0.20230711191512-61db3e06439c/go.mod h1:Od972xHfMJowv7NGVDiWVxk2zxnWgjLlJzE+F4F7AGU= -github.com/kataras/blocks v0.0.7/go.mod h1:UJIU97CluDo0f+zEjbnbkeMRlvYORtmc1304EeyXf4I= -github.com/kataras/golog v0.0.9/go.mod h1:12HJgwBIZFNGL0EJnMRhmvGA0PQGx8VFwrZtM4CqbAk= -github.com/kataras/golog v0.1.7/go.mod h1:jOSQ+C5fUqsNSwurB/oAHq1IFSb0KI3l6GMa7xB6dZA= -github.com/kataras/iris/v12 v12.0.1/go.mod h1:udK4vLQKkdDqMGJJVd/msuMtN6hpYJhg/lSzuxjhO+U= -github.com/kataras/iris/v12 v12.2.0-beta5/go.mod h1:q26aoWJ0Knx/00iPKg5iizDK7oQQSPjbD8np0XDh6dc= -github.com/kataras/jwt v0.1.8/go.mod h1:Q5j2IkcIHnfwy+oNY3TVWuEBJNw0ADgCcXK9CaZwV4o= -github.com/kataras/neffos v0.0.10/go.mod h1:ZYmJC07hQPW67eKuzlfY7SO3bC0mw83A3j6im82hfqw= -github.com/kataras/neffos v0.0.20/go.mod h1:srdvC/Uo8mgrApWW0AYtiiLgMbyNPf69qPsd2FhE6MQ= -github.com/kataras/pio v0.0.0-20190103105442-ea782b38602d/go.mod h1:NV88laa9UiiDuX9AhMbDPkGYSPugBOV6yTZB1l2K9Z0= -github.com/kataras/pio v0.0.10/go.mod h1:gS3ui9xSD+lAUpbYnjOGiQyY7sUMJO+EHpiRzhtZ5no= -github.com/kataras/pio v0.0.11/go.mod h1:38hH6SWH6m4DKSYmRhlrCJ5WItwWgCVrTNU62XZyUvI= -github.com/kataras/sitemap v0.0.6/go.mod h1:dW4dOCNs896OR1HmG+dMLdT7JjDk7mYBzoIRwuj5jA4= -github.com/kataras/tunnel v0.0.4/go.mod h1:9FkU4LaeifdMWqZu7o20ojmW4B7hdhv2CMLwfnHGpYw= -github.com/kilic/bls12-381 v0.1.0/go.mod h1:vDTTHJONJ6G+P2R74EhnyotQDTliQDnFEwhdmfzw1ig= -github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= -github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= -github.com/klauspost/compress v1.9.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= -github.com/klauspost/compress v1.11.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= -github.com/klauspost/compress v1.11.13/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= -github.com/klauspost/compress v1.15.0/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= -github.com/klauspost/compress v1.15.11/go.mod h1:QPwzmACJjUTFsnSHH934V6woptycfrDDJnH7hvFVbGM= -github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= -github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= -github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/labstack/echo/v4 v4.1.11/go.mod h1:i541M3Fj6f76NZtHSj7TXnyM8n2gaodfvfxNnFqi74g= -github.com/labstack/echo/v4 v4.2.1/go.mod h1:AA49e0DZ8kk5jTOOCKNuPR6oTnBS0dYiM4FW1e6jwpg= -github.com/labstack/echo/v4 v4.9.0/go.mod h1:xkCDAdFCIf8jsFQ5NnbK7oqaF/yU1A1X20Ltm0OvSks= -github.com/labstack/echo/v4 v4.9.1/go.mod h1:Pop5HLc+xoc4qhTZ1ip6C0RtP7Z+4VzRLWZZFKqbbjo= -github.com/labstack/gommon v0.3.1/go.mod h1:uW6kP17uPlLJsD3ijUYn3/M5bAxtlZhMI6m3MFxTMTM= -github.com/labstack/gommon v0.4.0/go.mod h1:uW6kP17uPlLJsD3ijUYn3/M5bAxtlZhMI6m3MFxTMTM= -github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= -github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY= -github.com/lestrrat-go/backoff/v2 v2.0.8/go.mod h1:rHP/q/r9aT27n24JQLa7JhSQZCKBBOiM/uP402WwN8Y= -github.com/lestrrat-go/blackmagic v1.0.0/go.mod h1:TNgH//0vYSs8VXDCfkZLgIrVTTXQELZffUV0tz3MtdQ= -github.com/lestrrat-go/httpcc v1.0.1/go.mod h1:qiltp3Mt56+55GPVCbTdM9MlqhvzyuL6W/NMDA8vA5E= -github.com/lestrrat-go/iter v1.0.1/go.mod h1:zIdgO1mRKhn8l9vrZJZz9TUMMFbQbLeTsbqPDrJ/OJc= -github.com/lestrrat-go/jwx v1.2.25/go.mod h1:zoNuZymNl5lgdcu6P7K6ie2QRll5HVfF4xwxBBK1NxY= -github.com/lestrrat-go/option v1.0.0/go.mod h1:5ZHFbivi4xwXxhxY9XHDe2FHo6/Z7WWmtT7T5nBBp3I= -github.com/lightclient/go-ethereum v1.10.10-0.20230811210943-0cee617571f0 h1:TDi8DB9gLSiWJ7mnsdAFDE5zBcY/qYBfvfLGCYepPGA= -github.com/lightclient/go-ethereum v1.10.10-0.20230811210943-0cee617571f0/go.mod h1:B/cPTafll0UGQ1m2ceGgP0JTNKL+pxPebUEptS4mXYQ= -github.com/linuxkit/virtsock v0.0.0-20201010232012-f8cee7dfc7a3/go.mod h1:3r6x7q95whyfWQpmGZTu3gk3v2YkMi05HEzl7Tf7YEo= -github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= -github.com/mailgun/raymond/v2 v2.0.46/go.mod h1:lsgvL50kgt1ylcFJYZiULi5fjPBkkhNfj4KA0W54Z18= -github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= -github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/marstr/guid v1.1.0/go.mod h1:74gB1z2wpxxInTG6yaqA7KrtM0NZ+RbrcqDvYHefzho= -github.com/matryer/moq v0.0.0-20190312154309-6cfb0558e1bd/go.mod h1:9ELz6aaclSIGnZBoaSLZ3NAl1VTufbOrXBPvtcy6WiQ= -github.com/matryer/moq v0.2.7/go.mod h1:kITsx543GOENm48TUAQyJ9+SAvFSr7iGQXPoth/VUBk= -github.com/matryer/try v0.0.0-20161228173917-9ac251b645a2/go.mod h1:0KeJpeMD6o+O4hW7qJOT7vyQPKrWmj26uf5wMc/IiIs= -github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-colorable v0.1.7/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= -github.com/mattn/go-shellwords v1.0.3/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o= -github.com/mattn/go-shellwords v1.0.6/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o= -github.com/mattn/go-sqlite3 v1.14.5/go.mod h1:WVKg1VTActs4Qso6iwGbiFih2UIHo0ENGwNd0Lj+XmI= -github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= -github.com/maxbrunsfeld/counterfeiter/v6 v6.2.2/go.mod h1:eD9eIE7cdwcMi9rYluz88Jz2VyhSmden33/aXg4oVIY= -github.com/mediocregopher/mediocre-go-lib v0.0.0-20181029021733-cb65787f37ed/go.mod h1:dSsfyI2zABAdhcbvkXqgxOxrCsbYeHCPgrZkku60dSg= -github.com/mediocregopher/radix/v3 v3.3.0/go.mod h1:EmfVyvspXz1uZEyPBMyGK+kjWiKQGvsUt6O3Pj+LDCQ= -github.com/mediocregopher/radix/v3 v3.8.0/go.mod h1:8FL3F6UQRXHXIBSPUs5h0RybMF8i4n7wVopoX3x7Bv8= -github.com/microcosm-cc/bluemonday v1.0.21/go.mod h1:ytNkv4RrDrLJ2pqlsSI46O6IVXmZOBBD4SaJyDwwTkM= -github.com/miekg/pkcs11 v1.0.3/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= -github.com/miekg/pkcs11 v1.1.1/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= -github.com/minio/highwayhash v1.0.2/go.mod h1:BQskDq+xkJ12lmlUUi7U0M5Swg3EWR+dLTk+kldvVxY= -github.com/mistifyio/go-zfs v2.1.2-0.20190413222219-f784269be439+incompatible/go.mod h1:8AuVvqP/mXw1px98n46wfvcGfQ4ci2FwoAjKYxuo3Z4= -github.com/mitchellh/osext v0.0.0-20151018003038-5e2d6d41470f/go.mod h1:OkQIRizQZAeMln+1tSwduZz7+Af5oFlKirV/MSYes2A= -github.com/mitchellh/pointerstructure v1.2.0/go.mod h1:BRAsLI5zgXmw97Lf6s25bs8ohIXc3tViBH44KcwB2g4= -github.com/moby/locker v1.0.1/go.mod h1:S7SDdo5zpBK84bzzVlKr2V0hz+7x9hWbYC/kq7oQppc= -github.com/moby/patternmatcher v0.6.0/go.mod h1:hDPoyOpDY7OrrMDLaYoY3hf52gNCR/YOUYxkhApJIxc= -github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= -github.com/moby/sys/mount v0.3.3/go.mod h1:PBaEorSNTLG5t/+4EgukEQVlAvVEc6ZjTySwKdqp5K0= -github.com/moby/sys/mountinfo v0.4.0/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2JI+6q0qou+A= -github.com/moby/sys/mountinfo v0.4.1/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2JI+6q0qou+A= -github.com/moby/sys/mountinfo v0.5.0/go.mod h1:3bMD3Rg+zkqx8MRYPi7Pyb0Ie97QEBmdxbhnCLlSvSU= -github.com/moby/sys/mountinfo v0.6.2/go.mod h1:IJb6JQeOklcdMU9F5xQ8ZALD+CUr5VlGpwtX+VE0rpI= -github.com/moby/sys/sequential v0.5.0/go.mod h1:tH2cOOs5V9MlPiXcQzRC+eEyab644PWKGRYaaV5ZZlo= -github.com/moby/sys/signal v0.6.0/go.mod h1:GQ6ObYZfqacOwTtlXvcmh9A26dVRul/hbOZn88Kg8Tg= -github.com/moby/sys/symlink v0.1.0/go.mod h1:GGDODQmbFOjFsXvfLVn3+ZRxkch54RkSiGqsZeMYowQ= -github.com/moby/sys/symlink v0.2.0/go.mod h1:7uZVF2dqJjG/NsClqul95CqKOBRQyYSNnJ6BMgR/gFs= -github.com/moby/term v0.0.0-20200312100748-672ec06f55cd/go.mod h1:DdlQx2hp0Ss5/fLikoLlEeIYiATotOjgB//nb973jeo= -github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6/go.mod h1:E2VnQOmVuvZB6UYnnDB0qG5Nq/1tD9acaOpo6xmt0Kw= -github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= -github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5/go.mod h1:caMODM3PzxT8aQXRPkAt8xlV/e7d7w8GM5g0fa5F0D8= -github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8= -github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= -github.com/mrunalp/fileutils v0.5.0/go.mod h1:M1WthSahJixYnrXQl/DFQuteStB1weuxD2QJNHXfbSQ= -github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= -github.com/naoina/go-stringutil v0.1.0/go.mod h1:XJ2SJL9jCtBh+P9q5btrd/Ylo8XwT/h1USek5+NqSA0= -github.com/naoina/toml v0.1.2-0.20170918210437-9fafd6967416/go.mod h1:NBIhNtsFMo3G2szEBne+bO4gS192HuIYRqfvOWb4i1E= -github.com/nats-io/jwt/v2 v2.3.0/go.mod h1:0tqz9Hlu6bCBFLWAASKhE5vUA4c24L9KPUUgvwumE/k= -github.com/nats-io/nats.go v1.8.1/go.mod h1:BrFz9vVn0fU3AcH9Vn4Kd7W0NpJ651tD5omQ3M8LwxM= -github.com/nats-io/nats.go v1.16.0/go.mod h1:BPko4oXsySz4aSWeFgOHLZs3G4Jq4ZAyE6/zMCxRT6w= -github.com/nats-io/nkeys v0.0.2/go.mod h1:dab7URMsZm6Z/jp9Z5UGa87Uutgc2mVpXLC4B7TDb/4= -github.com/nats-io/nkeys v0.3.0/go.mod h1:gvUNGjVcM2IPr5rCsRsC6Wb3Hr2CQAm08dsxtV6A5y4= -github.com/ncw/swift v1.0.47/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= -github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= -github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= -github.com/onsi/ginkgo v0.0.0-20151202141238-7f8ab55aaf3b/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg= -github.com/onsi/ginkgo v1.13.0/go.mod h1:+REjRxOmWfHCjfv9TTWB1jD1Frx4XydAD3zm1lskyM0= -github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= -github.com/onsi/gomega v0.0.0-20151007035656-2152b45fa28a/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= -github.com/onsi/gomega v1.10.3/go.mod h1:V9xEwhxec5O8UDM77eCW8vLymOMltsqPVYWrpDsH8xc= -github.com/opencontainers/go-digest v0.0.0-20170106003457-a6d0ee40d420/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= -github.com/opencontainers/go-digest v0.0.0-20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= -github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= -github.com/opencontainers/go-digest v1.0.0-rc1.0.20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= -github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= -github.com/opencontainers/image-spec v1.0.0/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= -github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= -github.com/opencontainers/image-spec v1.0.3-0.20211202183452-c5a74bcca799/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= -github.com/opencontainers/runc v0.0.0-20190115041553-12f6a991201f/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= -github.com/opencontainers/runc v0.1.1/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= -github.com/opencontainers/runc v1.0.0-rc8.0.20190926000215-3e425f80a8c9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= -github.com/opencontainers/runc v1.0.0-rc9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= -github.com/opencontainers/runc v1.0.0-rc93/go.mod h1:3NOsor4w32B2tC0Zbl8Knk4Wg84SM2ImC1fxBuqJ/H0= -github.com/opencontainers/runc v1.0.2/go.mod h1:aTaHFFwQXuA71CiyxOdFFIorAoemI04suvGRQFzWTD0= -github.com/opencontainers/runc v1.1.5/go.mod h1:1J5XiS+vdZ3wCyZybsuxXZWGrgSr8fFJHLXuG2PsnNg= -github.com/opencontainers/runtime-spec v0.1.2-0.20190507144316-5b71a03e2700/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-spec v1.0.1/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-spec v1.0.2-0.20190207185410-29686dbc5559/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-spec v1.0.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-spec v1.0.3-0.20200929063507-e6143ca7d51d/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-tools v0.0.0-20181011054405-1d69bd0f9c39/go.mod h1:r3f7wjNzSs2extwzU3Y+6pKfobzPh+kKFJ3ofN+3nfs= -github.com/opencontainers/selinux v1.6.0/go.mod h1:VVGKuOLlE7v4PJyT6h7mNWvq1rzqiriPsEqVhc+svHE= -github.com/opencontainers/selinux v1.8.0/go.mod h1:RScLhm78qiWa2gbVCcGkC7tCGdgk3ogry1nUQF8Evvo= -github.com/opencontainers/selinux v1.8.2/go.mod h1:MUIHuUEvKB1wtJjQdOyYRgOnLD2xAPP8dBsCoU0KuF8= -github.com/opencontainers/selinux v1.10.0/go.mod h1:2i0OySw99QjzBBQByd1Gr9gSjvuho1lHsJxIJ3gGbJI= -github.com/opencontainers/selinux v1.10.1/go.mod h1:2i0OySw99QjzBBQByd1Gr9gSjvuho1lHsJxIJ3gGbJI= -github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/pelletier/go-toml v1.8.1/go.mod h1:T2/BmBdy8dvIRq1a/8aqjN41wvWlN4lrapLU/GW4pbc= -github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= -github.com/pelletier/go-toml/v2 v2.0.5/go.mod h1:OMHamSCAODeSsVrwwvcJOaoN0LIUIaFVNZzmWyNfXas= -github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= -github.com/peterh/liner v1.1.1-0.20190123174540-a2c9a5303de7/go.mod h1:CRroGNssyjTd/qIG2FyxByd2S8JEAZXBl4qUrZf8GS0= -github.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY= -github.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= -github.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= -github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.8.1-0.20171018195549-f15c970de5b7/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= -github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= -github.com/prashantv/gostub v1.1.0/go.mod h1:A5zLQHz7ieHGG7is6LLXLz7I8+3LZzsrV0P1IAHhP5U= -github.com/prometheus/client_golang v0.0.0-20180209125602-c332b6f63c06/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= -github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= -github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g= -github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= -github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.12.0/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= -github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= -github.com/prometheus/client_model v0.0.0-20171117100541-99fa1f4be8e5/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.2.1-0.20210607210712-147c58e9608a/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= -github.com/prometheus/common v0.0.0-20180110214958-89604d197083/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc= -github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= -github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= -github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= -github.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA= -github.com/prometheus/procfs v0.0.0-20180125133057-cb4147076ac7/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.0-20190522114515-bc1a522cf7b1/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= -github.com/prometheus/procfs v0.0.5/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= -github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= -github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4= -github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= -github.com/protolambda/bls12-381-util v0.0.0-20220416220906-d8552aa452c7/go.mod h1:IToEjHuttnUzwZI5KBSM/LOOW3qLbbrHOEfp3SbECGY= -github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= -github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= -github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= -github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w= -github.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk= -github.com/safchain/ethtool v0.0.0-20190326074333-42ed695e3de8/go.mod h1:Z0q5wiBQGYcxhMZ6gUqHn6pYNLypFAvaL3UvgZLR0U4= -github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= -github.com/sclevine/agouti v3.0.0+incompatible/go.mod h1:b4WX9W9L1sfQKXeJf1mUTLZKJ48R1S7H23Ji7oFO5Bw= -github.com/sclevine/spec v1.2.0/go.mod h1:W4J29eT/Kzv7/b9IWLB055Z+qvVC9vt0Arko24q7p+U= -github.com/seccomp/libseccomp-golang v0.9.1/go.mod h1:GbW5+tmTXfcxTToHLXlScSlAvWlF4P2Ca7zGrPiEpWo= -github.com/seccomp/libseccomp-golang v0.9.2-0.20220502022130-f33da4d89646/go.mod h1:JA8cRccbGaA1s33RQf7Y1+q9gHmZX1yB/z9WDN1C6fg= -github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= -github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= -github.com/shirou/gopsutil/v3 v3.22.8/go.mod h1:s648gW4IywYzUfE/KjXxUsqrqx/T2xO5VqOXxONeRfI= -github.com/sirupsen/logrus v1.0.4-0.20170822132746-89742aefa4b2/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= -github.com/sirupsen/logrus v1.0.6/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= -github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= -github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= -github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/smartystreets/assertions v1.13.0/go.mod h1:wDmR7qL282YbGsPy6H/yAsesrxfxaaSlJazyFLYVFx8= -github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= -github.com/spf13/cobra v0.0.2-0.20171109065643-2da4a54c5cee/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= -github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= -github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= -github.com/spf13/cobra v1.5.0/go.mod h1:dWXEIy2H428czQCjInthrTRUg7yKbok+2Qi/yBIJoUM= -github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.1-0.20171106142849-4c012f6dcd95/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= -github.com/stefanberger/go-pkcs11uri v0.0.0-20201008174630-78d3cae3a980/go.mod h1:AO3tvPzVZ/ayst6UlUKUv6rcPQInYe3IknH3jYhAKu8= -github.com/stretchr/objx v0.0.0-20180129172003-8a3f7159479f/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= -github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= -github.com/stretchr/testify v0.0.0-20180303142811-b89eecf5ca5d/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/syndtr/gocapability v0.0.0-20170704070218-db04d3cc01c8/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= -github.com/syndtr/gocapability v0.0.0-20180916011248-d98352740cb2/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= -github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= -github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc= -github.com/tchap/go-patricia v2.2.6+incompatible/go.mod h1:bmLyhP68RS6kStMGxByiQ23RP/odRBOTVjwp2cDyi6I= -github.com/tdewolff/minify/v2 v2.12.4/go.mod h1:h+SRvSIX3kwgwTFOpSckvSxgax3uy8kZTSF1Ojrr3bk= -github.com/tdewolff/parse/v2 v2.6.4/go.mod h1:woz0cgbLwFdtbjJu8PIKxhW05KplTFQkOdX78o+Jgrs= -github.com/tdewolff/test v1.0.7/go.mod h1:6DAvZliBAAnD7rhVgwaM7DE5/d9NMOAJ09SqYqeK4QE= -github.com/tklauser/go-sysconf v0.3.5/go.mod h1:MkWzOF4RMCshBAMXuhXJs64Rte09mITnppBXY/rYEFI= -github.com/tklauser/numcpus v0.2.2/go.mod h1:x3qojaO3uyYt0i56EW/VUYs7uBvdl2fkfZFu0T9wgjM= -github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/ugorji/go v1.2.7/go.mod h1:nF9osbDWLy6bDVv/Rtoh6QgnvNDpmCalQV5urGCCS6M= -github.com/ugorji/go/codec v1.2.7/go.mod h1:WGN1fab3R1fzQlVQTkfxVtIBhWDRqOviHU95kRgeqEY= -github.com/urfave/cli v0.0.0-20171014202726-7bc6a0acffa5/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= -github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= -github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/urfave/cli v1.22.2 h1:gsqYFH8bb9ekPA12kRo0hfjngWQjkJPlN9R0N78BoUo= -github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/XcUArI= -github.com/valyala/fasthttp v1.40.0/go.mod h1:t/G+3rLek+CyY9bnIE+YlMRddxVAAGjhxndDB4i4C0I= -github.com/valyala/fasttemplate v1.2.2/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= -github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc= -github.com/vishvananda/netlink v0.0.0-20181108222139-023a6dafdcdf/go.mod h1:+SR5DhBJrl6ZM7CoCKvpw5BKroDKQ+PJqOg65H/2ktk= -github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE= -github.com/vishvananda/netlink v1.1.1-0.20201029203352-d40f9887b852/go.mod h1:twkDnbuQxJYemMlGd4JFIcuhgX83tXhKS2B/PRMpOho= -github.com/vishvananda/netlink v1.1.1-0.20210330154013-f5de75959ad5/go.mod h1:twkDnbuQxJYemMlGd4JFIcuhgX83tXhKS2B/PRMpOho= -github.com/vishvananda/netns v0.0.0-20180720170159-13995c7128cc/go.mod h1:ZjcWmFBXmLKZu9Nxj3WKYEafiSqer2rnvPr0en9UNpI= -github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU= -github.com/vishvananda/netns v0.0.0-20200728191858-db3c7e526aae/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= -github.com/vishvananda/netns v0.0.0-20210104183010-2eb08e3e575f/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= -github.com/vmihailenco/msgpack/v5 v5.3.5/go.mod h1:7xyJ9e+0+9SaZT0Wt1RGleJXzli6Q/V5KbhBonMG9jc= -github.com/vmihailenco/tagparser/v2 v2.0.0/go.mod h1:Wri+At7QHww0WTrCBeu4J6bNtoV6mEfg5OIWRZA9qds= -github.com/willf/bitset v1.1.11-0.20200630133818-d5bec3311243/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4= -github.com/willf/bitset v1.1.11/go.mod h1:83CECat5yLh5zVOf4P1ErAgKA5UDvKtgyUABdr3+MjI= -github.com/xeipuuv/gojsonschema v0.0.0-20180618132009-1d523034197f/go.mod h1:5yf86TLmAcydyeJq5YvxkGPE2fm/u4myDekKRoLuqhs= -github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= -github.com/yosssi/ace v0.0.5/go.mod h1:ALfIzm2vT7t5ZE7uoIZqF3TQ7SAOyupFZnkrF5id+K0= -github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -github.com/yvasiyarov/go-metrics v0.0.0-20140926110328-57bccd1ccd43/go.mod h1:aX5oPXxHm3bOH+xeAttToC8pqch2ScQN/JoXYupl6xs= -github.com/yvasiyarov/gorelic v0.0.0-20141212073537-a9bba5b9ab50/go.mod h1:NUSPSUX/bi6SeDMUh6brw0nXpxHnc96TguQh0+r/ssA= -github.com/yvasiyarov/newrelic_platform_go v0.0.0-20140908184405-b21fdbd4370f/go.mod h1:GlGEuHIJweS1mbCqG+7vt2nvWLzLLnRHbXz5JKd/Qbg= -go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/bbolt v1.3.5/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= -go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4= -go.etcd.io/etcd v0.5.0-alpha.5.0.20200910180754-dd1b699fc489/go.mod h1:yVHk9ub3CSBatqGNg7GRmsnfLWtoW60w4eDYfh7vHDg= -go.mozilla.org/pkcs7 v0.0.0-20200128120323-432b2356ecb1/go.mod h1:SNgMg+EgDFwmvSmLRTNKC5fegJjB7v23qTQ0XLGUNHk= -go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= -go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.28.0/go.mod h1:vEhqr0m4eTc+DWxfsXoXue2GBgV2uUwVznkGIHW/e5w= -go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.3.0/go.mod h1:VpP4/RMn8bv8gNo9uK7/IMY4mtWLELsS+JIP0inH0h4= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.3.0/go.mod h1:hO1KLR7jcKaDDKDkvI9dP/FIhpmna5lkqPUQdEjFAM8= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.3.0/go.mod h1:keUU7UfnwWTWpJ+FWnyqmogPa82nuU5VUANFq49hlMY= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.3.0/go.mod h1:QNX1aly8ehqqX1LEa6YniTU7VY9I6R3X/oPxhGdTceE= -go.opentelemetry.io/otel/sdk v1.3.0/go.mod h1:rIo4suHNhQwBIPg9axF8V9CA72Wz2mKF1teNrup8yzs= -go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.opentelemetry.io/proto/otlp v0.11.0/go.mod h1:QpEjXPrNQzrFDZgoTo49dgHR9RYRSrg3NAKnUGl9YpQ= -go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/automaxprocs v1.5.2/go.mod h1:eRbA25aqJrxAbsLO0xy5jVwPt7FQnRgjW+efnwa1WM0= -go.uber.org/goleak v1.1.12/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= -go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -golang.org/x/crypto v0.0.0-20171113213409-9f005a07e0d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181009213950-7c1a557ab941/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190909091759-094676da4a83/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= -golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220427172511-eb4f295cb31f/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220926161630-eccd6366d1be/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= -golang.org/x/crypto v0.10.0/go.mod h1:o4eNf7Ede1fv+hwOwZsTHl9EsPFO6q6ZvYR8vYfY45I= -golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE= -golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= -golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= -golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20200513190911-00229845015e/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw= -golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1/go.mod h1:V1LtkGg67GoY2N1AnLN78QLrzxkLyJw7RJb1gzOOz9w= -golang.org/x/exp v0.0.0-20230626212559-97b1e661b5df/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc= -golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= -golang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= -golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= -golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= -golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.6.0/go.mod h1:4mET923SAdbXp2ki8ey+zGs1SLqsuM2Y0uvdZR/fUNI= -golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.10.0 h1:lFO9qtOdlre5W1jxS3r/4szv2/6iXxScdzjoBMXNhYk= -golang.org/x/mod v0.10.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/net v0.0.0-20181011144130-49bb7cea24b1/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190619014844-b5b0513f8c1b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20201006153459-a7d1128ccaa0/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201010224723-4f7140c49acb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210220033124-5f55cee0dc0d/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210610132358-84b48f89b13b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210825183410-e898025ed96a/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20221002022538-bcab6841153b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= -golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= -golang.org/x/net v0.3.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= -golang.org/x/net v0.4.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= -golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= -golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= -golang.org/x/oauth2 v0.0.0-20170207211851-4464e7848382/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.3.0/go.mod h1:rQrIauxkUhJ6CuwEXwymO2/eh4xz2ZWF1nBkcxS+tGk= -golang.org/x/perf v0.0.0-20230113213139-801c7ef9e5c5/go.mod h1:UBKtEnL8aqnd+0JHqZ+2qoMDwtuy6cYhhKNoHLBiTQc= -golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.2.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190514135907-3a4b5fb9f71f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190522044717-8097e1b27ff5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190602015325-4c4f7f33c9ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606203320-7fc4e5ec1444/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190812073006-9eafafc0a87e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191022100944-742c48ecaeb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191115151921-52ab43148777/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191210023423-ac6580df4449/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200120151820-655fe14d7479/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200217220822-9197077df867/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200728102440-3e129f6d46b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200817155316-9781c653f443/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200826173525-f9321e4c35a6/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200909081042-eff7692f9009/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200916030750-2334cc1a136f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200922070232-aee5d888a860/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200923182605-d9f96fdee20d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201101102859-da207088b7d1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201112073958-5cba982894dd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201117170446-d9b008d0a637/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201202213521-69691e467435/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210316164454-77fc1eacc6aa/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210426230700-d19ff857e887/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210906170528-6f6e22806c34/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211020174200-9d6173849985/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211103235746-7861aae1554b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211116061358-0a5406a5449c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220928140112-f11e5e49a4ec/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= -golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= -golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= -golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= -golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= -golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20220411224347-583f2d630306/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20220922220347-f3bd1da661af/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181011042414-1f849cf54d09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190706070813-72ffa07ba3db/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI= -golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200616133436-c1934b75d054/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200916195026-c9a70fc28ce3/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= -golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= -golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.2.0/go.mod h1:y4OqIKeOV/fWJetJ8bXPU1sEVniLMIyDAZWeHdV+NTA= -golang.org/x/tools v0.3.0/go.mod h1:/rWhSS2+zyEVwoJf8YAX6L2f0ntZ7Kn/mGgAWcipA5k= -golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= -gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0= -gonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0= -gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= -gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= -gonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY= -gonum.org/v1/plot v0.10.0/go.mod h1:JWIHJ7U20drSQb/aDpTetJzfC1KlAPldJLpkSy88dvQ= -google.golang.org/api v0.0.0-20160322025152-9bf6e6e569ff/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= -google.golang.org/api v0.0.0-20170206182103-3d017632ea10/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= -google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= -google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= -google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/cloud v0.0.0-20151119220103-975617b05ea8/go.mod h1:0H1ncTHf11KCFhTc/+EFRbzSCOZx+VUbRMk55Yv5MYk= -google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190522204451-c2c4e71fbf69/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= -google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200117163144-32f20d992d24/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= -google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= -google.golang.org/genproto v0.0.0-20200527145253-8367513e4ece/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= -google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= -google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201110150050-8816d57aaa9a/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20220502173005-c8bf987b8c21 h1:hrbNEivu7Zn1pxvHk6MBrq9iE22woVILTHqexqBxe6I= -google.golang.org/genproto v0.0.0-20220502173005-c8bf987b8c21/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/grpc v0.0.0-20160317175043-d3ddb4469d5a/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= -google.golang.org/grpc v0.0.0-20170208002647-2a6bf6142e96/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= -google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA= -google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= -google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= -google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= -google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.47.0 h1:9n77onPX5F3qfFCqjy9dhn8PbNQsIKeVU04J9G7umt8= -google.golang.org/grpc v1.47.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= -google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U= -gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= -gopkg.in/check.v1 v1.0.0-20141024133853-64131543e789/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= -gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo= -gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= -gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= -gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= -gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= -gopkg.in/square/go-jose.v2 v2.3.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= -gopkg.in/square/go-jose.v2 v2.5.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= -gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= -gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= -gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8= -gotest.tools/v3 v3.5.0/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= -honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -k8s.io/api v0.20.1/go.mod h1:KqwcCVogGxQY3nBlRpwt+wpAMF/KjaCc7RpywacvqUo= -k8s.io/api v0.20.4/go.mod h1:++lNL1AJMkDymriNniQsWRkMDzRaX2Y/POTUi8yvqYQ= -k8s.io/api v0.20.6/go.mod h1:X9e8Qag6JV/bL5G6bU8sdVRltWKmdHsFUGS3eVndqE8= -k8s.io/api v0.22.5/go.mod h1:mEhXyLaSD1qTOf40rRiKXkc+2iCem09rWLlFwhCEiAs= -k8s.io/apimachinery v0.20.1/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= -k8s.io/apimachinery v0.20.4/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= -k8s.io/apimachinery v0.20.6/go.mod h1:ejZXtW1Ra6V1O5H8xPBGz+T3+4gfkTCeExAHKU57MAc= -k8s.io/apimachinery v0.22.5/go.mod h1:xziclGKwuuJ2RM5/rSFQSYAj0zdbci3DH8kj+WvyN0U= -k8s.io/apiserver v0.20.1/go.mod h1:ro5QHeQkgMS7ZGpvf4tSMx6bBOgPfE+f52KwvXfScaU= -k8s.io/apiserver v0.20.4/go.mod h1:Mc80thBKOyy7tbvFtB4kJv1kbdD0eIH8k8vianJcbFM= -k8s.io/apiserver v0.20.6/go.mod h1:QIJXNt6i6JB+0YQRNcS0hdRHJlMhflFmsBDeSgT1r8Q= -k8s.io/apiserver v0.22.5/go.mod h1:s2WbtgZAkTKt679sYtSudEQrTGWUSQAPe6MupLnlmaQ= -k8s.io/client-go v0.20.1/go.mod h1:/zcHdt1TeWSd5HoUe6elJmHSQ6uLLgp4bIJHVEuy+/Y= -k8s.io/client-go v0.20.4/go.mod h1:LiMv25ND1gLUdBeYxBIwKpkSC5IsozMMmOOeSJboP+k= -k8s.io/client-go v0.20.6/go.mod h1:nNQMnOvEUEsOzRRFIIkdmYOjAZrC8bgq0ExboWSU1I0= -k8s.io/client-go v0.22.5/go.mod h1:cs6yf/61q2T1SdQL5Rdcjg9J1ElXSwbjSrW2vFImM4Y= -k8s.io/code-generator v0.19.7/go.mod h1:lwEq3YnLYb/7uVXLorOJfxg+cUu2oihFhHZ0n9NIla0= -k8s.io/component-base v0.20.1/go.mod h1:guxkoJnNoh8LNrbtiQOlyp2Y2XFCZQmrcg2n/DeYNLk= -k8s.io/component-base v0.20.4/go.mod h1:t4p9EdiagbVCJKrQ1RsA5/V4rFQNDfRlevJajlGwgjI= -k8s.io/component-base v0.20.6/go.mod h1:6f1MPBAeI+mvuts3sIdtpjljHWBQ2cIy38oBIWMYnrM= -k8s.io/component-base v0.22.5/go.mod h1:VK3I+TjuF9eaa+Ln67dKxhGar5ynVbwnGrUiNF4MqCI= -k8s.io/cri-api v0.17.3/go.mod h1:X1sbHmuXhwaHs9xxYffLqJogVsnI+f6cPRcgPel7ywM= -k8s.io/cri-api v0.20.1/go.mod h1:2JRbKt+BFLTjtrILYVqQK5jqhI+XNdF6UiGMgczeBCI= -k8s.io/cri-api v0.20.4/go.mod h1:2JRbKt+BFLTjtrILYVqQK5jqhI+XNdF6UiGMgczeBCI= -k8s.io/cri-api v0.20.6/go.mod h1:ew44AjNXwyn1s0U4xCKGodU7J1HzBeZ1MpGrpa5r8Yc= -k8s.io/cri-api v0.25.0/go.mod h1:J1rAyQkSJ2Q6I+aBMOVgg2/cbbebso6FNa0UagiR0kc= -k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/gengo v0.0.0-20200428234225-8167cfdcfc14/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/gengo v0.0.0-20201113003025-83324d819ded/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= -k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= -k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= -k8s.io/klog/v2 v2.4.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= -k8s.io/klog/v2 v2.30.0/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= -k8s.io/kube-openapi v0.0.0-20200805222855-6aeccd4b50c6/go.mod h1:UuqjUnNftUyPE5H64/qeyjQoUZhGpeFDVdxjTeEVN2o= -k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd/go.mod h1:WOJ3KddDSol4tAGcJo0Tvi+dK12EcqSLqcWsryKMpfM= -k8s.io/kubernetes v1.13.0/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk= -k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20210930125809-cb0fa318a74b/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -moul.io/http2curl v1.0.0/go.mod h1:f6cULg+e4Md/oW1cYmwW4IWQOVl2lGbmCNGOHvzX2kE= -rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= -rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= -rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.14/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.15/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= -sigs.k8s.io/structured-merge-diff/v4 v4.0.1/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/structured-merge-diff/v4 v4.0.3/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/structured-merge-diff/v4 v4.1.2/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4= -sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= -sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= From 245c39ddeab076777612cc8f84271b815896a46b Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Tue, 31 Oct 2023 15:04:25 +0100 Subject: [PATCH 111/387] simulators/ethereum/pyspec: module replacement to reference engine sim --- simulators/ethereum/pyspec/go.mod | 1 + 1 file changed, 1 insertion(+) diff --git a/simulators/ethereum/pyspec/go.mod b/simulators/ethereum/pyspec/go.mod index aaaa1e7a1e..297e62e531 100644 --- a/simulators/ethereum/pyspec/go.mod +++ b/simulators/ethereum/pyspec/go.mod @@ -70,3 +70,4 @@ require ( ) replace github.com/ethereum/go-ethereum => github.com/lightclient/go-ethereum v1.10.10-0.20231019143932-4d161dee0c4c +replace github.com/ethereum/hive/simulators/ethereum/engine => ../engine From 22b3bd74fb40466987eed757038c001d17e0020b Mon Sep 17 00:00:00 2001 From: spencer Date: Wed, 1 Nov 2023 09:32:03 -0600 Subject: [PATCH 112/387] simulators/ethereum/engine: Fix bugs for ForkID and Missing Ancenstor Tests (#936) --- .../ethereum/engine/suites/engine/fork_id.go | 14 ++++++++++++++ .../engine/suites/engine/invalid_ancestor.go | 6 ++++++ 2 files changed, 20 insertions(+) diff --git a/simulators/ethereum/engine/suites/engine/fork_id.go b/simulators/ethereum/engine/suites/engine/fork_id.go index 1606caf9a4..1cb92acde4 100644 --- a/simulators/ethereum/engine/suites/engine/fork_id.go +++ b/simulators/ethereum/engine/suites/engine/fork_id.go @@ -5,6 +5,7 @@ import ( "strings" "time" + "github.com/ethereum/go-ethereum/common" "github.com/ethereum/hive/simulators/ethereum/engine/clmock" "github.com/ethereum/hive/simulators/ethereum/engine/config" "github.com/ethereum/hive/simulators/ethereum/engine/devp2p" @@ -34,6 +35,19 @@ func (ft ForkIDSpec) GetName() string { return strings.Join(name, ", ") } +func (s ForkIDSpec) GetForkConfig() *config.ForkConfig { + forkConfig := s.BaseSpec.GetForkConfig() + if forkConfig == nil { + return nil + } + // Merge fork happen at block 0 + mainFork := s.GetMainFork() + if mainFork == config.Paris { + forkConfig.ParisNumber = common.Big0 + } + return forkConfig +} + func (ft ForkIDSpec) Execute(t *test.Env) { // Wait until TTD is reached by this client t.CLMock.WaitForTTD() diff --git a/simulators/ethereum/engine/suites/engine/invalid_ancestor.go b/simulators/ethereum/engine/suites/engine/invalid_ancestor.go index ca39d251d7..fb8882cfb5 100644 --- a/simulators/ethereum/engine/suites/engine/invalid_ancestor.go +++ b/simulators/ethereum/engine/suites/engine/invalid_ancestor.go @@ -359,6 +359,12 @@ func (tc InvalidMissingAncestorReOrgSyncTest) Execute(t *test.Env) { } }, }) + + if !tc.ReOrgFromCanonical { + // Add back the original client before side chain production + t.CLMock.AddEngineClient(t.Engine) + } + t.Log("INFO: Starting side chain production") t.CLMock.ProduceSingleBlock(clmock.BlockProcessCallbacks{ // Note: We perform the test in the middle of payload creation by the CL Mock, in order to be able to From 53ab10fbbf59e6fe420fafaf58ef8db84a974d6e Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Thu, 2 Nov 2023 12:06:58 +0000 Subject: [PATCH 113/387] clients/go-ethereum: use --state.scheme=path --- clients/go-ethereum/geth.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clients/go-ethereum/geth.sh b/clients/go-ethereum/geth.sh index c2e4dc15a0..1183dbe194 100644 --- a/clients/go-ethereum/geth.sh +++ b/clients/go-ethereum/geth.sh @@ -48,7 +48,7 @@ set -e geth=/usr/local/bin/geth -FLAGS="--pcscdpath=\"\"" +FLAGS="--state.scheme=path" if [ "$HIVE_LOGLEVEL" != "" ]; then FLAGS="$FLAGS --verbosity=$HIVE_LOGLEVEL" From 9598db0df436d49c2a829b9997187aed21bae518 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Thu, 2 Nov 2023 12:07:50 +0000 Subject: [PATCH 114/387] clients: remove unused HIVE_TESTNET variable --- clients/besu/besu.sh | 1 - clients/erigon/erigon.sh | 1 - clients/ethereumjs/ethereumjs.sh | 1 - clients/go-ethereum/geth.sh | 6 ------ clients/nethermind/nethermind.sh | 1 - clients/nimbus-el/nimbus.sh | 1 - clients/reth/reth.sh | 1 - 7 files changed, 12 deletions(-) diff --git a/clients/besu/besu.sh b/clients/besu/besu.sh index f74ab1f515..b483ed4363 100644 --- a/clients/besu/besu.sh +++ b/clients/besu/besu.sh @@ -40,7 +40,6 @@ # # These flags are not supported by the Besu hive client # -# - HIVE_TESTNET whether testnet nonces (2^20) are needed # - HIVE_FORK_DAO_VOTE whether the node support (or opposes) the DAO fork set -e diff --git a/clients/erigon/erigon.sh b/clients/erigon/erigon.sh index 2cd5d1874a..4613d22ff0 100644 --- a/clients/erigon/erigon.sh +++ b/clients/erigon/erigon.sh @@ -26,7 +26,6 @@ # # These flags are NOT supported by Erigon # -# - HIVE_TESTNET whether testnet nonces (2^20) are needed # - HIVE_GRAPHQL_ENABLED turns on GraphQL server # - HIVE_CLIQUE_PRIVATEKEY private key for clique mining # - HIVE_NODETYPE sync and pruning selector (archive, full, light) diff --git a/clients/ethereumjs/ethereumjs.sh b/clients/ethereumjs/ethereumjs.sh index 7cd7e5109d..f72c09b6f6 100644 --- a/clients/ethereumjs/ethereumjs.sh +++ b/clients/ethereumjs/ethereumjs.sh @@ -12,7 +12,6 @@ # # - HIVE_BOOTNODE enode URL of the remote bootstrap node # - HIVE_NETWORK_ID network ID number to use for the eth protocol -# - HIVE_TESTNET whether testnet nonces (2^20) are needed # - HIVE_NODETYPE sync and pruning selector (archive, full, light) # # Forks: diff --git a/clients/go-ethereum/geth.sh b/clients/go-ethereum/geth.sh index 1183dbe194..9f05cbc34e 100644 --- a/clients/go-ethereum/geth.sh +++ b/clients/go-ethereum/geth.sh @@ -13,7 +13,6 @@ # # - HIVE_BOOTNODE enode URL of the remote bootstrap node # - HIVE_NETWORK_ID network ID number to use for the eth protocol -# - HIVE_TESTNET whether testnet nonces (2^20) are needed # - HIVE_NODETYPE sync and pruning selector (archive, full, light) # # Forks: @@ -66,11 +65,6 @@ else FLAGS="$FLAGS --networkid 1337" fi -# If the client is to be run in testnet mode, flag it as such -if [ "$HIVE_TESTNET" == "1" ]; then - FLAGS="$FLAGS --testnet" -fi - # Handle any client mode or operation requests if [ "$HIVE_NODETYPE" == "archive" ]; then FLAGS="$FLAGS --syncmode full --gcmode archive" diff --git a/clients/nethermind/nethermind.sh b/clients/nethermind/nethermind.sh index 11fc9d7613..7a1844647a 100644 --- a/clients/nethermind/nethermind.sh +++ b/clients/nethermind/nethermind.sh @@ -43,7 +43,6 @@ # # - HIVE_FORK_DAO_VOTE whether the node support (or opposes) the DAO fork # - HIVE_GRAPHQL_ENABLED if set, GraphQL is enabled on port 8545 -# - HIVE_TESTNET whether testnet nonces (2^20) are needed # Immediately abort the script on any error encountered set -e diff --git a/clients/nimbus-el/nimbus.sh b/clients/nimbus-el/nimbus.sh index ce5d975765..446fdf5691 100644 --- a/clients/nimbus-el/nimbus.sh +++ b/clients/nimbus-el/nimbus.sh @@ -14,7 +14,6 @@ # - [x] HIVE_BOOTNODE enode URL of the remote bootstrap node # - [x] HIVE_NETWORK_ID network ID number to use for the eth protocol # - [x] HIVE_CHAIN_ID chain ID is used in transaction signature process -# - [ ] HIVE_TESTNET whether testnet nonces (2^20) are needed # - [ ] HIVE_NODETYPE sync and pruning selector (archive, full, light) # # Forks: diff --git a/clients/reth/reth.sh b/clients/reth/reth.sh index 0058f53f88..0468bc96ba 100644 --- a/clients/reth/reth.sh +++ b/clients/reth/reth.sh @@ -27,7 +27,6 @@ # # These flags are NOT supported by reth # -# - HIVE_TESTNET whether testnet nonces (2^20) are needed # - HIVE_GRAPHQL_ENABLED turns on GraphQL server # - HIVE_CLIQUE_PRIVATEKEY private key for clique mining # - HIVE_NODETYPE sync and pruning selector (archive, full, light) From b57cae8009accc64d8a79ed0783bcc73199fe17f Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Tue, 7 Nov 2023 11:53:00 +0100 Subject: [PATCH 115/387] docs: remove HIVE_SKIP_POW --- docs/clients.md | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/clients.md b/docs/clients.md index 61ef4e3dc7..46d3e71e3d 100644 --- a/docs/clients.md +++ b/docs/clients.md @@ -129,7 +129,6 @@ may map these to command line flags or use them to generate a config file, for e | `HIVE_MINER_EXTRA` | hex | extradata for mined blocks | | `HIVE_CLIQUE_PERIOD` | decimal | enables clique PoA. value is target block time | | `HIVE_CLIQUE_PRIVATEKEY` | hex | private key for signing of clique blocks | -| `HIVE_SKIP_POW` | 0 - 1 | disables PoW check during block import | | `HIVE_NETWORK_ID` | decimal | p2p network ID | | `HIVE_CHAIN_ID` | decimal | [EIP-155] chain ID | | `HIVE_FORK_HOMESTEAD` | decimal | [Homestead][EIP-606] transition block | From f01b2d361addbec888ec143b6e37eb35264ac152 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Tue, 7 Nov 2023 14:32:15 +0100 Subject: [PATCH 116/387] cmd/hivechain: disable difficulty-bomb-only forks --- cmd/hivechain/genesis.go | 8 ++------ cmd/hivechain/output_forkenv.go | 2 -- 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/cmd/hivechain/genesis.go b/cmd/hivechain/genesis.go index c482280268..35165d46f1 100644 --- a/cmd/hivechain/genesis.go +++ b/cmd/hivechain/genesis.go @@ -41,8 +41,8 @@ var ( "muirglacier", "berlin", "london", - "arrowglacier", - "grayglacier", + // "arrowglacier", "grayglacier" forks were difficulty bomb changes. They are not + // available here because hive doesn't support configuring them on clients. "merge", } @@ -98,10 +98,6 @@ func (cfg *generatorConfig) createChainConfig() *params.ChainConfig { chaincfg.BerlinBlock = new(big.Int).SetUint64(b) case "london": chaincfg.LondonBlock = new(big.Int).SetUint64(b) - case "arrowglacier": - chaincfg.ArrowGlacierBlock = new(big.Int).SetUint64(b) - case "grayglacier": - chaincfg.GrayGlacierBlock = new(big.Int).SetUint64(b) case "merge": chaincfg.MergeNetsplitBlock = new(big.Int).SetUint64(b) chaincfg.TerminalTotalDifficultyPassed = true diff --git a/cmd/hivechain/output_forkenv.go b/cmd/hivechain/output_forkenv.go index 25f7f65d40..7a2018e04f 100644 --- a/cmd/hivechain/output_forkenv.go +++ b/cmd/hivechain/output_forkenv.go @@ -40,8 +40,6 @@ func (g *generator) writeForkEnv() error { setNum("HIVE_FORK_PETERSBURG", cfg.PetersburgBlock) setNum("HIVE_FORK_ISTANBUL", cfg.IstanbulBlock) setNum("HIVE_FORK_MUIR_GLACIER", cfg.MuirGlacierBlock) - setNum("HIVE_FORK_ARROW_GLACIER", cfg.ArrowGlacierBlock) - setNum("HIVE_FORK_GRAY_GLACIER", cfg.GrayGlacierBlock) setNum("HIVE_FORK_BERLIN", cfg.BerlinBlock) setNum("HIVE_FORK_LONDON", cfg.LondonBlock) setNum("HIVE_MERGE_BLOCK_ID", cfg.MergeNetsplitBlock) From 8341f6f9a10377641ff5f25aa29cbe5d604f211a Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Tue, 7 Nov 2023 14:32:38 +0100 Subject: [PATCH 117/387] cmd/hivechain: remove HIVE_SKIP_POW in forkenv output --- cmd/hivechain/output_forkenv.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/cmd/hivechain/output_forkenv.go b/cmd/hivechain/output_forkenv.go index 7a2018e04f..32b21f911f 100644 --- a/cmd/hivechain/output_forkenv.go +++ b/cmd/hivechain/output_forkenv.go @@ -17,8 +17,6 @@ func (g *generator) writeForkEnv() error { // config consensus algorithm if cfg.Clique != nil { env["HIVE_CLIQUE_PERIOD"] = fmt.Sprint(cfg.Clique.Period) - } else { - env["HIVE_SKIP_POW"] = "1" } // forks From 431557d4c893e80cb798031a520d513660de9b83 Mon Sep 17 00:00:00 2001 From: Jochem Brouwer Date: Tue, 7 Nov 2023 20:26:44 +0100 Subject: [PATCH 118/387] clients/ethereumjs: verbose RPC logging (#939) --- clients/ethereumjs/ethereumjs.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clients/ethereumjs/ethereumjs.sh b/clients/ethereumjs/ethereumjs.sh index f72c09b6f6..9309c9b847 100644 --- a/clients/ethereumjs/ethereumjs.sh +++ b/clients/ethereumjs/ethereumjs.sh @@ -47,7 +47,7 @@ set -e ethereumjs="node /ethereumjs-monorepo/packages/client/dist/bin/cli.js" -FLAGS="--gethGenesis ./genesis.json --rpc --rpcEngine --saveReceipts --rpcAddr 0.0.0.0 --rpcEngineAddr 0.0.0.0 --rpcEnginePort 8551 --ws false --logLevel debug --rpcDebug --isSingleNode" +FLAGS="--gethGenesis ./genesis.json --rpc --rpcEngine --saveReceipts --rpcAddr 0.0.0.0 --rpcEngineAddr 0.0.0.0 --rpcEnginePort 8551 --ws false --logLevel debug --rpcDebug all --rpcDebugVerbose all --isSingleNode" # Configure the chain. mv /genesis.json /genesis-input.json From e4d92c4ab66d409f5d0e740a31f5b8f14c405497 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Wed, 8 Nov 2023 14:56:27 +0100 Subject: [PATCH 119/387] clients: add 'glacier' forks in mapper (#941) * clients/go-ethereum: remove 'yolo' fork blocks * clients/ethereumjs: remove 'yolo' forks in mapper * clients: add missing 'glacier' forks in mapper * cmd/hivechain: put back difficulty-only forks This reverts commit f01b2d361addbec888ec143b6e37eb35264ac152. * simulators/smoke: add 'glacier' forks * cmd/hivechain: improve uncle generation --- clients/besu/mapper.jq | 2 ++ clients/erigon/mapper.jq | 2 ++ clients/ethereumjs/mapper.jq | 4 ++-- clients/go-ethereum/mapper.jq | 4 ++-- clients/nethermind/mapper.jq | 2 ++ clients/nimbus-el/mapper.jq | 2 ++ cmd/hivechain/genesis.go | 8 ++++++-- cmd/hivechain/mod_uncles.go | 18 ++++++++++++------ cmd/hivechain/output_forkenv.go | 2 ++ simulators/smoke/genesis/main.go | 8 +++++--- 10 files changed, 37 insertions(+), 15 deletions(-) diff --git a/clients/besu/mapper.jq b/clients/besu/mapper.jq index a1d7de11cb..c498e5a6e3 100644 --- a/clients/besu/mapper.jq +++ b/clients/besu/mapper.jq @@ -43,6 +43,8 @@ def to_int: "muirGlacierBlock": env.HIVE_FORK_MUIR_GLACIER|to_int, "berlinBlock": env.HIVE_FORK_BERLIN|to_int, "londonBlock": env.HIVE_FORK_LONDON|to_int, + "arrowGlacierBlock": env.HIVE_FORK_ARROW_GLACIER|to_int, + "grayGlacierBlock": env.HIVE_FORK_GRAY_GLACIER|to_int, "parisBlock": env.HIVE_MERGE_BLOCK_ID|to_int, "terminalTotalDifficulty": env.HIVE_TERMINAL_TOTAL_DIFFICULTY|to_int, "shanghaiTime": env.HIVE_SHANGHAI_TIMESTAMP|to_int, diff --git a/clients/erigon/mapper.jq b/clients/erigon/mapper.jq index 6f9be7b87d..c68dca50d4 100644 --- a/clients/erigon/mapper.jq +++ b/clients/erigon/mapper.jq @@ -50,6 +50,8 @@ def to_bool: "muirGlacierBlock": env.HIVE_FORK_MUIR_GLACIER|to_int, "berlinBlock": env.HIVE_FORK_BERLIN|to_int, "londonBlock": env.HIVE_FORK_LONDON|to_int, + "arrowGlacierBlock": env.HIVE_FORK_ARROW_GLACIER|to_int, + "grayGlacierBlock": env.HIVE_FORK_GRAY_GLACIER|to_int, "mergeNetsplitBlock": env.HIVE_MERGE_BLOCK_ID|to_int, "terminalTotalDifficulty": env.HIVE_TERMINAL_TOTAL_DIFFICULTY|to_int, "terminalTotalDifficultyPassed": true, diff --git a/clients/ethereumjs/mapper.jq b/clients/ethereumjs/mapper.jq index e6737eba72..a45937029c 100644 --- a/clients/ethereumjs/mapper.jq +++ b/clients/ethereumjs/mapper.jq @@ -50,9 +50,9 @@ def to_bool: "istanbulBlock": env.HIVE_FORK_ISTANBUL|to_int, "muirGlacierBlock": env.HIVE_FORK_MUIR_GLACIER|to_int, "berlinBlock": env.HIVE_FORK_BERLIN|to_int, - "yolov2Block": env.HIVE_FORK_BERLIN|to_int, - "yolov3Block": env.HIVE_FORK_BERLIN|to_int, "londonBlock": env.HIVE_FORK_LONDON|to_int, + "arrowGlacierBlock": env.HIVE_FORK_ARROW_GLACIER|to_int, + "grayGlacierBlock": env.HIVE_FORK_GRAY_GLACIER|to_int, "mergeForkBlock": env.HIVE_MERGE_BLOCK_ID|to_int, "terminalTotalDifficulty": env.HIVE_TERMINAL_TOTAL_DIFFICULTY|to_int, "shanghaiTime": env.HIVE_SHANGHAI_TIMESTAMP|to_int, diff --git a/clients/go-ethereum/mapper.jq b/clients/go-ethereum/mapper.jq index 2e0ced8186..7e466ce338 100644 --- a/clients/go-ethereum/mapper.jq +++ b/clients/go-ethereum/mapper.jq @@ -49,9 +49,9 @@ def to_bool: "istanbulBlock": env.HIVE_FORK_ISTANBUL|to_int, "muirGlacierBlock": env.HIVE_FORK_MUIR_GLACIER|to_int, "berlinBlock": env.HIVE_FORK_BERLIN|to_int, - "yolov2Block": env.HIVE_FORK_BERLIN|to_int, - "yolov3Block": env.HIVE_FORK_BERLIN|to_int, "londonBlock": env.HIVE_FORK_LONDON|to_int, + "arrowGlacierBlock": env.HIVE_FORK_ARROW_GLACIER|to_int, + "grayGlacierBlock": env.HIVE_FORK_GRAY_GLACIER|to_int, "mergeNetsplitBlock": env.HIVE_MERGE_BLOCK_ID|to_int, "terminalTotalDifficulty": env.HIVE_TERMINAL_TOTAL_DIFFICULTY|to_int, "shanghaiTime": env.HIVE_SHANGHAI_TIMESTAMP|to_int, diff --git a/clients/nethermind/mapper.jq b/clients/nethermind/mapper.jq index eee6de93c3..be2d1028da 100644 --- a/clients/nethermind/mapper.jq +++ b/clients/nethermind/mapper.jq @@ -62,6 +62,8 @@ def ethash_engine: (env.HIVE_FORK_CONSTANTINOPLE|to_hex//""): 2000000, (env.HIVE_FORK_MUIR_GLACIER|to_hex//""): 4000000, (env.HIVE_FORK_LONDON|to_hex//""): 700000, + (env.HIVE_FORK_ARROW_GLACIER|to_hex//""): 1000000, + (env.HIVE_FORK_GRAY_GLACIER|to_hex//""): 700000, } } } diff --git a/clients/nimbus-el/mapper.jq b/clients/nimbus-el/mapper.jq index 5d3b42ca07..2c763f65fb 100644 --- a/clients/nimbus-el/mapper.jq +++ b/clients/nimbus-el/mapper.jq @@ -71,6 +71,8 @@ def to_bool: "muirGlacierBlock": env.HIVE_FORK_MUIR_GLACIER|to_int, "berlinBlock": env.HIVE_FORK_BERLIN|to_int, "londonBlock": env.HIVE_FORK_LONDON|to_int, + "arrowGlacierBlock": env.HIVE_FORK_ARROW_GLACIER|to_int, + "grayGlacierBlock": env.HIVE_FORK_GRAY_GLACIER|to_int, "mergeForkBlock": env.HIVE_MERGE_BLOCK_ID|to_int, "terminalTotalDifficulty": env.HIVE_TERMINAL_TOTAL_DIFFICULTY|to_int, "shanghaiTime": env.HIVE_SHANGHAI_TIMESTAMP|to_int, diff --git a/cmd/hivechain/genesis.go b/cmd/hivechain/genesis.go index 35165d46f1..c482280268 100644 --- a/cmd/hivechain/genesis.go +++ b/cmd/hivechain/genesis.go @@ -41,8 +41,8 @@ var ( "muirglacier", "berlin", "london", - // "arrowglacier", "grayglacier" forks were difficulty bomb changes. They are not - // available here because hive doesn't support configuring them on clients. + "arrowglacier", + "grayglacier", "merge", } @@ -98,6 +98,10 @@ func (cfg *generatorConfig) createChainConfig() *params.ChainConfig { chaincfg.BerlinBlock = new(big.Int).SetUint64(b) case "london": chaincfg.LondonBlock = new(big.Int).SetUint64(b) + case "arrowglacier": + chaincfg.ArrowGlacierBlock = new(big.Int).SetUint64(b) + case "grayglacier": + chaincfg.GrayGlacierBlock = new(big.Int).SetUint64(b) case "merge": chaincfg.MergeNetsplitBlock = new(big.Int).SetUint64(b) chaincfg.TerminalTotalDifficultyPassed = true diff --git a/cmd/hivechain/mod_uncles.go b/cmd/hivechain/mod_uncles.go index 20c23afba2..8f9a215795 100644 --- a/cmd/hivechain/mod_uncles.go +++ b/cmd/hivechain/mod_uncles.go @@ -26,27 +26,33 @@ type unclesInfo struct { } func (m *modUncles) apply(ctx *genBlockContext) bool { - merge := ctx.ChainConfig().MergeNetsplitBlock - if merge != nil && merge.Cmp(ctx.Number()) <= 0 { - return false // no uncles after merge - } - if ctx.NumberU64() < 3 { + cfg := ctx.ChainConfig() + merged := cfg.MergeNetsplitBlock != nil && cfg.MergeNetsplitBlock.Cmp(ctx.Number()) <= 0 + if merged || cfg.Ethash == nil || ctx.NumberU64() < 3 { return false } + info := m.info[ctx.NumberU64()] if len(info.Hashes) >= 2 { - return false + return false // block has enough uncles already } parent := ctx.ParentBlock() + time := parent.Time() + 1 uncle := &types.Header{ Number: parent.Number(), ParentHash: parent.ParentHash(), + Time: time, Extra: []byte(fmt.Sprintf("hivechain uncle %d", m.counter)), } + // Initialize the remaining remaining header fields by converting to a full block. ub := types.NewBlock(uncle, nil, nil, nil, trie.NewStackTrie(nil)) uncle = ub.Header() + + // Add the uncle to the generated block. + // Note that AddUncle computes the difficulty and gas limit for us. ctx.block.AddUncle(uncle) + info.Hashes = append(info.Hashes, uncle.Hash()) m.info[ctx.NumberU64()] = info m.counter++ diff --git a/cmd/hivechain/output_forkenv.go b/cmd/hivechain/output_forkenv.go index 32b21f911f..bf3d36ff92 100644 --- a/cmd/hivechain/output_forkenv.go +++ b/cmd/hivechain/output_forkenv.go @@ -38,6 +38,8 @@ func (g *generator) writeForkEnv() error { setNum("HIVE_FORK_PETERSBURG", cfg.PetersburgBlock) setNum("HIVE_FORK_ISTANBUL", cfg.IstanbulBlock) setNum("HIVE_FORK_MUIR_GLACIER", cfg.MuirGlacierBlock) + setNum("HIVE_FORK_ARROW_GLACIER", cfg.ArrowGlacierBlock) + setNum("HIVE_FORK_GRAY_GLACIER", cfg.GrayGlacierBlock) setNum("HIVE_FORK_BERLIN", cfg.BerlinBlock) setNum("HIVE_FORK_LONDON", cfg.LondonBlock) setNum("HIVE_MERGE_BLOCK_ID", cfg.MergeNetsplitBlock) diff --git a/simulators/smoke/genesis/main.go b/simulators/smoke/genesis/main.go index 39a007a535..f79cf139ec 100644 --- a/simulators/smoke/genesis/main.go +++ b/simulators/smoke/genesis/main.go @@ -38,9 +38,11 @@ func main() { "HIVE_FORK_MUIR_GLACIER": "19", "HIVE_FORK_BERLIN": "20", "HIVE_FORK_LONDON": "21", - "HIVE_TERMINAL_TOTAL_DIFFICULTY": "22", - "HIVE_SHANGHAI_TIMESTAMP": "23", - "HIVE_CANCUN_TIMESTAMP": "24", + "HIVE_FORK_ARROW_GLACIER": "22", + "HIVE_FORK_GRAY_GLACIER": "23", + "HIVE_TERMINAL_TOTAL_DIFFICULTY": "24", + "HIVE_SHANGHAI_TIMESTAMP": "25", + "HIVE_CANCUN_TIMESTAMP": "26", }, Run: genesisTest{"0x433d0b859a77a29753d2a6df477c971dcc6300af33f9d64d821a1d490b4148b1"}.test, }) From 900b75d75fe681b72be1a5f9025cc3e89c80b714 Mon Sep 17 00:00:00 2001 From: Mario Vega Date: Sat, 11 Nov 2023 05:54:52 -0600 Subject: [PATCH 120/387] hive: add --sim.randomseed flag (#943) --- docs/commandline.md | 4 ++++ docs/simulators.md | 1 + hive.go | 2 ++ internal/libhive/run.go | 1 + internal/libhive/testmanager.go | 1 + 5 files changed, 9 insertions(+) diff --git a/docs/commandline.md b/docs/commandline.md index 61af913d24..fde5f9a73c 100644 --- a/docs/commandline.md +++ b/docs/commandline.md @@ -122,6 +122,10 @@ This sets the default value of `HIVE_LOGLEVEL` in client containers. interpreted by simulators. It sets the `HIVE_PARALLELISM` environment variable. Defaults to 1. +`--sim.randomseed `: Sets a fixed number as the randomness seed to be used by all +simulators. It sets the `HIVE_RANDOM_SEED` environment variable. Defaults to zero, which +translates being unset and the simulators decide the source of randomness. + ## Viewing simulation results (hiveview) The results of hive simulation runs are stored in JSON files containing test results, and diff --git a/docs/simulators.md b/docs/simulators.md index 7acdaa492c..f38ff84e89 100644 --- a/docs/simulators.md +++ b/docs/simulators.md @@ -95,6 +95,7 @@ This is the list of all environment variables that hive sets when launching simu | `HIVE_SIMULATOR` | URL of the API server | | | `HIVE_TEST_PATTERN` | Regular expression, selects suites/tests | `--sim.limit` | | `HIVE_PARALLELISM` | Integer, sets test concurrency | `--sim.parallelism` | +| `HIVE_RANDOM_SEED` | Integer, sets simulator random seed number | `--sim.randomseed` | | `HIVE_LOGLEVEL` | Decimal 0-5, configures simulator log levels | `--sim.loglevel` | ## Writing Simulators in Go diff --git a/hive.go b/hive.go index e5c982d71b..b6bda9a755 100644 --- a/hive.go +++ b/hive.go @@ -27,6 +27,7 @@ func main() { simPattern = flag.String("sim", "", "Regular `expression` selecting the simulators to run.") simTestPattern = flag.String("sim.limit", "", "Regular `expression` selecting tests/suites (interpreted by simulators).") simParallelism = flag.Int("sim.parallelism", 1, "Max `number` of parallel clients/containers (interpreted by simulators).") + simRandomSeed = flag.Int("sim.randomseed", 0, "Randomness seed number (interpreted by simulators).") simTestLimit = flag.Int("sim.testlimit", 0, "[DEPRECATED] Max `number` of tests to execute per client (interpreted by simulators).") simTimeLimit = flag.Duration("sim.timelimit", 0, "Simulation `timeout`. Hive aborts the simulator if it exceeds this time.") simLogLevel = flag.Int("sim.loglevel", 3, "Selects log `level` of client instances. Supports values 0-5.") @@ -110,6 +111,7 @@ func main() { SimLogLevel: *simLogLevel, SimTestPattern: *simTestPattern, SimParallelism: *simParallelism, + SimRandomSeed: *simRandomSeed, SimDurationLimit: *simTimeLimit, ClientStartTimeout: *clientTimeout, } diff --git a/internal/libhive/run.go b/internal/libhive/run.go index 42b985e834..b01229642d 100644 --- a/internal/libhive/run.go +++ b/internal/libhive/run.go @@ -205,6 +205,7 @@ func (r *Runner) run(ctx context.Context, sim string, env SimEnv) (SimResult, er "HIVE_PARALLELISM": strconv.Itoa(env.SimParallelism), "HIVE_LOGLEVEL": strconv.Itoa(env.SimLogLevel), "HIVE_TEST_PATTERN": env.SimTestPattern, + "HIVE_RANDOM_SEED": strconv.Itoa(env.SimRandomSeed), }, } containerID, err := r.container.CreateContainer(ctx, r.simImages[sim], opts) diff --git a/internal/libhive/testmanager.go b/internal/libhive/testmanager.go index 18d5ffedae..fe7bc6a0cf 100644 --- a/internal/libhive/testmanager.go +++ b/internal/libhive/testmanager.go @@ -34,6 +34,7 @@ type SimEnv struct { // Parameters of simulation. SimLogLevel int SimParallelism int + SimRandomSeed int SimTestPattern string // This is the time limit for the simulation run. From d2ed863fd2e117cc97659767c3db03dfe9fabe06 Mon Sep 17 00:00:00 2001 From: Mario Vega Date: Wed, 15 Nov 2023 16:04:10 -0600 Subject: [PATCH 121/387] simulators/ethereum/engine: Add randomness seed input (#944) * simulators/ethereum/engine: randomness seed input * simulators/ethereum/engine: Handle zero HIVE_RANDOM_SEED --- simulators/ethereum/engine/clmock/clmock.go | 13 ++++--- .../ethereum/engine/helper/customizer.go | 34 +++++++++---------- simulators/ethereum/engine/main.go | 14 +++++++- .../ethereum/engine/suites/cancun/steps.go | 7 ++-- .../ethereum/engine/suites/engine/bad_hash.go | 7 ++-- .../engine/suites/engine/forkchoice.go | 5 ++- .../engine/suites/engine/invalid_ancestor.go | 8 ++--- .../engine/suites/engine/invalid_payload.go | 6 ++-- .../suites/engine/payload_attributes.go | 3 +- .../engine/suites/engine/payload_execution.go | 13 ++++--- .../ethereum/engine/suites/engine/reorg.go | 19 +++++------ .../suites/engine/suggested_fee_recipient.go | 5 ++- .../ethereum/engine/suites/sync/tests.go | 3 +- .../engine/suites/withdrawals/tests.go | 30 ++++++++-------- simulators/ethereum/engine/test/env.go | 8 ++++- 15 files changed, 94 insertions(+), 81 deletions(-) diff --git a/simulators/ethereum/engine/clmock/clmock.go b/simulators/ethereum/engine/clmock/clmock.go index 61ae26b235..b58c5aa18a 100644 --- a/simulators/ethereum/engine/clmock/clmock.go +++ b/simulators/ethereum/engine/clmock/clmock.go @@ -125,14 +125,12 @@ type CLMocker struct { // Global context which all procedures shall stop TestContext context.Context TimeoutContext context.Context -} -func NewCLMocker(t *hivesim.T, genesis *core.Genesis, forkConfig *config.ForkConfig) *CLMocker { - // Init random seed for different purposes - seed := time.Now().Unix() - t.Logf("Randomness seed: %v\n", seed) - rand.Seed(seed) + // Randomness source used to generate prevRandao + Rand *rand.Rand +} +func NewCLMocker(t *hivesim.T, genesis *core.Genesis, forkConfig *config.ForkConfig, randSource *rand.Rand) *CLMocker { // Create the new CL mocker newCLMocker := &CLMocker{ T: t, @@ -161,6 +159,7 @@ func NewCLMocker(t *hivesim.T, genesis *core.Genesis, forkConfig *config.ForkCon ForkConfig: forkConfig, Genesis: genesis, TestContext: context.Background(), + Rand: randSource, } // Create header history @@ -420,7 +419,7 @@ func TimestampToBeaconRoot(timestamp uint64) common.Hash { func (cl *CLMocker) GeneratePayloadAttributes() { // Generate a random value for the PrevRandao field nextPrevRandao := common.Hash{} - rand.Read(nextPrevRandao[:]) + cl.Rand.Read(nextPrevRandao[:]) cl.LatestPayloadAttributes = typ.PayloadAttributes{ Random: nextPrevRandao, diff --git a/simulators/ethereum/engine/helper/customizer.go b/simulators/ethereum/engine/helper/customizer.go index ac496e11da..b3b60af8c4 100644 --- a/simulators/ethereum/engine/helper/customizer.go +++ b/simulators/ethereum/engine/helper/customizer.go @@ -209,17 +209,17 @@ func (customizer *DowngradeForkchoiceUpdatedVersion) ForkchoiceUpdatedVersion(he var _ ForkchoiceUpdatedCustomizer = (*DowngradeForkchoiceUpdatedVersion)(nil) type PayloadCustomizer interface { - CustomizePayload(basePayload *typ.ExecutableData) (*typ.ExecutableData, error) + CustomizePayload(randSource *rand.Rand, basePayload *typ.ExecutableData) (*typ.ExecutableData, error) GetTimestamp(basePayload *typ.ExecutableData) (uint64, error) } type VersionedHashesCustomizer interface { - GetVersionedHashes(baseVesionedHashes *[]common.Hash) (*[]common.Hash, error) + GetVersionedHashes(randSource *rand.Rand, baseVesionedHashes *[]common.Hash) (*[]common.Hash, error) } type IncreaseVersionVersionedHashes struct{} -func (customizer *IncreaseVersionVersionedHashes) GetVersionedHashes(baseVesionedHashes *[]common.Hash) (*[]common.Hash, error) { +func (customizer *IncreaseVersionVersionedHashes) GetVersionedHashes(_ *rand.Rand, baseVesionedHashes *[]common.Hash) (*[]common.Hash, error) { if baseVesionedHashes == nil { return nil, fmt.Errorf("no versioned hashes available for modification") } @@ -236,7 +236,7 @@ func (customizer *IncreaseVersionVersionedHashes) GetVersionedHashes(baseVesione type CorruptVersionedHashes struct{} -func (customizer *CorruptVersionedHashes) GetVersionedHashes(baseVesionedHashes *[]common.Hash) (*[]common.Hash, error) { +func (customizer *CorruptVersionedHashes) GetVersionedHashes(_ *rand.Rand, baseVesionedHashes *[]common.Hash) (*[]common.Hash, error) { if baseVesionedHashes == nil { return nil, fmt.Errorf("no versioned hashes available for modification") } @@ -253,7 +253,7 @@ func (customizer *CorruptVersionedHashes) GetVersionedHashes(baseVesionedHashes type RemoveVersionedHash struct{} -func (customizer *RemoveVersionedHash) GetVersionedHashes(baseVesionedHashes *[]common.Hash) (*[]common.Hash, error) { +func (customizer *RemoveVersionedHash) GetVersionedHashes(_ *rand.Rand, baseVesionedHashes *[]common.Hash) (*[]common.Hash, error) { if baseVesionedHashes == nil { return nil, fmt.Errorf("no versioned hashes available for modification") } @@ -272,14 +272,14 @@ func (customizer *RemoveVersionedHash) GetVersionedHashes(baseVesionedHashes *[] type ExtraVersionedHash struct{} -func (customizer *ExtraVersionedHash) GetVersionedHashes(baseVesionedHashes *[]common.Hash) (*[]common.Hash, error) { +func (customizer *ExtraVersionedHash) GetVersionedHashes(randSource *rand.Rand, baseVesionedHashes *[]common.Hash) (*[]common.Hash, error) { if baseVesionedHashes == nil { return nil, fmt.Errorf("no versioned hashes available for modification") } result := make([]common.Hash, len(*baseVesionedHashes)+1) copy(result, *baseVesionedHashes) extraHash := common.Hash{} - rand.Read(extraHash[:]) + randSource.Read(extraHash[:]) extraHash[0] = cancun.BLOB_COMMITMENT_VERSION_KZG result[len(result)-1] = extraHash @@ -330,7 +330,7 @@ func (customData *CustomPayloadData) GetTimestamp(basePayload *typ.ExecutableDat // Construct a customized payload by taking an existing payload as base and mixing it CustomPayloadData // BlockHash is calculated automatically. -func (customData *CustomPayloadData) CustomizePayload(basePayload *typ.ExecutableData) (*typ.ExecutableData, error) { +func (customData *CustomPayloadData) CustomizePayload(randSource *rand.Rand, basePayload *typ.ExecutableData) (*typ.ExecutableData, error) { txs := basePayload.Transactions if customData.Transactions != nil { txs = *customData.Transactions @@ -460,7 +460,7 @@ func (customData *CustomPayloadData) CustomizePayload(basePayload *typ.Executabl } if customData.VersionedHashesCustomizer != nil { - result.VersionedHashes, err = customData.VersionedHashesCustomizer.GetVersionedHashes(basePayload.VersionedHashes) + result.VersionedHashes, err = customData.VersionedHashesCustomizer.GetVersionedHashes(randSource, basePayload.VersionedHashes) if err != nil { return nil, err } @@ -486,11 +486,11 @@ func (customizer *BaseNewPayloadVersionCustomizer) SetEngineAPIVersionResolver(v customizer.EngineAPIVersionResolver = v } -func (customNewPayload *BaseNewPayloadVersionCustomizer) CustomizePayload(basePayload *typ.ExecutableData) (*typ.ExecutableData, error) { +func (customNewPayload *BaseNewPayloadVersionCustomizer) CustomizePayload(randSource *rand.Rand, basePayload *typ.ExecutableData) (*typ.ExecutableData, error) { if customNewPayload.PayloadCustomizer == nil { return basePayload, nil } - return customNewPayload.PayloadCustomizer.CustomizePayload(basePayload) + return customNewPayload.PayloadCustomizer.CustomizePayload(randSource, basePayload) } func (customNewPayload *BaseNewPayloadVersionCustomizer) GetExpectedError() (*int, error) { @@ -527,7 +527,7 @@ func (customNewPayload *DowngradeNewPayloadVersion) NewPayloadVersion(timestamp return version - 1 } -func CustomizePayloadTransactions(basePayload *typ.ExecutableData, customTransactions types.Transactions) (*typ.ExecutableData, error) { +func CustomizePayloadTransactions(randSource *rand.Rand, basePayload *typ.ExecutableData, customTransactions types.Transactions) (*typ.ExecutableData, error) { byteTxs := make([][]byte, 0) for _, tx := range customTransactions { bytes, err := tx.MarshalBinary() @@ -538,7 +538,7 @@ func CustomizePayloadTransactions(basePayload *typ.ExecutableData, customTransac } return (&CustomPayloadData{ Transactions: &byteTxs, - }).CustomizePayload(basePayload) + }).CustomizePayload(randSource, basePayload) } func (customData *CustomPayloadData) String() string { @@ -590,7 +590,7 @@ func (customData *CustomPayloadData) String() string { // This function generates an invalid payload by taking a base payload and modifying the specified field such that it ends up being invalid. // One small consideration is that the payload needs to contain transactions and specially transactions using the PREVRANDAO opcode for all the fields to be compatible with this function. -func GenerateInvalidPayload(basePayload *typ.ExecutableData, payloadField InvalidPayloadBlockField) (*typ.ExecutableData, error) { +func GenerateInvalidPayload(randSource *rand.Rand, basePayload *typ.ExecutableData, payloadField InvalidPayloadBlockField) (*typ.ExecutableData, error) { var customPayloadMod *CustomPayloadData switch payloadField { @@ -636,7 +636,7 @@ func GenerateInvalidPayload(basePayload *typ.ExecutableData, payloadField Invali // This option potentially requires a transaction that uses the PREVRANDAO opcode. // Otherwise the payload will still be valid. modPrevRandao := common.Hash{} - rand.Read(modPrevRandao[:]) + randSource.Read(modPrevRandao[:]) customPayloadMod = &CustomPayloadData{ PrevRandao: &modPrevRandao, } @@ -781,7 +781,7 @@ func GenerateInvalidPayload(basePayload *typ.ExecutableData, payloadField Invali return ©Payload, nil } - return customPayloadMod.CustomizePayload(basePayload) + return customPayloadMod.CustomizePayload(randSource, basePayload) } /* @@ -789,7 +789,7 @@ func GenerateInvalidPayload(basePayload *typ.ExecutableData, payloadField Invali amounts and accounts, but the order in the list is different, so stateRoot of the resulting payload should be the same. */ -func RandomizeWithdrawalsOrder(src types.Withdrawals) types.Withdrawals { +func RandomizeWithdrawalsOrder(rand *rand.Rand, src types.Withdrawals) types.Withdrawals { dest := make(types.Withdrawals, len(src)) perm := rand.Perm(len(src)) for i, v := range perm { diff --git a/simulators/ethereum/engine/main.go b/simulators/ethereum/engine/main.go index b10a279afd..115a3bc51d 100644 --- a/simulators/ethereum/engine/main.go +++ b/simulators/ethereum/engine/main.go @@ -3,6 +3,7 @@ package main import ( "fmt" "math/big" + "math/rand" "os" "strconv" "sync" @@ -105,7 +106,17 @@ func makeRunner(tests []test.Spec, nodeType string) func(t *hivesim.T) { parallelism = p } } - t.Log("parallelism:", parallelism) + t.Log("parallelism", parallelism) + + random_seed := time.Now().Unix() + if val, ok := os.LookupEnv("HIVE_RANDOM_SEED"); ok { + if p, err := strconv.Atoi(val); err != nil { + t.Logf("Warning: invalid HIVE_RANDOM_SEED value %q", val) + } else if p > 0 { + random_seed = int64(p) + } + } + t.Log("random_seed", random_seed) var wg sync.WaitGroup var testCh = make(chan hivesim.TestSpec) @@ -214,6 +225,7 @@ func makeRunner(tests []test.Spec, nodeType string) func(t *hivesim.T) { t, c, genesis, + rand.New(rand.NewSource(random_seed)), newParams, testFiles, ) diff --git a/simulators/ethereum/engine/suites/cancun/steps.go b/simulators/ethereum/engine/suites/cancun/steps.go index 6c3ab0f67f..aa2df45baf 100644 --- a/simulators/ethereum/engine/suites/cancun/steps.go +++ b/simulators/ethereum/engine/suites/cancun/steps.go @@ -5,6 +5,7 @@ import ( "context" "fmt" "math/big" + "math/rand" "sync" "time" @@ -144,7 +145,7 @@ type VersionedHashes struct { HashVersions []byte } -func (v *VersionedHashes) GetVersionedHashes(*[]common.Hash) (*[]common.Hash, error) { +func (v *VersionedHashes) GetVersionedHashes(_ *rand.Rand, _ *[]common.Hash) (*[]common.Hash, error) { if v.Blobs == nil { return nil, nil } @@ -518,7 +519,7 @@ func (step NewPayloads) Execute(t *CancunTestContext) error { step.NewPayloadCustomizer.SetEngineAPIVersionResolver(t.ForkConfig) testEngine := t.TestEngine.WithEngineAPIVersionResolver(step.NewPayloadCustomizer) - payload, err = step.NewPayloadCustomizer.CustomizePayload(payload) + payload, err = step.NewPayloadCustomizer.CustomizePayload(t.Rand, payload) if err != nil { t.Fatalf("FAIL: Error customizing payload (payload %d/%d): %v", p+1, payloadCount, err) } @@ -714,7 +715,7 @@ func (step SendModifiedLatestPayload) Execute(t *CancunTestContext) error { // Send a custom new payload step.NewPayloadCustomizer.SetEngineAPIVersionResolver(t.ForkConfig) - payload, err = step.NewPayloadCustomizer.CustomizePayload(payload) + payload, err = step.NewPayloadCustomizer.CustomizePayload(t.Rand, payload) if err != nil { t.Fatalf("FAIL: Error customizing payload: %v", err) } diff --git a/simulators/ethereum/engine/suites/engine/bad_hash.go b/simulators/ethereum/engine/suites/engine/bad_hash.go index f484843cf8..478f68097f 100644 --- a/simulators/ethereum/engine/suites/engine/bad_hash.go +++ b/simulators/ethereum/engine/suites/engine/bad_hash.go @@ -2,7 +2,6 @@ package suite_engine import ( "fmt" - "math/rand" api "github.com/ethereum/go-ethereum/beacon/engine" "github.com/ethereum/go-ethereum/common" @@ -84,7 +83,7 @@ func (b BadHashOnNewPayload) Execute(t *test.Env) { } else if b.Syncing { // We need to send an fcU to put the client in SYNCING state. randomHeadBlock := common.Hash{} - rand.Read(randomHeadBlock[:]) + t.Rand.Read(randomHeadBlock[:]) fcU := api.ForkchoiceStateV1{ HeadBlockHash: randomHeadBlock, SafeBlockHash: t.CLMock.LatestHeader.Hash(), @@ -125,7 +124,7 @@ func (b BadHashOnNewPayload) Execute(t *test.Env) { customizer := &helper.CustomPayloadData{ ParentHash: &alteredPayload.BlockHash, } - alteredPayload, err := customizer.CustomizePayload(&t.CLMock.LatestPayloadBuilt) + alteredPayload, err := customizer.CustomizePayload(t.Rand, &t.CLMock.LatestPayloadBuilt) if err != nil { t.Fatalf("FAIL (%s): Unable to modify payload: %v", t.TestName, err) } @@ -177,7 +176,7 @@ func (b ParentHashOnNewPayload) Execute(t *test.Env) { alteredPayload := t.CLMock.LatestPayloadBuilt if b.Syncing { // Parent hash is unknown but also (incorrectly) set as the block hash - rand.Read(alteredPayload.ParentHash[:]) + t.Rand.Read(alteredPayload.ParentHash[:]) } alteredPayload.BlockHash = alteredPayload.ParentHash // Execution specification:: diff --git a/simulators/ethereum/engine/suites/engine/forkchoice.go b/simulators/ethereum/engine/suites/engine/forkchoice.go index e5f40c0674..81ef794143 100644 --- a/simulators/ethereum/engine/suites/engine/forkchoice.go +++ b/simulators/ethereum/engine/suites/engine/forkchoice.go @@ -2,7 +2,6 @@ package suite_engine import ( "fmt" - "math/rand" api "github.com/ethereum/go-ethereum/beacon/engine" "github.com/ethereum/go-ethereum/common" @@ -52,7 +51,7 @@ func (tc InconsistentForkchoiceTest) Execute(t *test.Env) { if len(alternativePayloads) > 0 { customData.ParentHash = &alternativePayloads[len(alternativePayloads)-1].BlockHash } - alternativePayload, err := customData.CustomizePayload(&t.CLMock.LatestPayloadBuilt) + alternativePayload, err := customData.CustomizePayload(t.Rand, &t.CLMock.LatestPayloadBuilt) if err != nil { t.Fatalf("FAIL (%s): Unable to construct alternative payload: %v", t.TestName, err) } @@ -112,7 +111,7 @@ func (tc ForkchoiceUpdatedUnknownBlockHashTest) Execute(t *test.Env) { // Generate a random block hash randomBlockHash := common.Hash{} - rand.Read(randomBlockHash[:]) + t.Rand.Read(randomBlockHash[:]) if tc.Field == HeadBlockHash { diff --git a/simulators/ethereum/engine/suites/engine/invalid_ancestor.go b/simulators/ethereum/engine/suites/engine/invalid_ancestor.go index fb8882cfb5..be0c378e30 100644 --- a/simulators/ethereum/engine/suites/engine/invalid_ancestor.go +++ b/simulators/ethereum/engine/suites/engine/invalid_ancestor.go @@ -106,12 +106,12 @@ func (tc InvalidMissingAncestorReOrgTest) Execute(t *test.Env) { ParentHash: &altChainPayloads[len(altChainPayloads)-1].BlockHash, ExtraData: &([]byte{0x01}), } - sidePayload, err = customizer.CustomizePayload(&t.CLMock.LatestPayloadBuilt) + sidePayload, err = customizer.CustomizePayload(t.Rand, &t.CLMock.LatestPayloadBuilt) if err != nil { t.Fatalf("FAIL (%s): Unable to customize payload: %v", t.TestName, err) } if len(altChainPayloads) == tc.InvalidIndex { - sidePayload, err = helper.GenerateInvalidPayload(sidePayload, tc.InvalidField) + sidePayload, err = helper.GenerateInvalidPayload(t.Rand, sidePayload, tc.InvalidField) if err != nil { t.Fatalf("FAIL (%s): Unable to customize payload: %v", t.TestName, err) } @@ -321,12 +321,12 @@ func (tc InvalidMissingAncestorReOrgSyncTest) Execute(t *test.Env) { ParentHash: &pHash, ExtraData: &([]byte{0x01}), } - sidePayload, err = customizer.CustomizePayload(&t.CLMock.LatestPayloadBuilt) + sidePayload, err = customizer.CustomizePayload(t.Rand, &t.CLMock.LatestPayloadBuilt) if err != nil { t.Fatalf("FAIL (%s): Unable to customize payload: %v", t.TestName, err) } if len(altChainPayloads) == tc.InvalidIndex { - sidePayload, err = helper.GenerateInvalidPayload(sidePayload, tc.InvalidField) + sidePayload, err = helper.GenerateInvalidPayload(t.Rand, sidePayload, tc.InvalidField) if err != nil { t.Fatalf("FAIL (%s): Unable to customize payload: %v", t.TestName, err) } diff --git a/simulators/ethereum/engine/suites/engine/invalid_payload.go b/simulators/ethereum/engine/suites/engine/invalid_payload.go index d38856eee3..f148dbe60f 100644 --- a/simulators/ethereum/engine/suites/engine/invalid_payload.go +++ b/simulators/ethereum/engine/suites/engine/invalid_payload.go @@ -136,7 +136,7 @@ func (tc InvalidPayloadTestCase) Execute(t *test.Env) { t.Fatalf("FAIL (%s): No transactions in the base payload", t.TestName) } - alteredPayload, err = helper.GenerateInvalidPayload(&t.CLMock.LatestPayloadBuilt, tc.InvalidField) + alteredPayload, err = helper.GenerateInvalidPayload(t.Rand, &t.CLMock.LatestPayloadBuilt, tc.InvalidField) if err != nil { t.Fatalf("FAIL (%s): Unable to modify payload (%v): %v", t.TestName, tc.InvalidField, err) } @@ -283,7 +283,7 @@ func (tc InvalidPayloadTestCase) Execute(t *test.Env) { } followUpAlteredPayload, err := (&helper.CustomPayloadData{ ParentHash: &alteredPayload.BlockHash, - }).CustomizePayload(&t.CLMock.LatestPayloadBuilt) + }).CustomizePayload(t.Rand, &t.CLMock.LatestPayloadBuilt) if err != nil { t.Fatalf("FAIL (%s): Unable to modify payload: %v", t.TestName, err) } @@ -376,7 +376,7 @@ func (tc PayloadBuildAfterInvalidPayloadTest) Execute(t *test.Env) { ) s.ExpectNoError() - inv_p, err = helper.GenerateInvalidPayload(&s.Payload, helper.InvalidStateRoot) + inv_p, err = helper.GenerateInvalidPayload(t.Rand, &s.Payload, helper.InvalidStateRoot) if err != nil { t.Fatalf("FAIL (%s): Unable to invalidate payload: %v", t.TestName, err) } diff --git a/simulators/ethereum/engine/suites/engine/payload_attributes.go b/simulators/ethereum/engine/suites/engine/payload_attributes.go index 9bbdeedb35..0f246a50ce 100644 --- a/simulators/ethereum/engine/suites/engine/payload_attributes.go +++ b/simulators/ethereum/engine/suites/engine/payload_attributes.go @@ -2,7 +2,6 @@ package suite_engine import ( "fmt" - "math/rand" "github.com/ethereum/hive/simulators/ethereum/engine/clmock" "github.com/ethereum/hive/simulators/ethereum/engine/config" @@ -48,7 +47,7 @@ func (tc InvalidPayloadAttributesTest) Execute(t *test.Env) { fcu := t.CLMock.LatestForkchoice if tc.Syncing { // Setting a random hash will put the client into `SYNCING` - rand.Read(fcu.HeadBlockHash[:]) + t.Rand.Read(fcu.HeadBlockHash[:]) } else { fcu.HeadBlockHash = t.CLMock.LatestPayloadBuilt.BlockHash } diff --git a/simulators/ethereum/engine/suites/engine/payload_execution.go b/simulators/ethereum/engine/suites/engine/payload_execution.go index e01995aaea..a86c4e253b 100644 --- a/simulators/ethereum/engine/suites/engine/payload_execution.go +++ b/simulators/ethereum/engine/suites/engine/payload_execution.go @@ -2,7 +2,6 @@ package suite_engine import ( "math/big" - "math/rand" api "github.com/ethereum/go-ethereum/beacon/engine" "github.com/ethereum/go-ethereum/common" @@ -117,7 +116,7 @@ func (spec InOrderPayloadExecutionTest) Execute(t *test.Env) { // We will be also verifying that the transactions are correctly interpreted in the canonical chain, // prepare a random account to receive funds. recipient := common.Address{} - rand.Read(recipient[:]) + t.Rand.Read(recipient[:]) amountPerTx := big.NewInt(1000) txPerPayload := 20 payloadCount := 10 @@ -243,7 +242,7 @@ func (spec MultiplePayloadsExtendingCanonicalChainTest) Execute(t *test.Env) { // We send the transactions after we got the Payload ID, before the CLMocker gets the prepared Payload OnPayloadProducerSelected: func() { recipient := common.Address{} - rand.Read(recipient[:]) + t.Rand.Read(recipient[:]) _, err := t.SendNextTransaction( t.TestContext, t.CLMock.NextBlockProducer, @@ -278,11 +277,11 @@ func (spec MultiplePayloadsExtendingCanonicalChainTest) Execute(t *test.Env) { // Fabricate and send multiple new payloads by changing the PrevRandao field for i := 0; i < payloadCount; i++ { newPrevRandao := common.Hash{} - rand.Read(newPrevRandao[:]) + t.Rand.Read(newPrevRandao[:]) customizer := &helper.CustomPayloadData{ PrevRandao: &newPrevRandao, } - newPayload, err := customizer.CustomizePayload(&basePayload) + newPayload, err := customizer.CustomizePayload(t.Rand, &basePayload) if err != nil { t.Fatalf("FAIL (%s): Unable to customize payload %v: %v", t.TestName, i, err) } @@ -347,7 +346,7 @@ func (spec NewPayloadOnSyncingClientTest) Execute(t *test.Env) { // Set a random transaction recipient recipient := common.Address{} - rand.Read(recipient[:]) + t.Rand.Read(recipient[:]) // Disconnect the first engine client from the CL Mocker and produce a block t.CLMock.RemoveEngineClient(t.Engine) @@ -484,7 +483,7 @@ func (spec NewPayloadWithMissingFcUTest) Execute(t *test.Env) { t.CLMock.ProduceBlocks(5, clmock.BlockProcessCallbacks{ OnPayloadProducerSelected: func() { var recipient common.Address - rand.Read(recipient[:]) + t.Rand.Read(recipient[:]) // Send at least one transaction per payload _, err := t.SendNextTransaction( t.TestContext, diff --git a/simulators/ethereum/engine/suites/engine/reorg.go b/simulators/ethereum/engine/suites/engine/reorg.go index 19eebe7882..05a96ee58c 100644 --- a/simulators/ethereum/engine/suites/engine/reorg.go +++ b/simulators/ethereum/engine/suites/engine/reorg.go @@ -5,7 +5,6 @@ import ( "encoding/json" "fmt" "math/big" - "math/rand" "time" api "github.com/ethereum/go-ethereum/beacon/engine" @@ -66,7 +65,7 @@ func (spec SidechainReOrgTest) Execute(t *test.Env) { // At this point the CLMocker has a payload that will result in a specific outcome, // we can produce an alternative payload, send it, fcU to it, and verify the changes alternativePrevRandao := common.Hash{} - rand.Read(alternativePrevRandao[:]) + t.Rand.Read(alternativePrevRandao[:]) timestamp := t.CLMock.LatestPayloadBuilt.Timestamp + 1 payloadAttributes, err := (&helper.BasePayloadAttributesCustomizer{ Timestamp: ×tamp, @@ -199,7 +198,7 @@ func (spec TransactionReOrgTest) Execute(t *test.Env) { if spec.Scenario == TransactionReOrgScenarioReOrgOut { // Any payload we get should not contain any payloadAttributes := t.CLMock.LatestPayloadAttributes - rand.Read(payloadAttributes.Random[:]) + t.Rand.Read(payloadAttributes.Random[:]) r := t.TestEngine.TestEngineForkchoiceUpdated(&t.CLMock.LatestForkchoice, &payloadAttributes, t.CLMock.LatestHeader.Time) r.ExpectNoError() if r.Response.PayloadID == nil { @@ -246,7 +245,7 @@ func (spec TransactionReOrgTest) Execute(t *test.Env) { customizer := &helper.CustomPayloadData{ ExtraData: &([]byte{0x01}), } - altPayload, err = customizer.CustomizePayload(&t.CLMock.LatestPayloadBuilt) + altPayload, err = customizer.CustomizePayload(t.Rand, &t.CLMock.LatestPayloadBuilt) if err != nil { t.Fatalf("Error creating reorg payload %v", err) } @@ -272,7 +271,7 @@ func (spec TransactionReOrgTest) Execute(t *test.Env) { // impede it from being included in the next payload forkchoiceUpdated := t.CLMock.LatestForkchoice payloadAttributes := t.CLMock.LatestPayloadAttributes - rand.Read(payloadAttributes.SuggestedFeeRecipient[:]) + t.Rand.Read(payloadAttributes.SuggestedFeeRecipient[:]) f := t.TestEngine.TestEngineForkchoiceUpdated( &forkchoiceUpdated, &payloadAttributes, @@ -470,7 +469,7 @@ func (spec ReOrgBackToCanonicalTest) Execute(t *test.Env) { t.CLMock.ProduceSingleBlock(clmock.BlockProcessCallbacks{ OnPayloadAttributesGenerated: func() { payloadAttributes := t.CLMock.LatestPayloadAttributes - rand.Read(payloadAttributes.Random[:]) + t.Rand.Read(payloadAttributes.Random[:]) r := t.TestEngine.TestEngineForkchoiceUpdated(&t.CLMock.LatestForkchoice, &payloadAttributes, t.CLMock.LatestHeader.Time) r.ExpectNoError() if r.Response.PayloadID == nil { @@ -606,7 +605,7 @@ func (spec ReOrgBackFromSyncingTest) Execute(t *test.Env) { ParentHash: &altParentHash, ExtraData: &([]byte{0x01}), } - altPayload, err := customizer.CustomizePayload(&t.CLMock.LatestPayloadBuilt) + altPayload, err := customizer.CustomizePayload(t.Rand, &t.CLMock.LatestPayloadBuilt) if err != nil { t.Fatalf("FAIL (%s): Unable to customize payload: %v", t.TestName, err) } @@ -701,7 +700,7 @@ func (spec ReOrgPrevValidatedPayloadOnSideChainTest) Execute(t *test.Env) { if len(sidechainPayloads) > 0 { customData.ParentHash = &sidechainPayloads[len(sidechainPayloads)-1].BlockHash } - altPayload, err := customData.CustomizePayload(&t.CLMock.LatestPayloadBuilt) + altPayload, err := customData.CustomizePayload(t.Rand, &t.CLMock.LatestPayloadBuilt) if err != nil { t.Fatalf("FAIL (%s): Unable to customize payload: %v", t.TestName, err) } @@ -721,7 +720,7 @@ func (spec ReOrgPrevValidatedPayloadOnSideChainTest) Execute(t *test.Env) { prevRandao = common.Hash{} suggestedFeeRecipient = common.Address{0x12, 0x34} ) - rand.Read(prevRandao[:]) + t.Rand.Read(prevRandao[:]) payloadAttributesCustomizer := &helper.BasePayloadAttributesCustomizer{ Random: &prevRandao, SuggestedFeeRecipient: &suggestedFeeRecipient, @@ -800,7 +799,7 @@ func (s SafeReOrgToSideChainTest) Execute(t *test.Env) { ParentHash: &altParentHash, ExtraData: &([]byte{0x01}), } - altPayload, err := customizer.CustomizePayload(&t.CLMock.LatestPayloadBuilt) + altPayload, err := customizer.CustomizePayload(t.Rand, &t.CLMock.LatestPayloadBuilt) if err != nil { t.Fatalf("FAIL (%s): Unable to customize payload: %v", t.TestName, err) } diff --git a/simulators/ethereum/engine/suites/engine/suggested_fee_recipient.go b/simulators/ethereum/engine/suites/engine/suggested_fee_recipient.go index 9b8c834b8f..0c604fd87a 100644 --- a/simulators/ethereum/engine/suites/engine/suggested_fee_recipient.go +++ b/simulators/ethereum/engine/suites/engine/suggested_fee_recipient.go @@ -4,7 +4,6 @@ import ( "context" "fmt" "math/big" - "math/rand" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/hive/simulators/ethereum/engine/clmock" @@ -38,9 +37,9 @@ func (tc SuggestedFeeRecipientTest) Execute(t *test.Env) { // Verify that, in a block with transactions, fees are accrued by the suggestedFeeRecipient feeRecipient := common.Address{} - rand.Read(feeRecipient[:]) + t.Rand.Read(feeRecipient[:]) txRecipient := common.Address{} - rand.Read(txRecipient[:]) + t.Rand.Read(txRecipient[:]) // Send multiple transactions for i := 0; i < tc.TransactionCount; i++ { diff --git a/simulators/ethereum/engine/suites/sync/tests.go b/simulators/ethereum/engine/suites/sync/tests.go index e94de670cb..73c34d3294 100644 --- a/simulators/ethereum/engine/suites/sync/tests.go +++ b/simulators/ethereum/engine/suites/sync/tests.go @@ -4,6 +4,7 @@ import ( "context" "fmt" "math/big" + "math/rand" "time" api "github.com/ethereum/go-ethereum/beacon/engine" @@ -99,7 +100,7 @@ func AddSyncTestsToSuite(sim *hivesim.Simulation, suite *hivesim.Suite, tests [] } // Run the test case - test.Run(¤tTest, big.NewInt(ttd), timeout, t, c, &genesis, syncClientParams, testFiles.Copy()) + test.Run(¤tTest, big.NewInt(ttd), timeout, t, c, &genesis, rand.New(rand.NewSource(0)), syncClientParams, testFiles.Copy()) }, }) } diff --git a/simulators/ethereum/engine/suites/withdrawals/tests.go b/simulators/ethereum/engine/suites/withdrawals/tests.go index 0b8b9579a7..b2a405933a 100644 --- a/simulators/ethereum/engine/suites/withdrawals/tests.go +++ b/simulators/ethereum/engine/suites/withdrawals/tests.go @@ -1221,7 +1221,7 @@ func (ws *WithdrawalsBaseSpec) Execute(t *test.Env) { emptyWithdrawalsList := make(types.Withdrawals, 0) payloadWithEmptyWithdrawalsList, err := (&helper.CustomPayloadData{ Withdrawals: emptyWithdrawalsList, - }).CustomizePayload(&t.CLMock.LatestPayloadBuilt) + }).CustomizePayload(t.Rand, &t.CLMock.LatestPayloadBuilt) if err != nil { t.Fatalf("Unable to append withdrawals: %v", err) } @@ -1317,7 +1317,7 @@ func (ws *WithdrawalsBaseSpec) Execute(t *test.Env) { // be checked first instead of responding `INVALID` nilWithdrawalsPayload, err := (&helper.CustomPayloadData{ RemoveWithdrawals: true, - }).CustomizePayload(&t.CLMock.LatestPayloadBuilt) + }).CustomizePayload(t.Rand, &t.CLMock.LatestPayloadBuilt) if err != nil { t.Fatalf("Unable to append withdrawals: %v", err) } @@ -1370,7 +1370,7 @@ func (ws *WithdrawalsBaseSpec) Execute(t *test.Env) { payload := t.CLMock.LatestExecutedPayload // Corrupt the hash - rand.Read(payload.BlockHash[:]) + t.Rand.Read(payload.BlockHash[:]) // On engine_newPayloadV2 `INVALID_BLOCK_HASH` is deprecated // in favor of reusing `INVALID` @@ -1916,7 +1916,7 @@ func (s *MaxInitcodeSizeSpec) Execute(t *test.Env) { // Customize the payload to include a tx with an invalid initcode if invTx, ok := invalidTx.(*types.Transaction); ok { - customPayload, err := helper.CustomizePayloadTransactions(&t.CLMock.LatestPayloadBuilt, types.Transactions{invTx}) + customPayload, err := helper.CustomizePayloadTransactions(t.Rand, &t.CLMock.LatestPayloadBuilt, types.Transactions{invTx}) if err != nil { t.Fatalf("FAIL: Unable to customize payload: %v", err) } @@ -1944,7 +1944,7 @@ type GetPayloadBodiesSpec struct { } type GetPayloadBodyRequest interface { - Verify(int, *test.TestEngineClient, clmock.ExecutableDataHistory) + Verify(*rand.Rand, int, *test.TestEngineClient, clmock.ExecutableDataHistory) } type GetPayloadBodyRequestByRange struct { @@ -1952,7 +1952,7 @@ type GetPayloadBodyRequestByRange struct { Count uint64 } -func (req GetPayloadBodyRequestByRange) Verify(reqIndex int, testEngine *test.TestEngineClient, payloadHistory clmock.ExecutableDataHistory) { +func (req GetPayloadBodyRequestByRange) Verify(_ *rand.Rand, reqIndex int, testEngine *test.TestEngineClient, payloadHistory clmock.ExecutableDataHistory) { testEngine.Logf("INFO: Starting GetPayloadBodyByRange request %d", reqIndex) startTime := time.Now() defer func() { @@ -1997,7 +1997,7 @@ type GetPayloadBodyRequestByHashIndex struct { End uint64 } -func (req GetPayloadBodyRequestByHashIndex) Verify(reqIndex int, testEngine *test.TestEngineClient, payloadHistory clmock.ExecutableDataHistory) { +func (req GetPayloadBodyRequestByHashIndex) Verify(randSource *rand.Rand, reqIndex int, testEngine *test.TestEngineClient, payloadHistory clmock.ExecutableDataHistory) { testEngine.Logf("INFO: Starting GetPayloadBodyByHash request %d", reqIndex) startTime := time.Now() defer func() { @@ -2013,7 +2013,7 @@ func (req GetPayloadBodyRequestByHashIndex) Verify(reqIndex int, testEngine *tes } else { // signal to request an unknown hash (random) randHash := common.Hash{} - rand.Read(randHash[:]) + randSource.Read(randHash[:]) payloads = append(payloads, nil) hashes = append(hashes, randHash) } @@ -2027,7 +2027,7 @@ func (req GetPayloadBodyRequestByHashIndex) Verify(reqIndex int, testEngine *tes } else { // signal to request an unknown hash (random) randHash := common.Hash{} - rand.Read(randHash[:]) + randSource.Read(randHash[:]) payloads = append(payloads, nil) hashes = append(hashes, randHash) } @@ -2089,17 +2089,17 @@ func (ws *GetPayloadBodiesSpec) Execute(t *test.Env) { // Now we have an extra payload that follows the canonical chain, // but we need a side chain for the test. customizer := &helper.CustomPayloadData{ - Withdrawals: helper.RandomizeWithdrawalsOrder(t.CLMock.LatestExecutedPayload.Withdrawals), + Withdrawals: helper.RandomizeWithdrawalsOrder(t.Rand, t.CLMock.LatestExecutedPayload.Withdrawals), } - sidechainCurrent, err := customizer.CustomizePayload(&t.CLMock.LatestExecutedPayload) + sidechainCurrent, err := customizer.CustomizePayload(t.Rand, &t.CLMock.LatestExecutedPayload) if err != nil { t.Fatalf("FAIL (%s): Error obtaining custom sidechain payload: %v", t.TestName, err) } customizer = &helper.CustomPayloadData{ ParentHash: &sidechainCurrent.BlockHash, - Withdrawals: helper.RandomizeWithdrawalsOrder(nextCanonicalPayload.Withdrawals), + Withdrawals: helper.RandomizeWithdrawalsOrder(t.Rand, nextCanonicalPayload.Withdrawals), } - sidechainHead, err := customizer.CustomizePayload(nextCanonicalPayload) + sidechainHead, err := customizer.CustomizePayload(t.Rand, nextCanonicalPayload) if err != nil { t.Fatalf("FAIL (%s): Error obtaining custom sidechain payload: %v", t.TestName, err) } @@ -2158,7 +2158,7 @@ func (ws *GetPayloadBodiesSpec) Execute(t *test.Env) { go func() { defer wg.Done() for req := range workChan { - req.Request.Verify(req.Index, testEngine, payloadHistory) + req.Request.Verify(t.Rand, req.Index, testEngine, payloadHistory) } }() } @@ -2179,7 +2179,7 @@ func (ws *GetPayloadBodiesSpec) Execute(t *test.Env) { wg.Wait() } else { for i, req := range ws.GetPayloadBodiesRequests { - req.Verify(i, testEngine, payloadHistory) + req.Verify(t.Rand, i, testEngine, payloadHistory) } } diff --git a/simulators/ethereum/engine/test/env.go b/simulators/ethereum/engine/test/env.go index 8c1df04892..4fb48e5e59 100644 --- a/simulators/ethereum/engine/test/env.go +++ b/simulators/ethereum/engine/test/env.go @@ -3,6 +3,7 @@ package test import ( "context" "math/big" + "math/rand" "net/http" "time" @@ -30,6 +31,9 @@ type Env struct { // Test context will be done after timeout to allow test to gracefully finish TestContext context.Context + // Randomness source + Rand *rand.Rand + // RPC Clients Engine client.EngineClient Eth client.Eth @@ -51,13 +55,14 @@ type Env struct { TestTransactionType helper.TestTransactionType } -func Run(testSpec Spec, ttd *big.Int, timeout time.Duration, t *hivesim.T, c *hivesim.Client, genesis *core.Genesis, cParams hivesim.Params, cFiles hivesim.Params) { +func Run(testSpec Spec, ttd *big.Int, timeout time.Duration, t *hivesim.T, c *hivesim.Client, genesis *core.Genesis, randSource *rand.Rand, cParams hivesim.Params, cFiles hivesim.Params) { // Setup the CL Mocker for this test forkConfig := testSpec.GetForkConfig() clMocker := clmock.NewCLMocker( t, genesis, forkConfig, + randSource, ) // Send the CLMocker for configuration by the spec, if any. @@ -94,6 +99,7 @@ func Run(testSpec Spec, ttd *big.Int, timeout time.Duration, t *hivesim.T, c *hi ClientParams: cParams, ClientFiles: cFiles, TestTransactionType: testSpec.GetTestTransactionType(), + Rand: randSource, } env.Engines = append(env.Engines, ec) env.TestEngines = append(env.TestEngines, env.TestEngine) From 94580f4f82e4b5e78bebb95ee37811f61dce6cb1 Mon Sep 17 00:00:00 2001 From: Mario Vega Date: Thu, 16 Nov 2023 07:41:56 -0600 Subject: [PATCH 122/387] clients/besu: Remove trusted setup (#946) --- clients/besu/Dockerfile | 1 - clients/besu/Dockerfile.git | 1 - clients/besu/Dockerfile.local | 1 - clients/besu/besu.sh | 5 - clients/besu/trusted_setup.txt | 4163 -------------------------------- 5 files changed, 4171 deletions(-) delete mode 100644 clients/besu/trusted_setup.txt diff --git a/clients/besu/Dockerfile b/clients/besu/Dockerfile index 280f499570..2612b4aec1 100644 --- a/clients/besu/Dockerfile +++ b/clients/besu/Dockerfile @@ -17,7 +17,6 @@ COPY genesis.json /genesis.json COPY mapper.jq /mapper.jq COPY besu.sh /opt/besu/bin/besu-hive.sh COPY enode.sh /hive-bin/enode.sh -COPY trusted_setup.txt /trusted_setup.txt # Set execute permissions for scripts RUN chmod +x /opt/besu/bin/besu-hive.sh /hive-bin/enode.sh diff --git a/clients/besu/Dockerfile.git b/clients/besu/Dockerfile.git index c986942082..20d3d79011 100644 --- a/clients/besu/Dockerfile.git +++ b/clients/besu/Dockerfile.git @@ -32,7 +32,6 @@ COPY genesis.json /genesis.json COPY mapper.jq /mapper.jq COPY besu.sh /opt/besu/bin/besu-hive.sh COPY enode.sh /hive-bin/enode.sh -COPY trusted_setup.txt /trusted_setup.txt # Set execute permissions for scripts RUN chmod +x /opt/besu/bin/besu-hive.sh /hive-bin/enode.sh diff --git a/clients/besu/Dockerfile.local b/clients/besu/Dockerfile.local index 8dc45342cc..e5fd8d41e7 100644 --- a/clients/besu/Dockerfile.local +++ b/clients/besu/Dockerfile.local @@ -31,7 +31,6 @@ COPY genesis.json /genesis.json COPY mapper.jq /mapper.jq COPY besu.sh /opt/besu/bin/besu-hive.sh COPY enode.sh /hive-bin/enode.sh -COPY trusted_setup.txt /trusted_setup.txt # Set execute permissions for scripts RUN chmod +x /opt/besu/bin/besu-hive.sh /hive-bin/enode.sh diff --git a/clients/besu/besu.sh b/clients/besu/besu.sh index b483ed4363..428b93d3d1 100644 --- a/clients/besu/besu.sh +++ b/clients/besu/besu.sh @@ -159,11 +159,6 @@ if [ "$HIVE_TERMINAL_TOTAL_DIFFICULTY" != "" ]; then RPCFLAGS="$RPCFLAGS --engine-host-allowlist=* --engine-jwt-enabled --engine-jwt-secret /jwtsecret" fi -# Enable KZG trusted setup if cancun timestamp is set, needed for custom genesis on Besu with Cancun -if [ "$HIVE_CANCUN_TIMESTAMP" != "" ]; then - FLAGS="$FLAGS --kzg-trusted-setup=/trusted_setup.txt" -fi - # Start Besu. if [ -z "$HAS_IMPORT" ]; then cmd="$besu $FLAGS $RPCFLAGS" diff --git a/clients/besu/trusted_setup.txt b/clients/besu/trusted_setup.txt deleted file mode 100644 index 26612cb887..0000000000 --- a/clients/besu/trusted_setup.txt +++ /dev/null @@ -1,4163 +0,0 @@ -4096 -65 -8d0c6eeadd3f8529d67246f77404a4ac2d9d7fd7d50cf103d3e6abb9003e5e36d8f322663ebced6707a7f46d97b7566d -a0d2392f030681c61c2a867862917e10f7678d882034bb89af3db87e6ab3883a304034643dc9688a04e41a5b831582bc -94298073048d70c74f36685e547d04b7311479daa05912e18ead64b2099a194bf48ec344273d58daf0b86b1d8f1d318d -85c4063d13499013dc2ccaa98c1606763e6b1e8cca20922d4cec12ecbaf006ea81ffabe6596d1ac7ba1daf7e63e30898 -84c64bce36c6b5145c6880113366025ab9a8f88e3948d374e27be8b8f9f87402c70fec9b3c621a2d1d26764a84370d0c -8b206c823acf5294552ee54579fac0f45ea15bd273dbacd63b88cd7cddbcce23b56e52f8ea352e1e1d7dcd9b3991b413 -b70aaa4038ba3f5ff306c647b4392d004950c53ad8f6713b5c9c21ac99f5c56cf57323dac500a1f4e9507c4746b07a2f -895f6d1fc70b52f838d81b24f4840729cd5988b649e9d6e6f6dbac4281d8818f39ebdae7e6ea139d7f98a832bd6f29f1 -a71a2832bbaade974c9ef7505dfa24e1ba466a9951b7c2db56886be31c9c7b871f3ee76cb1fcc1aab4b906d6502bc9b5 -9530ba64a21e27834609c00616bc63e8fc2dc7800e478ad728ec39c624f65bbc62cb48f59decb7fbf605ce1920d02622 -8d0609affaf8619bb2f6c80699e5bc7783becbd5973630cdd227ae52d6d701c45f4270becca97701b40279fab588cf64 -8f5d5b4c3bb8dc9a19e5a0f84df6322a79a00c7783c86254197d313a5b35d3965a1f7c0b9c4e39ec1e8f5d02d3aa0862 -96aa47a3ba20b1cfe81eb26bef503225037fdf4c9df53bea1b520841875cd1db6aa8e0f34685da08b55a3ce7289e6de0 -b4c27ee3f4b8c0031837160f0a75632f5b51b5850d52b530096443f54c2b264aeccc5c61b4fcc8de7074475f354fa0d8 -acfd735cda20be1d6f425a7886629c91732fbb5a4e0350ca740a8fb5b39f2001071cec0b2a0f6ca35e1f35a5ea18d00f -ae44d87b1d16d59504c602cbacde2c2791f1520391ca50154e6036d3953ca466cf93d6537da2adb729e6f9f4ffa87853 -97b492872ce44941ea4668ffca83b82fac0f4021bd47e0a5ffeaaacb1b3fc924ee4d53b99f7bcafe0985caf0fbe5d1d3 -b3fbe2f9103d293f49c6c6016d5913f041c9113295397388111a0fdf4245d8edd6e63b9a1a1c9c8f868d6e1988116880 -805efa08fd2046c44c427b225c17bed8a1eb3320cdf94026fdc24c6d345a6cfebfd7475f85d2d1bf22018ca72d2761d3 -9888bae0d83077d1dfde82fdffb1195565c31c519b80cba1e21aba58ee9ccb5677f74bfde13fa5723026514a7d839661 -922e19d2646ba90c9f56278bddf74621cc4518ae2f042fb8245843e87cd82724c6d7c9a99907ac6de5f2187fd2e77cbe -a38f0e1faf97dd1e0804b44e4d150dbfa48318442d1c5255eb0c14ea56b50502f3c7cb216a0336e7c140398088dc01cf -93598ea391c8735799a1d4cd0456f34994ccdf4883fad57419f634f30fee595938bc66b066dade9ae52578818c00d899 -a528dc920734cfaee9feacbc0baa5b73befb1ec6fbd422fcad09a9c1f8f8c40b5ea332b2cf04dc1d6d921e9da9ddfeb4 -b38d45316bf78d11e796a34ee535814e6cde0e642f14108329c5b21f4fec18cd61f84a3025824bb8dc4cbd26b2ecc9bf -8eec35a7404c9a35dc6ad0260b7f0f7fd1bfe92a2e08bc72548b99ed9acdc378728a8ea9c6879a6e47e37edb0d28c193 -a68a4446274ccd947c61bf736c5219dad680b99c6085a26719793e0d9dab26d5f8a0b28e71be6e1b9ea4ae39139f7f57 -a0acb543f41ad12e3b2e096629ccdd719a001d0ff53bb151e9a37aa57852f7275a7bbd06dc2a06af9144524548164af5 -b271e74cdbcf8b9143f8472174bdb068c23308ea807c60a554c185f7be6f231aac13347139837514171a876dfac5baa5 -8195a460719000cd1df379ebbf7918f71301a50a2fa587505cc5b8c4534c3d2343f63d28e7ee991d7a1cebb15d380696 -96202b60426773e8731dcbedbf613477f65940a19fb4be0f4f742b0c76ae9d88ecdb6d36cd4f12bb404dd5d360c819e2 -b0a80fe60b71ca9e80157138de8787b8a786326179604b8a15a744e52662645987e5f859ef5c76492d560daf4624b9a7 -a331ea8adf87daa5e2d458d0113c307edae1a84927bca7d484aca5f8c1b6378ab42981c44b0d916d7249f4b475f926f1 -aa1a8f59ae0912abf191ea7e209ff401628278dfb2269db6d87cf33bd52af3dbffbe96513a8b210e965c853a554b787a -ac4f4a0e1b1a155e1f22a9085b0b047fe54c8437dbbb8e9720fd6b0cdd76557d19ca2e885a48890f0247b1a72be0e287 -a428465505eac7b9660eb0d495a7a00c8cc238de3a02ebbd2eb07e502e9868086e9584b59953cf1480c0b781295db339 -b7b77e21e08f6357cbd3dcd3035c3e8ec84cdfa13c7baef6c67e0ef43095e61fd549694263d7def8b8adc3a0fdcc7987 -abb991d17c5bdd264c592c55101e265cb3210c4157aee4079173fd51da1e0199eed1d6c890aab95817ec078561d771af -846a8e4f801faf5fbec078b09c362ee30a00b2b58a4871744d03cd118b913464233ff926e52b0c75fbfcf098ad25a1e6 -947e91ffa32f38c1ccb72cca4bfabaee9e63ab74a16f034cabba25e462f7331ebe5a7ba393f69e91830415fa75b1b52e -8dc5e26adc693f4e300cab7385edca1a2fe14c8ee6dc0cd6d013cb5aa154dc380e9e81e259cbc59c1f38f7c4a57f1c7d -9818ef6605d6ea3b7bf4da5c6d6d8ed540bb94df4d14c974e1b79ed2fd1a0b897b8cf1ff671a181a697effd66b1644a5 -b5eab6baf03af994fc32cc9dce388394c18c01cdafe7909fde948f3e00a72dc8f30d15977d0f114bd7c140f5f94cf005 -83b2e9858d3b929f9a2ad66a91a2c0c44d15d288c17c12a1614301a6f2d61d31eaa540ca7781520fe4420afae0ec0208 -ab338fbd38bce4d1b7a759f71e5e5673746c52846eff3d0b6825e390aeeca8f9f123ee88c78fe4d520cc415cbae32bf1 -81adb6322b8db95d1711304e5b59f37640ca88c03e6c7e15de932be5267dff7351fa17664113ecc528e8920f5bfdc0d1 -89e2e0c0d769e4107232df741678a6bacb041d0154385450aaca8be9c3c18c42f817373962e7569d33935c35666a8a6a -8f0756fea8b34a2b471ec39e4448a6a6935e5432ec2859d222964a4c82777a340e1d702777aeb946fa405afc0438221a -a2bf90c505a6f03b3dd09d04e1e7cf301fe3415b273e263f15fdfe5d0e40f619b95e8bf00916d3eaa7d7f8c0bae41c8e -91d5c76b5542637588cd47279d0bd74a25dbda0d8ec0ff68b62d7e01e34a63fc3e06d116ee75c803864b1cf330f6c360 -a9958c388d25315a979566174b0622446335cb559aff1992bd71910c47497536019c6854d31c0e22df07505963fc44ff -91d82b09d5726077eed6c19bcb398abe79d87ce16c413df6bf5932b8fd64b4c0fd19c9bf0fa8db657a4a4d4c0d8f5a2d -ac6e0a86e0ee416855c3e9eef2526c43835f5245527ed0038bc83b4fcadb4ea5beb91143cc674486681a9f0e63f856b1 -aaf00d6efd0c6efb9f7d6a42555abec05c5af8f324e2e579fc2ac83bdc937cc682d9bc2ffd250619c8bb098b8c84db80 -963f5fcd8476d0dbeb03a62cde40e3deee25f55e7ded7572d8884975f38eddc5406fc4b0adff602a1cca90f7205a7fdc -a3805ee01512f644d2679511bd8607890ee9721e75ac9a85ab9fd6fceb1308d5b9b0e9907686b4e683b34aed0f34cd81 -a483d7708465cd4e33b4407fe82c84ef6bc7fa21475d961fe2e99802d0c999b6474ef7a46dd615b219c9c7e9faec45ee -b6b5f9456f12d6781c41f17cdc9d259f9515994d5dee49bb701a33fa2e8dcbb2c8c13f822b51ad232fc5e05bff2f68ef -8766b721b0cf9b1a42614c7d29aad2d89da4996dc9e2a3baeba4b33ca74100ab0b83f55c546c963e3b6af1dcf9ca067c -ac5e8da1154cf4be8df2bbd2e212b7f8077099b2010c99e739441198f65337c6f7ef0d9136453a7668fde6e1389c32c7 -a9d6d2c8845e5f1fec183c5153f1f6e23421e28ce0c86b0ce993b30b87869065acad9e6d9927d9f03c590852821b2f9c -a320ca07c44f7ea3ff858fe18395a86f59559617f13ec96d1e8b4a3f01d9c066a45c8d8cf8f1f14a360bb774d55f5f18 -b3adb00e1312dce73b74fbd2ea16f0fb0085bd0db10772e9c260e9ed9f8829ff690e3dfffacaddc8233d484bb69778b3 -87b0c8d8a167d5199d0b0743c20fb83ec8a1c442f0204bcc53bf292ba382bef58a58a6d1e2467920e32c290fdc6dae7c -a74fa436a5adc280a68e0c56b28ac33647bdfc8c5326f4c99db6dbd1b98d91afb1f41f5fffd6bcc31c1f8789c148e2db -8a37349e4ba7558965077f7f9d839c61b7dcb857fcc7965c76a64a75e377bfea8cd09b7a269ce602cc4472affc483b69 -8af813f62c5962ff96bf73e33f47fd5a8e3e55651d429e77d2ce64a63c535ecc5cfc749bb120c489b7ea1d9b2a5d233c -833021445b7d9817caa33d6853fa25efc38e9d62494d209627d26799432ea7b87a96de4694967151abc1252dd2d04dfc -8f78a715107e0ace3a41bff0385fd75c13bf1250f9e5ddecf39e81bacc1244b978e3464892f7fb2596957855b8bf9fc7 -aed144134dc1cc6c671f70ebe71a3aadf7511eea382969bc5d499a678d2d8ce249ebf1a06b51183f61413eba0517012b -b39a53e82c5553943a5e45bc5116d8672ec44bed96b3541dead40344b287a7b02dbf7107372effb067edd946f47de500 -b383844c3b20a8bc06098046ec6b406df9419ad86fac4a000905c01325426903a5e369af856d71ccd52fea362ed29db5 -83815a7098283723eec6aa6451b5d99578bf28a02971375a1fe90c15a20963e129372ac4af7b306ee2e7316472c5d66d -b426b4e185806a31febd745fa8d26b6397832a04e33c9a7eb460cbf302b4c134a8a01d4e5e40bc9b73296c539e60b3ca -a6cabf8205711457e6363ef4379ebc1226001e1aaea3002b25bfd9e173f4368002f4461e79eeb9f4aa46f1b56c739ab9 -a6e88ab01282313269cd2d8c0df1a79dada5b565d6623900af9e7e15351de2b0105cc55d3e9080e1e41efe48be32a622 -b2b106db3d56d189ea57afa133ae4941b4eb1dc168357af488e46811c687713fc66bbd6f8500bbd13cdb45cb82c14d1d -b3a74780ff949d19e6438db280e53632c60dc544f41320d40297fe5bb7fcee7e7931111053c30fb1ed9019ab28965b44 -8c67f32b9fdc04ec291cc0d928841ab09b08e87356e43fbbf7ac3ff0f955642628f661b6f0c8e2192a887489fddf07bb -b3be58bd628383352e6473fe9a1a27cf17242df0b1273f5867e9119e908969b9e9e7e294a83b9ea14825003cb652d80c -a867acf6ab03e50936c19a21d4040bfd97eb5a89852bd9967da0e326d67ce839937cab4e910d1149ecef9d5f1b2d8f08 -8006b19126bd49cbb40d73a99a37c2e02d6d37065bbe0cfcee888280176184964bd8f222f85960667c5b36dfaee0ee35 -ac50967b8b7840bf9d51216d68a274f1d3431c7d4031fbac75a754befbbb707c2bb184867db6b9d957f3ba0fd0a26231 -b5a794c928aff0c4271674eb0a02143ed9b4d3bc950584c7cd97b7d3c3f2e323798fd5ccc6fcc0eb2e417d87f4c542a2 -a2ca3d6509f04b37091ce6697672ee6495b42d986d75bd2d2058faa100d09fd0a145350f2d280d2cb36516171bd97dbf -92cfa293469967a9207b37cd70392312faf81b52963bfbad5f9f3da00817d26e10faf469e0e720c3bb195f23dda8c696 -a0dd5135da0a0e33fa922c623263b29518d7fa000e5beefc66faa4d6201516d058f155475c4806917a3259db4377c38a -8fc3ae8ea6231aa9afb245a0af437e88ebca2c9ab76850c731981afba90d5add0ea254053449355eccf39df55bd912ed -9727afe1f0804297717cec9dc96d2d27024a6ae6d352fee5d25377ee858ee801593df6124b79cb62ddc9235ec1ade4ac -8bcb2c53fcaa38e8e2e0fd0929bc4d9ddce73c0282c8675676950ff806cb9f56ebd398b269f9a8c2a6265b15faf25fca -a8bd9007fbbdd4b8c049d0eb7d3649bd6a3e5097372fa8ea4b8821ba955c9ef3f39ac8b19f39d3af98640c74b9595005 -92c7e851c8bd6b09dfcbfdb644725c4f65e1c3dbd111df9d85d14a0bb2d7b657eb0c7db796b42bf447b3912ef1d3b8c3 -98c499b494d5b2b8bea97d00ac3a6d826ab3045bb35424575c87117fc2a1958f3829813e266630749caf0fa6eeb76819 -8df190d71e432fe8691d843f6eb563445805c372eb5b6b064ec4e939be3e07526b5b7f5a289ede44ae6116a91357b8b1 -b5010243f7c760fb52a935f6d8ed8fc12c0c2f57db3de8bb01fdeedf7e1c87b08f3dd3c649b65751f9fd27afa6be34c7 -889c8057402cc18649f5f943aed38d6ef609b66c583f75584f3b876c1f50c5dc7d738dc7642135742e1f13fa87be46c1 -996087337f69a19a4ebe8e764acf7af8170a7ad733cd201b0e4efde6ea11039a1853e115ad11387e0fb30ab655a666d8 -902732c429e767ab895f47b2e72f7facad5ef05a72c36a5f9762c2194eb559f22845bbb87c1acc985306ecb4b4fbbf79 -8519b62a150ea805cdfc05788b8d4e797d8396a7306b41777c438c2e8b5c38839cfec5e7dc5d546b42b7b76e062982a7 -862a53ba169e6842a72763f9082ff48fbfbb63129d5a26513917c2bca9ad6362c624ce6fc973cf464f2eb4892131eb04 -b86cd67c809d75fdb9f1c9453a39870f448b138f2b4058d07a707b88bb37f29d42e33ce444f4fbe50d6be13339cae8a6 -8cf5d8365dbbafc0af192feb4fc00c181e2c3babc5d253268ef5564934555fb1e9b1d85ec46f0ca4709b7d5b27169b89 -b48f11a1809ec780bf6181fae3b8d14f8d4dc7d1721128854354be691c7fc7695d60624f84016c1cea29a02aaf28bfbc -8b46b695a08cb9a2f29ab9dd79ab8a39ec7f0086995b8685568e007cd73aa2cd650d4fae6c3fb109c35612f751ba225e -8d2f9f0a5a7de894d6c50baceb8d75c96082df1dcf893ac95f420a93acbbf910204903d2eb6012b1b0495f08aaf9992f -b334db00a770394a84ec55c1bd5440b7d9f2521029030ef3411b0c2e0a34c75c827fd629c561ea76bd21cd6cf47027f4 -96e9ff76c42bcb36f2fb7819e9123420ed5608132f7c791f95cb657a61b13041e9ba2b36f798a0fdb484878cbe015905 -99f8d701e889abd7815d43ba99e0a85776ec48311fa7cb719d049f73b5d530fa950746ffbbb7beb9e30c39d864891dc2 -98169c20df7c15d7543991f9c68e40ac66607cbd43fc6195416e40009917039357e932d6e807f3a40bc4503ad01ae80a -84bd97dd9e4e2ba75d0dee7d4418c720d4746203d847ce2bdd6ed17d492023df48d7b1de27e3f5cb8660c4bb9519ae1b -a54319e06db7f5f826277a54734a875c5b3fd2fa09d36d8b73594137aa62774b7356560157bc9e3fdf1046dc57b6006a -90cfff7cd4e7c73b84f63455d31b0d428cb5eee53e378028591478511985bcc95eb94f79ad28af5b3bed864e422d7b06 -a11c23cc8dce26ac35aea9abe911905a32616a259fa7da3a20f42dc853ad31b2634007aa110c360d3771ff19851f4fb4 -9856fbee9095074ad0568498ff45f13fe81e84ea5edaf04127d9ee7e35e730c6d23fa7f8f49d092cf06b222f94ab7f36 -818862dec89f0dc314629fffbca9b96f24dfde2d835fa8bde21b30dc99fe46d837d8f745e41b39b8cf26bfe7f338f582 -831819d41524c50d19f7720bf48f65346b42fb7955ee6ecc192f7e9fed2e7010abccdfdeac2b0c7c599bc83ac70be371 -b367e588eb96aa8a908d8cc354706fee97e092d1bc7a836dbcc97c6ed4de349643a783fb4ddf0dec85a32060318efa85 -b7aaef729befd4ab2be5ec957d7d1dbe6178de1d05c2b230d8c4b0574a3363e2d51bc54ea0279a49cc7adffa15a5a43a -ae2891d848822794ecb641e12e30701f571431821d281ceecbccaaa69b8cd8242495dc5dbf38f7d8ed98f6c6919038aa -872cf2f230d3fffce17bf6f70739084876dc13596415644d151e477ce04170d6ab5a40773557eeb3600c1ad953a0bfce -b853d0a14cef7893ba1efb8f4c0fdb61342d30fa66f8e3d2ca5208826ce1db5c8a99aa5b64c97e9d90857d53beb93d67 -910b434536cec39a2c47ca396e279afdbc997a1c0192a7d8be2ba24126b4d762b4525a94cea593a7c1f707ba39f17c0c -b6511e9dea1fbccedd7b8bb0a790a71db3999bd4e3db91be2f1e25062fae9bb4e94e50d8ec0dcc67b7a0abce985200b2 -936885c90ebe5a231d9c2eb0dfd8d08a55ecaa8e0db31c28b7416869b3cc0371448168cbec968d4d26d1cb5a16ebe541 -b71c2ac873b27fe3da67036ca546d31ca7f7a3dc13070f1530fce566e7a707daeb22b80423d505f1835fe557173754f8 -85acb64140915c940b078478b7d4dadd4d8504cde595e64f60bd6c21e426b4e422608df1ed2dd94709c190e8592c22d7 -b5831c7d7c413278070a4ef1653cec9c4c029ee27a209a6ea0ad09b299309dea70a7aef4ff9c6bdeda87dcda8fa0c318 -aa0e56e3205751b4b8f8fa2b6d68b25121f2b2468df9f1bd4ef55f236b031805a7d9fd6f3bba876c69cdba8c5ea5e05f -b021f5ae4ed50f9b53f66dd326e3f49a96f4314fc7986ace23c1f4be9955ec61d8f7c74961b5fdeabcd0b9bccbf92ce8 -88df439f485c297469e04a1d407e738e4e6ac09a7a0e14e2df66681e562fdb637a996df4b9df4e185faab8914a5cef76 -8e7ae06baa69cb23ca3575205920cb74ac3cda9eb316f4eef7b46e2bff549175a751226d5b5c65fe631a35c3f8e34d61 -99b26ff174418d1efc07dfbed70be8e0cb86ac0cec84e7524677161f519977d9ca3e2bbe76face8fe9016f994dafc0ff -a5f17fe28992be57abd2d2dcaa6f7c085522795bfdf87ba9d762a0070ad4630a42aa1e809801bc9f2a5daf46a03e0c22 -8d673c7934d0e072b9d844994f30c384e55cec8d37ce88d3ad21f8bb1c90ecc770a0eaf2945851e5dab697c3fc2814a9 -a003ed4eb401cfe08d56405442ca572f29728cfff8f682ef4d0e56dd06557750f6a9f28a20c033bc6bbb792cc76cc1a8 -8010408f845cf1185b381fed0e03c53b33b86ea4912426819d431477bd61c534df25b6d3cf40042583543093e5f4bb44 -9021a1ae2eb501134e0f51093c9f9ac7d276d10b14471b14f4a9e386256e8c155bef59973a3d81c38bdab683cd5c10e0 -a5abf269ceabbb1cf0b75d5b9c720a3d230d38f284ed787b6a05145d697a01909662a5b095269996e6fa021849d0f41f -b4b260af0a005220deb2266518d11dbc36d17e59fc7b4780ab20a813f2412ebd568b1f8adc45bf045fcbe0e60c65fd24 -b8c4cb93bedbb75d058269dfccda44ae92fe37b3ab2ef3d95c4a907e1fadf77c3db0fa5869c19843e14b122e01e5c1f4 -ac818f7cdecc7b495779d8d0ff487f23ab36a61d0cf073e11000349747537b5b77044203585a55214bb34f67ef76f2d2 -86215799c25356904611e71271327ca4882f19a889938839c80a30d319ddbe6c0f1dfa9d5523813a096048c4aef338cd -a9204889b9388bf713ca59ea35d288cd692285a34e4aa47f3751453589eb3b03a9cc49a40d82ec2c913c736752d8674d -893aecf973c862c71602ffb9f5ac7bf9c256db36e909c95fe093d871aab2499e7a248f924f72dea604de14abfc00e21c -b8882ee51cfe4acba958fa6f19102aa5471b1fbaf3c00292e474e3e2ec0d5b79af3748b7eea7489b17920ce29efc4139 -8350813d2ec66ef35f1efa6c129e2ebaedc082c5160507bcf04018e170fc0731858ad417a017dadbd9ade78015312e7f -83f6829532be8cd92f3bf1fef264ee5b7466b96e2821d097f56cbb292d605a6fb26cd3a01d4037a3b1681d8143ae54d7 -87d6258777347e4c1428ba3dcbf87fdd5113d5c30cf329e89fa3c9c1d954d031e8acacb4eed9dca8d44507c65e47e7cd -a05669a1e561b1c131b0f70e3d9fc846dc320dc0872334d07347e260d40b2e51fdbabeb0d1ae1fb89fba70af51f25a1a -819925c23fd4d851ea0eecc8c581f4a0047f5449c821d34eccc59a2911f1bd4c319dab6ece19411d028b7fdedece366b -b831b762254afd35364a04966d07b3c97e0b883c27444ff939c2ab1b649dc21ac8915b99dc6903623ed7adaae44870ac -93ec0190f47deffe74179879d3df8113a720423f5ca211d56db9654db20afe10371f3f8ec491d4e166609b9b9a82d0d4 -8f4aa6313719bcfad7ca1ed0af2d2ee10424ea303177466915839f17d2c5df84cc28fcef192cbb91bb696dd383efd3b2 -8d9c9fdf4b8b6a0a702959cf784ad43d550834e5ab2cd3bebede7773c0c755417ad2de7d25b7ff579f377f0800234b44 -99d9427c20752f89049195a91cf85e7082f9150c3b5cb66b267be44c89d41e7cc269a66dacabacadab62f2fa00cc03be -b37709d1aca976cbbf3dc4f08d9c35924d1b8b0f1c465bd92e4c8ff9708e7d045c423183b04a0e0ab4c29efd99ef6f0e -a163f42fb371b138d59c683c2a4db4ca8cbc971ae13f9a9cc39d7f253b7ee46a207b804360e05e8938c73bf3193bab55 -87a037aa558508773fc9a0b9ba18e3d368ffe47dfaf1afacee4748f72e9d3decc2f7c44b7bf0b0268873a9c2ef5fe916 -a1f20cb535cc3aebd6e738491fe3446478f7609d210af56a4004d72500b3ec2236e93446783fe628c9337bcd89c1e8e1 -9757aa358dfbba4f7116da00fe9af97f7ac6d390792ea07682b984aa853379ac525222ac8a83de802859c6dec9182ef7 -815daca1eded189ec7cb7cbc8ad443f38e6ddb3fb1301d1e5a1b02586f1329035209b7c9232dc4dff3fc546cb5ac7835 -aed86dfaf9c4f0a4b2a183f70f9041172002a773482a8ebf3d9d5f97d37ee7c6767badfda15476b3b243931235c7831c -8d032e681e89e41b29f26be02f80030fa888f6967061d2204c1ebb2279a3211d759d187bce6408c6830affa1337fb4e0 -877bff5c2db06116f918a722b26422c920aeade1efa02fa61773fca77f0ea4a7e4ee0ecaaa5cfe98044c0ff91b627588 -b9ee5310d0996a10a242738d846565bdb343a4049a24cd4868db318ea6168a32548efaf4ab84edfbf27ce8aec1be2d1c -b59f6928167323037c6296dd7697846e80a7a4b81320cfae9073ebd2002a03bdf6933e887f33ad83eda8468876c2c4fb -8167686245149dc116a175331c25301e18bb48a6627e2835ae3dd80dd373d029129c50ab2aebeaf2c2ccddc58dcc72ec -82b7dcc29803f916effb67c5ba96a1c067ed8ca43ad0e8d61a510ab067baefd4d6b49e3886b863da2de1d8f2979a4baa -b43824cd6f6872a576d64372dde466fef6decdbb5ad5db55791249fde0a483e4e40c6e1c221e923e096a038fe47dab5e -ab1e9884cf5a8444140cf4a22b9a4311a266db11b392e06c89843ac9d027729fee410560bcd35626fd8de3aad19afc4a -a0dbd92a8d955eb1d24887ca739c639bdee8493506d7344aadb28c929f9eb3b4ebaae6bd7fd9ffe8abb83d0d29091e43 -8352a47a70e343f21b55da541b8c0e35cd88731276a1550d45792c738c4d4d7dc664f447c3933daabd4dbb29bb83be4a -8ce4a1e3c4370346d6f58528a5ef1a85360d964f89e54867ba09c985c1e6c07e710a32cdda8da9fa0e3b26622d866874 -b5e356d67dd70b6f01dd6181611d89f30ea00b179ae1fa42c7eadb0b077fb52b19212b0b9a075ebd6dc62c74050b2d2f -b68f2cd1db8e4ad5efdba3c6eaa60bfcc7b51c2b0ce8bb943a4bc6968995abe8a45fe7f12434e5b0076f148d942786be -b5c7b07f80cd05c0b0840a9f634845928210433b549fb0f84a36c87bf5f7d7eb854736c4083445c952348482a300226a -8cfd9ea5185ff9779dee35efe0252957d6a74693104fb7c2ea989252a1aa99d19abaab76b2d7416eb99145c6fdb89506 -8cc8e2c5c6ddee7ef720052a39cab1ecc5e1d4c5f00fb6989731a23f6d87ac4b055abb47da7202a98c674684d103152a -8c95394c9ed45e1bf1b7cfe93b2694f6a01ff5fed8f6064e673ba3e67551829949f6885963d11860d005e6fabd5ac32c -adf00b86f4a295b607df157f14195d6b51e18e2757778fde0006289fabba8c0a4ab8fad5e3e68ddbb16ccb196cc5973f -b1714b95c4885aac0ee978e6bbabbc9596f92b8858cb953df077511d178527c462cbe1d97fdc898938bae2cd560f7b66 -adf103f4344feb6b9c8104105d64475abc697e5f805e9b08aa874e4953d56605677ef7ff4b0b97987dc47257168ae94d -b0ce6ede9edb272d8769aed7c9c7a7c9df2fb83d31cc16771f13173bcdc209daf2f35887dcca85522d5fdae39f7b8e36 -ad698d1154f7eda04e2e65f66f7fcdb7b0391f248ba37d210a18db75dafd10aedc8a4d6f9299d5b6a77964c58b380126 -904856cd3ecdbb1742239441f92d579beb5616a6e46a953cf2f1dd4a83a147679fc45270dcac3e9e3d346b46ab061757 -b600b5b521af51cdfcb75581e1eccc666a7078d6a7f49f4fdb0d73c9b2dab4ce0ecafcbd71f6dd22636e135c634ee055 -a170c5d31f6657f85078c48c7bbf11687ce032ab2ff4b9b3aee5af742baecf41ea1c2db83bcba00bccc977af7d0c5c8e -a9ef1cbb6a7acb54faf1bcbd4676cdeba36013ca5d1ac1914c3ff353954f42e152b16da2bdf4a7d423b986d62b831974 -aa706d88d3bd2ce9e992547e285788295fd3e2bbf88e329fae91e772248aa68fdfdb52f0b766746a3d7991308c725f47 -911a837dfff2062bae6bcd1fe41032e889eb397e8206cedadf888c9a427a0afe8c88dcb24579be7bfa502a40f6a8c1cc -ae80382929b7a9b6f51fe0439528a7b1a78f97a8565ba8cddb9ee4ba488f2ab710e7923443f8759a10f670087e1292c4 -b8962de382aaa844d45a882ffb7cd0cd1ab2ef073bce510a0d18a119f7a3f9088a7e06d8864a69b13dc2f66840af35ae -954538ffff65191538dca17ec1df5876cb2cd63023ff2665cc3954143e318ece7d14d64548929e939b86038f6c323fc1 -89efa770de15201a41f298020d1d6880c032e3fb8de3690d482843eb859e286acabb1a6dc001c94185494759f47a0c83 -a7a22d95b97c7c07b555764069adaa31b00b6738d853a5da0fe7dc47297d4912a0add87b14fa7db0a087a9de402ea281 -9190d60740c0813ba2ae1a7a1400fa75d6db4d5ce88b4db0626922647f0c50796a4e724e9cc67d635b8a03c5f41978f7 -ab07c30b95477c65f35dc4c56d164e9346d393ad1c2f989326763a4cc04b2cb0386e263007cc5d0125631a09ad3b874c -9398d8e243147de3f70ce60f162c56c6c75f29feb7bc913512420ee3f992e3c3fb964d84ef8de70ef2c118db7d6d7fd5 -b161b15b38cbd581f51ca991d1d897e0710cd6fdf672b9467af612cd26ec30e770c2553469de587af44b17e3d7fea9f7 -8c5d0260b6eb71375c7ad2e243257065e4ea15501190371e9c33721a121c8111e68387db278e8f1a206c0cce478aaa2b -b54ac06a0fb7711d701c0cd25c01ef640e60e3cb669f76e530a97615680905b5c5eac3c653ce6f97ceca2b04f6248e46 -b5c7f76e3ed6dc6c5d45494f851fa1b5eaf3b89adac7c34ad66c730e10488928f6ef0c399c4c26cbeb231e6e0d3d5022 -b6cd90bdd011ac1370a7bbc9c111489da2968d7b50bf1c40330375d1a405c62a31e338e89842fe67982f8165b03480c7 -b0afcaf8d01f5b57cdeb54393f27b27dc81922aa9eaccc411de3b03d920ae7b45295b090ef65685457b1f8045c435587 -b2786c0460e5057f94d346c8ebe194f994f6556ab2904a1d1afd66c0ff36391b56f72ed769dcc58558ee5efaa2ed6785 -965dbb0cb671be339afcb2d6f56e3c386fb5d28536d61d6073b420ee15dee79c205af2f089fbb07514a03c71bf54b4e2 -90f2003e2286bba9cebff3a6791637ca83b6509201c6aed1d47f27097d383d5c2d8532bff9e3541d2c34259841cf26ab -902142d1224e1888ebbfef66aaf8d5b98c27927a00b950753a41d1d28a687a8286b51655da9a60db285b20dc81d5ea89 -a5d364448bf0d0849e5104bdaef9cb2cc8c555f5d6d34239c68671fbe1252f7c8c75b83cea10159dee4da73298f39a12 -b013a54c5b99e296d9419ad5c2aaf4545acd34405e57d13cb764e92132cc20d1a14b33e10caf22d898b608670c04f273 -b92976dceda373331804d48a7847f508cafde8d15949df53dbda09d03908678db1e61ee637baad5f05b2b03ea6f5a870 -968bcb308c7ad0813dc9b3170f23f419aecd7b42176f27fac698811795bf42659fea6b04dab4ef43595dcc990622041b -a9d0a20e9367ea831dccd37f4d97ea75e9aeec952947a7946d95e0d249c94024183ef79a624bdea782469824df0ee4e4 -8521b9667453c3658703e5db365b13f0e0d2331ce611ff1e708f8124d8a81bb5e82871de4a66d45c1a6b0a3901bd901e -b9c88e76e69b0722c0a2f97e57dbc4a6f7456434cd694e2ff67f4e24740cffa4db03e2b18f07f22954ae7db2286e1fa2 -8400e55aa9ab01d4cc0affd611127b5d8d9a9dbd897f3cb8e2050379983aa54249be17d7b7891977b2515bb44a483f65 -8cbb967b4ed31dc40ea06822a94d54cbfc8845c66fbafa3474c8f5fe1ada97299ed4ca955d9d7a39af8821eabf711854 -b4d266ee3fea264a6c563fd6bed46f958c2d7bd328225f6e47faf41a0916aef3b697574322f8b814dfb2f5c242022bf6 -8f7c72d69a919450215ead660ffa9637642c5306354888d549fd4a42e11c649b389f67cc802a0184d10fdb261351140c -a5f9e494ea9b2393ec32c48aac76c04158ccef436d4e70ad930cba20c55fbf61e8f239f70b9d75462405c4b6317c71a1 -b3befb259b52a44a6f44345859e315c20efa48c0c992b0b1621d903164a77667a93f13859790a5e4acb9f3ec6c5a3c6e -b9e4ca259b4ee490d0824207d4d05baf0910d3fe5561ff8b514d8aa5c646417ca76f36ab7c6a9d0fb04c279742f6167a -98fa8c32a39092edb3c2c65c811d2a553931010ccb18d2124d5b96debd8b637d42b8a80111289f2079d9ebca2131a6dc -a65e5aa4631ab168b0954e404006ce05ac088fd3d8692d48af2de5fd47edbf306c80e1c7529697754dbbba1b54164ba0 -b94b7d37e4d970b4bb67bf324ebf80961a1b5a1fa7d9531286ab81a71d6c5f79886f8ef59d38ae35b518a10ed8176dcc -b5ed2f4b0a9ae9ace2e8f6a7fd6560d17c90ae11a74fa8bef2c6c0e38bfd2b9dd2984480633bca276cb73137467e2ce3 -a18556fe291d87a2358e804ee62ddff2c1d53569858b8ae9b4949d117e3bfb4aefce1950be8b6545277f112bebeeb93d -a0d60b9def5d3c05856dff874b4b66ec6e6f0a55c7b33060cc26206c266017cdcf79b1d6f6be93ed7005a932f9c6a0b9 -801fced58a3537c69c232ce846b7517efd958e57c4d7cd262dbec9038d71246dafad124aa48e47fe84ecc786433747c7 -a5e9a8ea302524323aa64a7c26274f08d497df3d570676ecc86bd753c96a487a650389a85f0bc8f5ea94fe6819dc14e5 -a8a2963dc9238a268045d103db101adc3b2f3ab4651b7703b2fe40ece06f66bf60af91369c712aa176df6ed3d64a82fa -a4a8ff0a9a98442357bcdd9a44665919c5d9da6a7d7d21ccdbbd8f3079b1e01125af054b43b37fc303941d0a2e7baee0 -90ef893350f50d6f61ee13dfab6e3121f4a06a1908a707b5f0036cdc2fe483614de3b1445df663934036784342b0106f -84e74d5bc40aaab2cc1d52946b7e06781fbef9d8de6f8b50cd74955d6bdb724864c0e31d5ac57bf271a521db6a352bd6 -832cdf653bbbd128e2e36e7360354a9e82813737c8ab194303d76667a27aa95252756c1514b9e4257db1875f70f73eb4 -a0af8660ed32e6dbcc4d5d21b0a79a25ff49394224f14e6e47604cf3b00136de8f9ab92e82814a595bf65340271c16c3 -9040b5caf5e4dc4118572a2df6176716b5b79d510877bbb4a1211b046596899ea193be4d889e11e464ffb445ab71907b -b9bf8354c70238ab084b028f59e379b8a65c21604034d1b8c9b975f35a476e3c0ba09dd25bf95c5d8ffb25832537319b -a7b492cc1df2a8f62c935d49770d5078586bd0fefda262eb5622033e867e0b9dc0ffc2ce61cd678136a3878d4cbb2b56 -95a5ef06f38743bba187a7a977023b1d9d5ec9ef95ba4343ad149a7b8b0db0e8e528bfb268dc7e5c708bc614dc3d02c8 -99dcf7f123df6c55aeff0a20885a73e84d861ec95cf9208ba90494f37a2dcaacebc8344f392547d3046616d9753c7217 -b3e14f309281a3685ceb14f8921c1e021b7e93c9e9595596b9fb627e60d09ed9e5534733fcbdf2fbc8c981698f5e62ac -816a5e0463074f8c7fb2998e0f0cf89b55790bdbbb573715f6268afb0492453bd640dd07a9953d0400169d555fdf4ac8 -8356d68f3fe7e02a751f579813bd888c9f4edcc568142307d1c9259caef692800e1581d14225e3a3585dac667928fa94 -8d70ea3314c91bfc3f7c1dcf08328ae96f857d98c6aac12ad9eebc2f77e514afdbaf728dfcb192ed29e7ce9a0623ecbb -b68280e7f62ced834b55bc2fcc38d9ea0b1fbcd67cc1682622231894d707c51478ed5edf657d68e0b1b734d9f814b731 -b712dd539e1d79a6222328615d548612eab564ace9737d0249aa2eefed556bbcf3101eba35a8d429d4a5f9828c2ac1fe -8da42ca096419f267f0680fd3067a5dbb790bc815606800ae87fe0263cae47c29a9a1d8233b19fe89f8cc8df6f64697e -8cb2ffd647e07a6754b606bde29582c0665ac4dde30ebdda0144d3479998948dae9eb0f65f82a6c5630210449fbd59f7 -8064c3ef96c8e04398d49e665d6de714de6ee0fced836695baa2aa31139373fad63a7fc3d40600d69799c9df1374a791 -aec99bea8ab4e6d4b246c364b5edc27631c0acc619687941d83fa5ba087dd41f8eaec024c7e5c97cf83b141b6fb135da -8db6051f48901308b08bb1feb8fd2bceaedde560548e79223bd87e485ea45d28c6dcec58030537406ed2b7a9e94e60cc -a5b812c92d0081833dcf9e54f2e1979a919b01302535d10b03b779330c6d25d2de1f374b77fe357db65d24f9cbcd5572 -967d442485c44cf94971d035040e090c98264e3348f55deabd9b48366ec8fe0d5a52e4b2c9a96780a94fc1340338484e -a4b4110bef27f55d70f2765fc3f83c5ddcdfe7f8c341ea9d7c5bcee2f6341bcfbf7b170b52e51480e9b5509f3b52048f -a0d39e4eb013da967a6ac808625122a1c69bf589e3855482dedb6847bb78adc0c8366612c1886d485b31cda7304ec987 -a92f756b44d44b4e22ad265b688b13c9358114557489b8fb0d9720a35e1773b3f0fa7805ac59b35d119a57fe0f596692 -aa27e4b979af6742b49db8bf73c064afd83a9cfe9016131a10381f35a46169e8cfd1a466f295fcc432c217c7c9fa44a5 -845961319cc10bcfbb1f3cb414a5c6a6d008fb3aac42c7d5d74e892cc998af97bc9a9120c3f794e4078135e16a416e38 -a18dbe3015c26ae3e95034c01d7898e3c884d49cc82e71ddb2cf89d11cec34cc2a3dff0fafb464e8e59b82ce1a0a7a11 -a954aed6d7124fa5bd5074bd65be4d28547a665fb4fe5a31c75a5313b77d1c6fc3c978e24c9591a2774f97f76632bdde -8f983b2da584bdff598fcb83c4caa367b4542f4417cc9fa05265ff11d6e12143c384b4398d3745a2d826235c72186a79 -b2caa17d434982d8dd59a9427307dfe4416b0efc8df627dd5fc20d2c11046c93461d669cab2862c094eec6a9845990c6 -8c2baa5a97ee3154cce9fa24f6b54b23e9d073e222220fdd0e83e210c0058fb45ce844382828b0cb21438cf4cad76ee6 -b93437406e4755ccf1de89f5cbe89e939490a2a5cf1585d4363c21ae35b986cb0b981dec02be2940b4ec429cc7a64d4c -a90ac36c97b7ea2eddb65e98e0d08a61e5253019eeb138b9f68f82bb61cdbadf06245b9dfffe851dfa3aa0667c6ac4b8 -8bcdd7b92f43b721ddbfd7596e104bc30b8b43bdaee098aac11222903c37f860df29d888a44aa19f6041da8400ddd062 -98f62d96bdf4e93ed25b2184598081f77732795b06b3041515aa95ffda18eb2af5da1db0e7cfed3899143e4a5d5e7d6c -ad541e3d7f24e4546b4ae1160c1c359f531099dab4be3c077e446c82cb41b9e20b35fa7569798a9f72c1fae312b140b4 -8844a1471ff3f868c6465459a5e0f2fb4d93c65021641760f1bb84f792b151bc04b5a0421bbc72cf978e038edc046b8f -af895aebe27f8357ae6d991c2841572c2063b8d0b05a2a35e51d9b58944c425c764f45a3f3b13f50b1b1f3d9025e52ad -adf85265bb8ee7fead68d676a8301129a6b4984149f0eb4701eae82ec50120ddad657d8798af533e2295877309366e9c -962e157fe343d7296b45f88d9495d2e5481e05ea44ca7661c1fdf8cc0ac87c403753ca81101c1294f248e09089c090eb -a7c8959548c7ae2338b083172fee07543dc14b25860538b48c76ef98ab8f2f126ecb53f8576b8a2b5813ecb152867f18 -ae71680366e11471e1c9a0bc7ea3095bc4d6ceb6cf15b51f1b6061b043f6d5941c9f869be7cb5513e8450dca16df2547 -831290201f42ebf21f611ca769477b767cf0ee58d549fcd9e993fae39d07745813c5ce66afa61b55bb5b4664f400ece7 -af5879e992f86de4787f1bc6decbc4de7d340367b420a99a6c34ac4650d2a40cbe1cef5c6470fc6c72de8ee1fe6bcce4 -8d3c27e1b2ef88d76ac0b1441d327567c761962779c8b1f746e3c976acb63b21d03e5e76589ce9bb0d9ba6e849ed3d53 -ab23b09c9f4151e22654d43c1523f009623b01fe1953d343107cef38b95bd10afd898964946d3cb8521bcbe893e1c84d -8a6acade9520e7a8c07f33d60a87fd53faa6fbf7f018735bffcbbb757c3bafb26f547ceb68e7b8b6bca74819bfcd521a -94db50080d557440a46b6b45ee8083bc90e9267d40489040cbed6234bebf350c788ec51557b969f95194102fde8e9713 -8be8031f32504e0c44958d893649f76cec17af79efcd22bbedb78378f0a150845467e59f79a3f2a3b6a66bdf0d71d13c -a69a4ac47fd92e1926b5e14adcbebbef049848e8a00d4bb387340892e5a9333cae512f447201728d3b53c6cf980a5fdc -8fc713825277c5a8d9ef0a1f6219d141def6d8b30aff0d901026280a17d1265d563ff5192a0817e0e1a04ff447fb6643 -8bf0a85569c4f0770ff09db30b8b2ea6c687630c7801302c17986c69a57c30f0781d14b3f98a10b50c4ecebc16a5b5ec -896baa4135d5621fd6b6a19c6d20b47415923c6e10f76c03a8879fd8354e853b0b98993aa44e334623d60166ba3e3ca9 -b82cde1c2e75a519ef727b17f1e76f4a858857261be9d866a4429d9facf9ea71d16b8af53c26bde34739fe6ea99edc73 -b1a9e1f2e34895a7c5711b983220580589713306837c14073d952fe2aef0297135de0be4b25cbfaed5e2566727fb32ef -b42ed0e9eaf02312d1dba19a044702038cf72d02944d3018960077effc6da86c5753036a85d93cd7233671f03d78d49a -a402e34849e911dbf0981328b9fe6fff834c1b8683591efd3b85aa7d249811d6b460a534d95e7a96fdd7f821a201c2c4 -a774417470c1532f39923d499566af762fa176c9d533767efd457cc5e4a27f60e9217f4b84a9343ecb133d9a9aab96b7 -83dc340541b9ef2eb8394d957cd07b996d2b52ac6eb5562cbba8f1a3312f941c424c12d1341a6dc19d18d289c681ef40 -b2906c32d5756b5712e45dec53782494a81e80f887c6e1ef76e79c737625eccecb8fd17b20e6f84890d322b6ffde6eab -b89705c30cec4d50691bc9f4d461c902d6a4d147cf75ee2f1c542ad73e5f0dabe3d04cd41c6c04ab1422be4134cf1ad7 -8c3293651f4c4fac688bf5837c208b15e5a19ce51b20dd80ffc7fca12d3e615b2773cfc3ed62a1b39c66808a116bde06 -8fceb8ef481163527d1fc3abc7e1a5b3b6de2f654c3fe116d1367b177dcba2e0d2124a7216803513a3d53fc1e30435b9 -b2a42c827da630aaa3eb20ed07d136aa11ba01b4c8efc0a57ebab7d5b851a15daa6ba118bcffbc20703916e430e30a87 -a86340153abb3fe97414e2fde857e15aac27c9bb9b61258eea6766024f426ed0753f08f07f6b02b5375e1587ea3afcab -b006465e258e646f91ba889765113d3dc9bd657246c533cab6516d55ba054baa9d7276a3b0fa31730c3bd824845bf107 -a08aadc09428719cde0050d064c0f42c5b7c4f6c158227d7636f870957d6cfe821b4c62d39279a7c98f5a75fcb7bbfba -885e7d47ce9b50d21b95116be195be25f15223a6a189387575cc76740174c3e9044f1196986d82856b3fb25cdd562049 -b18c3780362d822cc06910743c4cbcef044823a22d12987fe2e56f3801e417f2e9cd31574ea1c5c6ee7673a14aa56e3e -a625570ef7d31c042d968018865aeeba34ee65a059ab1ec079c7a8ba1be9e24bce6afb7036c07d9d6c96ab014f95d661 -8fc9bd4764adc4c300b5bd49a06dce885d1d8aff9bae68a47976d0cd42110aa6afa2d7b90b64e81c0f14de729f2fb851 -91d88714cb669f5f00241aa5ab80dffb04109492ea9c72b59645eb1f85f3539c61db2ab418af986f42241df8b35445e9 -b98f14e664df2590dd2d00b5b5c817e388e5d9fb074f718637c33b3d4969c89e82fdd12db8997f5ff3bf5bb5ca5dd839 -86cb3d9f148cb2170317a4c22af7092155aa66ecff7ab1299b102fbbaa33ed2a284b97b08f529d2da9faea63fb98972c -92449f6b8a7c737ecef291c947cbd602c47d7fe47dc3426c2b413f3019169aa56e14c2a7216adce713e1c7bd5c08a83f -b08c1b9080bba88b44a65070948142d73c00730715fbdd01e13fc3415c5b4f3248ef514fa3ade4a918c9a820cccae97c -b0a05297da76e37c22be7383e60bba1cbc4f98ba650e12d4afcfcea569842003644a10ad73c9148958f7bf1ffa0a27d0 -839092c1f4e9fb1ec0dde8176f013b0d706ab275079f00f8e774287dd658d1b5638d5fe206f5f2a141911a74bb120f75 -a36bd669bdc055ece4b17ff6eac4c60a2f23324a5eb6d0d6c16a2fce44c39cfd52d1fa2b67f3f5e83504e36426fbfc40 -8aa428323512cf769645e2913a72976d32da4c0062ffe468a6062fd009340f0f23c6b63285848a0e7631a907adb032a0 -944800f7d43f41283eb56115ac39ccc5bf107ae5db6abcaba6936b896260cd09428a6b828c0bccebeb00541073dbf38e -8e700ca7c9e1538cf64e161dd8d16af56fc29d53c79648150d6d8c268b0c95c76acded723e29918690d66252bd75f5b3 -b9c4ce35b5b16b4c39b6e85800c76b26e8d0999500fabc1e5b6234a7f8da18c621266ac0d5ebc085354297ff21ac89a5 -a0c706d32063f1877f7e903048ce885f5d012008d4a8019dd00261a8bbc30834bffeba56cdeddc59167d54cc9e65f8fa -839813b736225087cbbcf24506ea7bf69138605036b764ec0514055ac174bbc67c786a405708eb39a6c14c8d7e0ec6ee -b1a5fef055a7e921c664f1a6d3cb8b21943c89b7e61524a307d8e45aa432e5765a27c32efdb32d88062cd80800a260de -b17f8202d9ed42f0f5cb1b1dbda60711de3b917a77f6069546fa3f86d21f372b8dd5cb86f1994b873ba9982404e08daf -b5211d54bd02d44d4d808ad57067606f3e9fa2cad244a5f2acef0edf82de3c496d2b800f7c05f175d01fa6ace28b44d1 -aa9c6f8f489b35fdb7544116fe5102a34ff542de29262f156df4db4ea6e064f5ea20c4bd877d40377ed5d58114b68f19 -826668b1f32e85844ff85dd7e2a8e7f4e0fd349162428bc9d91626b5ab21bdbacd1c9e30cf16f5809b8bf5da4f4fe364 -b30d14917b49437f9fdbae13d50aee3d8a18da3a7f247b39e5d3e975c60bd269da32da4e4cc8844666fca0d65f4e3640 -8c6918d8d94b36c6b9e772e9a432e66df16724e3b0660bde5ea397e6ef88028bb7d26184fbe266a1e86aef4a0dfe5faa -906d80ffd692c1dd03ab89be52e0a5a9e90a9cdbfc523d2b99c138ae81f45d24c34703f9cb5a666b67416e3bb6272bc4 -8b07e8ba22b436e64f011cacf5e89c55cd3bfb72ae8b32a3a8922c4fccb29de6f73662d6e330da6aa6e732a2187ef3c9 -9547466b4553a49adf59cc65d4c3c9401b2178947ebe3bd33c6e63cfb67d6be8729033158594f6f244b272c4487d6958 -aafcccea41e05cb47223fa8dfec0dd55964268bd4d05e24469614077668655ac8a51d2ac2bfb22862f8f4fa817048c2f -870f8c1173e8fd365b0a2e55c66eea3ab55355990c311f3042377803d37e68d712edcc5a0a2e2f5a46df0c1c8e6310c2 -b4288f792008f342935f18d8d9447fe4ddcfea350566e13dba451f58c68e27241af1367f2603a9dff6748e7fe0c53de4 -91c58c0e537d3afdcf7783601dd9cda2aa9956e11f711b15403760cf15fc6dffb40ed643886854571da8c0f84e17adfe -a43fec8ee92febed32e7cdd4e6314a62d9d3052c7a9504057dfba6c71fdfbeff1cef945d8f087bd106b5bec7478ad51f -99cf5e0e3593a92f2ec12eb71d00eccec3eec8662333471b2cb3a7826b7daca2c4d57ffba18299189cf7364e2af5df6d -af50f9ab890b7517ff1f1194c5b3b6f7f82eabc607687a8380be371a6a67b117aeb9b6f725556551b81f8117971706a2 -aa352430887053602a54403bd0d24d6b5181b44aa976dfa190e21851699a88127dcc904c90a48ec44610056b5dcd36c4 -964c821ea1902354736fa382a929c156bd67b9468d6920d47c27b9d0d304b6144118888d124c1f6785da596435ed2410 -b2284a67af26b5f5aff87b4d8e12c78ab37c5eb6e92718fca8549f86f4f001b660fc4520456aff72c9bcddd686603942 -83c54cbb997ea493dc75df4023071dce6da94268feaa2352373789616f012098270ba4fd60c791796a6f5062fb2cd35e -9143e8fee0b8f0f34c65c7750858093dcf165c6a83c026bfac2d5ffa746361eb4b6a14fdb43e403add901ac3735735a3 -97d7748a5b278ee47b18c9e60689b12a0a05be47e58e78bf8c04b9e8b34e2e2f2d3ac3c25c76ab2e0a75e8a54777b7c8 -b4e68f6f2d978a5411414c164c81ddb2a141b01ebe18c65a8626ca75d6432e5988310b50a888a78c3a0a242353525af5 -8976f4cc3eaf2684718cf584712c4adaf00a4d9c521f395f937e13233b30329658b3deacfe7e29fac84c496047f2d36b -a40bcdf4b6e95f1535c88dddcbf2074ef2e746b7fd232bdfd2b88f2f6d4bbf21c6b263cf5fd3e12a03476f2f5ffe00d2 -88c7b6337ee705acd8358ef6d2242d36b140afff0579a7784b3928a0c49698bd39c1f400e8a2e3eda5fbfb2e8f28fe51 -a98612ba8b450a71d2075d51617ebeb7ca401ad3cbd9b8554850c65ef4f093ba78defb00638428c9f1f6f850d619287f -b7e71d3ffa18b185c1a6bd75668ff65d985efc0a0c19f3812cafde9adbfb59ffd108abeb376e6a8877fdf5061562f82b -8a3e5fd776cc26908a108a22b1b122d60cb8c4f483cbedcd8af78a85217bb5a887df3efed2b8b4ec66e68eb02a56ca93 -b0d92b28b169d9422c75f9d5cb0a701e2e47b051e4eacd2fd1aa46e25581a711c16caf32f40de7c7721f5bf19f48b3f5 -88895739d5152282f23e5909cf4beebda0425116eb45fc5a6a162e19207686d164506c53b745fb2e051bb493f6dbad74 -adbccfed12085cd3930bd97534980888ee564dda49e510c4e3ca0c088894855ef6178d5b060bca8a8a1a427afdbec8a8 -87d00674abd3d2e7047a07ed82d887e1d8b8155635887f232dd50d6a0de3fb8e45b80b5a05bc2ec0dea9497b4aa783ac -806e1d3dfadd91cbf10e0d6a5e61738d0dbff83407b523720dce8f21f8468b8a3fc8102acf6ba3cf632ca1cb2af54675 -95a9dff67cf30e993071edede12623d60031fa684dfbe1654f278a1eb1eb7e1be47886d3f8a46c29b032da3176c0d857 -9721973288384c70a9b191436029e85be57970ad001717edc76d44cbfa0dff74f8af61d5279c5cd5c92c9d0f6c793f63 -95c22d1d9b51ef36ba30ee059dcd61d22be3c65f245d0a5179186874219c08e1a4266f687fc973e71f3e33df2b0f7fd3 -b53ec083dd12cc42ae2bae46883a71f2a35443c9ce4ed43aa341eb5f616a53b64211ed5aac717fe09ef1d50f551ed9f0 -a103dab6695c682400f60be8d5851ce07f12e4bd9f454d83b39c41ddcf1443bb14c719b00b4da477a03f341aa1e920cb -b522236988518e5363b1c4bb3f641ff91d3d4c4d64c5f065415b738160b4ce4b0c22e1e054a876aa6c6a52fa4a21dfa2 -a6a00562f0879702cdba5befd256a09f44bf48e61780e0677ff8c3fda81d8e6dc76ba1b05e3494ca9a4cef057eba6610 -b974a2ae631e0b348421f0cda5bd4ce7d73c22dd0fc30404c28852c33499818cab89fbf5c95436d56a0aab3bf2bbab51 -9148cf2a7b7e773245d4df5a9d34cf6d9d42b1a26a4ca6bc3013feca6f3941d6c44f29ba9328b7fe6ce6d7f6565f8e4a -a34035c4a63e98528a135cc53bbbcfcda75572bc4c765f212507f33ac1a4f55563c1a2991624f7133c77b748bbe1a6da -a0c45923cfb7bd272ee113aecb21ae8c94dda7ad1fe051ddb37ab13d3bb7da5d52d86fff9f807273476c24f606a21521 -81ec2ca57f4e7d47897d0c5b232c59d7b56fe9ce0a204be28256a7472808de93d99b43c824a0cd26391e6cac59171daa -8373852f14a3366d46c7a4fc470199f4eebe8ee40379bd5aae36e9dd3336decaead2a284975ba8c84d08236e6b87c369 -b47e878a93779f71773af471ba372cb998f43baca1ae85ea7ff1b93a4dee9327e2fb79691c468ec6e61ab0eae7ceb9f1 -8fc8f260f74303f26360464cfef5ee7eebcbb06073cef3b1b71dab806d7c22f6b3244ce21d0945b35c41f032f7929683 -87e3c4e1dab00596e051ce780b9a8dba02ecdc358f6ddaeb4ec03c326e4b7da248404745392658eb1defff75b1ba25c8 -aac95d8e3b7fe236a7ca347d12a13ec33073f2b2b5a220ecfd1986ca5c3889f0e6a9d9c377a721949aa8991c1821953a -91a483679437ae126a16f5dc3bba6e9bb199dfbba417f0dc479f22819b018c420edc79b602db6183c6591b1909df4488 -94a4b2c663aa87a2417cad4daf21a88b84983a7b212ffcd18048a297b98e07dd4c059617136976fac1d9e94c8c25b8d2 -83e2a690bfa93c79f878a63c0f69f57aabdd8bede16b5966ffba7903dc6ad76775df1fd5347e6f2825f6cd7640f45a45 -a316af7ac11b7780d15312dc729499a1a63b61c4283e103ecce43c3b0cbb0f4bce6ff04e403f5c7cb670dee80c75ab99 -8d0a911c54ee1f9f7e7794732ad87b434c3f356294d196a5e35eac871727fd32a49c27c2dfa10833f9e6f9c7ccbe0064 -8b8db09028298a1f6362b346c8bfeced7cb5d13165a67c0559a9798a95b7a4a9810c02bb852289d47c59f507bd24ce77 -962d57305c518f175ed5d0847fb52ddc4258ca0e4c9ddfc8c333a2ee9f8b4e48d25a3d7e644b785a5953e2e4063da224 -92e0799491898271769250fe88b0cb9dadec98ac92f79de58c418d23ef8c47fcf21ddc90e0cd68bb8f1deb5da82da183 -99855067125f6a6c3a3e58d3bd2700a73ef558926bd8320d2c805a68e94207b63eda6bdc5a925ec36556045900802d51 -a724ae105ab4364a17ddb43d93da1e3fc6b50213f99b7be60954b24dc375c4f93a0737f4a10b4499b6f52667d5f3a64e -82070fb43a63fb50869b118f8940108f0a3e4cc5e4618948417e5cc3801996f2c869d22f90ca4ca1fdbef83c4778421a -b25c04365d6f24d5d3296c10d85a5de87d52a139ddbcbf9e0142074bc18b63a8bc5f5d135bd1e06c111702a4db4cee28 -851093282dcda93e5c98d687a17a7ee828cf868f6c85d372d9ae87f55d0593d8f9f0c273d31f7afa031cf6aea6a7ef93 -93f04f086fa48578210ed207065d80a40abcc82d8bfc99386a4044561d35748ff6c3da6489933c23644ad4b60726da8a -84b1b50d1e876ca5fc341bbedab5b3cc0f6a3f43ea7dd72605f74d0d9c781297b2f12b7872dd600924f1659a4cdf8089 -81b0ba88c582d3956f6b49ca3e031c6400f2ec7e1cd73684f380f608101e9807f54866be0bb9a09c03953c4c74fbb3c8 -a641af6ac644c41a55dee2ef55d3c37abdb19d52bc1835d88e7adda6b6ccd13987c5fd9cba9d318cabb541aa6a0c652e -a7b75b0624d04ad0901070e691eb2d2645b60f87e9d6b26e77a5fb843f846c32fc26e76ae93fd33fe3b857f87bc25162 -a81ba3e2ed0f94c67cd02ba7360e134f8becf7ed2ed2db09b9f5ef0942f7073bfee74ca446067db6092f7b38f74ccc11 -ab80edcabab5830a24210420f880ebac4e41bf7650c11ba230f4889634dbf8e8e2309f36be892b071c67a3bab8fc7ed6 -94d69b64675076fecad40fae4887fb13a8b991b325fa84e9d2d66e3b57646de71a58ad8fd8700fefb46975b18289250b -b44fc0df480cd753a041620fa655be9df74963ae03d4625847d5bb025ceb37f48d19c8c9c444546fba5fe5abb2868506 -b56e2c51324d6200b3d9781b68b5b5e1617a68afccd28b3a12a4be498d2e3aafcd86514c373a9f3a001db733010c29cf -a359a0c172e5cd7ce25080dd2652d863d7c95a4a502ae277ac47f613be5991300f05978404a0acb3bcda93524dcf36e4 -b01427a3dfdf8888727c0c9b01590b8ae372b7b4080d61e17ccb581bac21e61c4a58c75db7a410d1b2a367304e1e4943 -95cb08be4a96c18fbf9d32a4bbf632242029d039a5fdea811488d3634cd86520d4f9806250a8c01855ee2481210f542a -b8594fe6c0717164058f08aedeed1853523f56cec5edbf0d2be271fa5e8bfd61f2974b0f3988d70f5baa2e7888c7ec1f -8f64ee89f59daf74fa1056803247c9d678783ee3917b12a201f30f7523957763e979ceaddb38bae20de40b9885728049 -b6093ee4bdb837bcc59172e236f4bdbd439c0a5a50e2aa16636cbff81b51e92989eb5f80a3f75c37ae7b5b942e55b3d2 -913b6fbb7b43e3e5c49e96cd8e82ed25c655e51c7b8ca82e8fbf92b01ac83c39d52f6f4efab5d39b0591a0538601a86f -81f42668479ca0bec589678dc0973bf716b632578690efe1a0f13de630f306fb4a189a98c2302572fd85d3877ee030b5 -90ff89c38a9a7189f28d35a088657f52283670e7fec842fa91c265660ea2e73b0ad6c46703d649f406f787490b7a7e4b -9077b8b5f1e083183f3152ceb9c5491b5d4b86525a08879f7fb6d5e27f9f1a6867cf0d81b669a4a2d1f1654b67fa8d9c -a7a0275cf5b894adbf2e54a972310cfe113e811872111d6ee497d03750d9f6ffa5517b6c13a99b111a4a91e8e4dfeeee -a08976bf8125b7538313a584bbe710741d630cab067a204ad4501cc4938874ce7aa6a1a826259c2e82ef10a66f1f36fa -8aa45385b5b97f1f3e45f2bbf7a4f3e8ef068e628608484971c97adeb610ebd5deec31317e03eb6536808921062c04db -945b106b8f3ae85e60dfd34ef3dcc079bc6f0aab6df279ed000856efd51321462038ac0a1ca5db3ebf6379bc341e7c55 -a4199c87a96f98cc9d8776fe6de131d2c706b481eb9e9a3bbc50a93d492d7fd724ea469f723fbcfb94920cb5b32c1d76 -a5347b1b2f6149805de67546c5ed72253311099bf1473dbc63edcf14a0a5e68d401f5341338623fbe2e2715b8257e386 -af5dcd03ddc3769e83351d6b958d47a06d4e5224bd5b0ec40ffe6b319763fab8572002f4da294a9673d47762fd0e6e1d -82ec1031b7430419d83b3eea10a4af4c7027f32b91c3ae723de043233b4a2e0c022c9e0f5a1ac49753800f119159112d -8a744d911b67d03b69811f72e9b40d77084547e4da5c05ff33893468b029a08266fc07303f7005fd6099683ca42b3db4 -93ab566bd62d3439b8fc620f3313ef0d4cb369f0f0c352cdaf8e5c9e50b9950ac3540b72f4bf5adcb9635f9f7ce74219 -b2a211d72e314799bc2ac7030b8bbb8ef4c38ebd0ebb09d6cbd43bd40c6c61d80a3aad02cc73f5775a08b9657da20a48 -98d60f0a98d28718e0c6dcccc35a53521ea7f2d8fe08ea474374a336b44cea4cd1c63b31f2ad10186822bfb54aca53e6 -831f89cb94627cfe554d46ae1aad8c1cde7ebe86c4bd8fac4ef73ac2d5b491f5efa5dc4198cb8ffbec563e0606b91d89 -8f8552583bc6cb3fb176b7202236ee4128faf0c8ec608f9150f8e011d8c80b42aab5242c434d622b6d43510eaef752c0 -897bf27baaee0f9a8445200c3d688ae04789c380d1b795557841606a2031092328eb4c47fef31c27fdd64ba841d9d691 -b57589a4af8184b4a8ceb6d8657a35522672229b91692c1cec3ac632951e707922a00086d55d7550d699c4828bcfaab1 -98c2fe98095e026aa34074bcff1215e5a8595076167b6023311176e1c314b92b5a6d5faa9599d28fca286fadd4e3b26c -a034992e563bd31ede3360efd9987ecddc289bc31046aa8680903bb82345724805e6f6cf30f7889b6b95cf7319c3aea1 -85c33d9f10cc7185f54d53c24095e621966065e0ff2689a9aa6bb3d63706796c37a95021738df990c2c19493c0d44b64 -a8c1247d6de2215f45b50dd2dc24945ff9b93184bcc2159b69703b0bba246adcd1a70a12659f34c4ca4ba27dea6e3df5 -83ebdad2834c97bf92aac8717bab2f5cb1f01026b964d78e2f3b44e99d7908e419165b345d2b2f125b903096584e6683 -b0af6f7f81780ceb6e70adfd98e7702ec930c8ca854b50704c4a0fc8b887b9df60a6fe9038b487f3ed0eb8eb457307ea -933ec7e53882453898617f842ab2efae4756eb6f6ea0161cced5b62a0cdde4c08c7700d52f7546d4dd11a4c9e25d624e -adf6e6d4706025f85eb734f506dde66459c9537a1abf6189199cf219ae583b461e11c6242fce5f0795e4d9025270fabf -89e4316319483098761b0b065df4cfb542963b7a2556ba5425b6442fb0e596eb2a4f03e2dc8c617eebe8f243a12e7d10 -90c5a147555759ebc4d0e15e957a548315f9994ef0c7a3f53f2d18da44fb93bf051d96ba8551597a6f3e701b926fd791 -a151a9a5199c72c697b771cd81e550fc6f9596c752ae686ad988b316a7548360cf9785ab4645164d96cfdf9069a94020 -80cba11a3977729d7948db5bcc186159f4cae7c0a835bb38bb781e287dd6c238508e748f23454405c9d5eed28e77df02 -ae4b92ea03cb8ad12ad3ec76869ad05acb09f9d07a3c9a87dec0e50d9a276fe5d3d515a8c446f3aa35cd7d340a22c369 -8630062709a1f180f952de9f1ca3f41acce5420677f43d9619097e905a6237f1908d66db7a4dfdf1b2b92fb087e9944f -81defc33dd383d984c902c014424bddd5e53b013f67f791a919446daa103b09b972fa5242aba1b1dbe4a93149373f6c3 -963891ecaea97e661bac2594642327a54f5a0beb38fcb1c642c44b0b61faab9c87b0c9f544a3369171b533d3ab22f8f1 -932fadbff5f922ddcd4da942d57fe3e6da45c3d230808d800a3ca55f39b0b62f159be31a5924b395d577a259f48c6400 -992ce13bd037723447f88aeb6c7722fd9510c7474192b174ea914ed57c195c44c298aec9a8cabac103f0a5b50051c70b -b032157b3e4fe69db6ce6bb10bdf706a853fbd0bee08c2ab89da51ad827425df5df498b90e7a30247a7f9e954ca986e5 -b2478d4874578da3d5000893736bb65712e6aafe96e6fa5cf5878ae59ba0ce640dbe5d76ec2b5baca75af57def471719 -a387c17b14dd54910fecf472f760e67cf71a95e9e965cc09484e19581ada65e79938b86136a93e287e615fbd4908e080 -98f02be271d0f8841d8d561163f9e55e99b57aff121a93fba7a4654bcf15a0899811f00f5bcbfbebd98e365a0e332e97 -a3c34f01d54cab52a8890391b8cf152cc9cdc16e7e53794ed11aa7b1a21e9a84d39ddcfbcb36c5df6891c12307efc2e0 -a940331f491ec7ad4a9236ca581b280688d7015eb839ee6a64415827693d82d01710dc4bbd5352396be22781fea7a900 -b10874ed88423731535094031c40c4b82af407160dfade4229ac8f4ef09d57b3db95c4a9d73c1a35704f6bd0d5f6c561 -a9c5a4a7680261c1b0596f8ab631d73d4a7881b01e6559c628b5cdafa6dd2b6db2db64f3f2ab5841413a8a52b966a0da -8fc154564a61d5e799badc98b43a3587f804385a850adce9a115cbd2ad911f3fd4072b8e6b22fc6c025a6b7e7ea5a49f -b9caf7c6dcce3d378aa62c182b50bc9c6f651eb791d20fffa37ef4c9925962335fe0b3bc90190539312aa9ccf596b3b9 -90c5b7acf5cb37596d1f64fc91dee90f625f4219fa05e03e29aebea416c8e13384f2996f8d56791bcf44ae67dc808945 -ab8d311fc78f8a1b98830555a447c230c03981f59089e3d8a73069d402a3c7485abe3db82faf6304aaca488a12dbe921 -8a74fda6100c1f8810a8cacc41b62875dd46d5c4a869e3db46202d45a8d9c733b9299dda17ce2ad3e159122412a29372 -8769dcacba90e6fc8cab8592f996c95a9991a3efecfb8646555f93c8e208af9b57cf15569e1d6e603edac0148a94eb87 -854fd65eea71247df6963499bafc7d0e4e9649f970716d5c02fbd8708346dcde878253febb5797a0690bd45a2779fa04 -83e12dc75ef79fd4cc0c89c99d2dace612956723fb2e888432ec15b858545f94c16fae6230561458ceee658738db55ba -8416ef9ac4e93deff8a571f10ed05588bef96a379a4bdcc1d4b31891a922951fa9580e032610ac1bb694f01cb78e099b -93aea6e5561c9470b69d6a3a1801c7eef59d792d2795a428970185c0d59b883ab12e5e30612d5b6cde60323d8b6a4619 -91d383035aa4ec3d71e84675be54f763f03427d26c83afb229f9a59e748fb1919a81aca9c049f2f2b69c17207b0fb410 -b1c438956f015aef0d89304beb1477a82aed7b01703c89372b0e6f114c1d6e02a1b90d961b4acbb411cd730e8cacc022 -a1ee864a62ca6007681d1f859d868e0bcd9e0d27d1da220a983106dc695cb440980cfdb286e31768b0324b39ae797f18 -b57881eba0712599d588258ceada1f9e59c246cc38959747d86e5a286d5780d72d09e77fd1284614122e73da30d5cf5c -a48f9ae05ba0e3a506ba2e8bbce0d04e10c9238fa3dffa273ef3ffe9ec2ed929198a46507c0c9d9b54653427f12160f9 -8db18da7426c7779756790c62daf32ae40d4b797073cd07d74e5a7a3858c73850a3060f5a3506aae904c3219a149e35d -a2bf815f1a18d7be8ce0c452dfc421da00dcd17e794300cdd536e4c195b8c5b7ccc9729f78936940a527672ac538c470 -a34c6f1f2398c5712acc84e2314f16d656055adcafad765575ae909f80ab706cf526d59e5a43074d671c55b3a4c3c718 -b19357c82069a51a856f74cbb848d99166ce37bd9aca993467d5c480a1b54e6122ebddb6aa86d798188ea9f3087f7534 -b440eac6f24d12c293d21f88e7c57c17be2bdb2a0569a593766ae90d43eccf813a884f09d45a0fb044ee0b74ff54146a -b585d42ef5c7f8d5a1f47aa1329f3b1a566c38bf812af522aa26553010a02bfd6e9cc78fdb940ef413e163c836396a5f -aca213b27f3718348e5496342c89fffc7335f6792283084458c4a1aa5fe0a1e534fcec8e7c002f36141308faae73ef2a -b24c07359769f8ffc33bb60c1f463ea2baad440687ef83d8b7c77931592d534b2c44953c405914ace5b90b65646c1913 -b53dfaf381205a87ca4347328ff14a27541fa6436538f697824071d02d4a737ceb76a38dcc6e8dadef3b5bc6442f5109 -b55972d8ed5197215c0a9144fc76f2cd562ca5f4e28c33a4df913363fd1388978b224c44814adb4c065c588a4ac1fe10 -a3303bc650e120c2e9b8e964ad550eb6ac65ffe6b520768b3e8735565ae37eafdc00e3c15fae766d812f66956a460733 -b11e53912ea0e40c3636d81d7637e10c94cc7ed9330a7e78171a66d02b7603f4cb9b3f6968104b158de254e65b81640f -b076bb9f6d396aa09c2f4706ea553b426fdfd87d7d69e438285b74d334e82f73973cb4dbd6cb1647493433dad65dbc41 -9415828b1632175f0b733541e32c26a9c88fe12c721c23e595f2efceaa7f867f359e32564b7c032185686587ac935cf4 -89579a112c306181c79aabdbf683e7806357febcb73bf5e8883862ae29618ef89498b62634404bb612d618fcd16da415 -8761bcd55d04297c4f24899e8fb9f7c1fcd7449ae86371ee985b6a262e228f561c2584980694d9bf354bdf01543edb6a -9100c88bf5f6f00305de0c9cf73555f16a2016d71c50cb77438e8062bd549fa5407793a8a6a7e06398756777680a2069 -9235dfef45aeff9c174898b0755881b7171ed86362854f0eabc3bc9256176c05a5dc27ca527c91c3fa70c0ec5fd5e160 -ac53b1d677cebab6a99381dd9072b8ac1abae9870ec04a1f8d2a59b6f1de797c1492b59af6948f5cf2b20599170f5bba -946542936b0c59156e8fd5c1623b41369bc2cbcc46ece80360dcb5e7cce718a3dd8a021f0b9c223062a4e43d910b634f -b1e9939b34e1fcc026e820fcfa9ce748b79499f8e81d24a3ef0457b3f507fe5fa37b975a47c143e92eb695623b4e253b -9382d9b5766f6ae960d8a8435e8b5666e57ef8e5f56219e7bfd02857afe5cb16f44d70a9e444cfb1008649ae9b863857 -91770ed1215ed97dca1282b60b960be69c78e1473edb17cd833e712632f4338ff74bf435c3b257439497c72d535ae31f -8eb2cbe8681bb289781bf5250e8fa332141548234c5c428ff648700103a7cd31fdc2f17230992516c674aa0ab211af02 -a823b71c82481bc6ac4f157d5c7f84b893a326bbb498c74222427ded463d231bc6e0240d572ab96266e60eb7c8486aea -a13ce4f482089d867e5babcd11c39fa9a9facd41a2c34ee2577de9ce9c249187e16f2b3a984cc55f9e45b9343462d6d2 -8d80e7bc706059cf5151f9f90e761b033db35d16b80b34dc8b538adc8709d305a0c06933dcd391e96629cf3888c8bf87 -abcd36cdd86c0fb57fb7c0d7a3b9af5fd9aed14e9f4e7e84b0796c5c0ad18c41585e8c46e511cef73dc486fe43f6a014 -a947a5b6916f416fa5a69c31aba94add48584791148b27d0b3ed32c02a05dfc06f7fdc5006e3b2503bdf6e410e30f2fb -b158e621580659f1fa061d976b8591ac03b53ecd23d9eb2b08c1a20353d78438287749664d196020d469ef44b3b8752e -90a5a9540281e481ac4b8d29968f477cb006b56bd145529da855d65d7db0cf610062418c41a1d80c4a5a880c0abe62a0 -b2c91808b6289d08a395204a5c416d4e50a8bb1a8d04a4117c596c4ad8f4dd9e3fb9ce5336d745fc6566086ae2b8e94f -af6767c9b4a444b90aeb69dfddae5ee05d73b5d96e307ce0f3c12bccca7bc16475b237ba3bc401d8dafb413865edf71e -8dcecf624419f6517ef038748ac50797623b771d6111aa29194f7d44cfb30097ced26879e24f1b12a1f6b4591af4639b -954437559d082a718b0d6d7cec090532104ab4e85088e1fc8ee781d42e1a7f4cdb99960429707d72f195ff5d00928793 -80f0b7d190baa6e6ab859dc5baab355e277b00ddcca32e5cebe192877ad1b90ead9e4e846ca0c94c26315465aeb21108 -b8c29f181ed0bb6ac5f6a8d9016980303bb9a6e3bd63ce7a1a03b73829ac306d4fab306ac21c4d285e0d9acb289c8f2a -a7685079fe73ecaeabf2a0ef56bad8b8afb6aeca50f550c97bf27e6b4a8b6866601427fcd741dc9cb4ce67a223d52990 -ada2ebf6f2a05708d3757fbf91365ec4d8747eb4c9d7a8728de3198ceac5694516ab6fd6235568aecd8d6d21fef5ef48 -846bc5da33d969c53ab98765396cab8dcdbb73b9836c9bda176470582a3427cb6de26d9732fab5395d042a66bdba704c -800a3a7ea83ce858b5ebc80820f4117efa5e3927a7350d9771cad9cb38b8299a5ad6d1593682bba281c23a48d8b2aa71 -a002b18595dec90b5b7103a5e3ec55bdd7a5602ee2d3e5bd4d635730483d42745d339521c824128423dfe7571e66cbaf -b6b4e2067ac00a32f74b71007d8ab058c2ef6b7f57249cb02301085e1a1e71d5de8f24f79b463376fd5c848f2ab1c5bc -a3e03036db1b6117efe995bf238b0353ad6f12809630dca51f7daaaf69f7db18702e6b265208944bfb1e8d3897878a51 -add16712f66d48aab0885bd8f0f1fb8230227b8e0ffca751951c97077888e496d6bfab678cb8f9ffba34cee7a8027634 -ad211af2dd0748f85a9701b68c19edd4a7c420e497cb2e20afdc9df0e79663841e03b3c52b66d4474736f50d66c713ce -8c8a899ce0f16d797b342dc03c2212dda9ee02244c73c7511626dba845d11a0feb138441da5459c42f97209bf758cd9b -a17efc75c7d34326564ec2fdc3b7450e08ad5d1de4eb353de9d1cd919d90f4be99f7d8e236908b1f29cf07ae1ffe0f84 -862d4a8b844e1b0dd9f4deff180456ebed5333b54290b84f23c0ddb2725ac20307e21cbb7343feac598756fe36d39053 -9187fbb19e728a95629deda66a59e178f3fcd6e9d7877465aa5a02cea3baba2b684bd247b4afbf4aa466b64cb6460485 -85ae5636688d06eab3be16e44fe148515d9448c6123af2365d2c997f511764f16830610a58d747adab6db5031bea3981 -8aa8a82891f4e041ce6df3d6d5d7e5c9aaaffe08e0a345ac0a34df218272664c1b7be2450abb9bc428bd4077e6e5dcc4 -8c3bcc85ea574dfe1b9ca8748565c88024e94374434612925b4e9a09fa9d49c0a56b8d0e44de7bd49a587ef71c4bff5f -9524f9dd866fe62faf8049a0a3f1572b024120d2e27d1be90ad8b8805b4e2c14a58614516281cc646c19460a6b75587c -84580d9c72cfa6726ff07e8d9628f0382dc84ce586d616c0c1bd1fd193d0a49305893eae97388de45ba79afe88052ee9 -b5573e7b9e5f0e423548f0583423a5db453790ab4869bd83d4d860167e13fd78f49f9a1ffe93ddddf5d7cd6ec1402bc4 -aff658033db3dad70170decb471aee2cf477cf4d7e03267a45f1af5fd18200f5505c7ce75516d70af0b0804ec5868a05 -84a0eab4e732a0484c6c9ed51431e80cea807702fa99c8209f4371e55551088a12e33a11a7ef69012202b0bc2b063159 -a68f8e730f8eb49420fe9d7d39bb986f0584c1775817e35bb3f7dae02fd860cddf44f1788dc9e10d5bf837886b51947f -946002dd6cf7a4fd3be4bf451440e3f3fd7e9b09f609fa4e64767180b43146095dfc4b6994287f8cfa6d1390d144be71 -b7f19777d0da06f2ab53d6382751dc5e415249d2c96fce94ef971401935c1d1f7d3b678501e785cf04b237efe2fe736e -81e5c66dd404fc8ffd3ac5fe5e69ead7b32a5a7bc8605a2c19185efcc65c5073e7817be41e1c49143e191c63f35239c1 -b5f49c523532dfa897034977b9151d753e8a0fc834fa326d0f3d6dacc7c7370a53fc6e80f6d5a90a3fbec9bbb61b4b7c -8fc8e78c07319877adfaa154a339e408a4ae7572c4fb33c8c5950376060667fbfc8ede31e1b067933d47e3fdbf8564d7 -859cfef032a1a044532e2346975679545fbb3993a34497ce81bdcc312e8d51b021f153090724e4b08214f38276ee1e0d -ae476722f456c79a9c9dfdc1c501efa37f2bff19ab33a049908409c7309d8dd2c2912aa138a57a8d5cb3790ca3c0ba2f -89acbbeffb37a19d89cfe8ed9aa8b6acf332767a4c54900428dd9ab3bf223b97315aca399c6971fe3b73a10a5e95a325 -90a4a00418fdf4420a4f48e920622aae6feb5bf41fd21a54e44039378e24f0d93ccc858d2d8a302200c199987d7cb5e4 -a3f316b0bd603143eba4c3d2f8efe51173c48afe3c25b4ca69d862c44922c441bd50d9a5040b7b42ba5685b44071c272 -a22f4dc96fedd62b9a9f51812349e04d42d81d0103465c09295a26544e394a34abdc6ded37902d913d7f99752dbfb627 -a49f51baf32d0b228f76796a0fef0fe48a0c43ec5d6af1aa437603d7332505be8b57b1c5e133bc5d413739f5ae2ce9d0 -a9e4fe133057a0cd991898e119b735b31a79811307625277c97491ff5d864c428cfa42ae843601d7bb05c0313472d086 -b987edfe0add1463a797ff3de10492b2b6b7ef0da67c221ab6f0f2b259445768a73fbe495de238c4abbe4d328e817c49 -b7f0e4532a379a4c306bbef98b45af3b82b17175dfe0f884222ed954c12f27d8a5bdd0cdeb1df27ff5832ba42a6dd521 -9471bc5ad5ec554acfd61b2eb97b752cb754536f95ae54ca2cbd1dc2b32eb618881f6d8a8b2802c1a4e58c927067d6cf -b4c84f09225cf963c7cc9d082efe51afbbbe33469dd90b072807438e6bde71db8352a31bb0efde6cd3529619812ef067 -8f08005a83e716062d6659c7e86c7d3b51e27b22be70371c125046de08f10ea51db12d616fbf43e47a52e546e7acaac7 -a8937e66a23f9d9b353224491f06e98750b04eca14a88021ee72caf41bdce17d128957c78127fba8ef3dc47598d768a7 -80ad991de9bd3ad543cddeaa1d69ca4e749aaefb461644de9fc4bd18c3b4376c6555fc73517a8b1268d0e1e1628d3c1f -b22f98bca8fe5a048ba0e155c03e7df3e3cee2bfe8d50e110159abdb16b316d6948f983c056991a737b646b4d1807866 -b0bb925c19ca875cf8cdbefa8879b950016cc98b1deb59df8b819018e8c0ad71ea7413733286f9a1db457066965ce452 -95a991e66d00dd99a1f4753f6171046a5ab4f4d5d4fe0adfe9842795348a772d5a4a714dba06b4264b30f22dafa1322f -ad91e781fa68527a37c7d43dd242455752da9c3f6065cd954c46ae23ce2db08f9df9fec3917e80912f391c7a7f2f7ffa -a202d3becbf28d899fe28f09a58a0a742617c1b9b03209eca1be7f072a8ada1f7eac2cc47e08788d85e1908eb9d3d8ee -a360ccb27e40d774d5a07b4ebed713e59a0d71b3ee3f02374e7582b59ec4a5ce22cc69c55e89742ba036dd9b4edd8f34 -a10b897a946882b7c9e28abbb512a603ffa18f9274369843eb3491524a321df1f572eea349099ac6e749ea253c901ea0 -b782a672cd344da368732ecd7e0a1476c2af04613d3eb6da0e322f80438af932bd6d49be7a6f69f7c877512731723d89 -aeccee8dfd764e1adcfc4bf669e0fa87a94e7c79324333e958df47888bff5cec358b8b5bbb48db54822b54d11bbb4bc6 -ad4953913662a9ee8753a354864339f43916f2c2390d0a3f847c712b42718ee00ee14158d730709971941e8680d54560 -92ccb31d6c9e8940c7e8a4873e7eb9de9fb2fa2bac344fa367062ea451fd49a6920a45218dca3ee968711397d2a01536 -9448d9b2b3d12dde9b702f53373db8b8595f9d1f9de2ebee76de292f966f375316953aadf6bfc0e4e853e1fa12d8f02c -8919230878a7219da8c80a4b7d00b9169fb503e72d79789dd53863c243b8d0fb0a819d46fa636d805d0b9b1d15d1f2d9 -b6581ab01215aac023f5e6f57419b6aa63c0743c07caf57d4e146b56b02d90ce1423f70489ac3a11e5c968cb924f937c -a793ec1b1fe56a76920296af06073caadfd6f1d7e30950f8ca13de3de45fe275ca4b361f5249d9405264c3a06ebb5502 -86385b4a4e1bfb5efe7bfef8fd0dfeba7f4400852237cab60febb1dfa409e497a649e81284b5a15fe680b78927256756 -85d10600de96103daa7c90657174b6cb4a1286df5379f1eda9f11c97f9df57043c290eb1ae83658530fe0fd264867b86 -ae01b2396d0f598c21659cd854c15edd4904a34d22278aef97c9260a14a8b250b52d972d304ac4b187c24d08795d5355 -b91b3e4b6fc06e88081fe023ef1b773d82c628eb0f73a2731a9aa05b0dc89b7aeef2eea60125d302e696f45c407aeac2 -986d0f478e33af7568eab6bb26a55c13ffd7cae27525b4abe2f3a994bdb11bbc73d59bdb9a2f6b6ba420a26f8f620ba6 -9746f4fdeef35feaff1def0ea5366b64f21ed29749ae6349f9cb75987e7f931952f913f446100f2a6b182561f382e8eb -a34a116cfde1acbce0d7de037f72a7ca30ab126d8f4815b2b8bcb88e0e6c89015a4daaf4d4ce8eae23eb5d059cf9a5cf -80c3ea37f6a44f07cc9c9c881990f2a5deb9f9489a382718b18a287aa3c50ee6ebe8fd1b3afb84a3cf87f06556f4ca15 -97cff3bc88cfc72ce5e561f7eeb95d4ffb32697e290190c7902e9570c56b3854753777fc417fd27536fc398c8fefb63b -b8807232455833e4072df9bffa388ae6e8099758c2a739194719af7d9ed4041974a6cd9605f089de8b43f0e12f181358 -96f79fca72f75dc182c71f2343f0c43b06d98563fd02d2e1fbc031b96601608d8a726c811a74bb51ab8b0a3ce3632dc4 -b5262761680a4235a8c1257de4735cdcadf08d5d12c6e9d4f628464d5c05dfff3884a9ef2af3b7724b5a8c97e6be74eb -b6ce0eada73433d98f8fae7d55e4ea2b9d9d7a0ae850d328dd06991f27b1f03e470868fb102800ff3efe4ee1698531b9 -a37b7d9fe9d3fdfbc72c59cf6cacc7e7a89d534dea3d73121f7483331aec8ab3fbff58ffabb943b75d6f86df0ba43262 -93fce9be8a27fcaa1283d90d3e87265a6221ee302ec708161a42bd00ffe8e726743d9e187e1bf4307c0e3f25afbb1d44 -a4ea919021346ae7ea69d5e8f46d860b24c35c676b62f4e577c90e0c05c5646fe73721b143b7c38835dd4b443e6c3676 -b79983a5948453f70dfa4c396ce1945204498fe79f40c0667291bd0fdd96ed0b9ea424571f7ade342275c854c9f03d9e -866f8e395ed730b614b70bf999cad6e87e9086c1f5aea8d69020b562ee285dd0fb93afaca0dd13a0713f74a3f9340f01 -a3fef158782292c6139f9a0d01711aa4ed6f5cac11d4c499e9e65c60469ae3afbde44fb059845973a4b3bbca627b7eb7 -b4a2c0321b68f056e7d8051beede396fa2f0704d8aa34224f79f7b7a62eb485fc81889cb617019622fd5b5fa604516f5 -8f0e3edddbaead9059df94de4139e3a70693c9ea9bc6baaa5695dddfd67263b33926670159846292801941b9a0c6545b -9804e850f961e091dadd985d43d526ba8054d1bf9c573ed38f24bbd87aeaad4dcba4c321480abc515a16b3b28f27bb2a -95f330da28af29e362da3776f153f391703a0595323585220712dae2b54362cc6222070edd2f0dd970acfbe2e3147d5c -82d03b771231179cc31b29fe1e53379d77b5273b5c0a68d973accd7a757c7584dbb37f0507cdfde8807313ec733a6393 -81b3c39a9f632086e97b7c1f0ec7e2eaf9dc3cb0d84dec18a4441dbdc9fe9878fde4bcfa686bca1a9522632a353a5566 -a2db124ab2b493d5f9a1e4ca6b3144593c2fc8bfac129fd79da11dfbb7ef410a234fda9273a50a5ca05d7b37cc2088a2 -aa8550633c9449228702690cc505c0fc4837ea40862058e8f9713622b34d49fdc3a979b9317993c5da53b5bb5b7f4974 -ae783bcf7a736fdc815d0205b4c2c2b2fee0a854765228f76c39638ba503e2d37f1e28f6bdf263923f96fead76b4187b -b5ec86092c1d250251e93bab2f24e321afd2cd24cf49adfcbed9e8bc5142343ae750206c556320551e50fc972142f0da -b3b5791b590a6e9b3f473d5148624014aa244495249322a5d75cde2c64117ff9d32f4b0698b0e4382e5e7f72933061f8 -876c6a9162c17b16d6b35e6ce1ba32e26aec7dd1368bceab261ab880ad845c91e54b96a52c7d3aafbfbafc0e37139dca -902ddb5774d20b0707a704486457c29048776a5b88c377b14af6616c8ddf6cd34f49807df9c9d8866d6b39685cfb0f19 -8b87f71f94bc96de927d77a5d7123fa9cdda8c76aff64a5e6112cbc2eca43b07f8376db3e330f8af6a1db9b948908a6a -a69a5922e572b13d6778218e3657f1e1eea9a9682f6eb1b731d676d03563e14a37ff69bc5e673c74090ecb0969a593f7 -aff3510d78ba72f3cf5e3101847b7c4a956815aa77148689c07864e8a12dd0ef33d5f6c8cb486e0ea55850161f6afed0 -aa9c459cb2a008d94cbee2c6b561d18b0d7c6ffa8a65cbf86ae2c14eec070ee9d5324f5d38f25a945ddcd70307e964c4 -8310e15b050b1e40ece7530b22964bde0fd04f48dfffdec5a0d1fb8af0799a7fdc1d878139fb7cb8d043d3a52c2d1605 -b8f0856ce2c4034ee4041d0383f25fb0eeefc00b82443311a466fc18608313683af2e70e333eb87e7c687e8498e8a1ce -a8200a75c158fbb78474cab8a543caecd430b5d8b9964fc45d2d494dd938021cd00c7c33413ad53aa437d508f460a42a -a310091472b5b42b02176b72d5f8120bdb173025de24b420e3ca3fb9a386c39092a1d1bb591c6f68ee97a268a7ff9e95 -b23f1bf8bcec9cb5232b407115eead855fd06f5bf86ba322ad61d45460c84f0f36911aba303de788c9a0878207eac288 -ae4c129ad6d08be44690bb84370e48bfd92c5d87940750ee2c98c9a2604456f7f42727ab211989657bb202f6d907df04 -95992057d654f3e189a859346aa9aa009f074cb193b7f5720fa70c2b7c9ce887d886f6cff93fa57c1f7c8eaa187603f6 -ad12d560273963da94151dd6be49c665d7624011c67d54ab41447452a866bc997e92a80bdd9ca56a03528e72c456dc76 -8e4eda72e9cfcaa07265bb6a66d88e9ce3390ae1a6b8831045b36ea4156b53d23724824d0f0bca250ce850c5926fa38f -980fe29c1a267c556532c46130fb54a811944bdfea263f1afcdab248fa85591c22ac26167f4133372b18d9f5cce83707 -a7da9f99ddde16c0eac63d534a6b6776ad89b48a5b9718a2f2331dce903a100a2b7855cf7b257565a326ddc76adc71a5 -8ca854c55e256efd790940cb01125f293e60a390b5bd3e7a60e13ac11a24f350a7eb5ebddfa0a2890905ca0f1980b315 -9440335818859b5e8f180893a8acedceabaaa44e320286506721c639a489b5bfb80b42b28902ee87237b0bd3dd49552a -b9da545a20a5e7d60fd0c376dcaf4b144f5c5a62c8ffa7b250c53ce44be69c4e0d5e4e11422ef90593ae58ae1df0e5d3 -b75852a850687f477849fc51e0479703cd44428671c71bfdd27fe3e7930b97d2fc55f20348ca4e5bc08db2fc16a4f23c -b515081d8d099e4b6253c991ca2d3e42633f5832c64aa8f9cde23cb42c097c2c3717c46c5f178f16c58295f97b2b3fe7 -9506c9902419243e73d3197e407985dd5113f16c6be492651bbbf9576621942710aea74522d6fb56d5b52c6ccdaa4307 -952673ae27462a0f6c9545eede245c2f8e2fd6077b72a71f5672f1a5a02c263bc2a66f24f0e30376feb7a8187b715f08 -a8f1e2085ed666a8f86b474d9589dc309d5c83bd53e745f8e09abe0dfbaf53e5384c68580672990344d4aa739438b4d8 -ad6e04d4a67a5a5529ceaf7de6e19416be5b4c436610aa576ac04aee3b73317da88f891121f966393a37f52b775a2dd8 -a35a884736f08c7f76923ae7adb17fdac04e6c505178bca9502eaa2ed16d4d93fa953fb6dcf99e9e9962a6eb3eeead00 -b8af72273360bab4b3ca302cf0659717cbfb335fbc9ad4ffdd3340113ece9e63b2bdbd611e5f6b740a4689286f9a452d -b1a1f4ba2640800c3ed3892e049f6e10f8a571efa3bbe21fe2d6cee8fded171c675a3bb8aa121e2d1d715de84bad2e2b -8102a6c3598b40da4d6e8eccfdd5dadc8d6262e38b69c5b211b0732f4c6e3045d79fba12770a0b2b66f1e9f4664b1510 -90979587d75bf12819f63832beea7dcbef101f6814bf88db4575bfcd9cf0ea8eceba76d4d6db17630b73b46c1acfe011 -8dd98f14d2beb5b5b79cc30f6825ec11ed76bd5a8864593ffc0c2baffab6872bad182e1c64b93aab8dd5adb465fa5cec -8083334dadc49c84f936c603a2857f174eda5659ab2b7214572f318aba3ebd7b1c50e7cbea57272b9edf106bd016df3b -a634d08d2e8641b852e89d7ccab1bab700c32fb143bcbea132f2a5fb2968d74ded2af4107f69818798f0128cc245a8cb -94fc2dccf746d5b3027f7cf4547edf97097cd11db8d6a304c1c2ca6b3aba28c1af17c08d2bbb66f88c14472e0196a45e -b257a6fb01424b35e414c1c002e60487abb3b889d74c60cbdbf591e222739c6f97b95f6962842401f5e2009e91b28c55 -81955bdbf25741f3b85d5044898dc76ae51b1b805a51f7c72a389d3b4d94b2e3e0aa1ec271685bbcf192ed80db7367ab -86eb229b66c542514e42b113b9de7d4f146861a60f2a253264873e7de7da2ac206e156ff11f2de88491b9897174fe2f4 -8b8db00533afbb56b3d7d7a9a4a6af3cebb523699ffcb974603e54f268b3ef739c41cd11850b9651d9640d72217c3402 -8b7cbb72a6c4408d5f1b61001e65de459790444530245d47d4ee8e2d17716695283f21540bd7ac4f5a793a0d00bdf1d4 -875920b9bab4bc1712e6af89ae2e58e9928c22095026070b07e338421b554d9f96e549ac3706c6c8d73f502913a27553 -9455d192db7b039b3e8f0bc186c25ff07dfbe90dab911e3c62e3bd636db8019ed712cbb0ecd5cbb9a36c11034e102aba -8cb0b28e5d3838d69f6c12274d6b1250f8843938065d0665b347977fa3c1c685caef6930bae9483ed0d0a67005baad76 -94df2e14aae1ae2882ab22a7baf3dc768c4a72b346c2d46bfd93d394458398f91315e85dc68be371f35d5720d6ca8e11 -aacd94b416bfbeb5334032701214dd453ad6be312f303b7bec16a9b7d46ab95432a14c0fbf21a90f26aafb50ec7bb887 -b43d26963665244633cbb9b3c000cacce068c688119e94cc0dac7df0e6ee30188e53befff255977788be888a74c60fc2 -b40d67c9ad0078f61e8744be175e19c659a12065fe4363b0e88482b098b2431612e7c2fa7e519a092965de09ceafe25c -82cd4a4e547c798f89ce8b59687614aa128877e6d38b761646d03dc78f6cdd28054649fb3441bcd95c59b65a6d0dd158 -a058e9700f05cef6e40c88b154d66a818298e71ae9c2cf23e2af99a0a7dc8f57fbe529d566cb4247432e3c1dee839b08 -95c6f84406466346c0b4a2a7331ac266177fb08c493d9febb284c5ca0b141ccc17aa32407f579666b208fb187c0227dd -905d1d47a26b154f44d7531c53efbc3743ff70bd7dba50c9b9d26636767b0ae80de3963c56d4604399126f4ad41a0574 -83dfa11c520b4abaefe1b2bc1ce117806e222f373cd4fb724f3c037c228e3379d27a364e68faa73984ba73a0845f1b9a -a16e54786ba308a9c0241aff8f1bf785dece387d93bd74aa31de0969e3431479e2c0abebff9939a6644d2b0af44f80bb -81ac565212365176f5be1c0217f4e7c9fdbc9fe90f16161367635d52edcf57af79290531d2e8b585e1223d33febd957d -a296f4b09915e5d80ff7274dc3ffc9b04f0427e049ea4ef83dca91095275e8a260ef0335c7b6585953b62682da8c8e99 -a9150626208168a21ae871192ca9f11c1f7f6e41e8e02de00732de2324d0d69fe52f8762155c9913ee408a034552e49a -a42a56008ca340c6e9ff5a68c8778bb899ba5de9e7508c0cac355c157979a7ff6a6bd64f98b182114d3831cfa97ee72b -a4f05adf22c051812279258eea9eb00956b04ef095f2ca175f775ff53c710fb0020266adabd1dacaee814c4f1d965299 -967492e78ac0bceb8ad726ea0d2292b760043d16d64a6b1bb896e32630a7bf405c2b20e4e00842ae519a21697ff8db2d -adbf05e9b5931ae3dd24d105b5c523c221a486a4123c727069b9e295a5bc94f3e647a3c2cde1f9f45dbd89df411453c9 -a1759c0ebebd146ee3be0e5461a642938a8e6d0cdd2253ebd61645b227624c10c711e12615cd1e7ea9de9b83d63d1a25 -a4c5945d635b9efc89ad51f5428862aefe3d868d8fb8661911338a6d9e12b6c4e5c15a25e8cb4a7edc889b9fa2b57592 -aff127675ea6ad99cb51c6e17c055c9f8fd6c40130c195a78afdf4f9f7bc9c21eed56230adb316d681fc5cacc97187da -9071294e8ff05b246ff4526105742c8bf2d97a7e7913f4541080838ecfd2dbc67c7be664a8521af48dbc417c1b466a85 -990880b0dd576b04f4b4ce6f0c5d9ff4606ec9d3f56743ac2f469ac6a78c33d25c3105cf54f675e300ac68073b61b97a -a8d1a62ce47a4648988633ed1f22b6dea50a31d11fdddf490c81de08599f6b665e785d9d2a56be05844bd27e6d2e0933 -8ea5a6c06f2096ded450c9538da7d9e402a27d070f43646533c69de8ea7993545673a469c0e59c31520e973de71db1b4 -99d3a098782520612b98a5b1862ae91bcb338ab97d1a75536e44b36a22885f1450a50af05c76da3dd5ca3c718e69fdd4 -b987451526e0389b5fe94c8be92f4e792405745b0a76acd6f777053d0809868657ba630aa5945f4bd7ce51319f8996f7 -afffccc5ddd41313888a4f9fee189f3d20d8b2918aa5ad0617009ea6d608e7968063c71bd5e6a1d7557880d9a639328d -8ac51a02505d5cadfd158dde44932ab33984c420aeceb032ed1ee3a72770d268f9e60ccf80ce8494dfc7434b440daafd -b6543e50bd9c6f8e0862850c3d89835ddd96231527681d4ab7ae039c4a3a5a0b133a6d40cdb35c8a6c8dbb8d421d3e2b -a2ba901f4fde2b62274d0c5b4dbbea8f89518571d8f95ec0705b303b91832f7027704790a30f7d9d2cdafde92f241b3e -a6974b09280591c86998a6854a7d790f2a6fbe544770e062845cfc8f25eb48c58f5dfb1b325b21f049d81998029ad221 -890baeb336bbf6c16a65c839ffaab7b13dd3e55a3e7189f7732dbcb281b2901b6d8ba896650a55caa71f0c2219d9b70e -b694211e0556aebbe4baf9940326e648c34fda17a34e16aa4cefd0133558c8513ffb3b35e4ee436d9d879e11a44ec193 -97cf9eb2611d467421a3e0bfe5c75382696b15346f781311e4c9192b7bca5eb8eaf24fa16156f91248053d44de8c7c6f -8247f88605bd576e97128d4115a53ab1f33a730dc646c40d76c172ca2aa8641c511dddad60ee3a6fbe1bb15cac94a36c -ae7ecd1c4a5e9e6b46b67366bc85b540915623a63ab67e401d42ca1d34ae210a0d5487f2eef96d0021ebecfd8d4cd9a8 -aec5123fff0e5d395babe3cb7c3813e2888eb8d9056ad4777097e4309fb9d0928f5c224c00260a006f0e881be6a3bf8f -8101724fa0ce7c40ea165e81f3c8d52aa55951cc49b4da0696d98c9fafd933e7b6c28119aa33f12928d9f2339a1075d1 -a8360843bab19590e6f20694cdd8c15717a8539616f2c41a3e1690f904b5575adb0849226502a305baefb2ead2024974 -ade5cad933e6ed26bba796c9997b057c68821e87645c4079e38e3048ea75d8372758f8819cde85a3ab3ab8e44a7d9742 -ab1fe373fb2454174bd2bd1fe15251c6140b4ac07bda1a15e5eabf74b6f9a5b47581ef5f0dbd99fdf4d1c8c56a072af7 -b425e1af8651e2be3891213ff47a4d92df7432b8d8ea045bb6670caf37800a4cd563931a4eb13bff77575cbcae8bc14f -b274799fe9dd410e7aed7436f0c562010b3da9106dc867405822b1e593f56478645492dbc101a871f1d20acf554c3be6 -b01a62a9d529cc3156bc3e07f70e7a5614b8d005646c0d193c4feb68be0b449d02b8f0000da3404e75dbdfa9ca655186 -878b95e692d938573cdb8c3a5841de0b05e5484a61e36ea14042f4eadb8b54a24038d2f09745455715d7562b38a8e0df -a89e998e979dba65c5b1a9000ad0fd9bb1b2e1c168970f2744982781306bbe338857e2fac49c8cafda23f7cc7c22f945 -85880fdf30faed6acce9973225e8fe160e680a55fc77a31daacf9df185453ad0c0552eb3fd874698ad8e33c224f7f615 -ac28d20d4bbb35ba77366272474f90f0ed1519a0e4d5de737adee2de774ccd5f115949e309e85c5883dbc63daaa6e27b -a1758ac86db859e323f5231ad82d78acbe11d53d3ebf7e644e581b646eede079d86f90dc23b54e5de55f5b75f7ea7758 -ae4c0b84903f89353bf9a462370f0bf22c04628c38bb0caae23d6e2d91699a58bd064e3c2b1cbda7f0a675d129f67930 -95f21a099ffc21a0f9064d9b94ce227b3ff0a8c5a2af06ff5ee6b7f3248a17a8ca2f78cd7929ef1d0784f81eddefcd48 -8d06fbc1b468f12b381fd1e6108c63c0d898ddf123ea4e2e1247af115043c4f90b52796076277b722dd2b92708f80c21 -a300f39039d8b2452e63b272c6d1f6d14a808b2cd646e04476545da65b71a6e29060f879409f6941c84bde9abe3c7d01 -adecce1ccc5373072ba73930e47b17298e16d19dbb512eed88ad58d3046bb7eec9d90b3e6c9ba6b51e9119cf27ce53f2 -941a7e03a64a2885d9e7bee604ddc186f93ff792877a04209bbee2361ab4cb2aed3291f51a39be10900a1a11479282ca -acbcb1ab19f3add61d4544c5e3c1f6022e5cc20672b5dc28586e0e653819bdae18cda221bb9017dfaa89c217f9394f63 -b8d92cea7766d3562772b0f287df4d2e486657b7ab743ed31ec48fdc15b271c2b41d6264697282b359f5cb4d91200195 -957360ecb5d242f06d13c1b6d4fcd19897fb50a9a27eb1bd4882b400dc3851d0871c0c52716c05c6c6cf3dee3d389002 -abd2a23abbc903fbb00454c44b9fb4a03554a5ef04101b2f66b259101125058346d44d315b903c6d8d678132f30b1393 -ae9572beff080dd51d3c132006107a99c4271210af8fbe78beb98d24a40b782537c89308c5a2bddfdfe770f01f482550 -82c7e5a5e723938eb698602dc84d629042c1999938ebd0a55411be894bccfb2c0206ac1644e11fddd7f7ab5ee3de9fdc -aba22f23c458757dc71adb1ce7ef158f50fdd1917b24d09cfc2fbbcbe430b2d60785ab141cf35ad9f3d0a2b3e2c7f058 -8eff41278e6c512c7552469b74abedf29efa4632f800f1a1058a0b7a9d23da55d21d07fdbb954acb99de3a3e56f12df6 -8abd591e99b7e0169459861a3c2429d1087b4f5c7b3814e8cee12ecc527a14a3bdda3472409f62f49a1eb4b473f92dbf -82dcbff4c49a9970893afc965f1264fcab9bae65e8fb057f883d4417b09e547924123493501c3d6c23a5160277d22a8e -b5a919fcb448a8203ad3a271c618e7824a33fd523ed638c9af7cfe2c23e3290e904d2cd217a7f1f7170a5545f7e49264 -96d6834b592ddb9cf999ad314c89c09bedc34545eeda4698507676674b62c06cc9b5256483f4f114cd1ed9aaec2fba5e -a4e878cf4976eb5ff3b0c8f19b87de0ef10cd8ec06fe3cd0677bd6be80ba052ff721a4b836841bdffb1df79639d0446c -8e15787a8075fd45ab92503120de67beb6d37c1cc0843c4d3774e1f939ac5ed0a85dad7090d92fa217bd9d831319021b -8506c7fea5a90cd12b68fdbbae4486a630372e6fd97a96eea83a31863905def661c5cdead3cf8819515afe258dbcd4d9 -952ef3bc16a93714d611072a6d54008b5e1bf138fd92e57f40a6efb1290d6a1ffcc0e55ff7e1a6f5d106702bd06807cd -a5f7761fa0be1e160470e3e9e6ab4715992587c0a81b028c9e2cf89d6f9531c2f83c31d42b71fca4cc873d85eba74f33 -b4811f0df11ff05bf4c2c108a48eece601109304f48cde358400d4d2fa5c1fdaaf3627f31cb3a1bdd3c98862b221720d -9207ad280b0832f8687def16ad8686f6ce19beb1ca20c01b40dd49b1313f486f2cb837cfbbf243be64d1c2ab9d497c3f -b18a8c1e6363fadd881efb638013e980e4edb68c1313f3744e781ce38730e7777f0cba70ea97440318d93a77059d4a2b -901faf777867995aac092f23c99c61f97eeadf4ac6bcb7791c67fa3c495947baef494b2aace77077c966c5d427abbf92 -a123281aca1c4f98f56cff7ff2ae36862449f234d1723b2f54ebfccd2740d83bd768f9f4008b4771e56c302d7bfc764f -8cffe1266468cad1075652d0765ff9b89f19b3d385e29b40f5395b5a3ad4b157eed62e94279ac3ec5090a6bad089d8b3 -8d39870719bc4ebbcecba2c54322111b949a6ed22bda28a6cea4b150272e98c9ded48cc58fc5c6e3a6002327856726ec -b3d482c00301f6e7667aaeaf261150b322164a5a19a2fa3d7e7c7bf77dc12fa74f5b5685228ab8bf0daf4b87d9092447 -801acb8e2204afb513187936d30eb7cab61f3fbb87bfd4cd69d7f3b3ddba8e232b93050616c5a2e6daa0e64cef6d106f -ac11e18adda82d2a65e1363eb21bda612414b20202ecc0e2e80cc95679a9efa73029034b38fd8745ce7f85172a9ab639 -b631d6990d0f975a3394f800f3df1174a850b60111567784f1c4d5bba709739d8af934acfa4efc784b8fc151e3e4e423 -aeda6279b136b043415479a18b3bbff83f50e4207b113e30a9ccfd16bd1756065fc3b97553a97998a66013c6ac28f3d8 -8840b305dc893f1cb7ad9dd288f40774ec29ea7545477573a6f1b23eaee11b20304939797fd4bcab8703567929ce93ad -963cc84505a28571b705166592bffa4ea5c4eeafe86be90b3e4ae7b699aaaca968a151fe3d1e89709fe0a3f0edf5d61a -8e1ec0d0e51f89afea325051fc2fa69ab77d6c7363cc762e470a9dfa28d4827de5e50f0b474c407b8c8713bad85c4acd -909f313420403cb36c11d392cf929a4c20514aa2cb2d9c80565f79029121efd5410ef74e51faba4e9ba6d06fcf9f1bd1 -b2992b45da467e9c327ac4d8815467cf4d47518fc2094870d4355eb941534d102354fbda5ab7f53fbf9defa7e767ca13 -9563b50feb99df160946da0b435ac26f9c8b26f4470c88a62755cdf57faebeefffff41c7bdc6711511b1f33e025f6870 -a2a364d9536cd5537a4add24867deec61e38d3f5eb3490b649f61c72b20205a17545e61403d1fb0d3a6f382c75da1eb3 -89b6d7c56251304b57b1d1a4255cb588bd7a851e33bf9070ee0b1d841d5c35870f359bc0fdc0c69afe4e0a99f3b16ec2 -a8ae1ee0484fe46b13a627741ddcdae6a71c863b78aafe3852b49775a0e44732eaf54d81715b1dca06bb0f51a604b7e2 -b814ecbfbc9645c46fc3d81c7917268e86314162d270aed649171db8c8603f2bd01370f181f77dbcbcc5caf263bedc6c -8e5d7cc8aad908f3b4e96af00e108754915fecebdb54f0d78d03153d63267b67682e72cd9b427839dca94902d2f3cda7 -8fc5ff6d61dd5b1de8c94053aef5861009cb6781efcca5050172ef9502e727d648838f43df567f2e777b7d3a47c235dd -8788eea19d09e42b0e3e35eb9bcd14f643751c80c6e69a6ff3a9f1711e8031bbe82ccd854a74a5cfcf25dda663a49a62 -95d441d8cd715596343182ddcecb8566d47eaa2d957d8aea1313bbed9d643a52b954443deb90a8037a7fa51c88eec942 -a15efd36ef72783ccdc6336ef22a68cc46b1ecec0f660cfe8a055952a974342bf30f08cb808214bce69e516ff94c14c5 -acc084d36907a16de09a5299f183391e597beaf9fa27d905f74dc227701a7678a0f5a5d1be83657de45c9270a287ec69 -b3fd385764356346061570beb760ccf3808619618fd7521eb0feadc55b8153ef4986ff0cbfcbd4153ad4ea566989d72a -91ec6b26725532e8edfda109daa7ce578235f33bd858238dfa2eb6f3cd214115b44cce262a0f2f46727a96b7311d32e1 -96b867ccddb73afe1049bda018c96cfe4083fff5bb499e6a4d9fd1a88a325144f9a08cb0aee310e1bb4f6a5793777e80 -ad10c18465910152676f1bc6a40986119607b5c272488e6422cfda2eb31da741af13a50f5de84037348014a869c8e686 -86ade2dbc4cceb52b84afe1c874d1e3644691284c189761febc4804b520adf60b25817e46f3f3c08d2ab227d00b93076 -998b949af82065c709fc8f63113a9fecdd1367fc84fc3b88857d92321ba795e630ce1396a39c2e056b5acd206ee011d8 -8dec440bbd17b47dfd04e566c2d1b46f9133023b982fdc5eaeae51404bc83a593f8d10c30b24e13aec709549137cae47 -89436ff47431b99f037cddaee08bb199be836587a7db6ed740317888638e5f4bebbb86b80549edff89678fc137dfb40a -a8e9960746769b3f76246c82cd722d46d66625e124d99a1f71a790c01cec842bcf6c23c19cc7011ec972cedf54dc8a4c -980979dafedfd75ff235b37e09e17361cfdda14a5ac3db0b90ed491abfd551916016b2254538da7f4b86ece3038b1b1c -8ec340ca7654720bb9d2f209985439ebbc3f9990ef27e7d7ae366e0c45b4ed973316943122119604ea9a87fc41ebd29f -ab24440a40ab238d8cd811edb3ef99948ae0f33bf3d257b22c445204016cce22b6f06a1ca979fa72a36c4ddedc2b3195 -a1bcd2473ac7cfebfa61c10e56cae5422c6b261a4a1be60b763fcbcdf2eae4ccf80695f09b062b6cf5654dfab0ee62a5 -9027a613ce7bd827110a3a0e63e83f652e9bc7f4ce8da26c38b28ee893fd0c38bdb20f63a33470a73cb77f776244ab4a -86911cc8aeb628197a22bf44d95a0b49afb8332c38857fba8e390c27c527b8b45335e22b0f2e0a3395c16ced3c1ed2e8 -8f0529a330a3e9967dce09357d774715fd305bd9e47b53b8b71a2a1303d390942a835aa02fb865a14cfed4f6f2f33fe6 -b71ec81a64c834e7e6ef75b7f321a308943b4bad55b92f4dbaf46658613cebf7e4b5b1bc7f1cdc5d50d1a2a0690e2766 -98d66aaed9fb92f4c7bb1b488ccbca5e570aa14433028867562a561d84f673ac72e971cbe2cb3cbbb0a702797dc45a7e -8380aa94d96c6b3efd178de39f92f12ca4edd49fe3fe098b2b7781e7f3e5f81ee71d196fb8e260d1d52f2e300e72e7bc -8c36296ff907893ac58cecadd957b29f5508ae75c6cc61b15ae147b789e38c0eace67963ae62eff556221b3d64a257a2 -97e17676cbc0f62a93555375e82422ee49bc7cf56ad6c3d69bb1989d1dc043f9f7113d0ed84616dde310441b795db843 -a952229615534c7e9a715409d68e33086cdaddf0aec51f4369c4017a94ec3d7113a045054d695fb9d7fd335527259012 -817b90958246f15cbd73a9679e10192ca7f5325b41af6388b666d8436706dea94eafffbc3b8d53057f67ad726dbcd528 -95776e378c8abd9223c55cd6a2608e42e851c827b6f71ad3d4dc255c400f9eccf4847c43155f2d56af0c881abef4acfa -8476c254f4b82858ecbe128ed7d4d69a6563fd9c5f7d4defc3c67e0bfa44e41cfd78b8e2a63b0773ce3076e01d3f6a7d -a64b0b189063d31bcae1d13931e92d5ab0cfc23bf40566ac34b5b8b711d0e7d941102e6beb140547512e1fe2d9342e6c -9678460acff1f6eae81a14d5c8049cdcd50779a8719b5c5861762a035b07f7fa1b1ada8b6173f9decf051fd5a55bebd8 -88398758ce86ed0388b13413a73062adb8a026d6b044cd1e7f52142758bed397befee46f161f8a99900ae6a2b8f6b89f -a7dfaf40637c81d8b28358b6135bd7ad9cc59177bd9bc8e42ba54d687d974cdf56be0457638c46b6a18ceaa02d3c53f3 -b0e885e5d48aa8d7af498c5e00b7862ed4be1dad52002f2135d98e8f2e89ca0b36cf95b3218aad71d5b4ada403b7045b -803b0e69a89e8de138123f8da76f6c3e433402d80d2baba98cde3b775a8eda4168530a49345962c4b25a57257ba9f0a7 -8ce6ef80dadb4b1790167fbc48be10ef24248536834ff2b74887b1716c75cb5480c30aa8439c20474477f1ac69734e61 -824764396e2b1e8dcc9f83827a665ef493faec007276f118b5a1f32526340b117c0df12bea630030a131bf389ec78fc3 -874edb379ce4cc8247d071ef86e6efbd8890ba6fcb41ea7427942c140347ebf93e8cf369d1c91bd5f486eb69b45bce70 -adadcb6eb4cafa1e2a9aef3efb5b09ffa2a5cf3ce21f886d96a136336be680dabc0a7c96ec327d172072f66d6dcdbb39 -b993591b280e1f3527f083d238a8f7cf516d3cf00c3690d384881911c1495192a419b8e37872a565ce8007eb04ebe1b6 -b125faaeca3f0b9af7cb51bb30a7c446adbb9a993b11600c8b533bff43c1278de5cdda8cb46a4df46f2e42adb995bce8 -a7efe1b57326b57c2c01720d4fdf348d6a84d35f229d32a8f2eb5d2be4e561ef8aea4d4d0bcfcbf17da10a8e49835031 -a6bd4f5a87574b90a37b44f778d5c7117d78eb38f3d7874bad15ae141b60eed4ab0a7281ed747297f92e0b3fe5f9cafa -94b5e3067ca1db3c4e82daf6189d7d00246b0360cb863940840358daa36cb33857fde4c01acd0457a90e15accee7d764 -a5ff3ab12197b8a07dd80222a709271ab3b07beba453aacbaf225cfb055d729e5a17a20f0ff9e08febf307823cba4383 -a76dd8aa2b6a957ed82ecec49b72085394af22843272f19360a5b5f700910c6ec65bf2a832e1d70aa53fd6baa43c24f6 -8dfcbe4143ae63c6515f151e78e6690078a349a69bb1602b79f59dc51dea7d00d808cf3e9a88b3f390f29aaae6e69834 -8c6134b95946a1dd54126952e805aeb682bc634c17fe642d5d3d8deffffd7693c90c4cd7d112890abfd874aa26736a93 -933531875561d327c181a2e89aaaac0b53e7f506d59ef2dfc930c166446565bd3df03bab8f7d0da7c65624949cfbae2f -ac6937c5e2193395e5bb69fd45aa6a9ae76b336ea7b6fd3e6aeac124365edcba7e918ec2c663fb5142df2f3ad03411a6 -a8f0f968f2a61d61d2cf01625e6ac423b447d3e48378ea70d6ff38bc98c42e222fe3cbcb04662b19973a160dc9f868a2 -94100a36f63d5c3a6cfb903c25a228389921684cc84f123390f38f90859f37ec9714942ffe6766f9b615101a3c009e43 -b5321b07f5b1eb2c1c20b0c8ab407f72f9705b55a761ec5176c5bcc6e585a01cae78546c54117ca3428b2b63793f2e65 -9922f61ed6763d1c4d12485c142b8ff02119066b5011c43e78da1ee51f10a1cf514329874061e67b55597ca01a7b92ab -a212eb2d72af0c45c9ef547d7c34ac5c4f81a4f5ec41459c4abd83d06ec6b09fdab52f801a2209b79612ae797fa4507b -8577d2d8f17c7d90a90bab477a432602d6918ca3d2af082fbb9e83644b93e21ca0bced7f90f6e9279eaa590f4e41dc4d -9002d424e3bebd908b95c5e6a47180b7e1d83e507bfb81d6ad7903aa106df4808c55f10aa34d1dccad3fab4d3f7a453e -b9050299bf9163f6ebeff57c748cb86f587aea153c2e06e334b709a7c48c4cbfba427babf6188786a0387b0c4f50b5ce -852ae1195cc657c4d4690d4b9a5dea8e0baaa59c8de363ba5fccd9e39ec50c6aa8d2087c8b7589b19248c84608f5d0a8 -a02ff5781417ca0c476d82cf55b35615f9995dc7a482124bc486e29b0b06a215fbe3e79228c04547c143d32cd3bac645 -8d7bc95e34bc914642e514a401448b23cf58bce767bab1277697327eb47c4a99214a78b04c92d2e3f99a654308b96e34 -adb28445d3b1cc7d4e4dd1f8b992a668f6b6f777810465fdab231fd42f06b5bada290ba9ae0472110366fad033da514e -a0c72b15a609f56ff71da17b5b744d8701af24b99fbc24a88588213864f511bfa592775e9ab4d11959f4c8538dc015b8 -933205a40379d5f5a7fb62cda17873fbbd99a0aaa8773ddf4cd2707966d8f3b93a107ebfe98b2bb222fe0de33ef68d03 -90690c1a4635e2e165773249477fc07bf48b1fd4d27c1b41a8f83a898c8d3763efb289867f8d6b0d354d7f4c3f5c7320 -99858d8c4f1be5a462e17a349b60991cb8ce9990895d6e42ae762ce144abc65b5a6f6e14df6592a4a07a680e0f103b2a -b354a7da06bd93fb5269e44925295b7c5049467b5cacce68cbb3cab60135b15e2010037a889cb927e6065053af9ccb77 -af01fc4ac396d9b15a4bbd8cc4fe7b30c32a9f544d39e88cdcb9b20c1c3056f56d92583a9781ddb039ec2eeda31fb653 -a8d889fb7155f7900982cf2a65eb2121eb1cc8525bbee48fae70e5f6275c5b554e923d29ebbd9772b62109ff48fb7c99 -b80edae6e26364c28749fd17c7c10eb96787053c7744a5cc6c44082ae96c5d3a4008c899a284f2747d25b72ecb9cb3d0 -b495b37503d77e7aafc226fca575e974b7bb6af2b7488372b32055feecc465a9f2909729e6114b52a69d8726e08739cb -a877f18b1144ff22e10a4879539968a01321cecde898894cbe0c34348b5e6faa85e1597105c49653faed631b1e913ec7 -8c235c558a065f64e06b4bb4f876fe549aab73302a25d8c06a60df9fad05843915ac91b507febca6fe78c69b51b597de -b4c31398b854ccc3847065e79329a3fdae960f200c1cce020234778d9c519a244ff1988c1fbc12eb3da2540a5fa33327 -b7bd134b3460cb05abf5aed0bc3f9d0ccbfac4647324bedbdf5011da18d8b85dc4178dd128f6ddbe9d56ea58f59d0b5d -92594c786c810cf3b5d24c433c8a947f9277fe6c669e51ceb359f0ae8a2c4e513a6dad1ae71b7ded3cdca823a51e849b -b178535e043f1efcce10fbec720c05458e459fdda727753e0e412ef0114db957dc9793e58ec2c031008e8fb994145d59 -b31da7189abf3e66042053f0261c248d4da142861bfd76a9aced19559be5284523d3e309ef69843772b05e03741a13fe -b190a8c1a477e4187fecff2a93033e77e02de20aae93dda1e154598814b78fdf8b9ff574c5f63047d97e736e69621462 -98234bd1d079c52f404bf5e7f68b349a948ec1f770c999c3c98888a55d370982bfa976e7e32848a1ebb4c7694acc1740 -99b9eeb33a6fb104bba5571a3822ebe612bf4b07d720d46bde17f0db0b8e8b52165f9b569be9356a302614e43df3e087 -a1e3915b0dd90625b424303860d78e243dda73eecd01cba7c33100b30471d0a1ec378c29da0f5a297008b115be366160 -975118bf6ca718671335a427b6f2946ee7ece2d09ccfb1df08aa1e98ff8863b6c8b174c608b6b2f4b1176fb3cbc1e30d -903cb1e469694b99360a5850e2ca4201cad23cfccce15de9441e9065eb3e6e87f51cba774ab9015852abd51194c25e57 -821f7ff4d0b133e3be4e91d7ff241fa46c649ff61fc25a9fdcf23d685fe74cf6fade5729763f206876764a3d1a8e9b24 -a1ee8db859439c17e737b4b789023d8b3ce15f3294ec39684f019e1ea94b234ec8a5402bc6e910c2ed1cd22ff3add4de -af27383148757bdf6631c0ea8a5c382f65fc6ab09f3d342a808ca7e18401e437cd1df3b4383190fdf437a3b35cbcc069 -8310551d240750cef8232cd935869bad092b81add09e2e638e41aa8a50042ce25742120b25fb54ebece0b9f9bdb3f255 -8b1954e0761a6397e8da47dc07133434ebe2f32c1c80cd1f7f941f9965acdf3d0c0b1eb57f7ff45a55697d8b804e1d03 -8c11612381c6be93df17851d9f516395a14a13c7816c8556d9510472b858184bf3cc5b9d14ded8d72e8fb4729f0b23ba -b413ac49121c7e8731e536b59d5f40d73a200c4e8300f8b9f2b01df95a3dc5fe85404027fc79b0e52946e8679b3a8e43 -8451e5c1c83df9b590ec53d1f1717d44229ed0f0b6e7011d01ea355d8b351f572866b88032030af372bd9104124df55a -8d0a5c848ec43299bc3ea106847ed418876bc3cd09b2280c2a9b798c469661505ed147a8f4ffba33af0e1167fdb17508 -a6aa97a1f10709582471000b54ec046925a6ad72f2b37c4435621c9f48026d3e332b8e205b6518f11b90b476405960a9 -97696635b5a2a6c51de823eea97d529f6c94846abb0bd4c322b108825589eba9af97762484efaac04ee4847fb2fb7439 -92fd142181fe6ca8d648736866fed8bc3a158af2a305084442155ba8ce85fa1dfb31af7610c1c52a1d38686ac1306b70 -ae3da824ecc863b5229a1a683145be51dd5b81c042b3910a5409ca5009ba63330e4983020271aa4a1304b63b2a2df69e -aecc0fe31432c577c3592110c2f4058c7681c1d15cd8ed8ffb137da4de53188a5f34ca3593160936119bdcf3502bff7c -821eac5545e7f345a865a65e54807e66de3b114a31ddeb716f38fe76fdd9d117bee0d870dd37f34b91d4c070a60d81f4 -91a02abb7923f37d9d8aa9e22ded576c558188c5f6093c891c04d98ab9886893f82b25b962e9b87f3bf93d2c37a53cb9 -99a96f5d6c612ee68e840d5f052bf6a90fecfd61891d8a973e64be2e2bdd5de555b1d8bffbd2d3c66621f6e8a5072106 -b1d5ec8f833d8fbb0e320ff03141868d4a8fff09d6a401c22dbefadbb64323e6d65932879291090daf25658844c91f2e -a06afd66ebc68af507c7cf5ab514947ca7d6ccc89fb2e2e8cb6e5ae0f471473e5fba40bb84d05f2c0f97c87f9a50cb73 -83de3ca182bcf1eac0cc1db6ad9b1c2a1ecd5e394e78add7faa36e039a1b13cb0d1d2639892489df080fbf43e5cef8d5 -adf77fc7b342ff67a2eddaa4be2f04b4e6ceaca8ea89a9fc45cc892fcce8ac3cf8646cfa5aab10ac9d9706ce4c48a636 -8509a430ef8dc9a0abc30ef8f8ccdb349d66d40390fb39f0d3281f3f44acb034625361270162822ef0743d458a82b836 -8350fc09e8617826f708e8154a3280d8753e7dbbcf87e852f9b789fdbeb10bf3fed84fb76edd7b8239a920c449e2f4b7 -a2e7a29da8391a5b2d762bf86cb6ae855cdfad49821175f83f4713dd0c342a0784beba98d4948356985a44d9b8b9d0f7 -a99c50a1a88b8efe540e0f246439db73263648546d199ef0d5bc941524a07d7e02b3ef6e5b08dc9e316b0b4c6966823e -b34ba55136c341f4ca2927080a07476915b86aa820066230903f1f503afebd79f2acf52a0bc8589b148d3a9a4a99f536 -af637be5a3e71c172af1f2644d3674e022bc49c393df565ea5b05ce6401a27718c38a9232049dd18cbd5bf4f2ce65b32 -a2972ba7bfa7f40c2e175bb35048a8ef9bc296d5e5a6c4ca7ab3728f4264d64f2d81d29dce518dc86849485ff9703d7d -8c9db203e8726299adeb331d6f4c235dc3873a8022138d35796fb7098887e95e06dcfad5d766ceaa2c4fb0f8857f37fa -a82bfbaa9a6379442109e89aad0c0cfc6a27d4a5db5480741a509d549c229cb847b46a974dde9f1398c6b3010530f612 -b2d8ef6e091a76dfc04ab85a24dbe8b5a611c85f0ed529a752c2e4c04500de5b305c539d807184e05f120be2c4a05fc3 -8c6ffc66a87d38cea485d16ee6c63ce79c56b64ae413b7593f99cc9c6d3cd78ef3fa2ab8a7943d2f0e182176642adadb -acbc92de68b2b04e3dc128109511a1cbe07518042f365d5634e8b651cb1ac435ea48eeeb2b921876239183096ef6edee -979c4e1165e0ecfa17ed59fb33f70797e000ddbb64acf5fc478cccde940451df051e51b6449c5b11a36afa7868af82e3 -a5a017c5a94952aeae473976027124231abe50460cec4db3ebeb8b1290525776be7c15d108b749c2a1e4b018de827915 -8b6922ab1db925eed24b2586e95f5c709b79d2408a8fa2a71057045ead3ebdd0cc72bee23d9064cd824166eda1e29318 -89a991087a0b5805fcc5c6c5f6ac27e100da0d3713645aa9c90114e68ca9f185f21155eb7645a2c6c0616a47291fe129 -ae6ef954c942cbfd37f8f2dc58a649e2584d6777e7eb09ae6992ccde283ac4f4ec39e3a5cda7f7c60f467fb308d37f08 -9335ca5ccac59b39eb2bcef09c54b778ebb690415ba13fe5c8e4b6091d9343a01cc9baa6228cefd8dba98f0710f714da -a0211c9328be2b46f90ff13614eeffb4c1285e55580db3874610653219926af1d83bda5b089fd37a7c7440a0f1d94984 -a82e097dfa782c40808fac5d8ed1c4fccf6b95ef92e22276fd8d285303fcf18c46d8f752595a658ee5294088b9dc6fc0 -ad108fcd0ead65f7f839a1337d520f5bd0cb665ee7100fc3f0563ff1d2959eb01617de8eb7a67c9b98b7b4892082acdb -b89e6aeabcb3ee3cbf12e3c836bab29e59d49676bcf17a922f861d63141076833f4149fe9e9c3beed24edfacdf1e248b -8477501bd91211e3b1f66c3bfd399ef785271511bc9366366ce95ec5ea95d9288ab0928a6b7887aba62de4da754d3eaf -aeec40c04b279096946b743ad8171bf27988405e1321c04894d9a34e2cbd71f444ff0d14da6cda47e93aa6fe9c780d50 -a703bd2d8a5c3521a8aad92afef5162aed64e9e6343d5b0096ca87b5b5d05e28ed31ba235ab1a626943533a57872dd01 -b52d9dfc12c359efb548d7e2b36ddedaefdec0ef78eda8ac49a990b3eb0ed7668690a98d4d3c7bec4748a43df73f0271 -af887c008bad761ee267b9c1600054c9f17f9fc71acfe0d26d3b9b55536bca5c8aebe403a80aa66a1e3748bb150b20ef -ad2f7a545ef2c2a2978f25cf2402813665c156bab52c9e436d962e54913c85d815f0ba1ce57f61e944f84d9835ce05ea -91a0a9b3cfd05baf9b7df8e1fb42577ec873f8a46bb69a777a6ac9f702735d6e75e66c9257822c781c47b9f78993a46b -939fdc380fb527f9a1ddecf9c9460f37e406cd06c59ce988e361404acbfcb6379f2664a078531705dbc0c375d724137b -8bbbe5d5a0d102b8e0c8a62e7542e13c8c8a6acb88859e78d8e1d01ec0ddff71d429fcb98099e09ff0aa673c8b399dc4 -b67a70e4ef138f48258f7d905af753c962c3cc21b7b8ae8b311a2356c4753f8cd42fdee09ac5ed6de31296ead88c351a -8d21539e7dca02a271ce7d16431773bbe30e6a03f5aff517132d34cdd215ad0da2f06aa4a2a595be489234b233e0852e -892ae11513f572cc5dc8b734b716bb38c0876e50e5e942631bb380b754e9114c34b0606740301e29b27d88439fb32071 -a8780dc9faa485f51b6f93a986bc4e15b166986b13d22ec2fefc6b25403b8b81c15cc9ac0025acc09d84932b15afa09b -b01af013360cd9f2bb9789a2b909c5e010fe6ff179f15997dee1a2ba9ef1ccec19545afdecfcb476f92fcdd482bb2b5a -b5202e5d5053d3af21375d50ad1ccd92538ef9916d17c60eb55c164767c3c74681886297b6f52e258c98d0304d195d3d -8f6adbcfbb0734bf3a4609d75cf2e10f74ed855a8b07cf04ac89a73d23b2e3e5cf270a1f2547b3d73e9da033a3c514b0 -8abe529cd31e4cb2bd75fa2a5e45bd92cbe3b281e90ffc7dea01ba0df17c9a3df97a3fde373cce5d25b5814cf1128fed -b8bbf51187bb3bb124da3870e2dfecb326f25a9383e5cc3323813487457010b9055811669c3da87105050825dc98a743 -a5c83875fe61ebbdd3fd478540d7e5a1ad0f8c790bad0b7dd3a44831e2c376c4fffbc6b988667afa1b67bfaa2dbbb256 -a0606b3062e4beba9031ba2a8e6e90aa5a43ba7321003976e721fd4eedb56486f2c5b10ba7a7f5383272f4022092eacb -b485cc5e001de6bd1bbc9cd8d777098e426d88275aaa659232f317352e1ddff3478262d06b46a573c45409bc461883e1 -916449580b64a9d8510e2f8c7aee0b467a0e93b11edc3d50725bcbc3ca53c2b8bb231fdc0fc0ed5270bf2df3f64750d9 -b2e687caa9f148c2b20a27a91bada01a88bff47faaf6ed87815db26bb6cdd93672199661654763a6b8b4b2012f59dcca -b6933f7f9dabc8fb69197571366ac61295160d25881adf2fcc8aaabc9c5ed7cf229a493fd9e2f1c2f84facd1f55fee84 -b01eb8b2cf88c75c3e31807cfc7a4d5cafded88b1974ba0a9d5aaeda95a788030898239e12843eda02873b0cabe30e2b -a3ca290fa6ce064514a3431b44ecdb390ef500629270202041f23bc2f74038147f338189c497949fb3126bae3a6e3524 -93b0f8d02bd08af74918b1c22131865aa82aba9429dc47f6b51354ba72e33a8b56684b335a44661aa87774931eb85974 -81eebeb9bd92546c37c98e0a5deba012c159f69331a89615cf40c5b95c73dcdbf3ceb46b8620d94ff44fcdad88020c1e -b350e497932382c453a27bb33d2a9e0dbadf4cd8a858b6b72d1f3a0921afc571371e22b051b97da3bb08694c4ca3a4e8 -8c7052f63ba16f14fa85d885aa857d52f04b3a899a4108493799c90c0410de7549be85bec1f539f1608924668df48e5a -b397574d1fb43de0faaea67d1d9348d67b712b1adce300d6dc497bca94e0994eef8707c285c5c9ac0a66022655a8420b -a934661d2168ae1bd95b1143c2e5c19261708aeb795abad8ec87f23dc1b352fa436de997ebb4903d97cb875adb40dc2b -acf535fa1b77255210e1b8975e0e195624c9e9ffd150286ccd531a276cadc12047a4ded6362977891e145a2bd765e6b9 -8cc32356015d7fd29738dcc13c8008cdbe487755dd87d449ab569c85d0556a1ec520dbce6c3698fc413d470c93cb0c92 -8787c7b3b890e0d3734ac1c196588cacf0a3bde65e2cf42e961e23dbf784eef14c07337d3300ed430f518b03037bd558 -99da90994030cbc2fb8a057350765acac66129a62514bbd3f4ec29d5aab8acdd5f4d69ca83efe7f62b96b36116181e79 -a306424f71e8b58dfa0a0564b2b249f0d02c795c30eee5b0ad276db60423210bba33380fb45dbe2c7fedd6ee83794819 -b207a35d31ce966282348792d53d354bbd29ac1f496f16f3d916e9adbf321dc8a14112ca44965eb67370a42f64ca1850 -89e62e208147a7f57e72290eefccb9d681baa505d615ca33325dfa7b91919214646ca9bdc7749d89c9a2ce78c1b55936 -ac2d0ec2b26552335c6c30f56925baa7f68886a0917e41cfbc6358a7c82c1cb1b536246f59638fb2de84b9e66d2e57eb -8f1487659ecc3b383cebc23a1dc417e5e1808e5c8ae77c7c9d86d5ab705e8041ce5a906a700d1e06921f899f9f0ee615 -a58f1d414f662f4b78b86cae7b0e85dfddae33c15431af47352b6e7168a96c1d307d8b93f9888871fc859f3ed61c6efc -94f3626a225ac8e38a592b9c894e3b9168f9cf7116d5e43e570368ee6ee4ab76e725a59029006a9b12d5c19ddce8f811 -b5986e2601ad9b3260e691c34f78e1a015c3286fdd55101dcef7921f6cbcc910c79025d5b2b336d2b2f6fd86ee4e041e -b6e6798ddd0255fbe5cb04a551a32d4c5d21bdfd8444ff2c879afe722af8878d0a3a2fe92d63936f1f63fea2d213febf -86bea9bfffef8bc11758f93928c9fdfae916703b110c61fa7d8fe65653f8c62c6fecd4ff66a1f1a7f3c5e349492e334c -9595a4606284569f4b41d88111320840159fd3b446e00ec8afd7ddaa53dd5268db523f011074a092f8e931fc301a8081 -83b540a6bc119bf604a7db5f6c0665c33b41c365c12c72ca4fa7b0724115bbb0ff1ae38532c3356e8bb3ac551285929f -92c6daf961ca4eb25293e1794cf85cda4333cf1c128207af8a434e7e0b45d365f0f5baaefc4ebd5cd9720c245139c6e2 -b71465f3d7dba67990afc321384a8bb17f6d59243098dbed5abd9a6ffc7a3133b301dd0c6ca3843abbaa51d0953abbed -b15d93482d2ee5b1fec7921fcc5e218c1f4a9105a554220a4fb1895c7b1d7a41f90bbf8463d195eecf919fcbe8738c51 -a79c98e70931ffd64f4dcf7157fbae601a358261e280fe607eb70cef7d87f03efa44cf6ba0f17fbb283a9c8a437d2fdb -9019d51a6873331f8fe04cb45e728a0c8724a93d904522a9915c748360ddf5cdbf426a47b24abf2005295ed2a676cbf0 -b34cc339fec9a903a0c92ce265e64626029497762ff4dcaaf9bb3994298400ce80f4fb7dbe9ec55fe0c4a522c495cb69 -8fda9be7abfe3b2033cad31661432300e2905aef45a6f9a884e97729224887a6ec13368075df88bd75c11d05247bef15 -9417d120e70d6d5ca4b9369cba255805b5083c84d62dc8afec1a716ead1f874c71a98ad102dac4224467178fe3228f62 -a0a06b64867eebb70d3ce8aaa62908a767fb55438a0af3edf9a8249cd115879cde9f7425778b66bb6778cb0afeb44512 -a44309d3e1624b62754a3a4de28b4421f1969870f005ac5dc7e15183fa5b3ad182bcd09cca44924e03fbdb22f92f8cf8 -aea80f1c3a8fc36cfb5c9357d59470915370b2bec05f51f1d0e1d4437657e2303ba2d1ac3f64cf88f2df412dff158160 -b3f1557883d91b24485123d2f3ae0fce65caa533c09345ae6b30d2ac49953acee61c880c57975be7b4f5558d3a081305 -b52cb1e56f0d147cfb58528b29c7a40bab7cfc9365f2409df7299bfc92614269ff9de3cb2500bbc4909f6a56cf4b9984 -aa4f8fd0f5f87c177ee7242f7da76d352db161846cd31523a2100c069d9e4464170eec0bffc6d4da4f9e87017b415dbd -b5b61f52242985c718461a34504f82495d73cbb4bc51f9554b7fe9799491f26826d773656225f52a1531cd5bd6103cde -ad12ba9697804ede96001181c048f95b24ba60761c93fb41f4b4a27e0f361e6b1434e9b61391bacaf0705fdaa4a3a90e -9319286cbda236f19192ae9eb8177e5a57a195c261082ba1385b20328fb83ed438f29d263dddae2f5278c09548830c4a -88b01ee88c3a7ae2c9f80317dddbaa2b7b0c3a3c23828f03ff196e244500410c9ac81c2e2d3e1f609d4b36ee1732738c -8e31f30600a9d629488d44a008c821c3c57f13734eaee5a19f0182a2de9e538fff7d982980d7fcc725c969f29f7c2572 -b215740eea98b4bb14197a803a8975700ad2f25a25ef3628eae10166d56c823301f6dd62ce3f9ebf2d42d1f33d535004 -8fb0fdb253d4bcc6693642779be13a5b816189532763dfd7da868cfacfdb87cb5ebe53b18b69dfd721f8d4baf3c1d22d -8cdd050a447f431ff792156d10381aaf83c6634a94b614dd5b428274538a9cc1f830073533b4fd0a734d6dd4f8d9c4ce -81b01ee8c72ac668ad9dd19ead2d69cac28c3525e613e036e87aa455c2da9651cc8fcc97c451a8c8a071a4eb69623cd1 -8d9e02dc9ac83f861b3745bd69216232144c47cb468a7dbc49083ed961f978e34265b3f42c400339120bdc4644fe5711 -89e9410455b34cba9db0a5ea738e150fae54dd000d61e614f3274a6c8102ba7cd05b0936f484a85711ad9da7946f51ea -91f9d4949678f8e6f4b8499899818bdd0f510da552b5d79d8e09bf3b69d706ab36524b5e86d3251318899b9223debf6b -8b3c38eec7e1926a4be5e6863038c2d38ab41057bcfa20f2b494e9a0c13bc74c3a44c653402eb62a98e934928d0ebccb -a5cfe465bfbf6e8bfbd19d5e2da2fc434bd71acd651371087450c041aa55e3c4f822361e113c6c3d58646ed3ba89d6da -918665b8810bcb8d573ca88b02a02c62eaa5a4a689efb5c564b0c9183f78144e75d91fd1603e17d2c77586cbe5932954 -997dace0b739aeb52ba786faae5bdf1d48630a90321f9ceebfa9e86d189a3d79d7b04e459ac8e4adcfe83a5ce964eb1c -a5a1ca9f0ccc88017a616d481d912aab3f0e154b673f1131c5d9c9c3f5f147d25b6392b2c31e49f7bb7eb2697d05dbec -a76e99bec509eff01bf6767a06ac97ebc6671cb58bc3d4acc2803580a874885453dbba2e1bba26e45f8d2bda5f688860 -956c1362c8123c5d9ebff7049e851235d69fa645f211ef98e2b6564f2871114a12224e0ec676738d77d23c709dd28a6c -885efede83b1a3e96417e9f2858ab0c7a576fc420e8f1f26cabf3b1abeec36bcaa63e535da177847f5e0afdb211bf347 -affca2257f292a2db52f8b1bab350093f16f27ef17e724728eeaec324e2513cd576f6d2e003cc1c6e881334cb2e8bf22 -8dac963d34dcc9d479207a586715e938c232612107bb2d0af534d8da57ad678555d7c1887fadca6551c4f736ffa61739 -b55e600a6bbde81f5a0384f17679d3facb93a7c62ca50c81a1d520cf6e8008ac0160e9763cb2ca6f2e65d93ca458783b -9485e6c5ab2ebfb51498017e3823547b6ab297d818521ceac85cd6c3aa2d85ae075a0a264ae748fc76ce96a601462ffa -b4d8abca786c0db304a6634fba9b2a40d055c737ed0f933e1739354befdae138dae3c8620a44138f50ebeaf13b91929f -8bde7ca39c7bda95b1677a206b16c3a752db76869ea23c4b445c2ff320f2ee01f7358d67a514982ee3d1fb92b7bd7229 -8f8cd0acc689b6403ee401383e36cae5db2ff36fc2311bbadf8ebb6c31cbcc2ca4ffac4c049da5ba387761ef5ec93b02 -a06f42d5f69a566ff959139c707355bbf7aa033c08d853dce43f74a9933e6d7b90e72010ef3fcb3d12e25852343d1d31 -b10ece7cf6b69a76dba453b41049db0cdf13d116cf09c625312b150ee7437abd71d921eda872403d7d7ce7af1e6dccb7 -a3d820318e0f3b54fba7a4567912a82d6e6adf22b67cfc39784683a8e75f77538e793d9708aae228fa48a71abb596195 -8758fad55b68a260bea3bd113e078fd58d64a92f7935ff877f9f77d8adc0994b27040cfc850126c7777cfdfb2428a3e5 -b504913ee96c10f00b848cd417c555a24bc549bf5c7306140eff0af2ada8cb5e76bed1adb188e494332b210fbf24e781 -a00e019a40acc7aab84c1cc27c69920ad7205c2a3dc9e908a7ef59383695c9cb7093c4bcbc2945aab2655119552e3810 -b1000b4c4f306672e39d634e5e2026886a99930d81b8670a5d4046db9621e44997c4b78f583374a09c60995f18a6fd4f -a6c5053c4e748540ad2b622c28896c9d4ca3978ca4784ac8f09da5314a245f5cdc5d6203c84e6e0bcb3081829720a56d -8e37e67a70205a5c7da95de94ac4d0ebd287c1c9922d60c18eec1705030dfcbf74ae179e377c008bf5a8bc29c7c07cce -a66bd7c0243319b553d5cb7013f17e3504216e8b51ba4f0947b008c53bcb6b4979286b614a4a828ee40d58b5ef83e527 -97e2110b0fb485508a2d82ecc2ce1fbe9e12e188f06c7ef2ac81caeeb3aca2c00e5e6c031243b5ca870a9692e1c4e69b -8734ce8bbc862e12bea5f18d8a8d941d7b16a56ef714792fed912ca9c087497e69b6481fdf14efe1f9d1af0a77dac9b1 -b441dddac94a6a6ae967e0e8d7ab9a52eb9525fb7039e42665e33d697e9a39c7dcef19c28932fb3736e5651d56944756 -918b8997f2d99a3a6150d738daed2ff9eb1f5ed4a1c432d18eab4a898297f7ffbffd1e4ae9037acf589b1cd9e1185ef6 -a0247b8ac4d708cf6b398dc2d5c127a291d98e8bef5f195f820c4fddb490574ba4f62647c2d725237a3e4856eec73af0 -b45636e7e0a823c2a32e8529bb06fcccfd88e9964f61201ee116279223ed77458811d1b23bcb6b70508d16d4570a7afb -a99c1188fa22b30b04fda180d2733586ea6ef414618f1f766d240c71f66b453900d3645541c019361027aebe0a0f305f -b4c2f758e27fe233f7e590e8e0c6de88441164da3fcd5211a228318d3066dfdafc1d40246dd194f2b597f6fe9600b3d7 -972530819445b11374c3043d7855d5f1d3c4922b3b205d0bf40162c51605375dd0b61f49cd7f3d39a533a86a13005989 -992b533a13e5d790259bfdfdf1074f84a5e5a0a0d7be9cd6568cdc1662524f1a6666a46da36cea3792ba6707850f4d86 -9875d130457e04dc6ea2607309bfbb900ad3cb5f3e0574f808d27b20cbf6f88389d87dca19998680c5bc30d1df30a41b -adea8494a69e83221edf360ab847272b5c47eba5404665fb743d98c0682732c30085ae3ec82bc1e8e4aba8454c9b1849 -887d4c624ce05e224216c5f6fa13c5741012ac33330bc291754782f0bfe668decdc98c0e43a1ce28323effe6b639f477 -ab6b167aeb5e93ab155990b94895e7e7ff6dea91384854a42cc8a3b9983495b4b3c33ab1b60b2b6450ccf0418fada158 -a7588d0b7c6a6bc32fc474aa0f4e51dfb8e6e010346ad32c59d6f99e6f0522424111a03a4f56ba4075da8009ee7a63e9 -94d645cc3936db1563568193639badfc064dd5bda8d0631804ee00b09e141b200619e07506b5a8225130541436327194 -8d695c03cc51530bdc01ee8afcd424e1460d2c009e1d7765c335368e5c563cf01a2373c32a36400c10e2bf23c185ed19 -ad824a0a7ed5528e1f9992cbb2050785e092b1ea73edd7fb92b174849794a5b04059e276f2941e945bc0f3e46172f2af -ad6ed2af077a495d84f8eeed7d340b75c0d1c8b7c5a854dfc63ab40a3d0c2b0d45016d30b3373a13f0caae549f657976 -82454126c666023c5028599a24be76d8776d49951dfe403ebf9a5739b8eb2480c6934a34010d32cd384c91c62a9aa251 -b57070006793eca9fa2f5237453ed853994ad22c21deb9b835e1fb3fbc5ac73aec265a4a08de7afae1610dc8c42b7745 -ad94667c791cf58875eb77eb17b6ad02de44e4ba2ddc2efe4d0ff22a5e1a090c670354437847349fd61edc4ba5606f07 -b2aac0c345ffc00badaab331c12a22019617b004d32c099c78fa406d683744d96d51d1237ad0842f9f54655186f8f95b -8fed51076cc939b354e3b69034a594e6c9c98425ccf546154ab087a195375128444732388d2eb28f82877de971ec2f58 -8e521c0093deb9dff37888893db8ffebc139984e7701e68b94d053c544c1be0d85f0f98d84b2657933647b17e10a474c -a2c6c9a307aff9b1dea85f90fa9e3b8057fd854835055edeb73842a7ef7c5ae63d97c51fec19dd8f15d696a18a0424a6 -a3390b25a9c11344ed1e8a0de44c848313026067a0f289481673c2c0e7883a8fc9f6cab6ccd9129729a6d8d0a2498dc2 -82770c42b1c67bbd8698c7fe84dd38cc5f2ad69a898097a33b5d7c5638928eb1520df2cb29853d1fa86a0f1bcc1187e8 -a6fdf7a4af67bc4708b1d589135df81607332a410741f6e1cc87b92362a4d7a1a791b191e145be915aa2d8531ee7a150 -aecac69574188afc5b6394f48ba39607fe5bb2aa1bd606bc0848128a3630d7d27101eb2cea1fb3e6f9380353a1bb2acc -a23fd0c52c95d0dffb7c17ec45b79bf48ed3f760a3a035626f00b6fe151af2e8b83561d0b9f042eaae99fde4cbd0788d -a5f98068525cdd9b9af60e0353beb3ac5ac61e6d3bac1322e55c94b3d29909d414f7f3a3f897d5ae61f86226219215c6 -b2a4d724faac0adf0637c303ff493a1d269b2cdbec5f514c027d2d81af0d740de04fb40c07344e224908f81f5e303c61 -adeadb3521e1f32ef7def50512854b5d99552e540ec0a58ea8e601008de377538c44e593e99060af76f6126d40477641 -a18b7fc2fcd78404fed664272e0fef08766a3e2bc2a46301451df158bd6c1c8aa8cf674dd4d5b3dedfaceb9dd8a68ae3 -83bcfb49313d6db08b58c6827486224115ceef01ca96c620e105f06954298e301399cdd657a5ff6df0b0c696feec1a08 -8c94391eba496e53428ec76dfe5fa38f773c55c0f34a567823316522a0664a3d92bff38ec21cf62ac061d7d1030650c5 -b1fa196ccfd7d5f1535b2e1c002b5cde01165c444757c606b9848bc5f11b7960973038fb7cc3da24300fc1848e34c9af -b139f6c6449449638de220c9d294e53fc09865a171756d63bbf28ec7916bf554f587c24bddf51dd44372d15260d8fe25 -b716242299d4ee72b5b218781b38ca5e005dcf52333364f85130615d1dbf56216af8ee2c9c652d82f7aab5345356538c -9909f24e4ad561aa31afd3a3b9456b2bd13a1d2e21e809a66af62fec5f95b504507ac50e81d2233da2b223f5443e7585 -ae863530a02cf3a757f72b945c8c0725d9f634d2ff26233478d1883595ff9a1eef69e8babffdbfa161452fc204f5b5a1 -8eb82bde283b6a6e692b30236cbf41433b03eda8dad121282772edd56f144b1ebf5fb489d18c6ce8776135771cbb91e2 -9296141fadf8dadc885fff4999c36efa25ec76c5637a8300a1a7dc9cf55bcedfe159e0ef33f90eee9be8c4f085734e10 -b6c07f2e6fcbd6c42a8b51e52fbcd5df3aa9f7c3f0b3c31021de1aec2111d0a1c36b5ab489ba126af44fd43cf31c2594 -a70ca669c357535b363d16b240fd9cb9c5ba1b648510afc21218ea034e9bf5f22717ae31ff43ef89dded95b7132fa58f -b350721f8f6b4d164fd08aca30cd4dece9b4a81aed0ac12119c9399bab691d5945814306f9a61f0106b76d4d96f7b9d6 -b6886076c9d8c344bf3fb6975173d00fa82866012894f31c17e6fc784fbc0dd2d24d6a1cddd17f7379c74566a23219aa -87636e4a83ceadc170a4b2517b19525c98e2163900401996b7a995b2f3da8d6ba2ab92f909eade65074fac07cf42f6fa -8ff61d87c4699a067a54b8540e8642f4c7be09d3783ec18318bcba903c6714fcd61be69165e07e1ca561fe98e07507de -85485d6b569ac20e6b81a9e97ef724e038f4fee482f0c294c755c7b6dad91293814f143bfcfc157f6cfa50b77b677f37 -a49256cb1970cc1011a7aed489128f9b6981f228c68d53b1214d28fbcfb921386cc7cf5059027e667a18073efa525a74 -87bc710444b0c3e6682d19307bedc99c22952af76e2d851465ee4f60e5e1146a69f9e0f0314f38a18342e04ece8e3ed3 -a671a6cabfd19121a421fdfe7732eccbb5105dfb68e8cbcf2b44ae8465c99e78c31b99730beca5bc47db6fc2f167203a -a2f3270c184629f6dfc5bf4bdd6e1b8a41e8840a1e4b152253c35c3d9e7ab4b8e3516dc999c31f567e246243e4a92141 -b9795a5a44f3f68a2460be69ecacdbb4664991ebbedffed5c95952147ad739e2874c099029412b9653d980a2d4307462 -959053faec9a966dd5a4a767a3154e4b8e4f56ca540ae53e373c565dda99fb626f725e5a5e3721c82918f8c5f2e9e0a3 -b3ef9d6a1b3cd44a3e5112819fa91cb8a7becc3f5b164c6f759f93171d568497b01c8e743f4727b341a1296a0dbadf4f -b852dfdfbe2b8c77d938fad45f00737e14eacf71d5fecbb3e4f60052ec9efb502c38c1fcecaf71da69eabe8b33852a67 -921c7007f26bdd4139e919dfe27d87b489a0bc5bd6fb341e949e4451f14c74add0489b108c9c9666a54c5455ac914a9f -86b63d73ba31c02e5337f4138e1684eccdc45ab5e4f30e952fb37d638b54ecec11010414d7a4b7aa91f7cc658f638845 -853c55e0720b66708a648933407795571fc11ad5c234e97f92faabce9e592983dfb97a1705047ee803648ecf9fbb2e5c -995fe7d1dc09bb0c3c3f9557c4146534778f5ea9c1d731c57440fdcf8094f82debf19090b5d23298da1ed71c283b3ae5 -b9c49c911a0c4d716b7baec130f9e615bfa7d504aa8766ed38878a93c22b1f6353503d4f7f425d4902239fb4689429df -80504d964246789a09dcd5c0298680afb6fe50bca3bb9c43d088f044df2424a1828de10e0dbdc5c0aac114fa6d9cf5d1 -90249351f109f6b23a49a610aaa3b2032189fd50e5e87cdc3b20f23ed4998af3a8b292bf9fbab9bd1cbe0a1371081878 -abb5f0148850f0d80b429c2b9e0038772432340ef0862ccb5dcb7347026ca95bf9a5857f538e295aebd3a6a5027adb4c -b92ac9c0f7e73150798348265e5f01f3c752480c72613c6894a95e9330bba1c642b21b9cbd8988442b5975476634b4fa -af3fbcc825abd92c6d7ea259467f27045e288f27a505e6a3c9ec864aa08fcaca0d4123034513dbd4c82d4814075708ab -a738232a66030e0e9c78e093a92fcc545b10e62fb0ecb832bbbc71471b28eb6ec422a498c2402e2c6d74983df801e947 -ae60194ce2035edd1af253b9eefbb4b1b7609c9678256c89c3cb076c332a9f4442c3441ad2ecc9d73265359bdadc926c -8b2fd55e686f16725fc0addb4065f696275852320b03221fd22889825d66fae5bb986b03c47452e32b3a32c1fdfc8dfd -8e2e1a36673b7729b07e7bc5014584e1c03e9552f7440fbfda0a6a7f41953947fcdf8d666f843bfc03dcca5b06a14318 -95a3df04368c069f3fd32a20b627c5f043e952167c9e80bf5914bbf2086879909c60e089bbd488725ab977c0e6051728 -9856403b2211d0152d4eec10db7ec34c16ac35170714b75af3ebc398a676c171b24b6f370361de0f9057ba444293db14 -a2cb484b758af5fd8e2baca7f0406f849c71255e58ef110d685cd0c1137893a25d85a4d8582e3ced7dd14287faa95476 -b0f697b6a42f37916b90ab91994ae4a92c96dc71e4da527af41b9d510bc2db5a9b4f29183a758074b6437a1e62b2d1d7 -b39c49266aae46f257b7ae57322972fb1483125298f9f04c30910a70fe5629dba0ec86b94cc6ba16df3537a55e06f189 -86cd5595b5b769dfd9ceb68b11b451f6c5b2e7a9f6f6958eac8037db1c616e8a9defb68a0d6c2287494d1f18076072c1 -b462e8fa9a372d4c1888fd20708c3bed1cb00c17f7d91a0481238d6584fbbf2d238e25931154f78a17296a12825d7053 -a5ef28286628ba509bac34c9f13158d0013239fdca96b5165161f90b89d6e46295822ebdf63f22d7739911363a0e0e86 -a629a95a24e2545862b41a97ecba61b1efa792fd5555dc0599c175947e9501bffc82b05a605fd5aabc06969ccf14fff4 -af83467e4b1f23a641630cc00c38d4225ff2b4277612b204d88de12a07d9de52fb4d54a2375a7fd91eb768623c255376 -a630f29fb2e9a9e2096d7f3b2f6814ee046ebc515f6911d4bc54ad8a5a821a41511ff9dcfbe3176f35c444338ecd0288 -950dedc11bd29e01ba9744bec681ad9462127c35e9fcadfacc9405ec86b985a1b1c4f9ac374c0f1fa248212e5e170503 -82e8e7be8011ee0fd9c682d26a0ef992d0191e621d07fd46a3a5640ef93a42e1b98a33cad1f8017341a671d28caebb03 -a075860554e712398dac2fb0375067a48d0e4ca655195cefc5ccb1feb8900d77124aa52a12e4f54f7dab2a8f1c905b5b -81d2183d868f08714046128df0525653a2dc2ff9e2c3b17900139c9e315b9f4f796e0fb9d1d8cbadbaa439931c0e0879 -81fb1456969579515a75fb66560f873302088cde2edc67659b99a29172165482ca1f563758c750f00086b362ae405322 -a13c15ab19203c89208c6af48d2734bb0873b70edb660d1d5953141f44db9012528d48fb05aa91d16638cbda2ca8f0cc -8ba46eef93e4ec8d7818124a0b9fcfe2bcf84a98db3545d2b3d0192cfadc81fc667dcc22ab833c3e71508d0f3c621fe4 -b9bd60d2266a7d01e1665631a6ed6d80ffc0cd7f088f115a5d4ea785c518a8f97d955e2115b13c4960302b9825526c92 -b26fa4e87142150250876083a70c229249099331410f0e09096077fdf97b31b88dc57a3e3568d2a66a39af161cf5dfec -b9d147564124728b813d8660ba15fa030c924f0e381ad51d4e0cf11cc92537c512499d3c2983dd15f2e24ca166070d70 -b6fb44e1a111efb3890306fa911fafda88324335da07f7de729b2239921ef15b481630a89c80e228bec7ab6444a0b719 -a6cd9c7acac052909ef0cf848b6012375486b59b7bac55b42c41f0255b332c1d45a801f6212d735be8341053bd5070b9 -864258d69234786af5de874c02856fc64df51eff16d43bfb351b410402ab28f66895aec4025e370a4864f19ff30fd683 -84370fa1243b64b3669dd62e1e041ff9bd62810752603486aac3cba69978bd5f525c93cbc5f120d6f2af24db31ec3638 -b983c2cdc1a310446de71a7380b916f9866d16837855b7d4a3a6c56c54dab3e373a6fc6563b8309dc3b984d4e09275d6 -914f8587f876470f7812fa11c6f67e2dd38bf3090e8928e91fe2fe5595bee96cbe5f93d26fdced6b4e7b94f75662b35d -8b47bcb111d91aa3d80e4ceef283824aa00d1faeb6fe4111aecd9819869c0e1f6f4b6fb2018aebb07a0f997412cda031 -95b2befa98f9992450ca7ff715ae4da8c36dd8adcfef3f0097de6e3a0b68674b05cbf98734f9665051bb4562692641e0 -8bcd1651a2bfce390873a958e5ff9ca62aac5edd1b2fd0f414d6bcf2f4cf5fa828e9004a9d0629621b5e80fbbd5edb90 -af79bed3c4d63239ac050e4fa1516c8ad990e2f3d5cb0930fc9d3ce36c81c1426e6b9fe26ac6a416d148bf5025d29f8b -881257e86b7ab5af385c567fde5badf67a8e7fff9b7521931b3ce3bac60485c0fe7497339194fb7d40e1fad727c5c558 -a1b40b63482cd5109990dfb5a1f1084b114696cbbf444bf3b4200ab78c51dad62c84731879ea9d5d8d1220e297d6e78a -b472212baa2a31480791828ca5538c3dcc92e23f561b0412f8cc9e58839d1625ddcaf09c8078d31ac93470436843cd74 -8f516d252b1863cd3608d852a2857052bb2a3570066d4332fa61cb684b10ac8d1a31c8d32f2a0d1c77eee2ad7a49643d -8d20b75c51daa56117eda2fd5d7a80a62226074b6a3ff201519f2054eecfeff0aa2b2f34b63bea3f53d7d0ce5c036db9 -8282f433229e7948a286ba7f4a25deb0e0a3c5da8870562c3646757bef90ca1e8d3390b0a25b3f2bf45bf259a4569b77 -8a2dbf4b55cc74f0a085d143a88ebc8c2a75a08eab2703d13a00b747eaddc259a3dd57f7330be938131835a6da9a6a68 -aa0bc51617a938ea6a7b0570e98b8a80862dd9e1cf87e572b51b2a973e027bcd444ef08e0d7b5dee642e0da894435e91 -aa7319ca1ac4fe3cc7835e255419eeb7d5b2d9680769cc0ca11283e6147295db75713b71a9312418a8f5505cd45b783d -ab3f9c465663dc90fae327a2ee9cb7b55361a9b6fbe713540a7edd3cff1c716802fb8ad4dd8fb0c945d96b3b44c5795b -913a2ae88acffab12541fc08920ee13ab949f985a117efe9a5b2c76f69f327f60c5b5ad3fa5afa748034ac14298fc45a -9008f044183d2237b723b235953e4d8b47bec6a7b300d98075555478da173b599ba9c7c547c2f111ce1fae5ac646e7a3 -a26b4cc42b353e1c18222d2e088d7f705c36be12e01179db440f10fcfa9691d31fc4fc7e7ee47876f1624e6d44be1021 -995e75824f322294336bfa2c5d1a319f0d77f6a0709beabaf1b43015d8a78d62447eab907349524734170f0294d1ca7a -8b96f04a19dbe4edc71d1f2c6d3475ae77962e070ec5797752453283c027c6b29b6e58e8b7eb5c3f9770557be7e80b67 -8621459865234734bcfaa492ca1b89899525198a7916ccc6f078fb24c8bf01154815bb5b12e1c3d0a10bd4f1e2ea2338 -ab52174541185b72650212e10a0fe2e18ccfd4b266a81233706e6988c4af751b89af87de0989875f7b5107d8d34c6108 -966819d637bdd36db686be5a85065071cf17e1b2c53b0e59594897afc29354ecba73bf5fc6fa8d332959607f8c0a9c27 -b7411209b5ab50b3292c3a30e16f50d46351b67b716b0efb7853f75dc4e59ec530a48c121b0b5410854cd830f6c4b3ea -a5dc04adbadce0af5dc1d6096bad47081110d4233c1bf59a5c48a8e8422858620f4be89bf1f770681be2f4684ee4cce7 -af77a8f83cffb5f8d17be0ab628dedcad63226c9b13ce4975fb047f44bfef7d85e7179aa485abb581624913eddbb27ec -82bf28dc58c893c93712ce297cc0d64f70acb73a641cb4954ccf9bf17597f6d85eecf5a77c8984ab9afbe588562a0ee9 -988a7cef9a178e8edb91f3ec12f878fd68af2ac0762fa0a48a2423e24f765ed8f7837429fd8bc0e547e82e6894e63008 -a5d5969311056d84b3ee87f49286fac0bd9a7220c196cea4f9dced3b858dcdba74718eab95b38bd5d38d2d1184679c98 -af4d51b3ded0aaad8f12bef66c0616e9398fc42618852ac958e6ab2984a720a6111ac55b249d7e4523051740e12b346f -ac635b4a49f6fbb94a5f663660f28431ba9f7c5c18c36ebc84fd51e16077de7753595f64619b10c16510ecbc94c2052d -ae25eb349735ced1fe8952c023a9b186a1f628a7ddf1a4b6f682354a88f98987ac35b80b33189b016182f3428a276936 -ae3ab269690fdd94134403691ba4f5ed291c837c1f5fdc56b63b44e716526e18abb54f68ca5d880e2fb7bea38e74c287 -a748b03b2bd3fbc862572bc4ddc0579fa268ee7089bcfd0d07d0c5776afcd721302dbb67cb94128e0b1b25c75f28e09a -8f09a2aaa9ba3dfe7271f06648aba9cc1ea149e500a7902d94bb9c941a4b01d1bb80226fd0fd2a59ad72c4f85a2a95d0 -853d55ad8446fd7034e67d79e55d73a0afcb5e473ed290e1c3c7aa5497e7f6e9bbf12d513fc29e394a3dc84158a6d630 -b1610417fb404336354f384d0bf9e0eb085073005d236a0b25c515d28235cea5733d6fbd0ac0483d23d4960064306745 -86de805b3d4f6fbb75233b2cf4d22fcc589faa2ac9688b26730cb5f487a3c6800c09bb041b2c6ab0807bfd61b255d4c9 -893b38c72cf2566282ee558d8928588dca01def9ba665fcb9a8d0164ee00dedafbf9d7c6c13bcc6b823294b2e8a6a32c -8e50de7a70ac9a25b0b5cf4abc188d88141605e60ce16d74a17913a2aff3862dec8fbbf7c242cf956f0caae5bcc4c6bf -b5cf09886a4fb4ce9ea07d1601d648f9f9d1a435b5e1e216826c75197cd6dafd6b2b07d0425a4397a38d859a13fdb6dc -859dc05daf98e7f778a7e96591cc344159c1cbe1a7d017d77111db95b491da0a9272866d2638a731923ca559b2345ebe -8ff1792f77ecdfbd9962f791a89521561c7b82031a4e53725f32fe7d99634a97b43af04cbf3e0b0fdff4afa84c49eb99 -81e2cd8a221b68ae46dd7ce97563bd58767dc4ce1192b50ff385423de92206ff585107865c693c707e9d4ed05f3149fb -8fce7da7574e915def0d1a3780aa47ef79b6d13c474192bd1f510539359494ddc07e5412f9aac4fc6c8725ade4529173 -ac02f5df60242734f5ead3b8a62f712fefdb33f434f019868a0b8ddf286770244e2ddfb35e04e5243ba1e42bcd98a6a5 -a8d69783349a442c4a21ecb3abd478a63e2c24312cb2d2b3e10ea37829eb2226a9b8d05a8c9b56db79ffaa10d1f582d1 -b25b5cca48bf01535aba6d435f0d999282845d07ac168f2ca7d5dba56ee556b37eab9221abdb1809767b2de7c01866c1 -8af7e1d1f4df21857d84e5767c3abe9a04de3256652b882672b056a3ab9528e404a8597b1ad87b6644243f8c4cd3799f -a6718308dfa6992ae84fcb5361e172dbbb24a1258a6bd108fd7fc78f44cc1d91be36e423204a219a259be4ab030f27ff -b99cbe3552c1a5259e354c008b58767c53451932162e92231b1bebfc6a962eb97535966a9bd1dfd39010dfcda622d62a -a8458f6b8b259581f894e4b5ce04d865f80c5a900736ca5b7c303c64eaf11fe9cb75e094eece0424ba871b2aee9f7a46 -914f763e646107b513c88f899335d0c93688ffa6e56c3d76bff6c7d35cb35a09f70dc9f2fe31673a364119c67cd21939 -9210f2d39e04374f39b7650debe4aceeb21508f6110ab6fc0ab105ec7b99b825e65753d4d40f35fad283eeff22a63db0 -98729cf927a4222c643b2aa45b3957b418bce3f20715dd9d07997a3c66daa48dd62355dbd95a73be9f1d1516d1910964 -a602c399f1217264325b82e5467a67afed333651c9f97230baf86aec0dd4edeae1e973cafef2ea2236d6d5b26719954d -ac9632921d45900bf3be122c229ba20b105b84d0f0cba208ccdce867d3e9addfb3ef6ece9955950d41e1b98e9191ef42 -a76ce1f53e1dc82245679077cb3bca622558f2269f2d1a1d76b053896eba1c3fc29d6c94d67523beb38a47998b8c0aa7 -b22b51fcc1b328caa67cc97fb4966cb27d0916488a43248309c745cd6e2225f55ad8736d049250fa0d647e5f8daa713c -b7645c1923a6243fa652494fe9033fa0da2d32a0fb3ab7fcb40a97d784282a1ffad3646c499961d4b16dadbc3cbb6fd6 -acab12b490da690db77c4efdc8b2fe6c97ac4ba5afb5165d6647fdd743b4edbad4e78d939fc512bebcf73019c73bae40 -ad7a0fcd4e4ccb937a20e46232a6938fccf66c48a858cf14c8e3035d63db9d1486e68a6bf113227406087b94a0ece6a0 -a78605beaa50c7db7f81ab5d77a8e64180feea00347c059b15dc44c7274f542dc4c6c3a9c3760240df5f196d40f3e78b -8763315981c8efa9b8ae531b5b21cfc1bbc3da3d6de8628a11dcc79dee8706bd8309f9524ec84915f234e685dd744b69 -b4a6c48531190219bf11be8336ec32593b58ff8c789ee0b1024414179814df20402c94f5bfd3157f40eb50e4ef30c520 -8dac8a3f152f608ce07b44aee9f0ed6030fa993fd902e3d12f5ac70bf19f9cde2168777d2683952a00b4b3027d7b45ea -8baf7dfae8a5840c5d94eabfe8960265f6287bb8bc9d0794a6d142266667a48bec99b11d91120907592950a0dddc97d9 -b8595e6ea6b8734d8ae02118da161d3d8d47298d43128a47e13557976032dad8c2ccbfff7080261c741d84d973f65961 -8b93979c51c8d49f4f3825826a5b9121c4351e0241b60434a3c94f2c84f0b46bbf8245f4d03068676166d0280cf4f90c -aceb0fdaf20bf3be6daebf53719604d3ab865807cc2523285f8fef6f3fc4f86f92a83ad65da39de5bd3d73718a9c4bd2 -814dd41764a7d0f1a14a9c92e585f154a26c8dbf2f9bff7c63ae47f1ac588cec94f601ccc12e8a63a7a7fce75a4287f2 -b47b711848e54fa5c73efc079d0a51a095fa6f176e1e4047e4dac4a1c609e72099df905958421aee0460a645cba14006 -aaf7bd7e1282e9449c0bc3a61a4fca3e8e1f55b1c65b29e9c642bb30a8381ce6451f60c5e0403abc8cee91c121fa001f -b8b0e16e93b47f7828826e550f68e71a578a567055c83e031033c1b7f854e7fc8359662a32cc5f857b6de4aff49e8828 -b3eb70b8c8743a64e1657be22a0d5aeb093070f85a5795f0c4cb35dc555958b857c6c6b7727f45bf5bedf6e6dc079f40 -ae68987acd1666f9d5fa8b51a6d760a7fb9f85bf9413a6c80e5a4837eb8e3651a12e4d1c5105bfb5cfa0d134d0d9cfc2 -acd8fa5742b0bac8bd2e68c037b9a940f62284ff74c717f0db0c033bf8637e4f50774a25eb57f17b2db46e5a05e1d13d -a98dac386e7b00397f623f5f4b6c742c48ab3c75d619f3eaf87b1a0692baf7cb7deac13f61e7035423e339c5f9ae8abf -99169bd4d1b4c72852245ebfbc08f18a68fb5bcce6208dd6d78b512b0bc7461f5caf70472b8babf3e6be2b0276e12296 -937d908967f12bf7f728fe7287988c9b3f06c1006d7cd082e079d9820d67080736910bc7e0e458df5bae77adb9a7cbc1 -8c50e90ce67c6b297fd9406c8f9174058c29e861597a0f4ed2126d854a5632fa408dfa62ad9bb8b6b9b6b67b895d5a4d -8f4840a91b0a198226631a28e7a2e893fc6fed4d5eb3cb87b585aac7f4e780855a353631ad56731803296f931e68a8d0 -96a4b8c64d3d29765e877345383bf0e59f4ac08798ac79dd530acd7f3e693256f85823ad3130fb373d21a546fe3ca883 -b0dce7a6ab5e6e98b362442d6e365f8063ba9fef4b2461809b756b5da6f310839ac19b01d3fd96e6d6b178db4ff90ee1 -8f012cb2be5f7cb842b1ffc5b9137cafef4bd807188c1791936248570138f59f646230a1876f45b38a396cbdd3d02e08 -94a87b5ce36253491739ca5325e84d84aaff9556d83dcb718e93f3ff5d1eecf9ae09d0800a20b9e5c54a95dfebfcecd3 -b993ec5f9e82cc9ceeb7c5755d768bc68af92cc84f109dfaf9cf5feb3aa54881e43c3f598ba74ed98e8d6163377440ca -92f845d4d06a5b27d16aef942f1e3bcbe479b10fef313f9ca995315983090511701b39ccbb86b62d0c7c90a2d1f0c071 -b6ec6da0f9e7881e57fa3385f712e77f798abc523609a5b23e017bb05acc6898825541aed7fe2416c4873de129feceea -86b181183655badfe222161d4adf92a59371624a358d0ec10e72ee9fa439d8418f03d635435ec431161b79fd3fa0d611 -b5e28eeed55fb5318b06a0f63dbf23e00128d3b70358f1c6549fd21c08ef34cb1372bc0d4b0906cc18005a2f4cd349bf -85c4d3fddda61dbfb802214aa0f7fc68e81230fb6a99f312848df76cddc7b6dfd02860e8a4feb085dad1c92d9c6c65e0 -80f7fdec119309b2ac575562854f6c2918f80fc51346de4523ec32154d278f95364fdef6f93c7d3537a298dd88df7be6 -9192c1949d058614c25f99d4db48f97d64e265a15254aa6ed429e1ef61d46aa12355769f1909a5545cd925d455a57dbe -a0b1e7d928efc4dcbd79db45df026ae59c20c1a4538d650c0415ab7cb0657bc1e9daeacc3053ee547e8f9c01bdbd59c4 -893e84c41d3a56bca35652983c53c906143b9ad8d37b7c57f9dacbeb7b8dd34defc6a841f5b9857ffb90062bbd8e9dee -a7f89a448349dbc79854cf888980327f92aedc383c7fadd34fdc0eaa4f63d751315b4f979e14f188854ef4d16c9e8107 -833f2774a96187805f8d6b139c22e7476bce93bc5507344d345008080fb01b36d702b96e4c045617a23a8ca1770b4901 -80e46e86d68bd0a48ac6fa0b376d5bb93a5d6b14f08b3a47efa02bb604c8828c2047695f1f88fc5080e5548e1a37130f -943f42b7b4ad930059a26ad06b62e639f06c1c425d66066c55134e97c49abe412358c7cb994fcc1cf517ea296bca1f68 -8b9d4fe835dc6a2cbf85738937bbfb03f0119ab8df04a7d68860716ce6ee757dbe388a1e8854ddb69fe0c9fa7ed51822 -909030c7fde2591f9ea41ae6b8fa6095e6e1a14180dda478e23f9c1a87b42c082a1ea5489c98702f6ccd2ba5812d1133 -a715ec1beb421b41c5155c7ef065bbb50b691d0fa76d7df7ee47683d9e4eb69b9ea3e62fc65196a405d6e5e29e6c2c60 -8c9e801cb7ef780a535be5c2a59b03e56912acbfdb00447bfa22e8fc4b11dceecc528f848d5fba0eec4237d6f81f4c79 -b96b6af857c3bc0344082bd08ec49a9bed478d4d35b85a2099b1849cd6997521c42225305f414cdd82aef94b9e1007d3 -8764db720b4e44a4d2527f7f9b535a494a46c60e28eac06bf1569d0703c4284aefa6cb81fbba9d967286f9202d4b59ea -a66fd2f9158e1ffcdd576cba1413081f43eed00c7eb8f5919226f7b423f34ac783c1c06247819b238de150eb5a48d977 -82c52e817ac3bb0833ea055dec58c276c86ca5181811cf7a483b3703a06ea1bee90ae3aeaa2cffeaeba0b15fe5bf99be -987d07cb276f7f03a492cfb82bba6d841981518286402d3e69e730a9a0e29689a3619298124030da494e2a91974e0258 -b34f2c5740236bc6d4ae940920c5bc2d89ff62a3dd3a3ec9a0d904d812b16f483073db1e53b07f2b62e23f381d7bdbe5 -a1c0679331ab779501516681b3db9eefb7e3c0affb689e33326306ada6d7115fafd2cc8c1c57b2fa6c2072552f90a86e -94805e30d7852fc746e0c105f36961cc62648e438e8b9182fc0140dbf566ec14a37ad6e7f61cacb82596fc82aed321e5 -a42fb00b29a760141ff0faaeb7aca50b44e7bbc0a3f00e9fb8842da7abfcaae6fae9450abe6ba11e8ecf11d449cbe792 -8fb36ce4cfa6187bfe8080ac86b0fa4994f20575fb853bd8ffa57c696179cc39f58ff3b4bd5a2542ff1c8b09015539df -a1c54e7aa64df7fb85ce26521ecfc319563b687ffecd7ca9b9da594bbef03f2d39f51f6aaff9a3b5872d59388c0511c6 -855e48fdb8f771d4e824dbedff79f372fd2d9b71aa3c3ecf39e25bf935e2d6e0429934817d7356429d26bf5fd9f3dd79 -8ae6157a8026352a564de5ee76b9abb292ae598694d0ea16c60f9379e3bb9838ce7fd21def755f331482dc1c880f2306 -a78de754e826989de56fe4f52047b3ffd683c6ceaf3e569a7926f51f0a4c4203354f7b5cfa10c4880ba2a034d55a9b0d -97609477d0a1af746455bbd8cb2216adacc42f22bfd21f0d6124588cd4fec0c74d5bde2cdba04cdbfbff4ac6041b61b1 -a03dc3173417381eb427a4949c2dbfa0835ef6032e038bf4f99297acf4f0ba34a5fc8ccf7e11f95d701f24ee45b70e27 -aad6283e85cd1b873aeb8b5a3759b43343fdadc9c814a5bf2e8cf3137d686b3270f1ec2fb20d155bbfd38c7091f82c44 -92ab94ed989203a283d9c190f84479c2b683615438d37018e9c8de29c2610bb8fccd97bb935dca000d97d91f11a98d65 -8c0444a0b9feb3acb65a53014742e764fa07105e1c1db016aec84f7a3011d9adc168dbba8034da8d0d5db177a244d655 -95a33d25e682f6c542d4e81716cc1c57ef19938409df38bf8f434bc03193b07cedd4e0563414ce00ab1eebbd3256f3e7 -8716c30e3e4b3778f25c021946c6fb5813db765fde55e7e9083a8985c7c815e1b3d3b74925ba108d9a733ddf93b056af -a186aabc10f1fff820376fa4cc254211c850c23a224f967d602324daec041bbe0996bf359ed26806a8c18e13633a18a8 -a1e8489f3db6487c81be0c93bade31e4d56ec89d1a1b00c7df847f5cd7b878671015f5eaa42ee02165087991936660b9 -8f688c969c1304dfa6c1a370119d1988604026a2ab8e059016c5d33393d149aae6e56f3ee2b5d25edc20d4c6c9666ad9 -91950b651fefd13d2fa383fd0fdc022138ce064ee3b0911157768ad67ed1fb862257c06211cf429fba0865e0b1d06fc8 -86cff4080870d3e94ed5c51226a64d0e30266641272666c2348671a02049ae2e8530f5fb1c866c89b28740a9110e8478 -88732c4d9e165d4bb40fb5f98c6d17744a91ff72ca344bc0623d4b215849a420f23338d571a03dd3e973877228334111 -afcc476ad92f09cf2ac7297c5f2eb24d27896d7648ba3e78e1f538c353ceeb1e569917a2447f03f3d4d7735b92687ba5 -b622aa475e70d9b47b56f8f5026e2304d207684726fb470a0f36da7cb17c30dd952813fab6c7eb9c14579aacca76f391 -802cf5630c0407ae0d3c5cf3bef84e223e9eb81e7c697ea10ec12e029fc4697ce7385b5efab7014976dacc4eb834a841 -a08596493f4cd1b8ac2ec8604496ee66aa77f79454bb8ab6fdf84208dc7607b81406c31845d386f6ac8326a9a90e7fc5 -a54652ca9e6b7515cb16e5e60e9eabbccbc40bb52423d56f0532d0bac068aec659a16103342971f2cc68178f29f695db -a3ab54875cb4914c3a75b35d47855df50694310c49eb567f12bbc5fa56296e11f4930162700e85ba2dbfdd94c7339f91 -94183a040285259c8f56bef0f03975a75d4def33222cc7f615f0463798f01b1c25756502385020750ac20ae247f649a1 -b0004261cc47b0dc0b554b7c6ebf7adf3a5ece004f06e6db3bbac880634cdf100523b952256a796998a5c25359f12665 -a25dfeb0e18ebe0eb47339190f6a16f8e116509ab2eef4920f0d3ff354e3ead5abe7f5050b2f74f00b0885ea75b4b590 -ab10ef2f5dc0ede54e20fa8b0bce4439543db8d8b31e7f8600f926b87ec5b8eea0ac2153685c7585e062ffac9e8633c3 -8386eac1d34d033df85690807251e47d0eaacb5fe219df410ab492e9004e8adabb91de7c3e162de5388f30e03336d922 -b6f44245a7d0cb6b1e1a68f5003a9461c3d950c60b2c802e904bc4bc976d79e051900168b17c5ac70a0aed531e442964 -ad12f06af4aa5030b506e6c6f3244f79f139f48aec9fc9e89bbfbd839674cfd5b74cea5b118fb8434ba035bda20180af -88511306dfe1e480a17dba764de9b11b9126b99f340ceb17598b1c1f1e5acbdd1932301806fe7e7e5e9aa487a35e85de -a17cdf656e1492e73321134a7678296a144c9c88c9a413932d1e4ca0983e63afc9cdc20fd34b5c6a545436b4db50f699 -b555b11598a76de00df0f83f0a6b8c866c5b07f7ac2325f64fb4a0c2db5b84e0e094d747186c3c698ee4d0af259dc4c7 -88014560587365e1138d5b95c2a69bdae5d64eb475838fee387b7eb4c41d8c11925c4402b33d6360f0da257907aa2650 -b220634e6adee56e250e211e0339701b09bf1ea21cd68a6bd6ee79b37750da4efe9402001ba0b5f5cbbfcb6a29b20b0c -ac5970adc08bc9acec46121b168af1b3f4697fb38a2f90a0fbc53416a2030da4c7e5864321225526662d26f162559230 -97667115b459b270e6e0f42475f5bce4f143188efc886e0e0977fb6a31aba831a8e8149f39bc8f61848e19bcd60ceb52 -b6c456b36c40a0914417dd7395da9ed608b1d09e228c4f0880719549367f6398116bf215db67efe2813aa2d8122048f2 -ab7aef0d6cda6b4e5b82d554bd8416a566d38ded953ffd61ef1fcca92df96cdcc75b99a266205ff84180ab1c3de852a4 -81d354c70ce31174888c94e6cf28b426e7d5c4f324dc005cd3b13e22d3080f3881d883ca009800f21b0bb32fa323a0cf -94f3440965f12bee4916fcc46723135b56773adba612f5ce5400f58e4d4c21435e70518bdef4f81e595fa89e76d08fc6 -a6683e7a1147f87cbeeb5601184cc10f81bca4c3c257fd7b796a2786c83381e7698fb5d1898eb5b5457571619e89e7d6 -8ca29539600f8040793b3e25d28808127f7dc20c191827a26b830fff284739fb3fc111453ff7333d63bce334653a0875 -98a69644048b63e92670e3e460f9587cf545a05882eb5cba0bcbd2d080636a0a48147048a26743509ab3729484b3cc12 -84d40302889c03c3578c93aca9d09a1b072aadd51873a19ef4a371ca4427267615050c320165abece7f37c13a73d4857 -87954271e3de3f0b061c6469d038108aac36f148c3c97aefb24bf1d3563f342ea6c1c1c44c703e1587a801708a5e03f8 -86b6f5367e04c5caa3ec95fd5678c0df650371edac68f8719910adf1c3b9df902cc709a2bddc4b6dde334568ca8f98ac -a95fed2895a035811a5fee66ca796fdecce1157481dd422f8427033ed50c559692908d05f39cb6bea5b17f78a924633c -8ba05bdadde08a6592a506ea438dbdc3211b97ea853d1ad995681a1065ececce80f954552b1685ef8def4d2d6a72e279 -90b6b7494687923e9c5eb350e4b4b2e2fa362764d9a9d2ebb60ee2ad15b761e0850c9a293123cf2ef74d087693e41015 -8819ea00c5ea7b960eb96ab56a18c10a41fd77e150ab6c409258bc7f88a8d718d053e8f6cb5879825b86563e8740808d -91e42031d866a6c7b4fd336a2ae25da28f8bde7ace6ff15dc509708b693327884e270d889fff725e6403914546055c28 -85763642052f21cf1d8bd15fd2dc0c2b91bba076751e4c4f7a31fbdb28787b4c6a74d434d6ef58b10f3ad5cde53ef56d -8b61c36c7342a1967a1e7b4c01cddf4dce0e2025bc4a4a827c64994825f53e45277550ceb73c34bb277323fb784aa3c6 -80b9634a45c8b3770e993257bd14df6a17709243d5429969ab8b9a4645bf2a94f9b3cd3d759169887b4aa0eb50f4f78c -b5c44db9439dd8aa4edd151d95e48a25c1154e1525c337f97109f40131db81a4898344c8c3144c270bdc835c269b3477 -863080fcbc227eea32d0dc844f42dc642fbda7efc398ab698be3a3c6f3bf8803dea6ba2b51fed6151f9522b4ab2a8722 -8481e871129e9cb9d2d109c513cbba264053e75192e967f89659dcfcc1499de9ae7a1ac4f88f02289150231c70b4da01 -834d8183698d3d2d1352c22c373222cb78d0f4c8cb15e0ad82073dde273b613515ebcd184aa020f48f8e6fc18f3e223c -a227e300f0c5bc1b8d9138411413d56c274cc014ae8747ec9713f3314d5fae48bb6f8cc896f232fd066182af12c924e4 -ab7242835e91ba273de1c21eb4fca8312bdda5b63b080888b96a67a819b50294a7f17a7dc0cd87fae5e7f34bc24c209a -86eb27c898a5d6c3618c3b8927acee195d45fe3f27b0991903520a26fb8021b279e2a8015fbbba5352223ae906c7c5d6 -a61b1c200b0af25da8ad8e29f78d000a98683d1508ae92ee7f4326a7c88e0edb645b6cb5dde393ac74d322895e77ba24 -887739318c710aae457b9fe709debff63bfbb3ffbbb48a582c758b45d6bf47a7d563f954b1f085c3bc633ffd68c93902 -aacfcb0e2b0a868b1c41680487dc6600577ce00aa2edeee8c6141f4dc407217ddb4d37b79e7c9182258c750d12a91508 -ad8cd2cf5ccd350cd675a17f31b86a0e47499c6c4c11df640a5391bb10989c9c70df0a3ddeba9c89c51e15fedaf67644 -8aba897d32c7ef615c4dfa9498436529c91c488a83efc07ba9600875c90c08b00f66a51469eb901451b6e18e7f38ffd7 -aab8a600609b80e36b4a6772308bac77929a0c5d8d92bbc38e9999186a1c2bfdbef4f7a2b1efba9c17a68dc15a9373ab -b95811d1454307a30c2ac8588c8104804b06c1aec783fed75a6f12c9df626be57865850100f1ad28073e3867aca941cf -8b119d3bd4ee644469457df5d8a0020fd99b8b20bd65ab121cf95a7f55e50dd8945fcf1dff9d269d9d0b74b4edbc7726 -a980b912df832ea09353fd755aa3eec9eb4cfd07ca04387f02a27feab26efa036fca54cc290bb0c04a8a42fdfd94ce2f -91288e84da1d4ee2a4dad2df712544da3a098fdb06a5470c981fb6d6f3dcc1c141b6f426d6196ff3df6f551287179820 -98b0473bcffcbd478fd1b49895c61dd2311dab3cdec84f8e3402f8add126c439ffcb09cae3b7f8523754090d8487b5a9 -abe76988cf3065801f62a1eb3cfe9f8185bd6ab6f126c1b4b4fde497ca9118d02a0db3fadccd4ca98826b30475fa67ef -94a316a0faa177273574e9e31989576a43e9feb4cc0f67aa14d5c1967c4e10fc99db3ef4fdca2e63800a0b75f4b84256 -975ad39adadc7e69e34981be2e5dc379b325dc24dddacc0bb22311ff4a551a0020a8bdecf8ab8ac5830ca651b7b630ce -8b3bc73b640dc80ac828541b723a968fb1b51a70fa05872b5db2c2f9b16242c5fe2e8d1d01a1dbeaac67262e0088b7b0 -aa8d892a6c23dbc028aae82c1534acb430a1e7891b2a9337cedb913ff286da5715209cffb4a11008eae2578f072836cb -8dee9747a3ae8ed43ce47d3b4db24905c651663e0f70e2d6d2ddb84841272848a1106c1aa6ba7800c5a9693c8ac2804e -81e2c651b8b448f7b2319173ecdc35005c2180a1263e685a7e3a8af05e27d57ec96d1b2af2cae4e16f6382b9f6ec917c -98a9a47635de61462943f4a9098747a9cf6a9072a6d71903d2173d17c073eff3fc59b2db4168515be31e6867210ecbcd -912b2398505c45b0bb4a749c3f690b1553b76f580b57007f82f7f6cce4fadd290d6df9048258978c8a95ef9c751a59a2 -8ac8f0893fe642111ef98ae4e7b6378313a12041bbca52141e94d23152f78c2e4747ae50521fc9c5874f5eb06976e5cf -946b4a8eb05b529aaed56ac05e7abeb307b186a7835623fa4e85ed9eb41a4910663c09ea1bd932a2c467d28776b67811 -a4be51abeddd40e1da6fdb395d1c741244988ff30e10705417b508574b32dce14d08b464486114709339549794df9254 -b33b6b7d66cb013e7afeabbd7ed1e0734eb0364afe4f0f4c3093938eec15f808985fb7f3976969bf059fa95f4d8e335b -a808adbcf0049f394914482483ee0f711d9a865615ff39b5313ed997f7a0d202ad9ed6e6de5be8a5c1aaafe61df84bca -8856268be15a78465ad00b495162dc14f28d4ef4dcf2b5cba4f383472363716f66dabc961a6dbdda396e900551411e41 -b16ba931e570e1bf124ea3bd3bdf79aed8aa556697ea333e6a7d3f11d41538f98dcde893d0d9ba7050442f1515fb83b1 -91ecde1864c1a9c950fd28fa4c160958246b6f0aa9dda2a442f7222641433f1592d38763c77d3f036a3dbb535b8c6d8f -92cda991f69fbf8e55c6bf281b07fff5dbbb79d1222b8c55686480669247b60212aac27aa7cccd12fcee94e7a759b8af -b1d9b5b4e996b375d505d7250a54c12d32372c004a9cabf1497899054cb8b5584b1cef1105f87b6e97603ccbf2035260 -86e98bde8b484fb809b100f150199f13a70c80813ad8b673bf38e291595e2e362ad1fa6470d07d6fbe2cf7aeac08effc -aa12f7c39ba0597a8b15405057822e083aca3cee6ed30c4e0861eeb22620823588d96c97bb1c3776b711041c4dc3d85d -b477b34f29334f3bae69c7781d574342b7c27326088f9a622559ab93075c7357953ae84eb40e3421f453e04e9b4d5877 -9625067cb2120ce8220a469900aa1d1bb10db8fe1609988786b07eb2b88e0ddb35a3eccd4b6741e1fa2365c0db6b1134 -997b92af7765f587d70ea9718e78a05498cd523fc675ad7b0e54a4aae75fbeac55d0c8d72471471439dacd5bfcfae78d -88b59eaea802e6a2cf0c0075bf3fd6891515adcb9adf480b793f87f1e38d2188c5ed61ac83d16268182771237047ec8a -a57d078b230b1532c706a81eaabfef190fb3eb2932f4764631e916a0f0d837d6014da84ede100abaf610519b01054976 -94ed5c5b96f6afa9f2d5e57e1c847ae711839126ab6efb4b0cf10c4564ff63c819d206fdc706178eb6a0301df2434c01 -980296511019c86cc32212bad6e4a77bc5668b82a2321a1ecabc759a8bbc516183a4787c7f75f9ee7f1338691dc426cc -b10ef97db257343474601fd95f9016c205e28bd22bf7b8f9e30c3b14aca1cc9a11e6404ff412ef269c55fb101fee5a37 -b670d5d9c77fc6aa14212dd3eae100620f3510031b11a9625aa40bf31835c9fd717753b555bd159b1aa64a2104929340 -862054fabf6d6d529a7584d1a48f72d2eb216caf959c782ec36c69c26aef4595415d19a28b041946811b34a629105241 -ae4bf2ccd7b0f3774653848b5b4d39e5517dcbcff30d8441d78bc387ff42b573f16b7b0a7366e6ca5cef1dd9f0816df9 -8f810527badcb49f1542a0ccd12e3541efa084243f7106eae003458c176f4c1f01daae9d4a073c2cb2aced747e8a4576 -8a32c2067aaf6baf32db67acd4974a22a6da33db5444028a7c8c4135f9c84e102dc3b2c635b15afa6dc907d0270daffb -b15fc057f306a60b20c8487125b6b334ab749cf70eb8a30c962f625bb203ebd0d2a315949ee3b7a99e3d91acec384806 -a37f145d321359b21cba7be8b64dfae7c67a20b7b324f27c9db172d58e77a49fa02ed3d06d09d7644bf1fd81f4aab44b -b338d2e39a485ee4297adcf5e58e16c3cc331c5dffeade0be190907c1c5bdfed38537a6d81dc39a2cdfc1bc45e677886 -b69d84d8511b3aedfdc7c7e66f68b24e12e5a2365dbbe014bddd2e99e54143428cf8b74cf12c0e71316038aa5300e87e -ab210cc38661667450561a1857337879633f5d5bf2c434a3df74ff67f5c3ba69a7880872f19ae4dcbbb426462cd7d0fb -94538ef487a58a5ff93a5e9616494c5f066715d02be5b249d881a00bd0edfe2fe19dd7a5daa27f043d1dbb5ac69cf58d -afb47a899c1b25fe800241635fa05de9687a69722802ad45434f551971df91d8ca9edda0d835d82eb8f36ff9378ed7e8 -827a10d7536230887283a9b1dedccc6b95ef89cb883c4ee7b9821058b0f559704d1636670c0ada2b253bf60b7cb8a820 -97cc07965065d64409f19fb2c833b89ca3a249694b16b58818a6f49d3800926627ce0f87e5c0853ae868b4699cfdee5e -ae0c93d44780ef48ea537cf4cb8713fd49227f4b233bc074e339d754b5953e637a7289c6f965162701e4b64e4eaec26d -80953053397c4c0ba9b8e434707f183f9ced2a4c00d5c83b7dc204e247ad7febc1855daeb906c53abfdf3fe3caca30c4 -80f017e87b471b5216ebe25d807be6c027614572337f59f0b19d2d1f3125537478cb58e148f3f29b94985eac526cd92f -8a8e1c0d49801a8dd97e9e7c6955fc8b2c163a63bd6a4be90bb13e7809bb0dddc7a5025cc7d289a165d24048eac4e496 -8530e5b5c551a2e513d04e046672902c29e3bb3436b54869c6dea21bab872d84c4b90465de25dff58669c87c4c7d2292 -ae3589d389766b94428e9bde35e937ed11aac7ead3ce1b8efe4916c9bfff231d83b7e904fe203884825b41022988897a -ac02e629a900438350dd0df7134dfa33e3624169a5386ea7411177b40aa7a638e8d8aef8a528535efdbe1ca549911c0b -b1ac60b7270e789422c3871db0fa6c52946d709087b3b82e6eba0d54f478520b1dc366bb8b7f00ff4cf76e065c4146eb -a7465e1f8e57de1a087144d3c735fee2b8213fcbf2b9e987bb33c2d4f811de237bf007402e8d7f895563e88b864f7933 -8ab0007ba8984dee8695ec831d3c07524c5d253e04ec074f4d9f8bd36e076b7160eb150d33d15de5dd6e6fb94f709006 -9605bbe98dadd29504ce13078c1891eca955f08f366e681d8b5c691eadb74d6b1f2620220b823f90ef72eb4ab7098e16 -942a083d07c9cb7f415fedef01e86af4019b14ef72d8ab39fe6bd474f61ba444b9aac7776bea7e975724adb737e6337a -b9a49a8c4e210022d013b42363ac3609f90ea94b111af014f2c5754fbc2270f6846fa6a8deb81b1513bb8a5d442ea8dc -99cd62b177d5d7ce922e980cc891b4f0a5a8fa5b96dfc3204673fbef2e7fb2d7553bbacd7b2e6eca4efb5e9a86096e2e -94e30b65b3edd7472111566dde7fab0e39a17e1f462686050f7134c7d3897e977550faf00174748cbeaec6c9c928baa8 -a32fbcb29f3391d62092f2720e92b6ef4d687d8a3eae39395e0464669a64a38fe21a887f60bc9519d831b9efde27f0f4 -8f1492c4890d8f9deecb4adada35656e078754dcf40b81291e7ef9666d11ba3747a478f9420a17409d7d242cecd2808f -8942960b319ef65812d74cb1d08a492334db58d41e8437e83ddf32e387d9f3ad36834f59e6a71d1afb31263773c3ec49 -88d692f4976c99e763b027df9c2d95744d224724041dfbe35afc78b1f12626db60b9d0056b3673af3a1741eaf5f61b43 -9920cd37eab256108249a34d3f1cc487829cc5f16d1bce3a2328fe48b4de735ebde56c8b5cf4e532a4d68792387257c5 -87d34c9f5a913b806504a458c843eda9f00ff02ad982142543aa85551208cab36ebf8b3409f1c566a09a60001891a921 -a2ee8339c96f790b3cf86435860219322428b03ea7909784f750fe222bc99128d1da2670ad0b1f45e71a6856c7744e09 -84bd257f755de6e729cc3798777c8e688da0251a2c66d7ba2e0ce5470414db607f94572f5559f55648373ce70e0b560e -8d0e170714ddf5dde98b670846307ab7346d623f7e504874bfd19fbf2a96c85e91351ba198d09caa63489552b708fbc8 -9484cc95d64f5a913ed15d380c2301a74da3d489b8689f92c03c6109a99f7431feb8a07d9f39905dcef25a8e04bcec9b -b14685f67dd781f8ef3f20b4370e8a77fef558aa212982f1014f14b1bdd8b375c8a782d1b8c79efc31b41eec5aa10731 -b22fb1541aa7d2b792aa25d335d66e364193fdbf51b24a90677191cae443f0ce40a52faf5983d2cb5f91f0b62a5f20e1 -b06fa9489123ab7209d85e8c34d7122eb0c35c88ee6c4c5e8ae03a5f1ae7c497c859b0d62e0e91f5e549952330aa95a4 -b5cd71617ff848178650e6f54836d83947714d2e074d8954cfb361d9a01e578e8537d4a42eb345031e3566c294813f73 -848d39ea2975d5de89125a5cbe421496d32414032c1e2fbc96af33501d3062745b94e27dfe1798acaf9626eabff66c79 -ad35955efd5a7b6d06b15d8738c32067ffa7dd21cf24afc8ea4772e11b79b657af706ce58a7adcc3947e026768d9cdaf -aff6d7c4861ff06da7cb9252e3bd447309ad553b2f529200df304953f76b712ac8b24925cf4d80a80b1adaa2396f259a -b4b88d35e03b7404fc14880b029c188feecb4d712057f7ba9dedb77a25d4023e5a2eb29c408fde2c0329718bdaf1ff63 -88e96720e2f7c63236cca923e017ca665b867ba363bc72e653830caf585d802fad485199055b5dba94a4af2c3130a6f6 -982675dc0299aeedba4b122b9b5f523ca06d54dc35da0f21b24f7c56c07f4280265fb64cec2f130993521272c3470504 -95c77d418490e7e28293169cf7a491a7dcc138362f444c65b75d245c1b986d67c9e979a43c6bd8634dae3052df975124 -8fd6c4dff54fb2edc0bdd44ccd1f18238c145859ccd40fbfbc1cf485264445b9d55ffd4089c31a9c7a0543cc411a0398 -b153eb30af9807b5fe05d99735c97471d369c8a1af06b2e2f0b903b991eb787ab5a88c6e406e86225582acf8186ad5ef -826b55de54496751b0134583b35c0c2049b38de82821177e893feeeeb76ceeb747c7a18312cb79a6fc52f2c18f62f33e -91650d7205b232c495f1386bea0c36e136a22b645ffd4f5207f5870b9ce329c44524781c983adf2769f4c05b28a8f385 -b8d51a39162ebb38625e341caacc030913f7971f178b3eee62dc96f979495a94763ea52152198919c6dd4733bc234f64 -a1fbd3673f2ae18a61e402fe3129b7506d9142f2baca78f461579a99183c596b17d65821f00d797519e9d3c44884d8a6 -b7c5f5407263398cf0ed3f0cf3e6fcebdd05c4b8fd4656a152cedcdbf9204315f265fd8a34a2206131585fad978a0d6c -94fa71804e90f0e530a3f2853164bc90929af242e8703671aa33d2baad57928f5336e67c9efdcbd92c5e32a220b4df07 -b75dcea5ad5e3ed9d49062713c158ebc244c2e4455e7a930239998b16836b737dd632a00664fded275abe4f40a286952 -a02f7b37fc30874898618bfcc5b8ff8d85ef19f455f2120c36f4014549d68a60a0473ddfd294530dfd47f87fbd5e992d -8b48e1626917b8ba70c945fe0d92d65cab0609f0a1371fd6614d262d49fe037f96991c697904d02031ec47aab4b32f48 -b368f02c21d4af59c4d11027e583ca03ef727f2b2b7918ef623f529ceac76753a05a4ce724ce2e018da6ecc5c1c1261b -a95cba06eeae3b846fc19a36d840cbcf8036c6b0dc8c2a090afcf3434aaf5f51ef5d14b1e9189b1d8f6e4961bf39bbf8 -b32ca4dfbeb1d3114163152361754e97d3300e0647d255c34ec3025d867ed99e36d67ebafe8255b8c29be41864c08edc -8e4eddefa27d4fe581f331314d203a6a0417c481085134d8376898f9260f133e2bf48576528d62adf29953ad303e63a7 -92b7d5505833f00d5901ae16c87af028de6921c2d1752a4d08a594eb15446756ea905b0036ae6ffe6b8374e85eb49348 -b50e9018d3c4e05ba9b28b74b6634043f622d06aa8123da7cd0bc482b3131912149214d51bdfd887484422e143c3c1c0 -ab980a2f5317dfcb92baa4e2b3eb64a9ac2a755da6c11094d57e781ae5cf43e351824f1dd3abb4c6df75065b3784210b -aaabb009dfcb0bae65a0aee26ed74872c226965c52a6ed0998209e020a9ee806297dba4b15845cf61e1a514de5d125db -a1fe78f67000ebb6e90fe33e1a9dd5489be6e15fedb93b2a37a961932b77137fe85d46e89a132ecf7bcfb7aa95e16757 -85bc6e7d660180de2803d87b19ed719d3f195ea0a92baf9bfff6113c743f4237f51355b048549913e95be8ddf237864d -87a167968c4973105710e6d24ad550302ee47fe1f5079d0f9f9d49f829b9f5c1cd65d832d10fe63533e9ad1fa0ad20f5 -b2ad1a7b95b8a89d58e0b05c8b04ae6b21b571d035ae56dc935f673d2813418e21a271cccaf9d03f0d6fa311f512d28c -8268e555319992d5ac50cb457516bd80c69888d4afa5795fcc693d48a297034f51e79f877487b6f7219cfdd34f373e14 -b235411f1f6d89de3898642f9f110811e82b04ad7e960d1dd66ec7a9bf21de60e00cfabcd3004f3b5c4f89f5d9c7422a -b6963effcfe883f7ed782a3df3c40edd70f54ceca551859bcccb5d3e28fd2c1fcbdd7acc7af24a104687fd02b53c704d -862645c944e1e2909b941578cc5071afd7353fed1c2c99517e2de7573037704ef5d35accf6ec79b8269da27564209d50 -90f585eeb1a053e2f18c1280c9d6a561c0bc510b5f43cd68370ed6daac4b3749852b66c371397b6a7c1ece05ee5906c9 -876d9a3686feb79ce781e87ac3e3fbeef747b6ab031285e808c8a73f73f55b44507850dcaa745c0791d2cae8ad61d74e -a7ecc3b8c10de41a7bd9527228a0d3b695a651a5b5cb552a3664a887077d39ee60e649aecd68ed630da6288d9c3074ad -83529f1f2b4dc731ea05c1ee602fa2e4c3eebe2f963f3625959ba47657be30716d64e05e8b7e645a98bf71c237d9c189 -834ca6b14428c30a4bc8d5a795596820af6f3606f85bee9f3008f3fb94b3adffa968d21a29e2588d7a473d8b5d3a8b42 -b8d08cd8b73430984fd16e8db0525ae2b76253c92cccd7b3470add4d12d082eafb55a72bde04870924d0bdaf61f76c5d -96ef32df669690c2391f82136fc720231e4a185c90ba79eef7beaadedf7fbeb56ed264825564bdc7da01829b47f4aa88 -93d637b2f04d71891a80a1ee93fd9c9046d671bc4c15c4e597cfcc36f4ae85a7efc111359628965fd10d36c39129b160 -89f28dd3f7bc43749d0e3750c136385d4ffaf2c40354d3be38341416d755de7886d8108d83721b36f99feb3bccd73c88 -ac6392e274659f4c293e5cb19859828f101959c4c0939920a8dfed0e2df24a0cbf89a7aa983e947318c58791c893928e -83b2d4ce42c2fa0f672cd911365d1f1a3e19f1c38f32bedc82820ad665d83ae5fac4068e4eca6907bd116898966fed92 -b5e0144d6e59a9d178d4ee9f8c5dba18d22747fcdf8dc4d96d4596a6e048e384cd1e211065f34109c9ed6b96010d37e5 -b1a65e6b38c9e84b3937404d5b86c803c2dac2b369a97cbf532cfdd9478ee7972cf42677296ad23a094da748d910bc48 -849d7f012df85c4c881b4d5c5859ab3fb12407b3258799cfc2cb0a48ae07305923d7c984ff168b3e7166698368a0653d -84d9b7ee22bf4e779c5b1dd5f2d378ef74878899e9dbb475dfdcd30c2d13460f97f71c2e142c4442160b467a84f1c57d -964e497ef289fac7e67673a6cb0e6f0462cd27fc417479ecb5eb882e83be594977fb0c15a360418886aece1aaf9f4828 -ae1226222098a38ce71f88ab72de6ededb2497e30580e7ae63d4829dcc9c093bdd486102b7a7441cb06253cf0df93772 -a72865b66d79009b759022e53b9eedbd647ff4b1aab5d98b188100d01fc6b5d8c02b80eb6f53dc686f1fdda47d4722b8 -93aa8d7d8400bdfa736521133c8485c973d6d989ec0a81db503074fe46957a3999880fd9e4e7f44de92adf6ac0abe99b -a75e5ab84399962ada1f9ebcfc29f64405a1b17cd0a983950d0595b17f66386393d95a5aa4c6c878408984141625141c -91b1e5e75f4b55ec2e8f922897537082a1414eedc2bc92608376a626d8752d5d94f22f0e78ea1970eb0e7969874ad203 -83bf9c308424ef4711bfa2324d722f550d95f37d7f7b4de0487ccf952b89d7219ca94e7fa25bee60309efefd9a0e4716 -a42060476c425ff7979456d3c5484bc205fb1ef2d7149554a4d483d48e2a19119f708c263e902943bcf20a47e6c7d605 -8170c45ea126e6367aa5f4a44b27f7489a5dd50202cb7c69f27a2bdf86d22cf6b00613b0080d75fca22439eeaaaa9707 -8e5a82da70617697e42c6b829e1889b550c9d481408fe4cf8dc9d01daccabdec01f9e1b8c27dc84902a615d539bf9bc6 -80606c51401d0bf5f2700ebce694c807ab1f7d668920bdcccef2775e0939472419a8f404567bd4f9355095517eb4d628 -a40314565d60d0ddf8995673e8c643b1baa77a143b3d29433263730a6871032260abc1320e95af8287b90aa316133da0 -a87e07e84435f9e8a51ce155cd3096aa4b20d18e493c9dcbc0ac997ac180f3a255bf68ccd8195f2564d35ec60551a628 -84d2ab98416643c457bf7ddd9f1aa82967ecea189db08f3558f56803fe7001693ed67ec6ca8574c81ec1293b84a7c542 -937c3b955889ceae77f28054ce53d75f33cfe3a04f28e049cea8b8ade2a0440d5e2e8c4f377e6c1ae2115d68cc95fc16 -885a911f16845fe587b15ce7cd18cc2a84295bf609732340f74e0f5275b698cffed3e9aa1440e19e6940a7fa8f24c89c -ad90059a50c399996aaa0a10a8f637b7bab0dd5d9100301f0159a2c816596da55c30b2568d1717705fd2826b117a42d6 -828de9ff1e095c189da1f1ee18009afe14613ac696025add6f4e330488e02d5f1a90be69edd9a17bfb3355a0ca77b525 -b7aedb8394064a58dd802be6457555c0cf7b94805ed00cc66f38449773f4b1865feaee3a6f166eb51b2123b89d853a4d -b09c564ff37ccea34e90f2d50a40919a94c2e10d4fa58ffeaed656f88f9f4ae712d51c751b1b8f443dc6c9506d442301 -b24882d66b2ebb0271ebb939c72308d81f653940e70d6f1bcaae352f829134aff7f37522cc42de9e7fe6243db2c4806f -8e6f8dd906e0d4eb8d883f527e926ad1d8156b500c4cfa27214450c8112267c319900de2443c87bed1e4bb4466297dd5 -ae42f4578e8d79b6aa2dca422ada767e63553a5ee913ff09cb18918116905b68f365720a1a8c54c62cce4475ba5cdd47 -ade639bcd5017ea83ec84689874175ed9835c91f4ec858039948010a50c2b62abc46b9aee66a26bf9387ab78f968b73e -8d310a57aeb123cc895ee2fd37edc3e36ce12743f1a794ad0e1a46d0f5e4c9a68b3f128719ed003e010f717ec8949f43 -8606c086fcf3e2f92c1b483f7e2a4d034f08aef1a9d5db9e8a598718e544b82544268a0a54dfed65b4d0e6027a901d47 -8ccd95dd673d8cfdfa5554c61bcdbe6bb5b026403a320856fe51571e7c59504fe1c035f2ad87d67827339d84c0e1a0c6 -955a7cb4afcf70f2eb78756fc3a82e85ab4330eb89a87117294809beb197d1d474001e25306e8ad71daab6928abf6d64 -ae6b44ec6294736ea853ddeb18fc00cce0ac63b38170ff0416a7825cd9a0450e2f2b340d27a7f2e9c5ac479b4cb8a5fe -a88ec3f12b7020dd593c54376597b056e70c772c0ec62c24c5bfd258b02f772161b66e5dcd95c0c0fceb23433df9ff23 -b4a83933b4de552dba45eedf3711f32714e58ae41d4dab8a6114daeb06e90a5a5732c70384150d04124ac6936ca9804b -b8b7c4fa549b0fa1dc9c1f0af0750d6573f1648767751882d41f0dd7e430e3934590757e1c8b436ac35381bdde808117 -ab598b911234a98cfde07234cfc0d2fddfc5cb9ea760212aa3e175a787ce012965c8fcfdf52d30347f5f1b79cf4a0f54 -a9d354f9dfbd1976e5921dd80cbb56b2e15df53ce099ecb4368eff416998130d7830209282aaf1d4354129845f47eb80 -8c889afff546c721969e4d8aae6e6716ad7c2e9c1914dd650e30419ee77d630efb54dfffb4ec4ff487687b1864bf5667 -94ed2fa79116c7c8c554dc306b1617834dd3eab58baf8f0d085132c4688ca4a6bd38420281283678b38970a3f02b9a94 -944fdc8f0516d22f1672193d183833d3e3b043e26807fb2123729a0216c299785b1c4e24b5aa56e9bbe74fa54d43e22a -a48521454a3e0c10a13d8e810fad9d0522c68eea841821a8e0e57811362f7064a8f9c50f79c780a02df7df8c277feaef -8f3d26670ab55e1bd63144e785203373b2b13b76cac305f0363e48a6339fac3364caa3fceb245527161fc2fac9890912 -b4d6fe71001cb4141f6d8174dd7586d617cfccb54471e1fbce30debc2b1dead62cab29565abb140b682811c6231acb03 -91dc8afc4934fcc53ef851462a055cc1c3c87d7d767e128806891738427606d2fbfa832664d2a7f95f8ffe2cf0c44dc6 -b297eb432c74071764272c1b1663547ba753e66bf026643bfc0e42a9c5cdfb05a88083ad67d6ddfe6ab290678c607b29 -b343d1df85be154faeb5b21741a5ac454ca93f70a0b83a98f5901d1be173a1b2969d43e646363c5d4975924e1912599e -b2d74a66e4dfc41128aee6a3f0ff1e5137a953ed7a2a0ab5a08d7ea75642f12bd150b965c8f786ad0caf55ef7c26be4f -a54141faa8dd9a567c3cd507e4fc9057535ffe352fa1e8a311538fe17e4a72df073fbf9371523e5390303db02321650e -8e229a58f1acc641202d2a7c7e120210b9924e048603b9f785a9787ad4688294140ef3f4508c8c332d2dedafff2485be -9523554c11d39b56e6a38b3b0fadb7a9a32a73c55e455efdcfda923aff1e9f457d1b7cbc859b5ecbb03094eae8b87d38 -a199ffdff1812aaea10cd21a02b3e7bf3d8e80e501aa20bb2105b5f4cb3d37265abcda4fd4c298d6c555e43fa34517f8 -97f1285229b07f6f9acd84559afef5daad4320de633c9898b8068c6cb3b19b4468b4445607559ddf719f97d2410e2872 -a1dfff82908c90fc38ec7108c484735f104e6ce7f06097e1e80f6545702b6a0bc2a2706203cd85162edb7e9294fdedba -b12a706311c617d6c19e964e296072afce520c2711086b827cff43a18e26577e103434c0086d9d880c709df53947b48c -88503a6f48cef2f5cd3efa96a5aacc85dc3712a3b9abbb720a2cff582a6ea3c2afc49288b6832c8599f894950843ac11 -83ed63e38dfbe062fe8c7e6bc2eeb5a116f1cc505c6b038990038de6051281f9062e761ea882906ccff69c9c5b8a4a25 -911090d5d0231dde1189408dca939daddcb69a812ac408d1326060f0220781bcc131c9229e6015540f529d9fb33d9b0a -8a8352f1d9e5c7e80276e4448f997d420d5a7e0e2d5be58ae4106f47f867d1caa478b2e714d9c3263e93e5cc4c7be08b -9362f1ea9995f9b3850ebb7c8d5bf95927ab5ea25ee00e85d7456b3bf54459798b1fffde049d445c0d0587b0ab0a1694 -8859502b391273f4a00b6c0e87e5cdae676b7baf6c402f12b3360db6a5dfb4931ece4da0e1e4d98c7a71c3d01a183a9b -a9a5edf474120f9bbec9485d8b1e6f83be68b10de3d765219b0bf3e5d2840e478f1fb2bf806d78a8b8ad22ec50cf7555 -82c75daf983b06e49f0d75a042dfaae8cc92af050293d9059d6e8b01ca3ab2597e7adfc1159ed805513488944e739fa5 -a5cf240f04a9bfa65b811702c923d209e01f9535e217fa55ae3e0d1eb3257d6749e5587e727091e860609d1df29a1305 -95608ab8ade1c9fb814bad78d9cc99a36ad3e9562d5319830e4611ceea508ef76be04639294be9062f938667e33bce6e -8e44181f35c38b02133473de15560ae6588ac744cfdaf5cdfc34f30ca8e5ff6c85eb67dddc1c7d764f96ed7717c89f06 -8007b6ddece0646b7e9b694931a6a59e65a5660c723ebdffb036cf3eb4564177725b1e858ed8bc8561220e9352f23166 -a2d9d10fa3879de69c2a5325f31d36e26a7fb789dc3058ee12e6ccdda3394b8b33f6287ba1699fce7989d81f51390465 -81993d0806f877ca59d7ffa97bd9b90c4ebf16455ea44b9fe894323c8de036c5cc64eacf3f53b51461f18fa701a5860d -a20030f457874d903b2940ec32fa482410efecb8a20e93f7406fc55ab444e6c93fa46561786e40e9bf1e3c7d5d130bc8 -80c72d4985346ac71a231e7bbbb3e4a91bf50142af0927e8eb86069303eb4ce7fca1aa5b919d5efc82f2f09b41949acb -91b857d2f47f1408494940281127ba4b9ac93525788e700889aa43402eedea002e70eded017f5f5263741ed3ee53a36c -97445d007f08e285ea7f4d25e34890e955dac97448f87d8baa408e826763c06cbd58dd26416ba038d6c28f55bcea2d3a -a409c89526c2886f6a6439e2cd477351fc7f886d1a48acc221d628e11895a4eedd426112a368a0dbd02440cd577880a8 -a2c6adc7866535f6ffc29e00be4a20fa301357e1b86dff6df5f8b395ad9fb1cdc981ff3f101a1d66672b9b22bd94ec0f -8887fc53ffc45e4335778325463b3242190f65ae5d086c294a1dd587f62dd0d6dc57ca0c784bf1acaa5bbba996af201c -9731d3261a7a0e8c7d2b11886cd7c0b6bb1f5c57816944cc146caa518565034cea250eeee44ddffaeb6e818c6b519f4d -afe91c706efb9ee9e9c871e46abde63573baa8b2ea2b61e426cd70d25de3cc8b46d94c142749094287a71f4dfadd3507 -ae7bdf6ecc4fc0d8d8a7fa7159aae063d035f96ca5a06b6438b6562a4eee2b48d9024dbe0a54cfd075eac39b7a517f2b -a382e5205bfa21a6259f42e9ebc11406b5da2aad47f7a722212fdd6fef39117dd158a9991ff95e82efa0826625168a1c -862760c80bf44c2d41c2a9a15c887889eaeea32acc894f92167fb6f72593377c228499f445ccb59794415597f038ac9e -b4e96595a91a611c4563d09f29a136a4c04f07be74dd71a6bbabc836617ecb95494e48971a8229f980b2189fd108d2e5 -b5e7200357317c36244c2e902de660d3c86774f7da348aca126e2fc2e2ba765fa0facd29eebcb3db3d306260e91a6739 -a64c7133156afee0613701189c37c1362e2b4414f7e99408e66370680c554de67832c30c211c2c678dab5cfcdcecb3f7 -88f4cb67b1db497a91a0823ee3541378133eb98777842d73e43ab99efe8aa52fa02dfb611c1691be23684618394988d6 -89a9382a147d7387d0ff9516ee0c75cd1f8ee23333f4a2c9693d1a8cbe03680bc5b10c43c238c2190db746cac409bf39 -ad510bcc067373d40b05a830bf96fac5487de1ad5b708a13f62484c09b00fba6c5b00b981004e5ab3f28e55c9a5bce26 -8384156d7117675547279ad40dc6bf81e8f9a57b2d8cfebeea6b9cd1d8534dc0cf704068bc3ba0815010cd8731d93932 -a818fb76e53165b2f86c7f2317d64cf5e45f48405a34560983cd88bfbd48369e258ce2952233a8ce09c464e07afcade6 -ab19a4ed90527e30796064634b66cdc023bc5966e2c282468f5abef7879fc52986d5bb873a796b077d10e7b374b60309 -a17dafe2484d633fe295f8533662631b0bb93cdb4e7cd6115271f20336f602f7f8b073983cd23115093c7f9891c4eef5 -804acbc149d0334c0b505a8b04f99c455a01592a12f64d1ec3b82b2f053ccc4107e47f418f813d6f400940c7c8700a4a -965e097a825d8511d095b247554ec736bcb3701ead3ba785bd425cbabd56f4b989764e0965a437fa63e7e16efd991fc0 -b6701675ca27d7a4084f06f89bd61a250b4a292ee0521b2a857c88c32b75f2a70b97f98abce563a25d57555b631844e0 -abbdf65fcbdf7d6551ccd8d6e5edc556f1ecd275ccd87ee2bda8ea577c74615f725aa66e0911e76661a77f5278e0c2b9 -ab715ae372c900239a0758a3524e42063afc605b8fb72f884dc82ab9b0ff16715f3fb2fd06f20f15f9e454f73a34e668 -b45f41ea1d25a90af80a8a67c45dea881775fed000538a15edc72e64c7aa435a5e4375dcdedc5c652397c02b0bc61b16 -86f7be9252f8ed9078e642c31a70a09639899f7ffcd7faaf1a039fec8f37e1fa318fba0ed1097f54fc55d79900265478 -a30e5ed4277dd94007d58d5a3dc2f8d3e729d14d33a83d23c44ddfc31c6eac3c6fe5eb13b5b4be81b6230cfd13517163 -87e723d916f5fcda13fab337af80354e8efe6b1c09ae5a8ceeb52df45bfca618eb4bec95fefef3404671fb21e80bf9db -a521b8a04dc3abd3e9e0454b9a395b3638e5394dc2d60e97fda61b0a1880d1d73a64a4633f3d7acbd379bde113240d03 -851686c79c5403d5f05fbaac4959fcbfdfb51151bec55e10481b3c16e3be019e449907ae782ca154f76a805543d5755d -8ec1929e746b6c62b0c3fdd8f4e255e5c707e6e0d8d57ff9e409ae2dd6e76fdb50af923749992cf92d1b5f2f770bafbc -9175f7b6820d47205c9e44f8c684833e1e81da46c1fdf918a4dcafbc3231173f68370d442a20e45f8902bcab76a4e259 -b4f66c698115333b5ac00c9fe09aa9e1e9c943fbb4cce09c7d8a6ed4f030e5d97b48e944fd6d3e69ac70f1ae49d35332 -b958878b875eead61a4416a4597b1c567ddbb1eaaa971033f4a656f01a277822c1f4ea3972045156c2a5a28d159f5ddf -8188de8ad5258024d0280137a40909d24748137ac7c045dddd2bc794eac8edd5850b9d38f568fa8174b2c0593bb57e96 -91152c7bafce7a0358152221081bc065796fa4736bfc7d78076a0a6845287cde2ee2a2c9b96f500297c0a00410634888 -a5328ab939a2d3bd4c21e5f3894c02986b6590ad551c7734be3f4e70380eb7bc19629e9031b886ce3b4074ee4edee63a -97c4d49db40e266bcedaacb55edca4e1ebf50294679b271f3a2332c841705089b5ba96ef2064040fa56c36bb1375a8d9 -85cf0514f340f9d865b32415710d7451b9d50342dbf2c99a91a502a9691c24cd3403cb20d84809101cd534408ddf74e8 -950c3d167f59f03f803dcba3f34fe841d40adc31e5be7eefff2103d84e77a7cbe4f14bd9c3dfa51cde71feb3468a9c00 -96a69624e29c0fde3b92caf75a63ac0f3921e483f52e398652f27a1ec4e3cc3202f17af1f66224731bc736a25638d3e4 -aeac4170cf4b967227f66212f25edc76157eb4fb44c84190b520ecc2946470c37da505790e225fd1b0682bef7fc12657 -a94146a04e3662c50c2580ae1dba969cbb3fb0f43a038729c9e8be6ed45860b2c7de74f248dfa50ccdbe2ecaf3f2b201 -917b8e2880e85b8db723631c539992ec42536146e7091d4a3f87d37f051b5da934d84393523814f19962c78e6cb12ef8 -931f140ff8f7de79e399f5cd8503558d566b5c2ab41671724dd38aed08dd378210f01ac8fa9911f3047993dbc10cf8c4 -859eb9b560bc36273694f8ae1a70d25e7f206013597c4855a11328162ba1254bb736f1ae41240c8ec8dea8db035e08f2 -b4ad2cb2c3a3e6ab1e174f2dbfb1787a8544f3c9109215aa6d33265ef269455e3cde9858738b4fe04711a9cf9050e7d4 -8a3b342b87b19c0cdb866afff60317e722013c02dee458ba71e7123edc8b5a9f308c533b9074c7dd0d684948467502d1 -89185ac5cc5ea8f10a1f2a3eb968bb5867376d3cff98ef7560b9a0060206c4046ff7001be10b9e4d7ad0836178eba7e4 -845f48301f25868f6d0f55b678eab1f8458e3321137dba02b4cfbb782cbc09f736a7585bf62f485e06a4e205b54a10b7 -931a6c523d4a66b51efadb7eefadba15bf639d52d1df5026d81fd1734e7f8d5b51b3f815f4370b618747e3e8eb19699c -8eb3a64fa83dcd8dd2258942aea3f11e9cf8207f2fdd7617507c6dae5ea603f9c89f19d1a75d56eaa74305a1284ce047 -912a5050ed6058221d780235fb0233207c546236316176a104a9761bc332323cf03786dbac196d80a9084790506e0a88 -945fe10ec8dc5e51aa6f8ba7dace6f489449810f664484e572bfe30c2fe6b64229f3c8801e2eb1a9cb92ff3c4428cdf7 -b62383bf99c7822efd659e3ef667efee67956c5150aea57e412cbd6cd470807dfaad65c857fada374c82fcfca2516ad1 -a727a31c45b2970d08a37e169ea578c21484dde15cb11f9c94eaaf3736652619ce9d3a44e7431d50b0e75b658ebbc1da -97bf54ea9b84b82e4616027bd903ef6152439f1c6a8e1bae6db1d10fdf016af2cac10ff539845833dfd1ddad1403aa8c -a08cf36437e010e59b2057aedb7192e04b16f1cc66382cdef3490b7ad1544ae51f03e87cba0fe43a275841c247a2a0cf -acafab9fa28c1a607df2246490b630ddda1ecf0885ad24c2ecb2c2c1b7b9c7de8066714bf5b9b25f61981d08576789ec -851f0375128d2782586223467d0a595f4c5baa79616622a32f7d6ce1f08af06f8a109bd6527f88d93367dba17be661e8 -a2f1187c2a7cbf776653ff834ed703dd32e68eaf36f0700709be929f4c0ce5fa1d9930d1e3ea2aa01c7a16239e66cb33 -b3721f4a5d24ca112f020cb3f849543bf0e7f84b470fb00126ae80aaaa6f2c208d8359cd82ad9fbafd3ef2ac70656fb2 -98773ac3ce9528c73cfd8e7b95976ce597f67e146357642ac4fb6cb35046f3f39cf6c4a7b5af5c7740dda358aa0d2d08 -92c883a5d820541692af75be1b25dd4a50a4b91f39f367a551a7d5ad6065a26b60d68221a01e4950559717b559c2626a -b82e46dd25fd1234dad26fbcd8bb5177d7b87d79d362ffb9c2f6a5c16eb2ff324d135996fcd6274d919634597869d772 -82a53ed356ced5e94d77ee2a7f6e63f2ad8240aff2d17c5012cf5d1f18512c88c24793339b565dfbb659bd7c48dcbcd2 -84d20c7859b35a1cae1ff2b486d50822f9e6858b6a1f089ce4c598970e63e7c0f7dfbcb3337845e897a9dedf9d449dd3 -974892e5cf5ee809e9353d00e9cd5253d04826a8989d30cf488528c5dcdcad7650e23b4d228c3eb81f6647d2035a9e02 -b2327854910dbf3d97fe668da5fc507e179c4bc941f39bdd62e8b6035f004449c467240f656417e501f32dee109f0365 -88888f73475613d45d0b441276b1dd55835b69adfb27e26c4186936dae047b85478cca56be8dc06107b89a28f3bbb707 -836ba22e40511feff81a5dace3df54e2c822b55e66874dd1a73929994ec29909ffc2a8e39bfc2d16e316b621eb4a5ec6 -a754cedcccf4165a8d998f326f3f37d2989f92ca36d9da066a153c4aab5a62bb0011896bcbf90f14c18e00488d4123bd -86c26fa9584314292c4b7d6fe315f65dadd0f811c699e6e45c95a7a4ea4886c57dc5417b67edd78e597d037c7689568e -b205589648aa49ef56637712490e6867aa3b85b2b31e91437a249fb51bdb31401bff57b865c9e27293b30014b4604246 -afab0843ede582e5a1898ee266235066b94ea378884eaf34919ceaacc0e2738e1074b6ed41e0a1dd9711563e24f0215d -996ed65fbcab7611eada5bd0fd592d3e44705098b8b1dfba6dcdbdcfa1382fe893fa55270a0df0be0e1938bd71ab997c -881bc448a5ef8c3756b67ecb1a378a5792525d0a5adb26cc22a36c5df69e14925f67c9cb747a2f7e5f86ba1435509d7c -b219303c02c9015c6a9a737b35fb38578ab6b85194950a0695f7d521206e1e12956cd010d4d6c3bc3fafd6415845d5d1 -91748829bbd005d2ec37fc36fee97adaccb015208b74d2f89faa2e4295679f7685298f6a94b42d93c75ca9d256487427 -a41d6fd33b9864ebc404d10a07b82ba9d733e904875f75526d9a1f1c1c08b27160dcdb9023c5d99b8ff8a3461d57281f -b68978d39c97d34f2b2fea61174e05e05e6e49cde587e818b584201cf59b7096cf1807b68f315119c6db8d6110b28a9f -b64e66cec798022d64ce52477475d27ea7340817fe7f570617f58c3a9c74071d7ea6b54743d4f520b62aecad9a3a6620 -87b2b9e1c1786b7824f239a857024780a1457e51c64599b858118885833fb87a17d408bc09dcc0607d15ec1e53683a74 -9814799bac07dab4f0c934cc3c051676ca13abd49cf8d4739864e5bb9f2a8474897695113f49239f28832a8658332846 -806931a1526a843a9c2045943d616a8102b02b1f219535a1f1fbda659a1244f1bfead52ca7f1851ff8a97169b91c9ec0 -b8678249595a9641c6404c35f89745b93d8e7b34d9d44da933a1b2f1606972624c5108f1c04eb42e454d0509f441ed9e -81426714851741045a4332eb32b6dfe6422a4a2e75b094fb7c3f37da85648c47ee8af1e54ba26f4e1b57ebe32d0e8392 -b7a1875ea3f119fe0429fd9068548f65cf2869f8519dbbce0b143e66127cb618c81d7578e8391d676b2f3963e9d87f43 -872220a803ea0c6294cdc55aceea42cfacfd7a482982bcb90c0361c351a900c46736a890609cd78f02fb5c8cc21fa04b -974f0380197b68205ff4bb2c9efe5626add52c0ad9441d7b83e6e59ddb2ed93ad4e9bbdbf33b3e0a206ed97e114ea0f2 -a840f2d9a74fca343aedb32ac970a30cbb38991f010d015dc76eb38c5bb0bfe97dd8951de925a692057262e28f2b4e9d -b0913c3ce61f12f9fdc4be3366ed514c3efc438f82fc58c4de60fe76098fbc033a580ec6e4531b9799611c89a8063a66 -a0180d533eee93b070dac618be1496f653a9a0e4e3455b58752bf1703ec68d0be33ec0b786f9431ef4208574b0ad316e -a4a6b871bc95d3aa57bed90e14a0a1dda6e7b92b7ae50e364593ce6773fbf736672b1f4c44e383af4c3cc33e017a545a -a3f44cf19fe52bacc4f911cab435a9accbe137bdbe05d34bdd8951531eb20b41d17e3540e8d81e6b3eea92c744562ee5 -ae6b6d0ff3b30ff0b7f9984ef741cba27ffb70d558de78b897199d586cf60622ec2d8a9d841712fe719cf0f97628842c -87abf72f98c81d6d3a57ab1e224fe4b502ab0d8090d8abc71791271550b721c220d4e2e7da3be94a20c0e63d98e39a50 -b2f73ebdfe7133af57353052f4599776e16862905e64d97e1020c4bb84132e476d1ab79a9fb71611410f3f9d56c95433 -ae1a928253af2b210d31e1b64c765fcbd20a96b8d53823a6b9b6e7fc62249abf4a66c6a6aedb0b687e7384af9a845e0d -99c54398627833ca1435718154de171a47c709e4d5c58589fdabe62e72f2a7a11ae561bc31d7cbe92df4aff23e08cd0e -8a1310bbf1a31fae18189479f470977d324dec6518a5d374ab2ffcc8f64412fb765df57d2ddf69b9a6efaeb2b4c723b8 -898312c6c0d3d3438229b19a8a233eca8f62f680c2897f4dd9bbcacde32c5996d56ac0e63e3e9360158761185491ce93 -81b3f965815b97bc6988d945496a51e4a4d8582679c22d138f3d3bd467ed1f59545da2d66e7b4c2e0373628ae2682686 -b9aca91c6e6f4199beb6976b28e0e35e36e8752618468d436b1cf00d8d23538d0747920e5b2c31f71e34dfe4d5c86a0d -b908f4aa18293295b8cacfda8f3ea731bc791074902c554764c603ab9a1de1bbc72654fd826bffc632d95ce9f79c27d9 -a7316ae1baf4b1196961d53be7fe36535499287aba9bc5f3bed4323039b4121b65bb0bd15a14c1b9cd8b65ede3566da2 -815e39208f205c5fac25ac9988c14a62ab01657c7737a24472d17b0e765644bc2cbb7ff1e8ea169b8b0b17b6996c4704 -89a451d2b740cdaa83ccaa9efb4d0ff5822140783979a4fee89eda68329a08c018a75d58bd9325bdc648b0d08340b944 -8cd08f768438c76bae6bee1809dd7be38ec42e49eb6a4d6862db7698f338bf6b4b409088e4f3d1c5bee430295b12a71f -a4bd8c312103a4bfeb25b0cfffec7a1c15e6e6513b35af685286333c1dce818ffeb52826f2f5bada6b67d109c4ab709e -93afbef5382d89fa539ca527f3e9b4a8e27ab69fd5d5023962cc6d8932b33cb4dfc5f14343e1a3749bfd5e100c9924e5 -8d8e69d046992ec9ff14f21840809166cae8e0e9e7c8f14fb29daf163b05abe6611daa4010960e1141c5ab24373fb58e -96f8e72e96ba673c9265e9cc312f6b9c3b931745fc62d2444d59404bb08e5fb02ddb60715181feb9971cbd954526a616 -8d444c2b8e4d0baadb79e3147a2ee20f1bfe30d72eb9a02f15d632185fb8f4e8c3116066f7de1ebfe38577aaccacb927 -971410c0b10e3698f4f64148b3d2148fc6a4a22217fcf4253583530a9d6fbec77e2cf6f7bb5e819120a29c44653de3fc -99e7e1857bd5ee57007b7b99494b1f1c6bf1b0abd70c054770427d59a3c48eda71b7de7a0d7fcf6084a454469a439b41 -8c8a4cd864894f7a870f35b242b01d17133cb5dfdf2e8007cd5f1753decc0d1fd41be04e1e724df89f1d727e760fdb15 -890a24328bdeaaadf901b120497d1efa17d798f6f4406661e46ecdc64951f9d123d724ab1b2b49e0e9a10d532dd6f06c -a7cbe1f42981c9518608569a133b0b449e9d67c742d62f0d3358112c97e65ee3f08ec0ff4894ce538b64e134d168e5c8 -87c976dea77b3b750c3a50847f25b851af95afbaad635f9bb9f7a6ba8f0c4faeb099dd777cf7eac41072a526474cb594 -9882aa5e9bcc4ea2dd3de4bb5a0878a672bea924b50c58ae077563b6df0268910a60e969d3da1694ae7394ad0d9acd3d -90d35ce677327c461fb5dcb032202e851af1d205e9d21a34ed2b95635f13f8fb8dfa470ea202ccfa4b08140d0cf1d636 -b3b4cbb521cce2b681e45e30a4d22078267e97ccdbdc611b2c9719705650dd87e0ca6e80cf2e174f8f8160be94232c36 -95892b00478e6b27ed09efe23a2092c08e691b4120336109d51e24efbf8aba31d59abf3cf55c0cdab1c210670b9743ba -8643018957fb8ef752673ad73102d0b928796c6496e22f47b6454c9ed5df784306f4908641ae23695db46ebfcfb0b62b -b166ce57669bf0543019ecf832d85164c551c3a3a66c05b17874bccd5d0ae87245925d6f8edc62ac13dbd5db265823a2 -89fb4800ce4b6c5900d58f1a216ad77a170ea186f3aa0e355840aeedcf374e92a15ae442800c9d60334544be020b17a4 -8c65e586215a97bf11ffc591bce5147b4e20750e82486cc868070c7736c3de697debc1f335674aef24b7afdd41922d93 -90f68ce0c97d2661d3df1040ce9c4fa106661a719e97c7b2d7c96f0a958930c57d6b78d823a2d41910261ae1f10e7b0e -adda85e1287371ccbe752aa2a3c1d5285595027ba4a47b67baf7b105a22fb8548fa2b5b3eb93ca6850ecc3995f76d3dd -b26535d218f48d6c846828f028c5b733594ce01186e22e412dd4f4a45b3d87d2ac1bfe5d54c987e4e8aaddeb86366d7d -a081bd86962ea3d4fd13df6481f3aeaabdd7ceae66f7bbb913e601131f95d016cf147d045253d28457a28b56f15643c8 -b3d852cef4c8b4c7a694edbf6f0e103f3ae7f046a45945c77a1a85ec8dad3423636a89058fafc6628aabff4dbb95c2ba -b424ffc94e06e6addc90a6324e0482814229b5902e2a266d0c2d716e40651b952bc9f00d7dad9b6050377a70a72c7f24 -b2cafd908cae0ca22eaa2d9a96175744897a20eb7b0a6d43b0098cb1c69e3cb55373888201e4ed32816655eb7d8a3dd7 -b61177ecf1ae9d7e7852d98cbf6080d9f1e33c90f2436720b4ea4690437e8c7850c3754768fc1312cb4e838d855c5ccc -81b486644e1ae22cf0ba3a37e1df34dc186c82a99ab35ad6f475c37babdea574ddfbe5811d4aa020581292a793d66bd2 -97ae848a823ea7a99f91834e537fb47208f616c08fe32c8f8fe06bd35c9b638698c513265d0b4de9e572a2f9692b98e2 -81b8fef4ea5d399c65e78f40e47c559ada86d890777c549ce362e7ab81b3bfb00d5ff4ae4ee30fd7bda7ee90d28f85d8 -aada6912cc748923ea40bf01922c06c84bc81b2ab0bb3664a0579b646f03d47ce88de733ac7f2cb9be4a8200584cdb71 -89b48b9c79332f8f58eac9100ada5bb7decdc4b1555c5d383e2c1ce447efb0ebdff9c50bb52bc3042107f33a61ab2520 -a32ecca8b870b2b6e9d10b5c1d8f925b3d629d271febad65abed316262bb283c60cade0e91047fbd0fac53ac6db372b9 -b829cd1f13409e3573a8e109c9541b0a9546e98b6c879a11152b5564477ada4d8cb4b3079040e05a5cb63d75ef11eaab -91f3b100baa19e960b170fe9e03b799faac5b9c6f305c56115940bf81f6e64dcb9cda77e8de70ed73a21c0e8a74acc58 -b25b5e872c84065aee04822bbcb4f3bdff57fbd7cea314c383765cc387786c17de3d5bb3de3ae3314bdede14542bfac6 -a89bea9eca1f5a17a3efccfa4987d8e5366b0dba70ef1fef43aaea83c528428d1498c8b056ac27f16e8946ee93f7028e -818a1f7b0b8b06ea0514d6b4a0296da4f69cb18ac8e48c5579e6ba2880b06215fcbe81672566b8b94fcc3c0cadecb191 -98dd6e6b4b4d63d9aa7464a2be08ae8babac4da7716a3f109340bc9187d59c6ca0c88e6877a67c65096f64a3ced22a4b -a2069c5bac4f6590042aefb37570cc20908b0df9d0130180f565ed8a53b4ea476a274de993561fb4d009f529fe7aa1cd -860b7ec2410f033a7b0c5ca08f88a0ad29f951a5ebd5383408a84367e92f1bd33bee3b87adef2466b7e33b47daabf30e -a408855a8414102c3cb49f47dda104edf0887e414723da59b6b6537ada7433529f6a4d1a4ad4fe311c279213cdd59356 -8ca0d81dcb43b89a4c6742747d29598ede83a185a8301d78c6e7f1c02c938441360a1ab62a5e571e3eb16fe17131cbc0 -af7875a495cb4201cdb26e23b7c76492f47f8dd4c81251de2397d73d4c8d5f419cdbad69ba88ef0dc3552e460dbcd22e -80e901e433dca34f3d386f39b975e97f7fc16c7f692808221fb2ee60c1aaa8db079cc48c7d72fd548aaf8dde8d0b8f05 -b6062319e13926416e57a0ffc65668bfa667e708a4e3f5cb26d8a6a32072f5b790d628052d5946c5068dd17cf4a81df8 -90094b569e8975f8799863798912dbf89b12d2c2d62b3e5fac7efc245436fcd33af23b8c509ae28c6591d3f020966e06 -a504f72d3d06a0c9b188a1035c7c6d80047451c378b6c5b2ffa1f8cecdb64871cb6440afb296974c0a528e5e563061a1 -959061c4924e133a419e76e000e7c62204093576ff733ce0b8ae656ec6045ef94c5a1f3c934fb76fa9188c5eb397a548 -a8b9d0b58de38cb86cb88fb039a7c4c0c79e9f07f03954af29013baa18fc2633883f8f9ca847209c61a8da378f9075d3 -b16d8341da4ff003ed6d1bbdb3be4e35654a77277341fe604b4c4e4a1cb95e61362094fb3d20ab8482ea14661c8b9852 -8ea4ca202e3aed58081a208a74b912d1a17f7b99a9aa836cfaa689a4a6aa9d9fbfe48425cad53b972000f23940db4c5c -96a372f55e9a25652db144ec077f17acc1be6aa8b4891e408f1909100cd62644a1c0296a3ddc38cd63ef46bef4e08462 -87df40018ab3a47c3782e053dbd020f199fda791f3109253334a71be4159f893a197a494de8f94d6f09efa5811a99977 -aff82d2ea6b3ad28d0ca1999a4b390641d727689dc2df6829a53e57d4f6418196f63a18495caf19d31fc23fdff26d5e2 -9091053c4a18a22d13ad309313b6d2133a96df10fe167f96ec367f9b8c789ecca7667f47d486fc5ba8531323b9f035ac -a4842090515a1faccc3d8cadbb234b7024254eba5fdfcef0d15265c7cec9dc8727c496ad4e46565d1f08504c77e511d2 -b1d8a37b1a97883d5804d0d2adaa8dbf0c2d334ef4b5095170b19613fb05e9c648484093d0c70d545cf9b043b449c707 -b1ea40f3dd1c3d437072f8adf02c32024f32488dd59389d1c3dfe78aca3df0bab7767f6ded5943cc10f50555da6092f5 -ad219c6a8149f10391452892b65a3268743baa7402736f810a35d56cdfed83d2172b03f15c205f0dc5446baf855907a5 -afe44c3e1373df9fc53a440807fa6af8ebc53f705e8ee44a162891684970b04fb55d60bc2595626b020532cb455ee868 -859ae154b017eae9be9da5c02d151de747cc23094d8f96d5db7d397e529b12fb55666f55e846e2bbe5e6f5b59c9d8b05 -8aa01354697de23e890fe54869cd3ec371f1be32064616ca3a556d3019541ba8e00d683f1396ca08e48988f7f7df5de4 -b8f682487460b9d825302c40a7d6dd0353ff43bf24cd8807cdfa46c043e3f5a7db182b27a8350b28e91888802a015af4 -b6d4d6c3ac40f8976b50be271cf64539eb66dc5d5b7cec06804dfe486d1e386037b01271cf81ef96dba5ea98a35a4b43 -9385a2fd1cd3549b0056af53f9e4a6c2dfcd229801ffda266610118ade9a568b33e75b6964e52fcc49c8e3b900e1e380 -98f4aa0e4ef039786cbd569536204e02b0b1338568d1d22bb5bc47b5e0633fb7ffe1da93eb9d825b40b9b7f291f84d51 -b7b3460cf706dc270a773c66d50b949dabad07075021d373c41fbb56228355324d120703e523ea3f345ef7249bfff99d -81b826255f95201987513d7987cdc0ca0529524d0e043b315a47583136dbada23a114d50d885bb3f855fa8313eff801a -afdc6c35161645a14b54f7b7a799910e2e07c8a5efe1827031a2eecd5d9263b3baa367fdd867360fabc41e85ab687e74 -817b361ce582153f2952f3042e235ee2d229e5a6b51c3d3da7bbe840b5c6ec2f01446125045848d15fd77dc46c8a8fe2 -aeb599265398af6e5613297d97d2b70222534590fcbd534d68b24a0289b6366ac8188b753f6fd1000ee73ef44f8fb7af -a5a9e528b606557be64460c1ad302a43e741357827b92ddc50766a7e6287740fc23bd528d9faf23345ce8bff527d5bc7 -a8d3b3b438d5f75efaae6ce7b67c2212899ece5b5bdc9bac655e271fd1846ea8560e646fdbded3d9363eefe29473d80d -984c7976d557e2f591e779c2885f5033da6f90d63a898d515b5da3adbffa526764cd8eb679b771573fdf7eed82c594ec -8ac748689cc3280e064807e68e27e234609e3cc87cb011f172204e1865ad7fdc78bec1672bd6e6fddcf4e7902b0f38bf -877bb392059540b1c8f45917254b8cc34fb7e423952bdc927e0a1622efec4113fa88988686b48134eb67ddebcb7c3ef4 -ac04b154ccd307ca20428091585e00121b61bae37b22d5d2a1565bc1134be3c81ccf3715fffebe90744164e5091b3d9a -90745c04278c3a47ceea491d9dc70a21a99d52648149b1ab623b5396b7d968fd3c4d1a2d08fc5638e8790463e0cf934e -80bf26ca7301e370f101cc69e7921e187cf5315b484fc80a872dec28bb65886569611a939958f4a3d2d3da4350011298 -87cbf4d6f0c06cc5f24e0f173a5f2f9bf2083a619dcce69a8347c1a6cd1d03325544610f2984eb87a13241e6ab9a22b7 -8909368817a515789ff4d19ed26afafa5729a24b303a368ea945a9287bc9facec9e1c8af19cbec8dab4acbb6a6ddf6c7 -ad8d2f82b08e0990dfd6b09fd54db3a30fd70aad218275550f173fd862347e1258a4716ca2bf4c40e4963850b2277eab -a9467ceacf9337cae4f2c7eeb3e03752ac7d77692b07d5e5d75c438fbe7dc2029ff84f7759372a0ddfa953b4ec7e9e38 -a5feb7669e84b977cb1a50ff3a39c28f7ad1ecc33a893fdf1ddae7a0d8a4c5f6fbaff25cc56631b708af038a961f3b55 -8f2e1fa07963ba18db890b44c3b9ae7f8992b702a5148679df69e4d9d4b1c082b2bd2ae53f96a4fe24b54f3dc1588f17 -896778f35cbecb43f001277c306e38a9c637275101f1a09546f87378b10ccc025644bc650b3b6c36e4fd0c09fbb3df35 -91dc702778176a4d089dc65502d703752dd9a766f125ffef26bdc38fe4abcae07cdea14102c3448d10f8dd6c852ee720 -a5df3004cec6b68b937cadded0dd2f48bd3203a903a3e1c22498c1193f4567659ecaaf3deb7ed7cf43796da9188f5dc6 -b18b4c8ffcb8599c24d9851abf8ee43047cbd4c9074c9cfbf88376a170da4554978988f550afde8a45306ca32713c204 -8370bc38c84da04d236e3c5a6c063e1db6613dcc4b47239d23efdcb0cf86846955b60da3e50f17b17cd3f7e0c29302d9 -ab7d6bb6be10aa52ef43abbe90945e78e488561afb959dc2fe768f8fd660d267c7203a2b7bdfa1b44cd07898f4849e06 -965c96047d82d76ec2cfe5035fd58d483cd2cb7f65c728ab3049562c5d1943096d6a5014c05babc697d79c07907cf284 -9614f7006aef6f0478ebd37fbf17276fe48db877394590e348c724059f07c3d1da80d357120d3063cd2b2bc56c58d9d6 -819c7b2a1a4bb4915b434b40a4e86dd7863ea85177b47a759bc8ecd8017f78d643982e8a091ee9a9e582f2b0208725a5 -8e159a185b5790a3ed444b6daab45f430f72f4ac4026750cbd5c7cd7947b5e00f2b10eaaf5aadf8d23054c5b29245546 -b48cb6f6c0aaea04833e10d735b67607846158b6663da380ef01c5bca3c9d537611716867dc2259883e5bc9daed57473 -8b48ce8b5ab76b7d662c29d0f874f5eec178baf3f14221bffd5d20e952f54f3ed053182a486da1d1f400e0acef58f673 -b6fd3cba177bfbcb5e7ebb1e3c1967cad5848c09c615ba2a6c277908f8b1f4f1ac5f184c33f2a401e8bdafcaed48bb88 -abd8f44c4a447de8fde1c119f4fd43c75b4cc99de9c817a019d219d4b2ad2a73b60606c27e36e9856a86bf03e7fc861f -af9f7e8b3e9e8599c7e355433c503a05171900a5754200520fd2afed072305be0e4aebb9764525d2c37a5a7eede72025 -a0960a58bd2681804edd7684793e3cbb0e20d1d4bd8721b192baf9aee97266be14c4ee8b3a3715845dca157ba2fb2c1d -949a37213209adfbfa4e67c7bad591c128352efd9b881c1202cf526bf4f657140ef213acf0efeb827a0c51a1f18809c4 -9192fae84a2a256f69a5e4a968d673bebf14ea9a2c3953f69fe0416f7b0fafa5166f3e4588d281f00d6deac1b6ec08bc -b1a249662f34a88d2798eae20c096268d19f1769d94879b8f1aa40a37b3764349b8e6ab970558436a88a5aa5c37e150d -aea87086dcd6de0b92886b3da0813ff271a7107ab1a3cb7021b85172c1e816a84dbb1a8fdb47e8a8eb5e6fcddd5b919a -a586b5078b3f113eec9f074430bcf9aabe4e82752e5b421c6e31d1c2a911512e34154bf8143b5197e820c5af42aa8ac7 -a6eda122e400a6600f025daa383685a10f72f62317a621698bd0106b331077b05ac1afc68ece7a2e285c54a366921a3c -8875e9ba654ad7b1d57ede84e2b702600416d40f7475fe2df25dd1b95c0178a227ee187547898e5b9d1ce8ce9ebd15c9 -af2cb289f8c75f4ddae9e3ef9c1977fe4d4d513e411777b03b996f5baa372eb995b5ca96255fad9ace776168806ecc42 -8d24c465d26bd93290f45ef035bb6dde4530d9d7d051baf583b1f8b98e9886de262c88b5709084710cffa7c767b4c27d -8cf35b1b28a7726645971805170392d522f5e7e6cb94157fe9c122a987051c1c90abe3c5bdb957ef97b1c45dd9bba05c -93e2bbd82a3cb872cea663f9248b21d4541d981f3f8d5af80a43920db5194857f69e2884753f6ed03b6d748dbfb33620 -8b774b97657db654ebdafce3654d645f849203452e876e49dad7af562491cb6531bd056f51cb5b2e8f0a99e69bd8566b -b5333c49d3e1c4c52f70f3a52f0ad77165bed6ad9dcbfaf1364e7a8a0f24570e85a218e4c2193f63d58a7dd975ceb7a5 -b4a34c443e4fdaab8e69fcda1fce5e72eaa50cf968f5d3d19084d049c5e005d63ab6e1d63dee038317da36f50ffb6b74 -824a224009c6848b92d6e1c96e77cb913fee098aaac810e2c39a0e64d5adb058e626d6a99be58593d921198edd48b19c -a86f1fdd2e1ba11ebda82411b75536fc0c7d2cdb99424e0896d7db6cae0743ee9349ffa5bff8a8995e011337fa735a9d -b406b5b89b8bed7221628b0b24eb23b91f548e9079a3abd18be2ed49baf38536a2c1ec61ab1ddc17928f14b006623e7b -8a7ea88d1f7420e2aaf06ee90efa4af798e2ec7cd297aacd44141471ed500107fdd93bd43b6de540314ef576646a7535 -a7a8c071e68bbae9aca110394cf56daad89404dff3e91ea3440670cd3d0423b67905e32b1ba7218fd4f24d2f8bd86ce7 -b959830f152e4d31c357be1ded5782aed5d6970e823cf8809434cf4fddd364963bc7cfda15c8f6b53eda16ab20ca3451 -b59232c8396c418238807ce07e0d248ad2045289e032678b811cc52730f99b480eb76f6adf985e6d5e38331d4bb2b9d5 -a14092fddecc1df18847ab659f6cf7c8603769a4e96fbe386d8303b225cebbbe8f61d6ab3dca08e3ed027e7e39f2641f -941cb0632acd395439f615c6b4b7da9ed5abf39700a8f6e6f3d3b87a58a1a7dbb2478a6c9ff1990637ada7f7d883f103 -951b8805ecb46c68101078847737e579206f2029e24b071bae6013e9dde8efa22bce28aa72c71708caf4e37f9789a803 -b2cbf22e53f6535fa950dd8de4aa6a85e72784dd1b800c7f31ec5030709d93595768748785ff2dd196fbedf3b53cd9d7 -8d84ea3a7eafb014b6bd6d57b02cab5ac3533aa7be4b86d2c5d53ce2d281304409071100d508ed276f09df81db9080ea -a2204b60836cba8bf29acd33709e6424226ae4d789ef6b280df8a62e30d940bc9f958ff44b5590d12fa99fcde2a4a7a9 -86692c58214f326c70eb2aaf2d8b26eae66fb624f143a3c144fd00f0249e30e0c832733a7822fac05c8fe74293768ace -b1cb3d64eb5b9ca0e01211128f990506fba602cd1417da02237205aa42879ae2a6457386da5f06434bcb757f745f701d -b3eb4290a53d5ff9b4596e4854516f05283f2c9f616ec928a0934b81c61afc351835f7eca66704a18a8b6695571adb30 -b0bfb1d44b039d067d7e0e2621e7c4444a648bce4231a6245179a58cd99758ec8c9e3f261d0adb22f9f1551fceb13e4a -a29320f71a9e23115672ea2b611764fe60df0374e0d3ff83237d78032e69c591a4bdec514e8b34f4b3aeb98181153081 -8a6abe9c8a048002b2ff34154a02c2f13fc6dbae928da47c77f3e5b553ea93d8f763821a6ead3c6069677870fdff7ff3 -b73ab66a62f427e1a5e315239a2e823e2a43550d245cff243c2799eb2e4701fabb7d5f9ce74a601b5ee65f6555dacf64 -b64858e98b9c10de8c9264b841b87e7396ba1da52f0f25029339ca1d13f7f9d97f4de008cfe12a1e27b0a6b0f2c9e1ab -807d2440d1f79a03f7163f5669021f3518094881f190cb02922eb4e9b17312da5e729316fe7ba9bfffc21ed247b033cb -a7f06458d47ebe932c2af053823433a8a06061c48f44314fad8c34846261c8c3f7f63d585a7930937327ad7d7ca31a6f -82ac2215eba9352b37eb8980f03374f5e0a2f439c0508daa7a32cdce398dde2a600e65a36795a4f5cc95bbcf49b01936 -a1882c83a2f946d54d74a008eac4aed70664db969e6799b142e0d0465e5662ba0d224a1cc33be339438d69bdad446ff6 -8009776f7a34a3c8779e21511fa409b0c5a38e172d1331acc29a16114e002f5f2f001381adb5fb3427a100752d775114 -b24441019af4a0df2dc68e3a736f358da0fd930c288398a18bb5a8d9a1e98ea376395f19d8e03a5f020b83fcb709f1af -ac72b4de3920c4f3c9b8ea90035cd7ed74d34b79e79aab392f057c3e992ebe79050cc1c6ccf87120e4162b29419147de -973e75577cd2a131a0bd568fd44e43554ac5a9ea3bf10f02d1ad3ac6ce9dc7a8a7ea93aacf3325f7d252d094a0de1376 -98a114de2a86f62c86862de37c328bf6a7fccff4d45a124addbe0eb64debe365409fcb72ce763f2a75030e1ff4060c64 -aff753e1dd4707f1a359eaec06ebef1903242889a2cb705d59dd78a79eb5b894731f5a91547479506145ca5768877dec -b856e4234858b5aa515de843e8bd4141c15a4cc02c51640e98a8aaa1e40344f1ff8ef7c3b913ea2ae7411713daa558d2 -863525eb2f8147a6d1d0d4304881795bfed348913cd7f38d815d929a426788b69e41f022dba5fdcaf56c85720e37fefe -a14ad76b145a6de2e0f8d4f615288c1512701a7b3010eb8a95941a2171bc23561e9c643764a08c4599040a3b4f5e936a -a18bfc66f6139dcb0485a193104fec2e7d52043837a4c0cadb95743e229712a05cf9ce4ccb482f36ff1ce021e04b574a -991c8e6678077d6e5f5733267c1819d8f7594e3b2c468b86a5c6346495a50701b1b05967e9590c15cef2f72bc10a38f9 -a034e7f9b547b047c99b99a0dd45509b0ac520d09130519174611de5bcdb9998259e1543470b74dcd112d0305c058bad -95ffe0d02317b5c6d5bfddbcec7f3fdfb257b26ad1783bb5634d983012e2ea1c6b9778009e1b6d10564198562f849ac0 -b3db442aa4adb33577583b2a4ad743f41efe0e1f87bfc66091d1d975333ffc00b4afc43057bcb88a7d68b0c9695d38dd -ad2e97d10d7c53d231619e3f2e8155a27ea4f2fb3c0cecf5c7f14f4cfcdd21f62ea46d843b21df748b2892131633fed2 -905d7aad6d3b56bad48694b6b20b27e370ebca8b91d0821e48e2f9cad39910c26cc11c77c266894db3d470485a63ed11 -99bfadefca796ce6af04ede65ba5ef5bf683ff7e2852bb9c406fda77b95ef382289853dfe4d933525071e4cab8ce3936 -94d9905ed4ef92107d0adb9ea38f085a2a24b8f792108bec702d747c215b1f14aafd486ea0c07ed42602b12d8f602b93 -a78dce23ca09dda2d5e7fe923290062546825286d624de35ac5756b6c8ae030e211f4f9c9c8d18a924f5880e3b383d1f -abce9e2128ff51fa17e73d93e63d7134859b2f328eedbcefb337c39e752d6750d9cffe6abfcd359c135dc5a12018827b -a9ea7d91e8a3524acb3182bedd7e1614d37b48f8eb2d8f677eb682d38408b8d512786d8bb65811f4d96788b9378e59b3 -912c9f804fb57dd1928f8274be58b42618f589fc72a7e5b6cb4d4b5d78c547f80737cdd77ebe5d2b71eaf60b8fd2b663 -b7227ec9a62d5538974547f717fdd554ab522d8782667fc3e9962e9c79a21134ef168371bf3b67e28d0964e92cf44028 -89440a781c812a19c758172bf722139598023ed0425374fbb0d91f33be7b7f62a36d7aa34696c4fb0da533bd5dd41532 -b31e4a9792d6e9c625c95aa3c0cd3519410dec07940afab820ef9f63017415d237a47f957d0b591b6de399ffc2a8a893 -a66ec47393df2693be161daaa88be0cf07b430c709ca97246d10a6080ae79db55c9e206b69a61f52512b868ba543e96b -90ca425dee74cc6a7e8eb1755cf9b7b76ba2a36ab851333b0fb7b35e8e6e189702456f2781ad87b4215993d62230ff4f -88b64741f93a2ae5d7b90b22a5e83c9d56bcee5c6bfcedb86f212acc776cc3ebd0b62cc025f596cd8db4f4b6a7aeebab -a1b6c7d2358bb201b42264f8fbebaa242ef105450bab21b4a2f16f368048c16ad1f3695841787eb33a0192f1f6b595eb -8a932f1cd227ceb18389791ed9ea1ff26571715ed1ab56601a994795713a8f7f031d1e8472ec3eb665b7bfbbca8ca623 -8bb2e34a2bf77f9f657dfc51ff296a6279a4d7d15860924f72b184fb7d5680320c7769954b9dac73c4bfe9c698e65e58 -af54e7367891c09f2cea44cc7d908d37d058162ec40059d32ded3983a4cabfe5057953878cf23bfad5292dbd0e03c0e1 -8a202532b9205385cf79f0299ddcb3156fd9fab09f9197bce762b5623f75c72ab1d74334ee6f0d289007befe222bf588 -83bd0f5896eaad58cfa7c88fc5ed505cd223f815dcfe93881b7b696cdd08b8b5ede03ea5b98e195c1a99c74ac5394c1b -b4a84d9940e58e3b4f804e4dd506f8c242579cfa19323c6e59047e5a1e35150699a2fab2f4862dba2f0ee4ed1d8970f8 -8c9ec477d057abebc2e2f6df5c4356a4f565bde09f499a131967d803d4bf36940ca2ed9d4a72adbe0a4a8b83fc686176 -8598f43c32623fd5b563d1ec8048ffc36db3d7f9b3a784299811687976f64b60585b2a2707050a3c36523b75d1e26716 -b55eb07014fe5ad3e5c9359259733945799e7429435d9bf5c72b2e0418776e329379433e17206f9f0a892d702a342917 -a5ed942eda7b36a3b0f516fafd43d9133986e4c623b14c0f6405db04e29c2d0f22f1c588150f670dbb501edda6e6dd4b -92b6abb28cefab2e332c41c98bfa53d065b7d262638389603a43f4431e6caf837b986254c71f7cdacf4d6cc4064b0195 -b01806178a28cc00d1561db03721eef6f6539676d93dd1fa76a13b42a31d38797e99b1848de92fd11821a342b04f3f72 -a2f10303437acfbb5912e186bbff1c15b27ed194c02cbc1c5b482b0b732c41fa809136e8e314e26b5bfe57690fe3b250 -9990207fcc711102e7e941b3ac105547a3e7301390e84f03086c99c6d3e14efff3a2e2b06e26227f496d88d5cdaa3af1 -b903cdb0c2fd578612398c30fe76d435cd1c2bab755478761244abb1e18ba8506fd9c95b326422affbcaf237309959d7 -99e0c12cae23f244f551d649302aac29bfdeb2c7b95578c591f512ad7ac562bd47e7c7317ac9bac52c9ea246617bdb48 -b996d267ab5149c1c06168ee41e403be83f99c385be118928d6e2c042a782de0659d4d837f0c58b26df0ce22049a5836 -989001b8414743765282f7e9517e4b8983a929341b8971d7dd8a87d246f6c8ba5e550c983566ddd932c22948f4fa5402 -a0b006a2c9124375364b8fc5ddb543a7468fa6d321ea046d0fd2bfdaef79e5e3600b3d56190733491ca499add1298c7f -80881d6f3ee507089b7dfb847fc53dd443d4384ef6fce878d07d9b4a1171eefea98242580e8a6a69664699f31e675cfb -adc48ef53d88b9d70409ed89cc3be592c4bd5eb65d9b1b28f2167dc4b12406889c00f2465c554f3aff673debc2997ccf -a62f5d9f167b9f4a4aab40d9cd8c8a48c519f64a1985823e20e233191b037c02e511b0280487112a9f8b1f1503b02db7 -b89aa2d4fb345a1d21133b0bd87f2326eb3285bd4da78b62174bf43d30a36340e4217dbe233afb925ab59e74c90fccf0 -932ba22acdd2f9d9494da90958bf39d8793af22417647d2082d2c3e6a5e17a2d14b0c096139fa8fa3f03967ca2f84963 -b67b107e71d96de1488b4154da83919d990502601c719e89feabe779049ddf7e4fb7e146eb05e754b70bbead4449efb1 -84509de1b8dc35aa2966d8a48501f725d59b4c65f3abf314b2009b9a573365ae3163c1f276708c66af17de180aae0868 -849153fe837a33fcb32c5fa6722c2db9753e984867c112a364eb880d87467782142d1c53a74b41df1dec7e900c877e1f -903d05c73ae043b69b18e980a058ce2254d008647a8d951175b9c47984164b34fc857108dcc29ad9df0806d7e90405f4 -a6b05917ac32c0b0eeea18f1ef3af5343778c543592078fdf6a1b47165013e2676bfe6a592a24efab9d49c4bd92b8fc0 -8648482f6947a5a8d892a39f098160aae1a648cb93e7724ea9e91b0d1a4f4150b91481f6e67d3bf29ff9d65ba4fa61a8 -a6ecaabc38895013297ae020686f04ea739c4512d2e3d6f2d9caf3f54000fb031f202e804ee615eb3357714a18657bcf -912f5935acc2dd20d5ef42b2ad5b307c925324a84a3c78ff66bc5885751934bd92f244e9636b60a744d750a2a7621198 -a0d6f261a776c5b114298f5de08d6e3372649b562051ea2470d3edfc376048793e18fc57ec84809b463dc72496d94329 -940744cd3118d1598c248b38503f6f1fbdbe7a147e683e5b3635140aa91679f8d6c1472600f8e9c36117a60203be6b4e -ab81737c839fe340f6f1fb7275811cb0c0d5fe8bbc265f6a56c6c68d0291bc7234eaa581ff26f8929d9a5bed4aac7002 -8df47341160f1c728c3e31be17a32e42b54faaa1286ef2c7946882ca4dd46443b8428f3654616c6e4053f1cda2e11994 -a721067e75c3c791f4d9f58d4810ac9621606e29c6badb593d6bb78c39968b45be1777ddb9bf03696d4d4be95b2dc1bf -a4e399213d3c4350c2d0cbe30757ba7e1f9680f58e214ff65433b36232323744c866a87d717851ba1dbd6769599f69a6 -b0be851d1e43dee27abe68f85e2330d94521b5f1c1a356ad83fcd09162c0ca9c2e88bccbcc5bacfa59661764361867a3 -86111bdd3dbfca232aa5802a6db41d639502e43a2e24cb06bb5d05c7f9b5ccac334d16b61d1c5eaac4fa0cab91113b46 -a4f805b11c174c34250748b9beebfb7c8c243198fb13463911906ee4effe7d331258a077e374b639a0c5cdcdff166b7f -87e4cf2c6f46d2dbac726a121127502921decf0195d7165e7bbeec6f976adb2d1c375eaa57f419895a2c70193215dc4c -8ff06de2c1c4d0744483bb4f7c5c80bf9c97b4df23e86c0bb17f1498ea70e0ee3af20827da5e8cb9d7f279dc50d7bd85 -ab112c0116471b4dc3fd1e6d918f99158eb7a08153e891ddbba2fe5bf0eeb188209e3019176e758231c3df937438136c -a67f89194e99e028a5da57747268e5ef66fefb881144043429920d222d37aaf268ebf73ca1da659fcdac3b4e7a65092a -b4da1dcc791566140d6abeaa2923cb6b21a6e6aaa30bb4cc70011e931eefa71f96b7e05358c0654bad7ce45191ab9fa8 -8283933231bca359db588c80e043ad6ea765fb0cba5ef233c5d514ba01ddd1b409efbadb368f26763402e4576dc4655f -97f568ce3edacd06f3e31a15462f5f9818a8c3fdbcf92b1ac5840b0b6e73166a154013dd52e85a18e8ead3fc9e54aca0 -a9cd1601c41e5ab2018f986443914fb703ddb6b06a36c06fb58065f2fee8e1751071ef924ea3ad76f0c19baccb1b5f8b -92aad71bb7e929cc35a48020d16a5822f4f106a7f59985005a5ae5ba8e8016ec33727610393498f56b4f353b3d5161b8 -89427780aa4e7ac894c681fbe2889153b94db883f17f109bc9caa93f0c259dda42aab502bbefaf572c56f70abbc42db8 -aa8cf76ff847dfe59534432ed8520bb48bf412c28497747dce04d2b2a54ba843c3be1564630cb49ec0217167847ba590 -a1570a6748a2303e74a31c2131d05ab372ec006ee92ef74c42f2e9a250663bebdfb3777e7ad91f50c954889a59c2d434 -a4c2b1bbc48199c31ea8d8196729eab00ce0200350d4aa9f23347a3289355e5828cb2f93036a14d2d9ec575fb3835239 -84819d0bedbaab5bf8afdf23f59a7ec5f50da3063cfdd1ef5fc4ca4c1fe68980b5c80e30a49f38e5816765e81dfc5a57 -a57cfb5e877b88202f589be777605deafbfc85ed1357af03a18709cfb4b668a271199899243cd3750f1cb77ebc40bba7 -8d95934bbb0efaf3339f27cb96de46e4486aa58a2c40dbc77c1c3ac7c27a228062824b9045c046631b2e286e8549603a -b99a8356abeee69f40cb3bd8c87e8039a1e076897dde430bfbf989dc495c48609a7122bc6c1d1c32ccac687b47d5558a -aac2edcf2fe5d3f1a84e8f1f27ece920eabe7793bf0ed5290cda380752e55d57a55a362c5253bebb71e4a55f2c437ff6 -af7c76876072c3b0091e22b9c5b27ce99bf1f0079ea1a7816ad9c06e9e5fc407595c7f4f9953e67d86fb2da656443dc3 -9175b64d104f78d3310c9c02f82e04c8e9878d2044ea5ee9c799846a3d23afa5fa2aa4af7350956136c69a0eed03cb2e -b3328e953317494a3d976e7f7c3d264258a5d4b2c88e12d06786a9e7b2affd41086762ef6124c6a6e5b6b028db933c14 -a49d166065e19d39299ee870229e4a04be81acd6af3a2201f3a291a025dd5f8bc3e676ee123cd4b9d8455f6a330b395b -85fa15bc8947ba03681d87b50bd2f8238b1c07849a7ed4e065053fad46aac9dd428186a6dd69dc61b5eba6ffec470831 -b6fcb2f694a47d3879b374b8b2967dcd59bd82a5d67ae6289a7326c18791b1b374e12571e8c8ea16a4bfc5525ced3ec4 -b6115f52566aa90ccac2aab6d2dbf46eca296d047db1eb29a1b8a2bc2eef7a24e90407f8dae528806aceb2a1e684d49e -9707e66220233f6a48a93e8dec7b253d19075eaa79238e519b82ce1ac5562cca184f8a1c14f708a96c34ad234673d646 -a0822903fb3825eae07ee9d3482277c0b8fc811856dfe4a51cf24b373f603924166fc5485185f99c4547cd6476b62270 -88dac6366c439daaeee2532b2ddbe206132cf6e12befbb8e99870ac684e04e62de150cba0e22e395a0b858948f40808b -a72dfba9caad3179f43fead0f75e33ba5342470d8c9cb7c86d30d2c7ce7244a8aafd1d558b0ec8e2a9436de2c2e95ccc -8d696046defcc32cc19954c559213100f0ba273ea12abb55ca7c42818071d853846bd4213af2c41ecd4442f6b4b511b1 -89d6f2d52cf65414da15a2fb1911c53afbfb50bb5f2638844abfc325ff2651cd9130be4beff05dc4046adfc44394a182 -afb91abd7c2a9cfe62855ede3c6960ad037fe8778364a2746ff7c214c55f84e19a474a9a0062b52a380d3170456ee9c6 -87f724a16ec8fdae8c05788fa3f823ecc3613df46581a63fc79b58f7c0dc2519b6b23e3dd441a0ca6946dfe4bc6cd0ce -86760f90f6bedfba404b234e90fbf981d26c29b87f2fa272c09540afa0f22e6682d08c21627b8a153c0feb27150458e2 -ad4d0342f255a232252450ce4209507ba619abfd1ffcb9c5707cfa45f89be41d88f1837acea993a1c47211b110250b4d -ace54b5889bccdf1d46c4ca21ed97cca57f7d12648381411d1b64afdfc64532a12d49655776ea24cf5eabe34145705ad -936dac693d0c1b1e5de1701f0bc46aef6e439e84bc368a23c0abe942eb539a2950e8929265786fcdb18d40a44bda14b9 -94fafbc544decec1d489b9ad6b23410b9de4779f9f44aabd093d7fab08340a4646a8cba31633e49c04d2690b8369a1d7 -98157e757f1a677c5d9d65c47759727a4dbc49fec2da4d9889c4ea90573fb42e2a8d72eaef92b782ac6f320970f09363 -8eaa0498c191c810c7e1ca7398f7c80dd0a7e7d7829ed07039490f60e7c2ae108843c06fe38fa36d45d63da46cba887c -a0ae116e5b0d2dccf83f056ad876037225687904e0290fe513fdc6b2dbe4cbf5fac1d828352e64734895895840b3c57c -b592b318dbbd7ec4872aae5e64bdf2305db2e5e8cfe0ad77b691f542ba5e066dd20b09b0b08ff0d798bd79ad946ddf7f -879e50c8c3e7f414ad2b38632bc482b71759cd561aeb2215550186ebb4559e4cf744cdf980512d8321954b3458d21e11 -aed5c6c7ce0407d7b2c04785fcb9deadb9b9413e37cef5b1d918f474cccc7de012fe1fa6f5fa93cb7ef9ac974d9fbc20 -892274a9f0afc68fa74be276c2a16de5cec674193f96b27a80bbb9f3add163f85716b531f3c920b98577a0225f84e8ca -938fb7a53266b997a7669596577af82f5289b160b7fcf06d76eee2a094696f6f12b28c2c65b833a52529a116c42e6c7e -892083929b6067f5045b1208f3dc8f0ee25bd0533a8831f5c23bb4ff46a82d48f0a34523359df5061d84a86b718d5060 -99159ae9574df6c16273eda66b6d8b79a327940e335b28c75d647f4744a009f4b5f0f385e2017bd3e7fbf59e629cd215 -a03e5757ef7738eba32d396923ff7ef82db2c15bb6adc8770fcb37260b7bda3be62473bc352a9a2ef7ec8ebe0d7688bc -ae3c24a85c9b1fa55158b2acd56d2016f70dca45a23f3ef7e0c6b096f4a7c54c14020d61bec7c7f87be4a595bf254209 -a920a6f9cc803fe31352fca39c13f8ac1e8d494fcf11b206092227c2af38469b1fbc068b8fe014800b70f137107aafc4 -b893853be57519ffa6410da605e7d3a746ebadec4788c7907f6e0dde9f20f5a6a01181148b874b3decf9b4814846a11a -b46f43918c5195729f6532439f815d1eb519e91005bc641a4a30ae88700982bf4ed07a342e77945780317c297c903755 -8e431bf4497d0ef6538c93c4bdda520179301a0104eebcfd104efa1edea876818d7d31079656f01a5ff76c4f5fcd71df -92e3dbcb580dfb9cc998f878052b0c3be1c5119e5249ae9bad3538ebb0f0c4ab5a959b04033b96d61836ef07784e6b64 -b712d9d63aa888156f4ec83e939c6bad53de18045f115f54fbf4261fb02f10a8a46a8d716ab43d4acbad3b02283c32fc -b2334e776988b4f772446a47c87416b4f19f9b44164a5f828424d3f35ef10baa56afe810d49b0b86b786b9c0227681a6 -a3f25ad18e435ef585fa90e6cef65a8ba327e5e33701979e27e64ef7d8e09e2591e52bff9c5749d35643456d18625685 -adcfa48ae43cac6fa9866b4cce10a243969965942c891d5e6c0e5b03bd4763f9b63779fbf40d26ac674534fe7cc478d7 -a0eb3448e045038740e2ee666e88aa0f8b8e24b1b55d7d4964f01bfc0c581f7e9d4c0e79f8cfbfecfa8b024b216c8ea6 -8110aa1d82f11965af4f4eedb4de09ee9c353481b2d7ee7a2bc2f302d2a5ae6c31ebc6451309ba7c305da41070b0f666 -b074fdad419d42783ebda17f19863aa499eec71fda5aab6cdcc389276b7bf08053795d15890175ca3dc89f6d8d17758c -a14665846d95d7d5f0b5381502080c822776ec0994ccb1ae1ffbb3f19205ce9c7c9bf9c2d2ca098807ce99f29e4f07a0 -b4884842670a333cb5548a842fa2971881e26b442dfab0b91d6bf3b4cbdf99adbbc9d14fe2bb46872cfcabedae85db30 -94549b01cb47ba16c0cf6f7522c833545397de0b3388c25d03e60132eddada6401682f9ffd8c50d1a61b4d2dde37461f -a790c9b4cec96e4c54777f3e03cea5769b20382cdcaf1de494bac2b9425eaf453eff643c62ab284cc1af33bbd36013be -b1b45fd298ed11609aa1ae6c5ac655e365bb451de1b9fc92aad40422ba85c6a454f33b8142acabe55171328c13d92edf -a74cea9e7096e38327064f058a3cdaa34e6eafaa9c7d58f753c40be67998152380fbd612b9dc0751bda7befcdffcc749 -b18978dfc5efb07b7ef992c7b0cf5d1b4ca551578b1dd13057b7aced8b1deb9f2036e1e3116248a803e922659d206545 -8153c07603cdff6622835a9853b795274390abf7197d7a192193bec44acb43e8cd50b56c11a03f4a2a27124c36974f3d -86b987f30bb9a37cc91d22dffffcd346ec5773e846a6c2b8f9e03b25ffcae859c470c901c4e29695d325dfe4eee927bd -af5e980b9507d10d5269c1a5d02bc16f4f009b663e413ea6a7c655250f3a21c608c12f4002269a05d3779907e7be7d69 -a6f737fab2af9f27bfb8ca87f5fdab6ad51e73ccf074e90576db57b309dfa0a95f9624526dfa4feaef39c388802f2ae9 -b7ed51f699f615f58a7ff4f99d52c4ce7a8d662843c1f4d91f1620fa119b80a0f6848f9fb6c4b9822dc019830e7dfd11 -b71f27f291aa6ef0723ed79c13a1c7a1c40198ffb780a129d9d20e250406bc91f459705b2b6674c9bb412a7b5dd9ff07 -9698cf8f638c3d2916fefa5f28c6050784479f84c2ee76a8aeda7e562630a6ae135b445ec4e29af8588ca5ad94a67f49 -9270aa5030966a9990d8bc71b00b9a7a1d7c1ad8f4c7f78a31b3d7f86467332f21407c74a89ba4f574d723acaf0d2042 -b1b82faceed8e2297cd49cc355471d15ff8dc2ccc78f6944c8f7a75d3ad1629a2e2f1d0a2ff7fa2b3c38cd19839aa5e9 -8a8c4ed49dc9bd961773edf8d41d04385b11bbd3577024639a39319cc7068380236bf73fce0b83e6535bd3f95cef0e65 -8d04ec1e7d148b7e66910ab45a0e6bf409612a3b560bfa784e26f2963152821c646a655cf17a0ce3d4ba4c4ebeeb4a1e -8e9d707f6186d93accb60813715ed1f6b3001ff6d2f87daf8b906bd0b988c1833b2ccd80dee9bdefb45901e81bb82971 -9762317ca6a5e6fe0b2991e0fa54b5fbf419dd0550d70074957d65cd7ebf79ceba607dd40d709ed635c822b3b4da2cac -82b53cd9a1eca2f5d3256723dc4b6531ca422bd87bab36243c727d1952db58d7288ab11467305d875d172ce165b1e4a5 -b4dbeafa05c87029ae257bee1ed7603645fab41f6ba7ac8b57ced5b4774a72ba3e671c2433a93acc3c498795b5cccc42 -a916d3ab7f0e7cef294e11c97c910a19c338ad8e615406e6d1c8995b4a19c3b2527100cc6b97a950ec5a4f3f6db7d01a -b9a785c7123609bdc96f8dd74500c6c77831d9d246f73244de964910b4045ce3242c881271bb1a4bc207d67de7b62e97 -b5f94084f695d0821c472e59c0b761e625b537c8ae3a09f11d9a57259e148cfadba1e43bf22c681b6b32390121cec208 -8f91b36d8570f19a90cf3ed6d5bb25f49a3315ddb566280c091fe2795c4e25ed2c6a1ef8d2669b83f2d7bb78fc8c40f5 -80f27359a73ed8fdd52762f0c7b9f676be2398b1f33c67877261480bf375f975f626c2ca3e7a9f59634db176ed672c98 -b96b91e3d5148ca793edefe4ca776b949c9305acb6f3a3cf87767a684014d2c8f2937c2c672eef8510f17d2da5d51385 -99c4e1ca2cabd4388ea2437dbdf809013d19be9bd09ff6088c8c0cfdb9ecf8fd514391a07b4288dd362434638b8834d9 -b6fdfb812e145f74853892c14f77c29b0c877d8b00055fd084b81360425b3660cd42236ecc853eadb25253e1cd8445c4 -a714af044ef500104576898b9409a9a326ef4286a45c3dae440bd9003fdf689c5f498f24a6f6d18502ce705c60a1cf14 -a9444e201be4a4d8c72119b3d3b13098afee6e5d13c5448fa2e9845cc9188239778f29b208749c960571dfa02b484f05 -91c826a6b8425f93ff395d9fdfa60dbfa655534c36c40a295906578540b9a0e6b94fd8d025b8b8611433022fbbc4fb0b -a355d76bc3cc48ba07026197130f25a593ec730d2ef0d5d2642bfcad745ecbe5c391324bc2485944060ff3100c952557 -b5f9b5a289a6f9a7252cc1f381c892bdb6836a5998f323ee21ae387936148ad1ad7cc6eca37ecece36404b958ae01e8e -a3c7ae04a6208851f6cc40ff270047283b95218905396c5dedc490e405061cbefd1251ecf77837d08c5ec1c77d2776ce -aa02ee387dd2cc7a23cf5cd582da0bc84bb33a7158d76545cbd6e06b26a6f30565dc712d7a8594c29f0529a892138802 -8aff025c841f167fadaf77a68284c355ace41d6df3a9f1e41a6e91454b336f0b69ea34cce495839b642a7c43997a8fd9 -82eccf0b6b4b6460f676d677266451d50f775446df313fc89bdf4c96e082340f6811939d215a54ba0fe30c69b3e43e25 -af324d871b038ff45a04366817c31d2c1e810359776fb57ac44907c6157004e3705476574e676b405d48a48bfb596f59 -9411dcca93ef5620ce375f379fea5c1017a2dd299e288e77b1ab126273631a299d7436f3bf3c860bf795e5faaaefa804 -934fca809e66f582c690c3778ea49de2e7940c0aeb8d7edad68f2edccdfda853d2c4844abd366fbc2215348935e4b2e2 -a1b1fa4c088418f2609d4dea0656b02a8ee664db25f40d53d8f4b1be89a55e5abecbf2c44c0499874abeb3d3a80acf71 -ae6ed7a0ba6280c679b0bf86111afad76fc5d930e9fb199df08134ba807f781d7e0b8b9b2c8c03b02d8cc20dbe949a28 -937d200a72fe4ab8d52f6cb849e322bc5959632b85a93c89744b33e832e8dcf1dddd6ffac0c049b03c105afb8930f7f5 -b4b4a46ebe0c5db16004933c08ad039d365db600a13d68be5346b1c840cce154f56c858874e866de8c3711e755c6e5dd -afcbcb7170c8caa2b77d2b3388dc2f640aeb9eff55798aeceb6eb6494438be05a2ae82f7034b2d439a45ad31d8c64b07 -a2c676273081b8761f58e0b11306ddb6a4cde3d90e7c47b434468700c5b749932819b01efd7637ca820e10fc28dfb427 -b445715162d834c9ee75ac2ff8932ace91c8242d67926b2a650217e4765e0531c2393c9438a52852d63dbbe2cceaafc5 -a0c0ebdc1480fb238a25fbfc77fae0db6e5e74b91809f0ff20a819e56b8c3141549615d1bd7b99829898f6028e8c86be -b3d11933e9d1db8ca617934261ed26c6f5ca06ba16369e7541482bf99c4f86520d43fbb10f4effb2fdf3cc70a189fdb5 -888ac610f8fd87a36b5646e1016eaf6dbca04aa0cc43f53a1046d74a658c4d2794606e79fb07fae57cf9d71ed339f4b6 -979818dab00c58435dc0d0d21185943f95819d2a13531abd2d798e1773c4bbd90047f4eebe117868743db75604a50227 -a6fbcd2656e475065fe44e995e8e2b5309b286b787a7597117e7acc3bb159e591a3e7304ef26f567b5720799d8ae1836 -a03f0ac08d2101ec4d99ca1443eea0efa767a65448a8ecd73a7818a99e863a04392bec8c5b8e5192834e8f98d4683f13 -b3c4ea8c6c3ee8aab2873d446ad702000b0e927e0991c9e30d83c6fe62a604efdc3ac92453313ff0d5e0ac6952922366 -ab25c857f26830631113d50145e961441b5e35d47b9e57f92466654dffebde43e4f78b0867d20929f97c2888c2f06509 -98950aa5a70ef41f274775f021a284d4d801a2efe2dea38460db8a3a8c08c243836d176e69127c2cd17497b0ca393e9e -a9698113febfb6d87fcb84bad82ce52d85a279d3a2933bdd179d53cfe8d6c6c68770e549a1e2947e7528a0e82c95d582 -832b504513266259db78478bd1b5a3b0f3bf2c6d25f1013e64bf0cfae9dc23da8ecd25f7f1047d2efb90e5f1d9b4b3cc -b588bba7bcc0d268ab260d5c1db2122cee7fd01583c7cc27a8ae6b48b29f34c6ea8a6acbb71b9b09c6156ec0a0766142 -a73d2223c7afadc381951a2e9e7bcb7b5c232369f27108c9f3c2ced2dc173e0f49531d0ca527eb142fbb70285307433f -9152cd6b97bd3278465348dde2095892f46342aed0e3d48675848c05b9aee6ef5ad7fe26e0dcd4ab176532289d40eedd -a7812a95a43b020721f688dd726356dda8ebe4de79b4f0fdef78615795e29681bff7c6ff710ff5b2d6ae3fd81bdb8507 -83724c16049e9eaae3269ea8e65caa212f0592e0190b47159bb3346208ccb9af3cfe8f6c3176fa566377da1046044ab8 -877634ec37c7dcd3b83705b103c31013697012795f11e8abf88d54bc84f2c060f665f0c3b14ef8087d3c6a8a7982d64f -b3e53aaacef7a20327bdbba8cd84513534d2e12fd5e1dcf2849f43146e098143b539ebd555623d0ecc46f5ebb4051fca -952d58ecafca9b7ffc25768ee4f05ce138f0289d72978eb5e5d3b23a0daedcb17478890afdce42e30d924d680e13c561 -a10dcc725f9a261de53dd3133858c126f6aa684cf26d92bce63a70e0ff5fff9610ad00d2b87e598b0a7548cfd1ffe713 -b7bc5d0c6b665d5e6f4d0af1c539d8a636550a327e50a0915c898ac494c42b3100e5fae0074c282d1c5073bf4a5456fb -8adc330d3b49ddf3ed210166afc944491aaedb28cb4e67472aeb496f66ce59184c842aa583bfb1a26d67d03b85065134 -b2df992a1310936394a1ebca94a7885b4c0a785638f92a7b567cfb4e68504ac5966a9e2b14891d0aa67d035a99e6583a -96f5da525d140739d19cebb706e2e1e0211edea1f518e040d361d5aca4c80f15be797f58cb4cd3908e4c360c18821243 -b2c0d9173a3d4867c8842e9b58feb1fb47f139f25d1e2332d6b70a85a58811ef99324bf8e52e144e839a4fe2d484e37b -ad95a7631ddb4846d9343d16533493524dfd22e8cbfc280a202343fccee86ab14446f6e7dad9bad9b4185c43fd5f862e -97f38ab82a51a7a792d459a90e7ea71c5a2f02d58e7d542eb3776d82413932737d9431bd6b74ec2a6a8b980d22d55887 -ad4e4c57ec3def5350c37659e8c15bd76d4c13d6de5453493123198dda2c2f40df349f20190e84d740a6b05e0b8f3deb -a691bc10810d11172a6662e46b6bbc48c351df32f325b319553377f525af44a50aaa02790c915b3a49824aa43f17fff0 -a80ccac79bb4014ee366dbf6e380beb61552bd30ef649d4ec39ab307e4139b7775e776fab30831517674ff3d673566f6 -b11e010b855d80e171705ab9e94364c45998e69d9120e4ca4127049b7a620c2eec1377356e7b877874e767f7c44afef4 -96bfab7777769a1e00ce16ada6667a0d21d709e71bd0371c03002427d138d9172640cdd5c529c710fea74bb9d19270c7 -a5bffd2c30e29633b4ecf637c1e792c0378252e2a99b385a093675940b48de2f262c275332ed4765f4a02467f98e3ddd -8d11929d67a6bd8a835b80660a89496250c766e713bddb2cd7052d67b92c39a38ce49005d38b4877856c4bef30fb9af4 -8e704597a0dba1dbd1ff8c9755ddac3f334eeeb513fd1c6b78366603ebc1778231deb8e18f2889421f0091e2c24d3668 -904fbb3f78a49e391a0544cf1faa96ba9402cba818359582258d00aff5319e3c214156cff8c603fbc53a45ede22443e9 -af12ac61eaa9c636481a46fd91903c8a16e7647534fc6fd9baa58ae2998c38ffbd9f03182062311c8adfef0a338aa075 -87f2e544b2993349ab305ab8c3bf050e7764f47d3f3031e26e084e907523d49e1d46c63d0c97b790394f25868e12b932 -a279a7bef6de9d4e183e2bedaf8c553fadfc623a9af8785fe7577cadced02b86e3dab1e97b492d4680c060ea0126abeb -8ece08667ed826f0a239cea72e11359f7e85d891826292b61d4edbdc672f8342e32c66bec3e6498016b8194168ba0e0d -90a15162586e991b302427bc0307790a957b53ab0e83c8b2216f6e6302bc496cb256f0f054ff2cccdfe042763de00976 -9966c0413b086a983f031a39080efde41a9fedcaf8e92897ce92e0c573b37981f5ea266b39dc4f4fb926a1bce5e95ad7 -9515be2f65a57e6960d71bfb1917d33f3f6d8b06f8f31df30fc76622949770fea90ff20be525ae3294c56bc91efb7654 -86e71c9b4059dc4fd1ce7e28883e4f579a51449cab5899e371118cdb6afe2758b1485961ca637c299896dea7c732151b -8695b4ff746d573f8d150f564e69fe51c0726c5d14aa1d72d944f4195e96165eca7eba8cac583fd19d26718b0ce3eb61 -813eecf402151c99c1a55b4c931716e95810fc4e6d117dfc44abbf5ef8dcdf3f971d90d7fa5e5def393681b9584637e0 -a9caf7219eed1db14b7b8f626f20294a3305ed1f6c22f6a26962772c2fa3e50b5234f6d9ba7fa5c3448824c2a15271b3 -b2b2ee20de9b334f2d82cbe0d2e426ca1f35f76218737d0069af9b727a1bfc12d40cf8b88d4afcbeaadf317b7f7ad418 -b853960749521a17ff45f16ac46813d249c4e26e3c08fd33d31ef1ed2b2e157c9cb18bd2454fb5c62690bdd090a48f60 -88772297d2972471b3db71f3ddbf5945a90154768ca49fa6729a5e2299f1795445fb3d4d969d1620e87dca618fbc8a6c -a2bb783fd13aee993e3efd3a963ebc8a8eacfc8450042f018f2040353de88c71ac784b0898bdff27f606c60a3d5ef2c6 -9210903ac619edca0cb8c288ed6dcc93c472f45182cd6614a8e2390801ddea41d48a4ac04a40e2f0adfd48f91aabe2ea -a621d00f83260c22db9fa28757ea81dabcc78b10eeaaf58b06b401db6cc7a7d9a6831a16f171ead4e8506d0c46a752ca -b25c525bf6761a18bbd156ac141df2595940c7b011ed849dbb8ac3a2cd2da6b63ba4755324d70dc14c959deb29fb9ad3 -a35111d0db3e862e1b06249d289e0fc6b110877d254f2ae1604fb21292c227a8b6d87dd17a7b31166038d6860b1bd249 -90bf057309867d95f27637bd10ef15ceb788f07d38aca7ad7920042293d7c4a1a13d4ca1d6db202864d86d20a93e16cf -a88510e110b268d15dcd163ba1e403e44b656771399ac3a049dcb672a1201e88bf60bdd1d303158888a3d30d616cc0bd -b33b7e1f765e9cbd5eeb925e69c39b0a9ea3348ab17f1dbb84b66f4a4b3233e28cbdeb0903d6cfe49ec4fc2f27378ff9 -b777da64fa64d9bc3d2d81b088933fce0e5fcc29c15536159c82af3622a2604c2b968991edea7b6882c9e6f76b544203 -8ea598e402a056fd8031fbf3b9e392347999adc1bd5b68c5797a791a787d006e96918c799467af9ac7f5f57eb30b4f94 -b6901a389bf3b3045e679d015c714d24f8bbe6183349b7f6b42f43409a09f0d5bd4b794012257d735c5fdf6d1812554b -b5866426336d1805447e6efc3f3deb629b945b2781f618df9a2cc48c96020846e9108f9d8507a42ba58d7617cb796c31 -a18ccc6ad1caa8462fa9bec79510689dd2a68d2e8b8e0ddbeb50be4d77728e1d6a18748a11e27edd8d3336c212689a4d -abbd48c48a271b6b7c95518a9352d01a84fb165f7963b87cdc95d5891119a219571a920f0d9ceedc8f9f0de4ab9deb65 -94a4e5f4d7e49229e435530b12a1ff0e9259a44a4f183fb1fe5b7b59970436e19cf932625f83f7b75702fd2456c3b801 -af0a6f2a0d0af7fc72e8cb690f0c4b4b57b82e1034cca3d627e8ef85415adec8eb5df359932c570b1ee077c1d7a5a335 -9728025e03114b9e37ed43e9dcba54a2d67f1c99c34c6139e03d4f9c57c9e28b6b27941d9fca4051d32f9b89bec6537b -941601742d1e1ec8426591733a4f1c13785b0a9b0a6b2275909301a6a3c6c1e2fb1ffa5fdcc08d7fb69f836ae641ced5 -b84b90480defd22f309e294379d1ca324a76b8f0ba13b8496b75a6657494e97d48b0ea5cfdb8e8ac7f2065360e4b1048 -95cc438ee8e370fc857fd36c3679c5660cf6a6c870f56ef8adf671e6bf4b25d1dbad78872cc3989fdfe39b29fc30486d -8aafba32e4a30cad79c5800c8709241b4041b0c13185ea1aa9bc510858709870b931d70b5d9a629f47579b161f1d8af7 -865b0155d9013e80cba57f204c21910edbd4d15e53ae4fee79992cb854dc8b8a73f0a9be92f74893e30eb70f270511bc -b9a49ce58d40b429ac7192cdbf76da31300efc88c827b1e441dd5bdb2f1c180d57808c48992492a2dc5231008629159f -8d1438b10f6cd996494d4c7b5a0841617ec7cf237c9e0956eac04fda3f9ded5110ec99776b816e3c78abd24eb4a9c635 -af2dd18211bb8a3e77c0a49d5773da6e29e4e6fa6632a6eeb56c4be233f6afe81655d977932548de2be16567c54ffbd7 -92b92443f44464f2b48002a966664a4267eae559fa24051983bcf09d81bed5bcc15cb6ff95139d991707697a5d0cc1ab -a1864a2bac0c0dd5b2fb1a79913dd675fe0a5ae08603a9f69d8ca33268239ac7f2fed4f6bf6182a4775683cb9ccd92a8 -948e8f1cf5bd594c5372845b940db4cb2cb5694f62f687952c73eb77532993de2e2d7d974a2ced58730d12c8255c30a2 -aa825c08284fa74a99fcfc473576e8a9788277f72f8c87f29be1dd41229c286c2753ff7444c753767bd8180226763dfc -8384d8d51415e1a4d6fe4324504e958c1b86374cc0513ddf5bcbffabb3edcf4b7d401421e5d1aa9da9010f07ef502677 -8b8223a42585409041d8a6e3326342df02b2fe0bcc1758ff950288e8e4677e3dc17b0641286eaf759a68e005791c249c -a98a98cc2fb14e71928da7f8ce53ab1fb339851c9f1f4bceb5f1d896c46906bd027ef5950ca53b3c8850407439efedd4 -866f44d2e35a4dbffe6cd539b6ef5901924061e37f9a0e7007696fb23526379c9b8d095b417effe1eecda698de744dcb -91774f44bf15edafdf43957fdf254682a97e493eb49d0779c745cb5dbe5d313bf30b372edd343f6d2220475084430a2e -ab52fc3766c499a5f5c838210aada2c3bcc1a2ec1a82f5227d4243df60809ee7be10026642010869cfbf53b335834608 -a0e613af98f92467339c1f3dc4450b7af396d30cefd35713388ccd600a3d7436620e433bf294285876a92f2e845b90d0 -8a1b5ca60a9ae7adc6999c2143c07a855042013d93b733595d7a78b2dc94a9daa8787e2e41b89197a0043343dbd7610f -ae7e4557bc47b1a9af81667583d30d0da0d4a9bb0c922450c04ec2a4ae796c3f6b0ede7596a7a3d4e8a64c1f9ee8ff36 -8d4e7368b542f9f028309c296b4f84d4bde4837350cf71cfe2fa9d4a71bce7b860f48e556db5e72bc21cf994ffdf8e13 -af6ed1fbff52dd7d67d6a0edfa193aa0aab1536979d27dba36e348759d3649779f74b559194b56e9378b41e896c4886f -a069ba90a349ac462cac0b44d02c52a4adf06f40428aef5a2ddff713de31f991f2247fc63426193a3ea1b1e50aa69ded -8750f5f4baf49a5987470f5022921108abe0ead3829ddef00e61aedd71f11b1cdd4be8c958e169440b6a8f8140f4fbf9 -a0c53cefc08a8d125abd6e9731bd351d3d05f078117ff9c47ae6b71c8b8d8257f0d830481f941f0c349fc469f01c9368 -94eea18c5ed056900c8285b05ba47c940dff0a4593b627fdd8f952c7d0122b2c26200861ef3e5c9688511857535be823 -8e1b7bd80d13460787e5060064c65fbcdac000c989886d43c7244ccb5f62dcc771defc6eb9e00bae91b47e23aeb9a21f -b4b23f9dd17d12e145e7c9d3c6c0b0665d1b180a7cfdf7f8d1ab40b501c4b103566570dca2d2f837431b4bf698984cad -847a47c6b225a8eb5325af43026fb9ef737eede996257e63601f80302092516013fde27b93b40ff8a631887e654f7a54 -9582d7afb77429461bd8ebb5781e6390a4dde12a9e710e183581031ccfacd9067686cfaf47584efaafeb1936eae495cc -8e4fd5dbd9002720202151608f49ef260b2af647bd618eb48ebeceeb903b5d855aa3e3f233632587a88dc4d12a482df9 -87b99fe6a9c1d8413a06a60d110d9e56bb06d9f0268dc12e4ab0f17dd6ca088a16ade8f4fb7f15d3322cbe7bfd319ae1 -b562d23002ed00386db1187f519018edd963a72fca7d2b9fcaab9a2213ac862803101b879d1d8ac28d1ccae3b4868a05 -b4cc8b2acacf2ce7219a17af5d42ce50530300029bc7e8e6e2a3c14ff02a5b33f0a7fecb0bb4a7900ea63befa854a840 -9789f0fe18d832ff72df45befa7cabf0a326b42ada3657d164c821c35ac7ed7b2e0eba3d67856e8c387626770059b0c3 -986c6fe6771418549fa3263fa8203e48552d5ecb4e619d35483cb4e348d849851f09692821c9233ae9f16f36979c30c2 -a9160182a9550c5756f35cea1fe752c647d1b64a12426a0b5b8d48af06a12896833ec5f5d9b90185764db0160905ca01 -82614dbd89d54c1e0af4f6ffe8710e6e871f57ef833cbcb3d3d7c617a75ec31e2a459a89ebb716b18fc77867ff8d5d47 -8fc298ffba280d903a7873d1b5232ce0d302201957226cddff120ffe8df9fee34e08420302c6b301d90e3d58f10beeb9 -898da9ac8494e31705bdf684545eee1c99b564b9601877d226d0def9ec67a20e06f8c8ba2a5202cc57a643487b94af19 -88218478d51c3ed2de35b310beedf2715e30208c18f046ee65e824f5e6fd9def921f6d5f75fd6dde47fa670c9520f91a -89703ae7dff9b3bc2a93b44cdbab12c3d8496063a3c658e21a7c2078e4c00be0eecae6379ee8c400c67c879748f1d909 -a44d463477dece0d45abb0ebb5f130bfb9c0a3bbcd3be62adf84a47bbd6938568a89bc92a53ca638ff1a2118c1744738 -95df2b4d392143ee4c39ad72f636d0ed72922de492769c6264015776a652f394a688f1d2b5cf46077d01fda8319ba265 -aa989867375710ed07ad6789bfb32f85bdc71d207f6f838bd3bde9da5a169325481ac326076b72358808bd5c763ba5bb -b859d97d0173920d16bc01eb7d3ddd47273daac72f86c4c30392f8de05fee643e8d6aa8bebdbc5c2d89037bc68a8a105 -b0249ec97411fa39aa06b3d9a6e04bbbcd5e99a7bc527273b6aa95e7ae5f437b495385adaefa4327231562d232c9f822 -8209e156fe525d67e1c83ec2340d50d45eba5363f617f2e5738117cdcc4a829c4cc37639afd7745cbe929c66754fd486 -99fd2728ceb4c62e5f0763337e6d28bf11fbe5df114217f002bc5cd3543c9f62a05a8a41b2e02295360d007eaab796a6 -902ebc68b8372feeaf2e0b40bd6998a0e17981db9cc9d23f932c34fbcc680292a0d8adcea2ad3fb2c9ed89e7019445c2 -8b5653f4770df67f87cb68970555b9131c3d01e597f514e0a399eec8056e4c5a7deed0371a27b3b2be426d8e860bf9f2 -8f5af27fdc98a29c647de60d01b9e9fd0039013003b44ba7aa75a4b9c42c91feb41c8ae06f39e22d3aed0932a137affa -81babb9c1f5bcc0fd3b97d11dd871b1bbd9a56947794ff70ab4758ae9850122c2e78d53cb30db69ece23538dc4ee033e -b8b65d972734f8ecae10dd4e072fa73c9a1bf37484abcfa87e0d2fcecac57294695765f63be87e1ba4ec0eb95688403a -b0fe17d0e53060aef1947d776b06ab5b461a8ef41235b619ca477e3182fadaf9574f12ffc76420f074f82ac4a9aa7071 -ae265c0b90bf064d7a938e224cb1cd3b7eca3e348fbc4f50a29ac0930a803b96e0640992354aa14b303ea313cb523697 -8bc10ffde3224e8668700a3450463ab460ec6f198e1deb016e2c9d1643cc2fe1b377319223f41ffeb0b85afd35400d40 -8d5113b43aea2e0cc6f8ec740d6254698aff7881d72a6d77affd6e6b182909b4de8eb5f524714b5971b418627f15d218 -ae2ef0a401278b7b5d333f0588773ec62ead58807cdee679f72b1af343c1689c5f314989d9e6c9369f8da9ce76979db6 -b9c1cb996a78d4f7793956daaa8d8825dd43c4c37877bc04026db4866144b1bf37aa804d2fe0a63c374cf89e55e9069f -a35f73851081f6540e536a24a28808d478a2bb1fd15ee7ff61b1562e44fbafc0004b9c92c9f96328d546b1287e523e48 -82007f34e3383c628c8f490654369744592aa95a63a72be6e90848ad54f8bc2d0434b62f92a7c802c93017214ecf326e -9127db515b1ed3644c64eaf17a6656e6663838fed4c6612a444a6761636eaaeb6a27b72d0e6d438c863f67b0d3ec25c5 -984c9fcc3deccf83df3bbbb9844204c68f6331f0f8742119ba30634c8c5d786cd708aa99555196cf6563c953816aec44 -a0f9daf900112029474c56ddd9eb3b84af3ed2f52cd83b4eb34531cf5218e7c58b3cab4027b9fc17831e1b6078f3bf4a -90adbcc921369023866a23f5cea7b0e587d129ad71cab0449e2e2137838cea759dec27b0b922c59ac4870ef6146ea283 -8c5650b6b9293c168af98cf60ad35c945a30f5545992a5a8c05d42e09f43b04d370c4d800f474b2323b4269281ca50f8 -868d95be8b34a337b5da5d886651e843c073f324f9f1b4fbd1db14f74aba6559449f94c599f387856c5f8a7bc83b52a1 -812df0401d299c9e95a8296f9c520ef12d9a3dd88749b51eab8c1b7cc97961608ab9fc241a7e2888a693141962c8fd6d -abda319119d8a4d089393846830eee19d5d6e65059bf78713b307d0b4aad245673608b0880aa31c27e96c8d02eff39c0 -887f11ae9e488b99cb647506dcaa5e2518b169ee70a55cd49e45882fe5bfb35ffaf11feb2bf460c17d5e0490b7c1c14d -b36b6e9f95ffff917ca472a38fa7028c38dc650e1e906e384c10fe38a6f55e9b84b56ffa3a429d3b0c3e2cf8169e66a9 -a0450514d20622b7c534f54be3260bab8309632ca21c6093aa0ccc975b8eed33a922cbcc30a730ccc506edf9b188a879 -87cfaf7bcd5d26875ca665ac45f9decd3854701b0443332da0f9b213e69d6f5521ae0217ec375489cd4fad7b4babf724 -842ad67c1baf7a9d4504c10c5c979ce0a4d1b86a263899e2b5757407c2adcdcf7ed58173ad9d156d84075ef8798cb1c4 -ac1a05755fe4d3fb2ab5b951bafe65cca7c7842022ca567b32cddf7741782cbf8c4990c1dd4ea05dc087a4712844aebb -a000c8cecc4fddeb926dc8dd619952bc51d00d7c662e025f973387a3fc8b1ef5c7c10b6a62e963eb785e0ec04cb1ffbe -8a573c9986dbeb469547dfd09f60078eab252d8ec17351fe373a38068af046b0037967f2b3722fa73ed73512afd038d2 -b8dff15dff931f58ba05b6010716c613631d7dd9562ae5138dbec966630bcdb0e72552e4eefc0351a6a6b7912d785094 -990e81fd459433522e8b475e67e847cb342c4742f0dbf71acc5754244ccd1d9ff75919168588d8f18b8aea17092dd2a4 -b012f8644da2113bef7dd6cdc622a55cfa0734bd267b847d11bba2e257a97a2a465c2bb616c240e197ff7b23e2ce8d8e -a659bd590fde467766e2091c34a0b070772f79380be069eef1afecc470368a95afd9eed6520d542c09c0d1a9dca23bd0 -b9239f318b849079477d1cf0a60a3d530391adacd95c449373da1c9f83f03c496c42097c3f9aca10c1b9b3dbe5d98923 -851e9a6add6e4a0ee9994962178d06f6d4fbc0def97feef1ba4c86d3bcf027a59bafa0cf25876ca33e515a1e1696e5cc -803b9c5276eed78092de2f340b2f0d0165349a24d546e495bd275fe16f89a291e4c74c22fdee5185f8fce0c7fbced201 -95915654ca4656d07575168fb7290f50dc5dcbbcdf55a44df9ec25a9754a6571ab8ca8a159bc27d9fa47c35ffd8f7ffd -88f865919764e8e765948780c4fdd76f79af556cd95e56105d603c257d3bfb28f11efca1dfb2ce77162f9a5b1700bac8 -b1233131f666579b4cc8b37cfa160fc10551b1ec33b784b82685251464d3c095cdde53d0407c73f862520aa8667b1981 -a91115a15cf4a83bda1b46f9b9719cfba14ffb8b6e77add8d5a0b61bea2e4ea8ce208e3d4ed8ca1aab50802b800e763a -93553b6c92b14546ae6011a34600a46021ce7d5b6fbfcda2a70335c232612205dbe6bfb1cc42db6d49bd4042c8919525 -8c2a498e5d102e80c93786f13ccf3c9cab7f4c538ccf0aee8d8191da0dbca5d07dff4448383e0cf5146f6d7e629d64f8 -a66ab92c0d2c07ea0c36787a86b63ee200499527c93b9048b4180fc77e0bb0aa919f4222c4bec46eeb3f93845ab2f657 -917e4fc34081a400fc413335fdf5a076495ae19705f8542c09db2f55fa913d6958fa6d711f49ad191aec107befc2f967 -940631a5118587291c48ac8576cdc7e4a904dd9272acb79407a7d3549c3742d9b3669338adbc1386724cc17ee0cc1ca3 -ae23ae3a531900550671fd10447a35d3653c5f03f65b0fdffe092844c1c95d0e67cab814d36e6388db5f8bd0667cd232 -ae545727fca94fd02f43e848f0fbbb1381fd0e568a1a082bf3929434cc73065bfbc9f2c840b270dda8cc2e08cd4d44b0 -8a9bc9b90e98f55007c3a830233c7e5dc3c4760e4e09091ff30ee484b54c5c269e1292ce4e05c303f6462a2a1bd5de33 -a5a2e7515ce5e5c1a05e5f4c42f99835f6fde14d47ecb4a4877b924246038f5bc1b91622e2ff97ed58737ed58319acfa -8fa9f5edf9153618b72b413586e10aaa6c4b6e5d2d9c3e8693ca6b87804c58dc4bf23a480c0f80cb821ebc3cf20ea4fc -925134501859a181913aadac9f07f73d82555058d55a7d5aaa305067fbd0c43017178702facc404e952ea5cfd39db59b -8b5ab1d9b5127cb590d6bddbf698ffe08770b6fc6527023d6c381f39754aecc43f985c47a46be23fe29f6ca170249b44 -aa39c6b9626354c967d93943f4ef09d637e13c505e36352c385b66e996c19c5603b9f0488ad4014bb5fc2e051b2876cc -8e77399c6e9cb8345002195feb7408eb571e6a81c0418590d2d775af7414fc17e61fe0cd37af8e737b59b89c849d3a28 -a0150aeca2ddc9627c7ea0af0dd4426726583389169bc8174fc1597cc8048299cc594b22d234a4e013dff7232b2d946c -98659422ef91f193e6104b09ff607d1ed856bb6baed2a6386c9457efbc748bd1bf436573d80465ebc54f8c340b697ea5 -8d6fb015898d3672eb580e1ffdf623fc4b23076664623b66bfb18f450d29522e8cb9c90f00d28ccf00af34f730bff7ac -996a8538efa9e2937c1caad58dc6564e5c185ada6cdcef07d5ec0056eb1259b0e4cef410252a1b5dbaee0da0b98dac91 -aa0ae2548149d462362a33f96c3ce9b5010ebf202602e81e0ef77e22cfc57ecf03946a3076b6171bea3d3dc9681187d7 -a5ce876b29f6b89050700df46d679bed85690daf7bad5c0df65e6f3bde5673e6055e6c29a4f4dcb82b93ccecf3bad9cc -81d824bb283c2f55554340c3514e15f7f1db8e9e95dd60a912826b1cccb1096f993a6440834dad3f2a5de70071b4b4b5 -914e7291da286a89dfc923749da8f0bf61a04faa3803d6d10633261a717184065dcc4980114ad852e359f79794877dd9 -ae49dc760db497c8e834510fe89419cc81f33fd2a2d33de3e5e680d9a95a0e6a3ccbdf7c0953beeb3d1caf0a08b3e131 -b24f527d83e624d71700a4b238016835a2d06f905f3740f0005105f4b2e49fc62f7e800e33cdc900d805429267e42fc0 -b03471ecaa7a3bf54503347f470a6c611e44a3cee8218ad3fcad61d286cfb7bb6a1113dad18475ec3354a71fcc4ec1e2 -881289b82b30aff4c8f467c2a25fced6064e1eece97c0de083e224b21735da61c51592a60f2913e8c8ba4437801f1a83 -b4ce59c0fc1e0ecad88e79b056c2fd09542d53c40f41dea0f094b7f354ad88db92c560b9aeb3c0ef48137b1a0b1c3f95 -a1ffb30eb8ef0e3ea749b5f300241ebe748ed7cf480e283dfcda7380aa1c15347491be97e65bc96bdf3fe62d8b74b3ae -b8954a826c59d18c6bfab24719f8730cc901868a95438838cd61dac468a2d79b1d42f77284e86e3382bf4f2a22044927 -818e7e7c59b6b5e22b3c2c19c163f2e787f2ff3758d395a4da02766948935eb44413c3ddd2bf45804a3c19744aa332f3 -a29556e49866e4e6f01d4f042eed803beeda781462884a603927791bd3750331a11bc013138f3270c216ab3aa5d39221 -b40885fa0287dc92859b8b030c7cca4497e96c387dcfe6ed13eb7f596b1eb18fb813e4ae139475d692f196431acb58fe -89cd634682fd99ee74843ae619832780cf7cd717f230ea30f0b1821caf2f312b41c91f459bdba723f780c7e3eed15676 -b48c550db835750d45a7f3f06c58f8f3bf8766a441265ca80089ead0346f2e17cbb1a5e843557216f5611978235e0f83 -90936ee810039783c09392857164ab732334be3a3b9c6776b8b19f5685379c623b1997fb0cdd43af5061d042247bc72f -a6258a6bae36525794432f058d4b3b7772ba6a37f74ef1c1106c80a380fc894cbeac4f340674b4e2f7a0f9213b001afd -8f26943a32cf239c4e2976314e97f2309a1c775777710393c672a4aab042a8c6ee8aa9ac168aed7c408a436965a47aeb -820f793573ca5cc3084fe5cef86894c5351b6078df9807d4e1b9341f9d5422dd29d19a73b0843a14ad63e8827a75d2da -a3c4fca786603cd28f2282ba02afe7cf9287529e0e924ca90d6cdfd1a3912478ebb3076b370ee72e00df5517134fe17f -8f3cdabd0b64a35b9ee9c6384d3a8426cc49ae6063632fb1a56a0ae94affa833955f458976ff309dafd0b2dd540786ae -945a0630cd8fa111cfd776471075e5d2bbe8eb7512408b5c79c8999bfaeca6c097f988fb1c38fa9c1048bac2bca19f2e -8a7f6c4e0ba1920c98d0b0235b4dda73b631f511e209b10c05c550f51e91b4ba3893996d1562f04ac7105a141464e0e9 -ab3c13d8b78203b4980412edc8a8f579e999bf79569e028993da9138058711d19417cf20b477ef7ed627fa4a234c727a -82b00d9a3e29ed8d14c366f7bb25b8cfe953b7be275db9590373a7d8a86ea927d56dc3070a09ef7f265f6dd99a7c896e -b6e48a282de57949821e0c06bc9ba686f79e76fb7cbf50ea8b4651ccd29bc4b6da67efea4662536ba9912d197b78d915 -a749e9edcba6b4f72880d3f84a493f4e8146c845637009f6ff227ff98521dbbe556a3446340483c705a87e40d07364bc -b9b93c94bd0603ce5922e9c4c29a60066b64a767b3aed81d8f046f48539469f5886f14c09d83b5c4742f1b03f84bb619 -afa70b349988f85ed438faafa982df35f242dd7869bda95ae630b7fd48b5674ef0f2b4d7a1ca8d3a2041eff9523e9333 -a8e7e09b93010982f50bd0930842898c0dcd30cdb9b123923e9d5ef662b31468222fc50f559edc57fcfdc597151ebb6e -8ce73be5ac29b0c2f5ab17cae32c715a91380288137d7f8474610d2f28d06d458495d42b9cb156fb1b2a7dfdcc437e1c -85596c1d81f722826d778e62b604eb0867337b0204c9fae636399fa25bb81204b501e5a5912654d215ec28ff48b2cb07 -96ff380229393ea94d9d07e96d15233f76467b43a3e245ca100cbecbdbb6ad8852046ea91b95bb03d8c91750b1dfe6e1 -b7417d9860b09f788eb95ef89deb8e528befcfa24efddbc18deaf0b8b9867b92361662db49db8121aeea85a9396f64fd -97b07705332a59cdba830cc8490da53624ab938e76869b2ce56452e696dcc18eb63c95da6dffa933fb5ffb7585070e2d -971f757d08504b154f9fc1c5fd88e01396175b36acf7f7abcfed4fff0e421b859879ed268e2ac13424c043b96fbe99fc -b9adb5d3605954943a7185bddf847d4dbe7bafe970e55dc0ec84d484967124c26dd60f57800d0a8d38833b91e4da476a -b4856741667bb45cae466379d9d6e1e4191f319b5001b4f963128b0c4f01819785732d990b2f5db7a3452722a61cd8cc -a81ec9f2ab890d099fb078a0c430d64e1d06cbbe00b1f140d75fc24c99fe35c13020af22de25bbe3acf6195869429ba5 -99dcea976c093a73c08e574d930d7b2ae49d7fe43064c3c52199307e54db9e048abe3a370b615798b05fe8425a260ba0 -a1f7437c0588f8958b06beb07498e55cd6553429a68cd807082aa4cc031ab2d998d16305a618b3d92221f446e6cd766d -806e4e0958e0b5217996d6763293f39c4f4f77016b3373b9a88f7b1221728d14227fce01b885a43b916ff6c7a8bc2e06 -8e210b7d1aff606a6fc9e02898168d48ec39bc687086a7fe4be79622dd12284a5991eb53c4adfe848251f20d5bfe9de0 -82810111e10c654a6c07cbfd1aff66727039ebc3226eef8883d570f25117acf259b1683742f916ac287097223afc6343 -92f0e28cca06fd543f2f620cc975303b6e9a3d7c96a760e1d65b740514ccd713dc7a27a356a4be733570ca199edd17ba -900810aa4f98a0d6e13baf5403761a0aeb6422249361380c52f98b2c79c651e3c72f7807b5b5e3a30d65d6ff7a2a9203 -b0740bfefea7470c4c94e85185dbe6e20685523d870ff3ef4eb2c97735cef41a6ab9d8f074a37a81c35f3f8a7d259f0e -af022e98f2f418efbbe2de6fefb2aa133c726174f0f36925a4eafd2c6fd6c744edb91386bafb205ce13561de4294f3a6 -95e4592e21ba97e950abb463e1bc7b0d65f726e84c06a98eb200b1d8bfc75d4b8cff3f55924837009e88272542fd25ec -b13bd6b18cd8a63f76c9831d547c39bbd553bda66562c3085999c4da5e95b26b74803d7847af86b613a2e80e2f08caae -a5625658b474a95aba3e4888c57d82fb61c356859a170bc5022077aa6c1245022e94d3a800bf7bd5f2b9ab1348a8834e -a097ee9e6f1d43e686df800c6ce8cfc1962e5a39bb6de3cf5222b220a41b3d608922dae499bce5c89675c286a98fdabd -94230ba8e9a5e9749cd476257b3f14a6bf9683e534fb5c33ca21330617533c773cb80e508e96150763699ad6ecd5aee7 -b5fea7e1f4448449c4bc5f9cc01ac32333d05f464d0ed222bf20e113bab0ee7b1b778cd083ceae03fdfd43d73f690728 -a18a41a78a80a7db8860a6352642cdeef8a305714543b857ca53a0ee6bed70a69eeba8cfcf617b11586a5cc66af4fc4f -85d7f4b3ff9054944ac80a51ef43c04189d491e61a58abed3f0283d041f0855612b714a8a0736d3d25c27239ab08f2ec -b1da94f1e2aedd357cb35d152e265ccfc43120825d86733fa007fc1e291192e8ff8342306bef0c28183d1df0ccec99d0 -852893687532527d0fbeea7543ac89a37195eadab2f8f0312a77c73bdeed4ad09d0520f008d7611539425f3e1b542cfd -99e3bd4d26df088fc9019a8c0b82611fd4769003b2a262be6b880651d687257ded4b4d18ccb102cba48c5e53891535e4 -98c407bc3bbc0e8f24bedf7a24510a5d16bce1df22940515a4fbdacd20d06d522ef9405f5f9b9b55964915dd474e2b5c -80de0a12f917717c6fc9dc3ccc9732c28bae36cff4a9f229d5eaf0d3e43f0581a635ba2e38386442c973f7cb3f0fdfa7 -94f9615f51466ae4bb9c8478200634b9a3d762d63f2a16366849096f9fc57f56b2e68fe0ca5d4d1327a4f737b3c30154 -a3dcbe16499be5ccb822dfcd7c2c8848ba574f73f9912e9aa93d08d7f030b5076ca412ad4bf6225b6c67235e0ab6a748 -98f137bf2e1aea18289750978feb2e379054021e5d574f66ca7b062410dcfe7abb521fab428f5b293bbe2268a9af3aa4 -8f5021c8254ba426f646e2a15b6d96b337a588f4dfb8cbae2d593a4d49652ca2ada438878de5e7c2dbbd69b299506070 -8cc3f67dd0edcdb51dfd0c390586622e4538c7a179512f3a4f84dd7368153a28b1cf343afd848ac167cb3fcaa6aee811 -863690f09ac98484d6189c95bc0d9e8f3b01c489cb3f9f25bf7a13a9b6c1deaf8275ad74a95f519932149d9c2a41db42 -8494e70d629543de6f937b62beca44d10a04875bd782c9a457d510f82c85c52e6d34b9c3d4415dd7a461abbcc916c3c4 -925b5e1e38fbc7f20371b126d76522c0ea1649eb6f8af8efb389764ddcf2653775ef99a58a2dcf1812ce882964909798 -94d0494dcc44893c65152e7d42f4fb0dc46af5dc5674d3c607227160447939a56d9f9ea2b3d3736074eef255f7ec7566 -b0484d33f0ef80ff9b9d693c0721c77e518d0238918498ddf71f14133eb484defb9f9f7b9083d52bc6d6ba2012c7b036 -8979e41e0bb3b501a7ebbd024567ce7f0171acfea8403a530fe9e791e6e859dfbd60b742b3186d7cf5ab264b14d34d04 -af93185677d39e94a2b5d08867b44be2ba0bb50642edca906066d80facde22df4e6a7a2bd8b2460a22bdf6a6e59c5fdd -90f0ef0d7e7ab878170a196da1b8523488d33e0fde7481f6351558b312d00fa2b6b725b38539063f035d2a56a0f5e8f1 -a9ca028ccb373f9886574c2d0ea5184bc5b94d519aa07978a4814d649e1b6c93168f77ae9c6aa3872dd0eea17968ec22 -82e7aa6e2b322f9f9c180af585b9213fb9d3ad153281f456a02056f2d31b20d0f1e8807ff0c85e71e7baca8283695403 -affce186f842c547e9db2dffc0f3567b175be754891f616214e8c341213cbf7345c9ecd2f704bb0f4b6eba8845c8d8a7 -ab119eb621fade27536e98c6d1bc596388bb8f5cad65194ea75c893edbe6b4d860006160f1a9053aea2946bd663e5653 -99cd2c1c38ead1676657059dc9b43d104e8bd00ae548600d5fc5094a4d875d5b2c529fac4af601a262045e1af3892b5e -b531a43b0714cc638123487ef2f03dfb5272ff399ff1aa67e8bc6a307130d996910fb27075cbe53050c0f2902fc32ffe -923b59ac752c77d16b64a2d0a5f824e718460ef78d732b70c4c776fecc43718ecfaf35f11afbb544016232f445ecab66 -a53439cd05e6e1633cdce4a14f01221efcd3f496ac1a38331365c3cadc30013e5a71600c097965927ee824b9983a79cb -8af976ffab688d2d3f9e537e2829323dda9abf7f805f973b7e0a01e25c88425b881466dee37b25fda4ea683a0e7b2c03 -92e5f40230a9bfbb078fa965f58912abb753b236f6a5c28676fb35be9b7f525e25428160caeaf0e3645f2be01f1a6599 -8c4e7b04e2f968be527feba16f98428508a157b7b4687399df87666a86583b4446a9f4b86358b153e1660bb80bd92e8b -97cd622d4d8e94dceb753c7a4d49ea7914f2eb7d70c9f56d1d9a6e5e5cc198a3e3e29809a1d07d563c67c1f8b8a5665a -967bfa8f411e98bec142c7e379c21f5561f6fd503aaf3af1a0699db04c716c2795d1cb909cccbcb917794916fdb849f1 -b3c18a6caa5ca2be52dd500f083b02a4745e3bcaed47b6a000ce7149cee4ed7a78d2d7012bf3731b1c15c6f04cbd0bd1 -b3f651f1f84026f1936872956a88f39fcfe3e5a767233349123f52af160f6c59f2c908c2b5691255561f0e70620c8998 -ae23b59dc2d81cec2aebcaaf607d7d29cf588f0cbf7fa768c422be911985ca1f532bb39405f3653cc5bf0dcba4194298 -a1f4da396f2eec8a9b3252ea0e2d4ca205f7e003695621ae5571f62f5708d51ca3494ac09c824fca4f4d287a18beea9a -a036fa15e929abed7aac95aa2718e9f912f31e3defd224e5ed379bf6e1b43a3ad75b4b41208c43d7b2c55e8a6fedca72 -80e8372d8a2979ee90afbdb842624ace72ab3803542365a9d1a778219d47f6b01531185f5a573db72213ab69e3ffa318 -af68b5cdc39e5c4587e491b2e858a728d79ae7e5817a93b1ea39d34aec23dea452687046c8feae4714def4d0ed71da16 -b36658dfb756e7e9eec175918d3fe1f45b398679f296119cd53be6c6792d765ef5c7d5afadc5f3886e3f165042f4667f -ad831da03b759716f51099d7c046c1a8e7bf8bb45a52d2f2bfd769e171c8c6871741ef8474f06e2aca6d2b141cf2971f -8bae1202dde053c2f59efc1b05cb8268ba9876e4bd3ff1140fa0cc5fa290b13529aede965f5efdff3f72e1a579efc9cc -86344afbc9fe077021558e43d2a032fcc83b328f72948dba1a074bb1058e8a8faec85b1c019fc9836f0d11d2585d69c8 -831d1fc7aa28f069585d84c46bdc030d6cb12440cfaae28098365577fc911c4b8f566d88f80f3a3381be2ec8088bf119 -899de139797ac1c8f0135f0656f04ad4f9b0fa2c83a264d320eb855a3c0b9a4907fc3dc01521d33c07b5531e6a997064 -855bc752146d3e5b8ba7f382b198d7dc65321b93cdfc76250eabc28dba5bbf0ad1be8ccda1adf2024125107cb52c6a6e -af0aeccab48eb35f8986cabf07253c5b876dd103933e1eee0d99dc0105936236b2a6c413228490ed3db4fa69aab51a80 -ae62e9d706fbf535319c909855909b3deba3e06eaf560803fa37bce3b5aab5ea6329f7609fea84298b9da48977c00c3b -823a8d222e8282d653082d55a9508d9eaf9703ce54d0ab7e2b3c661af745a8b6571647ec5bd3809ae6dddae96a220ea7 -a4c87e0ea142fc287092bc994e013c85e884bc7c2dde771df30ca887a07f955325c387b548de3caa9efa97106da8176a -b55d925e2f614f2495651502cf4c3f17f055041fa305bb20195146d896b7b542b1e45d37fa709ca4bfc6b0d49756af92 -b0ebe8947f8c68dc381d7bd460995340efcbb4a2b89f17077f5fde3a9e76aef4a9a430d1f85b2274993afc0f17fdbead -8baaa640d654e2652808afd68772f6489df7cad37b7455b9cd9456bdddae80555a3f84b68906cc04185b8462273dcfc9 -add9aa08f827e7dc292ac80e374c593cd40ac5e34ad4391708b3db2fe89550f293181ea11b5c0a341b5e3f7813512739 -909e31846576c6bdd2c162f0f29eea819b6125098452caad42451491a7cde9fd257689858f815131194200bca54511f4 -abc4b34098db10d71ce7297658ef03edfa7377bd7ed36b2ffbab437f8fd47a60e2bcfbc93ff74c85cfce74ca9f93106c -857dbecc5879c1b952f847139484ef207cecf80a3d879849080758ef7ac96acfe16a11afffb42daf160dc4b324279d9b -aab0b49beecbcf3af7c08fbf38a6601c21061bed7c8875d6e3c2b557ecb47fd93e2114a3b09b522a114562467fcd2f7d -94306dec35e7b93d43ed7f89468b15d3ce7d7723f5179cacc8781f0cf500f66f8c9f4e196607fd14d56257d7df7bf332 -9201784d571da4a96ef5b8764f776a0b86615500d74ec72bc89e49d1e63a3763b867deca07964e2f3914e576e2ca0ded -aabe1260a638112f4280d3bdea3c84ce3c158b81266d5df480be02942cecf3de1ac1284b9964c93d2db33f3555373dcc -8ef28607ca2e0075aa07de9af5a0f2d0a97f554897cab8827dfe3623a5e9d007d92755d114b7c390d29e988b40466db9 -87a9b1b097c3a7b5055cd9cb0c35ba6251c50e21c74f6a0bca1e87e6463efc38385d3acc9d839b4698dfa2eb4cb7a2ef -aee277e90d2ffce9c090295c575e7cd3bafc214d1b5794dd145e6d02d987a015cb807bd89fd6268cd4c59350e7907ee2 -836ad3c9324eaa5e022e9835ff1418c8644a8f4cd8e4378bd4b7be5632b616bb6f6c53399752b96d77472f99ece123cd -8ffffdb67faa5f56887c834f9d489bb5b4dab613b72eac8abf7e4bcb799ccd0dbd88a2e73077cadf7e761cb159fb5ec5 -9158f6cd4f5e88e6cdb700fddcbc5a99b2d31a7a1b37dce704bd9dd3385cca69607a615483350a2b1153345526c8e05d -a7ff0958e9f0ccff76742fc6b60d2dd91c552e408c84172c3a736f64acb133633540b2b7f33bc7970220b35ce787cd4e -8f196938892e2a79f23403e1b1fb4687a62e3a951f69a7874ec0081909eb4627973a7a983f741c65438aff004f03ba6f -97e3c1981c5cdb0a388f1e4d50b9b5b5f3b86d83417831c27b143698b432bb5dba3f2e590d6d211931ed0f3d80780e77 -903a53430b87a7280d37816946245db03a49e38a789f866fe00469b7613ee7a22d455fb271d42825957282c8a4e159d9 -b78955f686254c3994f610e49f1c089717f5fb030da4f9b66e9a7f82d72381ba77e230764ab593335ff29a1874848a09 -938b6d04356b9d7c8c56be93b0049d0d0c61745af7790edf4ef04e64de2b4740b038069c95be5c91a0ba6a1bb38512a9 -a769073b9648fe21bc66893a9ef3b8848d06f4068805a43f1c180fdd0d37c176b4546f8e5e450f7b09223c2f735b006f -863c30ebe92427cdd7e72d758f2c645ab422e51ecef6c402eb1a073fd7f715017cd58a2ad1afe7edccdf4ff01309e306 -a617b0213d161964eccfc68a7ad00a3ee4365223b479576e887c41ef658f846f69edf928bd8da8785b6e9887031f6a57 -a699834bf3b20d345082f13f360c5f8a86499e498e459b9e65b5a56ae8a65a9fcb5c1f93c949391b4795ef214c952e08 -9921f1da00130f22e38908dd2e44c5f662ead6c4526ebb50011bc2f2819e8e3fca64c9428b5106fa8924db76b7651f35 -98da928be52eb5b0287912fd1c648f8bbda00f5fd0289baf161b5a7dbda685db6ad6bdc121bc9ffa7ed6ae03a13dbee3 -927b91d95676ff3c99de1312c20f19251e21878bfb47ad9f19c9791bc7fb9d6f5c03e3e61575c0760180d3445be86125 -b8e4977a892100635310dfcb46d8b74931ac59ae687b06469b3cee060888a3b6b52d89de54e173d9e1641234754b32b1 -98f6fd5f81ca6e2184abd7a3a59b764d4953d408cec155b4e5cf87cd1f6245d8bdd58b52e1e024e22903e85ae15273f1 -909aaacbbfe30950cf7587faa190dc36c05e3c8131749cc21a0c92dc4afc4002275762ca7f66f91aa751b630ad3e324d -91712141592758f0e43398c075aaa7180f245189e5308e6605a6305d01886d2b22d144976b30460d8ce17312bb819e8f -947d85cb299b189f9116431f1c5449f0f8c3f1a70061aa9ebf962aa159ab76ee2e39b4706365d44a5dbf43120a0ac255 -b39eced3e9a2e293e04d236976e7ee11e2471fe59b43e7b6dd32ab74f51a3d372afee70be1d90af017452ec635574e0e -8a4ba456491911fc17e1cadcbb3020500587c5b42cf6b538d1cb907f04c65c168add71275fbf21d3875e731404f3f529 -8f6858752363e2a94c295e0448078e9144bf033ccd4d74f4f6b95d582f3a7638b6d3f921e2d89fcd6afd878b12977a9d -b7f349aa3e8feb844a56a42f82b6b00f2bfe42cab19f5a68579a6e8a57f5cf93e3cdb56cbbb9163ab4d6b599d6c0f6aa -a4a24dc618a6b4a0857fb96338ac3e10b19336efc26986e801434c8fdde42ca8777420722f45dfe7b67b9ed9d7ce8fb1 -aafe4d415f939e0730512fc2e61e37d65c32e435991fb95fb73017493014e3f8278cd0d213379d2330b06902f21fe4e1 -845cc6f0f0a41cc6a010d5cb938c0ef8183ff5ed623b70f7ea65a8bdbc7b512ea33c0ee8b8f31fdf5f39ec88953f0c1e -811173b4dd89d761c0bdffe224cd664ef303c4647e6cf5ef0ed665d843ed556b04882c2a4adfc77709e40af1cfdea40b -93ba1db7c20bfba22da123b6813cb38c12933b680902cef3037f01f03ab003f76260acc12e01e364c0d0cf8d45fca694 -b41694db978b2cf0f4d2aa06fcfc4182d65fb7c9b5e909650705f779b28e47672c47707d0e5308cd680c5746c37e1bc7 -a0e92c4c5be56a4ccf1f94d289e453a5f80e172fc90786e5b03c1c14ce2f3c392c349f76e48a7df02c8ae535326ea8fe -96cbeb1d0693f4f0b0b71ad30def5ccc7ad9ebe58dbe9d3b077f2ac16256cde10468875e4866d63e88ce82751aaf8ef6 -935b87fd336f0bf366046e10f7c2f7c2a2148fa6f53af5607ad66f91f850894527ecec7d23d81118d3b2ee23351ed6ed -b7c2c1fa6295735f6b31510777b597bc8a7bfb014e71b4d1b5859be0d8d64f62a1587caafc669dfe865b365eb27bd94f -b25d93af43d8704ffd53b1e5c16953fd45e57a9a4b7acfcfa6dd4bf30ee2a8e98d2a76f3c8eba8dc7d08d9012b9694c6 -b5a005cd9f891e33882f5884f6662479d5190b7e2aec1aa5a6d15a8cb60c9c983d1e7928e25e4cf43ec804eaea1d97b0 -93f9f0725a06e4a0fb83892102b7375cf5438b5ebc9e7be5a655f3478d18706cf7dbb1cd1adcee7444c575516378aa1b -900d7cbf43fd6ac64961287fe593c08446874bfc1eb09231fc93de858ac7a8bca496c9c457bced5881f7bf245b6789e0 -90c198526b8b265d75160ef3ed787988e7632d5f3330e8c322b8faf2ac51eef6f0ce5a45f3b3a890b90aecf1244a3436 -b499707399009f9fe7617d8e73939cb1560037ad59ac9f343041201d7cc25379df250219fd73fa012b9ade0b04e92efa -94415f6c3a0705a9be6a414be19d478181d82752b9af760dda0dbd24a8ff0f873c4d89e61ad2c13ebf01de55892d07fa -90a9f0b9f1edb87751c696d390e5f253586aae6ebfc31eb3b2125d23877a497b4aa778de8b11ec85efe49969021eaa5a -a9942c56506e5cd8f9289be8205823b403a2ea233ba211cf72c2b3827064fd34cd9b61ff698a4158e7379891ca4120d8 -83bb2ee8c07be1ab3a488ec06b0c85e10b83a531758a2a6741c17a3ccfa6774b34336926a50e11c8543d30b56a6ac570 -8a08a3e5ebe10353e0b7fff5f887e7e25d09bb65becf7c74a03c60c166132efaada27e5aea242c8b9f43b472561ae3ed -957c7a24cefaa631fe8a28446bc44b09a3d8274591ade53ba489757b854db54820d98df47c8a0fbee0e094f8ad7a5dc4 -b63556e1f47ed3ee283777ed46b69be8585d5930960d973f8a5a43508fc56000009605662224daec2de54ea52a8dcd82 -abed2b3d16641f0f459113b105f884886d171519b1229758f846a488c7a474a718857323c3e239faa222c1ab24513766 -882d36eed6756d86335de2f7b13d753f91c0a4d42ef50e30195cc3e5e4f1441afa5ff863022434acb66854eda5de8715 -a65ea7f8745bb8a623b44e43f19158fd96e7d6b0a5406290f2c1348fc8674fbfc27beb4f724cc2b217c6042cb82bc178 -a038116a0c76af090a069ca289eb2c3a615b96093efacfe68ea1610890b291a274e26b445d34f414cfec00c333906148 -90294f452f8b80b0a47c3bcb6e30bdd6854e3b01deaf93f5e82a1889a4a1036d17ecb59b48efa7dc41412168d7a523dd -88faf969c8978a756f48c6114f7f33a1ca3fd7b5865c688aa9cd32578b1f7ba7c06120502f8dc9aee174ecd41597f055 -8883763b2762dfff0d9be9ac19428d9fd00357ac8b805efda213993152b9b7eb7ba3b1b2623015d60778bffda07a724d -a30a1a5a9213636aa9b0f8623345dc7cf5c563b906e11cc4feb97d530a1480f23211073dcb81105b55193dcde5a381d2 -b45ee93c58139a5f6be82572d6e14e937ef9fcbb6154a2d77cb4bf2e4b63c5aabc3277527ecf4e531fe3c58f521cc5e3 -ac5a73e4f686978e06131a333f089932adda6c7614217fcaf0e9423b96e16fd73e913e5e40bf8d7800bed4318b48d4b1 -b6c1e6cdd14a48a7fe27cd370d2e3f7a52a91f3e8d80fb405f142391479f6c6f31aa5c59a4a0fdc9e88247c42688e0cf -ab1760530312380152d05c650826a16c26223960fc8e3bf813161d129c01bac77583eff04ce8678ff52987a69886526b -a4252dffae7429d4f81dfaeeecc48ab922e60d6a50986cf063964f282e47407b7e9c64cf819da6f93735de000a70f0b2 -94c19f96d5ecf4a15c9c5a24598802d2d21acbbd9ee8780b1bc234b794b8442437c36badc0a24e8d2cff410e892bb1d2 -89fafe1799cf7b48a9ea24f707d912fccb99a8700d7287c6438a8879f3a3ca3e60a0f66640e31744722624139ba30396 -b0108405df25cf421c2f1873b20b28552f4d5d1b4a0bf1c202307673927931cbd59f5781e6b8748ddb1206a5ec332c0b -aa0f0e7d09f12b48f1e44d55ec3904aa5707e263774126e0b30f912e2f83df9eb933ca073752e6b86876adaf822d14ba -b0cbe8abb58876d055c8150d9fdbde4fea881a517a2499e7c2ea4d55c518a3c2d00b3494f6a8fd1a660bfca102f86d2a -b1ef80ec903bac55f58b75933dc00f1751060690fd9dfb54cf448a7a4b779c2a80391f5fda65609274bd9e0d83f36141 -8b52e05b1845498c4879bb12816097be7fc268ce1cf747f83a479c8e08a44159fc7b244cf24d55aca06dccf0b97d11e1 -b632a2fc4fdb178687e983a2876ae23587fd5b7b5e0bb8c0eb4cfe6d921a2c99894762e2aaccdc5da6c48da3c3c72f6c -953ef80ab5f74274ae70667e41363ae6e2e98ccbd6b7d21f7283f0c1cafb120338b7a8b64e7c189d935a4e5b87651587 -b929cfd311017c9731eed9d08d073f6cf7e9d4cd560cddd3fdcb1149ab20c6610a7674a66a3616785b13500f8f43ee86 -870fb0d02704b6a328e68721fb6a4b0f8647681bfcb0d92ec3e241e94b7a53aecc365ed384e721c747b13fbf251002f1 -979501159833a8ba5422ed9b86f87b5961711f5b474d8b0e891373fe2d0b98ff41a3a7a74a8b154615bb412b662a48be -b20f9c13cdeceef67f877b3878839ef425f645b16a69c785fe38f687c87a03b9de9ae31ac2edb1e1dd3a9f2c0f09d35d -8c7705ed93290731b1cf6f3bf87fc4d7159bb2c039d1a9f2246cda462d9cdf2beef62d9f658cfeea2e6aef7869a6fc00 -aa439eb15705ad729b9163daee2598d98a32a8a412777c0d12fd48dc7796d422227a014705e445cc9d66f115c96bbc24 -a32307e16f89749fe98b5df1effef0429801c067e0d8067794e56b01c4fef742ad5e7ab42a1a4cc4741808f47a0b7cb8 -b31e65c549003c1207258a2912a72f5bad9844e18f16b0773ea7af8ff124390eb33b2f715910fc156c104572d4866b91 -85608d918ed7b08a0dc03aee60ea5589713304d85eee7b4c8c762b6b34c9355d9d2e192575af0fd523318ae36e19ae1c -a6497dbaf0e7035160b7a787150971b19cf5ba272c235b0113542288611ebecefa2b22f08008d3f17db6a70a542c258d -87862adb1ac0510614ab909457c49f9ec86dc8bdf0e4682f76d2739df11f6ffcfb59975527f279e890d22964a1fba9b6 -8717ac3b483b3094c3b642f3fafe4fbafc52a5d4f2f5d43c29d9cfe02a569daee34c178ee081144494f3a2ca6e67d7b1 -855100ac1ec85c8b437fdd844abaa0ca4ac9830a5bdd065b68dafb37046fcf8625dd482dc0253476926e80a4c438c9ec -ae74821bf265ca3c8702c557cf9ef0732ede7ef6ed658283af669d19c6f6b6055aca807cf2fa1a64785ec91c42b18ae5 -812a745b1419a306f7f20429103d6813cbdea68f82ff635ac59da08630cd61bda6e0fa9a3735bfd4378f58ad179c1332 -867dbbfe0d698f89451c37ca6d0585fd71ee07c3817e362ef6779b7b1d70b27c989cdd5f85ac33a0498db1c4d14521fe -84db735d3eb4ff7f16502dccc3b604338c3a4a301220ad495991d6f507659db4b9f81bba9c528c5a6114bcdba0160252 -aadc83d1c4e5e32bf786cfb26f2f12a78c8024f1f5271427b086370cdef7a71d8a5bf7cd7690bae40df56c38b1ad2411 -a27860eb0caaea37298095507f54f7729d8930ac1929de3b7a968df9737f4c6da3173bda9d64ff797ed4c6f3a1718092 -a3cdcaa74235c0440a34171506ed03d1f72b150d55904ce60ec7b90fcd9a6f46f0e45feab0f9166708b533836686d909 -b209a30bdac5c62e95924928f9d0d0b4113ebb8b346d7f3a572c024821af7f036222a3bd38bd8efd2ee1dbf9ac9556cd -83c93987eff8bc56506e7275b6bef0946672621ded641d09b28266657db08f75846dcbde80d8abc9470e1b24db4ca65b -800c09b3ee5d0251bdaef4a82a7fe8173de997cc1603a2e8df020dd688a0c368ad1ebef016b35136db63e774b266c74c -93fb52de00d9f799a9bce3e3e31aaf49e0a4fc865473feb728217bd70f1bc8a732ec37ac3582bf30ab60e8c7fdf3cb8d -a1aff6b4a50d02f079a8895c74443539231bfdf474600910febf52c9151da7b31127242334ac63f3093e83a047769146 -8c4532d8e3abb5f0da851138bfa97599039bcd240d87bbdf4fd6553b2329abb4781074b63caf09bc724ceb4d36cb3952 -8bd9b0ae3da5acda9eb3881172d308b03beec55014cd73b15026299541c42fd38bab4983a85c06894ebb7a2af2a23d4c -979441e7f5a0e6006812f21b0d236c5f505bb30f7d023cb4eb84ec2aa54a33ac91d87ece704b8069259d237f40901356 -a1c6d2d82e89957d6a3e9fef48deb112eb00519732d66d55aa0f8161e19a01e83b9f7c42ac2b94f337dcc9865f0da837 -97a0b8e04e889d18947d5bf77d06c25bbd62b19ce4be36aaa90ddbeafd93a07353308194199ba138efaadf1b928cd8d2 -822f7fbe9d966b8ec3db0fc8169ab39334e91bf027e35b8cc7e1fe3ead894d8982505c092f15ddfe5d8f726b360ac058 -a6e517eedd216949e3a10bf12c8c8ddbfde43cddcd2c0950565360a38444459191bdbc6c0af0e2e6e98bc6a813601c6d -858b5f15c46c074adb879b6ba5520966549420cb58721273119f1f8bc335605aeb4aa6dbe64aae9e573ca7cc1c705cdc -b5191bb105b60deb10466d8114d48fb95c4d72036164dd35939976e41406dff3ee3974c49f00391abfad51b695b3258c -b1b375353ed33c734f4a366d4afad77168c4809aff1b972a078fd2257036fd6b7a7edad569533abf71bc141144a14d62 -a94c502a9cdd38c0a0e0187de1637178ad4fa0763887f97cc5bdd55cb6a840cb68a60d7dbb7e4e0e51231f7d92addcff -8fe2082c1b410486a3e24481ae0630f28eb5b488e0bb2546af3492a3d9318c0d4c52db1407e8b9b1d1f23a7ffbaf260a -b73fe7aa2b73f9cae6001af589bf8a9e73ea2bb3bb01b46743e39390c08d8e1be5e85a3d562857a9c9b802b780c78e6d -8e347f51330ae62275441ccd60f5ac14e1a925a54ced8a51893d956acc26914df1bb8595385d240aa9b0e5ada7b520ea -8dc573d6357c0113b026a0191a5807dbe42dcd2e19772d14b2ca735e1e67c70e319ef571db1f2a20e62254ed7fb5bcd6 -a5dacbe51549fe412e64af100b8b5eba5ec2258cc2a7c27a34bc10177d1894baf8707886d2f2ef438f077596a07681e9 -8349153c64961d637a5ff56f49003cb24106de19a5bbcf674016a466bfbe0877f5d1e74ccb7c2920665ef90a437b1b7e -96ad35429d40a262fdc8f34b379f2e05a411057d7852c3d77b9c6c01359421c71ef8620f23854e0f5d231a1d037e3a0d -b52385e40af0ed16e31c2154d73d1517e10a01435489fc801fbea65b92b3866ab46dab38d2c25e5fb603b029ae727317 -8e801c7a3e8fa91d9c22ebd3e14a999023a7b5beea13ec0456f7845425d28c92452922ca35ec64012276acb3bbc93515 -a8630870297d415e9b709c7f42aa4a32210b602f03a3015410123f0988aea2688d8bcfc6d07dc3602884abbf6199b23f -8cd518392e09df2a3771a736f72c05af60efc030d62dbbb9cd68dc6cbbe1fb0854eb78b6ed38337010eb1bb44a5d5d30 -921aa4c66590f6c54bf2fa2b324f08cbe866329cc31f6e3477f97f73e1a1721d5eb50ed4eacc38051fe9eda76ba17632 -a37e595cb63524cb033c5540b6343c3a292569fc115e813979f63fe1a3c384b554cecc2cae76b510b640fe3a18800c81 -b0bb57e4e31ae3ce9f28cef158ed52dabfad5aa612f5fcc75b3f7f344b7cec56b989b5690dacd294e49c922d550ee36b -a3c618ce4d091e768c7295d37e3f9b11c44c37507ae1f89867441f564bf0108f67bf64b4cf45d73c2afc17a4dc8b2c68 -999e6650eda5455e474c22a8c7a3fd5b547ec2875dc3043077ad70c332f1ccd02135e7b524fcbf3621d386dec9e614fa -b018f080888dec3c2ca7fcfeb0d3d9984699b8435d8823079fc9e1af4ca44e257fbe8da2f6f641ee6152b5c7110e3e3c -a2bcd4bcd9b40c341e9bba76b86481842f408166c9a7159205726f0776dcb7f15a033079e7589699e9e94ce24b2a77fd -b03de48f024a520bb9c54985ca356fd087ca35ac1dd6e95168694d9dae653138c9755e18d5981946a080e32004e238fe -a6c1a54973c0c32a410092441e20594aa9aa3700513ed90c8854956e98894552944b0b7ee9edf6e62e487dc4565baa2f -845d7abf577c27c4c1fafc955dcad99a1f2b84b2c978cfe4bd3cd2a6185979491f3f3b0ec693818739ed9184aba52654 -9531bcfc0d3fcd4d7459484d15607d6e6181cee440ba6344b12a21daa62ff1153a4e9a0b5c3c33d373a0a56a7ad18025 -a0bbf49b2dd581be423a23e8939528ceaae7fb8c04b362066fe7d754ca2546304a2a90e6ac25cdf6396bf0096fae9781 -a1ec264c352e34ed2bf49681b4e294ffea7d763846be62b96b234d9a28905cdece4be310a56ec6a00fc0361d615b547c -87c575e85b5dfbfd215432cb355a86f69256fff5318e8fda457763ac513b53baa90499dc37574bdfad96b117f71cb45e -9972edfdeec56897bef4123385ee643a1b9dc24e522752b5a197ce6bd2e53d4b6b782b9d529ca50592ee65b60e4c9c3c -b8bcf8d4ab6ad37bdd6ad9913a1ba0aba160cb83d1d6f33a8524064a27ba74a33984cc64beeee9d834393c2636ff831a -83082b7ec5b224422d0ff036fbb89dc68918e6fde4077dfc0b8e2ee02595195ecadb60c9ab0ad69deb1bac9be75024fa -8b061fce6df6a0e5c486fd8d8809f6f3c93bd3378a537ff844970492384fb769d3845d0805edd7f0fcd19efabf32f197 -b9597e717bb53e6afae2278dbc45d98959c7a10c87c1001ed317414803b5f707f3c559be6784119d08f0c06547ec60b1 -b9d990fd7677dd80300714cfd09336e7748bbf26f4bb0597406fcb756d8828c33695743d7a3e3bd6ddf4f508149610ef -b45f7d2b00ceea3bf6131b230b5b401e13a6c63ba8d583a4795701226bf9eb5c88506f4a93219ac90ccbceef0bfd9d49 -a8ccaa13ca7986bc34e4a4f5e477b11ae91abb45c8f8bf44a1f5e839289681495aba3daa8fb987e321d439bbf00be789 -ae0f59f7a94288a0ead9a398fdd088c2f16cccb68624de4e77b70616a17ddf7406ca9dc88769dadeb5673ff9346d6006 -b28e965dcc08c07112ae3817e98f8d8b103a279ad7e1b7c3de59d9dbd14ab5a3e3266775a5b8bbf0868a14ae4ab110f1 -84751c1a945a6db3df997fcbde9d4fe824bc7ba51aa6cb572bb5a8f9561bef144c952198a783b0b5e06f9dd8aa421be8 -a83586db6d90ef7b4fa1cbda1de1df68ee0019f9328aded59b884329b616d888f300abb90e4964021334d6afdea058fd -8fcea1ce0abf212a56c145f0b8d47376730611e012b443b3d1563498299f55cbcbe8cbd02f10b78224818bb8cbbd9aaa -8d66c30a40c34f23bae0ea0999754d19c0eb84c6c0aa1b2cf7b0740a96f55dd44b8fee82b625e2dd6c3182c021340ac6 -92c9b35076e2998f1a0f720d5a507a602bd6bd9d44ffc29ede964044b17c710d24ce3c0b4a53c12195de93278f9ec83b -a37d213913aff0b792ee93da5d7e876f211e10a027883326d582ad7c41deebdfce52f86b57d07868918585908ebd070a -a03995b4c6863f80dd02ed0169b4f1609dc48174ec736de78be1cdff386648426d031f6d81d1d2a7f2c683b31e7628c0 -b08b628d481302aa68daf0fa31fd909064380d62d8ed23a49037cb38569058e4c16c80e600e84828d37a89a33c323d1f -a0ee2e2dd8e27661d7b607c61ac36f590909aa97f80bdfd5b42463ca147b610ac31a9f173cbecdd2260f0f9ea9e56033 -967162fba8b69ffce9679aac49214debb691c6d9f604effd6493ce551abacbe4c8cc2b0ccee6c9927c3d3cfbdcb0be11 -8deab0c5ed531ce99dadb98b8d37b3ff017f07438bc6d50840577f0f3b56be3e801181333b4e8a070135f9d82872b7f2 -b1bfa00ec8c9365b3d5b4d77a718cb3a66ed6b6cf1f5cf5c5565d3aa20f63d3c06bb13d47d2524e159debf81325ba623 -90109780e53aeacd540b9fe9fc9b88e83c73eaf3507e2b76edc67f97a656c06a8a9e1ec5bce58bfd98b59a6b9f81b89d -88a1009a39a40421fdcc0ffc3c78a4fbace96a4e53420b111218091223494e780a998ebecf5a0abd0243e1523df90b28 -90b77146711ee8d91b0346de40eca2823f4e4671a12dad486a8ec104c01ef5ee7ab9bd0398f35b02b8cb62917455f8b3 -b262c5e25f24ae7e0e321b66fdb73b3bf562ded566a2d6a0152cf8bafb56138d87b6a917a82f5ace65efc73cfc177d81 -ae65a438c7ea46c82925b5ec5f71314558ca5146f5d90311431d363cfeac0537223c02cbb50fa6535d72fc2d949f4482 -8984208bfc193a6ef4720cc9d40c17f4be2f14595ef887980f2e61fa6927f9d73c00220937013b46290963116cbe66ac -a8f33a580508f667fac866456dce5d9246562188ad0f568eb1a2f28cf9fd3452dd20dc613adb1d07a5542319a37ecf1a -aedadd705fc086d8d2b647c62e209e2d499624ab37c8b19af80229f85e64a6e608d9cd414cb95ae38cf147d80ec3f894 -ae28077a235cd959f37dc3daedc3706f7a7c2ffe324e695f2e65f454bf5a9fc27b10149a6268ebfaa961ad67bb9b75d7 -a234c7f5a5e0e30f2026d62657bd92d91a9907ec6a2177f91383f86abb919778121ff78afb8f52c473fe6fb731018b52 -816a2ea7826b778f559a815267b6c6eb588558391c0a675d61bb19470d87489ba6c1e2486ea81dd5420a42ee7c35a8de -9218b61948c14234f549c438105ae98367ef6b727ad185f17ad69a6965c044bb857c585b84d72ef4c5fb46962974eed7 -a628031217a0b1330b497351758cf72d90fb87d8bdf542ea32092e14ff32d5ef4ca700653794bb78514d4b0edfd7a8d7 -ab4e977141be639a78eb9ed17366f9642f9335873aca87cce2bae0dddc161621d0e23264a54a7395ae706d748c690ee9 -b1538c4edff59bcf5668557d994bac77d508c757e382512c4368c1ded4242a41f6200b73fe8809fb528a7a0c1fc96feb -965caabe5590e2ff8c9f1048bbdda2817e7a2847e287944bfab40d94cb48389441ac42ff3a7b559760bfab42ff82e1e0 -a64b7484d22c4b8047c7a8ef54dc88cb8d110c61ef28ba853821b61e87d318b2b4226f7f0d1f3cdf086a0e1666d0212c -8915ab7e41d974eef9a651b01c2521392e8899e6ab91c22aeee61605c78fb2b052399ba1d03473aa9cfb52d1a8ba4257 -8dd26875d4a1716db2f75a621d01e971983267770e2da92399aecf08f74af1f7e73643ac6f0a9b610eda54e5460f70ed -83dabcb84c9cbce67e1a24ecbfa4473766b9519588b22288edbaa29aca34cefd9884f7310e7771f8f7a7cbced2e7eea0 -956be00c67987fb4971afca261065a7f6fcef9fb6b1fcb1939f664bbc5b704223253ebfda48565624a68fb249742c2cf -a374824a24db1ab298bee759cee8d8260e0ac92cd1c196f896600fd57484a9f9be1912ded01203976ac4fab66c0e5091 -a225f2ed0de4e06c500876e68e0c58be49535885378584a1442aae2140c38d3ca35c1bc41936a3baf8a78e7ab516f790 -8e79c8de591a6c70e2ef2de35971888ab0ca6fd926fdb6e845fb4b63eb3831c5839f084201b951984f6d66a214b946b8 -91babc849a9e67ab40192342c3d0d6ce58798101cb85c9bd7fc0ac4509ffc17b5ea19e58045cf1ca09ec0dee0e18c8f9 -8b4897fc2aef5bbe0fa3c3015ca09fc9414fdb2315f54dbecc03b9ae3099be6c0767b636b007a804d8b248c56e670713 -8f63ba42e7459ea191a8ad18de0b90b151d5acbf4751e2c790e7d8328e82c20de518132d6290ff3c23d2601f21c1558e -a1a035dc9b936587a16665ea25646d0bb2322f81960d9b6468c3234c9137f7c2b1e4f0b9dbe59e290a418007b0e7a138 -81c4904c08f7bb2ac7b6d4ac4577f10dd98c318f35aac92fc31bab05eceb80a0556a7fc82614b8d95357af8a9c85a829 -8c40e44e5e8e65f61e0a01f79057e1cb29966cc5074de790ea9c60454b25d7ea2b04c3e5decb9f27f02a7f3d3cb7014f -ad8709e357094076eb1eb601539b7bcc37247a25fbc6ada5f74bb88b1b371917c2a733522190f076c44e9b8e2ae127fb -92d43cd82c943fd71b8700977244436c696df808c34d4633f0624700a3445f3ecc15b426c850f9fb60b9aa4708f2c7c0 -b2cb8080697d1524a6dcb640b25e7255ae2e560613dbd27beaa8c5fc5c8d2524b7e6edd6db7ad0bb8a4e2e2735d4a6f7 -971ca6393d9e312bfb5c33955f0325f34946d341ff7077151f0bcafd2e6cbd23e2ad62979454f107edc6a756a443e888 -b6a563f42866afcee0df6c6c2961c800c851aa962d04543541a3cedeb3a6a2a608c1d8391cf405428cd40254e59138f3 -986bd17bad9a8596f372a0185f7f9e0fb8de587cd078ae40f3cd1048305ba00954aff886b18d0d04640b718ea1f0d5a3 -ae32dbccfb7be8e9165f4e663b26f57c407f96750e0f3a5e8e27a7c0ca36bc89e925f64ddd116263be90ace4a27872c4 -83725445ec8916c7c2dd46899241a03cf23568ac63ae2d34de3bce6d2db0bc1cfd00055d850b644a059fb26c62ed3585 -a83f7e61c05b1c6797a36ad5ded01bf857a838147f088d33eb19a5f7652b88e55734e8e884d1d1103a50d4393dfcd7a8 -aa010b4ec76260d88855347df9eaf036911d5d178302063d6fd7ecad009e353162177f92240fe5a239acd1704d188a9d -a88f4ba3cf4aff68ec1e3ded24622d4f1b9812350f6670d2909ea59928eb1d2e8d66935634d218aeac6d1a0fc6cae893 -b819112b310b8372be40b2752c6f08426ef154b53ef2814ae7d67d58586d7023ffa29d6427a044a3b288e0c779866791 -b5d1e728de5daf68e63b0bb1dee5275edae203e53614edeeeefff0f2f7ac4281191a33b7811de83b7f68111361ef42e1 -953fb3ddc6f78045e53eaacfd83c5c769d32608b29391e05612e4e75725e54e82ad4960fbef96da8b2f35ba862968a3e -936471136fb2c1b3bb986a5207a225a8bf3b206a1a9db54dc3029e408e78c95bfb7539b67006d269c09df6354d7254ac -ac353364b413cae799b13d7dc6fa09c322b47e60b9333e06499155e22d913929b92a45a0ad04ba90b29358f7b792d864 -a0177419ead02ba3f0755a32eee3fd23ec81a13c01eab462f3b0af1e2dba42f81b47b2c8b1a90d8cec5a0afa371b7f11 -b009eeb5db80d4244c130e6e3280af120917bb6fcebac73255c09f3f0c9da3b2aa718cd92d3d40e6b50737dbd23461aa -b8a43426c3746c1a5445535338c6a10b65474b684a2c81cd2f4b8ebecc91a57e2e0687df4a40add015cd12e351bbb3eb -94ff3698a6ac6e7df222675a00279c0ea42925dc6b748e3e74a62ea5d1e3fd70d5ab2d0c20b83704d389dd3a6063cf1a -90e4142e7ce15266144153e21b9893d3e14b3b4d980e5c87ce615ecd27efac87d86fa90354307857f75d7ebaeffe79ef -a5fd82c3f509ec9a36d72ba204a16f905e1e329f75cfd18aaa14fb00a212d21f3fac17e1a8e3bc5691ab0d07f8ec3cd0 -962e6bfd75ea554f304a5fee1123e5bf2e048ccd3b401716b34c52740384579188ac98bc0d91269fc814de23f4b2dd34 -b50b4e45c180badf9cd842cd769f78f963e077a9a4c016098dc19b18210580ad271ae1ba86de7760dd2e1f299c13f6a0 -84cf08858d08eca6acc86158ffda3fbe920d1d5c04ac6f1fc677760e46e66599df697397373959acf319c31e47db115c -a697a38ba21caa66b7739ed0e74fe762a3da02144b67971fcad28c1132d7b83e0ac062cc71479f99e2219086d7d23374 -ad1f6d01dd7f0de814fe5fbb6f08c1190ff37f4a50754d7b6291fc547c0820506ea629aabacf749fec9c1bbfda22d2d0 -b11fd7f8c120d8a370a223a1adc053a31bef7454b5522b848dec82de5482308fc68fdaf479875b7a4bc3fc94e1ea30eb -93ecf90ebfc190f30086bcaeee18cda972073a8469cf42a3b19f8c1ec5419dff2d6a5cc8ef412ccd9725b0f0a5f38f88 -911f25aaa5260b56b3009fa5e1346a29f13a085cf8a61b36b2d851791f7bcf8456840eccbfc23797b63ecd312e2d5e12 -a52f17a8b2db66c98291020b1db44ab23827e1790e418e078d1316185df6aa9f78292f43a12cd47131bd4b521d134060 -9646fca10bf7401e91d9a49753c72f3ecb142f5ed13aba2c510a6c5ccb8d07b8e8d1581fc81321ad5e3996b6d81b5538 -aa1da4a5665b91b62dda7f71bb19c8e3f6f49cc079d94fcd07b3604a74547e8334efa5a202822d0078158056bbda2822 -a2432ae5feeaf38252c28aa491e92a68b47d5b4c6f44c1b3d7f3abc2f10b588f64a23c3357e742a0f5e4f216e7ca5827 -83c7b47735cd0ef80658a387f34f259940096ebb9464c67919b278db4109fea294d09ea01a371b79b332cff6777c116d -a740a2959e86e413c62d6bdd1bc27efe9596ee363c2460535eab89ba1715e808b658bd9581b894b5d5997132b0c9c85c -b76947237fa9d71c3bece0b4f7119d7f94d2162d0ced52f2eac4de92b41da5b72ad332db9f31ebb2df1c02f400a76481 -a20e1f2b7e9cc1443226d2b1a29696f627c83836116d64d2a5559d08b67e7e4efa9a849f5bb93a0dadb62450f5a9eaab -b44bff680fba52443a5b3bd25f69c5640006d544fca1d3dc11482ee8e03b4463aae59d1ec9d200aa6711ce72350580fb -a9490f5643bacec7e5adcda849ab3e7ff1f89026bf7597980b13a09887376f243158d0035e9d24fdee7cb6500e53ef29 -96081010b82c04ad0bfc3605df622db27c10a91494685ef2e6e1839c218b91cbb56e043e9a25c7b18c5ddee7c6769517 -a9522d59bcf887cbbbc130d8de3ff29a86df5d9343a918f5e52c65a28e4c33f6106ac4b48ecd849a33d39eeb2319d85b -aa5e0cea1a1db2283783788b4d77c09829563b75c503c154fdaa2247c9149918edac7737ef58c079e02dca7d8397b0eb -8c03f064e777d0c07c4f04c713a86bf581cc85155afe40e9065ead15139b47a50ead5c87ac032f01b142d63ff849758a -a34d672bf33def02ee7a63e6d6519676c052fa65ca91ed0fe5fdd785c231ba7af19f1e990fc33f5d1d17e75f6af270be -8680443393e8ac45a0b07c30a82ac18e67dcc8f20254bd5ede7bf99fc03e6123f2fcd64c0ca62f69d240f23acd777482 -a4e00ab43d8ae5b13a6190f8ef5395ec17fbac4aa7dfa25b33e81b7e7bf63a4c28910b3a7dc9204dbc4168b08575a75e -8249259066ee5672b422c1889ab5ed620bddd1297f70b4197c40bb736afba05d513b91d3a82ee030336c311d952cd60c -a0651d8cf34fa971bde1ec037158a229e8e9ad4b5ca6c4a41adedb6d306a7772634f703dcfac36f9daf17289f33c23fb -b02ff6e8abff19969e265395ceaf465f43e7f1c3c9cfc91f1748042d9c352b284e49515a58078c877a37ff6915ee8bf4 -927fb7351ac28254458a1a2ea7388e1fbd831fbc2feedb230818f73cc8c505b7ff61e150898ce1567fcb0d2c40881c7b -a9d3861f72090bc61382a81286bb71af93cdeefab9a83b3c59537ad21810104e0e054859eeafa13be10f8027b6fc33b8 -a523306656730b1a31b9a370c45224b08baf45773d62952a0bf7d6c4684898ae78914cfafbd3e21406407cc39e12afdc -947a090e7703a3ea303a4a09b3ab6b6d3fda72912c9f42cc37627557028b4667f5398a6d64b9281fa2efbe16f6c61ed6 -b41d24d40c10239c85d5b9bf1a3886d514a7a06b31ca982ea983e37162293350b12428eabc9f6a460473ad811e61ba40 -b0bb9805724f4ca860e687985c0dc6b8f9017fe71147e5383cfbbbdcb2a42c93c7062ba42acdead9d992b6f48fc1d5ac -aec775aa97a78851893d3c5c209a91267f1daf4205bfb719c44a9ed2614d71854b95bb523cd04a7f818a4a70aa27d8fc -b53e52e32ca90b38987610585ad5b77ecd584bd22c55af7d7c9edf5fbcae9c9241b55200b51eaed0fbdb6f7be356368f -a2c5ac7822c2529f0201717b4922fb30fb037540ab222c97f0cdac341d09ccb1415e7908288fabef60177c0643ed21bf -92162fda0cbd1dafbed9419ae0837e470451403231ee086b49a21d20de2e3eed7ce64382153272b02cf099106688af70 -8452d5df66682396718a76f219a9333a3559231e5f7f109a1f25c1970eb7c3408a5e32a479357f148af63b7a1d352451 -831ea95d4feb520994bc4904017a557797e7ad455a431d94de03b873a57b24b127fcc9ff5b97c255c6c8d8e18c5c7e12 -93d451d5e0885ccdbb113a267c31701e7c3d9e823d735dc9dfd6cfdcd82767012dc71396af53d3bedd2e0d9210acf57f -a2126f75a768dcc7ebddf2452aebf20ad790c844442b78e4027c0b511a054c27efb987550fcab877c46f2c7be4883ae0 -aa4d2dcba2ccfc11a002639c30af6beb35e33745ecbab0627cf0f200fdae580e42d5a8569a9c971044405dfdafed4887 -ab13616069ef71d308e8bf6724e13737dc98b06a8f2d2631284429787d25d43c04b584793256ed358234e7cd9ad37d1f -9115ee0edc9f96a10edcafeb9771c74321106e7f74e48652df96e7ca5592a2f448659939291ff613dd41f42170b600ad -97b10a37243dc897ccc143da8c27e53ccc31f68220bffd344835729942bb5905ae16f71ccaed29ca189432d1c2cc09b1 -875cf9c71ae29c3bde8cdcb9af5c7aca468fbb9243718f2b946e49314221a664959140c1ebc8622e4ed0ba81526302fd -86b193afbb7ff135ce5fc7eb0ee838a22e04806ceec7e02b3fb010e938fff733fc8e3a1d4b6cba970852d6307018b738 -b3403a94f1483edce5d688e5ed4ab67933430ede39cd57e2cddb4b469479018757d37dd2687f7182b202967da12a6c16 -83edfa0a6f77974c4047b03d7930e10251e939624afa2dcafbd35a9523c6bf684e1bb7915fc2e5b3ded3e6dc78daacf2 -88ff3375fe33942e6d534f76ed0f1dfa35ae1d62c97c84e85f884da76092a83ecd08454096c83c3c67fac4cd966673d7 -af0726a2a92ee12a9411db66333c347e1a634c0ab8709cc0eab5043a2f4afac08a7ae3a15ce37f5042548c6764ae4cf6 -81cfa33bb702e2f26169a006af0af0dcaa849cec2faf0f4784a06aa3c232d85a85b8123d49a1555cca7498d65e0317e4 -910a16526176b6e01eb8fb2033ffbb8c9b48be6e65f4c52c582909681805b3d9e1c28e3b421be9b9829b32175b8d4d80 -93d23befa411ca1adbdba726f762f2403e1cc740e44c9af3e895962e4047c2782ca7f2f9878512c37afd5a5a0abbd259 -82fcf316027fedfe235905588b7651b41e703836f96cb7ac313b23b4e6c134bff39cd10b3bddb7458d418d2b9b3c471b -8febc47c5752c513c4e5573428ad0bb40e15a5e12dbfa4c1ef29453f0588f0b75c3591075fef698e5abcf4d50c818a27 -83dab521d58b976dcea1576a8e2808dfaea9fa3e545902d0e0ce184d02dca8245d549134a238ab757950ad8bc11f56eb -898cfb9bf83c1c424eca817e8d0b99f5e482865070167adab0ecf04f3deeb3c71363b9f155c67b84d5e286c28238bef8 -b845e388cc1a8e8b72a24d48219ac4fd7868ee5e30960f7074b27dada842aa206889122acfce9e28512038547b428225 -b1ce4720e07e6eecc2a652f9edbad6bd5d787fbaff2a72a5ca33fa5a054dd3b4d5952563bc6db6d1ce1757a578bba480 -8db6990dd10741cf5de36e47726d76a12ebe2235fdcb8957ab26dba9466e6707d4a795d4e12ec7400d961bd564bdee7e -a3ca7afd20e16c2a45f73fc36357763847ed0be11cb05bfd9722f92c7ba3fa708cf10d4e0ae726c3eccae23cc55fd2be -8701b085c45b36f3afb589207bbf245ef4c5c82aa967ecd0c334daa1f5a54093c5e0fcacd09be540801920f49766aa0f -84e3736727ba76191d9a6a2a3796f55bb3c3a8bbb6e41f58e892ea282c90530b53ab5490bbf1a066723399bb132160fb -87c02a01917333c7b8866f6b717b1e727b279894108f70574d1b6e9e8dc978eda8778342baf3c6464d6e0dd507163e76 -b8da532dac81fafaed759e99c3ae011d75f3fda67a8c420c3b9747281fe32e31ac3c81e539940286440704c2c3e3b53e -a0cc63c3bef75a5c02942977a68a88cd3d103d829b6c0f070f64206da7e3638f10f42452788092de8fbbc626ce17b0d4 -b5c9317b3f6b1d7ee6871506c0430cdf73e28b02c001ba6ca11061c7e121c91152d2b80c4f80e1d8f51ff5653bc0db5b -b798fb572da977dd3ef2dce64042b012a470d6bd2cb61a16267abe2b8399f74540d7c70462a6b2278d73567447e31994 -b868eda58739effda68c834745cd2cf66a09f0f215607b65685bb5ca3eba71150f43a6e47b81a0c19fb58eeae3da56e8 -9041c93a7e8f2c34812fd6e9744b154e898e1ef69db72bf36242c71e2c251f3db7e86cbd802da603a92cd0b06b62ea63 -a834d648e974230582fc17b3a449f4f65b3297038a3a5401e975b9b60ff79b2006a33e1486d3428106580276993311e1 -a3ce874da6ade9f0f854d7ae7651fc3ff63cec748a847527539fe0d67e6c99eaa3011065a4627c2192af7f9569f7ab57 -ae78ad16de150cc0400d3b6b424c608cd2b2d01a7a38ea9c4e504d8463c0af09613774dbefdd5198415b29904e0fbb63 -b966db5a961067e743212d564595ef534e71dcd79b690a5a2c642d787059fc7959b9039b650372461a1f52910f7e857b -8069904f360af3edfd6cabd9b7f2adf5b61bd7feb0e9a040dc15c2a9d20052c3e5e0158f3065ec3200d19b91db603b71 -9600917dbcd80a47f81c02c3aafecfcef77f031bf612a0f1a8bdef09de9656f4bb0f8e3e95f72ece1c22bd2824f145b6 -834a0767b7b6199496c1faee0e3580c233cc0763e71eebc5d7c112a5a5e5bd95c0cf76a32ea5bb1b74f3cf00fbd2cfb4 -99469a893579ed5da7d34ec228854c4666c58115d3cae86d4fc2d03d38f10d8c5dc8fb693763a96ab6be2045cc8d518b -a52cc0aecda6594de57d8ca13b146e77212cc55854929c03f2a8a6cdfa46296791c336aebcc2610d98612d5b4c0452df -97864434d55aa8a7aad0415d36f9558ce6e6c00452923db68a1e738232d0cb2d47e3b0b8f340c709112838adeaee4695 -a4a7f2c45db3661b6af7ec759f9455ba043b0de6fd4787e3372cba215b9f7c641d5d817a0576e7aa28a46349d2fe0ae6 -864e857652d95e1d168c1b9c294777fc9251a4d5b4b00a346b1f1c9c898af9a9b5ec0ac1f3a66f18a370b721dbd77b23 -ab8eac458fa8e7eb5539da3964ccd297a216448c3af4e4af0dcfed0ce29e877a85e29b9601dc7508a060b97a05f37e15 -a6fd0782c5629c824fcd89ac80e81d95b97d8374c82010a1c69f30cef16ffc0f19e5da2d0648d2a36a636071cb4b69a7 -ad35a75fd8832643989d51d94ee6462d729e15f6444ffdf340dfb222af5d2b6b52e5df86082dbc7728fde7c1f28ac6b4 -8e06831cc8a0c34245732ea610ea6aae6d02950299aa071a1b3df43b474e5baee815648784718b63acfd02a6655e8ea7 -994ac097f913a4ce2a65236339fe523888ee43494499c5abf4ac3bce3e4b090f45d9abd750f4142a9f8f800a0115488c -a3e6a8e5e924f3a4f93e43f3f5aafb8b5831ce8169cddde7296c319d8964a0b6322a0aa69e1da1778fcc24b7de9d8b93 -81a9bd04f4c6e75517de4b5e2713f746bd7f3f78a81a2d95adc87ba0e266d1f5e89c9cfb04b5159c1ff813f7968a27a4 -b24de8f3a5b480981c6f29607b257ded665ecd8db73e2a69a32fcf44e926fdc7e6610598e10081cf270d2f879414b1ab -adc1b3f8ed1e7d5a26b0959ffe5afc19e235028b94cb7f364f6e57b6bf7f04742986f923fae9bf3802d163d4d0ebc519 -a9fa5092b6dd0b4e1a338a06900b790abbc25e2f867b9fb319fdcdfb58600315a45a49584c614f0f9f8b844aa59dd785 -b29c06b92b14215e7ef4120562893351ae8bf97cc5c3d64f4ecd0eb365b0e464cf27beec3f3ddac17ed5e725706b6343 -adc0d532ba4c1c033da92ba31aa83c64054de79508d06ee335dcab5cabae204a05e427f6f8c2a556870a8230b4115fd0 -9737150d439e6db2471d51e006891d9687593af4e38ee8e38bfa626abcefa768ca22d39133f865d0a25b8bbf7443d7db -a10d1e6a760f54d26c923c773b963534e5c2c0826c0a7462db2ea2c34d82890f9c58f0150db00aa2679aa0fdb1afcb08 -816947dc6c08ee779e9c2229d73dbfd42c2b3b6749b98ec76dbad017f4b4d4f77b5916600b576691978287208c025d6f -a2dc52b6056219d999f07b11869c254e8b3977113fd9ba1a7f322377a5d20e16c2adf46efb7d8149e94989b3f063334a -8153900aae9cf48ebc7438b75c16f5478960ef9170e251708f0c2457967b7b31521c889b5fe843d2694a07c0e804fa48 -a9e9d8d66c8774972cc1686809ce1fa5f0e16997ef2178b49bcd8654541b5b6e234cb55188f071477ba1cebcf770da45 -b1fa775f9b2a9b05b4b1f0d6ad5635c7d7f4d3af8abaa01e28d32b62684f9921197ba040777711836bc78429bf339977 -b1afbbd522b30e1ae2adf9a22993ab28b72a86a3d68d67b1833115e513632db075d047e21dfe442d6facc7b0a1b856bf -8779b7d22f42845a06ae31ac434e0044f5f9b4e704847fb93943e118e642a8b21265505ad9d6e418405d0cb529e00691 -ab2c6cef1c4e7c410e9e8deb74c84bedeb3c454ae98e3bc228eb13f6b7081b57977b3e849ba66346250e37c86842c10c -908d6c781d7d96aa2048c83e865896c720a66fdec7b06ab4b172192fe82f9ff6167815ffb66549d72bfb540bb35c36c6 -b790440f205ece489e2703d5d1d01ba8921dd237c8814afb5cb521515ed4c3b0a6df45fd4bd65ba63592c2fe1d008df3 -aec346251f9c78336b388c4e9069a1c6c3afbbb6bfaffdad050a9e70e92fb3cae3609067b4903552936f904c804b0ea6 -a0e528cc2cb84b04cc91b4084e53ead4188682a6050b3857c34280899c8233aa8c1a9c6fa4fd6a7087acf1b36d67734a -aa8d7632be3e4340712a1461a0ad0ae90ba6d76e2916511c263f484c6c426939fa93ffbb702cd0341eea404d6ddffebb -a4ea871d8a1d4b925d890aefb9897847599b92e15ce14886b27ce5c879daa9edead26e02ccc33fcf37f40ff0783d4d9e -ab63e4dc0dbdaf2ada03b3733aafe17e719d028b30dc9a7e5783c80933a39935dbe1ef0320bb03f9564cafdf7a4b029b -8219761bbaa39b96b835f9c2b4cec0bf53801f8e4f4a4498d19638be2fa0a193b2c1fbf94e26c1058d90a9ac145a7a12 -a609ee5561828b0f634640c68a98da47cb872b714df7302ef6b24d253211e770acd0aa888802cd378e7fa036d829cd36 -90793ff0736f3c80b5e0c5098b56cda8b0b2bca5032bb153d7b3aa3def277f2fc6cea60ac03edc82e3a9d06aff7d1c56 -8760085283a479d15a72429971a0a5b885609fd61787a40adb3d3d7c139b97497aa6bcb11b08979e2354f1bc4dbf7a0d -b168ede8b9a528c60666057f746530fc52327546872dd03c8903f827d02c8313e58c38791fb46e154d4247ea4b859473 -842c1149ca212736ebe7b6b2cb9a7c3b81ae893393c20a2f1a8c8bfef16d0a473ff865a1c130d90cc3626045f9088100 -b41d0e2c7d55108a8526aa0b951a5c8d7e3734e22fe0a6a2dd25361a5d6dea45c4ab4a71440b582a2f9337940238fe20 -8380bd49677e61123506dd482cdf76a8f1877ea54ed023d1deabfc05846103cfd213de2aef331cdf1baf69cfc6767be9 -a026f92030666b723d937f507e5a40e3f3cfd414ad4b2712db0a7a245a31a46002504974ed8ba9d8e714f37353926a4e -b492e9e9917b29eb04cde0b012df15cbd04f3963d120b63c55dc4369e04f5ac7682b2c7dff8c03410936c26ca73ad34c -81fd9271b4ee36be0ba8f560d191e1b6616dd53c56d1d8deac8c1be7bc67bbc53d434cf70d04e7fa9de3e63415389693 -835c3711abe85683d2344a3ee5f70e68342fd1aec025ad248efe66aab3e3d5790fad2f45bae0d7a53a80998fde45f0aa -b46599be80b8f7dbad0b17808dd5ca91d787929c0bef96fbbcf6c767727d07ed6785bad164d733ecb015eb6c8469a16d -b36bf5c17271d39f5ccb3d82a5e002957207a0cdf9ae7108a4946e6f3ed21a5d353fa940b6fe949c39422b452339bae9 -a12f5444e602d6fb8be51a08b8bc4ec105dfd759d2afe98d51ff4edd673c92e4fc91ff32417ae8070e12169004f8aad3 -892ce3ca0a2961a01f7f0149b8a98fdc0f8871c2d85e76daf7c8aed2a18624b978a4d0a84213f81f9d2a81f7ca4826d0 -b1e6229ebd5b3d85e62d0474d1fed34564f1b5b9c5856fae36164dd0eff378d67d6717dda77536379006fb462bced9da -ac852921dcb81e54e1e315fd6226219932f7b785c2ceb2035710e814899784d7001101f1515d68e3fb74cdbb4baf9e26 -989a42d851123d708a213f3a02cfc926df15af058ec9b5a9df968fe16decbd781b5e65a4c17fbfedd2ac17126084700f -b1d0fc2f7c948e466445f307da7b64b3070057c79c07c7ebbbe6f8ed300a642b3567aed2e5f28988ac566ba62e0d2a79 -83057263b41775bc29f1d59868a05b0f76d3bdf8a13c1014496feb4c0ee379bfd0d4079785252f51fbeb641e47a89b69 -ac9e6a208aa9c557155cf82b389bb4227db5ac4b22a0c7c8d1c3d98946df8b82b0c49d093ba55c8255e024a6d67c14b4 -8294a11cd3f5111b1f8bd135be23b4de337ac45711db9566ebf6e162cd58e7859b1309eba8149b0f0a43e07f62a92411 -8c15f3388b196603c05adec195c1d2cc589e3466da3169e9afd37157fa55cd34bfafbfc5ff10ac0e04aa6a0d0b2ce3db -b8faf8ba89c3115576ab6b340f6cc09edfea8f7331f5a5e8003960c584e839fcecf401113dfbb9a5c11a13721b35c263 -955c63b1166514c02847402d0e92dccfe3c0dee3bc70d2375669afb061594c85651e6569f471a6969759e5f373277da4 -963bd4f9ae7361d6936d209592a07d9a22cc9ef330cf0c5cb845cb4085d76e114aee66d7599bf5b9f11c6b1c05dade8d -85509b3c97e06e0db113b8b40022c8989a305cec39acab36ba3a73a4b4719573e5bdb82dc4795699c26d983465cd61b0 -b870cfd7f691f88db8d1dfbe809b7b402eabd3b3299606b7dfdb7ef49415411f01d2a7e4f7ebd919ac82c7094f628166 -a5533e7b58a6a9e5c25589134f501584163551247d36f50666eeb0a0745cf33e65bb8f7a9c2dc7fe7cb392414f1ece4a -b93d1ade01ff5678fcd5b5b4f06a32b706213748076cae3a375e20a97231133ec37c1c3202cbc4896b66c3410210f446 -86ed3a58000a46fe2c37d4de515430a57d8f54ab4300294685534372fed1d68e192dd43d43ea190accf3dc9b22e1548b -a8c7d8dc30057bb8ad66b9cfda5e223334407730aeb0f51705922c18e7a07d960c470d463d1781899203e1b1ed1df484 -8d86821d006e957e8544f95a98b110c89941bcc6985562e7a97285f5826b35b690963b2c141ff3f389d92ee18ec76d24 -a4e1108cd3cf01810e74dbbf94340487011b80013b9bfdc04f019188c0d4d077a54b71a3f97a036601aad42a268531e8 -a822cd61db07f64bea00de226102f5fc0adf8fa9f05a6c7478b0ff93e48f6cc3191302d22e1f369b571877d5eb96139c -b1ad4094d0bb4c325dfe072b17711962247dd7ff7e4bce4612e80a6f3c1bde04880ba1682f60d5f1451318afd4d3ba60 -88e7beb0cfd7361288ea27f6b2cb18870e621152ff47994440c18d45284d21bad80d9806ed7d9d392a5cd791d5150ce2 -aad3724a176cf4476595cdfb9e2c3261c37052324c0b5373a30b6cbeb481bccd303720840c49a84ddca916d470eb6929 -a57983370d159e7078a273746fb22468000a6448b1a31d277272e35c6f548f97928e9015f1daf577511bd9cfee165237 -a54136e9db381cdd6dfb3fff8bdec427d4dc1072f914f6fecfec13d7b8f95bb3b5f30ad7677288c008ce134edfb039a7 -a25dfc4019f165db552f769f9c8e94fa7dbbf5c54a9b7cde76629cc08808c1039ecbd916560c2b6307696dd9db87d030 -a917d25328b0754d70f36e795fe928e71ae77e93166c5e4788716c1ef431115c966f2aad0ce016f4bacc2649f7466647 -842ce5e4ad7d8d4b8c58430e97ff40a9fce1f1c65ecba75fed2e215e101d1b2d7ab32c18df38dab722c329ab724e8866 -a8eb2ed2986ff937a26a72699eb3b87ef88119179719ff1335f53094c690020123f27e44fc6b09f7a3874bf739b97629 -96753c1f9c226f626122dad6981e9810a3cf3bbee15cfc88e617cfd42753e34593610861be147a7b8966bcdec55bba8d -94119d31606098f5b129931b51b4b42c4e3513a128b9bfb03cfeee78b77b9909b1c2fcf0a292e49d63bc4e5fe823dfef -a869654f5880d9c21a0af1ff4cfa926e03ec1f2d80fe5524605e04f484e09dc80d6769249f31fd378ff3926ab4cebc69 -b2a539bdd8de4499c5f35cd8824974c2abb1933b3f50d0175dd044563ca829eaa0fc47bdac97eafa98434d1cd05d7c5d -85f53b2bfcde1986ce7279f3a2f5f841f87d75af5d197c897f261d4874bc6868c575ecf7556a32b7b33f7b2795454591 -964f087ed02228b30f401d8aea35c1a7f76698e4075e1bb343398be74c716884e9ca1a31b81566e1ff7513cf76a2f0cd -a1c9d9c9bfbc9c4e281a2953d5991e7b22ff1a32ddaace9e8d9a42e080efb802b853d3276973b5189a5745943c9b4389 -b0c45a9852663a427d7f50c608a6419fbd00f90e8452757a45269d25c0386ec29942f48a34aafc0187ef6020e581d290 -aa3ca7b01862d5d2aea714fa06724b7dda7062b6608605cb712588b2c49fc3c7d89a8799e6e7c31e7a9ef28b1ad4d1f7 -88f5e98ae8c5ae7add42f6d358a35667e590aa80e1869593cbf597d7ee466efa35b429f1836ba2199d8280fe7f60ce3a -8a3bff472e8008f7e50362acc1a0b53c09ac60430942544532722e938470376f0672662261992146765b7c75a380c318 -b9847be7f7aee7532282c279dde928698a892a183ca3047ceda521e9e0a50d96fd3ce59f8e58f31af49508ade6d4ba51 -98065dc23ea3df6d9f8459e81887d88d5752b7e7ba6050ec5c3f0dce93e463e0bf12be3c94ec74c16e2f7ba62e447845 -994aff677b97ee790894dbdb21b1f9210734e008cee2aa2200c8f2579ea650b872f39776a13a8c31e95cc817091bae1c -b292811674e18912ebe79df1af4a132b04ab702c125c039e0213f735f658fafd36c38e5bbd7cad35842576431f5f3630 -96520d750ec10bb10f75019f8f0e4a93ecbc6b678a710d76cd10aa27a6642ad1461bd58fc2aab8e0391b3f788339ed29 -80d478da7fe246ad0e81a00141229e9d91ffb7fd1b29975c8ec358ed5e864e481bf01b927a9ba002c5ec4aa226d0cb57 -ae58049d93a11ae845dc5be2505e95657f83b95d83ff3591a3c565d587157be795ff4481f42d59eda95e6d523444e199 -85f1f5ad988b9f8a7e24b6d6a22b9de9fb3fe408f95711389c444d7ba2243987225b04318aa97a4cde2cb4c30c05508f -922092d0cb828e764ce62f86cbc55c04dce07233cff041888fae48cfe93818780b4aec9b4ff4718275bb2bfa6bd9e9ba -a85ba97125feff0590a05fb78f19a7338639ad1748802918af4d59307bc994536c0ad638b97b9acd26a08b6b4370dfbf -8c46fcaa8d13266d650bd9366180e5ebbfa002c339e4424a030de19ed922e2daa9a353ae54921a42299607ae53feb075 -b8549832230eb1ec6ee3c33c078deb47f556a0907d2a85fde7720391c82d2ed63dd753cf544a6a0a46eed4b8d1ecd9b8 -b7b96f24504c7f8fbed9c1c654a2550feeee068407b809c43f1082c9558c8665806d911d5d244308169d8a531373bf56 -81c483fd9d9ad7af7869d617ac592e7e951e39738da041d8c4110637689108eb29c8acadfc85366c70885cdf77b353c3 -acf33bcfd9080dfdba828727fe36803327a94e8a3ee5b6e445274f0e8267ad3c943994a8dd6d09b8072912b57e1e25b8 -b3475e7456ff96861bc11068198d51b69b899f5ff13022694b501d3adc8bac58a16204b12011d61e880c8459f4badbbb -8ceb9562026aa96d6e786ec2e5cd49200b5b424349a2214cd3ff5c8f1c2bf1b9872480428f5428e45cc61106cbfbd953 -af56f7e482c24a1367fd798201a20c464848ece431f2d8a31a6ef4f9bdbaa50991e748dcb4ef0c08fdac0ef8ddda3b80 -896dae8b12549909d512fd5c02a2f72dde4086aef6c8007ddb26bb04dff51a707ae94ff87e45191fc10339967fa28958 -8ed1c606840e07a2ac6ff16ac6e81ed3e1c90872ababfe68d56ed2dc50d9294579b9c3546dc63292874299a3162d59f9 -b4d7a5c0836e419a46942281ce77d0aade8e39eb1bf1190dd274ca5070898a1c02ad9d165855629d6e1c96df1a6bd5f3 -aebad8939ac117deb28b789d9846c2c80359dc260920ac8408dbae0b6228dbf496dac0023a3b4302bb9a53e8ada18e61 -812d07c74a8650dc3f318c9b2dbf265f181041fb432fee989cedabd44b933dc6590e36c71dcf9dbe7b4bbf74ea0d7c50 -87b131dd3489889e090839c392231e0ee198acac65bb2e9e63e7d6da322391d1685cfc8ba60699308054c4b0fd89c90c -8b12110ece0b99b2e653b4bc840a12bce5b85abf6fb953a2b23483b15b732a0068824f25fcaa100900e742886c7b4a0d -8765fc9b526a98512e5264c877bdca567e32fdcde95cdbcf4f4c88ce8501e1c7fab755f80b87b9b32d86d18856f1d005 -ac806a32a14019337dfdb5f781ecba5cdea8fb69b23e0e57a0f885e0082a9c330ba808621a48e24316604f6c6c550991 -a711970fa40cf067c73e3edee9a111bf00cd927112205e9d36a21897529be9a051be45c336d6b56725dca3aeea0aed15 -908adbc17fc18821f217d46c25656de811d4473779a41eacd70d2a0d7dd3010de4268a562378814e619e13ac594bb0c3 -894251b79be5ae763f44853f6999289b3a9abda64d52797c6c7d6d31ff2a79e9b3906da72f9ebb95b61d6b29479e076f -aadcf11ea15bcb6d979c3ea320cff8dfcc23c5118ed075f35e77f71459b2141253060e3a90839adbcd3d040ad3bdc5e2 -b4e55d7d2eeaaffb0267448ecce0b75166e4805dc0e261eb5634d4a3f3c08964a597302fd8f6b45ec48178619291dadc -a8e2a02c93d6bec7f42f9265269660b4b404940c3e3de9515b4d826ea7e71f18c6f90a71ce3fbe452d0713de73cb391e -8e2467accfe207cb1ba37d60662920f95338ee212927edb706228c25345734217740159310edf17687f58b333754cb65 -90376b88f653381b3bab673c48c2b84fa82a091e18f710a732fef836e0d39043fcd5527aa97a3a385c0a77cf53746993 -b16530e289198c235ab680f86851bcc177f0c16a58483d83a89213077b06d6840600b03834b6b7af0e22b1914f72de43 -8c4fc3854f938ef1c2b5df065e4e75e9f299798afae8205706439491bdf9784c756134922e77af007e349a790afa52b7 -a68aaec4341d29b92b35322f89b1ae3612e7b440c89a86135a07c261dc5799217a651460c92113d099b486817226d8cd -a653f965feefd2df24156478f0cf3755274ca395afb79e8c72d3b6e1d1f5ba7f3e4f9a4c5ee85355de6f3c81935ff579 -aaf6c8d2717b57f6b14e06c742a11a3bc736bfc0327ca4b8a005b6e924f06871141d231737698a9a59286e44f244a168 -8de32e3c104b4278e27aac695d224f134001c3619f15186466c57c0c46f67e2efe537501d0d9f52f4cdbc724a170b92d -8e9b5858b6d4ffe811f6498bd80e454f0d6b345d4729c946626c7cdc196c803a349a14515296aadb7258bb7a5b37e930 -82fc711043aaf1d7a9c712d00eafd816a710f82eb10818ba6af09f591447f36814dbff6e6a1cb2b5c7f16c73930dbbca -b2f0205327fc8ff687f751e7b97788732afaef4fcf51bb17fd7579ed07501915790b70fc36624371fe4fb87a0179d850 -add87d5b1288d30f3449d3ccfa11cba4dc7756d85cee1cb6171b493680a625a01f273d0bb8e6332d0410250036b3acdd -a411f75ef7dd8de8062331ea40929db989e4d65ae8f33d3fa6cc19c98fa8a8ec2b7c7534a5c5eee9e5051626a6a2e47c -89d40a647781e7f2e8ab3a0f7dc7133669944c0cf627376433687a2ea15c137be26f582a6b07ff94b266ac0910009f7c -b2b5f808c26b40ed507922ed119b0fb95e0d6d8b084bbbba58ca456b4354d03110c99989b93207998334ea5d1b70fe49 -8c8db028671969a1e80e595283ce5e678ee955d785043bb5fd39fdb68a00e4c15b462600a7ab1f41486b6883e725894e -958087ce0c75fe77b71770c2f645ef3360c1a9c98637693b988c5f6ce731f72b24ab8b734e8eb6258ee8b23914451f0d -aad6c00df131c1eec6c556bae642e6dcc031e70f63eee18682f711c7b2fcd9afbf1f18cf8a4af562759130add67bd4a3 -b6d23c567291f019cd9008e727704e7e6679b274feb29abba0d92e036f349b1f0fa8c5271ec7384e8d70a2c3977b1f8a -a942c770e903d4150b5684e4b94bb72d0e171df2c7cae6f46e002c41c6b04d774ac6e2753ba8dccdbba3ad1e297a9ae5 -aa542d1849390f86d797408ed7f6a31504aa65d583481a00e475028af20f8b69248a87a8ffab1dace0377db77fe5f9b2 -a1ed3f9564a97f7cabe7c67e018eaeaa42db73a2f3d2332041ca9a7bea57436d848784d6dc402862c22a47f0692b1286 -925c757750c91db8b1b3c220fcbdd80742b4a060abfb0a402071d215c780ef6b420132ec5a43043b9fd7a06bf1b323db -94e575daa7fa0bbb35b4386f510fc3877c9df57bcf15349c5923f30ad6a8df95372835cc078216b41a7192921c1e8973 -9346a41174865d9ab31c7fb9a5329f322bfce06002386d3f5a2e2193de9bfff12bd0bd93307928f7b85e1097b2aaddff -a6e54c9324baa1bff7e9bf39c94fdd308ec6f210aad937112ec727565f8a6141375c04196831873bf506294854f6a20e -98d47b662504f400f1a0e14e24b43829490d022ade02a56288aaf148d466b45d89b5fc146cef67c9ba548cd37ad5e354 -ab690dd59a69904b6b3a4d5a42d17ea4898d9b00c6753aec216d5d4ea564f9a1642697df44d5a62f2c2ab19aaabf1532 -8d0aa8d3c5ec944af49beb99e403cc0d6d1adc6003b960075358a4ff1cbfa02a83d6cb4d848d9e83b34882446a330883 -af9334b7300780c752f32eaa68f3dcecd07dc50d265083f37f9800b02c2595ba24dab89f5fc27c1ecfdbf5291b4d77bc -81c4a6aaf7d4ccee9925c512dae5da6d916a6dd59f7a4cc79d216a91201b4d300114a309e3ddb3291bb95f85bec2a8ea -8c804e810c0785789de26e12b1beff56a163769733be7a31f34f81093782d6410293768a166c9191ef8636fc8724a31e -a91222b48de238f6dfe79c84080cee618611bd0bdca15cfe44474829e42481f8511a82589e69964e19f8cba04e3f5f3f -b26a8885aa594b0c8ad4a1711d80bcf687df996442075dd1497db1b446d16c74e28bc6f0e92b2ecea9c3e15c9c7e828a -85940f45d324ad1d335bd1d7d6f81758f52213e63d5770d9fe0c0c9507d5550795e538b6a2dd463f73d789b5ce377aed -931a277c78082f416880620df3aeb6d0bff2103d19679dd092ea981f5323e438c50a0d094908034ff8a2cb47b1a44108 -88dd85e4e2aa349a757b98661fc00d4538ec1d3f53daf44b16ffcf7f943dd4f2bba5b8ba3b05c529251dfeed73f6f1e9 -b7fd7182cd33639710b8216c54a11bb02e199bbc54fe33492a809dbe17771a685d6238ea3ebcfc75e3b0d4ea5369bc9f -85d77194d910f8cdad7330e1bca9087529a40fece17492f1d17cc4790833891b6d01d24f036b6422175c732b438faeb5 -9845265892d672d9517fbd22f88be4f225711b4abafa8327cc059f000656e4737188506051565d97912a0c19c3d063c0 -90a81987aa841c7f640c298b816643a0ae00cd3609c3a31d0b01245283cc785d9bb27763131b31a4f21aeda4e50073e8 -8b1256eb41a600bda8a06ac08b98a220ebfd52f89a0e4fdce32425db7a0481e9b7873ba3b7a24ad9fb782ee217dfdbf6 -870548998deed85c59507cec7e69cc001c279bb2a99c45a4d030a35c107e69feb76afecb9e435e67965051d6d7a88220 -b1504d194a0dd8df48d431ce991f89d7a0f72f573d21bd5bb46474c5005e43820877a44e62db555f194427ac8a4b9168 -a00d7423ec2cf0c9e9da07f3dae092d09e1ff4be852e07e531aa54d62ad937bfb52c8bf44683ac3a70f6dfc125575da1 -8019625ad3d218018803aacc2efcedba3a41c24aca8c5aab2005556e58fdf2ed614831277df7937aa594e97a2fc65e7d -8595596284f3add0155ecfee3fc0b66a6b6fc7923d82ca8302952e2ed906d119a1c053aed1123b51f73e1d30d93aba57 -a8ba033f5e7d06177e9ae2d99c40ed4e99e14e1c1b61795997f62e21ed8af1531c4720f23d6a39b0f75c6cd91c58c700 -a94f4167c0f6ae214bae75dd92c63299dd954b00b0d8b0416b8af929fe5aec6a259e44f83a183412d7ba4eb3a49728c0 -a73ee3c3a0fd2a369e0a279c3e214fb662d0378eea3c95cfb91412d7213a1f05958bd0de8f2a4f80f9f80d7eef943b41 -8ef6f3e241f6a761c9ab412629a49648c08b70b837c2cd8bea620bc93056ec73754e3e11f0df50f8e9fa67a9867501a9 -80b473ac4ba8cb82b4ae684206cde124d10fcf619f55a6c90d035981e1b08b9e141b4e5fa9a9af0b7f0c281b355dd593 -a566e2be0b41f01978dfffbb32f442b5e6706f5b9901110e645cf390f6a82869e3ca16887ffa35782a004d251d29c26e -a74e01eefa03546d00afdd24bf17015eee95d36de28c03c9b055e062cd5e8d8f20473c6d7ad21c94f9058fc5e84f9628 -acefc74de146911275dfd19bbe43d72729e89e96da04aff58e5fcb90962856c0b24eb13f43e30329f5477a1b65ae9400 -b5f113ef36e75de6d6d44130f38e460ad3ffc65cb9a5606828c4f7617981fecf76f5e862d7626ccb117aa757cc3c3e52 -96d3aeb1d3a66b136244062b891fc7f93ce745b776478d361a375ae57bdba9b4fcb257becbae228c1a3aff4a1c4fb5e2 -ab26c4a110877e5495b674569a32025dad599637b5dafedcfe32f205dfa68cd46f3ddf4f132a8e5765883b5c83214a07 -922a7a738066692193af32ccbab74edef067668ce3253e18a3275afcd5a6df7168deb2f5175c5fb413dc08fdaef63b17 -a47542f8e4a3a35ef6049280d1a9442c920887d5f1a1483149e143ca412318495a36decb804f81c9f5a7672a14965a4c -8fde57991e72a2aebd3376b4d9fdd795943ba3833431e52b136683567e6ee2cc1c1847dc49dc9534983060c54bf22f7e -addb041f01a99e7238ab2f9f2f94579861d0470b93b91cfb29f3a2e4c82386c868b2cfb6f3778b8a9cf908788acafe58 -a8c4e1df726431c43703739776e2cc51f5ebac57051244991baf53582538120133a44ca603d0722a4b5193e1be3c5ec0 -846379125968d1154376c5dc63100bdcd99b9403d182e3566fe48d79099099f51523cd81d21f0d1dcd622b715bdd851a -b828bf0d936d275abb40e3d73ef57fcd7ce97e9af35e194ae61463317bac6c1b0c3e4b40afe08a1061037bb7149108fc -abd07c71754973e698fa26c5019afd9551548f8369e2249b9902513f19a097057ee7065a1d88912e8f52e6e0fbfa6d82 -a9e36b6fcc9a3cc98e76d5751c76c50e1f92b7670f8076ab6ca8a30de4ec14c34669e049fd39bd293cde8789b1ca67f0 -8c060835496a04c7b51790790035862b20547e62fa8bb4e8857fb36891ec6309520af5c0f45d5ea46e3d228747d710a4 -8cc472ec62b8dce244373f40a821db585628989b6a7c4d394edffbc6346c8be455f4528d528fff41f91f2c875bd9fc0f -b4a75571f84f93451f15b3a86479063d7324d2789b6d2f2f4f8af68c66fac32743dc09b51df29608d62aaba78f6904af -916484984743b5ac16d40d0544faf9184819d92f779254b7fb892eb68cefbe59e75be8a6336a585e120f6ccae0a1eeac -b906ae585a73119764024e9eb87d92e53ee0c673474fec43fec4d344a3bbf471ce3976d25e37d197604689bbc944f1ab -8552708487305f16f95db3e01fbbfb969398f5b6d116844cbb000c9befd03f15c767584bf9541a42141949a4dc787a3a -a6025a2773f78c247f78c0d895ade8a6baa76e5499085f6175935d98a05fc41c1359f7843e0c6c323f1be256c45f45e6 -96dac695dd9288aeb6e32dce50e51ddf1fbd41de6146e3605c7a81f2253b17babf2bfda4f5a9d0c28352b9746c0dfa2c -a215b21f8eb2290f9d308278f2859a999eb3a31f4888f84a65f9ed05e1151c17777f91054d4d0de759ac5c3547d91929 -8fd7c9a279e9b619acf927d501b35dc551979731a89eab91d38b2356c0d73569baddacb9d1096d20a75c917ecaedadd6 -b985e8baa5195e2f1ea1091122d55aa321178d597f87b732b23eccb12b891638be1a992305a1ffcf5233af34339fa02c -ae1a9604b7f569aa48d2daa1889e76d3d103065fc8c3deb9ae127a6d94145695cab3bef640fa781612e8082c6d616c47 -a8fc67f9069f753360349eb874fa4dcadb2ec48d97c61abe568faee5f370ec3c87786c7faf0f73fc0ae7181a36eb89ca -a506d13acc3a9f80509fac936aef848cd30698631fff6130ed6217512ed9527d075f653cf6ef91f68e48a24c903eeb3a -a415093755cc012863043bf586b970bafdd87653ad14d1929672e04949bae4a753d16aa3eb5bd1afe3df3691b80f240f -ace3b792a1960580348b6fae8513149242378a18382741bbc2fb2f785cb8bf87550da4b5e0df2955970ab3a31f99f5d7 -a47d7fa7522664c8f9c404c18102f6f13a1db33ba8b0a56faa31a78a3decba3168c68f410115c5d9f240b3dc046dc9b4 -a9c930db3ea948cd2dd6ea9d0f9a465a5018bbaf6e9958013f151f89a3040cc03ae0b8eaf74b0ff96b4e7a6cd8aa5b4f -88abd235e3e760166cdedff4be82cf6ba02d68f51c6d53b1de326769f1f635215890f9a4c35b06dd16a9b93f30f3a471 -8f8d7b2fcdb70bfedde1ffd7f0b94108f0fa432f6ae81097988521dd2c4da928c10c5da3c7f33f11bd5331f2da8ec219 -b7abdbd48cece30d8f795a58a94913d76842cb006892485a9382a0502826538ca4ff951cc1ef4493e45de8571360d20d -b3e7b125f350c52695f7c5ec4a30916ea6c11744f1151a18ea0510e6cf6ed6f6dba4beaa4ca56988d306bd80ec360056 -9a004423c95e1f1714f98fb97ab798d6ab16cb5f6d6cad860635585d4d4b43ffcda63d8e931351189275e5a2cef28c2f -a8eab6ef917cacdc9b1932eb312309e1f85298d63e55ed9c89ab79da99d3eb60f1643d16be920e82d9285f60c7f7cab3 -934df955485113d10c4dde476ec14a98771145aadf3c8b61af26b09b9948757fa1abcc945ac91466a18c18c2fdce40d0 -99ed9146561597cff8add2196ff3a0f161dd5302685ceb846afca6efb5225f642e8f4a0970eecb01cdf18694fa697095 -b37062dd12a81267bbbf89bc9d6e30784c0e11e713cc49c6c96440f800f2a6a2a7e7f6c7f6c9eed4bc3c8890f2787342 -83a3d70055b6044e0207b3ece4da849755ab5798317b36b20c3555a392c27982f811e1c5007697554eeedc737b37f3ef -a85392c07ff8658935fbc52acec7221cd916c5fde8537a8444eefd507220e76f600350ae8f5dc3353911087b88b91045 -b1ea23558ad805dde9cc1eade995cd8e7f46d9afa230908b5fbaaa09f48547f49c2bd277bff8ab176f1c240beedd2b09 -8a16a48b9105d94700e8e5706b8d8a1ed14cffda5558a596974ea3191c5c3449da6e7efe2059e7baf4530a15f175ce16 -ac5fa54381fc565842417558e131df26e9505027759416165035357816a7e1859a7c14c228c79b4e5ba2ef6758e12ad8 -8475e290c399cc9322c05264a516cf766bf5fdb6b9dec7283961da0b99012d499b244b33fc0eaf94b461ab777f2a9537 -a7922f3c70e6857652805af7d435646c66d94eec174be997c4fe973d8f019990c4f757eeb730b2cfdf8154e6e97f7d5b -b90deb797fba3150cf265a23ea6bd49a382855cd4efe171cbcb1664683a9f1687cfcadfdca4e39cd971ec13aa5cdc296 -91ca761dd9659007d2fe8970bbd336c19ed0d2845d0d8aaab397116affcc793de2da73d89e6625cf4dae5983cceffa56 -9121ae9b60323ab1301e97555bcc74ddba0f5b1e62bfe9eaa2c239e1d685c4a614d397b32a59febed4db9968db44f38a -8477b07da4bbfe9087975f30d2c2333fccfcd7149f90e0e6fabecee627eee3ea324df31cf6a680393f5dedf68a35c9de -946a9c0f02fa6bf9f9d4933e7fc691749f4ac2f82a9b880666b5185189d4f3432da9096d0ea4d6baacbc079e19c887ce -b24663332914ea519435874d4c42d11842ea84dd3dc55292d5b0f27f64587848d095bacaec235a37003bdb5185daa6f2 -b980f46f84ac21dea75b4650f9412f6123325842758589a9b47caa68545905061f03fcad23cc102e2ce8ffeb1ae634a8 -90e9ebb060182d3043ea4210a2d934858559522a19eab9f0ff81a367484a05ec7cce78ee6a91dfff96145869db6a4e80 -b04228a009c91847693eab29c9ea71d1d6ba07060bc2b0b3bb81c46a125baecb3e1412f6ce4305076a97d316d14e4665 -8d3268370dbf38d378c7228c7b54e91f90f43cbfddc0d8468de11a4312616ca6372619209b89114152b16f334f4d2780 -964a63ffae653e0249685e227d937937b079ec3da9c977dad2b2e052af5eb560ce7d175941f2ae0df90e3d0a20b77e75 -855604c2910be885b14b27896e16d8dc339236b975398c771d29ac74e4278a2305fcf85203050a8faffddf64ea19cf78 -8e0b1d61a4349411eec77cf3490555843187a25a93e1f45bf66ad3982b9cc141b07805f8cb252b0fcc125e0052a7c450 -a03bc9588f971a1257cd0cfd2ca406c76aaeb634001864b0e4dda91e009d3361b33fc39f34922835031a423a13619a82 -b703fa855c2c4e1641d2687717fe8c5061acab71cd2dab55cdb069a6865464c3080f7936ddfd320516b6791b36c64b8c -aad1cfa7295e463fc3d5374ea4b952020010d67a77c7a86fe2c351a5959cd50df6a0045ad588257567a99bfd0e9400b3 -97906fb82abf5c1d9be8f72add8e6f175a6a5a4300b40295cb5ec8527cc7ec700fa03a7a494122d9605d212457452e41 -a83366cf93ad9a07f617e4002a10b624270f60083559b045ab5a805aaa592ac37b90c1e8b5437158f3bd942cf33bb633 -a585168e157e111bfa329d0ed6651a96509b20b30f6bb0691c6a5875d134d4a284867ab52511cdc19e360d10638e58a1 -b17d480a0b39f2487b7f3878714658fda82f2147c5ecbccd4004eb92d267c4663b42c93bafb95ce24e2f2f0a9ea14b8f -9362297a1a3951d92db4fd8ea6b48c403d6d8d2f7e7b6310b9cf9b4e4ba9e84cfe1ae025830aab9466c32fd659144474 -b1a62fbadfd4ea4909d8d0714c1e3ee9f95237fde20720f88d5ad25c274a6792158b99966d7b93151f769c832b6a132b -8d9af736949a33fe929548abe72384281365385862821a584f5198eed63bc5388f89fc574cda35a9eaabed0d336b86b6 -90ee2235f4ec2c6089b5cb7b8a41c9bc39e4a57935022ef28bed490e2ab12680922af7395bda4f708809e2bfc62192c9 -91f3a123d420bca34d3d751119bbebc435630c6605fb59a8d80d16a4895972e56cfe4cf1998e0a527c18ee38c2796617 -a2c4fbb20e7fbaae103b86ca9d8dbc2828e6bf33d1d7ce153bd98e8880fe7ac62abbf7059194b1eee64f4526a36c63a9 -91a7f93310ac74f385f11509f4bea9a4d74f2ce91cf2024fee32a4a44d5e636a73339c6b4027ee4d014a24b90de41ecb -914a6d405fee0a15e99704efb93fd240105572335f418d95e1f2de9afeb97f5f4b80aaf20bd5bf150b9da9abc2b6d6a5 -9462cf2c7e57e224389269b9fdddc593b31e1b72ab5389346aa9759fad5d218039a4a5bc496f4bf7982481bc0086292a -b7596132d972e15dc24f2cd0cf55ee4a6cc3f5a0e66dff33021a95e5a742889e811afd1dc0cd465cee6336ad96f25162 -99409bba2548f4ece04751308f815ecee71222869d8548fa142788fb19df5366d093a5131e57560237471bbd5279bbe5 -8e7560988a844b5b844ad460b19c452a5a04346d8c51ca20d3b144a3670ecc60c064b2415c2eeebf140d6ae4ba5c5360 -8cd9e18d311e178e00eb81ca839cfaa8e64e50a197de8461f07135fca28c1d895dd9c2401b923a4175ff711853497317 -91ebf99c95e8f653402b3079ecbd533ed7cd3b6c857a710142354ce8330cebdee7cf0fd0400417883b66055bec9d0552 -a9d0cf8cc6bbdc44426dcb716df667826426b4559056d73738bf3eaa6df373403861b6bbd6fa0454b1d2730e3b0015c4 -928320b452ef21d2443dee360110550f531d7a4275b2cb227814150f3e9e360e05a884d6e3bc4415f202120ea5ac333e -b9551f2b2e7bb984618f2e7467e33b5b5303b8707f503f2e696e49c2990ea760c31e0944d52257c7a38b553a67cf621c -b2ec34126fe61345e5c6361fe55b8fb3218cdcc9103bba5b200252d50b758153cd549226b7aabedd265906401e755190 -a8cf814926082a96a921d471036a9919a58e68d02ee671c215ea304759cd92a7c2c9ccebdd5e9ec5572164ad2abb22ad -8c0563c28c261bbe9a1ec4986f8b277324bf05b4fe5e2b79a862168e646bbea50ce7c4622b2aa7ca899c1a728c226d24 -b558cdc334ea894d3a13347ea9e30f78a0a20621903d6c009c54feceba3ba81d2445a43572e088ae691f65489702e963 -a62ba0b20f46c367cfd409beb300e39f1a6cd5be95e63457b6ad3cb66374aed754fd037b8e4215d651a7d8e1a442f762 -8543e2c6135df471bd7a5c09f1313674c7f6847cb88f15eabf40b2bc9535d0ec606725b97103334a0c162a20d9f5bb53 -8c0367d7058d63b425450f8ee9252e64234c0c2e61878c7c2d4b17bab22a72f40c75ac3bf8b64f264c00d9c5963af041 -acb7207445993d563f1b6e7b179bbd6e87044399f80e6d15980acf7aaccb9d85071fecb22250afb3aba850712fbda240 -b93725e66184bb03f0ab4078c737a7fb2b10294a3a09995958de3dcf5316b476ce9b5cd8d180017196d9482abdfcab88 -afcb52bb7b8f45a945299da6fc6a877ba9f69f7f23d5f94b5f5d9a04c3cf3089333bbd50fc305e3907825003da73b9f6 -961de781cb238cef52d43bc0dc7d8e3a75bca4c27ab37a2e9353137a9aa9403444a5841b595adeca75a3de5485ab97f6 -9408c828d3ed6df40cc167d72ca9882a9c9cf8e765d6f9125e02e0d66ee0ac94f449803afb50bf1b92176feae92473d6 -a85480591e7e033b9087fd0efe5cf3c88c10a75de4a5d7da4443df1cc1fa1aa59b6cde3ce7453fcabe555495e49ef6f7 -a2611bd82344bc5d70d7e6cf3f0d25866b9f709ac4bf6f75d1006da2a11e2cd07a4c0ac71505e5062a04f71db7a3063b -ac466aaa96febb5b810ba350c7a874797ce4bd6c9585f6b9d114d646894a67c9af9526ade4f7ec834d3a69e18ab643af -b73fc98a79fe77cdbc524c76a09cb9f2d5f8b0a5508846bed1ba5ea9ae3bb62120e01d3b8fb544d90ac9ae0c3d4ccefe -aed333c3403adc899a870082f70aadc770c9f880dc057f05a46d7400be9d893354121a0a31e5475898f437bf722eefcf -97f02133c72187178a8c48db26031f0b2c0317a6648d2be5f7450f00c37391cec935bea46b8144ec9fea5327ee959f27 -940b582b41f1d0f09f0c5f51bab471e4eb143e91b1e96dde83e94650421d51f9c9baec10cc802fb83cd63b56d0b907c0 -b1286a55a74a88a75da47671994916be428be1ca3f42783e497d6478eaa6aca69d50a421b210e9ed3283d578b651b8cf -97cd4e87e21c71d11f1df1c0b6518c00e1610661be4b13cdbdbb026d60fc3f4a2b8549326a648b3fdecb7de8f6aa9fb7 -8f36bbcccee986c35328633bf6ee8f70b5dbf42d0f677c0f4e009d2289976e512af6af91a6ddcd87dc0df93bc4ecd02d -9253ad44ad182e67ab574d718733a69c05cd5bcc43e6292ef0519a9430460aa6a233fe26269da7298ea88cf406e733c0 -b616b5ea74db0dcf8f10a2db79df6ec3566c06410f68a933eff150194608c591b2b175908d4b4ccaef1018b0fefc5693 -80a712ba89394381cbb83fedcaae914cc4f21ab024b8da8a7bbad7762a22f82940451427b1a3f5d84c246d5ba0c7ccc7 -a806909a5517a970879143ad789c6cb6256b82553b649f6865cdafbbc050b1f86528241b3cb600e784186e1a672b588f -b6ae801d1f0e4adf3ce57659d7c61f94abd3c8d1635ad28133a79eff0586fc48bdc195615335449e9bfee39e8a955eb2 -b8a000561211844bef72adf3413f3b438a8789fcddf6676402ca6a1c2c63b9deed322030de2ae3a0aeb3cedbb89406c3 -8bc3615b28e33fc24a7c989f8b4f719c914c4c65b35ad3d4cf15e2196e37c62e42ca34e8b1275e0f32589b969bdfc21b -b2f9637f370a79e7591e5056dac004f56b375f33645ae9f5a192cc6b7b6b3d8a1105cc00f10d8bc8ef250ecc2ac63c39 -b51899978b9c5b737999fee1935a5b0944261e7005bea411b5903d2c16ea045a3b0bcd69395b6733752caed43bc4e343 -873c71a01009dddb9885c48658f83aa6320e74bc152e09de8b631c763c2b4e2e8cbac921418a0d9085ff5c53a2b52d39 -96470f48efd7d2ac2daea8753ef097c09c6fc128a54cc7ef758ff07e32c0b0ac7d122f97b53e88a29cc26874dfee5e0d -8dd2decbd3504b7961d65edb8d51b96377f4edd2e0d2cd8a4d98333f373c79a8d7ca8f8408718d0e7b5e48255857c339 -b536ae387bdd0f6e40850c71fcaecb1051b2c8f7bf5cf92c6bda030de72a03e9212d00390c53a72a08e9fb2bff1249c0 -b1566076f59064e3545adef74fd1acadc1bee0ae23543c30caf9e1ad1fc20ebe84ee25004c612525b26857253f5345b7 -afd180e25444cb720342923b8897d38a6537bc33a0ca1fc9c6e4d524b280193618f19e2bcfbd07606b78b734fe6114ed -89b2a6c8811e5a6d07aa74c79dd854bdfc292cc104b525bc37e4c7c1f9485e19d759c8e27cd7cd73c46346f56ce3b189 -8234196e196898b2501b79d0dc016f6df3d5878952cdb8a93735e4ce2ecf77d07924c701e084533a20f0c50a7d1ee376 -adea7ce2efc77711f50138691ef1a2b946aaba08e7e3b21378708dd5a10bae933ed121e71834b43b14e2ea30a7b306e8 -a566d406a35fae703b3d1ea1791d9207116002e5ee008d01e053a1ea4fe5af2feb63605b011ae6a14414028aa054b861 -b83bbb063682386456719179b6f6bbc8cf6f791229600b7d402167737492f99437b45886695b26a28731e952e56f1ee1 -a8f5fffc2c335d3ad5c7593e81f0862351413cc348392afa86d50921dabb929a5a1de20d604666af9e17a13bbc30bc3b -8d5dcdc1335f01847f6ef650ff64b26e7c4cecb934a7bbce11254e8ced9fa9e4fc87eec55248f69bf499180101c63f5a -83fec30b8bc62f9fc28301a03ef18158d6364738f1c42de311bbfba2e62b25d4c9ea9d6097698b24c84fff956a6748b9 -96394fbe0c2d03cdaa56e13326aeb62344238ad3043ee2fb4f18ebf0a6f7f090f410032a2d15bfbeca9449202d59f2a0 -94880f5928fe71a797362a37d05849d23e118742697f75bc87173a777e7b9d4383b8796a8a2bbee27fb781f363301dfe -af229535896ab86fdf6d2ae676a0dbf44f868f6c7f17bd9a65567631c7aa2e29758f41de050ca5311bd1528bcc811532 -8d4fa4968575b483b3ac16345e7f1ea3f81e8dad72c945a48b7b982054fe1030584be2f89b2f53af84d2490cda551b84 -8052aeb115e4d242078c8726d376a13156cc832705243f14adaa3ef3889e1f2fcdfd46e087acab6fa85a74afde5f5eef -a1349c8a22788a1937a837fceecfaada9e93a63e582a09c56b53da52c9db1600254dc85f63f5eadfa30b89b31dcbdb30 -a10178cdb263ff1a5e0cc034b6deaa160d00c3c3fe1fd1ff0c55fdf1ecb83d771070c10930f88832b75fef39a10024ea -938b17e4405934ea5ef29c2187d6787c5ff5d8c9a02665efb453117d462dbc50ef2c202cbc884305cd807a70b5cc177b -84f01f0da6b58c71788616be71fb3c259ceea7f8bd131a5661c5c03d0205feaff6dac2915919347b0559c381477b3d89 -98787f0a2fac2b04bb7aa247ac77236bbe690aae64203e553be328a2c3bffb772e7a0244e585d27558cc64b089a5ee11 -a14501d8b6b3a84b13b9006d521667e8d168f642ebf154c4e90ec8c75d11985fd0c9d86fc2efa6c7077dafecfdf0ab13 -8215dee75eed04de83a3e910129bee8c48ce01cf1317ea477ff35c09a6f9e9771a8b05aa79e6b0f3e71b9874695e7a2a -85763c3072c7400a2c5668ef5cc53e6f4b8dff474146028a8be370ca9d8af9bf9ee10cd7d23d33eb6d6e257dd3af38d6 -91bf62245c5a59d514d39bfb74db7f72ca7160c1c5d5be3844fff37e53e99d451e18a6747c65e33f98f48a55f38962c6 -8c68817c6a6ea348d9aedce99929371c440fbad72718c2d239ffcaebb26ecc8a4e8c38c2819d945fdb7f02ffda70a5e0 -a96ce2745866a22267a49faa7ea00ebf009ea8d0b0ca2c233c62759b9d5514306b5822dd2eee0124c9e28380e2f97aa4 -8b18d5757c73843dcd55f0f0dc894bcd17e0ecf4c9fd901eacd38480844a15b4ce5e9598ccee039f9d93185137630cdb -a5b45c403b6735aaae14389bcee23ca10571f5437f1f5ab0c2b4e573dfd3341c638fff2cc780166af96b118d47ff2299 -ac849a0ccd354dd46bf55ea837d509b4ae3eefcbd5b8eb2582d301fd56c27b89950c6eefdd4e98e608ef4a6b75251311 -89f13ac14bb064e9c6b49a482831ecea6344faec490bd18bb44028b83a0f22e21145861558029bd172ba7c5247c2cba7 -aa57b057a2ac32c101e442c33831630c81b2e061a542e3e1d6897b2b7ca8a7241ef717a548b3f751d60d89be384ba5da -8a43db4e12682b98230364f25c75b49002f5002bd72a1674cf2a9d53197b5ef1b95e48429af98af503b0d5c3e0e017b2 -a10cd7b8e1574d78c4e917cf833d3d845b878e8e8b60312e6a994bd4f391a5e8c38dcd774087b93c9241238f43f80937 -8b61ccb949088286216cd628811df1a362a7f5c333654ce823e63ebd04b069d5b0f627fb6c96d54c7b853de8aab05472 -887b902020ad45f70f2d5bcfa7324fcbe7be09fd2b1bd40f9ae43a89d487986e89867aee0945ea6a0fe8dfd051ffec56 -822fcd260a7876cad31f54987053aab06108de336878b91b7a15d35013d6d4d6de2d4b30397bb6f1d5c1a7b48e9d1ced -80b89ff95d725858b50e84d825ea99fb6a8866f10b91a5d364671ccbb89cb292bada9537c30dbde56b989c8bdc355baa -b53cab156006c3a1766a57dd8013f4563a2e8250995dbeda99c5286a447618e8ac33ebf25704b9245266e009a0712dc5 -b6e2da9c1156e68c15861a05cd572976b21773e60fc5f2f58c93f3e19c73ad6c2ee3239e6cb4654040c8e15df75a505d -8b7e187d473a0bd0b493adcdb91ca07c9310fd915dec46c2c9f36a5144eb7425dd35dfa50feb0e9ef747caed9f199944 -9743ec3917e953e0a420406b53f4daa433adf4ad686207e9f296e7c83d1ffdbf81191b920ba635c85416e580178c16ff -98d1476fd4504a347c5261012298ca69c8593fec91919d37ddfdf84155b6f1c600cd8dbb92b93f3262da16cf40a0b3c6 -94f50d52982a3c81ac47a7b3032dad505b4e556804f8606d63d821f2c1a4830917614630d943642ba375b30409546385 -b5c0eb5f4cf3f719be1a9ad0103349269e8b798dbffe1b5b132370b9de1188a6d71dcbc3635dfdb4b888400f790b6ea4 -b47fb45ec73392598866d27994c2feb0b0f3d7fc54303a2090757a64b6426d183ae41af16794ced349ede98b9b3fd48c -b5f45fd0aee6194dd207e11881694191e7538b830bfe10a9666493ae8b971d65bc72214a4d483de17c2530d24687d666 -a50c149ea189387740d717290064a776e2af277deafcf5f0115bbbdc73c0840d630965a4e0214b738d1cb0d75737e822 -b941afc772043928c62e5dbe5aa563fa29882bff9b5811673f72286ac04fddf9a9ed0f9faf348268fa593a57bc00ba6b -839051a7838937270bdf2f8990fd9aa7d72bfc86cffe0b057aa8eca7393abf16b70d71a6470d877f8ec6771efa5a8f26 -835bc9d049418ab24dd1cbf76ed5811381e2f0b04035f15943327771f574f723b07c2b61a67a6f9ddc1a6a20b01f990d -8935cf5634d6ae7b21c797a7d56675e50f9d50240cb2461056632420f7f466fdcd944a777437dcb3342841ad4c3834bf -b5698fe3da1f9d1e176c9919fddd0d4d7376106774aa23a7a699f631566318d59b74ae8c033eba04d06f8cdcb4edbbed -ad11421ba75d74c600e220f4bce2ca7eacb28e082b993b4368d91218e7b96029acfbdf15a2ab0b8133b7c8027b3c785b -886ef813644599051dafdaa65363795cf34a3009933c469bd66a676fdd47fc0d590c401cc2686d1ba61fce0f693426d4 -8858fdf3e98e36d644257ab6076f7956f2e7eacc8530ec1da7f3e9001036cba7a0855fb5011925cdc95a69600de58b2d -b59eca7085a2f6dfeaa6a414b5216ff0160fbea28c0e2ad4f4ffd3d388e1cc2c23a32dbe517648221b75a92500af85e3 -abec62d259bcd65b31892badad4ac8d2088366d9591cd0dab408a9b70ad517db39c2ef5df52348ba4334dce06a4e3ba5 -a9acfe8f5a310779509621ed2946166ffb6168e68ecf6d5a3b2f6008df1728c8fceb811636c50d2e419b642a848a9ca9 -9929bb1a3537362848fac3f1bcb7cfb503dac0a0b1bebbfd6ddf14c9a73731e2248cbaf0fbb16c7d9c40cc6737c3a555 -981d06c7431e6f4654e32f1c5b27e7be89e7c38d59c4e2a872a0f0934cb852c6aeff2d2eaee8302131795590b8913f5e -a6ba9dd43354320f65fd5cdd5446cfa40080bcf3ef4a083a76ad4e6a609b0b088bcf26c4957bfab829dca6064410ca5f -9367ef28def311c79adfd87e617651fcc41ad8caf047d73ce9a1f327e8871e9b35d5b203fd0c0138e32e2ef91e20ba62 -855d1bb508a9036f42116c8bbb830c576189798baee27c7c3477ef1b1fc5d7b0c2c7203457f1eb48d4b029dd6f646be2 -8539a5d0528d3d601083e162b34cb33b5bf6736b4feeeab4941f10eea127c56b7e0b8d57f34b72f8f674d89c10bf302c -a3b71a9a9ac2dfcd681bfd8f6a5d9abf5df6950821705bdfb19db25f80d9b8a89fac7a922541cc681325679c629743d2 -8e95929dfd4e5b56e5a8882aad6b7e783337e39055a228b36022646a13a853d574603de5fed12b6c1f2585621ead7afd -8b05c885575d6894cb67ba737db5915639a6f281bf249480df444ff9f02724e28ed7371ee7ec26d50d25f3966010f763 -90f1a45de0cc0641181d54ee86630b5d182d24e7c30c2615803f16de90ec7c982a00b21f250ccebc2e94ef53a13e77e6 -90f0e97a132092e51a4521c2ecaaa47e4e4f319e67a3cdbd00ed85c2f10dfb69c339bc9498e2abbffcd54b1fdc509a20 -a9995234520cab9d1bdec1897b0b67571b718d5021c0fcf913140206b50ab515273b5f8a77e88fe96f718c80dd9be048 -aebc6495d54d0e45a3c74388891dbcfab767f574fed0581566415af872dc5b3bd5d808c44f6e1fbdde7aa9ffd260b035 -ae757f8f4b1000a623a7d8e337a50c3681544520683207e09d05e08a6f39384b7aaadf72018e88b401e4a7bb636f6483 -a626a28d5ce144cc0c6a30b90ec2c1412cbbc464ee96ac49035e5b3a37bb3e4ed74e8934c489b4563f2f7db1caf8b2ad -8c994e81dfd7a5c2f9d4425636611d5dd72d0b091a5862f8bec609d0cdd3c423eb95b0c999c48faa5dbb31e510c22b61 -a1c0e59e076b908de760d9becff24883c6eb9f968eac356e719c75cce481f2f7bcb1a41ed983a00c1a3b9369a7ff18f9 -8d7e199044fe2e552bc514668fe8171c3416515f7a5019f239c0384f0ade349e88df26cd30f6b67d02b83bf005d85de8 -80190f2255199be690fb502d02ed159aa568c390a684f7840512efc3d2a62f28a49d5d1928ad99a5f975ad81a245acd5 -889d84cefef33f5714e14d558f41d406072ba66b427bf27918b669c5be46261c3de0139610a2c2eadef8e6508e937bcb -a480a686d5085b854ccf9e261e7f1f2d40d978fc30b62b1a8fa9561127745529405820df21a680ee2258b8cefa5f0201 -ae6243400d416a8c13b80b6637726959ef07b8d9b6aff2bd3bb23aaaf97337c7a6b466c5db617bf2798e01d4ccc68e4d -85e0ff143657e465f3d934ee781de5cbd2bfd24f2fbbe6d65c698cdd93204a845f6ef1fa8941c2578463a06a8a418481 -8f4f8b45f1a9f6c2a711776db70f20149dd6d0e28d125906ba9893c5e74e31c195b0906f04c922c8b556ced7cd3d611d -877b852c33483b25c4cd8da74b6b589d8aa96e217c3c4d813466c77ef83af95a94a47364aa8421f0396ce631ad87d543 -852cb06bc4222ce125287a7a55a79ad0bf55596f26830dd6d79da3c60f80e3ba7b9a9b42b126dcb99d2cb9ce142783ef -810cd64c1dfce85d509eeb57a5c84efafe1d671454ef601a040de8d46fb33bc419577f6a6c404e28ffdfe315ffec558a -b60ff8bc804d101a32079b8ed52285fdbb47fd60c3c15cef17cfe7f6b0567de6b50128b9dbc49a1d9811b62b22c99143 -a9df7068b26a6a58f7a499e67b17d34f2a2e8e5029c6e51e2b4c0d19324fb5cd9734c4c4d5034e1bfc274cd0c74a82d0 -ad93c50802ded1e21217a58b874c074ea52322492d589820691572084d8edaede8c2ce8021c6df8c0060f395f3c25ee8 -a17b98e090f7ef5800477132b436c1fccc1802f34956711bfc176e36890c7df95a108e03f34659142434cbd8aee9dccd -acb14aea5575c293dc0a2b58c5350390801d57e9bcda876d87c56565043ddde1a544a88b48ad0d8ec3d41f690aef801e -88b8e26cbc83faa053fa247e26c95d1bbb77955b336e1b0e41d080633248238de8adc9b98688c98fdfc67e7286bc5be4 -899f69823cf1b2204c8da91bb4f943c04d943137b08b1c46e160919e3378bd22a666a079a66e63d81c05336c742efdd2 -8d7ffbc0b47a32408c9e88676ac4f87683cf37c37d214163ca630aec2d3cc014d88caff35022ff3b6d036eb8343d52a3 -b7760f27db0704a6742855998a0c31333bb34d60ddebc95588e25b72445ae2030427aab088ec023f94563118980f3b74 -ad06ecc0f3745861c266bf93f00b30d41ed89d41e99ab63fedd795c970d3ad40560e57ab7333883a72e5575a059df39c -8687d28b1cbc8aa34a0e5dbdb540a517da9bda36160daaa7801fce99754f5d16eda3bc8e1df6b0722cfb49e177e9bcb6 -a38332c3ebbd7f734c8e6ab23ae9756f47afbf7d1786fe45daebc8d7d005d6d8fd22f5dbd0fa8741e1bfb2014d3f9df7 -b86f84426dee88188be9c5cc10a41599e53b7733ba6f2402392b0ea985effc7525756ca1b7b92041ae323337618b238f -958731a6f1881f652d340832728bc7fadd1acebd8daebd772b5acea634e9f7b7254b76d38a7065ea1b2cdea83b18a54f -adb90bff1f0d7d45b8ba28b536c0e0f7f4dc4b9a0354692ecf29539631d7a57d308db3e438e0f907810234c490b42153 -a5188c775ad76617d3bb6e7f1f3b2449f48b7bb7a84035c316284396529564a227e3b9762a89c7114fa47b3ca7ba418a -a3826ef63c98793a5c8c5d5159e2e00cc85fb5e5124f06421b165de68c9495e93c2f23cd446adf6e6528967aa3ed3909 -80eab97de89f3824ace5565b540b229adcc6ef9d2940e90de185af309234cd8aa4ae9c7ce1b409b3898c8fd10c8c2896 -8824f5acd4c2330c459fdb9ece9313263a8b20419f50f8d49958dc21754c21a77bcf7fbf3e0041f78d8fb667a3342188 -95091cf06911a997a09b643326c2fadbbe302555ab2521db806a762a5f4492636507ca71d7a093840236ac3c096614f7 -a392c81a546196d7e78b61f3ceaadfb2771d09fe43f862c0af65f5e55ce490a0293b9ab754cb5ab03ff642a9a8213a23 -afd76cce1dfa2c9e4af4f840376674f090af37d8c6541824963373f97b9dd1f405c50b2ff56165e1d4dde760e590738a -8fc4f513d3b40c10872603e1c29a4b2cf4c99320962644ce89f69ffb57f844344e1d472b2d43559119bdfb5a2c21749a -9951ca8e13b9a2b4a789e851c04c4f030470772da62f101074ef304612e9653b43b37d2c081b5d0a09196b3a167f5871 -b4f16fc2a113403ab5fc1b6a9afddec77be7406413b70ee126f0e84796168a572940550d61e443e5635591d4b6c46ca9 -8d71452cf39e7345c7298d514b9638a5cbe78af7652f0286d42632c5c6d7953ed284551fb40c77569a7721413cdbf79c -953625b58d52a308cb00ad87c44a3fd936786ada44000d45bb609ea9db6b156a0d0f9475e13ee5e053eaded19a09990a -a0983a3baa278ad5f5de734eb1b65a04f668408994e396fb0b054991ad2e56e27ac522b04fe37c9583b754e344f795b3 -8eaa454257f77a6754b2c1c5ff0036fa5b03e214576fabc657902c737fcbf298b1795b43c5006e18894f951f5f7cd203 -90183fdeae2ce2a295a567fa61b997b1f975d1be7b03d0101728cd707bb2a7111c222588ab22e573518fa1ef03719f54 -8abec7f31f6b897a1d497368a42733a6bd14ffbb8b21d3e49fc4cd3c802da70e8886827c1aea0b18d1b44635f81ec461 -a6d1e6fd24b0878ff264b725662e489451c590b2aadaf357d64210a3701fe763f529826fa6e0555267c1f5ecc2c52c05 -8fe6d2a4ea0d91702cb2a8a1d802f5598f26d892f1a929ff056d2b928821e4b172c1c1c0505aa245813fe67074cf9834 -82a026a408003583036f16268113ca6067ce13e89c6e9af0a760f4b2481851c62fadeeef0d361f51dcd9fa5674ec5750 -a489a574b862d4056091ef630e089c163c16c2f104d95eb79a27ae1e898b26d6c1adc23edc1490f73bb545d3a6e3b348 -939d85148547fc7b9894497841bd4430bc670bb670f0efeac424b529a9aebf2c02ac18a9d1402a12e4e590d623de09f0 -a3ab52cf911a2ba7fb0cd242d7778ec0d4fa382960c9bd5b476bb1cd44ff1430a3871bbbcea0a0db2630c39ee639fd1e -b7629509d8c3a3b88b31f1af137a25c38f536284f11a5bbbe0d05b86a86bc92ebbf70f17c256dc8b0d48374e1985e6f3 -8a8647ff33e0747dd6c6ceddcf7938a542656174a08a31b08337ea49b08d814e75f8363fb51676a2cd2746569e3bc14e -a7a7f8d94d32b7cee00b3ff272d644b8dca86b8da38c726f632c2bcdfa0afb13fd0a9a5685ddaeb6073df4d9cfa3d878 -b7136eea8d05bfee2265b0e9addb4bdf060270894de30d593627891584b9446b363973de334b6105e0495cf8cb98e8f7 -a9fcd33ea59315ad7611a3e87e8d1fd6730c8cbeeaebd254e4d59ed7d92c97670303a2d22e881ab16c58779331837529 -965fd41741a0d898c2f2048945b2aefc49c735228c25deaf17fed82c4d52cf3f8e93b3fb8825ade632dc4940311b1542 -b9f400a2c7ca7da8b36470ee5d26c672b529b98e6582012cbfc2a3c24b72e73f5633de4265c417c0d47c474155a603c6 -85f333b0b1630a688a385f48bf0175cd13ecdd92fa5499494f4ad5aea0ef1b9d180fad8f936018538d842630ff72884c -8da95a735a1a98ed8e563099bd87d13a237dd7ec6880cfac56c6416b001e983a56f3d72dda7f68684bb33e4f64cadd30 -a29b66a2095e1acce751f6aec8dfeae1e5b24187dfedb5d1635ca8deae19b580ef09329a18b3385ebb117cd71671f4dd -b001deeeaf5eaf99ac558c60677b667b9f3d57cf43a2c4d57fd74b125a6da72ea6c9dc81b110655e0df01ca7b8a7a7ed -912e11dfff77c778969836d5029747b494dd81d9f965f8be2c9db9e8b08f53858eface81862c3ee6a9aa10993d0d23f3 -ac166a00e9793cf86753aa002ca274cb6f62328869fe920f5632a69a5d30d8d3ce3f0c5487cb354165763ca41d83495a -b74df519ae1a8faeff2ccd29892886b327c7434360ab5c5355752667069a77d466a48cb57b1950d10b6c47c88b2a8538 -8751679aeffa39da55f2c2a668f7b26fb8258f70c5454b13e2483e3ad452f3ac7cc4fa075783e72b4a121cd69936c176 -ae0cc16848b8bf8fffbb44047d6f1d32b52b19d3551d443a39fb25976a89d1a5d2909a4fc42ee81a98ad09d896bd90a9 -a0c8acd6a2f0d4ab0e0a680fa4a67b076bbbf42b9ec512eb04be05fb2625f6d2ed7b4349eebe61eb9f7bd4f85e9de7fa -85c629ce0deeb75c18a3b1b4e14577b5666cf25453a89d27f1029a2984133a2b8e7766597e2ff9ee26a65649b816b650 -938dbb477840d3ed27f903d09fd9959f6fec443fbc93324bc28300dd29e602bd3861fd29508da0dfdbb0fff7f09c5a6c -a7c76cd4a42ab7904d036fe6637471d9836ad15d0d26a07b1803b7fb8988b8c9edf522e0d337a1852131d0f658565ae7 -838a30260cf341ae0cd7a9df84cbc36354c6bc7b8f50c95d154453c9e8ec5435d5f9b23de2a5d91b55adde3dbdb755b9 -8f870b1f798c0516b679273c583c266c2020b8dea7e68be4b0628b85059d49e5a680709c3d6caabe767a0f03975c4626 -89bad0b6499d671b362ae898fee34ad285aa8c77d33ca1d66e8f85b5d637bbd7ae2145caae7d9f47e94c25e9d16b8c4f -af963d3dd3d983864c54b0ed1429c52b466383f07a1504215bbf998c071a099a3a1deb08d94b54630ac76d1d40cfc3da -b5686de207c3d60d4dcfe6a109c0b2f343ed1eb785941301b827b8c07a8f1311e481a56a4baab88edb3ddc4dace6a66a -95e5978739a3e875e76d927f7c68bdf7ab20966db9fa8859f46a837760dfe529afa9a371a184dfb89d2962c95d5fcf3b -96d2855e20c37ed7bd7f736e11cfba5f61bb78a68303a7ced418c4c29a889a4798c5680be721a46d548d63525637e6b0 -b134bceb776cd5866e911f8e96016704c9a3caeadcabd7c0f37204497d789bc949e41b93e4c2d597e4c924853f1b21e3 -a1949ff397013acde0303e5d64432bf6dd7f01caa03c5fc38e7c8ae705b9d5c2646b4b02d013004e5eb58e344703260c -8036a5f79d8aeb6df4810974cf8dbd0ac778906d2f82b969ac9dcfbe7ece832a7e8aad08a4dc520f7abeb24b1610ae84 -982b6b0af8602a992c389232b525d4239edc3ae6ceea77d7729d1fffc829664dd647ff91c4cb9c7f7c25cea507f03167 -b34c7d24fa56ab6acdb8af5b4fa694a1985a1741cc53a2b0c5833611e8ed6fb3b663a4d9a126bb4a1a469f2072199d66 -8166366fec4ee2b3eda097dc200cdfa0533a742dfbe7082dfa14c1c1ecafc9d9fa71f518476634f29d06430869bd5e02 -86c0251ac00b8200618c8b7ce696d1e88c587f91e38580b2d6ae48a3ef904e0ba1b20b7f432719ca40e7995f2281a696 -afd89f3bc7843a1e45ac961e49c1971114c5238d9e21647804b1852b8f476a89c12d1edfb97fff71445e879d6bfd3b70 -911d8bec4d4c3e73a2c35469b2167569f59705404425bd95440408fb788e122f96e9b1bd695f35c6b090f10135b20cd3 -b3f6350ff7afaa0660f9dddd9559db7f164e89351a743fc695d987c88f89fc29136e3c5eb81963edabf2b6f2057120be -a371229680d1468777862e9c0e864156f9cd7c12ce7313a8de67b7bd34e3d1b6fa45ce891a81f8316f4afcbdecf3b6ca -a6a9a875ef9efe8ba72523e645b5773aa62c4fb41efd23da3fa38105472308b8d293be766342ee0a2f00758825bd3b6a -a840d495a184f4499b944ee08f07193a1e1bb8ab21f8ce7aa51d03bd8643f2bc2616c17b68d3fe7c0fb364136926a166 -b55200ae7d6ebb0b04b748051c5907293184b126cf8a1c2f357e024f1a63220b573e2875df83d9b5e0c6e2ace9300c40 -b1e0870f2e3719f42a48256ee58cc27f613308680f2d3645c0f6db0187042dddcfed0cb545423a1a0b851b3a16146d70 -b43a22ff3f838ad43786dc120b7f89a399ed432c7d3aa4e2062ad4152021b6fa01d41b7698da596d6452570c49a62062 -88b1dc50873564560affaa277b1c9d955aebdcdd4117dab1973306893b0e3f090899210102e7e1eef6f7cdf2f4e0e5db -9223c6246aa320b1b36eb1e28b5f9ccc2977e847850964f9762c7559da9546e508503050e5566ccb67262d570162b7a3 -aeeed21b932752709f43dc0c2c7d27d20263b96a54175dd675677a40a093f02bba80e2e65afe3eb22732a7617bf4ff9d -b47cae580ae84f4e4303db8f684f559382f075ef6e95698b9a629e92b67bf004f64e7cf47e401768fa170c4259efbda1 -849821e1ead81fe2dc49cd59f2bba305578c4ea0e8f4b8ae8fc275a1c4a6192f8819d5b6d7da786c94dfc16aacf3e236 -8c60d9a8baefc72a3d3f9dd2e24cca40fb5ce36b19d075122391d9b371c904a0a15d2196c0f2ac9da3acf188d15b0fe8 -946edfe168bbe5ddb0fa6c2890bb227d8418bfbebe2bafab84909825484f799407b610d8aab6a900c5ff9eb796cdc4bf -ae7bf8ae71de5d7ea644d9541e49da1ec31eca6ff4c3fbec5480d30e07ef2c2046cc0a486af7b3615a6a908846341e99 -b4d31a6f578463c9a5ccde0ea526c95b1981eb79468665395c0e550829abfdfa86689699d57830856e324092a423f231 -93415ad3a732417cca9771b056ed42db7ce50879aca7c6f71883ad297eaf5a37fd4641d44a0b7e28b90c168834141340 -98960617a413a3ba86d8257a7386355a69258943aa71834166bd624ea93b0af06178e86538e237f88fd039eacf7cb04a -881335200a487545e38d5b1ffda3080caf5729e1b980603bcdf9ea652cea7848335b83aeeaa321d3476ae4a8d9073582 -b39e84c14666d51895b7a8341fd8319f9e0a58b2a50fc3d7925cce3037f7c75367b5fb5bf25ff4720c9992cab7b8b9f4 -8ea4bab42ee3f0772d6bd24dff3643d8b61147b46ada374414d8d35c0c340e458e449d31023d96e66decf9c58e30cc34 -a5198f6759a045b6a4ba28e4bc3bb638fad44c5a139064327580e285adf38ea82a7570acebf925e81a39d9025f3a6f2e -80267097e2d27c1b19ecf95d184dcff822d34e03326b9fc139a4f8b75b3f80777bb97a9dd284d9b755f14dd401d63c0e -946f346220bd3b6f733e94b61a1ad0b44e45c356fa6036dde5882d93b5613c98e23b20e91eddc6b3c5acea38085705af -a5f559e110cad99bbcae2d9362434aee7db0f3b6d72311291649dbda3f84c10e9760b66b988db3d30067bf18ae2e5238 -8433b38e5c7b293ef532f8c70cef1ed9be7f31f60d5b532e65df7d2885203be78b7ad78ab3011bc54cd9f64c789bf837 -a5a4c0a9b0e0b6bb912cf6ecd30738b0acc0146d77442449b486c3f32d7e60244f643a5cf9cc6da2de5408d0c5f17691 -a81feb329fb51b72464bddcfcf4e02149d995b548d88c64ba143144ce16b652c9913c8ee948ee837596ec97cc43d8cc9 -88e5a7e93a738d61330425bc21ade88d33d7160d124bf174eb3e12a00283654431036977c4f1a47a1bbbf2ef8449ac89 -ac75ad7c099383069e662bfd3624b92b64b5838246902e167fc31b9411efda89b2c6bbd1d61b9eb7d304faacf438d70b -8583bcd1c7cb9bb4bb6bcff803b0a991912b8403a63c0d997761ff77295ccc357d0292318601a8c61329ab28fed7bb83 -a1f9aa0523f1dff00023a44a6c3a9e4e123be0f6722a1c6682ac3c6047efe9e62f4773daf4767e854e1fcbf8ee7339e2 -85f65ebcf5c7e574174b7c4c4166a9a5368e7986b8c0ef846c2e13b75dea7311a87483503149ebfb3cb839b3ef35c82d -abc55eeb72699031a367b9675a2b91a8434e1f01467660903ced43a0b2a11a85ebdf48f95c13ff67e4e2958065a50ff3 -a4ff77c9b86939a15647499b9412417b984bfb051e5bf27b35392a258a5dac297bbdbcf753a4be6729ffb16be924a2ff -af0d41c15b5172efa801cc85ed101b76844dcd06712d0d21160893235a2dbedd15d187a9b31cf0d0ca6c14de6ab2b707 -92661339199f18e5dd9a210783c1d173a26dfa315bd99a33d6f04bf506c871a2b47745c1909faa209d5e6c5c645124a4 -b35813dafb52df709dfa47982bfb44e1bf704f9f46085b2a0e92511dff90e5597110f614f8915830821fc5ed69ae0083 -934a05aa713fa276a4d47f1a28ef06591e5a9a69293c1651c223174df0af4927fc9cd43d374d89c1b4f7c8dc91abe44b -8f83a0ef05202c0b7170ac96f880135e2256fdf8964dae5aed5dd0f6452a6d8e123321e8c182b3aa6f1f8ab767caa735 -b92db10c21c321cf1349fd34129d7180e5088daf2bbe570de6427299aab68992c011c2e2939a44247396f5427c1d914a -95ce1892d1ce25ef2bc88a23880055a4d829a3b31f3806635fd49bec32cca4e965b129b6dd3e90f7e3a2eb293ffc548d -970cf816ee7501ade36b0b59f87c7e352957f67f1f75bbacd8ed52893f9fc40572c76f49c23db44866af7e34a63cd3f9 -a2fcd08581d3569fff699fd7ed1ede5f98f2b95956ecdf975a29af053d9f4f42600b3616ad6161e958c3ce60139c20a4 -b032688b6cc8a7e63dcb82694f71f087b1ee74c4d5fa27323b1ead3ba21722d7fc49eda765725b5553db5260005049c3 -b0b79e4329f1ad25ef6a603390baf889757cab5af10bfa6953a61f89aaace0442b9ef08e57ba778f1e97bf22f16f0ace -a2e6ac06f8973266cd0df447f82cec16614df65174c756e07f513e2c19aa82c10d8670047860960cfba3c5e4c42768c8 -811e66df0f3721a1ae0293549a0e3cd789f93fb6be2cab8e16015a6d52482af9057b1b75e9456322a5a9e87235e024cd -8744a80b3d9e37da4c50c536007981a4958d7e531cb93916dbf985cdc22f4ff482a5cc4fe50915c049d2de66530f1881 -b20b6e8c7be654c23c8ca440be2c37cf9cc9f4e81feedfd0cd7c56f37eda8f295fe5d415e9bac93d5f0a237edd8bc465 -b33fd84377f31f7819150d464b5eb3ef66e06cb8712665cf0587d61e1b1c121d11cc647f3753bbc18604941c77edbc1f -83acb8a3ec5f477b6d44cd49f9e091bc2bf7c9dfee876cde12075a7db9262314cb66ad2e7557114e0c19373e31c6eff1 -acfe4172327832ee207eb07da9cd37da3b009c776f7a8290529f0249f58da213254baddc7c3074fbaa1d226ba1e52b7c -81911b4dea863424b9d77a981987732382702e0294d8c8e1ec48e89678ecb0e64836b45205a120885fa8f8a3a4b9d4b0 -b11f61b1302579a11077bb2f1f0db371ab943573b261be288dc76172eee8a5102b992a5b526092d160ffd20aac2d4856 -ab491f7f1e002a44944c02537f365e525ebb6d5614bba8e5e8e8bd12064c702a1759571ddbeee592a0ba8b73cfce8810 -89211da3d92aed6b111de001b8b5a9231a1c2d09fb1cd2618ec457b635a6c8590fe119acca42fce76dce791c35b889c7 -a5f076c8f7164bcab8af59021ef97a0afa93d0877e52241c3ff5a9a9f81227a55c119ed6a84d34b196e94ec851ca5ca0 -80d91417d0d6c1adb5a3708165da1d54a83caaff482a4f65abf3fb335cbbc738c74ed19a8c451ca98befdf9b2d8b5f90 -aecba33a67f66401614eec5fa945e763da284edb9dc713bad4ac03972630781a09a3e2a291aac0605a9560c5f3444de5 -8a0aa1320bf5217a049b02ad02a4f892bfd6a3f5b48f472041d12f3aaab8dd197307f144f9de5f9e762c6b4971a121b4 -a4120a569e446fe4129f998e51f09c1cc7b29dc2b353d6f6f05daad1a4ef99acfcbaa4950a58aacf7ee1b3fde0af33d0 -aff71370d58b145758a5f24cf3c0c6667d22a1f950b8137c369fa845a5265cd645b422f24fa95e1cd7db1d68686120b6 -a839f075a8a702809a51fbc94595eab4f269a2e7a027aa1f4fc472e77f586138bf5aa4e5570a560e139eb6cda4cca161 -9484f1caa3e35cda0e3d36e43aff3dd8cf45a5a51fc34aafa3a63ed3543047ba9d6af2a9bc7c201c028499e6b4c41b28 -84ddb374c5c9170903bb3e1054fad071b0a147a9ca2ebe2fdb491ebb2431d53b398872a39cc385f973e38579d8e60158 -acaad8babaeaeb52c5b5a16ae689fa5ae15846f2d1f3596a52371bd8681819603822ee8d32ab8cda1bd5290d601e483f -946b69ca5361b60c3dc31db13669b05e5c0452f3c80e7e185f9667a36f351e9ed83bcb5c6dd2439ecd4490e3a87d260a -99f457221ac40df86f9b4bef0bf8812720b2f7218273a0aab08c4d4d4fb18a0fb0ef6ba9bf7fa53c116cc6f16742e44f -8bc0e812d8b718dbe48ead74a6bc7bac68897d01d097422be04110a25589bacd50d336d2c8b70d0dfde6c1b8bc372dc3 -895d118dae2fb35a4b0de22be0d000ec0f0f317b9494db7c12f10d7db81b6f3eaf6d6f3fdfe952f86ec4143d7469368d -893bf3d7e579e800526bc317438a69590d33759931830daf965cec721baa793ea335e9624a86b84b8fed5effc3e2bbac -a112d30dda88c749ca15d6dc65bcbc7fe838b2d25329d44410a9a96db195c7ce6a6921196a61ba7c9d40efdb101a164d -b88b5340af052fc3b8e1a8cf7532206801e79d878f1fb02b32ac4f8e91b64e0ec9252d808b87c4579de15886a20aaef1 -865f76475bb5da18c6a078c720c7b718e55d310876c98017c30ac31882ae347258b508ec34001918324250241d2df5b7 -b6d8a15913eb1714061d5cacbd0bb05edd83ecdb848a89b864e7411598e9f7814d0c039ebe4735437c8370d2ff183751 -a95fedce8351ae9c24d7fa06ebc5cd4e3aef87afaf04a7150e561a6a7f2347bdcec1e56b82d6e5f597fe7124f6cc503b -8526004ca0c802b073d50b0902ea69975949e7567b2e59ca2cf420bc53d91951d26096f2abb07a2955a51506e86488dd -99ccecaab68b6e5adadb9c848cb577de7e7ff4afc48d3b6b73bc0872730245b8a1c68cebf467074af6756d6226f4f4a7 -b5497d5c0cd79b7e6022e295642e1f2161254379eb78ef45e47f02c84ef5a3f6b6297718e4fac8093bf017287e456917 -b6943f30012b2093c351413c2b1b648afc14a5c4c0c338179d497e908451d2779919fe806181452ed386c1e8f8e8c25c -afdb56ce89bcd3247876c918cad68aad8da65d03c7c73ccbee0c4c39f3ad615aab87ffa0db5b3b63b4cc915d0b66deb7 -a44659d7be2f11d4d4949571d7bf84a6f27f874d3281edc34ef1098d321a4dcad9a42632b39633f8f9d20a39f54a2464 -a3e489b4db5832280dd58c62120262471b6fb4355c2ad307bd17c5c246b3f1e1b00f925930f5f5f6987de234fcbb7d16 -87a4e3a190340ed4949597703083d338e9c17263ba8a39b67100589f0dddbc420d9557f9522c17c71ae04b76876f8db0 -a35a3978e928eaac8c182a0a613c611ae7b4827c5e999f938eed06921c0294befdc21d02e68d035a2fc8d03c82641126 -a6898d90265dcf0fb215629f04b07c7918e022667583efe0bfe02f258b446954876c6ca9e369ffe1bb079e2314ebda32 -922fc52e648b6b2b6768c079c67ab425da72907a46add801715f8a2537280869d7071d527b833aa63ef562ce059a392b -8acbb7c4297196d8d1c131040c34cc7064656a148c2110b19c672abb094b1d084fafe967f7122ba9dd1523a4eaec3b42 -82dbf2cdd581fe3b81b156792228eae2485710e6c21dd5fd14614dc341bb0afbebbc0f32340eda9f094b630afcfc17e8 -907a095dca885da219e4558e9251ec765cf616e995c61546bc010963bf26f2d8adbd9b2ef61f2036e1740a627c20fbed -a7a83f849691d04640137989a2d0c90a7ed42a42b0ad328435d7e1fba557a27a58eec9170ab3d0099ec97da0c950765a -b7d435a801c2a5652cb479027f2c172eafa3df8ca0d896bbb9d49a42c42660fb382a8439bfed09ddf7e0214cb6066761 -8bc6b5e79af5512589f90de8e69bc858277055cf7243f592cc4edd193f03f71d16c9300097ddafb79752c63f135c884c -913264fca800467bee58a429e1f245ef303f5dbeea90f0ce6bb3c7ae6d1bd0f99ea75d3d309634684d2178642c81b5d8 -83ba558f9c23b785a123027c52924a1d7334c853a6165d4f5afd093b0b41951a36860ba0a20fa68f73d7db9df0e3ef38 -875b2df7cb54ecdf7ba31181b9dc7dbe02761ab8ffb61757d42a735c8e20d44bad5b904e76dcec6bb44883fdb9f4ad84 -af3dc5d2dd29565de8f4c700d5f1ab71dadb4351f06e9ee2eb5ee7a9b5da827d0c6726c6dc780748a26aa3b4d10e6c2d -a113ff09296b25f550f6d0d3f37dd4517b14cf6d5517293bd3068aa3aea765a8640fcd4bf0ba96db5c00167267fbd574 -a138c5cca485b9180ef091c9e327982bea203c165cb83564f416c36e813bea1ef1f6345f57c8a591df360541b7b758f5 -85793441e917ed520d41dda6e762269fb9f9702e5ef83cee3e90652d324536bf4233425cd05b54a383609076ab84ea13 -b422ac9de53d329e6321a8544c264d63cffc37965d627d7e180a999c3332644e21fedf10cd2f43cf6ba4fc542db91155 -a85d31d4bfa583a493681e57bfccca677ec5b85870a53de37f7be7833b573f8c8dcf029cea4ae548d83048030d77d56d -ab8a0702a371db496715a4ee8fcb6d430641b0f666d7fe3ef80c09df0bf570293cec1aa1675381c6bbd9ecc1f7cdccf9 -b308ef2b87438d35957191294782e9f5014a3394fadad3e2ccaf6ebf20fd889a36dbb8ddb3634baa8e2e131618aa4e70 -919e972e5b67cd65f377e937d67c27b4dd6fd42cfe394a34a70e8c253a1922f62ff36b9dcc7fbbc29b0960ad6a7fde88 -a0e4d4be28301af38a910971c8391ef3ec822ce35757226a7fd96955cd79afa14accba484ef4e7073e46b4b240a5863f -9422f6d424c1736b4b9bb9762aa62944085e8662c4460319dac4877b1e705aa5cd8b6b3a91268363ec3857c185685f4b -b7cf9f2053119d284a37df4e4489b632594df64e5dc846652ee26b4715e352e6333118b125021481138e4ec3e9f9987b -aea983e81c823472df8652654be8a60a8bf40147d599f87e323397f06bf88c98e9c6db0f28414f6ea4091f3eb0f6a96d -aa20bf03cd8b6ffda09fe0ef693fc0aaa3bb372603e786700e52063a4f7ee742771c41cf5e67e6248f99b7fc73f68dbf -8748a4978198071d7d5ddc08f8c8f0675d895dc19df0889e70bd86d44c469c719b93f6526c7e7e916c7bfeb9a1379aaf -b8fcd863d55dab2f7b1c93844306e00056ba17338ddfa3f02689a0b58b30239beb687b64c79b8420ecea8d0d082d9ffa -abb1a35952dc8a74dd1cdbc8ae7294c6bfd1910edab6f05c879e9ed06c636a949fe0017ec67f8f6f73effcb5817cccae -8bef43422b1c59e354b7f46c08a8eb78e26c4d01c236a4fe781cefb7465293a4444f2bdc68c6a221cd585a2494d9a1d7 -93527258940feff61befa18fcd6626fcff019d34a3ac8c6886599cbef75b15c15d689e8c1bd2177cc93c4c1792dee8d7 -b7f114eea99c8278841180ec8886ad2bab1826554a1657b9eeb17aa815f31b59c3931913ddec40aa9923bc92f8975635 -91a96446158b194a0a6ada2e37c8a45f3017c34034f757245f6f3b98c65d39d084e74d2a9dc271e5918faa53990ec63f -aea4ada0a853753db03f9790e20bab80d106f9b09e950f09aeaba5d869f0173bed673b866a96d6b0dd8123a539caac9a -b8e3e98ff0d3e512441e008a4a6783233045a4639e0c215c81984846b43ff98de99d7925cf717b1ca644f6229b6d16a2 -8987ef81a75213894e11e0310e8ba60fe06e2b264cc61655e5b51bf41cc8c3d6c10696642ea3517770f93be360207621 -8d4eff7335252f74af4a619c78625fd245df640f2086338dbb6c26b059f83fe70f3e81f5b6c12d62c0f784e572d56865 -a56f6389b0bac338f20c615d7d11e16045a76cbea23ced0a9d9067f538421c378200bfd4523b7c96094ab67f47f98d42 -83f5ab0727fd6ce8b3370ce3fac1f3a9c1930ea7ebbd16be61cc26f34aa1291ba4b5f16729d7d4f5924eaa4a1e31a04e -8cc62366874bf8751067a526ea32927584cef41174e2ec5a53079ee557067bc282f372b831cb2547c5e21a2f178c91b4 -b609e141006dc8d8649457efc03f8710d49abb34bc26a33ed4e173e51b85d7acdf18d74aed161b074f679d88f5aa2bf3 -873c7aa784c17b678443320950e494250baff8766db42619b9fc7ec4c3afa4eee290cd1f822b925d5b9e55c9cdd1af2f -859ba787f052d3665481c3dd58159ec8c238d918fb6d2787ebe275ef9acd377cb7aaa03a69820c78247bf51afee3d5bf -8eb1e6d2b0f51a3275b4a8be96957cb2d518b32c815dc0dfd5f75340c7dee73e5edc45db7c7d375c4ffaf8c59767d0c1 -85f3876ff5edbb826a9592e68db3dcc975725bfdda4fcac197758a8b27e4f493e6c531b1342ba0f5a75f965273720345 -8a1272f2678d4ba57e76c8758818965e6849971e8296b60ff85a522feeaaa3d23d3696c040d8bdaf1b380db392e988aa -85002b31ce31be7cc8757141a59a7cf9228b83144993d325b2241f5bfac09a02aca0c336307257f1a978c0bbf79fa4fe -b96bd26a6bbbc705c640285fd561943ef659fca73f25e8bf28cfcd21195752b40359d0edca0adc252d6e1784da267197 -936cfe367b83a798ab495b220f19cfe2e5bde1b879c8a130f84516ac07e3e3addcc791dc0e83a69c3afc225bed008542 -b1302f36190e204efd9b1d720bfaec162fcbba1b30400669dbcdd6e302c8c28f8b58b8bbde10f4512467dd78ed70d5e0 -8291b49f56259c8d6b4fd71525725dd1f35b87858606fc3fe7e048ac48b8a23ba3f0b1907b7c0d0c5ef6fa76cddc23f0 -97aca69d8e88ed8d468d538f863e624f6aed86424c6b7a861e3f45c8bf47c03e7b15d35e01f7add0a4157af171d9360c -b590d896e6b6f2e4dcffebfa67fc087fa518a9c8cb0834a5668cabe44e5c2b6f248f309b9cd74779030e172dba5d9e29 -97e7099bff654bcb37b051a3e8a5a7672d6ab7e93747a97b062fc7ae00c95deef51f5ced2966499217147058e00da4be -83435b739426f1b57f54ebad423939a68ad3d520db8ca5b7e28d1142ebfb4df93f418b180a6c226c0ca28fa0651163a0 -946c9144d982837c4dbc0b59544bdbc9f57e7c9ef0c82a7ad8cfddea78dedc379dbc97af54ba3ac751d844842a2990a4 -90ba1eff9c25adba8c3e6ef5b0d46c13de304632fec0646ee3a7bee69da2bc29e162dd3fb98a37ed1184ae5da359cf0a -b17b7a5c0a48eb9784efb5ff8499230b45efeb801cf68e13fe16d0d308511af5aa60e3b9a5610f96d7c2242ae57d455b -9991245e5617c4ea71575e5b2efe444f09cbbed13b130da08f8e9809d62512e8298a88d41f6aa3dbf3bcbc90654ceb18 -a1190c4cbccf2898a7fe025afd03f8652973a11cef59775fb47d69a6b4dcb9a5a0c554070421a5e10a75e43b63d37b79 -857c0a5f291eb35a76be11543a8c3d798187bd0717e2cdee50d390b66322d0d9529520fd3377136cdc93cfee99b6403f -944d11e5f9a3493c67786df94f129352d892fbdc43e98206b8dbf83cce240f65305e1768b38e5576048a31dca5c18f31 -818f361c5dae709e067a82b81beffbd9674de8df2bc1bfc3a27ddf326260e124e46b1e36697fb8de539b7736db093e9e -b07f5b737735a0d628e7ac2d335080b769bdb3acea38ad121e247a6e4307916ba1d029da5d341f079ea61eeaf7d8554e -a69e338803f3ee0fbbddc7ee481a13f6b64d25d71bae0d76f4b5145b54923cf1616c77ba0fd9ca37a3ae47208f490423 -acaee66b94e226622e28a144f93f6b1b442b9c79d7a8a1740c4d53044d0675a661e7453509b9e716e469fe11ce45ee31 -9402ca799d2e1cce0317ed49453ee0b2669b05e68ff101b89306db215c3941b3786ad3402d00369cb1dee020b56d3142 -849440c539fc0df3c8d06e23e271e6faa50234d5c057b8561e9376415f4396e548351cc677b0abeafe4f51b855a3dc83 -865b99587eb3dbc17e412647673f22b2e89185d1df1ec8ea04515585ad2edfb731be458123118dcd7b41b475026477b9 -9390618833b5adbaf24bd38cf9fc6f25104717f314259bb4da5c7a1f6963ecdc04d07bed391d8cd765c3d53567b2b6b1 -95383e8b1d0a629cec238b5ae2bda236a027f4e3b5f99ceace05f1d5a781ec1e7a43058f44ef0a5aee6b0db5697a0d89 -91739b8946d90db3a5244f7485295cc58143ba0449c9e539df1ba3c166ecf85ff914c9941192963c32d35033ae2f0980 -b5d88848d856d882db5947b9182025f0abf2bc4335b650fa0a48a578e2c87f32cc86d42d3b665ee2eab46d072bf1eccd -91f4c754549f5a53b1902ef84274ce9acf0bfd2e824e62eb127d67e3214ce05fc2430c05ea51e94dc6e8978f5d076bab -91fff8c75f8ad86afe78ec301de05e4ca71421d731419a17c747a9a0bf81129422c9499e4749107b168d1695dc90292f -99fbd7bede9cc1e2974c2a21c70788960c2dbf45a89552da8d73bb1d398b8399590707f2f4ba4b43cb356e703eb01b5e -80a51cd83e3d748c07b9ac82de1a697b09031e3edc7bf585f06cd0ffa8ea319517fcc2b735614b656677b54b4910814e -886b27de1f93311d1a31b6d698aa28b54fbd800decd8e25243d89e352ee38cb252d5648b5134a3e1ed021bae46e9da48 -976e70c94db905f83b4ef72188d840874bf005814c0c772f3832aa65b1f21927403125eea7a07b6d3305b1a781b36ab7 -b4adb9d1c49eb31462583580e3ffa625bea4f8b2a7d4927e4ff925c1759d4b3c1e43283d635b54fb0eabfbe1f4c12992 -b66b466bd48485ebeedd47e749d86cbaa3deffbbee2e69cfaa5e9f3bd28b143d7c1c0255a7a1393a2cc1490b2c485571 -8bded5bc0794513947ddb00ff6b780c5cc63a74e2a0b0284153c346a31c82e1eff07c073939da39e6f87a06c14ff1a80 -aceea8c6f799589f6b7070abf69fec724e6679514e60f1eaf9a52c37e9cebb72abcc833a81d8da1a4f5194c1a7eeff63 -89a9f76d053379687fd221ebcaf02c15c2c241bb673ef5298e32640a115d9e0f2331c3e185572cd65946dd6c5bd42412 -a57b6f1e3fdd92eadc6220760f22d0685a82cada1c7a1bda96d36e48e2852f74f3a83c757dd8857e0aee59e978da4919 -9106cf0891bb39ce87433c5f06a5c97a071d08ad44a7cbcd6918c0729c66bb317fbbee8aa45591cee332ad1234c7257d -96c18cca4a0f0299e0027ff697798085f9f698a7237052c5f191b1dba914e5a015ae356b80c17f0fdd31d08c5a939ebb -a892103c93df126c024825c07d8769bdac5f1d26ea9509ee26530dc594384b2a5095cc34e0b41ab3db0392a29792c9e8 -b7c2dbc95edb6fc25802ea051803b7bea682f87a99f8a9fdcc3091c81d914b9493dfb18a8894c964805298a6c22b07f2 -8e40948927d560a6840d7fb99802989ce72b43693e9dc7ed9dcda4bca7daedf75271cf656bcc22b3f999a550faad8648 -b354de1c6f0603df3ed9036c610281e55b51a48950ee3ce57a00b4692232de7ca57d19722700e15cbe67a91fcec2f786 -adf987b90737b933436d8036c1d3f0c9104f26c540052e22e703964f72739ac1261e4289b8f27dec47281a0f3f51378a -8ed5248e9c836fffa7c924178db593e1aaeb54bcf2e93c1983c1f3899cad538deeb2b836430fddc9b2f283e0797ea11e -907e5410e3bd5d7f55340e2f497bd1ca10bfcb4abed2c66a3cdf94dc40bbd7c43ac98754e0b4b223ea4c61eebf2f27f5 -8e81b441ea0397db28840fb4b3c3bfe6d8e31418816f7bda36f9c1cfe4556daee30c43639d90a2dc9b02a3d65e5f4ab2 -897085c477f5030f9fed06e181b05953a8cd2001d959dd6139738d40f1d673b2c7120b5348f678547acfdc90ffc9fcc6 -b0bf2784c4b3808a04be5a00a0593035ce162b3886e1500247b48365eac8ec3d27c7e5e6372e030c779c75fb79772d0d -af3fe6c75f2a1241ac885d5091ff3882cf01695d957d882e940f0c31f7a5b5e269c1a2bae7336e9a7cda2b1d23c03bd1 -a6d94e065f85736d77080a4f775885ccb0dd5efdbe747e4595280bca0ebe12450257c1beadcbec77566ef57508c5d4df -a5c50fe56b5532bf391da639a2f2b6cbb2634fc6637416fea7c29a522dea024d4adaaa29b6d472b4d2cc3e3b85c72e2a -afc35f5a03b245a6286318ef489db05d397bbd16c17b4e92eeb56509f875246c0176c01804139eb67dc4247c2a36ff9e -99ba14ab5a9612c078f9bbaa0e68fd1d52ecceb2ed19bd9abf8f98dd4ed1f9c4fa6e4d41bcef69be2ff020b291749ca8 -8018cdd3d96f331b4c470a4c3904bed44cadecbeec2544ca10e4352cf4ae1a856cf55f6383d666bf997ad3e16816006e -a9964790c318bb07b8fe61d230dd2161dd3160e186004647a925cfec4c583b4e33530bf5d93d8a14338b090055085b05 -ab89d8401df722101c2785cb3ef833017f58376ee82cedd3e9405b2534f259bb76063434a247652c7615a6de5194de65 -a72c3d320a0d40936dee8edfb36703be633aefbb8f89530df04eb6aebe0305ef4f4b6709436f8036d417272a7e47e22a -b3457661ad62634cc25e2918921a97b0bf5c59ccc7063bc8eb53194783f07659f42f8978c589228af5b12696588d8b2f -926fa35cd3ed4c8ad78af6284b87ae53b2e25a1ff50398034142a2bbed5b989ba3181ff116838931742c0fbcd8b8a56c -ae57fe506626432f27ae4f8791421c2df9efd9aaabe4b840ccf65fc3d0dd2f83e19eb63ae87bfa6898d37b5da869ddb2 -99c0a26ac74211db77918156d7ae9bea6ecf48da3ce9e53829a9ad5ed41321227c94fbd7449ae2e44aae801811552b1b -abdd2635b61cb948e51b762a256cf9d159b9fcb39b2fb11ba2fed1cb53475a03fc6e024a6a824a67a689396119a36a7b -a5ca98b98da8bb8eb07b1e5e3c85a854db42addefacd141771a0c63a8e198421dccc55ef1d94662ca99a7d83b9173fc3 -a821bb5cf1eb3aeae6318c8d554e2ea3137d73bb29d2e4450c9a33f441355ea77bb0e0e0ce7c819abc3ed119110a3a92 -95cdfb19b3f7196c26d60586e2c1efaa93352a712f8c8ef6209f6f318cecd52d7bebdfbfee4be1f5903a1595f73bc985 -aef6e6a400106e217f9888afcef0a1e1299b59017e77dc5453317dec0c32ae96873608bef3f1b504a7e4f45b06edc9c6 -96399ad093299ba26dc09ae85dbec9a1801dea4a338dd5d578bcdcb91246db0059e54098ba8a56cbb24600a40095cf79 -ad8b018ac99857ad4b38bdf6d110bbef64029a4d9f08df85a278c6ddc362a5f64e1f3a919f798ccb2f85a7f4ca1260b4 -b211f3b5dd91941d119c4fe05e2b4c7bb0ce0a8d7ef05932a96e850f549a78cd20cded0b3adb3f9f8b7058889ae2cb4e -ab780dd363671765c9c9ab0f4e7096aacf5894e042b75f40a92df8eb272a6229078cd6eadcc500eead3650860aa82177 -a4d96b16ab3abe77ead9b4477c81957e66a028f95557e390352743da53d1a7ba0c81d928a7ea8bc03b9900135ac36a6a -b4d4e028099bf0f28ac32141cd8de4ee7c3d62d4f519fad6abbb4ba39592750812220a4167d1da4c4f46df965f7cf43d -aa929c5f0bd8cb44a861bfb3d18340a58c61d82afa642447b71b1470a7b99fe3d5796bdd016b121838cb3594f5a92967 -a038e66f0a28aba19d7079643788db3eed8e412fb9ab4c0f6cacf438af4657cc386a7c22ae97ccc8c33f19a572d6431c -89c1ff879faa80428910e00b632d31c0cebb0c67e8f5ded333d41f918032282fb59fbcbe26d3156592f9692213667560 -8d899072c9d30e27065d73c79ce3130a09b6a4a4c7d9c4e4488fda4d52ad72bd5f1fd80f3a8936ef79cf362a60817453 -8ffb84a897df9031f9a8e7af06855180562f7ca796489b51bb7cca8d0ca1d9766a4de197a3eb7e298b1dfb39bc6e9778 -836ebd0b37e7ef4ff7b4fc5af157b75fa07a2244045c3852702eaafa119ca1260c654a872f1b3708b65671a2ece66ad2 -9292dfd6d5bfc95f043f4eb9855c10cbcf90fbd03e7a256c163749b23a307b46a331bdbd202236dca0e8ea29e24906de -8bc37eaa720e293e32b7986061d2ffcbd654d8143e661aabe5602adc832ab535cffbe12a7b571d423675636a74b956e4 -887455f368515340eb6f9b535f16a1cf3e22f0ceda2ead08c5caefccef4087e9f4b5d61c5b110ff3e28e4ab2ad9e97c5 -a6e5ec36e7712056fec00de15b8696952b17891e48ebe2fa90c6f782c7d927b430917b36b4a25b3d8466da3ca2a4985d -895cae36ba786104ec45740c5dc4f2416b2adce6e806815e3994e98d9e1be372eaec50094fbb7089015684874631ab7e -9687444fe6250c246b1711a8f73992f15c3cac801e79c54ffd5e243ad539fdd98727043e4f62d36daf866750de1ba926 -b17f75044c8e9ce311bb421a5427006b6fa1428706d04613bd31328f4549decd133e62f4b1917016e36eb02ea316a0ca -8538a84d2f9079dd272a7383ff03b7674f50b9c220e0399c794a2bcb825d643d0fc8095d972d5186b6f0fe9db0f7084f -af07b37644cc216e7083bac1c4e6095fa898f3417699df172c1f6e55d6c13c11f5279edd4c7714d65360b5e4c3c6731e -87eed8fe7486c0794884c344c07d3964f8fc065aebb0bb3426506ab879b2e0dfaefa5cece213ec16c7b20e6f946c0bd2 -8a4bf42f141d8bc47c9702779d692a72752510ef38e290d36f529f545a2295082a936c8420f59d74b200a8fff55167c4 -a7170e5e00a504a3b37cb19facf399c227497a0b1e9c8a161d541cb553eb8211449c6ac26fe79a7ff7b1c17f33591d74 -a9a2cc7232f07ef9f6d451680648f6b4985ecab5db0125787ac37280e4c07c8210bab254d0b758fd5e8c6bcf2ee2b9ff -8908d82ebfa78a3de5c56e052d9b5d442af67a510e88a76ba89e4919ae1620c5d15655f663810cfc0ee56c256a420737 -a9d47f3d14047ca86c5db9b71f99568768eaa8a6eb327981203fdb594bdb0a8df2a4a307f22dcea19d74801f4648ea89 -a7c287e0e202ebfc5be261c1279af71f7a2096614ee6526cd8b70e38bb5b0b7aca21a17140d0eddea2f2b849c251656a -97807451e61557d122f638c3f736ab4dab603538396dca0fcdf99f434a6e1f9def0521816b819b1c57ecdfa93bd077eb -a8486d60742446396c9d8bc0d4bed868171de4127e9a5a227f24cbf4efbbe5689bbd38f2105498706a6179340b00aed5 -a03b97c2a543dfefa1deb316db9316191ab14e3dd58255ce1027b4e65060d02fb5cb0d6ac1a2bf45bfeac72537b26429 -a7d25060f6861873410c296a4959a058174e9a1681ac41770788191df67fc1391545dab09de06b56cd73a811b676aa1b -96bb9c9aa85d205e085434d44f5021d8bbafc52cd2727b44e2a66094a4e5467b6294d24146b54c0d964c711e74a258d4 -b07b17f11267e577191e920fa5966880f85ff7089ac59d5d550e46f3a5cdadd94f438a547cd1ec66f20a447e421f96c6 -964e33e1571c97088fe7c8ca3430db60a8119f743a47aa0827e6e2fb9bae5ff3bf6cecd17b11dd34628546b6eb938372 -82a0513a05870b96509a559164e6ff26988ea8a2227ac6da9adc96fe793485a9eb6bdcab09afac7be4aef9a5ae358199 -b1185bc679623e7a37a873d90a2a6393fb5ccc86e74ba4ba6f71277df3623cde632feae4414d6429db6b4babde16dee0 -b3d77504b7032b5593a674d3c0cd2efbf56b2b44ed7fe8669f752828045e4e68202a37bf441f674b9c134886d4cee1df -95ab31749ff1f7b3f165ce45af943c6ed1f1071448c37009643a5f0281875695c16c28fc8d8011a71a108a2d8758e57d -b234dee9c56c582084af6546d1853f58e158549b28670b6783b4b5d7d52f00e805e73044a8b8bd44f3d5e10816c57ecc -86da5d2343f652715c1df58a4581e4010cf4cbe27a8c72bb92e322152000d14e44cc36e37ff6a55db890b29096c599b9 -8b7be904c50f36453eff8c6267edcb4086a2f4803777d4414c5c70c45b97541753def16833e691d6b68d9ef19a15cb23 -b1f4e81b2cdb08bd73404a4095255fa5d28bcd1992a5fd7e5d929cfd5f35645793462805a092ec621946aaf5607ef471 -a7f2ca8dacb03825ef537669baff512baf1ea39a1a0333f6af93505f37ed2e4bbd56cb9c3b246810feee7bacdf4c2759 -996d0c6c0530c44c1599ffdf7042c42698e5e9efee4feb92f2674431bbddf8cf26d109f5d54208071079dfa801e01052 -b99647e7d428f3baa450841f10e2dc704ce8125634cc5e7e72a8aa149bf1b6035adce8979a116a97c58c93e5774f72b7 -95960a7f95ad47b4a917920f1a82fbbecd17a4050e443f7f85b325929c1e1f803cf3d812d2cedeab724d11b135dde7a3 -8f9cd1efdf176b80e961c54090e114324616b2764a147a0d7538efe6b0c406ec09fd6f04a011ff40e0fa0b774dd98888 -b99431d2e946ac4be383b38a49b26e92139b17e6e0f0b0dc0481b59f1ff029fb73a0fc7e6fff3e28d7c3678d6479f5a3 -a888887a4241ce156bedf74f5e72bfa2c6d580a438e206932aefc020678d3d0eb7df4c9fe8142a7c27191837f46a6af6 -ab62224ea33b9a66722eb73cfd1434b85b63c121d92e3eebb1dff8b80dd861238acf2003f80f9341bfea6bde0bfcd38c -9115df3026971dd3efe7e33618449ff94e8fd8c165de0b08d4a9593a906bbed67ec3ed925b921752700f9e54cd00b983 -95de78c37e354decd2b80f8f5a817d153309a6a8e2f0c82a9586a32051a9af03e437a1fb03d1b147f0be489ef76b578b -a7b8a6e383de7739063f24772460e36209be9e1d367fe42153ffe1bccb788a699e1c8b27336435cd7bf85d51ba6bfdd6 -937a8af7ed18d1a55bf3bbe21e24363ae2cb4c8f000418047bf696501aaeec41f2ddf952fd80ef3373f61566faa276a9 -ab5e4931771aeb41c10fa1796d6002b06e512620e9d1c1649c282f296853c913f44e06e377a02f57192b8f09937282eb -893d88009754c84ec1c523a381d2a443cb6d3879e98a1965e41759420a088a7582e4d0456067b2f90d9d56af4ea94bba -91b2388a4146ebaaa977fec28ffbfb88ac2a1089a8a258f0451c4152877065f50402a9397ba045b896997208b46f3ebf -8ce0523192e4cc8348cd0c79354a4930137f6f08063de4a940ea66c0b31d5ea315ce9d9c5c2ec4fa6ee79d4df83840dd -b72f75c4ab77aca8df1a1b691b6ef1a3ff1c343dd9ed48212542e447d2ed3af3017c9ad6826991e9ef472348c21b72a4 -af0fa5a960f185326877daf735ad96c6bd8f8f99ab0ab22e0119c22a0939976ece5c6a878c40380497570dc397844dba -adf9f41393e1196e59b39499623da81be9f76df047ae2472ce5a45f83871bb2a0233e00233b52c5c2fa97a6870fbab0a -8d9fc3aecd8b9a9fca8951753eea8b3e6b9eb8819a31cca8c85a9606ce1bd3885edb4d8cdbc6f0c54449c12927285996 -901969c1d6cac2adcdc83818d91b41dc29ef39c3d84a6f68740b262657ec9bd7871e09b0a9b156b39fa62065c61dacb1 -9536a48ccd2c98f2dcbff3d81578bbb8f828bf94d8d846d985f575059cd7fb28dfa138b481d305a07b42fcb92bacfa11 -8d336654833833558e01b7213dc0217d7943544d36d25b46ecc1e31a2992439679205b5b3ab36a8410311109daa5aa00 -95113547163e969240701e7414bf38212140db073f90a65708c5970a6aaf3aba029590a94839618fc3f7dd4f23306734 -a959d77a159b07b0d3d41a107c24a39f7514f8ce24efa046cfcf6ace852a1d948747f59c80eb06277dce1a2ba2ec8ea9 -8d2cb52dd7f5c56ef479c0937b83b8519fa49eb19b13ea2ec67266a7b3d227fb8d0c2454c4618d63da1c8e5d4171ac7b -9941698c5078936d2c402d7db6756cc60c542682977f7e0497906a45df6b8d0ffe540f09a023c9593188ba1b8ce6dfcb -9631d9b7ec0fc2de8051c0a7b68c831ba5271c17644b815e8428e81bad056abb51b9ca2424d41819e09125baf7aaf2d4 -a0f3d27b29a63f9626e1925eec38047c92c9ab3f72504bf1d45700a612682ad4bf4a4de41d2432e27b745b1613ff22f9 -80e3701acfd01fc5b16ecfa0c6c6fd4c50fe60643c77de513f0ad7a1a2201e49479aa59056fd6c331e44292f820a6a2c -a758c81743ab68b8895db3d75030c5dd4b2ccc9f4a26e69eb54635378a2abfc21cba6ca431afb3f00be66cffba6ab616 -a397acb2e119d667f1ab5f13796fd611e1813f98f554112c4c478956c6a0ebaceef3afae7ee71f279277df19e8e4543a -a95df7d52b535044a7c3cf3b95a03bafd4466bdb905f9b5f5290a6e5c2ac0f0e295136da2625df6161ab49abcdacb40f -8639fc0c48211135909d9e999459568dbdbbc7439933bab43d503e07e796a1f008930e8a8450e8346ab110ec558bcbb9 -a837bcc0524614af9e7b677532fabfb48a50d8bec662578ba22f72462caabda93c35750eed6d77b936636bf165c6f14e -97d51535c469c867666e0e0d9ed8c2472aa27916370e6c3de7d6b2351a022e2a5330de6d23c112880b0dc5a4e90f2438 -aadb093c06bd86bd450e3eb5aa20f542d450f9f62b4510e196f2659f2e3667b0fe026517c33e268af75a9c1b2bc45619 -860cef2e0310d1a49a9dd6bc18d1ca3841ed1121d96a4f51008799b6e99eb65f48838cd1e0c134f7358a3346332f3c73 -b11c4f9e7ef56db46636474a91d6416bcb4954e34b93abf509f8c3f790b98f04bd0853104ec4a1ff5401a66f27475fce -87cb52e90a96c5ee581dc8ab241e2fd5df976fe57cc08d9ffda3925a04398e7cffaf5a74c90a7319927f27c8a1f3cef5 -b03831449f658a418a27fd91da32024fdf2b904baf1ba3b17bbf9400eaddc16c3d09ad62cc18a92b780c10b0543c9013 -94e228af11cb38532e7256fa4a293a39ffa8f3920ed1c5ad6f39ce532e789bb262b354273af062add4ca04841f99d3aa -99eb3aeb61ec15f3719145cf80501f1336f357cc79fca6981ea14320faed1d04ebe0dbce91d710d25c4e4dc5b6461ebf -920a3c4b0d0fbe379a675e8938047ea3ec8d47b94430399b69dd4f46315ee44bd62089c9a25e7fa5a13a989612fe3d09 -b6414a9a9650100a4c0960c129fa67e765fe42489e50868dd94e315e68d5471e11bfbc86faffb90670e0bec6f4542869 -94b85e0b06580a85d45e57dae1cfd9d967d35bdfcd84169ef48b333c9321f2902278c2594c2e51fecd8dbcd221951e29 -b2c0a0dd75e04a85def2a886ee1fda51f530e33b56f3c2cf61d1605d40217aa549eef3361d05975d565519c6079cc2ac -abb0ea261116c3f395360d5ac731a7514a3c290f29346dc82bacb024d5455d61c442fefe99cc94dddcae47e30c0e031f -a32d95ae590baa7956497eddf4c56bff5dfdc08c5817168196c794516610fcc4dbcd82cf9061716d880e151b455b01e0 -8bd589fb6e3041f3ef9b8c50d29aed1a39e90719681f61b75a27489256a73c78c50c09dd9d994c83f0e75dfe40b4de84 -82d01cdaf949d2c7f4db7bfadbf47e80ff9d9374c91512b5a77762488308e013689416c684528a1b16423c6b48406baf -b23e20deb7e1bbbc328cbe6e11874d6bdbb675704a55af1039b630a2866b53d4b48419db834a89b31ebed2cfc41278dd -a371559d29262abd4b13df5a6a5c23adab5a483f9a33a8d043163fcb659263322ee94f872f55b67447b0a488f88672d6 -85b33ddf4a6472cacc0ed9b5ec75ed54b3157e73a2d88986c9afa8cb542e662a74797a9a4fec9111c67e5a81c54c82b3 -af1248bc47a6426c69011694f369dc0ec445f1810b3914a2ff7b830b69c7e4eaa4bafec8b10ed00b5372b0c78655a59b -94b261ed52d5637fd4c81187000bd0e5c5398ce25797b91c61b30d7b18d614ab9a2ca83d66a51faf4c3f98714e5b0ea5 -953d4571c1b83279f6c5958727aaf9285d8b8cbdbfbaff51527b4a8cfdd73d3439ba862cdb0e2356e74987ff66d2c4d9 -b765dae55d0651aca3b3eaef4ca477f0b0fda8d25c89dccd53a5573dd0c4be7faaadaa4e90029cdd7c09a76d4ce51b91 -b6d7b7c41556c85c3894d0d350510b512a0e22089d3d1dd240ad14c2c2b0ce1f003388100f3154ad80ec50892a033294 -a64561dc4b42289c2edf121f934bc6a6e283d7dce128a703f9a9555e0df7dda2825525dbd3679cd6ba7716de230a3142 -a46c574721e8be4a3b10d41c71057270cca42eec94ca2268ee4ab5426c7ce894efa9fa525623252a6a1b97bcf855a0a5 -a66d37f1999c9c6e071d2a961074c3d9fdcf9c94bf3e6c6ed82693095538dd445f45496e4c83b5333b9c8e0e64233adc -ab13814b227a0043e7d1ff6365360e292aca65d39602d8e0a574d22d25d99ccb94417c9b73095632ff302e3d9a09d067 -b2c445b69cff70d913143b722440d2564a05558d418c8ef847483b5196d7e581c094bae1dbb91c4499501cfa2c027759 -87cbde089962d5f093324b71e2976edbe6ad54fb8834dd6e73da9585b8935fca1c597b4d525949699fdfa79686721616 -a2c7e60966acb09c56cf9ad5bdcc820dcabf21ef7784970d10353048cf3b7df7790a40395561d1064e03109eaac0df98 -8ea7b8af208678178553946b2ee9e68c0e751b34f3652409a5e66c40d3aee3a40ba6ffe2175ce16c6a81b78ecc597d02 -960234239e1e3ea262e53d256ad41b2fe73f506b3d130732d0ee48819eb8a9c85bb5106a304874d8625afae682c34015 -858459694c4e8fdafa6cdaee1184e1305ca6e102222b99b8e283dd9bb3ebf80e55d6c4d8831a072b813c8eceb8124d95 -a30a8ce0f44aeb5590dc618c81c7cac441470ce79fd7881a8f2ea4ca5f9d848ebde762fcaee985cbd3d5990367403351 -a83867643672248b07d3705813b56489453e7bc546cdba570468152d9a1bd04f0656034e7d03736ea156fc97c88dc37f -a7bb52e0fc58b940dc47ea4d0a583012ee41fad285aba1a60a6c54fa32cfe819146888c5d63222c93f90de15745efb2b -8627bcc853bdeaad37f1d0f7d6b30ada9b481ccdf79b618803673de8a142e8a4ce3e7e16caed1170a7332119bcdc10a9 -8903d9dc3716b59e8e99e469bd9fde6f4bca857ce24f3a23db817012f1ea415c2b4656c7aeca31d810582bb3e1c08cc6 -875169863a325b16f892ad8a7385be94d35e398408138bd0a8468923c05123d53dba4ce0e572ea48fcdadd9bd9faa47a -b255b98d46d6cc44235e6ce794cc0c1d3bd074c51d58436a7796ce6dc0ae69f4edaa3771b35d3b8a2a9acd2f6736fab3 -9740c4d0ee40e79715a70890efda3455633ce3a715cbfc26a53e314ebbe61937b0346b4859df5b72eb20bcba96983870 -a44ce22ab5ddc23953b02ec187a0f419db134522306a9078e1e13d5bf45d536450d48016a5e1885a346997003d024db0 -90af81c08afdccd83a33f21d0dc0305898347f8bd77cc29385b9de9d2408434857044aec3b74cb72585338c122e83bb4 -80e162a7656c9ae38efa91ae93e5bd6cb903f921f9f50874694b9a9e0e2d2595411963d0e3f0c2d536b86f83b6e4d6ef -8b49fa6babe47291f9d290df35e94e83be1946784b9c7867efd8bc97a12be453013939667164b24aeb53d8950288a442 -a1df6435d718915df3da6dda61da1532a86e196dc7632703508679630f5f14d4cb44ce89eff489d7ff3fe599cc193940 -afd44c143dbb94c71acc2a309c9c88b8847ef45d98479fccce9920db9b268e8e36f8db9f02ff4ee3cff01e548f719627 -b2cf33d65d205e944b691292c2d9b0b124c9de546076dd80630742989f1ffd07102813c64d69ba2a902a928a08bce801 -b9f295e9f9eca432b2d5c77d6316186027caca40a6d6713f41356497a507b6e8716fb471faf973aaa4e856983183c269 -b3bd50c4b034473edce4b9be1171376a522899cb0c1a1ae7dc22dd2b52d20537cf4129797235084648ac4a3afc1fa854 -8ef37683d7ca37c950ba4df72564888bedaf681931d942d0ea88ead5cc90f4cbef07985a3c55686a225f76f7d90e137d -82107855b330bc9d644129cebecf2efbfab90f81792c3928279f110250e727ce12790fd5117501c895057fa76a484fc0 -816a5474c3b545fb0b58d3118cc3088a6d83aad790dbf93025ad8b94a2659cceba4fa6a6b994cb66603cc9aef683a5e3 -8f633f9b31f3bb9b0b01ea1a8830f897ecd79c28f257a6417af6a5f64e6c78b66c586cf8d26586830bd007fb6279cd35 -acb69d55a732b51693d4b11f7d14d21258d3a3af0936385a7ce61e9d7028a8fe0dd902bda09b33fb728bc8a1bc542035 -8d099582ac1f46768c17bf5a39c13015cfe145958d7fc6ddfd2876ad3b1a55a383fbe940e797db2b2b3dc8a232f545dc -97a4dd488b70bf772348ececaca4cf87bc2875d3846f29fe6ef01190c5b030219b9e4f8137d49ea0cc50ca418024c488 -b4d81148f93fa8ec0656bbfb5f9d96bbf5879fa533004a960faac9fd9f0fe541481935fdf1f9b5dd08dff38469ef81c5 -8e9b2ae4fc57b817f9465610a77966caaff013229018f6c90fa695bd734cb713b78a345b2e9254b1aff87df58c1cd512 -99eb7126e347c636e9a906e6bfdc7c8ca0c1d08580c08e6609889a5d515848c7ca0f32ab3a90c0e346f976a7883611f7 -8ca87944aa3e398492b268bda0d97917f598bc0b28584aa629dfec1c3f5729d2874db422727d82219880577267641baa -88ab0e290dc9a6878d6b4e98891ff6bfc090e8f621d966493fcbe1336cc6848fcbb958d15abcfa77091d337da4e70e74 -8956a2e1dc3ec5eb21f4f93a5e8f0600a06e409bb5ec54e062a1290dff9ce339b53fbbfc4d42b4eed21accea07b724d6 -8d22220da9dc477af2bddb85c7073c742c4d43b7afee4761eba9346cadbcd522106ed8294281a7ef2e69883c28da0685 -90dafd9a96db7e1d6bde424245305c94251d5d07e682198ae129cd77bd2907a86d34722cbde06683cc2ca67cebe54033 -b5202e62cf8ea8e145b12394bd52fd09bda9145a5f78285b52fda4628c4e2ccfc2c208ecde4951bd0a59ac03fa8bc202 -8959856793ba4acf680fb36438c9722da74d835a9fe25a08cf9e32d7800c890a8299c7d350141d2e6b9feceb2ebb636f -ab0aa23c1cd2d095825a3456861871d298043b615ae03fcd9283f388f0deef3cc76899e7fde15899e3edf362b4b4657f -9603b333cc48fe39bea8d9824cfee6ac6c4e21668c162c196ecd1ff08ef4052ace96a785c36b8f7906fdcb6bc8802ddd -93bfecbc3c7cc03c563240e109850a74948f9fa078eb903b322368cda0b50888663a17953579578ba060b14dbf053024 -b01f843b808cf7939a474de155a45462e159eb5044f00c6d77e0f7ec812720a3153209e971a971ccbf5ebee76ec4074f -b009e0567c3c75ed767247d06fa39049a4d95df3392d35a9808cb114accf934e78f765cd18a2290efef016f1918c7aeb -ad35631df8331da3a12f059813dfa343d831225a392f9c7e641c7d23a6c1ad8df8e021201c9f6afb27c1575948d6bf68 -a89c2a631d84128471c8ef3d24b6c35c97b4b9b5dad905c1a092fb9396ae0370e215a82308e13e90e7bb6ebcc455eb2a -b59c7f5fbfeb02f8f69e6cedef7ff104982551f842c890a14834f5e834b32de1148cf4b414a11809d53dd3f002b15d6a -aa6f267305b55fede2f3547bc751ba844ce189d0b4852022712b0aee474de54a257d4abcd95efe7854e33a912c774eba -afddd668f30cce70904577f49071432c49386ec27389f30a8223b5273b37e6de9db243aceb461a7dc8f1f231517463a9 -b902a09da9157b3efa1d98f644371904397019d0c84915880628a646a3ad464a9d130fdc651315098179e11da643ad2e -b05f31957364b016c6f299ae4c62eede54cab8ea3871d49534828c8bdc6adbc6a04a708df268f50107d81d1384d983ae -b4c3f7284802e614ddf1f51640f29e7139aae891467d5f62778310372071793e56fbd770837b97d501191edd0da06572 -b4eddb7c3775fb14fac7f63bb73b3cde0efa2f9a3b70e6a65d200765f6c4b466d3d76fcd4d329baee88e2aba183b8e69 -a83e7dbae5a279f0cfd1c94e9849c58a3d4cecc6d6d44bb9b17508576ca347fca52c2c81371d946b11a09d4ed76ec846 -8018ea17e2381c0233867670f9e04c8a47ace1207fdcf72dce61b6c280ba42d0a65f4b4e0b1070cc19c7bb00734974d9 -af90b541dfed22e181ff3ef4cf11f5e385fd215c1e99d988e4d247bc9dcee9f04f2182b961797c0bcc5f2aaa05c901a9 -a37046e44cf35944e8b66df80c985b8a1aa7004a2fd0b81ac251638977d2ff1465f23f93ac0ce56296f88fdc591bbdd7 -a735bd94d3be9d41fcd764ec0d8d7e732c9fc5038463f7728fd9d59321277e2c73a45990223bd571dab831545d46e7aa -94b32dcb86f5d7e83d70a5b48fe42c50f419be2f848f2d3d32ee78bf4181ab18077a7666eedb08607eece4de90f51a46 -a7f0804cafbf513293485afc1b53117f0cbfaea10919e96d9e4eb06f0c96535e87065d93f3def1bbc42044dbb00eb523 -aaaad1166d7f19f08583dd713275a71a856ab89312f84ca8078957664924bb31994b5c9a1210d0c41b085be4058ed52e -a1757aac9f64f953e68e680985a8d97c5aac8688b7d90f4db860166dd3d6119e8fca7d700a9530a2b9ba3932c5e74e33 -98cada5db4a1430c272bfc1065fb685872e664ed200d84060ee9f797d0a00864f23943e0fb84ba122a961996a73dfb14 -a5e609f716dc7729d1247f40f9368a2e4a15067e1dd6a231fece85eeefb7e7d4a5ac8918fb376debd79d95088750b2ca -b5365eb8caab8b1118619a626ff18ce6b2e717763f04f6fa8158cdca530c5779204efa440d088083f1a3685454aa0555 -a6e01b8da5f008b3d09e51a5375d3c87c1da82dff337a212223e4d0cdb2d02576d59f4eef0652d6b5f2fc806d8c8149c -ae310f613d81477d413d19084f117248ad756572c22a85b9e4c86b432e6c602c4a6db5edf2976e11f7353743d679e82a -a1f219c0b8e8bb8a9df2c6c030acbb9bbfa17ba3db0366f547da925a6abb74e1d7eb852bd5a34bae6ac61d033c37e9dc -a2087fa121c0cdd5ea495e911b4bc0e29f1d5c725aadfb497d84434d2291c350cdaa3dc8c85285f65a7d91b163789b7a -929c63c266da73d726435fa89d47041cfe39d4efa0edce7fc6eca43638740fbc82532fd44d24c7e7dd3a208536025027 -91c1051dcc5f52ad89720a368dddd2621f470e184e746f5985908ba34e1d3e8078a32e47ab7132be780bea5277afecb0 -ae089b90ba99894d5a21016b1ea0b72a6e303d87e59fb0223f12e4bb92262e4d7e64bfdbdb71055d23344bc76e7794b2 -8b69aa29a6970f9e66243494223bad07ac8f7a12845f60c19b1963e55a337171a67bdc27622153016fce9828473a3056 -95ca6b08680f951f6f05fd0d180d5805d25caf7e5bda21c218c1344e661d0c723a4dfc2493642be153793c1b3b2caaa4 -a4789dc0f2a07c794dab7708510d3c893d82ddbd1d7e7e4bbbeca7684d9e6f4520fb019b923a06c7efab0735f94aa471 -93c4f57a3cf75085f5656b08040f4cd49c40f1aab6384a1def4c5c48a9fe4c03514f8e61aabe2cfa399ff1ccac06f869 -b6c37f92c76a96b852cd41445aa46a9c371836dd40176cc92d06666f767695d2284a2780fdfd5efc34cf6b18bcfb5430 -9113e4575e4b363479daa7203be662c13d7de2debcda1c142137228aeead2c1c9bc2d06d93a226302fa63cc75b7353ec -b70addeb5b842ac78c70272137f6a1cef6b1d3a551d3dd906d9a0e023c8f49f9b6a13029010f3309d0b4c8623a329faf -b976a5132b7eb42d5b759c2d06f87927ef66ecd6c94b1a08e4c9e02a4ce7feca3ac91f9479daa1f18da3d4a168c2ba77 -8fdab795af64b16a7ddf3fad11ab7a85d10f4057cf7716784184960013baa54e7ba2050b0e036dc978ff8c9a25dc5832 -b2c982ad13be67d5cdc1b8fac555d4d1ec5d25f84e58b0553a9836f8f9e1c37582d69ad52c086a880a08b4efcccd552e -810661d9075ae6942735215f2ab46d60763412e1f6334e4e00564b6e5f479fc48cf37225512abbccf249c0ca225fc935 -a0c4bf00a20f19feff4004004f08231b4c6c86ac4ed57921eea28d7dea32034f3f4ab5b7ded7184f6c7ffbf5847232ad -b2bb5a9eea80bf067f3686a488529d9c2abd63fc9e1d4d921b1247ef86d40cd99e0a8b74f750e85c962af84e84e163a6 -887ee493c96d50f619ba190ce23acddc5f31913e7a8f1895e6339d03794ecefd29da5f177d1d25bc8df8337ae963fc7b -b7966fb07029d040f2228efa2cfcd04341e4666c4cf0b653e6e5708631aa2dd0e8c2ac1a62b50c5a1219a2737b82f4f7 -92234cfd6b07f210b82db868f585953aafbcbc9b07b02ded73ff57295104c6f44a16e2775ca7d7d8ee79babb20160626 -8d3cd7f09c6fd1072bc326ff329e19d856e552ac2a9f20274bc9752527cd3274142aa2e32b65f285fb84bc3adaaea3cc -8caed1cb90d8cd61e7f66edc132672172f4fa315e594273bb0a7f58a75c30647ec7d52eda0394c86e6477fbc352f4fe8 -ae192194b09e9e17f35d8537f947b56f905766c31224e41c632c11cd73764d22496827859c72f4c1ab5fd73e26175a5d -8b7be56aac76d053969e46882d80a254e89f55c5ab434883cbafc634a2c882375898074a57bc24be3c7b2c56401a7842 -98bc4a7a9b05ba19f6b85f3ee82b08bed0640fd7d24d4542eb7a7f7fde443e880bdb6f5499bd8cb64e1ddd7c5f529b19 -a5a41eaa5e9c1d52b00d64ab72bc9def6b9d41972d80703e9bfe080199d4e476e8833a51079c6b0155b78c3ab195a2a7 -a0823f6f66465fd9be3769c164183f8470c74e56af617f8afd99b742909d1a51f2e0f96a84397597afbd8eeaabb51996 -801da41d47207bdd280cc4c4c9753a0f0e9d655e09e0be5f89aeed4ce875a904f3da952464399bf8efc2398940d5fba2 -a719314085fd8c9beac4706c24875833d59a9a59b55bca5da339037c0a5fc03df46dbecb2b4efcfed67830942e3c4ea1 -a75dde0a56070bb7e9237b144ea79f578d413a1cbbd1821cee04f14f533638b24f46d88a7001e92831843b37ed7a709f -a6b4ef8847a4b980146e1849e1d8ab38695635e0394ca074589f900ce41fa1bb255938dc5f37027523bac6a291779bef -b26d84dfd0b7bd60bcfdbea667350462a93dca8ff5a53d6fc226214dcb765fada0f39e446a1a87f18e4e4f4a7133155f -ae7bd66cc0b72f14ac631ff329a5ca4958a80ba7597d6da049b4eb16ac3decde919ca5f6f9083e6e541b303fb336dc2f -a69306e6bfbbc10de0621cffb13c586e2fcfd1a80935e07c746c95651289aec99066126a6c33cb8eb93e87d843fc631f -a47e4815585865218d73c68ba47139568ea7ae23bfa863cb914a68454242dd79beaec760616b48eea74ceab6df2298dd -b2da3cfb07d0721cd226c9513e5f3ace98ed2bc0b198f6626b8d8582268e441fa839f5834f650e2db797655ca2afa013 -b615d0819554f1a301a704d3fc4742bd259d04ad75d50bccee3a949b6226655f7d623301703506253cca464208a56232 -85e06ed5797207f0e7ae85909e31776eb9dae8af2ec39cc7f6a42843d94ea1de8be2a3cdadfcbe779da59394d4ffeb45 -8c3529475b5fdbc636ee21d763f5ec11b8cb040a592116fb609f8e89ca9f032b4fa158dd6e9ceab9aceb28e067419544 -accddb9c341f32be82b6fa2ef258802c9ae77cd8085c16ec6a5a83db4ab88255231b73a0e100c75b7369a330bfc82e78 -93b8e4c6e7480948fa17444b59545a5b28538b8484a75ad6bc6044a1d2dbd76e7c44970757ca53188d951dc7347d6a37 -90111721d68b29209f4dc4cfb2f75ab31d15c55701922e50a5d786fb01707ab53fcec08567cd366362c898df2d6e0e93 -b60a349767df04bd15881c60be2e5cc5864d00075150d0be3ef8f6b778715bebca8be3be2aa9dbdc49f1a485aeb76cda -b8d5a967fdd3a9bcf89a774077db39ef72ca9316242f3e5f2a350202102d494b2952e4c22badecd56b72ba1eea25e64b -8499ebd860f31f44167183b29574447b37a7ee11efcc9e086d56e107b826b64646b1454f40f748ccac93883918c89a91 -99c35e529782db30f7ccab7f31c225858cf2393571690b229ece838ec421a628f678854a1ddbd83fa57103ccebd92c7f -99817660d8b00cbe03ec363bcdc5a77885586c9e8da9e01a862aca0fc69bf900c09b4e929171bc6681681eae10450541 -8055e130964c3c2ebd980d3dc327a40a416bcdbf29f480480a89a087677a1fb51c823b57392c1db72f4093597100b8d3 -877eaddef845215f8e6f9ed24060c87e3ab6b1b8fbb8037d1a57e6a1e8ed34d00e64abb98d4bf75edb5c9788cbdccbef -b5432bbff60aeae47f2438b68b123196dfb4a65cc875b8e080501a4a44f834b739e121bec58d39ac36f908881e4aa8ab -b3c3f859b7d03ff269228c0f9a023b12e1231c73aba71ad1e6d86700b92adc28dfa3757c052bbc0ba2a1d11b7fda4643 -ab8a29f7519a465f394ef4a5b3d4924d5419ca1489e4c89455b66a63ac430c8c9d121d9d2e2ed8aa1964e02cd4ebac8c -866ae1f5c2a6e159f2e9106221402d84c059f40d166fab355d970773189241cd5ee996540d7c6fc4faf6f7bcff967dce -973a63939e8f1142a82b95e699853c1e78d6e05536782b9bb178c799b884f1bc60177163a79a9d200b5ff4628beeb9e7 -a5fc84798d3e2d7632e91673e89e968f5a67b7c8bb557ea467650d6e05e7fe370e18d9f2bdd44c244978295cf312dc27 -b328fe036bcd0645b0e6a15e79d1dd8a4e2eda128401a4e0a213d9f92d07c88201416fc76193bb5b1fe4cb4203bab194 -99239606b3725695a570ae9b6fb0fb0a34ad2f468460031cfa87aa09a0d555ff606ff204be42c1596c4b3b9e124b8bd6 -af3432337ca9d6cce3574e23e5b7e4aa8eda11d306dc612918e970cc7e5c756836605a3391f090a630bac0e2c6c42e61 -8a545b3cb962ce5f494f2de3301de99286c4d551eaa93a9a1d6fef86647321834c95bf754c62ec6c77116a21494f380d -8f9b8ea4c25469c93556f1d91be583a5f0531ac828449b793ba03c0a841c9c73f251f49dd05cbb415f5d26e6f6802c99 -a87199e33628eeffd3aff114e81f53dd54fba61ba9a9a4d7efdbff64503f25bc418969ab76ef1cf9016dd344d556bb29 -a2fda05a566480602274d7ffcaefdd9e94171286e307581142974f57e1db1fa21c30be9e3c1ac4c9f2b167f92e7c7768 -a6235d6a23304b5c797efb2b476ed02cb0f93b6021a719ae5389eb1e1d032944ae4d69aec2f29fcd6cbc71a6d789a3ba -a7f4a73215f7e99e2182c6157dd0f22e71b288e696a8cff2450689a3998f540cfb82f16b143e90add01b386cb60d8a33 -922d8f9cd55423f5f6a60d26de2f8a396ac4070a6e2dc956e50c2a911906aa364d4718aea29c5b61c12603534e331e7e -96d7fdf5465f028fc28f21fbfe14c2db2061197baf26849e6a0989a4ea7d5e09ab49a15ba43a5377b9354d01e30ce860 -8f94c4255a0fc1bd0fa60e8178c17f2a8e927cac7941c5547d2f8f539e7c6ed0653cab07e9fb1f2c56cdd03bb876512a -95984c10a2917bfa6647ebce69bf5252d9e72d9d15921f79b2c6d7c15ee61342b4fb8a6d34838e07132b904f024ded04 -93e65e765a574277d3a4d1d08ca2f2ff46e9921a7806ca8ca3d8055f22d6507744a649db7c78117d9168a1cbdb3bbc61 -8d453b7364662dc6f36faf099aa7cbbe61151d79da7e432deba7c3ed8775cfe51eaf1ba7789779713829dde6828e189a -acffa3ee6c75160286090162df0a32a123afb1f9b21e17fd8b808c2c4d51a4270cab18fba06c91ef9d22e98a8dc26cdd -a5597cc458186efa1b3545a3926f6ecaaa6664784190e50eed1feac8de56631bee645c3bac1589fa9d0e85feb2be79d4 -87ba9a898df9dfa7dabc4ab7b28450e4daf6013340e329408d1a305de959415ab7315251bad40511f917dfc43974e5f0 -a598778cf01d6eef2c6aabc2678e1b5194ee8a284ebd18a2a51a3c28a64110d5117bcbf68869147934e600572a9e4c8a -84c69a4ad95861d48709f93ade5ac3800f811b177feb852ebcd056e35f5af5201f1d8a34ab318da8fe214812d0a7d964 -9638a237e4aed623d80980d91eda45e24ebf48c57a25e389c57bd5f62fa6ffa7ca3fb7ae9887faf46d3e1288af2c153b -800f975721a942a4b259d913f25404d5b7b4c5bf14d1d7e30eee106a49cb833b92058dab851a32ee41faf4ef9cb0dea4 -b9127a34a59fed9b5b56b6d912a29b0c7d3cb9581afc9bd174fc308b86fdb076f7d436f2abc8f61cef04c4e80cd47f59 -8004eda83f3263a1ccfc8617bc4f76305325c405160fb4f8efeff0662d605e98ba2510155c74840b6fe4323704e903c4 -aa857b771660d6799ff03ccad1ab8479e7f585a1624260418fc66dc3e2b8730cfa491d9e249505141103f9c52f935463 -98b21083942400f34cde9adbe1977dee45ba52743dc54d99404ad9da5d48691ddea4946f08470a2faad347e9535690c7 -a4b766b2faec600a6305d9b2f7317b46f425442da0dc407321fc5a63d4571c26336d2bccedf61097f0172ec90fb01f5f -b9736619578276f43583de1e4ed8632322ea8a351f3e1506c5977b5031d1c8ad0646fb464010e97c4ddb30499ddc3fb0 -973444ffaff75f84c17f9a4f294a13affd10e2bceed6b4b327e4a32c07595ff891b887a9f1af34d19766d8e6cb42bfd1 -b09ce4964278eff81a976fbc552488cb84fc4a102f004c87179cb912f49904d1e785ecaf5d184522a58e9035875440ef -b80c2aa3d0e52b4d8b02c0b706e54b70c3dbca80e5e5c6a354976721166ea0ca9f59c490b3e74272ef669179f53cb50d -8e52fa5096ff960c0d7da1aa4bce80e89527cdc3883eba0c21cb9a531088b9d027aa22e210d58cf7cbc82f1ec71eb44f -969f85db95f455b03114e4d3dc1f62a58996d19036513e56bee795d57bf4ed18da555722cd77a4f6e6c1a8e5efe2f5d7 -ab84b29b04a117e53caea394a9b452338364c45a0c4444e72c44132a71820b96a6754828e7c8b52282ad8dca612d7b6a -83e97e9ab3d9e453a139c9e856392f4cef3ec1c43bce0a879b49b27a0ce16f9c69063fd8e0debbe8fabafc0621bc200c -8c138ebdf3914a50be41be8aa8e2530088fb38af087fa5e873b58b4df8e8fd560e8090c7a337a5e36ef65566409ad8f3 -a56da9db2f053516a2141c1a8ed368ae278ab33a572122450249056857376d1dffc76d1b34daf89c86b6fe1ead812a0c -a3233ea249f07531f5bc6e94e08cea085fd2b2765636d75ff5851f224f41a63085510db26f3419b031eb6b5143735914 -b034bb6767ce818371c719b84066d3583087979ba405d8fbb2090b824633241e1c001b0cb0a7856b1af7a70e9a7b397e -8722803fe88877d14a4716e59b070dd2c5956bb66b7038f6b331b650e0c31230c8639c0d87ddc3c21efc005d74a4b5cc -8afe664cb202aacf3bd4810ebf820c2179c11c997f8c396692a93656aa249a0df01207c680157e851a30330a73e386b9 -a999e86319395351d2b73ff3820f49c6516285e459224f82174df57deb3c4d11822fd92cbbed4fc5a0a977d01d241b19 -9619408e1b58b6610d746b058d7b336d178e850065ba73906e08e748651e852f5e3aab17dcadcb47cc21ff61d1f02fcf -947cf9c2ed3417cd53ea498d3f8ae891efe1f1b5cd777e64cec05aba3d97526b8322b4558749f2d8a8f17836fb6e07aa -aec2fdae2009fda6852decb6f2ff24e4f8d8ca67c59f92f4b0cf7184be72602f23753ed781cf04495c3c72c5d1056ffe -8dba3d8c09df49fbfc9506f7a71579348c51c6024430121d1c181cad7c9f7e5e9313c1d151d46d4aa85fb0f68dd45573 -b6334cb2580ae33720ebf91bb616294532a1d1640568745dcda756a3a096786e004c6375728a9c2c0fb320441e7d297a -9429224c1205d5ecd115c052b701c84c390f4e3915275bb8ce6504e08c2e9b4dd67b764dd2ea99f317b4c714f345b6ff -abe421db293f0e425cfd1b806686bdfd8fdbac67a33f4490a2dc601e0ddbf69899aa9a119360dad75de78c8c688ca08b -95c78bffed9ae3fff0f12754e2bd66eb6a9b6d66a9b7faaeb7a1c112015347374c9fe6ce14bf588f8b06a78e9a98f44c -ac08f8b96b52c77d6b48999a32b337c5ad377adf197cda18dbdf6e2a50260b4ee23ca6b983f95e33f639363e11229ee4 -911a0e85815b3b9f3ba417da064f760e84af94712184faeb9957ddd2991dee71c3f17e82a1a8fbeec192b0d73f0ebce7 -aa640bd5cb9f050568a0ad37168f53b2f2b13a91e12b6980ca47ae40289cf14b5b89ddd0b4ca452ce9b1629da0ce4b5d -907486f31b4ecea0125c1827007ea0ecb1c55cadb638e65adc9810ca331e82bb2fd87e3064045f8d2c5d93dc6c2f5368 -8cbfaf4ce0bbbf89208c980ff8b7bc8f3cfef90f0fe910f463cb1c0f8e17cce18db120142d267045a00ba6b5368f0dd3 -9286f08f4e315df470d4759dec6c9f8eacef345fc0c0b533ad487bb6cfefa8c6c3821a22265c9e77d34170e0bc0d078b -94a3c088bc1a7301579a092b8ece2cefc9633671bc941904488115cd5cb01bd0e1d2deef7bdccb44553fd123201a7a53 -8f3d0114fbf85e4828f34abb6d6fddfa12789d7029d9f1bb5e28bc161c37509afdab16c32c90ec346bc6a64a0b75726f -a8ed2d774414e590ec49cb9a3a726fafd674e9595dd8a1678484f2897d6ea0eea1a2ee8525afac097b1f35e5f8b16077 -9878789ff33b11527355a317343f34f70c7c1aa9dc1eca16ca4a21e2e15960be8a050ec616ffb97c76d756ce4bce2e90 -854e47719dae1fe5673cacf583935122139cf71a1e7936cf23e4384fbf546d48e9a7f6b65c3b7bf60028e5aa1234ba85 -af74bdda2c6772fe9a02d1b95e437787effad834c91c8174720cc6e2ea1f1f6c32a9d73094fc494c0d03eef60b1a0f05 -80a3e22139029b8be32cb167d3bc9e62d16ca446a588b644e53b5846d9d8b7ab1ad921057d99179e41515df22470fb26 -86c393afd9bd3c7f42008bba5fe433ec66c790ebd7aa15d4aeaf9bb39a42af3cfaf8c677f3580932bbd7ada47f406c8c -90433c95c9bb86a2c2ddcf10adccb521532ebd93db9e072671a4220f00df014e20cd9ce70c4397567a439b24893808dc -95b2c170f08c51d187270ddc4f619300b5f079bbc89dbca0656eae23eecc6339bf27fa5bf5fd0f5565d4021105e967d2 -8e5eced897e2535199951d4cff8383be81703bca3818837333dd41a130aa8760156af60426ceadb436f5dea32af2814c -a254a460ebefbe91d6e32394e1c8f9075f3e7a2bb078430ac6922ab14d795b7f2df1397cb8062e667d809b506b0e28d4 -ac2062e8ca7b1c6afb68af0ebab31aebd56fc0a0f949ef4ea3e36baf148681619b7a908facf962441905782d26ecbdb5 -8b96af45b283b3d7ffeec0a7585fc6b077ea5fd9e208e18e9f8997221b303ab0ce3b5bafa516666591f412109ce71aa5 -afd73baada5a27e4fa3659f70083bf728d4dc5c882540638f85ea53bf2b1a45ddf50abc2458c79f91fb36d13998c7604 -a5d2fff226e80cb2e9f456099812293333d6be31dd1899546e3ad0cd72b2a8bcb45ec5986e20faa77c2564b93983210c -a8c9b8de303328fbdaccf60f4de439cf28f5360cf4104581dc2d126bc2e706f49b7281723487ff0eaf92b4cc684bc167 -a5d0d5849102bf1451f40e8261cb71fc57a49e032773cb6cd7b137f71ee32438d9e958077ffafce080a116ccc788a2d4 -80716596f502d1c727d5d2f1469ce35f15e2dbd048d2713aa4975ee757d09c38d20665326bd63303cfe7e820b6de393d -97baf29b20f3719323cc1d5de23eaa4899dc4f4e58f6c356ec4c3ad3896a89317c612d74e0d3ab623fe73370c5972e2f -b58bdc9aa5061bf6e5add99a7443d7a8c7ba8f6875b8667d1acbe96fc3ecafbdcc2b4010cb6970a3b849fff84660e588 -b6be68728776d30c8541d743b05a9affc191ad64918fdbd991d2ddd4b32b975c4d3377f9242defef3805c0bfb80fbac7 -b0cddace33333b8a358acad84b9c83382f0569d3854b4b34450fd6f757d63c5bdab090e330b0f86e578f22c934d09c36 -854bd205d6051b87f9914c8c2494075d7620e3d61421cc80f06b13cea64fd1e16c62c01f107a5987d10b8a95a8416ad9 -80351254a353132300ba73a3d23a966f4d10ce9bf6eae82aedb6cdc30d71f9d08a9dd73cb6441e02a7b2ad93ad43159c -937aae24fb1b636929453fc308f23326b74c810f5755d9a0290652c9c2932ad52cc272b1c83bd3d758ef7da257897eae -b84d51ef758058d5694ffeac6d8ce70cef8d680a7902f867269c33717f55dd2e57b25347841d3c0872ae5f0d64f64281 -a4b31bb7c878d5585193535b51f04135108134eff860f4eac941053155f053d8f85ff47f16268a986b2853480a6e75e6 -93543f0828835186a4af1c27bdf97b5dd72b6dfa91b4bf5e759ff5327eaf93b0cb55d9797149e465a6b842c02635ffe5 -afdac9e07652bf1668183664f1dd6818ef5109ee9b91827b3d7d5970f6a03e716adcc191e3e78b0c474442a18ad3fc65 -9314077b965aa2977636ae914d4a2d3ce192641a976ffa1624c116828668edbfbe5a09e3a81cb3eed0694566c62a9757 -b395ddcf5082de6e3536825a1c352802c557b3a5118b25c29f4c4e3565ecaaf4bdd543a3794d05156f91fc4ceadc0a11 -b71f774aad394c36609b8730e5be244aaebfff22e0e849acc7ee9d33bedc3ec2e787e0b8b2ffe535560fcd9e15a0897e -92e9409fa430f943a49bce3371b35ac2efb5bc09c88f70ff7120f5e7da3258a4387dfc45c8b127f2ef2668679aeb314e -8ef55bef7b71952f05e20864b10f62be45c46e2dca0ef880a092d11069b8a4aa05f2e0251726aca1d5933d7dea98f3f8 -aad3fba9e09fae885cdeef45dfafa901419f5156fb673818f92a4acc59d0e2e9870b025e711de590a63fd481164f3aa8 -b444d52af545dd3a2d3dd94e6613816b154afea0c42b96468aceb0c721395de89e53e81a25db857ca2e692dcb24ba971 -88b279fe173007e64fe58f2c4adba68a1f538dbd3d32d175aa0d026bbb05b72a0c9f5d02b8201a94adb75fe01f6aa8b2 -88494cea4260741c198640a079e584cabfea9fcfb8bcf2520c9becd2419cde469b79021e5578a00d0f7dbc25844d2683 -94f3cce58837c76584b26426b9abdb45f05fee34dd9e5914b6eae08e78b7262ed51c4317031dab1ad716f28b287f9fc2 -b8c7ed564f54df01c0fbd5a0c741beed8183ce0d7842dc3a862a1b335de518810077314aa9d6054bb939663362f496da -81c153320d85210394d48340619d5eb41304daea65e927266f0262c8a7598321aba82ad6c3f78e5104db2afd2823baca -ab6695a8d48a179e9cd32f205608359cf8f6a9aead016252a35b74287836aa395e76572f21a3839bec6a244aa49573e5 -920ed571539b3002a9cd358095b8360400e7304e9a0717cc8c85ab4a0514a8ad3b9bf5c30cb997647066f93a7e683da9 -a7ec7c194d1e5103bc976e072bf1732d9cb995984d9a8c70a8ee55ce23007f21b8549ad693f118aa974f693ed6da0291 -87a042d6e40c2951a68afc3ccf9646baf031286377f37f6ac47e37a0ec04d5ac69043757d7dff7959e7cd57742017a8d -b9f054dd8117dd41b6e5b9d3af32ee4a9eebef8e4a5c6daa9b99c30a9024eabeae850ab90dbdb188ca32fd31fd071445 -a8386da875799a84dc519af010eaf47cdbc4a511fe7e0808da844a95a3569ce94054efd32a4d3a371f6aba72c5993902 -8b3343a7cf4ffb261d5f2dbd217fb43590e00feac82510bdf73b34595b10ee51acae878a09efebc5a597465777ef4c05 -8312a5f1ea4f9e93578e0f50169286e97884a5ed17f1780275ab2b36f0a8aa1ab2e45c1de4c8bce87e99e3896af1fa45 -b461198cb7572ac04c484a9454954e157bdd4db457816698b7290f93a10268d75a7e1211e757c6190df6144bbb605d91 -9139764a099580d6f1d462c8bf7d339c537167be92c780e76acb6e638f94d3c54b40ed0892843f6532366861e85a515a -8bb70acb3c9e041b4fc20e92ba0f3f28f0d5c677bcb017af26f9171e07d28c3c0729bef72457231e3512f909455a13a2 -93301a18e5064c55fcfe8e860fab72da1b89a824ca77c8932023b7c79e4a51df93a89665d308a8d3aa145e46ebe6a0ad -ae3bca496fbd70ce44f916e2db875b2ce2e1ded84edd2cebc0503bdfdec40ec30e1d9afb4eb58c8fa23f7b44e71d88f8 -93cb3a918c95c5d973c0cb7621b66081ed81fba109b09a5e71e81ca01ec6a8bb5657410fdec453585309ef5bf10d6263 -95a50b9b85bb0fc8ff6d5f800d683f0f645e7c2404f7f63228a15b95ce85a1f8100e2e56c0acee19c36ed3346f190e87 -816cc4d9337461caca888809b746ab3713054f5b0eac823b795a1a9de9417c58e32a9f020fef807908fa530cbf35dee8 -a9c2890c2dd0d5d7aedc4cca7f92764086c50f92f0efd2642c59920d807086031bfe2d3ba574318db236c61a8f5f69c2 -ad0d5c8c80bddfe14bdaf507da96dc01dc9941aecc8ad3b64513d0a00d67c3f4b4659defb6839b8b18d8775e5344c107 -9047c9fad6ef452e0219e58e52c686b620e2eb769571021e3524bd7eac504f03b84834b16b849d42b3d75c601fd36bb7 -a04dd988fed91fb09cb747a3ac84efe639d7d355524cd7dee5477ecbcdec44d8ac1cec2c181755dcfdb77e9594fb3c5b -b0ea0c725debd1cec496ced9ce48f456f19af36e8b027094bf38fa37de9b9b2d10282363ea211a93a34a0a5387cace5d -b5fc46e2bb3e4653ea5e6884dcb3c14e401a6005685ee5a3983644b5b92300b7066289159923118df4332aac52045b8c -841fc5b26b23226e725e29802da86b35e4f5e3babc8b394f74e30fd5dec6d3840b19a9a096625ce79a4f1edae6369700 -8fd2bbbeea452451def3659bbe0ceb396120ebe8f81eee1ea848691614422c81d7c3e6a7a38032b4120b25c5ffa8f0c2 -9131ce3d25c3d418f50c0ab99e229d4190027ee162b8ba7c6670420ea821831dec1294ac00d66c50fac61c275a9e2c71 -99ec6eafe0eb869d128158cee97b984fb589e1af07699247946e4a85db772289dff3084d224a6f208005c342f32bbd73 -ac100fbbe7c2bf00cc56fcd5aa1f27181f82c150c53bbb1e15d2c18a51ed13dcfa7bccab85821b8ddddf493603e38809 -affd73a458d70c0d9d221e0c2da4348fed731f6b34c0b3e2d5711ba432e85a1ec92e40b83b246a9031b61f5bc824be47 -8ed30ed817816a817e9e07374ef1f94405a7e22dd0096aeaae54504382fc50e7d07b4f1186c1792fc25ea442cd7edc6b -a52370cfe99a35fa1405aeca9f922ad8d31905e41f390e514ea8d22ee66469637d6c2d4d3a7ee350d59af019ae5a10a4 -8d0b439741c57b82c8e4b994cf3956b5aeaee048b17e0a1edb98253a8d7256f436d8b2f36b7e12504132dbf91f3376b1 -8caac7e1a4486c35109cff63557a0f77d0e4ca94de0817e100678098a72b3787a1c5afc7244991cebcd1f468e18d91d4 -a729a8e64b7405db5ebfb478bb83b51741569331b88de80680e9e283cc8299ba0de07fcf252127750f507e273dc4c576 -a30545a050dad030db5583c768a6e593a7d832145b669ad6c01235813da749d38094a46ac3b965700230b8deacd91f82 -9207e059a9d696c46fa95bd0925983cd8e42aefd6b3fb9d5f05420a413cbc9e7c91213648554228f76f2dd757bde0492 -a83fa862ae3a8d98c1e854a8b17181c1025f4f445fbc3af265dc99e44bbd74cfa5cc25497fb63ee9a7e1f4a624c3202c -84cdfc490343b3f26b5ad9e1d4dcf2a2d373e05eb9e9c36b6b7b5de1ce29fda51383761a47dbd96deca593a441ccb28e -881a1aa0c60bb0284a58b0a44d3f9ca914d6d8fa1437315b9ad2a4351c4da3ee3e01068aa128284a8926787ea2a618d1 -aace78e497b32fbff4df81b1b2de69dbc650645e790953d543282cb8d004a59caf17d9d385673a146a9be70bf08a2279 -aa2da4760f1261615bffd1c3771c506965c17e6c8270c0f7c636d90428c0054e092247c3373eca2fb858211fdb17f143 -acb79f291b19e0aa8edb4c4476a172834009c57e0dcc544c7ce95084488c3ad0c63ffd51c2b48855e429b6e1a9555433 -814b58773a18d50a716c40317f8b80362b6c746a531776a9251c831d34fb63e9473197c899c0277838668babc4aa0ecb -b1f69522b0f7657d78bd1ee3020bcce3447116bf62c146d20684537d36cafb5a7a1531b86932b51a70e6d3ce0808a17e -8549712c251ef382f7abe5798534f8c8394aa8bcecdca9e7aa1a688dc19dc689dcd017a78b118f3bd585673514832fe4 -912a04463e3240e0293cfc5234842a88513ff930c47bd6b60f22d6bc2d8404e10270d46bf6900fee338d8ac873ebb771 -a327cb7c3fada842e5dd05c2eeedd6fcd8cf2bfb2f90c71c6a8819fb5783c97dd01bd2169018312d33078b2bc57e19f7 -b4794f71d3eceed331024a4cee246cc427a31859c257e0287f5a3507bfbd4d3486cb7781c5c9c5537af3488d389fe03e -82ffcb418d354ed01688e2e8373a8db07197a2de702272a9f589aed08468eab0c8f14e6d0b3146e2eb8908e40e8389c5 -910b73421298f1315257f19d0dfd47e79d7d2a98310fb293f704e387a4dc84909657f0f236b70b309910271b2f2b5d46 -a15466397302ea22f240eb7316e14d88376677b060c0b0ae9a1c936eb8c62af8530732fc2359cfd64a339a1c564f749b -a8091975a0d94cdc82fbaff8091d5230a70d6ea461532050abbdfee324c0743d14445cfe6efe6959c89a7c844feaa435 -a677d1af454c7b7731840326589a22c9e81efbbf2baf3fdeaf8ea3f263a522584fbca4405032c4cdf4a2a6109344dfc8 -894e6ffa897b6e0b37237e6587a42bbc7f2dd34fb09c2e8ac79e2b25b18180e158c6dc2dd26761dba0cfed1fb4eb4080 -928d31b87f4fe8fe599d2c9889b0ff837910427ba9132d2fba311685635458041321ae178a6331ed0c398efe9d7912f0 -afc1c4a31f0db24b53ee71946c3c1e1a0884bd46f66b063a238e6b65f4e8a675faa844e4270892035ef0dae1b1442aa0 -a294fcb23d87cf5b1e4237d478cac82ba570649d425b43b1e4feead6da1f031e3af0e4df115ca46689b9315268c92336 -85d12fd4a8fcfd0d61cbf09b22a9325f0b3f41fb5eb4285b327384c9056b05422d535f74d7dc804fb4bab8fb53d556bd -91b107d9b0ea65c48128e09072acd7c5949a02dd2a68a42ff1d63cf528666966f221005c2e5ca0a4f85df28459cdede6 -89aa5dc255c910f439732fcd4e21341707e8dd6689c67c60551a8b6685bd3547e3f47db4df9dfadd212405f644c4440b -8c307d6b827fa1adcf0843537f12121d68087d686e9cc283a3907b9f9f36b7b4d05625c33dab2b8e206c7f5aabd0c1e5 -843f48dadf8523d2b4b0db4e01f3c0ea721a54d821098b578fcaa6433e8557cadfea50d16e85133fa78f044a3e8c1e5b -9942eb8bd88a8afa9c0e3154b3c16554428309624169f66606bfb2814e8bac1c93825780cf68607f3e7cffe7bf9be737 -b7edb0c7637a5beb2332f2ae242ba4732837f9da0a83f00f9e9a77cf35516e6236eb013133ddc2f958ea09218fe260d3 -9655fe4910bc1e0208afbcf0ff977a2e23faded393671218fba0d9927a70d76514a0c45d473a97ecb00cf9031b9d527c -8434bc8b4c5839d9e4404ff17865ded8dd76af56ef2a24ea194c579d41b40ed3450c4e7d52219807db93e8e6f001f8da -b6c6d844860353dab49818bed2c80536dbc932425fdaa29915405324a6368277cf94d5f4ab45ea074072fc593318edff -b2887e04047660aa5c83aad3fa29b79c5555dd4d0628832c84ba7bf1f8619df4c9591fcde122c174de16ca7e5a95d5e3 -953ba5221360444b32911c8b24689078df3fbf58b53f3eec90923f53a22c0fc934db04dd9294e9ec724056076229cf42 -926917529157063e4aade647990577394c34075d1cb682da1acf600639d53a350b33df6a569d5ebb753687374b86b227 -b37894a918d6354dd28f850d723c1c5b839f2456e2a220f64ecadac88ae5c9e9cf9ab64b53aac7d77bf3c6dfa09632dc -b9d28148c2c15d50d1d13153071d1f6e83c7bb5cb5614adf3eb9edede6f707a36c0fa0eadb6a6135ead3c605dfb75bd1 -9738d73ea0b9154ed38da9e6bd3a741be789ea882d909af93e58aa097edf0df534849f3b1ba03099a61ceb6a11f34c4d -afabbecbbf73705851382902ec5f1da88b84a06b3abfb4df8d33df6a60993867f853d0d9bd324d49a808503615c7858a -a9e395ddd855b12c87ba8fdb0ea93c5bd045e4f6f57611b27a2ee1b8129efe111e484abc27cb256ed9dcace58975d311 -b501c2f3d8898934e45e456d36a8a5b0258aeea6ff7ac46f951f36da1ec01bd6d0914c4d83305eb517545f1f35e033cc -86f79688315241fe619b727b7f426dbd27bcc8f33aef043438c95c0751ada6f4cd0831b25ae3d53bcf61324d69ea01eb -83237e42fa773a4ccaa811489964f3fab100b9eea48c98bdef05fa119a61bde9efe7d0399369f87c775f4488120b4f2e -b89f437552cab77d0cd5f87aca52dd827fb6648c033351c00ab6d40ac0b1829b4fcdf8a7dad467d4408c691223987fbe -8e21061698cb1a233792976c2d8ab2eeb6e84925d59bb34434fff688be2b5b2973d737d9dda164bd407be852d48ef43f -b17a9e43aa4580f542e00c3212fbf974f1363f433c5502f034dfd5ed8c05ac88b901729d3b822bec391cca24cc9f5348 -aac6d6cda3e207006c042a4d0823770632fc677e312255b4aff5ad1598dc1022cab871234ad3aa40b61dc033a5b0930b -b25e69f17b36a30dada96a39bc75c0d5b79d63e5088da62be9fcbddfd1230d11654890caa8206711d59836d6abbc3e03 -af59fe667dd9e7e4a9863c994fc4212de4714d01149a2072e97197f311be1f39e7ad3d472e446dcc439786bf21359ede -957952988f8c777516527b63e0c717fc637d89b0fd590bcb8c72d0e8a40901598930c5b2506ff7fea371c73a1b12a9be -a46becd9b541fc37d0857811062ca1c42c96181c7d285291aa48dc2f6d115fcff5f3dfdf4490d8c619da9b5ce7878440 -87168fbd32c01a4e0be2b46fe58b74d6e6586e66bbb4a74ad94d5975ac09aa6fa48fd9d87f1919bd0d37b8ebe02c180c -895c4aa29de9601fc01298d54cfb62dd7b137e6f4f6c69b15dc3769778bfba5fc9cbd2fc57fd3fad78d6c5a3087f6576 -b9cf19416228230319265557285f8da5b3ca503de586180f68cf055407d1588ecec2e13fc38817064425134f1c92b4d5 -9302aaef005b22f7b41a0527b36d60801ff6e8aa26fe8be74685b5f3545f902012fcade71edca7aaa0560296dac5fca5 -a0ccda9883027f6b29da1aaa359d8f2890ce1063492c875d34ff6bf2e7efea917e7369d0a2b35716e5afd68278e1a93a -a086ac36beeba9c0e5921f5a8afea87167f59670e72f98e788f72f4546af1e1b581b29fbdd9a83f24f44bd3ec14aee91 -8be471bf799cab98edf179d0718c66bbc2507d3a4dac4b271c2799113ce65645082dc49b3a02a8c490e0ef69d7edbcb1 -8a7f5b50a18baf9e9121e952b65979bda5f1c32e779117e21238fb9e7f49e15008d5c878581ac9660f6f79c73358934a -b3520a194d42b45cbab66388bee79aad895a7c2503b8d65e6483867036497d3e2e905d4d51f76871d0114ec13280d82f -8e6ca8342ec64f6dbe6523dc6d87c48065cd044ea45fa74b05fff548539fd2868eb6dd038d38d19c09d81d5a96364053 -b126a0e8263a948ba8813bf5fb95d786ae7d1aa0069a63f3e847957822b5fe79a3a1afa0ce2318b9ba1025f229a92eb7 -8e4461d6708cac53441a3d23ac4b5ff2b9a835b05008c26d7d9c0562a29403847cf760b7e9d0bcb24a6f498d2a8a9dd2 -b280a761bab256dfe7a8d617863999e3b4255ddbdc11fe7fe5b3bb9633fc8f0cb4f28e594d3b5b0b649c8e7082c4666a -a3e3043bfd7461e38088ee6a165d2ca015de98350f1cb0efc8e39ed4fcdb12a717f0ede7fbf9dadb90496c47652cc0ce -a4c1f5b1b88ae3c397d171e64395afe0cd13c717677775a01dd0461d44a04ee30ec3da58a54c89a3ca77b19b5e51062c -a268638e0655b6d5a037061808619b9ae276bb883999d60c33a9f7f872c46d83d795d1f302b4820030c57604fa3686e7 -ac20176111c5c6db065668987227658c00a1572ce21fe15f25e62d816b56472c5d847dd9c781fb293c6d49cc33b1f98f -acc0e22d9b6b45c968c22fd16b4ece85e82a1b0ab72369bdd467857fee1a12b9635f5b339a9236cbd1acc791811d0e29 -b56066e522bee1f31480ff8450f4d469ace8eb32730c55b7c9e8fa160070bdec618454e665b8cbc5483bc30b6cebbfb9 -8c1772bdfacff85f174d35c36f2d2182ae7897ad5e06097511968bbb136b626c0c7e462b08a21aca70f8e456b0204bf8 -b4de3cf4a064bf589be92513b8727df58f2da4cd891580ef79635ac8c195f15a6199327bb41864e2f614c8589b24f67e -8f3c534125613f2d17bf3e5b667c203cb3eab0dbca0638e222fe552fddf24783965aa111de844e8c3595304bfc41c33b -8e445b2711987fe0bf260521cb21a5b71db41f19396822059912743bf6ca146100c755c8b6e0e74f1bf2e34c03b19db9 -87ff9adf319adb78c9393003b5bdda08421f95551d81b37520b413fe439e42acf82d47fa3b61476b53166bf4f8544f0e -83f3c00c55632e1937dcdc1857de4eccd072efa319b3953d737e1d37382b3cf8343d54a435588eb75aa05bf413b4caa0 -b4d8ee1004bac0307030b8605a2e949ca2f8d237e9c1dcf1553bd1eb9b4156e2deb8c79331e84d2936ec5f1224b8b655 -93b2812b6377622e67bf9a624898227b56ebe3c7a1d917487fc9e4941f735f83679f7ac137065eb4098ad1a4cfbc3892 -81943d9eab6dcea8a120dde5356a0a665b1466709ebb18d1cbfa5f213a31819cb3cf2634e6d293b5b13caa158a9bb30b -a9042aae02efd4535681119e67a60211fc46851319eb389b42ebadcab1229c94199091fb1652beba3434f7b98c90785f -91db52b27fd9b1715df202106b373c4e63ce8ec7db8c818c9016ace5b08ef5f8c27e67f093395937ba4ce2f16edf9aef -83cb9b7b94bd6ead3ff2a7d40394f54612c9cb80c4e0adadffea39e301d1052305eb1fe0f7467268b5aba3b423a87246 -8720fd6712a99d92dd3fdaae922743ab53fad50d183e119a59dae47cdac6fbea6064c732d02cb341eaea10723db048fa -8d40022c1254462a2ac2380a85381c370b1221e5a202d95c75bccba6d1e52972dd5585a1294a1e487bf6ae6651867167 -b7bc06e08d8c72daba143627582f4b4f34cc2234b5cb5cd83536f2ef2e058631a3920468ea4d550aea01cad221d6a8a6 -a6e1a6f70fba42d3b9ce5f04ffdcfca46fc94041840c0066a204030cf75ea9f9856113fea3a9f69ea0037d9a68e3a9d4 -8b064c350083fce9a52da2e2e17bf44c4c9643d2d83667cbd9ad650bbeba55e2c408e746ccf693e56d08826e8a6d57fc -8d304a5405a0c0696917fcddc6795dd654567ca427f007d9b16be5de98febbf8692374e93f40822f63cf6f143c4d9499 -b968db239efec353a44f20a7cf4c0d0fca4c4c2dc21e6cbb5d669e4fe624356a8341e1eec0955b70afb893f55e9a9e32 -98971f745ce4ce5f1f398b1cd25d1697ada0cc7b329cee11d34b2d171e384b07aeb06ac7896c8283664a06d6dd82ec6b -881f5a20a80f728354fad9d0a32a79ffe0ba9bed644ed9d6a2d85444cda9821018159a3fa3d3d6b4fadbf6ea97e6aff6 -b7c76cbb82919ec08cf0bd7430b868a74cb4021e43b5e291caa0495ca579798fab1b64855e2d301f3461dd4d153adeb6 -b44c8c69b3df9b4e933fe6550982a6f76e18046e050229bd2456337e02efb75efa0dfe1b297ed9f5d7fa37fec69c8374 -a5bd7781820ba857aee07e38406538b07ab5180317689a58676f77514747672dd525ea64512a0e4958896f8df85e9d4d -a8443d1dc91b4faa20a2626505b5b4ad49cc5c1fd7a240a0e65d12f52d31df1585ba52c21e604dcec65ec00b81ae21fe -a157ae42fc6302c54bcdd774e8b8bafc4f5d221717f7bf49668c620e47051b930dce262d55668e546272dd07ca7c8d3f -8732c10448b63e907ff95f53cd746f970c946fd84fcbfe4cf9ede63afbbfc66b293bbc7c470d691bbd149bb3c78bb351 -a82192f4fd9a0c33489a0486b79d0f6c797c7eccb45f91f7f1e8e1dd1924ca9944b983951025b99ab5861d31841451fe -839efc6d199ddd43f34f6729b6b63f9ee05f18859bf8fd3f181fa71f4399a48bff7dde89b36e9dc1c572f1b9b6127cca -992ef084abe57adfd5eb65f880b411d5f4ed34c1aeb0d2cfac84fff4f92a9a855c521a965ba81b5eef2268e9a9e73048 -a2518ab712fa652e6e0bd0840307ef3831094e9a18723fb8ec052adacbb87f488d33778c6ec3fd845003af62e75125d1 -b630ac3c9e71b85dd9e9f2984bb5b762e8491d8edb99cad82c541faf5a22dd96f0fddb49d9a837b1955dea2d91284f28 -8d886d1b7f818391b473deba4a9a01acce1fe2abe9152955e17ba39adc55400590c61582c4fef37a286e2151566576ed -884f100dc437639247f85e5d638fcc7583d21bf37a66ce11e05bfc12f5dbe78685b0e51b4594e10549c92bb980512e12 -806d7bac2d24cfff6090ba9513698292d411cdea02976daa3c91c352b09f5a80a092cfa31304dcfcd9356eaf5164c81b -934ed65f8579ee458b9959295f69e4c7333775eb77084db69ad7096f07ad50ad88f65e31818b1942380f5b89e8d12f1b -aaf50ca5df249f0a7caf493334b6dca1700f34bd0c33fe8844fadd4afedbb87a09673426741ac7cbbb3bf4ab73f2d0f3 -b2868642cfa0a4a8a2553691c2bef41dab9dff87a94d100eaa41645614ab4d0e839ec2f465cc998c50cd203f0c65df22 -a326513112e0b46600d52be9aa04d8e47fe84e57b3b7263e2f3cf1a2c0e73269acb9636a99eb84417f3ae374c56e99b0 -97b93efc047896ddf381e8a3003b9e1229c438cc93a6dbef174bb74be30fac47c2d7e7dc250830459bed61d950e9c924 -b45e4f0a9806e44db75dbb80edc369be45f6e305352293bcae086f2193e3f55e6a75068de08d751151fdf9ebc6094fa1 -87f2161c130e57e8b4bb15616e63fa1f20a1b44d3e1683967a285f0d4f0b810f9202e75af2efa9fc472687c007a163f7 -8f6400a45666142752580a2dce55ef974f59235a209d32d2036c229c33a6189d51435b7ea184db36f765b0db574a9c52 -a0ee079462805f91b2200417da4900227acde0d48c98e92c8011a05b01c9db78fc5c0157d15cb084b947a68588f146f4 -ab0612d9bb228b30366b48e8d6ae11026230695f6f0607c7fa7a6e427e520121ff0edea55d1f0880a7478c4a8060872d -ad65dfde48f914de69f255bb58fa095a75afe9624fc8b7b586d23eb6cf34a4905e61186bc978e71ccb2b26b0381778a6 -8c8a4847d138d221c0b6d3194879fd462fb42ed5bd99f34ebe5f5b1e1d7902903ec55e4b52c90217b8b6e65379f005a4 -a41dca4449584353337aef1496b70e751502aeed9d51202de6d9723e155ca13be2d0db059748704653685a98eaa72a07 -ae40e5450fd994d1be245a7cd176a98dd26332b78da080159295f38802a7e7c9c17cc95da78d56558d84948cf48242cd -863878fda80ad64244b7493e3578908d4a804887ad1ad2c26f84404dcad69ea2851846ad2c6f2080e1ed64fe93bbec31 -b262fb990535f162dc2b039057a1d744409a3f41dd4b70f93ff29ba41c264c11cb78a3579aad82f3fa2163b33a8ce0e1 -a7f6eb552b9a1bb7c9cb50bc93d0dda4c7ecf2d4805535f10de0b6f2b3316688c5e19199d5c9ec2968e2d9e2bd0c6205 -a50aa5869412dc7081c8d827299237910ecec3154587692548da73e71fa398ff035656972777950ba84e472f267ba475 -924c3af750afc5dfad99d5f3ed3d6bdd359492cff81abcb6505696bb4c2b4664926cb1078a55851809f630e199955eb3 -a1acffa31323ce6b9c2135fb9b5705664de8949f8235b4889803fbd1b27eb80eb3f6a81e5b7cc44e3a67b288b747cf2f -8dec9fd48db028c33c03d4d96c5eecea2b27201f2b33d22e08529e1ae06da89449fe260703ac7bb6d794be4c0c6ea432 -aa6642922ccf912d60d678612fffe22ef4f77368a3c53a206c072ed07c024aa9dcde2df068c9821b4c12e5606cfe9be2 -a16ddf02609038fcb9655031b1cb94afe30b801739e02a5743c6cd2f79b04b2524c2085ca32ec3a39df53de0280f555d -b067d48589e9d3428c6d6129e104c681e4af376a351f502840bbea6c3e11fcbfdf54dadf6f1729621720a75ff89786c3 -b14a24079de311c729750bb4dd318590df1cd7ffc544a0a4b79432c9a2903d36a0d50ecd452b923730ade6d76a75c02c -97437bac649f70464ace93e9bec49659a7f01651bba762c4e626b5b6aa5746a3f0a8c55b555b1d0dc356d1e81f84c503 -a6f4cb2ffc83564b1170e7a9a34460a58a4d6129bd514ff23371a9e38b7da6a214ac47f23181df104c1619c57dff8fe2 -896d0f31dfc440cc6c8fde8831a2181f7257ffb73e1057fd39f1b7583ea35edf942ad67502cd895a1ad6091991eabc5e -9838007f920559af0de9c07e348939dfd9afe661b3c42053b4d9f11d79768cba268a2ee83bb07a655f8c970c0ee6844b -b41b8a47e3a19cadec18bff250068e1b543434ce94a414750852709cd603fc2e57cd9e840609890c8ff69217ea1f7593 -a0fb4396646c0a2272059b5aeb95b513e84265b89e58c87d6103229f489e2e900f4414133ed2458ddf9528461cfa8342 -ae026cfa49babc1006a3e8905d6f237a56a3db9ddf7559b0e4de8d47d08c3f172bde117cdf28dfdfd7627bd47d6a3c85 -a6a3f3e7006bc67290c0c40c1680bf9367982eb8aaf17ecb484a58c8e9c2a7c24932e2caa9aacc9b4fbf4c0abd087a46 -9093e05bd814177a01a3b8d7b733db66294e1c688c56def6e1827c0f2d9a97cf202721641bf81fb837f8581ae68cb5ce -87feef4de24942044f47d193d4efc44e39a8c0f4042fba582f2491a063e3a4640cb81f69579b6f353b9208884a4f7ce6 -975f9b94e78aac55bd4755f475e171e04f6fbddb6fd3d20a89a64a6346754a3ff64ecff8c04b612a1250e1d8d8a9e048 -87cde4d0164922d654cf2dc08df009e923c62f1a2e3b905dfde30f958e9e4dd6070d9f889712acd6c658804f48f3edb1 -ae8e22e158dda90a185eec92602831b5d826e5a19aab8c6400dba38b024c7d31c4cf265eb7b206dd45834f020b3f53cd -a4475807adc28aa086e977b65bbd7c8512119318c89d2619ea03a6739a72c3fb90c9622451896c7113ad4d12a3004de6 -97f1ae1e0d258a94532c7b73fa8ebdbbd53349a4d2d0a217fe56dfdd084dd879960bc6ff45ebb61b5dbf2054642800a4 -b3c832bd3691332a658b0caaa7717db13f5b5df2b5776b38131ac334b5fd80d0b90b6993701e5d74d2b7f6b2fd1f6b9d -a4b6af590187eb1b2cb5ae2b8cffa45c5e76abdb37cec56fc9b07a457730f5af0706d9ce0a17da792bbece5056d05670 -97b99a73a0e3145bf91f9dd611a67f894d608c954e9b8f5a4c77e07574064b3db47353eba8038062cebaad06a2500bab -8e5ca5a675de6e6d3916bd9ce5898bb379372afe3f310e70ff031bc8cc8fabfb7f3bfb784f409bb7eb06fdb4511ee477 -aabbbee4da1f16b5bbe001c19debe04745932d36dfbbf023fbf1010a2b1d54eb92fa5e266ac1e9337e26e2ddba752f40 -b13447c77496825f48e35c14f9b501c5056e6d5519f397a2580cea9a383a56a96994d88926aa681142fe2f1589c03185 -b89c55db39ff0e73dde7435b61e8a4d3e10f51dd8096cbc7f678661962e6de3d16f2f17a0e729cc699234cb847f55378 -82c36b7de53698a1bafbb311fefc6007fcefa47a806ebe33a4e7e0fc1c7b6b92a40a1860702cf9295a16c6b1433e3323 -8daeec8c88543d09c494a15cc9a83c0b918d544311fd2a7d09e06cf39cdebfa0cfc0e8fc0e3b5954960b92332f98697c -b18e55a1a7ae16be3a453d2bfa7659a7ec2d283dd46bdc82decef6d3751eeafc4f86f2416a22955c7e750c0582d4f3eb -b50c743462e2915bf773848669e50a3bcdb5a9ac5f664e97eaccf568c7d64a6493d321be0225de16142ce82ce1e24f66 -af69c9643805fb860434424b1608aababc593aaebc6a75fc017f7f62bb2b1da932b0b9bd5e6dcbba328422dafc06efd8 -b5947db4f809fd0d27af838b82eef8ab4fe78687a23ebc61c09c67eb7e8d0e6a310ecb907fd257859d5a2759a07c21cc -92c7960e163ca5bdf9196c7215102f8e9d88efc718843321c6e2a6170137b8ecec4ea5d5a5ce4c28012b6cdbd777dd01 -b63f9509ed5e798add4db43b562e8f57df50d5844af6e5c7acf6c3b71637c0a2d2433f4a0627b944f0af584892208bb8 -8ef28304a9bfe5220af6a9a6a942d2589606f5dc970d708ef18bc7ed08e433161020d36fb327c525398cd8ecb57002f9 -b722e0410f896c4462d630a84a5a14e94289fc38ed6d513ca88a09005935cec334c480028efa1943c7a5e202ae8c8379 -b56b6672b488e64d4dde43571f9ceaa7e61e336b0fd55bb769a57cd894a6300e724e5f88bad39a68bc307eb7406cb832 -8bf493da411fd41502b61a47827731193652e6ce3810709e70869d9aae49e4b17a40437a7a0dcc0547dbac21f355c0da -9613b60a144c01f6a0e7d46ddde07402e2133a1fe005c049a56415ff90401765040b2fc55971d24b94c5fd69fec58941 -85e2f02b291563d8eea3768cf6a4602c0ca36568ffcf3d93795d642044196ca6b0b28991ea5898e7974ee02831a0ec70 -b08ef66703dd9ac46e0208487566fbf8d8654d08c00f03e46f112c204782ccc02a880a3f9dffd849088693cee33b7b6d -a0b19eeda6c71b0e83b1f95dffef4d370318bdea6ea31d0845695e6b48d5c428c3dbba1a0ded80964992c4a0695f12ee -b052642e5772d2ef6f49dd35c5e765c5f305006b2add3b4bee5909ca572161edf0e9c2bc3bc3bc7f56fd596360ef2201 -8261af164c768fec80d63fca6cd07d1c0449e9ca665fe60c29babdbd8a2b20cf1f556a4b24cd7341712468a731c21b32 -8a17016a1b2fc0fa0d9e3610ea80548fcf514e0a35e327f6b5f8069b425c0f0829af7e206013eab552be92b241be5ac5 -8eea25c680172696f5600271761d27ef4c8cec9ab22f01f72b2c7c313a142fafaec39e6920b96fcace858883e02eff7a -b8e0c590106e125c5bca7e7a071cc408b93629da0d8d6381f1b73fbdf17024a0cf13f679f5203a99bbbcb664b4a94e88 -b9943b29395258b7afdf1781cfaf131297a4f325540755df73401b2ec4a549f962952e9907413c39a95585c4aff38157 -8286eab4a04f8113fb3f738a9bc9c2deaf3a22bf247151515568703da4efe6450ab3970f5c74e978a2db7e8d795331b7 -a10cf383c8a7e3f0a0a5556b57532170ff46dabdcbb6a31c4617271634b99540aa575786c636d3809207cbf1d2f364d3 -a5af7eb998140d01ba24baa0e8c71625aee6bd37db4c5ff607518f907892219ba8c9a03c326b273bfd7068232809b73c -aed5f461e38fccc8b3936f1328a9747efcbceb66312f6d6eddce57c59570852767159f1a7d9998f63342515fef4ba9bf -aec3e94b029aa692bfe2b8dbc6c3b0d132b504242e5ebe0cad79c065085e2fc05550e5cdaa2353892a40ff1a062dd9eb -87c23703960129396018d0347f5dd034abdbd57232b74195b6a29af34b6197b3cd63c60ac774d525add96ae54d5c0fb4 -97964a7768216e1c84dece71ce9202cc64b6d483650aa6f6d67215f655f66cda14df0a0f251db55832c77bfd9b6316e2 -8167aaf24c8a023d0aea16b8c24d993618b9d0c63619e11a28feab8f14952bafcb0918ed322cbc0ae1b2e1786071819b -b58318bd62852ffb712fc58f368c21b641dde7b3fa7d7269974c7a7b5b3e1641569fc7b5f32ca49de22f4f993506d92d -b172e7911d5cd3f53af388af847b928947c711185aebd3328f8e6ed1106c161ae0c1b67d3d9eb237e9e66eb0672edec0 -a6834cf69b2c4433cf6e779bfbb736b12e73e71e149c38101d13dbacf6c5048db53994a6a039381df40bbd67de40fcd0 -882604aa3bb19fffd6db744b5cf4a2431b157dac06d0617e0703684a118ca90b2d22a7758a1de7732a7144e68b11b7f7 -addc128ba52bf7553b9ba49eff42004d388a02c6b6e9809abe1c0d88f467e5ff6cb0c82a8fd901b80dfc9a001f7b9997 -abf19604a3f0cffefa7a9ced81627f6aacb8d7267b52b825f25d813d9afa24af6d70da21450ed93eaff8b4d2a9b905a9 -a3c67e7bf02dbca183d86924611a7149556ee17cb3469793624da496b6c25617a9071925dd02aab9cb028739cb79043d -b1cea4284a3ac4d5b1c6f0947c6ec8365b3281ed15495bf328a907a9a02cdd186e7cb1ef080385b3399df786855985a9 -a6edb126314559e6129caf1111dc3c82ff914efce658b11f2c9b48081be1cf3f46bde482469d493379025a158d95ab1b -9843fd7dd424da1acc6f92f87fac364a8b0d4097d74b6b451386384966c85145d43fc6ecedf04271b0f963ac731fd93f -83852bedca03a97a2e63053cb102387866cbefe6707ebb6dae2d32a59c343079f1a863f299fd64d0ecbe024d0a1247d5 -a570e645a0679ebc6f0ca03cc8f7367b03c3886f3d9c787992de7f3e93360a170d3ac9ae7720999c727a887b1dc762bb -ad644c40555238f28844eed632c8972b63d2602098031d53b5599d1a874903e0d0c428e0ab12a209ea3fb31225578f1c -b64e9f92a14812ed31075f9fdd3324659a036ef2f293ef9ca6f6feb87d0c138e1ba74bc36a910afd22ff9b3c8ec7cfa5 -8f2d75a86d517dafac09b65596f4b89c4a9c0a7003632407504153fa297c9e3228e236948a5d5224b8df49a087c8e0e3 -b02d6ab9292ae336c8a74115f33765af2c9f62c331d70c087cf4c2979792bb3c2666f6699c017f8d4c6b378fd4bda86a -a923d660d2e55228b8bc74f87d966069bd77c34a776fa96f37b48539c85634482e514e2cb76cb8eb20efd85eb9c83fae -81d7ffb53090a6d512055ecfd582ca92805525a05654e39bb12653a6a8902a16e651ba7b687b36b8bea7186632c7e9e3 -83e9b33e29b57ae53d9f72bd4622ff388252333b4fa32ad360a5b00f3ffc8813b9cb8a1361454d3bb7156c01b94b6a08 -ad7d6bffe4d67eb53b58daa3fc8a5a60790c54fa42226ae12847e94c6de3b4365b3be39855a4f6a5f12e4803cdaed96b -a7709fed85abbee5a2fa49c5238582ec565da08c132d4912821491985bf83b681eb4823634bfe826abd63a6c41a64ea7 -b8fb6ed55741132a1053b6ca77bdf892e96b048488373ba4aa2f2225fae6d578724124eb6975e7518e2bf3d25d215763 -85e0c53089529a09b5bce50f5760af6aeafef9395388aa4b6144ca59953169101783347ee46264ec0163713a25fe7c63 -8f9e47a9c37b678e56c92b38d5b4dab05defc6b9c35b05e28431d54b1d69ac31878c82c1357d016f3e57ca07d82d9c16 -a81f508136ee6ec9122c48584df51637f768ccfe8a0b812af02b122a0fafa9abcc24778bf54143abb79eccebbdde2aac -931a96d2257a4714d1ef20ac0704438481632647b993467e806b1acc4a381cc5a9dec257e63239ba285deb79f92122dd -99fb0ff747bcd44b512bf8a963b3183ce3f0e825a7b92ddd179253e65942a79494a515c0c0bc9345db136b774b0a76b0 -a9dbb940b5f8ab92f2d85fc5999e982e3d990fe9df247cfc6f3a3f8934fb7b70e2d0362ba3a71edc5d0b039db2a5f705 -99011a1e2670b1b142ec68b276ff6b38c1687eed310a79e2b902065bc798618c0cdee7b2009ad49623ed7ae0aa2b5219 -9361e9f3aa859c07924c49f3d6e9b5d39a3df2fc1c10769202ec812955d7d3814c9e6982f4df3a8f3bdbfb4550cd1819 -a8aa23f177ddc1e7a7856da3eac559791d8b3f188c0b3ae7021bcb35dfb72b0f043c3699597a9188200408bc3daf6ab7 -a5a502ff673f6dab7ae4591a7b550c04ede22a45a960c6b5499644f721c62b12b9e08248e7f8b8a59a740b058d2a67e6 -ad374f80f0b52bc5a9491f79a547ce5e4a3ce4468a35d7dbca8a64083af35ab38eff9aa774ccba2e2e1e006e45cb0b85 -ab6851827125e3f869e2b7671a80e2dff3d2d01ce5bfbeb36cbaf30c3d974a2d36fd9f7c3d331bb96d24b33dbd21f307 -96658f6a2d225a82f7ccee7f7a7e476967e31a0cd6c62859d3b13ee89702bb821547f70ffd31cb46a6a0d26a93158883 -878f59ff2590bc3d44fdc674717589800748b78d543d3c0dbb50125b1d6011d6a083f10ab396e36b79f2d89b7cf51cdd -b8bdfb97829c5d973a15172bfe4cb39620af148d496900969bd7ca35de9b0e98eec87af4e20bef1022e5fb6c73952aa0 -a292a78b452743998aee099f5a0b075e88762222da7a10398761030ffcc01128138d0f32fccf3296fcbea4f07b398b5f -85da44fdd7b852a766f66ba8804ed53e1fc54d282f9a6410106c45626df5a4380cbea2b76677fdfde32446a4d313742a -84bebf036073d121e11abc6180cba440465c6eaadc9a0c0853a5f1418f534d21cccf0cfc62533eaeae4653c7b4988046 -923dec006a6af04ef675f5351afffffd2c62a17a98f4144221927c69f4553dd105e4fcc2227b5f493653d758cd7d0352 -a51eda64f4a4410a1cfa080d1f8598e23b59856436eb20a241e11106989fbbb48f14c2251f608cbf9531c7c442b30bf7 -ac6d26ae7bab22d49b7fba7fe4b8cf6d70617977008c8290787c9da1a4759c17c5e441efb3dee706d5d64d9d2ace1de5 -ab5138b94d23c1bf920b2fb54039e8a3c41960a0fe6173261a5503da11ff7b3afdb43204f84a99e99888618a017aac1b -8c85647a91e652190eee4e98a1eec13a09a33f6532926427bf09e038f487e483f7930fbe6ff7a2126ccde989690dc668 -a6026ab87cffec3e47b4c9673957d670cb48c9b968d2ad0e3d624d81c1082dcebbc70d0815cbd0325e0a900d703a6909 -ac4f6ff6baf8374a3c62bdd5a8d207d184ff993f6055bcee1e6dcc54173d756c37c24570d6462395add6f7871d60b1ae -a0dd6bc93930d0016557588f2598b7462ca48cbed637c8190be0fb4811e4576217ca9fc3c669c2a4db82e3f8bb24acaf -a67c1d79f7e7193a23e42928a5cc6a6e8e0c48b6b286607dbcfaaa0f10a7ba29ad62d1d57ca28c486794f0908bece29c -822f411bab4882202ed24e67c84e0c9a8da5b3389804ed9dfba0f672e3e1457ea76cad0cb935dbb3d7a39500fba5fe12 -8a1198572323689300a9d7db2e2bcb7c519392e5d3d33e83cd64bcf1517a7dde52318a98203727b186597702c0eed258 -8a84141b02f1d037c68d92567d71cda3a0b805d1e200b1d3fff3caf9902457cbfbaac33157b87ab0bb9e4fe3bac882c3 -8070ace16d9eef8658fdcf21bed0d6938f948f31ca9d40b8bdb97fc20432cd2a7ef78eeefc991a87eae7f8c81adf9b19 -9522e7123b733ce9ca58ab364509f308a1ead0915421ccede48071a983fd102e81e1634ffa07a9e03766f167f5c7cb5e -82cbdf97a755e952304f5a933fd4d74a3038009f242dac149595439130a815e9cc0065597c0b362130183a4c4a444173 -81e904f9b65cd7049c75f64c7261e0cbb0cc15961ffcac063d09399d0d2b0553b19e7c233aca0f209f90cf50c7f5e0b2 -8f5f6ea87429542ea04ad3eb5fc7eeb28fcf69c01c1a5d29b0de219524f6fba90c26069bfc9092379fe18cb46274393a -a4e5815481eb33b7990d2de1a3a591c1ab545b64fbeb4cff8c71b6bcb04d28940097899062bf43b27c5a8f899616703e -a7afe6066681e312882b3b181f462a1af2139d9bd2aefffae7976f3fc357bfd8fbd6ddd4e5e321412f107736e77f0cb6 -b8ab102d7ff8d46b055095d8fb0ec2f658c9e18eee523c295b148b37f8342c120798113553b8bfebf2a11f27bc704cc4 -862175ecc7e0e294c304a0352cd0f1d11b2603d326bb0e54e02b6cc8d04d01ac31c8864e9395aa1f3b90b76bc4397f5b -a4ea51ef3d82509f0e4eb6af705fa7530921cf9512cb5bf030571e69f4504a299297219a0a7e40db1b45165a5ea3a3f2 -a6fb8b573e2ba6db0e8aba53a489e99bebe533c0fcd947dbfa732e00594f03f4e8609ccc44d8215986d38bc3d4e55d48 -93fe8e0bdd5d66df2bd18be5963e864bddfcdcd3298590e7c3b11d99a070a4948fecef46453f19960bbfeada37979613 -acbc45bc55c7080b45c69a3db80cbfc0267006dcf49c47330975aeff2a8ac07b206e1b1c3a515e50866ff510739b92c0 -94a577df0983e4ee3d6b80c73d7e8e3bb78bd8390ff56fea350e51bdf5e0176b8494e7e81dc7b1d842ada961089cd1eb -81eb1fbe9e9c89f5818d0ef98e694da86e88625f0a37cfe88e6de69f90e58297e67f1d5c9d71263b523b63e42685975a -a81a2391ea4d0f65ab4325196559d67e2648b3f1e464509430b40d9948d5b0fc01c337d9b51048a93c4d62e6b73e1e8c -849a026e55ed77135138836c9df67883763e4602357d8566da2ee2505d135d44061de0c070cf333ffb9ac2e55a0894b2 -8e272cc5734374c003c7b2e6ba833eb99b6be608da04e576df471c24705b6b2a790549c53e7971df2d9f0b88d0f570c6 -b0f9e6d985064aa311d4a147f41007fdc576b7b9194aa4b8712bf59a76a71543fec2ee3db21bd3d30d4096f25babc543 -96331837f0d74e2ba6cb1bfaddf4b1fb359bf46cb6c3c664938eb030e56bc85a5ce17bcd60b7fa7b72cb0ba1f3af0b5b -a0eaab6de4b5a551896e7d26153fb5df4bc22a37833ec864090b57b5115b0f8f1279e855cea456bb844802b294b0dbb7 -955e87d3b966edff34f28137f871881c59bbbc6d69986b739867807680ca22b5e3272ced1d25854ed9700d87f133848b -9270a6db157a8ce78a1af6bfe2b5bbe7b621d56cc8f9940a03b5a5f600848b87b05d83595b2a3a315d4b7f4687c46085 -9043328f2dd4dd85e14c91237a3478dc1eed239164924b53d1de9364d76c81315afa9639b58eedb1ab2122e2ae2e7cfb -857fe9f7d00b03bce367de7f789d755911a5f85d78044f18311ecd9b955e821b4a50228347260ba1205aef61219001fe -a0f878050367a7103fddf380908da66058ef4430eae1758335c46c24f5c22fefb0753991b3a47dba5c7eaafa4d598178 -ab5959296b1af14d2878816c7da9926484cbf8896b7eeac8a99dc255013319a67a0209025e1f8266ffd8cd7d960bdc87 -abe53abc57ea46419dbe0ac1f39eee39a4feae265e58b50928eb0695e25938a16a8b00e65c1313837dc3367297e2c258 -93e3e42ed6ba9c45d4e7a4bf21c1e469efafded1f3be9931a683dbb780db2494742fd76c9ad29fd7d12da2b778ede543 -ab3e64035c488a6e63496ddb2de9648cc63a670c5d4b610c187d8ceb144fcc50b016046f50b10e93b82937ebe932ac08 -a3a8fa898f489b313d31838ad9f0c7ffe62ef7155de5da9ffe6ecd49a984fac3c6763e8cb64e675e1c4a0e45e7daf078 -8356b26aa7c9fc9734b511480dad07b164cfec1324ad98eec9839a7943f2889d37c188d465515ad4e47c23df641c18c3 -83c4476f829e0fe91da2353d5b58091e9335157941e89ca60ccab1d7fdd014bcf21bd55249805780ddc655c5c8c2536e -814f6e66505b2cb36de92c0de8004d6d094476522e66b9537787beff8f71a1381ed9f2b7d86778979ad016a7dae6cbac -b1cd7f6da4a625b82bea475442f65d1caa881b0f7ce0d37d4b12134d3f1beb3ad4c2f25f352811e618c446185486adb6 -a71b918481b9bda667de0533292d81396853a3b7e2504edd63904400511f1a29891564d0091409f1de61276d2aebc12a -a2cd3d4104ec5fb6d75f5f34762d5e7d2ff0b261bea5f40a00deec08fbdab730721231a214e4df9b47685d5bacfe37c6 -807f2d9de1399093bf284814bc4093f448f56a9bde0169407cdc0e7d2a34ff45052aef18bcb92f0ac7a0a5e54bd843e9 -abeb03010c3ac38587be2547890a8476dd166ac7b2a92c50d442f031eaf273ad97114c38e57fe76d662c3e615334ac0b -b90a688da4b0bf65ff01bcf8699f0cba995b3397fcbe472e876ae1091a294463e4b94350ae8bd5c63b8441089e0884fd -ad88db4afb177931788fb08eff187e15ad739edc7e1a14c8b777b6bf668aec69ca4749773f94250c1fdda3b59f705f7c -9886809f9ae952797c6527c6db297d2aa3d5209b360efe6a19970575a9f78aee3c21daadb8e8dfcbeeea5290238d16d9 -930f486e95d7c053c9742e6f0b31e6d4fa2187e41229e46a074b469aafb87880aa8e972719b363049fc9fe2db8f03ce2 -8d229af4fa08bd8aeb5fd9acfee47571eb03fcd2f19073b94cd27e2a6735029d31f123249d557f8d20c32ac881eae3aa -84576ed5aebe3a9c3449243a25247628993fdb2cc327072418ea2f1d11342756e56e9a82449bc3ea6e8eaecabc62e9b5 -b775cb86cbec9c46a4a93d426379c62872c85dd08bccda39b21cb471222b85b93afd34a53337b6d258f4891c6458e502 -8be1540e6b535b416b8d21e3ecf67dfb27a10fd4010f9f19426422edaeb0a4961d43ff3afd1db0994170056ce4d77aec -b9c7438e90a5501a4d05bbb8ab68d6db7e9baa8927231a5c58715ee2ab76ca1da0e94910a076958654869148d813d0e9 -aa9bed1c4d2e7cbc2e1a884c8998773f7cc6fa9d6493c8abe8b425114a48305c3a43a1abda2292177ffd39ef02db4163 -897b395356047cd86f576cfc050f7e4546ecd4df30b2c31ed8945797b81dd4ed9b9106cfbe6d7dd8bf91882e3cf1f42e -949a37e1037d9464b2ccd3ad23eda7089570d6b5ffa18025d2548a9df8829de8d62960f04a603f21eecbca5893d45284 -b8a0642f68ff169ffbcd8cd684fae75d96f9bd76949472775bf155edc55a3d9c3e6f0299ee73a6cfb96289361fdbe9ee -a1273141510fcddd89b9b92c19a268dadd1528ad85744b8174684c9b56668e6b35dabb05f2b4cc6ef5611eaea6052f27 -97c7415c82de83ecc066eb922268b8205ad7266c65b2b8f7e0aadac87f076c738cea72f9b0f069b8d28cf9d5438b8287 -b32c7005380c848f71092a74297555dc6022369fc2a4f285e586ac8f53f6bd354fbe4b1f8a4cfb406a101103bf87bb64 -91b48eeba52f02d04f536d32112038f8ba70bb34284fbb39e0f7bae2e08b3f45ad32e2f55d1beae94b949c15652d06a1 -99e24f5ea378cb816a4436af2ee7891ac78a2e37c72590be0abd619244a190fee51fc701b6c1c073611b412cb76332c9 -9465d1e73a1a0a5f7b1cd85f4fa4f5dee008b622b14d228d5cd5baeec174451e7ae93c5de688393d37cc24ce15df4139 -a6ac3986ee01debdacb5ddc1e2550cb4f039156df15c7d5752b79f333175b840bdca89c4959a523e58cf97bbd6b2039e -b7f7a5cc1b1b6145988170d619c170c130231abbe0b5143a9bccaaebeef9ceb1c16e26749bc9dc5650fe91f92fa1b79b -854cb04f1557457383a401d79a655adfd0a4b706ea2bbc6262949c8d657efcfdc9c7960cbe1a50b5eebb361c5e378f80 -8dd199dccbdc85aeca9ddcb5a78dd741a452f7a0d3ceb6546d76624bad2fce0e7e6c47ee30d60bf773f18d98503e7f9c -889e1ca9f0582be9bf5f1aede6a7312b30ea9bed45ab02d87182a013430f16007ae477ee6a823ae86c7fef7da016a0ec -892a60e63edfb3e7a6cf2d0be184413d214401fc1e6c004ca2902c3f1423728bf759a136e6e715d26d5bb229c75cc20a -a2287cd092261b39d22dcb1fa19512590b244771bb69fb62eda72f12be37d48e408b3e37a47608f68d743834edee7f15 -b3b6afb950bbec0ff631bdf18af433e68adc63d02cb479704f24329ca6b6edd9a3d1d606563dbdce6038b676b85130b9 -847da90f37b294509de51ab6521fdff12d5a1ec3cccaf730aa744da7e54b85fd9c70618787e87c0ba9947ce6c81387fb -ad872153c00bccac75bdb30d1ab7044d814f4f8655ff26421d48fea04fb21d4dc82c1900620a57d13adc45c1062a1817 -90fa5ee98fd7ec719f2a8543bbd0ff45ac69296c2416fc8666d05de3deea1017079a68aba55540a19585925803c8335d -962ba6d029e9176d0e8c80a21f2413f7322f22a9e9a32c933697a8b0e995ce25bea5264736a75718b3d330e215a58a05 -a446f9530db30c5e9c1b3844d635e5c2cd311cc4537ff277fe83dd1a0382bcfa73beb07aaa0cf5a97d24c67e688086a4 -8766b2053f16c72db387abe18b43d7b357a542916c9b8d530ee264e921c999494d6eb1e491352ecdf53758640c7a246d -83f32f511f7b0233662acfc14f30df345af99d2d6c777ce0b4bcdc4dd110533f30b45071df17230aaec392cc482355e1 -82e3521bc9519b36f0cc020225586b263e4feb57b533b38d8e89ccf8d03f301d94da90efb4902002732fbf3876697f38 -b5d1ea69c97ceaa34a720bb67af3fcf0c24293df37a5f6d06268b1eabe441531606954ac2598a1513f64231af722b3a3 -956842696b411e6221c5064e6f16739e731497e074326ef9517b095671f52a19e792d93fe1b99b5a99a5dc29782a5deb -b19b5658e55c279eb4b0c19a0807865858cbec1255acd621f6d60c7e9c50e5d3ee57da76b133580899a97c09f1dd8dac -89e6a8b916d3fcc8607790e5da7e391f6bc9eae44cc7665eb326a230b02bc4eb4ef66e608ccc6031048fc682529833d0 -b1a210bc8070ed68b79debd0ec8f24ec5241457b2d79fd651e5d12ceb7920e0136c3e0260bc75c7ff23a470da90d8de9 -85b1954278e2c69007ad3ab9be663ad23ae37c8e7fa9bc8bd64143184d51aea913a25b954471b8badc9e49078146f5ac -98bf63c7a4b200f3ce6bf99e98543925bc02659dc76dfedebe91ec5c8877d1271973a6e75dad1d56c54d5844617313e1 -b7404b6e0f320889e2a0a9c3c8238b918b5eb37bcdab6925c9c8865e22192ba9be2b7d408e1ea921a71af3f4d46806d0 -b73cbbebf1d89801aa838475be27c15b901f27d1052072d8317dcae630ab2af0986e56e755431f1c93f96cd249f2c564 -95b2027302f7f536e009f8a63018da6c91ec2b2733c07f526cc34cbcfa2f895ccfd3cc70be89f4e92c63c7ddc2a93370 -9201d9ff5d0b1222bfa2345394f88ddf4fe9282acf51bee9b18b96bb724fdf8e736d7101acc2795a34e72f9e0545c9a8 -acbff7eb160f427d8de6f29feeddfa8994674e033a0ccdc8e8c73f9243968f1a6379da670a7340f422892d50c97113c7 -97ae8d03352c3729e1623e680dd9664f303b3bcfb844ef80d21e9c773a247967d27b86c9326af29db5eefd0bd3d4fac8 -8e53ae5c22f5bfa5fe4c414dad6a10b28a3e5b82a22e24a94e50ce3b2bf41af31e7ba017d2968811c179017b78741ef0 -b5ac7dd150247eb63dfb7dd28f64b1bf14426dc3c95c941e8e92750c206c4c7f4ad1a6b89e777cfe26ecb680dbf0acb6 -99ae2e4652ea1c1c695e7ea2022fd35bd72b1a0d145c0b050da1be48ad781a413dc20fbda1b0b538881d4421e7609286 -b8abe1fb3a7443f19cd8b687a45e68364842fc8c23d5af5ec85da41d73afb6840ef4b160d022b2dad1a75456d809e80b -842619c3547e44db805127c462f5964551f296a270ed2b922e271f9dc1074fdf1c5e45bb31686cec55cb816d77853c01 -902dff769391de4e241a98c3ed759436e018e82b2c50b57147552bb94baddd1f66530915555e45404df9e7101b20e607 -82e4f2ee7c7ca1ee8f38afa295d884e0629a509c909a5464eb9ea6b2d089205478120eed7b6049b077b2df685ec8ba48 -aa21a68b0888e4a98b919002a7e71e6876b4eb42227858bf48c82daf664c3870df49e4d5f6363c05878a9a00a0bcf178 -a8420cd71b1d8edd11ebc6a52ba7fc82da87dd0a1af386d5471b8b5362c4f42718338bcbc302d53794204a0a06b0671d -98c686bd3a994668fbbd80c472eed8aedd3ab5aa730c8d3ce72e63fb70742e58525437be1f260b7ecc6d9d18a43356a0 -aca0b2df9ec8ede0b72f03b121cded5387d9f472b8c1f3a5f1badd5879fb2d5d0bbb6af1a2dd6bdebf758cfceadbe61d -93b1abd9cb41da1422d171b4dbf6fbcb5421189c48e85c9b8492d0597838f5845198494c13032e631c32456054598e1d -a246ab3a47f7dc5caedc26c6c2f0f3f303ed24188844ab67a3da1e793d64c7c7fe3e5cc46efafbd791b751e71de0614c -b9b52095ca98f1f07f3b0f568dd8462b4056c7350c449aa6ce10e5e8e313c2516ac4b303a4fc521fe51faf9bf7766ce9 -8e2e9d26036e847c2a2e4ba25706a465ac9fbb27804a243e3f1da15dd4084f184e37808661ec929479d3c735555085ee -8b8c4f4ad5c8e57e6a7c55d70ef643083d4b8dac02716ea476d02dbbb16c702a2f2d5dd5efe3aec7704d2b8cdafe3959 -a800afea30d0df333805d295bac25419b7049d70044be00c7c85a92a0503ca471001bc1e6552323f1a719eb96616fc20 -868bced4560e1495b8527058ebc82a538b7cf806f8d8fe8eeed6981aba771de4d5e9f03cbfc7157d38b9f99cdea87b96 -86b86258b0c1feb988cc79f6c4d4b458ff39428eda292f9608a5fc4c3765782c8c23c66f82d7538e78e092cd81d69a56 -9370eac15de2555824c7d48520a678316a7bb672e66f8115ad7dbc7c7b1f35a7718e8fa0c35f37e3ef2df32dfa7ca8d1 -ae200bc5be0c1c8c6ec8e9fd28b4d256c6f806c0f270766099e191e256d67b9cceda2cc2fed46dfa2d410971a7408993 -af2428c77b2b9887ecde1ea835ed53c04891547fb79fe92e92f9c6009cdfffa0cb14de390532ad0ef81348b91798bd47 -a9069eef0316a5d13d1aa4cef0cf9431518f99b916c8d734bd27b789828ae03e5870837163ea6ad0be67c69184b31e8d -b1b1ce6d529f5a8f80728173b2f873c8357f29644b00f619c15111224377ae31a2efb98f7e0c06f5f868030aab78ed52 -b89c98beef19ee7f300e1c332a91569618ef8bf2c1d3de284fc393d45f036e2335d54917c762f7c2874a03fe4f0f6926 -8264f993dceb202f8426339183157e9e0e026d4e935efe4cf957eb14cd53edcdc866305fb1334cdf0e819b69eafbaccf -aebd113f73210b11f5ac75b474f70a2005e5c349345003989175dffa19f168abd7f0e28125b18907502fff6fcc6f769b -9993ad061066ca6c2bb29fe258a645089184c5a5a2ef22c811352749a199be3a3af3a0d5ce963febf20b7d9e63508139 -97952105000c6fc6c2dcae1ebdb2feae64f578d26a5523807d88e6caf1fe944b8185e49222d06a4553b3bdb48c3267a2 -82dd955f208957d74693bed78d479c9663f7d911f68ff033929418eb4a5c5dc467589ca210c1ba3c2e37d18f04afe887 -b816fc4763d4c8a1d64a549c4ef22918e045ea25fa394272c7e8a46dcb0c84d843d323a68cc3b2ef47a5bbb11b3913bc -a7a87ba4d12a60ee459aad306309b66b935d0c6115a5d62a8738482f89e4f80d533c7bba8503e0d53e9e11a7fd5fe72b -92b36d8fa2fdee71b7eea62a5cc739be518d0ecf5056f93e30b8169c3729a6a7ed3aa44c329aa1990809142e0e5e2b15 -8835b6cf207b4499529a9034997d2d3bc2054e35937038deb9c3e2f729ebd97125f111c12816d30b716b397016133c52 -acf14cd6d978ba905cf33b9839b386958b7a262b41cbd15e0d3a9d4ef191fcc598c5ab5681cf63bc722fe8acfda25ce6 -b31302881969c5b283c6df90971f4fb2cc8b9a5da8073662da4029f7977fbb4aaa57dd95b003a9e509c817b739f964e7 -b74669e1c3fa7f435e15b5e81f40de6cfb4ad252fcdfb29862724b0a540f373d6e26c3d600471c7421b60a1d43dbeb0f -861d01615cba6ca4e4ef86b8b90f37fa9a4cc65cef25d12370f7e3313b33bb75de0953c8e69972b3c2a54fe110f2a520 -a58a56820efaf9572fd0f487542aaff37171d5db4a5d25bfb1a5c36ca975eb5df3cb3f427589e1101494abb96b5e4031 -af13d0a6869ef95cb8025367c0a12350800c6bc4ae5b5856dcb0a3ca495211d4139f30a8682d848cb7c05c14ae9f48cb -8c385767d49ba85b25a3a00026dd6a3052e09cd28809d5a1374edf4f02dc1beed367055b0dee09102c85985492b90333 -b5129fc2fec76711449f0fcb057f9cf65add01b254900c425e89b593b8d395fc53bb0a83ddbd3166acc6d2c17f7fc2a4 -86bd01b3417d192341518ad4abf1b59190d9c1829041e6f621068bce0bef77ec3b86875b7803cf84ff93c053c2e9aad1 -a74fc276f6af05348b5fabccb03179540858e55594eb8d42417788438c574784919fb6297460f698bd0da31ce84cebfc -967ed3ec9f1fc51f76f07b956e1568d597f59840ef899472a3138f8af4b4c90861e23690c56b7db536f4dd477f23add6 -b9e678206de4fc1437c62d63814d65f3496be25a7a452e53d719981d09c7e3cae75e6475f00474e7c8a589e2e0c6bfa3 -b028eaffaa4ff2b1b508886ff13c522d0b6881998e60e06b83abe2ac1b69f036eece3ded0f95e9ae721aea02efff17b6 -935f82de9be578c12de99707af6905c04c30a993a70e20c7e9dd2088c05660e361942fa3099db14f55a73097bfd32a44 -96a1cc133997d6420a45555611af8bcd09a4c7dbddf11dbe65aab7688cc5a397485596c21d67d1c60aae9d840f2d8e48 -80d117b25aa1a78e5d92ea50e8f1e932d632d8b37bebf444dcc76cc409322fb8eface74a5dddab101e793ff0a31f0a53 -893229136d5ab555dc3217fb4e8c6d785b5e97a306cdaa62f98c95bad7b5558ed43e9a62a87af39630a1563abd56ec54 -b7ec1973ec60bd61d34201a7f8f7d89d2bc468c8edc772a0ba4b886785f4dadc979e23d37b9f7ef3ff7d2101d3aa8947 -b6080ca201d99205a90953b50fc0d1bd5efd5eadbfe5014db2aeb2e1874d645ab152fb4b0ff836f691b013b98ce7c010 -b546e66ec0c39037bbaa66b2b3f4704a6a72cf1924a561550564b6fcf41fbc2930e708cd5cac1d05e12a4b8ec93ff7eb -8abeed90a01477260f4b09fff8fa00e93afe727e8eed6f111d225c872a67e6ab61d0472ab6add3fe987744e16f7c5268 -8e02342d5cc1836ed21834b9ef81686172cc730f0412479db5f590b0ff7a729a0e986ffed16d6ecafd6b83d65922ca5e -b05660605cf8e8a10c8d3c77cccbe4e7179fa27cc829571f6b722a58e65e4e44d7fe977446118e9da2d2f40af146cc2d -942a00e006baba6d025cbd99297bdb0cbf3d84cddf849b1b5a9fe9ef1745352fad81313cce5d7622d6652096a8fa065c -aace8212b3d8dbe44ac97460a5938a3b803aca9bd00d8a643a859351daf391b22d1fd2a6b3e0ff83cc9ee272a1ad7686 -965a9885a5259197a75a19707a2f040e0fd62505e00e35ebe5041d8467596752aedf0b7ec12111689eceb3e2e01ecfc8 -81d58270a4e7ee0137cb2bf559c78c4fd5b3a613468a8157b6a9c5c0b6ca20a071b87c127d59cecc3d0359237a66d890 -af92b6354fbf35674abf005cb109edc5d95845e3d84b968e6001c4b83d548715dffc6723ac754c45a5ace8cd7dd30a24 -b112caa707f9be48fdde27f1649149d9456857f928ea73e05b64bb62d597801daac0b89165fea76074f8b5770043f673 -b6e7380746da358fc429f676b3d800341e7ab3f9072c271310626ae7f67b62562ff76c63bc9f5a1dbc0e0af87752408a -a45e9e8d0931207ebc75199aa0c983134aa97f771ff546a94a3367bcedf14486f761e7f572cf112e8c412018995fdaf4 -854381128de5bfb79c67b3820f3005555f3ee6f1200046ebbfaee4b61b3b80a9cebf059c363a76b601ff574b8dbf0e6b -aa1b828a8b015d7c879669d5b729709f20a2614be6af6ff43b9c09b031f725f15b30cde63521edda6cd4cf9e4ab4b840 -8f28f6b62c744084eeddcb756eced786c33725f0f255e5999af32b81d6c6506a3f83b99a46c68fc822643339fe1b91c5 -ac584e76a74cafe4298ca4954c5189ccc0cc92840c42f557c40e65a173ea2a5cd4ae9d9f9b4211c9e3dfd6471fc03a1b -a413365df01db91e6a9933d52ab3e5ed22d7f36a5585ad6054e96753b832e363484fb388c82d808d1e4dfb77f836eab9 -8a68c51006d45bf1454a6c48a2923a6dbeb04bd78b720bb6921a3ca64c007043937498557f0a157262aac906f84f9bf8 -b93ff8b6c8c569cc90ee00cfe2fc3c23cccea2d69cbca98a4007554878311635cb3b6582f91636006c47b97e989fe53d -b9a8a44d54592511d74c92f6a64d4a8c539a1d8949916ef3773e544f6f72c19a79577de9878433bd35bb5f14d92f411d -94f066a7e49ae88d497893e4ce6d34edc2dc0b42fe03934da5d4ed264d1620d506fcc0661faa90a6cf5083e1720beaaf -b42b102adef8f42c1059b5ca90fe3524dcd633cf49893b04b4a97a1b932ca4c7f305cebd89f466d5c79e246bad9c5ced -86b560d78d3c5fb24a81317c32912b92f6ea644e9bedfdea224a2f0e069f87d59e6680b36c18b3b955c43c52f0a9d040 -a3829fa7e017c934fa999779c50618c6fb5eafb5e6dec0183f7254708a275c94ba6d2226c5ca0c0c357b2f2b053eea93 -9337dda730076da88798fd50faed1efa062f7936a8879ea4658c41d4fcf18cee7120366100d574536e71f2f11271b574 -853d09a30f4342f5a84c4758e4f55517a9c878b9b3f8f19e1362be9ae85ca0d79c2d4a1c0c14f5eff86010ad21476a7a -b0bc74cb69bdd8fdffca647979e693ad5cbf12a9f4ead139162fa3263bfebef3d085aab424ed8c6220b655228c63c6b1 -88d8dc8faf3aab12ba7180550e6a047f00d63798775b038e4a43a3b40a421a3f5f152a7e09f28ccd7198bb8cefc40c07 -88db2e3b8746415d0c3e9f5706eda69a29d0b9ee5135ad006060be7787f4f1f7069e2e2e693c5e10b7c3d5a949085ae0 -b5bd830d2f1c722188dba2690d21b7b84b92cbdd873a55aaa966f1d08d217bfc8cffe8caea68868f3850b90b4ab68439 -b5ad4be0c9626a33fce6c8501297bdde21b07b88531451912ed41971a4c48fdd1036d8a4994a99a7fbba4a5901a7095e -b0e1337a2a1772191faa91302f1e562e7cdc69ba5b25139e7728ce778a68a7fa9817f852ec8e04a159122cff62992ec6 -b4fd4a4c1be8bc7e4e2bfd45404c35d65b75f45fb19ce55c213a8035b41f1ccbce9766f3df687c0d7cd6cdfc1abb00a5 -814bf565ece6e9e2a094ffbd101f0b9fea7f315a2f4917abe2bf7d070ed8c64a2987bd288385a42fd336ed0a70a9d132 -af860af861dc80894ed69f29c8601d986917ec4add3d3f7c933a5e9d540bc8ff8e4e79d0bb01bbc08fa19ef062f2890c -b66d33fcf3cd28f15111960ffc6ed032c3b33d4bb53d035ab460cc5fa7ce78872f0476d0bb13f1d38f2672347d2d6c4d -89603ae1a5dd7c526936b86a3b69b7b1d0bdf79ba3cc9cc2e542ec801a6126d1514c075d6ad119fe6b6e95544ffe7fbe -8a1b097f46a62d85cff354d1e38df19a9619875aad055cc6313fdb17e2866d8f837a369a9ee56d4f57995e2b0a94310e -8dc165d86c7f80b0fcd4b6f90d96cd11dc62e61d4aae27594e661d5b08ef6c91156c749de8948adfaf3265b1d13e21cf -98e3173772c3b083b728040b8e0ee01dc717b74c48b79669dd9d2f7da207af64ccd7e9244bc21438a5d4ac79b88e9822 -924d168099b6952d6fe615355851f2b474f6edfcd6a4bd3ad2972e6e45c31bf0a7fb6f7fca5879a0de3ea99830cfb5bc -95452f0b7efda93c9e7a99348e13f356bad4350f60fcd246a8f2aa5f595a9505d05ec9f88b1fe01b90ecd781027b9856 -b95e8af516bb0941fc0767ecd651ada2bc64cc3e5c67a1f70048c634260c0f2c0e55ed22948e1870c54590b36683a977 -82f7feb71e746d5ca24455e3f3e57e4eade92669ab043e877b836612efd3de82009f0555e5d8811bff9f2b75fc57a01d -87623c02caf590ea84cf4a84d1be501f89262e26eb463f2f94a2d3042889c051b058823c3367a989498e46ff25edab16 -b88da847b1ef74c66f923773ce8c920ca89751335fde17b3a98c0603862069a2afbf35b1552b43ad64dccea69f040ff8 -96b734758c823e5ce5b44625c252957e16fa09f87f869baac195956052dc92f933f377b288c7f63b8028751cbbdca609 -a23cc5fbbe5cb7c1d33d433cec4e502f6548412e2374e285d307f75e98280b0c0af4f46bba18015be88cdf7db8b1239c -8bd5bbe04bc929ca8f546e673803ec79602f66ec24298d3e3b6bf6f2c25180fc0032ea6f86c38a6e0ec20ff4eaafc7a1 -b95768ca113e5d57ad887a1cb5ef84ce89007ce34c3156cd80b9aa891f3ebaa52b74c0cb42919cfbcf0cb8bafa8085f9 -a117f99045f65e88acc5a14fc944f8363f466e4a64057eb8fc64569da5dd022a01f2860c8e21b16aff98aebdf89461b7 -895cda6503907c98c43477eaf71dfd26759032523691659f13662ca3a967d93bbc5be342d168223cef7e8a333987d6a0 -a084d77d913d3ec0586ad5df2647610c7ed1f592e06a4993a5914f41994a29c4a8492d9dce2e14d8130c872d20722920 -84a328b73c64137bb97a0a289b56b12060fa186ce178f46fe96648402f1b6a97d1c6c7b75321e4b546046c726add5a08 -b7c35087b2c95127ce1470d97bceb8d873a7ad11a8034cc1cba7b60d56f7e882fc06796048435a9586eab25880787804 -ab05e3394375ee617c39c25c0ec76e8a7f2381954650c94fbcd11063ea6772c1823c693d2d9dd18bd540a130d7b92855 -82ba5907051d84b37fd9d28f8b9abebc41fc4aaa334570516ca2e848846644016356d40fa9314543017d4f710d193901 -9170517b6e23ee2b87ff7c930cb02b3e6bd8e2ae446107b5b19e269bf88f08de5ded3d81a2ff71b632ca8b8f933253a0 -93dc0e3f6234b756cdbb3fe473b9214e970972e6bf70803f4e2bf25b195b60075177a1a16382f1dee612a4758aa076ee -b4b49fac49cdfccda33db991994a8e26ab97366545166cc7140aef3d965529f96a5dac14d038191af4fb9beb020ff6d5 -b826537670acdf7a8a45ef4a422d5ae5a1b5416ad0b938307518d103cc7ba78e495ea200adc5941414a70158a366e8a2 -8ae3588b1fbecbc769c761f0390d888e34773cf521d976ee335f6c813bf06dad38850871ac8a8e16528684f1e093d0c1 -ad9c00b8dccdb545315fbf26849135699c6aa3735f89581244281154c906aba80d20c1e7f18f41acc61e0565f8015a33 -954ce68146c05fc1c9e536add3d4f702335d93c1650b8c1fad893722a81f915eee2d38275dad00ce87f3f5bc90ef7341 -8243feaeff9a12f5aeb782e3dd68609ce04ecde897c90fd8a19c9c5dace3cf43bd5bc0f1624bf7fd2607ca0d71adbba8 -a8a1be55259cd27898d9d60a61998d8da2bf2d439ba6eedb61d6d16dacc4a81ec706b9196dfa080ba20701d2cd9fa1f4 -b0eac6212c7a62ef6062c30875fbe24b8e1a9d88854c035686f849a9eed4d17fbc9af27429eb7c3fd60b47a5e29f6783 -878561a88412e95f19f1cb8894be9d0ea4a2cdd44f343387f87dd37445e5777bceb643cebc68c910acb5e588c509cd2e -a57b6c347955d8b0057a87494223148ff9ff12b88e79dbd9d0aae352fe55e15ea57fcfb9add3d5d269ee0001d8660f20 -a07fa66340d4082585e4d72c77510c59b272e7a3345f4b1de6be7ff4a11ea95d712d035a7355fc8d2e571fa65fe8236f -b9d84a627462438e8ede6c453e3367bfaf81cff199d3e5157ef2bc582d358b28b5ccc3bc27bb73af98ef45179ea79caf -b14f26ea7ca558761cb19508e5940fbf5dcf2ad8555c5a03e8ff92481994072f523b1ab6b7176f698e2cfd83d4f8caad -800cca1cbb14e1fc230c7b420ff06864a934b082321bbf5b71f37340383923f23183d4fdc8fa2913928722b8892db28e -94790c950b92e971ec39e9396c3f32dee32a8275d78e6ea28a47130651bddc86a189ef404c5e8c210bd291186dee0df4 -ad7b3b3e377df64023b8726d43a7b6ec81e5a5e8c0943c5bebe5ab5ddd6597255f434a205c14ba90e9e5e3c462a1fe0c -86ff8156cc857a416e735009cf656b89da59b766b4c4e5a0c0165282b530c10657cc28cf5cb847696725c37ac48b69d7 -89cb64cf9294f68f01533660a2af2aec0ec34cc0b4a0cc36a128f2e0efb3da244981f69aede962f50590faeeb9a5da01 -a2ea5a94a524bb8e6f767017246cd1af9d87c9abb9894e91c4e90c34c5161be6179b49dafcab9cff877a522c76beb145 -b5d9abf29ed6030a1e0f9dc19be416c45ba8cb5ed21aff5492233e114035715d77405d574cd62f2716285e49f79b9c99 -ac441cf6104473420babdfb74c76459cbea901f56938723de7ad3c2d3fadb0c47f19c8d9cb15a3ff374e01480b78a813 -abea34bd2d36c5c15f6f1cdd906eb887f0dd89726279925dbe20546609178afd7c37676c1db9687bc7c7ea794516af03 -8140abfd0ec5ca60ef21ad1f9aabbb41c4198bac0198cb4d220e8d26864eedb77af438349a89ca4c3ff0f732709d41a9 -a5a25abf69f3acd7745facb275d85df23e0f1f4104e7a3d2d533c0b98af80477a26ac3cf5a73117db8954d08f9c67222 -b45ac8d221a7e726ad2233ba66f46e83ed7d84dbe68182a00a0cf10020b6d4872f3707d90a6da85f6440c093914c4efa -80f586dfd0ceaa8844441c3337195ba5392c1c655403a1d6375f441e89d86ce678b207be5698c120166999576611b157 -b8ce52089e687d77408d69f2d1e4f160a640778466489d93b0ec4281db68564b544ec1228b5ab03e518a12a365915e49 -8990f80bae5f61542cc07cb625d988800954aa6d3b2af1997415f35bd12d3602071503b9483c27db4197f0f1f84a97ac -8329858a37285249d37225b44b68e4e70efeef45f889d2d62de4e60bd89dde32e98e40e2422f7908e244f5bd4ffc9fe2 -8d70c66ea780c68735283ed8832dc10b99d3daeb18329c8a44a99611a3f49542e215bf4066ff4232d36ad72f1a17ccc3 -a3b2676cc8cdf4cc9e38c6cb8482c088e5e422163357da3b7586a3768030f851ad2a138eeb31584845be9ffb8067fc00 -95b1fa74e9f429c26d84a8e3c500c943c585ad8df3ce3aea1f6ab3d6c5d0ed8bb8fa5c2e50dd395fa8d4d40e30f26947 -b1185f2ac7ada67b63a06d2aa42c4970ca8ef4233d4f87c8ffa14a712a211b1ffde0752916bfafdfa739be30e39af15d -8705a8f86db7c4ecd3fd8cc42dd8c9844eab06b27d66809dc1e893ece07186c57b615eab957a623a7cf3283ddc880107 -af6356b372f0280658744c355051f38ff086f5563491fc1b3b1c22cfec41d5c42b47762baeb9ee6c2d9be59efd21d2b7 -86bdd4527b6fe79872740d399bc2ebf6c92c423f629cdfcd5ece58e8ed86e797378a2485ead87cbb5e2f91ba7b3fbda1 -a900f0be1785b7f1fda90b8aedd17172d389c55907f01c2dfb9da07c4dc4743cb385e94f1b0fc907dd0fedb6c52e0979 -a9f59f79829a9e3d9a591e4408eaec68782c30bc148d16eb6ae2efccb0e5478830bbdaa4ae6eac1f1088e7de2a60f542 -99cf54a69ad5e8c8ec2c67880900e0202bcc90c9815531d66de8866c0a06489ea750745cc3e3aa1c4d5cb55dcd1e88f7 -8676246a4710d6d73066f23078e09b3fa19411af067258e0b8790456525c02081727b585d6f428c8be285da4aa775a4b -b596c7014fe9214529c8e6b7602f501f796b545b8c70dbf3d47acc88e2f5afd65dccef2ef01010df31f03653566b16df -a12205c6c1780fc8aebdd98611e12180005b57750d40210b9eff0396d06023bd4ff7e45f36777123ff8bed7c5f52e7a3 -ae7dbd435bba81685d5eab9abc806e620253da83e56b4170952852d442648a5d8743f494a4b0fc9d606574f87895b0d6 -9786257b1726b7cdc85219ca9eec415f98f5a11e78027c67c7b38f36f29fe7a56443570fdfedc1d9293a50e4c89d89f6 -aaf0515070d1ca92aacdf5fac84193d98473d8eb2592381f391b8599bcd7503dbf23055324399d84f75b4278a601c8b2 -b31654dbf62fbbe24db4055f750f43b47f199a2f03c4d5b7155645276b2e456a218ca133743fb29d6f1a711977323f6e -8f4d39106ecdca55c1122346bdaaac7f3589d0cf0897a6b4b69e14b4d60550fd017876399401ce7c5d35f27da95f50be -8a7bfdb48cd47afe94aff705fac65f260b3a3359223cff159b4135565c04b544dd889f6c9a6686f417e6081ad01e0685 -967ba91111e5e08f9befcbaad031c4fb193776320989f8ede4018254be0e94586254432d3dbae1455014f3a2f2549d01 -a9db52352feeb76715a35c8bed49fb3a8774c9c8e58838febf800285fd6c4938ec162eb8457029e6984d8397dc79ea19 -811794e6bfe2539e8f6d5397c6058876e9e30763ad20dad942bb5dbcab2f16d51718ce52bfb4de17889ba91da1b85bcd -a6db0f65a6dc8b8cc2312a3e0146d8daf520255bb12f74874c05693914e64e92be0cd53d479c72cb2591e7725dfaf8b0 -918d21bfa06d166e9eb5b7875c600663a0f19cc88c8e14412319d7aa982e3365f2dff79c09c915fc45013f6b3a21200d -9894852b7d5d7f8d335dd5f0f3d455b98f1525ad896fdd54c020eeaf52824cc0277ecbfa242001070dc83368e219b76d -ad00acc47080c31fcc17566b29b9f1f19ccaae9e85a312a8dcc0340965c4db17e6c8bd085b327eaf867f72966bf61452 -965e74649e35696744ecc8bed1589700bae9ca83978966f602cf4d9518074a9aa7c29bc81d36e868a0161293f5a96e95 -961e29a239c2e0e0999b834e430b8edfe481eb024cc54ffaffd14edaf4b8522e6350dc32039465badfff90dcb2ba31cc -943dda8fa8237418a07e311efde8353c56dd8ec0bfa04889ccdd7faa3dee527e316fdc60d433a3b75a3e36ca2aa9d441 -a0ed4c102e3f1d6ebf52e85a2bc863c1af2f55dc48eb94e40066f96964e4d37fff86db2cff55a8d43d517e47d49b5bd7 -9045770ad4e81345bc6d9a10853ee131232bf5634ef4931b0e4ba56161585b4286876bc8a49b7b1f458d768718cb8ebf -b0dd430295ff28f81895fde7e96809630d1360009bbe555e3ac10962de217d93ead55a99fd4f84d8cadd1e8d86d7b7ef -95ced48419b870ea4d478a2c8db699b94292f03303f1bf4560b5b1e49ca9b47e7008514fe0a9cf785717f3824567e1b2 -a7986e0e389e8aef6aac4a7a95e2440a9af877ae2bc5ad4c5f29d198ec66aa0db1d58c451e76ae70275a2e44c3d3fa68 -85a8490faf32d15de12d6794c47cc48e02428af1e32205e0742f8299ea96b64bcd6d3b4655272afa595eec74ecbb047c -b790d7fb1307aacc2d303d9b6753a9773252b66c6b67763cf8841c690cbccc4866ffb5fec1c068b97601a7953fe0f7e8 -afcc4011f8c53f10d63c29b74d9779cd75c861e01974c28a4ec2cbb909b67a1b2287ead175231343c936ad75dfa416ff -918058bffdecc1ae8779dccf1d874bb9e28edbe34c8b5954a8da64a848858d2f0776437b423baf4e731f3f5fa05a2841 -ab554db549aa36dfa9f966a5ed6be8267e3aa9ced348695f3dafc96333c6dbb48ef031693aafd59d1b746ecd11a89c51 -ac4ecf746b46b26a7af49cc9cc1d381e1e49b538dbd7fb773ce6b1df63ae31c916693cca8a90fb89f1e7ec5e0e8dd467 -a8de66d48f16b016f780a25ba25bd6338fd8895a1909aabcfb6e70f04ff66f9866e6e2a339bcbfa4bfba4070a6a8db26 -b4b49374eff6dac622e49b0e9c0e334ecbec513a96297f6369696ad39e5ec0de81a1417f6544be866c9f60957a9ba09a -b8023968549ebab6c1e7a8e82954a5b213bec50bbf35b36697a8d4fd75f9e12d510b365962aace4c9978c5b04da974a7 -8d4bc016026dd19e4059d1c5784897cefa47f7ae2ed6dfa2b3c14a852fff2b64abc09549d106584e0daed861a2d6d6c2 -85e26f433d0b657a53da4c1353485e0c2efa092484c5b8adb3f63dc72ee00be79197ebef7937b37a6a006571641cd6af -abb37a917301e68328032ff4715abc0fee32e5f5be68232ca8bf7ffb8732bc47504e75b40bcc0a7c7720b71496fa80af -9837c8d2660522c0357f5222777559d40321a1377f89ca1717215195bad4a348a14764bd87fa75f08e1f6263e9d08982 -97e06f971b4c56408ed5f1de621d233e6a91c797f96ec912737be29352760a58831aaf1f64e377c3ed9f2f4dc8ad1adb -a12d211304da7b91101513d57a557b2504069b4383db8ecb88aa91e9e66e46e8139dadc1270620c0982103bc89666215 -aab74ba48991c728ba65213e8c769e6824c594a31a9b73804e53d0fda9429403ff3d9f6ea5ef60884585d46356c87390 -92f19be2b7adf031f73611282ad33e462852f778c5e072f689dd0e9458fa6ebccfae02f2b2dc021802c9225035862468 -953bb843c48d722604576cef297123755cef8daa648c30c3a678eada8718dfdb16e71cc3e042a51fedc80577235c2563 -86f509e3c1b9ee9a3b95e6da8516b47feb8c8a83403984228f4903c7ee1ee4f03addcb8fe86283af1196a54b36b9470c -903d793a377e98e2562c49de33e3fbf84bf99211925e7002a4f688470db655884e1efe92782bf970ffa55d9c418ef3b5 -a41b65681ed7f10987a7bfdf9e56b010d53683819d845d880fc21b2d525540605c5823e75c434f17b5a0d08a091c1564 -971be802de51cfc0d10a96be7977c037873f19334ed4ed4904b7675aec8bfa1f8956cd0150b07064caf18229ffd1ccd9 -b253ebe4f82cdbefbc3ef816d40c497fe426a9f0f0f170e783fa4a05ae6dabdfa8c448817a24e723a314b43e76a7c422 -86f397c95025489929ce9230b1466b5c330ec7c58a3c7e3153d6d05bcb8348a13398908e192590b8812f5c5ff09c133a -a0713983a3dc9f10b3833687cd2575de2fc63c4ad8d2f54ff85c6db23dd308daefef1bd1e51eec26732f77c1f37ba793 -8249a1d53ec92f311f4fa77e777800d777f3e9d4d452df740fc767fa7b0f36c8dce603d6e6e25f464c0399b8d0b93c30 -a73d0a206a62922f07b928501940d415e5a95716ee23bf6625b01ff2cd303f777adfa373d70279ba8a30fbb4c99a6f1f -b1106b407ecf234e73b95ff58ac9fdf6709ad2e763b58f0aacc5d41790226d441b5d41405ac03a0641f577848a4f5e8e -b009963ccc7b2d42792f09ab7cb0e929503dd1438f33b953104b4de43274ca3ce051554d10d7b37041b6f47d7a2dab6f -b744512a1b3c7ef9180b095c6a0c5bc16086a50020cf20dc2216bbff24d91ca99b95cb73070444dafc3ab45c3598960d -a0209669ffeddc074d35cc6aa2dac53acac8e870f8a8a5118e734482245b70c3175f760652e792118fdddac028642259 -8ddd3e0d313da17292fdcc1bbc6e9d81189bb1d768411c6fe99801975eddb48dbf76699dcf785cac20ab2d48e392c8fd -8392aa285b8b734aa7a6e0f5a1850b631ddf6315922e39314916e627e7078065d705ff63adbc85e281d214ec7567863e -b655a1fff4dba544a068bf944e9de35eaaa6c9a0672d193c23926776c82bebed8aa6c07c074b352882136b17abdab04b -af5095f40d1e345b3d37bebee3eb48c5d7b0547f12c030d5bfe8c0285943e0a7a53a186f33f791decba6a416cba0c5c9 -8223527f9eb3c8ff52708613cd2ee47e64c0da039cea3a0189b211dc25e9bfa3d5367a137f024abe94f98722e5c14b67 -afdb106d279273edc1ee43b4eead697f73cb0d291388f7e3fc70f0dd06513e20cc88b32056567dcc9d05364cb9ca8c58 -9319eac79ff22a2d538dcd451d69bca8aa8e639979b0d1b60d494809dbd184a60e92ad03b889037a1ac29a5547423070 -b79191ce22dbd356044e1777b6373b2d9d55d02b2cc23167642bc26d5f29fd9e2fb67dce5bd5cf81a602c3243bedd55c -988e0da1e96188ffd7c5460ecdf2321f07bc539d61c74a3292c34cb8c56dbafbca23eb4471a61e8e64e9a771a49fd967 -b0792b6cf4b10f8af89d3401c91c9833736616bb9fe1367b5f561c09d8911fb5a43b7a4fd808927b33ab06e82dd37a28 -862f68ea55206023ca470dbd08b69f0f785fcbabb575a1306ff3453c98ffcad5fd6ead42e8a1f9edf14c6fd165ffd63a -815ff0898b1330ac70610180c0f909561877888ff10def749a1e65edf9f4f7cea710a757c85241dfb13d0031efb5e54b -aa6e6ce21776ea4507d452ccdaf43a161a63687aae1cb009d340c9200e5646e9c2de4104dfd66b8e55dfa6de6ee83e4a -8e8f3d3403e0256ecc254b9b1464edca199cad3f3348002d744721c345a1a3c7f257c3587d2229774cd395e26693d1ba -90483e28985e4a0f7a3cb4bc5e865b9d408b94cd2146c04aed00b48a7ab80a28deb05efec320817d63578d4f953bd137 -84fb2a762ba29193b07f1dd84b3f69153cedb679b66ad04f8a4adf01c14f115163a107e6db23aaf0f0c9687824ded197 -b4a23922bf4302cc9a6583f252a1afa026c87c132b9ae44cc1f75a972cb6ae473447c500827906f9b677617ddd6fb473 -809bb9edbbe3a2769165f029f2a48b6e10e833eb55d8f9107c4a09ca71f0986dc28f3bf4ead9cab498086eb54c626bbf -a0459dbb08db4155d16301933ec03df77c4f835db2aa3f9697eeb2bb6fcd03337fab45fa43372a469fecc9a8be2e3119 -a638eaace7f21854de49f4db6e4ea83d2983751645e0fb200c5e56561f599fd37dac70bdbd36566fdd10d4114fbb9c2f -a3a27bc2728390643a524521bf8ef3b6437cfba6febfd8bb54f2b6ecbafafb96196d3dea279ce782efd97b212f364ef5 -b86693b3ea23ea6b2c4d52554f61ef39c0ef57e514ff6da80c6e54395df8376e2e96b9d50e4ec301c59e022c5c5610db -af4d7cd678d79e67ae19789d43331dff99346cd18efff7bab68f6170c111598d32837372e3afe3e881fd1e984648483e -b8735a555ba7fe294e7adc471145276b6525de31cda8c75aae39182915129025fb572ed10c51392e93c114f3a71bd0be -b1dfb6dbda4e0faaa90fe0154f4ddaf68ee7da19b03daad1356a8550fca78a7354a58e00adeecb364e2fd475f8242c24 -9044b73c1bd19cd8bb46d778214d047f5dd89b99b42466431b661279220af5c50c0cffecebd2b64c3d0847a9c7a8b1ec -891f0d162651a0aa0d68fb1cc39fa8d77fd9f41ff98b5d6c056c969c4bac05ba8c52cbfa7fbb6ef9adfe44543a6ec416 -8920ae1d5ac05bf4be6aba843e9fc1bc5b109817381cdd9aa13df53cabea319a34ee122dcb32086d880b20900ff28239 -abb14023142876cbc9301336dced18c7878daa830070b5515ff4ac87b7bf358aa7ff129ebbf6fb78e827570a4142661f -a74b15e178cf91cde56eab0332e62d5ff84c05fcc849b86f45f94d7978bf9c0fc72a04f24d092a9d795ca3d976467f46 -806829621a908ca9b6433f04557a305814a95d91c13152dca221e4c56bfaa3473d8bb1bacd66e5095a53070f85954278 -b09a3c185e93869aa266a0593456a5d70587712bca81983dbc9eebbb0bd4b9108a38ae1643020ecf60c39c55bb3ac062 -b2bbe8f5361a3ecdb19598dd02e85a4c4c87e009f66fee980b4819a75d61f0a5c5e0bdc882830606cb89554ef1f90ead -825e16cb54fc2e378187aedae84a037e32903467ac022deb302cf4142da3eda3ead5b9f3e188d44f004824a3b5d94fbe -8b39d4a11d9b8ba885d36bcdb6446b41da12cfd66cb22705be05ab86936464716954360cc403f8a0fd3db6d8b301cb59 -ac19d453106c9121b856c4b327ddb3e3112b3af04793df13f02d760842b93d1b1fbdff5734edc38e53103a6e429a1d1f -b1cacbb965ec563f9e07d669ffc5e84d4149f1fb9fcfbc505788c073578c8f67956fb8f603e0b9a9d65e2d41803038ce -b7612d9e7dc930bff29191d1503feb2d6451b368b69fa8ecb06353c959967daccdc262a963f01c7fb95496f1bd50d92e -93f8fceb65ea9ef2052fa8113fb6720c94f0fed3432d89014ee5ad16260aeb428aadea0d1f1e002d2f670612ba565da3 -b3eb9213752156ed1fced3bca151fd0c630554215c808b9a0938b55fed42b6b89f9b76bc698f3e37c3c348d2395dbed1 -b46ab3553ef172ae40fc21c51d1d7eab8599a67f2f89a32a971aa52c2f031664e268b976dd2f7dc2195458fcf4bf3860 -8fb66f2c67ca5b6fb371c7d04592385a15df0c343857ba8037fe2aa9f2a5d4abc1058323ff9652653261b1c7db0edc24 -a7dfdbbf0b14e4af70fdb017875cdc36ad2108f90deb30bfca49301c92cbf821645a00ade1d1ee59a1a55a346675c904 -856199cad25ec80ee0327869077f272e33d59bf2af66c972e4a5839ec3b2a689e16f7fd0a03a3138bec458fcff8edbea -a2842ac5a715c2f48394988c6f84a6644c567673806feaa575838e906138c1b25d699e1b6ffdfc9be850b15da34077e4 -814b448ada88f769de33054c3c19f988226317797acacdbe55ed2485b52cd259ac5bcbee13f9de057eee33930a7fa0c0 -b49de8dd90da916ed374ca42665464b6abe89ff4453168921f5a7e5ddd3dcfa69422782e389e586e531fd78a1f236a8b -851f9d942b4c8ffc020c02c7fbee0f65ef42b1ab210ab4668a3db6aa0f8ab9eedb16f6fd739a542cc7e3cc03172b565b -a5128c155b8062d7fa0117412f43a6fdc2de98fa5628e1f5fc1175de0fa49fc52d015ec0aff228f060628268359e299c -b0765849127cc4ce1a1668011556367d22ce46027aa3056f741c7869287abcaccf0da726a5781a03964a9ded1febf67d -984562c64f3338ffe82f840c6a98a3dc958113f7ed28ee085af6890bbc0cd025723543a126df86f379e9c4771bb69c17 -8087fe60a9a22a4333f6fbe7d070b372c428d8c5df3804bb874b6035e5602c0693757fb30a9cd5a86684b5bca6737106 -a15e195b5850f7d45674cdc3bd74f972768b46fe9473182498263edc401745a8716fc532df8fc8c1375e39e391019226 -858ec10208c14a67c4156ea9c147f36d36c4fa0a232195b647e976ba82c8e16262b2b68d31e3b4702070c3dc701bccb5 -84bf3fb83c003380ee1158e2d6b1dca75cd14c7b2a32aec89d901f0d79e1475aa0827cb07cba1784a6bb0d37f6ca5cd4 -91e69f5392648e7f7c698059a0fc4b8478ab8af166d3842fb382ec5c396daa082ee3b2cb0192da3c9d90f6523c4c039d -8f7299f451c5e641d6fd961946b7a6ba4755685b2a40164e6276c25aefc66715b92492097a191813d39bb4405dc5da36 -ade2cf04ff6c94c1019bfa1e0e8f580696230fa6ee9695c4772e5a44501b2fffdd765ec7cc71ba14b83559ad62cc0fc5 -85fc98ecf469d6f98c8b3e441680816f764de39001a249bc7162f990c5a5354683e849164d4fc9287ee516780cdcd436 -928d118188120d038c37abdbe66c05adaa87f1cf9957dee2783b09fa91c4c43a7b0d0b2b6c5f4dea57e3ec8af230e84f -8025f71cf8d3085d6ea5104dddea8fa66cdb8527e40db01472469be021632daf22721f4acf1a8698a53439fe2f82596c -83266fffb12b3c795a6b551ac2aa7d9a29c183f861e78768c11286a04e22bd423bba05a68775bd77273e3ca316a4318e -95fd0c69c2d9df4e795c7ba71ed71a9d9f2878cd7e3a64be7b671d9611649fd41d29f8bdab642ba19cbd3db660d6a7e7 -92a912cb4d5ef4b639876daf4289500c4ebdbd80aff07fd93dc3eea645f084f910e5c02c10492a37f16acaa7e646d073 -b3d2622c987189a0873932aaea8b92ebb6e9e67ff46e91a96bf733c3b84175fffe950f8f4622cc4fa50f116321c5537f -a98f9a40054b31023a8f7549a44cae853b379bbfe673c815b8726e43ecd11a96db40b20369d712cbf72ffab064ecfac5 -b4e9a38e371fc21f4b8a3d7ad173c9ffad0554530dc053365d9555ddb60f5c9063c72ff4c65d78b091af631a9e1ee430 -875a31aee4ba19e09f8c2754fab0b5530ec283c7861a4858b239a12432f09ef155a35fedb0bc33eac2117c7e62f1c7ee -95edd0d1a6e94af718590756b5c5f5492f1c3441ecc7fa22f4e37f4ec256b9fffd2fda4c11fc1a7c220daee096eb1ff8 -b35fdc435adc73e15c5aaf4e2eea795f9e590d3e3ee4066cafa9c489ee5917466c2a4c897a186b2d27b848c8a65fa8a8 -94a5ce56f8d72ec4d0f480cb8f03e52b22f7d43f949a4b50d4a688a928ffd2c9074ecbab37733c0c30759204a54f9a6a -987562d78ef42228c56074193f80de1b5a9ed625dd7c4c7df3bf5096e7d7b08e2ee864bd12d2ea563e24fa20ad4d30ef -95a8218405038c991ace2f45980dbb1efa9e4ad0d8153486b0213a89e4d7e3cac6d607100660784627c74f90a8e55482 -b6a29d566f5a924355b7f7912f55140e1b5f99f983c614b8a92814ce261f2750e8db178866651ea3b461fb8f92890b14 -afdacc0a13da0446a92455f57a42b3ba27ba707f24171727aa974d05143fae219de9e2eb7c857235dd9c7568f43be5a8 -862a7dc25f7cfa4a09aeca0ed2c9c5ee66189e119e226720b19344e231981504e37bca179aa7cad238ee3ab1386aa722 -a336364e76635f188e544613a47a85978073f1686e4ee7a8987f54da91c4193540ac448b91d07d1fc5c7a8538b1f1688 -8f1ddca9638decd8247c1ce49c1e6cf494d03d91c4f33e48a84452d12b6736e8bd18c157068dfeff3a90977af19e5b1e -96ae91b9aaf00e437c18ddfc1aef2113ee278153ba090aedeb3f48f1e66feb8897bb1ac7f5ffeffc3be29376dd51e498 -8230b5bd9067efb6089e50213f1cc84da892e6faf0b79d5e4768c29303a80b1b754cb09d17a21933aba4c5f32070878a -a79dfe217faec7b4d3cf97d8363949efbc6f3d2c6bbc25df2c7bb8b7fd2521e6d3fa76672bfc06de6f426290d0b3cc45 -8290bd36552609d6b3ac9ccb57ff8668fc8290548eecdcee9a231f1125298c20bd8e60f033214dfbd42cd3c8642c699b -8945db9e8ec437c5145add028d25936ee8823ceb300a959402d262232ae0cbd9a64c1f0a1be6aed15ff152202ea9a70c -949e232b48adeaf57bd38eacb035267d3e78333c6b4524cab86651a428a730baf9c27ff42cb172526d925de863132e82 -98917e7a5073a9c93a526399bb74af71c76958a74619caccf47949f8fd25962810a19e399b4efcba0c550c371bea3676 -b5b144e0707aefc853ea5570bd78dedc4e690cf29edc9413080f28335ac78022139bfe7f7d6986eb1f76872bb91e82ad -949945072a08de6fd5838e9d2c3dc3200d048b5d21183020240fa13e71a1a8d30e6bfee4e6895e91d87b92f1444d0589 -b351a03c7c98506ee92d7fb9476065839baa8ed8ac1dc250f5a095c0d4c8abcfab62690d29d001f0862672da29721f16 -a82d81c136bc5e418d1fba614cb40a11f39dc526e66a8b1d7609f42fea4c02b63196315014400084f31f62c24b177cbd -87d51c907fdcdf528d01291b28adfee1e5b6221c6da68fd92ab66126247cd8086a6bcffff0ea17e7b57b0ba8d01bb95d -a2a9a1a91dfd918f36c1bfeeca705ea8e926ee012f8c18d633e50ec6e50f68f3380ef2ee839e5a43cf80fbb75bfb5304 -86f22616caed13c9e9cd5568175b6b0a6a463f9a15c301b8766feca593efa6e5ee4c7066e1cd61b407c0be12b3d8236a -b57e0a2c42790d2fd0207ef6476a433fca0cf213d70840c4af1ad45833f23fca082d21a484f78af447a19a0b068ea55c -8ae9bda5d85e6e3600dde26379b7270abd088678098506b72196ac8f9ce5b0173bc9c7ff245c95cbab5b5b967bcb043b -95c7d11f6c874f59ba632b63ce07a7a9d917a74d0b89cefa043f52aa1a7fe2e81c38dea0b20378264b5b4f64039932bc -ac7dee7479f50722526ea1c9d4e2f1a4578d1b5cce2092a07722069c96bb4da295de1c4f16e21005276e3b3f1624ac5a -89b8aaa49bd18b09f78fc5a1f3dd85d69b5dfcff28fc6d5a92b1520bc54107b8b71bb71fd6e0bde10e0a5809c633e5d2 -8982cb43fe4d3488c55e8c08b935e6c8d31bb57e4f2aeb76d6319470cce99ebf7dc2f116ac15b9d845ab1bc16aa6a583 -a12c63f48e27b1a1c83a32992642f37fb5b89851a35e80f6d1f9bc483cb25acd0e12b1dcf68781ae0cc861f002368bcb -aa6da92a4b4fa229afc8007abca257ce0ff5fad3b1ccfe5d836b9b52ff6b72575a0b915a759403b993733b16a47fdb15 -8bf706a92fe54f15d633b9463926b874dd43e28aaeca3fe2353fb58ad7753c8a293c56b0e94176070e8a9ec7401073a1 -b81e86de4bb5c1046e40cca79585c5b98c8673626fd3a28e563c5a3296256c2f7086522ae95cbabfaa8f1a8f7eae6272 -ad10f895b05d35cb251f78cc042d3f0969a8b6b3f289ddb4b016e0b8e06bfffc3a3e1afa9b0cc548f8c092832bb766bc -ad993aceb68d5217cfb07f862956cde83d05dec5060fc7a8fbfd37c6bfd5429ba69bdaf478b6cd01c323a06793dcd9fa -83da9c9a8fcb2775df0777aceabe90642a2df1c6abc646566e954f42d6e43455b00b101ec5ef58850c8d4b3100222ca1 -b55484f339fe7c7d107e70432601f4a34e1cc02ae4de5d18b99e5aa995f7b3710fc745769b85c1af803d457491dd8ce3 -8009d80593e82f3e751cec9e7e495fd29ad6f45f8d3ae513bec998b43c49fed74c44229c6f27c421e80c65413b897644 -9868081bbcc71192f7ff8dcf99a91dcd40f96556fbd6f285bdbfdfc785f604d8bf75c368c59db5ac8cdcc663087db53a -a04b1e91af025b4387ee0a2d790a1afb842e46f4c3717e355578efd1f84fea78782c6f7944b4961268de7f1ac71fb92b -a7b6301ddb9738b89b28a36d29d5323264a78d93d369f57ddab4cea399c36018a1fcc2cc1bfadf956a775124ae2925bd -a6cdb469014b33c590a07a728ce48f15f17c027eb92055e1858a1f9805c8deb58491a471aaa765de86a6bda62a18aef4 -828a23280ec67384a8846376378896037bd0cb5a6927ff9422fca266ee10a6fde5b95d963a4acfa92efbb0309cdb17b4 -b498ec16bcdb50091647ae02d199d70c783d7c91348a1354661b1c42bc1266e5a5309b542ef5fdf5281d426819a671cb -806533fb603e78b63598ff390375eebe5b68380640f5e020e89a5430037db2e519ab8ae5d0d0ad3fa041921c098448e1 -9104ad119681c54cdee19f0db92ebfe1da2fa6bef4177f5a383df84512d1b0af5cbe7baf6a93ad4b89138cd51c7c5838 -ac695cde30d021d9f4f295109890c4013f7e213d2150c9d5c85a36d4abfdca4cdc88faee9891e927a82fc204b988dcd9 -a311c244df546d5dc76eccb91fe4c47055fc9d222d310b974d4c067923a29e7a7f6d5a88bfef72fd6d317471f80d5c82 -89e4518335240479ad041a0915fc4f1afaab660bd4033c5d09c6707f0cc963eb2e6872cabc4a02169893943be7f847d4 -a8ad395b784c83aacf133de50d6b23bd63b4f245bb9e180c11f568faca4c897f8dbda73335ef0f80a8cb548a0c3c48fc -93e02b6052719f607dacd3a088274f65596bd0d09920b61ab5da61bbdc7f5049334cf11213945d57e5ac7d055d042b7e024aa2b2f08f0a91260805272dc51051c6e47ad4fa403b02b4510b647ae3d1770bac0326a805bbefd48056c8c121bdb8 -99aca9fb2f7760cecb892bf7262c176b334824f5727f680bba701a33e322cb6667531410dfc7c8e4321a3f0ea8af48cb1436638a2093123f046f0f504cc2a864825542873edbbc5d7ed17af125a4f2cf6433c6f4f61b81173726981dd989761d -88e2e982982bf8231e747e9dfcd14c05bd02623d1332734d2af26246c6869fb56ee6c994843f593178a040495ba61f4a083b0e18110b1d9f5224783d8f9a895e8ee744e87929430e9ba96bd29251cbf61240b256d1525600f3d562894d93d659 -a2d33775e3d9e6af0d1b27d389e6c021a578e617a3d6627686db6288d4b3dffd7a847a00f7ef01828b7f42885b660e4204923402aca18fbae74ccd4e9c50dd8c2281b38dc09c022342ed1ac695d53f7081cb21f05fdfc0a3508c04759196fcd3 -af565445d2ad54c83a75c40e8895f5ad7219a8c728bce9d58d7a83716e095432993ebbd3f6911c66415a6f920d1a4d171478509b54a114308a020b33bf4487a7a8d0aa76ae4676a9b54e765a680f562d3a4fcb2e92c58b14b49b5b2917cc258f -8aa99cfaf514cef4801599cadd780d222194ca1ad69a34779c2bcfda93e5dbeb931e13914421b5809a6c81f12cf7038b04a35257cc9e94c33761e68565b1274aa6a6f9d66477229747a66b308b138f92aa4326a3bf23df65a1fe33b3b289bfe1 -99ba36d8b4f56bde026099278548b1afc0a987cbd7c9baa51fc8e6cbb8237a17636f1a44a385cec69b05a5802059956a11fe793cabb939c38800f9c239ca2518e898ade1ec2513c9ee492071a35aabd78182392a09123d28dbc233313c9120c4 -a7dc40c36afccb30a2eaff250860b28b227c195cf05674704c567d77d6655c446ae835f8fc8667e71147ab02afcb2dad0babe60cbfa37d7c2cddc68d2dec54f28a4142f8353590a3902d5ddaa22066ab563dd1435dda83f276387b9767d69120 -939e6cc97a8b88572852a5b7f25e4838556307f60aeafb5d2b6961edbcafd4b48cb6ac980ffbacf4be963f324ba81e3d12de4f1459d8c746d0762c66ae1b166027f7fbe641d9c48f3c7d97b06d956b0be51dcc9aab65f3e99e1388e63bdd79f9 -b391e156541dfd4003d1697cdb7ec815b309807320574906b2e652ef0175828b356d215cd374b1b34d9f470b3fa0e643113e67b2273268f922f04f072cfb89008358185b25cd631f82911a3f20f90f75758ffb99bebb8076458ae1e9d1ae898c -b9ac9c84934cc2a85c876eff65577e1dfce1935cd6392c877dd881a7d2f5c3e9344f28c04f90c62a6db4237ca00f9e0d00cb5f63e3f060fc7303916e19273b6fe455f331cabbe2fe5a22d584484f0d4176120fec9819fbb0a01e6d38695acfcd -88209eb030c5d78734bf2c2a5c539653fd3c24b4c08e624f9ddc4a6550efbdc1054a56eb0c807595aad6de56fda326aa196d032a8b4b48d40140a2d77df3c7243eda6507936389a321a5811eb38e32ee433c788deeae1eb928b00940e2944bcc -a8632ddc9cf7cbc1e8b74a05b7d4a89618c64afe30367ca0c9550ae7d320bf4e51c5a69e1501a1d8bee4240d13d7835501aa39fdc401a74f4d5734e268a7ce29a1fcfdb0a8bc64e0dd4a9e8578d6985bc2bc6a3764ce7a3703f6fb2e52557a2b -a037ac67e8bb6f4193ac967e05d080a489f58ef8d3d30a89798246f3e4936121ee445b03e410a09e8ebc0db2e2477d110aad0ade99b0887f1eb016e750f42135866907f150bd6f4f99a8cb94281474166874808ebe03b118c5daab16dafdc38b -a50d9143116bffa3b237da8e1805327e81e9cd25e658289bd727d5f9e0020172cc8690dcfe31a240e5cbc48353b88c4908baa1dd7320165556e0aa633f62fcbe7870222d345a3bbcdb7ab6c07f0fd86be559964afabf56f0a8cbc0b4b91d477e -afa988ea6fa4f40c5ad07d2d580d29025ddf56d6ef1171a8b8de3464203f70b97d6f5ace72747345204b35150e06154d1477516a989ce8eea7871cc0d0de00a077c0fb23ad4837e409d0b885bf3f2dde11a30fa6273d662e68e09f461e52932f -97fa1a943ed8b81574304a3d03f4f15907f6e6e0cd36a66bd2ad2c75afafc70a61d3ff69b77ebe4dae9ca0fcedef80081062705e60bbb6ea0f1f398c84d2f8e4a3ac142ac66426c21ad5e9994ebbcc406af474c4aec5e32fadcb21875af7c9f1 -b30a564614493886f14a5dd71c89457504f8c59a7ac01b665ed167e9a8f9ee5832198fd319ecd234196ee57031bdf3840bd5a923e203a1938bc795c704b5285389750e1fd10d7050061ba19db00a60a2c0384a7d661d7d48ebe6962272230859 -84c8dea942cfae71cb02e705ec496d967425793ce8812e7ee53c2f23713abeaff566a658cd1c73dfd18187d16253a6ee0a623e82cd18e31cd1a1875d19c078835dc9292e141686150a88065226ada264740143e87c03a0f6c4da8c187438ebf4 -8c3abae8aed60338f8c4ff80aab22f8a2ae56756a93566c906f490a97151d34a1c3318054e1c494c60cc53327ad86a2d02c6c76a406726ce4f88635bc32eff0db0b61762dc518b95fa8da82e87e4bf3de54f1d72180ef53ed7bc5413e6a9a510 -a328230c92a6b1cef6a444bcb64edb992f71e3d7b93f0b6b8b408ba7c908db746d92ddb2c7588bab438ef3bc61be1c2f0dfc86ba2ff514b42b35c80f89b2e780f813ea1dfb977fbded2cd9b553b747fa952e227ebd8f071163d421fc337f04c9 -b482cab423cd5f1c5df036070aade7aa016283d69619d664025c3feab866a0a5691d344b2ee2bedc5dedd1f9a73eae16003a3827c9e5bbe22ded32d848fba840ffad1141ad158f5c40bc8ae0d03781b9705d851a7f1391b096c576c0f4f2a6b0 -919ee1df27fabcb21237a1b7b98f53d41d849e1b6a8f9e28c3fae2841c6b5a250e4041c737e6725476e5cd715e34d3880f58d80f61efaabc261bdc703e8750f48a923e9bf8980931b9fd9e40014c66c54b3e7c98241d76d1aa47af43313a65a1 -ac94830145dbe9a8f7e6e0fc1f5fb454502d22abcafdc2dd96c6933c604461fa83b2b37385f4bc454875a02a6d4157841250956783515d11c7456e7f11b745f12856d89f5feedaf6a61a483a6c33a21cd2ba0c18eb41a1a2e7fc33bb53e4c570 -b209c699f1233735c5bb4bce848e4365fd76651ae2184d2279a90df0c2f69ffa2a24d84a9b9f274021072953c0d65e1a0202d490d6c37186af240114e445d87bff754b4824937e4f2c90a574061b1c4910fed88d90f698025a2a264e656cb8a4 -93320dc0576b0d069de63c40e5582b4486d9adf5e69e77e3ebaf3da26976fe42147a65051501bc8383f99e7ba75479c70a6726c2cd08bf98c7481f1f819712292d833a879f21a1221a9610bc748fb5e911055122fdb4055cdc84e8bfe0f4df9b -a4380b240e998cdf668591f71a0c88ed143b0185a920787627ce65095f8223dc606fa5bce93377af100de92d663e675c0736d7f1973603a84a5c4162fb5e01c88c7493503ae1d7e9fbe8ece9b418397d68c21eeb88dae226e09875d372c646dd -aab48517d69135a16b36b685adfe9b2544a709135a21ba3e75981a2cba4ec81d1fe28ac0f72fde0c0001c15300ed6a810f58d3117bdd58d0149751d6508cf8a1a1ff7b63dd02d2730a9d6fe96c77c502fe8ed46d50a181ec4bb35e37dfbd6af4 -8277265fe75ab89ce4ec65b33fb4084bec0a56d81faf2f7a9070d2ca3065678e03a790350eba56323a54e0285bc32fe8007d5259740fde226e16cbde8354eacd562294eb9b7f727ed72ffbdad86f467cf057c737b34b80a41deb92634ed866f5 -aa40a24cb2ebe606d969392c03020070f044c95088d80f57f771b837c048342d2cd3474600d7660441090ffb8d2ffb7f0eddd67eb378e3e1477a6ba0bc38096d5d2d3355bc8b60f605f57f0c1899da591457440352381d2b38c0aa9acc7fe419 -80815d10685808cb630820629bcd2fa9041c9b74433630c0b9c1b7f7e8edf1440b520217f76ec9a50c125cf4438aa66006a1928a9ed2321da7ea325c3d56b65462b72118ca2c99a0ea733aa11da9abbeda6cc71ffeed301ae70213a29e697dcd -ac235d079f91b00b1fead7523da8f73a5409fa8970907af0c5d5e4c6a0996dccfcdb0d822d08c7fbc0c24799457d011d04312d20831825f23cf988141056a6814c8a1cac9efe37bdcbfa272aed24cd92810fea7c49b0d07683a5c53643872179 -b8aa59534d75fa5ac1c2c3f963bf73899aff5210059dbde8a8635561c6249e5143affee3bd2fd57575213b52d9a73d5702525867a7dcbb1d0a49b98c2925556fc5463ff0209742046a24ab29e74257d6419401093cc4371944d811cc300b6a67 -80bbfc5b816eea29a6d84e2217dee4d547306994d39e5592515e1b0807b67fe960d1d5addb0ff1a20c158bdb294c04bf093d28996121845a2c9268e2c9ac0f4067e889c6aaca62f8535d35b45036954bd069e3afa84f04721538c26003304c20 -a535c17d0e151d0e03d42dd58ba8c715bee3fabca2890e0e016071d34184b6b34e770d2be29c8ec76b69bcc471d50f4d043c2c240e9b93a81cff7ee2724e02018dfd9b534e40be641fdb4884abcd83b76f517557ffba508f1ba2f56313f4de94 -b237eb7465df0d325a3aa58269be2627e4978f9863f4f100ed4c303cb1f6549e606f2e3c9180824d8049191965c8dacd0a0c76cc56cb22cf1bcfdb39372c8aa29b4f7b34582b1719e6bd59c930d87d5ccd838743b585d6e229d5ed42337315c0 -805c335a2a9d2de30809cf30808ef836d88e9453c510716f01696f14c72dd60505eca8f128970edc8e63a9aa1f8792ac0dd50dcc84fbf4cc8b32349c682a6a27bc7551c7aa273a94c1606d07710188d93579afe3be1781bded15a34ed6047922 -b25dadf385ddd3c39bcb0a014d3d4f66127946b1aceae8809e3a03d66cc25e27142ca108316391f857fe82fdea4db2520cc73793b695eafbf3ade00ef7ec747b0457e49303f5e1a370f5263b436566fe24a0876e5fe088238c7be37a0718d65f -b0f753081cabe2c8fce73aba82ff67dbc9842598b3e7fa3ce2a1f534536f8ac63c532fe66552ac6b7adb28c73ed4c8a4184849be7c1756a4681ce29ebf5e1c3aa806b667ee6bd68f6397aba3215dc1caec6742f21d681e32cd1160d6a3b1d7ee -b798771eeb3d7a17c62ba5916cc034bba870da6b1ac14c2e1cae71af3ad4e0c0d1ff983f691e0e55289d5a33b131f2ec12430c9566dd71f4d8be9c79155357a5c30c5efcfd75bbe1bb6d5ada4d50604ea49ed838d3641f268ca6e25c9c4b6b72 -b52554c017388b099804abbe565346591a086d9979e10140ddaccc0a3680e506db775d7cbeafde67563adf0f09f5c2420caf19629f4e8f03e6fe02e9416ecd5269989e482b90004a083967d1141387eb74865bac6bd17e7a6d5f58225e52d4b7 -b520ff694520919023d44d53f98a7de2f78ff37b2d9193dcaa35556a6a0febf767781a4c961dce7c804bfdf81935f8f0082865253da52e79dfa1c5ff74d61495b2da76e167d46114709e877a7791a3a95e33a42f56b83f5f5afe271c67ae997c -b721401983440797a03d5b99f2088a0b249aa911969c34dd6c615b0060325da555d2ad99d931170c0868b0488a2234a4114cc0013d5163b833f5c45c5eb536421c016cf85788390176bb2dc4c196d6be26bbbfceae048b82f0d8039222e71c94 -acd9d833ba0a8cbd8d1ba939a11ea0fa5607e1bc6e693ec318bdb097aedd042d76e695dcebebd142e2e4ac30b1905dff03ec36d9cc70577e4dbe5e9ed7c20c7afb13a7f0155f203c6b83b9f1ad3d20a0d4aef0fbbbcf466ffc1bcd482bc2f5e0 -8cc1795de015f2b0e72116f169f3b4624b7738ceebea354e0bd9051c27b86f647ea36cad57ea6884c1a8adf9b45cd83514fa687e68878bbd613d793aa10986d5a0411f081689229e0d72133b3667b9f3f1a02211d0e680564eb1ea43393e1f36 -aa9281c61113c343a108de1036570feefc72fb7a96ff11f73024de12b83f29631f5a8a5900e6f10b15227c6f7462881511271bf785ebdf95ce288100e5dab391f664f6ff76c72b65b34479a4f43e5e8eba292209d6654157286ad3242ac342db -aaf16866275082e59d415db317aa874267d048ee405a553e852e6d175711d31a1fee99912345915bce121f43bc3e00d81338e5fcd3c8a1012fb4f172a9fe15622dd368b4d9d5cb60d189f423b071791fe26cea7676aca8df07965cacf80b0cd0 -accc80b3d8a6ffa648487a3d3c0ce1aeeb5401edf3cf2e385ea4a6d5fc110054fcce38f01f1da7141bbed30eb7a0a6810c82212bbb9da75d6033082dbcf6bc6a5791f85aa0f045a10da5de015edbf369b4d23b32b0c058962d2ee88e6911f994 -83f1089395a16077738cc7c9a6d6a3dc9033aac4abc508af5a1f007ca92e1a80b2e6f2dbda7fdcf0d5646de790a6201d0a9cfbcb6620a1426600e3a6a425ec004384f49fb9dcd166691a47177d45dcbcb761a11d46220b0aa09fc946131f7aa5 -9246bb586d43cb817c2e15ed609156e9f1cd284ba2f4797bbfa51c0341e1ba382eaac059aa9f63fb88d228a1a932839a171e7c7d00199dc7c4d6c5ea038a02cbc3cc5297c70401520e70ebbcffacd6a703f62896f3c788f94dde3c33ab0ecbdb -a316cb7c74feb0563c56cc79015e2774fbeca458bf8e9fb07894f9d6bcd73f7fb9428e87c816e5629e4bf7f3ec567fbc091549471b75492dde08217cb334b716b4582b24384586e53388873a78a90ec01bd7c3bace9cfc52161467df16e27c33 -ade18c74bbe60d1d69f4a570f8e5fd8696c26cc9e02829040b6b14cb9c49a4b3263b5bd5e16ec0b29010b4be054c16ab09304e23442af7d7f5fcc60bc6c5634ab6e4aed7ef334b2785e4c7672d59a687278e42d310342db5e5975d716e6d1595 -b7728800bb2039acf228fa3d8028569c426cb85d28b2b5820bbef938d5ca8c4df981d3e01a309e26ca101e8295d0f6990c03b8c239798323575874a4ee5bfe46cfe99b9657189142aacd8f8d1f26cf4c0e73c6397c31ba8f18102b9ea315b638 -8fb14f2a9be193f54977ecd3021663108ea143627b9a9d9faff85d1a86b855f6c437eab435fad3304f245bd7732af07f1173494cdb802fb96e85d2db89e1643206e183f3b228ca8d3f586e71aa9308eaf0223100bf07942fc39e465016d1f775 -ac1e025e53d98fdb3380489dce82d9d4bd3a6c98f0a523b841cb09a6f26ddd4d22efd98776e78d10fd996995fd00e81e08d3c25dd14a54b25a9d483677a24bbb8d1cb41a443b2c71038e6893b1b30f70758424e0f2039a48060191389033ef55 -a4c017311b9e930868132527a9849072b91db04fd36c619ae39c98da9e2174e6201d3c2ff1246c06b1b6815bbf3ea4a1116564f55ee2fe4c4d655e2294c0ded842cba209c255ca3d7b7f82d162f97890dfdeed087aa2f87cbfc61d61815da39d -89516315a3956b455843c2555248bd94dcb19993060fe75fdd51f7aa9c9147ab13997d8a98036a8f04bee5c91d78d2990907e35a52537a8ab3ed15f1a71afdcd38044a5b6e93f662b9d36c16933a881927cacae668c4c06ee6f004c9e3989bad -a1e78a011e210400c68ca76045f7da74119bff3cbe382efd2bd2ac76567c52d68d75536a91999d084043e1ce2d07d02e0b69fb99924101d2543521747536fbc51b0454aa9a4cbbec101121f597863a5c0fee2ca5eab35dff9b9085bef8b2b0d0 -830fd8d083e39153ecab43cabb22e29d7b44a55fba467af4ddd3f069439d2972ef53c3518de788f96b3f4f64963987d0155ba27afc28643af3de8e476ff515a68285728167408f45d99e574680bda6bacdd4322e587e4aa99386e035c0e931ad -b89584da22237e3061d991b1a55a5e55dc637b8b671130d304587729348138ef87885180310efe9f9f6d3580b9d7fdcf0649e8a79d2dec8c25a9f53df0fac5d517db999029cbfdd7c2cbd3e9a5503e5d267d3d8ad752335915c92b850b14bafb -959b8030733799882c5e3735479924b013756e57b893f9792bab4043e2d362d77cf308166d782e3989caa771b8a0c0a01302cb7b5e8ca12e2d6cebd59d4cd173c9dc25f438bac597fab17b4ff44997a489c168e7204b7d7c21d0938f0a2e3b51 -a0a9e5503d9afe0027891dab890c687fd5f5fac5741418490c64d7c15f59533dd603a50163c79402afa61bd02de486761983c94501da17e6bbe78c497f2122210071602f578adc0ebe7a4679f87fe77e09c8c122de69105f13455fea25f08e6f -9811487283ad620cd7c9b303ae2f348d0e6f5ee17b504baaa817ae207adb912a00d3cc36dbf48745eb899e6b6e22f09f0f9ba29d949ecd7350fbbfe87a8c7cdd5d0e687fc807751d07634aaf7c38baf3b24a0670c38fa6ccd7431436fc95525f -8a13aa5071c526e560def7d8583393942f07d88c9d8d26c98738fd65f57af2e3326dbb1edff0f39fe98eda4a13ed4fd71844254b954690154c4804e1c4a53df9dc4643f4b7b09d0860070f6b2318d0d63d28fb56bf5b6ff456a18dfc72fdfbbe -b9c90ff6bff5dd97d90aee27ea1c61c1afe64b054c258b097709561fe00710e9e616773fc4bdedcbf91fbd1a6cf139bf14d20db07297418694c12c6c9b801638eeb537cb3741584a686d69532e3b6c12d8a376837f712032421987f1e770c258 From 44276753e573802a07b639caa51eb4af56340351 Mon Sep 17 00:00:00 2001 From: lightclient Date: Thu, 9 Nov 2023 14:56:52 +0100 Subject: [PATCH 123/387] cmd/hivechain: add 4788 contract to genesis and set beacon root post-cancun Co-authored-by: Felix Lange --- cmd/hivechain/generate.go | 12 ++++++++++++ cmd/hivechain/genesis.go | 5 +++++ 2 files changed, 17 insertions(+) diff --git a/cmd/hivechain/generate.go b/cmd/hivechain/generate.go index ea1860eabe..27989ecb58 100644 --- a/cmd/hivechain/generate.go +++ b/cmd/hivechain/generate.go @@ -5,6 +5,7 @@ import ( "fmt" "math" "math/big" + "math/rand" "strings" "github.com/ethereum/go-ethereum/accounts" @@ -61,6 +62,7 @@ type generator struct { genesis *core.Genesis td *big.Int accounts []genAccount + rand *rand.Rand modlist []*modifierInstance modOffset int @@ -84,6 +86,7 @@ func newGenerator(cfg generatorConfig) *generator { return &generator{ cfg: cfg, genesis: genesis, + rand: rand.New(rand.NewSource(10)), td: new(big.Int).Set(genesis.Difficulty), modlist: cfg.createBlockModifiers(), accounts: slices.Clone(knownAccounts), @@ -166,6 +169,7 @@ func (g *generator) modifyBlock(i int, gen *core.BlockGen) { g.setClique(i, gen) } g.setDifficulty(i, gen) + g.setParentBeaconRoot(i, gen) g.runModifiers(i, gen) } @@ -200,6 +204,14 @@ func (g *generator) setDifficulty(i int, gen *core.BlockGen) { } } +func (g *generator) setParentBeaconRoot(i int, gen *core.BlockGen) { + if g.genesis.Config.IsCancun(gen.Number(), gen.Timestamp()) { + var h common.Hash + g.rand.Read(h[:]) + gen.SetParentBeaconRoot(h) + } +} + // runModifiers executes the chain modifiers. func (g *generator) runModifiers(i int, gen *core.BlockGen) { if len(g.modlist) == 0 || g.cfg.txInterval == 0 || i%g.cfg.txInterval != 0 { diff --git a/cmd/hivechain/genesis.go b/cmd/hivechain/genesis.go index c482280268..a036125eb1 100644 --- a/cmd/hivechain/genesis.go +++ b/cmd/hivechain/genesis.go @@ -6,6 +6,7 @@ import ( "math/big" "strings" + "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/params" @@ -163,6 +164,10 @@ func (cfg *generatorConfig) createGenesis() *core.Genesis { // dcc := hexutil.MustDecode("0x" + depositCode) // g.Alloc[dca] = core.GenesisAccount{Code: dcc} + // Deploy beacon roots storage contract (EIP-4788). + asm4788 := common.FromHex("0x3373fffffffffffffffffffffffffffffffffffffffe14604d57602036146024575f5ffd5b5f35801560495762001fff810690815414603c575f5ffd5b62001fff01545f5260205ff35b5f5ffd5b62001fff42064281555f359062001fff015500") + g.Alloc[params.BeaconRootsStorageAddress] = core.GenesisAccount{Code: asm4788, Balance: big.NewInt(42)} + return &g } From b32641ce2b6500974d6321cea82df8cf42e7ed95 Mon Sep 17 00:00:00 2001 From: Jochem Brouwer Date: Wed, 22 Nov 2023 11:30:15 +0100 Subject: [PATCH 124/387] clients/ethereumjs: add faster local test dockerfile (#940) --- clients/ethereumjs/.dockerignore | 5 ++ clients/ethereumjs/Dockerfile.local | 60 ++++++++++++++-- clients/ethereumjs/ethereumjs-local.sh | 94 ++++++++++++++++++++++++++ 3 files changed, 155 insertions(+), 4 deletions(-) create mode 100644 clients/ethereumjs/.dockerignore create mode 100644 clients/ethereumjs/ethereumjs-local.sh diff --git a/clients/ethereumjs/.dockerignore b/clients/ethereumjs/.dockerignore new file mode 100644 index 0000000000..14949eda20 --- /dev/null +++ b/clients/ethereumjs/.dockerignore @@ -0,0 +1,5 @@ +ethereumjs-monorepo/packages/ethereum-tests +ethereumjs-monorepo/packages/*/node_modules +ethereumjs-monorepo/packages/vm/benchmarks +ethereumjs-monorepo/node_modules +!ethereumjs-monorepo/node_modules/@ethereumjs \ No newline at end of file diff --git a/clients/ethereumjs/Dockerfile.local b/clients/ethereumjs/Dockerfile.local index e17d20d501..b159c12ecd 100644 --- a/clients/ethereumjs/Dockerfile.local +++ b/clients/ethereumjs/Dockerfile.local @@ -6,10 +6,62 @@ FROM node:18-alpine RUN apk update && apk add --no-cache bash git jq curl python3 gcc make g++ \ && rm -rf /var/cache/apk/* +RUN npm i -g ts-node + # Default local client path: clients/ethereumjs/ ARG local_path=ethereumjs-monorepo -COPY $local_path ethereumjs-monorepo + +COPY ${local_path}/config ethereumjs-monorepo/config +COPY ${local_path}/package-lock.json ethereumjs-monorepo/package-lock.json +COPY ${local_path}/package.json ethereumjs-monorepo/package.json +COPY ${local_path}/scripts ethereumjs-monorepo/scripts + +COPY ${local_path}/packages/block/package.json ethereumjs-monorepo/packages/block/package.json +COPY ${local_path}/packages/blockchain/package.json ethereumjs-monorepo/packages/blockchain/package.json +COPY ${local_path}/packages/client/package.json ethereumjs-monorepo/packages/client/package.json +COPY ${local_path}/packages/common/package.json ethereumjs-monorepo/packages/common/package.json +COPY ${local_path}/packages/devp2p/package.json ethereumjs-monorepo/packages/devp2p/package.json +COPY ${local_path}/packages/ethash/package.json ethereumjs-monorepo/packages/ethash/package.json +COPY ${local_path}/packages/evm/package.json ethereumjs-monorepo/packages/evm/package.json +COPY ${local_path}/packages/genesis/package.json ethereumjs-monorepo/packages/genesis/package.json +COPY ${local_path}/packages/rlp/package.json ethereumjs-monorepo/packages/rlp/package.json +COPY ${local_path}/packages/statemanager/package.json ethereumjs-monorepo/packages/statemanager/package.json +COPY ${local_path}/packages/trie/package.json ethereumjs-monorepo/packages/trie/package.json +COPY ${local_path}/packages/tx/package.json ethereumjs-monorepo/packages/tx/package.json +COPY ${local_path}/packages/util/package.json ethereumjs-monorepo/packages/util/package.json +COPY ${local_path}/packages/verkle/package.json ethereumjs-monorepo/packages/verkle/package.json +COPY ${local_path}/packages/vm/package.json ethereumjs-monorepo/packages/vm/package.json +COPY ${local_path}/packages/wallet/package.json ethereumjs-monorepo/packages/wallet/package.json + +# for npm run prepare +RUN cd ethereumjs-monorepo && git init + +RUN cd ethereumjs-monorepo && cp package.json package.json.bak && npm pkg set scripts.postinstall="echo no-postinstall" RUN cd ethereumjs-monorepo && npm i +RUN cd ethereumjs-monorepo && cp package.json.bak package.json && rm package.json.bak + +COPY ${local_path}/node_modules/@ethereumjs ethereumjs-monorepo/node_modules/@ethereumjs + +COPY ${local_path}/packages/rlp ethereumjs-monorepo/packages/rlp +COPY ${local_path}/packages/util ethereumjs-monorepo/packages/util +COPY ${local_path}/packages/verkle ethereumjs-monorepo/packages/verkle +COPY ${local_path}/packages/wallet ethereumjs-monorepo/packages/wallet +COPY ${local_path}/packages/common ethereumjs-monorepo/packages/common +COPY ${local_path}/packages/devp2p ethereumjs-monorepo/packages/devp2p +COPY ${local_path}/packages/genesis ethereumjs-monorepo/packages/genesis +COPY ${local_path}/packages/trie ethereumjs-monorepo/packages/trie +COPY ${local_path}/packages/statemanager ethereumjs-monorepo/packages/statemanager +COPY ${local_path}/packages/tx ethereumjs-monorepo/packages/tx +COPY ${local_path}/packages/evm ethereumjs-monorepo/packages/evm +COPY ${local_path}/packages/block ethereumjs-monorepo/packages/block +COPY ${local_path}/packages/ethash ethereumjs-monorepo/packages/ethash +COPY ${local_path}/packages/blockchain ethereumjs-monorepo/packages/blockchain +COPY ${local_path}/packages/vm ethereumjs-monorepo/packages/vm + +RUN cd ethereumjs-monorepo/packages/client && cp package.json package.json.bak && npm pkg set scripts.build="echo no-build" +RUN cd ethereumjs-monorepo && npm run build --workspaces + +COPY ${local_path}/packages/client ethereumjs-monorepo/packages/client # Create version.txt RUN cd ethereumjs-monorepo/packages/client && npm ethereumjs --version > /version.txt @@ -17,12 +69,12 @@ RUN cd ethereumjs-monorepo/packages/client && npm ethereumjs --version > /versio # Add genesis mapper script, startup script, and enode URL retriever script ADD genesis.json /genesis.json ADD mapper.jq /mapper.jq -ADD ethereumjs.sh /ethereumjs.sh +ADD ethereumjs-local.sh /ethereumjs-local.sh ADD enode.sh /hive-bin/enode.sh ADD jwtsecret /jwtsecret # Set execute permissions for scripts -RUN chmod +x /ethereumjs.sh /hive-bin/enode.sh +RUN chmod +x /ethereumjs-local.sh /hive-bin/enode.sh # Expose networking ports EXPOSE 8545 8546 8551 8547 30303 30303/udp @@ -32,4 +84,4 @@ EXPOSE 8545 8546 8551 8547 30303 30303/udp # since memory may spike during certain network conditions. ENV NODE_OPTIONS=--max_old_space_size=6144 -ENTRYPOINT ["/ethereumjs.sh"] +ENTRYPOINT ["/ethereumjs-local.sh"] \ No newline at end of file diff --git a/clients/ethereumjs/ethereumjs-local.sh b/clients/ethereumjs/ethereumjs-local.sh new file mode 100644 index 0000000000..ed66a2d54c --- /dev/null +++ b/clients/ethereumjs/ethereumjs-local.sh @@ -0,0 +1,94 @@ +#!/bin/bash + +# Startup script to initialize and boot a ethereum-js instance. +# +# This script assumes the following files: +# - `genesis.json` file is located in the filesystem root (mandatory) +# - `chain.rlp` file is located in the filesystem root (optional) +# - `blocks` folder is located in the filesystem root (optional) +# - `keys` folder is located in the filesystem root (optional) +# +# This script assumes the following environment variables: +# +# - HIVE_BOOTNODE enode URL of the remote bootstrap node +# - HIVE_NETWORK_ID network ID number to use for the eth protocol +# - HIVE_NODETYPE sync and pruning selector (archive, full, light) +# +# Forks: +# +# - HIVE_FORK_HOMESTEAD block number of the homestead hard-fork transition +# - HIVE_FORK_DAO_BLOCK block number of the DAO hard-fork transition +# - HIVE_FORK_DAO_VOTE whether the node support (or opposes) the DAO fork +# - HIVE_FORK_TANGERINE block number of Tangerine Whistle transition +# - HIVE_FORK_SPURIOUS block number of Spurious Dragon transition +# - HIVE_FORK_BYZANTIUM block number for Byzantium transition +# - HIVE_FORK_CONSTANTINOPLE block number for Constantinople transition +# - HIVE_FORK_PETERSBURG block number for ConstantinopleFix/PetersBurg transition +# - HIVE_FORK_ISTANBUL block number for Istanbul transition +# - HIVE_FORK_MUIRGLACIER block number for Muir Glacier transition +# - HIVE_FORK_BERLIN block number for Berlin transition +# - HIVE_FORK_LONDON block number for London +# +# Clique PoA: +# +# - HIVE_CLIQUE_PERIOD enables clique support. value is block time in seconds. +# - HIVE_CLIQUE_PRIVATEKEY private key for clique mining +# +# Other: +# +# - HIVE_MINER enable mining. value is coinbase address. +# - HIVE_MINER_EXTRA extra-data field to set for newly minted blocks +# - HIVE_LOGLEVEL client loglevel (0-5) +# - HIVE_GRAPHQL_ENABLED enables graphql on port 8545 +# - HIVE_LES_SERVER set to '1' to enable LES server + + +# Immediately abort the script on any error encountered +set -e + +cd /ethereumjs-monorepo/packages/client/ + +ethereumjs="ts-node /ethereumjs-monorepo/packages/client/bin/cli.ts" +FLAGS="--gethGenesis /genesis.json --rpc --rpcEngine --saveReceipts --rpcAddr 0.0.0.0 --rpcEngineAddr 0.0.0.0 --rpcEnginePort 8551 --ws false --logLevel debug --rpcDebug all --rpcDebugVerbose all --isSingleNode" + +# Configure the chain. +mv /genesis.json /genesis-input.json +jq -f /mapper.jq /genesis-input.json > /genesis.json + +# Dump genesis. +if [ "$HIVE_LOGLEVEL" -lt 4 ]; then + echo "Supplied genesis state (trimmed, use --sim.loglevel 4 or 5 for full output):" + jq 'del(.alloc[] | select(.balance == "0x123450000000000000000"))' /genesis.json +else + echo "Supplied genesis state:" + cat /genesis.json +fi + +# Import clique signing key. +if [ "$HIVE_CLIQUE_PRIVATEKEY" != "" ]; then + # Create password file. + echo "Importing clique key..." + echo -n "$HIVE_CLIQUE_PRIVATEKEY" > /private_key.txt + # Ensure password file is used when running ethereumjs in mining mode. + if [ "$HIVE_MINER" != "" ]; then + FLAGS="$FLAGS --mine --unlock /private_key.txt --minerCoinbase $HIVE_MINER" + fi +fi + +if [ "$HIVE_TERMINAL_TOTAL_DIFFICULTY" != "" ]; then + FLAGS="$FLAGS --jwt-secret /jwtsecret" +fi + +# Load the test chain if present +echo "Loading initial blockchain..." +if [ -f /chain.rlp ]; then + FLAGS="$FLAGS --loadBlocksFromRlp=/chain.rlp" + else + echo "Warning: chain.rlp not found." +fi + +if [ "$HIVE_BOOTNODE" != "" ]; then + FLAGS="$FLAGS --bootnodes=$HIVE_BOOTNODE" +fi +echo "Running ethereumjs with flags $FLAGS" +$ethereumjs $FLAGS \ No newline at end of file From 7461be63e4d160314bdd3636970f819cb0c9ffe3 Mon Sep 17 00:00:00 2001 From: Mario Vega Date: Fri, 24 Nov 2023 13:16:44 -0600 Subject: [PATCH 125/387] clients/lodestar-vc: add `--builder` flag (#949) --- clients/lodestar-vc/lodestar_vc.sh | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/clients/lodestar-vc/lodestar_vc.sh b/clients/lodestar-vc/lodestar_vc.sh index cc1d01fc70..f482721d44 100755 --- a/clients/lodestar-vc/lodestar_vc.sh +++ b/clients/lodestar-vc/lodestar_vc.sh @@ -22,6 +22,8 @@ do done metrics_option=$([[ "$HIVE_ETH2_METRICS_PORT" == "" ]] && echo "" || echo "--metrics --metrics.address=$CONTAINER_IP --metrics.port=$HIVE_ETH2_METRICS_PORT") +builder_option=$([[ "$HIVE_ETH2_BUILDER_ENDPOINT" == "" ]] && echo "--builder.selection executiononly" || echo "--builder") +echo BUILDER=$builder_option LOG=info case "$HIVE_LOGLEVEL" in @@ -41,6 +43,7 @@ node /usr/app/node_modules/.bin/lodestar \ --paramsFile=/hive/input/config.yaml \ --keystoresDir="/data/validators" \ --secretsDir="/data/secrets" \ - $metrics_option \ + --useProduceBlockV3 \ + $metrics_option $builder_option \ --beaconNodes="http://$HIVE_ETH2_BN_API_IP:$HIVE_ETH2_BN_API_PORT" From 24c412a635463ae0fc2d65ad7524696227661c05 Mon Sep 17 00:00:00 2001 From: Mario Vega Date: Mon, 27 Nov 2023 10:39:00 -0600 Subject: [PATCH 126/387] clients/teku-bn: Add rate limit parameters (#899) * clients/teku: Add rate limit parameters * clients/teku-bn: Use hive variable for peer scoring parameters --- clients/teku-bn/teku_bn.sh | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/clients/teku-bn/teku_bn.sh b/clients/teku-bn/teku_bn.sh index 7a053fdf6a..6cbbea1755 100755 --- a/clients/teku-bn/teku_bn.sh +++ b/clients/teku-bn/teku_bn.sh @@ -51,6 +51,7 @@ enr_option=$([[ "$HIVE_ETH2_BOOTNODE_ENRS" == "" ]] && echo "" || echo --p2p-dis static_option=$([[ "$HIVE_ETH2_STATIC_PEERS" == "" ]] && echo "" || echo --p2p-static-peers="$HIVE_ETH2_STATIC_PEERS") opt_sync_option=$([[ "$HIVE_ETH2_SAFE_SLOTS_TO_IMPORT_OPTIMISTICALLY" == "" ]] && echo "" || echo "--Xnetwork-safe-slots-to-import-optimistically=$HIVE_ETH2_SAFE_SLOTS_TO_IMPORT_OPTIMISTICALLY") builder_option=$([[ "$HIVE_ETH2_BUILDER_ENDPOINT" == "" ]] && echo "" || echo "--validators-builder-registration-default-enabled=true --validators-proposer-blinded-blocks-enabled=true --builder-endpoint=$HIVE_ETH2_BUILDER_ENDPOINT") +peer_score_option=$([[ "$HIVE_ETH2_DISABLE_PEER_SCORING" == "" ]] && echo "" || echo "--Xp2p-gossip-scoring-enabled=false --Xpeer-rate-limit=100000 --Xpeer-request-limit=1000") if [ "$HIVE_ETH2_MERGE_ENABLED" != "" ]; then echo -n "0x7365637265747365637265747365637265747365637265747365637265747365" > /jwtsecret @@ -62,18 +63,21 @@ echo Starting Teku Beacon Node /opt/teku/bin/teku \ --network=/data/testnet_setup/config.yaml \ --data-path=/data/teku \ + --data-storage-mode=ARCHIVE \ --initial-state=/data/testnet_setup/genesis.ssz \ --eth1-deposit-contract-address="${HIVE_ETH2_CONFIG_DEPOSIT_CONTRACT_ADDRESS:-0x1111111111111111111111111111111111111111}" \ --log-destination console \ --logging="$LOG" \ - $metrics_option $eth1_option $merge_option $enr_option $static_option $opt_sync_option $builder_option \ + $metrics_option $eth1_option $merge_option $enr_option $static_option $opt_sync_option $builder_option $peer_score_option \ --validators-proposer-default-fee-recipient="0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b" \ --p2p-port="${HIVE_ETH2_P2P_TCP_PORT:-9000}" \ --p2p-udp-port="${HIVE_ETH2_P2P_UDP_PORT:-9000}" \ --p2p-advertised-ip="${CONTAINER_IP}" \ --p2p-peer-lower-bound="${HIVE_ETH2_P2P_TARGET_PEERS:-10}" \ - --rest-api-enabled=true --rest-api-interface=0.0.0.0 --rest-api-port="${HIVE_ETH2_BN_API_PORT:-4000}" --rest-api-host-allowlist="*" \ - --data-storage-mode=ARCHIVE \ - --Xstartup-target-peer-count=0 \ --p2p-subscribe-all-subnets-enabled \ + --rest-api-enabled=true \ + --rest-api-interface=0.0.0.0 \ + --rest-api-port="${HIVE_ETH2_BN_API_PORT:-4000}" \ + --rest-api-host-allowlist="*" \ + --Xstartup-target-peer-count=0 \ --Xtrusted-setup="$trusted_setup_path" From 45ebdc3cb3276f1866c4805abbc595dc79952eda Mon Sep 17 00:00:00 2001 From: Mario Vega Date: Mon, 27 Nov 2023 14:47:34 -0600 Subject: [PATCH 127/387] simulators/ethereum/engine,pyspec: Upgrade geth branch (#951) simulators/ethereum: upgrade geth branch --- simulators/ethereum/engine/go.mod | 12 ++++++------ simulators/ethereum/engine/go.sum | 23 +++++++++++++---------- simulators/ethereum/pyspec/go.mod | 11 ++++++----- simulators/ethereum/pyspec/go.sum | 22 ++++++++++++---------- 4 files changed, 37 insertions(+), 31 deletions(-) diff --git a/simulators/ethereum/engine/go.mod b/simulators/ethereum/engine/go.mod index 1c391d7b94..e53c6fe269 100644 --- a/simulators/ethereum/engine/go.mod +++ b/simulators/ethereum/engine/go.mod @@ -5,10 +5,10 @@ go 1.20 require ( github.com/crate-crypto/go-kzg-4844 v0.7.0 github.com/davecgh/go-spew v1.1.1 - github.com/ethereum/go-ethereum v1.13.5-0.20231031113925-bc42e88415d3 + github.com/ethereum/go-ethereum v1.13.5-0.20231127143928-5b57727d6de2 github.com/ethereum/hive v0.0.0-20231031133732-dcd7ddb75960 github.com/golang-jwt/jwt/v4 v4.5.0 - github.com/holiman/uint256 v1.2.3 + github.com/holiman/uint256 v1.2.4 github.com/pkg/errors v0.9.1 golang.org/x/exp v0.0.0-20230905200255-921286631fa9 ) @@ -19,7 +19,7 @@ require ( github.com/VictoriaMetrics/fastcache v1.12.1 // indirect github.com/apapsch/go-jsonmerge/v2 v2.0.0 // indirect github.com/beorn7/perks v1.0.1 // indirect - github.com/bits-and-blooms/bitset v1.7.0 // indirect + github.com/bits-and-blooms/bitset v1.10.0 // indirect github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect github.com/cespare/cp v1.1.1 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect @@ -31,6 +31,7 @@ require ( github.com/consensys/bavard v0.1.13 // indirect github.com/consensys/gnark-crypto v0.12.1 // indirect github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect + github.com/crate-crypto/go-ipa v0.0.0-20231025140028-3c0104f4b233 // indirect github.com/deckarep/golang-set/v2 v2.1.0 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 // indirect github.com/deepmap/oapi-codegen v1.12.4 // indirect @@ -38,6 +39,7 @@ require ( github.com/fjl/memsize v0.0.1 // indirect github.com/fsnotify/fsnotify v1.6.0 // indirect github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08 // indirect + github.com/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46 // indirect github.com/getsentry/sentry-go v0.18.0 // indirect github.com/go-ole/go-ole v1.2.6 // indirect github.com/go-stack/stack v1.8.1 // indirect @@ -89,7 +91,7 @@ require ( golang.org/x/crypto v0.14.0 // indirect golang.org/x/mod v0.12.0 // indirect golang.org/x/net v0.17.0 // indirect - golang.org/x/sync v0.3.0 // indirect + golang.org/x/sync v0.4.0 // indirect golang.org/x/sys v0.13.0 // indirect golang.org/x/text v0.13.0 // indirect golang.org/x/time v0.3.0 // indirect @@ -98,5 +100,3 @@ require ( gopkg.in/natefinch/lumberjack.v2 v2.0.0 // indirect rsc.io/tmplfunc v0.0.3 // indirect ) - -replace github.com/ethereum/go-ethereum => github.com/lightclient/go-ethereum v1.10.10-0.20231019143932-4d161dee0c4c diff --git a/simulators/ethereum/engine/go.sum b/simulators/ethereum/engine/go.sum index 173d09f875..0ae8ee4c6d 100644 --- a/simulators/ethereum/engine/go.sum +++ b/simulators/ethereum/engine/go.sum @@ -22,8 +22,8 @@ github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5 github.com/aymerick/raymond v2.0.3-0.20180322193309-b565731e1464+incompatible/go.mod h1:osfaiScAUVup+UC9Nfq76eWqDhXlp+4UYaA8uhTBO6g= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bits-and-blooms/bitset v1.7.0 h1:YjAGVd3XmtK9ktAbX8Zg2g2PwLIMjGREZJHlV4j7NEo= -github.com/bits-and-blooms/bitset v1.7.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= +github.com/bits-and-blooms/bitset v1.10.0 h1:ePXTeiPEazB5+opbv5fr8umg2R/1NlzgDsyepwsSr88= +github.com/bits-and-blooms/bitset v1.10.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= github.com/bmatcuk/doublestar v1.1.1/go.mod h1:UD6OnuiIn0yFxxA2le/rnRU1G4RaI4UvFv1sNto9p6w= github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U= github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= @@ -62,6 +62,8 @@ github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3Ee github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/crate-crypto/go-ipa v0.0.0-20231025140028-3c0104f4b233 h1:d28BXYi+wUpz1KBmiF9bWrjEMacUEREV6MBi2ODnrfQ= +github.com/crate-crypto/go-ipa v0.0.0-20231025140028-3c0104f4b233/go.mod h1:geZJZH3SzKCqnz5VT0q/DyIG/tvu/dZk+VIfXicupJs= github.com/crate-crypto/go-kzg-4844 v0.7.0 h1:C0vgZRk4q4EZ/JgPfzuSoxdCq3C3mOZMBShovmncxvA= github.com/crate-crypto/go-kzg-4844 v0.7.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= @@ -77,7 +79,6 @@ github.com/deepmap/oapi-codegen v1.12.4 h1:pPmn6qI9MuOtCz82WY2Xaw46EQjgvxednXXrP github.com/deepmap/oapi-codegen v1.12.4/go.mod h1:3lgHGMu6myQ2vqbbTXH2H1o4eXFTGnFiDaOaKKl5yas= github.com/dgraph-io/badger v1.6.0/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6psNgSztDR4= github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= -github.com/docker/docker v24.0.7+incompatible h1:Wo6l37AuwP3JaMnZa226lzVXGA3F9Ig1seQen0cKYlM= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385/go.mod h1:0vRUJqYpeSZifjYj7uP3BG/gKcuzL9xWVV/Y+cK33KM= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= @@ -87,6 +88,8 @@ github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7 github.com/etcd-io/bbolt v1.3.3/go.mod h1:ZF2nL25h33cCyBtcyWeZ2/I3HQOfTP+0PIEvHjkjCrw= github.com/ethereum/c-kzg-4844 v0.4.0 h1:3MS1s4JtA868KpJxroZoepdV0ZKBp3u/O5HcZ7R3nlY= github.com/ethereum/c-kzg-4844 v0.4.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= +github.com/ethereum/go-ethereum v1.13.5-0.20231127143928-5b57727d6de2 h1:aQz+Zhve06dQU6qqnCQ3TuZ7nFWxFvnNt+PY+LA8ZjM= +github.com/ethereum/go-ethereum v1.13.5-0.20231127143928-5b57727d6de2/go.mod h1:iogCB+O7R3eFmlyiEKRDqjmJbSgOsDHTjxE0PU6CYC8= github.com/ethereum/hive v0.0.0-20231031133732-dcd7ddb75960 h1:7H9z2o/KImWQ/1PACU3ewsSFNxT/lzwYRnwit2YFqMg= github.com/ethereum/hive v0.0.0-20231031133732-dcd7ddb75960/go.mod h1:sV7LrFBlEii71kI9udVbUVj7SXIifZ2VzFjQ8S6rZns= github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072/go.mod h1:duJ4Jxv5lDcvg4QuQr0oowTf7dz4/CR8NtyCooz9HL8= @@ -101,6 +104,8 @@ github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbS github.com/gavv/httpexpect v2.0.0+incompatible/go.mod h1:x+9tiU1YnrOvnB725RkpoLv1M62hOWzwo5OXotisrKc= github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08 h1:f6D9Hr8xV8uYKlyuj8XIruxlh9WjVjdh1gIicAS7ays= github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= +github.com/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46 h1:BAIP2GihuqhwdILrV+7GJel5lyPV3u1+PgzrWLc0TkE= +github.com/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46/go.mod h1:QNpY22eby74jVhqH4WhDLDwxc/vqsern6pW+u2kbkpc= github.com/getsentry/sentry-go v0.12.0/go.mod h1:NSap0JBYWzHND8oMbyi0+XZhUalc1TBdRL1M71JZW2c= github.com/getsentry/sentry-go v0.18.0 h1:MtBW5H9QgdcJabtZcuJG80BMOwaBpkRDZkxRkNC1sN0= github.com/getsentry/sentry-go v0.18.0/go.mod h1:Kgon4Mby+FJ7ZWHFUAZgVaIa8sxHtnRJRLTXZr51aKQ= @@ -163,6 +168,7 @@ github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8 github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -183,8 +189,8 @@ github.com/holiman/billy v0.0.0-20230718173358-1c7e68d277a7 h1:3JQNjnMRil1yD0IfZ github.com/holiman/billy v0.0.0-20230718173358-1c7e68d277a7/go.mod h1:5GuXa7vkL8u9FkFuWdVvfR5ix8hRB7DbOAaYULamFpc= github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao= github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA= -github.com/holiman/uint256 v1.2.3 h1:K8UWO1HUJpRMXBxbmaY1Y8IAMZC/RsKB+ArEnnK4l5o= -github.com/holiman/uint256 v1.2.3/go.mod h1:SC8Ryt4n+UBbPbIBKaG9zbbDlp4jOru9xFZmPzLUTxw= +github.com/holiman/uint256 v1.2.4 h1:jUc4Nk8fm9jZabQuqr2JzednajVmBpC+oiTiXZJEApU= +github.com/holiman/uint256 v1.2.4/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXeiRV4ng7E= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/huin/goupnp v1.3.0 h1:UvLUlWDNpoUdYzb2TCn+MuTWtcjXKSza2n6CBdQ0xXc= github.com/huin/goupnp v1.3.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8= @@ -209,7 +215,6 @@ github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCV github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/juju/gnuflag v0.0.0-20171113085948-2ce1bb71843d/go.mod h1:2PavIy+JPciBPrBUjwbNvtwB6RQlve+hkpll6QSNmOE= -github.com/julienschmidt/httprouter v1.3.0 h1:U0609e9tgbseu3rBINet9P48AI/D3oJs4dN7jwJOQ1U= github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88/go.mod h1:3w7q1U84EfirKl04SVQ/s7nPm1ZPhiXd34z40TNz36k= github.com/kataras/golog v0.0.10/go.mod h1:yJ8YKCmyL+nWjERB90Qwn+bdyBZsaQwU3bTVFgkFIp8= github.com/kataras/iris/v12 v12.1.8/go.mod h1:LMYy4VlP67TQ3Zgriz8RE2h2kMZV2SgMYbq3UhfoFmE= @@ -235,8 +240,6 @@ github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0 github.com/labstack/echo/v4 v4.5.0/go.mod h1:czIriw4a0C1dFun+ObrXp7ok03xON0N1awStJ6ArI7Y= github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c= -github.com/lightclient/go-ethereum v1.10.10-0.20231019143932-4d161dee0c4c h1:UsDsJSV7/j0C4aGqECXoPvdL6a6y7myXMptcnQjflEY= -github.com/lightclient/go-ethereum v1.10.10-0.20231019143932-4d161dee0c4c/go.mod h1:CLSRGaP4Ev4DJOP+JSk3NHyJIillQLJc/ZAyCLI8NOs= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= @@ -449,8 +452,8 @@ golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= -golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= +golang.org/x/sync v0.4.0 h1:zxkM55ReGkDlKSM+Fu41A+zmbZuaPVbGMzvvdUPznYQ= +golang.org/x/sync v0.4.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= diff --git a/simulators/ethereum/pyspec/go.mod b/simulators/ethereum/pyspec/go.mod index 297e62e531..0d6f87f63f 100644 --- a/simulators/ethereum/pyspec/go.mod +++ b/simulators/ethereum/pyspec/go.mod @@ -3,7 +3,7 @@ module github.com/ethereum/hive/simulators/ethereum/pyspec go 1.20 require ( - github.com/ethereum/go-ethereum v1.13.5-0.20231031113925-bc42e88415d3 + github.com/ethereum/go-ethereum v1.13.5-0.20231127143928-5b57727d6de2 github.com/ethereum/hive v0.0.0-20231031133732-dcd7ddb75960 github.com/ethereum/hive/simulators/ethereum/engine v0.0.0-20230919054339-322945164a97 ) @@ -13,7 +13,7 @@ require ( github.com/Microsoft/go-winio v0.6.1 // indirect github.com/VictoriaMetrics/fastcache v1.12.1 // indirect github.com/beorn7/perks v1.0.1 // indirect - github.com/bits-and-blooms/bitset v1.7.0 // indirect + github.com/bits-and-blooms/bitset v1.10.0 // indirect github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/cockroachdb/errors v1.9.1 // indirect @@ -23,10 +23,12 @@ require ( github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect github.com/consensys/bavard v0.1.13 // indirect github.com/consensys/gnark-crypto v0.12.1 // indirect + github.com/crate-crypto/go-ipa v0.0.0-20231025140028-3c0104f4b233 // indirect github.com/crate-crypto/go-kzg-4844 v0.7.0 // indirect github.com/deckarep/golang-set/v2 v2.1.0 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 // indirect github.com/ethereum/c-kzg-4844 v0.4.0 // indirect + github.com/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46 // indirect github.com/getsentry/sentry-go v0.18.0 // indirect github.com/go-ole/go-ole v1.2.6 // indirect github.com/go-stack/stack v1.8.1 // indirect @@ -37,7 +39,7 @@ require ( github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect github.com/gorilla/websocket v1.5.0 // indirect github.com/holiman/bloomfilter/v2 v2.0.3 // indirect - github.com/holiman/uint256 v1.2.3 // indirect + github.com/holiman/uint256 v1.2.4 // indirect github.com/klauspost/compress v1.15.15 // indirect github.com/kr/pretty v0.3.1 // indirect github.com/kr/text v0.2.0 // indirect @@ -61,7 +63,7 @@ require ( golang.org/x/crypto v0.14.0 // indirect golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect golang.org/x/mod v0.12.0 // indirect - golang.org/x/sync v0.3.0 // indirect + golang.org/x/sync v0.4.0 // indirect golang.org/x/sys v0.13.0 // indirect golang.org/x/text v0.13.0 // indirect golang.org/x/tools v0.13.0 // indirect @@ -69,5 +71,4 @@ require ( rsc.io/tmplfunc v0.0.3 // indirect ) -replace github.com/ethereum/go-ethereum => github.com/lightclient/go-ethereum v1.10.10-0.20231019143932-4d161dee0c4c replace github.com/ethereum/hive/simulators/ethereum/engine => ../engine diff --git a/simulators/ethereum/pyspec/go.sum b/simulators/ethereum/pyspec/go.sum index 0978f4689d..cb531a2a64 100644 --- a/simulators/ethereum/pyspec/go.sum +++ b/simulators/ethereum/pyspec/go.sum @@ -18,8 +18,8 @@ github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5 github.com/aymerick/raymond v2.0.3-0.20180322193309-b565731e1464+incompatible/go.mod h1:osfaiScAUVup+UC9Nfq76eWqDhXlp+4UYaA8uhTBO6g= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bits-and-blooms/bitset v1.7.0 h1:YjAGVd3XmtK9ktAbX8Zg2g2PwLIMjGREZJHlV4j7NEo= -github.com/bits-and-blooms/bitset v1.7.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= +github.com/bits-and-blooms/bitset v1.10.0 h1:ePXTeiPEazB5+opbv5fr8umg2R/1NlzgDsyepwsSr88= +github.com/bits-and-blooms/bitset v1.10.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U= github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= @@ -55,6 +55,8 @@ github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3Ee github.com/cpuguy83/go-md2man v1.0.10 h1:BSKMNlYxDvnunlTymqtgONjNnaRV1sTpcovwwjF22jk= github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= +github.com/crate-crypto/go-ipa v0.0.0-20231025140028-3c0104f4b233 h1:d28BXYi+wUpz1KBmiF9bWrjEMacUEREV6MBi2ODnrfQ= +github.com/crate-crypto/go-ipa v0.0.0-20231025140028-3c0104f4b233/go.mod h1:geZJZH3SzKCqnz5VT0q/DyIG/tvu/dZk+VIfXicupJs= github.com/crate-crypto/go-kzg-4844 v0.7.0 h1:C0vgZRk4q4EZ/JgPfzuSoxdCq3C3mOZMBShovmncxvA= github.com/crate-crypto/go-kzg-4844 v0.7.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= @@ -77,10 +79,10 @@ github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7 github.com/etcd-io/bbolt v1.3.3/go.mod h1:ZF2nL25h33cCyBtcyWeZ2/I3HQOfTP+0PIEvHjkjCrw= github.com/ethereum/c-kzg-4844 v0.4.0 h1:3MS1s4JtA868KpJxroZoepdV0ZKBp3u/O5HcZ7R3nlY= github.com/ethereum/c-kzg-4844 v0.4.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= +github.com/ethereum/go-ethereum v1.13.5-0.20231127143928-5b57727d6de2 h1:aQz+Zhve06dQU6qqnCQ3TuZ7nFWxFvnNt+PY+LA8ZjM= +github.com/ethereum/go-ethereum v1.13.5-0.20231127143928-5b57727d6de2/go.mod h1:iogCB+O7R3eFmlyiEKRDqjmJbSgOsDHTjxE0PU6CYC8= github.com/ethereum/hive v0.0.0-20231031133732-dcd7ddb75960 h1:7H9z2o/KImWQ/1PACU3ewsSFNxT/lzwYRnwit2YFqMg= github.com/ethereum/hive v0.0.0-20231031133732-dcd7ddb75960/go.mod h1:sV7LrFBlEii71kI9udVbUVj7SXIifZ2VzFjQ8S6rZns= -github.com/ethereum/hive/simulators/ethereum/engine v0.0.0-20230919054339-322945164a97 h1:A1bYQxUbl4ZM6q5E8RcDYGm/UIxO5u03ypN8mxX9oKY= -github.com/ethereum/hive/simulators/ethereum/engine v0.0.0-20230919054339-322945164a97/go.mod h1:zCFJyLJJjLDT5/R9l8Rqrwt9i9irgg94d2n4kpehTno= github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072/go.mod h1:duJ4Jxv5lDcvg4QuQr0oowTf7dz4/CR8NtyCooz9HL8= github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= github.com/fjl/memsize v0.0.1 h1:+zhkb+dhUgx0/e+M8sF0QqiouvMQUiKR+QYvdxIOKcQ= @@ -90,6 +92,8 @@ github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmV github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= github.com/gavv/httpexpect v2.0.0+incompatible/go.mod h1:x+9tiU1YnrOvnB725RkpoLv1M62hOWzwo5OXotisrKc= github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08 h1:f6D9Hr8xV8uYKlyuj8XIruxlh9WjVjdh1gIicAS7ays= +github.com/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46 h1:BAIP2GihuqhwdILrV+7GJel5lyPV3u1+PgzrWLc0TkE= +github.com/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46/go.mod h1:QNpY22eby74jVhqH4WhDLDwxc/vqsern6pW+u2kbkpc= github.com/getsentry/sentry-go v0.12.0/go.mod h1:NSap0JBYWzHND8oMbyi0+XZhUalc1TBdRL1M71JZW2c= github.com/getsentry/sentry-go v0.18.0 h1:MtBW5H9QgdcJabtZcuJG80BMOwaBpkRDZkxRkNC1sN0= github.com/getsentry/sentry-go v0.18.0/go.mod h1:Kgon4Mby+FJ7ZWHFUAZgVaIa8sxHtnRJRLTXZr51aKQ= @@ -163,8 +167,8 @@ github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T github.com/holiman/billy v0.0.0-20230718173358-1c7e68d277a7 h1:3JQNjnMRil1yD0IfZKHF9GxxWKDJGj8I0IqOUol//sw= github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao= github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA= -github.com/holiman/uint256 v1.2.3 h1:K8UWO1HUJpRMXBxbmaY1Y8IAMZC/RsKB+ArEnnK4l5o= -github.com/holiman/uint256 v1.2.3/go.mod h1:SC8Ryt4n+UBbPbIBKaG9zbbDlp4jOru9xFZmPzLUTxw= +github.com/holiman/uint256 v1.2.4 h1:jUc4Nk8fm9jZabQuqr2JzednajVmBpC+oiTiXZJEApU= +github.com/holiman/uint256 v1.2.4/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXeiRV4ng7E= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/huin/goupnp v1.3.0 h1:UvLUlWDNpoUdYzb2TCn+MuTWtcjXKSza2n6CBdQ0xXc= github.com/hydrogen18/memlistener v0.0.0-20200120041712-dcc25e7acd91/go.mod h1:qEIFzExnS6016fRpRfxrExeVn2gbClQA99gQhnIcdhE= @@ -205,8 +209,6 @@ github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0 github.com/labstack/echo/v4 v4.5.0/go.mod h1:czIriw4a0C1dFun+ObrXp7ok03xON0N1awStJ6ArI7Y= github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c= -github.com/lightclient/go-ethereum v1.10.10-0.20231019143932-4d161dee0c4c h1:UsDsJSV7/j0C4aGqECXoPvdL6a6y7myXMptcnQjflEY= -github.com/lightclient/go-ethereum v1.10.10-0.20231019143932-4d161dee0c4c/go.mod h1:CLSRGaP4Ev4DJOP+JSk3NHyJIillQLJc/ZAyCLI8NOs= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= @@ -399,8 +401,8 @@ golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= -golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= +golang.org/x/sync v0.4.0 h1:zxkM55ReGkDlKSM+Fu41A+zmbZuaPVbGMzvvdUPznYQ= +golang.org/x/sync v0.4.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= From 5da039d947b30fa7a61929e0506ea32de923d6c9 Mon Sep 17 00:00:00 2001 From: Mario Vega Date: Mon, 27 Nov 2023 15:03:58 -0600 Subject: [PATCH 128/387] configs/cancun: Use go-ethereum master (#952) configs/cancun: use geth master --- configs/cancun.yaml | 3 --- 1 file changed, 3 deletions(-) diff --git a/configs/cancun.yaml b/configs/cancun.yaml index 5e8674eaba..9b8fea123a 100644 --- a/configs/cancun.yaml +++ b/configs/cancun.yaml @@ -21,9 +21,6 @@ - client: go-ethereum nametag: cancun-git dockerfile: git - build_args: - github: lightclient/go-ethereum - tag: devnet-10 - client: nethermind nametag: cancun-git From b1b77878ec21ad9dbefabb902dc67535545f5991 Mon Sep 17 00:00:00 2001 From: Mario Vega Date: Tue, 28 Nov 2023 08:23:21 -0600 Subject: [PATCH 129/387] clients/teku-bn: Remove trusted setup file, add `--ignore-weak-subjectivity-period-enabled` (#950) * clients/teku-bn: Remove trusted setup file * clients/teku-bn: Add `--ignore-weak-subjectivity-period-enabled` --- clients/teku-bn/Dockerfile | 2 - clients/teku-bn/teku_bn.sh | 8 +- clients/teku-bn/trusted_setup.txt | 4163 ----------------------------- 3 files changed, 2 insertions(+), 4171 deletions(-) delete mode 100644 clients/teku-bn/trusted_setup.txt diff --git a/clients/teku-bn/Dockerfile b/clients/teku-bn/Dockerfile index fafc2af649..c722700517 100644 --- a/clients/teku-bn/Dockerfile +++ b/clients/teku-bn/Dockerfile @@ -10,6 +10,4 @@ RUN chmod +x /opt/teku/bin//teku_bn.sh RUN ./bin/teku --version > /version.txt > /version.txt -ADD trusted_setup.txt /trusted_setup.txt - ENTRYPOINT ["/opt/teku/bin/teku_bn.sh"] diff --git a/clients/teku-bn/teku_bn.sh b/clients/teku-bn/teku_bn.sh index 6cbbea1755..089ce3a42e 100755 --- a/clients/teku-bn/teku_bn.sh +++ b/clients/teku-bn/teku_bn.sh @@ -23,10 +23,6 @@ if [[ "$HIVE_ETH2_SAFE_SLOTS_TO_IMPORT_OPTIMISTICALLY" != "" ]]; then echo "SAFE_SLOTS_TO_IMPORT_OPTIMISTICALLY: $HIVE_ETH2_SAFE_SLOTS_TO_IMPORT_OPTIMISTICALLY" >> /data/testnet_setup/config.yaml fi -trusted_setup_path="/trusted_setup.txt" - -echo "Xtrusted-setup: $trusted_setup_path" >> /data/testnet_setup/config.yaml - echo config.yaml: cat /data/testnet_setup/config.yaml @@ -79,5 +75,5 @@ echo Starting Teku Beacon Node --rest-api-interface=0.0.0.0 \ --rest-api-port="${HIVE_ETH2_BN_API_PORT:-4000}" \ --rest-api-host-allowlist="*" \ - --Xstartup-target-peer-count=0 \ - --Xtrusted-setup="$trusted_setup_path" + --ignore-weak-subjectivity-period-enabled=true \ + --Xstartup-target-peer-count=0 diff --git a/clients/teku-bn/trusted_setup.txt b/clients/teku-bn/trusted_setup.txt deleted file mode 100644 index 26612cb887..0000000000 --- a/clients/teku-bn/trusted_setup.txt +++ /dev/null @@ -1,4163 +0,0 @@ -4096 -65 -8d0c6eeadd3f8529d67246f77404a4ac2d9d7fd7d50cf103d3e6abb9003e5e36d8f322663ebced6707a7f46d97b7566d -a0d2392f030681c61c2a867862917e10f7678d882034bb89af3db87e6ab3883a304034643dc9688a04e41a5b831582bc -94298073048d70c74f36685e547d04b7311479daa05912e18ead64b2099a194bf48ec344273d58daf0b86b1d8f1d318d -85c4063d13499013dc2ccaa98c1606763e6b1e8cca20922d4cec12ecbaf006ea81ffabe6596d1ac7ba1daf7e63e30898 -84c64bce36c6b5145c6880113366025ab9a8f88e3948d374e27be8b8f9f87402c70fec9b3c621a2d1d26764a84370d0c -8b206c823acf5294552ee54579fac0f45ea15bd273dbacd63b88cd7cddbcce23b56e52f8ea352e1e1d7dcd9b3991b413 -b70aaa4038ba3f5ff306c647b4392d004950c53ad8f6713b5c9c21ac99f5c56cf57323dac500a1f4e9507c4746b07a2f -895f6d1fc70b52f838d81b24f4840729cd5988b649e9d6e6f6dbac4281d8818f39ebdae7e6ea139d7f98a832bd6f29f1 -a71a2832bbaade974c9ef7505dfa24e1ba466a9951b7c2db56886be31c9c7b871f3ee76cb1fcc1aab4b906d6502bc9b5 -9530ba64a21e27834609c00616bc63e8fc2dc7800e478ad728ec39c624f65bbc62cb48f59decb7fbf605ce1920d02622 -8d0609affaf8619bb2f6c80699e5bc7783becbd5973630cdd227ae52d6d701c45f4270becca97701b40279fab588cf64 -8f5d5b4c3bb8dc9a19e5a0f84df6322a79a00c7783c86254197d313a5b35d3965a1f7c0b9c4e39ec1e8f5d02d3aa0862 -96aa47a3ba20b1cfe81eb26bef503225037fdf4c9df53bea1b520841875cd1db6aa8e0f34685da08b55a3ce7289e6de0 -b4c27ee3f4b8c0031837160f0a75632f5b51b5850d52b530096443f54c2b264aeccc5c61b4fcc8de7074475f354fa0d8 -acfd735cda20be1d6f425a7886629c91732fbb5a4e0350ca740a8fb5b39f2001071cec0b2a0f6ca35e1f35a5ea18d00f -ae44d87b1d16d59504c602cbacde2c2791f1520391ca50154e6036d3953ca466cf93d6537da2adb729e6f9f4ffa87853 -97b492872ce44941ea4668ffca83b82fac0f4021bd47e0a5ffeaaacb1b3fc924ee4d53b99f7bcafe0985caf0fbe5d1d3 -b3fbe2f9103d293f49c6c6016d5913f041c9113295397388111a0fdf4245d8edd6e63b9a1a1c9c8f868d6e1988116880 -805efa08fd2046c44c427b225c17bed8a1eb3320cdf94026fdc24c6d345a6cfebfd7475f85d2d1bf22018ca72d2761d3 -9888bae0d83077d1dfde82fdffb1195565c31c519b80cba1e21aba58ee9ccb5677f74bfde13fa5723026514a7d839661 -922e19d2646ba90c9f56278bddf74621cc4518ae2f042fb8245843e87cd82724c6d7c9a99907ac6de5f2187fd2e77cbe -a38f0e1faf97dd1e0804b44e4d150dbfa48318442d1c5255eb0c14ea56b50502f3c7cb216a0336e7c140398088dc01cf -93598ea391c8735799a1d4cd0456f34994ccdf4883fad57419f634f30fee595938bc66b066dade9ae52578818c00d899 -a528dc920734cfaee9feacbc0baa5b73befb1ec6fbd422fcad09a9c1f8f8c40b5ea332b2cf04dc1d6d921e9da9ddfeb4 -b38d45316bf78d11e796a34ee535814e6cde0e642f14108329c5b21f4fec18cd61f84a3025824bb8dc4cbd26b2ecc9bf -8eec35a7404c9a35dc6ad0260b7f0f7fd1bfe92a2e08bc72548b99ed9acdc378728a8ea9c6879a6e47e37edb0d28c193 -a68a4446274ccd947c61bf736c5219dad680b99c6085a26719793e0d9dab26d5f8a0b28e71be6e1b9ea4ae39139f7f57 -a0acb543f41ad12e3b2e096629ccdd719a001d0ff53bb151e9a37aa57852f7275a7bbd06dc2a06af9144524548164af5 -b271e74cdbcf8b9143f8472174bdb068c23308ea807c60a554c185f7be6f231aac13347139837514171a876dfac5baa5 -8195a460719000cd1df379ebbf7918f71301a50a2fa587505cc5b8c4534c3d2343f63d28e7ee991d7a1cebb15d380696 -96202b60426773e8731dcbedbf613477f65940a19fb4be0f4f742b0c76ae9d88ecdb6d36cd4f12bb404dd5d360c819e2 -b0a80fe60b71ca9e80157138de8787b8a786326179604b8a15a744e52662645987e5f859ef5c76492d560daf4624b9a7 -a331ea8adf87daa5e2d458d0113c307edae1a84927bca7d484aca5f8c1b6378ab42981c44b0d916d7249f4b475f926f1 -aa1a8f59ae0912abf191ea7e209ff401628278dfb2269db6d87cf33bd52af3dbffbe96513a8b210e965c853a554b787a -ac4f4a0e1b1a155e1f22a9085b0b047fe54c8437dbbb8e9720fd6b0cdd76557d19ca2e885a48890f0247b1a72be0e287 -a428465505eac7b9660eb0d495a7a00c8cc238de3a02ebbd2eb07e502e9868086e9584b59953cf1480c0b781295db339 -b7b77e21e08f6357cbd3dcd3035c3e8ec84cdfa13c7baef6c67e0ef43095e61fd549694263d7def8b8adc3a0fdcc7987 -abb991d17c5bdd264c592c55101e265cb3210c4157aee4079173fd51da1e0199eed1d6c890aab95817ec078561d771af -846a8e4f801faf5fbec078b09c362ee30a00b2b58a4871744d03cd118b913464233ff926e52b0c75fbfcf098ad25a1e6 -947e91ffa32f38c1ccb72cca4bfabaee9e63ab74a16f034cabba25e462f7331ebe5a7ba393f69e91830415fa75b1b52e -8dc5e26adc693f4e300cab7385edca1a2fe14c8ee6dc0cd6d013cb5aa154dc380e9e81e259cbc59c1f38f7c4a57f1c7d -9818ef6605d6ea3b7bf4da5c6d6d8ed540bb94df4d14c974e1b79ed2fd1a0b897b8cf1ff671a181a697effd66b1644a5 -b5eab6baf03af994fc32cc9dce388394c18c01cdafe7909fde948f3e00a72dc8f30d15977d0f114bd7c140f5f94cf005 -83b2e9858d3b929f9a2ad66a91a2c0c44d15d288c17c12a1614301a6f2d61d31eaa540ca7781520fe4420afae0ec0208 -ab338fbd38bce4d1b7a759f71e5e5673746c52846eff3d0b6825e390aeeca8f9f123ee88c78fe4d520cc415cbae32bf1 -81adb6322b8db95d1711304e5b59f37640ca88c03e6c7e15de932be5267dff7351fa17664113ecc528e8920f5bfdc0d1 -89e2e0c0d769e4107232df741678a6bacb041d0154385450aaca8be9c3c18c42f817373962e7569d33935c35666a8a6a -8f0756fea8b34a2b471ec39e4448a6a6935e5432ec2859d222964a4c82777a340e1d702777aeb946fa405afc0438221a -a2bf90c505a6f03b3dd09d04e1e7cf301fe3415b273e263f15fdfe5d0e40f619b95e8bf00916d3eaa7d7f8c0bae41c8e -91d5c76b5542637588cd47279d0bd74a25dbda0d8ec0ff68b62d7e01e34a63fc3e06d116ee75c803864b1cf330f6c360 -a9958c388d25315a979566174b0622446335cb559aff1992bd71910c47497536019c6854d31c0e22df07505963fc44ff -91d82b09d5726077eed6c19bcb398abe79d87ce16c413df6bf5932b8fd64b4c0fd19c9bf0fa8db657a4a4d4c0d8f5a2d -ac6e0a86e0ee416855c3e9eef2526c43835f5245527ed0038bc83b4fcadb4ea5beb91143cc674486681a9f0e63f856b1 -aaf00d6efd0c6efb9f7d6a42555abec05c5af8f324e2e579fc2ac83bdc937cc682d9bc2ffd250619c8bb098b8c84db80 -963f5fcd8476d0dbeb03a62cde40e3deee25f55e7ded7572d8884975f38eddc5406fc4b0adff602a1cca90f7205a7fdc -a3805ee01512f644d2679511bd8607890ee9721e75ac9a85ab9fd6fceb1308d5b9b0e9907686b4e683b34aed0f34cd81 -a483d7708465cd4e33b4407fe82c84ef6bc7fa21475d961fe2e99802d0c999b6474ef7a46dd615b219c9c7e9faec45ee -b6b5f9456f12d6781c41f17cdc9d259f9515994d5dee49bb701a33fa2e8dcbb2c8c13f822b51ad232fc5e05bff2f68ef -8766b721b0cf9b1a42614c7d29aad2d89da4996dc9e2a3baeba4b33ca74100ab0b83f55c546c963e3b6af1dcf9ca067c -ac5e8da1154cf4be8df2bbd2e212b7f8077099b2010c99e739441198f65337c6f7ef0d9136453a7668fde6e1389c32c7 -a9d6d2c8845e5f1fec183c5153f1f6e23421e28ce0c86b0ce993b30b87869065acad9e6d9927d9f03c590852821b2f9c -a320ca07c44f7ea3ff858fe18395a86f59559617f13ec96d1e8b4a3f01d9c066a45c8d8cf8f1f14a360bb774d55f5f18 -b3adb00e1312dce73b74fbd2ea16f0fb0085bd0db10772e9c260e9ed9f8829ff690e3dfffacaddc8233d484bb69778b3 -87b0c8d8a167d5199d0b0743c20fb83ec8a1c442f0204bcc53bf292ba382bef58a58a6d1e2467920e32c290fdc6dae7c -a74fa436a5adc280a68e0c56b28ac33647bdfc8c5326f4c99db6dbd1b98d91afb1f41f5fffd6bcc31c1f8789c148e2db -8a37349e4ba7558965077f7f9d839c61b7dcb857fcc7965c76a64a75e377bfea8cd09b7a269ce602cc4472affc483b69 -8af813f62c5962ff96bf73e33f47fd5a8e3e55651d429e77d2ce64a63c535ecc5cfc749bb120c489b7ea1d9b2a5d233c -833021445b7d9817caa33d6853fa25efc38e9d62494d209627d26799432ea7b87a96de4694967151abc1252dd2d04dfc -8f78a715107e0ace3a41bff0385fd75c13bf1250f9e5ddecf39e81bacc1244b978e3464892f7fb2596957855b8bf9fc7 -aed144134dc1cc6c671f70ebe71a3aadf7511eea382969bc5d499a678d2d8ce249ebf1a06b51183f61413eba0517012b -b39a53e82c5553943a5e45bc5116d8672ec44bed96b3541dead40344b287a7b02dbf7107372effb067edd946f47de500 -b383844c3b20a8bc06098046ec6b406df9419ad86fac4a000905c01325426903a5e369af856d71ccd52fea362ed29db5 -83815a7098283723eec6aa6451b5d99578bf28a02971375a1fe90c15a20963e129372ac4af7b306ee2e7316472c5d66d -b426b4e185806a31febd745fa8d26b6397832a04e33c9a7eb460cbf302b4c134a8a01d4e5e40bc9b73296c539e60b3ca -a6cabf8205711457e6363ef4379ebc1226001e1aaea3002b25bfd9e173f4368002f4461e79eeb9f4aa46f1b56c739ab9 -a6e88ab01282313269cd2d8c0df1a79dada5b565d6623900af9e7e15351de2b0105cc55d3e9080e1e41efe48be32a622 -b2b106db3d56d189ea57afa133ae4941b4eb1dc168357af488e46811c687713fc66bbd6f8500bbd13cdb45cb82c14d1d -b3a74780ff949d19e6438db280e53632c60dc544f41320d40297fe5bb7fcee7e7931111053c30fb1ed9019ab28965b44 -8c67f32b9fdc04ec291cc0d928841ab09b08e87356e43fbbf7ac3ff0f955642628f661b6f0c8e2192a887489fddf07bb -b3be58bd628383352e6473fe9a1a27cf17242df0b1273f5867e9119e908969b9e9e7e294a83b9ea14825003cb652d80c -a867acf6ab03e50936c19a21d4040bfd97eb5a89852bd9967da0e326d67ce839937cab4e910d1149ecef9d5f1b2d8f08 -8006b19126bd49cbb40d73a99a37c2e02d6d37065bbe0cfcee888280176184964bd8f222f85960667c5b36dfaee0ee35 -ac50967b8b7840bf9d51216d68a274f1d3431c7d4031fbac75a754befbbb707c2bb184867db6b9d957f3ba0fd0a26231 -b5a794c928aff0c4271674eb0a02143ed9b4d3bc950584c7cd97b7d3c3f2e323798fd5ccc6fcc0eb2e417d87f4c542a2 -a2ca3d6509f04b37091ce6697672ee6495b42d986d75bd2d2058faa100d09fd0a145350f2d280d2cb36516171bd97dbf -92cfa293469967a9207b37cd70392312faf81b52963bfbad5f9f3da00817d26e10faf469e0e720c3bb195f23dda8c696 -a0dd5135da0a0e33fa922c623263b29518d7fa000e5beefc66faa4d6201516d058f155475c4806917a3259db4377c38a -8fc3ae8ea6231aa9afb245a0af437e88ebca2c9ab76850c731981afba90d5add0ea254053449355eccf39df55bd912ed -9727afe1f0804297717cec9dc96d2d27024a6ae6d352fee5d25377ee858ee801593df6124b79cb62ddc9235ec1ade4ac -8bcb2c53fcaa38e8e2e0fd0929bc4d9ddce73c0282c8675676950ff806cb9f56ebd398b269f9a8c2a6265b15faf25fca -a8bd9007fbbdd4b8c049d0eb7d3649bd6a3e5097372fa8ea4b8821ba955c9ef3f39ac8b19f39d3af98640c74b9595005 -92c7e851c8bd6b09dfcbfdb644725c4f65e1c3dbd111df9d85d14a0bb2d7b657eb0c7db796b42bf447b3912ef1d3b8c3 -98c499b494d5b2b8bea97d00ac3a6d826ab3045bb35424575c87117fc2a1958f3829813e266630749caf0fa6eeb76819 -8df190d71e432fe8691d843f6eb563445805c372eb5b6b064ec4e939be3e07526b5b7f5a289ede44ae6116a91357b8b1 -b5010243f7c760fb52a935f6d8ed8fc12c0c2f57db3de8bb01fdeedf7e1c87b08f3dd3c649b65751f9fd27afa6be34c7 -889c8057402cc18649f5f943aed38d6ef609b66c583f75584f3b876c1f50c5dc7d738dc7642135742e1f13fa87be46c1 -996087337f69a19a4ebe8e764acf7af8170a7ad733cd201b0e4efde6ea11039a1853e115ad11387e0fb30ab655a666d8 -902732c429e767ab895f47b2e72f7facad5ef05a72c36a5f9762c2194eb559f22845bbb87c1acc985306ecb4b4fbbf79 -8519b62a150ea805cdfc05788b8d4e797d8396a7306b41777c438c2e8b5c38839cfec5e7dc5d546b42b7b76e062982a7 -862a53ba169e6842a72763f9082ff48fbfbb63129d5a26513917c2bca9ad6362c624ce6fc973cf464f2eb4892131eb04 -b86cd67c809d75fdb9f1c9453a39870f448b138f2b4058d07a707b88bb37f29d42e33ce444f4fbe50d6be13339cae8a6 -8cf5d8365dbbafc0af192feb4fc00c181e2c3babc5d253268ef5564934555fb1e9b1d85ec46f0ca4709b7d5b27169b89 -b48f11a1809ec780bf6181fae3b8d14f8d4dc7d1721128854354be691c7fc7695d60624f84016c1cea29a02aaf28bfbc -8b46b695a08cb9a2f29ab9dd79ab8a39ec7f0086995b8685568e007cd73aa2cd650d4fae6c3fb109c35612f751ba225e -8d2f9f0a5a7de894d6c50baceb8d75c96082df1dcf893ac95f420a93acbbf910204903d2eb6012b1b0495f08aaf9992f -b334db00a770394a84ec55c1bd5440b7d9f2521029030ef3411b0c2e0a34c75c827fd629c561ea76bd21cd6cf47027f4 -96e9ff76c42bcb36f2fb7819e9123420ed5608132f7c791f95cb657a61b13041e9ba2b36f798a0fdb484878cbe015905 -99f8d701e889abd7815d43ba99e0a85776ec48311fa7cb719d049f73b5d530fa950746ffbbb7beb9e30c39d864891dc2 -98169c20df7c15d7543991f9c68e40ac66607cbd43fc6195416e40009917039357e932d6e807f3a40bc4503ad01ae80a -84bd97dd9e4e2ba75d0dee7d4418c720d4746203d847ce2bdd6ed17d492023df48d7b1de27e3f5cb8660c4bb9519ae1b -a54319e06db7f5f826277a54734a875c5b3fd2fa09d36d8b73594137aa62774b7356560157bc9e3fdf1046dc57b6006a -90cfff7cd4e7c73b84f63455d31b0d428cb5eee53e378028591478511985bcc95eb94f79ad28af5b3bed864e422d7b06 -a11c23cc8dce26ac35aea9abe911905a32616a259fa7da3a20f42dc853ad31b2634007aa110c360d3771ff19851f4fb4 -9856fbee9095074ad0568498ff45f13fe81e84ea5edaf04127d9ee7e35e730c6d23fa7f8f49d092cf06b222f94ab7f36 -818862dec89f0dc314629fffbca9b96f24dfde2d835fa8bde21b30dc99fe46d837d8f745e41b39b8cf26bfe7f338f582 -831819d41524c50d19f7720bf48f65346b42fb7955ee6ecc192f7e9fed2e7010abccdfdeac2b0c7c599bc83ac70be371 -b367e588eb96aa8a908d8cc354706fee97e092d1bc7a836dbcc97c6ed4de349643a783fb4ddf0dec85a32060318efa85 -b7aaef729befd4ab2be5ec957d7d1dbe6178de1d05c2b230d8c4b0574a3363e2d51bc54ea0279a49cc7adffa15a5a43a -ae2891d848822794ecb641e12e30701f571431821d281ceecbccaaa69b8cd8242495dc5dbf38f7d8ed98f6c6919038aa -872cf2f230d3fffce17bf6f70739084876dc13596415644d151e477ce04170d6ab5a40773557eeb3600c1ad953a0bfce -b853d0a14cef7893ba1efb8f4c0fdb61342d30fa66f8e3d2ca5208826ce1db5c8a99aa5b64c97e9d90857d53beb93d67 -910b434536cec39a2c47ca396e279afdbc997a1c0192a7d8be2ba24126b4d762b4525a94cea593a7c1f707ba39f17c0c -b6511e9dea1fbccedd7b8bb0a790a71db3999bd4e3db91be2f1e25062fae9bb4e94e50d8ec0dcc67b7a0abce985200b2 -936885c90ebe5a231d9c2eb0dfd8d08a55ecaa8e0db31c28b7416869b3cc0371448168cbec968d4d26d1cb5a16ebe541 -b71c2ac873b27fe3da67036ca546d31ca7f7a3dc13070f1530fce566e7a707daeb22b80423d505f1835fe557173754f8 -85acb64140915c940b078478b7d4dadd4d8504cde595e64f60bd6c21e426b4e422608df1ed2dd94709c190e8592c22d7 -b5831c7d7c413278070a4ef1653cec9c4c029ee27a209a6ea0ad09b299309dea70a7aef4ff9c6bdeda87dcda8fa0c318 -aa0e56e3205751b4b8f8fa2b6d68b25121f2b2468df9f1bd4ef55f236b031805a7d9fd6f3bba876c69cdba8c5ea5e05f -b021f5ae4ed50f9b53f66dd326e3f49a96f4314fc7986ace23c1f4be9955ec61d8f7c74961b5fdeabcd0b9bccbf92ce8 -88df439f485c297469e04a1d407e738e4e6ac09a7a0e14e2df66681e562fdb637a996df4b9df4e185faab8914a5cef76 -8e7ae06baa69cb23ca3575205920cb74ac3cda9eb316f4eef7b46e2bff549175a751226d5b5c65fe631a35c3f8e34d61 -99b26ff174418d1efc07dfbed70be8e0cb86ac0cec84e7524677161f519977d9ca3e2bbe76face8fe9016f994dafc0ff -a5f17fe28992be57abd2d2dcaa6f7c085522795bfdf87ba9d762a0070ad4630a42aa1e809801bc9f2a5daf46a03e0c22 -8d673c7934d0e072b9d844994f30c384e55cec8d37ce88d3ad21f8bb1c90ecc770a0eaf2945851e5dab697c3fc2814a9 -a003ed4eb401cfe08d56405442ca572f29728cfff8f682ef4d0e56dd06557750f6a9f28a20c033bc6bbb792cc76cc1a8 -8010408f845cf1185b381fed0e03c53b33b86ea4912426819d431477bd61c534df25b6d3cf40042583543093e5f4bb44 -9021a1ae2eb501134e0f51093c9f9ac7d276d10b14471b14f4a9e386256e8c155bef59973a3d81c38bdab683cd5c10e0 -a5abf269ceabbb1cf0b75d5b9c720a3d230d38f284ed787b6a05145d697a01909662a5b095269996e6fa021849d0f41f -b4b260af0a005220deb2266518d11dbc36d17e59fc7b4780ab20a813f2412ebd568b1f8adc45bf045fcbe0e60c65fd24 -b8c4cb93bedbb75d058269dfccda44ae92fe37b3ab2ef3d95c4a907e1fadf77c3db0fa5869c19843e14b122e01e5c1f4 -ac818f7cdecc7b495779d8d0ff487f23ab36a61d0cf073e11000349747537b5b77044203585a55214bb34f67ef76f2d2 -86215799c25356904611e71271327ca4882f19a889938839c80a30d319ddbe6c0f1dfa9d5523813a096048c4aef338cd -a9204889b9388bf713ca59ea35d288cd692285a34e4aa47f3751453589eb3b03a9cc49a40d82ec2c913c736752d8674d -893aecf973c862c71602ffb9f5ac7bf9c256db36e909c95fe093d871aab2499e7a248f924f72dea604de14abfc00e21c -b8882ee51cfe4acba958fa6f19102aa5471b1fbaf3c00292e474e3e2ec0d5b79af3748b7eea7489b17920ce29efc4139 -8350813d2ec66ef35f1efa6c129e2ebaedc082c5160507bcf04018e170fc0731858ad417a017dadbd9ade78015312e7f -83f6829532be8cd92f3bf1fef264ee5b7466b96e2821d097f56cbb292d605a6fb26cd3a01d4037a3b1681d8143ae54d7 -87d6258777347e4c1428ba3dcbf87fdd5113d5c30cf329e89fa3c9c1d954d031e8acacb4eed9dca8d44507c65e47e7cd -a05669a1e561b1c131b0f70e3d9fc846dc320dc0872334d07347e260d40b2e51fdbabeb0d1ae1fb89fba70af51f25a1a -819925c23fd4d851ea0eecc8c581f4a0047f5449c821d34eccc59a2911f1bd4c319dab6ece19411d028b7fdedece366b -b831b762254afd35364a04966d07b3c97e0b883c27444ff939c2ab1b649dc21ac8915b99dc6903623ed7adaae44870ac -93ec0190f47deffe74179879d3df8113a720423f5ca211d56db9654db20afe10371f3f8ec491d4e166609b9b9a82d0d4 -8f4aa6313719bcfad7ca1ed0af2d2ee10424ea303177466915839f17d2c5df84cc28fcef192cbb91bb696dd383efd3b2 -8d9c9fdf4b8b6a0a702959cf784ad43d550834e5ab2cd3bebede7773c0c755417ad2de7d25b7ff579f377f0800234b44 -99d9427c20752f89049195a91cf85e7082f9150c3b5cb66b267be44c89d41e7cc269a66dacabacadab62f2fa00cc03be -b37709d1aca976cbbf3dc4f08d9c35924d1b8b0f1c465bd92e4c8ff9708e7d045c423183b04a0e0ab4c29efd99ef6f0e -a163f42fb371b138d59c683c2a4db4ca8cbc971ae13f9a9cc39d7f253b7ee46a207b804360e05e8938c73bf3193bab55 -87a037aa558508773fc9a0b9ba18e3d368ffe47dfaf1afacee4748f72e9d3decc2f7c44b7bf0b0268873a9c2ef5fe916 -a1f20cb535cc3aebd6e738491fe3446478f7609d210af56a4004d72500b3ec2236e93446783fe628c9337bcd89c1e8e1 -9757aa358dfbba4f7116da00fe9af97f7ac6d390792ea07682b984aa853379ac525222ac8a83de802859c6dec9182ef7 -815daca1eded189ec7cb7cbc8ad443f38e6ddb3fb1301d1e5a1b02586f1329035209b7c9232dc4dff3fc546cb5ac7835 -aed86dfaf9c4f0a4b2a183f70f9041172002a773482a8ebf3d9d5f97d37ee7c6767badfda15476b3b243931235c7831c -8d032e681e89e41b29f26be02f80030fa888f6967061d2204c1ebb2279a3211d759d187bce6408c6830affa1337fb4e0 -877bff5c2db06116f918a722b26422c920aeade1efa02fa61773fca77f0ea4a7e4ee0ecaaa5cfe98044c0ff91b627588 -b9ee5310d0996a10a242738d846565bdb343a4049a24cd4868db318ea6168a32548efaf4ab84edfbf27ce8aec1be2d1c -b59f6928167323037c6296dd7697846e80a7a4b81320cfae9073ebd2002a03bdf6933e887f33ad83eda8468876c2c4fb -8167686245149dc116a175331c25301e18bb48a6627e2835ae3dd80dd373d029129c50ab2aebeaf2c2ccddc58dcc72ec -82b7dcc29803f916effb67c5ba96a1c067ed8ca43ad0e8d61a510ab067baefd4d6b49e3886b863da2de1d8f2979a4baa -b43824cd6f6872a576d64372dde466fef6decdbb5ad5db55791249fde0a483e4e40c6e1c221e923e096a038fe47dab5e -ab1e9884cf5a8444140cf4a22b9a4311a266db11b392e06c89843ac9d027729fee410560bcd35626fd8de3aad19afc4a -a0dbd92a8d955eb1d24887ca739c639bdee8493506d7344aadb28c929f9eb3b4ebaae6bd7fd9ffe8abb83d0d29091e43 -8352a47a70e343f21b55da541b8c0e35cd88731276a1550d45792c738c4d4d7dc664f447c3933daabd4dbb29bb83be4a -8ce4a1e3c4370346d6f58528a5ef1a85360d964f89e54867ba09c985c1e6c07e710a32cdda8da9fa0e3b26622d866874 -b5e356d67dd70b6f01dd6181611d89f30ea00b179ae1fa42c7eadb0b077fb52b19212b0b9a075ebd6dc62c74050b2d2f -b68f2cd1db8e4ad5efdba3c6eaa60bfcc7b51c2b0ce8bb943a4bc6968995abe8a45fe7f12434e5b0076f148d942786be -b5c7b07f80cd05c0b0840a9f634845928210433b549fb0f84a36c87bf5f7d7eb854736c4083445c952348482a300226a -8cfd9ea5185ff9779dee35efe0252957d6a74693104fb7c2ea989252a1aa99d19abaab76b2d7416eb99145c6fdb89506 -8cc8e2c5c6ddee7ef720052a39cab1ecc5e1d4c5f00fb6989731a23f6d87ac4b055abb47da7202a98c674684d103152a -8c95394c9ed45e1bf1b7cfe93b2694f6a01ff5fed8f6064e673ba3e67551829949f6885963d11860d005e6fabd5ac32c -adf00b86f4a295b607df157f14195d6b51e18e2757778fde0006289fabba8c0a4ab8fad5e3e68ddbb16ccb196cc5973f -b1714b95c4885aac0ee978e6bbabbc9596f92b8858cb953df077511d178527c462cbe1d97fdc898938bae2cd560f7b66 -adf103f4344feb6b9c8104105d64475abc697e5f805e9b08aa874e4953d56605677ef7ff4b0b97987dc47257168ae94d -b0ce6ede9edb272d8769aed7c9c7a7c9df2fb83d31cc16771f13173bcdc209daf2f35887dcca85522d5fdae39f7b8e36 -ad698d1154f7eda04e2e65f66f7fcdb7b0391f248ba37d210a18db75dafd10aedc8a4d6f9299d5b6a77964c58b380126 -904856cd3ecdbb1742239441f92d579beb5616a6e46a953cf2f1dd4a83a147679fc45270dcac3e9e3d346b46ab061757 -b600b5b521af51cdfcb75581e1eccc666a7078d6a7f49f4fdb0d73c9b2dab4ce0ecafcbd71f6dd22636e135c634ee055 -a170c5d31f6657f85078c48c7bbf11687ce032ab2ff4b9b3aee5af742baecf41ea1c2db83bcba00bccc977af7d0c5c8e -a9ef1cbb6a7acb54faf1bcbd4676cdeba36013ca5d1ac1914c3ff353954f42e152b16da2bdf4a7d423b986d62b831974 -aa706d88d3bd2ce9e992547e285788295fd3e2bbf88e329fae91e772248aa68fdfdb52f0b766746a3d7991308c725f47 -911a837dfff2062bae6bcd1fe41032e889eb397e8206cedadf888c9a427a0afe8c88dcb24579be7bfa502a40f6a8c1cc -ae80382929b7a9b6f51fe0439528a7b1a78f97a8565ba8cddb9ee4ba488f2ab710e7923443f8759a10f670087e1292c4 -b8962de382aaa844d45a882ffb7cd0cd1ab2ef073bce510a0d18a119f7a3f9088a7e06d8864a69b13dc2f66840af35ae -954538ffff65191538dca17ec1df5876cb2cd63023ff2665cc3954143e318ece7d14d64548929e939b86038f6c323fc1 -89efa770de15201a41f298020d1d6880c032e3fb8de3690d482843eb859e286acabb1a6dc001c94185494759f47a0c83 -a7a22d95b97c7c07b555764069adaa31b00b6738d853a5da0fe7dc47297d4912a0add87b14fa7db0a087a9de402ea281 -9190d60740c0813ba2ae1a7a1400fa75d6db4d5ce88b4db0626922647f0c50796a4e724e9cc67d635b8a03c5f41978f7 -ab07c30b95477c65f35dc4c56d164e9346d393ad1c2f989326763a4cc04b2cb0386e263007cc5d0125631a09ad3b874c -9398d8e243147de3f70ce60f162c56c6c75f29feb7bc913512420ee3f992e3c3fb964d84ef8de70ef2c118db7d6d7fd5 -b161b15b38cbd581f51ca991d1d897e0710cd6fdf672b9467af612cd26ec30e770c2553469de587af44b17e3d7fea9f7 -8c5d0260b6eb71375c7ad2e243257065e4ea15501190371e9c33721a121c8111e68387db278e8f1a206c0cce478aaa2b -b54ac06a0fb7711d701c0cd25c01ef640e60e3cb669f76e530a97615680905b5c5eac3c653ce6f97ceca2b04f6248e46 -b5c7f76e3ed6dc6c5d45494f851fa1b5eaf3b89adac7c34ad66c730e10488928f6ef0c399c4c26cbeb231e6e0d3d5022 -b6cd90bdd011ac1370a7bbc9c111489da2968d7b50bf1c40330375d1a405c62a31e338e89842fe67982f8165b03480c7 -b0afcaf8d01f5b57cdeb54393f27b27dc81922aa9eaccc411de3b03d920ae7b45295b090ef65685457b1f8045c435587 -b2786c0460e5057f94d346c8ebe194f994f6556ab2904a1d1afd66c0ff36391b56f72ed769dcc58558ee5efaa2ed6785 -965dbb0cb671be339afcb2d6f56e3c386fb5d28536d61d6073b420ee15dee79c205af2f089fbb07514a03c71bf54b4e2 -90f2003e2286bba9cebff3a6791637ca83b6509201c6aed1d47f27097d383d5c2d8532bff9e3541d2c34259841cf26ab -902142d1224e1888ebbfef66aaf8d5b98c27927a00b950753a41d1d28a687a8286b51655da9a60db285b20dc81d5ea89 -a5d364448bf0d0849e5104bdaef9cb2cc8c555f5d6d34239c68671fbe1252f7c8c75b83cea10159dee4da73298f39a12 -b013a54c5b99e296d9419ad5c2aaf4545acd34405e57d13cb764e92132cc20d1a14b33e10caf22d898b608670c04f273 -b92976dceda373331804d48a7847f508cafde8d15949df53dbda09d03908678db1e61ee637baad5f05b2b03ea6f5a870 -968bcb308c7ad0813dc9b3170f23f419aecd7b42176f27fac698811795bf42659fea6b04dab4ef43595dcc990622041b -a9d0a20e9367ea831dccd37f4d97ea75e9aeec952947a7946d95e0d249c94024183ef79a624bdea782469824df0ee4e4 -8521b9667453c3658703e5db365b13f0e0d2331ce611ff1e708f8124d8a81bb5e82871de4a66d45c1a6b0a3901bd901e -b9c88e76e69b0722c0a2f97e57dbc4a6f7456434cd694e2ff67f4e24740cffa4db03e2b18f07f22954ae7db2286e1fa2 -8400e55aa9ab01d4cc0affd611127b5d8d9a9dbd897f3cb8e2050379983aa54249be17d7b7891977b2515bb44a483f65 -8cbb967b4ed31dc40ea06822a94d54cbfc8845c66fbafa3474c8f5fe1ada97299ed4ca955d9d7a39af8821eabf711854 -b4d266ee3fea264a6c563fd6bed46f958c2d7bd328225f6e47faf41a0916aef3b697574322f8b814dfb2f5c242022bf6 -8f7c72d69a919450215ead660ffa9637642c5306354888d549fd4a42e11c649b389f67cc802a0184d10fdb261351140c -a5f9e494ea9b2393ec32c48aac76c04158ccef436d4e70ad930cba20c55fbf61e8f239f70b9d75462405c4b6317c71a1 -b3befb259b52a44a6f44345859e315c20efa48c0c992b0b1621d903164a77667a93f13859790a5e4acb9f3ec6c5a3c6e -b9e4ca259b4ee490d0824207d4d05baf0910d3fe5561ff8b514d8aa5c646417ca76f36ab7c6a9d0fb04c279742f6167a -98fa8c32a39092edb3c2c65c811d2a553931010ccb18d2124d5b96debd8b637d42b8a80111289f2079d9ebca2131a6dc -a65e5aa4631ab168b0954e404006ce05ac088fd3d8692d48af2de5fd47edbf306c80e1c7529697754dbbba1b54164ba0 -b94b7d37e4d970b4bb67bf324ebf80961a1b5a1fa7d9531286ab81a71d6c5f79886f8ef59d38ae35b518a10ed8176dcc -b5ed2f4b0a9ae9ace2e8f6a7fd6560d17c90ae11a74fa8bef2c6c0e38bfd2b9dd2984480633bca276cb73137467e2ce3 -a18556fe291d87a2358e804ee62ddff2c1d53569858b8ae9b4949d117e3bfb4aefce1950be8b6545277f112bebeeb93d -a0d60b9def5d3c05856dff874b4b66ec6e6f0a55c7b33060cc26206c266017cdcf79b1d6f6be93ed7005a932f9c6a0b9 -801fced58a3537c69c232ce846b7517efd958e57c4d7cd262dbec9038d71246dafad124aa48e47fe84ecc786433747c7 -a5e9a8ea302524323aa64a7c26274f08d497df3d570676ecc86bd753c96a487a650389a85f0bc8f5ea94fe6819dc14e5 -a8a2963dc9238a268045d103db101adc3b2f3ab4651b7703b2fe40ece06f66bf60af91369c712aa176df6ed3d64a82fa -a4a8ff0a9a98442357bcdd9a44665919c5d9da6a7d7d21ccdbbd8f3079b1e01125af054b43b37fc303941d0a2e7baee0 -90ef893350f50d6f61ee13dfab6e3121f4a06a1908a707b5f0036cdc2fe483614de3b1445df663934036784342b0106f -84e74d5bc40aaab2cc1d52946b7e06781fbef9d8de6f8b50cd74955d6bdb724864c0e31d5ac57bf271a521db6a352bd6 -832cdf653bbbd128e2e36e7360354a9e82813737c8ab194303d76667a27aa95252756c1514b9e4257db1875f70f73eb4 -a0af8660ed32e6dbcc4d5d21b0a79a25ff49394224f14e6e47604cf3b00136de8f9ab92e82814a595bf65340271c16c3 -9040b5caf5e4dc4118572a2df6176716b5b79d510877bbb4a1211b046596899ea193be4d889e11e464ffb445ab71907b -b9bf8354c70238ab084b028f59e379b8a65c21604034d1b8c9b975f35a476e3c0ba09dd25bf95c5d8ffb25832537319b -a7b492cc1df2a8f62c935d49770d5078586bd0fefda262eb5622033e867e0b9dc0ffc2ce61cd678136a3878d4cbb2b56 -95a5ef06f38743bba187a7a977023b1d9d5ec9ef95ba4343ad149a7b8b0db0e8e528bfb268dc7e5c708bc614dc3d02c8 -99dcf7f123df6c55aeff0a20885a73e84d861ec95cf9208ba90494f37a2dcaacebc8344f392547d3046616d9753c7217 -b3e14f309281a3685ceb14f8921c1e021b7e93c9e9595596b9fb627e60d09ed9e5534733fcbdf2fbc8c981698f5e62ac -816a5e0463074f8c7fb2998e0f0cf89b55790bdbbb573715f6268afb0492453bd640dd07a9953d0400169d555fdf4ac8 -8356d68f3fe7e02a751f579813bd888c9f4edcc568142307d1c9259caef692800e1581d14225e3a3585dac667928fa94 -8d70ea3314c91bfc3f7c1dcf08328ae96f857d98c6aac12ad9eebc2f77e514afdbaf728dfcb192ed29e7ce9a0623ecbb -b68280e7f62ced834b55bc2fcc38d9ea0b1fbcd67cc1682622231894d707c51478ed5edf657d68e0b1b734d9f814b731 -b712dd539e1d79a6222328615d548612eab564ace9737d0249aa2eefed556bbcf3101eba35a8d429d4a5f9828c2ac1fe -8da42ca096419f267f0680fd3067a5dbb790bc815606800ae87fe0263cae47c29a9a1d8233b19fe89f8cc8df6f64697e -8cb2ffd647e07a6754b606bde29582c0665ac4dde30ebdda0144d3479998948dae9eb0f65f82a6c5630210449fbd59f7 -8064c3ef96c8e04398d49e665d6de714de6ee0fced836695baa2aa31139373fad63a7fc3d40600d69799c9df1374a791 -aec99bea8ab4e6d4b246c364b5edc27631c0acc619687941d83fa5ba087dd41f8eaec024c7e5c97cf83b141b6fb135da -8db6051f48901308b08bb1feb8fd2bceaedde560548e79223bd87e485ea45d28c6dcec58030537406ed2b7a9e94e60cc -a5b812c92d0081833dcf9e54f2e1979a919b01302535d10b03b779330c6d25d2de1f374b77fe357db65d24f9cbcd5572 -967d442485c44cf94971d035040e090c98264e3348f55deabd9b48366ec8fe0d5a52e4b2c9a96780a94fc1340338484e -a4b4110bef27f55d70f2765fc3f83c5ddcdfe7f8c341ea9d7c5bcee2f6341bcfbf7b170b52e51480e9b5509f3b52048f -a0d39e4eb013da967a6ac808625122a1c69bf589e3855482dedb6847bb78adc0c8366612c1886d485b31cda7304ec987 -a92f756b44d44b4e22ad265b688b13c9358114557489b8fb0d9720a35e1773b3f0fa7805ac59b35d119a57fe0f596692 -aa27e4b979af6742b49db8bf73c064afd83a9cfe9016131a10381f35a46169e8cfd1a466f295fcc432c217c7c9fa44a5 -845961319cc10bcfbb1f3cb414a5c6a6d008fb3aac42c7d5d74e892cc998af97bc9a9120c3f794e4078135e16a416e38 -a18dbe3015c26ae3e95034c01d7898e3c884d49cc82e71ddb2cf89d11cec34cc2a3dff0fafb464e8e59b82ce1a0a7a11 -a954aed6d7124fa5bd5074bd65be4d28547a665fb4fe5a31c75a5313b77d1c6fc3c978e24c9591a2774f97f76632bdde -8f983b2da584bdff598fcb83c4caa367b4542f4417cc9fa05265ff11d6e12143c384b4398d3745a2d826235c72186a79 -b2caa17d434982d8dd59a9427307dfe4416b0efc8df627dd5fc20d2c11046c93461d669cab2862c094eec6a9845990c6 -8c2baa5a97ee3154cce9fa24f6b54b23e9d073e222220fdd0e83e210c0058fb45ce844382828b0cb21438cf4cad76ee6 -b93437406e4755ccf1de89f5cbe89e939490a2a5cf1585d4363c21ae35b986cb0b981dec02be2940b4ec429cc7a64d4c -a90ac36c97b7ea2eddb65e98e0d08a61e5253019eeb138b9f68f82bb61cdbadf06245b9dfffe851dfa3aa0667c6ac4b8 -8bcdd7b92f43b721ddbfd7596e104bc30b8b43bdaee098aac11222903c37f860df29d888a44aa19f6041da8400ddd062 -98f62d96bdf4e93ed25b2184598081f77732795b06b3041515aa95ffda18eb2af5da1db0e7cfed3899143e4a5d5e7d6c -ad541e3d7f24e4546b4ae1160c1c359f531099dab4be3c077e446c82cb41b9e20b35fa7569798a9f72c1fae312b140b4 -8844a1471ff3f868c6465459a5e0f2fb4d93c65021641760f1bb84f792b151bc04b5a0421bbc72cf978e038edc046b8f -af895aebe27f8357ae6d991c2841572c2063b8d0b05a2a35e51d9b58944c425c764f45a3f3b13f50b1b1f3d9025e52ad -adf85265bb8ee7fead68d676a8301129a6b4984149f0eb4701eae82ec50120ddad657d8798af533e2295877309366e9c -962e157fe343d7296b45f88d9495d2e5481e05ea44ca7661c1fdf8cc0ac87c403753ca81101c1294f248e09089c090eb -a7c8959548c7ae2338b083172fee07543dc14b25860538b48c76ef98ab8f2f126ecb53f8576b8a2b5813ecb152867f18 -ae71680366e11471e1c9a0bc7ea3095bc4d6ceb6cf15b51f1b6061b043f6d5941c9f869be7cb5513e8450dca16df2547 -831290201f42ebf21f611ca769477b767cf0ee58d549fcd9e993fae39d07745813c5ce66afa61b55bb5b4664f400ece7 -af5879e992f86de4787f1bc6decbc4de7d340367b420a99a6c34ac4650d2a40cbe1cef5c6470fc6c72de8ee1fe6bcce4 -8d3c27e1b2ef88d76ac0b1441d327567c761962779c8b1f746e3c976acb63b21d03e5e76589ce9bb0d9ba6e849ed3d53 -ab23b09c9f4151e22654d43c1523f009623b01fe1953d343107cef38b95bd10afd898964946d3cb8521bcbe893e1c84d -8a6acade9520e7a8c07f33d60a87fd53faa6fbf7f018735bffcbbb757c3bafb26f547ceb68e7b8b6bca74819bfcd521a -94db50080d557440a46b6b45ee8083bc90e9267d40489040cbed6234bebf350c788ec51557b969f95194102fde8e9713 -8be8031f32504e0c44958d893649f76cec17af79efcd22bbedb78378f0a150845467e59f79a3f2a3b6a66bdf0d71d13c -a69a4ac47fd92e1926b5e14adcbebbef049848e8a00d4bb387340892e5a9333cae512f447201728d3b53c6cf980a5fdc -8fc713825277c5a8d9ef0a1f6219d141def6d8b30aff0d901026280a17d1265d563ff5192a0817e0e1a04ff447fb6643 -8bf0a85569c4f0770ff09db30b8b2ea6c687630c7801302c17986c69a57c30f0781d14b3f98a10b50c4ecebc16a5b5ec -896baa4135d5621fd6b6a19c6d20b47415923c6e10f76c03a8879fd8354e853b0b98993aa44e334623d60166ba3e3ca9 -b82cde1c2e75a519ef727b17f1e76f4a858857261be9d866a4429d9facf9ea71d16b8af53c26bde34739fe6ea99edc73 -b1a9e1f2e34895a7c5711b983220580589713306837c14073d952fe2aef0297135de0be4b25cbfaed5e2566727fb32ef -b42ed0e9eaf02312d1dba19a044702038cf72d02944d3018960077effc6da86c5753036a85d93cd7233671f03d78d49a -a402e34849e911dbf0981328b9fe6fff834c1b8683591efd3b85aa7d249811d6b460a534d95e7a96fdd7f821a201c2c4 -a774417470c1532f39923d499566af762fa176c9d533767efd457cc5e4a27f60e9217f4b84a9343ecb133d9a9aab96b7 -83dc340541b9ef2eb8394d957cd07b996d2b52ac6eb5562cbba8f1a3312f941c424c12d1341a6dc19d18d289c681ef40 -b2906c32d5756b5712e45dec53782494a81e80f887c6e1ef76e79c737625eccecb8fd17b20e6f84890d322b6ffde6eab -b89705c30cec4d50691bc9f4d461c902d6a4d147cf75ee2f1c542ad73e5f0dabe3d04cd41c6c04ab1422be4134cf1ad7 -8c3293651f4c4fac688bf5837c208b15e5a19ce51b20dd80ffc7fca12d3e615b2773cfc3ed62a1b39c66808a116bde06 -8fceb8ef481163527d1fc3abc7e1a5b3b6de2f654c3fe116d1367b177dcba2e0d2124a7216803513a3d53fc1e30435b9 -b2a42c827da630aaa3eb20ed07d136aa11ba01b4c8efc0a57ebab7d5b851a15daa6ba118bcffbc20703916e430e30a87 -a86340153abb3fe97414e2fde857e15aac27c9bb9b61258eea6766024f426ed0753f08f07f6b02b5375e1587ea3afcab -b006465e258e646f91ba889765113d3dc9bd657246c533cab6516d55ba054baa9d7276a3b0fa31730c3bd824845bf107 -a08aadc09428719cde0050d064c0f42c5b7c4f6c158227d7636f870957d6cfe821b4c62d39279a7c98f5a75fcb7bbfba -885e7d47ce9b50d21b95116be195be25f15223a6a189387575cc76740174c3e9044f1196986d82856b3fb25cdd562049 -b18c3780362d822cc06910743c4cbcef044823a22d12987fe2e56f3801e417f2e9cd31574ea1c5c6ee7673a14aa56e3e -a625570ef7d31c042d968018865aeeba34ee65a059ab1ec079c7a8ba1be9e24bce6afb7036c07d9d6c96ab014f95d661 -8fc9bd4764adc4c300b5bd49a06dce885d1d8aff9bae68a47976d0cd42110aa6afa2d7b90b64e81c0f14de729f2fb851 -91d88714cb669f5f00241aa5ab80dffb04109492ea9c72b59645eb1f85f3539c61db2ab418af986f42241df8b35445e9 -b98f14e664df2590dd2d00b5b5c817e388e5d9fb074f718637c33b3d4969c89e82fdd12db8997f5ff3bf5bb5ca5dd839 -86cb3d9f148cb2170317a4c22af7092155aa66ecff7ab1299b102fbbaa33ed2a284b97b08f529d2da9faea63fb98972c -92449f6b8a7c737ecef291c947cbd602c47d7fe47dc3426c2b413f3019169aa56e14c2a7216adce713e1c7bd5c08a83f -b08c1b9080bba88b44a65070948142d73c00730715fbdd01e13fc3415c5b4f3248ef514fa3ade4a918c9a820cccae97c -b0a05297da76e37c22be7383e60bba1cbc4f98ba650e12d4afcfcea569842003644a10ad73c9148958f7bf1ffa0a27d0 -839092c1f4e9fb1ec0dde8176f013b0d706ab275079f00f8e774287dd658d1b5638d5fe206f5f2a141911a74bb120f75 -a36bd669bdc055ece4b17ff6eac4c60a2f23324a5eb6d0d6c16a2fce44c39cfd52d1fa2b67f3f5e83504e36426fbfc40 -8aa428323512cf769645e2913a72976d32da4c0062ffe468a6062fd009340f0f23c6b63285848a0e7631a907adb032a0 -944800f7d43f41283eb56115ac39ccc5bf107ae5db6abcaba6936b896260cd09428a6b828c0bccebeb00541073dbf38e -8e700ca7c9e1538cf64e161dd8d16af56fc29d53c79648150d6d8c268b0c95c76acded723e29918690d66252bd75f5b3 -b9c4ce35b5b16b4c39b6e85800c76b26e8d0999500fabc1e5b6234a7f8da18c621266ac0d5ebc085354297ff21ac89a5 -a0c706d32063f1877f7e903048ce885f5d012008d4a8019dd00261a8bbc30834bffeba56cdeddc59167d54cc9e65f8fa -839813b736225087cbbcf24506ea7bf69138605036b764ec0514055ac174bbc67c786a405708eb39a6c14c8d7e0ec6ee -b1a5fef055a7e921c664f1a6d3cb8b21943c89b7e61524a307d8e45aa432e5765a27c32efdb32d88062cd80800a260de -b17f8202d9ed42f0f5cb1b1dbda60711de3b917a77f6069546fa3f86d21f372b8dd5cb86f1994b873ba9982404e08daf -b5211d54bd02d44d4d808ad57067606f3e9fa2cad244a5f2acef0edf82de3c496d2b800f7c05f175d01fa6ace28b44d1 -aa9c6f8f489b35fdb7544116fe5102a34ff542de29262f156df4db4ea6e064f5ea20c4bd877d40377ed5d58114b68f19 -826668b1f32e85844ff85dd7e2a8e7f4e0fd349162428bc9d91626b5ab21bdbacd1c9e30cf16f5809b8bf5da4f4fe364 -b30d14917b49437f9fdbae13d50aee3d8a18da3a7f247b39e5d3e975c60bd269da32da4e4cc8844666fca0d65f4e3640 -8c6918d8d94b36c6b9e772e9a432e66df16724e3b0660bde5ea397e6ef88028bb7d26184fbe266a1e86aef4a0dfe5faa -906d80ffd692c1dd03ab89be52e0a5a9e90a9cdbfc523d2b99c138ae81f45d24c34703f9cb5a666b67416e3bb6272bc4 -8b07e8ba22b436e64f011cacf5e89c55cd3bfb72ae8b32a3a8922c4fccb29de6f73662d6e330da6aa6e732a2187ef3c9 -9547466b4553a49adf59cc65d4c3c9401b2178947ebe3bd33c6e63cfb67d6be8729033158594f6f244b272c4487d6958 -aafcccea41e05cb47223fa8dfec0dd55964268bd4d05e24469614077668655ac8a51d2ac2bfb22862f8f4fa817048c2f -870f8c1173e8fd365b0a2e55c66eea3ab55355990c311f3042377803d37e68d712edcc5a0a2e2f5a46df0c1c8e6310c2 -b4288f792008f342935f18d8d9447fe4ddcfea350566e13dba451f58c68e27241af1367f2603a9dff6748e7fe0c53de4 -91c58c0e537d3afdcf7783601dd9cda2aa9956e11f711b15403760cf15fc6dffb40ed643886854571da8c0f84e17adfe -a43fec8ee92febed32e7cdd4e6314a62d9d3052c7a9504057dfba6c71fdfbeff1cef945d8f087bd106b5bec7478ad51f -99cf5e0e3593a92f2ec12eb71d00eccec3eec8662333471b2cb3a7826b7daca2c4d57ffba18299189cf7364e2af5df6d -af50f9ab890b7517ff1f1194c5b3b6f7f82eabc607687a8380be371a6a67b117aeb9b6f725556551b81f8117971706a2 -aa352430887053602a54403bd0d24d6b5181b44aa976dfa190e21851699a88127dcc904c90a48ec44610056b5dcd36c4 -964c821ea1902354736fa382a929c156bd67b9468d6920d47c27b9d0d304b6144118888d124c1f6785da596435ed2410 -b2284a67af26b5f5aff87b4d8e12c78ab37c5eb6e92718fca8549f86f4f001b660fc4520456aff72c9bcddd686603942 -83c54cbb997ea493dc75df4023071dce6da94268feaa2352373789616f012098270ba4fd60c791796a6f5062fb2cd35e -9143e8fee0b8f0f34c65c7750858093dcf165c6a83c026bfac2d5ffa746361eb4b6a14fdb43e403add901ac3735735a3 -97d7748a5b278ee47b18c9e60689b12a0a05be47e58e78bf8c04b9e8b34e2e2f2d3ac3c25c76ab2e0a75e8a54777b7c8 -b4e68f6f2d978a5411414c164c81ddb2a141b01ebe18c65a8626ca75d6432e5988310b50a888a78c3a0a242353525af5 -8976f4cc3eaf2684718cf584712c4adaf00a4d9c521f395f937e13233b30329658b3deacfe7e29fac84c496047f2d36b -a40bcdf4b6e95f1535c88dddcbf2074ef2e746b7fd232bdfd2b88f2f6d4bbf21c6b263cf5fd3e12a03476f2f5ffe00d2 -88c7b6337ee705acd8358ef6d2242d36b140afff0579a7784b3928a0c49698bd39c1f400e8a2e3eda5fbfb2e8f28fe51 -a98612ba8b450a71d2075d51617ebeb7ca401ad3cbd9b8554850c65ef4f093ba78defb00638428c9f1f6f850d619287f -b7e71d3ffa18b185c1a6bd75668ff65d985efc0a0c19f3812cafde9adbfb59ffd108abeb376e6a8877fdf5061562f82b -8a3e5fd776cc26908a108a22b1b122d60cb8c4f483cbedcd8af78a85217bb5a887df3efed2b8b4ec66e68eb02a56ca93 -b0d92b28b169d9422c75f9d5cb0a701e2e47b051e4eacd2fd1aa46e25581a711c16caf32f40de7c7721f5bf19f48b3f5 -88895739d5152282f23e5909cf4beebda0425116eb45fc5a6a162e19207686d164506c53b745fb2e051bb493f6dbad74 -adbccfed12085cd3930bd97534980888ee564dda49e510c4e3ca0c088894855ef6178d5b060bca8a8a1a427afdbec8a8 -87d00674abd3d2e7047a07ed82d887e1d8b8155635887f232dd50d6a0de3fb8e45b80b5a05bc2ec0dea9497b4aa783ac -806e1d3dfadd91cbf10e0d6a5e61738d0dbff83407b523720dce8f21f8468b8a3fc8102acf6ba3cf632ca1cb2af54675 -95a9dff67cf30e993071edede12623d60031fa684dfbe1654f278a1eb1eb7e1be47886d3f8a46c29b032da3176c0d857 -9721973288384c70a9b191436029e85be57970ad001717edc76d44cbfa0dff74f8af61d5279c5cd5c92c9d0f6c793f63 -95c22d1d9b51ef36ba30ee059dcd61d22be3c65f245d0a5179186874219c08e1a4266f687fc973e71f3e33df2b0f7fd3 -b53ec083dd12cc42ae2bae46883a71f2a35443c9ce4ed43aa341eb5f616a53b64211ed5aac717fe09ef1d50f551ed9f0 -a103dab6695c682400f60be8d5851ce07f12e4bd9f454d83b39c41ddcf1443bb14c719b00b4da477a03f341aa1e920cb -b522236988518e5363b1c4bb3f641ff91d3d4c4d64c5f065415b738160b4ce4b0c22e1e054a876aa6c6a52fa4a21dfa2 -a6a00562f0879702cdba5befd256a09f44bf48e61780e0677ff8c3fda81d8e6dc76ba1b05e3494ca9a4cef057eba6610 -b974a2ae631e0b348421f0cda5bd4ce7d73c22dd0fc30404c28852c33499818cab89fbf5c95436d56a0aab3bf2bbab51 -9148cf2a7b7e773245d4df5a9d34cf6d9d42b1a26a4ca6bc3013feca6f3941d6c44f29ba9328b7fe6ce6d7f6565f8e4a -a34035c4a63e98528a135cc53bbbcfcda75572bc4c765f212507f33ac1a4f55563c1a2991624f7133c77b748bbe1a6da -a0c45923cfb7bd272ee113aecb21ae8c94dda7ad1fe051ddb37ab13d3bb7da5d52d86fff9f807273476c24f606a21521 -81ec2ca57f4e7d47897d0c5b232c59d7b56fe9ce0a204be28256a7472808de93d99b43c824a0cd26391e6cac59171daa -8373852f14a3366d46c7a4fc470199f4eebe8ee40379bd5aae36e9dd3336decaead2a284975ba8c84d08236e6b87c369 -b47e878a93779f71773af471ba372cb998f43baca1ae85ea7ff1b93a4dee9327e2fb79691c468ec6e61ab0eae7ceb9f1 -8fc8f260f74303f26360464cfef5ee7eebcbb06073cef3b1b71dab806d7c22f6b3244ce21d0945b35c41f032f7929683 -87e3c4e1dab00596e051ce780b9a8dba02ecdc358f6ddaeb4ec03c326e4b7da248404745392658eb1defff75b1ba25c8 -aac95d8e3b7fe236a7ca347d12a13ec33073f2b2b5a220ecfd1986ca5c3889f0e6a9d9c377a721949aa8991c1821953a -91a483679437ae126a16f5dc3bba6e9bb199dfbba417f0dc479f22819b018c420edc79b602db6183c6591b1909df4488 -94a4b2c663aa87a2417cad4daf21a88b84983a7b212ffcd18048a297b98e07dd4c059617136976fac1d9e94c8c25b8d2 -83e2a690bfa93c79f878a63c0f69f57aabdd8bede16b5966ffba7903dc6ad76775df1fd5347e6f2825f6cd7640f45a45 -a316af7ac11b7780d15312dc729499a1a63b61c4283e103ecce43c3b0cbb0f4bce6ff04e403f5c7cb670dee80c75ab99 -8d0a911c54ee1f9f7e7794732ad87b434c3f356294d196a5e35eac871727fd32a49c27c2dfa10833f9e6f9c7ccbe0064 -8b8db09028298a1f6362b346c8bfeced7cb5d13165a67c0559a9798a95b7a4a9810c02bb852289d47c59f507bd24ce77 -962d57305c518f175ed5d0847fb52ddc4258ca0e4c9ddfc8c333a2ee9f8b4e48d25a3d7e644b785a5953e2e4063da224 -92e0799491898271769250fe88b0cb9dadec98ac92f79de58c418d23ef8c47fcf21ddc90e0cd68bb8f1deb5da82da183 -99855067125f6a6c3a3e58d3bd2700a73ef558926bd8320d2c805a68e94207b63eda6bdc5a925ec36556045900802d51 -a724ae105ab4364a17ddb43d93da1e3fc6b50213f99b7be60954b24dc375c4f93a0737f4a10b4499b6f52667d5f3a64e -82070fb43a63fb50869b118f8940108f0a3e4cc5e4618948417e5cc3801996f2c869d22f90ca4ca1fdbef83c4778421a -b25c04365d6f24d5d3296c10d85a5de87d52a139ddbcbf9e0142074bc18b63a8bc5f5d135bd1e06c111702a4db4cee28 -851093282dcda93e5c98d687a17a7ee828cf868f6c85d372d9ae87f55d0593d8f9f0c273d31f7afa031cf6aea6a7ef93 -93f04f086fa48578210ed207065d80a40abcc82d8bfc99386a4044561d35748ff6c3da6489933c23644ad4b60726da8a -84b1b50d1e876ca5fc341bbedab5b3cc0f6a3f43ea7dd72605f74d0d9c781297b2f12b7872dd600924f1659a4cdf8089 -81b0ba88c582d3956f6b49ca3e031c6400f2ec7e1cd73684f380f608101e9807f54866be0bb9a09c03953c4c74fbb3c8 -a641af6ac644c41a55dee2ef55d3c37abdb19d52bc1835d88e7adda6b6ccd13987c5fd9cba9d318cabb541aa6a0c652e -a7b75b0624d04ad0901070e691eb2d2645b60f87e9d6b26e77a5fb843f846c32fc26e76ae93fd33fe3b857f87bc25162 -a81ba3e2ed0f94c67cd02ba7360e134f8becf7ed2ed2db09b9f5ef0942f7073bfee74ca446067db6092f7b38f74ccc11 -ab80edcabab5830a24210420f880ebac4e41bf7650c11ba230f4889634dbf8e8e2309f36be892b071c67a3bab8fc7ed6 -94d69b64675076fecad40fae4887fb13a8b991b325fa84e9d2d66e3b57646de71a58ad8fd8700fefb46975b18289250b -b44fc0df480cd753a041620fa655be9df74963ae03d4625847d5bb025ceb37f48d19c8c9c444546fba5fe5abb2868506 -b56e2c51324d6200b3d9781b68b5b5e1617a68afccd28b3a12a4be498d2e3aafcd86514c373a9f3a001db733010c29cf -a359a0c172e5cd7ce25080dd2652d863d7c95a4a502ae277ac47f613be5991300f05978404a0acb3bcda93524dcf36e4 -b01427a3dfdf8888727c0c9b01590b8ae372b7b4080d61e17ccb581bac21e61c4a58c75db7a410d1b2a367304e1e4943 -95cb08be4a96c18fbf9d32a4bbf632242029d039a5fdea811488d3634cd86520d4f9806250a8c01855ee2481210f542a -b8594fe6c0717164058f08aedeed1853523f56cec5edbf0d2be271fa5e8bfd61f2974b0f3988d70f5baa2e7888c7ec1f -8f64ee89f59daf74fa1056803247c9d678783ee3917b12a201f30f7523957763e979ceaddb38bae20de40b9885728049 -b6093ee4bdb837bcc59172e236f4bdbd439c0a5a50e2aa16636cbff81b51e92989eb5f80a3f75c37ae7b5b942e55b3d2 -913b6fbb7b43e3e5c49e96cd8e82ed25c655e51c7b8ca82e8fbf92b01ac83c39d52f6f4efab5d39b0591a0538601a86f -81f42668479ca0bec589678dc0973bf716b632578690efe1a0f13de630f306fb4a189a98c2302572fd85d3877ee030b5 -90ff89c38a9a7189f28d35a088657f52283670e7fec842fa91c265660ea2e73b0ad6c46703d649f406f787490b7a7e4b -9077b8b5f1e083183f3152ceb9c5491b5d4b86525a08879f7fb6d5e27f9f1a6867cf0d81b669a4a2d1f1654b67fa8d9c -a7a0275cf5b894adbf2e54a972310cfe113e811872111d6ee497d03750d9f6ffa5517b6c13a99b111a4a91e8e4dfeeee -a08976bf8125b7538313a584bbe710741d630cab067a204ad4501cc4938874ce7aa6a1a826259c2e82ef10a66f1f36fa -8aa45385b5b97f1f3e45f2bbf7a4f3e8ef068e628608484971c97adeb610ebd5deec31317e03eb6536808921062c04db -945b106b8f3ae85e60dfd34ef3dcc079bc6f0aab6df279ed000856efd51321462038ac0a1ca5db3ebf6379bc341e7c55 -a4199c87a96f98cc9d8776fe6de131d2c706b481eb9e9a3bbc50a93d492d7fd724ea469f723fbcfb94920cb5b32c1d76 -a5347b1b2f6149805de67546c5ed72253311099bf1473dbc63edcf14a0a5e68d401f5341338623fbe2e2715b8257e386 -af5dcd03ddc3769e83351d6b958d47a06d4e5224bd5b0ec40ffe6b319763fab8572002f4da294a9673d47762fd0e6e1d -82ec1031b7430419d83b3eea10a4af4c7027f32b91c3ae723de043233b4a2e0c022c9e0f5a1ac49753800f119159112d -8a744d911b67d03b69811f72e9b40d77084547e4da5c05ff33893468b029a08266fc07303f7005fd6099683ca42b3db4 -93ab566bd62d3439b8fc620f3313ef0d4cb369f0f0c352cdaf8e5c9e50b9950ac3540b72f4bf5adcb9635f9f7ce74219 -b2a211d72e314799bc2ac7030b8bbb8ef4c38ebd0ebb09d6cbd43bd40c6c61d80a3aad02cc73f5775a08b9657da20a48 -98d60f0a98d28718e0c6dcccc35a53521ea7f2d8fe08ea474374a336b44cea4cd1c63b31f2ad10186822bfb54aca53e6 -831f89cb94627cfe554d46ae1aad8c1cde7ebe86c4bd8fac4ef73ac2d5b491f5efa5dc4198cb8ffbec563e0606b91d89 -8f8552583bc6cb3fb176b7202236ee4128faf0c8ec608f9150f8e011d8c80b42aab5242c434d622b6d43510eaef752c0 -897bf27baaee0f9a8445200c3d688ae04789c380d1b795557841606a2031092328eb4c47fef31c27fdd64ba841d9d691 -b57589a4af8184b4a8ceb6d8657a35522672229b91692c1cec3ac632951e707922a00086d55d7550d699c4828bcfaab1 -98c2fe98095e026aa34074bcff1215e5a8595076167b6023311176e1c314b92b5a6d5faa9599d28fca286fadd4e3b26c -a034992e563bd31ede3360efd9987ecddc289bc31046aa8680903bb82345724805e6f6cf30f7889b6b95cf7319c3aea1 -85c33d9f10cc7185f54d53c24095e621966065e0ff2689a9aa6bb3d63706796c37a95021738df990c2c19493c0d44b64 -a8c1247d6de2215f45b50dd2dc24945ff9b93184bcc2159b69703b0bba246adcd1a70a12659f34c4ca4ba27dea6e3df5 -83ebdad2834c97bf92aac8717bab2f5cb1f01026b964d78e2f3b44e99d7908e419165b345d2b2f125b903096584e6683 -b0af6f7f81780ceb6e70adfd98e7702ec930c8ca854b50704c4a0fc8b887b9df60a6fe9038b487f3ed0eb8eb457307ea -933ec7e53882453898617f842ab2efae4756eb6f6ea0161cced5b62a0cdde4c08c7700d52f7546d4dd11a4c9e25d624e -adf6e6d4706025f85eb734f506dde66459c9537a1abf6189199cf219ae583b461e11c6242fce5f0795e4d9025270fabf -89e4316319483098761b0b065df4cfb542963b7a2556ba5425b6442fb0e596eb2a4f03e2dc8c617eebe8f243a12e7d10 -90c5a147555759ebc4d0e15e957a548315f9994ef0c7a3f53f2d18da44fb93bf051d96ba8551597a6f3e701b926fd791 -a151a9a5199c72c697b771cd81e550fc6f9596c752ae686ad988b316a7548360cf9785ab4645164d96cfdf9069a94020 -80cba11a3977729d7948db5bcc186159f4cae7c0a835bb38bb781e287dd6c238508e748f23454405c9d5eed28e77df02 -ae4b92ea03cb8ad12ad3ec76869ad05acb09f9d07a3c9a87dec0e50d9a276fe5d3d515a8c446f3aa35cd7d340a22c369 -8630062709a1f180f952de9f1ca3f41acce5420677f43d9619097e905a6237f1908d66db7a4dfdf1b2b92fb087e9944f -81defc33dd383d984c902c014424bddd5e53b013f67f791a919446daa103b09b972fa5242aba1b1dbe4a93149373f6c3 -963891ecaea97e661bac2594642327a54f5a0beb38fcb1c642c44b0b61faab9c87b0c9f544a3369171b533d3ab22f8f1 -932fadbff5f922ddcd4da942d57fe3e6da45c3d230808d800a3ca55f39b0b62f159be31a5924b395d577a259f48c6400 -992ce13bd037723447f88aeb6c7722fd9510c7474192b174ea914ed57c195c44c298aec9a8cabac103f0a5b50051c70b -b032157b3e4fe69db6ce6bb10bdf706a853fbd0bee08c2ab89da51ad827425df5df498b90e7a30247a7f9e954ca986e5 -b2478d4874578da3d5000893736bb65712e6aafe96e6fa5cf5878ae59ba0ce640dbe5d76ec2b5baca75af57def471719 -a387c17b14dd54910fecf472f760e67cf71a95e9e965cc09484e19581ada65e79938b86136a93e287e615fbd4908e080 -98f02be271d0f8841d8d561163f9e55e99b57aff121a93fba7a4654bcf15a0899811f00f5bcbfbebd98e365a0e332e97 -a3c34f01d54cab52a8890391b8cf152cc9cdc16e7e53794ed11aa7b1a21e9a84d39ddcfbcb36c5df6891c12307efc2e0 -a940331f491ec7ad4a9236ca581b280688d7015eb839ee6a64415827693d82d01710dc4bbd5352396be22781fea7a900 -b10874ed88423731535094031c40c4b82af407160dfade4229ac8f4ef09d57b3db95c4a9d73c1a35704f6bd0d5f6c561 -a9c5a4a7680261c1b0596f8ab631d73d4a7881b01e6559c628b5cdafa6dd2b6db2db64f3f2ab5841413a8a52b966a0da -8fc154564a61d5e799badc98b43a3587f804385a850adce9a115cbd2ad911f3fd4072b8e6b22fc6c025a6b7e7ea5a49f -b9caf7c6dcce3d378aa62c182b50bc9c6f651eb791d20fffa37ef4c9925962335fe0b3bc90190539312aa9ccf596b3b9 -90c5b7acf5cb37596d1f64fc91dee90f625f4219fa05e03e29aebea416c8e13384f2996f8d56791bcf44ae67dc808945 -ab8d311fc78f8a1b98830555a447c230c03981f59089e3d8a73069d402a3c7485abe3db82faf6304aaca488a12dbe921 -8a74fda6100c1f8810a8cacc41b62875dd46d5c4a869e3db46202d45a8d9c733b9299dda17ce2ad3e159122412a29372 -8769dcacba90e6fc8cab8592f996c95a9991a3efecfb8646555f93c8e208af9b57cf15569e1d6e603edac0148a94eb87 -854fd65eea71247df6963499bafc7d0e4e9649f970716d5c02fbd8708346dcde878253febb5797a0690bd45a2779fa04 -83e12dc75ef79fd4cc0c89c99d2dace612956723fb2e888432ec15b858545f94c16fae6230561458ceee658738db55ba -8416ef9ac4e93deff8a571f10ed05588bef96a379a4bdcc1d4b31891a922951fa9580e032610ac1bb694f01cb78e099b -93aea6e5561c9470b69d6a3a1801c7eef59d792d2795a428970185c0d59b883ab12e5e30612d5b6cde60323d8b6a4619 -91d383035aa4ec3d71e84675be54f763f03427d26c83afb229f9a59e748fb1919a81aca9c049f2f2b69c17207b0fb410 -b1c438956f015aef0d89304beb1477a82aed7b01703c89372b0e6f114c1d6e02a1b90d961b4acbb411cd730e8cacc022 -a1ee864a62ca6007681d1f859d868e0bcd9e0d27d1da220a983106dc695cb440980cfdb286e31768b0324b39ae797f18 -b57881eba0712599d588258ceada1f9e59c246cc38959747d86e5a286d5780d72d09e77fd1284614122e73da30d5cf5c -a48f9ae05ba0e3a506ba2e8bbce0d04e10c9238fa3dffa273ef3ffe9ec2ed929198a46507c0c9d9b54653427f12160f9 -8db18da7426c7779756790c62daf32ae40d4b797073cd07d74e5a7a3858c73850a3060f5a3506aae904c3219a149e35d -a2bf815f1a18d7be8ce0c452dfc421da00dcd17e794300cdd536e4c195b8c5b7ccc9729f78936940a527672ac538c470 -a34c6f1f2398c5712acc84e2314f16d656055adcafad765575ae909f80ab706cf526d59e5a43074d671c55b3a4c3c718 -b19357c82069a51a856f74cbb848d99166ce37bd9aca993467d5c480a1b54e6122ebddb6aa86d798188ea9f3087f7534 -b440eac6f24d12c293d21f88e7c57c17be2bdb2a0569a593766ae90d43eccf813a884f09d45a0fb044ee0b74ff54146a -b585d42ef5c7f8d5a1f47aa1329f3b1a566c38bf812af522aa26553010a02bfd6e9cc78fdb940ef413e163c836396a5f -aca213b27f3718348e5496342c89fffc7335f6792283084458c4a1aa5fe0a1e534fcec8e7c002f36141308faae73ef2a -b24c07359769f8ffc33bb60c1f463ea2baad440687ef83d8b7c77931592d534b2c44953c405914ace5b90b65646c1913 -b53dfaf381205a87ca4347328ff14a27541fa6436538f697824071d02d4a737ceb76a38dcc6e8dadef3b5bc6442f5109 -b55972d8ed5197215c0a9144fc76f2cd562ca5f4e28c33a4df913363fd1388978b224c44814adb4c065c588a4ac1fe10 -a3303bc650e120c2e9b8e964ad550eb6ac65ffe6b520768b3e8735565ae37eafdc00e3c15fae766d812f66956a460733 -b11e53912ea0e40c3636d81d7637e10c94cc7ed9330a7e78171a66d02b7603f4cb9b3f6968104b158de254e65b81640f -b076bb9f6d396aa09c2f4706ea553b426fdfd87d7d69e438285b74d334e82f73973cb4dbd6cb1647493433dad65dbc41 -9415828b1632175f0b733541e32c26a9c88fe12c721c23e595f2efceaa7f867f359e32564b7c032185686587ac935cf4 -89579a112c306181c79aabdbf683e7806357febcb73bf5e8883862ae29618ef89498b62634404bb612d618fcd16da415 -8761bcd55d04297c4f24899e8fb9f7c1fcd7449ae86371ee985b6a262e228f561c2584980694d9bf354bdf01543edb6a -9100c88bf5f6f00305de0c9cf73555f16a2016d71c50cb77438e8062bd549fa5407793a8a6a7e06398756777680a2069 -9235dfef45aeff9c174898b0755881b7171ed86362854f0eabc3bc9256176c05a5dc27ca527c91c3fa70c0ec5fd5e160 -ac53b1d677cebab6a99381dd9072b8ac1abae9870ec04a1f8d2a59b6f1de797c1492b59af6948f5cf2b20599170f5bba -946542936b0c59156e8fd5c1623b41369bc2cbcc46ece80360dcb5e7cce718a3dd8a021f0b9c223062a4e43d910b634f -b1e9939b34e1fcc026e820fcfa9ce748b79499f8e81d24a3ef0457b3f507fe5fa37b975a47c143e92eb695623b4e253b -9382d9b5766f6ae960d8a8435e8b5666e57ef8e5f56219e7bfd02857afe5cb16f44d70a9e444cfb1008649ae9b863857 -91770ed1215ed97dca1282b60b960be69c78e1473edb17cd833e712632f4338ff74bf435c3b257439497c72d535ae31f -8eb2cbe8681bb289781bf5250e8fa332141548234c5c428ff648700103a7cd31fdc2f17230992516c674aa0ab211af02 -a823b71c82481bc6ac4f157d5c7f84b893a326bbb498c74222427ded463d231bc6e0240d572ab96266e60eb7c8486aea -a13ce4f482089d867e5babcd11c39fa9a9facd41a2c34ee2577de9ce9c249187e16f2b3a984cc55f9e45b9343462d6d2 -8d80e7bc706059cf5151f9f90e761b033db35d16b80b34dc8b538adc8709d305a0c06933dcd391e96629cf3888c8bf87 -abcd36cdd86c0fb57fb7c0d7a3b9af5fd9aed14e9f4e7e84b0796c5c0ad18c41585e8c46e511cef73dc486fe43f6a014 -a947a5b6916f416fa5a69c31aba94add48584791148b27d0b3ed32c02a05dfc06f7fdc5006e3b2503bdf6e410e30f2fb -b158e621580659f1fa061d976b8591ac03b53ecd23d9eb2b08c1a20353d78438287749664d196020d469ef44b3b8752e -90a5a9540281e481ac4b8d29968f477cb006b56bd145529da855d65d7db0cf610062418c41a1d80c4a5a880c0abe62a0 -b2c91808b6289d08a395204a5c416d4e50a8bb1a8d04a4117c596c4ad8f4dd9e3fb9ce5336d745fc6566086ae2b8e94f -af6767c9b4a444b90aeb69dfddae5ee05d73b5d96e307ce0f3c12bccca7bc16475b237ba3bc401d8dafb413865edf71e -8dcecf624419f6517ef038748ac50797623b771d6111aa29194f7d44cfb30097ced26879e24f1b12a1f6b4591af4639b -954437559d082a718b0d6d7cec090532104ab4e85088e1fc8ee781d42e1a7f4cdb99960429707d72f195ff5d00928793 -80f0b7d190baa6e6ab859dc5baab355e277b00ddcca32e5cebe192877ad1b90ead9e4e846ca0c94c26315465aeb21108 -b8c29f181ed0bb6ac5f6a8d9016980303bb9a6e3bd63ce7a1a03b73829ac306d4fab306ac21c4d285e0d9acb289c8f2a -a7685079fe73ecaeabf2a0ef56bad8b8afb6aeca50f550c97bf27e6b4a8b6866601427fcd741dc9cb4ce67a223d52990 -ada2ebf6f2a05708d3757fbf91365ec4d8747eb4c9d7a8728de3198ceac5694516ab6fd6235568aecd8d6d21fef5ef48 -846bc5da33d969c53ab98765396cab8dcdbb73b9836c9bda176470582a3427cb6de26d9732fab5395d042a66bdba704c -800a3a7ea83ce858b5ebc80820f4117efa5e3927a7350d9771cad9cb38b8299a5ad6d1593682bba281c23a48d8b2aa71 -a002b18595dec90b5b7103a5e3ec55bdd7a5602ee2d3e5bd4d635730483d42745d339521c824128423dfe7571e66cbaf -b6b4e2067ac00a32f74b71007d8ab058c2ef6b7f57249cb02301085e1a1e71d5de8f24f79b463376fd5c848f2ab1c5bc -a3e03036db1b6117efe995bf238b0353ad6f12809630dca51f7daaaf69f7db18702e6b265208944bfb1e8d3897878a51 -add16712f66d48aab0885bd8f0f1fb8230227b8e0ffca751951c97077888e496d6bfab678cb8f9ffba34cee7a8027634 -ad211af2dd0748f85a9701b68c19edd4a7c420e497cb2e20afdc9df0e79663841e03b3c52b66d4474736f50d66c713ce -8c8a899ce0f16d797b342dc03c2212dda9ee02244c73c7511626dba845d11a0feb138441da5459c42f97209bf758cd9b -a17efc75c7d34326564ec2fdc3b7450e08ad5d1de4eb353de9d1cd919d90f4be99f7d8e236908b1f29cf07ae1ffe0f84 -862d4a8b844e1b0dd9f4deff180456ebed5333b54290b84f23c0ddb2725ac20307e21cbb7343feac598756fe36d39053 -9187fbb19e728a95629deda66a59e178f3fcd6e9d7877465aa5a02cea3baba2b684bd247b4afbf4aa466b64cb6460485 -85ae5636688d06eab3be16e44fe148515d9448c6123af2365d2c997f511764f16830610a58d747adab6db5031bea3981 -8aa8a82891f4e041ce6df3d6d5d7e5c9aaaffe08e0a345ac0a34df218272664c1b7be2450abb9bc428bd4077e6e5dcc4 -8c3bcc85ea574dfe1b9ca8748565c88024e94374434612925b4e9a09fa9d49c0a56b8d0e44de7bd49a587ef71c4bff5f -9524f9dd866fe62faf8049a0a3f1572b024120d2e27d1be90ad8b8805b4e2c14a58614516281cc646c19460a6b75587c -84580d9c72cfa6726ff07e8d9628f0382dc84ce586d616c0c1bd1fd193d0a49305893eae97388de45ba79afe88052ee9 -b5573e7b9e5f0e423548f0583423a5db453790ab4869bd83d4d860167e13fd78f49f9a1ffe93ddddf5d7cd6ec1402bc4 -aff658033db3dad70170decb471aee2cf477cf4d7e03267a45f1af5fd18200f5505c7ce75516d70af0b0804ec5868a05 -84a0eab4e732a0484c6c9ed51431e80cea807702fa99c8209f4371e55551088a12e33a11a7ef69012202b0bc2b063159 -a68f8e730f8eb49420fe9d7d39bb986f0584c1775817e35bb3f7dae02fd860cddf44f1788dc9e10d5bf837886b51947f -946002dd6cf7a4fd3be4bf451440e3f3fd7e9b09f609fa4e64767180b43146095dfc4b6994287f8cfa6d1390d144be71 -b7f19777d0da06f2ab53d6382751dc5e415249d2c96fce94ef971401935c1d1f7d3b678501e785cf04b237efe2fe736e -81e5c66dd404fc8ffd3ac5fe5e69ead7b32a5a7bc8605a2c19185efcc65c5073e7817be41e1c49143e191c63f35239c1 -b5f49c523532dfa897034977b9151d753e8a0fc834fa326d0f3d6dacc7c7370a53fc6e80f6d5a90a3fbec9bbb61b4b7c -8fc8e78c07319877adfaa154a339e408a4ae7572c4fb33c8c5950376060667fbfc8ede31e1b067933d47e3fdbf8564d7 -859cfef032a1a044532e2346975679545fbb3993a34497ce81bdcc312e8d51b021f153090724e4b08214f38276ee1e0d -ae476722f456c79a9c9dfdc1c501efa37f2bff19ab33a049908409c7309d8dd2c2912aa138a57a8d5cb3790ca3c0ba2f -89acbbeffb37a19d89cfe8ed9aa8b6acf332767a4c54900428dd9ab3bf223b97315aca399c6971fe3b73a10a5e95a325 -90a4a00418fdf4420a4f48e920622aae6feb5bf41fd21a54e44039378e24f0d93ccc858d2d8a302200c199987d7cb5e4 -a3f316b0bd603143eba4c3d2f8efe51173c48afe3c25b4ca69d862c44922c441bd50d9a5040b7b42ba5685b44071c272 -a22f4dc96fedd62b9a9f51812349e04d42d81d0103465c09295a26544e394a34abdc6ded37902d913d7f99752dbfb627 -a49f51baf32d0b228f76796a0fef0fe48a0c43ec5d6af1aa437603d7332505be8b57b1c5e133bc5d413739f5ae2ce9d0 -a9e4fe133057a0cd991898e119b735b31a79811307625277c97491ff5d864c428cfa42ae843601d7bb05c0313472d086 -b987edfe0add1463a797ff3de10492b2b6b7ef0da67c221ab6f0f2b259445768a73fbe495de238c4abbe4d328e817c49 -b7f0e4532a379a4c306bbef98b45af3b82b17175dfe0f884222ed954c12f27d8a5bdd0cdeb1df27ff5832ba42a6dd521 -9471bc5ad5ec554acfd61b2eb97b752cb754536f95ae54ca2cbd1dc2b32eb618881f6d8a8b2802c1a4e58c927067d6cf -b4c84f09225cf963c7cc9d082efe51afbbbe33469dd90b072807438e6bde71db8352a31bb0efde6cd3529619812ef067 -8f08005a83e716062d6659c7e86c7d3b51e27b22be70371c125046de08f10ea51db12d616fbf43e47a52e546e7acaac7 -a8937e66a23f9d9b353224491f06e98750b04eca14a88021ee72caf41bdce17d128957c78127fba8ef3dc47598d768a7 -80ad991de9bd3ad543cddeaa1d69ca4e749aaefb461644de9fc4bd18c3b4376c6555fc73517a8b1268d0e1e1628d3c1f -b22f98bca8fe5a048ba0e155c03e7df3e3cee2bfe8d50e110159abdb16b316d6948f983c056991a737b646b4d1807866 -b0bb925c19ca875cf8cdbefa8879b950016cc98b1deb59df8b819018e8c0ad71ea7413733286f9a1db457066965ce452 -95a991e66d00dd99a1f4753f6171046a5ab4f4d5d4fe0adfe9842795348a772d5a4a714dba06b4264b30f22dafa1322f -ad91e781fa68527a37c7d43dd242455752da9c3f6065cd954c46ae23ce2db08f9df9fec3917e80912f391c7a7f2f7ffa -a202d3becbf28d899fe28f09a58a0a742617c1b9b03209eca1be7f072a8ada1f7eac2cc47e08788d85e1908eb9d3d8ee -a360ccb27e40d774d5a07b4ebed713e59a0d71b3ee3f02374e7582b59ec4a5ce22cc69c55e89742ba036dd9b4edd8f34 -a10b897a946882b7c9e28abbb512a603ffa18f9274369843eb3491524a321df1f572eea349099ac6e749ea253c901ea0 -b782a672cd344da368732ecd7e0a1476c2af04613d3eb6da0e322f80438af932bd6d49be7a6f69f7c877512731723d89 -aeccee8dfd764e1adcfc4bf669e0fa87a94e7c79324333e958df47888bff5cec358b8b5bbb48db54822b54d11bbb4bc6 -ad4953913662a9ee8753a354864339f43916f2c2390d0a3f847c712b42718ee00ee14158d730709971941e8680d54560 -92ccb31d6c9e8940c7e8a4873e7eb9de9fb2fa2bac344fa367062ea451fd49a6920a45218dca3ee968711397d2a01536 -9448d9b2b3d12dde9b702f53373db8b8595f9d1f9de2ebee76de292f966f375316953aadf6bfc0e4e853e1fa12d8f02c -8919230878a7219da8c80a4b7d00b9169fb503e72d79789dd53863c243b8d0fb0a819d46fa636d805d0b9b1d15d1f2d9 -b6581ab01215aac023f5e6f57419b6aa63c0743c07caf57d4e146b56b02d90ce1423f70489ac3a11e5c968cb924f937c -a793ec1b1fe56a76920296af06073caadfd6f1d7e30950f8ca13de3de45fe275ca4b361f5249d9405264c3a06ebb5502 -86385b4a4e1bfb5efe7bfef8fd0dfeba7f4400852237cab60febb1dfa409e497a649e81284b5a15fe680b78927256756 -85d10600de96103daa7c90657174b6cb4a1286df5379f1eda9f11c97f9df57043c290eb1ae83658530fe0fd264867b86 -ae01b2396d0f598c21659cd854c15edd4904a34d22278aef97c9260a14a8b250b52d972d304ac4b187c24d08795d5355 -b91b3e4b6fc06e88081fe023ef1b773d82c628eb0f73a2731a9aa05b0dc89b7aeef2eea60125d302e696f45c407aeac2 -986d0f478e33af7568eab6bb26a55c13ffd7cae27525b4abe2f3a994bdb11bbc73d59bdb9a2f6b6ba420a26f8f620ba6 -9746f4fdeef35feaff1def0ea5366b64f21ed29749ae6349f9cb75987e7f931952f913f446100f2a6b182561f382e8eb -a34a116cfde1acbce0d7de037f72a7ca30ab126d8f4815b2b8bcb88e0e6c89015a4daaf4d4ce8eae23eb5d059cf9a5cf -80c3ea37f6a44f07cc9c9c881990f2a5deb9f9489a382718b18a287aa3c50ee6ebe8fd1b3afb84a3cf87f06556f4ca15 -97cff3bc88cfc72ce5e561f7eeb95d4ffb32697e290190c7902e9570c56b3854753777fc417fd27536fc398c8fefb63b -b8807232455833e4072df9bffa388ae6e8099758c2a739194719af7d9ed4041974a6cd9605f089de8b43f0e12f181358 -96f79fca72f75dc182c71f2343f0c43b06d98563fd02d2e1fbc031b96601608d8a726c811a74bb51ab8b0a3ce3632dc4 -b5262761680a4235a8c1257de4735cdcadf08d5d12c6e9d4f628464d5c05dfff3884a9ef2af3b7724b5a8c97e6be74eb -b6ce0eada73433d98f8fae7d55e4ea2b9d9d7a0ae850d328dd06991f27b1f03e470868fb102800ff3efe4ee1698531b9 -a37b7d9fe9d3fdfbc72c59cf6cacc7e7a89d534dea3d73121f7483331aec8ab3fbff58ffabb943b75d6f86df0ba43262 -93fce9be8a27fcaa1283d90d3e87265a6221ee302ec708161a42bd00ffe8e726743d9e187e1bf4307c0e3f25afbb1d44 -a4ea919021346ae7ea69d5e8f46d860b24c35c676b62f4e577c90e0c05c5646fe73721b143b7c38835dd4b443e6c3676 -b79983a5948453f70dfa4c396ce1945204498fe79f40c0667291bd0fdd96ed0b9ea424571f7ade342275c854c9f03d9e -866f8e395ed730b614b70bf999cad6e87e9086c1f5aea8d69020b562ee285dd0fb93afaca0dd13a0713f74a3f9340f01 -a3fef158782292c6139f9a0d01711aa4ed6f5cac11d4c499e9e65c60469ae3afbde44fb059845973a4b3bbca627b7eb7 -b4a2c0321b68f056e7d8051beede396fa2f0704d8aa34224f79f7b7a62eb485fc81889cb617019622fd5b5fa604516f5 -8f0e3edddbaead9059df94de4139e3a70693c9ea9bc6baaa5695dddfd67263b33926670159846292801941b9a0c6545b -9804e850f961e091dadd985d43d526ba8054d1bf9c573ed38f24bbd87aeaad4dcba4c321480abc515a16b3b28f27bb2a -95f330da28af29e362da3776f153f391703a0595323585220712dae2b54362cc6222070edd2f0dd970acfbe2e3147d5c -82d03b771231179cc31b29fe1e53379d77b5273b5c0a68d973accd7a757c7584dbb37f0507cdfde8807313ec733a6393 -81b3c39a9f632086e97b7c1f0ec7e2eaf9dc3cb0d84dec18a4441dbdc9fe9878fde4bcfa686bca1a9522632a353a5566 -a2db124ab2b493d5f9a1e4ca6b3144593c2fc8bfac129fd79da11dfbb7ef410a234fda9273a50a5ca05d7b37cc2088a2 -aa8550633c9449228702690cc505c0fc4837ea40862058e8f9713622b34d49fdc3a979b9317993c5da53b5bb5b7f4974 -ae783bcf7a736fdc815d0205b4c2c2b2fee0a854765228f76c39638ba503e2d37f1e28f6bdf263923f96fead76b4187b -b5ec86092c1d250251e93bab2f24e321afd2cd24cf49adfcbed9e8bc5142343ae750206c556320551e50fc972142f0da -b3b5791b590a6e9b3f473d5148624014aa244495249322a5d75cde2c64117ff9d32f4b0698b0e4382e5e7f72933061f8 -876c6a9162c17b16d6b35e6ce1ba32e26aec7dd1368bceab261ab880ad845c91e54b96a52c7d3aafbfbafc0e37139dca -902ddb5774d20b0707a704486457c29048776a5b88c377b14af6616c8ddf6cd34f49807df9c9d8866d6b39685cfb0f19 -8b87f71f94bc96de927d77a5d7123fa9cdda8c76aff64a5e6112cbc2eca43b07f8376db3e330f8af6a1db9b948908a6a -a69a5922e572b13d6778218e3657f1e1eea9a9682f6eb1b731d676d03563e14a37ff69bc5e673c74090ecb0969a593f7 -aff3510d78ba72f3cf5e3101847b7c4a956815aa77148689c07864e8a12dd0ef33d5f6c8cb486e0ea55850161f6afed0 -aa9c459cb2a008d94cbee2c6b561d18b0d7c6ffa8a65cbf86ae2c14eec070ee9d5324f5d38f25a945ddcd70307e964c4 -8310e15b050b1e40ece7530b22964bde0fd04f48dfffdec5a0d1fb8af0799a7fdc1d878139fb7cb8d043d3a52c2d1605 -b8f0856ce2c4034ee4041d0383f25fb0eeefc00b82443311a466fc18608313683af2e70e333eb87e7c687e8498e8a1ce -a8200a75c158fbb78474cab8a543caecd430b5d8b9964fc45d2d494dd938021cd00c7c33413ad53aa437d508f460a42a -a310091472b5b42b02176b72d5f8120bdb173025de24b420e3ca3fb9a386c39092a1d1bb591c6f68ee97a268a7ff9e95 -b23f1bf8bcec9cb5232b407115eead855fd06f5bf86ba322ad61d45460c84f0f36911aba303de788c9a0878207eac288 -ae4c129ad6d08be44690bb84370e48bfd92c5d87940750ee2c98c9a2604456f7f42727ab211989657bb202f6d907df04 -95992057d654f3e189a859346aa9aa009f074cb193b7f5720fa70c2b7c9ce887d886f6cff93fa57c1f7c8eaa187603f6 -ad12d560273963da94151dd6be49c665d7624011c67d54ab41447452a866bc997e92a80bdd9ca56a03528e72c456dc76 -8e4eda72e9cfcaa07265bb6a66d88e9ce3390ae1a6b8831045b36ea4156b53d23724824d0f0bca250ce850c5926fa38f -980fe29c1a267c556532c46130fb54a811944bdfea263f1afcdab248fa85591c22ac26167f4133372b18d9f5cce83707 -a7da9f99ddde16c0eac63d534a6b6776ad89b48a5b9718a2f2331dce903a100a2b7855cf7b257565a326ddc76adc71a5 -8ca854c55e256efd790940cb01125f293e60a390b5bd3e7a60e13ac11a24f350a7eb5ebddfa0a2890905ca0f1980b315 -9440335818859b5e8f180893a8acedceabaaa44e320286506721c639a489b5bfb80b42b28902ee87237b0bd3dd49552a -b9da545a20a5e7d60fd0c376dcaf4b144f5c5a62c8ffa7b250c53ce44be69c4e0d5e4e11422ef90593ae58ae1df0e5d3 -b75852a850687f477849fc51e0479703cd44428671c71bfdd27fe3e7930b97d2fc55f20348ca4e5bc08db2fc16a4f23c -b515081d8d099e4b6253c991ca2d3e42633f5832c64aa8f9cde23cb42c097c2c3717c46c5f178f16c58295f97b2b3fe7 -9506c9902419243e73d3197e407985dd5113f16c6be492651bbbf9576621942710aea74522d6fb56d5b52c6ccdaa4307 -952673ae27462a0f6c9545eede245c2f8e2fd6077b72a71f5672f1a5a02c263bc2a66f24f0e30376feb7a8187b715f08 -a8f1e2085ed666a8f86b474d9589dc309d5c83bd53e745f8e09abe0dfbaf53e5384c68580672990344d4aa739438b4d8 -ad6e04d4a67a5a5529ceaf7de6e19416be5b4c436610aa576ac04aee3b73317da88f891121f966393a37f52b775a2dd8 -a35a884736f08c7f76923ae7adb17fdac04e6c505178bca9502eaa2ed16d4d93fa953fb6dcf99e9e9962a6eb3eeead00 -b8af72273360bab4b3ca302cf0659717cbfb335fbc9ad4ffdd3340113ece9e63b2bdbd611e5f6b740a4689286f9a452d -b1a1f4ba2640800c3ed3892e049f6e10f8a571efa3bbe21fe2d6cee8fded171c675a3bb8aa121e2d1d715de84bad2e2b -8102a6c3598b40da4d6e8eccfdd5dadc8d6262e38b69c5b211b0732f4c6e3045d79fba12770a0b2b66f1e9f4664b1510 -90979587d75bf12819f63832beea7dcbef101f6814bf88db4575bfcd9cf0ea8eceba76d4d6db17630b73b46c1acfe011 -8dd98f14d2beb5b5b79cc30f6825ec11ed76bd5a8864593ffc0c2baffab6872bad182e1c64b93aab8dd5adb465fa5cec -8083334dadc49c84f936c603a2857f174eda5659ab2b7214572f318aba3ebd7b1c50e7cbea57272b9edf106bd016df3b -a634d08d2e8641b852e89d7ccab1bab700c32fb143bcbea132f2a5fb2968d74ded2af4107f69818798f0128cc245a8cb -94fc2dccf746d5b3027f7cf4547edf97097cd11db8d6a304c1c2ca6b3aba28c1af17c08d2bbb66f88c14472e0196a45e -b257a6fb01424b35e414c1c002e60487abb3b889d74c60cbdbf591e222739c6f97b95f6962842401f5e2009e91b28c55 -81955bdbf25741f3b85d5044898dc76ae51b1b805a51f7c72a389d3b4d94b2e3e0aa1ec271685bbcf192ed80db7367ab -86eb229b66c542514e42b113b9de7d4f146861a60f2a253264873e7de7da2ac206e156ff11f2de88491b9897174fe2f4 -8b8db00533afbb56b3d7d7a9a4a6af3cebb523699ffcb974603e54f268b3ef739c41cd11850b9651d9640d72217c3402 -8b7cbb72a6c4408d5f1b61001e65de459790444530245d47d4ee8e2d17716695283f21540bd7ac4f5a793a0d00bdf1d4 -875920b9bab4bc1712e6af89ae2e58e9928c22095026070b07e338421b554d9f96e549ac3706c6c8d73f502913a27553 -9455d192db7b039b3e8f0bc186c25ff07dfbe90dab911e3c62e3bd636db8019ed712cbb0ecd5cbb9a36c11034e102aba -8cb0b28e5d3838d69f6c12274d6b1250f8843938065d0665b347977fa3c1c685caef6930bae9483ed0d0a67005baad76 -94df2e14aae1ae2882ab22a7baf3dc768c4a72b346c2d46bfd93d394458398f91315e85dc68be371f35d5720d6ca8e11 -aacd94b416bfbeb5334032701214dd453ad6be312f303b7bec16a9b7d46ab95432a14c0fbf21a90f26aafb50ec7bb887 -b43d26963665244633cbb9b3c000cacce068c688119e94cc0dac7df0e6ee30188e53befff255977788be888a74c60fc2 -b40d67c9ad0078f61e8744be175e19c659a12065fe4363b0e88482b098b2431612e7c2fa7e519a092965de09ceafe25c -82cd4a4e547c798f89ce8b59687614aa128877e6d38b761646d03dc78f6cdd28054649fb3441bcd95c59b65a6d0dd158 -a058e9700f05cef6e40c88b154d66a818298e71ae9c2cf23e2af99a0a7dc8f57fbe529d566cb4247432e3c1dee839b08 -95c6f84406466346c0b4a2a7331ac266177fb08c493d9febb284c5ca0b141ccc17aa32407f579666b208fb187c0227dd -905d1d47a26b154f44d7531c53efbc3743ff70bd7dba50c9b9d26636767b0ae80de3963c56d4604399126f4ad41a0574 -83dfa11c520b4abaefe1b2bc1ce117806e222f373cd4fb724f3c037c228e3379d27a364e68faa73984ba73a0845f1b9a -a16e54786ba308a9c0241aff8f1bf785dece387d93bd74aa31de0969e3431479e2c0abebff9939a6644d2b0af44f80bb -81ac565212365176f5be1c0217f4e7c9fdbc9fe90f16161367635d52edcf57af79290531d2e8b585e1223d33febd957d -a296f4b09915e5d80ff7274dc3ffc9b04f0427e049ea4ef83dca91095275e8a260ef0335c7b6585953b62682da8c8e99 -a9150626208168a21ae871192ca9f11c1f7f6e41e8e02de00732de2324d0d69fe52f8762155c9913ee408a034552e49a -a42a56008ca340c6e9ff5a68c8778bb899ba5de9e7508c0cac355c157979a7ff6a6bd64f98b182114d3831cfa97ee72b -a4f05adf22c051812279258eea9eb00956b04ef095f2ca175f775ff53c710fb0020266adabd1dacaee814c4f1d965299 -967492e78ac0bceb8ad726ea0d2292b760043d16d64a6b1bb896e32630a7bf405c2b20e4e00842ae519a21697ff8db2d -adbf05e9b5931ae3dd24d105b5c523c221a486a4123c727069b9e295a5bc94f3e647a3c2cde1f9f45dbd89df411453c9 -a1759c0ebebd146ee3be0e5461a642938a8e6d0cdd2253ebd61645b227624c10c711e12615cd1e7ea9de9b83d63d1a25 -a4c5945d635b9efc89ad51f5428862aefe3d868d8fb8661911338a6d9e12b6c4e5c15a25e8cb4a7edc889b9fa2b57592 -aff127675ea6ad99cb51c6e17c055c9f8fd6c40130c195a78afdf4f9f7bc9c21eed56230adb316d681fc5cacc97187da -9071294e8ff05b246ff4526105742c8bf2d97a7e7913f4541080838ecfd2dbc67c7be664a8521af48dbc417c1b466a85 -990880b0dd576b04f4b4ce6f0c5d9ff4606ec9d3f56743ac2f469ac6a78c33d25c3105cf54f675e300ac68073b61b97a -a8d1a62ce47a4648988633ed1f22b6dea50a31d11fdddf490c81de08599f6b665e785d9d2a56be05844bd27e6d2e0933 -8ea5a6c06f2096ded450c9538da7d9e402a27d070f43646533c69de8ea7993545673a469c0e59c31520e973de71db1b4 -99d3a098782520612b98a5b1862ae91bcb338ab97d1a75536e44b36a22885f1450a50af05c76da3dd5ca3c718e69fdd4 -b987451526e0389b5fe94c8be92f4e792405745b0a76acd6f777053d0809868657ba630aa5945f4bd7ce51319f8996f7 -afffccc5ddd41313888a4f9fee189f3d20d8b2918aa5ad0617009ea6d608e7968063c71bd5e6a1d7557880d9a639328d -8ac51a02505d5cadfd158dde44932ab33984c420aeceb032ed1ee3a72770d268f9e60ccf80ce8494dfc7434b440daafd -b6543e50bd9c6f8e0862850c3d89835ddd96231527681d4ab7ae039c4a3a5a0b133a6d40cdb35c8a6c8dbb8d421d3e2b -a2ba901f4fde2b62274d0c5b4dbbea8f89518571d8f95ec0705b303b91832f7027704790a30f7d9d2cdafde92f241b3e -a6974b09280591c86998a6854a7d790f2a6fbe544770e062845cfc8f25eb48c58f5dfb1b325b21f049d81998029ad221 -890baeb336bbf6c16a65c839ffaab7b13dd3e55a3e7189f7732dbcb281b2901b6d8ba896650a55caa71f0c2219d9b70e -b694211e0556aebbe4baf9940326e648c34fda17a34e16aa4cefd0133558c8513ffb3b35e4ee436d9d879e11a44ec193 -97cf9eb2611d467421a3e0bfe5c75382696b15346f781311e4c9192b7bca5eb8eaf24fa16156f91248053d44de8c7c6f -8247f88605bd576e97128d4115a53ab1f33a730dc646c40d76c172ca2aa8641c511dddad60ee3a6fbe1bb15cac94a36c -ae7ecd1c4a5e9e6b46b67366bc85b540915623a63ab67e401d42ca1d34ae210a0d5487f2eef96d0021ebecfd8d4cd9a8 -aec5123fff0e5d395babe3cb7c3813e2888eb8d9056ad4777097e4309fb9d0928f5c224c00260a006f0e881be6a3bf8f -8101724fa0ce7c40ea165e81f3c8d52aa55951cc49b4da0696d98c9fafd933e7b6c28119aa33f12928d9f2339a1075d1 -a8360843bab19590e6f20694cdd8c15717a8539616f2c41a3e1690f904b5575adb0849226502a305baefb2ead2024974 -ade5cad933e6ed26bba796c9997b057c68821e87645c4079e38e3048ea75d8372758f8819cde85a3ab3ab8e44a7d9742 -ab1fe373fb2454174bd2bd1fe15251c6140b4ac07bda1a15e5eabf74b6f9a5b47581ef5f0dbd99fdf4d1c8c56a072af7 -b425e1af8651e2be3891213ff47a4d92df7432b8d8ea045bb6670caf37800a4cd563931a4eb13bff77575cbcae8bc14f -b274799fe9dd410e7aed7436f0c562010b3da9106dc867405822b1e593f56478645492dbc101a871f1d20acf554c3be6 -b01a62a9d529cc3156bc3e07f70e7a5614b8d005646c0d193c4feb68be0b449d02b8f0000da3404e75dbdfa9ca655186 -878b95e692d938573cdb8c3a5841de0b05e5484a61e36ea14042f4eadb8b54a24038d2f09745455715d7562b38a8e0df -a89e998e979dba65c5b1a9000ad0fd9bb1b2e1c168970f2744982781306bbe338857e2fac49c8cafda23f7cc7c22f945 -85880fdf30faed6acce9973225e8fe160e680a55fc77a31daacf9df185453ad0c0552eb3fd874698ad8e33c224f7f615 -ac28d20d4bbb35ba77366272474f90f0ed1519a0e4d5de737adee2de774ccd5f115949e309e85c5883dbc63daaa6e27b -a1758ac86db859e323f5231ad82d78acbe11d53d3ebf7e644e581b646eede079d86f90dc23b54e5de55f5b75f7ea7758 -ae4c0b84903f89353bf9a462370f0bf22c04628c38bb0caae23d6e2d91699a58bd064e3c2b1cbda7f0a675d129f67930 -95f21a099ffc21a0f9064d9b94ce227b3ff0a8c5a2af06ff5ee6b7f3248a17a8ca2f78cd7929ef1d0784f81eddefcd48 -8d06fbc1b468f12b381fd1e6108c63c0d898ddf123ea4e2e1247af115043c4f90b52796076277b722dd2b92708f80c21 -a300f39039d8b2452e63b272c6d1f6d14a808b2cd646e04476545da65b71a6e29060f879409f6941c84bde9abe3c7d01 -adecce1ccc5373072ba73930e47b17298e16d19dbb512eed88ad58d3046bb7eec9d90b3e6c9ba6b51e9119cf27ce53f2 -941a7e03a64a2885d9e7bee604ddc186f93ff792877a04209bbee2361ab4cb2aed3291f51a39be10900a1a11479282ca -acbcb1ab19f3add61d4544c5e3c1f6022e5cc20672b5dc28586e0e653819bdae18cda221bb9017dfaa89c217f9394f63 -b8d92cea7766d3562772b0f287df4d2e486657b7ab743ed31ec48fdc15b271c2b41d6264697282b359f5cb4d91200195 -957360ecb5d242f06d13c1b6d4fcd19897fb50a9a27eb1bd4882b400dc3851d0871c0c52716c05c6c6cf3dee3d389002 -abd2a23abbc903fbb00454c44b9fb4a03554a5ef04101b2f66b259101125058346d44d315b903c6d8d678132f30b1393 -ae9572beff080dd51d3c132006107a99c4271210af8fbe78beb98d24a40b782537c89308c5a2bddfdfe770f01f482550 -82c7e5a5e723938eb698602dc84d629042c1999938ebd0a55411be894bccfb2c0206ac1644e11fddd7f7ab5ee3de9fdc -aba22f23c458757dc71adb1ce7ef158f50fdd1917b24d09cfc2fbbcbe430b2d60785ab141cf35ad9f3d0a2b3e2c7f058 -8eff41278e6c512c7552469b74abedf29efa4632f800f1a1058a0b7a9d23da55d21d07fdbb954acb99de3a3e56f12df6 -8abd591e99b7e0169459861a3c2429d1087b4f5c7b3814e8cee12ecc527a14a3bdda3472409f62f49a1eb4b473f92dbf -82dcbff4c49a9970893afc965f1264fcab9bae65e8fb057f883d4417b09e547924123493501c3d6c23a5160277d22a8e -b5a919fcb448a8203ad3a271c618e7824a33fd523ed638c9af7cfe2c23e3290e904d2cd217a7f1f7170a5545f7e49264 -96d6834b592ddb9cf999ad314c89c09bedc34545eeda4698507676674b62c06cc9b5256483f4f114cd1ed9aaec2fba5e -a4e878cf4976eb5ff3b0c8f19b87de0ef10cd8ec06fe3cd0677bd6be80ba052ff721a4b836841bdffb1df79639d0446c -8e15787a8075fd45ab92503120de67beb6d37c1cc0843c4d3774e1f939ac5ed0a85dad7090d92fa217bd9d831319021b -8506c7fea5a90cd12b68fdbbae4486a630372e6fd97a96eea83a31863905def661c5cdead3cf8819515afe258dbcd4d9 -952ef3bc16a93714d611072a6d54008b5e1bf138fd92e57f40a6efb1290d6a1ffcc0e55ff7e1a6f5d106702bd06807cd -a5f7761fa0be1e160470e3e9e6ab4715992587c0a81b028c9e2cf89d6f9531c2f83c31d42b71fca4cc873d85eba74f33 -b4811f0df11ff05bf4c2c108a48eece601109304f48cde358400d4d2fa5c1fdaaf3627f31cb3a1bdd3c98862b221720d -9207ad280b0832f8687def16ad8686f6ce19beb1ca20c01b40dd49b1313f486f2cb837cfbbf243be64d1c2ab9d497c3f -b18a8c1e6363fadd881efb638013e980e4edb68c1313f3744e781ce38730e7777f0cba70ea97440318d93a77059d4a2b -901faf777867995aac092f23c99c61f97eeadf4ac6bcb7791c67fa3c495947baef494b2aace77077c966c5d427abbf92 -a123281aca1c4f98f56cff7ff2ae36862449f234d1723b2f54ebfccd2740d83bd768f9f4008b4771e56c302d7bfc764f -8cffe1266468cad1075652d0765ff9b89f19b3d385e29b40f5395b5a3ad4b157eed62e94279ac3ec5090a6bad089d8b3 -8d39870719bc4ebbcecba2c54322111b949a6ed22bda28a6cea4b150272e98c9ded48cc58fc5c6e3a6002327856726ec -b3d482c00301f6e7667aaeaf261150b322164a5a19a2fa3d7e7c7bf77dc12fa74f5b5685228ab8bf0daf4b87d9092447 -801acb8e2204afb513187936d30eb7cab61f3fbb87bfd4cd69d7f3b3ddba8e232b93050616c5a2e6daa0e64cef6d106f -ac11e18adda82d2a65e1363eb21bda612414b20202ecc0e2e80cc95679a9efa73029034b38fd8745ce7f85172a9ab639 -b631d6990d0f975a3394f800f3df1174a850b60111567784f1c4d5bba709739d8af934acfa4efc784b8fc151e3e4e423 -aeda6279b136b043415479a18b3bbff83f50e4207b113e30a9ccfd16bd1756065fc3b97553a97998a66013c6ac28f3d8 -8840b305dc893f1cb7ad9dd288f40774ec29ea7545477573a6f1b23eaee11b20304939797fd4bcab8703567929ce93ad -963cc84505a28571b705166592bffa4ea5c4eeafe86be90b3e4ae7b699aaaca968a151fe3d1e89709fe0a3f0edf5d61a -8e1ec0d0e51f89afea325051fc2fa69ab77d6c7363cc762e470a9dfa28d4827de5e50f0b474c407b8c8713bad85c4acd -909f313420403cb36c11d392cf929a4c20514aa2cb2d9c80565f79029121efd5410ef74e51faba4e9ba6d06fcf9f1bd1 -b2992b45da467e9c327ac4d8815467cf4d47518fc2094870d4355eb941534d102354fbda5ab7f53fbf9defa7e767ca13 -9563b50feb99df160946da0b435ac26f9c8b26f4470c88a62755cdf57faebeefffff41c7bdc6711511b1f33e025f6870 -a2a364d9536cd5537a4add24867deec61e38d3f5eb3490b649f61c72b20205a17545e61403d1fb0d3a6f382c75da1eb3 -89b6d7c56251304b57b1d1a4255cb588bd7a851e33bf9070ee0b1d841d5c35870f359bc0fdc0c69afe4e0a99f3b16ec2 -a8ae1ee0484fe46b13a627741ddcdae6a71c863b78aafe3852b49775a0e44732eaf54d81715b1dca06bb0f51a604b7e2 -b814ecbfbc9645c46fc3d81c7917268e86314162d270aed649171db8c8603f2bd01370f181f77dbcbcc5caf263bedc6c -8e5d7cc8aad908f3b4e96af00e108754915fecebdb54f0d78d03153d63267b67682e72cd9b427839dca94902d2f3cda7 -8fc5ff6d61dd5b1de8c94053aef5861009cb6781efcca5050172ef9502e727d648838f43df567f2e777b7d3a47c235dd -8788eea19d09e42b0e3e35eb9bcd14f643751c80c6e69a6ff3a9f1711e8031bbe82ccd854a74a5cfcf25dda663a49a62 -95d441d8cd715596343182ddcecb8566d47eaa2d957d8aea1313bbed9d643a52b954443deb90a8037a7fa51c88eec942 -a15efd36ef72783ccdc6336ef22a68cc46b1ecec0f660cfe8a055952a974342bf30f08cb808214bce69e516ff94c14c5 -acc084d36907a16de09a5299f183391e597beaf9fa27d905f74dc227701a7678a0f5a5d1be83657de45c9270a287ec69 -b3fd385764356346061570beb760ccf3808619618fd7521eb0feadc55b8153ef4986ff0cbfcbd4153ad4ea566989d72a -91ec6b26725532e8edfda109daa7ce578235f33bd858238dfa2eb6f3cd214115b44cce262a0f2f46727a96b7311d32e1 -96b867ccddb73afe1049bda018c96cfe4083fff5bb499e6a4d9fd1a88a325144f9a08cb0aee310e1bb4f6a5793777e80 -ad10c18465910152676f1bc6a40986119607b5c272488e6422cfda2eb31da741af13a50f5de84037348014a869c8e686 -86ade2dbc4cceb52b84afe1c874d1e3644691284c189761febc4804b520adf60b25817e46f3f3c08d2ab227d00b93076 -998b949af82065c709fc8f63113a9fecdd1367fc84fc3b88857d92321ba795e630ce1396a39c2e056b5acd206ee011d8 -8dec440bbd17b47dfd04e566c2d1b46f9133023b982fdc5eaeae51404bc83a593f8d10c30b24e13aec709549137cae47 -89436ff47431b99f037cddaee08bb199be836587a7db6ed740317888638e5f4bebbb86b80549edff89678fc137dfb40a -a8e9960746769b3f76246c82cd722d46d66625e124d99a1f71a790c01cec842bcf6c23c19cc7011ec972cedf54dc8a4c -980979dafedfd75ff235b37e09e17361cfdda14a5ac3db0b90ed491abfd551916016b2254538da7f4b86ece3038b1b1c -8ec340ca7654720bb9d2f209985439ebbc3f9990ef27e7d7ae366e0c45b4ed973316943122119604ea9a87fc41ebd29f -ab24440a40ab238d8cd811edb3ef99948ae0f33bf3d257b22c445204016cce22b6f06a1ca979fa72a36c4ddedc2b3195 -a1bcd2473ac7cfebfa61c10e56cae5422c6b261a4a1be60b763fcbcdf2eae4ccf80695f09b062b6cf5654dfab0ee62a5 -9027a613ce7bd827110a3a0e63e83f652e9bc7f4ce8da26c38b28ee893fd0c38bdb20f63a33470a73cb77f776244ab4a -86911cc8aeb628197a22bf44d95a0b49afb8332c38857fba8e390c27c527b8b45335e22b0f2e0a3395c16ced3c1ed2e8 -8f0529a330a3e9967dce09357d774715fd305bd9e47b53b8b71a2a1303d390942a835aa02fb865a14cfed4f6f2f33fe6 -b71ec81a64c834e7e6ef75b7f321a308943b4bad55b92f4dbaf46658613cebf7e4b5b1bc7f1cdc5d50d1a2a0690e2766 -98d66aaed9fb92f4c7bb1b488ccbca5e570aa14433028867562a561d84f673ac72e971cbe2cb3cbbb0a702797dc45a7e -8380aa94d96c6b3efd178de39f92f12ca4edd49fe3fe098b2b7781e7f3e5f81ee71d196fb8e260d1d52f2e300e72e7bc -8c36296ff907893ac58cecadd957b29f5508ae75c6cc61b15ae147b789e38c0eace67963ae62eff556221b3d64a257a2 -97e17676cbc0f62a93555375e82422ee49bc7cf56ad6c3d69bb1989d1dc043f9f7113d0ed84616dde310441b795db843 -a952229615534c7e9a715409d68e33086cdaddf0aec51f4369c4017a94ec3d7113a045054d695fb9d7fd335527259012 -817b90958246f15cbd73a9679e10192ca7f5325b41af6388b666d8436706dea94eafffbc3b8d53057f67ad726dbcd528 -95776e378c8abd9223c55cd6a2608e42e851c827b6f71ad3d4dc255c400f9eccf4847c43155f2d56af0c881abef4acfa -8476c254f4b82858ecbe128ed7d4d69a6563fd9c5f7d4defc3c67e0bfa44e41cfd78b8e2a63b0773ce3076e01d3f6a7d -a64b0b189063d31bcae1d13931e92d5ab0cfc23bf40566ac34b5b8b711d0e7d941102e6beb140547512e1fe2d9342e6c -9678460acff1f6eae81a14d5c8049cdcd50779a8719b5c5861762a035b07f7fa1b1ada8b6173f9decf051fd5a55bebd8 -88398758ce86ed0388b13413a73062adb8a026d6b044cd1e7f52142758bed397befee46f161f8a99900ae6a2b8f6b89f -a7dfaf40637c81d8b28358b6135bd7ad9cc59177bd9bc8e42ba54d687d974cdf56be0457638c46b6a18ceaa02d3c53f3 -b0e885e5d48aa8d7af498c5e00b7862ed4be1dad52002f2135d98e8f2e89ca0b36cf95b3218aad71d5b4ada403b7045b -803b0e69a89e8de138123f8da76f6c3e433402d80d2baba98cde3b775a8eda4168530a49345962c4b25a57257ba9f0a7 -8ce6ef80dadb4b1790167fbc48be10ef24248536834ff2b74887b1716c75cb5480c30aa8439c20474477f1ac69734e61 -824764396e2b1e8dcc9f83827a665ef493faec007276f118b5a1f32526340b117c0df12bea630030a131bf389ec78fc3 -874edb379ce4cc8247d071ef86e6efbd8890ba6fcb41ea7427942c140347ebf93e8cf369d1c91bd5f486eb69b45bce70 -adadcb6eb4cafa1e2a9aef3efb5b09ffa2a5cf3ce21f886d96a136336be680dabc0a7c96ec327d172072f66d6dcdbb39 -b993591b280e1f3527f083d238a8f7cf516d3cf00c3690d384881911c1495192a419b8e37872a565ce8007eb04ebe1b6 -b125faaeca3f0b9af7cb51bb30a7c446adbb9a993b11600c8b533bff43c1278de5cdda8cb46a4df46f2e42adb995bce8 -a7efe1b57326b57c2c01720d4fdf348d6a84d35f229d32a8f2eb5d2be4e561ef8aea4d4d0bcfcbf17da10a8e49835031 -a6bd4f5a87574b90a37b44f778d5c7117d78eb38f3d7874bad15ae141b60eed4ab0a7281ed747297f92e0b3fe5f9cafa -94b5e3067ca1db3c4e82daf6189d7d00246b0360cb863940840358daa36cb33857fde4c01acd0457a90e15accee7d764 -a5ff3ab12197b8a07dd80222a709271ab3b07beba453aacbaf225cfb055d729e5a17a20f0ff9e08febf307823cba4383 -a76dd8aa2b6a957ed82ecec49b72085394af22843272f19360a5b5f700910c6ec65bf2a832e1d70aa53fd6baa43c24f6 -8dfcbe4143ae63c6515f151e78e6690078a349a69bb1602b79f59dc51dea7d00d808cf3e9a88b3f390f29aaae6e69834 -8c6134b95946a1dd54126952e805aeb682bc634c17fe642d5d3d8deffffd7693c90c4cd7d112890abfd874aa26736a93 -933531875561d327c181a2e89aaaac0b53e7f506d59ef2dfc930c166446565bd3df03bab8f7d0da7c65624949cfbae2f -ac6937c5e2193395e5bb69fd45aa6a9ae76b336ea7b6fd3e6aeac124365edcba7e918ec2c663fb5142df2f3ad03411a6 -a8f0f968f2a61d61d2cf01625e6ac423b447d3e48378ea70d6ff38bc98c42e222fe3cbcb04662b19973a160dc9f868a2 -94100a36f63d5c3a6cfb903c25a228389921684cc84f123390f38f90859f37ec9714942ffe6766f9b615101a3c009e43 -b5321b07f5b1eb2c1c20b0c8ab407f72f9705b55a761ec5176c5bcc6e585a01cae78546c54117ca3428b2b63793f2e65 -9922f61ed6763d1c4d12485c142b8ff02119066b5011c43e78da1ee51f10a1cf514329874061e67b55597ca01a7b92ab -a212eb2d72af0c45c9ef547d7c34ac5c4f81a4f5ec41459c4abd83d06ec6b09fdab52f801a2209b79612ae797fa4507b -8577d2d8f17c7d90a90bab477a432602d6918ca3d2af082fbb9e83644b93e21ca0bced7f90f6e9279eaa590f4e41dc4d -9002d424e3bebd908b95c5e6a47180b7e1d83e507bfb81d6ad7903aa106df4808c55f10aa34d1dccad3fab4d3f7a453e -b9050299bf9163f6ebeff57c748cb86f587aea153c2e06e334b709a7c48c4cbfba427babf6188786a0387b0c4f50b5ce -852ae1195cc657c4d4690d4b9a5dea8e0baaa59c8de363ba5fccd9e39ec50c6aa8d2087c8b7589b19248c84608f5d0a8 -a02ff5781417ca0c476d82cf55b35615f9995dc7a482124bc486e29b0b06a215fbe3e79228c04547c143d32cd3bac645 -8d7bc95e34bc914642e514a401448b23cf58bce767bab1277697327eb47c4a99214a78b04c92d2e3f99a654308b96e34 -adb28445d3b1cc7d4e4dd1f8b992a668f6b6f777810465fdab231fd42f06b5bada290ba9ae0472110366fad033da514e -a0c72b15a609f56ff71da17b5b744d8701af24b99fbc24a88588213864f511bfa592775e9ab4d11959f4c8538dc015b8 -933205a40379d5f5a7fb62cda17873fbbd99a0aaa8773ddf4cd2707966d8f3b93a107ebfe98b2bb222fe0de33ef68d03 -90690c1a4635e2e165773249477fc07bf48b1fd4d27c1b41a8f83a898c8d3763efb289867f8d6b0d354d7f4c3f5c7320 -99858d8c4f1be5a462e17a349b60991cb8ce9990895d6e42ae762ce144abc65b5a6f6e14df6592a4a07a680e0f103b2a -b354a7da06bd93fb5269e44925295b7c5049467b5cacce68cbb3cab60135b15e2010037a889cb927e6065053af9ccb77 -af01fc4ac396d9b15a4bbd8cc4fe7b30c32a9f544d39e88cdcb9b20c1c3056f56d92583a9781ddb039ec2eeda31fb653 -a8d889fb7155f7900982cf2a65eb2121eb1cc8525bbee48fae70e5f6275c5b554e923d29ebbd9772b62109ff48fb7c99 -b80edae6e26364c28749fd17c7c10eb96787053c7744a5cc6c44082ae96c5d3a4008c899a284f2747d25b72ecb9cb3d0 -b495b37503d77e7aafc226fca575e974b7bb6af2b7488372b32055feecc465a9f2909729e6114b52a69d8726e08739cb -a877f18b1144ff22e10a4879539968a01321cecde898894cbe0c34348b5e6faa85e1597105c49653faed631b1e913ec7 -8c235c558a065f64e06b4bb4f876fe549aab73302a25d8c06a60df9fad05843915ac91b507febca6fe78c69b51b597de -b4c31398b854ccc3847065e79329a3fdae960f200c1cce020234778d9c519a244ff1988c1fbc12eb3da2540a5fa33327 -b7bd134b3460cb05abf5aed0bc3f9d0ccbfac4647324bedbdf5011da18d8b85dc4178dd128f6ddbe9d56ea58f59d0b5d -92594c786c810cf3b5d24c433c8a947f9277fe6c669e51ceb359f0ae8a2c4e513a6dad1ae71b7ded3cdca823a51e849b -b178535e043f1efcce10fbec720c05458e459fdda727753e0e412ef0114db957dc9793e58ec2c031008e8fb994145d59 -b31da7189abf3e66042053f0261c248d4da142861bfd76a9aced19559be5284523d3e309ef69843772b05e03741a13fe -b190a8c1a477e4187fecff2a93033e77e02de20aae93dda1e154598814b78fdf8b9ff574c5f63047d97e736e69621462 -98234bd1d079c52f404bf5e7f68b349a948ec1f770c999c3c98888a55d370982bfa976e7e32848a1ebb4c7694acc1740 -99b9eeb33a6fb104bba5571a3822ebe612bf4b07d720d46bde17f0db0b8e8b52165f9b569be9356a302614e43df3e087 -a1e3915b0dd90625b424303860d78e243dda73eecd01cba7c33100b30471d0a1ec378c29da0f5a297008b115be366160 -975118bf6ca718671335a427b6f2946ee7ece2d09ccfb1df08aa1e98ff8863b6c8b174c608b6b2f4b1176fb3cbc1e30d -903cb1e469694b99360a5850e2ca4201cad23cfccce15de9441e9065eb3e6e87f51cba774ab9015852abd51194c25e57 -821f7ff4d0b133e3be4e91d7ff241fa46c649ff61fc25a9fdcf23d685fe74cf6fade5729763f206876764a3d1a8e9b24 -a1ee8db859439c17e737b4b789023d8b3ce15f3294ec39684f019e1ea94b234ec8a5402bc6e910c2ed1cd22ff3add4de -af27383148757bdf6631c0ea8a5c382f65fc6ab09f3d342a808ca7e18401e437cd1df3b4383190fdf437a3b35cbcc069 -8310551d240750cef8232cd935869bad092b81add09e2e638e41aa8a50042ce25742120b25fb54ebece0b9f9bdb3f255 -8b1954e0761a6397e8da47dc07133434ebe2f32c1c80cd1f7f941f9965acdf3d0c0b1eb57f7ff45a55697d8b804e1d03 -8c11612381c6be93df17851d9f516395a14a13c7816c8556d9510472b858184bf3cc5b9d14ded8d72e8fb4729f0b23ba -b413ac49121c7e8731e536b59d5f40d73a200c4e8300f8b9f2b01df95a3dc5fe85404027fc79b0e52946e8679b3a8e43 -8451e5c1c83df9b590ec53d1f1717d44229ed0f0b6e7011d01ea355d8b351f572866b88032030af372bd9104124df55a -8d0a5c848ec43299bc3ea106847ed418876bc3cd09b2280c2a9b798c469661505ed147a8f4ffba33af0e1167fdb17508 -a6aa97a1f10709582471000b54ec046925a6ad72f2b37c4435621c9f48026d3e332b8e205b6518f11b90b476405960a9 -97696635b5a2a6c51de823eea97d529f6c94846abb0bd4c322b108825589eba9af97762484efaac04ee4847fb2fb7439 -92fd142181fe6ca8d648736866fed8bc3a158af2a305084442155ba8ce85fa1dfb31af7610c1c52a1d38686ac1306b70 -ae3da824ecc863b5229a1a683145be51dd5b81c042b3910a5409ca5009ba63330e4983020271aa4a1304b63b2a2df69e -aecc0fe31432c577c3592110c2f4058c7681c1d15cd8ed8ffb137da4de53188a5f34ca3593160936119bdcf3502bff7c -821eac5545e7f345a865a65e54807e66de3b114a31ddeb716f38fe76fdd9d117bee0d870dd37f34b91d4c070a60d81f4 -91a02abb7923f37d9d8aa9e22ded576c558188c5f6093c891c04d98ab9886893f82b25b962e9b87f3bf93d2c37a53cb9 -99a96f5d6c612ee68e840d5f052bf6a90fecfd61891d8a973e64be2e2bdd5de555b1d8bffbd2d3c66621f6e8a5072106 -b1d5ec8f833d8fbb0e320ff03141868d4a8fff09d6a401c22dbefadbb64323e6d65932879291090daf25658844c91f2e -a06afd66ebc68af507c7cf5ab514947ca7d6ccc89fb2e2e8cb6e5ae0f471473e5fba40bb84d05f2c0f97c87f9a50cb73 -83de3ca182bcf1eac0cc1db6ad9b1c2a1ecd5e394e78add7faa36e039a1b13cb0d1d2639892489df080fbf43e5cef8d5 -adf77fc7b342ff67a2eddaa4be2f04b4e6ceaca8ea89a9fc45cc892fcce8ac3cf8646cfa5aab10ac9d9706ce4c48a636 -8509a430ef8dc9a0abc30ef8f8ccdb349d66d40390fb39f0d3281f3f44acb034625361270162822ef0743d458a82b836 -8350fc09e8617826f708e8154a3280d8753e7dbbcf87e852f9b789fdbeb10bf3fed84fb76edd7b8239a920c449e2f4b7 -a2e7a29da8391a5b2d762bf86cb6ae855cdfad49821175f83f4713dd0c342a0784beba98d4948356985a44d9b8b9d0f7 -a99c50a1a88b8efe540e0f246439db73263648546d199ef0d5bc941524a07d7e02b3ef6e5b08dc9e316b0b4c6966823e -b34ba55136c341f4ca2927080a07476915b86aa820066230903f1f503afebd79f2acf52a0bc8589b148d3a9a4a99f536 -af637be5a3e71c172af1f2644d3674e022bc49c393df565ea5b05ce6401a27718c38a9232049dd18cbd5bf4f2ce65b32 -a2972ba7bfa7f40c2e175bb35048a8ef9bc296d5e5a6c4ca7ab3728f4264d64f2d81d29dce518dc86849485ff9703d7d -8c9db203e8726299adeb331d6f4c235dc3873a8022138d35796fb7098887e95e06dcfad5d766ceaa2c4fb0f8857f37fa -a82bfbaa9a6379442109e89aad0c0cfc6a27d4a5db5480741a509d549c229cb847b46a974dde9f1398c6b3010530f612 -b2d8ef6e091a76dfc04ab85a24dbe8b5a611c85f0ed529a752c2e4c04500de5b305c539d807184e05f120be2c4a05fc3 -8c6ffc66a87d38cea485d16ee6c63ce79c56b64ae413b7593f99cc9c6d3cd78ef3fa2ab8a7943d2f0e182176642adadb -acbc92de68b2b04e3dc128109511a1cbe07518042f365d5634e8b651cb1ac435ea48eeeb2b921876239183096ef6edee -979c4e1165e0ecfa17ed59fb33f70797e000ddbb64acf5fc478cccde940451df051e51b6449c5b11a36afa7868af82e3 -a5a017c5a94952aeae473976027124231abe50460cec4db3ebeb8b1290525776be7c15d108b749c2a1e4b018de827915 -8b6922ab1db925eed24b2586e95f5c709b79d2408a8fa2a71057045ead3ebdd0cc72bee23d9064cd824166eda1e29318 -89a991087a0b5805fcc5c6c5f6ac27e100da0d3713645aa9c90114e68ca9f185f21155eb7645a2c6c0616a47291fe129 -ae6ef954c942cbfd37f8f2dc58a649e2584d6777e7eb09ae6992ccde283ac4f4ec39e3a5cda7f7c60f467fb308d37f08 -9335ca5ccac59b39eb2bcef09c54b778ebb690415ba13fe5c8e4b6091d9343a01cc9baa6228cefd8dba98f0710f714da -a0211c9328be2b46f90ff13614eeffb4c1285e55580db3874610653219926af1d83bda5b089fd37a7c7440a0f1d94984 -a82e097dfa782c40808fac5d8ed1c4fccf6b95ef92e22276fd8d285303fcf18c46d8f752595a658ee5294088b9dc6fc0 -ad108fcd0ead65f7f839a1337d520f5bd0cb665ee7100fc3f0563ff1d2959eb01617de8eb7a67c9b98b7b4892082acdb -b89e6aeabcb3ee3cbf12e3c836bab29e59d49676bcf17a922f861d63141076833f4149fe9e9c3beed24edfacdf1e248b -8477501bd91211e3b1f66c3bfd399ef785271511bc9366366ce95ec5ea95d9288ab0928a6b7887aba62de4da754d3eaf -aeec40c04b279096946b743ad8171bf27988405e1321c04894d9a34e2cbd71f444ff0d14da6cda47e93aa6fe9c780d50 -a703bd2d8a5c3521a8aad92afef5162aed64e9e6343d5b0096ca87b5b5d05e28ed31ba235ab1a626943533a57872dd01 -b52d9dfc12c359efb548d7e2b36ddedaefdec0ef78eda8ac49a990b3eb0ed7668690a98d4d3c7bec4748a43df73f0271 -af887c008bad761ee267b9c1600054c9f17f9fc71acfe0d26d3b9b55536bca5c8aebe403a80aa66a1e3748bb150b20ef -ad2f7a545ef2c2a2978f25cf2402813665c156bab52c9e436d962e54913c85d815f0ba1ce57f61e944f84d9835ce05ea -91a0a9b3cfd05baf9b7df8e1fb42577ec873f8a46bb69a777a6ac9f702735d6e75e66c9257822c781c47b9f78993a46b -939fdc380fb527f9a1ddecf9c9460f37e406cd06c59ce988e361404acbfcb6379f2664a078531705dbc0c375d724137b -8bbbe5d5a0d102b8e0c8a62e7542e13c8c8a6acb88859e78d8e1d01ec0ddff71d429fcb98099e09ff0aa673c8b399dc4 -b67a70e4ef138f48258f7d905af753c962c3cc21b7b8ae8b311a2356c4753f8cd42fdee09ac5ed6de31296ead88c351a -8d21539e7dca02a271ce7d16431773bbe30e6a03f5aff517132d34cdd215ad0da2f06aa4a2a595be489234b233e0852e -892ae11513f572cc5dc8b734b716bb38c0876e50e5e942631bb380b754e9114c34b0606740301e29b27d88439fb32071 -a8780dc9faa485f51b6f93a986bc4e15b166986b13d22ec2fefc6b25403b8b81c15cc9ac0025acc09d84932b15afa09b -b01af013360cd9f2bb9789a2b909c5e010fe6ff179f15997dee1a2ba9ef1ccec19545afdecfcb476f92fcdd482bb2b5a -b5202e5d5053d3af21375d50ad1ccd92538ef9916d17c60eb55c164767c3c74681886297b6f52e258c98d0304d195d3d -8f6adbcfbb0734bf3a4609d75cf2e10f74ed855a8b07cf04ac89a73d23b2e3e5cf270a1f2547b3d73e9da033a3c514b0 -8abe529cd31e4cb2bd75fa2a5e45bd92cbe3b281e90ffc7dea01ba0df17c9a3df97a3fde373cce5d25b5814cf1128fed -b8bbf51187bb3bb124da3870e2dfecb326f25a9383e5cc3323813487457010b9055811669c3da87105050825dc98a743 -a5c83875fe61ebbdd3fd478540d7e5a1ad0f8c790bad0b7dd3a44831e2c376c4fffbc6b988667afa1b67bfaa2dbbb256 -a0606b3062e4beba9031ba2a8e6e90aa5a43ba7321003976e721fd4eedb56486f2c5b10ba7a7f5383272f4022092eacb -b485cc5e001de6bd1bbc9cd8d777098e426d88275aaa659232f317352e1ddff3478262d06b46a573c45409bc461883e1 -916449580b64a9d8510e2f8c7aee0b467a0e93b11edc3d50725bcbc3ca53c2b8bb231fdc0fc0ed5270bf2df3f64750d9 -b2e687caa9f148c2b20a27a91bada01a88bff47faaf6ed87815db26bb6cdd93672199661654763a6b8b4b2012f59dcca -b6933f7f9dabc8fb69197571366ac61295160d25881adf2fcc8aaabc9c5ed7cf229a493fd9e2f1c2f84facd1f55fee84 -b01eb8b2cf88c75c3e31807cfc7a4d5cafded88b1974ba0a9d5aaeda95a788030898239e12843eda02873b0cabe30e2b -a3ca290fa6ce064514a3431b44ecdb390ef500629270202041f23bc2f74038147f338189c497949fb3126bae3a6e3524 -93b0f8d02bd08af74918b1c22131865aa82aba9429dc47f6b51354ba72e33a8b56684b335a44661aa87774931eb85974 -81eebeb9bd92546c37c98e0a5deba012c159f69331a89615cf40c5b95c73dcdbf3ceb46b8620d94ff44fcdad88020c1e -b350e497932382c453a27bb33d2a9e0dbadf4cd8a858b6b72d1f3a0921afc571371e22b051b97da3bb08694c4ca3a4e8 -8c7052f63ba16f14fa85d885aa857d52f04b3a899a4108493799c90c0410de7549be85bec1f539f1608924668df48e5a -b397574d1fb43de0faaea67d1d9348d67b712b1adce300d6dc497bca94e0994eef8707c285c5c9ac0a66022655a8420b -a934661d2168ae1bd95b1143c2e5c19261708aeb795abad8ec87f23dc1b352fa436de997ebb4903d97cb875adb40dc2b -acf535fa1b77255210e1b8975e0e195624c9e9ffd150286ccd531a276cadc12047a4ded6362977891e145a2bd765e6b9 -8cc32356015d7fd29738dcc13c8008cdbe487755dd87d449ab569c85d0556a1ec520dbce6c3698fc413d470c93cb0c92 -8787c7b3b890e0d3734ac1c196588cacf0a3bde65e2cf42e961e23dbf784eef14c07337d3300ed430f518b03037bd558 -99da90994030cbc2fb8a057350765acac66129a62514bbd3f4ec29d5aab8acdd5f4d69ca83efe7f62b96b36116181e79 -a306424f71e8b58dfa0a0564b2b249f0d02c795c30eee5b0ad276db60423210bba33380fb45dbe2c7fedd6ee83794819 -b207a35d31ce966282348792d53d354bbd29ac1f496f16f3d916e9adbf321dc8a14112ca44965eb67370a42f64ca1850 -89e62e208147a7f57e72290eefccb9d681baa505d615ca33325dfa7b91919214646ca9bdc7749d89c9a2ce78c1b55936 -ac2d0ec2b26552335c6c30f56925baa7f68886a0917e41cfbc6358a7c82c1cb1b536246f59638fb2de84b9e66d2e57eb -8f1487659ecc3b383cebc23a1dc417e5e1808e5c8ae77c7c9d86d5ab705e8041ce5a906a700d1e06921f899f9f0ee615 -a58f1d414f662f4b78b86cae7b0e85dfddae33c15431af47352b6e7168a96c1d307d8b93f9888871fc859f3ed61c6efc -94f3626a225ac8e38a592b9c894e3b9168f9cf7116d5e43e570368ee6ee4ab76e725a59029006a9b12d5c19ddce8f811 -b5986e2601ad9b3260e691c34f78e1a015c3286fdd55101dcef7921f6cbcc910c79025d5b2b336d2b2f6fd86ee4e041e -b6e6798ddd0255fbe5cb04a551a32d4c5d21bdfd8444ff2c879afe722af8878d0a3a2fe92d63936f1f63fea2d213febf -86bea9bfffef8bc11758f93928c9fdfae916703b110c61fa7d8fe65653f8c62c6fecd4ff66a1f1a7f3c5e349492e334c -9595a4606284569f4b41d88111320840159fd3b446e00ec8afd7ddaa53dd5268db523f011074a092f8e931fc301a8081 -83b540a6bc119bf604a7db5f6c0665c33b41c365c12c72ca4fa7b0724115bbb0ff1ae38532c3356e8bb3ac551285929f -92c6daf961ca4eb25293e1794cf85cda4333cf1c128207af8a434e7e0b45d365f0f5baaefc4ebd5cd9720c245139c6e2 -b71465f3d7dba67990afc321384a8bb17f6d59243098dbed5abd9a6ffc7a3133b301dd0c6ca3843abbaa51d0953abbed -b15d93482d2ee5b1fec7921fcc5e218c1f4a9105a554220a4fb1895c7b1d7a41f90bbf8463d195eecf919fcbe8738c51 -a79c98e70931ffd64f4dcf7157fbae601a358261e280fe607eb70cef7d87f03efa44cf6ba0f17fbb283a9c8a437d2fdb -9019d51a6873331f8fe04cb45e728a0c8724a93d904522a9915c748360ddf5cdbf426a47b24abf2005295ed2a676cbf0 -b34cc339fec9a903a0c92ce265e64626029497762ff4dcaaf9bb3994298400ce80f4fb7dbe9ec55fe0c4a522c495cb69 -8fda9be7abfe3b2033cad31661432300e2905aef45a6f9a884e97729224887a6ec13368075df88bd75c11d05247bef15 -9417d120e70d6d5ca4b9369cba255805b5083c84d62dc8afec1a716ead1f874c71a98ad102dac4224467178fe3228f62 -a0a06b64867eebb70d3ce8aaa62908a767fb55438a0af3edf9a8249cd115879cde9f7425778b66bb6778cb0afeb44512 -a44309d3e1624b62754a3a4de28b4421f1969870f005ac5dc7e15183fa5b3ad182bcd09cca44924e03fbdb22f92f8cf8 -aea80f1c3a8fc36cfb5c9357d59470915370b2bec05f51f1d0e1d4437657e2303ba2d1ac3f64cf88f2df412dff158160 -b3f1557883d91b24485123d2f3ae0fce65caa533c09345ae6b30d2ac49953acee61c880c57975be7b4f5558d3a081305 -b52cb1e56f0d147cfb58528b29c7a40bab7cfc9365f2409df7299bfc92614269ff9de3cb2500bbc4909f6a56cf4b9984 -aa4f8fd0f5f87c177ee7242f7da76d352db161846cd31523a2100c069d9e4464170eec0bffc6d4da4f9e87017b415dbd -b5b61f52242985c718461a34504f82495d73cbb4bc51f9554b7fe9799491f26826d773656225f52a1531cd5bd6103cde -ad12ba9697804ede96001181c048f95b24ba60761c93fb41f4b4a27e0f361e6b1434e9b61391bacaf0705fdaa4a3a90e -9319286cbda236f19192ae9eb8177e5a57a195c261082ba1385b20328fb83ed438f29d263dddae2f5278c09548830c4a -88b01ee88c3a7ae2c9f80317dddbaa2b7b0c3a3c23828f03ff196e244500410c9ac81c2e2d3e1f609d4b36ee1732738c -8e31f30600a9d629488d44a008c821c3c57f13734eaee5a19f0182a2de9e538fff7d982980d7fcc725c969f29f7c2572 -b215740eea98b4bb14197a803a8975700ad2f25a25ef3628eae10166d56c823301f6dd62ce3f9ebf2d42d1f33d535004 -8fb0fdb253d4bcc6693642779be13a5b816189532763dfd7da868cfacfdb87cb5ebe53b18b69dfd721f8d4baf3c1d22d -8cdd050a447f431ff792156d10381aaf83c6634a94b614dd5b428274538a9cc1f830073533b4fd0a734d6dd4f8d9c4ce -81b01ee8c72ac668ad9dd19ead2d69cac28c3525e613e036e87aa455c2da9651cc8fcc97c451a8c8a071a4eb69623cd1 -8d9e02dc9ac83f861b3745bd69216232144c47cb468a7dbc49083ed961f978e34265b3f42c400339120bdc4644fe5711 -89e9410455b34cba9db0a5ea738e150fae54dd000d61e614f3274a6c8102ba7cd05b0936f484a85711ad9da7946f51ea -91f9d4949678f8e6f4b8499899818bdd0f510da552b5d79d8e09bf3b69d706ab36524b5e86d3251318899b9223debf6b -8b3c38eec7e1926a4be5e6863038c2d38ab41057bcfa20f2b494e9a0c13bc74c3a44c653402eb62a98e934928d0ebccb -a5cfe465bfbf6e8bfbd19d5e2da2fc434bd71acd651371087450c041aa55e3c4f822361e113c6c3d58646ed3ba89d6da -918665b8810bcb8d573ca88b02a02c62eaa5a4a689efb5c564b0c9183f78144e75d91fd1603e17d2c77586cbe5932954 -997dace0b739aeb52ba786faae5bdf1d48630a90321f9ceebfa9e86d189a3d79d7b04e459ac8e4adcfe83a5ce964eb1c -a5a1ca9f0ccc88017a616d481d912aab3f0e154b673f1131c5d9c9c3f5f147d25b6392b2c31e49f7bb7eb2697d05dbec -a76e99bec509eff01bf6767a06ac97ebc6671cb58bc3d4acc2803580a874885453dbba2e1bba26e45f8d2bda5f688860 -956c1362c8123c5d9ebff7049e851235d69fa645f211ef98e2b6564f2871114a12224e0ec676738d77d23c709dd28a6c -885efede83b1a3e96417e9f2858ab0c7a576fc420e8f1f26cabf3b1abeec36bcaa63e535da177847f5e0afdb211bf347 -affca2257f292a2db52f8b1bab350093f16f27ef17e724728eeaec324e2513cd576f6d2e003cc1c6e881334cb2e8bf22 -8dac963d34dcc9d479207a586715e938c232612107bb2d0af534d8da57ad678555d7c1887fadca6551c4f736ffa61739 -b55e600a6bbde81f5a0384f17679d3facb93a7c62ca50c81a1d520cf6e8008ac0160e9763cb2ca6f2e65d93ca458783b -9485e6c5ab2ebfb51498017e3823547b6ab297d818521ceac85cd6c3aa2d85ae075a0a264ae748fc76ce96a601462ffa -b4d8abca786c0db304a6634fba9b2a40d055c737ed0f933e1739354befdae138dae3c8620a44138f50ebeaf13b91929f -8bde7ca39c7bda95b1677a206b16c3a752db76869ea23c4b445c2ff320f2ee01f7358d67a514982ee3d1fb92b7bd7229 -8f8cd0acc689b6403ee401383e36cae5db2ff36fc2311bbadf8ebb6c31cbcc2ca4ffac4c049da5ba387761ef5ec93b02 -a06f42d5f69a566ff959139c707355bbf7aa033c08d853dce43f74a9933e6d7b90e72010ef3fcb3d12e25852343d1d31 -b10ece7cf6b69a76dba453b41049db0cdf13d116cf09c625312b150ee7437abd71d921eda872403d7d7ce7af1e6dccb7 -a3d820318e0f3b54fba7a4567912a82d6e6adf22b67cfc39784683a8e75f77538e793d9708aae228fa48a71abb596195 -8758fad55b68a260bea3bd113e078fd58d64a92f7935ff877f9f77d8adc0994b27040cfc850126c7777cfdfb2428a3e5 -b504913ee96c10f00b848cd417c555a24bc549bf5c7306140eff0af2ada8cb5e76bed1adb188e494332b210fbf24e781 -a00e019a40acc7aab84c1cc27c69920ad7205c2a3dc9e908a7ef59383695c9cb7093c4bcbc2945aab2655119552e3810 -b1000b4c4f306672e39d634e5e2026886a99930d81b8670a5d4046db9621e44997c4b78f583374a09c60995f18a6fd4f -a6c5053c4e748540ad2b622c28896c9d4ca3978ca4784ac8f09da5314a245f5cdc5d6203c84e6e0bcb3081829720a56d -8e37e67a70205a5c7da95de94ac4d0ebd287c1c9922d60c18eec1705030dfcbf74ae179e377c008bf5a8bc29c7c07cce -a66bd7c0243319b553d5cb7013f17e3504216e8b51ba4f0947b008c53bcb6b4979286b614a4a828ee40d58b5ef83e527 -97e2110b0fb485508a2d82ecc2ce1fbe9e12e188f06c7ef2ac81caeeb3aca2c00e5e6c031243b5ca870a9692e1c4e69b -8734ce8bbc862e12bea5f18d8a8d941d7b16a56ef714792fed912ca9c087497e69b6481fdf14efe1f9d1af0a77dac9b1 -b441dddac94a6a6ae967e0e8d7ab9a52eb9525fb7039e42665e33d697e9a39c7dcef19c28932fb3736e5651d56944756 -918b8997f2d99a3a6150d738daed2ff9eb1f5ed4a1c432d18eab4a898297f7ffbffd1e4ae9037acf589b1cd9e1185ef6 -a0247b8ac4d708cf6b398dc2d5c127a291d98e8bef5f195f820c4fddb490574ba4f62647c2d725237a3e4856eec73af0 -b45636e7e0a823c2a32e8529bb06fcccfd88e9964f61201ee116279223ed77458811d1b23bcb6b70508d16d4570a7afb -a99c1188fa22b30b04fda180d2733586ea6ef414618f1f766d240c71f66b453900d3645541c019361027aebe0a0f305f -b4c2f758e27fe233f7e590e8e0c6de88441164da3fcd5211a228318d3066dfdafc1d40246dd194f2b597f6fe9600b3d7 -972530819445b11374c3043d7855d5f1d3c4922b3b205d0bf40162c51605375dd0b61f49cd7f3d39a533a86a13005989 -992b533a13e5d790259bfdfdf1074f84a5e5a0a0d7be9cd6568cdc1662524f1a6666a46da36cea3792ba6707850f4d86 -9875d130457e04dc6ea2607309bfbb900ad3cb5f3e0574f808d27b20cbf6f88389d87dca19998680c5bc30d1df30a41b -adea8494a69e83221edf360ab847272b5c47eba5404665fb743d98c0682732c30085ae3ec82bc1e8e4aba8454c9b1849 -887d4c624ce05e224216c5f6fa13c5741012ac33330bc291754782f0bfe668decdc98c0e43a1ce28323effe6b639f477 -ab6b167aeb5e93ab155990b94895e7e7ff6dea91384854a42cc8a3b9983495b4b3c33ab1b60b2b6450ccf0418fada158 -a7588d0b7c6a6bc32fc474aa0f4e51dfb8e6e010346ad32c59d6f99e6f0522424111a03a4f56ba4075da8009ee7a63e9 -94d645cc3936db1563568193639badfc064dd5bda8d0631804ee00b09e141b200619e07506b5a8225130541436327194 -8d695c03cc51530bdc01ee8afcd424e1460d2c009e1d7765c335368e5c563cf01a2373c32a36400c10e2bf23c185ed19 -ad824a0a7ed5528e1f9992cbb2050785e092b1ea73edd7fb92b174849794a5b04059e276f2941e945bc0f3e46172f2af -ad6ed2af077a495d84f8eeed7d340b75c0d1c8b7c5a854dfc63ab40a3d0c2b0d45016d30b3373a13f0caae549f657976 -82454126c666023c5028599a24be76d8776d49951dfe403ebf9a5739b8eb2480c6934a34010d32cd384c91c62a9aa251 -b57070006793eca9fa2f5237453ed853994ad22c21deb9b835e1fb3fbc5ac73aec265a4a08de7afae1610dc8c42b7745 -ad94667c791cf58875eb77eb17b6ad02de44e4ba2ddc2efe4d0ff22a5e1a090c670354437847349fd61edc4ba5606f07 -b2aac0c345ffc00badaab331c12a22019617b004d32c099c78fa406d683744d96d51d1237ad0842f9f54655186f8f95b -8fed51076cc939b354e3b69034a594e6c9c98425ccf546154ab087a195375128444732388d2eb28f82877de971ec2f58 -8e521c0093deb9dff37888893db8ffebc139984e7701e68b94d053c544c1be0d85f0f98d84b2657933647b17e10a474c -a2c6c9a307aff9b1dea85f90fa9e3b8057fd854835055edeb73842a7ef7c5ae63d97c51fec19dd8f15d696a18a0424a6 -a3390b25a9c11344ed1e8a0de44c848313026067a0f289481673c2c0e7883a8fc9f6cab6ccd9129729a6d8d0a2498dc2 -82770c42b1c67bbd8698c7fe84dd38cc5f2ad69a898097a33b5d7c5638928eb1520df2cb29853d1fa86a0f1bcc1187e8 -a6fdf7a4af67bc4708b1d589135df81607332a410741f6e1cc87b92362a4d7a1a791b191e145be915aa2d8531ee7a150 -aecac69574188afc5b6394f48ba39607fe5bb2aa1bd606bc0848128a3630d7d27101eb2cea1fb3e6f9380353a1bb2acc -a23fd0c52c95d0dffb7c17ec45b79bf48ed3f760a3a035626f00b6fe151af2e8b83561d0b9f042eaae99fde4cbd0788d -a5f98068525cdd9b9af60e0353beb3ac5ac61e6d3bac1322e55c94b3d29909d414f7f3a3f897d5ae61f86226219215c6 -b2a4d724faac0adf0637c303ff493a1d269b2cdbec5f514c027d2d81af0d740de04fb40c07344e224908f81f5e303c61 -adeadb3521e1f32ef7def50512854b5d99552e540ec0a58ea8e601008de377538c44e593e99060af76f6126d40477641 -a18b7fc2fcd78404fed664272e0fef08766a3e2bc2a46301451df158bd6c1c8aa8cf674dd4d5b3dedfaceb9dd8a68ae3 -83bcfb49313d6db08b58c6827486224115ceef01ca96c620e105f06954298e301399cdd657a5ff6df0b0c696feec1a08 -8c94391eba496e53428ec76dfe5fa38f773c55c0f34a567823316522a0664a3d92bff38ec21cf62ac061d7d1030650c5 -b1fa196ccfd7d5f1535b2e1c002b5cde01165c444757c606b9848bc5f11b7960973038fb7cc3da24300fc1848e34c9af -b139f6c6449449638de220c9d294e53fc09865a171756d63bbf28ec7916bf554f587c24bddf51dd44372d15260d8fe25 -b716242299d4ee72b5b218781b38ca5e005dcf52333364f85130615d1dbf56216af8ee2c9c652d82f7aab5345356538c -9909f24e4ad561aa31afd3a3b9456b2bd13a1d2e21e809a66af62fec5f95b504507ac50e81d2233da2b223f5443e7585 -ae863530a02cf3a757f72b945c8c0725d9f634d2ff26233478d1883595ff9a1eef69e8babffdbfa161452fc204f5b5a1 -8eb82bde283b6a6e692b30236cbf41433b03eda8dad121282772edd56f144b1ebf5fb489d18c6ce8776135771cbb91e2 -9296141fadf8dadc885fff4999c36efa25ec76c5637a8300a1a7dc9cf55bcedfe159e0ef33f90eee9be8c4f085734e10 -b6c07f2e6fcbd6c42a8b51e52fbcd5df3aa9f7c3f0b3c31021de1aec2111d0a1c36b5ab489ba126af44fd43cf31c2594 -a70ca669c357535b363d16b240fd9cb9c5ba1b648510afc21218ea034e9bf5f22717ae31ff43ef89dded95b7132fa58f -b350721f8f6b4d164fd08aca30cd4dece9b4a81aed0ac12119c9399bab691d5945814306f9a61f0106b76d4d96f7b9d6 -b6886076c9d8c344bf3fb6975173d00fa82866012894f31c17e6fc784fbc0dd2d24d6a1cddd17f7379c74566a23219aa -87636e4a83ceadc170a4b2517b19525c98e2163900401996b7a995b2f3da8d6ba2ab92f909eade65074fac07cf42f6fa -8ff61d87c4699a067a54b8540e8642f4c7be09d3783ec18318bcba903c6714fcd61be69165e07e1ca561fe98e07507de -85485d6b569ac20e6b81a9e97ef724e038f4fee482f0c294c755c7b6dad91293814f143bfcfc157f6cfa50b77b677f37 -a49256cb1970cc1011a7aed489128f9b6981f228c68d53b1214d28fbcfb921386cc7cf5059027e667a18073efa525a74 -87bc710444b0c3e6682d19307bedc99c22952af76e2d851465ee4f60e5e1146a69f9e0f0314f38a18342e04ece8e3ed3 -a671a6cabfd19121a421fdfe7732eccbb5105dfb68e8cbcf2b44ae8465c99e78c31b99730beca5bc47db6fc2f167203a -a2f3270c184629f6dfc5bf4bdd6e1b8a41e8840a1e4b152253c35c3d9e7ab4b8e3516dc999c31f567e246243e4a92141 -b9795a5a44f3f68a2460be69ecacdbb4664991ebbedffed5c95952147ad739e2874c099029412b9653d980a2d4307462 -959053faec9a966dd5a4a767a3154e4b8e4f56ca540ae53e373c565dda99fb626f725e5a5e3721c82918f8c5f2e9e0a3 -b3ef9d6a1b3cd44a3e5112819fa91cb8a7becc3f5b164c6f759f93171d568497b01c8e743f4727b341a1296a0dbadf4f -b852dfdfbe2b8c77d938fad45f00737e14eacf71d5fecbb3e4f60052ec9efb502c38c1fcecaf71da69eabe8b33852a67 -921c7007f26bdd4139e919dfe27d87b489a0bc5bd6fb341e949e4451f14c74add0489b108c9c9666a54c5455ac914a9f -86b63d73ba31c02e5337f4138e1684eccdc45ab5e4f30e952fb37d638b54ecec11010414d7a4b7aa91f7cc658f638845 -853c55e0720b66708a648933407795571fc11ad5c234e97f92faabce9e592983dfb97a1705047ee803648ecf9fbb2e5c -995fe7d1dc09bb0c3c3f9557c4146534778f5ea9c1d731c57440fdcf8094f82debf19090b5d23298da1ed71c283b3ae5 -b9c49c911a0c4d716b7baec130f9e615bfa7d504aa8766ed38878a93c22b1f6353503d4f7f425d4902239fb4689429df -80504d964246789a09dcd5c0298680afb6fe50bca3bb9c43d088f044df2424a1828de10e0dbdc5c0aac114fa6d9cf5d1 -90249351f109f6b23a49a610aaa3b2032189fd50e5e87cdc3b20f23ed4998af3a8b292bf9fbab9bd1cbe0a1371081878 -abb5f0148850f0d80b429c2b9e0038772432340ef0862ccb5dcb7347026ca95bf9a5857f538e295aebd3a6a5027adb4c -b92ac9c0f7e73150798348265e5f01f3c752480c72613c6894a95e9330bba1c642b21b9cbd8988442b5975476634b4fa -af3fbcc825abd92c6d7ea259467f27045e288f27a505e6a3c9ec864aa08fcaca0d4123034513dbd4c82d4814075708ab -a738232a66030e0e9c78e093a92fcc545b10e62fb0ecb832bbbc71471b28eb6ec422a498c2402e2c6d74983df801e947 -ae60194ce2035edd1af253b9eefbb4b1b7609c9678256c89c3cb076c332a9f4442c3441ad2ecc9d73265359bdadc926c -8b2fd55e686f16725fc0addb4065f696275852320b03221fd22889825d66fae5bb986b03c47452e32b3a32c1fdfc8dfd -8e2e1a36673b7729b07e7bc5014584e1c03e9552f7440fbfda0a6a7f41953947fcdf8d666f843bfc03dcca5b06a14318 -95a3df04368c069f3fd32a20b627c5f043e952167c9e80bf5914bbf2086879909c60e089bbd488725ab977c0e6051728 -9856403b2211d0152d4eec10db7ec34c16ac35170714b75af3ebc398a676c171b24b6f370361de0f9057ba444293db14 -a2cb484b758af5fd8e2baca7f0406f849c71255e58ef110d685cd0c1137893a25d85a4d8582e3ced7dd14287faa95476 -b0f697b6a42f37916b90ab91994ae4a92c96dc71e4da527af41b9d510bc2db5a9b4f29183a758074b6437a1e62b2d1d7 -b39c49266aae46f257b7ae57322972fb1483125298f9f04c30910a70fe5629dba0ec86b94cc6ba16df3537a55e06f189 -86cd5595b5b769dfd9ceb68b11b451f6c5b2e7a9f6f6958eac8037db1c616e8a9defb68a0d6c2287494d1f18076072c1 -b462e8fa9a372d4c1888fd20708c3bed1cb00c17f7d91a0481238d6584fbbf2d238e25931154f78a17296a12825d7053 -a5ef28286628ba509bac34c9f13158d0013239fdca96b5165161f90b89d6e46295822ebdf63f22d7739911363a0e0e86 -a629a95a24e2545862b41a97ecba61b1efa792fd5555dc0599c175947e9501bffc82b05a605fd5aabc06969ccf14fff4 -af83467e4b1f23a641630cc00c38d4225ff2b4277612b204d88de12a07d9de52fb4d54a2375a7fd91eb768623c255376 -a630f29fb2e9a9e2096d7f3b2f6814ee046ebc515f6911d4bc54ad8a5a821a41511ff9dcfbe3176f35c444338ecd0288 -950dedc11bd29e01ba9744bec681ad9462127c35e9fcadfacc9405ec86b985a1b1c4f9ac374c0f1fa248212e5e170503 -82e8e7be8011ee0fd9c682d26a0ef992d0191e621d07fd46a3a5640ef93a42e1b98a33cad1f8017341a671d28caebb03 -a075860554e712398dac2fb0375067a48d0e4ca655195cefc5ccb1feb8900d77124aa52a12e4f54f7dab2a8f1c905b5b -81d2183d868f08714046128df0525653a2dc2ff9e2c3b17900139c9e315b9f4f796e0fb9d1d8cbadbaa439931c0e0879 -81fb1456969579515a75fb66560f873302088cde2edc67659b99a29172165482ca1f563758c750f00086b362ae405322 -a13c15ab19203c89208c6af48d2734bb0873b70edb660d1d5953141f44db9012528d48fb05aa91d16638cbda2ca8f0cc -8ba46eef93e4ec8d7818124a0b9fcfe2bcf84a98db3545d2b3d0192cfadc81fc667dcc22ab833c3e71508d0f3c621fe4 -b9bd60d2266a7d01e1665631a6ed6d80ffc0cd7f088f115a5d4ea785c518a8f97d955e2115b13c4960302b9825526c92 -b26fa4e87142150250876083a70c229249099331410f0e09096077fdf97b31b88dc57a3e3568d2a66a39af161cf5dfec -b9d147564124728b813d8660ba15fa030c924f0e381ad51d4e0cf11cc92537c512499d3c2983dd15f2e24ca166070d70 -b6fb44e1a111efb3890306fa911fafda88324335da07f7de729b2239921ef15b481630a89c80e228bec7ab6444a0b719 -a6cd9c7acac052909ef0cf848b6012375486b59b7bac55b42c41f0255b332c1d45a801f6212d735be8341053bd5070b9 -864258d69234786af5de874c02856fc64df51eff16d43bfb351b410402ab28f66895aec4025e370a4864f19ff30fd683 -84370fa1243b64b3669dd62e1e041ff9bd62810752603486aac3cba69978bd5f525c93cbc5f120d6f2af24db31ec3638 -b983c2cdc1a310446de71a7380b916f9866d16837855b7d4a3a6c56c54dab3e373a6fc6563b8309dc3b984d4e09275d6 -914f8587f876470f7812fa11c6f67e2dd38bf3090e8928e91fe2fe5595bee96cbe5f93d26fdced6b4e7b94f75662b35d -8b47bcb111d91aa3d80e4ceef283824aa00d1faeb6fe4111aecd9819869c0e1f6f4b6fb2018aebb07a0f997412cda031 -95b2befa98f9992450ca7ff715ae4da8c36dd8adcfef3f0097de6e3a0b68674b05cbf98734f9665051bb4562692641e0 -8bcd1651a2bfce390873a958e5ff9ca62aac5edd1b2fd0f414d6bcf2f4cf5fa828e9004a9d0629621b5e80fbbd5edb90 -af79bed3c4d63239ac050e4fa1516c8ad990e2f3d5cb0930fc9d3ce36c81c1426e6b9fe26ac6a416d148bf5025d29f8b -881257e86b7ab5af385c567fde5badf67a8e7fff9b7521931b3ce3bac60485c0fe7497339194fb7d40e1fad727c5c558 -a1b40b63482cd5109990dfb5a1f1084b114696cbbf444bf3b4200ab78c51dad62c84731879ea9d5d8d1220e297d6e78a -b472212baa2a31480791828ca5538c3dcc92e23f561b0412f8cc9e58839d1625ddcaf09c8078d31ac93470436843cd74 -8f516d252b1863cd3608d852a2857052bb2a3570066d4332fa61cb684b10ac8d1a31c8d32f2a0d1c77eee2ad7a49643d -8d20b75c51daa56117eda2fd5d7a80a62226074b6a3ff201519f2054eecfeff0aa2b2f34b63bea3f53d7d0ce5c036db9 -8282f433229e7948a286ba7f4a25deb0e0a3c5da8870562c3646757bef90ca1e8d3390b0a25b3f2bf45bf259a4569b77 -8a2dbf4b55cc74f0a085d143a88ebc8c2a75a08eab2703d13a00b747eaddc259a3dd57f7330be938131835a6da9a6a68 -aa0bc51617a938ea6a7b0570e98b8a80862dd9e1cf87e572b51b2a973e027bcd444ef08e0d7b5dee642e0da894435e91 -aa7319ca1ac4fe3cc7835e255419eeb7d5b2d9680769cc0ca11283e6147295db75713b71a9312418a8f5505cd45b783d -ab3f9c465663dc90fae327a2ee9cb7b55361a9b6fbe713540a7edd3cff1c716802fb8ad4dd8fb0c945d96b3b44c5795b -913a2ae88acffab12541fc08920ee13ab949f985a117efe9a5b2c76f69f327f60c5b5ad3fa5afa748034ac14298fc45a -9008f044183d2237b723b235953e4d8b47bec6a7b300d98075555478da173b599ba9c7c547c2f111ce1fae5ac646e7a3 -a26b4cc42b353e1c18222d2e088d7f705c36be12e01179db440f10fcfa9691d31fc4fc7e7ee47876f1624e6d44be1021 -995e75824f322294336bfa2c5d1a319f0d77f6a0709beabaf1b43015d8a78d62447eab907349524734170f0294d1ca7a -8b96f04a19dbe4edc71d1f2c6d3475ae77962e070ec5797752453283c027c6b29b6e58e8b7eb5c3f9770557be7e80b67 -8621459865234734bcfaa492ca1b89899525198a7916ccc6f078fb24c8bf01154815bb5b12e1c3d0a10bd4f1e2ea2338 -ab52174541185b72650212e10a0fe2e18ccfd4b266a81233706e6988c4af751b89af87de0989875f7b5107d8d34c6108 -966819d637bdd36db686be5a85065071cf17e1b2c53b0e59594897afc29354ecba73bf5fc6fa8d332959607f8c0a9c27 -b7411209b5ab50b3292c3a30e16f50d46351b67b716b0efb7853f75dc4e59ec530a48c121b0b5410854cd830f6c4b3ea -a5dc04adbadce0af5dc1d6096bad47081110d4233c1bf59a5c48a8e8422858620f4be89bf1f770681be2f4684ee4cce7 -af77a8f83cffb5f8d17be0ab628dedcad63226c9b13ce4975fb047f44bfef7d85e7179aa485abb581624913eddbb27ec -82bf28dc58c893c93712ce297cc0d64f70acb73a641cb4954ccf9bf17597f6d85eecf5a77c8984ab9afbe588562a0ee9 -988a7cef9a178e8edb91f3ec12f878fd68af2ac0762fa0a48a2423e24f765ed8f7837429fd8bc0e547e82e6894e63008 -a5d5969311056d84b3ee87f49286fac0bd9a7220c196cea4f9dced3b858dcdba74718eab95b38bd5d38d2d1184679c98 -af4d51b3ded0aaad8f12bef66c0616e9398fc42618852ac958e6ab2984a720a6111ac55b249d7e4523051740e12b346f -ac635b4a49f6fbb94a5f663660f28431ba9f7c5c18c36ebc84fd51e16077de7753595f64619b10c16510ecbc94c2052d -ae25eb349735ced1fe8952c023a9b186a1f628a7ddf1a4b6f682354a88f98987ac35b80b33189b016182f3428a276936 -ae3ab269690fdd94134403691ba4f5ed291c837c1f5fdc56b63b44e716526e18abb54f68ca5d880e2fb7bea38e74c287 -a748b03b2bd3fbc862572bc4ddc0579fa268ee7089bcfd0d07d0c5776afcd721302dbb67cb94128e0b1b25c75f28e09a -8f09a2aaa9ba3dfe7271f06648aba9cc1ea149e500a7902d94bb9c941a4b01d1bb80226fd0fd2a59ad72c4f85a2a95d0 -853d55ad8446fd7034e67d79e55d73a0afcb5e473ed290e1c3c7aa5497e7f6e9bbf12d513fc29e394a3dc84158a6d630 -b1610417fb404336354f384d0bf9e0eb085073005d236a0b25c515d28235cea5733d6fbd0ac0483d23d4960064306745 -86de805b3d4f6fbb75233b2cf4d22fcc589faa2ac9688b26730cb5f487a3c6800c09bb041b2c6ab0807bfd61b255d4c9 -893b38c72cf2566282ee558d8928588dca01def9ba665fcb9a8d0164ee00dedafbf9d7c6c13bcc6b823294b2e8a6a32c -8e50de7a70ac9a25b0b5cf4abc188d88141605e60ce16d74a17913a2aff3862dec8fbbf7c242cf956f0caae5bcc4c6bf -b5cf09886a4fb4ce9ea07d1601d648f9f9d1a435b5e1e216826c75197cd6dafd6b2b07d0425a4397a38d859a13fdb6dc -859dc05daf98e7f778a7e96591cc344159c1cbe1a7d017d77111db95b491da0a9272866d2638a731923ca559b2345ebe -8ff1792f77ecdfbd9962f791a89521561c7b82031a4e53725f32fe7d99634a97b43af04cbf3e0b0fdff4afa84c49eb99 -81e2cd8a221b68ae46dd7ce97563bd58767dc4ce1192b50ff385423de92206ff585107865c693c707e9d4ed05f3149fb -8fce7da7574e915def0d1a3780aa47ef79b6d13c474192bd1f510539359494ddc07e5412f9aac4fc6c8725ade4529173 -ac02f5df60242734f5ead3b8a62f712fefdb33f434f019868a0b8ddf286770244e2ddfb35e04e5243ba1e42bcd98a6a5 -a8d69783349a442c4a21ecb3abd478a63e2c24312cb2d2b3e10ea37829eb2226a9b8d05a8c9b56db79ffaa10d1f582d1 -b25b5cca48bf01535aba6d435f0d999282845d07ac168f2ca7d5dba56ee556b37eab9221abdb1809767b2de7c01866c1 -8af7e1d1f4df21857d84e5767c3abe9a04de3256652b882672b056a3ab9528e404a8597b1ad87b6644243f8c4cd3799f -a6718308dfa6992ae84fcb5361e172dbbb24a1258a6bd108fd7fc78f44cc1d91be36e423204a219a259be4ab030f27ff -b99cbe3552c1a5259e354c008b58767c53451932162e92231b1bebfc6a962eb97535966a9bd1dfd39010dfcda622d62a -a8458f6b8b259581f894e4b5ce04d865f80c5a900736ca5b7c303c64eaf11fe9cb75e094eece0424ba871b2aee9f7a46 -914f763e646107b513c88f899335d0c93688ffa6e56c3d76bff6c7d35cb35a09f70dc9f2fe31673a364119c67cd21939 -9210f2d39e04374f39b7650debe4aceeb21508f6110ab6fc0ab105ec7b99b825e65753d4d40f35fad283eeff22a63db0 -98729cf927a4222c643b2aa45b3957b418bce3f20715dd9d07997a3c66daa48dd62355dbd95a73be9f1d1516d1910964 -a602c399f1217264325b82e5467a67afed333651c9f97230baf86aec0dd4edeae1e973cafef2ea2236d6d5b26719954d -ac9632921d45900bf3be122c229ba20b105b84d0f0cba208ccdce867d3e9addfb3ef6ece9955950d41e1b98e9191ef42 -a76ce1f53e1dc82245679077cb3bca622558f2269f2d1a1d76b053896eba1c3fc29d6c94d67523beb38a47998b8c0aa7 -b22b51fcc1b328caa67cc97fb4966cb27d0916488a43248309c745cd6e2225f55ad8736d049250fa0d647e5f8daa713c -b7645c1923a6243fa652494fe9033fa0da2d32a0fb3ab7fcb40a97d784282a1ffad3646c499961d4b16dadbc3cbb6fd6 -acab12b490da690db77c4efdc8b2fe6c97ac4ba5afb5165d6647fdd743b4edbad4e78d939fc512bebcf73019c73bae40 -ad7a0fcd4e4ccb937a20e46232a6938fccf66c48a858cf14c8e3035d63db9d1486e68a6bf113227406087b94a0ece6a0 -a78605beaa50c7db7f81ab5d77a8e64180feea00347c059b15dc44c7274f542dc4c6c3a9c3760240df5f196d40f3e78b -8763315981c8efa9b8ae531b5b21cfc1bbc3da3d6de8628a11dcc79dee8706bd8309f9524ec84915f234e685dd744b69 -b4a6c48531190219bf11be8336ec32593b58ff8c789ee0b1024414179814df20402c94f5bfd3157f40eb50e4ef30c520 -8dac8a3f152f608ce07b44aee9f0ed6030fa993fd902e3d12f5ac70bf19f9cde2168777d2683952a00b4b3027d7b45ea -8baf7dfae8a5840c5d94eabfe8960265f6287bb8bc9d0794a6d142266667a48bec99b11d91120907592950a0dddc97d9 -b8595e6ea6b8734d8ae02118da161d3d8d47298d43128a47e13557976032dad8c2ccbfff7080261c741d84d973f65961 -8b93979c51c8d49f4f3825826a5b9121c4351e0241b60434a3c94f2c84f0b46bbf8245f4d03068676166d0280cf4f90c -aceb0fdaf20bf3be6daebf53719604d3ab865807cc2523285f8fef6f3fc4f86f92a83ad65da39de5bd3d73718a9c4bd2 -814dd41764a7d0f1a14a9c92e585f154a26c8dbf2f9bff7c63ae47f1ac588cec94f601ccc12e8a63a7a7fce75a4287f2 -b47b711848e54fa5c73efc079d0a51a095fa6f176e1e4047e4dac4a1c609e72099df905958421aee0460a645cba14006 -aaf7bd7e1282e9449c0bc3a61a4fca3e8e1f55b1c65b29e9c642bb30a8381ce6451f60c5e0403abc8cee91c121fa001f -b8b0e16e93b47f7828826e550f68e71a578a567055c83e031033c1b7f854e7fc8359662a32cc5f857b6de4aff49e8828 -b3eb70b8c8743a64e1657be22a0d5aeb093070f85a5795f0c4cb35dc555958b857c6c6b7727f45bf5bedf6e6dc079f40 -ae68987acd1666f9d5fa8b51a6d760a7fb9f85bf9413a6c80e5a4837eb8e3651a12e4d1c5105bfb5cfa0d134d0d9cfc2 -acd8fa5742b0bac8bd2e68c037b9a940f62284ff74c717f0db0c033bf8637e4f50774a25eb57f17b2db46e5a05e1d13d -a98dac386e7b00397f623f5f4b6c742c48ab3c75d619f3eaf87b1a0692baf7cb7deac13f61e7035423e339c5f9ae8abf -99169bd4d1b4c72852245ebfbc08f18a68fb5bcce6208dd6d78b512b0bc7461f5caf70472b8babf3e6be2b0276e12296 -937d908967f12bf7f728fe7287988c9b3f06c1006d7cd082e079d9820d67080736910bc7e0e458df5bae77adb9a7cbc1 -8c50e90ce67c6b297fd9406c8f9174058c29e861597a0f4ed2126d854a5632fa408dfa62ad9bb8b6b9b6b67b895d5a4d -8f4840a91b0a198226631a28e7a2e893fc6fed4d5eb3cb87b585aac7f4e780855a353631ad56731803296f931e68a8d0 -96a4b8c64d3d29765e877345383bf0e59f4ac08798ac79dd530acd7f3e693256f85823ad3130fb373d21a546fe3ca883 -b0dce7a6ab5e6e98b362442d6e365f8063ba9fef4b2461809b756b5da6f310839ac19b01d3fd96e6d6b178db4ff90ee1 -8f012cb2be5f7cb842b1ffc5b9137cafef4bd807188c1791936248570138f59f646230a1876f45b38a396cbdd3d02e08 -94a87b5ce36253491739ca5325e84d84aaff9556d83dcb718e93f3ff5d1eecf9ae09d0800a20b9e5c54a95dfebfcecd3 -b993ec5f9e82cc9ceeb7c5755d768bc68af92cc84f109dfaf9cf5feb3aa54881e43c3f598ba74ed98e8d6163377440ca -92f845d4d06a5b27d16aef942f1e3bcbe479b10fef313f9ca995315983090511701b39ccbb86b62d0c7c90a2d1f0c071 -b6ec6da0f9e7881e57fa3385f712e77f798abc523609a5b23e017bb05acc6898825541aed7fe2416c4873de129feceea -86b181183655badfe222161d4adf92a59371624a358d0ec10e72ee9fa439d8418f03d635435ec431161b79fd3fa0d611 -b5e28eeed55fb5318b06a0f63dbf23e00128d3b70358f1c6549fd21c08ef34cb1372bc0d4b0906cc18005a2f4cd349bf -85c4d3fddda61dbfb802214aa0f7fc68e81230fb6a99f312848df76cddc7b6dfd02860e8a4feb085dad1c92d9c6c65e0 -80f7fdec119309b2ac575562854f6c2918f80fc51346de4523ec32154d278f95364fdef6f93c7d3537a298dd88df7be6 -9192c1949d058614c25f99d4db48f97d64e265a15254aa6ed429e1ef61d46aa12355769f1909a5545cd925d455a57dbe -a0b1e7d928efc4dcbd79db45df026ae59c20c1a4538d650c0415ab7cb0657bc1e9daeacc3053ee547e8f9c01bdbd59c4 -893e84c41d3a56bca35652983c53c906143b9ad8d37b7c57f9dacbeb7b8dd34defc6a841f5b9857ffb90062bbd8e9dee -a7f89a448349dbc79854cf888980327f92aedc383c7fadd34fdc0eaa4f63d751315b4f979e14f188854ef4d16c9e8107 -833f2774a96187805f8d6b139c22e7476bce93bc5507344d345008080fb01b36d702b96e4c045617a23a8ca1770b4901 -80e46e86d68bd0a48ac6fa0b376d5bb93a5d6b14f08b3a47efa02bb604c8828c2047695f1f88fc5080e5548e1a37130f -943f42b7b4ad930059a26ad06b62e639f06c1c425d66066c55134e97c49abe412358c7cb994fcc1cf517ea296bca1f68 -8b9d4fe835dc6a2cbf85738937bbfb03f0119ab8df04a7d68860716ce6ee757dbe388a1e8854ddb69fe0c9fa7ed51822 -909030c7fde2591f9ea41ae6b8fa6095e6e1a14180dda478e23f9c1a87b42c082a1ea5489c98702f6ccd2ba5812d1133 -a715ec1beb421b41c5155c7ef065bbb50b691d0fa76d7df7ee47683d9e4eb69b9ea3e62fc65196a405d6e5e29e6c2c60 -8c9e801cb7ef780a535be5c2a59b03e56912acbfdb00447bfa22e8fc4b11dceecc528f848d5fba0eec4237d6f81f4c79 -b96b6af857c3bc0344082bd08ec49a9bed478d4d35b85a2099b1849cd6997521c42225305f414cdd82aef94b9e1007d3 -8764db720b4e44a4d2527f7f9b535a494a46c60e28eac06bf1569d0703c4284aefa6cb81fbba9d967286f9202d4b59ea -a66fd2f9158e1ffcdd576cba1413081f43eed00c7eb8f5919226f7b423f34ac783c1c06247819b238de150eb5a48d977 -82c52e817ac3bb0833ea055dec58c276c86ca5181811cf7a483b3703a06ea1bee90ae3aeaa2cffeaeba0b15fe5bf99be -987d07cb276f7f03a492cfb82bba6d841981518286402d3e69e730a9a0e29689a3619298124030da494e2a91974e0258 -b34f2c5740236bc6d4ae940920c5bc2d89ff62a3dd3a3ec9a0d904d812b16f483073db1e53b07f2b62e23f381d7bdbe5 -a1c0679331ab779501516681b3db9eefb7e3c0affb689e33326306ada6d7115fafd2cc8c1c57b2fa6c2072552f90a86e -94805e30d7852fc746e0c105f36961cc62648e438e8b9182fc0140dbf566ec14a37ad6e7f61cacb82596fc82aed321e5 -a42fb00b29a760141ff0faaeb7aca50b44e7bbc0a3f00e9fb8842da7abfcaae6fae9450abe6ba11e8ecf11d449cbe792 -8fb36ce4cfa6187bfe8080ac86b0fa4994f20575fb853bd8ffa57c696179cc39f58ff3b4bd5a2542ff1c8b09015539df -a1c54e7aa64df7fb85ce26521ecfc319563b687ffecd7ca9b9da594bbef03f2d39f51f6aaff9a3b5872d59388c0511c6 -855e48fdb8f771d4e824dbedff79f372fd2d9b71aa3c3ecf39e25bf935e2d6e0429934817d7356429d26bf5fd9f3dd79 -8ae6157a8026352a564de5ee76b9abb292ae598694d0ea16c60f9379e3bb9838ce7fd21def755f331482dc1c880f2306 -a78de754e826989de56fe4f52047b3ffd683c6ceaf3e569a7926f51f0a4c4203354f7b5cfa10c4880ba2a034d55a9b0d -97609477d0a1af746455bbd8cb2216adacc42f22bfd21f0d6124588cd4fec0c74d5bde2cdba04cdbfbff4ac6041b61b1 -a03dc3173417381eb427a4949c2dbfa0835ef6032e038bf4f99297acf4f0ba34a5fc8ccf7e11f95d701f24ee45b70e27 -aad6283e85cd1b873aeb8b5a3759b43343fdadc9c814a5bf2e8cf3137d686b3270f1ec2fb20d155bbfd38c7091f82c44 -92ab94ed989203a283d9c190f84479c2b683615438d37018e9c8de29c2610bb8fccd97bb935dca000d97d91f11a98d65 -8c0444a0b9feb3acb65a53014742e764fa07105e1c1db016aec84f7a3011d9adc168dbba8034da8d0d5db177a244d655 -95a33d25e682f6c542d4e81716cc1c57ef19938409df38bf8f434bc03193b07cedd4e0563414ce00ab1eebbd3256f3e7 -8716c30e3e4b3778f25c021946c6fb5813db765fde55e7e9083a8985c7c815e1b3d3b74925ba108d9a733ddf93b056af -a186aabc10f1fff820376fa4cc254211c850c23a224f967d602324daec041bbe0996bf359ed26806a8c18e13633a18a8 -a1e8489f3db6487c81be0c93bade31e4d56ec89d1a1b00c7df847f5cd7b878671015f5eaa42ee02165087991936660b9 -8f688c969c1304dfa6c1a370119d1988604026a2ab8e059016c5d33393d149aae6e56f3ee2b5d25edc20d4c6c9666ad9 -91950b651fefd13d2fa383fd0fdc022138ce064ee3b0911157768ad67ed1fb862257c06211cf429fba0865e0b1d06fc8 -86cff4080870d3e94ed5c51226a64d0e30266641272666c2348671a02049ae2e8530f5fb1c866c89b28740a9110e8478 -88732c4d9e165d4bb40fb5f98c6d17744a91ff72ca344bc0623d4b215849a420f23338d571a03dd3e973877228334111 -afcc476ad92f09cf2ac7297c5f2eb24d27896d7648ba3e78e1f538c353ceeb1e569917a2447f03f3d4d7735b92687ba5 -b622aa475e70d9b47b56f8f5026e2304d207684726fb470a0f36da7cb17c30dd952813fab6c7eb9c14579aacca76f391 -802cf5630c0407ae0d3c5cf3bef84e223e9eb81e7c697ea10ec12e029fc4697ce7385b5efab7014976dacc4eb834a841 -a08596493f4cd1b8ac2ec8604496ee66aa77f79454bb8ab6fdf84208dc7607b81406c31845d386f6ac8326a9a90e7fc5 -a54652ca9e6b7515cb16e5e60e9eabbccbc40bb52423d56f0532d0bac068aec659a16103342971f2cc68178f29f695db -a3ab54875cb4914c3a75b35d47855df50694310c49eb567f12bbc5fa56296e11f4930162700e85ba2dbfdd94c7339f91 -94183a040285259c8f56bef0f03975a75d4def33222cc7f615f0463798f01b1c25756502385020750ac20ae247f649a1 -b0004261cc47b0dc0b554b7c6ebf7adf3a5ece004f06e6db3bbac880634cdf100523b952256a796998a5c25359f12665 -a25dfeb0e18ebe0eb47339190f6a16f8e116509ab2eef4920f0d3ff354e3ead5abe7f5050b2f74f00b0885ea75b4b590 -ab10ef2f5dc0ede54e20fa8b0bce4439543db8d8b31e7f8600f926b87ec5b8eea0ac2153685c7585e062ffac9e8633c3 -8386eac1d34d033df85690807251e47d0eaacb5fe219df410ab492e9004e8adabb91de7c3e162de5388f30e03336d922 -b6f44245a7d0cb6b1e1a68f5003a9461c3d950c60b2c802e904bc4bc976d79e051900168b17c5ac70a0aed531e442964 -ad12f06af4aa5030b506e6c6f3244f79f139f48aec9fc9e89bbfbd839674cfd5b74cea5b118fb8434ba035bda20180af -88511306dfe1e480a17dba764de9b11b9126b99f340ceb17598b1c1f1e5acbdd1932301806fe7e7e5e9aa487a35e85de -a17cdf656e1492e73321134a7678296a144c9c88c9a413932d1e4ca0983e63afc9cdc20fd34b5c6a545436b4db50f699 -b555b11598a76de00df0f83f0a6b8c866c5b07f7ac2325f64fb4a0c2db5b84e0e094d747186c3c698ee4d0af259dc4c7 -88014560587365e1138d5b95c2a69bdae5d64eb475838fee387b7eb4c41d8c11925c4402b33d6360f0da257907aa2650 -b220634e6adee56e250e211e0339701b09bf1ea21cd68a6bd6ee79b37750da4efe9402001ba0b5f5cbbfcb6a29b20b0c -ac5970adc08bc9acec46121b168af1b3f4697fb38a2f90a0fbc53416a2030da4c7e5864321225526662d26f162559230 -97667115b459b270e6e0f42475f5bce4f143188efc886e0e0977fb6a31aba831a8e8149f39bc8f61848e19bcd60ceb52 -b6c456b36c40a0914417dd7395da9ed608b1d09e228c4f0880719549367f6398116bf215db67efe2813aa2d8122048f2 -ab7aef0d6cda6b4e5b82d554bd8416a566d38ded953ffd61ef1fcca92df96cdcc75b99a266205ff84180ab1c3de852a4 -81d354c70ce31174888c94e6cf28b426e7d5c4f324dc005cd3b13e22d3080f3881d883ca009800f21b0bb32fa323a0cf -94f3440965f12bee4916fcc46723135b56773adba612f5ce5400f58e4d4c21435e70518bdef4f81e595fa89e76d08fc6 -a6683e7a1147f87cbeeb5601184cc10f81bca4c3c257fd7b796a2786c83381e7698fb5d1898eb5b5457571619e89e7d6 -8ca29539600f8040793b3e25d28808127f7dc20c191827a26b830fff284739fb3fc111453ff7333d63bce334653a0875 -98a69644048b63e92670e3e460f9587cf545a05882eb5cba0bcbd2d080636a0a48147048a26743509ab3729484b3cc12 -84d40302889c03c3578c93aca9d09a1b072aadd51873a19ef4a371ca4427267615050c320165abece7f37c13a73d4857 -87954271e3de3f0b061c6469d038108aac36f148c3c97aefb24bf1d3563f342ea6c1c1c44c703e1587a801708a5e03f8 -86b6f5367e04c5caa3ec95fd5678c0df650371edac68f8719910adf1c3b9df902cc709a2bddc4b6dde334568ca8f98ac -a95fed2895a035811a5fee66ca796fdecce1157481dd422f8427033ed50c559692908d05f39cb6bea5b17f78a924633c -8ba05bdadde08a6592a506ea438dbdc3211b97ea853d1ad995681a1065ececce80f954552b1685ef8def4d2d6a72e279 -90b6b7494687923e9c5eb350e4b4b2e2fa362764d9a9d2ebb60ee2ad15b761e0850c9a293123cf2ef74d087693e41015 -8819ea00c5ea7b960eb96ab56a18c10a41fd77e150ab6c409258bc7f88a8d718d053e8f6cb5879825b86563e8740808d -91e42031d866a6c7b4fd336a2ae25da28f8bde7ace6ff15dc509708b693327884e270d889fff725e6403914546055c28 -85763642052f21cf1d8bd15fd2dc0c2b91bba076751e4c4f7a31fbdb28787b4c6a74d434d6ef58b10f3ad5cde53ef56d -8b61c36c7342a1967a1e7b4c01cddf4dce0e2025bc4a4a827c64994825f53e45277550ceb73c34bb277323fb784aa3c6 -80b9634a45c8b3770e993257bd14df6a17709243d5429969ab8b9a4645bf2a94f9b3cd3d759169887b4aa0eb50f4f78c -b5c44db9439dd8aa4edd151d95e48a25c1154e1525c337f97109f40131db81a4898344c8c3144c270bdc835c269b3477 -863080fcbc227eea32d0dc844f42dc642fbda7efc398ab698be3a3c6f3bf8803dea6ba2b51fed6151f9522b4ab2a8722 -8481e871129e9cb9d2d109c513cbba264053e75192e967f89659dcfcc1499de9ae7a1ac4f88f02289150231c70b4da01 -834d8183698d3d2d1352c22c373222cb78d0f4c8cb15e0ad82073dde273b613515ebcd184aa020f48f8e6fc18f3e223c -a227e300f0c5bc1b8d9138411413d56c274cc014ae8747ec9713f3314d5fae48bb6f8cc896f232fd066182af12c924e4 -ab7242835e91ba273de1c21eb4fca8312bdda5b63b080888b96a67a819b50294a7f17a7dc0cd87fae5e7f34bc24c209a -86eb27c898a5d6c3618c3b8927acee195d45fe3f27b0991903520a26fb8021b279e2a8015fbbba5352223ae906c7c5d6 -a61b1c200b0af25da8ad8e29f78d000a98683d1508ae92ee7f4326a7c88e0edb645b6cb5dde393ac74d322895e77ba24 -887739318c710aae457b9fe709debff63bfbb3ffbbb48a582c758b45d6bf47a7d563f954b1f085c3bc633ffd68c93902 -aacfcb0e2b0a868b1c41680487dc6600577ce00aa2edeee8c6141f4dc407217ddb4d37b79e7c9182258c750d12a91508 -ad8cd2cf5ccd350cd675a17f31b86a0e47499c6c4c11df640a5391bb10989c9c70df0a3ddeba9c89c51e15fedaf67644 -8aba897d32c7ef615c4dfa9498436529c91c488a83efc07ba9600875c90c08b00f66a51469eb901451b6e18e7f38ffd7 -aab8a600609b80e36b4a6772308bac77929a0c5d8d92bbc38e9999186a1c2bfdbef4f7a2b1efba9c17a68dc15a9373ab -b95811d1454307a30c2ac8588c8104804b06c1aec783fed75a6f12c9df626be57865850100f1ad28073e3867aca941cf -8b119d3bd4ee644469457df5d8a0020fd99b8b20bd65ab121cf95a7f55e50dd8945fcf1dff9d269d9d0b74b4edbc7726 -a980b912df832ea09353fd755aa3eec9eb4cfd07ca04387f02a27feab26efa036fca54cc290bb0c04a8a42fdfd94ce2f -91288e84da1d4ee2a4dad2df712544da3a098fdb06a5470c981fb6d6f3dcc1c141b6f426d6196ff3df6f551287179820 -98b0473bcffcbd478fd1b49895c61dd2311dab3cdec84f8e3402f8add126c439ffcb09cae3b7f8523754090d8487b5a9 -abe76988cf3065801f62a1eb3cfe9f8185bd6ab6f126c1b4b4fde497ca9118d02a0db3fadccd4ca98826b30475fa67ef -94a316a0faa177273574e9e31989576a43e9feb4cc0f67aa14d5c1967c4e10fc99db3ef4fdca2e63800a0b75f4b84256 -975ad39adadc7e69e34981be2e5dc379b325dc24dddacc0bb22311ff4a551a0020a8bdecf8ab8ac5830ca651b7b630ce -8b3bc73b640dc80ac828541b723a968fb1b51a70fa05872b5db2c2f9b16242c5fe2e8d1d01a1dbeaac67262e0088b7b0 -aa8d892a6c23dbc028aae82c1534acb430a1e7891b2a9337cedb913ff286da5715209cffb4a11008eae2578f072836cb -8dee9747a3ae8ed43ce47d3b4db24905c651663e0f70e2d6d2ddb84841272848a1106c1aa6ba7800c5a9693c8ac2804e -81e2c651b8b448f7b2319173ecdc35005c2180a1263e685a7e3a8af05e27d57ec96d1b2af2cae4e16f6382b9f6ec917c -98a9a47635de61462943f4a9098747a9cf6a9072a6d71903d2173d17c073eff3fc59b2db4168515be31e6867210ecbcd -912b2398505c45b0bb4a749c3f690b1553b76f580b57007f82f7f6cce4fadd290d6df9048258978c8a95ef9c751a59a2 -8ac8f0893fe642111ef98ae4e7b6378313a12041bbca52141e94d23152f78c2e4747ae50521fc9c5874f5eb06976e5cf -946b4a8eb05b529aaed56ac05e7abeb307b186a7835623fa4e85ed9eb41a4910663c09ea1bd932a2c467d28776b67811 -a4be51abeddd40e1da6fdb395d1c741244988ff30e10705417b508574b32dce14d08b464486114709339549794df9254 -b33b6b7d66cb013e7afeabbd7ed1e0734eb0364afe4f0f4c3093938eec15f808985fb7f3976969bf059fa95f4d8e335b -a808adbcf0049f394914482483ee0f711d9a865615ff39b5313ed997f7a0d202ad9ed6e6de5be8a5c1aaafe61df84bca -8856268be15a78465ad00b495162dc14f28d4ef4dcf2b5cba4f383472363716f66dabc961a6dbdda396e900551411e41 -b16ba931e570e1bf124ea3bd3bdf79aed8aa556697ea333e6a7d3f11d41538f98dcde893d0d9ba7050442f1515fb83b1 -91ecde1864c1a9c950fd28fa4c160958246b6f0aa9dda2a442f7222641433f1592d38763c77d3f036a3dbb535b8c6d8f -92cda991f69fbf8e55c6bf281b07fff5dbbb79d1222b8c55686480669247b60212aac27aa7cccd12fcee94e7a759b8af -b1d9b5b4e996b375d505d7250a54c12d32372c004a9cabf1497899054cb8b5584b1cef1105f87b6e97603ccbf2035260 -86e98bde8b484fb809b100f150199f13a70c80813ad8b673bf38e291595e2e362ad1fa6470d07d6fbe2cf7aeac08effc -aa12f7c39ba0597a8b15405057822e083aca3cee6ed30c4e0861eeb22620823588d96c97bb1c3776b711041c4dc3d85d -b477b34f29334f3bae69c7781d574342b7c27326088f9a622559ab93075c7357953ae84eb40e3421f453e04e9b4d5877 -9625067cb2120ce8220a469900aa1d1bb10db8fe1609988786b07eb2b88e0ddb35a3eccd4b6741e1fa2365c0db6b1134 -997b92af7765f587d70ea9718e78a05498cd523fc675ad7b0e54a4aae75fbeac55d0c8d72471471439dacd5bfcfae78d -88b59eaea802e6a2cf0c0075bf3fd6891515adcb9adf480b793f87f1e38d2188c5ed61ac83d16268182771237047ec8a -a57d078b230b1532c706a81eaabfef190fb3eb2932f4764631e916a0f0d837d6014da84ede100abaf610519b01054976 -94ed5c5b96f6afa9f2d5e57e1c847ae711839126ab6efb4b0cf10c4564ff63c819d206fdc706178eb6a0301df2434c01 -980296511019c86cc32212bad6e4a77bc5668b82a2321a1ecabc759a8bbc516183a4787c7f75f9ee7f1338691dc426cc -b10ef97db257343474601fd95f9016c205e28bd22bf7b8f9e30c3b14aca1cc9a11e6404ff412ef269c55fb101fee5a37 -b670d5d9c77fc6aa14212dd3eae100620f3510031b11a9625aa40bf31835c9fd717753b555bd159b1aa64a2104929340 -862054fabf6d6d529a7584d1a48f72d2eb216caf959c782ec36c69c26aef4595415d19a28b041946811b34a629105241 -ae4bf2ccd7b0f3774653848b5b4d39e5517dcbcff30d8441d78bc387ff42b573f16b7b0a7366e6ca5cef1dd9f0816df9 -8f810527badcb49f1542a0ccd12e3541efa084243f7106eae003458c176f4c1f01daae9d4a073c2cb2aced747e8a4576 -8a32c2067aaf6baf32db67acd4974a22a6da33db5444028a7c8c4135f9c84e102dc3b2c635b15afa6dc907d0270daffb -b15fc057f306a60b20c8487125b6b334ab749cf70eb8a30c962f625bb203ebd0d2a315949ee3b7a99e3d91acec384806 -a37f145d321359b21cba7be8b64dfae7c67a20b7b324f27c9db172d58e77a49fa02ed3d06d09d7644bf1fd81f4aab44b -b338d2e39a485ee4297adcf5e58e16c3cc331c5dffeade0be190907c1c5bdfed38537a6d81dc39a2cdfc1bc45e677886 -b69d84d8511b3aedfdc7c7e66f68b24e12e5a2365dbbe014bddd2e99e54143428cf8b74cf12c0e71316038aa5300e87e -ab210cc38661667450561a1857337879633f5d5bf2c434a3df74ff67f5c3ba69a7880872f19ae4dcbbb426462cd7d0fb -94538ef487a58a5ff93a5e9616494c5f066715d02be5b249d881a00bd0edfe2fe19dd7a5daa27f043d1dbb5ac69cf58d -afb47a899c1b25fe800241635fa05de9687a69722802ad45434f551971df91d8ca9edda0d835d82eb8f36ff9378ed7e8 -827a10d7536230887283a9b1dedccc6b95ef89cb883c4ee7b9821058b0f559704d1636670c0ada2b253bf60b7cb8a820 -97cc07965065d64409f19fb2c833b89ca3a249694b16b58818a6f49d3800926627ce0f87e5c0853ae868b4699cfdee5e -ae0c93d44780ef48ea537cf4cb8713fd49227f4b233bc074e339d754b5953e637a7289c6f965162701e4b64e4eaec26d -80953053397c4c0ba9b8e434707f183f9ced2a4c00d5c83b7dc204e247ad7febc1855daeb906c53abfdf3fe3caca30c4 -80f017e87b471b5216ebe25d807be6c027614572337f59f0b19d2d1f3125537478cb58e148f3f29b94985eac526cd92f -8a8e1c0d49801a8dd97e9e7c6955fc8b2c163a63bd6a4be90bb13e7809bb0dddc7a5025cc7d289a165d24048eac4e496 -8530e5b5c551a2e513d04e046672902c29e3bb3436b54869c6dea21bab872d84c4b90465de25dff58669c87c4c7d2292 -ae3589d389766b94428e9bde35e937ed11aac7ead3ce1b8efe4916c9bfff231d83b7e904fe203884825b41022988897a -ac02e629a900438350dd0df7134dfa33e3624169a5386ea7411177b40aa7a638e8d8aef8a528535efdbe1ca549911c0b -b1ac60b7270e789422c3871db0fa6c52946d709087b3b82e6eba0d54f478520b1dc366bb8b7f00ff4cf76e065c4146eb -a7465e1f8e57de1a087144d3c735fee2b8213fcbf2b9e987bb33c2d4f811de237bf007402e8d7f895563e88b864f7933 -8ab0007ba8984dee8695ec831d3c07524c5d253e04ec074f4d9f8bd36e076b7160eb150d33d15de5dd6e6fb94f709006 -9605bbe98dadd29504ce13078c1891eca955f08f366e681d8b5c691eadb74d6b1f2620220b823f90ef72eb4ab7098e16 -942a083d07c9cb7f415fedef01e86af4019b14ef72d8ab39fe6bd474f61ba444b9aac7776bea7e975724adb737e6337a -b9a49a8c4e210022d013b42363ac3609f90ea94b111af014f2c5754fbc2270f6846fa6a8deb81b1513bb8a5d442ea8dc -99cd62b177d5d7ce922e980cc891b4f0a5a8fa5b96dfc3204673fbef2e7fb2d7553bbacd7b2e6eca4efb5e9a86096e2e -94e30b65b3edd7472111566dde7fab0e39a17e1f462686050f7134c7d3897e977550faf00174748cbeaec6c9c928baa8 -a32fbcb29f3391d62092f2720e92b6ef4d687d8a3eae39395e0464669a64a38fe21a887f60bc9519d831b9efde27f0f4 -8f1492c4890d8f9deecb4adada35656e078754dcf40b81291e7ef9666d11ba3747a478f9420a17409d7d242cecd2808f -8942960b319ef65812d74cb1d08a492334db58d41e8437e83ddf32e387d9f3ad36834f59e6a71d1afb31263773c3ec49 -88d692f4976c99e763b027df9c2d95744d224724041dfbe35afc78b1f12626db60b9d0056b3673af3a1741eaf5f61b43 -9920cd37eab256108249a34d3f1cc487829cc5f16d1bce3a2328fe48b4de735ebde56c8b5cf4e532a4d68792387257c5 -87d34c9f5a913b806504a458c843eda9f00ff02ad982142543aa85551208cab36ebf8b3409f1c566a09a60001891a921 -a2ee8339c96f790b3cf86435860219322428b03ea7909784f750fe222bc99128d1da2670ad0b1f45e71a6856c7744e09 -84bd257f755de6e729cc3798777c8e688da0251a2c66d7ba2e0ce5470414db607f94572f5559f55648373ce70e0b560e -8d0e170714ddf5dde98b670846307ab7346d623f7e504874bfd19fbf2a96c85e91351ba198d09caa63489552b708fbc8 -9484cc95d64f5a913ed15d380c2301a74da3d489b8689f92c03c6109a99f7431feb8a07d9f39905dcef25a8e04bcec9b -b14685f67dd781f8ef3f20b4370e8a77fef558aa212982f1014f14b1bdd8b375c8a782d1b8c79efc31b41eec5aa10731 -b22fb1541aa7d2b792aa25d335d66e364193fdbf51b24a90677191cae443f0ce40a52faf5983d2cb5f91f0b62a5f20e1 -b06fa9489123ab7209d85e8c34d7122eb0c35c88ee6c4c5e8ae03a5f1ae7c497c859b0d62e0e91f5e549952330aa95a4 -b5cd71617ff848178650e6f54836d83947714d2e074d8954cfb361d9a01e578e8537d4a42eb345031e3566c294813f73 -848d39ea2975d5de89125a5cbe421496d32414032c1e2fbc96af33501d3062745b94e27dfe1798acaf9626eabff66c79 -ad35955efd5a7b6d06b15d8738c32067ffa7dd21cf24afc8ea4772e11b79b657af706ce58a7adcc3947e026768d9cdaf -aff6d7c4861ff06da7cb9252e3bd447309ad553b2f529200df304953f76b712ac8b24925cf4d80a80b1adaa2396f259a -b4b88d35e03b7404fc14880b029c188feecb4d712057f7ba9dedb77a25d4023e5a2eb29c408fde2c0329718bdaf1ff63 -88e96720e2f7c63236cca923e017ca665b867ba363bc72e653830caf585d802fad485199055b5dba94a4af2c3130a6f6 -982675dc0299aeedba4b122b9b5f523ca06d54dc35da0f21b24f7c56c07f4280265fb64cec2f130993521272c3470504 -95c77d418490e7e28293169cf7a491a7dcc138362f444c65b75d245c1b986d67c9e979a43c6bd8634dae3052df975124 -8fd6c4dff54fb2edc0bdd44ccd1f18238c145859ccd40fbfbc1cf485264445b9d55ffd4089c31a9c7a0543cc411a0398 -b153eb30af9807b5fe05d99735c97471d369c8a1af06b2e2f0b903b991eb787ab5a88c6e406e86225582acf8186ad5ef -826b55de54496751b0134583b35c0c2049b38de82821177e893feeeeb76ceeb747c7a18312cb79a6fc52f2c18f62f33e -91650d7205b232c495f1386bea0c36e136a22b645ffd4f5207f5870b9ce329c44524781c983adf2769f4c05b28a8f385 -b8d51a39162ebb38625e341caacc030913f7971f178b3eee62dc96f979495a94763ea52152198919c6dd4733bc234f64 -a1fbd3673f2ae18a61e402fe3129b7506d9142f2baca78f461579a99183c596b17d65821f00d797519e9d3c44884d8a6 -b7c5f5407263398cf0ed3f0cf3e6fcebdd05c4b8fd4656a152cedcdbf9204315f265fd8a34a2206131585fad978a0d6c -94fa71804e90f0e530a3f2853164bc90929af242e8703671aa33d2baad57928f5336e67c9efdcbd92c5e32a220b4df07 -b75dcea5ad5e3ed9d49062713c158ebc244c2e4455e7a930239998b16836b737dd632a00664fded275abe4f40a286952 -a02f7b37fc30874898618bfcc5b8ff8d85ef19f455f2120c36f4014549d68a60a0473ddfd294530dfd47f87fbd5e992d -8b48e1626917b8ba70c945fe0d92d65cab0609f0a1371fd6614d262d49fe037f96991c697904d02031ec47aab4b32f48 -b368f02c21d4af59c4d11027e583ca03ef727f2b2b7918ef623f529ceac76753a05a4ce724ce2e018da6ecc5c1c1261b -a95cba06eeae3b846fc19a36d840cbcf8036c6b0dc8c2a090afcf3434aaf5f51ef5d14b1e9189b1d8f6e4961bf39bbf8 -b32ca4dfbeb1d3114163152361754e97d3300e0647d255c34ec3025d867ed99e36d67ebafe8255b8c29be41864c08edc -8e4eddefa27d4fe581f331314d203a6a0417c481085134d8376898f9260f133e2bf48576528d62adf29953ad303e63a7 -92b7d5505833f00d5901ae16c87af028de6921c2d1752a4d08a594eb15446756ea905b0036ae6ffe6b8374e85eb49348 -b50e9018d3c4e05ba9b28b74b6634043f622d06aa8123da7cd0bc482b3131912149214d51bdfd887484422e143c3c1c0 -ab980a2f5317dfcb92baa4e2b3eb64a9ac2a755da6c11094d57e781ae5cf43e351824f1dd3abb4c6df75065b3784210b -aaabb009dfcb0bae65a0aee26ed74872c226965c52a6ed0998209e020a9ee806297dba4b15845cf61e1a514de5d125db -a1fe78f67000ebb6e90fe33e1a9dd5489be6e15fedb93b2a37a961932b77137fe85d46e89a132ecf7bcfb7aa95e16757 -85bc6e7d660180de2803d87b19ed719d3f195ea0a92baf9bfff6113c743f4237f51355b048549913e95be8ddf237864d -87a167968c4973105710e6d24ad550302ee47fe1f5079d0f9f9d49f829b9f5c1cd65d832d10fe63533e9ad1fa0ad20f5 -b2ad1a7b95b8a89d58e0b05c8b04ae6b21b571d035ae56dc935f673d2813418e21a271cccaf9d03f0d6fa311f512d28c -8268e555319992d5ac50cb457516bd80c69888d4afa5795fcc693d48a297034f51e79f877487b6f7219cfdd34f373e14 -b235411f1f6d89de3898642f9f110811e82b04ad7e960d1dd66ec7a9bf21de60e00cfabcd3004f3b5c4f89f5d9c7422a -b6963effcfe883f7ed782a3df3c40edd70f54ceca551859bcccb5d3e28fd2c1fcbdd7acc7af24a104687fd02b53c704d -862645c944e1e2909b941578cc5071afd7353fed1c2c99517e2de7573037704ef5d35accf6ec79b8269da27564209d50 -90f585eeb1a053e2f18c1280c9d6a561c0bc510b5f43cd68370ed6daac4b3749852b66c371397b6a7c1ece05ee5906c9 -876d9a3686feb79ce781e87ac3e3fbeef747b6ab031285e808c8a73f73f55b44507850dcaa745c0791d2cae8ad61d74e -a7ecc3b8c10de41a7bd9527228a0d3b695a651a5b5cb552a3664a887077d39ee60e649aecd68ed630da6288d9c3074ad -83529f1f2b4dc731ea05c1ee602fa2e4c3eebe2f963f3625959ba47657be30716d64e05e8b7e645a98bf71c237d9c189 -834ca6b14428c30a4bc8d5a795596820af6f3606f85bee9f3008f3fb94b3adffa968d21a29e2588d7a473d8b5d3a8b42 -b8d08cd8b73430984fd16e8db0525ae2b76253c92cccd7b3470add4d12d082eafb55a72bde04870924d0bdaf61f76c5d -96ef32df669690c2391f82136fc720231e4a185c90ba79eef7beaadedf7fbeb56ed264825564bdc7da01829b47f4aa88 -93d637b2f04d71891a80a1ee93fd9c9046d671bc4c15c4e597cfcc36f4ae85a7efc111359628965fd10d36c39129b160 -89f28dd3f7bc43749d0e3750c136385d4ffaf2c40354d3be38341416d755de7886d8108d83721b36f99feb3bccd73c88 -ac6392e274659f4c293e5cb19859828f101959c4c0939920a8dfed0e2df24a0cbf89a7aa983e947318c58791c893928e -83b2d4ce42c2fa0f672cd911365d1f1a3e19f1c38f32bedc82820ad665d83ae5fac4068e4eca6907bd116898966fed92 -b5e0144d6e59a9d178d4ee9f8c5dba18d22747fcdf8dc4d96d4596a6e048e384cd1e211065f34109c9ed6b96010d37e5 -b1a65e6b38c9e84b3937404d5b86c803c2dac2b369a97cbf532cfdd9478ee7972cf42677296ad23a094da748d910bc48 -849d7f012df85c4c881b4d5c5859ab3fb12407b3258799cfc2cb0a48ae07305923d7c984ff168b3e7166698368a0653d -84d9b7ee22bf4e779c5b1dd5f2d378ef74878899e9dbb475dfdcd30c2d13460f97f71c2e142c4442160b467a84f1c57d -964e497ef289fac7e67673a6cb0e6f0462cd27fc417479ecb5eb882e83be594977fb0c15a360418886aece1aaf9f4828 -ae1226222098a38ce71f88ab72de6ededb2497e30580e7ae63d4829dcc9c093bdd486102b7a7441cb06253cf0df93772 -a72865b66d79009b759022e53b9eedbd647ff4b1aab5d98b188100d01fc6b5d8c02b80eb6f53dc686f1fdda47d4722b8 -93aa8d7d8400bdfa736521133c8485c973d6d989ec0a81db503074fe46957a3999880fd9e4e7f44de92adf6ac0abe99b -a75e5ab84399962ada1f9ebcfc29f64405a1b17cd0a983950d0595b17f66386393d95a5aa4c6c878408984141625141c -91b1e5e75f4b55ec2e8f922897537082a1414eedc2bc92608376a626d8752d5d94f22f0e78ea1970eb0e7969874ad203 -83bf9c308424ef4711bfa2324d722f550d95f37d7f7b4de0487ccf952b89d7219ca94e7fa25bee60309efefd9a0e4716 -a42060476c425ff7979456d3c5484bc205fb1ef2d7149554a4d483d48e2a19119f708c263e902943bcf20a47e6c7d605 -8170c45ea126e6367aa5f4a44b27f7489a5dd50202cb7c69f27a2bdf86d22cf6b00613b0080d75fca22439eeaaaa9707 -8e5a82da70617697e42c6b829e1889b550c9d481408fe4cf8dc9d01daccabdec01f9e1b8c27dc84902a615d539bf9bc6 -80606c51401d0bf5f2700ebce694c807ab1f7d668920bdcccef2775e0939472419a8f404567bd4f9355095517eb4d628 -a40314565d60d0ddf8995673e8c643b1baa77a143b3d29433263730a6871032260abc1320e95af8287b90aa316133da0 -a87e07e84435f9e8a51ce155cd3096aa4b20d18e493c9dcbc0ac997ac180f3a255bf68ccd8195f2564d35ec60551a628 -84d2ab98416643c457bf7ddd9f1aa82967ecea189db08f3558f56803fe7001693ed67ec6ca8574c81ec1293b84a7c542 -937c3b955889ceae77f28054ce53d75f33cfe3a04f28e049cea8b8ade2a0440d5e2e8c4f377e6c1ae2115d68cc95fc16 -885a911f16845fe587b15ce7cd18cc2a84295bf609732340f74e0f5275b698cffed3e9aa1440e19e6940a7fa8f24c89c -ad90059a50c399996aaa0a10a8f637b7bab0dd5d9100301f0159a2c816596da55c30b2568d1717705fd2826b117a42d6 -828de9ff1e095c189da1f1ee18009afe14613ac696025add6f4e330488e02d5f1a90be69edd9a17bfb3355a0ca77b525 -b7aedb8394064a58dd802be6457555c0cf7b94805ed00cc66f38449773f4b1865feaee3a6f166eb51b2123b89d853a4d -b09c564ff37ccea34e90f2d50a40919a94c2e10d4fa58ffeaed656f88f9f4ae712d51c751b1b8f443dc6c9506d442301 -b24882d66b2ebb0271ebb939c72308d81f653940e70d6f1bcaae352f829134aff7f37522cc42de9e7fe6243db2c4806f -8e6f8dd906e0d4eb8d883f527e926ad1d8156b500c4cfa27214450c8112267c319900de2443c87bed1e4bb4466297dd5 -ae42f4578e8d79b6aa2dca422ada767e63553a5ee913ff09cb18918116905b68f365720a1a8c54c62cce4475ba5cdd47 -ade639bcd5017ea83ec84689874175ed9835c91f4ec858039948010a50c2b62abc46b9aee66a26bf9387ab78f968b73e -8d310a57aeb123cc895ee2fd37edc3e36ce12743f1a794ad0e1a46d0f5e4c9a68b3f128719ed003e010f717ec8949f43 -8606c086fcf3e2f92c1b483f7e2a4d034f08aef1a9d5db9e8a598718e544b82544268a0a54dfed65b4d0e6027a901d47 -8ccd95dd673d8cfdfa5554c61bcdbe6bb5b026403a320856fe51571e7c59504fe1c035f2ad87d67827339d84c0e1a0c6 -955a7cb4afcf70f2eb78756fc3a82e85ab4330eb89a87117294809beb197d1d474001e25306e8ad71daab6928abf6d64 -ae6b44ec6294736ea853ddeb18fc00cce0ac63b38170ff0416a7825cd9a0450e2f2b340d27a7f2e9c5ac479b4cb8a5fe -a88ec3f12b7020dd593c54376597b056e70c772c0ec62c24c5bfd258b02f772161b66e5dcd95c0c0fceb23433df9ff23 -b4a83933b4de552dba45eedf3711f32714e58ae41d4dab8a6114daeb06e90a5a5732c70384150d04124ac6936ca9804b -b8b7c4fa549b0fa1dc9c1f0af0750d6573f1648767751882d41f0dd7e430e3934590757e1c8b436ac35381bdde808117 -ab598b911234a98cfde07234cfc0d2fddfc5cb9ea760212aa3e175a787ce012965c8fcfdf52d30347f5f1b79cf4a0f54 -a9d354f9dfbd1976e5921dd80cbb56b2e15df53ce099ecb4368eff416998130d7830209282aaf1d4354129845f47eb80 -8c889afff546c721969e4d8aae6e6716ad7c2e9c1914dd650e30419ee77d630efb54dfffb4ec4ff487687b1864bf5667 -94ed2fa79116c7c8c554dc306b1617834dd3eab58baf8f0d085132c4688ca4a6bd38420281283678b38970a3f02b9a94 -944fdc8f0516d22f1672193d183833d3e3b043e26807fb2123729a0216c299785b1c4e24b5aa56e9bbe74fa54d43e22a -a48521454a3e0c10a13d8e810fad9d0522c68eea841821a8e0e57811362f7064a8f9c50f79c780a02df7df8c277feaef -8f3d26670ab55e1bd63144e785203373b2b13b76cac305f0363e48a6339fac3364caa3fceb245527161fc2fac9890912 -b4d6fe71001cb4141f6d8174dd7586d617cfccb54471e1fbce30debc2b1dead62cab29565abb140b682811c6231acb03 -91dc8afc4934fcc53ef851462a055cc1c3c87d7d767e128806891738427606d2fbfa832664d2a7f95f8ffe2cf0c44dc6 -b297eb432c74071764272c1b1663547ba753e66bf026643bfc0e42a9c5cdfb05a88083ad67d6ddfe6ab290678c607b29 -b343d1df85be154faeb5b21741a5ac454ca93f70a0b83a98f5901d1be173a1b2969d43e646363c5d4975924e1912599e -b2d74a66e4dfc41128aee6a3f0ff1e5137a953ed7a2a0ab5a08d7ea75642f12bd150b965c8f786ad0caf55ef7c26be4f -a54141faa8dd9a567c3cd507e4fc9057535ffe352fa1e8a311538fe17e4a72df073fbf9371523e5390303db02321650e -8e229a58f1acc641202d2a7c7e120210b9924e048603b9f785a9787ad4688294140ef3f4508c8c332d2dedafff2485be -9523554c11d39b56e6a38b3b0fadb7a9a32a73c55e455efdcfda923aff1e9f457d1b7cbc859b5ecbb03094eae8b87d38 -a199ffdff1812aaea10cd21a02b3e7bf3d8e80e501aa20bb2105b5f4cb3d37265abcda4fd4c298d6c555e43fa34517f8 -97f1285229b07f6f9acd84559afef5daad4320de633c9898b8068c6cb3b19b4468b4445607559ddf719f97d2410e2872 -a1dfff82908c90fc38ec7108c484735f104e6ce7f06097e1e80f6545702b6a0bc2a2706203cd85162edb7e9294fdedba -b12a706311c617d6c19e964e296072afce520c2711086b827cff43a18e26577e103434c0086d9d880c709df53947b48c -88503a6f48cef2f5cd3efa96a5aacc85dc3712a3b9abbb720a2cff582a6ea3c2afc49288b6832c8599f894950843ac11 -83ed63e38dfbe062fe8c7e6bc2eeb5a116f1cc505c6b038990038de6051281f9062e761ea882906ccff69c9c5b8a4a25 -911090d5d0231dde1189408dca939daddcb69a812ac408d1326060f0220781bcc131c9229e6015540f529d9fb33d9b0a -8a8352f1d9e5c7e80276e4448f997d420d5a7e0e2d5be58ae4106f47f867d1caa478b2e714d9c3263e93e5cc4c7be08b -9362f1ea9995f9b3850ebb7c8d5bf95927ab5ea25ee00e85d7456b3bf54459798b1fffde049d445c0d0587b0ab0a1694 -8859502b391273f4a00b6c0e87e5cdae676b7baf6c402f12b3360db6a5dfb4931ece4da0e1e4d98c7a71c3d01a183a9b -a9a5edf474120f9bbec9485d8b1e6f83be68b10de3d765219b0bf3e5d2840e478f1fb2bf806d78a8b8ad22ec50cf7555 -82c75daf983b06e49f0d75a042dfaae8cc92af050293d9059d6e8b01ca3ab2597e7adfc1159ed805513488944e739fa5 -a5cf240f04a9bfa65b811702c923d209e01f9535e217fa55ae3e0d1eb3257d6749e5587e727091e860609d1df29a1305 -95608ab8ade1c9fb814bad78d9cc99a36ad3e9562d5319830e4611ceea508ef76be04639294be9062f938667e33bce6e -8e44181f35c38b02133473de15560ae6588ac744cfdaf5cdfc34f30ca8e5ff6c85eb67dddc1c7d764f96ed7717c89f06 -8007b6ddece0646b7e9b694931a6a59e65a5660c723ebdffb036cf3eb4564177725b1e858ed8bc8561220e9352f23166 -a2d9d10fa3879de69c2a5325f31d36e26a7fb789dc3058ee12e6ccdda3394b8b33f6287ba1699fce7989d81f51390465 -81993d0806f877ca59d7ffa97bd9b90c4ebf16455ea44b9fe894323c8de036c5cc64eacf3f53b51461f18fa701a5860d -a20030f457874d903b2940ec32fa482410efecb8a20e93f7406fc55ab444e6c93fa46561786e40e9bf1e3c7d5d130bc8 -80c72d4985346ac71a231e7bbbb3e4a91bf50142af0927e8eb86069303eb4ce7fca1aa5b919d5efc82f2f09b41949acb -91b857d2f47f1408494940281127ba4b9ac93525788e700889aa43402eedea002e70eded017f5f5263741ed3ee53a36c -97445d007f08e285ea7f4d25e34890e955dac97448f87d8baa408e826763c06cbd58dd26416ba038d6c28f55bcea2d3a -a409c89526c2886f6a6439e2cd477351fc7f886d1a48acc221d628e11895a4eedd426112a368a0dbd02440cd577880a8 -a2c6adc7866535f6ffc29e00be4a20fa301357e1b86dff6df5f8b395ad9fb1cdc981ff3f101a1d66672b9b22bd94ec0f -8887fc53ffc45e4335778325463b3242190f65ae5d086c294a1dd587f62dd0d6dc57ca0c784bf1acaa5bbba996af201c -9731d3261a7a0e8c7d2b11886cd7c0b6bb1f5c57816944cc146caa518565034cea250eeee44ddffaeb6e818c6b519f4d -afe91c706efb9ee9e9c871e46abde63573baa8b2ea2b61e426cd70d25de3cc8b46d94c142749094287a71f4dfadd3507 -ae7bdf6ecc4fc0d8d8a7fa7159aae063d035f96ca5a06b6438b6562a4eee2b48d9024dbe0a54cfd075eac39b7a517f2b -a382e5205bfa21a6259f42e9ebc11406b5da2aad47f7a722212fdd6fef39117dd158a9991ff95e82efa0826625168a1c -862760c80bf44c2d41c2a9a15c887889eaeea32acc894f92167fb6f72593377c228499f445ccb59794415597f038ac9e -b4e96595a91a611c4563d09f29a136a4c04f07be74dd71a6bbabc836617ecb95494e48971a8229f980b2189fd108d2e5 -b5e7200357317c36244c2e902de660d3c86774f7da348aca126e2fc2e2ba765fa0facd29eebcb3db3d306260e91a6739 -a64c7133156afee0613701189c37c1362e2b4414f7e99408e66370680c554de67832c30c211c2c678dab5cfcdcecb3f7 -88f4cb67b1db497a91a0823ee3541378133eb98777842d73e43ab99efe8aa52fa02dfb611c1691be23684618394988d6 -89a9382a147d7387d0ff9516ee0c75cd1f8ee23333f4a2c9693d1a8cbe03680bc5b10c43c238c2190db746cac409bf39 -ad510bcc067373d40b05a830bf96fac5487de1ad5b708a13f62484c09b00fba6c5b00b981004e5ab3f28e55c9a5bce26 -8384156d7117675547279ad40dc6bf81e8f9a57b2d8cfebeea6b9cd1d8534dc0cf704068bc3ba0815010cd8731d93932 -a818fb76e53165b2f86c7f2317d64cf5e45f48405a34560983cd88bfbd48369e258ce2952233a8ce09c464e07afcade6 -ab19a4ed90527e30796064634b66cdc023bc5966e2c282468f5abef7879fc52986d5bb873a796b077d10e7b374b60309 -a17dafe2484d633fe295f8533662631b0bb93cdb4e7cd6115271f20336f602f7f8b073983cd23115093c7f9891c4eef5 -804acbc149d0334c0b505a8b04f99c455a01592a12f64d1ec3b82b2f053ccc4107e47f418f813d6f400940c7c8700a4a -965e097a825d8511d095b247554ec736bcb3701ead3ba785bd425cbabd56f4b989764e0965a437fa63e7e16efd991fc0 -b6701675ca27d7a4084f06f89bd61a250b4a292ee0521b2a857c88c32b75f2a70b97f98abce563a25d57555b631844e0 -abbdf65fcbdf7d6551ccd8d6e5edc556f1ecd275ccd87ee2bda8ea577c74615f725aa66e0911e76661a77f5278e0c2b9 -ab715ae372c900239a0758a3524e42063afc605b8fb72f884dc82ab9b0ff16715f3fb2fd06f20f15f9e454f73a34e668 -b45f41ea1d25a90af80a8a67c45dea881775fed000538a15edc72e64c7aa435a5e4375dcdedc5c652397c02b0bc61b16 -86f7be9252f8ed9078e642c31a70a09639899f7ffcd7faaf1a039fec8f37e1fa318fba0ed1097f54fc55d79900265478 -a30e5ed4277dd94007d58d5a3dc2f8d3e729d14d33a83d23c44ddfc31c6eac3c6fe5eb13b5b4be81b6230cfd13517163 -87e723d916f5fcda13fab337af80354e8efe6b1c09ae5a8ceeb52df45bfca618eb4bec95fefef3404671fb21e80bf9db -a521b8a04dc3abd3e9e0454b9a395b3638e5394dc2d60e97fda61b0a1880d1d73a64a4633f3d7acbd379bde113240d03 -851686c79c5403d5f05fbaac4959fcbfdfb51151bec55e10481b3c16e3be019e449907ae782ca154f76a805543d5755d -8ec1929e746b6c62b0c3fdd8f4e255e5c707e6e0d8d57ff9e409ae2dd6e76fdb50af923749992cf92d1b5f2f770bafbc -9175f7b6820d47205c9e44f8c684833e1e81da46c1fdf918a4dcafbc3231173f68370d442a20e45f8902bcab76a4e259 -b4f66c698115333b5ac00c9fe09aa9e1e9c943fbb4cce09c7d8a6ed4f030e5d97b48e944fd6d3e69ac70f1ae49d35332 -b958878b875eead61a4416a4597b1c567ddbb1eaaa971033f4a656f01a277822c1f4ea3972045156c2a5a28d159f5ddf -8188de8ad5258024d0280137a40909d24748137ac7c045dddd2bc794eac8edd5850b9d38f568fa8174b2c0593bb57e96 -91152c7bafce7a0358152221081bc065796fa4736bfc7d78076a0a6845287cde2ee2a2c9b96f500297c0a00410634888 -a5328ab939a2d3bd4c21e5f3894c02986b6590ad551c7734be3f4e70380eb7bc19629e9031b886ce3b4074ee4edee63a -97c4d49db40e266bcedaacb55edca4e1ebf50294679b271f3a2332c841705089b5ba96ef2064040fa56c36bb1375a8d9 -85cf0514f340f9d865b32415710d7451b9d50342dbf2c99a91a502a9691c24cd3403cb20d84809101cd534408ddf74e8 -950c3d167f59f03f803dcba3f34fe841d40adc31e5be7eefff2103d84e77a7cbe4f14bd9c3dfa51cde71feb3468a9c00 -96a69624e29c0fde3b92caf75a63ac0f3921e483f52e398652f27a1ec4e3cc3202f17af1f66224731bc736a25638d3e4 -aeac4170cf4b967227f66212f25edc76157eb4fb44c84190b520ecc2946470c37da505790e225fd1b0682bef7fc12657 -a94146a04e3662c50c2580ae1dba969cbb3fb0f43a038729c9e8be6ed45860b2c7de74f248dfa50ccdbe2ecaf3f2b201 -917b8e2880e85b8db723631c539992ec42536146e7091d4a3f87d37f051b5da934d84393523814f19962c78e6cb12ef8 -931f140ff8f7de79e399f5cd8503558d566b5c2ab41671724dd38aed08dd378210f01ac8fa9911f3047993dbc10cf8c4 -859eb9b560bc36273694f8ae1a70d25e7f206013597c4855a11328162ba1254bb736f1ae41240c8ec8dea8db035e08f2 -b4ad2cb2c3a3e6ab1e174f2dbfb1787a8544f3c9109215aa6d33265ef269455e3cde9858738b4fe04711a9cf9050e7d4 -8a3b342b87b19c0cdb866afff60317e722013c02dee458ba71e7123edc8b5a9f308c533b9074c7dd0d684948467502d1 -89185ac5cc5ea8f10a1f2a3eb968bb5867376d3cff98ef7560b9a0060206c4046ff7001be10b9e4d7ad0836178eba7e4 -845f48301f25868f6d0f55b678eab1f8458e3321137dba02b4cfbb782cbc09f736a7585bf62f485e06a4e205b54a10b7 -931a6c523d4a66b51efadb7eefadba15bf639d52d1df5026d81fd1734e7f8d5b51b3f815f4370b618747e3e8eb19699c -8eb3a64fa83dcd8dd2258942aea3f11e9cf8207f2fdd7617507c6dae5ea603f9c89f19d1a75d56eaa74305a1284ce047 -912a5050ed6058221d780235fb0233207c546236316176a104a9761bc332323cf03786dbac196d80a9084790506e0a88 -945fe10ec8dc5e51aa6f8ba7dace6f489449810f664484e572bfe30c2fe6b64229f3c8801e2eb1a9cb92ff3c4428cdf7 -b62383bf99c7822efd659e3ef667efee67956c5150aea57e412cbd6cd470807dfaad65c857fada374c82fcfca2516ad1 -a727a31c45b2970d08a37e169ea578c21484dde15cb11f9c94eaaf3736652619ce9d3a44e7431d50b0e75b658ebbc1da -97bf54ea9b84b82e4616027bd903ef6152439f1c6a8e1bae6db1d10fdf016af2cac10ff539845833dfd1ddad1403aa8c -a08cf36437e010e59b2057aedb7192e04b16f1cc66382cdef3490b7ad1544ae51f03e87cba0fe43a275841c247a2a0cf -acafab9fa28c1a607df2246490b630ddda1ecf0885ad24c2ecb2c2c1b7b9c7de8066714bf5b9b25f61981d08576789ec -851f0375128d2782586223467d0a595f4c5baa79616622a32f7d6ce1f08af06f8a109bd6527f88d93367dba17be661e8 -a2f1187c2a7cbf776653ff834ed703dd32e68eaf36f0700709be929f4c0ce5fa1d9930d1e3ea2aa01c7a16239e66cb33 -b3721f4a5d24ca112f020cb3f849543bf0e7f84b470fb00126ae80aaaa6f2c208d8359cd82ad9fbafd3ef2ac70656fb2 -98773ac3ce9528c73cfd8e7b95976ce597f67e146357642ac4fb6cb35046f3f39cf6c4a7b5af5c7740dda358aa0d2d08 -92c883a5d820541692af75be1b25dd4a50a4b91f39f367a551a7d5ad6065a26b60d68221a01e4950559717b559c2626a -b82e46dd25fd1234dad26fbcd8bb5177d7b87d79d362ffb9c2f6a5c16eb2ff324d135996fcd6274d919634597869d772 -82a53ed356ced5e94d77ee2a7f6e63f2ad8240aff2d17c5012cf5d1f18512c88c24793339b565dfbb659bd7c48dcbcd2 -84d20c7859b35a1cae1ff2b486d50822f9e6858b6a1f089ce4c598970e63e7c0f7dfbcb3337845e897a9dedf9d449dd3 -974892e5cf5ee809e9353d00e9cd5253d04826a8989d30cf488528c5dcdcad7650e23b4d228c3eb81f6647d2035a9e02 -b2327854910dbf3d97fe668da5fc507e179c4bc941f39bdd62e8b6035f004449c467240f656417e501f32dee109f0365 -88888f73475613d45d0b441276b1dd55835b69adfb27e26c4186936dae047b85478cca56be8dc06107b89a28f3bbb707 -836ba22e40511feff81a5dace3df54e2c822b55e66874dd1a73929994ec29909ffc2a8e39bfc2d16e316b621eb4a5ec6 -a754cedcccf4165a8d998f326f3f37d2989f92ca36d9da066a153c4aab5a62bb0011896bcbf90f14c18e00488d4123bd -86c26fa9584314292c4b7d6fe315f65dadd0f811c699e6e45c95a7a4ea4886c57dc5417b67edd78e597d037c7689568e -b205589648aa49ef56637712490e6867aa3b85b2b31e91437a249fb51bdb31401bff57b865c9e27293b30014b4604246 -afab0843ede582e5a1898ee266235066b94ea378884eaf34919ceaacc0e2738e1074b6ed41e0a1dd9711563e24f0215d -996ed65fbcab7611eada5bd0fd592d3e44705098b8b1dfba6dcdbdcfa1382fe893fa55270a0df0be0e1938bd71ab997c -881bc448a5ef8c3756b67ecb1a378a5792525d0a5adb26cc22a36c5df69e14925f67c9cb747a2f7e5f86ba1435509d7c -b219303c02c9015c6a9a737b35fb38578ab6b85194950a0695f7d521206e1e12956cd010d4d6c3bc3fafd6415845d5d1 -91748829bbd005d2ec37fc36fee97adaccb015208b74d2f89faa2e4295679f7685298f6a94b42d93c75ca9d256487427 -a41d6fd33b9864ebc404d10a07b82ba9d733e904875f75526d9a1f1c1c08b27160dcdb9023c5d99b8ff8a3461d57281f -b68978d39c97d34f2b2fea61174e05e05e6e49cde587e818b584201cf59b7096cf1807b68f315119c6db8d6110b28a9f -b64e66cec798022d64ce52477475d27ea7340817fe7f570617f58c3a9c74071d7ea6b54743d4f520b62aecad9a3a6620 -87b2b9e1c1786b7824f239a857024780a1457e51c64599b858118885833fb87a17d408bc09dcc0607d15ec1e53683a74 -9814799bac07dab4f0c934cc3c051676ca13abd49cf8d4739864e5bb9f2a8474897695113f49239f28832a8658332846 -806931a1526a843a9c2045943d616a8102b02b1f219535a1f1fbda659a1244f1bfead52ca7f1851ff8a97169b91c9ec0 -b8678249595a9641c6404c35f89745b93d8e7b34d9d44da933a1b2f1606972624c5108f1c04eb42e454d0509f441ed9e -81426714851741045a4332eb32b6dfe6422a4a2e75b094fb7c3f37da85648c47ee8af1e54ba26f4e1b57ebe32d0e8392 -b7a1875ea3f119fe0429fd9068548f65cf2869f8519dbbce0b143e66127cb618c81d7578e8391d676b2f3963e9d87f43 -872220a803ea0c6294cdc55aceea42cfacfd7a482982bcb90c0361c351a900c46736a890609cd78f02fb5c8cc21fa04b -974f0380197b68205ff4bb2c9efe5626add52c0ad9441d7b83e6e59ddb2ed93ad4e9bbdbf33b3e0a206ed97e114ea0f2 -a840f2d9a74fca343aedb32ac970a30cbb38991f010d015dc76eb38c5bb0bfe97dd8951de925a692057262e28f2b4e9d -b0913c3ce61f12f9fdc4be3366ed514c3efc438f82fc58c4de60fe76098fbc033a580ec6e4531b9799611c89a8063a66 -a0180d533eee93b070dac618be1496f653a9a0e4e3455b58752bf1703ec68d0be33ec0b786f9431ef4208574b0ad316e -a4a6b871bc95d3aa57bed90e14a0a1dda6e7b92b7ae50e364593ce6773fbf736672b1f4c44e383af4c3cc33e017a545a -a3f44cf19fe52bacc4f911cab435a9accbe137bdbe05d34bdd8951531eb20b41d17e3540e8d81e6b3eea92c744562ee5 -ae6b6d0ff3b30ff0b7f9984ef741cba27ffb70d558de78b897199d586cf60622ec2d8a9d841712fe719cf0f97628842c -87abf72f98c81d6d3a57ab1e224fe4b502ab0d8090d8abc71791271550b721c220d4e2e7da3be94a20c0e63d98e39a50 -b2f73ebdfe7133af57353052f4599776e16862905e64d97e1020c4bb84132e476d1ab79a9fb71611410f3f9d56c95433 -ae1a928253af2b210d31e1b64c765fcbd20a96b8d53823a6b9b6e7fc62249abf4a66c6a6aedb0b687e7384af9a845e0d -99c54398627833ca1435718154de171a47c709e4d5c58589fdabe62e72f2a7a11ae561bc31d7cbe92df4aff23e08cd0e -8a1310bbf1a31fae18189479f470977d324dec6518a5d374ab2ffcc8f64412fb765df57d2ddf69b9a6efaeb2b4c723b8 -898312c6c0d3d3438229b19a8a233eca8f62f680c2897f4dd9bbcacde32c5996d56ac0e63e3e9360158761185491ce93 -81b3f965815b97bc6988d945496a51e4a4d8582679c22d138f3d3bd467ed1f59545da2d66e7b4c2e0373628ae2682686 -b9aca91c6e6f4199beb6976b28e0e35e36e8752618468d436b1cf00d8d23538d0747920e5b2c31f71e34dfe4d5c86a0d -b908f4aa18293295b8cacfda8f3ea731bc791074902c554764c603ab9a1de1bbc72654fd826bffc632d95ce9f79c27d9 -a7316ae1baf4b1196961d53be7fe36535499287aba9bc5f3bed4323039b4121b65bb0bd15a14c1b9cd8b65ede3566da2 -815e39208f205c5fac25ac9988c14a62ab01657c7737a24472d17b0e765644bc2cbb7ff1e8ea169b8b0b17b6996c4704 -89a451d2b740cdaa83ccaa9efb4d0ff5822140783979a4fee89eda68329a08c018a75d58bd9325bdc648b0d08340b944 -8cd08f768438c76bae6bee1809dd7be38ec42e49eb6a4d6862db7698f338bf6b4b409088e4f3d1c5bee430295b12a71f -a4bd8c312103a4bfeb25b0cfffec7a1c15e6e6513b35af685286333c1dce818ffeb52826f2f5bada6b67d109c4ab709e -93afbef5382d89fa539ca527f3e9b4a8e27ab69fd5d5023962cc6d8932b33cb4dfc5f14343e1a3749bfd5e100c9924e5 -8d8e69d046992ec9ff14f21840809166cae8e0e9e7c8f14fb29daf163b05abe6611daa4010960e1141c5ab24373fb58e -96f8e72e96ba673c9265e9cc312f6b9c3b931745fc62d2444d59404bb08e5fb02ddb60715181feb9971cbd954526a616 -8d444c2b8e4d0baadb79e3147a2ee20f1bfe30d72eb9a02f15d632185fb8f4e8c3116066f7de1ebfe38577aaccacb927 -971410c0b10e3698f4f64148b3d2148fc6a4a22217fcf4253583530a9d6fbec77e2cf6f7bb5e819120a29c44653de3fc -99e7e1857bd5ee57007b7b99494b1f1c6bf1b0abd70c054770427d59a3c48eda71b7de7a0d7fcf6084a454469a439b41 -8c8a4cd864894f7a870f35b242b01d17133cb5dfdf2e8007cd5f1753decc0d1fd41be04e1e724df89f1d727e760fdb15 -890a24328bdeaaadf901b120497d1efa17d798f6f4406661e46ecdc64951f9d123d724ab1b2b49e0e9a10d532dd6f06c -a7cbe1f42981c9518608569a133b0b449e9d67c742d62f0d3358112c97e65ee3f08ec0ff4894ce538b64e134d168e5c8 -87c976dea77b3b750c3a50847f25b851af95afbaad635f9bb9f7a6ba8f0c4faeb099dd777cf7eac41072a526474cb594 -9882aa5e9bcc4ea2dd3de4bb5a0878a672bea924b50c58ae077563b6df0268910a60e969d3da1694ae7394ad0d9acd3d -90d35ce677327c461fb5dcb032202e851af1d205e9d21a34ed2b95635f13f8fb8dfa470ea202ccfa4b08140d0cf1d636 -b3b4cbb521cce2b681e45e30a4d22078267e97ccdbdc611b2c9719705650dd87e0ca6e80cf2e174f8f8160be94232c36 -95892b00478e6b27ed09efe23a2092c08e691b4120336109d51e24efbf8aba31d59abf3cf55c0cdab1c210670b9743ba -8643018957fb8ef752673ad73102d0b928796c6496e22f47b6454c9ed5df784306f4908641ae23695db46ebfcfb0b62b -b166ce57669bf0543019ecf832d85164c551c3a3a66c05b17874bccd5d0ae87245925d6f8edc62ac13dbd5db265823a2 -89fb4800ce4b6c5900d58f1a216ad77a170ea186f3aa0e355840aeedcf374e92a15ae442800c9d60334544be020b17a4 -8c65e586215a97bf11ffc591bce5147b4e20750e82486cc868070c7736c3de697debc1f335674aef24b7afdd41922d93 -90f68ce0c97d2661d3df1040ce9c4fa106661a719e97c7b2d7c96f0a958930c57d6b78d823a2d41910261ae1f10e7b0e -adda85e1287371ccbe752aa2a3c1d5285595027ba4a47b67baf7b105a22fb8548fa2b5b3eb93ca6850ecc3995f76d3dd -b26535d218f48d6c846828f028c5b733594ce01186e22e412dd4f4a45b3d87d2ac1bfe5d54c987e4e8aaddeb86366d7d -a081bd86962ea3d4fd13df6481f3aeaabdd7ceae66f7bbb913e601131f95d016cf147d045253d28457a28b56f15643c8 -b3d852cef4c8b4c7a694edbf6f0e103f3ae7f046a45945c77a1a85ec8dad3423636a89058fafc6628aabff4dbb95c2ba -b424ffc94e06e6addc90a6324e0482814229b5902e2a266d0c2d716e40651b952bc9f00d7dad9b6050377a70a72c7f24 -b2cafd908cae0ca22eaa2d9a96175744897a20eb7b0a6d43b0098cb1c69e3cb55373888201e4ed32816655eb7d8a3dd7 -b61177ecf1ae9d7e7852d98cbf6080d9f1e33c90f2436720b4ea4690437e8c7850c3754768fc1312cb4e838d855c5ccc -81b486644e1ae22cf0ba3a37e1df34dc186c82a99ab35ad6f475c37babdea574ddfbe5811d4aa020581292a793d66bd2 -97ae848a823ea7a99f91834e537fb47208f616c08fe32c8f8fe06bd35c9b638698c513265d0b4de9e572a2f9692b98e2 -81b8fef4ea5d399c65e78f40e47c559ada86d890777c549ce362e7ab81b3bfb00d5ff4ae4ee30fd7bda7ee90d28f85d8 -aada6912cc748923ea40bf01922c06c84bc81b2ab0bb3664a0579b646f03d47ce88de733ac7f2cb9be4a8200584cdb71 -89b48b9c79332f8f58eac9100ada5bb7decdc4b1555c5d383e2c1ce447efb0ebdff9c50bb52bc3042107f33a61ab2520 -a32ecca8b870b2b6e9d10b5c1d8f925b3d629d271febad65abed316262bb283c60cade0e91047fbd0fac53ac6db372b9 -b829cd1f13409e3573a8e109c9541b0a9546e98b6c879a11152b5564477ada4d8cb4b3079040e05a5cb63d75ef11eaab -91f3b100baa19e960b170fe9e03b799faac5b9c6f305c56115940bf81f6e64dcb9cda77e8de70ed73a21c0e8a74acc58 -b25b5e872c84065aee04822bbcb4f3bdff57fbd7cea314c383765cc387786c17de3d5bb3de3ae3314bdede14542bfac6 -a89bea9eca1f5a17a3efccfa4987d8e5366b0dba70ef1fef43aaea83c528428d1498c8b056ac27f16e8946ee93f7028e -818a1f7b0b8b06ea0514d6b4a0296da4f69cb18ac8e48c5579e6ba2880b06215fcbe81672566b8b94fcc3c0cadecb191 -98dd6e6b4b4d63d9aa7464a2be08ae8babac4da7716a3f109340bc9187d59c6ca0c88e6877a67c65096f64a3ced22a4b -a2069c5bac4f6590042aefb37570cc20908b0df9d0130180f565ed8a53b4ea476a274de993561fb4d009f529fe7aa1cd -860b7ec2410f033a7b0c5ca08f88a0ad29f951a5ebd5383408a84367e92f1bd33bee3b87adef2466b7e33b47daabf30e -a408855a8414102c3cb49f47dda104edf0887e414723da59b6b6537ada7433529f6a4d1a4ad4fe311c279213cdd59356 -8ca0d81dcb43b89a4c6742747d29598ede83a185a8301d78c6e7f1c02c938441360a1ab62a5e571e3eb16fe17131cbc0 -af7875a495cb4201cdb26e23b7c76492f47f8dd4c81251de2397d73d4c8d5f419cdbad69ba88ef0dc3552e460dbcd22e -80e901e433dca34f3d386f39b975e97f7fc16c7f692808221fb2ee60c1aaa8db079cc48c7d72fd548aaf8dde8d0b8f05 -b6062319e13926416e57a0ffc65668bfa667e708a4e3f5cb26d8a6a32072f5b790d628052d5946c5068dd17cf4a81df8 -90094b569e8975f8799863798912dbf89b12d2c2d62b3e5fac7efc245436fcd33af23b8c509ae28c6591d3f020966e06 -a504f72d3d06a0c9b188a1035c7c6d80047451c378b6c5b2ffa1f8cecdb64871cb6440afb296974c0a528e5e563061a1 -959061c4924e133a419e76e000e7c62204093576ff733ce0b8ae656ec6045ef94c5a1f3c934fb76fa9188c5eb397a548 -a8b9d0b58de38cb86cb88fb039a7c4c0c79e9f07f03954af29013baa18fc2633883f8f9ca847209c61a8da378f9075d3 -b16d8341da4ff003ed6d1bbdb3be4e35654a77277341fe604b4c4e4a1cb95e61362094fb3d20ab8482ea14661c8b9852 -8ea4ca202e3aed58081a208a74b912d1a17f7b99a9aa836cfaa689a4a6aa9d9fbfe48425cad53b972000f23940db4c5c -96a372f55e9a25652db144ec077f17acc1be6aa8b4891e408f1909100cd62644a1c0296a3ddc38cd63ef46bef4e08462 -87df40018ab3a47c3782e053dbd020f199fda791f3109253334a71be4159f893a197a494de8f94d6f09efa5811a99977 -aff82d2ea6b3ad28d0ca1999a4b390641d727689dc2df6829a53e57d4f6418196f63a18495caf19d31fc23fdff26d5e2 -9091053c4a18a22d13ad309313b6d2133a96df10fe167f96ec367f9b8c789ecca7667f47d486fc5ba8531323b9f035ac -a4842090515a1faccc3d8cadbb234b7024254eba5fdfcef0d15265c7cec9dc8727c496ad4e46565d1f08504c77e511d2 -b1d8a37b1a97883d5804d0d2adaa8dbf0c2d334ef4b5095170b19613fb05e9c648484093d0c70d545cf9b043b449c707 -b1ea40f3dd1c3d437072f8adf02c32024f32488dd59389d1c3dfe78aca3df0bab7767f6ded5943cc10f50555da6092f5 -ad219c6a8149f10391452892b65a3268743baa7402736f810a35d56cdfed83d2172b03f15c205f0dc5446baf855907a5 -afe44c3e1373df9fc53a440807fa6af8ebc53f705e8ee44a162891684970b04fb55d60bc2595626b020532cb455ee868 -859ae154b017eae9be9da5c02d151de747cc23094d8f96d5db7d397e529b12fb55666f55e846e2bbe5e6f5b59c9d8b05 -8aa01354697de23e890fe54869cd3ec371f1be32064616ca3a556d3019541ba8e00d683f1396ca08e48988f7f7df5de4 -b8f682487460b9d825302c40a7d6dd0353ff43bf24cd8807cdfa46c043e3f5a7db182b27a8350b28e91888802a015af4 -b6d4d6c3ac40f8976b50be271cf64539eb66dc5d5b7cec06804dfe486d1e386037b01271cf81ef96dba5ea98a35a4b43 -9385a2fd1cd3549b0056af53f9e4a6c2dfcd229801ffda266610118ade9a568b33e75b6964e52fcc49c8e3b900e1e380 -98f4aa0e4ef039786cbd569536204e02b0b1338568d1d22bb5bc47b5e0633fb7ffe1da93eb9d825b40b9b7f291f84d51 -b7b3460cf706dc270a773c66d50b949dabad07075021d373c41fbb56228355324d120703e523ea3f345ef7249bfff99d -81b826255f95201987513d7987cdc0ca0529524d0e043b315a47583136dbada23a114d50d885bb3f855fa8313eff801a -afdc6c35161645a14b54f7b7a799910e2e07c8a5efe1827031a2eecd5d9263b3baa367fdd867360fabc41e85ab687e74 -817b361ce582153f2952f3042e235ee2d229e5a6b51c3d3da7bbe840b5c6ec2f01446125045848d15fd77dc46c8a8fe2 -aeb599265398af6e5613297d97d2b70222534590fcbd534d68b24a0289b6366ac8188b753f6fd1000ee73ef44f8fb7af -a5a9e528b606557be64460c1ad302a43e741357827b92ddc50766a7e6287740fc23bd528d9faf23345ce8bff527d5bc7 -a8d3b3b438d5f75efaae6ce7b67c2212899ece5b5bdc9bac655e271fd1846ea8560e646fdbded3d9363eefe29473d80d -984c7976d557e2f591e779c2885f5033da6f90d63a898d515b5da3adbffa526764cd8eb679b771573fdf7eed82c594ec -8ac748689cc3280e064807e68e27e234609e3cc87cb011f172204e1865ad7fdc78bec1672bd6e6fddcf4e7902b0f38bf -877bb392059540b1c8f45917254b8cc34fb7e423952bdc927e0a1622efec4113fa88988686b48134eb67ddebcb7c3ef4 -ac04b154ccd307ca20428091585e00121b61bae37b22d5d2a1565bc1134be3c81ccf3715fffebe90744164e5091b3d9a -90745c04278c3a47ceea491d9dc70a21a99d52648149b1ab623b5396b7d968fd3c4d1a2d08fc5638e8790463e0cf934e -80bf26ca7301e370f101cc69e7921e187cf5315b484fc80a872dec28bb65886569611a939958f4a3d2d3da4350011298 -87cbf4d6f0c06cc5f24e0f173a5f2f9bf2083a619dcce69a8347c1a6cd1d03325544610f2984eb87a13241e6ab9a22b7 -8909368817a515789ff4d19ed26afafa5729a24b303a368ea945a9287bc9facec9e1c8af19cbec8dab4acbb6a6ddf6c7 -ad8d2f82b08e0990dfd6b09fd54db3a30fd70aad218275550f173fd862347e1258a4716ca2bf4c40e4963850b2277eab -a9467ceacf9337cae4f2c7eeb3e03752ac7d77692b07d5e5d75c438fbe7dc2029ff84f7759372a0ddfa953b4ec7e9e38 -a5feb7669e84b977cb1a50ff3a39c28f7ad1ecc33a893fdf1ddae7a0d8a4c5f6fbaff25cc56631b708af038a961f3b55 -8f2e1fa07963ba18db890b44c3b9ae7f8992b702a5148679df69e4d9d4b1c082b2bd2ae53f96a4fe24b54f3dc1588f17 -896778f35cbecb43f001277c306e38a9c637275101f1a09546f87378b10ccc025644bc650b3b6c36e4fd0c09fbb3df35 -91dc702778176a4d089dc65502d703752dd9a766f125ffef26bdc38fe4abcae07cdea14102c3448d10f8dd6c852ee720 -a5df3004cec6b68b937cadded0dd2f48bd3203a903a3e1c22498c1193f4567659ecaaf3deb7ed7cf43796da9188f5dc6 -b18b4c8ffcb8599c24d9851abf8ee43047cbd4c9074c9cfbf88376a170da4554978988f550afde8a45306ca32713c204 -8370bc38c84da04d236e3c5a6c063e1db6613dcc4b47239d23efdcb0cf86846955b60da3e50f17b17cd3f7e0c29302d9 -ab7d6bb6be10aa52ef43abbe90945e78e488561afb959dc2fe768f8fd660d267c7203a2b7bdfa1b44cd07898f4849e06 -965c96047d82d76ec2cfe5035fd58d483cd2cb7f65c728ab3049562c5d1943096d6a5014c05babc697d79c07907cf284 -9614f7006aef6f0478ebd37fbf17276fe48db877394590e348c724059f07c3d1da80d357120d3063cd2b2bc56c58d9d6 -819c7b2a1a4bb4915b434b40a4e86dd7863ea85177b47a759bc8ecd8017f78d643982e8a091ee9a9e582f2b0208725a5 -8e159a185b5790a3ed444b6daab45f430f72f4ac4026750cbd5c7cd7947b5e00f2b10eaaf5aadf8d23054c5b29245546 -b48cb6f6c0aaea04833e10d735b67607846158b6663da380ef01c5bca3c9d537611716867dc2259883e5bc9daed57473 -8b48ce8b5ab76b7d662c29d0f874f5eec178baf3f14221bffd5d20e952f54f3ed053182a486da1d1f400e0acef58f673 -b6fd3cba177bfbcb5e7ebb1e3c1967cad5848c09c615ba2a6c277908f8b1f4f1ac5f184c33f2a401e8bdafcaed48bb88 -abd8f44c4a447de8fde1c119f4fd43c75b4cc99de9c817a019d219d4b2ad2a73b60606c27e36e9856a86bf03e7fc861f -af9f7e8b3e9e8599c7e355433c503a05171900a5754200520fd2afed072305be0e4aebb9764525d2c37a5a7eede72025 -a0960a58bd2681804edd7684793e3cbb0e20d1d4bd8721b192baf9aee97266be14c4ee8b3a3715845dca157ba2fb2c1d -949a37213209adfbfa4e67c7bad591c128352efd9b881c1202cf526bf4f657140ef213acf0efeb827a0c51a1f18809c4 -9192fae84a2a256f69a5e4a968d673bebf14ea9a2c3953f69fe0416f7b0fafa5166f3e4588d281f00d6deac1b6ec08bc -b1a249662f34a88d2798eae20c096268d19f1769d94879b8f1aa40a37b3764349b8e6ab970558436a88a5aa5c37e150d -aea87086dcd6de0b92886b3da0813ff271a7107ab1a3cb7021b85172c1e816a84dbb1a8fdb47e8a8eb5e6fcddd5b919a -a586b5078b3f113eec9f074430bcf9aabe4e82752e5b421c6e31d1c2a911512e34154bf8143b5197e820c5af42aa8ac7 -a6eda122e400a6600f025daa383685a10f72f62317a621698bd0106b331077b05ac1afc68ece7a2e285c54a366921a3c -8875e9ba654ad7b1d57ede84e2b702600416d40f7475fe2df25dd1b95c0178a227ee187547898e5b9d1ce8ce9ebd15c9 -af2cb289f8c75f4ddae9e3ef9c1977fe4d4d513e411777b03b996f5baa372eb995b5ca96255fad9ace776168806ecc42 -8d24c465d26bd93290f45ef035bb6dde4530d9d7d051baf583b1f8b98e9886de262c88b5709084710cffa7c767b4c27d -8cf35b1b28a7726645971805170392d522f5e7e6cb94157fe9c122a987051c1c90abe3c5bdb957ef97b1c45dd9bba05c -93e2bbd82a3cb872cea663f9248b21d4541d981f3f8d5af80a43920db5194857f69e2884753f6ed03b6d748dbfb33620 -8b774b97657db654ebdafce3654d645f849203452e876e49dad7af562491cb6531bd056f51cb5b2e8f0a99e69bd8566b -b5333c49d3e1c4c52f70f3a52f0ad77165bed6ad9dcbfaf1364e7a8a0f24570e85a218e4c2193f63d58a7dd975ceb7a5 -b4a34c443e4fdaab8e69fcda1fce5e72eaa50cf968f5d3d19084d049c5e005d63ab6e1d63dee038317da36f50ffb6b74 -824a224009c6848b92d6e1c96e77cb913fee098aaac810e2c39a0e64d5adb058e626d6a99be58593d921198edd48b19c -a86f1fdd2e1ba11ebda82411b75536fc0c7d2cdb99424e0896d7db6cae0743ee9349ffa5bff8a8995e011337fa735a9d -b406b5b89b8bed7221628b0b24eb23b91f548e9079a3abd18be2ed49baf38536a2c1ec61ab1ddc17928f14b006623e7b -8a7ea88d1f7420e2aaf06ee90efa4af798e2ec7cd297aacd44141471ed500107fdd93bd43b6de540314ef576646a7535 -a7a8c071e68bbae9aca110394cf56daad89404dff3e91ea3440670cd3d0423b67905e32b1ba7218fd4f24d2f8bd86ce7 -b959830f152e4d31c357be1ded5782aed5d6970e823cf8809434cf4fddd364963bc7cfda15c8f6b53eda16ab20ca3451 -b59232c8396c418238807ce07e0d248ad2045289e032678b811cc52730f99b480eb76f6adf985e6d5e38331d4bb2b9d5 -a14092fddecc1df18847ab659f6cf7c8603769a4e96fbe386d8303b225cebbbe8f61d6ab3dca08e3ed027e7e39f2641f -941cb0632acd395439f615c6b4b7da9ed5abf39700a8f6e6f3d3b87a58a1a7dbb2478a6c9ff1990637ada7f7d883f103 -951b8805ecb46c68101078847737e579206f2029e24b071bae6013e9dde8efa22bce28aa72c71708caf4e37f9789a803 -b2cbf22e53f6535fa950dd8de4aa6a85e72784dd1b800c7f31ec5030709d93595768748785ff2dd196fbedf3b53cd9d7 -8d84ea3a7eafb014b6bd6d57b02cab5ac3533aa7be4b86d2c5d53ce2d281304409071100d508ed276f09df81db9080ea -a2204b60836cba8bf29acd33709e6424226ae4d789ef6b280df8a62e30d940bc9f958ff44b5590d12fa99fcde2a4a7a9 -86692c58214f326c70eb2aaf2d8b26eae66fb624f143a3c144fd00f0249e30e0c832733a7822fac05c8fe74293768ace -b1cb3d64eb5b9ca0e01211128f990506fba602cd1417da02237205aa42879ae2a6457386da5f06434bcb757f745f701d -b3eb4290a53d5ff9b4596e4854516f05283f2c9f616ec928a0934b81c61afc351835f7eca66704a18a8b6695571adb30 -b0bfb1d44b039d067d7e0e2621e7c4444a648bce4231a6245179a58cd99758ec8c9e3f261d0adb22f9f1551fceb13e4a -a29320f71a9e23115672ea2b611764fe60df0374e0d3ff83237d78032e69c591a4bdec514e8b34f4b3aeb98181153081 -8a6abe9c8a048002b2ff34154a02c2f13fc6dbae928da47c77f3e5b553ea93d8f763821a6ead3c6069677870fdff7ff3 -b73ab66a62f427e1a5e315239a2e823e2a43550d245cff243c2799eb2e4701fabb7d5f9ce74a601b5ee65f6555dacf64 -b64858e98b9c10de8c9264b841b87e7396ba1da52f0f25029339ca1d13f7f9d97f4de008cfe12a1e27b0a6b0f2c9e1ab -807d2440d1f79a03f7163f5669021f3518094881f190cb02922eb4e9b17312da5e729316fe7ba9bfffc21ed247b033cb -a7f06458d47ebe932c2af053823433a8a06061c48f44314fad8c34846261c8c3f7f63d585a7930937327ad7d7ca31a6f -82ac2215eba9352b37eb8980f03374f5e0a2f439c0508daa7a32cdce398dde2a600e65a36795a4f5cc95bbcf49b01936 -a1882c83a2f946d54d74a008eac4aed70664db969e6799b142e0d0465e5662ba0d224a1cc33be339438d69bdad446ff6 -8009776f7a34a3c8779e21511fa409b0c5a38e172d1331acc29a16114e002f5f2f001381adb5fb3427a100752d775114 -b24441019af4a0df2dc68e3a736f358da0fd930c288398a18bb5a8d9a1e98ea376395f19d8e03a5f020b83fcb709f1af -ac72b4de3920c4f3c9b8ea90035cd7ed74d34b79e79aab392f057c3e992ebe79050cc1c6ccf87120e4162b29419147de -973e75577cd2a131a0bd568fd44e43554ac5a9ea3bf10f02d1ad3ac6ce9dc7a8a7ea93aacf3325f7d252d094a0de1376 -98a114de2a86f62c86862de37c328bf6a7fccff4d45a124addbe0eb64debe365409fcb72ce763f2a75030e1ff4060c64 -aff753e1dd4707f1a359eaec06ebef1903242889a2cb705d59dd78a79eb5b894731f5a91547479506145ca5768877dec -b856e4234858b5aa515de843e8bd4141c15a4cc02c51640e98a8aaa1e40344f1ff8ef7c3b913ea2ae7411713daa558d2 -863525eb2f8147a6d1d0d4304881795bfed348913cd7f38d815d929a426788b69e41f022dba5fdcaf56c85720e37fefe -a14ad76b145a6de2e0f8d4f615288c1512701a7b3010eb8a95941a2171bc23561e9c643764a08c4599040a3b4f5e936a -a18bfc66f6139dcb0485a193104fec2e7d52043837a4c0cadb95743e229712a05cf9ce4ccb482f36ff1ce021e04b574a -991c8e6678077d6e5f5733267c1819d8f7594e3b2c468b86a5c6346495a50701b1b05967e9590c15cef2f72bc10a38f9 -a034e7f9b547b047c99b99a0dd45509b0ac520d09130519174611de5bcdb9998259e1543470b74dcd112d0305c058bad -95ffe0d02317b5c6d5bfddbcec7f3fdfb257b26ad1783bb5634d983012e2ea1c6b9778009e1b6d10564198562f849ac0 -b3db442aa4adb33577583b2a4ad743f41efe0e1f87bfc66091d1d975333ffc00b4afc43057bcb88a7d68b0c9695d38dd -ad2e97d10d7c53d231619e3f2e8155a27ea4f2fb3c0cecf5c7f14f4cfcdd21f62ea46d843b21df748b2892131633fed2 -905d7aad6d3b56bad48694b6b20b27e370ebca8b91d0821e48e2f9cad39910c26cc11c77c266894db3d470485a63ed11 -99bfadefca796ce6af04ede65ba5ef5bf683ff7e2852bb9c406fda77b95ef382289853dfe4d933525071e4cab8ce3936 -94d9905ed4ef92107d0adb9ea38f085a2a24b8f792108bec702d747c215b1f14aafd486ea0c07ed42602b12d8f602b93 -a78dce23ca09dda2d5e7fe923290062546825286d624de35ac5756b6c8ae030e211f4f9c9c8d18a924f5880e3b383d1f -abce9e2128ff51fa17e73d93e63d7134859b2f328eedbcefb337c39e752d6750d9cffe6abfcd359c135dc5a12018827b -a9ea7d91e8a3524acb3182bedd7e1614d37b48f8eb2d8f677eb682d38408b8d512786d8bb65811f4d96788b9378e59b3 -912c9f804fb57dd1928f8274be58b42618f589fc72a7e5b6cb4d4b5d78c547f80737cdd77ebe5d2b71eaf60b8fd2b663 -b7227ec9a62d5538974547f717fdd554ab522d8782667fc3e9962e9c79a21134ef168371bf3b67e28d0964e92cf44028 -89440a781c812a19c758172bf722139598023ed0425374fbb0d91f33be7b7f62a36d7aa34696c4fb0da533bd5dd41532 -b31e4a9792d6e9c625c95aa3c0cd3519410dec07940afab820ef9f63017415d237a47f957d0b591b6de399ffc2a8a893 -a66ec47393df2693be161daaa88be0cf07b430c709ca97246d10a6080ae79db55c9e206b69a61f52512b868ba543e96b -90ca425dee74cc6a7e8eb1755cf9b7b76ba2a36ab851333b0fb7b35e8e6e189702456f2781ad87b4215993d62230ff4f -88b64741f93a2ae5d7b90b22a5e83c9d56bcee5c6bfcedb86f212acc776cc3ebd0b62cc025f596cd8db4f4b6a7aeebab -a1b6c7d2358bb201b42264f8fbebaa242ef105450bab21b4a2f16f368048c16ad1f3695841787eb33a0192f1f6b595eb -8a932f1cd227ceb18389791ed9ea1ff26571715ed1ab56601a994795713a8f7f031d1e8472ec3eb665b7bfbbca8ca623 -8bb2e34a2bf77f9f657dfc51ff296a6279a4d7d15860924f72b184fb7d5680320c7769954b9dac73c4bfe9c698e65e58 -af54e7367891c09f2cea44cc7d908d37d058162ec40059d32ded3983a4cabfe5057953878cf23bfad5292dbd0e03c0e1 -8a202532b9205385cf79f0299ddcb3156fd9fab09f9197bce762b5623f75c72ab1d74334ee6f0d289007befe222bf588 -83bd0f5896eaad58cfa7c88fc5ed505cd223f815dcfe93881b7b696cdd08b8b5ede03ea5b98e195c1a99c74ac5394c1b -b4a84d9940e58e3b4f804e4dd506f8c242579cfa19323c6e59047e5a1e35150699a2fab2f4862dba2f0ee4ed1d8970f8 -8c9ec477d057abebc2e2f6df5c4356a4f565bde09f499a131967d803d4bf36940ca2ed9d4a72adbe0a4a8b83fc686176 -8598f43c32623fd5b563d1ec8048ffc36db3d7f9b3a784299811687976f64b60585b2a2707050a3c36523b75d1e26716 -b55eb07014fe5ad3e5c9359259733945799e7429435d9bf5c72b2e0418776e329379433e17206f9f0a892d702a342917 -a5ed942eda7b36a3b0f516fafd43d9133986e4c623b14c0f6405db04e29c2d0f22f1c588150f670dbb501edda6e6dd4b -92b6abb28cefab2e332c41c98bfa53d065b7d262638389603a43f4431e6caf837b986254c71f7cdacf4d6cc4064b0195 -b01806178a28cc00d1561db03721eef6f6539676d93dd1fa76a13b42a31d38797e99b1848de92fd11821a342b04f3f72 -a2f10303437acfbb5912e186bbff1c15b27ed194c02cbc1c5b482b0b732c41fa809136e8e314e26b5bfe57690fe3b250 -9990207fcc711102e7e941b3ac105547a3e7301390e84f03086c99c6d3e14efff3a2e2b06e26227f496d88d5cdaa3af1 -b903cdb0c2fd578612398c30fe76d435cd1c2bab755478761244abb1e18ba8506fd9c95b326422affbcaf237309959d7 -99e0c12cae23f244f551d649302aac29bfdeb2c7b95578c591f512ad7ac562bd47e7c7317ac9bac52c9ea246617bdb48 -b996d267ab5149c1c06168ee41e403be83f99c385be118928d6e2c042a782de0659d4d837f0c58b26df0ce22049a5836 -989001b8414743765282f7e9517e4b8983a929341b8971d7dd8a87d246f6c8ba5e550c983566ddd932c22948f4fa5402 -a0b006a2c9124375364b8fc5ddb543a7468fa6d321ea046d0fd2bfdaef79e5e3600b3d56190733491ca499add1298c7f -80881d6f3ee507089b7dfb847fc53dd443d4384ef6fce878d07d9b4a1171eefea98242580e8a6a69664699f31e675cfb -adc48ef53d88b9d70409ed89cc3be592c4bd5eb65d9b1b28f2167dc4b12406889c00f2465c554f3aff673debc2997ccf -a62f5d9f167b9f4a4aab40d9cd8c8a48c519f64a1985823e20e233191b037c02e511b0280487112a9f8b1f1503b02db7 -b89aa2d4fb345a1d21133b0bd87f2326eb3285bd4da78b62174bf43d30a36340e4217dbe233afb925ab59e74c90fccf0 -932ba22acdd2f9d9494da90958bf39d8793af22417647d2082d2c3e6a5e17a2d14b0c096139fa8fa3f03967ca2f84963 -b67b107e71d96de1488b4154da83919d990502601c719e89feabe779049ddf7e4fb7e146eb05e754b70bbead4449efb1 -84509de1b8dc35aa2966d8a48501f725d59b4c65f3abf314b2009b9a573365ae3163c1f276708c66af17de180aae0868 -849153fe837a33fcb32c5fa6722c2db9753e984867c112a364eb880d87467782142d1c53a74b41df1dec7e900c877e1f -903d05c73ae043b69b18e980a058ce2254d008647a8d951175b9c47984164b34fc857108dcc29ad9df0806d7e90405f4 -a6b05917ac32c0b0eeea18f1ef3af5343778c543592078fdf6a1b47165013e2676bfe6a592a24efab9d49c4bd92b8fc0 -8648482f6947a5a8d892a39f098160aae1a648cb93e7724ea9e91b0d1a4f4150b91481f6e67d3bf29ff9d65ba4fa61a8 -a6ecaabc38895013297ae020686f04ea739c4512d2e3d6f2d9caf3f54000fb031f202e804ee615eb3357714a18657bcf -912f5935acc2dd20d5ef42b2ad5b307c925324a84a3c78ff66bc5885751934bd92f244e9636b60a744d750a2a7621198 -a0d6f261a776c5b114298f5de08d6e3372649b562051ea2470d3edfc376048793e18fc57ec84809b463dc72496d94329 -940744cd3118d1598c248b38503f6f1fbdbe7a147e683e5b3635140aa91679f8d6c1472600f8e9c36117a60203be6b4e -ab81737c839fe340f6f1fb7275811cb0c0d5fe8bbc265f6a56c6c68d0291bc7234eaa581ff26f8929d9a5bed4aac7002 -8df47341160f1c728c3e31be17a32e42b54faaa1286ef2c7946882ca4dd46443b8428f3654616c6e4053f1cda2e11994 -a721067e75c3c791f4d9f58d4810ac9621606e29c6badb593d6bb78c39968b45be1777ddb9bf03696d4d4be95b2dc1bf -a4e399213d3c4350c2d0cbe30757ba7e1f9680f58e214ff65433b36232323744c866a87d717851ba1dbd6769599f69a6 -b0be851d1e43dee27abe68f85e2330d94521b5f1c1a356ad83fcd09162c0ca9c2e88bccbcc5bacfa59661764361867a3 -86111bdd3dbfca232aa5802a6db41d639502e43a2e24cb06bb5d05c7f9b5ccac334d16b61d1c5eaac4fa0cab91113b46 -a4f805b11c174c34250748b9beebfb7c8c243198fb13463911906ee4effe7d331258a077e374b639a0c5cdcdff166b7f -87e4cf2c6f46d2dbac726a121127502921decf0195d7165e7bbeec6f976adb2d1c375eaa57f419895a2c70193215dc4c -8ff06de2c1c4d0744483bb4f7c5c80bf9c97b4df23e86c0bb17f1498ea70e0ee3af20827da5e8cb9d7f279dc50d7bd85 -ab112c0116471b4dc3fd1e6d918f99158eb7a08153e891ddbba2fe5bf0eeb188209e3019176e758231c3df937438136c -a67f89194e99e028a5da57747268e5ef66fefb881144043429920d222d37aaf268ebf73ca1da659fcdac3b4e7a65092a -b4da1dcc791566140d6abeaa2923cb6b21a6e6aaa30bb4cc70011e931eefa71f96b7e05358c0654bad7ce45191ab9fa8 -8283933231bca359db588c80e043ad6ea765fb0cba5ef233c5d514ba01ddd1b409efbadb368f26763402e4576dc4655f -97f568ce3edacd06f3e31a15462f5f9818a8c3fdbcf92b1ac5840b0b6e73166a154013dd52e85a18e8ead3fc9e54aca0 -a9cd1601c41e5ab2018f986443914fb703ddb6b06a36c06fb58065f2fee8e1751071ef924ea3ad76f0c19baccb1b5f8b -92aad71bb7e929cc35a48020d16a5822f4f106a7f59985005a5ae5ba8e8016ec33727610393498f56b4f353b3d5161b8 -89427780aa4e7ac894c681fbe2889153b94db883f17f109bc9caa93f0c259dda42aab502bbefaf572c56f70abbc42db8 -aa8cf76ff847dfe59534432ed8520bb48bf412c28497747dce04d2b2a54ba843c3be1564630cb49ec0217167847ba590 -a1570a6748a2303e74a31c2131d05ab372ec006ee92ef74c42f2e9a250663bebdfb3777e7ad91f50c954889a59c2d434 -a4c2b1bbc48199c31ea8d8196729eab00ce0200350d4aa9f23347a3289355e5828cb2f93036a14d2d9ec575fb3835239 -84819d0bedbaab5bf8afdf23f59a7ec5f50da3063cfdd1ef5fc4ca4c1fe68980b5c80e30a49f38e5816765e81dfc5a57 -a57cfb5e877b88202f589be777605deafbfc85ed1357af03a18709cfb4b668a271199899243cd3750f1cb77ebc40bba7 -8d95934bbb0efaf3339f27cb96de46e4486aa58a2c40dbc77c1c3ac7c27a228062824b9045c046631b2e286e8549603a -b99a8356abeee69f40cb3bd8c87e8039a1e076897dde430bfbf989dc495c48609a7122bc6c1d1c32ccac687b47d5558a -aac2edcf2fe5d3f1a84e8f1f27ece920eabe7793bf0ed5290cda380752e55d57a55a362c5253bebb71e4a55f2c437ff6 -af7c76876072c3b0091e22b9c5b27ce99bf1f0079ea1a7816ad9c06e9e5fc407595c7f4f9953e67d86fb2da656443dc3 -9175b64d104f78d3310c9c02f82e04c8e9878d2044ea5ee9c799846a3d23afa5fa2aa4af7350956136c69a0eed03cb2e -b3328e953317494a3d976e7f7c3d264258a5d4b2c88e12d06786a9e7b2affd41086762ef6124c6a6e5b6b028db933c14 -a49d166065e19d39299ee870229e4a04be81acd6af3a2201f3a291a025dd5f8bc3e676ee123cd4b9d8455f6a330b395b -85fa15bc8947ba03681d87b50bd2f8238b1c07849a7ed4e065053fad46aac9dd428186a6dd69dc61b5eba6ffec470831 -b6fcb2f694a47d3879b374b8b2967dcd59bd82a5d67ae6289a7326c18791b1b374e12571e8c8ea16a4bfc5525ced3ec4 -b6115f52566aa90ccac2aab6d2dbf46eca296d047db1eb29a1b8a2bc2eef7a24e90407f8dae528806aceb2a1e684d49e -9707e66220233f6a48a93e8dec7b253d19075eaa79238e519b82ce1ac5562cca184f8a1c14f708a96c34ad234673d646 -a0822903fb3825eae07ee9d3482277c0b8fc811856dfe4a51cf24b373f603924166fc5485185f99c4547cd6476b62270 -88dac6366c439daaeee2532b2ddbe206132cf6e12befbb8e99870ac684e04e62de150cba0e22e395a0b858948f40808b -a72dfba9caad3179f43fead0f75e33ba5342470d8c9cb7c86d30d2c7ce7244a8aafd1d558b0ec8e2a9436de2c2e95ccc -8d696046defcc32cc19954c559213100f0ba273ea12abb55ca7c42818071d853846bd4213af2c41ecd4442f6b4b511b1 -89d6f2d52cf65414da15a2fb1911c53afbfb50bb5f2638844abfc325ff2651cd9130be4beff05dc4046adfc44394a182 -afb91abd7c2a9cfe62855ede3c6960ad037fe8778364a2746ff7c214c55f84e19a474a9a0062b52a380d3170456ee9c6 -87f724a16ec8fdae8c05788fa3f823ecc3613df46581a63fc79b58f7c0dc2519b6b23e3dd441a0ca6946dfe4bc6cd0ce -86760f90f6bedfba404b234e90fbf981d26c29b87f2fa272c09540afa0f22e6682d08c21627b8a153c0feb27150458e2 -ad4d0342f255a232252450ce4209507ba619abfd1ffcb9c5707cfa45f89be41d88f1837acea993a1c47211b110250b4d -ace54b5889bccdf1d46c4ca21ed97cca57f7d12648381411d1b64afdfc64532a12d49655776ea24cf5eabe34145705ad -936dac693d0c1b1e5de1701f0bc46aef6e439e84bc368a23c0abe942eb539a2950e8929265786fcdb18d40a44bda14b9 -94fafbc544decec1d489b9ad6b23410b9de4779f9f44aabd093d7fab08340a4646a8cba31633e49c04d2690b8369a1d7 -98157e757f1a677c5d9d65c47759727a4dbc49fec2da4d9889c4ea90573fb42e2a8d72eaef92b782ac6f320970f09363 -8eaa0498c191c810c7e1ca7398f7c80dd0a7e7d7829ed07039490f60e7c2ae108843c06fe38fa36d45d63da46cba887c -a0ae116e5b0d2dccf83f056ad876037225687904e0290fe513fdc6b2dbe4cbf5fac1d828352e64734895895840b3c57c -b592b318dbbd7ec4872aae5e64bdf2305db2e5e8cfe0ad77b691f542ba5e066dd20b09b0b08ff0d798bd79ad946ddf7f -879e50c8c3e7f414ad2b38632bc482b71759cd561aeb2215550186ebb4559e4cf744cdf980512d8321954b3458d21e11 -aed5c6c7ce0407d7b2c04785fcb9deadb9b9413e37cef5b1d918f474cccc7de012fe1fa6f5fa93cb7ef9ac974d9fbc20 -892274a9f0afc68fa74be276c2a16de5cec674193f96b27a80bbb9f3add163f85716b531f3c920b98577a0225f84e8ca -938fb7a53266b997a7669596577af82f5289b160b7fcf06d76eee2a094696f6f12b28c2c65b833a52529a116c42e6c7e -892083929b6067f5045b1208f3dc8f0ee25bd0533a8831f5c23bb4ff46a82d48f0a34523359df5061d84a86b718d5060 -99159ae9574df6c16273eda66b6d8b79a327940e335b28c75d647f4744a009f4b5f0f385e2017bd3e7fbf59e629cd215 -a03e5757ef7738eba32d396923ff7ef82db2c15bb6adc8770fcb37260b7bda3be62473bc352a9a2ef7ec8ebe0d7688bc -ae3c24a85c9b1fa55158b2acd56d2016f70dca45a23f3ef7e0c6b096f4a7c54c14020d61bec7c7f87be4a595bf254209 -a920a6f9cc803fe31352fca39c13f8ac1e8d494fcf11b206092227c2af38469b1fbc068b8fe014800b70f137107aafc4 -b893853be57519ffa6410da605e7d3a746ebadec4788c7907f6e0dde9f20f5a6a01181148b874b3decf9b4814846a11a -b46f43918c5195729f6532439f815d1eb519e91005bc641a4a30ae88700982bf4ed07a342e77945780317c297c903755 -8e431bf4497d0ef6538c93c4bdda520179301a0104eebcfd104efa1edea876818d7d31079656f01a5ff76c4f5fcd71df -92e3dbcb580dfb9cc998f878052b0c3be1c5119e5249ae9bad3538ebb0f0c4ab5a959b04033b96d61836ef07784e6b64 -b712d9d63aa888156f4ec83e939c6bad53de18045f115f54fbf4261fb02f10a8a46a8d716ab43d4acbad3b02283c32fc -b2334e776988b4f772446a47c87416b4f19f9b44164a5f828424d3f35ef10baa56afe810d49b0b86b786b9c0227681a6 -a3f25ad18e435ef585fa90e6cef65a8ba327e5e33701979e27e64ef7d8e09e2591e52bff9c5749d35643456d18625685 -adcfa48ae43cac6fa9866b4cce10a243969965942c891d5e6c0e5b03bd4763f9b63779fbf40d26ac674534fe7cc478d7 -a0eb3448e045038740e2ee666e88aa0f8b8e24b1b55d7d4964f01bfc0c581f7e9d4c0e79f8cfbfecfa8b024b216c8ea6 -8110aa1d82f11965af4f4eedb4de09ee9c353481b2d7ee7a2bc2f302d2a5ae6c31ebc6451309ba7c305da41070b0f666 -b074fdad419d42783ebda17f19863aa499eec71fda5aab6cdcc389276b7bf08053795d15890175ca3dc89f6d8d17758c -a14665846d95d7d5f0b5381502080c822776ec0994ccb1ae1ffbb3f19205ce9c7c9bf9c2d2ca098807ce99f29e4f07a0 -b4884842670a333cb5548a842fa2971881e26b442dfab0b91d6bf3b4cbdf99adbbc9d14fe2bb46872cfcabedae85db30 -94549b01cb47ba16c0cf6f7522c833545397de0b3388c25d03e60132eddada6401682f9ffd8c50d1a61b4d2dde37461f -a790c9b4cec96e4c54777f3e03cea5769b20382cdcaf1de494bac2b9425eaf453eff643c62ab284cc1af33bbd36013be -b1b45fd298ed11609aa1ae6c5ac655e365bb451de1b9fc92aad40422ba85c6a454f33b8142acabe55171328c13d92edf -a74cea9e7096e38327064f058a3cdaa34e6eafaa9c7d58f753c40be67998152380fbd612b9dc0751bda7befcdffcc749 -b18978dfc5efb07b7ef992c7b0cf5d1b4ca551578b1dd13057b7aced8b1deb9f2036e1e3116248a803e922659d206545 -8153c07603cdff6622835a9853b795274390abf7197d7a192193bec44acb43e8cd50b56c11a03f4a2a27124c36974f3d -86b987f30bb9a37cc91d22dffffcd346ec5773e846a6c2b8f9e03b25ffcae859c470c901c4e29695d325dfe4eee927bd -af5e980b9507d10d5269c1a5d02bc16f4f009b663e413ea6a7c655250f3a21c608c12f4002269a05d3779907e7be7d69 -a6f737fab2af9f27bfb8ca87f5fdab6ad51e73ccf074e90576db57b309dfa0a95f9624526dfa4feaef39c388802f2ae9 -b7ed51f699f615f58a7ff4f99d52c4ce7a8d662843c1f4d91f1620fa119b80a0f6848f9fb6c4b9822dc019830e7dfd11 -b71f27f291aa6ef0723ed79c13a1c7a1c40198ffb780a129d9d20e250406bc91f459705b2b6674c9bb412a7b5dd9ff07 -9698cf8f638c3d2916fefa5f28c6050784479f84c2ee76a8aeda7e562630a6ae135b445ec4e29af8588ca5ad94a67f49 -9270aa5030966a9990d8bc71b00b9a7a1d7c1ad8f4c7f78a31b3d7f86467332f21407c74a89ba4f574d723acaf0d2042 -b1b82faceed8e2297cd49cc355471d15ff8dc2ccc78f6944c8f7a75d3ad1629a2e2f1d0a2ff7fa2b3c38cd19839aa5e9 -8a8c4ed49dc9bd961773edf8d41d04385b11bbd3577024639a39319cc7068380236bf73fce0b83e6535bd3f95cef0e65 -8d04ec1e7d148b7e66910ab45a0e6bf409612a3b560bfa784e26f2963152821c646a655cf17a0ce3d4ba4c4ebeeb4a1e -8e9d707f6186d93accb60813715ed1f6b3001ff6d2f87daf8b906bd0b988c1833b2ccd80dee9bdefb45901e81bb82971 -9762317ca6a5e6fe0b2991e0fa54b5fbf419dd0550d70074957d65cd7ebf79ceba607dd40d709ed635c822b3b4da2cac -82b53cd9a1eca2f5d3256723dc4b6531ca422bd87bab36243c727d1952db58d7288ab11467305d875d172ce165b1e4a5 -b4dbeafa05c87029ae257bee1ed7603645fab41f6ba7ac8b57ced5b4774a72ba3e671c2433a93acc3c498795b5cccc42 -a916d3ab7f0e7cef294e11c97c910a19c338ad8e615406e6d1c8995b4a19c3b2527100cc6b97a950ec5a4f3f6db7d01a -b9a785c7123609bdc96f8dd74500c6c77831d9d246f73244de964910b4045ce3242c881271bb1a4bc207d67de7b62e97 -b5f94084f695d0821c472e59c0b761e625b537c8ae3a09f11d9a57259e148cfadba1e43bf22c681b6b32390121cec208 -8f91b36d8570f19a90cf3ed6d5bb25f49a3315ddb566280c091fe2795c4e25ed2c6a1ef8d2669b83f2d7bb78fc8c40f5 -80f27359a73ed8fdd52762f0c7b9f676be2398b1f33c67877261480bf375f975f626c2ca3e7a9f59634db176ed672c98 -b96b91e3d5148ca793edefe4ca776b949c9305acb6f3a3cf87767a684014d2c8f2937c2c672eef8510f17d2da5d51385 -99c4e1ca2cabd4388ea2437dbdf809013d19be9bd09ff6088c8c0cfdb9ecf8fd514391a07b4288dd362434638b8834d9 -b6fdfb812e145f74853892c14f77c29b0c877d8b00055fd084b81360425b3660cd42236ecc853eadb25253e1cd8445c4 -a714af044ef500104576898b9409a9a326ef4286a45c3dae440bd9003fdf689c5f498f24a6f6d18502ce705c60a1cf14 -a9444e201be4a4d8c72119b3d3b13098afee6e5d13c5448fa2e9845cc9188239778f29b208749c960571dfa02b484f05 -91c826a6b8425f93ff395d9fdfa60dbfa655534c36c40a295906578540b9a0e6b94fd8d025b8b8611433022fbbc4fb0b -a355d76bc3cc48ba07026197130f25a593ec730d2ef0d5d2642bfcad745ecbe5c391324bc2485944060ff3100c952557 -b5f9b5a289a6f9a7252cc1f381c892bdb6836a5998f323ee21ae387936148ad1ad7cc6eca37ecece36404b958ae01e8e -a3c7ae04a6208851f6cc40ff270047283b95218905396c5dedc490e405061cbefd1251ecf77837d08c5ec1c77d2776ce -aa02ee387dd2cc7a23cf5cd582da0bc84bb33a7158d76545cbd6e06b26a6f30565dc712d7a8594c29f0529a892138802 -8aff025c841f167fadaf77a68284c355ace41d6df3a9f1e41a6e91454b336f0b69ea34cce495839b642a7c43997a8fd9 -82eccf0b6b4b6460f676d677266451d50f775446df313fc89bdf4c96e082340f6811939d215a54ba0fe30c69b3e43e25 -af324d871b038ff45a04366817c31d2c1e810359776fb57ac44907c6157004e3705476574e676b405d48a48bfb596f59 -9411dcca93ef5620ce375f379fea5c1017a2dd299e288e77b1ab126273631a299d7436f3bf3c860bf795e5faaaefa804 -934fca809e66f582c690c3778ea49de2e7940c0aeb8d7edad68f2edccdfda853d2c4844abd366fbc2215348935e4b2e2 -a1b1fa4c088418f2609d4dea0656b02a8ee664db25f40d53d8f4b1be89a55e5abecbf2c44c0499874abeb3d3a80acf71 -ae6ed7a0ba6280c679b0bf86111afad76fc5d930e9fb199df08134ba807f781d7e0b8b9b2c8c03b02d8cc20dbe949a28 -937d200a72fe4ab8d52f6cb849e322bc5959632b85a93c89744b33e832e8dcf1dddd6ffac0c049b03c105afb8930f7f5 -b4b4a46ebe0c5db16004933c08ad039d365db600a13d68be5346b1c840cce154f56c858874e866de8c3711e755c6e5dd -afcbcb7170c8caa2b77d2b3388dc2f640aeb9eff55798aeceb6eb6494438be05a2ae82f7034b2d439a45ad31d8c64b07 -a2c676273081b8761f58e0b11306ddb6a4cde3d90e7c47b434468700c5b749932819b01efd7637ca820e10fc28dfb427 -b445715162d834c9ee75ac2ff8932ace91c8242d67926b2a650217e4765e0531c2393c9438a52852d63dbbe2cceaafc5 -a0c0ebdc1480fb238a25fbfc77fae0db6e5e74b91809f0ff20a819e56b8c3141549615d1bd7b99829898f6028e8c86be -b3d11933e9d1db8ca617934261ed26c6f5ca06ba16369e7541482bf99c4f86520d43fbb10f4effb2fdf3cc70a189fdb5 -888ac610f8fd87a36b5646e1016eaf6dbca04aa0cc43f53a1046d74a658c4d2794606e79fb07fae57cf9d71ed339f4b6 -979818dab00c58435dc0d0d21185943f95819d2a13531abd2d798e1773c4bbd90047f4eebe117868743db75604a50227 -a6fbcd2656e475065fe44e995e8e2b5309b286b787a7597117e7acc3bb159e591a3e7304ef26f567b5720799d8ae1836 -a03f0ac08d2101ec4d99ca1443eea0efa767a65448a8ecd73a7818a99e863a04392bec8c5b8e5192834e8f98d4683f13 -b3c4ea8c6c3ee8aab2873d446ad702000b0e927e0991c9e30d83c6fe62a604efdc3ac92453313ff0d5e0ac6952922366 -ab25c857f26830631113d50145e961441b5e35d47b9e57f92466654dffebde43e4f78b0867d20929f97c2888c2f06509 -98950aa5a70ef41f274775f021a284d4d801a2efe2dea38460db8a3a8c08c243836d176e69127c2cd17497b0ca393e9e -a9698113febfb6d87fcb84bad82ce52d85a279d3a2933bdd179d53cfe8d6c6c68770e549a1e2947e7528a0e82c95d582 -832b504513266259db78478bd1b5a3b0f3bf2c6d25f1013e64bf0cfae9dc23da8ecd25f7f1047d2efb90e5f1d9b4b3cc -b588bba7bcc0d268ab260d5c1db2122cee7fd01583c7cc27a8ae6b48b29f34c6ea8a6acbb71b9b09c6156ec0a0766142 -a73d2223c7afadc381951a2e9e7bcb7b5c232369f27108c9f3c2ced2dc173e0f49531d0ca527eb142fbb70285307433f -9152cd6b97bd3278465348dde2095892f46342aed0e3d48675848c05b9aee6ef5ad7fe26e0dcd4ab176532289d40eedd -a7812a95a43b020721f688dd726356dda8ebe4de79b4f0fdef78615795e29681bff7c6ff710ff5b2d6ae3fd81bdb8507 -83724c16049e9eaae3269ea8e65caa212f0592e0190b47159bb3346208ccb9af3cfe8f6c3176fa566377da1046044ab8 -877634ec37c7dcd3b83705b103c31013697012795f11e8abf88d54bc84f2c060f665f0c3b14ef8087d3c6a8a7982d64f -b3e53aaacef7a20327bdbba8cd84513534d2e12fd5e1dcf2849f43146e098143b539ebd555623d0ecc46f5ebb4051fca -952d58ecafca9b7ffc25768ee4f05ce138f0289d72978eb5e5d3b23a0daedcb17478890afdce42e30d924d680e13c561 -a10dcc725f9a261de53dd3133858c126f6aa684cf26d92bce63a70e0ff5fff9610ad00d2b87e598b0a7548cfd1ffe713 -b7bc5d0c6b665d5e6f4d0af1c539d8a636550a327e50a0915c898ac494c42b3100e5fae0074c282d1c5073bf4a5456fb -8adc330d3b49ddf3ed210166afc944491aaedb28cb4e67472aeb496f66ce59184c842aa583bfb1a26d67d03b85065134 -b2df992a1310936394a1ebca94a7885b4c0a785638f92a7b567cfb4e68504ac5966a9e2b14891d0aa67d035a99e6583a -96f5da525d140739d19cebb706e2e1e0211edea1f518e040d361d5aca4c80f15be797f58cb4cd3908e4c360c18821243 -b2c0d9173a3d4867c8842e9b58feb1fb47f139f25d1e2332d6b70a85a58811ef99324bf8e52e144e839a4fe2d484e37b -ad95a7631ddb4846d9343d16533493524dfd22e8cbfc280a202343fccee86ab14446f6e7dad9bad9b4185c43fd5f862e -97f38ab82a51a7a792d459a90e7ea71c5a2f02d58e7d542eb3776d82413932737d9431bd6b74ec2a6a8b980d22d55887 -ad4e4c57ec3def5350c37659e8c15bd76d4c13d6de5453493123198dda2c2f40df349f20190e84d740a6b05e0b8f3deb -a691bc10810d11172a6662e46b6bbc48c351df32f325b319553377f525af44a50aaa02790c915b3a49824aa43f17fff0 -a80ccac79bb4014ee366dbf6e380beb61552bd30ef649d4ec39ab307e4139b7775e776fab30831517674ff3d673566f6 -b11e010b855d80e171705ab9e94364c45998e69d9120e4ca4127049b7a620c2eec1377356e7b877874e767f7c44afef4 -96bfab7777769a1e00ce16ada6667a0d21d709e71bd0371c03002427d138d9172640cdd5c529c710fea74bb9d19270c7 -a5bffd2c30e29633b4ecf637c1e792c0378252e2a99b385a093675940b48de2f262c275332ed4765f4a02467f98e3ddd -8d11929d67a6bd8a835b80660a89496250c766e713bddb2cd7052d67b92c39a38ce49005d38b4877856c4bef30fb9af4 -8e704597a0dba1dbd1ff8c9755ddac3f334eeeb513fd1c6b78366603ebc1778231deb8e18f2889421f0091e2c24d3668 -904fbb3f78a49e391a0544cf1faa96ba9402cba818359582258d00aff5319e3c214156cff8c603fbc53a45ede22443e9 -af12ac61eaa9c636481a46fd91903c8a16e7647534fc6fd9baa58ae2998c38ffbd9f03182062311c8adfef0a338aa075 -87f2e544b2993349ab305ab8c3bf050e7764f47d3f3031e26e084e907523d49e1d46c63d0c97b790394f25868e12b932 -a279a7bef6de9d4e183e2bedaf8c553fadfc623a9af8785fe7577cadced02b86e3dab1e97b492d4680c060ea0126abeb -8ece08667ed826f0a239cea72e11359f7e85d891826292b61d4edbdc672f8342e32c66bec3e6498016b8194168ba0e0d -90a15162586e991b302427bc0307790a957b53ab0e83c8b2216f6e6302bc496cb256f0f054ff2cccdfe042763de00976 -9966c0413b086a983f031a39080efde41a9fedcaf8e92897ce92e0c573b37981f5ea266b39dc4f4fb926a1bce5e95ad7 -9515be2f65a57e6960d71bfb1917d33f3f6d8b06f8f31df30fc76622949770fea90ff20be525ae3294c56bc91efb7654 -86e71c9b4059dc4fd1ce7e28883e4f579a51449cab5899e371118cdb6afe2758b1485961ca637c299896dea7c732151b -8695b4ff746d573f8d150f564e69fe51c0726c5d14aa1d72d944f4195e96165eca7eba8cac583fd19d26718b0ce3eb61 -813eecf402151c99c1a55b4c931716e95810fc4e6d117dfc44abbf5ef8dcdf3f971d90d7fa5e5def393681b9584637e0 -a9caf7219eed1db14b7b8f626f20294a3305ed1f6c22f6a26962772c2fa3e50b5234f6d9ba7fa5c3448824c2a15271b3 -b2b2ee20de9b334f2d82cbe0d2e426ca1f35f76218737d0069af9b727a1bfc12d40cf8b88d4afcbeaadf317b7f7ad418 -b853960749521a17ff45f16ac46813d249c4e26e3c08fd33d31ef1ed2b2e157c9cb18bd2454fb5c62690bdd090a48f60 -88772297d2972471b3db71f3ddbf5945a90154768ca49fa6729a5e2299f1795445fb3d4d969d1620e87dca618fbc8a6c -a2bb783fd13aee993e3efd3a963ebc8a8eacfc8450042f018f2040353de88c71ac784b0898bdff27f606c60a3d5ef2c6 -9210903ac619edca0cb8c288ed6dcc93c472f45182cd6614a8e2390801ddea41d48a4ac04a40e2f0adfd48f91aabe2ea -a621d00f83260c22db9fa28757ea81dabcc78b10eeaaf58b06b401db6cc7a7d9a6831a16f171ead4e8506d0c46a752ca -b25c525bf6761a18bbd156ac141df2595940c7b011ed849dbb8ac3a2cd2da6b63ba4755324d70dc14c959deb29fb9ad3 -a35111d0db3e862e1b06249d289e0fc6b110877d254f2ae1604fb21292c227a8b6d87dd17a7b31166038d6860b1bd249 -90bf057309867d95f27637bd10ef15ceb788f07d38aca7ad7920042293d7c4a1a13d4ca1d6db202864d86d20a93e16cf -a88510e110b268d15dcd163ba1e403e44b656771399ac3a049dcb672a1201e88bf60bdd1d303158888a3d30d616cc0bd -b33b7e1f765e9cbd5eeb925e69c39b0a9ea3348ab17f1dbb84b66f4a4b3233e28cbdeb0903d6cfe49ec4fc2f27378ff9 -b777da64fa64d9bc3d2d81b088933fce0e5fcc29c15536159c82af3622a2604c2b968991edea7b6882c9e6f76b544203 -8ea598e402a056fd8031fbf3b9e392347999adc1bd5b68c5797a791a787d006e96918c799467af9ac7f5f57eb30b4f94 -b6901a389bf3b3045e679d015c714d24f8bbe6183349b7f6b42f43409a09f0d5bd4b794012257d735c5fdf6d1812554b -b5866426336d1805447e6efc3f3deb629b945b2781f618df9a2cc48c96020846e9108f9d8507a42ba58d7617cb796c31 -a18ccc6ad1caa8462fa9bec79510689dd2a68d2e8b8e0ddbeb50be4d77728e1d6a18748a11e27edd8d3336c212689a4d -abbd48c48a271b6b7c95518a9352d01a84fb165f7963b87cdc95d5891119a219571a920f0d9ceedc8f9f0de4ab9deb65 -94a4e5f4d7e49229e435530b12a1ff0e9259a44a4f183fb1fe5b7b59970436e19cf932625f83f7b75702fd2456c3b801 -af0a6f2a0d0af7fc72e8cb690f0c4b4b57b82e1034cca3d627e8ef85415adec8eb5df359932c570b1ee077c1d7a5a335 -9728025e03114b9e37ed43e9dcba54a2d67f1c99c34c6139e03d4f9c57c9e28b6b27941d9fca4051d32f9b89bec6537b -941601742d1e1ec8426591733a4f1c13785b0a9b0a6b2275909301a6a3c6c1e2fb1ffa5fdcc08d7fb69f836ae641ced5 -b84b90480defd22f309e294379d1ca324a76b8f0ba13b8496b75a6657494e97d48b0ea5cfdb8e8ac7f2065360e4b1048 -95cc438ee8e370fc857fd36c3679c5660cf6a6c870f56ef8adf671e6bf4b25d1dbad78872cc3989fdfe39b29fc30486d -8aafba32e4a30cad79c5800c8709241b4041b0c13185ea1aa9bc510858709870b931d70b5d9a629f47579b161f1d8af7 -865b0155d9013e80cba57f204c21910edbd4d15e53ae4fee79992cb854dc8b8a73f0a9be92f74893e30eb70f270511bc -b9a49ce58d40b429ac7192cdbf76da31300efc88c827b1e441dd5bdb2f1c180d57808c48992492a2dc5231008629159f -8d1438b10f6cd996494d4c7b5a0841617ec7cf237c9e0956eac04fda3f9ded5110ec99776b816e3c78abd24eb4a9c635 -af2dd18211bb8a3e77c0a49d5773da6e29e4e6fa6632a6eeb56c4be233f6afe81655d977932548de2be16567c54ffbd7 -92b92443f44464f2b48002a966664a4267eae559fa24051983bcf09d81bed5bcc15cb6ff95139d991707697a5d0cc1ab -a1864a2bac0c0dd5b2fb1a79913dd675fe0a5ae08603a9f69d8ca33268239ac7f2fed4f6bf6182a4775683cb9ccd92a8 -948e8f1cf5bd594c5372845b940db4cb2cb5694f62f687952c73eb77532993de2e2d7d974a2ced58730d12c8255c30a2 -aa825c08284fa74a99fcfc473576e8a9788277f72f8c87f29be1dd41229c286c2753ff7444c753767bd8180226763dfc -8384d8d51415e1a4d6fe4324504e958c1b86374cc0513ddf5bcbffabb3edcf4b7d401421e5d1aa9da9010f07ef502677 -8b8223a42585409041d8a6e3326342df02b2fe0bcc1758ff950288e8e4677e3dc17b0641286eaf759a68e005791c249c -a98a98cc2fb14e71928da7f8ce53ab1fb339851c9f1f4bceb5f1d896c46906bd027ef5950ca53b3c8850407439efedd4 -866f44d2e35a4dbffe6cd539b6ef5901924061e37f9a0e7007696fb23526379c9b8d095b417effe1eecda698de744dcb -91774f44bf15edafdf43957fdf254682a97e493eb49d0779c745cb5dbe5d313bf30b372edd343f6d2220475084430a2e -ab52fc3766c499a5f5c838210aada2c3bcc1a2ec1a82f5227d4243df60809ee7be10026642010869cfbf53b335834608 -a0e613af98f92467339c1f3dc4450b7af396d30cefd35713388ccd600a3d7436620e433bf294285876a92f2e845b90d0 -8a1b5ca60a9ae7adc6999c2143c07a855042013d93b733595d7a78b2dc94a9daa8787e2e41b89197a0043343dbd7610f -ae7e4557bc47b1a9af81667583d30d0da0d4a9bb0c922450c04ec2a4ae796c3f6b0ede7596a7a3d4e8a64c1f9ee8ff36 -8d4e7368b542f9f028309c296b4f84d4bde4837350cf71cfe2fa9d4a71bce7b860f48e556db5e72bc21cf994ffdf8e13 -af6ed1fbff52dd7d67d6a0edfa193aa0aab1536979d27dba36e348759d3649779f74b559194b56e9378b41e896c4886f -a069ba90a349ac462cac0b44d02c52a4adf06f40428aef5a2ddff713de31f991f2247fc63426193a3ea1b1e50aa69ded -8750f5f4baf49a5987470f5022921108abe0ead3829ddef00e61aedd71f11b1cdd4be8c958e169440b6a8f8140f4fbf9 -a0c53cefc08a8d125abd6e9731bd351d3d05f078117ff9c47ae6b71c8b8d8257f0d830481f941f0c349fc469f01c9368 -94eea18c5ed056900c8285b05ba47c940dff0a4593b627fdd8f952c7d0122b2c26200861ef3e5c9688511857535be823 -8e1b7bd80d13460787e5060064c65fbcdac000c989886d43c7244ccb5f62dcc771defc6eb9e00bae91b47e23aeb9a21f -b4b23f9dd17d12e145e7c9d3c6c0b0665d1b180a7cfdf7f8d1ab40b501c4b103566570dca2d2f837431b4bf698984cad -847a47c6b225a8eb5325af43026fb9ef737eede996257e63601f80302092516013fde27b93b40ff8a631887e654f7a54 -9582d7afb77429461bd8ebb5781e6390a4dde12a9e710e183581031ccfacd9067686cfaf47584efaafeb1936eae495cc -8e4fd5dbd9002720202151608f49ef260b2af647bd618eb48ebeceeb903b5d855aa3e3f233632587a88dc4d12a482df9 -87b99fe6a9c1d8413a06a60d110d9e56bb06d9f0268dc12e4ab0f17dd6ca088a16ade8f4fb7f15d3322cbe7bfd319ae1 -b562d23002ed00386db1187f519018edd963a72fca7d2b9fcaab9a2213ac862803101b879d1d8ac28d1ccae3b4868a05 -b4cc8b2acacf2ce7219a17af5d42ce50530300029bc7e8e6e2a3c14ff02a5b33f0a7fecb0bb4a7900ea63befa854a840 -9789f0fe18d832ff72df45befa7cabf0a326b42ada3657d164c821c35ac7ed7b2e0eba3d67856e8c387626770059b0c3 -986c6fe6771418549fa3263fa8203e48552d5ecb4e619d35483cb4e348d849851f09692821c9233ae9f16f36979c30c2 -a9160182a9550c5756f35cea1fe752c647d1b64a12426a0b5b8d48af06a12896833ec5f5d9b90185764db0160905ca01 -82614dbd89d54c1e0af4f6ffe8710e6e871f57ef833cbcb3d3d7c617a75ec31e2a459a89ebb716b18fc77867ff8d5d47 -8fc298ffba280d903a7873d1b5232ce0d302201957226cddff120ffe8df9fee34e08420302c6b301d90e3d58f10beeb9 -898da9ac8494e31705bdf684545eee1c99b564b9601877d226d0def9ec67a20e06f8c8ba2a5202cc57a643487b94af19 -88218478d51c3ed2de35b310beedf2715e30208c18f046ee65e824f5e6fd9def921f6d5f75fd6dde47fa670c9520f91a -89703ae7dff9b3bc2a93b44cdbab12c3d8496063a3c658e21a7c2078e4c00be0eecae6379ee8c400c67c879748f1d909 -a44d463477dece0d45abb0ebb5f130bfb9c0a3bbcd3be62adf84a47bbd6938568a89bc92a53ca638ff1a2118c1744738 -95df2b4d392143ee4c39ad72f636d0ed72922de492769c6264015776a652f394a688f1d2b5cf46077d01fda8319ba265 -aa989867375710ed07ad6789bfb32f85bdc71d207f6f838bd3bde9da5a169325481ac326076b72358808bd5c763ba5bb -b859d97d0173920d16bc01eb7d3ddd47273daac72f86c4c30392f8de05fee643e8d6aa8bebdbc5c2d89037bc68a8a105 -b0249ec97411fa39aa06b3d9a6e04bbbcd5e99a7bc527273b6aa95e7ae5f437b495385adaefa4327231562d232c9f822 -8209e156fe525d67e1c83ec2340d50d45eba5363f617f2e5738117cdcc4a829c4cc37639afd7745cbe929c66754fd486 -99fd2728ceb4c62e5f0763337e6d28bf11fbe5df114217f002bc5cd3543c9f62a05a8a41b2e02295360d007eaab796a6 -902ebc68b8372feeaf2e0b40bd6998a0e17981db9cc9d23f932c34fbcc680292a0d8adcea2ad3fb2c9ed89e7019445c2 -8b5653f4770df67f87cb68970555b9131c3d01e597f514e0a399eec8056e4c5a7deed0371a27b3b2be426d8e860bf9f2 -8f5af27fdc98a29c647de60d01b9e9fd0039013003b44ba7aa75a4b9c42c91feb41c8ae06f39e22d3aed0932a137affa -81babb9c1f5bcc0fd3b97d11dd871b1bbd9a56947794ff70ab4758ae9850122c2e78d53cb30db69ece23538dc4ee033e -b8b65d972734f8ecae10dd4e072fa73c9a1bf37484abcfa87e0d2fcecac57294695765f63be87e1ba4ec0eb95688403a -b0fe17d0e53060aef1947d776b06ab5b461a8ef41235b619ca477e3182fadaf9574f12ffc76420f074f82ac4a9aa7071 -ae265c0b90bf064d7a938e224cb1cd3b7eca3e348fbc4f50a29ac0930a803b96e0640992354aa14b303ea313cb523697 -8bc10ffde3224e8668700a3450463ab460ec6f198e1deb016e2c9d1643cc2fe1b377319223f41ffeb0b85afd35400d40 -8d5113b43aea2e0cc6f8ec740d6254698aff7881d72a6d77affd6e6b182909b4de8eb5f524714b5971b418627f15d218 -ae2ef0a401278b7b5d333f0588773ec62ead58807cdee679f72b1af343c1689c5f314989d9e6c9369f8da9ce76979db6 -b9c1cb996a78d4f7793956daaa8d8825dd43c4c37877bc04026db4866144b1bf37aa804d2fe0a63c374cf89e55e9069f -a35f73851081f6540e536a24a28808d478a2bb1fd15ee7ff61b1562e44fbafc0004b9c92c9f96328d546b1287e523e48 -82007f34e3383c628c8f490654369744592aa95a63a72be6e90848ad54f8bc2d0434b62f92a7c802c93017214ecf326e -9127db515b1ed3644c64eaf17a6656e6663838fed4c6612a444a6761636eaaeb6a27b72d0e6d438c863f67b0d3ec25c5 -984c9fcc3deccf83df3bbbb9844204c68f6331f0f8742119ba30634c8c5d786cd708aa99555196cf6563c953816aec44 -a0f9daf900112029474c56ddd9eb3b84af3ed2f52cd83b4eb34531cf5218e7c58b3cab4027b9fc17831e1b6078f3bf4a -90adbcc921369023866a23f5cea7b0e587d129ad71cab0449e2e2137838cea759dec27b0b922c59ac4870ef6146ea283 -8c5650b6b9293c168af98cf60ad35c945a30f5545992a5a8c05d42e09f43b04d370c4d800f474b2323b4269281ca50f8 -868d95be8b34a337b5da5d886651e843c073f324f9f1b4fbd1db14f74aba6559449f94c599f387856c5f8a7bc83b52a1 -812df0401d299c9e95a8296f9c520ef12d9a3dd88749b51eab8c1b7cc97961608ab9fc241a7e2888a693141962c8fd6d -abda319119d8a4d089393846830eee19d5d6e65059bf78713b307d0b4aad245673608b0880aa31c27e96c8d02eff39c0 -887f11ae9e488b99cb647506dcaa5e2518b169ee70a55cd49e45882fe5bfb35ffaf11feb2bf460c17d5e0490b7c1c14d -b36b6e9f95ffff917ca472a38fa7028c38dc650e1e906e384c10fe38a6f55e9b84b56ffa3a429d3b0c3e2cf8169e66a9 -a0450514d20622b7c534f54be3260bab8309632ca21c6093aa0ccc975b8eed33a922cbcc30a730ccc506edf9b188a879 -87cfaf7bcd5d26875ca665ac45f9decd3854701b0443332da0f9b213e69d6f5521ae0217ec375489cd4fad7b4babf724 -842ad67c1baf7a9d4504c10c5c979ce0a4d1b86a263899e2b5757407c2adcdcf7ed58173ad9d156d84075ef8798cb1c4 -ac1a05755fe4d3fb2ab5b951bafe65cca7c7842022ca567b32cddf7741782cbf8c4990c1dd4ea05dc087a4712844aebb -a000c8cecc4fddeb926dc8dd619952bc51d00d7c662e025f973387a3fc8b1ef5c7c10b6a62e963eb785e0ec04cb1ffbe -8a573c9986dbeb469547dfd09f60078eab252d8ec17351fe373a38068af046b0037967f2b3722fa73ed73512afd038d2 -b8dff15dff931f58ba05b6010716c613631d7dd9562ae5138dbec966630bcdb0e72552e4eefc0351a6a6b7912d785094 -990e81fd459433522e8b475e67e847cb342c4742f0dbf71acc5754244ccd1d9ff75919168588d8f18b8aea17092dd2a4 -b012f8644da2113bef7dd6cdc622a55cfa0734bd267b847d11bba2e257a97a2a465c2bb616c240e197ff7b23e2ce8d8e -a659bd590fde467766e2091c34a0b070772f79380be069eef1afecc470368a95afd9eed6520d542c09c0d1a9dca23bd0 -b9239f318b849079477d1cf0a60a3d530391adacd95c449373da1c9f83f03c496c42097c3f9aca10c1b9b3dbe5d98923 -851e9a6add6e4a0ee9994962178d06f6d4fbc0def97feef1ba4c86d3bcf027a59bafa0cf25876ca33e515a1e1696e5cc -803b9c5276eed78092de2f340b2f0d0165349a24d546e495bd275fe16f89a291e4c74c22fdee5185f8fce0c7fbced201 -95915654ca4656d07575168fb7290f50dc5dcbbcdf55a44df9ec25a9754a6571ab8ca8a159bc27d9fa47c35ffd8f7ffd -88f865919764e8e765948780c4fdd76f79af556cd95e56105d603c257d3bfb28f11efca1dfb2ce77162f9a5b1700bac8 -b1233131f666579b4cc8b37cfa160fc10551b1ec33b784b82685251464d3c095cdde53d0407c73f862520aa8667b1981 -a91115a15cf4a83bda1b46f9b9719cfba14ffb8b6e77add8d5a0b61bea2e4ea8ce208e3d4ed8ca1aab50802b800e763a -93553b6c92b14546ae6011a34600a46021ce7d5b6fbfcda2a70335c232612205dbe6bfb1cc42db6d49bd4042c8919525 -8c2a498e5d102e80c93786f13ccf3c9cab7f4c538ccf0aee8d8191da0dbca5d07dff4448383e0cf5146f6d7e629d64f8 -a66ab92c0d2c07ea0c36787a86b63ee200499527c93b9048b4180fc77e0bb0aa919f4222c4bec46eeb3f93845ab2f657 -917e4fc34081a400fc413335fdf5a076495ae19705f8542c09db2f55fa913d6958fa6d711f49ad191aec107befc2f967 -940631a5118587291c48ac8576cdc7e4a904dd9272acb79407a7d3549c3742d9b3669338adbc1386724cc17ee0cc1ca3 -ae23ae3a531900550671fd10447a35d3653c5f03f65b0fdffe092844c1c95d0e67cab814d36e6388db5f8bd0667cd232 -ae545727fca94fd02f43e848f0fbbb1381fd0e568a1a082bf3929434cc73065bfbc9f2c840b270dda8cc2e08cd4d44b0 -8a9bc9b90e98f55007c3a830233c7e5dc3c4760e4e09091ff30ee484b54c5c269e1292ce4e05c303f6462a2a1bd5de33 -a5a2e7515ce5e5c1a05e5f4c42f99835f6fde14d47ecb4a4877b924246038f5bc1b91622e2ff97ed58737ed58319acfa -8fa9f5edf9153618b72b413586e10aaa6c4b6e5d2d9c3e8693ca6b87804c58dc4bf23a480c0f80cb821ebc3cf20ea4fc -925134501859a181913aadac9f07f73d82555058d55a7d5aaa305067fbd0c43017178702facc404e952ea5cfd39db59b -8b5ab1d9b5127cb590d6bddbf698ffe08770b6fc6527023d6c381f39754aecc43f985c47a46be23fe29f6ca170249b44 -aa39c6b9626354c967d93943f4ef09d637e13c505e36352c385b66e996c19c5603b9f0488ad4014bb5fc2e051b2876cc -8e77399c6e9cb8345002195feb7408eb571e6a81c0418590d2d775af7414fc17e61fe0cd37af8e737b59b89c849d3a28 -a0150aeca2ddc9627c7ea0af0dd4426726583389169bc8174fc1597cc8048299cc594b22d234a4e013dff7232b2d946c -98659422ef91f193e6104b09ff607d1ed856bb6baed2a6386c9457efbc748bd1bf436573d80465ebc54f8c340b697ea5 -8d6fb015898d3672eb580e1ffdf623fc4b23076664623b66bfb18f450d29522e8cb9c90f00d28ccf00af34f730bff7ac -996a8538efa9e2937c1caad58dc6564e5c185ada6cdcef07d5ec0056eb1259b0e4cef410252a1b5dbaee0da0b98dac91 -aa0ae2548149d462362a33f96c3ce9b5010ebf202602e81e0ef77e22cfc57ecf03946a3076b6171bea3d3dc9681187d7 -a5ce876b29f6b89050700df46d679bed85690daf7bad5c0df65e6f3bde5673e6055e6c29a4f4dcb82b93ccecf3bad9cc -81d824bb283c2f55554340c3514e15f7f1db8e9e95dd60a912826b1cccb1096f993a6440834dad3f2a5de70071b4b4b5 -914e7291da286a89dfc923749da8f0bf61a04faa3803d6d10633261a717184065dcc4980114ad852e359f79794877dd9 -ae49dc760db497c8e834510fe89419cc81f33fd2a2d33de3e5e680d9a95a0e6a3ccbdf7c0953beeb3d1caf0a08b3e131 -b24f527d83e624d71700a4b238016835a2d06f905f3740f0005105f4b2e49fc62f7e800e33cdc900d805429267e42fc0 -b03471ecaa7a3bf54503347f470a6c611e44a3cee8218ad3fcad61d286cfb7bb6a1113dad18475ec3354a71fcc4ec1e2 -881289b82b30aff4c8f467c2a25fced6064e1eece97c0de083e224b21735da61c51592a60f2913e8c8ba4437801f1a83 -b4ce59c0fc1e0ecad88e79b056c2fd09542d53c40f41dea0f094b7f354ad88db92c560b9aeb3c0ef48137b1a0b1c3f95 -a1ffb30eb8ef0e3ea749b5f300241ebe748ed7cf480e283dfcda7380aa1c15347491be97e65bc96bdf3fe62d8b74b3ae -b8954a826c59d18c6bfab24719f8730cc901868a95438838cd61dac468a2d79b1d42f77284e86e3382bf4f2a22044927 -818e7e7c59b6b5e22b3c2c19c163f2e787f2ff3758d395a4da02766948935eb44413c3ddd2bf45804a3c19744aa332f3 -a29556e49866e4e6f01d4f042eed803beeda781462884a603927791bd3750331a11bc013138f3270c216ab3aa5d39221 -b40885fa0287dc92859b8b030c7cca4497e96c387dcfe6ed13eb7f596b1eb18fb813e4ae139475d692f196431acb58fe -89cd634682fd99ee74843ae619832780cf7cd717f230ea30f0b1821caf2f312b41c91f459bdba723f780c7e3eed15676 -b48c550db835750d45a7f3f06c58f8f3bf8766a441265ca80089ead0346f2e17cbb1a5e843557216f5611978235e0f83 -90936ee810039783c09392857164ab732334be3a3b9c6776b8b19f5685379c623b1997fb0cdd43af5061d042247bc72f -a6258a6bae36525794432f058d4b3b7772ba6a37f74ef1c1106c80a380fc894cbeac4f340674b4e2f7a0f9213b001afd -8f26943a32cf239c4e2976314e97f2309a1c775777710393c672a4aab042a8c6ee8aa9ac168aed7c408a436965a47aeb -820f793573ca5cc3084fe5cef86894c5351b6078df9807d4e1b9341f9d5422dd29d19a73b0843a14ad63e8827a75d2da -a3c4fca786603cd28f2282ba02afe7cf9287529e0e924ca90d6cdfd1a3912478ebb3076b370ee72e00df5517134fe17f -8f3cdabd0b64a35b9ee9c6384d3a8426cc49ae6063632fb1a56a0ae94affa833955f458976ff309dafd0b2dd540786ae -945a0630cd8fa111cfd776471075e5d2bbe8eb7512408b5c79c8999bfaeca6c097f988fb1c38fa9c1048bac2bca19f2e -8a7f6c4e0ba1920c98d0b0235b4dda73b631f511e209b10c05c550f51e91b4ba3893996d1562f04ac7105a141464e0e9 -ab3c13d8b78203b4980412edc8a8f579e999bf79569e028993da9138058711d19417cf20b477ef7ed627fa4a234c727a -82b00d9a3e29ed8d14c366f7bb25b8cfe953b7be275db9590373a7d8a86ea927d56dc3070a09ef7f265f6dd99a7c896e -b6e48a282de57949821e0c06bc9ba686f79e76fb7cbf50ea8b4651ccd29bc4b6da67efea4662536ba9912d197b78d915 -a749e9edcba6b4f72880d3f84a493f4e8146c845637009f6ff227ff98521dbbe556a3446340483c705a87e40d07364bc -b9b93c94bd0603ce5922e9c4c29a60066b64a767b3aed81d8f046f48539469f5886f14c09d83b5c4742f1b03f84bb619 -afa70b349988f85ed438faafa982df35f242dd7869bda95ae630b7fd48b5674ef0f2b4d7a1ca8d3a2041eff9523e9333 -a8e7e09b93010982f50bd0930842898c0dcd30cdb9b123923e9d5ef662b31468222fc50f559edc57fcfdc597151ebb6e -8ce73be5ac29b0c2f5ab17cae32c715a91380288137d7f8474610d2f28d06d458495d42b9cb156fb1b2a7dfdcc437e1c -85596c1d81f722826d778e62b604eb0867337b0204c9fae636399fa25bb81204b501e5a5912654d215ec28ff48b2cb07 -96ff380229393ea94d9d07e96d15233f76467b43a3e245ca100cbecbdbb6ad8852046ea91b95bb03d8c91750b1dfe6e1 -b7417d9860b09f788eb95ef89deb8e528befcfa24efddbc18deaf0b8b9867b92361662db49db8121aeea85a9396f64fd -97b07705332a59cdba830cc8490da53624ab938e76869b2ce56452e696dcc18eb63c95da6dffa933fb5ffb7585070e2d -971f757d08504b154f9fc1c5fd88e01396175b36acf7f7abcfed4fff0e421b859879ed268e2ac13424c043b96fbe99fc -b9adb5d3605954943a7185bddf847d4dbe7bafe970e55dc0ec84d484967124c26dd60f57800d0a8d38833b91e4da476a -b4856741667bb45cae466379d9d6e1e4191f319b5001b4f963128b0c4f01819785732d990b2f5db7a3452722a61cd8cc -a81ec9f2ab890d099fb078a0c430d64e1d06cbbe00b1f140d75fc24c99fe35c13020af22de25bbe3acf6195869429ba5 -99dcea976c093a73c08e574d930d7b2ae49d7fe43064c3c52199307e54db9e048abe3a370b615798b05fe8425a260ba0 -a1f7437c0588f8958b06beb07498e55cd6553429a68cd807082aa4cc031ab2d998d16305a618b3d92221f446e6cd766d -806e4e0958e0b5217996d6763293f39c4f4f77016b3373b9a88f7b1221728d14227fce01b885a43b916ff6c7a8bc2e06 -8e210b7d1aff606a6fc9e02898168d48ec39bc687086a7fe4be79622dd12284a5991eb53c4adfe848251f20d5bfe9de0 -82810111e10c654a6c07cbfd1aff66727039ebc3226eef8883d570f25117acf259b1683742f916ac287097223afc6343 -92f0e28cca06fd543f2f620cc975303b6e9a3d7c96a760e1d65b740514ccd713dc7a27a356a4be733570ca199edd17ba -900810aa4f98a0d6e13baf5403761a0aeb6422249361380c52f98b2c79c651e3c72f7807b5b5e3a30d65d6ff7a2a9203 -b0740bfefea7470c4c94e85185dbe6e20685523d870ff3ef4eb2c97735cef41a6ab9d8f074a37a81c35f3f8a7d259f0e -af022e98f2f418efbbe2de6fefb2aa133c726174f0f36925a4eafd2c6fd6c744edb91386bafb205ce13561de4294f3a6 -95e4592e21ba97e950abb463e1bc7b0d65f726e84c06a98eb200b1d8bfc75d4b8cff3f55924837009e88272542fd25ec -b13bd6b18cd8a63f76c9831d547c39bbd553bda66562c3085999c4da5e95b26b74803d7847af86b613a2e80e2f08caae -a5625658b474a95aba3e4888c57d82fb61c356859a170bc5022077aa6c1245022e94d3a800bf7bd5f2b9ab1348a8834e -a097ee9e6f1d43e686df800c6ce8cfc1962e5a39bb6de3cf5222b220a41b3d608922dae499bce5c89675c286a98fdabd -94230ba8e9a5e9749cd476257b3f14a6bf9683e534fb5c33ca21330617533c773cb80e508e96150763699ad6ecd5aee7 -b5fea7e1f4448449c4bc5f9cc01ac32333d05f464d0ed222bf20e113bab0ee7b1b778cd083ceae03fdfd43d73f690728 -a18a41a78a80a7db8860a6352642cdeef8a305714543b857ca53a0ee6bed70a69eeba8cfcf617b11586a5cc66af4fc4f -85d7f4b3ff9054944ac80a51ef43c04189d491e61a58abed3f0283d041f0855612b714a8a0736d3d25c27239ab08f2ec -b1da94f1e2aedd357cb35d152e265ccfc43120825d86733fa007fc1e291192e8ff8342306bef0c28183d1df0ccec99d0 -852893687532527d0fbeea7543ac89a37195eadab2f8f0312a77c73bdeed4ad09d0520f008d7611539425f3e1b542cfd -99e3bd4d26df088fc9019a8c0b82611fd4769003b2a262be6b880651d687257ded4b4d18ccb102cba48c5e53891535e4 -98c407bc3bbc0e8f24bedf7a24510a5d16bce1df22940515a4fbdacd20d06d522ef9405f5f9b9b55964915dd474e2b5c -80de0a12f917717c6fc9dc3ccc9732c28bae36cff4a9f229d5eaf0d3e43f0581a635ba2e38386442c973f7cb3f0fdfa7 -94f9615f51466ae4bb9c8478200634b9a3d762d63f2a16366849096f9fc57f56b2e68fe0ca5d4d1327a4f737b3c30154 -a3dcbe16499be5ccb822dfcd7c2c8848ba574f73f9912e9aa93d08d7f030b5076ca412ad4bf6225b6c67235e0ab6a748 -98f137bf2e1aea18289750978feb2e379054021e5d574f66ca7b062410dcfe7abb521fab428f5b293bbe2268a9af3aa4 -8f5021c8254ba426f646e2a15b6d96b337a588f4dfb8cbae2d593a4d49652ca2ada438878de5e7c2dbbd69b299506070 -8cc3f67dd0edcdb51dfd0c390586622e4538c7a179512f3a4f84dd7368153a28b1cf343afd848ac167cb3fcaa6aee811 -863690f09ac98484d6189c95bc0d9e8f3b01c489cb3f9f25bf7a13a9b6c1deaf8275ad74a95f519932149d9c2a41db42 -8494e70d629543de6f937b62beca44d10a04875bd782c9a457d510f82c85c52e6d34b9c3d4415dd7a461abbcc916c3c4 -925b5e1e38fbc7f20371b126d76522c0ea1649eb6f8af8efb389764ddcf2653775ef99a58a2dcf1812ce882964909798 -94d0494dcc44893c65152e7d42f4fb0dc46af5dc5674d3c607227160447939a56d9f9ea2b3d3736074eef255f7ec7566 -b0484d33f0ef80ff9b9d693c0721c77e518d0238918498ddf71f14133eb484defb9f9f7b9083d52bc6d6ba2012c7b036 -8979e41e0bb3b501a7ebbd024567ce7f0171acfea8403a530fe9e791e6e859dfbd60b742b3186d7cf5ab264b14d34d04 -af93185677d39e94a2b5d08867b44be2ba0bb50642edca906066d80facde22df4e6a7a2bd8b2460a22bdf6a6e59c5fdd -90f0ef0d7e7ab878170a196da1b8523488d33e0fde7481f6351558b312d00fa2b6b725b38539063f035d2a56a0f5e8f1 -a9ca028ccb373f9886574c2d0ea5184bc5b94d519aa07978a4814d649e1b6c93168f77ae9c6aa3872dd0eea17968ec22 -82e7aa6e2b322f9f9c180af585b9213fb9d3ad153281f456a02056f2d31b20d0f1e8807ff0c85e71e7baca8283695403 -affce186f842c547e9db2dffc0f3567b175be754891f616214e8c341213cbf7345c9ecd2f704bb0f4b6eba8845c8d8a7 -ab119eb621fade27536e98c6d1bc596388bb8f5cad65194ea75c893edbe6b4d860006160f1a9053aea2946bd663e5653 -99cd2c1c38ead1676657059dc9b43d104e8bd00ae548600d5fc5094a4d875d5b2c529fac4af601a262045e1af3892b5e -b531a43b0714cc638123487ef2f03dfb5272ff399ff1aa67e8bc6a307130d996910fb27075cbe53050c0f2902fc32ffe -923b59ac752c77d16b64a2d0a5f824e718460ef78d732b70c4c776fecc43718ecfaf35f11afbb544016232f445ecab66 -a53439cd05e6e1633cdce4a14f01221efcd3f496ac1a38331365c3cadc30013e5a71600c097965927ee824b9983a79cb -8af976ffab688d2d3f9e537e2829323dda9abf7f805f973b7e0a01e25c88425b881466dee37b25fda4ea683a0e7b2c03 -92e5f40230a9bfbb078fa965f58912abb753b236f6a5c28676fb35be9b7f525e25428160caeaf0e3645f2be01f1a6599 -8c4e7b04e2f968be527feba16f98428508a157b7b4687399df87666a86583b4446a9f4b86358b153e1660bb80bd92e8b -97cd622d4d8e94dceb753c7a4d49ea7914f2eb7d70c9f56d1d9a6e5e5cc198a3e3e29809a1d07d563c67c1f8b8a5665a -967bfa8f411e98bec142c7e379c21f5561f6fd503aaf3af1a0699db04c716c2795d1cb909cccbcb917794916fdb849f1 -b3c18a6caa5ca2be52dd500f083b02a4745e3bcaed47b6a000ce7149cee4ed7a78d2d7012bf3731b1c15c6f04cbd0bd1 -b3f651f1f84026f1936872956a88f39fcfe3e5a767233349123f52af160f6c59f2c908c2b5691255561f0e70620c8998 -ae23b59dc2d81cec2aebcaaf607d7d29cf588f0cbf7fa768c422be911985ca1f532bb39405f3653cc5bf0dcba4194298 -a1f4da396f2eec8a9b3252ea0e2d4ca205f7e003695621ae5571f62f5708d51ca3494ac09c824fca4f4d287a18beea9a -a036fa15e929abed7aac95aa2718e9f912f31e3defd224e5ed379bf6e1b43a3ad75b4b41208c43d7b2c55e8a6fedca72 -80e8372d8a2979ee90afbdb842624ace72ab3803542365a9d1a778219d47f6b01531185f5a573db72213ab69e3ffa318 -af68b5cdc39e5c4587e491b2e858a728d79ae7e5817a93b1ea39d34aec23dea452687046c8feae4714def4d0ed71da16 -b36658dfb756e7e9eec175918d3fe1f45b398679f296119cd53be6c6792d765ef5c7d5afadc5f3886e3f165042f4667f -ad831da03b759716f51099d7c046c1a8e7bf8bb45a52d2f2bfd769e171c8c6871741ef8474f06e2aca6d2b141cf2971f -8bae1202dde053c2f59efc1b05cb8268ba9876e4bd3ff1140fa0cc5fa290b13529aede965f5efdff3f72e1a579efc9cc -86344afbc9fe077021558e43d2a032fcc83b328f72948dba1a074bb1058e8a8faec85b1c019fc9836f0d11d2585d69c8 -831d1fc7aa28f069585d84c46bdc030d6cb12440cfaae28098365577fc911c4b8f566d88f80f3a3381be2ec8088bf119 -899de139797ac1c8f0135f0656f04ad4f9b0fa2c83a264d320eb855a3c0b9a4907fc3dc01521d33c07b5531e6a997064 -855bc752146d3e5b8ba7f382b198d7dc65321b93cdfc76250eabc28dba5bbf0ad1be8ccda1adf2024125107cb52c6a6e -af0aeccab48eb35f8986cabf07253c5b876dd103933e1eee0d99dc0105936236b2a6c413228490ed3db4fa69aab51a80 -ae62e9d706fbf535319c909855909b3deba3e06eaf560803fa37bce3b5aab5ea6329f7609fea84298b9da48977c00c3b -823a8d222e8282d653082d55a9508d9eaf9703ce54d0ab7e2b3c661af745a8b6571647ec5bd3809ae6dddae96a220ea7 -a4c87e0ea142fc287092bc994e013c85e884bc7c2dde771df30ca887a07f955325c387b548de3caa9efa97106da8176a -b55d925e2f614f2495651502cf4c3f17f055041fa305bb20195146d896b7b542b1e45d37fa709ca4bfc6b0d49756af92 -b0ebe8947f8c68dc381d7bd460995340efcbb4a2b89f17077f5fde3a9e76aef4a9a430d1f85b2274993afc0f17fdbead -8baaa640d654e2652808afd68772f6489df7cad37b7455b9cd9456bdddae80555a3f84b68906cc04185b8462273dcfc9 -add9aa08f827e7dc292ac80e374c593cd40ac5e34ad4391708b3db2fe89550f293181ea11b5c0a341b5e3f7813512739 -909e31846576c6bdd2c162f0f29eea819b6125098452caad42451491a7cde9fd257689858f815131194200bca54511f4 -abc4b34098db10d71ce7297658ef03edfa7377bd7ed36b2ffbab437f8fd47a60e2bcfbc93ff74c85cfce74ca9f93106c -857dbecc5879c1b952f847139484ef207cecf80a3d879849080758ef7ac96acfe16a11afffb42daf160dc4b324279d9b -aab0b49beecbcf3af7c08fbf38a6601c21061bed7c8875d6e3c2b557ecb47fd93e2114a3b09b522a114562467fcd2f7d -94306dec35e7b93d43ed7f89468b15d3ce7d7723f5179cacc8781f0cf500f66f8c9f4e196607fd14d56257d7df7bf332 -9201784d571da4a96ef5b8764f776a0b86615500d74ec72bc89e49d1e63a3763b867deca07964e2f3914e576e2ca0ded -aabe1260a638112f4280d3bdea3c84ce3c158b81266d5df480be02942cecf3de1ac1284b9964c93d2db33f3555373dcc -8ef28607ca2e0075aa07de9af5a0f2d0a97f554897cab8827dfe3623a5e9d007d92755d114b7c390d29e988b40466db9 -87a9b1b097c3a7b5055cd9cb0c35ba6251c50e21c74f6a0bca1e87e6463efc38385d3acc9d839b4698dfa2eb4cb7a2ef -aee277e90d2ffce9c090295c575e7cd3bafc214d1b5794dd145e6d02d987a015cb807bd89fd6268cd4c59350e7907ee2 -836ad3c9324eaa5e022e9835ff1418c8644a8f4cd8e4378bd4b7be5632b616bb6f6c53399752b96d77472f99ece123cd -8ffffdb67faa5f56887c834f9d489bb5b4dab613b72eac8abf7e4bcb799ccd0dbd88a2e73077cadf7e761cb159fb5ec5 -9158f6cd4f5e88e6cdb700fddcbc5a99b2d31a7a1b37dce704bd9dd3385cca69607a615483350a2b1153345526c8e05d -a7ff0958e9f0ccff76742fc6b60d2dd91c552e408c84172c3a736f64acb133633540b2b7f33bc7970220b35ce787cd4e -8f196938892e2a79f23403e1b1fb4687a62e3a951f69a7874ec0081909eb4627973a7a983f741c65438aff004f03ba6f -97e3c1981c5cdb0a388f1e4d50b9b5b5f3b86d83417831c27b143698b432bb5dba3f2e590d6d211931ed0f3d80780e77 -903a53430b87a7280d37816946245db03a49e38a789f866fe00469b7613ee7a22d455fb271d42825957282c8a4e159d9 -b78955f686254c3994f610e49f1c089717f5fb030da4f9b66e9a7f82d72381ba77e230764ab593335ff29a1874848a09 -938b6d04356b9d7c8c56be93b0049d0d0c61745af7790edf4ef04e64de2b4740b038069c95be5c91a0ba6a1bb38512a9 -a769073b9648fe21bc66893a9ef3b8848d06f4068805a43f1c180fdd0d37c176b4546f8e5e450f7b09223c2f735b006f -863c30ebe92427cdd7e72d758f2c645ab422e51ecef6c402eb1a073fd7f715017cd58a2ad1afe7edccdf4ff01309e306 -a617b0213d161964eccfc68a7ad00a3ee4365223b479576e887c41ef658f846f69edf928bd8da8785b6e9887031f6a57 -a699834bf3b20d345082f13f360c5f8a86499e498e459b9e65b5a56ae8a65a9fcb5c1f93c949391b4795ef214c952e08 -9921f1da00130f22e38908dd2e44c5f662ead6c4526ebb50011bc2f2819e8e3fca64c9428b5106fa8924db76b7651f35 -98da928be52eb5b0287912fd1c648f8bbda00f5fd0289baf161b5a7dbda685db6ad6bdc121bc9ffa7ed6ae03a13dbee3 -927b91d95676ff3c99de1312c20f19251e21878bfb47ad9f19c9791bc7fb9d6f5c03e3e61575c0760180d3445be86125 -b8e4977a892100635310dfcb46d8b74931ac59ae687b06469b3cee060888a3b6b52d89de54e173d9e1641234754b32b1 -98f6fd5f81ca6e2184abd7a3a59b764d4953d408cec155b4e5cf87cd1f6245d8bdd58b52e1e024e22903e85ae15273f1 -909aaacbbfe30950cf7587faa190dc36c05e3c8131749cc21a0c92dc4afc4002275762ca7f66f91aa751b630ad3e324d -91712141592758f0e43398c075aaa7180f245189e5308e6605a6305d01886d2b22d144976b30460d8ce17312bb819e8f -947d85cb299b189f9116431f1c5449f0f8c3f1a70061aa9ebf962aa159ab76ee2e39b4706365d44a5dbf43120a0ac255 -b39eced3e9a2e293e04d236976e7ee11e2471fe59b43e7b6dd32ab74f51a3d372afee70be1d90af017452ec635574e0e -8a4ba456491911fc17e1cadcbb3020500587c5b42cf6b538d1cb907f04c65c168add71275fbf21d3875e731404f3f529 -8f6858752363e2a94c295e0448078e9144bf033ccd4d74f4f6b95d582f3a7638b6d3f921e2d89fcd6afd878b12977a9d -b7f349aa3e8feb844a56a42f82b6b00f2bfe42cab19f5a68579a6e8a57f5cf93e3cdb56cbbb9163ab4d6b599d6c0f6aa -a4a24dc618a6b4a0857fb96338ac3e10b19336efc26986e801434c8fdde42ca8777420722f45dfe7b67b9ed9d7ce8fb1 -aafe4d415f939e0730512fc2e61e37d65c32e435991fb95fb73017493014e3f8278cd0d213379d2330b06902f21fe4e1 -845cc6f0f0a41cc6a010d5cb938c0ef8183ff5ed623b70f7ea65a8bdbc7b512ea33c0ee8b8f31fdf5f39ec88953f0c1e -811173b4dd89d761c0bdffe224cd664ef303c4647e6cf5ef0ed665d843ed556b04882c2a4adfc77709e40af1cfdea40b -93ba1db7c20bfba22da123b6813cb38c12933b680902cef3037f01f03ab003f76260acc12e01e364c0d0cf8d45fca694 -b41694db978b2cf0f4d2aa06fcfc4182d65fb7c9b5e909650705f779b28e47672c47707d0e5308cd680c5746c37e1bc7 -a0e92c4c5be56a4ccf1f94d289e453a5f80e172fc90786e5b03c1c14ce2f3c392c349f76e48a7df02c8ae535326ea8fe -96cbeb1d0693f4f0b0b71ad30def5ccc7ad9ebe58dbe9d3b077f2ac16256cde10468875e4866d63e88ce82751aaf8ef6 -935b87fd336f0bf366046e10f7c2f7c2a2148fa6f53af5607ad66f91f850894527ecec7d23d81118d3b2ee23351ed6ed -b7c2c1fa6295735f6b31510777b597bc8a7bfb014e71b4d1b5859be0d8d64f62a1587caafc669dfe865b365eb27bd94f -b25d93af43d8704ffd53b1e5c16953fd45e57a9a4b7acfcfa6dd4bf30ee2a8e98d2a76f3c8eba8dc7d08d9012b9694c6 -b5a005cd9f891e33882f5884f6662479d5190b7e2aec1aa5a6d15a8cb60c9c983d1e7928e25e4cf43ec804eaea1d97b0 -93f9f0725a06e4a0fb83892102b7375cf5438b5ebc9e7be5a655f3478d18706cf7dbb1cd1adcee7444c575516378aa1b -900d7cbf43fd6ac64961287fe593c08446874bfc1eb09231fc93de858ac7a8bca496c9c457bced5881f7bf245b6789e0 -90c198526b8b265d75160ef3ed787988e7632d5f3330e8c322b8faf2ac51eef6f0ce5a45f3b3a890b90aecf1244a3436 -b499707399009f9fe7617d8e73939cb1560037ad59ac9f343041201d7cc25379df250219fd73fa012b9ade0b04e92efa -94415f6c3a0705a9be6a414be19d478181d82752b9af760dda0dbd24a8ff0f873c4d89e61ad2c13ebf01de55892d07fa -90a9f0b9f1edb87751c696d390e5f253586aae6ebfc31eb3b2125d23877a497b4aa778de8b11ec85efe49969021eaa5a -a9942c56506e5cd8f9289be8205823b403a2ea233ba211cf72c2b3827064fd34cd9b61ff698a4158e7379891ca4120d8 -83bb2ee8c07be1ab3a488ec06b0c85e10b83a531758a2a6741c17a3ccfa6774b34336926a50e11c8543d30b56a6ac570 -8a08a3e5ebe10353e0b7fff5f887e7e25d09bb65becf7c74a03c60c166132efaada27e5aea242c8b9f43b472561ae3ed -957c7a24cefaa631fe8a28446bc44b09a3d8274591ade53ba489757b854db54820d98df47c8a0fbee0e094f8ad7a5dc4 -b63556e1f47ed3ee283777ed46b69be8585d5930960d973f8a5a43508fc56000009605662224daec2de54ea52a8dcd82 -abed2b3d16641f0f459113b105f884886d171519b1229758f846a488c7a474a718857323c3e239faa222c1ab24513766 -882d36eed6756d86335de2f7b13d753f91c0a4d42ef50e30195cc3e5e4f1441afa5ff863022434acb66854eda5de8715 -a65ea7f8745bb8a623b44e43f19158fd96e7d6b0a5406290f2c1348fc8674fbfc27beb4f724cc2b217c6042cb82bc178 -a038116a0c76af090a069ca289eb2c3a615b96093efacfe68ea1610890b291a274e26b445d34f414cfec00c333906148 -90294f452f8b80b0a47c3bcb6e30bdd6854e3b01deaf93f5e82a1889a4a1036d17ecb59b48efa7dc41412168d7a523dd -88faf969c8978a756f48c6114f7f33a1ca3fd7b5865c688aa9cd32578b1f7ba7c06120502f8dc9aee174ecd41597f055 -8883763b2762dfff0d9be9ac19428d9fd00357ac8b805efda213993152b9b7eb7ba3b1b2623015d60778bffda07a724d -a30a1a5a9213636aa9b0f8623345dc7cf5c563b906e11cc4feb97d530a1480f23211073dcb81105b55193dcde5a381d2 -b45ee93c58139a5f6be82572d6e14e937ef9fcbb6154a2d77cb4bf2e4b63c5aabc3277527ecf4e531fe3c58f521cc5e3 -ac5a73e4f686978e06131a333f089932adda6c7614217fcaf0e9423b96e16fd73e913e5e40bf8d7800bed4318b48d4b1 -b6c1e6cdd14a48a7fe27cd370d2e3f7a52a91f3e8d80fb405f142391479f6c6f31aa5c59a4a0fdc9e88247c42688e0cf -ab1760530312380152d05c650826a16c26223960fc8e3bf813161d129c01bac77583eff04ce8678ff52987a69886526b -a4252dffae7429d4f81dfaeeecc48ab922e60d6a50986cf063964f282e47407b7e9c64cf819da6f93735de000a70f0b2 -94c19f96d5ecf4a15c9c5a24598802d2d21acbbd9ee8780b1bc234b794b8442437c36badc0a24e8d2cff410e892bb1d2 -89fafe1799cf7b48a9ea24f707d912fccb99a8700d7287c6438a8879f3a3ca3e60a0f66640e31744722624139ba30396 -b0108405df25cf421c2f1873b20b28552f4d5d1b4a0bf1c202307673927931cbd59f5781e6b8748ddb1206a5ec332c0b -aa0f0e7d09f12b48f1e44d55ec3904aa5707e263774126e0b30f912e2f83df9eb933ca073752e6b86876adaf822d14ba -b0cbe8abb58876d055c8150d9fdbde4fea881a517a2499e7c2ea4d55c518a3c2d00b3494f6a8fd1a660bfca102f86d2a -b1ef80ec903bac55f58b75933dc00f1751060690fd9dfb54cf448a7a4b779c2a80391f5fda65609274bd9e0d83f36141 -8b52e05b1845498c4879bb12816097be7fc268ce1cf747f83a479c8e08a44159fc7b244cf24d55aca06dccf0b97d11e1 -b632a2fc4fdb178687e983a2876ae23587fd5b7b5e0bb8c0eb4cfe6d921a2c99894762e2aaccdc5da6c48da3c3c72f6c -953ef80ab5f74274ae70667e41363ae6e2e98ccbd6b7d21f7283f0c1cafb120338b7a8b64e7c189d935a4e5b87651587 -b929cfd311017c9731eed9d08d073f6cf7e9d4cd560cddd3fdcb1149ab20c6610a7674a66a3616785b13500f8f43ee86 -870fb0d02704b6a328e68721fb6a4b0f8647681bfcb0d92ec3e241e94b7a53aecc365ed384e721c747b13fbf251002f1 -979501159833a8ba5422ed9b86f87b5961711f5b474d8b0e891373fe2d0b98ff41a3a7a74a8b154615bb412b662a48be -b20f9c13cdeceef67f877b3878839ef425f645b16a69c785fe38f687c87a03b9de9ae31ac2edb1e1dd3a9f2c0f09d35d -8c7705ed93290731b1cf6f3bf87fc4d7159bb2c039d1a9f2246cda462d9cdf2beef62d9f658cfeea2e6aef7869a6fc00 -aa439eb15705ad729b9163daee2598d98a32a8a412777c0d12fd48dc7796d422227a014705e445cc9d66f115c96bbc24 -a32307e16f89749fe98b5df1effef0429801c067e0d8067794e56b01c4fef742ad5e7ab42a1a4cc4741808f47a0b7cb8 -b31e65c549003c1207258a2912a72f5bad9844e18f16b0773ea7af8ff124390eb33b2f715910fc156c104572d4866b91 -85608d918ed7b08a0dc03aee60ea5589713304d85eee7b4c8c762b6b34c9355d9d2e192575af0fd523318ae36e19ae1c -a6497dbaf0e7035160b7a787150971b19cf5ba272c235b0113542288611ebecefa2b22f08008d3f17db6a70a542c258d -87862adb1ac0510614ab909457c49f9ec86dc8bdf0e4682f76d2739df11f6ffcfb59975527f279e890d22964a1fba9b6 -8717ac3b483b3094c3b642f3fafe4fbafc52a5d4f2f5d43c29d9cfe02a569daee34c178ee081144494f3a2ca6e67d7b1 -855100ac1ec85c8b437fdd844abaa0ca4ac9830a5bdd065b68dafb37046fcf8625dd482dc0253476926e80a4c438c9ec -ae74821bf265ca3c8702c557cf9ef0732ede7ef6ed658283af669d19c6f6b6055aca807cf2fa1a64785ec91c42b18ae5 -812a745b1419a306f7f20429103d6813cbdea68f82ff635ac59da08630cd61bda6e0fa9a3735bfd4378f58ad179c1332 -867dbbfe0d698f89451c37ca6d0585fd71ee07c3817e362ef6779b7b1d70b27c989cdd5f85ac33a0498db1c4d14521fe -84db735d3eb4ff7f16502dccc3b604338c3a4a301220ad495991d6f507659db4b9f81bba9c528c5a6114bcdba0160252 -aadc83d1c4e5e32bf786cfb26f2f12a78c8024f1f5271427b086370cdef7a71d8a5bf7cd7690bae40df56c38b1ad2411 -a27860eb0caaea37298095507f54f7729d8930ac1929de3b7a968df9737f4c6da3173bda9d64ff797ed4c6f3a1718092 -a3cdcaa74235c0440a34171506ed03d1f72b150d55904ce60ec7b90fcd9a6f46f0e45feab0f9166708b533836686d909 -b209a30bdac5c62e95924928f9d0d0b4113ebb8b346d7f3a572c024821af7f036222a3bd38bd8efd2ee1dbf9ac9556cd -83c93987eff8bc56506e7275b6bef0946672621ded641d09b28266657db08f75846dcbde80d8abc9470e1b24db4ca65b -800c09b3ee5d0251bdaef4a82a7fe8173de997cc1603a2e8df020dd688a0c368ad1ebef016b35136db63e774b266c74c -93fb52de00d9f799a9bce3e3e31aaf49e0a4fc865473feb728217bd70f1bc8a732ec37ac3582bf30ab60e8c7fdf3cb8d -a1aff6b4a50d02f079a8895c74443539231bfdf474600910febf52c9151da7b31127242334ac63f3093e83a047769146 -8c4532d8e3abb5f0da851138bfa97599039bcd240d87bbdf4fd6553b2329abb4781074b63caf09bc724ceb4d36cb3952 -8bd9b0ae3da5acda9eb3881172d308b03beec55014cd73b15026299541c42fd38bab4983a85c06894ebb7a2af2a23d4c -979441e7f5a0e6006812f21b0d236c5f505bb30f7d023cb4eb84ec2aa54a33ac91d87ece704b8069259d237f40901356 -a1c6d2d82e89957d6a3e9fef48deb112eb00519732d66d55aa0f8161e19a01e83b9f7c42ac2b94f337dcc9865f0da837 -97a0b8e04e889d18947d5bf77d06c25bbd62b19ce4be36aaa90ddbeafd93a07353308194199ba138efaadf1b928cd8d2 -822f7fbe9d966b8ec3db0fc8169ab39334e91bf027e35b8cc7e1fe3ead894d8982505c092f15ddfe5d8f726b360ac058 -a6e517eedd216949e3a10bf12c8c8ddbfde43cddcd2c0950565360a38444459191bdbc6c0af0e2e6e98bc6a813601c6d -858b5f15c46c074adb879b6ba5520966549420cb58721273119f1f8bc335605aeb4aa6dbe64aae9e573ca7cc1c705cdc -b5191bb105b60deb10466d8114d48fb95c4d72036164dd35939976e41406dff3ee3974c49f00391abfad51b695b3258c -b1b375353ed33c734f4a366d4afad77168c4809aff1b972a078fd2257036fd6b7a7edad569533abf71bc141144a14d62 -a94c502a9cdd38c0a0e0187de1637178ad4fa0763887f97cc5bdd55cb6a840cb68a60d7dbb7e4e0e51231f7d92addcff -8fe2082c1b410486a3e24481ae0630f28eb5b488e0bb2546af3492a3d9318c0d4c52db1407e8b9b1d1f23a7ffbaf260a -b73fe7aa2b73f9cae6001af589bf8a9e73ea2bb3bb01b46743e39390c08d8e1be5e85a3d562857a9c9b802b780c78e6d -8e347f51330ae62275441ccd60f5ac14e1a925a54ced8a51893d956acc26914df1bb8595385d240aa9b0e5ada7b520ea -8dc573d6357c0113b026a0191a5807dbe42dcd2e19772d14b2ca735e1e67c70e319ef571db1f2a20e62254ed7fb5bcd6 -a5dacbe51549fe412e64af100b8b5eba5ec2258cc2a7c27a34bc10177d1894baf8707886d2f2ef438f077596a07681e9 -8349153c64961d637a5ff56f49003cb24106de19a5bbcf674016a466bfbe0877f5d1e74ccb7c2920665ef90a437b1b7e -96ad35429d40a262fdc8f34b379f2e05a411057d7852c3d77b9c6c01359421c71ef8620f23854e0f5d231a1d037e3a0d -b52385e40af0ed16e31c2154d73d1517e10a01435489fc801fbea65b92b3866ab46dab38d2c25e5fb603b029ae727317 -8e801c7a3e8fa91d9c22ebd3e14a999023a7b5beea13ec0456f7845425d28c92452922ca35ec64012276acb3bbc93515 -a8630870297d415e9b709c7f42aa4a32210b602f03a3015410123f0988aea2688d8bcfc6d07dc3602884abbf6199b23f -8cd518392e09df2a3771a736f72c05af60efc030d62dbbb9cd68dc6cbbe1fb0854eb78b6ed38337010eb1bb44a5d5d30 -921aa4c66590f6c54bf2fa2b324f08cbe866329cc31f6e3477f97f73e1a1721d5eb50ed4eacc38051fe9eda76ba17632 -a37e595cb63524cb033c5540b6343c3a292569fc115e813979f63fe1a3c384b554cecc2cae76b510b640fe3a18800c81 -b0bb57e4e31ae3ce9f28cef158ed52dabfad5aa612f5fcc75b3f7f344b7cec56b989b5690dacd294e49c922d550ee36b -a3c618ce4d091e768c7295d37e3f9b11c44c37507ae1f89867441f564bf0108f67bf64b4cf45d73c2afc17a4dc8b2c68 -999e6650eda5455e474c22a8c7a3fd5b547ec2875dc3043077ad70c332f1ccd02135e7b524fcbf3621d386dec9e614fa -b018f080888dec3c2ca7fcfeb0d3d9984699b8435d8823079fc9e1af4ca44e257fbe8da2f6f641ee6152b5c7110e3e3c -a2bcd4bcd9b40c341e9bba76b86481842f408166c9a7159205726f0776dcb7f15a033079e7589699e9e94ce24b2a77fd -b03de48f024a520bb9c54985ca356fd087ca35ac1dd6e95168694d9dae653138c9755e18d5981946a080e32004e238fe -a6c1a54973c0c32a410092441e20594aa9aa3700513ed90c8854956e98894552944b0b7ee9edf6e62e487dc4565baa2f -845d7abf577c27c4c1fafc955dcad99a1f2b84b2c978cfe4bd3cd2a6185979491f3f3b0ec693818739ed9184aba52654 -9531bcfc0d3fcd4d7459484d15607d6e6181cee440ba6344b12a21daa62ff1153a4e9a0b5c3c33d373a0a56a7ad18025 -a0bbf49b2dd581be423a23e8939528ceaae7fb8c04b362066fe7d754ca2546304a2a90e6ac25cdf6396bf0096fae9781 -a1ec264c352e34ed2bf49681b4e294ffea7d763846be62b96b234d9a28905cdece4be310a56ec6a00fc0361d615b547c -87c575e85b5dfbfd215432cb355a86f69256fff5318e8fda457763ac513b53baa90499dc37574bdfad96b117f71cb45e -9972edfdeec56897bef4123385ee643a1b9dc24e522752b5a197ce6bd2e53d4b6b782b9d529ca50592ee65b60e4c9c3c -b8bcf8d4ab6ad37bdd6ad9913a1ba0aba160cb83d1d6f33a8524064a27ba74a33984cc64beeee9d834393c2636ff831a -83082b7ec5b224422d0ff036fbb89dc68918e6fde4077dfc0b8e2ee02595195ecadb60c9ab0ad69deb1bac9be75024fa -8b061fce6df6a0e5c486fd8d8809f6f3c93bd3378a537ff844970492384fb769d3845d0805edd7f0fcd19efabf32f197 -b9597e717bb53e6afae2278dbc45d98959c7a10c87c1001ed317414803b5f707f3c559be6784119d08f0c06547ec60b1 -b9d990fd7677dd80300714cfd09336e7748bbf26f4bb0597406fcb756d8828c33695743d7a3e3bd6ddf4f508149610ef -b45f7d2b00ceea3bf6131b230b5b401e13a6c63ba8d583a4795701226bf9eb5c88506f4a93219ac90ccbceef0bfd9d49 -a8ccaa13ca7986bc34e4a4f5e477b11ae91abb45c8f8bf44a1f5e839289681495aba3daa8fb987e321d439bbf00be789 -ae0f59f7a94288a0ead9a398fdd088c2f16cccb68624de4e77b70616a17ddf7406ca9dc88769dadeb5673ff9346d6006 -b28e965dcc08c07112ae3817e98f8d8b103a279ad7e1b7c3de59d9dbd14ab5a3e3266775a5b8bbf0868a14ae4ab110f1 -84751c1a945a6db3df997fcbde9d4fe824bc7ba51aa6cb572bb5a8f9561bef144c952198a783b0b5e06f9dd8aa421be8 -a83586db6d90ef7b4fa1cbda1de1df68ee0019f9328aded59b884329b616d888f300abb90e4964021334d6afdea058fd -8fcea1ce0abf212a56c145f0b8d47376730611e012b443b3d1563498299f55cbcbe8cbd02f10b78224818bb8cbbd9aaa -8d66c30a40c34f23bae0ea0999754d19c0eb84c6c0aa1b2cf7b0740a96f55dd44b8fee82b625e2dd6c3182c021340ac6 -92c9b35076e2998f1a0f720d5a507a602bd6bd9d44ffc29ede964044b17c710d24ce3c0b4a53c12195de93278f9ec83b -a37d213913aff0b792ee93da5d7e876f211e10a027883326d582ad7c41deebdfce52f86b57d07868918585908ebd070a -a03995b4c6863f80dd02ed0169b4f1609dc48174ec736de78be1cdff386648426d031f6d81d1d2a7f2c683b31e7628c0 -b08b628d481302aa68daf0fa31fd909064380d62d8ed23a49037cb38569058e4c16c80e600e84828d37a89a33c323d1f -a0ee2e2dd8e27661d7b607c61ac36f590909aa97f80bdfd5b42463ca147b610ac31a9f173cbecdd2260f0f9ea9e56033 -967162fba8b69ffce9679aac49214debb691c6d9f604effd6493ce551abacbe4c8cc2b0ccee6c9927c3d3cfbdcb0be11 -8deab0c5ed531ce99dadb98b8d37b3ff017f07438bc6d50840577f0f3b56be3e801181333b4e8a070135f9d82872b7f2 -b1bfa00ec8c9365b3d5b4d77a718cb3a66ed6b6cf1f5cf5c5565d3aa20f63d3c06bb13d47d2524e159debf81325ba623 -90109780e53aeacd540b9fe9fc9b88e83c73eaf3507e2b76edc67f97a656c06a8a9e1ec5bce58bfd98b59a6b9f81b89d -88a1009a39a40421fdcc0ffc3c78a4fbace96a4e53420b111218091223494e780a998ebecf5a0abd0243e1523df90b28 -90b77146711ee8d91b0346de40eca2823f4e4671a12dad486a8ec104c01ef5ee7ab9bd0398f35b02b8cb62917455f8b3 -b262c5e25f24ae7e0e321b66fdb73b3bf562ded566a2d6a0152cf8bafb56138d87b6a917a82f5ace65efc73cfc177d81 -ae65a438c7ea46c82925b5ec5f71314558ca5146f5d90311431d363cfeac0537223c02cbb50fa6535d72fc2d949f4482 -8984208bfc193a6ef4720cc9d40c17f4be2f14595ef887980f2e61fa6927f9d73c00220937013b46290963116cbe66ac -a8f33a580508f667fac866456dce5d9246562188ad0f568eb1a2f28cf9fd3452dd20dc613adb1d07a5542319a37ecf1a -aedadd705fc086d8d2b647c62e209e2d499624ab37c8b19af80229f85e64a6e608d9cd414cb95ae38cf147d80ec3f894 -ae28077a235cd959f37dc3daedc3706f7a7c2ffe324e695f2e65f454bf5a9fc27b10149a6268ebfaa961ad67bb9b75d7 -a234c7f5a5e0e30f2026d62657bd92d91a9907ec6a2177f91383f86abb919778121ff78afb8f52c473fe6fb731018b52 -816a2ea7826b778f559a815267b6c6eb588558391c0a675d61bb19470d87489ba6c1e2486ea81dd5420a42ee7c35a8de -9218b61948c14234f549c438105ae98367ef6b727ad185f17ad69a6965c044bb857c585b84d72ef4c5fb46962974eed7 -a628031217a0b1330b497351758cf72d90fb87d8bdf542ea32092e14ff32d5ef4ca700653794bb78514d4b0edfd7a8d7 -ab4e977141be639a78eb9ed17366f9642f9335873aca87cce2bae0dddc161621d0e23264a54a7395ae706d748c690ee9 -b1538c4edff59bcf5668557d994bac77d508c757e382512c4368c1ded4242a41f6200b73fe8809fb528a7a0c1fc96feb -965caabe5590e2ff8c9f1048bbdda2817e7a2847e287944bfab40d94cb48389441ac42ff3a7b559760bfab42ff82e1e0 -a64b7484d22c4b8047c7a8ef54dc88cb8d110c61ef28ba853821b61e87d318b2b4226f7f0d1f3cdf086a0e1666d0212c -8915ab7e41d974eef9a651b01c2521392e8899e6ab91c22aeee61605c78fb2b052399ba1d03473aa9cfb52d1a8ba4257 -8dd26875d4a1716db2f75a621d01e971983267770e2da92399aecf08f74af1f7e73643ac6f0a9b610eda54e5460f70ed -83dabcb84c9cbce67e1a24ecbfa4473766b9519588b22288edbaa29aca34cefd9884f7310e7771f8f7a7cbced2e7eea0 -956be00c67987fb4971afca261065a7f6fcef9fb6b1fcb1939f664bbc5b704223253ebfda48565624a68fb249742c2cf -a374824a24db1ab298bee759cee8d8260e0ac92cd1c196f896600fd57484a9f9be1912ded01203976ac4fab66c0e5091 -a225f2ed0de4e06c500876e68e0c58be49535885378584a1442aae2140c38d3ca35c1bc41936a3baf8a78e7ab516f790 -8e79c8de591a6c70e2ef2de35971888ab0ca6fd926fdb6e845fb4b63eb3831c5839f084201b951984f6d66a214b946b8 -91babc849a9e67ab40192342c3d0d6ce58798101cb85c9bd7fc0ac4509ffc17b5ea19e58045cf1ca09ec0dee0e18c8f9 -8b4897fc2aef5bbe0fa3c3015ca09fc9414fdb2315f54dbecc03b9ae3099be6c0767b636b007a804d8b248c56e670713 -8f63ba42e7459ea191a8ad18de0b90b151d5acbf4751e2c790e7d8328e82c20de518132d6290ff3c23d2601f21c1558e -a1a035dc9b936587a16665ea25646d0bb2322f81960d9b6468c3234c9137f7c2b1e4f0b9dbe59e290a418007b0e7a138 -81c4904c08f7bb2ac7b6d4ac4577f10dd98c318f35aac92fc31bab05eceb80a0556a7fc82614b8d95357af8a9c85a829 -8c40e44e5e8e65f61e0a01f79057e1cb29966cc5074de790ea9c60454b25d7ea2b04c3e5decb9f27f02a7f3d3cb7014f -ad8709e357094076eb1eb601539b7bcc37247a25fbc6ada5f74bb88b1b371917c2a733522190f076c44e9b8e2ae127fb -92d43cd82c943fd71b8700977244436c696df808c34d4633f0624700a3445f3ecc15b426c850f9fb60b9aa4708f2c7c0 -b2cb8080697d1524a6dcb640b25e7255ae2e560613dbd27beaa8c5fc5c8d2524b7e6edd6db7ad0bb8a4e2e2735d4a6f7 -971ca6393d9e312bfb5c33955f0325f34946d341ff7077151f0bcafd2e6cbd23e2ad62979454f107edc6a756a443e888 -b6a563f42866afcee0df6c6c2961c800c851aa962d04543541a3cedeb3a6a2a608c1d8391cf405428cd40254e59138f3 -986bd17bad9a8596f372a0185f7f9e0fb8de587cd078ae40f3cd1048305ba00954aff886b18d0d04640b718ea1f0d5a3 -ae32dbccfb7be8e9165f4e663b26f57c407f96750e0f3a5e8e27a7c0ca36bc89e925f64ddd116263be90ace4a27872c4 -83725445ec8916c7c2dd46899241a03cf23568ac63ae2d34de3bce6d2db0bc1cfd00055d850b644a059fb26c62ed3585 -a83f7e61c05b1c6797a36ad5ded01bf857a838147f088d33eb19a5f7652b88e55734e8e884d1d1103a50d4393dfcd7a8 -aa010b4ec76260d88855347df9eaf036911d5d178302063d6fd7ecad009e353162177f92240fe5a239acd1704d188a9d -a88f4ba3cf4aff68ec1e3ded24622d4f1b9812350f6670d2909ea59928eb1d2e8d66935634d218aeac6d1a0fc6cae893 -b819112b310b8372be40b2752c6f08426ef154b53ef2814ae7d67d58586d7023ffa29d6427a044a3b288e0c779866791 -b5d1e728de5daf68e63b0bb1dee5275edae203e53614edeeeefff0f2f7ac4281191a33b7811de83b7f68111361ef42e1 -953fb3ddc6f78045e53eaacfd83c5c769d32608b29391e05612e4e75725e54e82ad4960fbef96da8b2f35ba862968a3e -936471136fb2c1b3bb986a5207a225a8bf3b206a1a9db54dc3029e408e78c95bfb7539b67006d269c09df6354d7254ac -ac353364b413cae799b13d7dc6fa09c322b47e60b9333e06499155e22d913929b92a45a0ad04ba90b29358f7b792d864 -a0177419ead02ba3f0755a32eee3fd23ec81a13c01eab462f3b0af1e2dba42f81b47b2c8b1a90d8cec5a0afa371b7f11 -b009eeb5db80d4244c130e6e3280af120917bb6fcebac73255c09f3f0c9da3b2aa718cd92d3d40e6b50737dbd23461aa -b8a43426c3746c1a5445535338c6a10b65474b684a2c81cd2f4b8ebecc91a57e2e0687df4a40add015cd12e351bbb3eb -94ff3698a6ac6e7df222675a00279c0ea42925dc6b748e3e74a62ea5d1e3fd70d5ab2d0c20b83704d389dd3a6063cf1a -90e4142e7ce15266144153e21b9893d3e14b3b4d980e5c87ce615ecd27efac87d86fa90354307857f75d7ebaeffe79ef -a5fd82c3f509ec9a36d72ba204a16f905e1e329f75cfd18aaa14fb00a212d21f3fac17e1a8e3bc5691ab0d07f8ec3cd0 -962e6bfd75ea554f304a5fee1123e5bf2e048ccd3b401716b34c52740384579188ac98bc0d91269fc814de23f4b2dd34 -b50b4e45c180badf9cd842cd769f78f963e077a9a4c016098dc19b18210580ad271ae1ba86de7760dd2e1f299c13f6a0 -84cf08858d08eca6acc86158ffda3fbe920d1d5c04ac6f1fc677760e46e66599df697397373959acf319c31e47db115c -a697a38ba21caa66b7739ed0e74fe762a3da02144b67971fcad28c1132d7b83e0ac062cc71479f99e2219086d7d23374 -ad1f6d01dd7f0de814fe5fbb6f08c1190ff37f4a50754d7b6291fc547c0820506ea629aabacf749fec9c1bbfda22d2d0 -b11fd7f8c120d8a370a223a1adc053a31bef7454b5522b848dec82de5482308fc68fdaf479875b7a4bc3fc94e1ea30eb -93ecf90ebfc190f30086bcaeee18cda972073a8469cf42a3b19f8c1ec5419dff2d6a5cc8ef412ccd9725b0f0a5f38f88 -911f25aaa5260b56b3009fa5e1346a29f13a085cf8a61b36b2d851791f7bcf8456840eccbfc23797b63ecd312e2d5e12 -a52f17a8b2db66c98291020b1db44ab23827e1790e418e078d1316185df6aa9f78292f43a12cd47131bd4b521d134060 -9646fca10bf7401e91d9a49753c72f3ecb142f5ed13aba2c510a6c5ccb8d07b8e8d1581fc81321ad5e3996b6d81b5538 -aa1da4a5665b91b62dda7f71bb19c8e3f6f49cc079d94fcd07b3604a74547e8334efa5a202822d0078158056bbda2822 -a2432ae5feeaf38252c28aa491e92a68b47d5b4c6f44c1b3d7f3abc2f10b588f64a23c3357e742a0f5e4f216e7ca5827 -83c7b47735cd0ef80658a387f34f259940096ebb9464c67919b278db4109fea294d09ea01a371b79b332cff6777c116d -a740a2959e86e413c62d6bdd1bc27efe9596ee363c2460535eab89ba1715e808b658bd9581b894b5d5997132b0c9c85c -b76947237fa9d71c3bece0b4f7119d7f94d2162d0ced52f2eac4de92b41da5b72ad332db9f31ebb2df1c02f400a76481 -a20e1f2b7e9cc1443226d2b1a29696f627c83836116d64d2a5559d08b67e7e4efa9a849f5bb93a0dadb62450f5a9eaab -b44bff680fba52443a5b3bd25f69c5640006d544fca1d3dc11482ee8e03b4463aae59d1ec9d200aa6711ce72350580fb -a9490f5643bacec7e5adcda849ab3e7ff1f89026bf7597980b13a09887376f243158d0035e9d24fdee7cb6500e53ef29 -96081010b82c04ad0bfc3605df622db27c10a91494685ef2e6e1839c218b91cbb56e043e9a25c7b18c5ddee7c6769517 -a9522d59bcf887cbbbc130d8de3ff29a86df5d9343a918f5e52c65a28e4c33f6106ac4b48ecd849a33d39eeb2319d85b -aa5e0cea1a1db2283783788b4d77c09829563b75c503c154fdaa2247c9149918edac7737ef58c079e02dca7d8397b0eb -8c03f064e777d0c07c4f04c713a86bf581cc85155afe40e9065ead15139b47a50ead5c87ac032f01b142d63ff849758a -a34d672bf33def02ee7a63e6d6519676c052fa65ca91ed0fe5fdd785c231ba7af19f1e990fc33f5d1d17e75f6af270be -8680443393e8ac45a0b07c30a82ac18e67dcc8f20254bd5ede7bf99fc03e6123f2fcd64c0ca62f69d240f23acd777482 -a4e00ab43d8ae5b13a6190f8ef5395ec17fbac4aa7dfa25b33e81b7e7bf63a4c28910b3a7dc9204dbc4168b08575a75e -8249259066ee5672b422c1889ab5ed620bddd1297f70b4197c40bb736afba05d513b91d3a82ee030336c311d952cd60c -a0651d8cf34fa971bde1ec037158a229e8e9ad4b5ca6c4a41adedb6d306a7772634f703dcfac36f9daf17289f33c23fb -b02ff6e8abff19969e265395ceaf465f43e7f1c3c9cfc91f1748042d9c352b284e49515a58078c877a37ff6915ee8bf4 -927fb7351ac28254458a1a2ea7388e1fbd831fbc2feedb230818f73cc8c505b7ff61e150898ce1567fcb0d2c40881c7b -a9d3861f72090bc61382a81286bb71af93cdeefab9a83b3c59537ad21810104e0e054859eeafa13be10f8027b6fc33b8 -a523306656730b1a31b9a370c45224b08baf45773d62952a0bf7d6c4684898ae78914cfafbd3e21406407cc39e12afdc -947a090e7703a3ea303a4a09b3ab6b6d3fda72912c9f42cc37627557028b4667f5398a6d64b9281fa2efbe16f6c61ed6 -b41d24d40c10239c85d5b9bf1a3886d514a7a06b31ca982ea983e37162293350b12428eabc9f6a460473ad811e61ba40 -b0bb9805724f4ca860e687985c0dc6b8f9017fe71147e5383cfbbbdcb2a42c93c7062ba42acdead9d992b6f48fc1d5ac -aec775aa97a78851893d3c5c209a91267f1daf4205bfb719c44a9ed2614d71854b95bb523cd04a7f818a4a70aa27d8fc -b53e52e32ca90b38987610585ad5b77ecd584bd22c55af7d7c9edf5fbcae9c9241b55200b51eaed0fbdb6f7be356368f -a2c5ac7822c2529f0201717b4922fb30fb037540ab222c97f0cdac341d09ccb1415e7908288fabef60177c0643ed21bf -92162fda0cbd1dafbed9419ae0837e470451403231ee086b49a21d20de2e3eed7ce64382153272b02cf099106688af70 -8452d5df66682396718a76f219a9333a3559231e5f7f109a1f25c1970eb7c3408a5e32a479357f148af63b7a1d352451 -831ea95d4feb520994bc4904017a557797e7ad455a431d94de03b873a57b24b127fcc9ff5b97c255c6c8d8e18c5c7e12 -93d451d5e0885ccdbb113a267c31701e7c3d9e823d735dc9dfd6cfdcd82767012dc71396af53d3bedd2e0d9210acf57f -a2126f75a768dcc7ebddf2452aebf20ad790c844442b78e4027c0b511a054c27efb987550fcab877c46f2c7be4883ae0 -aa4d2dcba2ccfc11a002639c30af6beb35e33745ecbab0627cf0f200fdae580e42d5a8569a9c971044405dfdafed4887 -ab13616069ef71d308e8bf6724e13737dc98b06a8f2d2631284429787d25d43c04b584793256ed358234e7cd9ad37d1f -9115ee0edc9f96a10edcafeb9771c74321106e7f74e48652df96e7ca5592a2f448659939291ff613dd41f42170b600ad -97b10a37243dc897ccc143da8c27e53ccc31f68220bffd344835729942bb5905ae16f71ccaed29ca189432d1c2cc09b1 -875cf9c71ae29c3bde8cdcb9af5c7aca468fbb9243718f2b946e49314221a664959140c1ebc8622e4ed0ba81526302fd -86b193afbb7ff135ce5fc7eb0ee838a22e04806ceec7e02b3fb010e938fff733fc8e3a1d4b6cba970852d6307018b738 -b3403a94f1483edce5d688e5ed4ab67933430ede39cd57e2cddb4b469479018757d37dd2687f7182b202967da12a6c16 -83edfa0a6f77974c4047b03d7930e10251e939624afa2dcafbd35a9523c6bf684e1bb7915fc2e5b3ded3e6dc78daacf2 -88ff3375fe33942e6d534f76ed0f1dfa35ae1d62c97c84e85f884da76092a83ecd08454096c83c3c67fac4cd966673d7 -af0726a2a92ee12a9411db66333c347e1a634c0ab8709cc0eab5043a2f4afac08a7ae3a15ce37f5042548c6764ae4cf6 -81cfa33bb702e2f26169a006af0af0dcaa849cec2faf0f4784a06aa3c232d85a85b8123d49a1555cca7498d65e0317e4 -910a16526176b6e01eb8fb2033ffbb8c9b48be6e65f4c52c582909681805b3d9e1c28e3b421be9b9829b32175b8d4d80 -93d23befa411ca1adbdba726f762f2403e1cc740e44c9af3e895962e4047c2782ca7f2f9878512c37afd5a5a0abbd259 -82fcf316027fedfe235905588b7651b41e703836f96cb7ac313b23b4e6c134bff39cd10b3bddb7458d418d2b9b3c471b -8febc47c5752c513c4e5573428ad0bb40e15a5e12dbfa4c1ef29453f0588f0b75c3591075fef698e5abcf4d50c818a27 -83dab521d58b976dcea1576a8e2808dfaea9fa3e545902d0e0ce184d02dca8245d549134a238ab757950ad8bc11f56eb -898cfb9bf83c1c424eca817e8d0b99f5e482865070167adab0ecf04f3deeb3c71363b9f155c67b84d5e286c28238bef8 -b845e388cc1a8e8b72a24d48219ac4fd7868ee5e30960f7074b27dada842aa206889122acfce9e28512038547b428225 -b1ce4720e07e6eecc2a652f9edbad6bd5d787fbaff2a72a5ca33fa5a054dd3b4d5952563bc6db6d1ce1757a578bba480 -8db6990dd10741cf5de36e47726d76a12ebe2235fdcb8957ab26dba9466e6707d4a795d4e12ec7400d961bd564bdee7e -a3ca7afd20e16c2a45f73fc36357763847ed0be11cb05bfd9722f92c7ba3fa708cf10d4e0ae726c3eccae23cc55fd2be -8701b085c45b36f3afb589207bbf245ef4c5c82aa967ecd0c334daa1f5a54093c5e0fcacd09be540801920f49766aa0f -84e3736727ba76191d9a6a2a3796f55bb3c3a8bbb6e41f58e892ea282c90530b53ab5490bbf1a066723399bb132160fb -87c02a01917333c7b8866f6b717b1e727b279894108f70574d1b6e9e8dc978eda8778342baf3c6464d6e0dd507163e76 -b8da532dac81fafaed759e99c3ae011d75f3fda67a8c420c3b9747281fe32e31ac3c81e539940286440704c2c3e3b53e -a0cc63c3bef75a5c02942977a68a88cd3d103d829b6c0f070f64206da7e3638f10f42452788092de8fbbc626ce17b0d4 -b5c9317b3f6b1d7ee6871506c0430cdf73e28b02c001ba6ca11061c7e121c91152d2b80c4f80e1d8f51ff5653bc0db5b -b798fb572da977dd3ef2dce64042b012a470d6bd2cb61a16267abe2b8399f74540d7c70462a6b2278d73567447e31994 -b868eda58739effda68c834745cd2cf66a09f0f215607b65685bb5ca3eba71150f43a6e47b81a0c19fb58eeae3da56e8 -9041c93a7e8f2c34812fd6e9744b154e898e1ef69db72bf36242c71e2c251f3db7e86cbd802da603a92cd0b06b62ea63 -a834d648e974230582fc17b3a449f4f65b3297038a3a5401e975b9b60ff79b2006a33e1486d3428106580276993311e1 -a3ce874da6ade9f0f854d7ae7651fc3ff63cec748a847527539fe0d67e6c99eaa3011065a4627c2192af7f9569f7ab57 -ae78ad16de150cc0400d3b6b424c608cd2b2d01a7a38ea9c4e504d8463c0af09613774dbefdd5198415b29904e0fbb63 -b966db5a961067e743212d564595ef534e71dcd79b690a5a2c642d787059fc7959b9039b650372461a1f52910f7e857b -8069904f360af3edfd6cabd9b7f2adf5b61bd7feb0e9a040dc15c2a9d20052c3e5e0158f3065ec3200d19b91db603b71 -9600917dbcd80a47f81c02c3aafecfcef77f031bf612a0f1a8bdef09de9656f4bb0f8e3e95f72ece1c22bd2824f145b6 -834a0767b7b6199496c1faee0e3580c233cc0763e71eebc5d7c112a5a5e5bd95c0cf76a32ea5bb1b74f3cf00fbd2cfb4 -99469a893579ed5da7d34ec228854c4666c58115d3cae86d4fc2d03d38f10d8c5dc8fb693763a96ab6be2045cc8d518b -a52cc0aecda6594de57d8ca13b146e77212cc55854929c03f2a8a6cdfa46296791c336aebcc2610d98612d5b4c0452df -97864434d55aa8a7aad0415d36f9558ce6e6c00452923db68a1e738232d0cb2d47e3b0b8f340c709112838adeaee4695 -a4a7f2c45db3661b6af7ec759f9455ba043b0de6fd4787e3372cba215b9f7c641d5d817a0576e7aa28a46349d2fe0ae6 -864e857652d95e1d168c1b9c294777fc9251a4d5b4b00a346b1f1c9c898af9a9b5ec0ac1f3a66f18a370b721dbd77b23 -ab8eac458fa8e7eb5539da3964ccd297a216448c3af4e4af0dcfed0ce29e877a85e29b9601dc7508a060b97a05f37e15 -a6fd0782c5629c824fcd89ac80e81d95b97d8374c82010a1c69f30cef16ffc0f19e5da2d0648d2a36a636071cb4b69a7 -ad35a75fd8832643989d51d94ee6462d729e15f6444ffdf340dfb222af5d2b6b52e5df86082dbc7728fde7c1f28ac6b4 -8e06831cc8a0c34245732ea610ea6aae6d02950299aa071a1b3df43b474e5baee815648784718b63acfd02a6655e8ea7 -994ac097f913a4ce2a65236339fe523888ee43494499c5abf4ac3bce3e4b090f45d9abd750f4142a9f8f800a0115488c -a3e6a8e5e924f3a4f93e43f3f5aafb8b5831ce8169cddde7296c319d8964a0b6322a0aa69e1da1778fcc24b7de9d8b93 -81a9bd04f4c6e75517de4b5e2713f746bd7f3f78a81a2d95adc87ba0e266d1f5e89c9cfb04b5159c1ff813f7968a27a4 -b24de8f3a5b480981c6f29607b257ded665ecd8db73e2a69a32fcf44e926fdc7e6610598e10081cf270d2f879414b1ab -adc1b3f8ed1e7d5a26b0959ffe5afc19e235028b94cb7f364f6e57b6bf7f04742986f923fae9bf3802d163d4d0ebc519 -a9fa5092b6dd0b4e1a338a06900b790abbc25e2f867b9fb319fdcdfb58600315a45a49584c614f0f9f8b844aa59dd785 -b29c06b92b14215e7ef4120562893351ae8bf97cc5c3d64f4ecd0eb365b0e464cf27beec3f3ddac17ed5e725706b6343 -adc0d532ba4c1c033da92ba31aa83c64054de79508d06ee335dcab5cabae204a05e427f6f8c2a556870a8230b4115fd0 -9737150d439e6db2471d51e006891d9687593af4e38ee8e38bfa626abcefa768ca22d39133f865d0a25b8bbf7443d7db -a10d1e6a760f54d26c923c773b963534e5c2c0826c0a7462db2ea2c34d82890f9c58f0150db00aa2679aa0fdb1afcb08 -816947dc6c08ee779e9c2229d73dbfd42c2b3b6749b98ec76dbad017f4b4d4f77b5916600b576691978287208c025d6f -a2dc52b6056219d999f07b11869c254e8b3977113fd9ba1a7f322377a5d20e16c2adf46efb7d8149e94989b3f063334a -8153900aae9cf48ebc7438b75c16f5478960ef9170e251708f0c2457967b7b31521c889b5fe843d2694a07c0e804fa48 -a9e9d8d66c8774972cc1686809ce1fa5f0e16997ef2178b49bcd8654541b5b6e234cb55188f071477ba1cebcf770da45 -b1fa775f9b2a9b05b4b1f0d6ad5635c7d7f4d3af8abaa01e28d32b62684f9921197ba040777711836bc78429bf339977 -b1afbbd522b30e1ae2adf9a22993ab28b72a86a3d68d67b1833115e513632db075d047e21dfe442d6facc7b0a1b856bf -8779b7d22f42845a06ae31ac434e0044f5f9b4e704847fb93943e118e642a8b21265505ad9d6e418405d0cb529e00691 -ab2c6cef1c4e7c410e9e8deb74c84bedeb3c454ae98e3bc228eb13f6b7081b57977b3e849ba66346250e37c86842c10c -908d6c781d7d96aa2048c83e865896c720a66fdec7b06ab4b172192fe82f9ff6167815ffb66549d72bfb540bb35c36c6 -b790440f205ece489e2703d5d1d01ba8921dd237c8814afb5cb521515ed4c3b0a6df45fd4bd65ba63592c2fe1d008df3 -aec346251f9c78336b388c4e9069a1c6c3afbbb6bfaffdad050a9e70e92fb3cae3609067b4903552936f904c804b0ea6 -a0e528cc2cb84b04cc91b4084e53ead4188682a6050b3857c34280899c8233aa8c1a9c6fa4fd6a7087acf1b36d67734a -aa8d7632be3e4340712a1461a0ad0ae90ba6d76e2916511c263f484c6c426939fa93ffbb702cd0341eea404d6ddffebb -a4ea871d8a1d4b925d890aefb9897847599b92e15ce14886b27ce5c879daa9edead26e02ccc33fcf37f40ff0783d4d9e -ab63e4dc0dbdaf2ada03b3733aafe17e719d028b30dc9a7e5783c80933a39935dbe1ef0320bb03f9564cafdf7a4b029b -8219761bbaa39b96b835f9c2b4cec0bf53801f8e4f4a4498d19638be2fa0a193b2c1fbf94e26c1058d90a9ac145a7a12 -a609ee5561828b0f634640c68a98da47cb872b714df7302ef6b24d253211e770acd0aa888802cd378e7fa036d829cd36 -90793ff0736f3c80b5e0c5098b56cda8b0b2bca5032bb153d7b3aa3def277f2fc6cea60ac03edc82e3a9d06aff7d1c56 -8760085283a479d15a72429971a0a5b885609fd61787a40adb3d3d7c139b97497aa6bcb11b08979e2354f1bc4dbf7a0d -b168ede8b9a528c60666057f746530fc52327546872dd03c8903f827d02c8313e58c38791fb46e154d4247ea4b859473 -842c1149ca212736ebe7b6b2cb9a7c3b81ae893393c20a2f1a8c8bfef16d0a473ff865a1c130d90cc3626045f9088100 -b41d0e2c7d55108a8526aa0b951a5c8d7e3734e22fe0a6a2dd25361a5d6dea45c4ab4a71440b582a2f9337940238fe20 -8380bd49677e61123506dd482cdf76a8f1877ea54ed023d1deabfc05846103cfd213de2aef331cdf1baf69cfc6767be9 -a026f92030666b723d937f507e5a40e3f3cfd414ad4b2712db0a7a245a31a46002504974ed8ba9d8e714f37353926a4e -b492e9e9917b29eb04cde0b012df15cbd04f3963d120b63c55dc4369e04f5ac7682b2c7dff8c03410936c26ca73ad34c -81fd9271b4ee36be0ba8f560d191e1b6616dd53c56d1d8deac8c1be7bc67bbc53d434cf70d04e7fa9de3e63415389693 -835c3711abe85683d2344a3ee5f70e68342fd1aec025ad248efe66aab3e3d5790fad2f45bae0d7a53a80998fde45f0aa -b46599be80b8f7dbad0b17808dd5ca91d787929c0bef96fbbcf6c767727d07ed6785bad164d733ecb015eb6c8469a16d -b36bf5c17271d39f5ccb3d82a5e002957207a0cdf9ae7108a4946e6f3ed21a5d353fa940b6fe949c39422b452339bae9 -a12f5444e602d6fb8be51a08b8bc4ec105dfd759d2afe98d51ff4edd673c92e4fc91ff32417ae8070e12169004f8aad3 -892ce3ca0a2961a01f7f0149b8a98fdc0f8871c2d85e76daf7c8aed2a18624b978a4d0a84213f81f9d2a81f7ca4826d0 -b1e6229ebd5b3d85e62d0474d1fed34564f1b5b9c5856fae36164dd0eff378d67d6717dda77536379006fb462bced9da -ac852921dcb81e54e1e315fd6226219932f7b785c2ceb2035710e814899784d7001101f1515d68e3fb74cdbb4baf9e26 -989a42d851123d708a213f3a02cfc926df15af058ec9b5a9df968fe16decbd781b5e65a4c17fbfedd2ac17126084700f -b1d0fc2f7c948e466445f307da7b64b3070057c79c07c7ebbbe6f8ed300a642b3567aed2e5f28988ac566ba62e0d2a79 -83057263b41775bc29f1d59868a05b0f76d3bdf8a13c1014496feb4c0ee379bfd0d4079785252f51fbeb641e47a89b69 -ac9e6a208aa9c557155cf82b389bb4227db5ac4b22a0c7c8d1c3d98946df8b82b0c49d093ba55c8255e024a6d67c14b4 -8294a11cd3f5111b1f8bd135be23b4de337ac45711db9566ebf6e162cd58e7859b1309eba8149b0f0a43e07f62a92411 -8c15f3388b196603c05adec195c1d2cc589e3466da3169e9afd37157fa55cd34bfafbfc5ff10ac0e04aa6a0d0b2ce3db -b8faf8ba89c3115576ab6b340f6cc09edfea8f7331f5a5e8003960c584e839fcecf401113dfbb9a5c11a13721b35c263 -955c63b1166514c02847402d0e92dccfe3c0dee3bc70d2375669afb061594c85651e6569f471a6969759e5f373277da4 -963bd4f9ae7361d6936d209592a07d9a22cc9ef330cf0c5cb845cb4085d76e114aee66d7599bf5b9f11c6b1c05dade8d -85509b3c97e06e0db113b8b40022c8989a305cec39acab36ba3a73a4b4719573e5bdb82dc4795699c26d983465cd61b0 -b870cfd7f691f88db8d1dfbe809b7b402eabd3b3299606b7dfdb7ef49415411f01d2a7e4f7ebd919ac82c7094f628166 -a5533e7b58a6a9e5c25589134f501584163551247d36f50666eeb0a0745cf33e65bb8f7a9c2dc7fe7cb392414f1ece4a -b93d1ade01ff5678fcd5b5b4f06a32b706213748076cae3a375e20a97231133ec37c1c3202cbc4896b66c3410210f446 -86ed3a58000a46fe2c37d4de515430a57d8f54ab4300294685534372fed1d68e192dd43d43ea190accf3dc9b22e1548b -a8c7d8dc30057bb8ad66b9cfda5e223334407730aeb0f51705922c18e7a07d960c470d463d1781899203e1b1ed1df484 -8d86821d006e957e8544f95a98b110c89941bcc6985562e7a97285f5826b35b690963b2c141ff3f389d92ee18ec76d24 -a4e1108cd3cf01810e74dbbf94340487011b80013b9bfdc04f019188c0d4d077a54b71a3f97a036601aad42a268531e8 -a822cd61db07f64bea00de226102f5fc0adf8fa9f05a6c7478b0ff93e48f6cc3191302d22e1f369b571877d5eb96139c -b1ad4094d0bb4c325dfe072b17711962247dd7ff7e4bce4612e80a6f3c1bde04880ba1682f60d5f1451318afd4d3ba60 -88e7beb0cfd7361288ea27f6b2cb18870e621152ff47994440c18d45284d21bad80d9806ed7d9d392a5cd791d5150ce2 -aad3724a176cf4476595cdfb9e2c3261c37052324c0b5373a30b6cbeb481bccd303720840c49a84ddca916d470eb6929 -a57983370d159e7078a273746fb22468000a6448b1a31d277272e35c6f548f97928e9015f1daf577511bd9cfee165237 -a54136e9db381cdd6dfb3fff8bdec427d4dc1072f914f6fecfec13d7b8f95bb3b5f30ad7677288c008ce134edfb039a7 -a25dfc4019f165db552f769f9c8e94fa7dbbf5c54a9b7cde76629cc08808c1039ecbd916560c2b6307696dd9db87d030 -a917d25328b0754d70f36e795fe928e71ae77e93166c5e4788716c1ef431115c966f2aad0ce016f4bacc2649f7466647 -842ce5e4ad7d8d4b8c58430e97ff40a9fce1f1c65ecba75fed2e215e101d1b2d7ab32c18df38dab722c329ab724e8866 -a8eb2ed2986ff937a26a72699eb3b87ef88119179719ff1335f53094c690020123f27e44fc6b09f7a3874bf739b97629 -96753c1f9c226f626122dad6981e9810a3cf3bbee15cfc88e617cfd42753e34593610861be147a7b8966bcdec55bba8d -94119d31606098f5b129931b51b4b42c4e3513a128b9bfb03cfeee78b77b9909b1c2fcf0a292e49d63bc4e5fe823dfef -a869654f5880d9c21a0af1ff4cfa926e03ec1f2d80fe5524605e04f484e09dc80d6769249f31fd378ff3926ab4cebc69 -b2a539bdd8de4499c5f35cd8824974c2abb1933b3f50d0175dd044563ca829eaa0fc47bdac97eafa98434d1cd05d7c5d -85f53b2bfcde1986ce7279f3a2f5f841f87d75af5d197c897f261d4874bc6868c575ecf7556a32b7b33f7b2795454591 -964f087ed02228b30f401d8aea35c1a7f76698e4075e1bb343398be74c716884e9ca1a31b81566e1ff7513cf76a2f0cd -a1c9d9c9bfbc9c4e281a2953d5991e7b22ff1a32ddaace9e8d9a42e080efb802b853d3276973b5189a5745943c9b4389 -b0c45a9852663a427d7f50c608a6419fbd00f90e8452757a45269d25c0386ec29942f48a34aafc0187ef6020e581d290 -aa3ca7b01862d5d2aea714fa06724b7dda7062b6608605cb712588b2c49fc3c7d89a8799e6e7c31e7a9ef28b1ad4d1f7 -88f5e98ae8c5ae7add42f6d358a35667e590aa80e1869593cbf597d7ee466efa35b429f1836ba2199d8280fe7f60ce3a -8a3bff472e8008f7e50362acc1a0b53c09ac60430942544532722e938470376f0672662261992146765b7c75a380c318 -b9847be7f7aee7532282c279dde928698a892a183ca3047ceda521e9e0a50d96fd3ce59f8e58f31af49508ade6d4ba51 -98065dc23ea3df6d9f8459e81887d88d5752b7e7ba6050ec5c3f0dce93e463e0bf12be3c94ec74c16e2f7ba62e447845 -994aff677b97ee790894dbdb21b1f9210734e008cee2aa2200c8f2579ea650b872f39776a13a8c31e95cc817091bae1c -b292811674e18912ebe79df1af4a132b04ab702c125c039e0213f735f658fafd36c38e5bbd7cad35842576431f5f3630 -96520d750ec10bb10f75019f8f0e4a93ecbc6b678a710d76cd10aa27a6642ad1461bd58fc2aab8e0391b3f788339ed29 -80d478da7fe246ad0e81a00141229e9d91ffb7fd1b29975c8ec358ed5e864e481bf01b927a9ba002c5ec4aa226d0cb57 -ae58049d93a11ae845dc5be2505e95657f83b95d83ff3591a3c565d587157be795ff4481f42d59eda95e6d523444e199 -85f1f5ad988b9f8a7e24b6d6a22b9de9fb3fe408f95711389c444d7ba2243987225b04318aa97a4cde2cb4c30c05508f -922092d0cb828e764ce62f86cbc55c04dce07233cff041888fae48cfe93818780b4aec9b4ff4718275bb2bfa6bd9e9ba -a85ba97125feff0590a05fb78f19a7338639ad1748802918af4d59307bc994536c0ad638b97b9acd26a08b6b4370dfbf -8c46fcaa8d13266d650bd9366180e5ebbfa002c339e4424a030de19ed922e2daa9a353ae54921a42299607ae53feb075 -b8549832230eb1ec6ee3c33c078deb47f556a0907d2a85fde7720391c82d2ed63dd753cf544a6a0a46eed4b8d1ecd9b8 -b7b96f24504c7f8fbed9c1c654a2550feeee068407b809c43f1082c9558c8665806d911d5d244308169d8a531373bf56 -81c483fd9d9ad7af7869d617ac592e7e951e39738da041d8c4110637689108eb29c8acadfc85366c70885cdf77b353c3 -acf33bcfd9080dfdba828727fe36803327a94e8a3ee5b6e445274f0e8267ad3c943994a8dd6d09b8072912b57e1e25b8 -b3475e7456ff96861bc11068198d51b69b899f5ff13022694b501d3adc8bac58a16204b12011d61e880c8459f4badbbb -8ceb9562026aa96d6e786ec2e5cd49200b5b424349a2214cd3ff5c8f1c2bf1b9872480428f5428e45cc61106cbfbd953 -af56f7e482c24a1367fd798201a20c464848ece431f2d8a31a6ef4f9bdbaa50991e748dcb4ef0c08fdac0ef8ddda3b80 -896dae8b12549909d512fd5c02a2f72dde4086aef6c8007ddb26bb04dff51a707ae94ff87e45191fc10339967fa28958 -8ed1c606840e07a2ac6ff16ac6e81ed3e1c90872ababfe68d56ed2dc50d9294579b9c3546dc63292874299a3162d59f9 -b4d7a5c0836e419a46942281ce77d0aade8e39eb1bf1190dd274ca5070898a1c02ad9d165855629d6e1c96df1a6bd5f3 -aebad8939ac117deb28b789d9846c2c80359dc260920ac8408dbae0b6228dbf496dac0023a3b4302bb9a53e8ada18e61 -812d07c74a8650dc3f318c9b2dbf265f181041fb432fee989cedabd44b933dc6590e36c71dcf9dbe7b4bbf74ea0d7c50 -87b131dd3489889e090839c392231e0ee198acac65bb2e9e63e7d6da322391d1685cfc8ba60699308054c4b0fd89c90c -8b12110ece0b99b2e653b4bc840a12bce5b85abf6fb953a2b23483b15b732a0068824f25fcaa100900e742886c7b4a0d -8765fc9b526a98512e5264c877bdca567e32fdcde95cdbcf4f4c88ce8501e1c7fab755f80b87b9b32d86d18856f1d005 -ac806a32a14019337dfdb5f781ecba5cdea8fb69b23e0e57a0f885e0082a9c330ba808621a48e24316604f6c6c550991 -a711970fa40cf067c73e3edee9a111bf00cd927112205e9d36a21897529be9a051be45c336d6b56725dca3aeea0aed15 -908adbc17fc18821f217d46c25656de811d4473779a41eacd70d2a0d7dd3010de4268a562378814e619e13ac594bb0c3 -894251b79be5ae763f44853f6999289b3a9abda64d52797c6c7d6d31ff2a79e9b3906da72f9ebb95b61d6b29479e076f -aadcf11ea15bcb6d979c3ea320cff8dfcc23c5118ed075f35e77f71459b2141253060e3a90839adbcd3d040ad3bdc5e2 -b4e55d7d2eeaaffb0267448ecce0b75166e4805dc0e261eb5634d4a3f3c08964a597302fd8f6b45ec48178619291dadc -a8e2a02c93d6bec7f42f9265269660b4b404940c3e3de9515b4d826ea7e71f18c6f90a71ce3fbe452d0713de73cb391e -8e2467accfe207cb1ba37d60662920f95338ee212927edb706228c25345734217740159310edf17687f58b333754cb65 -90376b88f653381b3bab673c48c2b84fa82a091e18f710a732fef836e0d39043fcd5527aa97a3a385c0a77cf53746993 -b16530e289198c235ab680f86851bcc177f0c16a58483d83a89213077b06d6840600b03834b6b7af0e22b1914f72de43 -8c4fc3854f938ef1c2b5df065e4e75e9f299798afae8205706439491bdf9784c756134922e77af007e349a790afa52b7 -a68aaec4341d29b92b35322f89b1ae3612e7b440c89a86135a07c261dc5799217a651460c92113d099b486817226d8cd -a653f965feefd2df24156478f0cf3755274ca395afb79e8c72d3b6e1d1f5ba7f3e4f9a4c5ee85355de6f3c81935ff579 -aaf6c8d2717b57f6b14e06c742a11a3bc736bfc0327ca4b8a005b6e924f06871141d231737698a9a59286e44f244a168 -8de32e3c104b4278e27aac695d224f134001c3619f15186466c57c0c46f67e2efe537501d0d9f52f4cdbc724a170b92d -8e9b5858b6d4ffe811f6498bd80e454f0d6b345d4729c946626c7cdc196c803a349a14515296aadb7258bb7a5b37e930 -82fc711043aaf1d7a9c712d00eafd816a710f82eb10818ba6af09f591447f36814dbff6e6a1cb2b5c7f16c73930dbbca -b2f0205327fc8ff687f751e7b97788732afaef4fcf51bb17fd7579ed07501915790b70fc36624371fe4fb87a0179d850 -add87d5b1288d30f3449d3ccfa11cba4dc7756d85cee1cb6171b493680a625a01f273d0bb8e6332d0410250036b3acdd -a411f75ef7dd8de8062331ea40929db989e4d65ae8f33d3fa6cc19c98fa8a8ec2b7c7534a5c5eee9e5051626a6a2e47c -89d40a647781e7f2e8ab3a0f7dc7133669944c0cf627376433687a2ea15c137be26f582a6b07ff94b266ac0910009f7c -b2b5f808c26b40ed507922ed119b0fb95e0d6d8b084bbbba58ca456b4354d03110c99989b93207998334ea5d1b70fe49 -8c8db028671969a1e80e595283ce5e678ee955d785043bb5fd39fdb68a00e4c15b462600a7ab1f41486b6883e725894e -958087ce0c75fe77b71770c2f645ef3360c1a9c98637693b988c5f6ce731f72b24ab8b734e8eb6258ee8b23914451f0d -aad6c00df131c1eec6c556bae642e6dcc031e70f63eee18682f711c7b2fcd9afbf1f18cf8a4af562759130add67bd4a3 -b6d23c567291f019cd9008e727704e7e6679b274feb29abba0d92e036f349b1f0fa8c5271ec7384e8d70a2c3977b1f8a -a942c770e903d4150b5684e4b94bb72d0e171df2c7cae6f46e002c41c6b04d774ac6e2753ba8dccdbba3ad1e297a9ae5 -aa542d1849390f86d797408ed7f6a31504aa65d583481a00e475028af20f8b69248a87a8ffab1dace0377db77fe5f9b2 -a1ed3f9564a97f7cabe7c67e018eaeaa42db73a2f3d2332041ca9a7bea57436d848784d6dc402862c22a47f0692b1286 -925c757750c91db8b1b3c220fcbdd80742b4a060abfb0a402071d215c780ef6b420132ec5a43043b9fd7a06bf1b323db -94e575daa7fa0bbb35b4386f510fc3877c9df57bcf15349c5923f30ad6a8df95372835cc078216b41a7192921c1e8973 -9346a41174865d9ab31c7fb9a5329f322bfce06002386d3f5a2e2193de9bfff12bd0bd93307928f7b85e1097b2aaddff -a6e54c9324baa1bff7e9bf39c94fdd308ec6f210aad937112ec727565f8a6141375c04196831873bf506294854f6a20e -98d47b662504f400f1a0e14e24b43829490d022ade02a56288aaf148d466b45d89b5fc146cef67c9ba548cd37ad5e354 -ab690dd59a69904b6b3a4d5a42d17ea4898d9b00c6753aec216d5d4ea564f9a1642697df44d5a62f2c2ab19aaabf1532 -8d0aa8d3c5ec944af49beb99e403cc0d6d1adc6003b960075358a4ff1cbfa02a83d6cb4d848d9e83b34882446a330883 -af9334b7300780c752f32eaa68f3dcecd07dc50d265083f37f9800b02c2595ba24dab89f5fc27c1ecfdbf5291b4d77bc -81c4a6aaf7d4ccee9925c512dae5da6d916a6dd59f7a4cc79d216a91201b4d300114a309e3ddb3291bb95f85bec2a8ea -8c804e810c0785789de26e12b1beff56a163769733be7a31f34f81093782d6410293768a166c9191ef8636fc8724a31e -a91222b48de238f6dfe79c84080cee618611bd0bdca15cfe44474829e42481f8511a82589e69964e19f8cba04e3f5f3f -b26a8885aa594b0c8ad4a1711d80bcf687df996442075dd1497db1b446d16c74e28bc6f0e92b2ecea9c3e15c9c7e828a -85940f45d324ad1d335bd1d7d6f81758f52213e63d5770d9fe0c0c9507d5550795e538b6a2dd463f73d789b5ce377aed -931a277c78082f416880620df3aeb6d0bff2103d19679dd092ea981f5323e438c50a0d094908034ff8a2cb47b1a44108 -88dd85e4e2aa349a757b98661fc00d4538ec1d3f53daf44b16ffcf7f943dd4f2bba5b8ba3b05c529251dfeed73f6f1e9 -b7fd7182cd33639710b8216c54a11bb02e199bbc54fe33492a809dbe17771a685d6238ea3ebcfc75e3b0d4ea5369bc9f -85d77194d910f8cdad7330e1bca9087529a40fece17492f1d17cc4790833891b6d01d24f036b6422175c732b438faeb5 -9845265892d672d9517fbd22f88be4f225711b4abafa8327cc059f000656e4737188506051565d97912a0c19c3d063c0 -90a81987aa841c7f640c298b816643a0ae00cd3609c3a31d0b01245283cc785d9bb27763131b31a4f21aeda4e50073e8 -8b1256eb41a600bda8a06ac08b98a220ebfd52f89a0e4fdce32425db7a0481e9b7873ba3b7a24ad9fb782ee217dfdbf6 -870548998deed85c59507cec7e69cc001c279bb2a99c45a4d030a35c107e69feb76afecb9e435e67965051d6d7a88220 -b1504d194a0dd8df48d431ce991f89d7a0f72f573d21bd5bb46474c5005e43820877a44e62db555f194427ac8a4b9168 -a00d7423ec2cf0c9e9da07f3dae092d09e1ff4be852e07e531aa54d62ad937bfb52c8bf44683ac3a70f6dfc125575da1 -8019625ad3d218018803aacc2efcedba3a41c24aca8c5aab2005556e58fdf2ed614831277df7937aa594e97a2fc65e7d -8595596284f3add0155ecfee3fc0b66a6b6fc7923d82ca8302952e2ed906d119a1c053aed1123b51f73e1d30d93aba57 -a8ba033f5e7d06177e9ae2d99c40ed4e99e14e1c1b61795997f62e21ed8af1531c4720f23d6a39b0f75c6cd91c58c700 -a94f4167c0f6ae214bae75dd92c63299dd954b00b0d8b0416b8af929fe5aec6a259e44f83a183412d7ba4eb3a49728c0 -a73ee3c3a0fd2a369e0a279c3e214fb662d0378eea3c95cfb91412d7213a1f05958bd0de8f2a4f80f9f80d7eef943b41 -8ef6f3e241f6a761c9ab412629a49648c08b70b837c2cd8bea620bc93056ec73754e3e11f0df50f8e9fa67a9867501a9 -80b473ac4ba8cb82b4ae684206cde124d10fcf619f55a6c90d035981e1b08b9e141b4e5fa9a9af0b7f0c281b355dd593 -a566e2be0b41f01978dfffbb32f442b5e6706f5b9901110e645cf390f6a82869e3ca16887ffa35782a004d251d29c26e -a74e01eefa03546d00afdd24bf17015eee95d36de28c03c9b055e062cd5e8d8f20473c6d7ad21c94f9058fc5e84f9628 -acefc74de146911275dfd19bbe43d72729e89e96da04aff58e5fcb90962856c0b24eb13f43e30329f5477a1b65ae9400 -b5f113ef36e75de6d6d44130f38e460ad3ffc65cb9a5606828c4f7617981fecf76f5e862d7626ccb117aa757cc3c3e52 -96d3aeb1d3a66b136244062b891fc7f93ce745b776478d361a375ae57bdba9b4fcb257becbae228c1a3aff4a1c4fb5e2 -ab26c4a110877e5495b674569a32025dad599637b5dafedcfe32f205dfa68cd46f3ddf4f132a8e5765883b5c83214a07 -922a7a738066692193af32ccbab74edef067668ce3253e18a3275afcd5a6df7168deb2f5175c5fb413dc08fdaef63b17 -a47542f8e4a3a35ef6049280d1a9442c920887d5f1a1483149e143ca412318495a36decb804f81c9f5a7672a14965a4c -8fde57991e72a2aebd3376b4d9fdd795943ba3833431e52b136683567e6ee2cc1c1847dc49dc9534983060c54bf22f7e -addb041f01a99e7238ab2f9f2f94579861d0470b93b91cfb29f3a2e4c82386c868b2cfb6f3778b8a9cf908788acafe58 -a8c4e1df726431c43703739776e2cc51f5ebac57051244991baf53582538120133a44ca603d0722a4b5193e1be3c5ec0 -846379125968d1154376c5dc63100bdcd99b9403d182e3566fe48d79099099f51523cd81d21f0d1dcd622b715bdd851a -b828bf0d936d275abb40e3d73ef57fcd7ce97e9af35e194ae61463317bac6c1b0c3e4b40afe08a1061037bb7149108fc -abd07c71754973e698fa26c5019afd9551548f8369e2249b9902513f19a097057ee7065a1d88912e8f52e6e0fbfa6d82 -a9e36b6fcc9a3cc98e76d5751c76c50e1f92b7670f8076ab6ca8a30de4ec14c34669e049fd39bd293cde8789b1ca67f0 -8c060835496a04c7b51790790035862b20547e62fa8bb4e8857fb36891ec6309520af5c0f45d5ea46e3d228747d710a4 -8cc472ec62b8dce244373f40a821db585628989b6a7c4d394edffbc6346c8be455f4528d528fff41f91f2c875bd9fc0f -b4a75571f84f93451f15b3a86479063d7324d2789b6d2f2f4f8af68c66fac32743dc09b51df29608d62aaba78f6904af -916484984743b5ac16d40d0544faf9184819d92f779254b7fb892eb68cefbe59e75be8a6336a585e120f6ccae0a1eeac -b906ae585a73119764024e9eb87d92e53ee0c673474fec43fec4d344a3bbf471ce3976d25e37d197604689bbc944f1ab -8552708487305f16f95db3e01fbbfb969398f5b6d116844cbb000c9befd03f15c767584bf9541a42141949a4dc787a3a -a6025a2773f78c247f78c0d895ade8a6baa76e5499085f6175935d98a05fc41c1359f7843e0c6c323f1be256c45f45e6 -96dac695dd9288aeb6e32dce50e51ddf1fbd41de6146e3605c7a81f2253b17babf2bfda4f5a9d0c28352b9746c0dfa2c -a215b21f8eb2290f9d308278f2859a999eb3a31f4888f84a65f9ed05e1151c17777f91054d4d0de759ac5c3547d91929 -8fd7c9a279e9b619acf927d501b35dc551979731a89eab91d38b2356c0d73569baddacb9d1096d20a75c917ecaedadd6 -b985e8baa5195e2f1ea1091122d55aa321178d597f87b732b23eccb12b891638be1a992305a1ffcf5233af34339fa02c -ae1a9604b7f569aa48d2daa1889e76d3d103065fc8c3deb9ae127a6d94145695cab3bef640fa781612e8082c6d616c47 -a8fc67f9069f753360349eb874fa4dcadb2ec48d97c61abe568faee5f370ec3c87786c7faf0f73fc0ae7181a36eb89ca -a506d13acc3a9f80509fac936aef848cd30698631fff6130ed6217512ed9527d075f653cf6ef91f68e48a24c903eeb3a -a415093755cc012863043bf586b970bafdd87653ad14d1929672e04949bae4a753d16aa3eb5bd1afe3df3691b80f240f -ace3b792a1960580348b6fae8513149242378a18382741bbc2fb2f785cb8bf87550da4b5e0df2955970ab3a31f99f5d7 -a47d7fa7522664c8f9c404c18102f6f13a1db33ba8b0a56faa31a78a3decba3168c68f410115c5d9f240b3dc046dc9b4 -a9c930db3ea948cd2dd6ea9d0f9a465a5018bbaf6e9958013f151f89a3040cc03ae0b8eaf74b0ff96b4e7a6cd8aa5b4f -88abd235e3e760166cdedff4be82cf6ba02d68f51c6d53b1de326769f1f635215890f9a4c35b06dd16a9b93f30f3a471 -8f8d7b2fcdb70bfedde1ffd7f0b94108f0fa432f6ae81097988521dd2c4da928c10c5da3c7f33f11bd5331f2da8ec219 -b7abdbd48cece30d8f795a58a94913d76842cb006892485a9382a0502826538ca4ff951cc1ef4493e45de8571360d20d -b3e7b125f350c52695f7c5ec4a30916ea6c11744f1151a18ea0510e6cf6ed6f6dba4beaa4ca56988d306bd80ec360056 -9a004423c95e1f1714f98fb97ab798d6ab16cb5f6d6cad860635585d4d4b43ffcda63d8e931351189275e5a2cef28c2f -a8eab6ef917cacdc9b1932eb312309e1f85298d63e55ed9c89ab79da99d3eb60f1643d16be920e82d9285f60c7f7cab3 -934df955485113d10c4dde476ec14a98771145aadf3c8b61af26b09b9948757fa1abcc945ac91466a18c18c2fdce40d0 -99ed9146561597cff8add2196ff3a0f161dd5302685ceb846afca6efb5225f642e8f4a0970eecb01cdf18694fa697095 -b37062dd12a81267bbbf89bc9d6e30784c0e11e713cc49c6c96440f800f2a6a2a7e7f6c7f6c9eed4bc3c8890f2787342 -83a3d70055b6044e0207b3ece4da849755ab5798317b36b20c3555a392c27982f811e1c5007697554eeedc737b37f3ef -a85392c07ff8658935fbc52acec7221cd916c5fde8537a8444eefd507220e76f600350ae8f5dc3353911087b88b91045 -b1ea23558ad805dde9cc1eade995cd8e7f46d9afa230908b5fbaaa09f48547f49c2bd277bff8ab176f1c240beedd2b09 -8a16a48b9105d94700e8e5706b8d8a1ed14cffda5558a596974ea3191c5c3449da6e7efe2059e7baf4530a15f175ce16 -ac5fa54381fc565842417558e131df26e9505027759416165035357816a7e1859a7c14c228c79b4e5ba2ef6758e12ad8 -8475e290c399cc9322c05264a516cf766bf5fdb6b9dec7283961da0b99012d499b244b33fc0eaf94b461ab777f2a9537 -a7922f3c70e6857652805af7d435646c66d94eec174be997c4fe973d8f019990c4f757eeb730b2cfdf8154e6e97f7d5b -b90deb797fba3150cf265a23ea6bd49a382855cd4efe171cbcb1664683a9f1687cfcadfdca4e39cd971ec13aa5cdc296 -91ca761dd9659007d2fe8970bbd336c19ed0d2845d0d8aaab397116affcc793de2da73d89e6625cf4dae5983cceffa56 -9121ae9b60323ab1301e97555bcc74ddba0f5b1e62bfe9eaa2c239e1d685c4a614d397b32a59febed4db9968db44f38a -8477b07da4bbfe9087975f30d2c2333fccfcd7149f90e0e6fabecee627eee3ea324df31cf6a680393f5dedf68a35c9de -946a9c0f02fa6bf9f9d4933e7fc691749f4ac2f82a9b880666b5185189d4f3432da9096d0ea4d6baacbc079e19c887ce -b24663332914ea519435874d4c42d11842ea84dd3dc55292d5b0f27f64587848d095bacaec235a37003bdb5185daa6f2 -b980f46f84ac21dea75b4650f9412f6123325842758589a9b47caa68545905061f03fcad23cc102e2ce8ffeb1ae634a8 -90e9ebb060182d3043ea4210a2d934858559522a19eab9f0ff81a367484a05ec7cce78ee6a91dfff96145869db6a4e80 -b04228a009c91847693eab29c9ea71d1d6ba07060bc2b0b3bb81c46a125baecb3e1412f6ce4305076a97d316d14e4665 -8d3268370dbf38d378c7228c7b54e91f90f43cbfddc0d8468de11a4312616ca6372619209b89114152b16f334f4d2780 -964a63ffae653e0249685e227d937937b079ec3da9c977dad2b2e052af5eb560ce7d175941f2ae0df90e3d0a20b77e75 -855604c2910be885b14b27896e16d8dc339236b975398c771d29ac74e4278a2305fcf85203050a8faffddf64ea19cf78 -8e0b1d61a4349411eec77cf3490555843187a25a93e1f45bf66ad3982b9cc141b07805f8cb252b0fcc125e0052a7c450 -a03bc9588f971a1257cd0cfd2ca406c76aaeb634001864b0e4dda91e009d3361b33fc39f34922835031a423a13619a82 -b703fa855c2c4e1641d2687717fe8c5061acab71cd2dab55cdb069a6865464c3080f7936ddfd320516b6791b36c64b8c -aad1cfa7295e463fc3d5374ea4b952020010d67a77c7a86fe2c351a5959cd50df6a0045ad588257567a99bfd0e9400b3 -97906fb82abf5c1d9be8f72add8e6f175a6a5a4300b40295cb5ec8527cc7ec700fa03a7a494122d9605d212457452e41 -a83366cf93ad9a07f617e4002a10b624270f60083559b045ab5a805aaa592ac37b90c1e8b5437158f3bd942cf33bb633 -a585168e157e111bfa329d0ed6651a96509b20b30f6bb0691c6a5875d134d4a284867ab52511cdc19e360d10638e58a1 -b17d480a0b39f2487b7f3878714658fda82f2147c5ecbccd4004eb92d267c4663b42c93bafb95ce24e2f2f0a9ea14b8f -9362297a1a3951d92db4fd8ea6b48c403d6d8d2f7e7b6310b9cf9b4e4ba9e84cfe1ae025830aab9466c32fd659144474 -b1a62fbadfd4ea4909d8d0714c1e3ee9f95237fde20720f88d5ad25c274a6792158b99966d7b93151f769c832b6a132b -8d9af736949a33fe929548abe72384281365385862821a584f5198eed63bc5388f89fc574cda35a9eaabed0d336b86b6 -90ee2235f4ec2c6089b5cb7b8a41c9bc39e4a57935022ef28bed490e2ab12680922af7395bda4f708809e2bfc62192c9 -91f3a123d420bca34d3d751119bbebc435630c6605fb59a8d80d16a4895972e56cfe4cf1998e0a527c18ee38c2796617 -a2c4fbb20e7fbaae103b86ca9d8dbc2828e6bf33d1d7ce153bd98e8880fe7ac62abbf7059194b1eee64f4526a36c63a9 -91a7f93310ac74f385f11509f4bea9a4d74f2ce91cf2024fee32a4a44d5e636a73339c6b4027ee4d014a24b90de41ecb -914a6d405fee0a15e99704efb93fd240105572335f418d95e1f2de9afeb97f5f4b80aaf20bd5bf150b9da9abc2b6d6a5 -9462cf2c7e57e224389269b9fdddc593b31e1b72ab5389346aa9759fad5d218039a4a5bc496f4bf7982481bc0086292a -b7596132d972e15dc24f2cd0cf55ee4a6cc3f5a0e66dff33021a95e5a742889e811afd1dc0cd465cee6336ad96f25162 -99409bba2548f4ece04751308f815ecee71222869d8548fa142788fb19df5366d093a5131e57560237471bbd5279bbe5 -8e7560988a844b5b844ad460b19c452a5a04346d8c51ca20d3b144a3670ecc60c064b2415c2eeebf140d6ae4ba5c5360 -8cd9e18d311e178e00eb81ca839cfaa8e64e50a197de8461f07135fca28c1d895dd9c2401b923a4175ff711853497317 -91ebf99c95e8f653402b3079ecbd533ed7cd3b6c857a710142354ce8330cebdee7cf0fd0400417883b66055bec9d0552 -a9d0cf8cc6bbdc44426dcb716df667826426b4559056d73738bf3eaa6df373403861b6bbd6fa0454b1d2730e3b0015c4 -928320b452ef21d2443dee360110550f531d7a4275b2cb227814150f3e9e360e05a884d6e3bc4415f202120ea5ac333e -b9551f2b2e7bb984618f2e7467e33b5b5303b8707f503f2e696e49c2990ea760c31e0944d52257c7a38b553a67cf621c -b2ec34126fe61345e5c6361fe55b8fb3218cdcc9103bba5b200252d50b758153cd549226b7aabedd265906401e755190 -a8cf814926082a96a921d471036a9919a58e68d02ee671c215ea304759cd92a7c2c9ccebdd5e9ec5572164ad2abb22ad -8c0563c28c261bbe9a1ec4986f8b277324bf05b4fe5e2b79a862168e646bbea50ce7c4622b2aa7ca899c1a728c226d24 -b558cdc334ea894d3a13347ea9e30f78a0a20621903d6c009c54feceba3ba81d2445a43572e088ae691f65489702e963 -a62ba0b20f46c367cfd409beb300e39f1a6cd5be95e63457b6ad3cb66374aed754fd037b8e4215d651a7d8e1a442f762 -8543e2c6135df471bd7a5c09f1313674c7f6847cb88f15eabf40b2bc9535d0ec606725b97103334a0c162a20d9f5bb53 -8c0367d7058d63b425450f8ee9252e64234c0c2e61878c7c2d4b17bab22a72f40c75ac3bf8b64f264c00d9c5963af041 -acb7207445993d563f1b6e7b179bbd6e87044399f80e6d15980acf7aaccb9d85071fecb22250afb3aba850712fbda240 -b93725e66184bb03f0ab4078c737a7fb2b10294a3a09995958de3dcf5316b476ce9b5cd8d180017196d9482abdfcab88 -afcb52bb7b8f45a945299da6fc6a877ba9f69f7f23d5f94b5f5d9a04c3cf3089333bbd50fc305e3907825003da73b9f6 -961de781cb238cef52d43bc0dc7d8e3a75bca4c27ab37a2e9353137a9aa9403444a5841b595adeca75a3de5485ab97f6 -9408c828d3ed6df40cc167d72ca9882a9c9cf8e765d6f9125e02e0d66ee0ac94f449803afb50bf1b92176feae92473d6 -a85480591e7e033b9087fd0efe5cf3c88c10a75de4a5d7da4443df1cc1fa1aa59b6cde3ce7453fcabe555495e49ef6f7 -a2611bd82344bc5d70d7e6cf3f0d25866b9f709ac4bf6f75d1006da2a11e2cd07a4c0ac71505e5062a04f71db7a3063b -ac466aaa96febb5b810ba350c7a874797ce4bd6c9585f6b9d114d646894a67c9af9526ade4f7ec834d3a69e18ab643af -b73fc98a79fe77cdbc524c76a09cb9f2d5f8b0a5508846bed1ba5ea9ae3bb62120e01d3b8fb544d90ac9ae0c3d4ccefe -aed333c3403adc899a870082f70aadc770c9f880dc057f05a46d7400be9d893354121a0a31e5475898f437bf722eefcf -97f02133c72187178a8c48db26031f0b2c0317a6648d2be5f7450f00c37391cec935bea46b8144ec9fea5327ee959f27 -940b582b41f1d0f09f0c5f51bab471e4eb143e91b1e96dde83e94650421d51f9c9baec10cc802fb83cd63b56d0b907c0 -b1286a55a74a88a75da47671994916be428be1ca3f42783e497d6478eaa6aca69d50a421b210e9ed3283d578b651b8cf -97cd4e87e21c71d11f1df1c0b6518c00e1610661be4b13cdbdbb026d60fc3f4a2b8549326a648b3fdecb7de8f6aa9fb7 -8f36bbcccee986c35328633bf6ee8f70b5dbf42d0f677c0f4e009d2289976e512af6af91a6ddcd87dc0df93bc4ecd02d -9253ad44ad182e67ab574d718733a69c05cd5bcc43e6292ef0519a9430460aa6a233fe26269da7298ea88cf406e733c0 -b616b5ea74db0dcf8f10a2db79df6ec3566c06410f68a933eff150194608c591b2b175908d4b4ccaef1018b0fefc5693 -80a712ba89394381cbb83fedcaae914cc4f21ab024b8da8a7bbad7762a22f82940451427b1a3f5d84c246d5ba0c7ccc7 -a806909a5517a970879143ad789c6cb6256b82553b649f6865cdafbbc050b1f86528241b3cb600e784186e1a672b588f -b6ae801d1f0e4adf3ce57659d7c61f94abd3c8d1635ad28133a79eff0586fc48bdc195615335449e9bfee39e8a955eb2 -b8a000561211844bef72adf3413f3b438a8789fcddf6676402ca6a1c2c63b9deed322030de2ae3a0aeb3cedbb89406c3 -8bc3615b28e33fc24a7c989f8b4f719c914c4c65b35ad3d4cf15e2196e37c62e42ca34e8b1275e0f32589b969bdfc21b -b2f9637f370a79e7591e5056dac004f56b375f33645ae9f5a192cc6b7b6b3d8a1105cc00f10d8bc8ef250ecc2ac63c39 -b51899978b9c5b737999fee1935a5b0944261e7005bea411b5903d2c16ea045a3b0bcd69395b6733752caed43bc4e343 -873c71a01009dddb9885c48658f83aa6320e74bc152e09de8b631c763c2b4e2e8cbac921418a0d9085ff5c53a2b52d39 -96470f48efd7d2ac2daea8753ef097c09c6fc128a54cc7ef758ff07e32c0b0ac7d122f97b53e88a29cc26874dfee5e0d -8dd2decbd3504b7961d65edb8d51b96377f4edd2e0d2cd8a4d98333f373c79a8d7ca8f8408718d0e7b5e48255857c339 -b536ae387bdd0f6e40850c71fcaecb1051b2c8f7bf5cf92c6bda030de72a03e9212d00390c53a72a08e9fb2bff1249c0 -b1566076f59064e3545adef74fd1acadc1bee0ae23543c30caf9e1ad1fc20ebe84ee25004c612525b26857253f5345b7 -afd180e25444cb720342923b8897d38a6537bc33a0ca1fc9c6e4d524b280193618f19e2bcfbd07606b78b734fe6114ed -89b2a6c8811e5a6d07aa74c79dd854bdfc292cc104b525bc37e4c7c1f9485e19d759c8e27cd7cd73c46346f56ce3b189 -8234196e196898b2501b79d0dc016f6df3d5878952cdb8a93735e4ce2ecf77d07924c701e084533a20f0c50a7d1ee376 -adea7ce2efc77711f50138691ef1a2b946aaba08e7e3b21378708dd5a10bae933ed121e71834b43b14e2ea30a7b306e8 -a566d406a35fae703b3d1ea1791d9207116002e5ee008d01e053a1ea4fe5af2feb63605b011ae6a14414028aa054b861 -b83bbb063682386456719179b6f6bbc8cf6f791229600b7d402167737492f99437b45886695b26a28731e952e56f1ee1 -a8f5fffc2c335d3ad5c7593e81f0862351413cc348392afa86d50921dabb929a5a1de20d604666af9e17a13bbc30bc3b -8d5dcdc1335f01847f6ef650ff64b26e7c4cecb934a7bbce11254e8ced9fa9e4fc87eec55248f69bf499180101c63f5a -83fec30b8bc62f9fc28301a03ef18158d6364738f1c42de311bbfba2e62b25d4c9ea9d6097698b24c84fff956a6748b9 -96394fbe0c2d03cdaa56e13326aeb62344238ad3043ee2fb4f18ebf0a6f7f090f410032a2d15bfbeca9449202d59f2a0 -94880f5928fe71a797362a37d05849d23e118742697f75bc87173a777e7b9d4383b8796a8a2bbee27fb781f363301dfe -af229535896ab86fdf6d2ae676a0dbf44f868f6c7f17bd9a65567631c7aa2e29758f41de050ca5311bd1528bcc811532 -8d4fa4968575b483b3ac16345e7f1ea3f81e8dad72c945a48b7b982054fe1030584be2f89b2f53af84d2490cda551b84 -8052aeb115e4d242078c8726d376a13156cc832705243f14adaa3ef3889e1f2fcdfd46e087acab6fa85a74afde5f5eef -a1349c8a22788a1937a837fceecfaada9e93a63e582a09c56b53da52c9db1600254dc85f63f5eadfa30b89b31dcbdb30 -a10178cdb263ff1a5e0cc034b6deaa160d00c3c3fe1fd1ff0c55fdf1ecb83d771070c10930f88832b75fef39a10024ea -938b17e4405934ea5ef29c2187d6787c5ff5d8c9a02665efb453117d462dbc50ef2c202cbc884305cd807a70b5cc177b -84f01f0da6b58c71788616be71fb3c259ceea7f8bd131a5661c5c03d0205feaff6dac2915919347b0559c381477b3d89 -98787f0a2fac2b04bb7aa247ac77236bbe690aae64203e553be328a2c3bffb772e7a0244e585d27558cc64b089a5ee11 -a14501d8b6b3a84b13b9006d521667e8d168f642ebf154c4e90ec8c75d11985fd0c9d86fc2efa6c7077dafecfdf0ab13 -8215dee75eed04de83a3e910129bee8c48ce01cf1317ea477ff35c09a6f9e9771a8b05aa79e6b0f3e71b9874695e7a2a -85763c3072c7400a2c5668ef5cc53e6f4b8dff474146028a8be370ca9d8af9bf9ee10cd7d23d33eb6d6e257dd3af38d6 -91bf62245c5a59d514d39bfb74db7f72ca7160c1c5d5be3844fff37e53e99d451e18a6747c65e33f98f48a55f38962c6 -8c68817c6a6ea348d9aedce99929371c440fbad72718c2d239ffcaebb26ecc8a4e8c38c2819d945fdb7f02ffda70a5e0 -a96ce2745866a22267a49faa7ea00ebf009ea8d0b0ca2c233c62759b9d5514306b5822dd2eee0124c9e28380e2f97aa4 -8b18d5757c73843dcd55f0f0dc894bcd17e0ecf4c9fd901eacd38480844a15b4ce5e9598ccee039f9d93185137630cdb -a5b45c403b6735aaae14389bcee23ca10571f5437f1f5ab0c2b4e573dfd3341c638fff2cc780166af96b118d47ff2299 -ac849a0ccd354dd46bf55ea837d509b4ae3eefcbd5b8eb2582d301fd56c27b89950c6eefdd4e98e608ef4a6b75251311 -89f13ac14bb064e9c6b49a482831ecea6344faec490bd18bb44028b83a0f22e21145861558029bd172ba7c5247c2cba7 -aa57b057a2ac32c101e442c33831630c81b2e061a542e3e1d6897b2b7ca8a7241ef717a548b3f751d60d89be384ba5da -8a43db4e12682b98230364f25c75b49002f5002bd72a1674cf2a9d53197b5ef1b95e48429af98af503b0d5c3e0e017b2 -a10cd7b8e1574d78c4e917cf833d3d845b878e8e8b60312e6a994bd4f391a5e8c38dcd774087b93c9241238f43f80937 -8b61ccb949088286216cd628811df1a362a7f5c333654ce823e63ebd04b069d5b0f627fb6c96d54c7b853de8aab05472 -887b902020ad45f70f2d5bcfa7324fcbe7be09fd2b1bd40f9ae43a89d487986e89867aee0945ea6a0fe8dfd051ffec56 -822fcd260a7876cad31f54987053aab06108de336878b91b7a15d35013d6d4d6de2d4b30397bb6f1d5c1a7b48e9d1ced -80b89ff95d725858b50e84d825ea99fb6a8866f10b91a5d364671ccbb89cb292bada9537c30dbde56b989c8bdc355baa -b53cab156006c3a1766a57dd8013f4563a2e8250995dbeda99c5286a447618e8ac33ebf25704b9245266e009a0712dc5 -b6e2da9c1156e68c15861a05cd572976b21773e60fc5f2f58c93f3e19c73ad6c2ee3239e6cb4654040c8e15df75a505d -8b7e187d473a0bd0b493adcdb91ca07c9310fd915dec46c2c9f36a5144eb7425dd35dfa50feb0e9ef747caed9f199944 -9743ec3917e953e0a420406b53f4daa433adf4ad686207e9f296e7c83d1ffdbf81191b920ba635c85416e580178c16ff -98d1476fd4504a347c5261012298ca69c8593fec91919d37ddfdf84155b6f1c600cd8dbb92b93f3262da16cf40a0b3c6 -94f50d52982a3c81ac47a7b3032dad505b4e556804f8606d63d821f2c1a4830917614630d943642ba375b30409546385 -b5c0eb5f4cf3f719be1a9ad0103349269e8b798dbffe1b5b132370b9de1188a6d71dcbc3635dfdb4b888400f790b6ea4 -b47fb45ec73392598866d27994c2feb0b0f3d7fc54303a2090757a64b6426d183ae41af16794ced349ede98b9b3fd48c -b5f45fd0aee6194dd207e11881694191e7538b830bfe10a9666493ae8b971d65bc72214a4d483de17c2530d24687d666 -a50c149ea189387740d717290064a776e2af277deafcf5f0115bbbdc73c0840d630965a4e0214b738d1cb0d75737e822 -b941afc772043928c62e5dbe5aa563fa29882bff9b5811673f72286ac04fddf9a9ed0f9faf348268fa593a57bc00ba6b -839051a7838937270bdf2f8990fd9aa7d72bfc86cffe0b057aa8eca7393abf16b70d71a6470d877f8ec6771efa5a8f26 -835bc9d049418ab24dd1cbf76ed5811381e2f0b04035f15943327771f574f723b07c2b61a67a6f9ddc1a6a20b01f990d -8935cf5634d6ae7b21c797a7d56675e50f9d50240cb2461056632420f7f466fdcd944a777437dcb3342841ad4c3834bf -b5698fe3da1f9d1e176c9919fddd0d4d7376106774aa23a7a699f631566318d59b74ae8c033eba04d06f8cdcb4edbbed -ad11421ba75d74c600e220f4bce2ca7eacb28e082b993b4368d91218e7b96029acfbdf15a2ab0b8133b7c8027b3c785b -886ef813644599051dafdaa65363795cf34a3009933c469bd66a676fdd47fc0d590c401cc2686d1ba61fce0f693426d4 -8858fdf3e98e36d644257ab6076f7956f2e7eacc8530ec1da7f3e9001036cba7a0855fb5011925cdc95a69600de58b2d -b59eca7085a2f6dfeaa6a414b5216ff0160fbea28c0e2ad4f4ffd3d388e1cc2c23a32dbe517648221b75a92500af85e3 -abec62d259bcd65b31892badad4ac8d2088366d9591cd0dab408a9b70ad517db39c2ef5df52348ba4334dce06a4e3ba5 -a9acfe8f5a310779509621ed2946166ffb6168e68ecf6d5a3b2f6008df1728c8fceb811636c50d2e419b642a848a9ca9 -9929bb1a3537362848fac3f1bcb7cfb503dac0a0b1bebbfd6ddf14c9a73731e2248cbaf0fbb16c7d9c40cc6737c3a555 -981d06c7431e6f4654e32f1c5b27e7be89e7c38d59c4e2a872a0f0934cb852c6aeff2d2eaee8302131795590b8913f5e -a6ba9dd43354320f65fd5cdd5446cfa40080bcf3ef4a083a76ad4e6a609b0b088bcf26c4957bfab829dca6064410ca5f -9367ef28def311c79adfd87e617651fcc41ad8caf047d73ce9a1f327e8871e9b35d5b203fd0c0138e32e2ef91e20ba62 -855d1bb508a9036f42116c8bbb830c576189798baee27c7c3477ef1b1fc5d7b0c2c7203457f1eb48d4b029dd6f646be2 -8539a5d0528d3d601083e162b34cb33b5bf6736b4feeeab4941f10eea127c56b7e0b8d57f34b72f8f674d89c10bf302c -a3b71a9a9ac2dfcd681bfd8f6a5d9abf5df6950821705bdfb19db25f80d9b8a89fac7a922541cc681325679c629743d2 -8e95929dfd4e5b56e5a8882aad6b7e783337e39055a228b36022646a13a853d574603de5fed12b6c1f2585621ead7afd -8b05c885575d6894cb67ba737db5915639a6f281bf249480df444ff9f02724e28ed7371ee7ec26d50d25f3966010f763 -90f1a45de0cc0641181d54ee86630b5d182d24e7c30c2615803f16de90ec7c982a00b21f250ccebc2e94ef53a13e77e6 -90f0e97a132092e51a4521c2ecaaa47e4e4f319e67a3cdbd00ed85c2f10dfb69c339bc9498e2abbffcd54b1fdc509a20 -a9995234520cab9d1bdec1897b0b67571b718d5021c0fcf913140206b50ab515273b5f8a77e88fe96f718c80dd9be048 -aebc6495d54d0e45a3c74388891dbcfab767f574fed0581566415af872dc5b3bd5d808c44f6e1fbdde7aa9ffd260b035 -ae757f8f4b1000a623a7d8e337a50c3681544520683207e09d05e08a6f39384b7aaadf72018e88b401e4a7bb636f6483 -a626a28d5ce144cc0c6a30b90ec2c1412cbbc464ee96ac49035e5b3a37bb3e4ed74e8934c489b4563f2f7db1caf8b2ad -8c994e81dfd7a5c2f9d4425636611d5dd72d0b091a5862f8bec609d0cdd3c423eb95b0c999c48faa5dbb31e510c22b61 -a1c0e59e076b908de760d9becff24883c6eb9f968eac356e719c75cce481f2f7bcb1a41ed983a00c1a3b9369a7ff18f9 -8d7e199044fe2e552bc514668fe8171c3416515f7a5019f239c0384f0ade349e88df26cd30f6b67d02b83bf005d85de8 -80190f2255199be690fb502d02ed159aa568c390a684f7840512efc3d2a62f28a49d5d1928ad99a5f975ad81a245acd5 -889d84cefef33f5714e14d558f41d406072ba66b427bf27918b669c5be46261c3de0139610a2c2eadef8e6508e937bcb -a480a686d5085b854ccf9e261e7f1f2d40d978fc30b62b1a8fa9561127745529405820df21a680ee2258b8cefa5f0201 -ae6243400d416a8c13b80b6637726959ef07b8d9b6aff2bd3bb23aaaf97337c7a6b466c5db617bf2798e01d4ccc68e4d -85e0ff143657e465f3d934ee781de5cbd2bfd24f2fbbe6d65c698cdd93204a845f6ef1fa8941c2578463a06a8a418481 -8f4f8b45f1a9f6c2a711776db70f20149dd6d0e28d125906ba9893c5e74e31c195b0906f04c922c8b556ced7cd3d611d -877b852c33483b25c4cd8da74b6b589d8aa96e217c3c4d813466c77ef83af95a94a47364aa8421f0396ce631ad87d543 -852cb06bc4222ce125287a7a55a79ad0bf55596f26830dd6d79da3c60f80e3ba7b9a9b42b126dcb99d2cb9ce142783ef -810cd64c1dfce85d509eeb57a5c84efafe1d671454ef601a040de8d46fb33bc419577f6a6c404e28ffdfe315ffec558a -b60ff8bc804d101a32079b8ed52285fdbb47fd60c3c15cef17cfe7f6b0567de6b50128b9dbc49a1d9811b62b22c99143 -a9df7068b26a6a58f7a499e67b17d34f2a2e8e5029c6e51e2b4c0d19324fb5cd9734c4c4d5034e1bfc274cd0c74a82d0 -ad93c50802ded1e21217a58b874c074ea52322492d589820691572084d8edaede8c2ce8021c6df8c0060f395f3c25ee8 -a17b98e090f7ef5800477132b436c1fccc1802f34956711bfc176e36890c7df95a108e03f34659142434cbd8aee9dccd -acb14aea5575c293dc0a2b58c5350390801d57e9bcda876d87c56565043ddde1a544a88b48ad0d8ec3d41f690aef801e -88b8e26cbc83faa053fa247e26c95d1bbb77955b336e1b0e41d080633248238de8adc9b98688c98fdfc67e7286bc5be4 -899f69823cf1b2204c8da91bb4f943c04d943137b08b1c46e160919e3378bd22a666a079a66e63d81c05336c742efdd2 -8d7ffbc0b47a32408c9e88676ac4f87683cf37c37d214163ca630aec2d3cc014d88caff35022ff3b6d036eb8343d52a3 -b7760f27db0704a6742855998a0c31333bb34d60ddebc95588e25b72445ae2030427aab088ec023f94563118980f3b74 -ad06ecc0f3745861c266bf93f00b30d41ed89d41e99ab63fedd795c970d3ad40560e57ab7333883a72e5575a059df39c -8687d28b1cbc8aa34a0e5dbdb540a517da9bda36160daaa7801fce99754f5d16eda3bc8e1df6b0722cfb49e177e9bcb6 -a38332c3ebbd7f734c8e6ab23ae9756f47afbf7d1786fe45daebc8d7d005d6d8fd22f5dbd0fa8741e1bfb2014d3f9df7 -b86f84426dee88188be9c5cc10a41599e53b7733ba6f2402392b0ea985effc7525756ca1b7b92041ae323337618b238f -958731a6f1881f652d340832728bc7fadd1acebd8daebd772b5acea634e9f7b7254b76d38a7065ea1b2cdea83b18a54f -adb90bff1f0d7d45b8ba28b536c0e0f7f4dc4b9a0354692ecf29539631d7a57d308db3e438e0f907810234c490b42153 -a5188c775ad76617d3bb6e7f1f3b2449f48b7bb7a84035c316284396529564a227e3b9762a89c7114fa47b3ca7ba418a -a3826ef63c98793a5c8c5d5159e2e00cc85fb5e5124f06421b165de68c9495e93c2f23cd446adf6e6528967aa3ed3909 -80eab97de89f3824ace5565b540b229adcc6ef9d2940e90de185af309234cd8aa4ae9c7ce1b409b3898c8fd10c8c2896 -8824f5acd4c2330c459fdb9ece9313263a8b20419f50f8d49958dc21754c21a77bcf7fbf3e0041f78d8fb667a3342188 -95091cf06911a997a09b643326c2fadbbe302555ab2521db806a762a5f4492636507ca71d7a093840236ac3c096614f7 -a392c81a546196d7e78b61f3ceaadfb2771d09fe43f862c0af65f5e55ce490a0293b9ab754cb5ab03ff642a9a8213a23 -afd76cce1dfa2c9e4af4f840376674f090af37d8c6541824963373f97b9dd1f405c50b2ff56165e1d4dde760e590738a -8fc4f513d3b40c10872603e1c29a4b2cf4c99320962644ce89f69ffb57f844344e1d472b2d43559119bdfb5a2c21749a -9951ca8e13b9a2b4a789e851c04c4f030470772da62f101074ef304612e9653b43b37d2c081b5d0a09196b3a167f5871 -b4f16fc2a113403ab5fc1b6a9afddec77be7406413b70ee126f0e84796168a572940550d61e443e5635591d4b6c46ca9 -8d71452cf39e7345c7298d514b9638a5cbe78af7652f0286d42632c5c6d7953ed284551fb40c77569a7721413cdbf79c -953625b58d52a308cb00ad87c44a3fd936786ada44000d45bb609ea9db6b156a0d0f9475e13ee5e053eaded19a09990a -a0983a3baa278ad5f5de734eb1b65a04f668408994e396fb0b054991ad2e56e27ac522b04fe37c9583b754e344f795b3 -8eaa454257f77a6754b2c1c5ff0036fa5b03e214576fabc657902c737fcbf298b1795b43c5006e18894f951f5f7cd203 -90183fdeae2ce2a295a567fa61b997b1f975d1be7b03d0101728cd707bb2a7111c222588ab22e573518fa1ef03719f54 -8abec7f31f6b897a1d497368a42733a6bd14ffbb8b21d3e49fc4cd3c802da70e8886827c1aea0b18d1b44635f81ec461 -a6d1e6fd24b0878ff264b725662e489451c590b2aadaf357d64210a3701fe763f529826fa6e0555267c1f5ecc2c52c05 -8fe6d2a4ea0d91702cb2a8a1d802f5598f26d892f1a929ff056d2b928821e4b172c1c1c0505aa245813fe67074cf9834 -82a026a408003583036f16268113ca6067ce13e89c6e9af0a760f4b2481851c62fadeeef0d361f51dcd9fa5674ec5750 -a489a574b862d4056091ef630e089c163c16c2f104d95eb79a27ae1e898b26d6c1adc23edc1490f73bb545d3a6e3b348 -939d85148547fc7b9894497841bd4430bc670bb670f0efeac424b529a9aebf2c02ac18a9d1402a12e4e590d623de09f0 -a3ab52cf911a2ba7fb0cd242d7778ec0d4fa382960c9bd5b476bb1cd44ff1430a3871bbbcea0a0db2630c39ee639fd1e -b7629509d8c3a3b88b31f1af137a25c38f536284f11a5bbbe0d05b86a86bc92ebbf70f17c256dc8b0d48374e1985e6f3 -8a8647ff33e0747dd6c6ceddcf7938a542656174a08a31b08337ea49b08d814e75f8363fb51676a2cd2746569e3bc14e -a7a7f8d94d32b7cee00b3ff272d644b8dca86b8da38c726f632c2bcdfa0afb13fd0a9a5685ddaeb6073df4d9cfa3d878 -b7136eea8d05bfee2265b0e9addb4bdf060270894de30d593627891584b9446b363973de334b6105e0495cf8cb98e8f7 -a9fcd33ea59315ad7611a3e87e8d1fd6730c8cbeeaebd254e4d59ed7d92c97670303a2d22e881ab16c58779331837529 -965fd41741a0d898c2f2048945b2aefc49c735228c25deaf17fed82c4d52cf3f8e93b3fb8825ade632dc4940311b1542 -b9f400a2c7ca7da8b36470ee5d26c672b529b98e6582012cbfc2a3c24b72e73f5633de4265c417c0d47c474155a603c6 -85f333b0b1630a688a385f48bf0175cd13ecdd92fa5499494f4ad5aea0ef1b9d180fad8f936018538d842630ff72884c -8da95a735a1a98ed8e563099bd87d13a237dd7ec6880cfac56c6416b001e983a56f3d72dda7f68684bb33e4f64cadd30 -a29b66a2095e1acce751f6aec8dfeae1e5b24187dfedb5d1635ca8deae19b580ef09329a18b3385ebb117cd71671f4dd -b001deeeaf5eaf99ac558c60677b667b9f3d57cf43a2c4d57fd74b125a6da72ea6c9dc81b110655e0df01ca7b8a7a7ed -912e11dfff77c778969836d5029747b494dd81d9f965f8be2c9db9e8b08f53858eface81862c3ee6a9aa10993d0d23f3 -ac166a00e9793cf86753aa002ca274cb6f62328869fe920f5632a69a5d30d8d3ce3f0c5487cb354165763ca41d83495a -b74df519ae1a8faeff2ccd29892886b327c7434360ab5c5355752667069a77d466a48cb57b1950d10b6c47c88b2a8538 -8751679aeffa39da55f2c2a668f7b26fb8258f70c5454b13e2483e3ad452f3ac7cc4fa075783e72b4a121cd69936c176 -ae0cc16848b8bf8fffbb44047d6f1d32b52b19d3551d443a39fb25976a89d1a5d2909a4fc42ee81a98ad09d896bd90a9 -a0c8acd6a2f0d4ab0e0a680fa4a67b076bbbf42b9ec512eb04be05fb2625f6d2ed7b4349eebe61eb9f7bd4f85e9de7fa -85c629ce0deeb75c18a3b1b4e14577b5666cf25453a89d27f1029a2984133a2b8e7766597e2ff9ee26a65649b816b650 -938dbb477840d3ed27f903d09fd9959f6fec443fbc93324bc28300dd29e602bd3861fd29508da0dfdbb0fff7f09c5a6c -a7c76cd4a42ab7904d036fe6637471d9836ad15d0d26a07b1803b7fb8988b8c9edf522e0d337a1852131d0f658565ae7 -838a30260cf341ae0cd7a9df84cbc36354c6bc7b8f50c95d154453c9e8ec5435d5f9b23de2a5d91b55adde3dbdb755b9 -8f870b1f798c0516b679273c583c266c2020b8dea7e68be4b0628b85059d49e5a680709c3d6caabe767a0f03975c4626 -89bad0b6499d671b362ae898fee34ad285aa8c77d33ca1d66e8f85b5d637bbd7ae2145caae7d9f47e94c25e9d16b8c4f -af963d3dd3d983864c54b0ed1429c52b466383f07a1504215bbf998c071a099a3a1deb08d94b54630ac76d1d40cfc3da -b5686de207c3d60d4dcfe6a109c0b2f343ed1eb785941301b827b8c07a8f1311e481a56a4baab88edb3ddc4dace6a66a -95e5978739a3e875e76d927f7c68bdf7ab20966db9fa8859f46a837760dfe529afa9a371a184dfb89d2962c95d5fcf3b -96d2855e20c37ed7bd7f736e11cfba5f61bb78a68303a7ced418c4c29a889a4798c5680be721a46d548d63525637e6b0 -b134bceb776cd5866e911f8e96016704c9a3caeadcabd7c0f37204497d789bc949e41b93e4c2d597e4c924853f1b21e3 -a1949ff397013acde0303e5d64432bf6dd7f01caa03c5fc38e7c8ae705b9d5c2646b4b02d013004e5eb58e344703260c -8036a5f79d8aeb6df4810974cf8dbd0ac778906d2f82b969ac9dcfbe7ece832a7e8aad08a4dc520f7abeb24b1610ae84 -982b6b0af8602a992c389232b525d4239edc3ae6ceea77d7729d1fffc829664dd647ff91c4cb9c7f7c25cea507f03167 -b34c7d24fa56ab6acdb8af5b4fa694a1985a1741cc53a2b0c5833611e8ed6fb3b663a4d9a126bb4a1a469f2072199d66 -8166366fec4ee2b3eda097dc200cdfa0533a742dfbe7082dfa14c1c1ecafc9d9fa71f518476634f29d06430869bd5e02 -86c0251ac00b8200618c8b7ce696d1e88c587f91e38580b2d6ae48a3ef904e0ba1b20b7f432719ca40e7995f2281a696 -afd89f3bc7843a1e45ac961e49c1971114c5238d9e21647804b1852b8f476a89c12d1edfb97fff71445e879d6bfd3b70 -911d8bec4d4c3e73a2c35469b2167569f59705404425bd95440408fb788e122f96e9b1bd695f35c6b090f10135b20cd3 -b3f6350ff7afaa0660f9dddd9559db7f164e89351a743fc695d987c88f89fc29136e3c5eb81963edabf2b6f2057120be -a371229680d1468777862e9c0e864156f9cd7c12ce7313a8de67b7bd34e3d1b6fa45ce891a81f8316f4afcbdecf3b6ca -a6a9a875ef9efe8ba72523e645b5773aa62c4fb41efd23da3fa38105472308b8d293be766342ee0a2f00758825bd3b6a -a840d495a184f4499b944ee08f07193a1e1bb8ab21f8ce7aa51d03bd8643f2bc2616c17b68d3fe7c0fb364136926a166 -b55200ae7d6ebb0b04b748051c5907293184b126cf8a1c2f357e024f1a63220b573e2875df83d9b5e0c6e2ace9300c40 -b1e0870f2e3719f42a48256ee58cc27f613308680f2d3645c0f6db0187042dddcfed0cb545423a1a0b851b3a16146d70 -b43a22ff3f838ad43786dc120b7f89a399ed432c7d3aa4e2062ad4152021b6fa01d41b7698da596d6452570c49a62062 -88b1dc50873564560affaa277b1c9d955aebdcdd4117dab1973306893b0e3f090899210102e7e1eef6f7cdf2f4e0e5db -9223c6246aa320b1b36eb1e28b5f9ccc2977e847850964f9762c7559da9546e508503050e5566ccb67262d570162b7a3 -aeeed21b932752709f43dc0c2c7d27d20263b96a54175dd675677a40a093f02bba80e2e65afe3eb22732a7617bf4ff9d -b47cae580ae84f4e4303db8f684f559382f075ef6e95698b9a629e92b67bf004f64e7cf47e401768fa170c4259efbda1 -849821e1ead81fe2dc49cd59f2bba305578c4ea0e8f4b8ae8fc275a1c4a6192f8819d5b6d7da786c94dfc16aacf3e236 -8c60d9a8baefc72a3d3f9dd2e24cca40fb5ce36b19d075122391d9b371c904a0a15d2196c0f2ac9da3acf188d15b0fe8 -946edfe168bbe5ddb0fa6c2890bb227d8418bfbebe2bafab84909825484f799407b610d8aab6a900c5ff9eb796cdc4bf -ae7bf8ae71de5d7ea644d9541e49da1ec31eca6ff4c3fbec5480d30e07ef2c2046cc0a486af7b3615a6a908846341e99 -b4d31a6f578463c9a5ccde0ea526c95b1981eb79468665395c0e550829abfdfa86689699d57830856e324092a423f231 -93415ad3a732417cca9771b056ed42db7ce50879aca7c6f71883ad297eaf5a37fd4641d44a0b7e28b90c168834141340 -98960617a413a3ba86d8257a7386355a69258943aa71834166bd624ea93b0af06178e86538e237f88fd039eacf7cb04a -881335200a487545e38d5b1ffda3080caf5729e1b980603bcdf9ea652cea7848335b83aeeaa321d3476ae4a8d9073582 -b39e84c14666d51895b7a8341fd8319f9e0a58b2a50fc3d7925cce3037f7c75367b5fb5bf25ff4720c9992cab7b8b9f4 -8ea4bab42ee3f0772d6bd24dff3643d8b61147b46ada374414d8d35c0c340e458e449d31023d96e66decf9c58e30cc34 -a5198f6759a045b6a4ba28e4bc3bb638fad44c5a139064327580e285adf38ea82a7570acebf925e81a39d9025f3a6f2e -80267097e2d27c1b19ecf95d184dcff822d34e03326b9fc139a4f8b75b3f80777bb97a9dd284d9b755f14dd401d63c0e -946f346220bd3b6f733e94b61a1ad0b44e45c356fa6036dde5882d93b5613c98e23b20e91eddc6b3c5acea38085705af -a5f559e110cad99bbcae2d9362434aee7db0f3b6d72311291649dbda3f84c10e9760b66b988db3d30067bf18ae2e5238 -8433b38e5c7b293ef532f8c70cef1ed9be7f31f60d5b532e65df7d2885203be78b7ad78ab3011bc54cd9f64c789bf837 -a5a4c0a9b0e0b6bb912cf6ecd30738b0acc0146d77442449b486c3f32d7e60244f643a5cf9cc6da2de5408d0c5f17691 -a81feb329fb51b72464bddcfcf4e02149d995b548d88c64ba143144ce16b652c9913c8ee948ee837596ec97cc43d8cc9 -88e5a7e93a738d61330425bc21ade88d33d7160d124bf174eb3e12a00283654431036977c4f1a47a1bbbf2ef8449ac89 -ac75ad7c099383069e662bfd3624b92b64b5838246902e167fc31b9411efda89b2c6bbd1d61b9eb7d304faacf438d70b -8583bcd1c7cb9bb4bb6bcff803b0a991912b8403a63c0d997761ff77295ccc357d0292318601a8c61329ab28fed7bb83 -a1f9aa0523f1dff00023a44a6c3a9e4e123be0f6722a1c6682ac3c6047efe9e62f4773daf4767e854e1fcbf8ee7339e2 -85f65ebcf5c7e574174b7c4c4166a9a5368e7986b8c0ef846c2e13b75dea7311a87483503149ebfb3cb839b3ef35c82d -abc55eeb72699031a367b9675a2b91a8434e1f01467660903ced43a0b2a11a85ebdf48f95c13ff67e4e2958065a50ff3 -a4ff77c9b86939a15647499b9412417b984bfb051e5bf27b35392a258a5dac297bbdbcf753a4be6729ffb16be924a2ff -af0d41c15b5172efa801cc85ed101b76844dcd06712d0d21160893235a2dbedd15d187a9b31cf0d0ca6c14de6ab2b707 -92661339199f18e5dd9a210783c1d173a26dfa315bd99a33d6f04bf506c871a2b47745c1909faa209d5e6c5c645124a4 -b35813dafb52df709dfa47982bfb44e1bf704f9f46085b2a0e92511dff90e5597110f614f8915830821fc5ed69ae0083 -934a05aa713fa276a4d47f1a28ef06591e5a9a69293c1651c223174df0af4927fc9cd43d374d89c1b4f7c8dc91abe44b -8f83a0ef05202c0b7170ac96f880135e2256fdf8964dae5aed5dd0f6452a6d8e123321e8c182b3aa6f1f8ab767caa735 -b92db10c21c321cf1349fd34129d7180e5088daf2bbe570de6427299aab68992c011c2e2939a44247396f5427c1d914a -95ce1892d1ce25ef2bc88a23880055a4d829a3b31f3806635fd49bec32cca4e965b129b6dd3e90f7e3a2eb293ffc548d -970cf816ee7501ade36b0b59f87c7e352957f67f1f75bbacd8ed52893f9fc40572c76f49c23db44866af7e34a63cd3f9 -a2fcd08581d3569fff699fd7ed1ede5f98f2b95956ecdf975a29af053d9f4f42600b3616ad6161e958c3ce60139c20a4 -b032688b6cc8a7e63dcb82694f71f087b1ee74c4d5fa27323b1ead3ba21722d7fc49eda765725b5553db5260005049c3 -b0b79e4329f1ad25ef6a603390baf889757cab5af10bfa6953a61f89aaace0442b9ef08e57ba778f1e97bf22f16f0ace -a2e6ac06f8973266cd0df447f82cec16614df65174c756e07f513e2c19aa82c10d8670047860960cfba3c5e4c42768c8 -811e66df0f3721a1ae0293549a0e3cd789f93fb6be2cab8e16015a6d52482af9057b1b75e9456322a5a9e87235e024cd -8744a80b3d9e37da4c50c536007981a4958d7e531cb93916dbf985cdc22f4ff482a5cc4fe50915c049d2de66530f1881 -b20b6e8c7be654c23c8ca440be2c37cf9cc9f4e81feedfd0cd7c56f37eda8f295fe5d415e9bac93d5f0a237edd8bc465 -b33fd84377f31f7819150d464b5eb3ef66e06cb8712665cf0587d61e1b1c121d11cc647f3753bbc18604941c77edbc1f -83acb8a3ec5f477b6d44cd49f9e091bc2bf7c9dfee876cde12075a7db9262314cb66ad2e7557114e0c19373e31c6eff1 -acfe4172327832ee207eb07da9cd37da3b009c776f7a8290529f0249f58da213254baddc7c3074fbaa1d226ba1e52b7c -81911b4dea863424b9d77a981987732382702e0294d8c8e1ec48e89678ecb0e64836b45205a120885fa8f8a3a4b9d4b0 -b11f61b1302579a11077bb2f1f0db371ab943573b261be288dc76172eee8a5102b992a5b526092d160ffd20aac2d4856 -ab491f7f1e002a44944c02537f365e525ebb6d5614bba8e5e8e8bd12064c702a1759571ddbeee592a0ba8b73cfce8810 -89211da3d92aed6b111de001b8b5a9231a1c2d09fb1cd2618ec457b635a6c8590fe119acca42fce76dce791c35b889c7 -a5f076c8f7164bcab8af59021ef97a0afa93d0877e52241c3ff5a9a9f81227a55c119ed6a84d34b196e94ec851ca5ca0 -80d91417d0d6c1adb5a3708165da1d54a83caaff482a4f65abf3fb335cbbc738c74ed19a8c451ca98befdf9b2d8b5f90 -aecba33a67f66401614eec5fa945e763da284edb9dc713bad4ac03972630781a09a3e2a291aac0605a9560c5f3444de5 -8a0aa1320bf5217a049b02ad02a4f892bfd6a3f5b48f472041d12f3aaab8dd197307f144f9de5f9e762c6b4971a121b4 -a4120a569e446fe4129f998e51f09c1cc7b29dc2b353d6f6f05daad1a4ef99acfcbaa4950a58aacf7ee1b3fde0af33d0 -aff71370d58b145758a5f24cf3c0c6667d22a1f950b8137c369fa845a5265cd645b422f24fa95e1cd7db1d68686120b6 -a839f075a8a702809a51fbc94595eab4f269a2e7a027aa1f4fc472e77f586138bf5aa4e5570a560e139eb6cda4cca161 -9484f1caa3e35cda0e3d36e43aff3dd8cf45a5a51fc34aafa3a63ed3543047ba9d6af2a9bc7c201c028499e6b4c41b28 -84ddb374c5c9170903bb3e1054fad071b0a147a9ca2ebe2fdb491ebb2431d53b398872a39cc385f973e38579d8e60158 -acaad8babaeaeb52c5b5a16ae689fa5ae15846f2d1f3596a52371bd8681819603822ee8d32ab8cda1bd5290d601e483f -946b69ca5361b60c3dc31db13669b05e5c0452f3c80e7e185f9667a36f351e9ed83bcb5c6dd2439ecd4490e3a87d260a -99f457221ac40df86f9b4bef0bf8812720b2f7218273a0aab08c4d4d4fb18a0fb0ef6ba9bf7fa53c116cc6f16742e44f -8bc0e812d8b718dbe48ead74a6bc7bac68897d01d097422be04110a25589bacd50d336d2c8b70d0dfde6c1b8bc372dc3 -895d118dae2fb35a4b0de22be0d000ec0f0f317b9494db7c12f10d7db81b6f3eaf6d6f3fdfe952f86ec4143d7469368d -893bf3d7e579e800526bc317438a69590d33759931830daf965cec721baa793ea335e9624a86b84b8fed5effc3e2bbac -a112d30dda88c749ca15d6dc65bcbc7fe838b2d25329d44410a9a96db195c7ce6a6921196a61ba7c9d40efdb101a164d -b88b5340af052fc3b8e1a8cf7532206801e79d878f1fb02b32ac4f8e91b64e0ec9252d808b87c4579de15886a20aaef1 -865f76475bb5da18c6a078c720c7b718e55d310876c98017c30ac31882ae347258b508ec34001918324250241d2df5b7 -b6d8a15913eb1714061d5cacbd0bb05edd83ecdb848a89b864e7411598e9f7814d0c039ebe4735437c8370d2ff183751 -a95fedce8351ae9c24d7fa06ebc5cd4e3aef87afaf04a7150e561a6a7f2347bdcec1e56b82d6e5f597fe7124f6cc503b -8526004ca0c802b073d50b0902ea69975949e7567b2e59ca2cf420bc53d91951d26096f2abb07a2955a51506e86488dd -99ccecaab68b6e5adadb9c848cb577de7e7ff4afc48d3b6b73bc0872730245b8a1c68cebf467074af6756d6226f4f4a7 -b5497d5c0cd79b7e6022e295642e1f2161254379eb78ef45e47f02c84ef5a3f6b6297718e4fac8093bf017287e456917 -b6943f30012b2093c351413c2b1b648afc14a5c4c0c338179d497e908451d2779919fe806181452ed386c1e8f8e8c25c -afdb56ce89bcd3247876c918cad68aad8da65d03c7c73ccbee0c4c39f3ad615aab87ffa0db5b3b63b4cc915d0b66deb7 -a44659d7be2f11d4d4949571d7bf84a6f27f874d3281edc34ef1098d321a4dcad9a42632b39633f8f9d20a39f54a2464 -a3e489b4db5832280dd58c62120262471b6fb4355c2ad307bd17c5c246b3f1e1b00f925930f5f5f6987de234fcbb7d16 -87a4e3a190340ed4949597703083d338e9c17263ba8a39b67100589f0dddbc420d9557f9522c17c71ae04b76876f8db0 -a35a3978e928eaac8c182a0a613c611ae7b4827c5e999f938eed06921c0294befdc21d02e68d035a2fc8d03c82641126 -a6898d90265dcf0fb215629f04b07c7918e022667583efe0bfe02f258b446954876c6ca9e369ffe1bb079e2314ebda32 -922fc52e648b6b2b6768c079c67ab425da72907a46add801715f8a2537280869d7071d527b833aa63ef562ce059a392b -8acbb7c4297196d8d1c131040c34cc7064656a148c2110b19c672abb094b1d084fafe967f7122ba9dd1523a4eaec3b42 -82dbf2cdd581fe3b81b156792228eae2485710e6c21dd5fd14614dc341bb0afbebbc0f32340eda9f094b630afcfc17e8 -907a095dca885da219e4558e9251ec765cf616e995c61546bc010963bf26f2d8adbd9b2ef61f2036e1740a627c20fbed -a7a83f849691d04640137989a2d0c90a7ed42a42b0ad328435d7e1fba557a27a58eec9170ab3d0099ec97da0c950765a -b7d435a801c2a5652cb479027f2c172eafa3df8ca0d896bbb9d49a42c42660fb382a8439bfed09ddf7e0214cb6066761 -8bc6b5e79af5512589f90de8e69bc858277055cf7243f592cc4edd193f03f71d16c9300097ddafb79752c63f135c884c -913264fca800467bee58a429e1f245ef303f5dbeea90f0ce6bb3c7ae6d1bd0f99ea75d3d309634684d2178642c81b5d8 -83ba558f9c23b785a123027c52924a1d7334c853a6165d4f5afd093b0b41951a36860ba0a20fa68f73d7db9df0e3ef38 -875b2df7cb54ecdf7ba31181b9dc7dbe02761ab8ffb61757d42a735c8e20d44bad5b904e76dcec6bb44883fdb9f4ad84 -af3dc5d2dd29565de8f4c700d5f1ab71dadb4351f06e9ee2eb5ee7a9b5da827d0c6726c6dc780748a26aa3b4d10e6c2d -a113ff09296b25f550f6d0d3f37dd4517b14cf6d5517293bd3068aa3aea765a8640fcd4bf0ba96db5c00167267fbd574 -a138c5cca485b9180ef091c9e327982bea203c165cb83564f416c36e813bea1ef1f6345f57c8a591df360541b7b758f5 -85793441e917ed520d41dda6e762269fb9f9702e5ef83cee3e90652d324536bf4233425cd05b54a383609076ab84ea13 -b422ac9de53d329e6321a8544c264d63cffc37965d627d7e180a999c3332644e21fedf10cd2f43cf6ba4fc542db91155 -a85d31d4bfa583a493681e57bfccca677ec5b85870a53de37f7be7833b573f8c8dcf029cea4ae548d83048030d77d56d -ab8a0702a371db496715a4ee8fcb6d430641b0f666d7fe3ef80c09df0bf570293cec1aa1675381c6bbd9ecc1f7cdccf9 -b308ef2b87438d35957191294782e9f5014a3394fadad3e2ccaf6ebf20fd889a36dbb8ddb3634baa8e2e131618aa4e70 -919e972e5b67cd65f377e937d67c27b4dd6fd42cfe394a34a70e8c253a1922f62ff36b9dcc7fbbc29b0960ad6a7fde88 -a0e4d4be28301af38a910971c8391ef3ec822ce35757226a7fd96955cd79afa14accba484ef4e7073e46b4b240a5863f -9422f6d424c1736b4b9bb9762aa62944085e8662c4460319dac4877b1e705aa5cd8b6b3a91268363ec3857c185685f4b -b7cf9f2053119d284a37df4e4489b632594df64e5dc846652ee26b4715e352e6333118b125021481138e4ec3e9f9987b -aea983e81c823472df8652654be8a60a8bf40147d599f87e323397f06bf88c98e9c6db0f28414f6ea4091f3eb0f6a96d -aa20bf03cd8b6ffda09fe0ef693fc0aaa3bb372603e786700e52063a4f7ee742771c41cf5e67e6248f99b7fc73f68dbf -8748a4978198071d7d5ddc08f8c8f0675d895dc19df0889e70bd86d44c469c719b93f6526c7e7e916c7bfeb9a1379aaf -b8fcd863d55dab2f7b1c93844306e00056ba17338ddfa3f02689a0b58b30239beb687b64c79b8420ecea8d0d082d9ffa -abb1a35952dc8a74dd1cdbc8ae7294c6bfd1910edab6f05c879e9ed06c636a949fe0017ec67f8f6f73effcb5817cccae -8bef43422b1c59e354b7f46c08a8eb78e26c4d01c236a4fe781cefb7465293a4444f2bdc68c6a221cd585a2494d9a1d7 -93527258940feff61befa18fcd6626fcff019d34a3ac8c6886599cbef75b15c15d689e8c1bd2177cc93c4c1792dee8d7 -b7f114eea99c8278841180ec8886ad2bab1826554a1657b9eeb17aa815f31b59c3931913ddec40aa9923bc92f8975635 -91a96446158b194a0a6ada2e37c8a45f3017c34034f757245f6f3b98c65d39d084e74d2a9dc271e5918faa53990ec63f -aea4ada0a853753db03f9790e20bab80d106f9b09e950f09aeaba5d869f0173bed673b866a96d6b0dd8123a539caac9a -b8e3e98ff0d3e512441e008a4a6783233045a4639e0c215c81984846b43ff98de99d7925cf717b1ca644f6229b6d16a2 -8987ef81a75213894e11e0310e8ba60fe06e2b264cc61655e5b51bf41cc8c3d6c10696642ea3517770f93be360207621 -8d4eff7335252f74af4a619c78625fd245df640f2086338dbb6c26b059f83fe70f3e81f5b6c12d62c0f784e572d56865 -a56f6389b0bac338f20c615d7d11e16045a76cbea23ced0a9d9067f538421c378200bfd4523b7c96094ab67f47f98d42 -83f5ab0727fd6ce8b3370ce3fac1f3a9c1930ea7ebbd16be61cc26f34aa1291ba4b5f16729d7d4f5924eaa4a1e31a04e -8cc62366874bf8751067a526ea32927584cef41174e2ec5a53079ee557067bc282f372b831cb2547c5e21a2f178c91b4 -b609e141006dc8d8649457efc03f8710d49abb34bc26a33ed4e173e51b85d7acdf18d74aed161b074f679d88f5aa2bf3 -873c7aa784c17b678443320950e494250baff8766db42619b9fc7ec4c3afa4eee290cd1f822b925d5b9e55c9cdd1af2f -859ba787f052d3665481c3dd58159ec8c238d918fb6d2787ebe275ef9acd377cb7aaa03a69820c78247bf51afee3d5bf -8eb1e6d2b0f51a3275b4a8be96957cb2d518b32c815dc0dfd5f75340c7dee73e5edc45db7c7d375c4ffaf8c59767d0c1 -85f3876ff5edbb826a9592e68db3dcc975725bfdda4fcac197758a8b27e4f493e6c531b1342ba0f5a75f965273720345 -8a1272f2678d4ba57e76c8758818965e6849971e8296b60ff85a522feeaaa3d23d3696c040d8bdaf1b380db392e988aa -85002b31ce31be7cc8757141a59a7cf9228b83144993d325b2241f5bfac09a02aca0c336307257f1a978c0bbf79fa4fe -b96bd26a6bbbc705c640285fd561943ef659fca73f25e8bf28cfcd21195752b40359d0edca0adc252d6e1784da267197 -936cfe367b83a798ab495b220f19cfe2e5bde1b879c8a130f84516ac07e3e3addcc791dc0e83a69c3afc225bed008542 -b1302f36190e204efd9b1d720bfaec162fcbba1b30400669dbcdd6e302c8c28f8b58b8bbde10f4512467dd78ed70d5e0 -8291b49f56259c8d6b4fd71525725dd1f35b87858606fc3fe7e048ac48b8a23ba3f0b1907b7c0d0c5ef6fa76cddc23f0 -97aca69d8e88ed8d468d538f863e624f6aed86424c6b7a861e3f45c8bf47c03e7b15d35e01f7add0a4157af171d9360c -b590d896e6b6f2e4dcffebfa67fc087fa518a9c8cb0834a5668cabe44e5c2b6f248f309b9cd74779030e172dba5d9e29 -97e7099bff654bcb37b051a3e8a5a7672d6ab7e93747a97b062fc7ae00c95deef51f5ced2966499217147058e00da4be -83435b739426f1b57f54ebad423939a68ad3d520db8ca5b7e28d1142ebfb4df93f418b180a6c226c0ca28fa0651163a0 -946c9144d982837c4dbc0b59544bdbc9f57e7c9ef0c82a7ad8cfddea78dedc379dbc97af54ba3ac751d844842a2990a4 -90ba1eff9c25adba8c3e6ef5b0d46c13de304632fec0646ee3a7bee69da2bc29e162dd3fb98a37ed1184ae5da359cf0a -b17b7a5c0a48eb9784efb5ff8499230b45efeb801cf68e13fe16d0d308511af5aa60e3b9a5610f96d7c2242ae57d455b -9991245e5617c4ea71575e5b2efe444f09cbbed13b130da08f8e9809d62512e8298a88d41f6aa3dbf3bcbc90654ceb18 -a1190c4cbccf2898a7fe025afd03f8652973a11cef59775fb47d69a6b4dcb9a5a0c554070421a5e10a75e43b63d37b79 -857c0a5f291eb35a76be11543a8c3d798187bd0717e2cdee50d390b66322d0d9529520fd3377136cdc93cfee99b6403f -944d11e5f9a3493c67786df94f129352d892fbdc43e98206b8dbf83cce240f65305e1768b38e5576048a31dca5c18f31 -818f361c5dae709e067a82b81beffbd9674de8df2bc1bfc3a27ddf326260e124e46b1e36697fb8de539b7736db093e9e -b07f5b737735a0d628e7ac2d335080b769bdb3acea38ad121e247a6e4307916ba1d029da5d341f079ea61eeaf7d8554e -a69e338803f3ee0fbbddc7ee481a13f6b64d25d71bae0d76f4b5145b54923cf1616c77ba0fd9ca37a3ae47208f490423 -acaee66b94e226622e28a144f93f6b1b442b9c79d7a8a1740c4d53044d0675a661e7453509b9e716e469fe11ce45ee31 -9402ca799d2e1cce0317ed49453ee0b2669b05e68ff101b89306db215c3941b3786ad3402d00369cb1dee020b56d3142 -849440c539fc0df3c8d06e23e271e6faa50234d5c057b8561e9376415f4396e548351cc677b0abeafe4f51b855a3dc83 -865b99587eb3dbc17e412647673f22b2e89185d1df1ec8ea04515585ad2edfb731be458123118dcd7b41b475026477b9 -9390618833b5adbaf24bd38cf9fc6f25104717f314259bb4da5c7a1f6963ecdc04d07bed391d8cd765c3d53567b2b6b1 -95383e8b1d0a629cec238b5ae2bda236a027f4e3b5f99ceace05f1d5a781ec1e7a43058f44ef0a5aee6b0db5697a0d89 -91739b8946d90db3a5244f7485295cc58143ba0449c9e539df1ba3c166ecf85ff914c9941192963c32d35033ae2f0980 -b5d88848d856d882db5947b9182025f0abf2bc4335b650fa0a48a578e2c87f32cc86d42d3b665ee2eab46d072bf1eccd -91f4c754549f5a53b1902ef84274ce9acf0bfd2e824e62eb127d67e3214ce05fc2430c05ea51e94dc6e8978f5d076bab -91fff8c75f8ad86afe78ec301de05e4ca71421d731419a17c747a9a0bf81129422c9499e4749107b168d1695dc90292f -99fbd7bede9cc1e2974c2a21c70788960c2dbf45a89552da8d73bb1d398b8399590707f2f4ba4b43cb356e703eb01b5e -80a51cd83e3d748c07b9ac82de1a697b09031e3edc7bf585f06cd0ffa8ea319517fcc2b735614b656677b54b4910814e -886b27de1f93311d1a31b6d698aa28b54fbd800decd8e25243d89e352ee38cb252d5648b5134a3e1ed021bae46e9da48 -976e70c94db905f83b4ef72188d840874bf005814c0c772f3832aa65b1f21927403125eea7a07b6d3305b1a781b36ab7 -b4adb9d1c49eb31462583580e3ffa625bea4f8b2a7d4927e4ff925c1759d4b3c1e43283d635b54fb0eabfbe1f4c12992 -b66b466bd48485ebeedd47e749d86cbaa3deffbbee2e69cfaa5e9f3bd28b143d7c1c0255a7a1393a2cc1490b2c485571 -8bded5bc0794513947ddb00ff6b780c5cc63a74e2a0b0284153c346a31c82e1eff07c073939da39e6f87a06c14ff1a80 -aceea8c6f799589f6b7070abf69fec724e6679514e60f1eaf9a52c37e9cebb72abcc833a81d8da1a4f5194c1a7eeff63 -89a9f76d053379687fd221ebcaf02c15c2c241bb673ef5298e32640a115d9e0f2331c3e185572cd65946dd6c5bd42412 -a57b6f1e3fdd92eadc6220760f22d0685a82cada1c7a1bda96d36e48e2852f74f3a83c757dd8857e0aee59e978da4919 -9106cf0891bb39ce87433c5f06a5c97a071d08ad44a7cbcd6918c0729c66bb317fbbee8aa45591cee332ad1234c7257d -96c18cca4a0f0299e0027ff697798085f9f698a7237052c5f191b1dba914e5a015ae356b80c17f0fdd31d08c5a939ebb -a892103c93df126c024825c07d8769bdac5f1d26ea9509ee26530dc594384b2a5095cc34e0b41ab3db0392a29792c9e8 -b7c2dbc95edb6fc25802ea051803b7bea682f87a99f8a9fdcc3091c81d914b9493dfb18a8894c964805298a6c22b07f2 -8e40948927d560a6840d7fb99802989ce72b43693e9dc7ed9dcda4bca7daedf75271cf656bcc22b3f999a550faad8648 -b354de1c6f0603df3ed9036c610281e55b51a48950ee3ce57a00b4692232de7ca57d19722700e15cbe67a91fcec2f786 -adf987b90737b933436d8036c1d3f0c9104f26c540052e22e703964f72739ac1261e4289b8f27dec47281a0f3f51378a -8ed5248e9c836fffa7c924178db593e1aaeb54bcf2e93c1983c1f3899cad538deeb2b836430fddc9b2f283e0797ea11e -907e5410e3bd5d7f55340e2f497bd1ca10bfcb4abed2c66a3cdf94dc40bbd7c43ac98754e0b4b223ea4c61eebf2f27f5 -8e81b441ea0397db28840fb4b3c3bfe6d8e31418816f7bda36f9c1cfe4556daee30c43639d90a2dc9b02a3d65e5f4ab2 -897085c477f5030f9fed06e181b05953a8cd2001d959dd6139738d40f1d673b2c7120b5348f678547acfdc90ffc9fcc6 -b0bf2784c4b3808a04be5a00a0593035ce162b3886e1500247b48365eac8ec3d27c7e5e6372e030c779c75fb79772d0d -af3fe6c75f2a1241ac885d5091ff3882cf01695d957d882e940f0c31f7a5b5e269c1a2bae7336e9a7cda2b1d23c03bd1 -a6d94e065f85736d77080a4f775885ccb0dd5efdbe747e4595280bca0ebe12450257c1beadcbec77566ef57508c5d4df -a5c50fe56b5532bf391da639a2f2b6cbb2634fc6637416fea7c29a522dea024d4adaaa29b6d472b4d2cc3e3b85c72e2a -afc35f5a03b245a6286318ef489db05d397bbd16c17b4e92eeb56509f875246c0176c01804139eb67dc4247c2a36ff9e -99ba14ab5a9612c078f9bbaa0e68fd1d52ecceb2ed19bd9abf8f98dd4ed1f9c4fa6e4d41bcef69be2ff020b291749ca8 -8018cdd3d96f331b4c470a4c3904bed44cadecbeec2544ca10e4352cf4ae1a856cf55f6383d666bf997ad3e16816006e -a9964790c318bb07b8fe61d230dd2161dd3160e186004647a925cfec4c583b4e33530bf5d93d8a14338b090055085b05 -ab89d8401df722101c2785cb3ef833017f58376ee82cedd3e9405b2534f259bb76063434a247652c7615a6de5194de65 -a72c3d320a0d40936dee8edfb36703be633aefbb8f89530df04eb6aebe0305ef4f4b6709436f8036d417272a7e47e22a -b3457661ad62634cc25e2918921a97b0bf5c59ccc7063bc8eb53194783f07659f42f8978c589228af5b12696588d8b2f -926fa35cd3ed4c8ad78af6284b87ae53b2e25a1ff50398034142a2bbed5b989ba3181ff116838931742c0fbcd8b8a56c -ae57fe506626432f27ae4f8791421c2df9efd9aaabe4b840ccf65fc3d0dd2f83e19eb63ae87bfa6898d37b5da869ddb2 -99c0a26ac74211db77918156d7ae9bea6ecf48da3ce9e53829a9ad5ed41321227c94fbd7449ae2e44aae801811552b1b -abdd2635b61cb948e51b762a256cf9d159b9fcb39b2fb11ba2fed1cb53475a03fc6e024a6a824a67a689396119a36a7b -a5ca98b98da8bb8eb07b1e5e3c85a854db42addefacd141771a0c63a8e198421dccc55ef1d94662ca99a7d83b9173fc3 -a821bb5cf1eb3aeae6318c8d554e2ea3137d73bb29d2e4450c9a33f441355ea77bb0e0e0ce7c819abc3ed119110a3a92 -95cdfb19b3f7196c26d60586e2c1efaa93352a712f8c8ef6209f6f318cecd52d7bebdfbfee4be1f5903a1595f73bc985 -aef6e6a400106e217f9888afcef0a1e1299b59017e77dc5453317dec0c32ae96873608bef3f1b504a7e4f45b06edc9c6 -96399ad093299ba26dc09ae85dbec9a1801dea4a338dd5d578bcdcb91246db0059e54098ba8a56cbb24600a40095cf79 -ad8b018ac99857ad4b38bdf6d110bbef64029a4d9f08df85a278c6ddc362a5f64e1f3a919f798ccb2f85a7f4ca1260b4 -b211f3b5dd91941d119c4fe05e2b4c7bb0ce0a8d7ef05932a96e850f549a78cd20cded0b3adb3f9f8b7058889ae2cb4e -ab780dd363671765c9c9ab0f4e7096aacf5894e042b75f40a92df8eb272a6229078cd6eadcc500eead3650860aa82177 -a4d96b16ab3abe77ead9b4477c81957e66a028f95557e390352743da53d1a7ba0c81d928a7ea8bc03b9900135ac36a6a -b4d4e028099bf0f28ac32141cd8de4ee7c3d62d4f519fad6abbb4ba39592750812220a4167d1da4c4f46df965f7cf43d -aa929c5f0bd8cb44a861bfb3d18340a58c61d82afa642447b71b1470a7b99fe3d5796bdd016b121838cb3594f5a92967 -a038e66f0a28aba19d7079643788db3eed8e412fb9ab4c0f6cacf438af4657cc386a7c22ae97ccc8c33f19a572d6431c -89c1ff879faa80428910e00b632d31c0cebb0c67e8f5ded333d41f918032282fb59fbcbe26d3156592f9692213667560 -8d899072c9d30e27065d73c79ce3130a09b6a4a4c7d9c4e4488fda4d52ad72bd5f1fd80f3a8936ef79cf362a60817453 -8ffb84a897df9031f9a8e7af06855180562f7ca796489b51bb7cca8d0ca1d9766a4de197a3eb7e298b1dfb39bc6e9778 -836ebd0b37e7ef4ff7b4fc5af157b75fa07a2244045c3852702eaafa119ca1260c654a872f1b3708b65671a2ece66ad2 -9292dfd6d5bfc95f043f4eb9855c10cbcf90fbd03e7a256c163749b23a307b46a331bdbd202236dca0e8ea29e24906de -8bc37eaa720e293e32b7986061d2ffcbd654d8143e661aabe5602adc832ab535cffbe12a7b571d423675636a74b956e4 -887455f368515340eb6f9b535f16a1cf3e22f0ceda2ead08c5caefccef4087e9f4b5d61c5b110ff3e28e4ab2ad9e97c5 -a6e5ec36e7712056fec00de15b8696952b17891e48ebe2fa90c6f782c7d927b430917b36b4a25b3d8466da3ca2a4985d -895cae36ba786104ec45740c5dc4f2416b2adce6e806815e3994e98d9e1be372eaec50094fbb7089015684874631ab7e -9687444fe6250c246b1711a8f73992f15c3cac801e79c54ffd5e243ad539fdd98727043e4f62d36daf866750de1ba926 -b17f75044c8e9ce311bb421a5427006b6fa1428706d04613bd31328f4549decd133e62f4b1917016e36eb02ea316a0ca -8538a84d2f9079dd272a7383ff03b7674f50b9c220e0399c794a2bcb825d643d0fc8095d972d5186b6f0fe9db0f7084f -af07b37644cc216e7083bac1c4e6095fa898f3417699df172c1f6e55d6c13c11f5279edd4c7714d65360b5e4c3c6731e -87eed8fe7486c0794884c344c07d3964f8fc065aebb0bb3426506ab879b2e0dfaefa5cece213ec16c7b20e6f946c0bd2 -8a4bf42f141d8bc47c9702779d692a72752510ef38e290d36f529f545a2295082a936c8420f59d74b200a8fff55167c4 -a7170e5e00a504a3b37cb19facf399c227497a0b1e9c8a161d541cb553eb8211449c6ac26fe79a7ff7b1c17f33591d74 -a9a2cc7232f07ef9f6d451680648f6b4985ecab5db0125787ac37280e4c07c8210bab254d0b758fd5e8c6bcf2ee2b9ff -8908d82ebfa78a3de5c56e052d9b5d442af67a510e88a76ba89e4919ae1620c5d15655f663810cfc0ee56c256a420737 -a9d47f3d14047ca86c5db9b71f99568768eaa8a6eb327981203fdb594bdb0a8df2a4a307f22dcea19d74801f4648ea89 -a7c287e0e202ebfc5be261c1279af71f7a2096614ee6526cd8b70e38bb5b0b7aca21a17140d0eddea2f2b849c251656a -97807451e61557d122f638c3f736ab4dab603538396dca0fcdf99f434a6e1f9def0521816b819b1c57ecdfa93bd077eb -a8486d60742446396c9d8bc0d4bed868171de4127e9a5a227f24cbf4efbbe5689bbd38f2105498706a6179340b00aed5 -a03b97c2a543dfefa1deb316db9316191ab14e3dd58255ce1027b4e65060d02fb5cb0d6ac1a2bf45bfeac72537b26429 -a7d25060f6861873410c296a4959a058174e9a1681ac41770788191df67fc1391545dab09de06b56cd73a811b676aa1b -96bb9c9aa85d205e085434d44f5021d8bbafc52cd2727b44e2a66094a4e5467b6294d24146b54c0d964c711e74a258d4 -b07b17f11267e577191e920fa5966880f85ff7089ac59d5d550e46f3a5cdadd94f438a547cd1ec66f20a447e421f96c6 -964e33e1571c97088fe7c8ca3430db60a8119f743a47aa0827e6e2fb9bae5ff3bf6cecd17b11dd34628546b6eb938372 -82a0513a05870b96509a559164e6ff26988ea8a2227ac6da9adc96fe793485a9eb6bdcab09afac7be4aef9a5ae358199 -b1185bc679623e7a37a873d90a2a6393fb5ccc86e74ba4ba6f71277df3623cde632feae4414d6429db6b4babde16dee0 -b3d77504b7032b5593a674d3c0cd2efbf56b2b44ed7fe8669f752828045e4e68202a37bf441f674b9c134886d4cee1df -95ab31749ff1f7b3f165ce45af943c6ed1f1071448c37009643a5f0281875695c16c28fc8d8011a71a108a2d8758e57d -b234dee9c56c582084af6546d1853f58e158549b28670b6783b4b5d7d52f00e805e73044a8b8bd44f3d5e10816c57ecc -86da5d2343f652715c1df58a4581e4010cf4cbe27a8c72bb92e322152000d14e44cc36e37ff6a55db890b29096c599b9 -8b7be904c50f36453eff8c6267edcb4086a2f4803777d4414c5c70c45b97541753def16833e691d6b68d9ef19a15cb23 -b1f4e81b2cdb08bd73404a4095255fa5d28bcd1992a5fd7e5d929cfd5f35645793462805a092ec621946aaf5607ef471 -a7f2ca8dacb03825ef537669baff512baf1ea39a1a0333f6af93505f37ed2e4bbd56cb9c3b246810feee7bacdf4c2759 -996d0c6c0530c44c1599ffdf7042c42698e5e9efee4feb92f2674431bbddf8cf26d109f5d54208071079dfa801e01052 -b99647e7d428f3baa450841f10e2dc704ce8125634cc5e7e72a8aa149bf1b6035adce8979a116a97c58c93e5774f72b7 -95960a7f95ad47b4a917920f1a82fbbecd17a4050e443f7f85b325929c1e1f803cf3d812d2cedeab724d11b135dde7a3 -8f9cd1efdf176b80e961c54090e114324616b2764a147a0d7538efe6b0c406ec09fd6f04a011ff40e0fa0b774dd98888 -b99431d2e946ac4be383b38a49b26e92139b17e6e0f0b0dc0481b59f1ff029fb73a0fc7e6fff3e28d7c3678d6479f5a3 -a888887a4241ce156bedf74f5e72bfa2c6d580a438e206932aefc020678d3d0eb7df4c9fe8142a7c27191837f46a6af6 -ab62224ea33b9a66722eb73cfd1434b85b63c121d92e3eebb1dff8b80dd861238acf2003f80f9341bfea6bde0bfcd38c -9115df3026971dd3efe7e33618449ff94e8fd8c165de0b08d4a9593a906bbed67ec3ed925b921752700f9e54cd00b983 -95de78c37e354decd2b80f8f5a817d153309a6a8e2f0c82a9586a32051a9af03e437a1fb03d1b147f0be489ef76b578b -a7b8a6e383de7739063f24772460e36209be9e1d367fe42153ffe1bccb788a699e1c8b27336435cd7bf85d51ba6bfdd6 -937a8af7ed18d1a55bf3bbe21e24363ae2cb4c8f000418047bf696501aaeec41f2ddf952fd80ef3373f61566faa276a9 -ab5e4931771aeb41c10fa1796d6002b06e512620e9d1c1649c282f296853c913f44e06e377a02f57192b8f09937282eb -893d88009754c84ec1c523a381d2a443cb6d3879e98a1965e41759420a088a7582e4d0456067b2f90d9d56af4ea94bba -91b2388a4146ebaaa977fec28ffbfb88ac2a1089a8a258f0451c4152877065f50402a9397ba045b896997208b46f3ebf -8ce0523192e4cc8348cd0c79354a4930137f6f08063de4a940ea66c0b31d5ea315ce9d9c5c2ec4fa6ee79d4df83840dd -b72f75c4ab77aca8df1a1b691b6ef1a3ff1c343dd9ed48212542e447d2ed3af3017c9ad6826991e9ef472348c21b72a4 -af0fa5a960f185326877daf735ad96c6bd8f8f99ab0ab22e0119c22a0939976ece5c6a878c40380497570dc397844dba -adf9f41393e1196e59b39499623da81be9f76df047ae2472ce5a45f83871bb2a0233e00233b52c5c2fa97a6870fbab0a -8d9fc3aecd8b9a9fca8951753eea8b3e6b9eb8819a31cca8c85a9606ce1bd3885edb4d8cdbc6f0c54449c12927285996 -901969c1d6cac2adcdc83818d91b41dc29ef39c3d84a6f68740b262657ec9bd7871e09b0a9b156b39fa62065c61dacb1 -9536a48ccd2c98f2dcbff3d81578bbb8f828bf94d8d846d985f575059cd7fb28dfa138b481d305a07b42fcb92bacfa11 -8d336654833833558e01b7213dc0217d7943544d36d25b46ecc1e31a2992439679205b5b3ab36a8410311109daa5aa00 -95113547163e969240701e7414bf38212140db073f90a65708c5970a6aaf3aba029590a94839618fc3f7dd4f23306734 -a959d77a159b07b0d3d41a107c24a39f7514f8ce24efa046cfcf6ace852a1d948747f59c80eb06277dce1a2ba2ec8ea9 -8d2cb52dd7f5c56ef479c0937b83b8519fa49eb19b13ea2ec67266a7b3d227fb8d0c2454c4618d63da1c8e5d4171ac7b -9941698c5078936d2c402d7db6756cc60c542682977f7e0497906a45df6b8d0ffe540f09a023c9593188ba1b8ce6dfcb -9631d9b7ec0fc2de8051c0a7b68c831ba5271c17644b815e8428e81bad056abb51b9ca2424d41819e09125baf7aaf2d4 -a0f3d27b29a63f9626e1925eec38047c92c9ab3f72504bf1d45700a612682ad4bf4a4de41d2432e27b745b1613ff22f9 -80e3701acfd01fc5b16ecfa0c6c6fd4c50fe60643c77de513f0ad7a1a2201e49479aa59056fd6c331e44292f820a6a2c -a758c81743ab68b8895db3d75030c5dd4b2ccc9f4a26e69eb54635378a2abfc21cba6ca431afb3f00be66cffba6ab616 -a397acb2e119d667f1ab5f13796fd611e1813f98f554112c4c478956c6a0ebaceef3afae7ee71f279277df19e8e4543a -a95df7d52b535044a7c3cf3b95a03bafd4466bdb905f9b5f5290a6e5c2ac0f0e295136da2625df6161ab49abcdacb40f -8639fc0c48211135909d9e999459568dbdbbc7439933bab43d503e07e796a1f008930e8a8450e8346ab110ec558bcbb9 -a837bcc0524614af9e7b677532fabfb48a50d8bec662578ba22f72462caabda93c35750eed6d77b936636bf165c6f14e -97d51535c469c867666e0e0d9ed8c2472aa27916370e6c3de7d6b2351a022e2a5330de6d23c112880b0dc5a4e90f2438 -aadb093c06bd86bd450e3eb5aa20f542d450f9f62b4510e196f2659f2e3667b0fe026517c33e268af75a9c1b2bc45619 -860cef2e0310d1a49a9dd6bc18d1ca3841ed1121d96a4f51008799b6e99eb65f48838cd1e0c134f7358a3346332f3c73 -b11c4f9e7ef56db46636474a91d6416bcb4954e34b93abf509f8c3f790b98f04bd0853104ec4a1ff5401a66f27475fce -87cb52e90a96c5ee581dc8ab241e2fd5df976fe57cc08d9ffda3925a04398e7cffaf5a74c90a7319927f27c8a1f3cef5 -b03831449f658a418a27fd91da32024fdf2b904baf1ba3b17bbf9400eaddc16c3d09ad62cc18a92b780c10b0543c9013 -94e228af11cb38532e7256fa4a293a39ffa8f3920ed1c5ad6f39ce532e789bb262b354273af062add4ca04841f99d3aa -99eb3aeb61ec15f3719145cf80501f1336f357cc79fca6981ea14320faed1d04ebe0dbce91d710d25c4e4dc5b6461ebf -920a3c4b0d0fbe379a675e8938047ea3ec8d47b94430399b69dd4f46315ee44bd62089c9a25e7fa5a13a989612fe3d09 -b6414a9a9650100a4c0960c129fa67e765fe42489e50868dd94e315e68d5471e11bfbc86faffb90670e0bec6f4542869 -94b85e0b06580a85d45e57dae1cfd9d967d35bdfcd84169ef48b333c9321f2902278c2594c2e51fecd8dbcd221951e29 -b2c0a0dd75e04a85def2a886ee1fda51f530e33b56f3c2cf61d1605d40217aa549eef3361d05975d565519c6079cc2ac -abb0ea261116c3f395360d5ac731a7514a3c290f29346dc82bacb024d5455d61c442fefe99cc94dddcae47e30c0e031f -a32d95ae590baa7956497eddf4c56bff5dfdc08c5817168196c794516610fcc4dbcd82cf9061716d880e151b455b01e0 -8bd589fb6e3041f3ef9b8c50d29aed1a39e90719681f61b75a27489256a73c78c50c09dd9d994c83f0e75dfe40b4de84 -82d01cdaf949d2c7f4db7bfadbf47e80ff9d9374c91512b5a77762488308e013689416c684528a1b16423c6b48406baf -b23e20deb7e1bbbc328cbe6e11874d6bdbb675704a55af1039b630a2866b53d4b48419db834a89b31ebed2cfc41278dd -a371559d29262abd4b13df5a6a5c23adab5a483f9a33a8d043163fcb659263322ee94f872f55b67447b0a488f88672d6 -85b33ddf4a6472cacc0ed9b5ec75ed54b3157e73a2d88986c9afa8cb542e662a74797a9a4fec9111c67e5a81c54c82b3 -af1248bc47a6426c69011694f369dc0ec445f1810b3914a2ff7b830b69c7e4eaa4bafec8b10ed00b5372b0c78655a59b -94b261ed52d5637fd4c81187000bd0e5c5398ce25797b91c61b30d7b18d614ab9a2ca83d66a51faf4c3f98714e5b0ea5 -953d4571c1b83279f6c5958727aaf9285d8b8cbdbfbaff51527b4a8cfdd73d3439ba862cdb0e2356e74987ff66d2c4d9 -b765dae55d0651aca3b3eaef4ca477f0b0fda8d25c89dccd53a5573dd0c4be7faaadaa4e90029cdd7c09a76d4ce51b91 -b6d7b7c41556c85c3894d0d350510b512a0e22089d3d1dd240ad14c2c2b0ce1f003388100f3154ad80ec50892a033294 -a64561dc4b42289c2edf121f934bc6a6e283d7dce128a703f9a9555e0df7dda2825525dbd3679cd6ba7716de230a3142 -a46c574721e8be4a3b10d41c71057270cca42eec94ca2268ee4ab5426c7ce894efa9fa525623252a6a1b97bcf855a0a5 -a66d37f1999c9c6e071d2a961074c3d9fdcf9c94bf3e6c6ed82693095538dd445f45496e4c83b5333b9c8e0e64233adc -ab13814b227a0043e7d1ff6365360e292aca65d39602d8e0a574d22d25d99ccb94417c9b73095632ff302e3d9a09d067 -b2c445b69cff70d913143b722440d2564a05558d418c8ef847483b5196d7e581c094bae1dbb91c4499501cfa2c027759 -87cbde089962d5f093324b71e2976edbe6ad54fb8834dd6e73da9585b8935fca1c597b4d525949699fdfa79686721616 -a2c7e60966acb09c56cf9ad5bdcc820dcabf21ef7784970d10353048cf3b7df7790a40395561d1064e03109eaac0df98 -8ea7b8af208678178553946b2ee9e68c0e751b34f3652409a5e66c40d3aee3a40ba6ffe2175ce16c6a81b78ecc597d02 -960234239e1e3ea262e53d256ad41b2fe73f506b3d130732d0ee48819eb8a9c85bb5106a304874d8625afae682c34015 -858459694c4e8fdafa6cdaee1184e1305ca6e102222b99b8e283dd9bb3ebf80e55d6c4d8831a072b813c8eceb8124d95 -a30a8ce0f44aeb5590dc618c81c7cac441470ce79fd7881a8f2ea4ca5f9d848ebde762fcaee985cbd3d5990367403351 -a83867643672248b07d3705813b56489453e7bc546cdba570468152d9a1bd04f0656034e7d03736ea156fc97c88dc37f -a7bb52e0fc58b940dc47ea4d0a583012ee41fad285aba1a60a6c54fa32cfe819146888c5d63222c93f90de15745efb2b -8627bcc853bdeaad37f1d0f7d6b30ada9b481ccdf79b618803673de8a142e8a4ce3e7e16caed1170a7332119bcdc10a9 -8903d9dc3716b59e8e99e469bd9fde6f4bca857ce24f3a23db817012f1ea415c2b4656c7aeca31d810582bb3e1c08cc6 -875169863a325b16f892ad8a7385be94d35e398408138bd0a8468923c05123d53dba4ce0e572ea48fcdadd9bd9faa47a -b255b98d46d6cc44235e6ce794cc0c1d3bd074c51d58436a7796ce6dc0ae69f4edaa3771b35d3b8a2a9acd2f6736fab3 -9740c4d0ee40e79715a70890efda3455633ce3a715cbfc26a53e314ebbe61937b0346b4859df5b72eb20bcba96983870 -a44ce22ab5ddc23953b02ec187a0f419db134522306a9078e1e13d5bf45d536450d48016a5e1885a346997003d024db0 -90af81c08afdccd83a33f21d0dc0305898347f8bd77cc29385b9de9d2408434857044aec3b74cb72585338c122e83bb4 -80e162a7656c9ae38efa91ae93e5bd6cb903f921f9f50874694b9a9e0e2d2595411963d0e3f0c2d536b86f83b6e4d6ef -8b49fa6babe47291f9d290df35e94e83be1946784b9c7867efd8bc97a12be453013939667164b24aeb53d8950288a442 -a1df6435d718915df3da6dda61da1532a86e196dc7632703508679630f5f14d4cb44ce89eff489d7ff3fe599cc193940 -afd44c143dbb94c71acc2a309c9c88b8847ef45d98479fccce9920db9b268e8e36f8db9f02ff4ee3cff01e548f719627 -b2cf33d65d205e944b691292c2d9b0b124c9de546076dd80630742989f1ffd07102813c64d69ba2a902a928a08bce801 -b9f295e9f9eca432b2d5c77d6316186027caca40a6d6713f41356497a507b6e8716fb471faf973aaa4e856983183c269 -b3bd50c4b034473edce4b9be1171376a522899cb0c1a1ae7dc22dd2b52d20537cf4129797235084648ac4a3afc1fa854 -8ef37683d7ca37c950ba4df72564888bedaf681931d942d0ea88ead5cc90f4cbef07985a3c55686a225f76f7d90e137d -82107855b330bc9d644129cebecf2efbfab90f81792c3928279f110250e727ce12790fd5117501c895057fa76a484fc0 -816a5474c3b545fb0b58d3118cc3088a6d83aad790dbf93025ad8b94a2659cceba4fa6a6b994cb66603cc9aef683a5e3 -8f633f9b31f3bb9b0b01ea1a8830f897ecd79c28f257a6417af6a5f64e6c78b66c586cf8d26586830bd007fb6279cd35 -acb69d55a732b51693d4b11f7d14d21258d3a3af0936385a7ce61e9d7028a8fe0dd902bda09b33fb728bc8a1bc542035 -8d099582ac1f46768c17bf5a39c13015cfe145958d7fc6ddfd2876ad3b1a55a383fbe940e797db2b2b3dc8a232f545dc -97a4dd488b70bf772348ececaca4cf87bc2875d3846f29fe6ef01190c5b030219b9e4f8137d49ea0cc50ca418024c488 -b4d81148f93fa8ec0656bbfb5f9d96bbf5879fa533004a960faac9fd9f0fe541481935fdf1f9b5dd08dff38469ef81c5 -8e9b2ae4fc57b817f9465610a77966caaff013229018f6c90fa695bd734cb713b78a345b2e9254b1aff87df58c1cd512 -99eb7126e347c636e9a906e6bfdc7c8ca0c1d08580c08e6609889a5d515848c7ca0f32ab3a90c0e346f976a7883611f7 -8ca87944aa3e398492b268bda0d97917f598bc0b28584aa629dfec1c3f5729d2874db422727d82219880577267641baa -88ab0e290dc9a6878d6b4e98891ff6bfc090e8f621d966493fcbe1336cc6848fcbb958d15abcfa77091d337da4e70e74 -8956a2e1dc3ec5eb21f4f93a5e8f0600a06e409bb5ec54e062a1290dff9ce339b53fbbfc4d42b4eed21accea07b724d6 -8d22220da9dc477af2bddb85c7073c742c4d43b7afee4761eba9346cadbcd522106ed8294281a7ef2e69883c28da0685 -90dafd9a96db7e1d6bde424245305c94251d5d07e682198ae129cd77bd2907a86d34722cbde06683cc2ca67cebe54033 -b5202e62cf8ea8e145b12394bd52fd09bda9145a5f78285b52fda4628c4e2ccfc2c208ecde4951bd0a59ac03fa8bc202 -8959856793ba4acf680fb36438c9722da74d835a9fe25a08cf9e32d7800c890a8299c7d350141d2e6b9feceb2ebb636f -ab0aa23c1cd2d095825a3456861871d298043b615ae03fcd9283f388f0deef3cc76899e7fde15899e3edf362b4b4657f -9603b333cc48fe39bea8d9824cfee6ac6c4e21668c162c196ecd1ff08ef4052ace96a785c36b8f7906fdcb6bc8802ddd -93bfecbc3c7cc03c563240e109850a74948f9fa078eb903b322368cda0b50888663a17953579578ba060b14dbf053024 -b01f843b808cf7939a474de155a45462e159eb5044f00c6d77e0f7ec812720a3153209e971a971ccbf5ebee76ec4074f -b009e0567c3c75ed767247d06fa39049a4d95df3392d35a9808cb114accf934e78f765cd18a2290efef016f1918c7aeb -ad35631df8331da3a12f059813dfa343d831225a392f9c7e641c7d23a6c1ad8df8e021201c9f6afb27c1575948d6bf68 -a89c2a631d84128471c8ef3d24b6c35c97b4b9b5dad905c1a092fb9396ae0370e215a82308e13e90e7bb6ebcc455eb2a -b59c7f5fbfeb02f8f69e6cedef7ff104982551f842c890a14834f5e834b32de1148cf4b414a11809d53dd3f002b15d6a -aa6f267305b55fede2f3547bc751ba844ce189d0b4852022712b0aee474de54a257d4abcd95efe7854e33a912c774eba -afddd668f30cce70904577f49071432c49386ec27389f30a8223b5273b37e6de9db243aceb461a7dc8f1f231517463a9 -b902a09da9157b3efa1d98f644371904397019d0c84915880628a646a3ad464a9d130fdc651315098179e11da643ad2e -b05f31957364b016c6f299ae4c62eede54cab8ea3871d49534828c8bdc6adbc6a04a708df268f50107d81d1384d983ae -b4c3f7284802e614ddf1f51640f29e7139aae891467d5f62778310372071793e56fbd770837b97d501191edd0da06572 -b4eddb7c3775fb14fac7f63bb73b3cde0efa2f9a3b70e6a65d200765f6c4b466d3d76fcd4d329baee88e2aba183b8e69 -a83e7dbae5a279f0cfd1c94e9849c58a3d4cecc6d6d44bb9b17508576ca347fca52c2c81371d946b11a09d4ed76ec846 -8018ea17e2381c0233867670f9e04c8a47ace1207fdcf72dce61b6c280ba42d0a65f4b4e0b1070cc19c7bb00734974d9 -af90b541dfed22e181ff3ef4cf11f5e385fd215c1e99d988e4d247bc9dcee9f04f2182b961797c0bcc5f2aaa05c901a9 -a37046e44cf35944e8b66df80c985b8a1aa7004a2fd0b81ac251638977d2ff1465f23f93ac0ce56296f88fdc591bbdd7 -a735bd94d3be9d41fcd764ec0d8d7e732c9fc5038463f7728fd9d59321277e2c73a45990223bd571dab831545d46e7aa -94b32dcb86f5d7e83d70a5b48fe42c50f419be2f848f2d3d32ee78bf4181ab18077a7666eedb08607eece4de90f51a46 -a7f0804cafbf513293485afc1b53117f0cbfaea10919e96d9e4eb06f0c96535e87065d93f3def1bbc42044dbb00eb523 -aaaad1166d7f19f08583dd713275a71a856ab89312f84ca8078957664924bb31994b5c9a1210d0c41b085be4058ed52e -a1757aac9f64f953e68e680985a8d97c5aac8688b7d90f4db860166dd3d6119e8fca7d700a9530a2b9ba3932c5e74e33 -98cada5db4a1430c272bfc1065fb685872e664ed200d84060ee9f797d0a00864f23943e0fb84ba122a961996a73dfb14 -a5e609f716dc7729d1247f40f9368a2e4a15067e1dd6a231fece85eeefb7e7d4a5ac8918fb376debd79d95088750b2ca -b5365eb8caab8b1118619a626ff18ce6b2e717763f04f6fa8158cdca530c5779204efa440d088083f1a3685454aa0555 -a6e01b8da5f008b3d09e51a5375d3c87c1da82dff337a212223e4d0cdb2d02576d59f4eef0652d6b5f2fc806d8c8149c -ae310f613d81477d413d19084f117248ad756572c22a85b9e4c86b432e6c602c4a6db5edf2976e11f7353743d679e82a -a1f219c0b8e8bb8a9df2c6c030acbb9bbfa17ba3db0366f547da925a6abb74e1d7eb852bd5a34bae6ac61d033c37e9dc -a2087fa121c0cdd5ea495e911b4bc0e29f1d5c725aadfb497d84434d2291c350cdaa3dc8c85285f65a7d91b163789b7a -929c63c266da73d726435fa89d47041cfe39d4efa0edce7fc6eca43638740fbc82532fd44d24c7e7dd3a208536025027 -91c1051dcc5f52ad89720a368dddd2621f470e184e746f5985908ba34e1d3e8078a32e47ab7132be780bea5277afecb0 -ae089b90ba99894d5a21016b1ea0b72a6e303d87e59fb0223f12e4bb92262e4d7e64bfdbdb71055d23344bc76e7794b2 -8b69aa29a6970f9e66243494223bad07ac8f7a12845f60c19b1963e55a337171a67bdc27622153016fce9828473a3056 -95ca6b08680f951f6f05fd0d180d5805d25caf7e5bda21c218c1344e661d0c723a4dfc2493642be153793c1b3b2caaa4 -a4789dc0f2a07c794dab7708510d3c893d82ddbd1d7e7e4bbbeca7684d9e6f4520fb019b923a06c7efab0735f94aa471 -93c4f57a3cf75085f5656b08040f4cd49c40f1aab6384a1def4c5c48a9fe4c03514f8e61aabe2cfa399ff1ccac06f869 -b6c37f92c76a96b852cd41445aa46a9c371836dd40176cc92d06666f767695d2284a2780fdfd5efc34cf6b18bcfb5430 -9113e4575e4b363479daa7203be662c13d7de2debcda1c142137228aeead2c1c9bc2d06d93a226302fa63cc75b7353ec -b70addeb5b842ac78c70272137f6a1cef6b1d3a551d3dd906d9a0e023c8f49f9b6a13029010f3309d0b4c8623a329faf -b976a5132b7eb42d5b759c2d06f87927ef66ecd6c94b1a08e4c9e02a4ce7feca3ac91f9479daa1f18da3d4a168c2ba77 -8fdab795af64b16a7ddf3fad11ab7a85d10f4057cf7716784184960013baa54e7ba2050b0e036dc978ff8c9a25dc5832 -b2c982ad13be67d5cdc1b8fac555d4d1ec5d25f84e58b0553a9836f8f9e1c37582d69ad52c086a880a08b4efcccd552e -810661d9075ae6942735215f2ab46d60763412e1f6334e4e00564b6e5f479fc48cf37225512abbccf249c0ca225fc935 -a0c4bf00a20f19feff4004004f08231b4c6c86ac4ed57921eea28d7dea32034f3f4ab5b7ded7184f6c7ffbf5847232ad -b2bb5a9eea80bf067f3686a488529d9c2abd63fc9e1d4d921b1247ef86d40cd99e0a8b74f750e85c962af84e84e163a6 -887ee493c96d50f619ba190ce23acddc5f31913e7a8f1895e6339d03794ecefd29da5f177d1d25bc8df8337ae963fc7b -b7966fb07029d040f2228efa2cfcd04341e4666c4cf0b653e6e5708631aa2dd0e8c2ac1a62b50c5a1219a2737b82f4f7 -92234cfd6b07f210b82db868f585953aafbcbc9b07b02ded73ff57295104c6f44a16e2775ca7d7d8ee79babb20160626 -8d3cd7f09c6fd1072bc326ff329e19d856e552ac2a9f20274bc9752527cd3274142aa2e32b65f285fb84bc3adaaea3cc -8caed1cb90d8cd61e7f66edc132672172f4fa315e594273bb0a7f58a75c30647ec7d52eda0394c86e6477fbc352f4fe8 -ae192194b09e9e17f35d8537f947b56f905766c31224e41c632c11cd73764d22496827859c72f4c1ab5fd73e26175a5d -8b7be56aac76d053969e46882d80a254e89f55c5ab434883cbafc634a2c882375898074a57bc24be3c7b2c56401a7842 -98bc4a7a9b05ba19f6b85f3ee82b08bed0640fd7d24d4542eb7a7f7fde443e880bdb6f5499bd8cb64e1ddd7c5f529b19 -a5a41eaa5e9c1d52b00d64ab72bc9def6b9d41972d80703e9bfe080199d4e476e8833a51079c6b0155b78c3ab195a2a7 -a0823f6f66465fd9be3769c164183f8470c74e56af617f8afd99b742909d1a51f2e0f96a84397597afbd8eeaabb51996 -801da41d47207bdd280cc4c4c9753a0f0e9d655e09e0be5f89aeed4ce875a904f3da952464399bf8efc2398940d5fba2 -a719314085fd8c9beac4706c24875833d59a9a59b55bca5da339037c0a5fc03df46dbecb2b4efcfed67830942e3c4ea1 -a75dde0a56070bb7e9237b144ea79f578d413a1cbbd1821cee04f14f533638b24f46d88a7001e92831843b37ed7a709f -a6b4ef8847a4b980146e1849e1d8ab38695635e0394ca074589f900ce41fa1bb255938dc5f37027523bac6a291779bef -b26d84dfd0b7bd60bcfdbea667350462a93dca8ff5a53d6fc226214dcb765fada0f39e446a1a87f18e4e4f4a7133155f -ae7bd66cc0b72f14ac631ff329a5ca4958a80ba7597d6da049b4eb16ac3decde919ca5f6f9083e6e541b303fb336dc2f -a69306e6bfbbc10de0621cffb13c586e2fcfd1a80935e07c746c95651289aec99066126a6c33cb8eb93e87d843fc631f -a47e4815585865218d73c68ba47139568ea7ae23bfa863cb914a68454242dd79beaec760616b48eea74ceab6df2298dd -b2da3cfb07d0721cd226c9513e5f3ace98ed2bc0b198f6626b8d8582268e441fa839f5834f650e2db797655ca2afa013 -b615d0819554f1a301a704d3fc4742bd259d04ad75d50bccee3a949b6226655f7d623301703506253cca464208a56232 -85e06ed5797207f0e7ae85909e31776eb9dae8af2ec39cc7f6a42843d94ea1de8be2a3cdadfcbe779da59394d4ffeb45 -8c3529475b5fdbc636ee21d763f5ec11b8cb040a592116fb609f8e89ca9f032b4fa158dd6e9ceab9aceb28e067419544 -accddb9c341f32be82b6fa2ef258802c9ae77cd8085c16ec6a5a83db4ab88255231b73a0e100c75b7369a330bfc82e78 -93b8e4c6e7480948fa17444b59545a5b28538b8484a75ad6bc6044a1d2dbd76e7c44970757ca53188d951dc7347d6a37 -90111721d68b29209f4dc4cfb2f75ab31d15c55701922e50a5d786fb01707ab53fcec08567cd366362c898df2d6e0e93 -b60a349767df04bd15881c60be2e5cc5864d00075150d0be3ef8f6b778715bebca8be3be2aa9dbdc49f1a485aeb76cda -b8d5a967fdd3a9bcf89a774077db39ef72ca9316242f3e5f2a350202102d494b2952e4c22badecd56b72ba1eea25e64b -8499ebd860f31f44167183b29574447b37a7ee11efcc9e086d56e107b826b64646b1454f40f748ccac93883918c89a91 -99c35e529782db30f7ccab7f31c225858cf2393571690b229ece838ec421a628f678854a1ddbd83fa57103ccebd92c7f -99817660d8b00cbe03ec363bcdc5a77885586c9e8da9e01a862aca0fc69bf900c09b4e929171bc6681681eae10450541 -8055e130964c3c2ebd980d3dc327a40a416bcdbf29f480480a89a087677a1fb51c823b57392c1db72f4093597100b8d3 -877eaddef845215f8e6f9ed24060c87e3ab6b1b8fbb8037d1a57e6a1e8ed34d00e64abb98d4bf75edb5c9788cbdccbef -b5432bbff60aeae47f2438b68b123196dfb4a65cc875b8e080501a4a44f834b739e121bec58d39ac36f908881e4aa8ab -b3c3f859b7d03ff269228c0f9a023b12e1231c73aba71ad1e6d86700b92adc28dfa3757c052bbc0ba2a1d11b7fda4643 -ab8a29f7519a465f394ef4a5b3d4924d5419ca1489e4c89455b66a63ac430c8c9d121d9d2e2ed8aa1964e02cd4ebac8c -866ae1f5c2a6e159f2e9106221402d84c059f40d166fab355d970773189241cd5ee996540d7c6fc4faf6f7bcff967dce -973a63939e8f1142a82b95e699853c1e78d6e05536782b9bb178c799b884f1bc60177163a79a9d200b5ff4628beeb9e7 -a5fc84798d3e2d7632e91673e89e968f5a67b7c8bb557ea467650d6e05e7fe370e18d9f2bdd44c244978295cf312dc27 -b328fe036bcd0645b0e6a15e79d1dd8a4e2eda128401a4e0a213d9f92d07c88201416fc76193bb5b1fe4cb4203bab194 -99239606b3725695a570ae9b6fb0fb0a34ad2f468460031cfa87aa09a0d555ff606ff204be42c1596c4b3b9e124b8bd6 -af3432337ca9d6cce3574e23e5b7e4aa8eda11d306dc612918e970cc7e5c756836605a3391f090a630bac0e2c6c42e61 -8a545b3cb962ce5f494f2de3301de99286c4d551eaa93a9a1d6fef86647321834c95bf754c62ec6c77116a21494f380d -8f9b8ea4c25469c93556f1d91be583a5f0531ac828449b793ba03c0a841c9c73f251f49dd05cbb415f5d26e6f6802c99 -a87199e33628eeffd3aff114e81f53dd54fba61ba9a9a4d7efdbff64503f25bc418969ab76ef1cf9016dd344d556bb29 -a2fda05a566480602274d7ffcaefdd9e94171286e307581142974f57e1db1fa21c30be9e3c1ac4c9f2b167f92e7c7768 -a6235d6a23304b5c797efb2b476ed02cb0f93b6021a719ae5389eb1e1d032944ae4d69aec2f29fcd6cbc71a6d789a3ba -a7f4a73215f7e99e2182c6157dd0f22e71b288e696a8cff2450689a3998f540cfb82f16b143e90add01b386cb60d8a33 -922d8f9cd55423f5f6a60d26de2f8a396ac4070a6e2dc956e50c2a911906aa364d4718aea29c5b61c12603534e331e7e -96d7fdf5465f028fc28f21fbfe14c2db2061197baf26849e6a0989a4ea7d5e09ab49a15ba43a5377b9354d01e30ce860 -8f94c4255a0fc1bd0fa60e8178c17f2a8e927cac7941c5547d2f8f539e7c6ed0653cab07e9fb1f2c56cdd03bb876512a -95984c10a2917bfa6647ebce69bf5252d9e72d9d15921f79b2c6d7c15ee61342b4fb8a6d34838e07132b904f024ded04 -93e65e765a574277d3a4d1d08ca2f2ff46e9921a7806ca8ca3d8055f22d6507744a649db7c78117d9168a1cbdb3bbc61 -8d453b7364662dc6f36faf099aa7cbbe61151d79da7e432deba7c3ed8775cfe51eaf1ba7789779713829dde6828e189a -acffa3ee6c75160286090162df0a32a123afb1f9b21e17fd8b808c2c4d51a4270cab18fba06c91ef9d22e98a8dc26cdd -a5597cc458186efa1b3545a3926f6ecaaa6664784190e50eed1feac8de56631bee645c3bac1589fa9d0e85feb2be79d4 -87ba9a898df9dfa7dabc4ab7b28450e4daf6013340e329408d1a305de959415ab7315251bad40511f917dfc43974e5f0 -a598778cf01d6eef2c6aabc2678e1b5194ee8a284ebd18a2a51a3c28a64110d5117bcbf68869147934e600572a9e4c8a -84c69a4ad95861d48709f93ade5ac3800f811b177feb852ebcd056e35f5af5201f1d8a34ab318da8fe214812d0a7d964 -9638a237e4aed623d80980d91eda45e24ebf48c57a25e389c57bd5f62fa6ffa7ca3fb7ae9887faf46d3e1288af2c153b -800f975721a942a4b259d913f25404d5b7b4c5bf14d1d7e30eee106a49cb833b92058dab851a32ee41faf4ef9cb0dea4 -b9127a34a59fed9b5b56b6d912a29b0c7d3cb9581afc9bd174fc308b86fdb076f7d436f2abc8f61cef04c4e80cd47f59 -8004eda83f3263a1ccfc8617bc4f76305325c405160fb4f8efeff0662d605e98ba2510155c74840b6fe4323704e903c4 -aa857b771660d6799ff03ccad1ab8479e7f585a1624260418fc66dc3e2b8730cfa491d9e249505141103f9c52f935463 -98b21083942400f34cde9adbe1977dee45ba52743dc54d99404ad9da5d48691ddea4946f08470a2faad347e9535690c7 -a4b766b2faec600a6305d9b2f7317b46f425442da0dc407321fc5a63d4571c26336d2bccedf61097f0172ec90fb01f5f -b9736619578276f43583de1e4ed8632322ea8a351f3e1506c5977b5031d1c8ad0646fb464010e97c4ddb30499ddc3fb0 -973444ffaff75f84c17f9a4f294a13affd10e2bceed6b4b327e4a32c07595ff891b887a9f1af34d19766d8e6cb42bfd1 -b09ce4964278eff81a976fbc552488cb84fc4a102f004c87179cb912f49904d1e785ecaf5d184522a58e9035875440ef -b80c2aa3d0e52b4d8b02c0b706e54b70c3dbca80e5e5c6a354976721166ea0ca9f59c490b3e74272ef669179f53cb50d -8e52fa5096ff960c0d7da1aa4bce80e89527cdc3883eba0c21cb9a531088b9d027aa22e210d58cf7cbc82f1ec71eb44f -969f85db95f455b03114e4d3dc1f62a58996d19036513e56bee795d57bf4ed18da555722cd77a4f6e6c1a8e5efe2f5d7 -ab84b29b04a117e53caea394a9b452338364c45a0c4444e72c44132a71820b96a6754828e7c8b52282ad8dca612d7b6a -83e97e9ab3d9e453a139c9e856392f4cef3ec1c43bce0a879b49b27a0ce16f9c69063fd8e0debbe8fabafc0621bc200c -8c138ebdf3914a50be41be8aa8e2530088fb38af087fa5e873b58b4df8e8fd560e8090c7a337a5e36ef65566409ad8f3 -a56da9db2f053516a2141c1a8ed368ae278ab33a572122450249056857376d1dffc76d1b34daf89c86b6fe1ead812a0c -a3233ea249f07531f5bc6e94e08cea085fd2b2765636d75ff5851f224f41a63085510db26f3419b031eb6b5143735914 -b034bb6767ce818371c719b84066d3583087979ba405d8fbb2090b824633241e1c001b0cb0a7856b1af7a70e9a7b397e -8722803fe88877d14a4716e59b070dd2c5956bb66b7038f6b331b650e0c31230c8639c0d87ddc3c21efc005d74a4b5cc -8afe664cb202aacf3bd4810ebf820c2179c11c997f8c396692a93656aa249a0df01207c680157e851a30330a73e386b9 -a999e86319395351d2b73ff3820f49c6516285e459224f82174df57deb3c4d11822fd92cbbed4fc5a0a977d01d241b19 -9619408e1b58b6610d746b058d7b336d178e850065ba73906e08e748651e852f5e3aab17dcadcb47cc21ff61d1f02fcf -947cf9c2ed3417cd53ea498d3f8ae891efe1f1b5cd777e64cec05aba3d97526b8322b4558749f2d8a8f17836fb6e07aa -aec2fdae2009fda6852decb6f2ff24e4f8d8ca67c59f92f4b0cf7184be72602f23753ed781cf04495c3c72c5d1056ffe -8dba3d8c09df49fbfc9506f7a71579348c51c6024430121d1c181cad7c9f7e5e9313c1d151d46d4aa85fb0f68dd45573 -b6334cb2580ae33720ebf91bb616294532a1d1640568745dcda756a3a096786e004c6375728a9c2c0fb320441e7d297a -9429224c1205d5ecd115c052b701c84c390f4e3915275bb8ce6504e08c2e9b4dd67b764dd2ea99f317b4c714f345b6ff -abe421db293f0e425cfd1b806686bdfd8fdbac67a33f4490a2dc601e0ddbf69899aa9a119360dad75de78c8c688ca08b -95c78bffed9ae3fff0f12754e2bd66eb6a9b6d66a9b7faaeb7a1c112015347374c9fe6ce14bf588f8b06a78e9a98f44c -ac08f8b96b52c77d6b48999a32b337c5ad377adf197cda18dbdf6e2a50260b4ee23ca6b983f95e33f639363e11229ee4 -911a0e85815b3b9f3ba417da064f760e84af94712184faeb9957ddd2991dee71c3f17e82a1a8fbeec192b0d73f0ebce7 -aa640bd5cb9f050568a0ad37168f53b2f2b13a91e12b6980ca47ae40289cf14b5b89ddd0b4ca452ce9b1629da0ce4b5d -907486f31b4ecea0125c1827007ea0ecb1c55cadb638e65adc9810ca331e82bb2fd87e3064045f8d2c5d93dc6c2f5368 -8cbfaf4ce0bbbf89208c980ff8b7bc8f3cfef90f0fe910f463cb1c0f8e17cce18db120142d267045a00ba6b5368f0dd3 -9286f08f4e315df470d4759dec6c9f8eacef345fc0c0b533ad487bb6cfefa8c6c3821a22265c9e77d34170e0bc0d078b -94a3c088bc1a7301579a092b8ece2cefc9633671bc941904488115cd5cb01bd0e1d2deef7bdccb44553fd123201a7a53 -8f3d0114fbf85e4828f34abb6d6fddfa12789d7029d9f1bb5e28bc161c37509afdab16c32c90ec346bc6a64a0b75726f -a8ed2d774414e590ec49cb9a3a726fafd674e9595dd8a1678484f2897d6ea0eea1a2ee8525afac097b1f35e5f8b16077 -9878789ff33b11527355a317343f34f70c7c1aa9dc1eca16ca4a21e2e15960be8a050ec616ffb97c76d756ce4bce2e90 -854e47719dae1fe5673cacf583935122139cf71a1e7936cf23e4384fbf546d48e9a7f6b65c3b7bf60028e5aa1234ba85 -af74bdda2c6772fe9a02d1b95e437787effad834c91c8174720cc6e2ea1f1f6c32a9d73094fc494c0d03eef60b1a0f05 -80a3e22139029b8be32cb167d3bc9e62d16ca446a588b644e53b5846d9d8b7ab1ad921057d99179e41515df22470fb26 -86c393afd9bd3c7f42008bba5fe433ec66c790ebd7aa15d4aeaf9bb39a42af3cfaf8c677f3580932bbd7ada47f406c8c -90433c95c9bb86a2c2ddcf10adccb521532ebd93db9e072671a4220f00df014e20cd9ce70c4397567a439b24893808dc -95b2c170f08c51d187270ddc4f619300b5f079bbc89dbca0656eae23eecc6339bf27fa5bf5fd0f5565d4021105e967d2 -8e5eced897e2535199951d4cff8383be81703bca3818837333dd41a130aa8760156af60426ceadb436f5dea32af2814c -a254a460ebefbe91d6e32394e1c8f9075f3e7a2bb078430ac6922ab14d795b7f2df1397cb8062e667d809b506b0e28d4 -ac2062e8ca7b1c6afb68af0ebab31aebd56fc0a0f949ef4ea3e36baf148681619b7a908facf962441905782d26ecbdb5 -8b96af45b283b3d7ffeec0a7585fc6b077ea5fd9e208e18e9f8997221b303ab0ce3b5bafa516666591f412109ce71aa5 -afd73baada5a27e4fa3659f70083bf728d4dc5c882540638f85ea53bf2b1a45ddf50abc2458c79f91fb36d13998c7604 -a5d2fff226e80cb2e9f456099812293333d6be31dd1899546e3ad0cd72b2a8bcb45ec5986e20faa77c2564b93983210c -a8c9b8de303328fbdaccf60f4de439cf28f5360cf4104581dc2d126bc2e706f49b7281723487ff0eaf92b4cc684bc167 -a5d0d5849102bf1451f40e8261cb71fc57a49e032773cb6cd7b137f71ee32438d9e958077ffafce080a116ccc788a2d4 -80716596f502d1c727d5d2f1469ce35f15e2dbd048d2713aa4975ee757d09c38d20665326bd63303cfe7e820b6de393d -97baf29b20f3719323cc1d5de23eaa4899dc4f4e58f6c356ec4c3ad3896a89317c612d74e0d3ab623fe73370c5972e2f -b58bdc9aa5061bf6e5add99a7443d7a8c7ba8f6875b8667d1acbe96fc3ecafbdcc2b4010cb6970a3b849fff84660e588 -b6be68728776d30c8541d743b05a9affc191ad64918fdbd991d2ddd4b32b975c4d3377f9242defef3805c0bfb80fbac7 -b0cddace33333b8a358acad84b9c83382f0569d3854b4b34450fd6f757d63c5bdab090e330b0f86e578f22c934d09c36 -854bd205d6051b87f9914c8c2494075d7620e3d61421cc80f06b13cea64fd1e16c62c01f107a5987d10b8a95a8416ad9 -80351254a353132300ba73a3d23a966f4d10ce9bf6eae82aedb6cdc30d71f9d08a9dd73cb6441e02a7b2ad93ad43159c -937aae24fb1b636929453fc308f23326b74c810f5755d9a0290652c9c2932ad52cc272b1c83bd3d758ef7da257897eae -b84d51ef758058d5694ffeac6d8ce70cef8d680a7902f867269c33717f55dd2e57b25347841d3c0872ae5f0d64f64281 -a4b31bb7c878d5585193535b51f04135108134eff860f4eac941053155f053d8f85ff47f16268a986b2853480a6e75e6 -93543f0828835186a4af1c27bdf97b5dd72b6dfa91b4bf5e759ff5327eaf93b0cb55d9797149e465a6b842c02635ffe5 -afdac9e07652bf1668183664f1dd6818ef5109ee9b91827b3d7d5970f6a03e716adcc191e3e78b0c474442a18ad3fc65 -9314077b965aa2977636ae914d4a2d3ce192641a976ffa1624c116828668edbfbe5a09e3a81cb3eed0694566c62a9757 -b395ddcf5082de6e3536825a1c352802c557b3a5118b25c29f4c4e3565ecaaf4bdd543a3794d05156f91fc4ceadc0a11 -b71f774aad394c36609b8730e5be244aaebfff22e0e849acc7ee9d33bedc3ec2e787e0b8b2ffe535560fcd9e15a0897e -92e9409fa430f943a49bce3371b35ac2efb5bc09c88f70ff7120f5e7da3258a4387dfc45c8b127f2ef2668679aeb314e -8ef55bef7b71952f05e20864b10f62be45c46e2dca0ef880a092d11069b8a4aa05f2e0251726aca1d5933d7dea98f3f8 -aad3fba9e09fae885cdeef45dfafa901419f5156fb673818f92a4acc59d0e2e9870b025e711de590a63fd481164f3aa8 -b444d52af545dd3a2d3dd94e6613816b154afea0c42b96468aceb0c721395de89e53e81a25db857ca2e692dcb24ba971 -88b279fe173007e64fe58f2c4adba68a1f538dbd3d32d175aa0d026bbb05b72a0c9f5d02b8201a94adb75fe01f6aa8b2 -88494cea4260741c198640a079e584cabfea9fcfb8bcf2520c9becd2419cde469b79021e5578a00d0f7dbc25844d2683 -94f3cce58837c76584b26426b9abdb45f05fee34dd9e5914b6eae08e78b7262ed51c4317031dab1ad716f28b287f9fc2 -b8c7ed564f54df01c0fbd5a0c741beed8183ce0d7842dc3a862a1b335de518810077314aa9d6054bb939663362f496da -81c153320d85210394d48340619d5eb41304daea65e927266f0262c8a7598321aba82ad6c3f78e5104db2afd2823baca -ab6695a8d48a179e9cd32f205608359cf8f6a9aead016252a35b74287836aa395e76572f21a3839bec6a244aa49573e5 -920ed571539b3002a9cd358095b8360400e7304e9a0717cc8c85ab4a0514a8ad3b9bf5c30cb997647066f93a7e683da9 -a7ec7c194d1e5103bc976e072bf1732d9cb995984d9a8c70a8ee55ce23007f21b8549ad693f118aa974f693ed6da0291 -87a042d6e40c2951a68afc3ccf9646baf031286377f37f6ac47e37a0ec04d5ac69043757d7dff7959e7cd57742017a8d -b9f054dd8117dd41b6e5b9d3af32ee4a9eebef8e4a5c6daa9b99c30a9024eabeae850ab90dbdb188ca32fd31fd071445 -a8386da875799a84dc519af010eaf47cdbc4a511fe7e0808da844a95a3569ce94054efd32a4d3a371f6aba72c5993902 -8b3343a7cf4ffb261d5f2dbd217fb43590e00feac82510bdf73b34595b10ee51acae878a09efebc5a597465777ef4c05 -8312a5f1ea4f9e93578e0f50169286e97884a5ed17f1780275ab2b36f0a8aa1ab2e45c1de4c8bce87e99e3896af1fa45 -b461198cb7572ac04c484a9454954e157bdd4db457816698b7290f93a10268d75a7e1211e757c6190df6144bbb605d91 -9139764a099580d6f1d462c8bf7d339c537167be92c780e76acb6e638f94d3c54b40ed0892843f6532366861e85a515a -8bb70acb3c9e041b4fc20e92ba0f3f28f0d5c677bcb017af26f9171e07d28c3c0729bef72457231e3512f909455a13a2 -93301a18e5064c55fcfe8e860fab72da1b89a824ca77c8932023b7c79e4a51df93a89665d308a8d3aa145e46ebe6a0ad -ae3bca496fbd70ce44f916e2db875b2ce2e1ded84edd2cebc0503bdfdec40ec30e1d9afb4eb58c8fa23f7b44e71d88f8 -93cb3a918c95c5d973c0cb7621b66081ed81fba109b09a5e71e81ca01ec6a8bb5657410fdec453585309ef5bf10d6263 -95a50b9b85bb0fc8ff6d5f800d683f0f645e7c2404f7f63228a15b95ce85a1f8100e2e56c0acee19c36ed3346f190e87 -816cc4d9337461caca888809b746ab3713054f5b0eac823b795a1a9de9417c58e32a9f020fef807908fa530cbf35dee8 -a9c2890c2dd0d5d7aedc4cca7f92764086c50f92f0efd2642c59920d807086031bfe2d3ba574318db236c61a8f5f69c2 -ad0d5c8c80bddfe14bdaf507da96dc01dc9941aecc8ad3b64513d0a00d67c3f4b4659defb6839b8b18d8775e5344c107 -9047c9fad6ef452e0219e58e52c686b620e2eb769571021e3524bd7eac504f03b84834b16b849d42b3d75c601fd36bb7 -a04dd988fed91fb09cb747a3ac84efe639d7d355524cd7dee5477ecbcdec44d8ac1cec2c181755dcfdb77e9594fb3c5b -b0ea0c725debd1cec496ced9ce48f456f19af36e8b027094bf38fa37de9b9b2d10282363ea211a93a34a0a5387cace5d -b5fc46e2bb3e4653ea5e6884dcb3c14e401a6005685ee5a3983644b5b92300b7066289159923118df4332aac52045b8c -841fc5b26b23226e725e29802da86b35e4f5e3babc8b394f74e30fd5dec6d3840b19a9a096625ce79a4f1edae6369700 -8fd2bbbeea452451def3659bbe0ceb396120ebe8f81eee1ea848691614422c81d7c3e6a7a38032b4120b25c5ffa8f0c2 -9131ce3d25c3d418f50c0ab99e229d4190027ee162b8ba7c6670420ea821831dec1294ac00d66c50fac61c275a9e2c71 -99ec6eafe0eb869d128158cee97b984fb589e1af07699247946e4a85db772289dff3084d224a6f208005c342f32bbd73 -ac100fbbe7c2bf00cc56fcd5aa1f27181f82c150c53bbb1e15d2c18a51ed13dcfa7bccab85821b8ddddf493603e38809 -affd73a458d70c0d9d221e0c2da4348fed731f6b34c0b3e2d5711ba432e85a1ec92e40b83b246a9031b61f5bc824be47 -8ed30ed817816a817e9e07374ef1f94405a7e22dd0096aeaae54504382fc50e7d07b4f1186c1792fc25ea442cd7edc6b -a52370cfe99a35fa1405aeca9f922ad8d31905e41f390e514ea8d22ee66469637d6c2d4d3a7ee350d59af019ae5a10a4 -8d0b439741c57b82c8e4b994cf3956b5aeaee048b17e0a1edb98253a8d7256f436d8b2f36b7e12504132dbf91f3376b1 -8caac7e1a4486c35109cff63557a0f77d0e4ca94de0817e100678098a72b3787a1c5afc7244991cebcd1f468e18d91d4 -a729a8e64b7405db5ebfb478bb83b51741569331b88de80680e9e283cc8299ba0de07fcf252127750f507e273dc4c576 -a30545a050dad030db5583c768a6e593a7d832145b669ad6c01235813da749d38094a46ac3b965700230b8deacd91f82 -9207e059a9d696c46fa95bd0925983cd8e42aefd6b3fb9d5f05420a413cbc9e7c91213648554228f76f2dd757bde0492 -a83fa862ae3a8d98c1e854a8b17181c1025f4f445fbc3af265dc99e44bbd74cfa5cc25497fb63ee9a7e1f4a624c3202c -84cdfc490343b3f26b5ad9e1d4dcf2a2d373e05eb9e9c36b6b7b5de1ce29fda51383761a47dbd96deca593a441ccb28e -881a1aa0c60bb0284a58b0a44d3f9ca914d6d8fa1437315b9ad2a4351c4da3ee3e01068aa128284a8926787ea2a618d1 -aace78e497b32fbff4df81b1b2de69dbc650645e790953d543282cb8d004a59caf17d9d385673a146a9be70bf08a2279 -aa2da4760f1261615bffd1c3771c506965c17e6c8270c0f7c636d90428c0054e092247c3373eca2fb858211fdb17f143 -acb79f291b19e0aa8edb4c4476a172834009c57e0dcc544c7ce95084488c3ad0c63ffd51c2b48855e429b6e1a9555433 -814b58773a18d50a716c40317f8b80362b6c746a531776a9251c831d34fb63e9473197c899c0277838668babc4aa0ecb -b1f69522b0f7657d78bd1ee3020bcce3447116bf62c146d20684537d36cafb5a7a1531b86932b51a70e6d3ce0808a17e -8549712c251ef382f7abe5798534f8c8394aa8bcecdca9e7aa1a688dc19dc689dcd017a78b118f3bd585673514832fe4 -912a04463e3240e0293cfc5234842a88513ff930c47bd6b60f22d6bc2d8404e10270d46bf6900fee338d8ac873ebb771 -a327cb7c3fada842e5dd05c2eeedd6fcd8cf2bfb2f90c71c6a8819fb5783c97dd01bd2169018312d33078b2bc57e19f7 -b4794f71d3eceed331024a4cee246cc427a31859c257e0287f5a3507bfbd4d3486cb7781c5c9c5537af3488d389fe03e -82ffcb418d354ed01688e2e8373a8db07197a2de702272a9f589aed08468eab0c8f14e6d0b3146e2eb8908e40e8389c5 -910b73421298f1315257f19d0dfd47e79d7d2a98310fb293f704e387a4dc84909657f0f236b70b309910271b2f2b5d46 -a15466397302ea22f240eb7316e14d88376677b060c0b0ae9a1c936eb8c62af8530732fc2359cfd64a339a1c564f749b -a8091975a0d94cdc82fbaff8091d5230a70d6ea461532050abbdfee324c0743d14445cfe6efe6959c89a7c844feaa435 -a677d1af454c7b7731840326589a22c9e81efbbf2baf3fdeaf8ea3f263a522584fbca4405032c4cdf4a2a6109344dfc8 -894e6ffa897b6e0b37237e6587a42bbc7f2dd34fb09c2e8ac79e2b25b18180e158c6dc2dd26761dba0cfed1fb4eb4080 -928d31b87f4fe8fe599d2c9889b0ff837910427ba9132d2fba311685635458041321ae178a6331ed0c398efe9d7912f0 -afc1c4a31f0db24b53ee71946c3c1e1a0884bd46f66b063a238e6b65f4e8a675faa844e4270892035ef0dae1b1442aa0 -a294fcb23d87cf5b1e4237d478cac82ba570649d425b43b1e4feead6da1f031e3af0e4df115ca46689b9315268c92336 -85d12fd4a8fcfd0d61cbf09b22a9325f0b3f41fb5eb4285b327384c9056b05422d535f74d7dc804fb4bab8fb53d556bd -91b107d9b0ea65c48128e09072acd7c5949a02dd2a68a42ff1d63cf528666966f221005c2e5ca0a4f85df28459cdede6 -89aa5dc255c910f439732fcd4e21341707e8dd6689c67c60551a8b6685bd3547e3f47db4df9dfadd212405f644c4440b -8c307d6b827fa1adcf0843537f12121d68087d686e9cc283a3907b9f9f36b7b4d05625c33dab2b8e206c7f5aabd0c1e5 -843f48dadf8523d2b4b0db4e01f3c0ea721a54d821098b578fcaa6433e8557cadfea50d16e85133fa78f044a3e8c1e5b -9942eb8bd88a8afa9c0e3154b3c16554428309624169f66606bfb2814e8bac1c93825780cf68607f3e7cffe7bf9be737 -b7edb0c7637a5beb2332f2ae242ba4732837f9da0a83f00f9e9a77cf35516e6236eb013133ddc2f958ea09218fe260d3 -9655fe4910bc1e0208afbcf0ff977a2e23faded393671218fba0d9927a70d76514a0c45d473a97ecb00cf9031b9d527c -8434bc8b4c5839d9e4404ff17865ded8dd76af56ef2a24ea194c579d41b40ed3450c4e7d52219807db93e8e6f001f8da -b6c6d844860353dab49818bed2c80536dbc932425fdaa29915405324a6368277cf94d5f4ab45ea074072fc593318edff -b2887e04047660aa5c83aad3fa29b79c5555dd4d0628832c84ba7bf1f8619df4c9591fcde122c174de16ca7e5a95d5e3 -953ba5221360444b32911c8b24689078df3fbf58b53f3eec90923f53a22c0fc934db04dd9294e9ec724056076229cf42 -926917529157063e4aade647990577394c34075d1cb682da1acf600639d53a350b33df6a569d5ebb753687374b86b227 -b37894a918d6354dd28f850d723c1c5b839f2456e2a220f64ecadac88ae5c9e9cf9ab64b53aac7d77bf3c6dfa09632dc -b9d28148c2c15d50d1d13153071d1f6e83c7bb5cb5614adf3eb9edede6f707a36c0fa0eadb6a6135ead3c605dfb75bd1 -9738d73ea0b9154ed38da9e6bd3a741be789ea882d909af93e58aa097edf0df534849f3b1ba03099a61ceb6a11f34c4d -afabbecbbf73705851382902ec5f1da88b84a06b3abfb4df8d33df6a60993867f853d0d9bd324d49a808503615c7858a -a9e395ddd855b12c87ba8fdb0ea93c5bd045e4f6f57611b27a2ee1b8129efe111e484abc27cb256ed9dcace58975d311 -b501c2f3d8898934e45e456d36a8a5b0258aeea6ff7ac46f951f36da1ec01bd6d0914c4d83305eb517545f1f35e033cc -86f79688315241fe619b727b7f426dbd27bcc8f33aef043438c95c0751ada6f4cd0831b25ae3d53bcf61324d69ea01eb -83237e42fa773a4ccaa811489964f3fab100b9eea48c98bdef05fa119a61bde9efe7d0399369f87c775f4488120b4f2e -b89f437552cab77d0cd5f87aca52dd827fb6648c033351c00ab6d40ac0b1829b4fcdf8a7dad467d4408c691223987fbe -8e21061698cb1a233792976c2d8ab2eeb6e84925d59bb34434fff688be2b5b2973d737d9dda164bd407be852d48ef43f -b17a9e43aa4580f542e00c3212fbf974f1363f433c5502f034dfd5ed8c05ac88b901729d3b822bec391cca24cc9f5348 -aac6d6cda3e207006c042a4d0823770632fc677e312255b4aff5ad1598dc1022cab871234ad3aa40b61dc033a5b0930b -b25e69f17b36a30dada96a39bc75c0d5b79d63e5088da62be9fcbddfd1230d11654890caa8206711d59836d6abbc3e03 -af59fe667dd9e7e4a9863c994fc4212de4714d01149a2072e97197f311be1f39e7ad3d472e446dcc439786bf21359ede -957952988f8c777516527b63e0c717fc637d89b0fd590bcb8c72d0e8a40901598930c5b2506ff7fea371c73a1b12a9be -a46becd9b541fc37d0857811062ca1c42c96181c7d285291aa48dc2f6d115fcff5f3dfdf4490d8c619da9b5ce7878440 -87168fbd32c01a4e0be2b46fe58b74d6e6586e66bbb4a74ad94d5975ac09aa6fa48fd9d87f1919bd0d37b8ebe02c180c -895c4aa29de9601fc01298d54cfb62dd7b137e6f4f6c69b15dc3769778bfba5fc9cbd2fc57fd3fad78d6c5a3087f6576 -b9cf19416228230319265557285f8da5b3ca503de586180f68cf055407d1588ecec2e13fc38817064425134f1c92b4d5 -9302aaef005b22f7b41a0527b36d60801ff6e8aa26fe8be74685b5f3545f902012fcade71edca7aaa0560296dac5fca5 -a0ccda9883027f6b29da1aaa359d8f2890ce1063492c875d34ff6bf2e7efea917e7369d0a2b35716e5afd68278e1a93a -a086ac36beeba9c0e5921f5a8afea87167f59670e72f98e788f72f4546af1e1b581b29fbdd9a83f24f44bd3ec14aee91 -8be471bf799cab98edf179d0718c66bbc2507d3a4dac4b271c2799113ce65645082dc49b3a02a8c490e0ef69d7edbcb1 -8a7f5b50a18baf9e9121e952b65979bda5f1c32e779117e21238fb9e7f49e15008d5c878581ac9660f6f79c73358934a -b3520a194d42b45cbab66388bee79aad895a7c2503b8d65e6483867036497d3e2e905d4d51f76871d0114ec13280d82f -8e6ca8342ec64f6dbe6523dc6d87c48065cd044ea45fa74b05fff548539fd2868eb6dd038d38d19c09d81d5a96364053 -b126a0e8263a948ba8813bf5fb95d786ae7d1aa0069a63f3e847957822b5fe79a3a1afa0ce2318b9ba1025f229a92eb7 -8e4461d6708cac53441a3d23ac4b5ff2b9a835b05008c26d7d9c0562a29403847cf760b7e9d0bcb24a6f498d2a8a9dd2 -b280a761bab256dfe7a8d617863999e3b4255ddbdc11fe7fe5b3bb9633fc8f0cb4f28e594d3b5b0b649c8e7082c4666a -a3e3043bfd7461e38088ee6a165d2ca015de98350f1cb0efc8e39ed4fcdb12a717f0ede7fbf9dadb90496c47652cc0ce -a4c1f5b1b88ae3c397d171e64395afe0cd13c717677775a01dd0461d44a04ee30ec3da58a54c89a3ca77b19b5e51062c -a268638e0655b6d5a037061808619b9ae276bb883999d60c33a9f7f872c46d83d795d1f302b4820030c57604fa3686e7 -ac20176111c5c6db065668987227658c00a1572ce21fe15f25e62d816b56472c5d847dd9c781fb293c6d49cc33b1f98f -acc0e22d9b6b45c968c22fd16b4ece85e82a1b0ab72369bdd467857fee1a12b9635f5b339a9236cbd1acc791811d0e29 -b56066e522bee1f31480ff8450f4d469ace8eb32730c55b7c9e8fa160070bdec618454e665b8cbc5483bc30b6cebbfb9 -8c1772bdfacff85f174d35c36f2d2182ae7897ad5e06097511968bbb136b626c0c7e462b08a21aca70f8e456b0204bf8 -b4de3cf4a064bf589be92513b8727df58f2da4cd891580ef79635ac8c195f15a6199327bb41864e2f614c8589b24f67e -8f3c534125613f2d17bf3e5b667c203cb3eab0dbca0638e222fe552fddf24783965aa111de844e8c3595304bfc41c33b -8e445b2711987fe0bf260521cb21a5b71db41f19396822059912743bf6ca146100c755c8b6e0e74f1bf2e34c03b19db9 -87ff9adf319adb78c9393003b5bdda08421f95551d81b37520b413fe439e42acf82d47fa3b61476b53166bf4f8544f0e -83f3c00c55632e1937dcdc1857de4eccd072efa319b3953d737e1d37382b3cf8343d54a435588eb75aa05bf413b4caa0 -b4d8ee1004bac0307030b8605a2e949ca2f8d237e9c1dcf1553bd1eb9b4156e2deb8c79331e84d2936ec5f1224b8b655 -93b2812b6377622e67bf9a624898227b56ebe3c7a1d917487fc9e4941f735f83679f7ac137065eb4098ad1a4cfbc3892 -81943d9eab6dcea8a120dde5356a0a665b1466709ebb18d1cbfa5f213a31819cb3cf2634e6d293b5b13caa158a9bb30b -a9042aae02efd4535681119e67a60211fc46851319eb389b42ebadcab1229c94199091fb1652beba3434f7b98c90785f -91db52b27fd9b1715df202106b373c4e63ce8ec7db8c818c9016ace5b08ef5f8c27e67f093395937ba4ce2f16edf9aef -83cb9b7b94bd6ead3ff2a7d40394f54612c9cb80c4e0adadffea39e301d1052305eb1fe0f7467268b5aba3b423a87246 -8720fd6712a99d92dd3fdaae922743ab53fad50d183e119a59dae47cdac6fbea6064c732d02cb341eaea10723db048fa -8d40022c1254462a2ac2380a85381c370b1221e5a202d95c75bccba6d1e52972dd5585a1294a1e487bf6ae6651867167 -b7bc06e08d8c72daba143627582f4b4f34cc2234b5cb5cd83536f2ef2e058631a3920468ea4d550aea01cad221d6a8a6 -a6e1a6f70fba42d3b9ce5f04ffdcfca46fc94041840c0066a204030cf75ea9f9856113fea3a9f69ea0037d9a68e3a9d4 -8b064c350083fce9a52da2e2e17bf44c4c9643d2d83667cbd9ad650bbeba55e2c408e746ccf693e56d08826e8a6d57fc -8d304a5405a0c0696917fcddc6795dd654567ca427f007d9b16be5de98febbf8692374e93f40822f63cf6f143c4d9499 -b968db239efec353a44f20a7cf4c0d0fca4c4c2dc21e6cbb5d669e4fe624356a8341e1eec0955b70afb893f55e9a9e32 -98971f745ce4ce5f1f398b1cd25d1697ada0cc7b329cee11d34b2d171e384b07aeb06ac7896c8283664a06d6dd82ec6b -881f5a20a80f728354fad9d0a32a79ffe0ba9bed644ed9d6a2d85444cda9821018159a3fa3d3d6b4fadbf6ea97e6aff6 -b7c76cbb82919ec08cf0bd7430b868a74cb4021e43b5e291caa0495ca579798fab1b64855e2d301f3461dd4d153adeb6 -b44c8c69b3df9b4e933fe6550982a6f76e18046e050229bd2456337e02efb75efa0dfe1b297ed9f5d7fa37fec69c8374 -a5bd7781820ba857aee07e38406538b07ab5180317689a58676f77514747672dd525ea64512a0e4958896f8df85e9d4d -a8443d1dc91b4faa20a2626505b5b4ad49cc5c1fd7a240a0e65d12f52d31df1585ba52c21e604dcec65ec00b81ae21fe -a157ae42fc6302c54bcdd774e8b8bafc4f5d221717f7bf49668c620e47051b930dce262d55668e546272dd07ca7c8d3f -8732c10448b63e907ff95f53cd746f970c946fd84fcbfe4cf9ede63afbbfc66b293bbc7c470d691bbd149bb3c78bb351 -a82192f4fd9a0c33489a0486b79d0f6c797c7eccb45f91f7f1e8e1dd1924ca9944b983951025b99ab5861d31841451fe -839efc6d199ddd43f34f6729b6b63f9ee05f18859bf8fd3f181fa71f4399a48bff7dde89b36e9dc1c572f1b9b6127cca -992ef084abe57adfd5eb65f880b411d5f4ed34c1aeb0d2cfac84fff4f92a9a855c521a965ba81b5eef2268e9a9e73048 -a2518ab712fa652e6e0bd0840307ef3831094e9a18723fb8ec052adacbb87f488d33778c6ec3fd845003af62e75125d1 -b630ac3c9e71b85dd9e9f2984bb5b762e8491d8edb99cad82c541faf5a22dd96f0fddb49d9a837b1955dea2d91284f28 -8d886d1b7f818391b473deba4a9a01acce1fe2abe9152955e17ba39adc55400590c61582c4fef37a286e2151566576ed -884f100dc437639247f85e5d638fcc7583d21bf37a66ce11e05bfc12f5dbe78685b0e51b4594e10549c92bb980512e12 -806d7bac2d24cfff6090ba9513698292d411cdea02976daa3c91c352b09f5a80a092cfa31304dcfcd9356eaf5164c81b -934ed65f8579ee458b9959295f69e4c7333775eb77084db69ad7096f07ad50ad88f65e31818b1942380f5b89e8d12f1b -aaf50ca5df249f0a7caf493334b6dca1700f34bd0c33fe8844fadd4afedbb87a09673426741ac7cbbb3bf4ab73f2d0f3 -b2868642cfa0a4a8a2553691c2bef41dab9dff87a94d100eaa41645614ab4d0e839ec2f465cc998c50cd203f0c65df22 -a326513112e0b46600d52be9aa04d8e47fe84e57b3b7263e2f3cf1a2c0e73269acb9636a99eb84417f3ae374c56e99b0 -97b93efc047896ddf381e8a3003b9e1229c438cc93a6dbef174bb74be30fac47c2d7e7dc250830459bed61d950e9c924 -b45e4f0a9806e44db75dbb80edc369be45f6e305352293bcae086f2193e3f55e6a75068de08d751151fdf9ebc6094fa1 -87f2161c130e57e8b4bb15616e63fa1f20a1b44d3e1683967a285f0d4f0b810f9202e75af2efa9fc472687c007a163f7 -8f6400a45666142752580a2dce55ef974f59235a209d32d2036c229c33a6189d51435b7ea184db36f765b0db574a9c52 -a0ee079462805f91b2200417da4900227acde0d48c98e92c8011a05b01c9db78fc5c0157d15cb084b947a68588f146f4 -ab0612d9bb228b30366b48e8d6ae11026230695f6f0607c7fa7a6e427e520121ff0edea55d1f0880a7478c4a8060872d -ad65dfde48f914de69f255bb58fa095a75afe9624fc8b7b586d23eb6cf34a4905e61186bc978e71ccb2b26b0381778a6 -8c8a4847d138d221c0b6d3194879fd462fb42ed5bd99f34ebe5f5b1e1d7902903ec55e4b52c90217b8b6e65379f005a4 -a41dca4449584353337aef1496b70e751502aeed9d51202de6d9723e155ca13be2d0db059748704653685a98eaa72a07 -ae40e5450fd994d1be245a7cd176a98dd26332b78da080159295f38802a7e7c9c17cc95da78d56558d84948cf48242cd -863878fda80ad64244b7493e3578908d4a804887ad1ad2c26f84404dcad69ea2851846ad2c6f2080e1ed64fe93bbec31 -b262fb990535f162dc2b039057a1d744409a3f41dd4b70f93ff29ba41c264c11cb78a3579aad82f3fa2163b33a8ce0e1 -a7f6eb552b9a1bb7c9cb50bc93d0dda4c7ecf2d4805535f10de0b6f2b3316688c5e19199d5c9ec2968e2d9e2bd0c6205 -a50aa5869412dc7081c8d827299237910ecec3154587692548da73e71fa398ff035656972777950ba84e472f267ba475 -924c3af750afc5dfad99d5f3ed3d6bdd359492cff81abcb6505696bb4c2b4664926cb1078a55851809f630e199955eb3 -a1acffa31323ce6b9c2135fb9b5705664de8949f8235b4889803fbd1b27eb80eb3f6a81e5b7cc44e3a67b288b747cf2f -8dec9fd48db028c33c03d4d96c5eecea2b27201f2b33d22e08529e1ae06da89449fe260703ac7bb6d794be4c0c6ea432 -aa6642922ccf912d60d678612fffe22ef4f77368a3c53a206c072ed07c024aa9dcde2df068c9821b4c12e5606cfe9be2 -a16ddf02609038fcb9655031b1cb94afe30b801739e02a5743c6cd2f79b04b2524c2085ca32ec3a39df53de0280f555d -b067d48589e9d3428c6d6129e104c681e4af376a351f502840bbea6c3e11fcbfdf54dadf6f1729621720a75ff89786c3 -b14a24079de311c729750bb4dd318590df1cd7ffc544a0a4b79432c9a2903d36a0d50ecd452b923730ade6d76a75c02c -97437bac649f70464ace93e9bec49659a7f01651bba762c4e626b5b6aa5746a3f0a8c55b555b1d0dc356d1e81f84c503 -a6f4cb2ffc83564b1170e7a9a34460a58a4d6129bd514ff23371a9e38b7da6a214ac47f23181df104c1619c57dff8fe2 -896d0f31dfc440cc6c8fde8831a2181f7257ffb73e1057fd39f1b7583ea35edf942ad67502cd895a1ad6091991eabc5e -9838007f920559af0de9c07e348939dfd9afe661b3c42053b4d9f11d79768cba268a2ee83bb07a655f8c970c0ee6844b -b41b8a47e3a19cadec18bff250068e1b543434ce94a414750852709cd603fc2e57cd9e840609890c8ff69217ea1f7593 -a0fb4396646c0a2272059b5aeb95b513e84265b89e58c87d6103229f489e2e900f4414133ed2458ddf9528461cfa8342 -ae026cfa49babc1006a3e8905d6f237a56a3db9ddf7559b0e4de8d47d08c3f172bde117cdf28dfdfd7627bd47d6a3c85 -a6a3f3e7006bc67290c0c40c1680bf9367982eb8aaf17ecb484a58c8e9c2a7c24932e2caa9aacc9b4fbf4c0abd087a46 -9093e05bd814177a01a3b8d7b733db66294e1c688c56def6e1827c0f2d9a97cf202721641bf81fb837f8581ae68cb5ce -87feef4de24942044f47d193d4efc44e39a8c0f4042fba582f2491a063e3a4640cb81f69579b6f353b9208884a4f7ce6 -975f9b94e78aac55bd4755f475e171e04f6fbddb6fd3d20a89a64a6346754a3ff64ecff8c04b612a1250e1d8d8a9e048 -87cde4d0164922d654cf2dc08df009e923c62f1a2e3b905dfde30f958e9e4dd6070d9f889712acd6c658804f48f3edb1 -ae8e22e158dda90a185eec92602831b5d826e5a19aab8c6400dba38b024c7d31c4cf265eb7b206dd45834f020b3f53cd -a4475807adc28aa086e977b65bbd7c8512119318c89d2619ea03a6739a72c3fb90c9622451896c7113ad4d12a3004de6 -97f1ae1e0d258a94532c7b73fa8ebdbbd53349a4d2d0a217fe56dfdd084dd879960bc6ff45ebb61b5dbf2054642800a4 -b3c832bd3691332a658b0caaa7717db13f5b5df2b5776b38131ac334b5fd80d0b90b6993701e5d74d2b7f6b2fd1f6b9d -a4b6af590187eb1b2cb5ae2b8cffa45c5e76abdb37cec56fc9b07a457730f5af0706d9ce0a17da792bbece5056d05670 -97b99a73a0e3145bf91f9dd611a67f894d608c954e9b8f5a4c77e07574064b3db47353eba8038062cebaad06a2500bab -8e5ca5a675de6e6d3916bd9ce5898bb379372afe3f310e70ff031bc8cc8fabfb7f3bfb784f409bb7eb06fdb4511ee477 -aabbbee4da1f16b5bbe001c19debe04745932d36dfbbf023fbf1010a2b1d54eb92fa5e266ac1e9337e26e2ddba752f40 -b13447c77496825f48e35c14f9b501c5056e6d5519f397a2580cea9a383a56a96994d88926aa681142fe2f1589c03185 -b89c55db39ff0e73dde7435b61e8a4d3e10f51dd8096cbc7f678661962e6de3d16f2f17a0e729cc699234cb847f55378 -82c36b7de53698a1bafbb311fefc6007fcefa47a806ebe33a4e7e0fc1c7b6b92a40a1860702cf9295a16c6b1433e3323 -8daeec8c88543d09c494a15cc9a83c0b918d544311fd2a7d09e06cf39cdebfa0cfc0e8fc0e3b5954960b92332f98697c -b18e55a1a7ae16be3a453d2bfa7659a7ec2d283dd46bdc82decef6d3751eeafc4f86f2416a22955c7e750c0582d4f3eb -b50c743462e2915bf773848669e50a3bcdb5a9ac5f664e97eaccf568c7d64a6493d321be0225de16142ce82ce1e24f66 -af69c9643805fb860434424b1608aababc593aaebc6a75fc017f7f62bb2b1da932b0b9bd5e6dcbba328422dafc06efd8 -b5947db4f809fd0d27af838b82eef8ab4fe78687a23ebc61c09c67eb7e8d0e6a310ecb907fd257859d5a2759a07c21cc -92c7960e163ca5bdf9196c7215102f8e9d88efc718843321c6e2a6170137b8ecec4ea5d5a5ce4c28012b6cdbd777dd01 -b63f9509ed5e798add4db43b562e8f57df50d5844af6e5c7acf6c3b71637c0a2d2433f4a0627b944f0af584892208bb8 -8ef28304a9bfe5220af6a9a6a942d2589606f5dc970d708ef18bc7ed08e433161020d36fb327c525398cd8ecb57002f9 -b722e0410f896c4462d630a84a5a14e94289fc38ed6d513ca88a09005935cec334c480028efa1943c7a5e202ae8c8379 -b56b6672b488e64d4dde43571f9ceaa7e61e336b0fd55bb769a57cd894a6300e724e5f88bad39a68bc307eb7406cb832 -8bf493da411fd41502b61a47827731193652e6ce3810709e70869d9aae49e4b17a40437a7a0dcc0547dbac21f355c0da -9613b60a144c01f6a0e7d46ddde07402e2133a1fe005c049a56415ff90401765040b2fc55971d24b94c5fd69fec58941 -85e2f02b291563d8eea3768cf6a4602c0ca36568ffcf3d93795d642044196ca6b0b28991ea5898e7974ee02831a0ec70 -b08ef66703dd9ac46e0208487566fbf8d8654d08c00f03e46f112c204782ccc02a880a3f9dffd849088693cee33b7b6d -a0b19eeda6c71b0e83b1f95dffef4d370318bdea6ea31d0845695e6b48d5c428c3dbba1a0ded80964992c4a0695f12ee -b052642e5772d2ef6f49dd35c5e765c5f305006b2add3b4bee5909ca572161edf0e9c2bc3bc3bc7f56fd596360ef2201 -8261af164c768fec80d63fca6cd07d1c0449e9ca665fe60c29babdbd8a2b20cf1f556a4b24cd7341712468a731c21b32 -8a17016a1b2fc0fa0d9e3610ea80548fcf514e0a35e327f6b5f8069b425c0f0829af7e206013eab552be92b241be5ac5 -8eea25c680172696f5600271761d27ef4c8cec9ab22f01f72b2c7c313a142fafaec39e6920b96fcace858883e02eff7a -b8e0c590106e125c5bca7e7a071cc408b93629da0d8d6381f1b73fbdf17024a0cf13f679f5203a99bbbcb664b4a94e88 -b9943b29395258b7afdf1781cfaf131297a4f325540755df73401b2ec4a549f962952e9907413c39a95585c4aff38157 -8286eab4a04f8113fb3f738a9bc9c2deaf3a22bf247151515568703da4efe6450ab3970f5c74e978a2db7e8d795331b7 -a10cf383c8a7e3f0a0a5556b57532170ff46dabdcbb6a31c4617271634b99540aa575786c636d3809207cbf1d2f364d3 -a5af7eb998140d01ba24baa0e8c71625aee6bd37db4c5ff607518f907892219ba8c9a03c326b273bfd7068232809b73c -aed5f461e38fccc8b3936f1328a9747efcbceb66312f6d6eddce57c59570852767159f1a7d9998f63342515fef4ba9bf -aec3e94b029aa692bfe2b8dbc6c3b0d132b504242e5ebe0cad79c065085e2fc05550e5cdaa2353892a40ff1a062dd9eb -87c23703960129396018d0347f5dd034abdbd57232b74195b6a29af34b6197b3cd63c60ac774d525add96ae54d5c0fb4 -97964a7768216e1c84dece71ce9202cc64b6d483650aa6f6d67215f655f66cda14df0a0f251db55832c77bfd9b6316e2 -8167aaf24c8a023d0aea16b8c24d993618b9d0c63619e11a28feab8f14952bafcb0918ed322cbc0ae1b2e1786071819b -b58318bd62852ffb712fc58f368c21b641dde7b3fa7d7269974c7a7b5b3e1641569fc7b5f32ca49de22f4f993506d92d -b172e7911d5cd3f53af388af847b928947c711185aebd3328f8e6ed1106c161ae0c1b67d3d9eb237e9e66eb0672edec0 -a6834cf69b2c4433cf6e779bfbb736b12e73e71e149c38101d13dbacf6c5048db53994a6a039381df40bbd67de40fcd0 -882604aa3bb19fffd6db744b5cf4a2431b157dac06d0617e0703684a118ca90b2d22a7758a1de7732a7144e68b11b7f7 -addc128ba52bf7553b9ba49eff42004d388a02c6b6e9809abe1c0d88f467e5ff6cb0c82a8fd901b80dfc9a001f7b9997 -abf19604a3f0cffefa7a9ced81627f6aacb8d7267b52b825f25d813d9afa24af6d70da21450ed93eaff8b4d2a9b905a9 -a3c67e7bf02dbca183d86924611a7149556ee17cb3469793624da496b6c25617a9071925dd02aab9cb028739cb79043d -b1cea4284a3ac4d5b1c6f0947c6ec8365b3281ed15495bf328a907a9a02cdd186e7cb1ef080385b3399df786855985a9 -a6edb126314559e6129caf1111dc3c82ff914efce658b11f2c9b48081be1cf3f46bde482469d493379025a158d95ab1b -9843fd7dd424da1acc6f92f87fac364a8b0d4097d74b6b451386384966c85145d43fc6ecedf04271b0f963ac731fd93f -83852bedca03a97a2e63053cb102387866cbefe6707ebb6dae2d32a59c343079f1a863f299fd64d0ecbe024d0a1247d5 -a570e645a0679ebc6f0ca03cc8f7367b03c3886f3d9c787992de7f3e93360a170d3ac9ae7720999c727a887b1dc762bb -ad644c40555238f28844eed632c8972b63d2602098031d53b5599d1a874903e0d0c428e0ab12a209ea3fb31225578f1c -b64e9f92a14812ed31075f9fdd3324659a036ef2f293ef9ca6f6feb87d0c138e1ba74bc36a910afd22ff9b3c8ec7cfa5 -8f2d75a86d517dafac09b65596f4b89c4a9c0a7003632407504153fa297c9e3228e236948a5d5224b8df49a087c8e0e3 -b02d6ab9292ae336c8a74115f33765af2c9f62c331d70c087cf4c2979792bb3c2666f6699c017f8d4c6b378fd4bda86a -a923d660d2e55228b8bc74f87d966069bd77c34a776fa96f37b48539c85634482e514e2cb76cb8eb20efd85eb9c83fae -81d7ffb53090a6d512055ecfd582ca92805525a05654e39bb12653a6a8902a16e651ba7b687b36b8bea7186632c7e9e3 -83e9b33e29b57ae53d9f72bd4622ff388252333b4fa32ad360a5b00f3ffc8813b9cb8a1361454d3bb7156c01b94b6a08 -ad7d6bffe4d67eb53b58daa3fc8a5a60790c54fa42226ae12847e94c6de3b4365b3be39855a4f6a5f12e4803cdaed96b -a7709fed85abbee5a2fa49c5238582ec565da08c132d4912821491985bf83b681eb4823634bfe826abd63a6c41a64ea7 -b8fb6ed55741132a1053b6ca77bdf892e96b048488373ba4aa2f2225fae6d578724124eb6975e7518e2bf3d25d215763 -85e0c53089529a09b5bce50f5760af6aeafef9395388aa4b6144ca59953169101783347ee46264ec0163713a25fe7c63 -8f9e47a9c37b678e56c92b38d5b4dab05defc6b9c35b05e28431d54b1d69ac31878c82c1357d016f3e57ca07d82d9c16 -a81f508136ee6ec9122c48584df51637f768ccfe8a0b812af02b122a0fafa9abcc24778bf54143abb79eccebbdde2aac -931a96d2257a4714d1ef20ac0704438481632647b993467e806b1acc4a381cc5a9dec257e63239ba285deb79f92122dd -99fb0ff747bcd44b512bf8a963b3183ce3f0e825a7b92ddd179253e65942a79494a515c0c0bc9345db136b774b0a76b0 -a9dbb940b5f8ab92f2d85fc5999e982e3d990fe9df247cfc6f3a3f8934fb7b70e2d0362ba3a71edc5d0b039db2a5f705 -99011a1e2670b1b142ec68b276ff6b38c1687eed310a79e2b902065bc798618c0cdee7b2009ad49623ed7ae0aa2b5219 -9361e9f3aa859c07924c49f3d6e9b5d39a3df2fc1c10769202ec812955d7d3814c9e6982f4df3a8f3bdbfb4550cd1819 -a8aa23f177ddc1e7a7856da3eac559791d8b3f188c0b3ae7021bcb35dfb72b0f043c3699597a9188200408bc3daf6ab7 -a5a502ff673f6dab7ae4591a7b550c04ede22a45a960c6b5499644f721c62b12b9e08248e7f8b8a59a740b058d2a67e6 -ad374f80f0b52bc5a9491f79a547ce5e4a3ce4468a35d7dbca8a64083af35ab38eff9aa774ccba2e2e1e006e45cb0b85 -ab6851827125e3f869e2b7671a80e2dff3d2d01ce5bfbeb36cbaf30c3d974a2d36fd9f7c3d331bb96d24b33dbd21f307 -96658f6a2d225a82f7ccee7f7a7e476967e31a0cd6c62859d3b13ee89702bb821547f70ffd31cb46a6a0d26a93158883 -878f59ff2590bc3d44fdc674717589800748b78d543d3c0dbb50125b1d6011d6a083f10ab396e36b79f2d89b7cf51cdd -b8bdfb97829c5d973a15172bfe4cb39620af148d496900969bd7ca35de9b0e98eec87af4e20bef1022e5fb6c73952aa0 -a292a78b452743998aee099f5a0b075e88762222da7a10398761030ffcc01128138d0f32fccf3296fcbea4f07b398b5f -85da44fdd7b852a766f66ba8804ed53e1fc54d282f9a6410106c45626df5a4380cbea2b76677fdfde32446a4d313742a -84bebf036073d121e11abc6180cba440465c6eaadc9a0c0853a5f1418f534d21cccf0cfc62533eaeae4653c7b4988046 -923dec006a6af04ef675f5351afffffd2c62a17a98f4144221927c69f4553dd105e4fcc2227b5f493653d758cd7d0352 -a51eda64f4a4410a1cfa080d1f8598e23b59856436eb20a241e11106989fbbb48f14c2251f608cbf9531c7c442b30bf7 -ac6d26ae7bab22d49b7fba7fe4b8cf6d70617977008c8290787c9da1a4759c17c5e441efb3dee706d5d64d9d2ace1de5 -ab5138b94d23c1bf920b2fb54039e8a3c41960a0fe6173261a5503da11ff7b3afdb43204f84a99e99888618a017aac1b -8c85647a91e652190eee4e98a1eec13a09a33f6532926427bf09e038f487e483f7930fbe6ff7a2126ccde989690dc668 -a6026ab87cffec3e47b4c9673957d670cb48c9b968d2ad0e3d624d81c1082dcebbc70d0815cbd0325e0a900d703a6909 -ac4f6ff6baf8374a3c62bdd5a8d207d184ff993f6055bcee1e6dcc54173d756c37c24570d6462395add6f7871d60b1ae -a0dd6bc93930d0016557588f2598b7462ca48cbed637c8190be0fb4811e4576217ca9fc3c669c2a4db82e3f8bb24acaf -a67c1d79f7e7193a23e42928a5cc6a6e8e0c48b6b286607dbcfaaa0f10a7ba29ad62d1d57ca28c486794f0908bece29c -822f411bab4882202ed24e67c84e0c9a8da5b3389804ed9dfba0f672e3e1457ea76cad0cb935dbb3d7a39500fba5fe12 -8a1198572323689300a9d7db2e2bcb7c519392e5d3d33e83cd64bcf1517a7dde52318a98203727b186597702c0eed258 -8a84141b02f1d037c68d92567d71cda3a0b805d1e200b1d3fff3caf9902457cbfbaac33157b87ab0bb9e4fe3bac882c3 -8070ace16d9eef8658fdcf21bed0d6938f948f31ca9d40b8bdb97fc20432cd2a7ef78eeefc991a87eae7f8c81adf9b19 -9522e7123b733ce9ca58ab364509f308a1ead0915421ccede48071a983fd102e81e1634ffa07a9e03766f167f5c7cb5e -82cbdf97a755e952304f5a933fd4d74a3038009f242dac149595439130a815e9cc0065597c0b362130183a4c4a444173 -81e904f9b65cd7049c75f64c7261e0cbb0cc15961ffcac063d09399d0d2b0553b19e7c233aca0f209f90cf50c7f5e0b2 -8f5f6ea87429542ea04ad3eb5fc7eeb28fcf69c01c1a5d29b0de219524f6fba90c26069bfc9092379fe18cb46274393a -a4e5815481eb33b7990d2de1a3a591c1ab545b64fbeb4cff8c71b6bcb04d28940097899062bf43b27c5a8f899616703e -a7afe6066681e312882b3b181f462a1af2139d9bd2aefffae7976f3fc357bfd8fbd6ddd4e5e321412f107736e77f0cb6 -b8ab102d7ff8d46b055095d8fb0ec2f658c9e18eee523c295b148b37f8342c120798113553b8bfebf2a11f27bc704cc4 -862175ecc7e0e294c304a0352cd0f1d11b2603d326bb0e54e02b6cc8d04d01ac31c8864e9395aa1f3b90b76bc4397f5b -a4ea51ef3d82509f0e4eb6af705fa7530921cf9512cb5bf030571e69f4504a299297219a0a7e40db1b45165a5ea3a3f2 -a6fb8b573e2ba6db0e8aba53a489e99bebe533c0fcd947dbfa732e00594f03f4e8609ccc44d8215986d38bc3d4e55d48 -93fe8e0bdd5d66df2bd18be5963e864bddfcdcd3298590e7c3b11d99a070a4948fecef46453f19960bbfeada37979613 -acbc45bc55c7080b45c69a3db80cbfc0267006dcf49c47330975aeff2a8ac07b206e1b1c3a515e50866ff510739b92c0 -94a577df0983e4ee3d6b80c73d7e8e3bb78bd8390ff56fea350e51bdf5e0176b8494e7e81dc7b1d842ada961089cd1eb -81eb1fbe9e9c89f5818d0ef98e694da86e88625f0a37cfe88e6de69f90e58297e67f1d5c9d71263b523b63e42685975a -a81a2391ea4d0f65ab4325196559d67e2648b3f1e464509430b40d9948d5b0fc01c337d9b51048a93c4d62e6b73e1e8c -849a026e55ed77135138836c9df67883763e4602357d8566da2ee2505d135d44061de0c070cf333ffb9ac2e55a0894b2 -8e272cc5734374c003c7b2e6ba833eb99b6be608da04e576df471c24705b6b2a790549c53e7971df2d9f0b88d0f570c6 -b0f9e6d985064aa311d4a147f41007fdc576b7b9194aa4b8712bf59a76a71543fec2ee3db21bd3d30d4096f25babc543 -96331837f0d74e2ba6cb1bfaddf4b1fb359bf46cb6c3c664938eb030e56bc85a5ce17bcd60b7fa7b72cb0ba1f3af0b5b -a0eaab6de4b5a551896e7d26153fb5df4bc22a37833ec864090b57b5115b0f8f1279e855cea456bb844802b294b0dbb7 -955e87d3b966edff34f28137f871881c59bbbc6d69986b739867807680ca22b5e3272ced1d25854ed9700d87f133848b -9270a6db157a8ce78a1af6bfe2b5bbe7b621d56cc8f9940a03b5a5f600848b87b05d83595b2a3a315d4b7f4687c46085 -9043328f2dd4dd85e14c91237a3478dc1eed239164924b53d1de9364d76c81315afa9639b58eedb1ab2122e2ae2e7cfb -857fe9f7d00b03bce367de7f789d755911a5f85d78044f18311ecd9b955e821b4a50228347260ba1205aef61219001fe -a0f878050367a7103fddf380908da66058ef4430eae1758335c46c24f5c22fefb0753991b3a47dba5c7eaafa4d598178 -ab5959296b1af14d2878816c7da9926484cbf8896b7eeac8a99dc255013319a67a0209025e1f8266ffd8cd7d960bdc87 -abe53abc57ea46419dbe0ac1f39eee39a4feae265e58b50928eb0695e25938a16a8b00e65c1313837dc3367297e2c258 -93e3e42ed6ba9c45d4e7a4bf21c1e469efafded1f3be9931a683dbb780db2494742fd76c9ad29fd7d12da2b778ede543 -ab3e64035c488a6e63496ddb2de9648cc63a670c5d4b610c187d8ceb144fcc50b016046f50b10e93b82937ebe932ac08 -a3a8fa898f489b313d31838ad9f0c7ffe62ef7155de5da9ffe6ecd49a984fac3c6763e8cb64e675e1c4a0e45e7daf078 -8356b26aa7c9fc9734b511480dad07b164cfec1324ad98eec9839a7943f2889d37c188d465515ad4e47c23df641c18c3 -83c4476f829e0fe91da2353d5b58091e9335157941e89ca60ccab1d7fdd014bcf21bd55249805780ddc655c5c8c2536e -814f6e66505b2cb36de92c0de8004d6d094476522e66b9537787beff8f71a1381ed9f2b7d86778979ad016a7dae6cbac -b1cd7f6da4a625b82bea475442f65d1caa881b0f7ce0d37d4b12134d3f1beb3ad4c2f25f352811e618c446185486adb6 -a71b918481b9bda667de0533292d81396853a3b7e2504edd63904400511f1a29891564d0091409f1de61276d2aebc12a -a2cd3d4104ec5fb6d75f5f34762d5e7d2ff0b261bea5f40a00deec08fbdab730721231a214e4df9b47685d5bacfe37c6 -807f2d9de1399093bf284814bc4093f448f56a9bde0169407cdc0e7d2a34ff45052aef18bcb92f0ac7a0a5e54bd843e9 -abeb03010c3ac38587be2547890a8476dd166ac7b2a92c50d442f031eaf273ad97114c38e57fe76d662c3e615334ac0b -b90a688da4b0bf65ff01bcf8699f0cba995b3397fcbe472e876ae1091a294463e4b94350ae8bd5c63b8441089e0884fd -ad88db4afb177931788fb08eff187e15ad739edc7e1a14c8b777b6bf668aec69ca4749773f94250c1fdda3b59f705f7c -9886809f9ae952797c6527c6db297d2aa3d5209b360efe6a19970575a9f78aee3c21daadb8e8dfcbeeea5290238d16d9 -930f486e95d7c053c9742e6f0b31e6d4fa2187e41229e46a074b469aafb87880aa8e972719b363049fc9fe2db8f03ce2 -8d229af4fa08bd8aeb5fd9acfee47571eb03fcd2f19073b94cd27e2a6735029d31f123249d557f8d20c32ac881eae3aa -84576ed5aebe3a9c3449243a25247628993fdb2cc327072418ea2f1d11342756e56e9a82449bc3ea6e8eaecabc62e9b5 -b775cb86cbec9c46a4a93d426379c62872c85dd08bccda39b21cb471222b85b93afd34a53337b6d258f4891c6458e502 -8be1540e6b535b416b8d21e3ecf67dfb27a10fd4010f9f19426422edaeb0a4961d43ff3afd1db0994170056ce4d77aec -b9c7438e90a5501a4d05bbb8ab68d6db7e9baa8927231a5c58715ee2ab76ca1da0e94910a076958654869148d813d0e9 -aa9bed1c4d2e7cbc2e1a884c8998773f7cc6fa9d6493c8abe8b425114a48305c3a43a1abda2292177ffd39ef02db4163 -897b395356047cd86f576cfc050f7e4546ecd4df30b2c31ed8945797b81dd4ed9b9106cfbe6d7dd8bf91882e3cf1f42e -949a37e1037d9464b2ccd3ad23eda7089570d6b5ffa18025d2548a9df8829de8d62960f04a603f21eecbca5893d45284 -b8a0642f68ff169ffbcd8cd684fae75d96f9bd76949472775bf155edc55a3d9c3e6f0299ee73a6cfb96289361fdbe9ee -a1273141510fcddd89b9b92c19a268dadd1528ad85744b8174684c9b56668e6b35dabb05f2b4cc6ef5611eaea6052f27 -97c7415c82de83ecc066eb922268b8205ad7266c65b2b8f7e0aadac87f076c738cea72f9b0f069b8d28cf9d5438b8287 -b32c7005380c848f71092a74297555dc6022369fc2a4f285e586ac8f53f6bd354fbe4b1f8a4cfb406a101103bf87bb64 -91b48eeba52f02d04f536d32112038f8ba70bb34284fbb39e0f7bae2e08b3f45ad32e2f55d1beae94b949c15652d06a1 -99e24f5ea378cb816a4436af2ee7891ac78a2e37c72590be0abd619244a190fee51fc701b6c1c073611b412cb76332c9 -9465d1e73a1a0a5f7b1cd85f4fa4f5dee008b622b14d228d5cd5baeec174451e7ae93c5de688393d37cc24ce15df4139 -a6ac3986ee01debdacb5ddc1e2550cb4f039156df15c7d5752b79f333175b840bdca89c4959a523e58cf97bbd6b2039e -b7f7a5cc1b1b6145988170d619c170c130231abbe0b5143a9bccaaebeef9ceb1c16e26749bc9dc5650fe91f92fa1b79b -854cb04f1557457383a401d79a655adfd0a4b706ea2bbc6262949c8d657efcfdc9c7960cbe1a50b5eebb361c5e378f80 -8dd199dccbdc85aeca9ddcb5a78dd741a452f7a0d3ceb6546d76624bad2fce0e7e6c47ee30d60bf773f18d98503e7f9c -889e1ca9f0582be9bf5f1aede6a7312b30ea9bed45ab02d87182a013430f16007ae477ee6a823ae86c7fef7da016a0ec -892a60e63edfb3e7a6cf2d0be184413d214401fc1e6c004ca2902c3f1423728bf759a136e6e715d26d5bb229c75cc20a -a2287cd092261b39d22dcb1fa19512590b244771bb69fb62eda72f12be37d48e408b3e37a47608f68d743834edee7f15 -b3b6afb950bbec0ff631bdf18af433e68adc63d02cb479704f24329ca6b6edd9a3d1d606563dbdce6038b676b85130b9 -847da90f37b294509de51ab6521fdff12d5a1ec3cccaf730aa744da7e54b85fd9c70618787e87c0ba9947ce6c81387fb -ad872153c00bccac75bdb30d1ab7044d814f4f8655ff26421d48fea04fb21d4dc82c1900620a57d13adc45c1062a1817 -90fa5ee98fd7ec719f2a8543bbd0ff45ac69296c2416fc8666d05de3deea1017079a68aba55540a19585925803c8335d -962ba6d029e9176d0e8c80a21f2413f7322f22a9e9a32c933697a8b0e995ce25bea5264736a75718b3d330e215a58a05 -a446f9530db30c5e9c1b3844d635e5c2cd311cc4537ff277fe83dd1a0382bcfa73beb07aaa0cf5a97d24c67e688086a4 -8766b2053f16c72db387abe18b43d7b357a542916c9b8d530ee264e921c999494d6eb1e491352ecdf53758640c7a246d -83f32f511f7b0233662acfc14f30df345af99d2d6c777ce0b4bcdc4dd110533f30b45071df17230aaec392cc482355e1 -82e3521bc9519b36f0cc020225586b263e4feb57b533b38d8e89ccf8d03f301d94da90efb4902002732fbf3876697f38 -b5d1ea69c97ceaa34a720bb67af3fcf0c24293df37a5f6d06268b1eabe441531606954ac2598a1513f64231af722b3a3 -956842696b411e6221c5064e6f16739e731497e074326ef9517b095671f52a19e792d93fe1b99b5a99a5dc29782a5deb -b19b5658e55c279eb4b0c19a0807865858cbec1255acd621f6d60c7e9c50e5d3ee57da76b133580899a97c09f1dd8dac -89e6a8b916d3fcc8607790e5da7e391f6bc9eae44cc7665eb326a230b02bc4eb4ef66e608ccc6031048fc682529833d0 -b1a210bc8070ed68b79debd0ec8f24ec5241457b2d79fd651e5d12ceb7920e0136c3e0260bc75c7ff23a470da90d8de9 -85b1954278e2c69007ad3ab9be663ad23ae37c8e7fa9bc8bd64143184d51aea913a25b954471b8badc9e49078146f5ac -98bf63c7a4b200f3ce6bf99e98543925bc02659dc76dfedebe91ec5c8877d1271973a6e75dad1d56c54d5844617313e1 -b7404b6e0f320889e2a0a9c3c8238b918b5eb37bcdab6925c9c8865e22192ba9be2b7d408e1ea921a71af3f4d46806d0 -b73cbbebf1d89801aa838475be27c15b901f27d1052072d8317dcae630ab2af0986e56e755431f1c93f96cd249f2c564 -95b2027302f7f536e009f8a63018da6c91ec2b2733c07f526cc34cbcfa2f895ccfd3cc70be89f4e92c63c7ddc2a93370 -9201d9ff5d0b1222bfa2345394f88ddf4fe9282acf51bee9b18b96bb724fdf8e736d7101acc2795a34e72f9e0545c9a8 -acbff7eb160f427d8de6f29feeddfa8994674e033a0ccdc8e8c73f9243968f1a6379da670a7340f422892d50c97113c7 -97ae8d03352c3729e1623e680dd9664f303b3bcfb844ef80d21e9c773a247967d27b86c9326af29db5eefd0bd3d4fac8 -8e53ae5c22f5bfa5fe4c414dad6a10b28a3e5b82a22e24a94e50ce3b2bf41af31e7ba017d2968811c179017b78741ef0 -b5ac7dd150247eb63dfb7dd28f64b1bf14426dc3c95c941e8e92750c206c4c7f4ad1a6b89e777cfe26ecb680dbf0acb6 -99ae2e4652ea1c1c695e7ea2022fd35bd72b1a0d145c0b050da1be48ad781a413dc20fbda1b0b538881d4421e7609286 -b8abe1fb3a7443f19cd8b687a45e68364842fc8c23d5af5ec85da41d73afb6840ef4b160d022b2dad1a75456d809e80b -842619c3547e44db805127c462f5964551f296a270ed2b922e271f9dc1074fdf1c5e45bb31686cec55cb816d77853c01 -902dff769391de4e241a98c3ed759436e018e82b2c50b57147552bb94baddd1f66530915555e45404df9e7101b20e607 -82e4f2ee7c7ca1ee8f38afa295d884e0629a509c909a5464eb9ea6b2d089205478120eed7b6049b077b2df685ec8ba48 -aa21a68b0888e4a98b919002a7e71e6876b4eb42227858bf48c82daf664c3870df49e4d5f6363c05878a9a00a0bcf178 -a8420cd71b1d8edd11ebc6a52ba7fc82da87dd0a1af386d5471b8b5362c4f42718338bcbc302d53794204a0a06b0671d -98c686bd3a994668fbbd80c472eed8aedd3ab5aa730c8d3ce72e63fb70742e58525437be1f260b7ecc6d9d18a43356a0 -aca0b2df9ec8ede0b72f03b121cded5387d9f472b8c1f3a5f1badd5879fb2d5d0bbb6af1a2dd6bdebf758cfceadbe61d -93b1abd9cb41da1422d171b4dbf6fbcb5421189c48e85c9b8492d0597838f5845198494c13032e631c32456054598e1d -a246ab3a47f7dc5caedc26c6c2f0f3f303ed24188844ab67a3da1e793d64c7c7fe3e5cc46efafbd791b751e71de0614c -b9b52095ca98f1f07f3b0f568dd8462b4056c7350c449aa6ce10e5e8e313c2516ac4b303a4fc521fe51faf9bf7766ce9 -8e2e9d26036e847c2a2e4ba25706a465ac9fbb27804a243e3f1da15dd4084f184e37808661ec929479d3c735555085ee -8b8c4f4ad5c8e57e6a7c55d70ef643083d4b8dac02716ea476d02dbbb16c702a2f2d5dd5efe3aec7704d2b8cdafe3959 -a800afea30d0df333805d295bac25419b7049d70044be00c7c85a92a0503ca471001bc1e6552323f1a719eb96616fc20 -868bced4560e1495b8527058ebc82a538b7cf806f8d8fe8eeed6981aba771de4d5e9f03cbfc7157d38b9f99cdea87b96 -86b86258b0c1feb988cc79f6c4d4b458ff39428eda292f9608a5fc4c3765782c8c23c66f82d7538e78e092cd81d69a56 -9370eac15de2555824c7d48520a678316a7bb672e66f8115ad7dbc7c7b1f35a7718e8fa0c35f37e3ef2df32dfa7ca8d1 -ae200bc5be0c1c8c6ec8e9fd28b4d256c6f806c0f270766099e191e256d67b9cceda2cc2fed46dfa2d410971a7408993 -af2428c77b2b9887ecde1ea835ed53c04891547fb79fe92e92f9c6009cdfffa0cb14de390532ad0ef81348b91798bd47 -a9069eef0316a5d13d1aa4cef0cf9431518f99b916c8d734bd27b789828ae03e5870837163ea6ad0be67c69184b31e8d -b1b1ce6d529f5a8f80728173b2f873c8357f29644b00f619c15111224377ae31a2efb98f7e0c06f5f868030aab78ed52 -b89c98beef19ee7f300e1c332a91569618ef8bf2c1d3de284fc393d45f036e2335d54917c762f7c2874a03fe4f0f6926 -8264f993dceb202f8426339183157e9e0e026d4e935efe4cf957eb14cd53edcdc866305fb1334cdf0e819b69eafbaccf -aebd113f73210b11f5ac75b474f70a2005e5c349345003989175dffa19f168abd7f0e28125b18907502fff6fcc6f769b -9993ad061066ca6c2bb29fe258a645089184c5a5a2ef22c811352749a199be3a3af3a0d5ce963febf20b7d9e63508139 -97952105000c6fc6c2dcae1ebdb2feae64f578d26a5523807d88e6caf1fe944b8185e49222d06a4553b3bdb48c3267a2 -82dd955f208957d74693bed78d479c9663f7d911f68ff033929418eb4a5c5dc467589ca210c1ba3c2e37d18f04afe887 -b816fc4763d4c8a1d64a549c4ef22918e045ea25fa394272c7e8a46dcb0c84d843d323a68cc3b2ef47a5bbb11b3913bc -a7a87ba4d12a60ee459aad306309b66b935d0c6115a5d62a8738482f89e4f80d533c7bba8503e0d53e9e11a7fd5fe72b -92b36d8fa2fdee71b7eea62a5cc739be518d0ecf5056f93e30b8169c3729a6a7ed3aa44c329aa1990809142e0e5e2b15 -8835b6cf207b4499529a9034997d2d3bc2054e35937038deb9c3e2f729ebd97125f111c12816d30b716b397016133c52 -acf14cd6d978ba905cf33b9839b386958b7a262b41cbd15e0d3a9d4ef191fcc598c5ab5681cf63bc722fe8acfda25ce6 -b31302881969c5b283c6df90971f4fb2cc8b9a5da8073662da4029f7977fbb4aaa57dd95b003a9e509c817b739f964e7 -b74669e1c3fa7f435e15b5e81f40de6cfb4ad252fcdfb29862724b0a540f373d6e26c3d600471c7421b60a1d43dbeb0f -861d01615cba6ca4e4ef86b8b90f37fa9a4cc65cef25d12370f7e3313b33bb75de0953c8e69972b3c2a54fe110f2a520 -a58a56820efaf9572fd0f487542aaff37171d5db4a5d25bfb1a5c36ca975eb5df3cb3f427589e1101494abb96b5e4031 -af13d0a6869ef95cb8025367c0a12350800c6bc4ae5b5856dcb0a3ca495211d4139f30a8682d848cb7c05c14ae9f48cb -8c385767d49ba85b25a3a00026dd6a3052e09cd28809d5a1374edf4f02dc1beed367055b0dee09102c85985492b90333 -b5129fc2fec76711449f0fcb057f9cf65add01b254900c425e89b593b8d395fc53bb0a83ddbd3166acc6d2c17f7fc2a4 -86bd01b3417d192341518ad4abf1b59190d9c1829041e6f621068bce0bef77ec3b86875b7803cf84ff93c053c2e9aad1 -a74fc276f6af05348b5fabccb03179540858e55594eb8d42417788438c574784919fb6297460f698bd0da31ce84cebfc -967ed3ec9f1fc51f76f07b956e1568d597f59840ef899472a3138f8af4b4c90861e23690c56b7db536f4dd477f23add6 -b9e678206de4fc1437c62d63814d65f3496be25a7a452e53d719981d09c7e3cae75e6475f00474e7c8a589e2e0c6bfa3 -b028eaffaa4ff2b1b508886ff13c522d0b6881998e60e06b83abe2ac1b69f036eece3ded0f95e9ae721aea02efff17b6 -935f82de9be578c12de99707af6905c04c30a993a70e20c7e9dd2088c05660e361942fa3099db14f55a73097bfd32a44 -96a1cc133997d6420a45555611af8bcd09a4c7dbddf11dbe65aab7688cc5a397485596c21d67d1c60aae9d840f2d8e48 -80d117b25aa1a78e5d92ea50e8f1e932d632d8b37bebf444dcc76cc409322fb8eface74a5dddab101e793ff0a31f0a53 -893229136d5ab555dc3217fb4e8c6d785b5e97a306cdaa62f98c95bad7b5558ed43e9a62a87af39630a1563abd56ec54 -b7ec1973ec60bd61d34201a7f8f7d89d2bc468c8edc772a0ba4b886785f4dadc979e23d37b9f7ef3ff7d2101d3aa8947 -b6080ca201d99205a90953b50fc0d1bd5efd5eadbfe5014db2aeb2e1874d645ab152fb4b0ff836f691b013b98ce7c010 -b546e66ec0c39037bbaa66b2b3f4704a6a72cf1924a561550564b6fcf41fbc2930e708cd5cac1d05e12a4b8ec93ff7eb -8abeed90a01477260f4b09fff8fa00e93afe727e8eed6f111d225c872a67e6ab61d0472ab6add3fe987744e16f7c5268 -8e02342d5cc1836ed21834b9ef81686172cc730f0412479db5f590b0ff7a729a0e986ffed16d6ecafd6b83d65922ca5e -b05660605cf8e8a10c8d3c77cccbe4e7179fa27cc829571f6b722a58e65e4e44d7fe977446118e9da2d2f40af146cc2d -942a00e006baba6d025cbd99297bdb0cbf3d84cddf849b1b5a9fe9ef1745352fad81313cce5d7622d6652096a8fa065c -aace8212b3d8dbe44ac97460a5938a3b803aca9bd00d8a643a859351daf391b22d1fd2a6b3e0ff83cc9ee272a1ad7686 -965a9885a5259197a75a19707a2f040e0fd62505e00e35ebe5041d8467596752aedf0b7ec12111689eceb3e2e01ecfc8 -81d58270a4e7ee0137cb2bf559c78c4fd5b3a613468a8157b6a9c5c0b6ca20a071b87c127d59cecc3d0359237a66d890 -af92b6354fbf35674abf005cb109edc5d95845e3d84b968e6001c4b83d548715dffc6723ac754c45a5ace8cd7dd30a24 -b112caa707f9be48fdde27f1649149d9456857f928ea73e05b64bb62d597801daac0b89165fea76074f8b5770043f673 -b6e7380746da358fc429f676b3d800341e7ab3f9072c271310626ae7f67b62562ff76c63bc9f5a1dbc0e0af87752408a -a45e9e8d0931207ebc75199aa0c983134aa97f771ff546a94a3367bcedf14486f761e7f572cf112e8c412018995fdaf4 -854381128de5bfb79c67b3820f3005555f3ee6f1200046ebbfaee4b61b3b80a9cebf059c363a76b601ff574b8dbf0e6b -aa1b828a8b015d7c879669d5b729709f20a2614be6af6ff43b9c09b031f725f15b30cde63521edda6cd4cf9e4ab4b840 -8f28f6b62c744084eeddcb756eced786c33725f0f255e5999af32b81d6c6506a3f83b99a46c68fc822643339fe1b91c5 -ac584e76a74cafe4298ca4954c5189ccc0cc92840c42f557c40e65a173ea2a5cd4ae9d9f9b4211c9e3dfd6471fc03a1b -a413365df01db91e6a9933d52ab3e5ed22d7f36a5585ad6054e96753b832e363484fb388c82d808d1e4dfb77f836eab9 -8a68c51006d45bf1454a6c48a2923a6dbeb04bd78b720bb6921a3ca64c007043937498557f0a157262aac906f84f9bf8 -b93ff8b6c8c569cc90ee00cfe2fc3c23cccea2d69cbca98a4007554878311635cb3b6582f91636006c47b97e989fe53d -b9a8a44d54592511d74c92f6a64d4a8c539a1d8949916ef3773e544f6f72c19a79577de9878433bd35bb5f14d92f411d -94f066a7e49ae88d497893e4ce6d34edc2dc0b42fe03934da5d4ed264d1620d506fcc0661faa90a6cf5083e1720beaaf -b42b102adef8f42c1059b5ca90fe3524dcd633cf49893b04b4a97a1b932ca4c7f305cebd89f466d5c79e246bad9c5ced -86b560d78d3c5fb24a81317c32912b92f6ea644e9bedfdea224a2f0e069f87d59e6680b36c18b3b955c43c52f0a9d040 -a3829fa7e017c934fa999779c50618c6fb5eafb5e6dec0183f7254708a275c94ba6d2226c5ca0c0c357b2f2b053eea93 -9337dda730076da88798fd50faed1efa062f7936a8879ea4658c41d4fcf18cee7120366100d574536e71f2f11271b574 -853d09a30f4342f5a84c4758e4f55517a9c878b9b3f8f19e1362be9ae85ca0d79c2d4a1c0c14f5eff86010ad21476a7a -b0bc74cb69bdd8fdffca647979e693ad5cbf12a9f4ead139162fa3263bfebef3d085aab424ed8c6220b655228c63c6b1 -88d8dc8faf3aab12ba7180550e6a047f00d63798775b038e4a43a3b40a421a3f5f152a7e09f28ccd7198bb8cefc40c07 -88db2e3b8746415d0c3e9f5706eda69a29d0b9ee5135ad006060be7787f4f1f7069e2e2e693c5e10b7c3d5a949085ae0 -b5bd830d2f1c722188dba2690d21b7b84b92cbdd873a55aaa966f1d08d217bfc8cffe8caea68868f3850b90b4ab68439 -b5ad4be0c9626a33fce6c8501297bdde21b07b88531451912ed41971a4c48fdd1036d8a4994a99a7fbba4a5901a7095e -b0e1337a2a1772191faa91302f1e562e7cdc69ba5b25139e7728ce778a68a7fa9817f852ec8e04a159122cff62992ec6 -b4fd4a4c1be8bc7e4e2bfd45404c35d65b75f45fb19ce55c213a8035b41f1ccbce9766f3df687c0d7cd6cdfc1abb00a5 -814bf565ece6e9e2a094ffbd101f0b9fea7f315a2f4917abe2bf7d070ed8c64a2987bd288385a42fd336ed0a70a9d132 -af860af861dc80894ed69f29c8601d986917ec4add3d3f7c933a5e9d540bc8ff8e4e79d0bb01bbc08fa19ef062f2890c -b66d33fcf3cd28f15111960ffc6ed032c3b33d4bb53d035ab460cc5fa7ce78872f0476d0bb13f1d38f2672347d2d6c4d -89603ae1a5dd7c526936b86a3b69b7b1d0bdf79ba3cc9cc2e542ec801a6126d1514c075d6ad119fe6b6e95544ffe7fbe -8a1b097f46a62d85cff354d1e38df19a9619875aad055cc6313fdb17e2866d8f837a369a9ee56d4f57995e2b0a94310e -8dc165d86c7f80b0fcd4b6f90d96cd11dc62e61d4aae27594e661d5b08ef6c91156c749de8948adfaf3265b1d13e21cf -98e3173772c3b083b728040b8e0ee01dc717b74c48b79669dd9d2f7da207af64ccd7e9244bc21438a5d4ac79b88e9822 -924d168099b6952d6fe615355851f2b474f6edfcd6a4bd3ad2972e6e45c31bf0a7fb6f7fca5879a0de3ea99830cfb5bc -95452f0b7efda93c9e7a99348e13f356bad4350f60fcd246a8f2aa5f595a9505d05ec9f88b1fe01b90ecd781027b9856 -b95e8af516bb0941fc0767ecd651ada2bc64cc3e5c67a1f70048c634260c0f2c0e55ed22948e1870c54590b36683a977 -82f7feb71e746d5ca24455e3f3e57e4eade92669ab043e877b836612efd3de82009f0555e5d8811bff9f2b75fc57a01d -87623c02caf590ea84cf4a84d1be501f89262e26eb463f2f94a2d3042889c051b058823c3367a989498e46ff25edab16 -b88da847b1ef74c66f923773ce8c920ca89751335fde17b3a98c0603862069a2afbf35b1552b43ad64dccea69f040ff8 -96b734758c823e5ce5b44625c252957e16fa09f87f869baac195956052dc92f933f377b288c7f63b8028751cbbdca609 -a23cc5fbbe5cb7c1d33d433cec4e502f6548412e2374e285d307f75e98280b0c0af4f46bba18015be88cdf7db8b1239c -8bd5bbe04bc929ca8f546e673803ec79602f66ec24298d3e3b6bf6f2c25180fc0032ea6f86c38a6e0ec20ff4eaafc7a1 -b95768ca113e5d57ad887a1cb5ef84ce89007ce34c3156cd80b9aa891f3ebaa52b74c0cb42919cfbcf0cb8bafa8085f9 -a117f99045f65e88acc5a14fc944f8363f466e4a64057eb8fc64569da5dd022a01f2860c8e21b16aff98aebdf89461b7 -895cda6503907c98c43477eaf71dfd26759032523691659f13662ca3a967d93bbc5be342d168223cef7e8a333987d6a0 -a084d77d913d3ec0586ad5df2647610c7ed1f592e06a4993a5914f41994a29c4a8492d9dce2e14d8130c872d20722920 -84a328b73c64137bb97a0a289b56b12060fa186ce178f46fe96648402f1b6a97d1c6c7b75321e4b546046c726add5a08 -b7c35087b2c95127ce1470d97bceb8d873a7ad11a8034cc1cba7b60d56f7e882fc06796048435a9586eab25880787804 -ab05e3394375ee617c39c25c0ec76e8a7f2381954650c94fbcd11063ea6772c1823c693d2d9dd18bd540a130d7b92855 -82ba5907051d84b37fd9d28f8b9abebc41fc4aaa334570516ca2e848846644016356d40fa9314543017d4f710d193901 -9170517b6e23ee2b87ff7c930cb02b3e6bd8e2ae446107b5b19e269bf88f08de5ded3d81a2ff71b632ca8b8f933253a0 -93dc0e3f6234b756cdbb3fe473b9214e970972e6bf70803f4e2bf25b195b60075177a1a16382f1dee612a4758aa076ee -b4b49fac49cdfccda33db991994a8e26ab97366545166cc7140aef3d965529f96a5dac14d038191af4fb9beb020ff6d5 -b826537670acdf7a8a45ef4a422d5ae5a1b5416ad0b938307518d103cc7ba78e495ea200adc5941414a70158a366e8a2 -8ae3588b1fbecbc769c761f0390d888e34773cf521d976ee335f6c813bf06dad38850871ac8a8e16528684f1e093d0c1 -ad9c00b8dccdb545315fbf26849135699c6aa3735f89581244281154c906aba80d20c1e7f18f41acc61e0565f8015a33 -954ce68146c05fc1c9e536add3d4f702335d93c1650b8c1fad893722a81f915eee2d38275dad00ce87f3f5bc90ef7341 -8243feaeff9a12f5aeb782e3dd68609ce04ecde897c90fd8a19c9c5dace3cf43bd5bc0f1624bf7fd2607ca0d71adbba8 -a8a1be55259cd27898d9d60a61998d8da2bf2d439ba6eedb61d6d16dacc4a81ec706b9196dfa080ba20701d2cd9fa1f4 -b0eac6212c7a62ef6062c30875fbe24b8e1a9d88854c035686f849a9eed4d17fbc9af27429eb7c3fd60b47a5e29f6783 -878561a88412e95f19f1cb8894be9d0ea4a2cdd44f343387f87dd37445e5777bceb643cebc68c910acb5e588c509cd2e -a57b6c347955d8b0057a87494223148ff9ff12b88e79dbd9d0aae352fe55e15ea57fcfb9add3d5d269ee0001d8660f20 -a07fa66340d4082585e4d72c77510c59b272e7a3345f4b1de6be7ff4a11ea95d712d035a7355fc8d2e571fa65fe8236f -b9d84a627462438e8ede6c453e3367bfaf81cff199d3e5157ef2bc582d358b28b5ccc3bc27bb73af98ef45179ea79caf -b14f26ea7ca558761cb19508e5940fbf5dcf2ad8555c5a03e8ff92481994072f523b1ab6b7176f698e2cfd83d4f8caad -800cca1cbb14e1fc230c7b420ff06864a934b082321bbf5b71f37340383923f23183d4fdc8fa2913928722b8892db28e -94790c950b92e971ec39e9396c3f32dee32a8275d78e6ea28a47130651bddc86a189ef404c5e8c210bd291186dee0df4 -ad7b3b3e377df64023b8726d43a7b6ec81e5a5e8c0943c5bebe5ab5ddd6597255f434a205c14ba90e9e5e3c462a1fe0c -86ff8156cc857a416e735009cf656b89da59b766b4c4e5a0c0165282b530c10657cc28cf5cb847696725c37ac48b69d7 -89cb64cf9294f68f01533660a2af2aec0ec34cc0b4a0cc36a128f2e0efb3da244981f69aede962f50590faeeb9a5da01 -a2ea5a94a524bb8e6f767017246cd1af9d87c9abb9894e91c4e90c34c5161be6179b49dafcab9cff877a522c76beb145 -b5d9abf29ed6030a1e0f9dc19be416c45ba8cb5ed21aff5492233e114035715d77405d574cd62f2716285e49f79b9c99 -ac441cf6104473420babdfb74c76459cbea901f56938723de7ad3c2d3fadb0c47f19c8d9cb15a3ff374e01480b78a813 -abea34bd2d36c5c15f6f1cdd906eb887f0dd89726279925dbe20546609178afd7c37676c1db9687bc7c7ea794516af03 -8140abfd0ec5ca60ef21ad1f9aabbb41c4198bac0198cb4d220e8d26864eedb77af438349a89ca4c3ff0f732709d41a9 -a5a25abf69f3acd7745facb275d85df23e0f1f4104e7a3d2d533c0b98af80477a26ac3cf5a73117db8954d08f9c67222 -b45ac8d221a7e726ad2233ba66f46e83ed7d84dbe68182a00a0cf10020b6d4872f3707d90a6da85f6440c093914c4efa -80f586dfd0ceaa8844441c3337195ba5392c1c655403a1d6375f441e89d86ce678b207be5698c120166999576611b157 -b8ce52089e687d77408d69f2d1e4f160a640778466489d93b0ec4281db68564b544ec1228b5ab03e518a12a365915e49 -8990f80bae5f61542cc07cb625d988800954aa6d3b2af1997415f35bd12d3602071503b9483c27db4197f0f1f84a97ac -8329858a37285249d37225b44b68e4e70efeef45f889d2d62de4e60bd89dde32e98e40e2422f7908e244f5bd4ffc9fe2 -8d70c66ea780c68735283ed8832dc10b99d3daeb18329c8a44a99611a3f49542e215bf4066ff4232d36ad72f1a17ccc3 -a3b2676cc8cdf4cc9e38c6cb8482c088e5e422163357da3b7586a3768030f851ad2a138eeb31584845be9ffb8067fc00 -95b1fa74e9f429c26d84a8e3c500c943c585ad8df3ce3aea1f6ab3d6c5d0ed8bb8fa5c2e50dd395fa8d4d40e30f26947 -b1185f2ac7ada67b63a06d2aa42c4970ca8ef4233d4f87c8ffa14a712a211b1ffde0752916bfafdfa739be30e39af15d -8705a8f86db7c4ecd3fd8cc42dd8c9844eab06b27d66809dc1e893ece07186c57b615eab957a623a7cf3283ddc880107 -af6356b372f0280658744c355051f38ff086f5563491fc1b3b1c22cfec41d5c42b47762baeb9ee6c2d9be59efd21d2b7 -86bdd4527b6fe79872740d399bc2ebf6c92c423f629cdfcd5ece58e8ed86e797378a2485ead87cbb5e2f91ba7b3fbda1 -a900f0be1785b7f1fda90b8aedd17172d389c55907f01c2dfb9da07c4dc4743cb385e94f1b0fc907dd0fedb6c52e0979 -a9f59f79829a9e3d9a591e4408eaec68782c30bc148d16eb6ae2efccb0e5478830bbdaa4ae6eac1f1088e7de2a60f542 -99cf54a69ad5e8c8ec2c67880900e0202bcc90c9815531d66de8866c0a06489ea750745cc3e3aa1c4d5cb55dcd1e88f7 -8676246a4710d6d73066f23078e09b3fa19411af067258e0b8790456525c02081727b585d6f428c8be285da4aa775a4b -b596c7014fe9214529c8e6b7602f501f796b545b8c70dbf3d47acc88e2f5afd65dccef2ef01010df31f03653566b16df -a12205c6c1780fc8aebdd98611e12180005b57750d40210b9eff0396d06023bd4ff7e45f36777123ff8bed7c5f52e7a3 -ae7dbd435bba81685d5eab9abc806e620253da83e56b4170952852d442648a5d8743f494a4b0fc9d606574f87895b0d6 -9786257b1726b7cdc85219ca9eec415f98f5a11e78027c67c7b38f36f29fe7a56443570fdfedc1d9293a50e4c89d89f6 -aaf0515070d1ca92aacdf5fac84193d98473d8eb2592381f391b8599bcd7503dbf23055324399d84f75b4278a601c8b2 -b31654dbf62fbbe24db4055f750f43b47f199a2f03c4d5b7155645276b2e456a218ca133743fb29d6f1a711977323f6e -8f4d39106ecdca55c1122346bdaaac7f3589d0cf0897a6b4b69e14b4d60550fd017876399401ce7c5d35f27da95f50be -8a7bfdb48cd47afe94aff705fac65f260b3a3359223cff159b4135565c04b544dd889f6c9a6686f417e6081ad01e0685 -967ba91111e5e08f9befcbaad031c4fb193776320989f8ede4018254be0e94586254432d3dbae1455014f3a2f2549d01 -a9db52352feeb76715a35c8bed49fb3a8774c9c8e58838febf800285fd6c4938ec162eb8457029e6984d8397dc79ea19 -811794e6bfe2539e8f6d5397c6058876e9e30763ad20dad942bb5dbcab2f16d51718ce52bfb4de17889ba91da1b85bcd -a6db0f65a6dc8b8cc2312a3e0146d8daf520255bb12f74874c05693914e64e92be0cd53d479c72cb2591e7725dfaf8b0 -918d21bfa06d166e9eb5b7875c600663a0f19cc88c8e14412319d7aa982e3365f2dff79c09c915fc45013f6b3a21200d -9894852b7d5d7f8d335dd5f0f3d455b98f1525ad896fdd54c020eeaf52824cc0277ecbfa242001070dc83368e219b76d -ad00acc47080c31fcc17566b29b9f1f19ccaae9e85a312a8dcc0340965c4db17e6c8bd085b327eaf867f72966bf61452 -965e74649e35696744ecc8bed1589700bae9ca83978966f602cf4d9518074a9aa7c29bc81d36e868a0161293f5a96e95 -961e29a239c2e0e0999b834e430b8edfe481eb024cc54ffaffd14edaf4b8522e6350dc32039465badfff90dcb2ba31cc -943dda8fa8237418a07e311efde8353c56dd8ec0bfa04889ccdd7faa3dee527e316fdc60d433a3b75a3e36ca2aa9d441 -a0ed4c102e3f1d6ebf52e85a2bc863c1af2f55dc48eb94e40066f96964e4d37fff86db2cff55a8d43d517e47d49b5bd7 -9045770ad4e81345bc6d9a10853ee131232bf5634ef4931b0e4ba56161585b4286876bc8a49b7b1f458d768718cb8ebf -b0dd430295ff28f81895fde7e96809630d1360009bbe555e3ac10962de217d93ead55a99fd4f84d8cadd1e8d86d7b7ef -95ced48419b870ea4d478a2c8db699b94292f03303f1bf4560b5b1e49ca9b47e7008514fe0a9cf785717f3824567e1b2 -a7986e0e389e8aef6aac4a7a95e2440a9af877ae2bc5ad4c5f29d198ec66aa0db1d58c451e76ae70275a2e44c3d3fa68 -85a8490faf32d15de12d6794c47cc48e02428af1e32205e0742f8299ea96b64bcd6d3b4655272afa595eec74ecbb047c -b790d7fb1307aacc2d303d9b6753a9773252b66c6b67763cf8841c690cbccc4866ffb5fec1c068b97601a7953fe0f7e8 -afcc4011f8c53f10d63c29b74d9779cd75c861e01974c28a4ec2cbb909b67a1b2287ead175231343c936ad75dfa416ff -918058bffdecc1ae8779dccf1d874bb9e28edbe34c8b5954a8da64a848858d2f0776437b423baf4e731f3f5fa05a2841 -ab554db549aa36dfa9f966a5ed6be8267e3aa9ced348695f3dafc96333c6dbb48ef031693aafd59d1b746ecd11a89c51 -ac4ecf746b46b26a7af49cc9cc1d381e1e49b538dbd7fb773ce6b1df63ae31c916693cca8a90fb89f1e7ec5e0e8dd467 -a8de66d48f16b016f780a25ba25bd6338fd8895a1909aabcfb6e70f04ff66f9866e6e2a339bcbfa4bfba4070a6a8db26 -b4b49374eff6dac622e49b0e9c0e334ecbec513a96297f6369696ad39e5ec0de81a1417f6544be866c9f60957a9ba09a -b8023968549ebab6c1e7a8e82954a5b213bec50bbf35b36697a8d4fd75f9e12d510b365962aace4c9978c5b04da974a7 -8d4bc016026dd19e4059d1c5784897cefa47f7ae2ed6dfa2b3c14a852fff2b64abc09549d106584e0daed861a2d6d6c2 -85e26f433d0b657a53da4c1353485e0c2efa092484c5b8adb3f63dc72ee00be79197ebef7937b37a6a006571641cd6af -abb37a917301e68328032ff4715abc0fee32e5f5be68232ca8bf7ffb8732bc47504e75b40bcc0a7c7720b71496fa80af -9837c8d2660522c0357f5222777559d40321a1377f89ca1717215195bad4a348a14764bd87fa75f08e1f6263e9d08982 -97e06f971b4c56408ed5f1de621d233e6a91c797f96ec912737be29352760a58831aaf1f64e377c3ed9f2f4dc8ad1adb -a12d211304da7b91101513d57a557b2504069b4383db8ecb88aa91e9e66e46e8139dadc1270620c0982103bc89666215 -aab74ba48991c728ba65213e8c769e6824c594a31a9b73804e53d0fda9429403ff3d9f6ea5ef60884585d46356c87390 -92f19be2b7adf031f73611282ad33e462852f778c5e072f689dd0e9458fa6ebccfae02f2b2dc021802c9225035862468 -953bb843c48d722604576cef297123755cef8daa648c30c3a678eada8718dfdb16e71cc3e042a51fedc80577235c2563 -86f509e3c1b9ee9a3b95e6da8516b47feb8c8a83403984228f4903c7ee1ee4f03addcb8fe86283af1196a54b36b9470c -903d793a377e98e2562c49de33e3fbf84bf99211925e7002a4f688470db655884e1efe92782bf970ffa55d9c418ef3b5 -a41b65681ed7f10987a7bfdf9e56b010d53683819d845d880fc21b2d525540605c5823e75c434f17b5a0d08a091c1564 -971be802de51cfc0d10a96be7977c037873f19334ed4ed4904b7675aec8bfa1f8956cd0150b07064caf18229ffd1ccd9 -b253ebe4f82cdbefbc3ef816d40c497fe426a9f0f0f170e783fa4a05ae6dabdfa8c448817a24e723a314b43e76a7c422 -86f397c95025489929ce9230b1466b5c330ec7c58a3c7e3153d6d05bcb8348a13398908e192590b8812f5c5ff09c133a -a0713983a3dc9f10b3833687cd2575de2fc63c4ad8d2f54ff85c6db23dd308daefef1bd1e51eec26732f77c1f37ba793 -8249a1d53ec92f311f4fa77e777800d777f3e9d4d452df740fc767fa7b0f36c8dce603d6e6e25f464c0399b8d0b93c30 -a73d0a206a62922f07b928501940d415e5a95716ee23bf6625b01ff2cd303f777adfa373d70279ba8a30fbb4c99a6f1f -b1106b407ecf234e73b95ff58ac9fdf6709ad2e763b58f0aacc5d41790226d441b5d41405ac03a0641f577848a4f5e8e -b009963ccc7b2d42792f09ab7cb0e929503dd1438f33b953104b4de43274ca3ce051554d10d7b37041b6f47d7a2dab6f -b744512a1b3c7ef9180b095c6a0c5bc16086a50020cf20dc2216bbff24d91ca99b95cb73070444dafc3ab45c3598960d -a0209669ffeddc074d35cc6aa2dac53acac8e870f8a8a5118e734482245b70c3175f760652e792118fdddac028642259 -8ddd3e0d313da17292fdcc1bbc6e9d81189bb1d768411c6fe99801975eddb48dbf76699dcf785cac20ab2d48e392c8fd -8392aa285b8b734aa7a6e0f5a1850b631ddf6315922e39314916e627e7078065d705ff63adbc85e281d214ec7567863e -b655a1fff4dba544a068bf944e9de35eaaa6c9a0672d193c23926776c82bebed8aa6c07c074b352882136b17abdab04b -af5095f40d1e345b3d37bebee3eb48c5d7b0547f12c030d5bfe8c0285943e0a7a53a186f33f791decba6a416cba0c5c9 -8223527f9eb3c8ff52708613cd2ee47e64c0da039cea3a0189b211dc25e9bfa3d5367a137f024abe94f98722e5c14b67 -afdb106d279273edc1ee43b4eead697f73cb0d291388f7e3fc70f0dd06513e20cc88b32056567dcc9d05364cb9ca8c58 -9319eac79ff22a2d538dcd451d69bca8aa8e639979b0d1b60d494809dbd184a60e92ad03b889037a1ac29a5547423070 -b79191ce22dbd356044e1777b6373b2d9d55d02b2cc23167642bc26d5f29fd9e2fb67dce5bd5cf81a602c3243bedd55c -988e0da1e96188ffd7c5460ecdf2321f07bc539d61c74a3292c34cb8c56dbafbca23eb4471a61e8e64e9a771a49fd967 -b0792b6cf4b10f8af89d3401c91c9833736616bb9fe1367b5f561c09d8911fb5a43b7a4fd808927b33ab06e82dd37a28 -862f68ea55206023ca470dbd08b69f0f785fcbabb575a1306ff3453c98ffcad5fd6ead42e8a1f9edf14c6fd165ffd63a -815ff0898b1330ac70610180c0f909561877888ff10def749a1e65edf9f4f7cea710a757c85241dfb13d0031efb5e54b -aa6e6ce21776ea4507d452ccdaf43a161a63687aae1cb009d340c9200e5646e9c2de4104dfd66b8e55dfa6de6ee83e4a -8e8f3d3403e0256ecc254b9b1464edca199cad3f3348002d744721c345a1a3c7f257c3587d2229774cd395e26693d1ba -90483e28985e4a0f7a3cb4bc5e865b9d408b94cd2146c04aed00b48a7ab80a28deb05efec320817d63578d4f953bd137 -84fb2a762ba29193b07f1dd84b3f69153cedb679b66ad04f8a4adf01c14f115163a107e6db23aaf0f0c9687824ded197 -b4a23922bf4302cc9a6583f252a1afa026c87c132b9ae44cc1f75a972cb6ae473447c500827906f9b677617ddd6fb473 -809bb9edbbe3a2769165f029f2a48b6e10e833eb55d8f9107c4a09ca71f0986dc28f3bf4ead9cab498086eb54c626bbf -a0459dbb08db4155d16301933ec03df77c4f835db2aa3f9697eeb2bb6fcd03337fab45fa43372a469fecc9a8be2e3119 -a638eaace7f21854de49f4db6e4ea83d2983751645e0fb200c5e56561f599fd37dac70bdbd36566fdd10d4114fbb9c2f -a3a27bc2728390643a524521bf8ef3b6437cfba6febfd8bb54f2b6ecbafafb96196d3dea279ce782efd97b212f364ef5 -b86693b3ea23ea6b2c4d52554f61ef39c0ef57e514ff6da80c6e54395df8376e2e96b9d50e4ec301c59e022c5c5610db -af4d7cd678d79e67ae19789d43331dff99346cd18efff7bab68f6170c111598d32837372e3afe3e881fd1e984648483e -b8735a555ba7fe294e7adc471145276b6525de31cda8c75aae39182915129025fb572ed10c51392e93c114f3a71bd0be -b1dfb6dbda4e0faaa90fe0154f4ddaf68ee7da19b03daad1356a8550fca78a7354a58e00adeecb364e2fd475f8242c24 -9044b73c1bd19cd8bb46d778214d047f5dd89b99b42466431b661279220af5c50c0cffecebd2b64c3d0847a9c7a8b1ec -891f0d162651a0aa0d68fb1cc39fa8d77fd9f41ff98b5d6c056c969c4bac05ba8c52cbfa7fbb6ef9adfe44543a6ec416 -8920ae1d5ac05bf4be6aba843e9fc1bc5b109817381cdd9aa13df53cabea319a34ee122dcb32086d880b20900ff28239 -abb14023142876cbc9301336dced18c7878daa830070b5515ff4ac87b7bf358aa7ff129ebbf6fb78e827570a4142661f -a74b15e178cf91cde56eab0332e62d5ff84c05fcc849b86f45f94d7978bf9c0fc72a04f24d092a9d795ca3d976467f46 -806829621a908ca9b6433f04557a305814a95d91c13152dca221e4c56bfaa3473d8bb1bacd66e5095a53070f85954278 -b09a3c185e93869aa266a0593456a5d70587712bca81983dbc9eebbb0bd4b9108a38ae1643020ecf60c39c55bb3ac062 -b2bbe8f5361a3ecdb19598dd02e85a4c4c87e009f66fee980b4819a75d61f0a5c5e0bdc882830606cb89554ef1f90ead -825e16cb54fc2e378187aedae84a037e32903467ac022deb302cf4142da3eda3ead5b9f3e188d44f004824a3b5d94fbe -8b39d4a11d9b8ba885d36bcdb6446b41da12cfd66cb22705be05ab86936464716954360cc403f8a0fd3db6d8b301cb59 -ac19d453106c9121b856c4b327ddb3e3112b3af04793df13f02d760842b93d1b1fbdff5734edc38e53103a6e429a1d1f -b1cacbb965ec563f9e07d669ffc5e84d4149f1fb9fcfbc505788c073578c8f67956fb8f603e0b9a9d65e2d41803038ce -b7612d9e7dc930bff29191d1503feb2d6451b368b69fa8ecb06353c959967daccdc262a963f01c7fb95496f1bd50d92e -93f8fceb65ea9ef2052fa8113fb6720c94f0fed3432d89014ee5ad16260aeb428aadea0d1f1e002d2f670612ba565da3 -b3eb9213752156ed1fced3bca151fd0c630554215c808b9a0938b55fed42b6b89f9b76bc698f3e37c3c348d2395dbed1 -b46ab3553ef172ae40fc21c51d1d7eab8599a67f2f89a32a971aa52c2f031664e268b976dd2f7dc2195458fcf4bf3860 -8fb66f2c67ca5b6fb371c7d04592385a15df0c343857ba8037fe2aa9f2a5d4abc1058323ff9652653261b1c7db0edc24 -a7dfdbbf0b14e4af70fdb017875cdc36ad2108f90deb30bfca49301c92cbf821645a00ade1d1ee59a1a55a346675c904 -856199cad25ec80ee0327869077f272e33d59bf2af66c972e4a5839ec3b2a689e16f7fd0a03a3138bec458fcff8edbea -a2842ac5a715c2f48394988c6f84a6644c567673806feaa575838e906138c1b25d699e1b6ffdfc9be850b15da34077e4 -814b448ada88f769de33054c3c19f988226317797acacdbe55ed2485b52cd259ac5bcbee13f9de057eee33930a7fa0c0 -b49de8dd90da916ed374ca42665464b6abe89ff4453168921f5a7e5ddd3dcfa69422782e389e586e531fd78a1f236a8b -851f9d942b4c8ffc020c02c7fbee0f65ef42b1ab210ab4668a3db6aa0f8ab9eedb16f6fd739a542cc7e3cc03172b565b -a5128c155b8062d7fa0117412f43a6fdc2de98fa5628e1f5fc1175de0fa49fc52d015ec0aff228f060628268359e299c -b0765849127cc4ce1a1668011556367d22ce46027aa3056f741c7869287abcaccf0da726a5781a03964a9ded1febf67d -984562c64f3338ffe82f840c6a98a3dc958113f7ed28ee085af6890bbc0cd025723543a126df86f379e9c4771bb69c17 -8087fe60a9a22a4333f6fbe7d070b372c428d8c5df3804bb874b6035e5602c0693757fb30a9cd5a86684b5bca6737106 -a15e195b5850f7d45674cdc3bd74f972768b46fe9473182498263edc401745a8716fc532df8fc8c1375e39e391019226 -858ec10208c14a67c4156ea9c147f36d36c4fa0a232195b647e976ba82c8e16262b2b68d31e3b4702070c3dc701bccb5 -84bf3fb83c003380ee1158e2d6b1dca75cd14c7b2a32aec89d901f0d79e1475aa0827cb07cba1784a6bb0d37f6ca5cd4 -91e69f5392648e7f7c698059a0fc4b8478ab8af166d3842fb382ec5c396daa082ee3b2cb0192da3c9d90f6523c4c039d -8f7299f451c5e641d6fd961946b7a6ba4755685b2a40164e6276c25aefc66715b92492097a191813d39bb4405dc5da36 -ade2cf04ff6c94c1019bfa1e0e8f580696230fa6ee9695c4772e5a44501b2fffdd765ec7cc71ba14b83559ad62cc0fc5 -85fc98ecf469d6f98c8b3e441680816f764de39001a249bc7162f990c5a5354683e849164d4fc9287ee516780cdcd436 -928d118188120d038c37abdbe66c05adaa87f1cf9957dee2783b09fa91c4c43a7b0d0b2b6c5f4dea57e3ec8af230e84f -8025f71cf8d3085d6ea5104dddea8fa66cdb8527e40db01472469be021632daf22721f4acf1a8698a53439fe2f82596c -83266fffb12b3c795a6b551ac2aa7d9a29c183f861e78768c11286a04e22bd423bba05a68775bd77273e3ca316a4318e -95fd0c69c2d9df4e795c7ba71ed71a9d9f2878cd7e3a64be7b671d9611649fd41d29f8bdab642ba19cbd3db660d6a7e7 -92a912cb4d5ef4b639876daf4289500c4ebdbd80aff07fd93dc3eea645f084f910e5c02c10492a37f16acaa7e646d073 -b3d2622c987189a0873932aaea8b92ebb6e9e67ff46e91a96bf733c3b84175fffe950f8f4622cc4fa50f116321c5537f -a98f9a40054b31023a8f7549a44cae853b379bbfe673c815b8726e43ecd11a96db40b20369d712cbf72ffab064ecfac5 -b4e9a38e371fc21f4b8a3d7ad173c9ffad0554530dc053365d9555ddb60f5c9063c72ff4c65d78b091af631a9e1ee430 -875a31aee4ba19e09f8c2754fab0b5530ec283c7861a4858b239a12432f09ef155a35fedb0bc33eac2117c7e62f1c7ee -95edd0d1a6e94af718590756b5c5f5492f1c3441ecc7fa22f4e37f4ec256b9fffd2fda4c11fc1a7c220daee096eb1ff8 -b35fdc435adc73e15c5aaf4e2eea795f9e590d3e3ee4066cafa9c489ee5917466c2a4c897a186b2d27b848c8a65fa8a8 -94a5ce56f8d72ec4d0f480cb8f03e52b22f7d43f949a4b50d4a688a928ffd2c9074ecbab37733c0c30759204a54f9a6a -987562d78ef42228c56074193f80de1b5a9ed625dd7c4c7df3bf5096e7d7b08e2ee864bd12d2ea563e24fa20ad4d30ef -95a8218405038c991ace2f45980dbb1efa9e4ad0d8153486b0213a89e4d7e3cac6d607100660784627c74f90a8e55482 -b6a29d566f5a924355b7f7912f55140e1b5f99f983c614b8a92814ce261f2750e8db178866651ea3b461fb8f92890b14 -afdacc0a13da0446a92455f57a42b3ba27ba707f24171727aa974d05143fae219de9e2eb7c857235dd9c7568f43be5a8 -862a7dc25f7cfa4a09aeca0ed2c9c5ee66189e119e226720b19344e231981504e37bca179aa7cad238ee3ab1386aa722 -a336364e76635f188e544613a47a85978073f1686e4ee7a8987f54da91c4193540ac448b91d07d1fc5c7a8538b1f1688 -8f1ddca9638decd8247c1ce49c1e6cf494d03d91c4f33e48a84452d12b6736e8bd18c157068dfeff3a90977af19e5b1e -96ae91b9aaf00e437c18ddfc1aef2113ee278153ba090aedeb3f48f1e66feb8897bb1ac7f5ffeffc3be29376dd51e498 -8230b5bd9067efb6089e50213f1cc84da892e6faf0b79d5e4768c29303a80b1b754cb09d17a21933aba4c5f32070878a -a79dfe217faec7b4d3cf97d8363949efbc6f3d2c6bbc25df2c7bb8b7fd2521e6d3fa76672bfc06de6f426290d0b3cc45 -8290bd36552609d6b3ac9ccb57ff8668fc8290548eecdcee9a231f1125298c20bd8e60f033214dfbd42cd3c8642c699b -8945db9e8ec437c5145add028d25936ee8823ceb300a959402d262232ae0cbd9a64c1f0a1be6aed15ff152202ea9a70c -949e232b48adeaf57bd38eacb035267d3e78333c6b4524cab86651a428a730baf9c27ff42cb172526d925de863132e82 -98917e7a5073a9c93a526399bb74af71c76958a74619caccf47949f8fd25962810a19e399b4efcba0c550c371bea3676 -b5b144e0707aefc853ea5570bd78dedc4e690cf29edc9413080f28335ac78022139bfe7f7d6986eb1f76872bb91e82ad -949945072a08de6fd5838e9d2c3dc3200d048b5d21183020240fa13e71a1a8d30e6bfee4e6895e91d87b92f1444d0589 -b351a03c7c98506ee92d7fb9476065839baa8ed8ac1dc250f5a095c0d4c8abcfab62690d29d001f0862672da29721f16 -a82d81c136bc5e418d1fba614cb40a11f39dc526e66a8b1d7609f42fea4c02b63196315014400084f31f62c24b177cbd -87d51c907fdcdf528d01291b28adfee1e5b6221c6da68fd92ab66126247cd8086a6bcffff0ea17e7b57b0ba8d01bb95d -a2a9a1a91dfd918f36c1bfeeca705ea8e926ee012f8c18d633e50ec6e50f68f3380ef2ee839e5a43cf80fbb75bfb5304 -86f22616caed13c9e9cd5568175b6b0a6a463f9a15c301b8766feca593efa6e5ee4c7066e1cd61b407c0be12b3d8236a -b57e0a2c42790d2fd0207ef6476a433fca0cf213d70840c4af1ad45833f23fca082d21a484f78af447a19a0b068ea55c -8ae9bda5d85e6e3600dde26379b7270abd088678098506b72196ac8f9ce5b0173bc9c7ff245c95cbab5b5b967bcb043b -95c7d11f6c874f59ba632b63ce07a7a9d917a74d0b89cefa043f52aa1a7fe2e81c38dea0b20378264b5b4f64039932bc -ac7dee7479f50722526ea1c9d4e2f1a4578d1b5cce2092a07722069c96bb4da295de1c4f16e21005276e3b3f1624ac5a -89b8aaa49bd18b09f78fc5a1f3dd85d69b5dfcff28fc6d5a92b1520bc54107b8b71bb71fd6e0bde10e0a5809c633e5d2 -8982cb43fe4d3488c55e8c08b935e6c8d31bb57e4f2aeb76d6319470cce99ebf7dc2f116ac15b9d845ab1bc16aa6a583 -a12c63f48e27b1a1c83a32992642f37fb5b89851a35e80f6d1f9bc483cb25acd0e12b1dcf68781ae0cc861f002368bcb -aa6da92a4b4fa229afc8007abca257ce0ff5fad3b1ccfe5d836b9b52ff6b72575a0b915a759403b993733b16a47fdb15 -8bf706a92fe54f15d633b9463926b874dd43e28aaeca3fe2353fb58ad7753c8a293c56b0e94176070e8a9ec7401073a1 -b81e86de4bb5c1046e40cca79585c5b98c8673626fd3a28e563c5a3296256c2f7086522ae95cbabfaa8f1a8f7eae6272 -ad10f895b05d35cb251f78cc042d3f0969a8b6b3f289ddb4b016e0b8e06bfffc3a3e1afa9b0cc548f8c092832bb766bc -ad993aceb68d5217cfb07f862956cde83d05dec5060fc7a8fbfd37c6bfd5429ba69bdaf478b6cd01c323a06793dcd9fa -83da9c9a8fcb2775df0777aceabe90642a2df1c6abc646566e954f42d6e43455b00b101ec5ef58850c8d4b3100222ca1 -b55484f339fe7c7d107e70432601f4a34e1cc02ae4de5d18b99e5aa995f7b3710fc745769b85c1af803d457491dd8ce3 -8009d80593e82f3e751cec9e7e495fd29ad6f45f8d3ae513bec998b43c49fed74c44229c6f27c421e80c65413b897644 -9868081bbcc71192f7ff8dcf99a91dcd40f96556fbd6f285bdbfdfc785f604d8bf75c368c59db5ac8cdcc663087db53a -a04b1e91af025b4387ee0a2d790a1afb842e46f4c3717e355578efd1f84fea78782c6f7944b4961268de7f1ac71fb92b -a7b6301ddb9738b89b28a36d29d5323264a78d93d369f57ddab4cea399c36018a1fcc2cc1bfadf956a775124ae2925bd -a6cdb469014b33c590a07a728ce48f15f17c027eb92055e1858a1f9805c8deb58491a471aaa765de86a6bda62a18aef4 -828a23280ec67384a8846376378896037bd0cb5a6927ff9422fca266ee10a6fde5b95d963a4acfa92efbb0309cdb17b4 -b498ec16bcdb50091647ae02d199d70c783d7c91348a1354661b1c42bc1266e5a5309b542ef5fdf5281d426819a671cb -806533fb603e78b63598ff390375eebe5b68380640f5e020e89a5430037db2e519ab8ae5d0d0ad3fa041921c098448e1 -9104ad119681c54cdee19f0db92ebfe1da2fa6bef4177f5a383df84512d1b0af5cbe7baf6a93ad4b89138cd51c7c5838 -ac695cde30d021d9f4f295109890c4013f7e213d2150c9d5c85a36d4abfdca4cdc88faee9891e927a82fc204b988dcd9 -a311c244df546d5dc76eccb91fe4c47055fc9d222d310b974d4c067923a29e7a7f6d5a88bfef72fd6d317471f80d5c82 -89e4518335240479ad041a0915fc4f1afaab660bd4033c5d09c6707f0cc963eb2e6872cabc4a02169893943be7f847d4 -a8ad395b784c83aacf133de50d6b23bd63b4f245bb9e180c11f568faca4c897f8dbda73335ef0f80a8cb548a0c3c48fc -93e02b6052719f607dacd3a088274f65596bd0d09920b61ab5da61bbdc7f5049334cf11213945d57e5ac7d055d042b7e024aa2b2f08f0a91260805272dc51051c6e47ad4fa403b02b4510b647ae3d1770bac0326a805bbefd48056c8c121bdb8 -99aca9fb2f7760cecb892bf7262c176b334824f5727f680bba701a33e322cb6667531410dfc7c8e4321a3f0ea8af48cb1436638a2093123f046f0f504cc2a864825542873edbbc5d7ed17af125a4f2cf6433c6f4f61b81173726981dd989761d -88e2e982982bf8231e747e9dfcd14c05bd02623d1332734d2af26246c6869fb56ee6c994843f593178a040495ba61f4a083b0e18110b1d9f5224783d8f9a895e8ee744e87929430e9ba96bd29251cbf61240b256d1525600f3d562894d93d659 -a2d33775e3d9e6af0d1b27d389e6c021a578e617a3d6627686db6288d4b3dffd7a847a00f7ef01828b7f42885b660e4204923402aca18fbae74ccd4e9c50dd8c2281b38dc09c022342ed1ac695d53f7081cb21f05fdfc0a3508c04759196fcd3 -af565445d2ad54c83a75c40e8895f5ad7219a8c728bce9d58d7a83716e095432993ebbd3f6911c66415a6f920d1a4d171478509b54a114308a020b33bf4487a7a8d0aa76ae4676a9b54e765a680f562d3a4fcb2e92c58b14b49b5b2917cc258f -8aa99cfaf514cef4801599cadd780d222194ca1ad69a34779c2bcfda93e5dbeb931e13914421b5809a6c81f12cf7038b04a35257cc9e94c33761e68565b1274aa6a6f9d66477229747a66b308b138f92aa4326a3bf23df65a1fe33b3b289bfe1 -99ba36d8b4f56bde026099278548b1afc0a987cbd7c9baa51fc8e6cbb8237a17636f1a44a385cec69b05a5802059956a11fe793cabb939c38800f9c239ca2518e898ade1ec2513c9ee492071a35aabd78182392a09123d28dbc233313c9120c4 -a7dc40c36afccb30a2eaff250860b28b227c195cf05674704c567d77d6655c446ae835f8fc8667e71147ab02afcb2dad0babe60cbfa37d7c2cddc68d2dec54f28a4142f8353590a3902d5ddaa22066ab563dd1435dda83f276387b9767d69120 -939e6cc97a8b88572852a5b7f25e4838556307f60aeafb5d2b6961edbcafd4b48cb6ac980ffbacf4be963f324ba81e3d12de4f1459d8c746d0762c66ae1b166027f7fbe641d9c48f3c7d97b06d956b0be51dcc9aab65f3e99e1388e63bdd79f9 -b391e156541dfd4003d1697cdb7ec815b309807320574906b2e652ef0175828b356d215cd374b1b34d9f470b3fa0e643113e67b2273268f922f04f072cfb89008358185b25cd631f82911a3f20f90f75758ffb99bebb8076458ae1e9d1ae898c -b9ac9c84934cc2a85c876eff65577e1dfce1935cd6392c877dd881a7d2f5c3e9344f28c04f90c62a6db4237ca00f9e0d00cb5f63e3f060fc7303916e19273b6fe455f331cabbe2fe5a22d584484f0d4176120fec9819fbb0a01e6d38695acfcd -88209eb030c5d78734bf2c2a5c539653fd3c24b4c08e624f9ddc4a6550efbdc1054a56eb0c807595aad6de56fda326aa196d032a8b4b48d40140a2d77df3c7243eda6507936389a321a5811eb38e32ee433c788deeae1eb928b00940e2944bcc -a8632ddc9cf7cbc1e8b74a05b7d4a89618c64afe30367ca0c9550ae7d320bf4e51c5a69e1501a1d8bee4240d13d7835501aa39fdc401a74f4d5734e268a7ce29a1fcfdb0a8bc64e0dd4a9e8578d6985bc2bc6a3764ce7a3703f6fb2e52557a2b -a037ac67e8bb6f4193ac967e05d080a489f58ef8d3d30a89798246f3e4936121ee445b03e410a09e8ebc0db2e2477d110aad0ade99b0887f1eb016e750f42135866907f150bd6f4f99a8cb94281474166874808ebe03b118c5daab16dafdc38b -a50d9143116bffa3b237da8e1805327e81e9cd25e658289bd727d5f9e0020172cc8690dcfe31a240e5cbc48353b88c4908baa1dd7320165556e0aa633f62fcbe7870222d345a3bbcdb7ab6c07f0fd86be559964afabf56f0a8cbc0b4b91d477e -afa988ea6fa4f40c5ad07d2d580d29025ddf56d6ef1171a8b8de3464203f70b97d6f5ace72747345204b35150e06154d1477516a989ce8eea7871cc0d0de00a077c0fb23ad4837e409d0b885bf3f2dde11a30fa6273d662e68e09f461e52932f -97fa1a943ed8b81574304a3d03f4f15907f6e6e0cd36a66bd2ad2c75afafc70a61d3ff69b77ebe4dae9ca0fcedef80081062705e60bbb6ea0f1f398c84d2f8e4a3ac142ac66426c21ad5e9994ebbcc406af474c4aec5e32fadcb21875af7c9f1 -b30a564614493886f14a5dd71c89457504f8c59a7ac01b665ed167e9a8f9ee5832198fd319ecd234196ee57031bdf3840bd5a923e203a1938bc795c704b5285389750e1fd10d7050061ba19db00a60a2c0384a7d661d7d48ebe6962272230859 -84c8dea942cfae71cb02e705ec496d967425793ce8812e7ee53c2f23713abeaff566a658cd1c73dfd18187d16253a6ee0a623e82cd18e31cd1a1875d19c078835dc9292e141686150a88065226ada264740143e87c03a0f6c4da8c187438ebf4 -8c3abae8aed60338f8c4ff80aab22f8a2ae56756a93566c906f490a97151d34a1c3318054e1c494c60cc53327ad86a2d02c6c76a406726ce4f88635bc32eff0db0b61762dc518b95fa8da82e87e4bf3de54f1d72180ef53ed7bc5413e6a9a510 -a328230c92a6b1cef6a444bcb64edb992f71e3d7b93f0b6b8b408ba7c908db746d92ddb2c7588bab438ef3bc61be1c2f0dfc86ba2ff514b42b35c80f89b2e780f813ea1dfb977fbded2cd9b553b747fa952e227ebd8f071163d421fc337f04c9 -b482cab423cd5f1c5df036070aade7aa016283d69619d664025c3feab866a0a5691d344b2ee2bedc5dedd1f9a73eae16003a3827c9e5bbe22ded32d848fba840ffad1141ad158f5c40bc8ae0d03781b9705d851a7f1391b096c576c0f4f2a6b0 -919ee1df27fabcb21237a1b7b98f53d41d849e1b6a8f9e28c3fae2841c6b5a250e4041c737e6725476e5cd715e34d3880f58d80f61efaabc261bdc703e8750f48a923e9bf8980931b9fd9e40014c66c54b3e7c98241d76d1aa47af43313a65a1 -ac94830145dbe9a8f7e6e0fc1f5fb454502d22abcafdc2dd96c6933c604461fa83b2b37385f4bc454875a02a6d4157841250956783515d11c7456e7f11b745f12856d89f5feedaf6a61a483a6c33a21cd2ba0c18eb41a1a2e7fc33bb53e4c570 -b209c699f1233735c5bb4bce848e4365fd76651ae2184d2279a90df0c2f69ffa2a24d84a9b9f274021072953c0d65e1a0202d490d6c37186af240114e445d87bff754b4824937e4f2c90a574061b1c4910fed88d90f698025a2a264e656cb8a4 -93320dc0576b0d069de63c40e5582b4486d9adf5e69e77e3ebaf3da26976fe42147a65051501bc8383f99e7ba75479c70a6726c2cd08bf98c7481f1f819712292d833a879f21a1221a9610bc748fb5e911055122fdb4055cdc84e8bfe0f4df9b -a4380b240e998cdf668591f71a0c88ed143b0185a920787627ce65095f8223dc606fa5bce93377af100de92d663e675c0736d7f1973603a84a5c4162fb5e01c88c7493503ae1d7e9fbe8ece9b418397d68c21eeb88dae226e09875d372c646dd -aab48517d69135a16b36b685adfe9b2544a709135a21ba3e75981a2cba4ec81d1fe28ac0f72fde0c0001c15300ed6a810f58d3117bdd58d0149751d6508cf8a1a1ff7b63dd02d2730a9d6fe96c77c502fe8ed46d50a181ec4bb35e37dfbd6af4 -8277265fe75ab89ce4ec65b33fb4084bec0a56d81faf2f7a9070d2ca3065678e03a790350eba56323a54e0285bc32fe8007d5259740fde226e16cbde8354eacd562294eb9b7f727ed72ffbdad86f467cf057c737b34b80a41deb92634ed866f5 -aa40a24cb2ebe606d969392c03020070f044c95088d80f57f771b837c048342d2cd3474600d7660441090ffb8d2ffb7f0eddd67eb378e3e1477a6ba0bc38096d5d2d3355bc8b60f605f57f0c1899da591457440352381d2b38c0aa9acc7fe419 -80815d10685808cb630820629bcd2fa9041c9b74433630c0b9c1b7f7e8edf1440b520217f76ec9a50c125cf4438aa66006a1928a9ed2321da7ea325c3d56b65462b72118ca2c99a0ea733aa11da9abbeda6cc71ffeed301ae70213a29e697dcd -ac235d079f91b00b1fead7523da8f73a5409fa8970907af0c5d5e4c6a0996dccfcdb0d822d08c7fbc0c24799457d011d04312d20831825f23cf988141056a6814c8a1cac9efe37bdcbfa272aed24cd92810fea7c49b0d07683a5c53643872179 -b8aa59534d75fa5ac1c2c3f963bf73899aff5210059dbde8a8635561c6249e5143affee3bd2fd57575213b52d9a73d5702525867a7dcbb1d0a49b98c2925556fc5463ff0209742046a24ab29e74257d6419401093cc4371944d811cc300b6a67 -80bbfc5b816eea29a6d84e2217dee4d547306994d39e5592515e1b0807b67fe960d1d5addb0ff1a20c158bdb294c04bf093d28996121845a2c9268e2c9ac0f4067e889c6aaca62f8535d35b45036954bd069e3afa84f04721538c26003304c20 -a535c17d0e151d0e03d42dd58ba8c715bee3fabca2890e0e016071d34184b6b34e770d2be29c8ec76b69bcc471d50f4d043c2c240e9b93a81cff7ee2724e02018dfd9b534e40be641fdb4884abcd83b76f517557ffba508f1ba2f56313f4de94 -b237eb7465df0d325a3aa58269be2627e4978f9863f4f100ed4c303cb1f6549e606f2e3c9180824d8049191965c8dacd0a0c76cc56cb22cf1bcfdb39372c8aa29b4f7b34582b1719e6bd59c930d87d5ccd838743b585d6e229d5ed42337315c0 -805c335a2a9d2de30809cf30808ef836d88e9453c510716f01696f14c72dd60505eca8f128970edc8e63a9aa1f8792ac0dd50dcc84fbf4cc8b32349c682a6a27bc7551c7aa273a94c1606d07710188d93579afe3be1781bded15a34ed6047922 -b25dadf385ddd3c39bcb0a014d3d4f66127946b1aceae8809e3a03d66cc25e27142ca108316391f857fe82fdea4db2520cc73793b695eafbf3ade00ef7ec747b0457e49303f5e1a370f5263b436566fe24a0876e5fe088238c7be37a0718d65f -b0f753081cabe2c8fce73aba82ff67dbc9842598b3e7fa3ce2a1f534536f8ac63c532fe66552ac6b7adb28c73ed4c8a4184849be7c1756a4681ce29ebf5e1c3aa806b667ee6bd68f6397aba3215dc1caec6742f21d681e32cd1160d6a3b1d7ee -b798771eeb3d7a17c62ba5916cc034bba870da6b1ac14c2e1cae71af3ad4e0c0d1ff983f691e0e55289d5a33b131f2ec12430c9566dd71f4d8be9c79155357a5c30c5efcfd75bbe1bb6d5ada4d50604ea49ed838d3641f268ca6e25c9c4b6b72 -b52554c017388b099804abbe565346591a086d9979e10140ddaccc0a3680e506db775d7cbeafde67563adf0f09f5c2420caf19629f4e8f03e6fe02e9416ecd5269989e482b90004a083967d1141387eb74865bac6bd17e7a6d5f58225e52d4b7 -b520ff694520919023d44d53f98a7de2f78ff37b2d9193dcaa35556a6a0febf767781a4c961dce7c804bfdf81935f8f0082865253da52e79dfa1c5ff74d61495b2da76e167d46114709e877a7791a3a95e33a42f56b83f5f5afe271c67ae997c -b721401983440797a03d5b99f2088a0b249aa911969c34dd6c615b0060325da555d2ad99d931170c0868b0488a2234a4114cc0013d5163b833f5c45c5eb536421c016cf85788390176bb2dc4c196d6be26bbbfceae048b82f0d8039222e71c94 -acd9d833ba0a8cbd8d1ba939a11ea0fa5607e1bc6e693ec318bdb097aedd042d76e695dcebebd142e2e4ac30b1905dff03ec36d9cc70577e4dbe5e9ed7c20c7afb13a7f0155f203c6b83b9f1ad3d20a0d4aef0fbbbcf466ffc1bcd482bc2f5e0 -8cc1795de015f2b0e72116f169f3b4624b7738ceebea354e0bd9051c27b86f647ea36cad57ea6884c1a8adf9b45cd83514fa687e68878bbd613d793aa10986d5a0411f081689229e0d72133b3667b9f3f1a02211d0e680564eb1ea43393e1f36 -aa9281c61113c343a108de1036570feefc72fb7a96ff11f73024de12b83f29631f5a8a5900e6f10b15227c6f7462881511271bf785ebdf95ce288100e5dab391f664f6ff76c72b65b34479a4f43e5e8eba292209d6654157286ad3242ac342db -aaf16866275082e59d415db317aa874267d048ee405a553e852e6d175711d31a1fee99912345915bce121f43bc3e00d81338e5fcd3c8a1012fb4f172a9fe15622dd368b4d9d5cb60d189f423b071791fe26cea7676aca8df07965cacf80b0cd0 -accc80b3d8a6ffa648487a3d3c0ce1aeeb5401edf3cf2e385ea4a6d5fc110054fcce38f01f1da7141bbed30eb7a0a6810c82212bbb9da75d6033082dbcf6bc6a5791f85aa0f045a10da5de015edbf369b4d23b32b0c058962d2ee88e6911f994 -83f1089395a16077738cc7c9a6d6a3dc9033aac4abc508af5a1f007ca92e1a80b2e6f2dbda7fdcf0d5646de790a6201d0a9cfbcb6620a1426600e3a6a425ec004384f49fb9dcd166691a47177d45dcbcb761a11d46220b0aa09fc946131f7aa5 -9246bb586d43cb817c2e15ed609156e9f1cd284ba2f4797bbfa51c0341e1ba382eaac059aa9f63fb88d228a1a932839a171e7c7d00199dc7c4d6c5ea038a02cbc3cc5297c70401520e70ebbcffacd6a703f62896f3c788f94dde3c33ab0ecbdb -a316cb7c74feb0563c56cc79015e2774fbeca458bf8e9fb07894f9d6bcd73f7fb9428e87c816e5629e4bf7f3ec567fbc091549471b75492dde08217cb334b716b4582b24384586e53388873a78a90ec01bd7c3bace9cfc52161467df16e27c33 -ade18c74bbe60d1d69f4a570f8e5fd8696c26cc9e02829040b6b14cb9c49a4b3263b5bd5e16ec0b29010b4be054c16ab09304e23442af7d7f5fcc60bc6c5634ab6e4aed7ef334b2785e4c7672d59a687278e42d310342db5e5975d716e6d1595 -b7728800bb2039acf228fa3d8028569c426cb85d28b2b5820bbef938d5ca8c4df981d3e01a309e26ca101e8295d0f6990c03b8c239798323575874a4ee5bfe46cfe99b9657189142aacd8f8d1f26cf4c0e73c6397c31ba8f18102b9ea315b638 -8fb14f2a9be193f54977ecd3021663108ea143627b9a9d9faff85d1a86b855f6c437eab435fad3304f245bd7732af07f1173494cdb802fb96e85d2db89e1643206e183f3b228ca8d3f586e71aa9308eaf0223100bf07942fc39e465016d1f775 -ac1e025e53d98fdb3380489dce82d9d4bd3a6c98f0a523b841cb09a6f26ddd4d22efd98776e78d10fd996995fd00e81e08d3c25dd14a54b25a9d483677a24bbb8d1cb41a443b2c71038e6893b1b30f70758424e0f2039a48060191389033ef55 -a4c017311b9e930868132527a9849072b91db04fd36c619ae39c98da9e2174e6201d3c2ff1246c06b1b6815bbf3ea4a1116564f55ee2fe4c4d655e2294c0ded842cba209c255ca3d7b7f82d162f97890dfdeed087aa2f87cbfc61d61815da39d -89516315a3956b455843c2555248bd94dcb19993060fe75fdd51f7aa9c9147ab13997d8a98036a8f04bee5c91d78d2990907e35a52537a8ab3ed15f1a71afdcd38044a5b6e93f662b9d36c16933a881927cacae668c4c06ee6f004c9e3989bad -a1e78a011e210400c68ca76045f7da74119bff3cbe382efd2bd2ac76567c52d68d75536a91999d084043e1ce2d07d02e0b69fb99924101d2543521747536fbc51b0454aa9a4cbbec101121f597863a5c0fee2ca5eab35dff9b9085bef8b2b0d0 -830fd8d083e39153ecab43cabb22e29d7b44a55fba467af4ddd3f069439d2972ef53c3518de788f96b3f4f64963987d0155ba27afc28643af3de8e476ff515a68285728167408f45d99e574680bda6bacdd4322e587e4aa99386e035c0e931ad -b89584da22237e3061d991b1a55a5e55dc637b8b671130d304587729348138ef87885180310efe9f9f6d3580b9d7fdcf0649e8a79d2dec8c25a9f53df0fac5d517db999029cbfdd7c2cbd3e9a5503e5d267d3d8ad752335915c92b850b14bafb -959b8030733799882c5e3735479924b013756e57b893f9792bab4043e2d362d77cf308166d782e3989caa771b8a0c0a01302cb7b5e8ca12e2d6cebd59d4cd173c9dc25f438bac597fab17b4ff44997a489c168e7204b7d7c21d0938f0a2e3b51 -a0a9e5503d9afe0027891dab890c687fd5f5fac5741418490c64d7c15f59533dd603a50163c79402afa61bd02de486761983c94501da17e6bbe78c497f2122210071602f578adc0ebe7a4679f87fe77e09c8c122de69105f13455fea25f08e6f -9811487283ad620cd7c9b303ae2f348d0e6f5ee17b504baaa817ae207adb912a00d3cc36dbf48745eb899e6b6e22f09f0f9ba29d949ecd7350fbbfe87a8c7cdd5d0e687fc807751d07634aaf7c38baf3b24a0670c38fa6ccd7431436fc95525f -8a13aa5071c526e560def7d8583393942f07d88c9d8d26c98738fd65f57af2e3326dbb1edff0f39fe98eda4a13ed4fd71844254b954690154c4804e1c4a53df9dc4643f4b7b09d0860070f6b2318d0d63d28fb56bf5b6ff456a18dfc72fdfbbe -b9c90ff6bff5dd97d90aee27ea1c61c1afe64b054c258b097709561fe00710e9e616773fc4bdedcbf91fbd1a6cf139bf14d20db07297418694c12c6c9b801638eeb537cb3741584a686d69532e3b6c12d8a376837f712032421987f1e770c258 From 4138aa080f781cf2d1b8006a15bacf03d0bf49f6 Mon Sep 17 00:00:00 2001 From: Mario Vega Date: Tue, 5 Dec 2023 11:57:58 -0600 Subject: [PATCH 130/387] hivesim: dd documentation generation (#948) --- docs/simulators.md | 34 +++ go.mod | 1 + go.sum | 2 + hivesim/docs.go | 450 ++++++++++++++++++++++++++++++++++++++ hivesim/docs_test.go | 95 ++++++++ hivesim/hive.go | 97 ++++++-- hivesim/hive_test.go | 21 +- hivesim/testapi.go | 95 +++++--- internal/simapi/simapi.go | 3 + 9 files changed, 746 insertions(+), 52 deletions(-) create mode 100644 hivesim/docs.go create mode 100644 hivesim/docs_test.go diff --git a/docs/simulators.md b/docs/simulators.md index f38ff84e89..95b7fc8004 100644 --- a/docs/simulators.md +++ b/docs/simulators.md @@ -152,6 +152,40 @@ Now create the simulator program file `my-simulation.go`. // write your test code here } +### Generating Test Case Documentation + +The [package hivesim] provides automatic test case generation that can be used to compile all the +test cases that a given simulator runs into a markdown file. + +The documentation can be generated by executing the simulator binary with the environment variable +`HIVE_DOCS_MODE` set to "true". + +The document generator recurses into every test suite and test function that the simulator defines +and collects their names and descriptions, as defined in the `hivesim.Suite`, `hivesim.TestSpec` +or `hivesim.ClientTestSpec` objects. + +If the test object contains no description, it will not be listed in the documentation generated. + +A `TESTS.md` file that serves as an index document will be generated, inside of it a listing of +all the test suites will be included, along with the links to all test suite markdown files. + +For every test suite a `TESTS-.md` file will be generated, containing the listing of +all test cases included in the suite. + +The `Location` field of the `hivesim.Suite` can be used to specify a subdirectory where the +markdown file for this given suite will be placed. + +The `Category` field of `hivesim.TestSpec` or `hivesim.ClientTestSpec` can be used to generate +test categories in which the test cases will be grouped for readability purposes. + +The following environment variables can be used to configure document generation: +- `HIVE_DOCS_MODE`: Enable test case documentation generation (set to "true"). +- `HIVE_SIMULATOR_NAME`: Name of the simulator for which the documentation is being generated. +If unset, the path of the simulator executable will be used to parse the simulator's name. +- `HIVE_DOCS_OUTPUT_DIR`: Output root directory for all generated markdown files. +If unset, the current working directory will be used. + + ### Creating the Dockerfile The simulator needs to have a Dockerfile in order to run. diff --git a/go.mod b/go.mod index cc020945ae..698c23bffd 100644 --- a/go.mod +++ b/go.mod @@ -9,6 +9,7 @@ require ( github.com/evanw/esbuild v0.18.11 github.com/fsouza/go-dockerclient v1.9.8 github.com/gorilla/mux v1.8.0 + github.com/lithammer/dedent v1.1.0 golang.org/x/exp v0.0.0-20230905200255-921286631fa9 golang.org/x/net v0.17.0 gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1 diff --git a/go.sum b/go.sum index dde2612f42..d5f87c3ca2 100644 --- a/go.sum +++ b/go.sum @@ -226,6 +226,8 @@ github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0 github.com/labstack/echo/v4 v4.5.0/go.mod h1:czIriw4a0C1dFun+ObrXp7ok03xON0N1awStJ6ArI7Y= github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c= +github.com/lithammer/dedent v1.1.0 h1:VNzHMVCBNG1j0fh3OrsFRkVUwStdDArbgBWoPAffktY= +github.com/lithammer/dedent v1.1.0/go.mod h1:jrXYCQtgg0nJiN+StA2KgR7w6CiQNv9Fd/Z9BP0jIOc= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= diff --git a/hivesim/docs.go b/hivesim/docs.go new file mode 100644 index 0000000000..4cdd9f1fe2 --- /dev/null +++ b/hivesim/docs.go @@ -0,0 +1,450 @@ +package hivesim + +import ( + "fmt" + "io" + "os" + "path/filepath" + "sort" + "strings" + + "github.com/ethereum/hive/internal/simapi" + "github.com/lithammer/dedent" + "gopkg.in/inconshreveable/log15.v2" +) + +// Converts a string to a valid markdown link. +func toMarkdownLink(title string) string { + removeChars := []string{":", "#", "'", "\"", "`", "*", "+", ",", ";"} + title = strings.ReplaceAll(strings.ToLower(title), " ", "-") + for _, invalidChar := range removeChars { + title = strings.ReplaceAll(title, invalidChar, "") + } + return title +} + +// Formats the description string to be printed in the markdown file. +func formatDescription(desc string) string { + desc = dedent.Dedent(desc) + // Replace single quotes with backticks, since backticks are used for markdown code blocks and + // they cannot be escaped in golang (when used within backticks string). + desc = strings.ReplaceAll(desc, "'", "`") + return desc +} + +// Represents a single test case to be printed in the markdown file. +type markdownTestCase simapi.TestRequest + +// Returns the command-line to run the test case. +func (tc *markdownTestCase) commandLine(simName string, suiteName string) string { + return fmt.Sprintf("./hive --client --sim %s --sim.limit \"%s/%s\"", simName, suiteName, tc.Name) +} + +// Returns true if the test case should be printed in the markdown file. +func (tc *markdownTestCase) toBePrinted() bool { + return tc.Description != "" +} + +// Returns the test case display name. +func (tc *markdownTestCase) displayName() string { + if tc.DisplayName != "" { + return tc.DisplayName + } + return tc.Name +} + +// Returns the test case description. +func (tc *markdownTestCase) description() string { + return formatDescription(tc.Description) +} + +// Returns the test case markdown representation. +// Requires the simulation name and the suite name. +// The depth parameter is used to determine the number of '#' to use for the test case title. +func (tc *markdownTestCase) toMarkdown(simName string, suiteName string, depth int) string { + sb := strings.Builder{} + + // Print test case display name + sb.WriteString(fmt.Sprintf("%s - %s\n\n", strings.Repeat("#", depth), tc.displayName())) + + // Print command-line to run + sb.WriteString(fmt.Sprintf("%s Run\n\n", strings.Repeat("#", depth+1))) + sb.WriteString("

\n") + sb.WriteString("Command-line\n\n") + sb.WriteString(fmt.Sprintf("```bash\n%s\n```\n\n", tc.commandLine(simName, suiteName))) + sb.WriteString("
\n\n") + + // Print description + sb.WriteString(fmt.Sprintf("%s Description\n\n", strings.Repeat("#", depth+1))) + sb.WriteString(fmt.Sprintf("%s\n\n", tc.description())) + + return sb.String() +} + +// Represents a test suite to be printed in the markdown file. +type markdownSuite struct { + simapi.TestRequest + running bool + tests map[TestID]*markdownTestCase +} + +// Returns true if the test suite should be printed in the markdown file. +func (s *markdownSuite) displayName() string { + if s.DisplayName != "" { + return s.DisplayName + } + return fmt.Sprintf("`%s`", s.Name) +} + +// Returns the markdown file path for the test suite. +// If the location is set, it will be used as the directory path, and the filename will be +// `TESTS.md`. +// Otherwise, the filename will be `TESTS-.md`. +func (s *markdownSuite) mardownFilePath() string { + if s.Location != "" { + return fmt.Sprintf("%s/TESTS.md", s.Location) + } + title := strings.ReplaceAll(strings.ToUpper(s.Name), " ", "-") + return fmt.Sprintf("TESTS-%s.md", title) +} + +// Returns the command-line to run the test suite. +func (s *markdownSuite) commandLine(simName string) string { + return fmt.Sprintf("./hive --client --sim %s --sim.limit \"%s/\"", simName, s.Name) +} + +// Returns true if the test suite should be printed in the markdown file. +func (s *markdownSuite) description() string { + return formatDescription(s.Description) +} + +// Returns a sorted list of the test IDs +func (s *markdownSuite) testIDs() []TestID { + testIDs := make([]TestID, 0, len(s.tests)) + for testID := range s.tests { + testIDs = append(testIDs, testID) + } + sort.Slice(testIDs, func(i, j int) bool { + return testIDs[i] < testIDs[j] + }) + return testIDs +} + +// Returns a list of all the unique categories in all of the test cases. +func (s *markdownSuite) getCategories() []string { + categoryMap := make(map[string]struct{}) + categories := make([]string, 0) + for _, tcID := range s.testIDs() { + tc := s.tests[tcID] + if tc.toBePrinted() { + if _, ok := categoryMap[tc.Category]; !ok { + categories = append(categories, tc.Category) + categoryMap[tc.Category] = struct{}{} + } + } + } + return categories +} + +// Returns the markdown representation of the test suite. +func (s *markdownSuite) toMarkdown(simName string) (string, error) { + headerBuilder := strings.Builder{} + categoryBuilder := map[string]*strings.Builder{} + headerBuilder.WriteString(fmt.Sprintf("# %s - Test Cases\n\n", s.displayName())) + + headerBuilder.WriteString(fmt.Sprintf("%s\n\n", s.description())) + + headerBuilder.WriteString("## Run Suite\n\n") + + headerBuilder.WriteString("
\n") + headerBuilder.WriteString("Command-line\n\n") + headerBuilder.WriteString(fmt.Sprintf("```bash\n%s\n```\n\n", s.commandLine(simName))) + headerBuilder.WriteString("
\n\n") + + categories := s.getCategories() + + tcDepth := 3 + if len(categories) > 1 { + headerBuilder.WriteString("## Test Case Categories\n\n") + for _, category := range categories { + if category == "" { + category = "Other" + } + headerBuilder.WriteString(fmt.Sprintf("- [%s](#category-%s)\n\n", category, toMarkdownLink(category))) + } + } else { + headerBuilder.WriteString("## Test Cases\n\n") + } + + for _, tcID := range s.testIDs() { + tc := s.tests[tcID] + if !tc.toBePrinted() { + continue + } + contentBuilder, ok := categoryBuilder[tc.Category] + if !ok { + contentBuilder = &strings.Builder{} + categoryBuilder[tc.Category] = contentBuilder + } + contentBuilder.WriteString(tc.toMarkdown(simName, s.Name, tcDepth)) + } + + if len(categoryBuilder) > 1 { + for _, category := range categories { + if category == "" { + category = "Other" + } + contentBuilder, ok := categoryBuilder[category] + if !ok { + continue + } + headerBuilder.WriteString(fmt.Sprintf("## Category: %s\n\n", category)) + headerBuilder.WriteString(contentBuilder.String()) + } + } else { + for _, contentBuilder := range categoryBuilder { + headerBuilder.WriteString(contentBuilder.String()) + } + } + + return headerBuilder.String(), nil +} + +// Writes the markdown representation of the test suite to a file. +func (s *markdownSuite) toMarkdownFile(fw FileWriter, simName string) error { + // Create the file. + file, err := fw.CreateWriter(s.mardownFilePath()) + if err != nil { + return err + } + defer file.Close() + + // Write the markdown. + markdown, err := s.toMarkdown(simName) + if err != nil { + return err + } + _, err = file.Write([]byte(markdown)) + return err +} + +// Docs collector object: +// - Collects the test cases and test suites. +// - Generates markdown files. +type docsCollector struct { + simName string + outputDir string + suites map[SuiteID]*markdownSuite +} + +// Returns the simulator name from the path of the currently running binary. +func simulatorNameFromBinaryPath() string { + execPath, err := os.Executable() + if err != nil { + panic(err) + } + var ( + path = filepath.Dir(execPath) + name = filepath.Base(path) + names = make([]string, 0) + ) + for path != "/" && name != "simulators" { + names = append([]string{name}, names...) + path = filepath.Dir(path) + name = filepath.Base(path) + } + return strings.Join(names, "/") +} + +// NewDocsCollector creates a new docs collector object. +// Tries to parse the simulator name and also the output directory from the environment variables. +func NewDocsCollector() *docsCollector { + docs := &docsCollector{ + suites: make(map[SuiteID]*markdownSuite), + } + // Set the simulation name: if `HIVE_SIMULATOR_NAME` is set, use that, otherwise use the + // folder name and its parent. + docs.simName = os.Getenv("HIVE_SIMULATOR_NAME") + if docs.simName == "" { + docs.simName = simulatorNameFromBinaryPath() + } + + // Set the output directory: if `HIVE_DOCS_OUTPUT_DIR` is set, use that, otherwise use the + // current directory. + docs.outputDir = os.Getenv("HIVE_DOCS_OUTPUT_DIR") + if docs.outputDir == "" { + var err error + docs.outputDir, err = os.Getwd() + if err != nil { + panic(err) + } + } + + return docs +} + +// Returns true if any suite is still running +func (docs *docsCollector) AnyRunning() bool { + for _, s := range docs.suites { + if s.running { + return true + } + } + return false +} + +// Returns a sorted list of the suite IDs +func (docs *docsCollector) suiteIDs() []SuiteID { + // Returns a sorted list of the suite IDs + suiteIDs := make([]SuiteID, 0, len(docs.suites)) + for suiteID := range docs.suites { + suiteIDs = append(suiteIDs, suiteID) + } + sort.Slice(suiteIDs, func(i, j int) bool { + return suiteIDs[i] < suiteIDs[j] + }) + return suiteIDs +} + +// Starts a new test suite, and appends it to the suites map. +func (docs *docsCollector) StartSuite(suite *simapi.TestRequest, simlog string) (SuiteID, error) { + // Create a new markdown suite. + markdownSuite := &markdownSuite{ + TestRequest: *suite, + running: true, + tests: make(map[TestID]*markdownTestCase), + } + // Next suite id + suiteID := SuiteID(len(docs.suites)) + // Add the suite to the map. + docs.suites[suiteID] = markdownSuite + // Return the suite ID. + return suiteID, nil +} + +// Ends a test suite. If the suite does not exist, returns an error. +// If all suites are done, generates the markdown files. +func (docs *docsCollector) EndSuite(testSuite SuiteID) error { + suite, ok := docs.suites[testSuite] + if !ok { + return fmt.Errorf("test suite %d does not exist", testSuite) + } + suite.running = false + if !docs.AnyRunning() { + // Generate markdown files when all suites are done. + if err := docs.genSimulatorMarkdownFiles(NewFileWriter(docs.outputDir)); err != nil { + log15.Error("can't generate markdown files", "err", err) + } + } + return nil +} + +// Starts a new test case, and appends it to the tests map in the test suite. +// If the suite does not exist, returns an error. +func (docs *docsCollector) StartTest(testSuite SuiteID, test *simapi.TestRequest) (TestID, error) { + // Create a new markdown test case. + markdownTest := markdownTestCase(*test) + // Check if suite exists. + if _, ok := docs.suites[testSuite]; !ok { + return 0, fmt.Errorf("test suite %d does not exist", testSuite) + } + // Next test id + testID := TestID(len(docs.suites[testSuite].tests)) + // Add the test to the map. + docs.suites[testSuite].tests[testID] = &markdownTest + // Return the test ID. + return testID, nil +} + +// Ends a test case. If the suite or the test case or suite do not exist, returns an error. +func (docs *docsCollector) EndTest(testSuite SuiteID, test TestID, testResult TestResult) error { + // Check if suite exists. + if _, ok := docs.suites[testSuite]; !ok { + return fmt.Errorf("test suite %d does not exist", testSuite) + } + // Check if test exists. + if _, ok := docs.suites[testSuite].tests[test]; !ok { + return fmt.Errorf("test %d does not exist", test) + } + return nil +} + +// Return a generic "Client" client type. +func (docs *docsCollector) ClientTypes() ([]*ClientDefinition, error) { + return []*ClientDefinition{ + { + Name: "Client", + Version: "1.0.0", + }, + }, nil +} + +// Generates the markdown index file that will point to the test suites' markdown files. +func (docs *docsCollector) generateIndex(simName string) (string, error) { + headerBuilder := strings.Builder{} + headerBuilder.WriteString(fmt.Sprintf("# Simulator `%s` Test Cases\n\n", simName)) + headerBuilder.WriteString("## Test Suites\n\n") + for _, sID := range docs.suiteIDs() { + s := docs.suites[sID] + headerBuilder.WriteString(fmt.Sprintf("### - [%s](%s)\n", s.displayName(), s.mardownFilePath())) + headerBuilder.WriteString(s.Description) + headerBuilder.WriteString("\n\n") + } + return headerBuilder.String() + "\n", nil +} + +// Generates the markdown index file that will point to the test suites' markdown files. +func (docs *docsCollector) generateIndexFile(fw FileWriter, simName string) error { + markdownIndex, err := docs.generateIndex(simName) + if err != nil { + return err + } + file, err := fw.CreateWriter("TESTS.md") + if err != nil { + return err + } + defer file.Close() + _, err = file.Write([]byte(markdownIndex)) + return err +} + +// Generates the markdown files for all the test suites, including the index file. +func (docs *docsCollector) genSimulatorMarkdownFiles(fw FileWriter) error { + err := docs.generateIndexFile(fw, docs.simName) + if err != nil { + return err + } + for _, sID := range docs.suiteIDs() { + s := docs.suites[sID] + if err := s.toMarkdownFile(fw, docs.simName); err != nil { + return err + } + } + return nil +} + +// FileWriter interface. Used to create the markdown files. +type FileWriter interface { + CreateWriter(path string) (io.WriteCloser, error) +} + +// FileWriter implementation that writes to the filesystem. +// The basePath is the root directory where the files will be created. +type fileWriter struct { + basePath string +} + +// Creates a new file writer. The path starts from the base directory that is the fileWriter. +// Subdirectories will be created if they do not exist. +func (fw fileWriter) CreateWriter(path string) (io.WriteCloser, error) { + filePath := filepath.FromSlash(fmt.Sprintf("%s/%s", filepath.ToSlash(fw.basePath), path)) + if err := os.MkdirAll(filepath.Dir(filePath), 0755); err != nil { + return nil, err + } + return os.Create(filePath) +} + +// NewFileWriter creates a new file writer with the given base path. +func NewFileWriter(basePath string) FileWriter { + return fileWriter{basePath} +} diff --git a/hivesim/docs_test.go b/hivesim/docs_test.go new file mode 100644 index 0000000000..3c96d046bc --- /dev/null +++ b/hivesim/docs_test.go @@ -0,0 +1,95 @@ +package hivesim + +import ( + "bytes" + "io" + "testing" + + "github.com/ethereum/hive/internal/simapi" +) + +type nopCloser struct { + io.Writer +} + +func (c nopCloser) Close() error { + // No-op + return nil +} + +type testWriter struct { + fileMap map[string]*bytes.Buffer +} + +func (tw *testWriter) Contains(file string) bool { + for k := range tw.fileMap { + if k == file { + return true + } + } + return false +} + +func (tw *testWriter) CreateWriter(path string) (io.WriteCloser, error) { + if _, ok := tw.fileMap[path]; !ok { + tw.fileMap[path] = &bytes.Buffer{} + } + return nopCloser{tw.fileMap[path]}, nil +} + +func TestSuiteDocsGen(t *testing.T) { + suiteMap := map[SuiteID]*markdownSuite{ + 1: { + TestRequest: simapi.TestRequest{ + Name: "suite1", + Description: `This is a description of suite1.`, + }, + tests: map[TestID]*markdownTestCase{ + 1: { + Name: "test1", + Description: `This is a description of test1 in suite1.`, + }, + 2: { + Name: "test2", + Description: `This is a description of test2 in suite1.`, + }, + }, + }, + 2: { + TestRequest: simapi.TestRequest{ + Name: "suite2", + DisplayName: "Suite 2", + Location: "suite2", + Description: `This is a description of suite2.`, + }, + tests: map[TestID]*markdownTestCase{ + 1: { + Name: "testA", + Description: `This is a description of testA in suite2.`, + }, + 2: { + Name: "testB", + DisplayName: "Test B", + Description: `This is a description of testB in suite2.`, + }, + }, + }, + } + docsSim := &docsCollector{ + suites: suiteMap, + simName: "sim", + } + tw := &testWriter{map[string]*bytes.Buffer{}} + if err := docsSim.genSimulatorMarkdownFiles(tw); err != nil { + t.Fatal(err) + } + if len(tw.fileMap) != 3 { + t.Fatalf("expected 3 files, got %d", len(tw.fileMap)) + } + + for _, expFile := range []string{"TESTS.md", "TESTS-SUITE1.md", "suite2/TESTS.md"} { + if !tw.Contains(expFile) { + t.Fatalf("expected file %s not found", expFile) + } + } +} diff --git a/hivesim/hive.go b/hivesim/hive.go index ba29d5d2f1..1837fec34d 100644 --- a/hivesim/hive.go +++ b/hivesim/hive.go @@ -21,22 +21,32 @@ import ( // Simulation wraps the simulation HTTP API provided by hive. type Simulation struct { - url string - m testMatcher - ll int + url string + m testMatcher + docs *docsCollector + ll int } // New looks up the hive host URI using the HIVE_SIMULATOR environment variable // and connects to it. It will panic if HIVE_SIMULATOR is not set. +// If HIVE_DOCS_MODE is set to "true", it will inhibit most of the functionality +// in order to simplify execution for documentation generation. func New() *Simulation { - url, isSet := os.LookupEnv("HIVE_SIMULATOR") - if !isSet { - panic("HIVE_SIMULATOR environment variable not set") - } - if url == "" { - panic("HIVE_SIMULATOR environment variable is empty") + var ( + docs *docsCollector + url string + ) + if cc := os.Getenv("HIVE_DOCS_MODE"); cc == "true" { + docs = NewDocsCollector() + } else { + var isSet bool + if url, isSet = os.LookupEnv("HIVE_SIMULATOR"); !isSet { + panic("HIVE_SIMULATOR environment variable not set") + } else if url == "" { + panic("HIVE_SIMULATOR environment variable is empty") + } } - sim := &Simulation{url: url} + sim := &Simulation{url: url, docs: docs} if p := os.Getenv("HIVE_TEST_PATTERN"); p != "" { m, err := parseTestPattern(p) if err != nil { @@ -80,18 +90,29 @@ func (sim *Simulation) TestPattern() (suiteExpr string, testNameExpr string) { return se, te } +// CollectTestsOnly returns true if the simulation is running in collect-tests-only mode. +func (sim *Simulation) CollectTestsOnly() bool { + return sim.docs != nil +} + // EndTest finishes the test case, cleaning up everything, logging results, and returning // an error if the process could not be completed. func (sim *Simulation) EndTest(testSuite SuiteID, test TestID, testResult TestResult) error { + if sim.docs != nil { + return sim.docs.EndTest(testSuite, test, testResult) + } url := fmt.Sprintf("%s/testsuite/%d/test/%d", sim.url, testSuite, test) return post(url, &testResult, nil) } // StartSuite signals the start of a test suite. -func (sim *Simulation) StartSuite(name, description, simlog string) (SuiteID, error) { +func (sim *Simulation) StartSuite(suite *simapi.TestRequest, simlog string) (SuiteID, error) { + if sim.docs != nil { + return sim.docs.StartSuite(suite, simlog) + } var ( url = fmt.Sprintf("%s/testsuite", sim.url) - req = &simapi.TestRequest{Name: name, Description: description} + req = suite resp SuiteID ) err := post(url, req, &resp) @@ -100,15 +121,21 @@ func (sim *Simulation) StartSuite(name, description, simlog string) (SuiteID, er // EndSuite signals the end of a test suite. func (sim *Simulation) EndSuite(testSuite SuiteID) error { + if sim.docs != nil { + return sim.docs.EndSuite(testSuite) + } url := fmt.Sprintf("%s/testsuite/%d", sim.url, testSuite) return requestDelete(url) } // StartTest starts a new test case, returning the testcase id as a context identifier. -func (sim *Simulation) StartTest(testSuite SuiteID, name string, description string) (TestID, error) { +func (sim *Simulation) StartTest(testSuite SuiteID, test *simapi.TestRequest) (TestID, error) { + if sim.docs != nil { + return sim.docs.StartTest(testSuite, test) + } var ( url = fmt.Sprintf("%s/testsuite/%d/test", sim.url, testSuite) - req = &simapi.TestRequest{Name: name, Description: description} + req = test resp TestID ) err := post(url, req, &resp) @@ -118,6 +145,9 @@ func (sim *Simulation) StartTest(testSuite SuiteID, name string, description str // ClientTypes returns all client types available to this simulator run. This depends on // both the available client set and the command line filters. func (sim *Simulation) ClientTypes() ([]*ClientDefinition, error) { + if sim.docs != nil { + return sim.docs.ClientTypes() + } var ( url = fmt.Sprintf("%s/clients", sim.url) resp []*ClientDefinition @@ -131,6 +161,9 @@ func (sim *Simulation) ClientTypes() ([]*ClientDefinition, error) { // GetClientTypes. The input is used as environment variables in the new container. // Returns container id and ip. func (sim *Simulation) StartClient(testSuite SuiteID, test TestID, parameters map[string]string, initFiles map[string]string) (string, net.IP, error) { + if sim.docs != nil { + return "", nil, errors.New("StartClient is not supported in docs mode") + } clientType, ok := parameters["CLIENT"] if !ok { return "", nil, errors.New("missing 'CLIENT' parameter") @@ -141,6 +174,9 @@ func (sim *Simulation) StartClient(testSuite SuiteID, test TestID, parameters ma // StartClientWithOptions starts a new node (or other container) with specified options. // Returns container id and ip. func (sim *Simulation) StartClientWithOptions(testSuite SuiteID, test TestID, clientType string, options ...StartOption) (string, net.IP, error) { + if sim.docs != nil { + return "", nil, errors.New("StartClientWithOptions is not supported in docs mode") + } var ( url = fmt.Sprintf("%s/testsuite/%d/test/%d/node", sim.url, testSuite, test) resp simapi.StartNodeResponse @@ -170,6 +206,9 @@ func (sim *Simulation) StartClientWithOptions(testSuite SuiteID, test TestID, cl // StopClient signals to the host that the node is no longer required. func (sim *Simulation) StopClient(testSuite SuiteID, test TestID, nodeid string) error { + if sim.docs != nil { + return errors.New("StopClient is not supported in docs mode") + } req, err := http.NewRequest(http.MethodDelete, fmt.Sprintf("%s/testsuite/%d/test/%d/node/%s", sim.url, testSuite, test, nodeid), nil) if err != nil { return err @@ -180,6 +219,9 @@ func (sim *Simulation) StopClient(testSuite SuiteID, test TestID, nodeid string) // PauseClient signals to the host that the node needs to be paused. func (sim *Simulation) PauseClient(testSuite SuiteID, test TestID, nodeid string) error { + if sim.docs != nil { + return errors.New("PauseClient is not supported in docs mode") + } req, err := http.NewRequest(http.MethodPost, fmt.Sprintf("%s/testsuite/%d/test/%d/node/%s/pause", sim.url, testSuite, test, nodeid), nil) if err != nil { return err @@ -190,6 +232,9 @@ func (sim *Simulation) PauseClient(testSuite SuiteID, test TestID, nodeid string // UnpauseClient signals to the host that the node needs to be unpaused. func (sim *Simulation) UnpauseClient(testSuite SuiteID, test TestID, nodeid string) error { + if sim.docs != nil { + return errors.New("UnpauseClient is not supported in docs mode") + } req, err := http.NewRequest(http.MethodDelete, fmt.Sprintf("%s/testsuite/%d/test/%d/node/%s/pause", sim.url, testSuite, test, nodeid), nil) if err != nil { return err @@ -200,11 +245,17 @@ func (sim *Simulation) UnpauseClient(testSuite SuiteID, test TestID, nodeid stri // ClientEnodeURL returns the enode URL of a running client. func (sim *Simulation) ClientEnodeURL(testSuite SuiteID, test TestID, node string) (string, error) { + if sim.docs != nil { + return "", errors.New("ClientEnodeURL is not supported in docs mode") + } return sim.ClientEnodeURLNetwork(testSuite, test, node, "bridge") } // ClientEnodeURLCustomNetwork returns the enode URL of a running client in a custom network. func (sim *Simulation) ClientEnodeURLNetwork(testSuite SuiteID, test TestID, node string, network string) (string, error) { + if sim.docs != nil { + return "", errors.New("ClientEnodeURLNetwork is not supported in docs mode") + } resp, err := sim.ClientExec(testSuite, test, node, []string{"enode.sh"}) if err != nil { return "", err @@ -243,6 +294,9 @@ func (sim *Simulation) ClientEnodeURLNetwork(testSuite SuiteID, test TestID, nod // ClientExec runs a command in a running client. func (sim *Simulation) ClientExec(testSuite SuiteID, test TestID, nodeid string, cmd []string) (*ExecInfo, error) { + if sim.docs != nil { + return nil, errors.New("ClientExec is not supported in docs mode") + } var ( url = fmt.Sprintf("%s/testsuite/%d/test/%d/node/%s/exec", sim.url, testSuite, test, nodeid) req = &simapi.ExecRequest{Command: cmd} @@ -255,12 +309,18 @@ func (sim *Simulation) ClientExec(testSuite SuiteID, test TestID, nodeid string, // CreateNetwork sends a request to the hive server to create a docker network by // the given name. func (sim *Simulation) CreateNetwork(testSuite SuiteID, networkName string) error { + if sim.docs != nil { + return errors.New("CreateNetwork is not supported in docs mode") + } url := fmt.Sprintf("%s/testsuite/%d/network/%s", sim.url, testSuite, networkName) return post(url, nil, nil) } // RemoveNetwork sends a request to the hive server to remove the given network. func (sim *Simulation) RemoveNetwork(testSuite SuiteID, network string) error { + if sim.docs != nil { + return errors.New("RemoveNetwork is not supported in docs mode") + } url := fmt.Sprintf("%s/testsuite/%d/network/%s", sim.url, testSuite, network) return requestDelete(url) } @@ -268,6 +328,9 @@ func (sim *Simulation) RemoveNetwork(testSuite SuiteID, network string) error { // ConnectContainer sends a request to the hive server to connect the given // container to the given network. func (sim *Simulation) ConnectContainer(testSuite SuiteID, network, containerID string) error { + if sim.docs != nil { + return errors.New("ConnectContainer is not supported in docs mode") + } url := fmt.Sprintf("%s/testsuite/%d/network/%s/%s", sim.url, testSuite, network, containerID) return post(url, nil, nil) } @@ -275,6 +338,9 @@ func (sim *Simulation) ConnectContainer(testSuite SuiteID, network, containerID // DisconnectContainer sends a request to the hive server to disconnect the given // container from the given network. func (sim *Simulation) DisconnectContainer(testSuite SuiteID, network, containerID string) error { + if sim.docs != nil { + return errors.New("DisconnectContainer is not supported in docs mode") + } url := fmt.Sprintf("%s/testsuite/%d/network/%s/%s", sim.url, testSuite, network, containerID) return requestDelete(url) } @@ -282,6 +348,9 @@ func (sim *Simulation) DisconnectContainer(testSuite SuiteID, network, container // ContainerNetworkIP returns the IP address of a container on the given network. If the // container ID is "simulation", it returns the IP address of the simulator container. func (sim *Simulation) ContainerNetworkIP(testSuite SuiteID, network, containerID string) (string, error) { + if sim.docs != nil { + return "", errors.New("ContainerNetworkIP is not supported in docs mode") + } var ( url = fmt.Sprintf("%s/testsuite/%d/network/%s/%s", sim.url, testSuite, network, containerID) resp string diff --git a/hivesim/hive_test.go b/hivesim/hive_test.go index 64c5053cdb..8c0016bcf1 100644 --- a/hivesim/hive_test.go +++ b/hivesim/hive_test.go @@ -13,6 +13,7 @@ import ( "github.com/davecgh/go-spew/spew" "github.com/ethereum/hive/internal/fakes" "github.com/ethereum/hive/internal/libhive" + "github.com/ethereum/hive/internal/simapi" ) // This test checks that the API returns configured client names correctly. @@ -73,11 +74,11 @@ func TestEnodeReplaceIP(t *testing.T) { // Start the client. sim := NewAt(srv.URL) - suiteID, err := sim.StartSuite("suite", "", "") + suiteID, err := sim.StartSuite(&simapi.TestRequest{Name: "suite"}, "") if err != nil { t.Fatal("can't start suite:", err) } - testID, err := sim.StartTest(suiteID, "test", "") + testID, err := sim.StartTest(suiteID, &simapi.TestRequest{Name: "test"}) if err != nil { t.Fatal("can't start test:", err) } @@ -125,11 +126,11 @@ func TestStartClientStartOptions(t *testing.T) { // Start the suite and test. sim := NewAt(srv.URL) - suiteID, err := sim.StartSuite("suite", "", "") + suiteID, err := sim.StartSuite(&simapi.TestRequest{Name: "suite"}, "") if err != nil { t.Fatal("can't start suite:", err) } - testID, err := sim.StartTest(suiteID, "test", "") + testID, err := sim.StartTest(suiteID, &simapi.TestRequest{Name: "test"}) if err != nil { t.Fatal("can't start test:", err) } @@ -262,11 +263,11 @@ func TestRunProgram(t *testing.T) { defer tm.Terminate() sim := NewAt(srv.URL) - suiteID, err := sim.StartSuite("suite", "", "") + suiteID, err := sim.StartSuite(&simapi.TestRequest{Name: "suite"}, "") if err != nil { t.Fatal("can't start suite:", err) } - testID, err := sim.StartTest(suiteID, "test", "") + testID, err := sim.StartTest(suiteID, &simapi.TestRequest{Name: "test"}) if err != nil { t.Fatal("can't start test:", err) } @@ -309,11 +310,11 @@ func TestStartClientErrors(t *testing.T) { defer tm.Terminate() sim := NewAt(srv.URL) - suiteID, err := sim.StartSuite("suite", "", "") + suiteID, err := sim.StartSuite(&simapi.TestRequest{Name: "suite"}, "") if err != nil { t.Fatal("can't start suite:", err) } - testID, err := sim.StartTest(suiteID, "test", "") + testID, err := sim.StartTest(suiteID, &simapi.TestRequest{Name: "test"}) if err != nil { t.Fatal("can't start test:", err) } @@ -365,11 +366,11 @@ func TestStartClientInitialNetworks(t *testing.T) { defer tm.Terminate() sim := NewAt(srv.URL) - suiteID, err := sim.StartSuite("suite", "", "") + suiteID, err := sim.StartSuite(&simapi.TestRequest{Name: "suite"}, "") if err != nil { t.Fatal("can't start suite:", err) } - testID, err := sim.StartTest(suiteID, "test", "") + testID, err := sim.StartTest(suiteID, &simapi.TestRequest{Name: "test"}) if err != nil { t.Fatal("can't start test:", err) } diff --git a/hivesim/testapi.go b/hivesim/testapi.go index 4b4f052a63..27f97ad2c3 100644 --- a/hivesim/testapi.go +++ b/hivesim/testapi.go @@ -9,15 +9,29 @@ import ( "sync" "github.com/ethereum/go-ethereum/rpc" + "github.com/ethereum/hive/internal/simapi" ) // Suite is the description of a test suite. type Suite struct { - Name string - Description string + Name string // Name is the unique identifier for the suite [Mandatory] + DisplayName string // Display name for the suite (Name will be used if unset) [Optional] + Location string // Documentation output location for the test suite [Optional] + Category string // Category of the test suite [Optional] + Description string // Description of the test suite (if empty, suite won't appear in documentation) [Optional] Tests []AnyTest } +func (s *Suite) request() *simapi.TestRequest { + return &simapi.TestRequest{ + Name: s.Name, + DisplayName: s.DisplayName, + Location: s.Location, + Category: s.Category, + Description: s.Description, + } +} + // Add adds a test to the suite. func (s *Suite) Add(test AnyTest) *Suite { s.Tests = append(s.Tests, test) @@ -56,7 +70,7 @@ func RunSuite(host *Simulation, suite Suite) error { return nil } - suiteID, err := host.StartSuite(suite.Name, suite.Description, "") + suiteID, err := host.StartSuite(suite.request(), "") if err != nil { return err } @@ -93,8 +107,10 @@ func MustRunSuite(host *Simulation, suite Suite) { type TestSpec struct { // These fields are displayed in the UI. Be sure to add // a meaningful description here. - Name string - Description string + Name string // Name is the unique identifier for the test [Mandatory] + DisplayName string // Display name for the test (Name will be used if unset) [Optional] + Description string // Description of the test (if empty, test won't appear in documentation) [Optional] + Category string // Category of the test [Optional] // If AlwaysRun is true, the test will run even if Name does not match the test // pattern. This option is useful for tests that launch a client instance and @@ -115,8 +131,10 @@ type TestSpec struct { type ClientTestSpec struct { // These fields are displayed in the UI. Be sure to add // a meaningful description here. - Name string - Description string + Name string // Name is the unique identifier for the test [Mandatory] + DisplayName string // Display name for the test (Name will be used if unset) [Optional] + Description string // Description of the test (if empty, test won't appear in documentation) [Optional] + Category string // Category of the test [Optional] // If AlwaysRun is true, the test will run even if Name does not match the test // pattern. This option is useful for tests that launch a client instance and @@ -208,11 +226,13 @@ func (t *T) StartClient(clientType string, option ...StartOption) *Client { // It waits for the subtest to complete. func (t *T) RunClient(clientType string, spec ClientTestSpec) { test := testSpec{ - suiteID: t.SuiteID, - suite: t.suite, - name: clientTestName(spec.Name, clientType), - desc: spec.Description, - alwaysRun: spec.AlwaysRun, + suiteID: t.SuiteID, + suite: t.suite, + name: clientTestName(spec.Name, clientType), + displayName: spec.DisplayName, + category: spec.Category, + desc: spec.Description, + alwaysRun: spec.AlwaysRun, } runTest(t.Sim, test, func(t *T) { client := t.StartClient(clientType, spec.Parameters, WithStaticFiles(spec.Files)) @@ -298,11 +318,22 @@ func (t *T) FailNow() { } type testSpec struct { - suiteID SuiteID - suite *Suite - name string - desc string - alwaysRun bool + suiteID SuiteID + suite *Suite + name string + displayName string + category string + desc string + alwaysRun bool +} + +func (spec testSpec) request() *simapi.TestRequest { + return &simapi.TestRequest{ + Name: spec.name, + DisplayName: spec.displayName, + Category: spec.category, + Description: spec.desc, + } } func runTest(host *Simulation, test testSpec, runit func(t *T)) error { @@ -319,7 +350,7 @@ func runTest(host *Simulation, test testSpec, runit func(t *T)) error { SuiteID: test.suiteID, suite: test.suite, } - testID, err := host.StartTest(test.suiteID, test.name, test.desc) + testID, err := host.StartTest(test.suiteID, test.request()) if err != nil { return err } @@ -343,6 +374,10 @@ func runTest(host *Simulation, test testSpec, runit func(t *T)) error { } close(done) }() + if host.CollectTestsOnly() && !test.alwaysRun { + // Don't run the test if we're just generating docs. + return + } runit(t) }() <-done @@ -361,11 +396,13 @@ func (spec ClientTestSpec) runTest(host *Simulation, suiteID SuiteID, suite *Sui continue } test := testSpec{ - suiteID: suiteID, - suite: suite, - name: clientTestName(spec.Name, clientDef.Name), - desc: spec.Description, - alwaysRun: spec.AlwaysRun, + suiteID: suiteID, + suite: suite, + name: clientTestName(spec.Name, clientDef.Name), + displayName: spec.DisplayName, + category: spec.Category, + desc: spec.Description, + alwaysRun: spec.AlwaysRun, } err := runTest(host, test, func(t *T) { client := t.StartClient(clientDef.Name, spec.Parameters, WithStaticFiles(spec.Files)) @@ -391,11 +428,13 @@ func clientTestName(name, clientType string) string { func (spec TestSpec) runTest(host *Simulation, suiteID SuiteID, suite *Suite) error { test := testSpec{ - suiteID: suiteID, - suite: suite, - name: spec.Name, - desc: spec.Description, - alwaysRun: spec.AlwaysRun, + suiteID: suiteID, + suite: suite, + name: spec.Name, + displayName: spec.DisplayName, + category: spec.Category, + desc: spec.Description, + alwaysRun: spec.AlwaysRun, } return runTest(host, test, spec.Run) } diff --git a/internal/simapi/simapi.go b/internal/simapi/simapi.go index 488fbd1a22..af189d0510 100644 --- a/internal/simapi/simapi.go +++ b/internal/simapi/simapi.go @@ -3,6 +3,9 @@ package simapi type TestRequest struct { Name string `json:"name"` + DisplayName string `json:"display_name"` + Location string `json:"location"` + Category string `json:"category"` Description string `json:"description"` } From 4ad82c58ce37d02c4cd419ce1b5188095851c3aa Mon Sep 17 00:00:00 2001 From: Somnath Date: Wed, 6 Dec 2023 23:20:37 +0400 Subject: [PATCH 131/387] clients/erigon, simulators/ethereum/rpc: patch RPC tests for erigon (#953) TTDPassed=true would make Erigon consider it POS chain - not applicable for clique or fakepow-based tests --- clients/erigon/erigon.sh | 2 +- clients/erigon/mapper.jq | 2 +- simulators/ethereum/rpc/main.go | 1 + 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/clients/erigon/erigon.sh b/clients/erigon/erigon.sh index 4613d22ff0..63fb3e0dc1 100644 --- a/clients/erigon/erigon.sh +++ b/clients/erigon/erigon.sh @@ -128,7 +128,7 @@ fi # Configure RPC. FLAGS="$FLAGS --http --http.addr=0.0.0.0 --http.api=admin,debug,eth,net,txpool,web3" -FLAGS="$FLAGS --ws" +FLAGS="$FLAGS --ws --ws.port=8546" # Increase blob slots for tests FLAGS="$FLAGS --txpool.blobslots=1000" diff --git a/clients/erigon/mapper.jq b/clients/erigon/mapper.jq index c68dca50d4..60499b9476 100644 --- a/clients/erigon/mapper.jq +++ b/clients/erigon/mapper.jq @@ -54,7 +54,7 @@ def to_bool: "grayGlacierBlock": env.HIVE_FORK_GRAY_GLACIER|to_int, "mergeNetsplitBlock": env.HIVE_MERGE_BLOCK_ID|to_int, "terminalTotalDifficulty": env.HIVE_TERMINAL_TOTAL_DIFFICULTY|to_int, - "terminalTotalDifficultyPassed": true, + "terminalTotalDifficultyPassed": (if env.HIVE_TERMINAL_TOTAL_DIFFICULTY_PASSED == null then 1 else env.HIVE_TERMINAL_TOTAL_DIFFICULTY_PASSED|to_bool end), "shanghaiTime": env.HIVE_SHANGHAI_TIMESTAMP|to_int, "cancunTime": env.HIVE_CANCUN_TIMESTAMP|to_int, }|remove_empty diff --git a/simulators/ethereum/rpc/main.go b/simulators/ethereum/rpc/main.go index 49f2d16127..9352da515e 100644 --- a/simulators/ethereum/rpc/main.go +++ b/simulators/ethereum/rpc/main.go @@ -31,6 +31,7 @@ var clientEnv = hivesim.Params{ "HIVE_CLIQUE_PERIOD": "1", "HIVE_CLIQUE_PRIVATEKEY": "9c647b8b7c4e7c3490668fb6c11473619db80c93704c70893d3813af4090c39c", "HIVE_MINER": "658bdf435d810c91414ec09147daa6db62406379", + "HIVE_TERMINAL_TOTAL_DIFFICULTY_PASSED": "0", } var files = map[string]string{ From 228bffd9324e44eaa535c7c375d907e51960066f Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Thu, 14 Dec 2023 15:58:51 +0000 Subject: [PATCH 132/387] cmd/hivechain: fix typos in contracts --- cmd/hivechain/contracts/genlogs.eas | 2 +- cmd/hivechain/contracts/genstorage.eas | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/cmd/hivechain/contracts/genlogs.eas b/cmd/hivechain/contracts/genlogs.eas index 044e4bb699..3ddb4d404e 100644 --- a/cmd/hivechain/contracts/genlogs.eas +++ b/cmd/hivechain/contracts/genlogs.eas @@ -4,7 +4,7 @@ #include "rng.eas" .start: - %RngInit(0) ; [] + %RngInit(0) ; [] genlogs: ;; emit log with random topic. diff --git a/cmd/hivechain/contracts/genstorage.eas b/cmd/hivechain/contracts/genstorage.eas index 1037494caf..f90579332a 100644 --- a/cmd/hivechain/contracts/genstorage.eas +++ b/cmd/hivechain/contracts/genstorage.eas @@ -11,7 +11,7 @@ genstorage: push 1 ; [1, block] add ; [block+1] ;; enough gas left? loop! - gas ; [gas], block+1] + gas ; [gas, block+1] push minGas ; [limit, gas, block+1] lt ; [limit Date: Thu, 14 Dec 2023 15:59:17 +0000 Subject: [PATCH 133/387] cmd/hivechain: add snap test contract in genesis --- cmd/hivechain/generate.go | 3 +-- cmd/hivechain/genesis.go | 32 +++++++++++++++++++++++--------- 2 files changed, 24 insertions(+), 11 deletions(-) diff --git a/cmd/hivechain/generate.go b/cmd/hivechain/generate.go index 27989ecb58..8322c9c93d 100644 --- a/cmd/hivechain/generate.go +++ b/cmd/hivechain/generate.go @@ -182,8 +182,7 @@ func (g *generator) setClique(i int, gen *core.BlockGen) { gen.SetCoinbase(cliqueSignerAddr) // Add a positive vote to keep the signer in the set. gen.SetNonce(types.BlockNonce{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}) - // The clique engine requires the block to have blank extra-data of the correct length - // before sealing. + // The clique engine requires the block to have blank extra-data of the correct length before sealing. gen.SetExtra(make([]byte, 32+65)) } diff --git a/cmd/hivechain/genesis.go b/cmd/hivechain/genesis.go index a036125eb1..a5a2497e06 100644 --- a/cmd/hivechain/genesis.go +++ b/cmd/hivechain/genesis.go @@ -153,22 +153,36 @@ func (cfg *generatorConfig) createGenesis() *core.Genesis { } // Initialize allocation. - // Here we add balance to the known accounts. + // Here we add balance to known accounts and initialize built-in contracts. g.Alloc = make(core.GenesisAlloc) for _, acc := range knownAccounts { g.Alloc[acc.addr] = core.GenesisAccount{Balance: initialBalance} } + add4788Contract(g.Alloc) + addSnapTestContract(g.Alloc) - // Also deploy the beacon chain deposit contract. - // dca := common.HexToAddress(depositContractAddr) - // dcc := hexutil.MustDecode("0x" + depositCode) - // g.Alloc[dca] = core.GenesisAccount{Code: dcc} + return &g +} - // Deploy beacon roots storage contract (EIP-4788). - asm4788 := common.FromHex("0x3373fffffffffffffffffffffffffffffffffffffffe14604d57602036146024575f5ffd5b5f35801560495762001fff810690815414603c575f5ffd5b62001fff01545f5260205ff35b5f5ffd5b62001fff42064281555f359062001fff015500") - g.Alloc[params.BeaconRootsStorageAddress] = core.GenesisAccount{Code: asm4788, Balance: big.NewInt(42)} +func add4788Contract(ga core.GenesisAlloc) { + ga[params.BeaconRootsStorageAddress] = core.GenesisAccount{ + Balance: big.NewInt(42), + Code: common.FromHex("0x3373fffffffffffffffffffffffffffffffffffffffe14604d57602036146024575f5ffd5b5f35801560495762001fff810690815414603c575f5ffd5b62001fff01545f5260205ff35b5f5ffd5b62001fff42064281555f359062001fff015500"), + } +} - return &g +func addSnapTestContract(ga core.GenesisAlloc) { + addr := common.HexToAddress("0x8bebc8ba651aee624937e7d897853ac30c95a067") + h := common.HexToHash + ga[addr] = core.GenesisAccount{ + Balance: big.NewInt(1), + Nonce: 1, + Storage: map[common.Hash]common.Hash{ + h("0x01"): h("0x01"), + h("0x02"): h("0x02"), + h("0x03"): h("0x03"), + }, + } } // forkBlocks computes the block numbers where forks occur. Forks get enabled based on the From ffad94bc072d95508e3f277e8c5a7bdfc2427aae Mon Sep 17 00:00:00 2001 From: Alexey Date: Wed, 20 Dec 2023 19:22:40 +0300 Subject: [PATCH 134/387] clients/nethermind: upgrade to .NET 8 (#955) --- clients/nethermind/Dockerfile.git | 6 +++--- clients/nethermind/Dockerfile.local | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/clients/nethermind/Dockerfile.git b/clients/nethermind/Dockerfile.git index d4a1a52ccb..8c5e0a1d67 100644 --- a/clients/nethermind/Dockerfile.git +++ b/clients/nethermind/Dockerfile.git @@ -1,7 +1,7 @@ ### Build Nethermind From Git: ## Builder stage: Compiles nethermind from a git repository -FROM mcr.microsoft.com/dotnet/sdk:7.0 AS build +FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build ARG github=nethermindeth/nethermind ARG tag=master @@ -12,10 +12,10 @@ RUN echo "Cloning: $github - $tag" && \ dotnet build -c release ## Final stage: Sets up the environment for running nethermind -FROM mcr.microsoft.com/dotnet/aspnet:7.0 +FROM mcr.microsoft.com/dotnet/aspnet:8.0 # Copy compiled binary from builder -COPY --from=build /nethermind/src/Nethermind/Nethermind.Runner/bin/release/net7.0 /nethermind +COPY --from=build /nethermind/src/Nethermind/artifacts/bin/Nethermind.Runner/release /nethermind WORKDIR /nethermind RUN apt-get update && apt-get install -y jq libsnappy-dev libc6-dev libc6 && \ diff --git a/clients/nethermind/Dockerfile.local b/clients/nethermind/Dockerfile.local index f6fa1108e8..935a58f2fb 100644 --- a/clients/nethermind/Dockerfile.local +++ b/clients/nethermind/Dockerfile.local @@ -2,7 +2,7 @@ ### Requires a copy of nethermind/ -> hive/clients/nethermind/ ## Builder stage: Compiles nethermind from a local directory -FROM mcr.microsoft.com/dotnet/sdk:7.0 AS build +FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build # Default local client path: clients/nethermind/ ARG local_path=nethermind @@ -11,10 +11,10 @@ ADD $local_path /nethermind RUN cd /nethermind/src/Nethermind/Nethermind.Runner && dotnet build -c release ## Final stage: Sets up the environment for running nethermind -FROM mcr.microsoft.com/dotnet/aspnet:7.0 +FROM mcr.microsoft.com/dotnet/aspnet:8.0 # Copy compiled binary from builder -COPY --from=build /nethermind/src/Nethermind/Nethermind.Runner/bin/release/net7.0 /nethermind +COPY --from=build /nethermind/src/Nethermind/artifacts/bin/Nethermind.Runner/release /nethermind WORKDIR /nethermind RUN apt-get update && apt-get install -y jq libsnappy-dev libc6-dev libc6 && \ From bc5f7e4e8f80e7b9350ef2787da84f8c6bce92e1 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Wed, 20 Dec 2023 18:33:04 +0100 Subject: [PATCH 135/387] simulators/devp2p: add support for new eth tests (#942) Co-authored-by: lightclient --- simulators/devp2p/Dockerfile | 16 +++++--- simulators/devp2p/main.go | 75 ++++++++++++++++++++++-------------- 2 files changed, 57 insertions(+), 34 deletions(-) diff --git a/simulators/devp2p/Dockerfile b/simulators/devp2p/Dockerfile index 3c0b85f010..d81e3a6a6f 100644 --- a/simulators/devp2p/Dockerfile +++ b/simulators/devp2p/Dockerfile @@ -1,22 +1,26 @@ # This simulator runs devp2p protocol tests. -FROM golang:1-alpine as builder -RUN apk add --update git gcc musl-dev linux-headers - # Build devp2p tool. +FROM golang:1-alpine as geth-builder +RUN apk add --update git gcc musl-dev linux-headers RUN git clone --depth 1 https://github.com/ethereum/go-ethereum.git /go-ethereum WORKDIR /go-ethereum RUN go build -v ./cmd/devp2p # Build the simulator executable. -ADD . /source +FROM golang:1-alpine as sim-builder +RUN apk add --update git gcc musl-dev linux-headers WORKDIR /source +COPY go.mod go.sum ./ +RUN go mod download +COPY . . RUN go build -v -o devp2p-simulator # Build the simulation run container. FROM alpine:latest ADD . /source WORKDIR /source -COPY --from=builder /go-ethereum/devp2p . -COPY --from=builder /source/devp2p-simulator . +COPY --from=geth-builder /go-ethereum/devp2p ./devp2p +COPY --from=geth-builder /go-ethereum/cmd/devp2p/internal/ethtest/testdata /testchain +COPY --from=sim-builder /source/devp2p-simulator . ENTRYPOINT ["./devp2p-simulator"] diff --git a/simulators/devp2p/main.go b/simulators/devp2p/main.go index ca92d294fa..0f710a8854 100644 --- a/simulators/devp2p/main.go +++ b/simulators/devp2p/main.go @@ -12,6 +12,10 @@ import ( "github.com/shogo82148/go-tap" ) +// Location of the test chain files. They are copied from +// go-ethereum/cmd/devp2p/internal/ethtest/testdata by the simulator dockerfile. +const testChainDir = "/testchain" + func main() { discv4 := hivesim.Suite{ Name: "discv4", @@ -72,6 +76,7 @@ func main() { }, } + forkenv := loadTestChainConfig() eth := hivesim.Suite{ Name: "eth", Description: "This suite tests a client's ability to accurately respond to basic eth protocol messages.", @@ -81,18 +86,10 @@ func main() { Name: "client launch", Description: `This test launches the client and runs the test tool. Results from the test tool are reported as individual sub-tests.`, - Parameters: hivesim.Params{ - "HIVE_NETWORK_ID": "19763", - "HIVE_CHAIN_ID": "19763", - "HIVE_FORK_HOMESTEAD": "0", - "HIVE_FORK_TANGERINE": "0", - "HIVE_FORK_SPURIOUS": "0", - "HIVE_FORK_BYZANTIUM": "0", - "HIVE_LOGLEVEL": "4", - }, + Parameters: forkenv, Files: map[string]string{ - "genesis.json": "./init/genesis.json", - "chain.rlp": "./init/halfchain.rlp", + "genesis.json": testChainDir + "/genesis.json", + "chain.rlp": testChainDir + "/chain.rlp", }, AlwaysRun: true, Run: runEthTest, @@ -109,18 +106,10 @@ Results from the test tool are reported as individual sub-tests.`, Name: "client launch", Description: `This test launches the client and runs the test tool. Results from the test tool are reported as individual sub-tests.`, - Parameters: hivesim.Params{ - "HIVE_NETWORK_ID": "19763", - "HIVE_CHAIN_ID": "19763", - "HIVE_FORK_HOMESTEAD": "0", - "HIVE_FORK_TANGERINE": "0", - "HIVE_FORK_SPURIOUS": "0", - "HIVE_FORK_BYZANTIUM": "0", - "HIVE_LOGLEVEL": "4", - }, + Parameters: forkenv, Files: map[string]string{ - "genesis.json": "./init/genesis.json", - "chain.rlp": "./init/halfchain.rlp", + "genesis.json": testChainDir + "/genesis.json", + "chain.rlp": testChainDir + "/chain.rlp", }, AlwaysRun: true, Run: runSnapTest, @@ -131,13 +120,33 @@ Results from the test tool are reported as individual sub-tests.`, hivesim.MustRun(hivesim.New(), discv4, discv5, eth, snap) } +func loadTestChainConfig() hivesim.Params { + content, err := os.ReadFile(testChainDir + "/forkenv.json") + if err != nil { + panic(err) + } + var p hivesim.Params + if err := json.Unmarshal(content, &p); err != nil { + panic(err) + } + return p +} + func runEthTest(t *hivesim.T, c *hivesim.Client) { enode, err := c.EnodeURL() if err != nil { t.Fatal(err) } + _, pattern := t.Sim.TestPattern() - cmd := exec.Command("./devp2p", "rlpx", "eth-test", "--run", pattern, "--tap", enode, "./init/fullchain.rlp", "./init/genesis.json") + cmd := exec.Command("./devp2p", "rlpx", "eth-test", + "--tap", + "--run", pattern, + "--node", enode, + "--chain", testChainDir, + "--engineapi", fmt.Sprintf("http://%s:8551", c.IP), + "--jwtsecret", "0x7365637265747365637265747365637265747365637265747365637265747365", + ) if err := runTAP(t, c.Type, cmd); err != nil { t.Fatal(err) } @@ -148,8 +157,16 @@ func runSnapTest(t *hivesim.T, c *hivesim.Client) { if err != nil { t.Fatal(err) } + _, pattern := t.Sim.TestPattern() - cmd := exec.Command("./devp2p", "rlpx", "snap-test", "--run", pattern, "--tap", enode, "./init/fullchain.rlp", "./init/genesis.json") + cmd := exec.Command("./devp2p", "rlpx", "snap-test", + "--tap", + "--run", pattern, + "--node", enode, + "--chain", testChainDir, + "--engineapi", fmt.Sprintf("http://%s:8551", c.IP), + "--jwtsecret", "0x7365637265747365637265747365637265747365637265747365637265747365", + ) if err := runTAP(t, c.Type, cmd); err != nil { t.Fatal(err) } @@ -256,14 +273,15 @@ func reportTAP(t *hivesim.T, clientName string, output io.Reader) error { if err != nil { return fmt.Errorf("error parsing TAP: %v", err) } - // Forward results to hive. for { test, err := parser.Next() - if err == io.EOF { - return nil - } else if err != nil { + if test == nil { + if err == io.EOF { + return nil + } return err } + // Forward result to hive. name := fmt.Sprintf("%s (%s)", test.Description, clientName) testID, err := t.Sim.StartTest(t.SuiteID, name, "") if err != nil { @@ -272,6 +290,7 @@ func reportTAP(t *hivesim.T, clientName string, output io.Reader) error { result := hivesim.TestResult{Pass: test.Ok, Details: test.Diagnostic} t.Sim.EndTest(t.SuiteID, testID, result) } + return nil } func getBeaconENR(c *hivesim.Client) (string, error) { From b5b3b42431002d05830812089214ceea1642e41f Mon Sep 17 00:00:00 2001 From: Marcin Sobczak <77129288+marcindsobczak@users.noreply.github.com> Date: Thu, 28 Dec 2023 11:36:41 +0100 Subject: [PATCH 136/387] clients/nethermind: update TxPool config (#956) Nethermind recently refactored blob pool to support blob transaction reorgs, introducing an additional flag. We decided to consolidate three blob pool-related flags into one enum. This PR enables support for blob transactions + persistent blob storage + blob transactions reorgs. --- clients/nethermind/mkconfig.jq | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/clients/nethermind/mkconfig.jq b/clients/nethermind/mkconfig.jq index ed2e74fee2..5f19c00a66 100644 --- a/clients/nethermind/mkconfig.jq +++ b/clients/nethermind/mkconfig.jq @@ -73,8 +73,7 @@ def txpool_config: if env.HIVE_CANCUN_TIMESTAMP != null then { "TxPool": { - "BlobSupportEnabled": true, - "PersistentBlobStorageEnabled": true + "BlobsSupport": "StorageWithReorgs" } } else From 7f464b7373f9db4dd119f9e379e5c7457ef2bd59 Mon Sep 17 00:00:00 2001 From: Somnath Date: Thu, 4 Jan 2024 14:25:06 +0400 Subject: [PATCH 137/387] clients/erigon: small fix to mapper jq (#962) Fix: true instead of 1 --- clients/erigon/mapper.jq | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clients/erigon/mapper.jq b/clients/erigon/mapper.jq index 60499b9476..89eb423989 100644 --- a/clients/erigon/mapper.jq +++ b/clients/erigon/mapper.jq @@ -54,7 +54,7 @@ def to_bool: "grayGlacierBlock": env.HIVE_FORK_GRAY_GLACIER|to_int, "mergeNetsplitBlock": env.HIVE_MERGE_BLOCK_ID|to_int, "terminalTotalDifficulty": env.HIVE_TERMINAL_TOTAL_DIFFICULTY|to_int, - "terminalTotalDifficultyPassed": (if env.HIVE_TERMINAL_TOTAL_DIFFICULTY_PASSED == null then 1 else env.HIVE_TERMINAL_TOTAL_DIFFICULTY_PASSED|to_bool end), + "terminalTotalDifficultyPassed": (if env.HIVE_TERMINAL_TOTAL_DIFFICULTY_PASSED == null then true else env.HIVE_TERMINAL_TOTAL_DIFFICULTY_PASSED|to_bool end), "shanghaiTime": env.HIVE_SHANGHAI_TIMESTAMP|to_int, "cancunTime": env.HIVE_CANCUN_TIMESTAMP|to_int, }|remove_empty From 785d2388b4a392022f67be9bb5c3d632a4454aa5 Mon Sep 17 00:00:00 2001 From: Mario Vega Date: Thu, 4 Jan 2024 09:58:26 -0600 Subject: [PATCH 138/387] simulators/ethereum/consensus: Fix `excessBlobGas` genesis (#964) simulators/ethereum/consensus: Fix excessBlobGas genesis --- simulators/ethereum/consensus/main.go | 31 +++++++++++++++++--------- simulators/ethereum/consensus/types.go | 10 +++++---- 2 files changed, 26 insertions(+), 15 deletions(-) diff --git a/simulators/ethereum/consensus/main.go b/simulators/ethereum/consensus/main.go index b68ddda3fa..d08cd79b26 100644 --- a/simulators/ethereum/consensus/main.go +++ b/simulators/ethereum/consensus/main.go @@ -553,15 +553,16 @@ func (tc *testcase) updateEnv(env hivesim.Params) { // toGethGenesis creates the genesis specification from a test block. func toGethGenesis(test *btJSON) *core.Genesis { genesis := &core.Genesis{ - Nonce: test.Genesis.Nonce.Uint64(), - Timestamp: test.Genesis.Timestamp.Uint64(), - ExtraData: test.Genesis.ExtraData, - GasLimit: test.Genesis.GasLimit, - Difficulty: test.Genesis.Difficulty, - Mixhash: test.Genesis.MixHash, - Coinbase: test.Genesis.Coinbase, - Alloc: test.Pre, - BaseFee: test.Genesis.BaseFee, + Nonce: test.Genesis.Nonce.Uint64(), + Timestamp: test.Genesis.Timestamp.Uint64(), + ExtraData: test.Genesis.ExtraData, + GasLimit: test.Genesis.GasLimit, + Difficulty: test.Genesis.Difficulty, + Mixhash: test.Genesis.MixHash, + Coinbase: test.Genesis.Coinbase, + Alloc: test.Pre, + BaseFee: test.Genesis.BaseFee, + ExcessBlobGas: test.Genesis.ExcessBlobGas, } return genesis } @@ -651,7 +652,15 @@ func compareGenesis(have string, want btHeader) (string, error) { cmp(haveGenesis.GasUsed, want.GasUsed, "gasUsed") cmp(haveGenesis.Nonce, want.Nonce, "nonce") cmp(haveGenesis.BaseFee, want.BaseFee, "baseFeePerGas") - cmp(haveGenesis.ExcessBlobGas, want.ExcessBlobGas, "excessBlobGas") - cmp(haveGenesis.BlobGasUsed, want.BlobGasUsed, "blobGasUsed") + if haveGenesis.ExcessBlobGas != nil && want.ExcessBlobGas != nil { + cmp(*haveGenesis.ExcessBlobGas, *want.ExcessBlobGas, "excessBlobGas") + } else { + cmp(haveGenesis.ExcessBlobGas, want.ExcessBlobGas, "excessBlobGas") + } + if haveGenesis.BlobGasUsed != nil && want.BlobGasUsed != nil { + cmp(*haveGenesis.BlobGasUsed, *want.BlobGasUsed, "blobGasUsed") + } else { + cmp(haveGenesis.BlobGasUsed, want.BlobGasUsed, "blobGasUsed") + } return output, nil } diff --git a/simulators/ethereum/consensus/types.go b/simulators/ethereum/consensus/types.go index 4668f604e2..48c51ed594 100644 --- a/simulators/ethereum/consensus/types.go +++ b/simulators/ethereum/consensus/types.go @@ -55,8 +55,8 @@ type btHeader struct { GasUsed uint64 `json:"gasUsed"` Timestamp *big.Int `json:"timestamp"` BaseFee *big.Int `json:"baseFeePerGas"` // EIP-1559 - ExcessBlobGas uint64 `json:"excessBlobGas"` // EIP-4844 - BlobGasUsed uint64 `json:"blobGasUsed"` // EIP-4844 + ExcessBlobGas *uint64 `json:"excessBlobGas"` // EIP-4844 + BlobGasUsed *uint64 `json:"blobGasUsed"` // EIP-4844 } func (b *btHeader) UnmarshalJSON(input []byte) error { @@ -152,10 +152,12 @@ func (b *btHeader) UnmarshalJSON(input []byte) error { b.BaseFee = (*big.Int)(dec.BaseFee) } if dec.ExcessBlobGas != nil { - b.ExcessBlobGas = uint64(*dec.ExcessBlobGas) + ebg := uint64(*dec.ExcessBlobGas) + b.ExcessBlobGas = &ebg } if dec.BlobGasUsed != nil { - b.BlobGasUsed = uint64(*dec.BlobGasUsed) + bgu := uint64(*dec.BlobGasUsed) + b.BlobGasUsed = &bgu } return nil } From af4a4f68b987f2d681f7bd349b877b57a4566499 Mon Sep 17 00:00:00 2001 From: Mario Vega Date: Fri, 5 Jan 2024 12:00:24 -0600 Subject: [PATCH 139/387] clients/erigon: Fix git dockerfile (#965) --- clients/erigon/Dockerfile.git | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clients/erigon/Dockerfile.git b/clients/erigon/Dockerfile.git index a5861a8a8b..a21616ca09 100644 --- a/clients/erigon/Dockerfile.git +++ b/clients/erigon/Dockerfile.git @@ -10,7 +10,7 @@ RUN echo "Cloning: $github - $tag" \ && apk add bash build-base ca-certificates git jq \ && git clone --depth 1 --branch $tag https://github.com/$github \ && cd erigon \ - && make erigon \ + && make BUILD_TAGS=nosqlite,noboltdb,nosilkworm erigon \ && cp build/bin/erigon /usr/local/bin/erigon ## Final stage: Sets up the environment for running erigon From f2a8720c13f7beb94aff903129c2ad0b822f8cfc Mon Sep 17 00:00:00 2001 From: Mario Vega Date: Fri, 5 Jan 2024 12:13:08 -0600 Subject: [PATCH 140/387] clients/besu: Fix git dockerfile (#966) --- clients/besu/Dockerfile.git | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clients/besu/Dockerfile.git b/clients/besu/Dockerfile.git index 20d3d79011..7c9223c22c 100644 --- a/clients/besu/Dockerfile.git +++ b/clients/besu/Dockerfile.git @@ -8,7 +8,7 @@ ARG github=hyperledger/besu RUN echo "installing java on ubuntu base image" \ && apt-get update && apt-get install -y git libsodium-dev libnss3-dev \ - && apt-get install --no-install-recommends -q --assume-yes ca-certificates-java=20190909 \ + && apt-get install --no-install-recommends -q --assume-yes ca-certificates-java=20190909* \ && apt-get install --no-install-recommends -q --assume-yes openjdk-17-jre-headless=17* libjemalloc-dev=5.* \ && echo "Cloning: $github - $tag" \ && git clone --depth 1 --branch $tag https://github.com/$github \ From 67fdab21bf16ca22e2e9515641bb20cdc6a2561e Mon Sep 17 00:00:00 2001 From: Vehorny <153144728+vehorny@users.noreply.github.com> Date: Thu, 11 Jan 2024 23:14:40 +0100 Subject: [PATCH 141/387] all: fix some typos in README.md files (#968) --- simulators/ethereum/engine/suites/cancun/README.md | 2 +- simulators/ethereum/rpc/README.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/simulators/ethereum/engine/suites/cancun/README.md b/simulators/ethereum/engine/suites/cancun/README.md index 9ce11310e3..bfe2147a67 100644 --- a/simulators/ethereum/engine/suites/cancun/README.md +++ b/simulators/ethereum/engine/suites/cancun/README.md @@ -1,5 +1,5 @@ # Cancun Engine API Testing -This test suite verifies behavior of the Engine API on the transtion to and after the Cancun fork: +This test suite verifies behavior of the Engine API on the transition to and after the Cancun fork: https://github.com/ethereum/execution-apis/blob/main/src/engine/cancun.md diff --git a/simulators/ethereum/rpc/README.md b/simulators/ethereum/rpc/README.md index 4eaee839ad..28dbe5f52b 100644 --- a/simulators/ethereum/rpc/README.md +++ b/simulators/ethereum/rpc/README.md @@ -25,7 +25,7 @@ The genesis block also contains 2 contracts: Ethclient runs various tests that use the `ethclient.Client` API. Such as sending transactions, retrieving logs and balances. -ABI, interacts with the pre-deployed events contract. It send transactions, executs calls +ABI, interacts with the pre-deployed events contract. It send transactions, executes calls and examines generated logs. Each test is designed to run in parallel with other tests. In most cases the first step a From 1434e08882e38eeea550dac7ed85e652ebcee436 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Tue, 16 Jan 2024 12:41:27 +0100 Subject: [PATCH 142/387] cmd/hivechain: improve modifier schedule --- cmd/hivechain/generate.go | 31 +++++++++++++++++++++++++------ cmd/hivechain/output.go | 4 ++-- 2 files changed, 27 insertions(+), 8 deletions(-) diff --git a/cmd/hivechain/generate.go b/cmd/hivechain/generate.go index 8322c9c93d..3c9b25df6a 100644 --- a/cmd/hivechain/generate.go +++ b/cmd/hivechain/generate.go @@ -64,7 +64,9 @@ type generator struct { accounts []genAccount rand *rand.Rand - modlist []*modifierInstance + // Modifier lists. + virgins []*modifierInstance + mods []*modifierInstance modOffset int // for write/export @@ -88,7 +90,7 @@ func newGenerator(cfg generatorConfig) *generator { genesis: genesis, rand: rand.New(rand.NewSource(10)), td: new(big.Int).Set(genesis.Difficulty), - modlist: cfg.createBlockModifiers(), + virgins: cfg.createBlockModifiers(), accounts: slices.Clone(knownAccounts), } } @@ -213,7 +215,8 @@ func (g *generator) setParentBeaconRoot(i int, gen *core.BlockGen) { // runModifiers executes the chain modifiers. func (g *generator) runModifiers(i int, gen *core.BlockGen) { - if len(g.modlist) == 0 || g.cfg.txInterval == 0 || i%g.cfg.txInterval != 0 { + totalMods := len(g.mods) + len(g.virgins) + if totalMods == 0 || g.cfg.txInterval == 0 || i%g.cfg.txInterval != 0 { return } @@ -224,9 +227,7 @@ func (g *generator) runModifiers(i int, gen *core.BlockGen) { // because this usually means there is no gas left. count := 0 refused := 0 // count of consecutive times apply() returned false - for ; count < g.cfg.txCount && refused < len(g.modlist); g.modOffset++ { - index := g.modOffset % len(g.modlist) - mod := g.modlist[index] + run := func(mod *modifierInstance) bool { ok := mod.apply(ctx) if ok { fmt.Println(" -", mod.name) @@ -235,6 +236,24 @@ func (g *generator) runModifiers(i int, gen *core.BlockGen) { } else { refused++ } + return ok + } + + // In order to avoid a pathological situation where a modifier never executes because + // of unfortunate scheduling, we first try modifiers from g.virgins. + for i := 0; i < len(g.virgins) && count < g.cfg.txCount; i++ { + mod := g.virgins[i] + if run(mod) { + g.mods = append(g.mods, mod) + g.virgins = append(g.virgins[:i], g.virgins[i+1:]...) + i-- + } + } + // If there is any space left, fill it using g.mods. + for len(g.mods) > 0 && count < g.cfg.txCount && refused < totalMods { + index := g.modOffset % len(g.mods) + run(g.mods[index]) + g.modOffset++ } } diff --git a/cmd/hivechain/output.go b/cmd/hivechain/output.go index 724241bf2a..2e5929632a 100644 --- a/cmd/hivechain/output.go +++ b/cmd/hivechain/output.go @@ -158,8 +158,8 @@ func exportN(bc *core.BlockChain, w io.Writer, first uint64, last uint64) error // writeTxInfo writes information about the transactions that were added into the chain. func (g *generator) writeTxInfo() error { - m := make(map[string]any, len(g.modlist)) - for _, inst := range g.modlist { + m := make(map[string]any, len(g.mods)) + for _, inst := range g.mods { m[inst.name] = inst.txInfo() } return g.writeJSON("txinfo.json", &m) From 292a9527cbe252c5e38090ada039f7e7c397fb12 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Tue, 16 Jan 2024 13:35:35 +0100 Subject: [PATCH 143/387] cmd/hivechain: add more transaction types --- cmd/hivechain/bytecode/emit.bin | Bin 0 -> 35 bytes cmd/hivechain/compile.sh | 1 + cmd/hivechain/contracts.go | 5 +- cmd/hivechain/contracts/emit.eas | 35 +++++ cmd/hivechain/genesis.go | 11 ++ cmd/hivechain/mod.go | 25 +++- .../{mod_randtx.go => mod_createspam.go} | 15 +- cmd/hivechain/mod_txinvoke.go | 132 ++++++++++++++++++ cmd/hivechain/mod_txvaluetransfer.go | 111 +++++++++++++++ cmd/hivechain/mod_valuetransfer.go | 85 ----------- cmd/hivechain/mod_withdrawals.go | 2 +- 11 files changed, 326 insertions(+), 96 deletions(-) create mode 100644 cmd/hivechain/bytecode/emit.bin create mode 100644 cmd/hivechain/contracts/emit.eas rename cmd/hivechain/{mod_randtx.go => mod_createspam.go} (66%) create mode 100644 cmd/hivechain/mod_txinvoke.go create mode 100644 cmd/hivechain/mod_txvaluetransfer.go delete mode 100644 cmd/hivechain/mod_valuetransfer.go diff --git a/cmd/hivechain/bytecode/emit.bin b/cmd/hivechain/bytecode/emit.bin new file mode 100644 index 0000000000000000000000000000000000000000..4f28bbfe84d3fbaba046c518c00b32fc9526aabb GIT binary patch literal 35 pcmXqONML9%Phe0;U bytecode/deployer.bin geas -bin -no-push0 contracts/callenv.eas > bytecode/callenv.bin geas -bin -no-push0 contracts/callme.eas > bytecode/callme.bin geas -bin -no-push0 contracts/callrevert.eas > bytecode/callrevert.bin +geas -bin -no-push0 contracts/emit.eas > bytecode/emit.bin geas -bin -no-push0 contracts/genlogs.eas > bytecode/genlogs.bin geas -bin -no-push0 contracts/gencode.eas > bytecode/gencode.bin geas -bin -no-push0 contracts/genstorage.eas > bytecode/genstorage.bin diff --git a/cmd/hivechain/contracts.go b/cmd/hivechain/contracts.go index 94ad377f3b..4b169bf739 100644 --- a/cmd/hivechain/contracts.go +++ b/cmd/hivechain/contracts.go @@ -20,7 +20,10 @@ var callmeCode []byte //go:embed bytecode/callenv.bin var callenvCode []byte +//go:embed bytecode/emit.bin +var emitCode []byte + // //go:embed bytecode/deposit.bin // var depositCode []byte -// +// // const depositContractAddr = "0x00000000219ab540356cBB839Cbe05303d7705Fa" diff --git a/cmd/hivechain/contracts/emit.eas b/cmd/hivechain/contracts/emit.eas new file mode 100644 index 0000000000..adc37f276d --- /dev/null +++ b/cmd/hivechain/contracts/emit.eas @@ -0,0 +1,35 @@ +;;; -*- mode: asm -*- +;;; Example contract which emits storage and logs when invoked. + +#define s_counter 0 + + ;; hash calldata + calldatasize ; [size] + dup1 ; [size] + push 0 ; [offset, size, size] + dup1 ; [dest, offset, size, size] + calldatacopy ; [size] + push 0 ; [offset, size] + keccak256 ; [hash] + + ;; write a storage entry + push s_counter ; [slot] + sload ; [addr, counter, hash] + dup1 ; [counter, counter, hash] + dup3 ; [hash, counter, counter, hash] + sstore ; [counter, hash] + + ;; increment counter + push 1 ; [1, counter, hash] + add ; [counter+1, hash] + push s_counter ; [slot, counter+1, hash] + sstore ; [hash] + + ;; emit log + push 0 ; [offset, hash] + mstore ; [] + origin ; [topic2] + push "emit" ; [topic1, topic2] + push 32 ; [size, topic1, topic2] + push 0 ; [offset, size, topic1, topic2] + log2 ; [] diff --git a/cmd/hivechain/genesis.go b/cmd/hivechain/genesis.go index a5a2497e06..363ee1f52c 100644 --- a/cmd/hivechain/genesis.go +++ b/cmd/hivechain/genesis.go @@ -160,6 +160,7 @@ func (cfg *generatorConfig) createGenesis() *core.Genesis { } add4788Contract(g.Alloc) addSnapTestContract(g.Alloc) + addEmitContract(g.Alloc) return &g } @@ -185,6 +186,16 @@ func addSnapTestContract(ga core.GenesisAlloc) { } } +const emitAddr = "0x7dcd17433742f4c0ca53122ab541d0ba67fc27df" + +func addEmitContract(ga core.GenesisAlloc) { + addr := common.HexToAddress(emitAddr) + ga[addr] = core.GenesisAccount{ + Balance: new(big.Int), + Code: emitCode, + } +} + // forkBlocks computes the block numbers where forks occur. Forks get enabled based on the // forkInterval. If the total number of requested blocks (chainLength) is lower than // necessary, the remaining forks activate on the last chain block. diff --git a/cmd/hivechain/mod.go b/cmd/hivechain/mod.go index 37b5f89acf..0b6a0fbb9e 100644 --- a/cmd/hivechain/mod.go +++ b/cmd/hivechain/mod.go @@ -1,6 +1,8 @@ package main import ( + "crypto/sha256" + "encoding/binary" "math/big" "github.com/ethereum/go-ethereum/common" @@ -22,9 +24,10 @@ func register(name string, new func() blockModifier) { } type genBlockContext struct { - index int - block *core.BlockGen - gen *generator + index int + block *core.BlockGen + gen *generator + txcount int } // Number returns the block number. @@ -54,6 +57,7 @@ func (ctx *genBlockContext) AddNewTx(sender *genAccount, data types.TxData) *typ panic(err) } ctx.block.AddTx(tx) + ctx.txcount++ return tx } @@ -95,6 +99,11 @@ func (ctx *genBlockContext) Signer() types.Signer { return ctx.block.Signer() } +// TxCount returns the number of transactions added so far. +func (ctx *genBlockContext) TxCount() int { + return ctx.txcount +} + // ChainConfig returns the chain config. func (ctx *genBlockContext) ChainConfig() *params.ChainConfig { return ctx.gen.genesis.Config @@ -104,3 +113,13 @@ func (ctx *genBlockContext) ChainConfig() *params.ChainConfig { func (ctx *genBlockContext) ParentBlock() *types.Block { return ctx.block.PrevBlock(ctx.index - 1) } + +// TxRandomValue returns a random value that depends on the block number and current transaction index. +func (ctx *genBlockContext) TxRandomValue() uint64 { + var txindex [8]byte + binary.BigEndian.PutUint64(txindex[:], uint64(ctx.TxCount())) + h := sha256.New() + h.Write(ctx.Number().Bytes()) + h.Write(txindex[:]) + return binary.BigEndian.Uint64(h.Sum(nil)) +} diff --git a/cmd/hivechain/mod_randtx.go b/cmd/hivechain/mod_createspam.go similarity index 66% rename from cmd/hivechain/mod_randtx.go rename to cmd/hivechain/mod_createspam.go index 3e91942aff..284d6ff25e 100644 --- a/cmd/hivechain/mod_randtx.go +++ b/cmd/hivechain/mod_createspam.go @@ -4,33 +4,36 @@ import ( "github.com/ethereum/go-ethereum/core/types" ) +// Here we create transactions that create spam contracts. These exist simply to fill up +// the state. We need a decent amount of state in the sync tests, for example. + func init() { register("randomlogs", func() blockModifier { - return &modCreateTx{ + return &modCreateSpam{ code: genlogsCode, gas: 20000, } }) register("randomcode", func() blockModifier { - return &modCreateTx{ + return &modCreateSpam{ code: gencodeCode, gas: 30000, } }) register("randomstorage", func() blockModifier { - return &modCreateTx{ + return &modCreateSpam{ code: genstorageCode, gas: 80000, } }) } -type modCreateTx struct { +type modCreateSpam struct { code []byte gas uint64 } -func (m *modCreateTx) apply(ctx *genBlockContext) bool { +func (m *modCreateSpam) apply(ctx *genBlockContext) bool { gas := ctx.TxCreateIntrinsicGas(m.code) + m.gas if !ctx.HasGas(gas) { return false @@ -47,6 +50,6 @@ func (m *modCreateTx) apply(ctx *genBlockContext) bool { return true } -func (m *modCreateTx) txInfo() any { +func (m *modCreateSpam) txInfo() any { return nil } diff --git a/cmd/hivechain/mod_txinvoke.go b/cmd/hivechain/mod_txinvoke.go new file mode 100644 index 0000000000..7422faaf3b --- /dev/null +++ b/cmd/hivechain/mod_txinvoke.go @@ -0,0 +1,132 @@ +package main + +import ( + "encoding/binary" + "math/big" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" +) + +func init() { + register("tx-emit-legacy", func() blockModifier { + return &modInvokeEmit{ + txType: types.LegacyTxType, + gasLimit: 100000, + } + }) + register("tx-emit-eip2930", func() blockModifier { + return &modInvokeEmit{ + txType: types.AccessListTxType, + gasLimit: 100000, + } + }) + register("tx-emit-eip1559", func() blockModifier { + return &modInvokeEmit{ + txType: types.DynamicFeeTxType, + gasLimit: 100000, + } + }) +} + +// modInvokeEmit creates transactions that invoke the 'emit' contract. +type modInvokeEmit struct { + txType byte + gasLimit uint64 + + txs []invokeEmitTxInfo +} + +type invokeEmitTxInfo struct { + TxHash common.Hash `json:"txhash"` + Sender common.Address `json:"sender"` + Block hexutil.Uint64 `json:"block"` + Index int `json:"indexInBlock"` + DataHash common.Hash `json:"datahash"` +} + +func (m *modInvokeEmit) apply(ctx *genBlockContext) bool { + if !ctx.HasGas(m.gasLimit) { + return false + } + + sender := ctx.TxSenderAccount() + recipient := common.HexToAddress(emitAddr) + calldata := m.genCallData(ctx) + datahash := crypto.Keccak256Hash(calldata) + + var txdata types.TxData + switch m.txType { + case types.AccessListTxType: + if !ctx.ChainConfig().IsBerlin(ctx.Number()) { + return false + } + txdata = &types.AccessListTx{ + Nonce: ctx.AccountNonce(sender.addr), + Gas: m.gasLimit, + GasPrice: ctx.TxGasFeeCap(), + To: &recipient, + Value: big.NewInt(2), + Data: calldata, + AccessList: types.AccessList{ + { + Address: recipient, + StorageKeys: []common.Hash{{}, datahash}, + }, + }, + } + + case types.DynamicFeeTxType: + if !ctx.ChainConfig().IsLondon(ctx.Number()) { + return false + } + txdata = &types.DynamicFeeTx{ + Nonce: ctx.AccountNonce(sender.addr), + Gas: m.gasLimit, + GasFeeCap: ctx.TxGasFeeCap(), + GasTipCap: big.NewInt(1), + To: &recipient, + Value: big.NewInt(2), + Data: calldata, + AccessList: types.AccessList{ + { + Address: recipient, + StorageKeys: []common.Hash{{}, datahash}, + }, + }, + } + + case types.LegacyTxType: + txdata = &types.LegacyTx{ + Nonce: ctx.AccountNonce(sender.addr), + Gas: m.gasLimit, + GasPrice: ctx.TxGasFeeCap(), + To: &recipient, + Data: calldata, + Value: big.NewInt(2), + } + } + + txindex := ctx.TxCount() + tx := ctx.AddNewTx(sender, txdata) + m.txs = append(m.txs, invokeEmitTxInfo{ + Block: hexutil.Uint64(ctx.NumberU64()), + Sender: sender.addr, + TxHash: tx.Hash(), + Index: txindex, + DataHash: datahash, + }) + return true +} + +func (m *modInvokeEmit) txInfo() any { + return m.txs +} + +func (m *modInvokeEmit) genCallData(ctx *genBlockContext) []byte { + d := make([]byte, 8) + binary.BigEndian.PutUint64(d, ctx.TxRandomValue()) + return append(d, "emit"...) +} diff --git a/cmd/hivechain/mod_txvaluetransfer.go b/cmd/hivechain/mod_txvaluetransfer.go new file mode 100644 index 0000000000..ab3d639344 --- /dev/null +++ b/cmd/hivechain/mod_txvaluetransfer.go @@ -0,0 +1,111 @@ +package main + +import ( + "math/big" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/params" +) + +func init() { + register("tx-transfer-legacy", func() blockModifier { + return &modValueTransfer{ + txType: types.LegacyTxType, + gasLimit: params.TxGas, + } + }) + register("tx-transfer-eip2930", func() blockModifier { + return &modValueTransfer{ + txType: types.AccessListTxType, + gasLimit: params.TxGas, + } + }) + register("tx-transfer-eip1559", func() blockModifier { + return &modValueTransfer{ + txType: types.DynamicFeeTxType, + gasLimit: params.TxGas, + } + }) + +} + +type modValueTransfer struct { + txType byte + gasLimit uint64 + + txs []valueTransferInfo +} + +type valueTransferInfo struct { + TxHash common.Hash `json:"txhash"` + Sender common.Address `json:"sender"` + Block hexutil.Uint64 `json:"block"` + Index int `json:"indexInBlock"` +} + +func (m *modValueTransfer) apply(ctx *genBlockContext) bool { + if !ctx.HasGas(m.gasLimit) { + return false + } + + sender := ctx.TxSenderAccount() + recipient := pickRecipient(ctx) + + var txdata types.TxData + switch m.txType { + case types.AccessListTxType: + if !ctx.ChainConfig().IsBerlin(ctx.Number()) { + return false + } + txdata = &types.AccessListTx{ + Nonce: ctx.AccountNonce(sender.addr), + Gas: m.gasLimit, + GasPrice: ctx.TxGasFeeCap(), + To: &recipient, + Value: big.NewInt(1), + } + + case types.DynamicFeeTxType: + if !ctx.ChainConfig().IsLondon(ctx.Number()) { + return false + } + txdata = &types.DynamicFeeTx{ + Nonce: ctx.AccountNonce(sender.addr), + Gas: m.gasLimit, + GasFeeCap: ctx.TxGasFeeCap(), + GasTipCap: big.NewInt(1), + To: &recipient, + Value: big.NewInt(1), + } + + case types.LegacyTxType: + txdata = &types.LegacyTx{ + Nonce: ctx.AccountNonce(sender.addr), + Gas: m.gasLimit, + GasPrice: ctx.TxGasFeeCap(), + To: &recipient, + Value: big.NewInt(1), + } + } + + txindex := ctx.TxCount() + tx := ctx.AddNewTx(sender, txdata) + m.txs = append(m.txs, valueTransferInfo{ + Block: hexutil.Uint64(ctx.NumberU64()), + Sender: sender.addr, + TxHash: tx.Hash(), + Index: txindex, + }) + return true +} + +func (m *modValueTransfer) txInfo() any { + return m.txs +} + +func pickRecipient(ctx *genBlockContext) common.Address { + i := ctx.TxRandomValue() % uint64(len(ctx.gen.accounts)) + return ctx.gen.accounts[i].addr +} diff --git a/cmd/hivechain/mod_valuetransfer.go b/cmd/hivechain/mod_valuetransfer.go deleted file mode 100644 index 0597ecbb49..0000000000 --- a/cmd/hivechain/mod_valuetransfer.go +++ /dev/null @@ -1,85 +0,0 @@ -package main - -import ( - "crypto/sha256" - "math/big" - - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/common/hexutil" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/params" -) - -func init() { - register("valuetransfer", func() blockModifier { - return &modValueTransfer{} - }) -} - -type modValueTransfer struct { - counter int - txs []valueTransferInfo -} - -type valueTransferInfo struct { - Block hexutil.Uint64 `json:"block"` - Sender common.Address `json:"sender"` - Tx *types.Transaction `json:"tx"` -} - -func (m *modValueTransfer) apply(ctx *genBlockContext) bool { - if !ctx.HasGas(params.TxGas) { - return false - } - - sender := ctx.TxSenderAccount() - var txdata types.TxData - for txdata == nil { - switch m.counter % 2 { - case 0: - // legacy tx - r := randomRecipient(ctx.Number()) - txdata = &types.LegacyTx{ - Nonce: ctx.AccountNonce(sender.addr), - Gas: params.TxGas, - GasPrice: ctx.TxGasFeeCap(), - To: &r, - Value: big.NewInt(1), - } - case 1: - // EIP1559 tx - if !ctx.ChainConfig().IsLondon(ctx.Number()) { - m.counter++ - continue - } - r := randomRecipient(ctx.Number()) - txdata = &types.DynamicFeeTx{ - Nonce: ctx.AccountNonce(sender.addr), - Gas: params.TxGas, - GasFeeCap: ctx.TxGasFeeCap(), - GasTipCap: big.NewInt(1), - To: &r, - Value: big.NewInt(1), - } - } - } - - tx := ctx.AddNewTx(sender, txdata) - m.counter++ - m.txs = append(m.txs, valueTransferInfo{ - Block: hexutil.Uint64(ctx.NumberU64()), - Sender: sender.addr, - Tx: tx, - }) - return true -} - -func (m *modValueTransfer) txInfo() any { - return m.txs -} - -func randomRecipient(blocknum *big.Int) (a common.Address) { - h := sha256.Sum256(blocknum.Bytes()) - a.SetBytes(h[:20]) - return a -} diff --git a/cmd/hivechain/mod_withdrawals.go b/cmd/hivechain/mod_withdrawals.go index 1154543020..7f2eb77482 100644 --- a/cmd/hivechain/mod_withdrawals.go +++ b/cmd/hivechain/mod_withdrawals.go @@ -31,7 +31,7 @@ func (m *modWithdrawals) apply(ctx *genBlockContext) bool { w := types.Withdrawal{ Validator: 5, - Address: randomRecipient(ctx.Number()), + Address: pickRecipient(ctx), Amount: 100, } w.Index = ctx.block.AddWithdrawal(&w) From 6baa96f2cecffb096b5e8d26a4785aec0ca66320 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Tue, 16 Jan 2024 14:03:54 +0100 Subject: [PATCH 144/387] cmd/hivechain: add simple test for generate --- cmd/hivechain/generate_test.go | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 cmd/hivechain/generate_test.go diff --git a/cmd/hivechain/generate_test.go b/cmd/hivechain/generate_test.go new file mode 100644 index 0000000000..3b32e49df1 --- /dev/null +++ b/cmd/hivechain/generate_test.go @@ -0,0 +1,29 @@ +package main + +import ( + "path/filepath" + "testing" +) + +func TestGenerate(t *testing.T) { + outdir := t.TempDir() + cfg := generatorConfig{ + txInterval: 1, + txCount: 10, + forkInterval: 2, + chainLength: 30, + outputDir: outdir, + outputs: outputFunctionNames(), + } + cfg, err := cfg.withDefaults() + if err != nil { + t.Fatal(err) + } + g := newGenerator(cfg) + if err := g.run(); err != nil { + t.Fatal(err) + } + + names, _ := filepath.Glob(filepath.Join(outdir, "*")) + t.Log("output files:", names) +} From 589b22c0ed4626e82e96cceb638fbf4ef5943534 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Tue, 16 Jan 2024 14:12:51 +0100 Subject: [PATCH 145/387] cmd/hivechain: deploy revert contract --- cmd/hivechain/contracts.go | 3 +++ cmd/hivechain/mod_deploy.go | 3 +++ 2 files changed, 6 insertions(+) diff --git a/cmd/hivechain/contracts.go b/cmd/hivechain/contracts.go index 4b169bf739..e171b9e4d0 100644 --- a/cmd/hivechain/contracts.go +++ b/cmd/hivechain/contracts.go @@ -20,6 +20,9 @@ var callmeCode []byte //go:embed bytecode/callenv.bin var callenvCode []byte +//go:embed bytecode/callrevert.bin +var callrevertCode []byte + //go:embed bytecode/emit.bin var emitCode []byte diff --git a/cmd/hivechain/mod_deploy.go b/cmd/hivechain/mod_deploy.go index b11b84951a..d20b8bbbf9 100644 --- a/cmd/hivechain/mod_deploy.go +++ b/cmd/hivechain/mod_deploy.go @@ -14,6 +14,9 @@ func init() { register("deploy-callenv", func() blockModifier { return &modDeploy{code: callenvCode} }) + register("deploy-callrevert", func() blockModifier { + return &modDeploy{code: callrevertCode} + }) } type modDeploy struct { From 88790b2b7d5e0460262e13aff02d49b970b17f82 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Tue, 16 Jan 2024 21:08:43 +0100 Subject: [PATCH 146/387] cmd/hivechain: improve spacing in callrevert --- cmd/hivechain/contracts/callrevert.eas | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cmd/hivechain/contracts/callrevert.eas b/cmd/hivechain/contracts/callrevert.eas index 94386d94ea..9eb5342f4a 100644 --- a/cmd/hivechain/contracts/callrevert.eas +++ b/cmd/hivechain/contracts/callrevert.eas @@ -12,6 +12,7 @@ iszero ; [word!=0] jumpi @error ; [word] + #define s_panic .selector("panic(uint)") #define panicv 17 @@ -37,8 +38,7 @@ #define errmsg "user error" #define errmsg_word errmsg << (255-.bitlen(errmsg)) -;;; Solidity ABI error -;;; +;;; Solidity ABI `error(string)` ;;; Revert data layout: ;;; ;;; selector :: 4 || 0x20 :: 32 || len :: 32 || data :: len From 73c1cc6ea7fd66fb0920b48af375412b21bd9dd6 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Tue, 16 Jan 2024 21:08:58 +0100 Subject: [PATCH 147/387] cmd/hivechain: improve deploy tx gaslimit --- cmd/hivechain/mod_deploy.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/cmd/hivechain/mod_deploy.go b/cmd/hivechain/mod_deploy.go index d20b8bbbf9..ecac168481 100644 --- a/cmd/hivechain/mod_deploy.go +++ b/cmd/hivechain/mod_deploy.go @@ -5,6 +5,7 @@ import ( "github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/params" ) func init() { @@ -37,7 +38,9 @@ func (m *modDeploy) apply(ctx *genBlockContext) bool { var code []byte code = append(code, deployerCode...) code = append(code, m.code...) - gas := ctx.TxCreateIntrinsicGas(code) + 10000 + gas := ctx.TxCreateIntrinsicGas(code) + gas += uint64(len(m.code)) * params.CreateDataGas + gas += 15000 // extra gas for constructor execution if !ctx.HasGas(gas) { return false } From cce671d47cbdfa5d6b8cd8fc5b8222781a3c550a Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Tue, 16 Jan 2024 21:14:09 +0100 Subject: [PATCH 148/387] cmd/hivechain: avoid OOG in randomcode Reduce output size. 256 bytes of code cost ~50k gas. --- cmd/hivechain/bytecode/gencode.bin | Bin 46 -> 46 bytes cmd/hivechain/contracts/gencode.eas | 4 ++-- cmd/hivechain/mod_createspam.go | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cmd/hivechain/bytecode/gencode.bin b/cmd/hivechain/bytecode/gencode.bin index bc95df8500e405dd1851d7e59253513e8fb552e6..5f80e048abb6d3093cbcd4c969f212db1da0da00 100644 GIT binary patch delta 19 acmdPXo1nnQ=+G#Tz#Sft$jFf3@EHIr4g~Z7 delta 19 acmdPXo1nnQ Date: Tue, 16 Jan 2024 21:29:37 +0100 Subject: [PATCH 149/387] cmd/hivechain: correct selectors in callrevert --- cmd/hivechain/bytecode/callrevert.bin | Bin 142 -> 142 bytes cmd/hivechain/contracts/callrevert.eas | 14 +++++++------- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/cmd/hivechain/bytecode/callrevert.bin b/cmd/hivechain/bytecode/callrevert.bin index 5468f315f5deca0f1abf76599cf7aa86722c0c50..eb6915d94aeeddd6892454c121df344e549a0a17 100644 GIT binary patch delta 53 zcmeBU>|^9jU@#RGO)v|u_w%SOoG2(UQGrD`fgvb?F@Ys0K_!9VZ*)D!;mQRNnTZi* E0Do=|Q2+n{ delta 53 zcmeBU>|^9jU@#RGO)v|u_sWUkm?$VQQGrD`fgvbCFo7i~K_!9VZ*;xNNn>Y-%)|&Y E0Bw5?cmMzZ diff --git a/cmd/hivechain/contracts/callrevert.eas b/cmd/hivechain/contracts/callrevert.eas index 9eb5342f4a..6f5d0b55fe 100644 --- a/cmd/hivechain/contracts/callrevert.eas +++ b/cmd/hivechain/contracts/callrevert.eas @@ -1,6 +1,6 @@ ;;; -*- mode: asm -*- ;;; This contract is for testing two common Solidity revert encodings: -;;; panic(uint) and error(string). +;;; Panic(uint) and Error(string). ;;; Dispatch .start: @@ -13,10 +13,10 @@ jumpi @error ; [word] -#define s_panic .selector("panic(uint)") -#define panicv 17 +#define s_panic .selector("Panic(uint256)") +#define panicv 0x01 ;; == assert(false) -;;; Solidity ABI `panic(17)` +;;; Solidity ABI `Panic(17)` ;;; Revert data layout: ;;; ;;; selector :: 4 || value :: 32 @@ -25,7 +25,7 @@ push s_panic << (28*8) ; [sel] push 0 ; [offset, sel] mstore ; [] - push 17 ; [panicv] + push panicv ; [panicv] push 4 ; [offset, panicv] mstore ; [] @@ -34,11 +34,11 @@ revert ; [] -#define s_error .selector("error(string)") +#define s_error .selector("Error(string)") #define errmsg "user error" #define errmsg_word errmsg << (255-.bitlen(errmsg)) -;;; Solidity ABI `error(string)` +;;; Solidity ABI `Error(string)` ;;; Revert data layout: ;;; ;;; selector :: 4 || 0x20 :: 32 || len :: 32 || data :: len From 2f9c3d1288f9a73ff2b103d5d3c615b3665c826d Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Wed, 17 Jan 2024 15:03:44 +0100 Subject: [PATCH 150/387] cmd/hivechain: add blob transaction --- cmd/hivechain/mod.go | 2 +- cmd/hivechain/mod_txinvoke.go | 62 ++++++++++++++++++++++++---- cmd/hivechain/mod_txvaluetransfer.go | 20 +++++---- 3 files changed, 67 insertions(+), 17 deletions(-) diff --git a/cmd/hivechain/mod.go b/cmd/hivechain/mod.go index 0b6a0fbb9e..d39df135b2 100644 --- a/cmd/hivechain/mod.go +++ b/cmd/hivechain/mod.go @@ -56,7 +56,7 @@ func (ctx *genBlockContext) AddNewTx(sender *genAccount, data types.TxData) *typ if err != nil { panic(err) } - ctx.block.AddTx(tx) + ctx.block.AddTx(tx.WithoutBlobTxSidecar()) ctx.txcount++ return tx } diff --git a/cmd/hivechain/mod_txinvoke.go b/cmd/hivechain/mod_txinvoke.go index 7422faaf3b..53336d2c35 100644 --- a/cmd/hivechain/mod_txinvoke.go +++ b/cmd/hivechain/mod_txinvoke.go @@ -2,12 +2,16 @@ package main import ( "encoding/binary" + "fmt" "math/big" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/crypto/kzg4844" + "github.com/ethereum/go-ethereum/params" + "github.com/holiman/uint256" ) func init() { @@ -29,6 +33,12 @@ func init() { gasLimit: 100000, } }) + register("tx-emit-eip4844", func() blockModifier { + return &modInvokeEmit{ + txType: types.BlobTxType, + gasLimit: 100000, + } + }) } // modInvokeEmit creates transactions that invoke the 'emit' contract. @@ -59,6 +69,16 @@ func (m *modInvokeEmit) apply(ctx *genBlockContext) bool { var txdata types.TxData switch m.txType { + case types.LegacyTxType: + txdata = &types.LegacyTx{ + Nonce: ctx.AccountNonce(sender.addr), + Gas: m.gasLimit, + GasPrice: ctx.TxGasFeeCap(), + To: &recipient, + Data: calldata, + Value: big.NewInt(2), + } + case types.AccessListTxType: if !ctx.ChainConfig().IsBerlin(ctx.Number()) { return false @@ -98,15 +118,41 @@ func (m *modInvokeEmit) apply(ctx *genBlockContext) bool { }, } - case types.LegacyTxType: - txdata = &types.LegacyTx{ - Nonce: ctx.AccountNonce(sender.addr), - Gas: m.gasLimit, - GasPrice: ctx.TxGasFeeCap(), - To: &recipient, - Data: calldata, - Value: big.NewInt(2), + case types.BlobTxType: + if !ctx.ChainConfig().IsCancun(ctx.Number(), ctx.Timestamp()) { + return false } + var ( + blob1 = kzg4844.Blob{0x01} + blob1C, _ = kzg4844.BlobToCommitment(blob1) + blob1P, _ = kzg4844.ComputeBlobProof(blob1, blob1C) + ) + sidecar := &types.BlobTxSidecar{ + Blobs: []kzg4844.Blob{blob1}, + Commitments: []kzg4844.Commitment{blob1C}, + Proofs: []kzg4844.Proof{blob1P}, + } + txdata = &types.BlobTx{ + Nonce: ctx.AccountNonce(sender.addr), + GasTipCap: uint256.NewInt(1), + GasFeeCap: uint256.MustFromBig(ctx.TxGasFeeCap()), + Gas: m.gasLimit, + To: recipient, + Value: uint256.NewInt(3), + Data: calldata, + AccessList: types.AccessList{ + { + Address: recipient, + StorageKeys: []common.Hash{{}, datahash}, + }, + }, + BlobFeeCap: uint256.NewInt(params.BlobTxBlobGasPerBlob), + BlobHashes: sidecar.BlobHashes(), + Sidecar: sidecar, + } + + default: + panic(fmt.Errorf("unhandled tx type %d", m.txType)) } txindex := ctx.TxCount() diff --git a/cmd/hivechain/mod_txvaluetransfer.go b/cmd/hivechain/mod_txvaluetransfer.go index ab3d639344..595c0c94b6 100644 --- a/cmd/hivechain/mod_txvaluetransfer.go +++ b/cmd/hivechain/mod_txvaluetransfer.go @@ -1,6 +1,7 @@ package main import ( + "fmt" "math/big" "github.com/ethereum/go-ethereum/common" @@ -55,6 +56,15 @@ func (m *modValueTransfer) apply(ctx *genBlockContext) bool { var txdata types.TxData switch m.txType { + case types.LegacyTxType: + txdata = &types.LegacyTx{ + Nonce: ctx.AccountNonce(sender.addr), + Gas: m.gasLimit, + GasPrice: ctx.TxGasFeeCap(), + To: &recipient, + Value: big.NewInt(1), + } + case types.AccessListTxType: if !ctx.ChainConfig().IsBerlin(ctx.Number()) { return false @@ -80,14 +90,8 @@ func (m *modValueTransfer) apply(ctx *genBlockContext) bool { Value: big.NewInt(1), } - case types.LegacyTxType: - txdata = &types.LegacyTx{ - Nonce: ctx.AccountNonce(sender.addr), - Gas: m.gasLimit, - GasPrice: ctx.TxGasFeeCap(), - To: &recipient, - Value: big.NewInt(1), - } + default: + panic(fmt.Errorf("unhandled tx type %d", m.txType)) } txindex := ctx.TxCount() From af91e0faff883a4539db09657e2dde2a5ea3c93a Mon Sep 17 00:00:00 2001 From: Martin HS Date: Thu, 18 Jan 2024 10:59:37 +0100 Subject: [PATCH 151/387] clients/reth: use ghcr.io/paradigmxyz/reth as base image (#971) * clients/reth: use ghcr.io/paradigmxyz/reth as base image * clients/reth: use latest tag --- clients/reth/Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/clients/reth/Dockerfile b/clients/reth/Dockerfile index 27c0789474..2f70b6aa5c 100644 --- a/clients/reth/Dockerfile +++ b/clients/reth/Dockerfile @@ -1,5 +1,5 @@ -ARG baseimage=paradigmxyz/reth -ARG tag=main +ARG baseimage=ghcr.io/paradigmxyz/reth +ARG tag=latest FROM $baseimage:$tag as builder From 6b7dae42594060937241b66cb9d563cd62d85233 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Thu, 18 Jan 2024 13:17:41 +0100 Subject: [PATCH 152/387] cmd/hivechain: use calldata hash as log topic in emit contract --- cmd/hivechain/bytecode/emit.bin | Bin 35 -> 35 bytes cmd/hivechain/contracts/emit.eas | 20 +++++++++++--------- cmd/hivechain/mod_txinvoke.go | 22 ++++++++++++---------- 3 files changed, 23 insertions(+), 19 deletions(-) diff --git a/cmd/hivechain/bytecode/emit.bin b/cmd/hivechain/bytecode/emit.bin index 4f28bbfe84d3fbaba046c518c00b32fc9526aabb..3bb08f5cf8b3553dafe3e7e84d4af50ff392ae0b 100644 GIT binary patch literal 35 pcmXqONML9%Phe0;U Date: Thu, 25 Jan 2024 12:20:51 -0600 Subject: [PATCH 153/387] clients/nethermind: Fix Dockerfile.git (#972) --- clients/nethermind/Dockerfile.git | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clients/nethermind/Dockerfile.git b/clients/nethermind/Dockerfile.git index 8c5e0a1d67..0a94381c00 100644 --- a/clients/nethermind/Dockerfile.git +++ b/clients/nethermind/Dockerfile.git @@ -1,7 +1,7 @@ ### Build Nethermind From Git: ## Builder stage: Compiles nethermind from a git repository -FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build +FROM mcr.microsoft.com/dotnet/sdk:8.0-jammy AS build ARG github=nethermindeth/nethermind ARG tag=master From 7c5d7378678daea01e250457c3872ac37d5db5e8 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Mon, 29 Jan 2024 19:04:36 +0100 Subject: [PATCH 154/387] simulators/ethereum/rpc-compat: load chain env from tests --- simulators/ethereum/rpc-compat/main.go | 26 ++++++++------------------ 1 file changed, 8 insertions(+), 18 deletions(-) diff --git a/simulators/ethereum/rpc-compat/main.go b/simulators/ethereum/rpc-compat/main.go index 08996f77dc..cb65e4c53f 100644 --- a/simulators/ethereum/rpc-compat/main.go +++ b/simulators/ethereum/rpc-compat/main.go @@ -13,30 +13,13 @@ import ( "strings" "time" + "github.com/ethereum/go-ethereum/common" "github.com/ethereum/hive/hivesim" diff "github.com/yudai/gojsondiff" "github.com/yudai/gojsondiff/formatter" ) var ( - clientEnv = hivesim.Params{ - "HIVE_NODETYPE": "full", - "HIVE_NETWORK_ID": "1337", - "HIVE_CHAIN_ID": "1337", - "HIVE_FORK_HOMESTEAD": "0", - //"HIVE_FORK_DAO_BLOCK": 2000, - "HIVE_FORK_TANGERINE": "0", - "HIVE_FORK_SPURIOUS": "0", - "HIVE_FORK_BYZANTIUM": "0", - "HIVE_FORK_CONSTANTINOPLE": "0", - "HIVE_FORK_PETERSBURG": "0", - "HIVE_FORK_ISTANBUL": "0", - "HIVE_FORK_BERLIN": "0", - "HIVE_FORK_LONDON": "0", - "HIVE_SHANGHAI_TIMESTAMP": "0", - "HIVE_TERMINAL_TOTAL_DIFFICULTY": "0", - "HIVE_TERMINAL_TOTAL_DIFFICULTY_PASSED": "1", - } files = map[string]string{ "genesis.json": "./tests/genesis.json", "chain.rlp": "./tests/chain.rlp", @@ -49,6 +32,13 @@ type test struct { } func main() { + // Load fork environment. + var clientEnv hivesim.Params + err := common.LoadJSON("tests/forkenv.json", &clientEnv) + if err != nil { + panic(err) + } + suite := hivesim.Suite{ Name: "rpc-compat", Description: ` From cdb533b0b219429b25627581baff4ddafcc35ad6 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Mon, 29 Jan 2024 19:27:23 +0100 Subject: [PATCH 155/387] simulators/ethereum/rpc-compat: add explainer in diff message --- simulators/ethereum/rpc-compat/main.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/simulators/ethereum/rpc-compat/main.go b/simulators/ethereum/rpc-compat/main.go index cb65e4c53f..522ee2eda8 100644 --- a/simulators/ethereum/rpc-compat/main.go +++ b/simulators/ethereum/rpc-compat/main.go @@ -127,7 +127,7 @@ func runTest(t *hivesim.T, c *hivesim.Client, data []byte) error { } formatter := formatter.NewAsciiFormatter(got, config) diffString, _ := formatter.Format(d) - return fmt.Errorf("response differs from expected:\n%s", diffString) + return fmt.Errorf("response differs from expected (-- client, ++ test):\n%s", diffString) } resp = nil default: From bb4fce03a89019a21389cfa4ee4674d43281d7a0 Mon Sep 17 00:00:00 2001 From: andri lim Date: Tue, 30 Jan 2024 01:43:34 +0700 Subject: [PATCH 156/387] clients/nimbus-el: change command line options to use combo HTTP server for RPC (#973) --- clients/nimbus-el/nimbus.sh | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/clients/nimbus-el/nimbus.sh b/clients/nimbus-el/nimbus.sh index 446fdf5691..2a29a1e818 100644 --- a/clients/nimbus-el/nimbus.sh +++ b/clients/nimbus-el/nimbus.sh @@ -115,14 +115,17 @@ fi set -e -# Configure RPC. +# Configure RPC +FLAGS="$FLAGS --http-address:0.0.0.0 --http-port:8545" +FLAGS="$FLAGS --rpc --rpc-api:eth,debug" +FLAGS="$FLAGS --ws --ws-api:eth,debug" + +# Configure graphql if [ "$HIVE_GRAPHQL_ENABLED" != "" ]; then - FLAGS="$FLAGS --graphql --graphql-address:0.0.0.0 --graphql-port:8545" -else - FLAGS="$FLAGS --rpc --rpc-api:eth,debug --rpc-address:0.0.0.0 --rpc-port:8545" - FLAGS="$FLAGS --ws --ws-api:eth,debug --ws-address:0.0.0.0 --ws-port:8546" + FLAGS="$FLAGS --graphql" fi +# Configure engine api if [ "$HIVE_TERMINAL_TOTAL_DIFFICULTY" != "" ]; then echo "0x7365637265747365637265747365637265747365637265747365637265747365" > /jwtsecret FLAGS="$FLAGS --engine-api:true --engine-api-address:0.0.0.0 --engine-api-port:8551 --jwt-secret:/jwtsecret" From 7f62650533f28a304d501f454a97ec5641d911bb Mon Sep 17 00:00:00 2001 From: Kolby Moroz Liebl <31669092+KolbyML@users.noreply.github.com> Date: Wed, 31 Jan 2024 04:46:36 -0700 Subject: [PATCH 157/387] .circleci: Add CI for rust simulators (#980) * .circleci: add support for running ci's based off code modified * .circleci: Add CI for rust simulators --- .circleci/config.yml | 81 +++----------------------- .circleci/continue_config.yml | 106 ++++++++++++++++++++++++++++++++++ .circleci/rust-simulators.sh | 16 +++++ 3 files changed, 130 insertions(+), 73 deletions(-) create mode 100644 .circleci/continue_config.yml create mode 100644 .circleci/rust-simulators.sh diff --git a/.circleci/config.yml b/.circleci/config.yml index 092a0a7f6b..398b83fed2 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1,79 +1,14 @@ version: 2.1 -orbs: - go: circleci/go@1.5.0 - -jobs: - # This job builds the hive executable and stores it in the workspace. - build: - docker: - - image: cimg/go:1.21 - steps: - # Build it. - - checkout - - go/load-cache - - go/mod-download - - go/save-cache - - run: {command: 'go build -ldflags="-s -extldflags=-static" -tags "osusergo netgo static_build" .'} - # Store the executable. - - persist_to_workspace: - root: . - paths: ["hive"] - # This job runs the smoke test simulations. This requires a virtual - # machine instead of the container-based build environment because - # hive needs to be able to talk to the docker containers it creates. - smoke-tests: - machine: - image: ubuntu-2004:202201-02 - steps: - - checkout - - attach_workspace: {at: "/tmp/build"} - - run: - command: "/tmp/build/hive --sim=smoke/genesis --client=go-ethereum" - - run: - command: "/tmp/build/hive --sim=smoke/network --client=go-ethereum" +setup: true - # This job also runs the smoke test simulations, but against a remote dockerd. - smoke-tests-remote-docker: - docker: - - image: cimg/base:2022.04 - steps: - - checkout - - attach_workspace: {at: "/tmp/build"} - - setup_remote_docker: {version: 20.10.14} - - run: - command: "/tmp/build/hive --sim=smoke/genesis --client=go-ethereum --loglevel 5" - - run: - command: "/tmp/build/hive --sim=smoke/network --client=go-ethereum --loglevel 5" - - # This job runs the go unit tests. - go-test: - docker: - - image: cimg/go:1.21 - steps: - # Get the source. - - checkout - - go/load-cache - - go/mod-download - - go/save-cache - # Run the tests. - - run: - name: "hive module tests" - command: "go test -cover ./..." - - run: - name: "hiveproxy module tests" - command: "go test -cover ./..." - working_directory: "./hiveproxy" - - run: - name: "Compile Go simulators" - command: ".circleci/compile-simulators.sh" +orbs: + path-filtering: circleci/path-filtering@0.0.1 workflows: - main: + setup-workflow: jobs: - - go-test - - build - - smoke-tests: - requires: ["build"] - - smoke-tests-remote-docker: - requires: ["build"] + - path-filtering/filter: + mapping: | + simulators/portal/.* rust-ci true + base-revision: origin/master diff --git a/.circleci/continue_config.yml b/.circleci/continue_config.yml new file mode 100644 index 0000000000..5534e7a1be --- /dev/null +++ b/.circleci/continue_config.yml @@ -0,0 +1,106 @@ +version: 2.1 +orbs: + go: circleci/go@1.5.0 + +parameters: + rust-ci: + type: boolean + default: false + +jobs: + # This job builds the hive executable and stores it in the workspace. + build: + docker: + - image: cimg/go:1.21 + steps: + # Build it. + - checkout + - go/load-cache + - go/mod-download + - go/save-cache + - run: {command: 'go build -ldflags="-s -extldflags=-static" -tags "osusergo netgo static_build" .'} + # Store the executable. + - persist_to_workspace: + root: . + paths: ["hive"] + + # This job runs the smoke test simulations. This requires a virtual + # machine instead of the container-based build environment because + # hive needs to be able to talk to the docker containers it creates. + smoke-tests: + machine: + image: ubuntu-2004:202201-02 + steps: + - checkout + - attach_workspace: {at: "/tmp/build"} + - run: + command: "/tmp/build/hive --sim=smoke/genesis --client=go-ethereum" + - run: + command: "/tmp/build/hive --sim=smoke/network --client=go-ethereum" + + # This job also runs the smoke test simulations, but against a remote dockerd. + smoke-tests-remote-docker: + docker: + - image: cimg/base:2022.04 + steps: + - checkout + - attach_workspace: {at: "/tmp/build"} + - setup_remote_docker: {version: 20.10.14} + - run: + command: "/tmp/build/hive --sim=smoke/genesis --client=go-ethereum --loglevel 5" + - run: + command: "/tmp/build/hive --sim=smoke/network --client=go-ethereum --loglevel 5" + + # This job runs the go unit tests. + go-test: + docker: + - image: cimg/go:1.21 + steps: + # Get the source. + - checkout + - go/load-cache + - go/mod-download + - go/save-cache + # Run the tests. + - run: + name: "hive module tests" + command: "go test -cover ./..." + - run: + name: "hiveproxy module tests" + command: "go test -cover ./..." + working_directory: "./hiveproxy" + - run: + name: "Compile Go simulators" + command: ".circleci/compile-simulators.sh" + # this makes sure the rust code is good + rust-simulators: + docker: + - image: cimg/rust:1.71.1 + steps: + - checkout + - run: + name: Install rustfmt + command: rustup component add rustfmt + - run: + name: Install Clippy + command: rustup component add clippy + - run: + name: Install Clang + command: sudo apt update && sudo apt-get install clang -y + - run: + name: "Lint, build, test Rust simulators" + command: ".circleci/rust-simulators.sh" + +workflows: + main: + jobs: + - go-test + - build + - smoke-tests: + requires: ["build"] + - smoke-tests-remote-docker: + requires: ["build"] + - rust-jobs: + when: << pipeline.parameters.rust-ci >> + jobs: + - rust-simulators \ No newline at end of file diff --git a/.circleci/rust-simulators.sh b/.circleci/rust-simulators.sh new file mode 100644 index 0000000000..5bf64708ac --- /dev/null +++ b/.circleci/rust-simulators.sh @@ -0,0 +1,16 @@ +#!/bin/bash + +# This causes the bash script to exit immediately if any commands errors out +set -e + +failed="" +sims=$(find simulators -name Cargo.toml) +for d in $sims; do + d="$(dirname "$d")" + echo "Lint, build, test $d" + ( cd "$d" || exit 1; + cargo fmt --all -- --check; + cargo clippy --all --all-targets --all-features --no-deps -- --deny warnings; + cargo test --workspace -- --nocapture; + ) +done From 236250c04be45c0061ab4cc7d612b0e097299a52 Mon Sep 17 00:00:00 2001 From: Kolby Moroz Liebl <31669092+KolbyML@users.noreply.github.com> Date: Wed, 31 Jan 2024 04:47:45 -0700 Subject: [PATCH 158/387] clients: add portal network client definitions (#977) --- clients/fluffy/Dockerfile | 12 +++++++++++ clients/fluffy/fluffy.sh | 23 ++++++++++++++++++++++ clients/trin-bridge/Dockerfile | 19 ++++++++++++++++++ clients/trin-bridge/trin_bridge.sh | 16 +++++++++++++++ clients/trin-bridge/trin_bridge_version.sh | 7 +++++++ clients/trin/Dockerfile | 16 +++++++++++++++ clients/trin/trin.sh | 19 ++++++++++++++++++ clients/trin/trin_version.sh | 7 +++++++ clients/ultralight/Dockerfile | 11 +++++++++++ clients/ultralight/ultralight.sh | 19 ++++++++++++++++++ 10 files changed, 149 insertions(+) create mode 100644 clients/fluffy/Dockerfile create mode 100755 clients/fluffy/fluffy.sh create mode 100644 clients/trin-bridge/Dockerfile create mode 100644 clients/trin-bridge/trin_bridge.sh create mode 100644 clients/trin-bridge/trin_bridge_version.sh create mode 100644 clients/trin/Dockerfile create mode 100644 clients/trin/trin.sh create mode 100644 clients/trin/trin_version.sh create mode 100644 clients/ultralight/Dockerfile create mode 100644 clients/ultralight/ultralight.sh diff --git a/clients/fluffy/Dockerfile b/clients/fluffy/Dockerfile new file mode 100644 index 0000000000..b34610724b --- /dev/null +++ b/clients/fluffy/Dockerfile @@ -0,0 +1,12 @@ +ARG branch=amd64-master-latest + +FROM statusim/nimbus-fluffy:$branch + +ADD fluffy.sh /fluffy.sh +RUN chmod +x /fluffy.sh + +RUN echo "latest" > /version.txt + +EXPOSE 8545 9009/udp + +ENTRYPOINT ["/fluffy.sh"] diff --git a/clients/fluffy/fluffy.sh b/clients/fluffy/fluffy.sh new file mode 100755 index 0000000000..f9197904f8 --- /dev/null +++ b/clients/fluffy/fluffy.sh @@ -0,0 +1,23 @@ +#!/bin/bash + +# Immediately abort the script on any error encountered +set -e + +IP_ADDR=$(hostname -i | awk '{print $1}') +FLAGS="" + +if [ "$HIVE_PORTAL_NETWORKS_SELECTED" != "" ]; then + if [[ $HIVE_PORTAL_NETWORKS_SELECTED =~ "beacon" ]]; then + # Providing atrusted block root is required currently to enable the beacon network. + # It can be a made up value for now as tests are not doing any sync. + FLAGS="$FLAGS --trusted-block-root:0x0000000000000000000000000000000000000000000000000000000000000000" + fi +fi + + +if [ "$HIVE_CLIENT_PRIVATE_KEY" != "" ]; then + FLAGS="$FLAGS --netkey-unsafe=0x$HIVE_CLIENT_PRIVATE_KEY" +fi + +# Fluffy runs all networks by default, so we can not configure to run networks individually +fluffy --rpc --rpc-address="0.0.0.0" --nat:extip:"$IP_ADDR" --network=none --log-level="debug" $FLAGS diff --git a/clients/trin-bridge/Dockerfile b/clients/trin-bridge/Dockerfile new file mode 100644 index 0000000000..aa7405a47d --- /dev/null +++ b/clients/trin-bridge/Dockerfile @@ -0,0 +1,19 @@ +FROM portalnetwork/trin:latest-bridge + +ADD https://raw.githubusercontent.com/ethereum/portal-spec-tests/master/tests/mainnet/history/hive/test_data_collection_of_forks_blocks.yaml /test_data_collection_of_forks_blocks.yaml +ADD trin_bridge.sh /trin_bridge.sh +RUN chmod +x /trin_bridge.sh + +ADD trin_bridge_version.sh /trin_bridge_version.sh +RUN chmod +x /trin_bridge_version.sh + +RUN /trin_bridge_version.sh > /version.txt + +# Export the usual networking ports to allow outside access to the node +EXPOSE 8545 9009/udp + +# add fake secrets for bridge activation +ENV PANDAOPS_CLIENT_ID=xxx +ENV PANDAOPS_CLIENT_SECRET=xxx + +ENTRYPOINT ["/trin_bridge.sh"] diff --git a/clients/trin-bridge/trin_bridge.sh b/clients/trin-bridge/trin_bridge.sh new file mode 100644 index 0000000000..d67e0a94b8 --- /dev/null +++ b/clients/trin-bridge/trin_bridge.sh @@ -0,0 +1,16 @@ +#!/bin/bash + +# Immediately abort the script on any error encountered +set -e + +IP_ADDR=$(hostname -i | awk '{print $1}') +FLAGS="" + +if [ "$HIVE_BOOTNODES" != "" ]; then + FLAGS="$FLAGS --bootnodes=$HIVE_BOOTNODES" +else + echo "Warning: HIVE_BOOTNODES wasn't provided" + exit 1 +fi + +RUST_LOG=debug portal-bridge --node-count 1 $FLAGS --executable-path ./usr/bin/trin --mode test:/test_data_collection_of_forks_blocks.yaml --external-ip $IP_ADDR --epoch-accumulator-path . trin diff --git a/clients/trin-bridge/trin_bridge_version.sh b/clients/trin-bridge/trin_bridge_version.sh new file mode 100644 index 0000000000..b29ff5a658 --- /dev/null +++ b/clients/trin-bridge/trin_bridge_version.sh @@ -0,0 +1,7 @@ +#!/bin/bash + +# Immediately abort the script on any error encountered +set -e + +#trin --version | tail -1 | sed "s/ /\//g" +echo "latest" diff --git a/clients/trin/Dockerfile b/clients/trin/Dockerfile new file mode 100644 index 0000000000..3f980aef80 --- /dev/null +++ b/clients/trin/Dockerfile @@ -0,0 +1,16 @@ +ARG branch=latest + +FROM portalnetwork/trin:$branch + +ADD trin.sh /trin.sh +RUN chmod +x /trin.sh + +ADD trin_version.sh /trin_version.sh +RUN chmod +x /trin_version.sh + +RUN /trin_version.sh > /version.txt + +# Export the usual networking ports to allow outside access to the node +EXPOSE 8545 9009/udp + +ENTRYPOINT ["/trin.sh"] diff --git a/clients/trin/trin.sh b/clients/trin/trin.sh new file mode 100644 index 0000000000..2677d2966d --- /dev/null +++ b/clients/trin/trin.sh @@ -0,0 +1,19 @@ +#!/bin/bash + +# Immediately abort the script on any error encountered +set -e + +IP_ADDR=$(hostname -i | awk '{print $1}') +FLAGS="" + +if [ "$HIVE_CLIENT_PRIVATE_KEY" != "" ]; then + FLAGS="$FLAGS --unsafe-private-key 0x$HIVE_CLIENT_PRIVATE_KEY" +fi + +if [ "$HIVE_PORTAL_NETWORKS_SELECTED" != "" ]; then + FLAGS="$FLAGS --networks $HIVE_PORTAL_NETWORKS_SELECTED" +else + FLAGS="$FLAGS --networks history" +fi + +RUST_LOG=debug trin --web3-transport http --web3-http-address http://0.0.0.0:8545 --external-address "$IP_ADDR":9009 --bootnodes none $FLAGS diff --git a/clients/trin/trin_version.sh b/clients/trin/trin_version.sh new file mode 100644 index 0000000000..b29ff5a658 --- /dev/null +++ b/clients/trin/trin_version.sh @@ -0,0 +1,7 @@ +#!/bin/bash + +# Immediately abort the script on any error encountered +set -e + +#trin --version | tail -1 | sed "s/ /\//g" +echo "latest" diff --git a/clients/ultralight/Dockerfile b/clients/ultralight/Dockerfile new file mode 100644 index 0000000000..011fe582d5 --- /dev/null +++ b/clients/ultralight/Dockerfile @@ -0,0 +1,11 @@ +FROM ghcr.io/ethereumjs/ultralight:latest + +COPY ultralight.sh /ultralight.sh +RUN chmod +x /ultralight.sh + +RUN echo "latest" > /version.txt + +# Export the usual networking ports to allow outside access to the node +EXPOSE 8545 9000/udp + +ENTRYPOINT ["/ultralight.sh"] diff --git a/clients/ultralight/ultralight.sh b/clients/ultralight/ultralight.sh new file mode 100644 index 0000000000..f619a18e0c --- /dev/null +++ b/clients/ultralight/ultralight.sh @@ -0,0 +1,19 @@ +#!/bin/bash + +# Immediately abort the script on any error encountered +set -e + +IP_ADDR=$(hostname -i | awk '{print $1}') +FLAGS="" + +if [ "$HIVE_CLIENT_PRIVATE_KEY" != "" ]; then + FLAGS="$FLAGS --pk=0x1a2408021220$HIVE_CLIENT_PRIVATE_KEY" +fi + +if [ "$HIVE_PORTAL_NETWORKS_SELECTED" != "" ]; then + FLAGS="$FLAGS --networks=$HIVE_PORTAL_NETWORKS_SELECTED" +else + FLAGS="$FLAGS --networks=history" +fi + +DEBUG=* node /ultralight/packages/cli/dist/index.js --bindAddress="$IP_ADDR:9000" --dataDir="./data" --rpcPort=8545 $FLAGS From e15e7af0b2415a4dd3ea849b4a98c2b03f254b2f Mon Sep 17 00:00:00 2001 From: Kolby Moroz Liebl <31669092+KolbyML@users.noreply.github.com> Date: Wed, 31 Jan 2024 14:37:13 -0700 Subject: [PATCH 159/387] .ciricleci: fix circleci script after breaking from #980 (#982) --- .circleci/continue_config.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.circleci/continue_config.yml b/.circleci/continue_config.yml index 5534e7a1be..399370a88a 100644 --- a/.circleci/continue_config.yml +++ b/.circleci/continue_config.yml @@ -100,7 +100,7 @@ workflows: requires: ["build"] - smoke-tests-remote-docker: requires: ["build"] - - rust-jobs: - when: << pipeline.parameters.rust-ci >> - jobs: - - rust-simulators \ No newline at end of file + rust-jobs: + when: << pipeline.parameters.rust-ci >> + jobs: + - rust-simulators From 265969f99ebd3022bfdcd6ad2b78e4f22f23f407 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Thu, 1 Feb 2024 00:17:57 +0100 Subject: [PATCH 160/387] hivesim: add built-in support for connecting to the engine API We need to do that in a lot more tests now and it gets tiring to redeclare the token everywhere. --- go.mod | 1 + go.sum | 3 +++ hivesim/engineapi.go | 27 +++++++++++++++++++++++++++ hivesim/testapi.go | 22 +++++++++++++++++++--- 4 files changed, 50 insertions(+), 3 deletions(-) create mode 100644 hivesim/engineapi.go diff --git a/go.mod b/go.mod index 698c23bffd..fffd6e4d29 100644 --- a/go.mod +++ b/go.mod @@ -46,6 +46,7 @@ require ( github.com/go-stack/stack v1.8.1 // indirect github.com/gofrs/flock v0.8.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang-jwt/jwt/v4 v4.5.0 // indirect github.com/golang/protobuf v1.5.3 // indirect github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect github.com/gorilla/websocket v1.5.0 // indirect diff --git a/go.sum b/go.sum index d5f87c3ca2..0e7fd342b7 100644 --- a/go.sum +++ b/go.sum @@ -138,7 +138,10 @@ github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7a github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/gogo/status v1.1.0/go.mod h1:BFv9nrluPLmrS0EmGVvLaPNmRosr9KapBYd5/hpY1WM= +github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY= github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= +github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= +github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= diff --git a/hivesim/engineapi.go b/hivesim/engineapi.go new file mode 100644 index 0000000000..a777ce332d --- /dev/null +++ b/hivesim/engineapi.go @@ -0,0 +1,27 @@ +package hivesim + +import ( + "fmt" + "net/http" + "time" + + "github.com/ethereum/go-ethereum/rpc" + "github.com/golang-jwt/jwt/v4" +) + +// This is the static secret configured for all execution-layer clients. +var ENGINEAPI_JWT_SECRET = [32]byte{0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x65} + +func jwtAuth(secret [32]byte) rpc.HTTPAuth { + return func(h http.Header) error { + token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{ + "iat": &jwt.NumericDate{Time: time.Now()}, + }) + s, err := token.SignedString(secret[:]) + if err != nil { + return fmt.Errorf("failed to create JWT token: %w", err) + } + h.Set("Authorization", "Bearer "+s) + return nil + } +} diff --git a/hivesim/testapi.go b/hivesim/testapi.go index 27f97ad2c3..b9ac41de93 100644 --- a/hivesim/testapi.go +++ b/hivesim/testapi.go @@ -1,6 +1,7 @@ package hivesim import ( + "context" "fmt" "net" "os" @@ -159,9 +160,10 @@ type Client struct { Container string IP net.IP - mu sync.Mutex - rpc *rpc.Client - test *T + mu sync.Mutex + rpc *rpc.Client + enginerpc *rpc.Client + test *T } // EnodeURL returns the default peer-to-peer endpoint of the client. @@ -184,6 +186,20 @@ func (c *Client) RPC() *rpc.Client { return c.rpc } +// EngineAPI returns an RPC client connected to an execution-layer client's engine API server. +func (c *Client) EngineAPI() *rpc.Client { + c.mu.Lock() + defer c.mu.Unlock() + + if c.enginerpc != nil { + return c.enginerpc + } + auth := rpc.WithHTTPAuth(jwtAuth(ENGINEAPI_JWT_SECRET)) + url := fmt.Sprintf("http://%v:8551", c.IP) + c.enginerpc, _ = rpc.DialOptions(context.Background(), url, auth) + return c.enginerpc +} + // Exec runs a script in the client container. func (c *Client) Exec(command ...string) (*ExecInfo, error) { return c.test.Sim.ClientExec(c.test.SuiteID, c.test.TestID, c.Container, command) From d38a51d4e475f79b812bc03ed8c5178e666a9e61 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Thu, 1 Feb 2024 00:23:12 +0100 Subject: [PATCH 161/387] go.mod: go.mod tidy --- go.mod | 4 ++-- go.sum | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index fffd6e4d29..3ceb02db0b 100644 --- a/go.mod +++ b/go.mod @@ -8,7 +8,9 @@ require ( github.com/ethereum/hive/hiveproxy v0.0.0-20230919105823-37cbbe1ef86d github.com/evanw/esbuild v0.18.11 github.com/fsouza/go-dockerclient v1.9.8 + github.com/golang-jwt/jwt/v4 v4.5.0 github.com/gorilla/mux v1.8.0 + github.com/holiman/uint256 v1.2.3 github.com/lithammer/dedent v1.1.0 golang.org/x/exp v0.0.0-20230905200255-921286631fa9 golang.org/x/net v0.17.0 @@ -46,13 +48,11 @@ require ( github.com/go-stack/stack v1.8.1 // indirect github.com/gofrs/flock v0.8.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang-jwt/jwt/v4 v4.5.0 // indirect github.com/golang/protobuf v1.5.3 // indirect github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect github.com/gorilla/websocket v1.5.0 // indirect github.com/hashicorp/yamux v0.1.1 // indirect github.com/holiman/bloomfilter/v2 v2.0.3 // indirect - github.com/holiman/uint256 v1.2.3 // indirect github.com/klauspost/compress v1.15.15 // indirect github.com/kr/pretty v0.3.1 // indirect github.com/kr/text v0.2.0 // indirect diff --git a/go.sum b/go.sum index 0e7fd342b7..437148d4f5 100644 --- a/go.sum +++ b/go.sum @@ -138,7 +138,6 @@ github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7a github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/gogo/status v1.1.0/go.mod h1:BFv9nrluPLmrS0EmGVvLaPNmRosr9KapBYd5/hpY1WM= -github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY= github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= From 7a26a9bb99aab4c02b9c19e741fa20f033e1d682 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Thu, 1 Feb 2024 01:03:24 +0100 Subject: [PATCH 162/387] simulators/ethereum/rpc-compat: send forkchoiceUpdated to client (#983) --- simulators/ethereum/rpc-compat/go.mod | 9 +++- simulators/ethereum/rpc-compat/go.sum | 13 ++++- simulators/ethereum/rpc-compat/main.go | 74 ++++++++++++++++---------- 3 files changed, 63 insertions(+), 33 deletions(-) diff --git a/simulators/ethereum/rpc-compat/go.mod b/simulators/ethereum/rpc-compat/go.mod index 46eb27822c..59b4bd260f 100644 --- a/simulators/ethereum/rpc-compat/go.mod +++ b/simulators/ethereum/rpc-compat/go.mod @@ -3,7 +3,8 @@ module github.com/ethereum/hive/simulators/ethereum/rpc-compat go 1.18 require ( - github.com/ethereum/hive v0.0.0-20231031133732-dcd7ddb75960 + github.com/ethereum/go-ethereum v1.13.5-0.20231031113925-bc42e88415d3 + github.com/ethereum/hive v0.0.0-20240131232337-d38a51d4e475 github.com/yudai/gojsondiff v1.0.0 ) @@ -12,12 +13,15 @@ require ( github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect github.com/deckarep/golang-set/v2 v2.1.0 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 // indirect - github.com/ethereum/go-ethereum v1.13.5-0.20231031113925-bc42e88415d3 // indirect github.com/go-ole/go-ole v1.2.6 // indirect github.com/go-stack/stack v1.8.1 // indirect + github.com/golang-jwt/jwt/v4 v4.5.0 // indirect github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect github.com/gorilla/websocket v1.5.0 // indirect github.com/holiman/uint256 v1.2.3 // indirect + github.com/lithammer/dedent v1.1.0 // indirect + github.com/mattn/go-colorable v0.1.13 // indirect + github.com/mattn/go-isatty v0.0.17 // indirect github.com/sergi/go-diff v1.2.0 // indirect github.com/shirou/gopsutil v3.21.11+incompatible // indirect github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a // indirect @@ -31,4 +35,5 @@ require ( golang.org/x/mod v0.12.0 // indirect golang.org/x/sys v0.13.0 // indirect golang.org/x/tools v0.13.0 // indirect + gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1 // indirect ) diff --git a/simulators/ethereum/rpc-compat/go.sum b/simulators/ethereum/rpc-compat/go.sum index 31c1b552ee..153c3185c4 100644 --- a/simulators/ethereum/rpc-compat/go.sum +++ b/simulators/ethereum/rpc-compat/go.sum @@ -16,8 +16,8 @@ github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 h1:HbphB4TFFXpv7MNrT52FGrrgVXF1 github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0/go.mod h1:DZGJHZMqrU4JJqFAWUS2UO1+lbSKsdiOoYi9Zzey7Fc= github.com/ethereum/go-ethereum v1.13.5-0.20231031113925-bc42e88415d3 h1:i4TE0DmzMYcr2IiCdlTGGk+7Q/EzXvBKbbG4uRxMjJ0= github.com/ethereum/go-ethereum v1.13.5-0.20231031113925-bc42e88415d3/go.mod h1:yMTu38GSuyxaYzQMViqNmQ1s3cE84abZexQmTgenWk0= -github.com/ethereum/hive v0.0.0-20231031133732-dcd7ddb75960 h1:7H9z2o/KImWQ/1PACU3ewsSFNxT/lzwYRnwit2YFqMg= -github.com/ethereum/hive v0.0.0-20231031133732-dcd7ddb75960/go.mod h1:sV7LrFBlEii71kI9udVbUVj7SXIifZ2VzFjQ8S6rZns= +github.com/ethereum/hive v0.0.0-20240131232337-d38a51d4e475 h1:IlQwBa8MmXq/pfdDbzCwYYqf3PVEXIvI6xkf3ZB8p4E= +github.com/ethereum/hive v0.0.0-20240131232337-d38a51d4e475/go.mod h1:D0RJuJaAolOejqq/n0YoX7VbPzkooLHwCSoaQn2z6xY= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= @@ -27,6 +27,8 @@ github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiU github.com/go-stack/stack v1.8.1 h1:ntEHSVwIt7PNXNpgPmVfMrNhLtgjlmnZha2kOpuRiDw= github.com/go-stack/stack v1.8.1/go.mod h1:dcoOX6HbPZSZptuspn9bctJ+N/CnF5gGygcUP3XYfe4= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= +github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= +github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= @@ -54,8 +56,13 @@ github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1: github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/lithammer/dedent v1.1.0 h1:VNzHMVCBNG1j0fh3OrsFRkVUwStdDArbgBWoPAffktY= +github.com/lithammer/dedent v1.1.0/go.mod h1:jrXYCQtgg0nJiN+StA2KgR7w6CiQNv9Fd/Z9BP0jIOc= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng= +github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= @@ -136,6 +143,7 @@ golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= @@ -169,6 +177,7 @@ gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8 gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1 h1:iiHuQZCNgYPmFQxd3BBN/Nc5+dAwzZuq5y40s20oQw0= +gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/simulators/ethereum/rpc-compat/main.go b/simulators/ethereum/rpc-compat/main.go index 522ee2eda8..40af014395 100644 --- a/simulators/ethereum/rpc-compat/main.go +++ b/simulators/ethereum/rpc-compat/main.go @@ -39,6 +39,7 @@ func main() { panic(err) } + // Run the test suite. suite := hivesim.Suite{ Name: "rpc-compat", Description: ` @@ -53,6 +54,7 @@ conformance with the execution API specification.`[1:], Parameters: clientEnv, Files: files, Run: func(t *hivesim.T, c *hivesim.Client) { + sendForkchoiceUpdated(t, c) runAllTests(t, c, c.Type) }, AlwaysRun: true, @@ -156,6 +158,49 @@ func postHttp(c *http.Client, url string, d []byte) ([]byte, error) { return io.ReadAll(resp.Body) } +// loadTests walks the given directory looking for *.io files to load. +func loadTests(t *hivesim.T, root string, re *regexp.Regexp) []test { + tests := make([]test, 0) + filepath.Walk(root, func(path string, info os.FileInfo, err error) error { + if err != nil { + t.Logf("unable to walk path: %s", err) + return err + } + if info.IsDir() { + return nil + } + if fname := info.Name(); !strings.HasSuffix(fname, ".io") { + return nil + } + pathname := strings.TrimSuffix(strings.TrimPrefix(path, root), ".io") + if !re.MatchString(pathname) { + fmt.Println("skip", pathname) + return nil // skip + } + data, err := os.ReadFile(path) + if err != nil { + return err + } + tests = append(tests, test{strings.TrimLeft(pathname, "/"), data}) + return nil + }) + return tests +} + +func sendForkchoiceUpdated(t *hivesim.T, client *hivesim.Client) { + var request struct { + Method string + Params []any + } + if err := common.LoadJSON("tests/headfcu.json", &request); err != nil { + t.Fatal("error loading forkchoiceUpdated:", err) + } + err := client.EngineAPI().Call(nil, request.Method, request.Params...) + if err != nil { + t.Fatal("client rejected forkchoiceUpdated:", err) + } +} + // loggingRoundTrip writes requests and responses to the test log. type loggingRoundTrip struct { t *hivesim.T @@ -190,32 +235,3 @@ func (rt *loggingRoundTrip) RoundTrip(req *http.Request) (*http.Response, error) rt.t.Logf("<< %s", bytes.TrimSpace(respBytes)) return &respCopy, nil } - -// loadTests walks the given directory looking for *.io files to load. -func loadTests(t *hivesim.T, root string, re *regexp.Regexp) []test { - tests := make([]test, 0) - filepath.Walk(root, func(path string, info os.FileInfo, err error) error { - if err != nil { - t.Logf("unable to walk path: %s", err) - return err - } - if info.IsDir() { - return nil - } - if fname := info.Name(); !strings.HasSuffix(fname, ".io") { - return nil - } - pathname := strings.TrimSuffix(strings.TrimPrefix(path, root), ".io") - if !re.MatchString(pathname) { - fmt.Println("skip", pathname) - return nil // skip - } - data, err := os.ReadFile(path) - if err != nil { - return err - } - tests = append(tests, test{strings.TrimLeft(pathname, "/"), data}) - return nil - }) - return tests -} From a8fe1d5d971da22d7b98fa7c06e4d21dde530548 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Thu, 1 Feb 2024 01:05:29 +0100 Subject: [PATCH 163/387] simulators/ethereum/sync: use EngineAPI method of hivesim --- simulators/ethereum/sync/go.mod | 16 +++------------- simulators/ethereum/sync/go.sum | 22 +++++++--------------- simulators/ethereum/sync/sync.go | 19 ++----------------- 3 files changed, 12 insertions(+), 45 deletions(-) diff --git a/simulators/ethereum/sync/go.mod b/simulators/ethereum/sync/go.mod index b6657206ff..c0bd451159 100644 --- a/simulators/ethereum/sync/go.mod +++ b/simulators/ethereum/sync/go.mod @@ -4,7 +4,7 @@ go 1.20 require ( github.com/ethereum/go-ethereum v1.13.5-0.20231031113925-bc42e88415d3 - github.com/ethereum/hive v0.0.0-20231031133732-dcd7ddb75960 + github.com/ethereum/hive v0.0.0-20240131232337-d38a51d4e475 ) require ( @@ -22,12 +22,10 @@ require ( github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect github.com/consensys/bavard v0.1.13 // indirect github.com/consensys/gnark-crypto v0.12.1 // indirect - github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect github.com/crate-crypto/go-kzg-4844 v0.7.0 // indirect github.com/deckarep/golang-set/v2 v2.1.0 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 // indirect github.com/ethereum/c-kzg-4844 v0.4.0 // indirect - github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5 // indirect github.com/getsentry/sentry-go v0.18.0 // indirect github.com/go-ole/go-ole v1.2.6 // indirect github.com/go-stack/stack v1.8.1 // indirect @@ -37,19 +35,15 @@ require ( github.com/golang/protobuf v1.5.3 // indirect github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect github.com/gorilla/websocket v1.5.0 // indirect - github.com/hashicorp/go-bexpr v0.1.10 // indirect github.com/holiman/uint256 v1.2.3 // indirect - github.com/huin/goupnp v1.3.0 // indirect - github.com/jackpal/go-nat-pmp v1.0.2 // indirect github.com/klauspost/compress v1.15.15 // indirect github.com/kr/pretty v0.3.1 // indirect github.com/kr/text v0.2.0 // indirect + github.com/lithammer/dedent v1.1.0 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.17 // indirect github.com/mattn/go-runewidth v0.0.14 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect - github.com/mitchellh/mapstructure v1.4.1 // indirect - github.com/mitchellh/pointerstructure v1.2.0 // indirect github.com/mmcloughlin/addchain v0.4.0 // indirect github.com/olekukonko/tablewriter v0.0.5 // indirect github.com/pkg/errors v0.9.1 // indirect @@ -59,15 +53,11 @@ require ( github.com/prometheus/procfs v0.9.0 // indirect github.com/rivo/uniseg v0.4.3 // indirect github.com/rogpeppe/go-internal v1.9.0 // indirect - github.com/rs/cors v1.7.0 // indirect - github.com/russross/blackfriday/v2 v2.1.0 // indirect github.com/shirou/gopsutil v3.21.11+incompatible // indirect github.com/supranational/blst v0.3.11 // indirect github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a // indirect github.com/tklauser/go-sysconf v0.3.12 // indirect github.com/tklauser/numcpus v0.6.1 // indirect - github.com/urfave/cli/v2 v2.25.7 // indirect - github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 // indirect github.com/yusufpapurcu/wmi v1.2.2 // indirect golang.org/x/crypto v0.14.0 // indirect golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect @@ -77,6 +67,6 @@ require ( golang.org/x/text v0.13.0 // indirect golang.org/x/tools v0.13.0 // indirect google.golang.org/protobuf v1.28.1 // indirect - gopkg.in/natefinch/lumberjack.v2 v2.0.0 // indirect + gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1 // indirect rsc.io/tmplfunc v0.0.3 // indirect ) diff --git a/simulators/ethereum/sync/go.sum b/simulators/ethereum/sync/go.sum index 53ffa0f90d..aa33968c89 100644 --- a/simulators/ethereum/sync/go.sum +++ b/simulators/ethereum/sync/go.sum @@ -1,7 +1,6 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/toml v1.3.2 h1:o7IhLm0Msx3BaB+n3Ag7L8EVlByGnpq14C4YWiu/gL8= github.com/CloudyKit/fastprinter v0.0.0-20200109182630-33d98a066a53/go.mod h1:+3IMCy2vIlbG1XG/0ggNQv0SvxCAIpPM5b1nCz56Xno= github.com/CloudyKit/jet/v3 v3.0.0/go.mod h1:HKQPgSJmdK8hdoAbKUUWajkHyHo4RaU5rMdUywE7VMo= github.com/DataDog/zstd v1.5.2 h1:vUG4lAyuPCXO0TLbXvPv7EB7cNK1QV/luu55UHLrrn8= @@ -53,9 +52,9 @@ github.com/consensys/gnark-crypto v0.12.1/go.mod h1:v2Gy7L/4ZRosZ7Ivs+9SfUDr0f5U github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/cpuguy83/go-md2man v1.0.10 h1:BSKMNlYxDvnunlTymqtgONjNnaRV1sTpcovwwjF22jk= github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= -github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/crate-crypto/go-kzg-4844 v0.7.0 h1:C0vgZRk4q4EZ/JgPfzuSoxdCq3C3mOZMBShovmncxvA= github.com/crate-crypto/go-kzg-4844 v0.7.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= @@ -80,12 +79,11 @@ github.com/ethereum/c-kzg-4844 v0.4.0 h1:3MS1s4JtA868KpJxroZoepdV0ZKBp3u/O5HcZ7R github.com/ethereum/c-kzg-4844 v0.4.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= github.com/ethereum/go-ethereum v1.13.5-0.20231031113925-bc42e88415d3 h1:i4TE0DmzMYcr2IiCdlTGGk+7Q/EzXvBKbbG4uRxMjJ0= github.com/ethereum/go-ethereum v1.13.5-0.20231031113925-bc42e88415d3/go.mod h1:yMTu38GSuyxaYzQMViqNmQ1s3cE84abZexQmTgenWk0= -github.com/ethereum/hive v0.0.0-20231031133732-dcd7ddb75960 h1:7H9z2o/KImWQ/1PACU3ewsSFNxT/lzwYRnwit2YFqMg= -github.com/ethereum/hive v0.0.0-20231031133732-dcd7ddb75960/go.mod h1:sV7LrFBlEii71kI9udVbUVj7SXIifZ2VzFjQ8S6rZns= +github.com/ethereum/hive v0.0.0-20240131232337-d38a51d4e475 h1:IlQwBa8MmXq/pfdDbzCwYYqf3PVEXIvI6xkf3ZB8p4E= +github.com/ethereum/hive v0.0.0-20240131232337-d38a51d4e475/go.mod h1:D0RJuJaAolOejqq/n0YoX7VbPzkooLHwCSoaQn2z6xY= github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072/go.mod h1:duJ4Jxv5lDcvg4QuQr0oowTf7dz4/CR8NtyCooz9HL8= github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5 h1:FtmdgXiUlNeRsoNMFlKLDt+S+6hbjVMEW6RGQ7aUf7c= -github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= @@ -160,7 +158,6 @@ github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/ad github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/hashicorp/go-bexpr v0.1.10 h1:9kuI5PFotCboP3dkDYFr/wi0gg0QVbSNz5oFRpxn4uE= -github.com/hashicorp/go-bexpr v0.1.10/go.mod h1:oxlubA2vC/gFVfX1A6JGp7ls7uCDlfJn732ehYYg+g0= github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/holiman/billy v0.0.0-20230718173358-1c7e68d277a7 h1:3JQNjnMRil1yD0IfZKHF9GxxWKDJGj8I0IqOUol//sw= @@ -169,7 +166,6 @@ github.com/holiman/uint256 v1.2.3 h1:K8UWO1HUJpRMXBxbmaY1Y8IAMZC/RsKB+ArEnnK4l5o github.com/holiman/uint256 v1.2.3/go.mod h1:SC8Ryt4n+UBbPbIBKaG9zbbDlp4jOru9xFZmPzLUTxw= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/huin/goupnp v1.3.0 h1:UvLUlWDNpoUdYzb2TCn+MuTWtcjXKSza2n6CBdQ0xXc= -github.com/huin/goupnp v1.3.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8= github.com/hydrogen18/memlistener v0.0.0-20200120041712-dcc25e7acd91/go.mod h1:qEIFzExnS6016fRpRfxrExeVn2gbClQA99gQhnIcdhE= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/imkira/go-interpol v1.1.0/go.mod h1:z0h2/2T3XF8kyEPpRgJ3kmNv+C43p+I/CoI+jC3w2iA= @@ -180,7 +176,6 @@ github.com/iris-contrib/jade v1.1.3/go.mod h1:H/geBymxJhShH5kecoiOCSssPX7QWYH7Ua github.com/iris-contrib/pongo2 v0.0.1/go.mod h1:Ssh+00+3GAZqSQb30AvBRNxBx7rf0GqwkjqxNd0u65g= github.com/iris-contrib/schema v0.0.1/go.mod h1:urYA3uvUNG1TIIjOSCzHr9/LmbQo8LrOcOqfqxa4hXw= github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= -github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= @@ -209,6 +204,8 @@ github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0 github.com/labstack/echo/v4 v4.5.0/go.mod h1:czIriw4a0C1dFun+ObrXp7ok03xON0N1awStJ6ArI7Y= github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c= +github.com/lithammer/dedent v1.1.0 h1:VNzHMVCBNG1j0fh3OrsFRkVUwStdDArbgBWoPAffktY= +github.com/lithammer/dedent v1.1.0/go.mod h1:jrXYCQtgg0nJiN+StA2KgR7w6CiQNv9Fd/Z9BP0jIOc= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= @@ -234,9 +231,7 @@ github.com/microcosm-cc/bluemonday v1.0.2/go.mod h1:iVP4YcDBq+n/5fb23BhYFvIMq/le github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.4.1 h1:CpVNEelQCZBooIPDn+AR3NpivK/TIKU8bDxdASFVQag= -github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/pointerstructure v1.2.0 h1:O+i9nHnXS3l/9Wu7r4NrEdwA2VFTicjUEN1uBnDo34A= -github.com/mitchellh/pointerstructure v1.2.0/go.mod h1:BRAsLI5zgXmw97Lf6s25bs8ohIXc3tViBH44KcwB2g4= github.com/mmcloughlin/addchain v0.4.0 h1:SobOdjm2xLj1KkXN5/n0xTIWyZA2+s99UCY1iPfkHRY= github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqkyU72HC5wJ4RlU= github.com/mmcloughlin/profile v0.1.1/go.mod h1:IhHD7q1ooxgwTgjxQYkACGA77oFTDdFVejUS1/tS/qU= @@ -292,10 +287,9 @@ github.com/rogpeppe/go-internal v1.8.1/go.mod h1:JeRgkft04UBgHMgCIwADu4Pn6Mtm5d4 github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/rs/cors v1.7.0 h1:+88SsELBHx5r+hZ8TCkggzSstaWNbDvThkVK8H6f9ik= -github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= +github.com/russross/blackfriday v1.5.2 h1:HyvC0ARfnZBqnXwABFeSZHpKvJHJJfPz81GNueLj0oo= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= -github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/schollz/closestmatch v2.1.0+incompatible/go.mod h1:RtP1ddjLong6gTkbtmuhtR2uUrrJOpYzYRvbcPAid+g= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= @@ -333,7 +327,6 @@ github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVM github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= github.com/urfave/cli/v2 v2.25.7 h1:VAzn5oq403l5pHjc4OhD54+XGO9cdKVL/7lDjF+iKUs= -github.com/urfave/cli/v2 v2.25.7/go.mod h1:8qnjx1vcq5s2/wpsqoZFndg2CE5tNFyrTvS6SinrnYQ= github.com/urfave/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/valyala/fasthttp v1.6.0/go.mod h1:FstJa9V+Pj9vQ7OJie2qMHdwemEDaDiSdBnvPM1Su9w= @@ -345,7 +338,6 @@ github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1: github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU= -github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8= github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0/go.mod h1:/LWChgwKmvncFJFHJ7Gvn9wZArjbV5/FppcK2fKk/tI= github.com/yudai/gojsondiff v1.0.0/go.mod h1:AY32+k2cwILAkW1fbgxQ5mUmMiZFgLIV+FBNExI05xg= github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82/go.mod h1:lgjkn3NuSvDfVJdfcVVdX+jpBxNmX4rDAzaS45IcYoM= @@ -516,10 +508,10 @@ gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMy gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= gopkg.in/go-playground/validator.v8 v8.18.2/go.mod h1:RX2a/7Ha8BgOhfk7j780h4/u/RRjR0eouCJSH80/M2Y= gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1 h1:iiHuQZCNgYPmFQxd3BBN/Nc5+dAwzZuq5y40s20oQw0= +gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= gopkg.in/ini.v1 v1.51.1/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8= -gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/simulators/ethereum/sync/sync.go b/simulators/ethereum/sync/sync.go index adc34cc4e7..823cbea583 100644 --- a/simulators/ethereum/sync/sync.go +++ b/simulators/ethereum/sync/sync.go @@ -10,8 +10,6 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/ethclient" - gnode "github.com/ethereum/go-ethereum/node" - "github.com/ethereum/go-ethereum/rpc" "github.com/ethereum/hive/hivesim" ) @@ -151,12 +149,10 @@ func (n *node) triggerSync(t *hivesim.T) error { if err := common.LoadJSON("chain/headnewpayload.json", &newpayload); err != nil { return err } - c := n.engineClient() - // deliver newPayload t.Logf("%s: %s", newpayload.Method, jsonString(newpayload.Params)) var resp engine.PayloadStatusV1 - if err := c.Call(&resp, newpayload.Method, conv2any(newpayload.Params)...); err != nil { + if err := n.EngineAPI().Call(&resp, newpayload.Method, conv2any(newpayload.Params)...); err != nil { return err } t.Logf("response: %+v", jsonString(resp)) @@ -169,26 +165,15 @@ func (n *node) sendForkchoiceUpdated(t *hivesim.T) error { if err := common.LoadJSON("chain/headfcu.json", &fcu); err != nil { return err } - c := n.engineClient() - t.Logf("%s: %s", fcu.Method, jsonString(fcu.Params)) var fcuresp engine.ForkChoiceResponse - if err := c.Call(&fcuresp, fcu.Method, conv2any(fcu.Params)...); err != nil { + if err := n.EngineAPI().Call(&fcuresp, fcu.Method, conv2any(fcu.Params)...); err != nil { return err } t.Logf("response: %s", jsonString(&fcuresp)) return nil } -func (n *node) engineClient() *rpc.Client { - // engine client setup - token := [32]byte{0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x65} - engineURL := fmt.Sprintf("http://%v:8551/", n.IP) - ctx := context.Background() - c, _ := rpc.DialOptions(ctx, engineURL, rpc.WithHTTPAuth(gnode.NewJWTAuth(token))) - return c -} - // checkHead checks whether the remote chain head matches the given values. func (n *node) checkHead() error { var expected types.Header From ca8e16667ea07e75ac975dbc9381f95b01035330 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Thu, 1 Feb 2024 14:24:35 +0100 Subject: [PATCH 164/387] simulators/ethereum/rpc-compat: handle test comments and avoid error message comparison (#984) --- simulators/ethereum/rpc-compat/go.mod | 4 + simulators/ethereum/rpc-compat/go.sum | 10 ++ simulators/ethereum/rpc-compat/main.go | 163 ++++++------------ simulators/ethereum/rpc-compat/testload.go | 102 +++++++++++ .../ethereum/rpc-compat/testload_test.go | 48 ++++++ 5 files changed, 216 insertions(+), 111 deletions(-) create mode 100644 simulators/ethereum/rpc-compat/testload.go create mode 100644 simulators/ethereum/rpc-compat/testload_test.go diff --git a/simulators/ethereum/rpc-compat/go.mod b/simulators/ethereum/rpc-compat/go.mod index 59b4bd260f..ecfe1d5a79 100644 --- a/simulators/ethereum/rpc-compat/go.mod +++ b/simulators/ethereum/rpc-compat/go.mod @@ -25,6 +25,10 @@ require ( github.com/sergi/go-diff v1.2.0 // indirect github.com/shirou/gopsutil v3.21.11+incompatible // indirect github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a // indirect + github.com/tidwall/gjson v1.17.0 // indirect + github.com/tidwall/match v1.1.1 // indirect + github.com/tidwall/pretty v1.2.0 // indirect + github.com/tidwall/sjson v1.2.5 // indirect github.com/tklauser/go-sysconf v0.3.12 // indirect github.com/tklauser/numcpus v0.6.1 // indirect github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82 // indirect diff --git a/simulators/ethereum/rpc-compat/go.sum b/simulators/ethereum/rpc-compat/go.sum index 153c3185c4..cd8f144914 100644 --- a/simulators/ethereum/rpc-compat/go.sum +++ b/simulators/ethereum/rpc-compat/go.sum @@ -90,6 +90,16 @@ github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1F github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a h1:1ur3QoCqvE5fl+nylMaIr9PVV1w343YRDtsy+Rwu7XI= github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a/go.mod h1:RRCYJbIwD5jmqPI9XoAFR0OcDxqUctll6zUj/+B4S48= +github.com/tidwall/gjson v1.14.2 h1:6BBkirS0rAHjumnjHF6qgy5d2YAJ1TLIaFE2lzfOLqo= +github.com/tidwall/gjson v1.14.2/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= +github.com/tidwall/gjson v1.17.0 h1:/Jocvlh98kcTfpN2+JzGQWQcqrPQwDrVEMApx/M5ZwM= +github.com/tidwall/gjson v1.17.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= +github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= +github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= +github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs= +github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= +github.com/tidwall/sjson v1.2.5 h1:kLy8mja+1c9jlljvWTlSazM7cKDRfJuR/bOJhcY5NcY= +github.com/tidwall/sjson v1.2.5/go.mod h1:Fvgq9kS/6ociJEDnK0Fk1cpYF4FIW6ZF7LAe+6jwd28= github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= diff --git a/simulators/ethereum/rpc-compat/main.go b/simulators/ethereum/rpc-compat/main.go index 40af014395..6a2d997980 100644 --- a/simulators/ethereum/rpc-compat/main.go +++ b/simulators/ethereum/rpc-compat/main.go @@ -7,14 +7,14 @@ import ( "io" "net" "net/http" - "os" - "path/filepath" "regexp" "strings" "time" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/hive/hivesim" + "github.com/tidwall/gjson" + "github.com/tidwall/sjson" diff "github.com/yudai/gojsondiff" "github.com/yudai/gojsondiff/formatter" ) @@ -26,11 +26,6 @@ var ( } ) -type test struct { - Name string - Data []byte -} - func main() { // Load fork environment. var clientEnv hivesim.Params @@ -66,13 +61,14 @@ conformance with the execution API specification.`[1:], func runAllTests(t *hivesim.T, c *hivesim.Client, clientName string) { _, testPattern := t.Sim.TestPattern() re := regexp.MustCompile(testPattern) - tests := loadTests(t, "tests", re) for _, test := range tests { + test := test t.Run(hivesim.TestSpec{ - Name: fmt.Sprintf("%s (%s)", test.Name, clientName), + Name: fmt.Sprintf("%s (%s)", test.name, clientName), + Description: test.comment, Run: func(t *hivesim.T) { - if err := runTest(t, c, test.Data); err != nil { + if err := runTest(t, c, &test); err != nil { t.Fatal(err) } }, @@ -80,49 +76,56 @@ func runAllTests(t *hivesim.T, c *hivesim.Client, clientName string) { } } -func runTest(t *hivesim.T, c *hivesim.Client, data []byte) error { +func runTest(t *hivesim.T, c *hivesim.Client, test *rpcTest) error { var ( - client = &http.Client{ - Timeout: 5 * time.Second, - Transport: &loggingRoundTrip{ - t: t, - inner: http.DefaultTransport, - }, - } - url = fmt.Sprintf("http://%s", net.JoinHostPort(c.IP.String(), "8545")) - err error - resp []byte + client = &http.Client{Timeout: 5 * time.Second} + url = fmt.Sprintf("http://%s", net.JoinHostPort(c.IP.String(), "8545")) + err error + respBytes []byte ) - for _, line := range strings.Split(string(data), "\n") { - line = strings.TrimSpace(line) - switch { - case len(line) == 0 || strings.HasPrefix(line, "//"): - // Skip comments, blank lines. - continue - case strings.HasPrefix(line, ">> "): + for _, msg := range test.messages { + if msg.send { // Send request. - resp, err = postHttp(client, url, []byte(line[3:])) + t.Log(">> ", msg.data) + respBytes, err = postHttp(client, url, strings.NewReader(msg.data)) if err != nil { return err } - case strings.HasPrefix(line, "<< "): - // Read response. Unmarshal to interface{} to verify deep equality. Marshal - // again to remove padding differences and to print each field in the same - // order. This makes it easy to spot any discrepancies. - if resp == nil { + } else { + // Receive a response. + if respBytes == nil { return fmt.Errorf("invalid test, response before request") } - want := []byte(strings.TrimSpace(line)[3:]) // trim leading "<< " - // Now compare. - d, err := diff.New().Compare(resp, want) + expectedData := msg.data + resp := string(bytes.TrimSpace(respBytes)) + t.Log("<< ", resp) + if !gjson.Valid(resp) { + return fmt.Errorf("invalid JSON response") + } + + // Patch JSON to remove error messages. We only do this in the specific case + // where an error is expected AND returned by the client. + var errorRedacted bool + if gjson.Get(resp, "error").Exists() && gjson.Get(expectedData, "error").Exists() { + resp, _ = sjson.Delete(resp, "error.message") + expectedData, _ = sjson.Delete(expectedData, "error.message") + errorRedacted = true + } + + // Compare responses. + d, err := diff.New().Compare([]byte(resp), []byte(expectedData)) if err != nil { return fmt.Errorf("failed to unmarshal value: %s\n", err) } + // If there is a discrepancy, return error. if d.Modified() { - var got map[string]interface{} - json.Unmarshal(resp, &got) + if errorRedacted { + t.Log("note: error messages removed from comparison") + } + var got map[string]any + json.Unmarshal([]byte(resp), &got) config := formatter.AsciiFormatterConfig{ ShowArrayIndex: true, Coloring: false, @@ -131,12 +134,11 @@ func runTest(t *hivesim.T, c *hivesim.Client, data []byte) error { diffString, _ := formatter.Format(d) return fmt.Errorf("response differs from expected (-- client, ++ test):\n%s", diffString) } - resp = nil - default: - t.Fatalf("invalid line in test script: %s", line) + respBytes = nil } } - if resp != nil { + + if respBytes != nil { t.Fatalf("unhandled response in test case") } return nil @@ -144,9 +146,8 @@ func runTest(t *hivesim.T, c *hivesim.Client, data []byte) error { // sendHttp sends an HTTP POST with the provided json data and reads the // response into a byte slice and returns it. -func postHttp(c *http.Client, url string, d []byte) ([]byte, error) { - data := bytes.NewBuffer(d) - req, err := http.NewRequest("POST", url, data) +func postHttp(c *http.Client, url string, d io.Reader) ([]byte, error) { + req, err := http.NewRequest("POST", url, d) if err != nil { return nil, fmt.Errorf("error building request: %v", err) } @@ -158,35 +159,7 @@ func postHttp(c *http.Client, url string, d []byte) ([]byte, error) { return io.ReadAll(resp.Body) } -// loadTests walks the given directory looking for *.io files to load. -func loadTests(t *hivesim.T, root string, re *regexp.Regexp) []test { - tests := make([]test, 0) - filepath.Walk(root, func(path string, info os.FileInfo, err error) error { - if err != nil { - t.Logf("unable to walk path: %s", err) - return err - } - if info.IsDir() { - return nil - } - if fname := info.Name(); !strings.HasSuffix(fname, ".io") { - return nil - } - pathname := strings.TrimSuffix(strings.TrimPrefix(path, root), ".io") - if !re.MatchString(pathname) { - fmt.Println("skip", pathname) - return nil // skip - } - data, err := os.ReadFile(path) - if err != nil { - return err - } - tests = append(tests, test{strings.TrimLeft(pathname, "/"), data}) - return nil - }) - return tests -} - +// sendForkchoiceUpdated delivers the initial FcU request to the client. func sendForkchoiceUpdated(t *hivesim.T, client *hivesim.Client) { var request struct { Method string @@ -195,43 +168,11 @@ func sendForkchoiceUpdated(t *hivesim.T, client *hivesim.Client) { if err := common.LoadJSON("tests/headfcu.json", &request); err != nil { t.Fatal("error loading forkchoiceUpdated:", err) } - err := client.EngineAPI().Call(nil, request.Method, request.Params...) + t.Logf("sending %s: %v", request.Method, request.Params) + var resp any + err := client.EngineAPI().Call(&resp, request.Method, request.Params...) if err != nil { t.Fatal("client rejected forkchoiceUpdated:", err) } -} - -// loggingRoundTrip writes requests and responses to the test log. -type loggingRoundTrip struct { - t *hivesim.T - inner http.RoundTripper -} - -func (rt *loggingRoundTrip) RoundTrip(req *http.Request) (*http.Response, error) { - // Read and log the request body. - reqBytes, err := io.ReadAll(req.Body) - req.Body.Close() - if err != nil { - return nil, err - } - rt.t.Logf(">> %s", bytes.TrimSpace(reqBytes)) - reqCopy := *req - reqCopy.Body = io.NopCloser(bytes.NewReader(reqBytes)) - - // Do the round trip. - resp, err := rt.inner.RoundTrip(&reqCopy) - if err != nil { - return nil, err - } - defer resp.Body.Close() - - // Read and log the response bytes. - respBytes, err := io.ReadAll(resp.Body) - if err != nil { - return nil, err - } - respCopy := *resp - respCopy.Body = io.NopCloser(bytes.NewReader(respBytes)) - rt.t.Logf("<< %s", bytes.TrimSpace(respBytes)) - return &respCopy, nil + t.Logf("response: %v", resp) } diff --git a/simulators/ethereum/rpc-compat/testload.go b/simulators/ethereum/rpc-compat/testload.go new file mode 100644 index 0000000000..57cd620a0c --- /dev/null +++ b/simulators/ethereum/rpc-compat/testload.go @@ -0,0 +1,102 @@ +package main + +import ( + "bufio" + "fmt" + "io" + "os" + "path/filepath" + "regexp" + "strings" + + "github.com/ethereum/hive/hivesim" + "github.com/tidwall/gjson" +) + +type rpcTest struct { + name string + comment string + speconly bool + messages []rpcTestMessage +} + +type rpcTestMessage struct { + data string + // if true, the message is a send (>>), otherwise it's a receive (<<) + send bool +} + +func loadTestFile(name string, r io.Reader) (rpcTest, error) { + var ( + rdr = bufio.NewReader(r) + scan = bufio.NewScanner(rdr) + inHeader = true + test = rpcTest{name: name} + ) + for scan.Scan() { + line := strings.TrimSpace(scan.Text()) + switch { + case len(line) == 0: + continue + + case strings.HasPrefix(line, "//"): + if !inHeader { + continue // ignore comments after requests + } + text := strings.TrimPrefix(strings.TrimPrefix(line, "//"), " ") + test.comment += text + "\n" + if strings.HasPrefix(text, "speconly:") { + test.speconly = true + } + + case strings.HasPrefix(line, ">>") || strings.HasPrefix(line, "<<"): + inHeader = false + data := strings.TrimSpace(line[2:]) + if !gjson.Valid(data) { + return test, fmt.Errorf("invalid JSON in line %q", line) + } + test.messages = append(test.messages, rpcTestMessage{ + data: data, + send: strings.HasPrefix(line, ">>"), + }) + + default: + return test, fmt.Errorf("invalid test line: %q", line) + } + } + return test, scan.Err() +} + +// loadTests walks the given directory looking for *.io files to load. +func loadTests(t *hivesim.T, root string, re *regexp.Regexp) []rpcTest { + var tests []rpcTest + filepath.Walk(root, func(path string, info os.FileInfo, err error) error { + if err != nil { + t.Logf("unable to walk path: %s", err) + return err + } + if info.IsDir() { + return nil + } + if fname := info.Name(); !strings.HasSuffix(fname, ".io") { + return nil + } + pathname := strings.TrimSuffix(strings.TrimPrefix(path, root+"/"), ".io") + if !re.MatchString(pathname) { + fmt.Println("skip", pathname) + return nil // skip + } + fd, err := os.Open(path) + if err != nil { + return err + } + defer fd.Close() + test, err := loadTestFile(pathname, fd) + if err != nil { + return fmt.Errorf("invalid test %s: %v", info.Name(), err) + } + tests = append(tests, test) + return nil + }) + return tests +} diff --git a/simulators/ethereum/rpc-compat/testload_test.go b/simulators/ethereum/rpc-compat/testload_test.go new file mode 100644 index 0000000000..9148d24c02 --- /dev/null +++ b/simulators/ethereum/rpc-compat/testload_test.go @@ -0,0 +1,48 @@ +package main + +import ( + "reflect" + "strings" + "testing" +) + +func TestLoad(t *testing.T) { + data := `// this is a test comment +// this is the second line +// speconly: lalalala +>> {"type":"send"} +<< {"type":"recv"} +` + + expectedComment := `this is a test comment +this is the second line +speconly: lalalala +` + expectedMessages := []rpcTestMessage{ + { + data: `{"type":"send"}`, + send: true, + }, + { + data: `{"type":"recv"}`, + send: false, + }, + } + + result, err := loadTestFile("the-test", strings.NewReader(data)) + if err != nil { + t.Fatal("error:", err) + } + if result.name != "the-test" { + t.Error("wrong test name:", result.comment) + } + if result.comment != expectedComment { + t.Errorf("wrong test comment %q", result.comment) + } + if !result.speconly { + t.Error("test is not marked speconly") + } + if !reflect.DeepEqual(result.messages, expectedMessages) { + t.Errorf("wrong test messages %+v", result.messages) + } +} From df7a0503bc346d809e20245a404539e053cd4ec9 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Thu, 1 Feb 2024 14:28:17 +0100 Subject: [PATCH 165/387] clients/besu: remove --engine-jwt-enabled --- clients/besu/besu.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clients/besu/besu.sh b/clients/besu/besu.sh index 428b93d3d1..54a6c7329e 100644 --- a/clients/besu/besu.sh +++ b/clients/besu/besu.sh @@ -156,7 +156,7 @@ RPCFLAGS="$RPCFLAGS --rpc-ws-enabled --rpc-ws-api=DEBUG,ETH,NET,WEB3,ADMIN --rpc # Enable merge support if needed if [ "$HIVE_TERMINAL_TOTAL_DIFFICULTY" != "" ]; then echo "0x7365637265747365637265747365637265747365637265747365637265747365" > /jwtsecret - RPCFLAGS="$RPCFLAGS --engine-host-allowlist=* --engine-jwt-enabled --engine-jwt-secret /jwtsecret" + RPCFLAGS="$RPCFLAGS --engine-host-allowlist=* --engine-jwt-secret /jwtsecret" fi # Start Besu. From fcfdd508fa14f8fc6e7d124809e3dac8aeda0e29 Mon Sep 17 00:00:00 2001 From: Dan Cline <6798349+Rjected@users.noreply.github.com> Date: Sun, 4 Feb 2024 15:13:45 -0500 Subject: [PATCH 166/387] clients/reth: fix merge netsplit block in mapper (#986) --- clients/reth/mapper.jq | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clients/reth/mapper.jq b/clients/reth/mapper.jq index 1556c95356..d21b3355c8 100644 --- a/clients/reth/mapper.jq +++ b/clients/reth/mapper.jq @@ -52,7 +52,7 @@ def to_bool: "londonBlock": env.HIVE_FORK_LONDON|to_int, "arrowGlacierBlock": env.HIVE_FORK_ARROW_GLACIER|to_int, "grayGlacierBlock": env.HIVE_FORK_GRAY_GLACIER|to_int, - "parisBlock": env.HIVE_MERGE_BLOCK_ID|to_int, + "mergeNetsplitBlock": env.HIVE_MERGE_BLOCK_ID|to_int, "terminalTotalDifficulty": env.HIVE_TERMINAL_TOTAL_DIFFICULTY|to_int, "terminalTotalDifficultyPassed": env.HIVE_TERMINAL_TOTAL_DIFFICULTY_PASSED|to_bool, "shanghaiTime": env.HIVE_SHANGHAI_TIMESTAMP|to_int, From 58354ff806f32401f4e6de3d57412bd599671006 Mon Sep 17 00:00:00 2001 From: spencer Date: Mon, 5 Feb 2024 19:01:31 +0700 Subject: [PATCH 167/387] simulators/ethereum/pyspec: Use latest EEST fixture release. (#985) * simulators/ethereum/pyspec: Update dockerfile tests release structure. * simulators/ethereum/pyspec: Tweak to adhere to fixture format change. --- simulators/ethereum/pyspec/Dockerfile | 6 +++--- simulators/ethereum/pyspec/runner.go | 2 +- simulators/ethereum/pyspec/types.go | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/simulators/ethereum/pyspec/Dockerfile b/simulators/ethereum/pyspec/Dockerfile index 2c5c5cedb1..f407236d8c 100644 --- a/simulators/ethereum/pyspec/Dockerfile +++ b/simulators/ethereum/pyspec/Dockerfile @@ -21,9 +21,9 @@ COPY --from=builder /source/pyspec/pyspec . # To run locally generated fixtures, comment the following RUN lines and # uncomment the ADD line. # Download the latest fixture release. -RUN wget https://github.com/ethereum/execution-spec-tests/releases/latest/download/fixtures_develop_hive.tar.gz -RUN tar -xzvf fixtures_develop_hive.tar.gz -RUN mv fixtures /fixtures +RUN wget https://github.com/ethereum/execution-spec-tests/releases/latest/download/fixtures_develop.tar.gz +RUN tar -xzvf fixtures_develop.tar.gz +RUN mv fixtures/blockchain_tests_hive /fixtures # ADD ./pyspec/fixtures /fixtures diff --git a/simulators/ethereum/pyspec/runner.go b/simulators/ethereum/pyspec/runner.go index 275ff1312b..6781b968ca 100644 --- a/simulators/ethereum/pyspec/runner.go +++ b/simulators/ethereum/pyspec/runner.go @@ -138,7 +138,7 @@ func (tc *testcase) run(t *hivesim.T) { } // set expected payload return status expectedStatus := "VALID" - if !engineNewPayload.Valid { + if engineNewPayload.ValidationError != nil { expectedStatus = "INVALID" } // check payload status matches expected diff --git a/simulators/ethereum/pyspec/types.go b/simulators/ethereum/pyspec/types.go index 63486948ea..7300df297d 100644 --- a/simulators/ethereum/pyspec/types.go +++ b/simulators/ethereum/pyspec/types.go @@ -78,7 +78,7 @@ type engineNewPayload struct { BlobVersionedHashes []common.Hash `json:"expectedBlobVersionedHashes"` ParentBeaconBlockRoot *common.Hash `json:"parentBeaconBlockRoot"` Version math.HexOrDecimal64 `json:"version"` - Valid bool `json:"valid"` + ValidationError *string `json:"validationError"` ErrorCode int64 `json:"errorCode,string"` HiveExecutionPayload *typ.ExecutableData From c7eaf3fb276d0586dabfee10c887c03936f75f3d Mon Sep 17 00:00:00 2001 From: Kolby Moroz Liebl <31669092+KolbyML@users.noreply.github.com> Date: Mon, 5 Feb 2024 14:27:17 -0700 Subject: [PATCH 168/387] simulators/portal/history/rpc-compat: add portal network history rpc-compat simulator (#978) --- .circleci/rust-simulators.sh | 0 .gitignore | 4 + .../portal/history/rpc-compat/Cargo.toml | 14 + .../portal/history/rpc-compat/Dockerfile | 24 + .../portal/history/rpc-compat/src/main.rs | 630 ++++++++++++++++++ 5 files changed, 672 insertions(+) mode change 100644 => 100755 .circleci/rust-simulators.sh create mode 100755 simulators/portal/history/rpc-compat/Cargo.toml create mode 100644 simulators/portal/history/rpc-compat/Dockerfile create mode 100644 simulators/portal/history/rpc-compat/src/main.rs diff --git a/.circleci/rust-simulators.sh b/.circleci/rust-simulators.sh old mode 100644 new mode 100755 diff --git a/.gitignore b/.gitignore index 71fa6671ee..eead5cce5d 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,7 @@ workspace .idea/ # build output /hive + +# build output for rust simulators files +simulators/**/Cargo.lock +simulators/**/target diff --git a/simulators/portal/history/rpc-compat/Cargo.toml b/simulators/portal/history/rpc-compat/Cargo.toml new file mode 100755 index 0000000000..693f587d49 --- /dev/null +++ b/simulators/portal/history/rpc-compat/Cargo.toml @@ -0,0 +1,14 @@ +[package] +name = "rpc-compat" +version = "0.1.0" +authors = ["Ognyan Genev ", "Kolby ML (Moroz Liebl) "] +edition = "2021" + +[dependencies] +ethportal-api = { git = "https://github.com/ethereum/trin", rev = "2a32224e3c2b0b80bc37c1b692c33016371f197a" } +hivesim = { git = "https://github.com/ethereum/portal-hive", rev = "8ff1e3d3c941dd00d56dacd777a5dfb71edf402f" } +futures = "0.3.25" +serde_json = "1.0.87" +tracing = "0.1.37" +tracing-subscriber = "0.3.16" +tokio = { version = "1", features = ["full"] } diff --git a/simulators/portal/history/rpc-compat/Dockerfile b/simulators/portal/history/rpc-compat/Dockerfile new file mode 100644 index 0000000000..353587e58b --- /dev/null +++ b/simulators/portal/history/rpc-compat/Dockerfile @@ -0,0 +1,24 @@ +FROM rust:1.71.1 AS builder + +# create a new empty shell project +RUN USER=root cargo new --bin rpc-compat +WORKDIR /rpc-compat + +# copy over manifests and source to build image +COPY Cargo.toml ./Cargo.toml +COPY src ./src + +# build for release +RUN cargo build --release + +# final base +FROM ubuntu:22.04 + +RUN apt update && apt install wget -y + +# copy build artifacts from build stage +COPY --from=builder /rpc-compat/target/release/rpc-compat . + +ENV RUST_LOG=debug + +ENTRYPOINT ["./rpc-compat"] diff --git a/simulators/portal/history/rpc-compat/src/main.rs b/simulators/portal/history/rpc-compat/src/main.rs new file mode 100644 index 0000000000..1e85314fcc --- /dev/null +++ b/simulators/portal/history/rpc-compat/src/main.rs @@ -0,0 +1,630 @@ +use ethportal_api::types::enr::generate_random_remote_enr; +use ethportal_api::types::portal::ContentInfo; +use ethportal_api::Discv5ApiClient; +use ethportal_api::PossibleHistoryContentValue::{ContentAbsent, ContentPresent}; +use ethportal_api::{HistoryContentKey, HistoryNetworkApiClient}; +use hivesim::{dyn_async, Client, NClientTestSpec, Simulation, Suite, Test, TestSpec}; +use serde_json::json; + +// Header with proof for block number 14764013 +const CONTENT_KEY: &str = "0x00720704f3aa11c53cf344ea069db95cecb81ad7453c8f276b2a1062979611f09c"; +const CONTENT_VALUE: &str = "0x080000002d020000f90222a02c58e3212c085178dbb1277e2f3c24b3f451267a75a234945c1581af639f4a7aa058a694212e0416353a4d3865ccf475496b55af3a3d3b002057000741af9731919400192fb10df37c9fb26829eb2cc623cd1bf599e8a067a9fb631f4579f9015ef3c6f1f3830dfa2dc08afe156f750e90022134b9ebf6a018a2978fc62cd1a23e90de920af68c0c3af3330327927cda4c005faccefb5ce7a0168a3827607627e781941dc777737fc4b6beb69a8b139240b881992b35b854eab9010000200000400000001000400080080000000000010004010001000008000000002000110000000000000090020001110402008000080208040010000000a8000000000000000000210822000900205020000000000160020020000400800040000000000042080000000400004008084020001000001004004000001000000000000001000000110000040000010200844040048101000008002000404810082002800000108020000200408008000100000000000000002020000b00010080600902000200000050000400000000000000400000002002101000000a00002000003420000800400000020100002000000000000000c00040000001000000100187327bd7ad3116ce83e147ed8401c9c36483140db184627d9afa9a457468657265756d50504c4e532f326d696e6572735f55534133a0f1a32e24eb62f01ec3f2b3b5893f7be9062fbf5482bc0d490a54352240350e26882087fbb243327696851aae1651b6010cc53ffa2df1bae1550a0000000000000000000000000000000000000000000063d45d0a2242d35484f289108b3c80cccf943005db0db6c67ffea4c4a47fd529f64d74fa6068a3fd89a2c0d9938c3a751c4706d0b0e8f99dec6b517cf12809cb413795c8c678b3171303ddce2fa1a91af6a0961b9db72750d4d5ea7d5103d8d25f23f522d9af4c13fe8ac7a7d9d64bb08d980281eea5298b93cb1085fedc19d4c60afdd52d116cfad030cf4223e50afa8031154a2263c76eb08b96b5b8fdf5e5c30825d5c918eefb89daaf0e8573f20643614d9843a1817b6186074e4e53b22cf49046d977c901ec00aef1555fa89468adc2a51a081f186c995153d1cba0f2887d585212d68be4b958d309fbe611abe98a9bfc3f4b7a7b72bb881b888d89a04ecfe08b1c1a48554a48328646e4f864fe722f12d850f0be29e3829d1f94b34083032a9b6f43abd559785c996229f8e022d4cd6dcde4aafcce6445fe8743e1fcbe8672a99f9d9e3a5ca10c01f3751d69fbd22197f0680bc1529151130b22759bf185f4dbce357f46eb9cc8e21ea78f49b298eea2756d761fe23de8bea0d2e15aed136d689f6d252c54ebadc3e46b84a397b681edf7ec63522b9a298301084d019d0020000000000000000000000000000000000000000000000000000000000000"; + +#[tokio::main] +async fn main() { + tracing_subscriber::fmt::init(); + let mut suite = Suite { + name: "history-rpc-compat".to_string(), + description: "The RPC-compatibility test suite runs a set of RPC related tests against a + running node. It tests client implementations of the JSON-RPC API for + conformance with the portal network API specification." + .to_string(), + tests: vec![], + }; + + suite.add(TestSpec { + name: "client launch".to_string(), + description: "This test launches the client and collects its logs.".to_string(), + always_run: false, + run: run_all_client_tests, + client: None, + }); + + let sim = Simulation::new(); + run_suite(sim, suite).await; +} + +async fn run_suite(host: Simulation, suite: Suite) { + let name = suite.clone().name; + let description = suite.clone().description; + + let suite_id = host.start_suite(name, description, "".to_string()).await; + + for test in &suite.tests { + test.run_test(host.clone(), suite_id, suite.clone()).await; + } + + host.end_suite(suite_id).await; +} + +dyn_async! { + async fn run_all_client_tests<'a> (test: &'a mut Test, _client: Option) { + // Get all available portal clients + let clients = test.sim.client_types().await; + + // Test single type of client + for client in &clients { + test.run( + NClientTestSpec { + name: "discv5_nodeInfo".to_string(), + description: "".to_string(), + always_run: false, + run: test_node_info, + environments: None, + test_data: None, + clients: vec![client.clone()], + } + ).await; + + test.run( + NClientTestSpec { + name: "portal_historyLocalContent Expect ContentAbsent".to_string(), + description: "".to_string(), + always_run: false, + run: test_local_content_expect_content_absent, + environments: None, + test_data: None, + clients: vec![client.clone()], + } + ).await; + + test.run( + NClientTestSpec { + name: "portal_historyStore".to_string(), + description: "".to_string(), + always_run: false, + run: test_store, + environments: None, + test_data: None, + clients: vec![client.clone()], + } + ).await; + + test.run( + NClientTestSpec { + name: "portal_historyLocalContent Expect ContentPresent".to_string(), + description: "".to_string(), + always_run: false, + run: test_local_content_expect_content_present, + environments: None, + test_data: None, + clients: vec![client.clone()], + } + ).await; + + test.run( + NClientTestSpec { + name: "portal_historyAddEnr Expect true".to_string(), + description: "".to_string(), + always_run: false, + run: test_add_enr_expect_true, + environments: None, + test_data: None, + clients: vec![client.clone()], + } + ).await; + + test.run( + NClientTestSpec { + name: "portal_historyGetEnr None Found".to_string(), + description: "".to_string(), + always_run: false, + run: test_get_enr_non_present, + environments: None, + test_data: None, + clients: vec![client.clone()], + } + ).await; + + test.run( + NClientTestSpec { + name: "portal_historyGetEnr ENR Found".to_string(), + description: "".to_string(), + always_run: false, + run: test_get_enr_enr_present, + environments: None, + test_data: None, + clients: vec![client.clone()], + } + ).await; + + test.run( + NClientTestSpec { + name: "portal_historyGetEnr Local Enr".to_string(), + description: "".to_string(), + always_run: false, + run: test_get_enr_local_enr, + environments: None, + test_data: None, + clients: vec![client.clone()], + } + ).await; + + test.run( + NClientTestSpec { + name: "portal_historyDeleteEnr None Found".to_string(), + description: "".to_string(), + always_run: false, + run: test_delete_enr_non_present, + environments: None, + test_data: None, + clients: vec![client.clone()], + } + ).await; + + test.run( + NClientTestSpec { + name: "portal_historyDeleteEnr ENR Found".to_string(), + description: "".to_string(), + always_run: false, + run: test_delete_enr_enr_present, + environments: None, + test_data: None, + clients: vec![client.clone()], + } + ).await; + + test.run( + NClientTestSpec { + name: "portal_historyLookupEnr None Found".to_string(), + description: "".to_string(), + always_run: false, + run: test_lookup_enr_non_present, + environments: None, + test_data: None, + clients: vec![client.clone()], + } + ).await; + + test.run( + NClientTestSpec { + name: "portal_historyLookupEnr ENR Found".to_string(), + description: "".to_string(), + always_run: false, + run: test_lookup_enr_enr_present, + environments: None, + test_data: None, + clients: vec![client.clone()], + } + ).await; + + test.run( + NClientTestSpec { + name: "portal_historyLookupEnr Local Enr".to_string(), + description: "".to_string(), + always_run: false, + run: test_lookup_enr_local_enr, + environments: None, + test_data: None, + clients: vec![client.clone()], + } + ).await; + + test.run( + NClientTestSpec { + name: "portal_historyRecursiveFindContent Content Absent".to_string(), + description: "".to_string(), + always_run: false, + run: test_recursive_find_content_content_absent, + environments: None, + test_data: None, + clients: vec![client.clone()], + } + ).await; + } + } +} + +dyn_async! { + async fn test_node_info<'a>(clients: Vec, _: Option>) { + let client = match clients.into_iter().next() { + Some((client)) => client, + None => { + panic!("Unable to get expected amount of clients from NClientTestSpec"); + } + }; + + let response = Discv5ApiClient::node_info(&client.rpc).await; + + if let Err(err) = response { + panic!("Expected response not received: {err}"); + } + } +} + +dyn_async! { + async fn test_local_content_expect_content_absent<'a>(clients: Vec, _: Option>) { + let client = match clients.into_iter().next() { + Some((client)) => client, + None => { + panic!("Unable to get expected amount of clients from NClientTestSpec"); + } + }; + let content_key = + serde_json::from_value(json!(CONTENT_KEY)); + + match content_key { + Ok(content_key) => { + let response = HistoryNetworkApiClient::local_content(&client.rpc, content_key).await; + + match response { + Ok(response) => { + match response { + ContentAbsent => (), + _ => panic!("Expected ContentAbsent, got ContentPresent") + } + }, + Err(err) => { + panic!("{}", &err.to_string()); + }, + } + } + Err(err) => { + panic!("{}", &err.to_string()); + } + } + } +} + +dyn_async! { + async fn test_store<'a>(clients: Vec, _: Option>) { + let client = match clients.into_iter().next() { + Some((client)) => client, + None => { + panic!("Unable to get expected amount of clients from NClientTestSpec"); + } + }; + let content_key = + serde_json::from_value(json!(CONTENT_KEY)); + + let content_value = + serde_json::from_value(json!(CONTENT_VALUE)); + + match content_key { + Ok(content_key) => { + match content_value { + Ok(content_value) => { + let response = HistoryNetworkApiClient::store(&client.rpc, content_key, content_value).await; + + if let Err(err) = response { + panic!("{}", &err.to_string()); + } + } + Err(err) => { + panic!("{}", &err.to_string()); + } + } + } + Err(err) => { + panic!("{}", &err.to_string()); + } + } + } +} + +dyn_async! { + async fn test_local_content_expect_content_present<'a>(clients: Vec, _: Option>) { + let client = match clients.into_iter().next() { + Some((client)) => client, + None => { + panic!("Unable to get expected amount of clients from NClientTestSpec"); + } + }; + let content_key: Result = + serde_json::from_value(json!(CONTENT_KEY)); + + let content_value = + serde_json::from_value(json!(CONTENT_VALUE)); + + + match content_key { + Ok(content_key) => { + // seed content_key/content_value onto the local node to test local_content expect content present + match content_value { + Ok(content_value) => { + let response = HistoryNetworkApiClient::store(&client.rpc, content_key.clone(), content_value).await; + + if let Err(err) = response { + panic!("{}", &err.to_string()); + } + } + Err(err) => { + panic!("{}", &err.to_string()); + } + } + + // Here we are calling local_content RPC to test if the content is present + let response = HistoryNetworkApiClient::local_content(&client.rpc, content_key).await; + + match response { + Ok(response) => { + match response { + ContentPresent(_) => (), + _ => panic!("Expected ContentPresent, got ContentAbsent") + } + }, + Err(err) => { + panic!("{}", &err.to_string()); + }, + } + } + Err(err) => { + panic!("{}", &err.to_string()); + } + } + } +} + +dyn_async! { + async fn test_add_enr_expect_true<'a>(clients: Vec, _: Option>) { + let client = match clients.into_iter().next() { + Some((client)) => client, + None => { + panic!("Unable to get expected amount of clients from NClientTestSpec"); + } + }; + let (_, enr) = generate_random_remote_enr(); + match HistoryNetworkApiClient::add_enr(&client.rpc, enr).await { + Ok(response) => match response { + true => (), + false => panic!("AddEnr expected to get true and instead got false") + }, + Err(err) => panic!("{}", &err.to_string()), + } + } +} + +dyn_async! { + async fn test_get_enr_non_present<'a>(clients: Vec, _: Option>) { + let client = match clients.into_iter().next() { + Some((client)) => client, + None => { + panic!("Unable to get expected amount of clients from NClientTestSpec"); + } + }; + let (_, enr) = generate_random_remote_enr(); + + if (HistoryNetworkApiClient::get_enr(&client.rpc, enr.node_id()).await).is_ok() { + panic!("GetEnr in this case is not supposed to return a value") + } + } +} + +dyn_async! { + async fn test_get_enr_local_enr<'a>(clients: Vec, _: Option>) { + let client = match clients.into_iter().next() { + Some((client)) => client, + None => { + panic!("Unable to get expected amount of clients from NClientTestSpec"); + } + }; + // get our local enr from NodeInfo + let target_enr = match Discv5ApiClient::node_info(&client.rpc).await { + Ok(node_info) => node_info.enr, + Err(err) => { + panic!("Error getting node info: {err:?}"); + } + }; + + // check if we can fetch data from routing table + match HistoryNetworkApiClient::get_enr(&client.rpc, target_enr.node_id()).await { + Ok(response) => { + if response != target_enr { + panic!("Response from GetEnr didn't return expected Enr") + } + }, + Err(err) => panic!("{}", &err.to_string()), + } + } +} + +dyn_async! { + async fn test_get_enr_enr_present<'a>(clients: Vec, _: Option>) { + let client = match clients.into_iter().next() { + Some((client)) => client, + None => { + panic!("Unable to get expected amount of clients from NClientTestSpec"); + } + }; + let (_, enr) = generate_random_remote_enr(); + + // seed enr into routing table + match HistoryNetworkApiClient::add_enr(&client.rpc, enr.clone()).await { + Ok(response) => match response { + true => (), + false => panic!("AddEnr expected to get true and instead got false") + }, + Err(err) => panic!("{}", &err.to_string()), + } + + // check if we can fetch data from routing table + match HistoryNetworkApiClient::get_enr(&client.rpc, enr.node_id()).await { + Ok(response) => { + if response != enr { + panic!("Response from GetEnr didn't return expected Enr") + } + }, + Err(err) => panic!("{}", &err.to_string()), + } + } +} + +dyn_async! { + async fn test_delete_enr_non_present<'a>(clients: Vec, _: Option>) { + let client = match clients.into_iter().next() { + Some((client)) => client, + None => { + panic!("Unable to get expected amount of clients from NClientTestSpec"); + } + }; + let (_, enr) = generate_random_remote_enr(); + match HistoryNetworkApiClient::delete_enr(&client.rpc, enr.node_id()).await { + Ok(response) => match response { + true => panic!("DeleteEnr expected to get false and instead got true"), + false => () + }, + Err(err) => panic!("{}", &err.to_string()), + }; + } +} + +dyn_async! { + async fn test_delete_enr_enr_present<'a>(clients: Vec, _: Option>) { + let client = match clients.into_iter().next() { + Some((client)) => client, + None => { + panic!("Unable to get expected amount of clients from NClientTestSpec"); + } + }; + let (_, enr) = generate_random_remote_enr(); + + // seed enr into routing table + match HistoryNetworkApiClient::add_enr(&client.rpc, enr.clone()).await { + Ok(response) => match response { + true => (), + false => panic!("AddEnr expected to get true and instead got false") + }, + Err(err) => panic!("{}", &err.to_string()), + } + + // check if data was seeded into the table + match HistoryNetworkApiClient::get_enr(&client.rpc, enr.node_id()).await { + Ok(response) => { + if response != enr { + panic!("Response from GetEnr didn't return expected Enr") + } + }, + Err(err) => panic!("{}", &err.to_string()), + } + + // delete the data from routing table + match HistoryNetworkApiClient::delete_enr(&client.rpc, enr.node_id()).await { + Ok(response) => match response { + true => (), + false => panic!("DeleteEnr expected to get true and instead got false") + }, + Err(err) => panic!("{}", &err.to_string()), + }; + + // check if the enr was actually deleted out of the table or not + if (HistoryNetworkApiClient::get_enr(&client.rpc, enr.node_id()).await).is_ok() { + panic!("GetEnr in this case is not supposed to return a value") + } + } +} + +dyn_async! { + async fn test_lookup_enr_non_present<'a>(clients: Vec, _: Option>) { + let client = match clients.into_iter().next() { + Some((client)) => client, + None => { + panic!("Unable to get expected amount of clients from NClientTestSpec"); + } + }; + let (_, enr) = generate_random_remote_enr(); + + if (HistoryNetworkApiClient::lookup_enr(&client.rpc, enr.node_id()).await).is_ok() { + panic!("LookupEnr in this case is not supposed to return a value") + } + } +} + +dyn_async! { + async fn test_lookup_enr_enr_present<'a>(clients: Vec, _: Option>) { + let client = match clients.into_iter().next() { + Some((client)) => client, + None => { + panic!("Unable to get expected amount of clients from NClientTestSpec"); + } + }; + let (_, enr) = generate_random_remote_enr(); + + // seed enr into routing table + match HistoryNetworkApiClient::add_enr(&client.rpc, enr.clone()).await { + Ok(response) => match response { + true => (), + false => panic!("AddEnr expected to get true and instead got false") + }, + Err(err) => panic!("{}", &err.to_string()), + } + + // check if we can fetch data from routing table + match HistoryNetworkApiClient::lookup_enr(&client.rpc, enr.node_id()).await { + Ok(response) => { + if response != enr { + panic!("Response from LookupEnr didn't return expected Enr") + } + }, + Err(err) => panic!("{}", &err.to_string()), + } + } +} + +dyn_async! { + async fn test_lookup_enr_local_enr<'a>(clients: Vec, _: Option>) { + let client = match clients.into_iter().next() { + Some((client)) => client, + None => { + panic!("Unable to get expected amount of clients from NClientTestSpec"); + } + }; + // get our local enr from NodeInfo + let target_enr = match Discv5ApiClient::node_info(&client.rpc).await { + Ok(node_info) => node_info.enr, + Err(err) => { + panic!("Error getting node info: {err:?}"); + } + }; + + // check if we can fetch data from routing table + match HistoryNetworkApiClient::lookup_enr(&client.rpc, target_enr.node_id()).await { + Ok(response) => { + if response != target_enr { + panic!("Response from LookupEnr didn't return expected Enr") + } + }, + Err(err) => panic!("{}", &err.to_string()), + } + } +} + +dyn_async! { + // test that a node will return a AbsentContent via RecursiveFindContent when the data doesn't exist + async fn test_recursive_find_content_content_absent<'a>(clients: Vec, _: Option>) { + let client = match clients.into_iter().next() { + Some((client)) => client, + None => { + panic!("Unable to get expected amount of clients from NClientTestSpec"); + } + }; + let header_with_proof_key: HistoryContentKey = serde_json::from_value(json!(CONTENT_KEY)).unwrap(); + + match HistoryNetworkApiClient::recursive_find_content(&client.rpc, header_with_proof_key).await { + Ok(result) => { + match result { + ContentInfo::Content{ content: ethportal_api::PossibleHistoryContentValue::ContentAbsent, utp_transfer } => { + if utp_transfer { + panic!("Error: Unexpected RecursiveFindContent response: utp_transfer was supposed to be false"); + } + }, + other => { + panic!("Error: Unexpected RecursiveFindContent response: {other:?}"); + } + } + }, + Err(err) => { + panic!("Error: Unable to get response from RecursiveFindContent request: {err:?}"); + } + } + } +} From 940f617c2a46c8a1e93d44a41cf3ff0a658826e4 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Mon, 5 Feb 2024 22:30:35 +0100 Subject: [PATCH 169/387] clients: add 'portal' role --- clients/fluffy/hive.yaml | 2 ++ clients/trin-bridge/hive.yaml | 2 ++ clients/trin/hive.yaml | 2 ++ clients/ultralight/hive.yaml | 2 ++ 4 files changed, 8 insertions(+) create mode 100644 clients/fluffy/hive.yaml create mode 100644 clients/trin-bridge/hive.yaml create mode 100644 clients/trin/hive.yaml create mode 100644 clients/ultralight/hive.yaml diff --git a/clients/fluffy/hive.yaml b/clients/fluffy/hive.yaml new file mode 100644 index 0000000000..a7a54e4224 --- /dev/null +++ b/clients/fluffy/hive.yaml @@ -0,0 +1,2 @@ +roles: + - portal diff --git a/clients/trin-bridge/hive.yaml b/clients/trin-bridge/hive.yaml new file mode 100644 index 0000000000..a7a54e4224 --- /dev/null +++ b/clients/trin-bridge/hive.yaml @@ -0,0 +1,2 @@ +roles: + - portal diff --git a/clients/trin/hive.yaml b/clients/trin/hive.yaml new file mode 100644 index 0000000000..a7a54e4224 --- /dev/null +++ b/clients/trin/hive.yaml @@ -0,0 +1,2 @@ +roles: + - portal diff --git a/clients/ultralight/hive.yaml b/clients/ultralight/hive.yaml new file mode 100644 index 0000000000..a7a54e4224 --- /dev/null +++ b/clients/ultralight/hive.yaml @@ -0,0 +1,2 @@ +roles: + - portal From 09c0beaf4b28e06cb89af0107cf3069f43c5cf2b Mon Sep 17 00:00:00 2001 From: Kolby Moroz Liebl <31669092+KolbyML@users.noreply.github.com> Date: Mon, 5 Feb 2024 14:32:03 -0700 Subject: [PATCH 170/387] simulators/portal/history/portal-interop: add portal network history simulator (#987) --- .../portal/history/portal-interop/Cargo.toml | 16 + .../portal/history/portal-interop/Dockerfile | 25 + .../history/portal-interop/src/constants.rs | 1 + .../portal/history/portal-interop/src/main.rs | 699 ++++++++++++++++++ 4 files changed, 741 insertions(+) create mode 100644 simulators/portal/history/portal-interop/Cargo.toml create mode 100644 simulators/portal/history/portal-interop/Dockerfile create mode 100644 simulators/portal/history/portal-interop/src/constants.rs create mode 100644 simulators/portal/history/portal-interop/src/main.rs diff --git a/simulators/portal/history/portal-interop/Cargo.toml b/simulators/portal/history/portal-interop/Cargo.toml new file mode 100644 index 0000000000..cfcb9d33f3 --- /dev/null +++ b/simulators/portal/history/portal-interop/Cargo.toml @@ -0,0 +1,16 @@ +[package] +name = "portal-interop" +version = "0.1.0" +authors = ["Ognyan Genev ", "Kolby ML (Moroz Liebl) "] +edition = "2021" + +[dependencies] +ethportal-api = { git = "https://github.com/ethereum/trin", rev = "2a32224e3c2b0b80bc37c1b692c33016371f197a" } +portal-spec-test-utils-rs = { git = "https://github.com/ethereum/portal-spec-tests", rev = "d1e996d0d4dc2136b3cd38d9e25cdc3a6b74dcd9" } +hivesim = { git = "https://github.com/ethereum/portal-hive", rev = "8ff1e3d3c941dd00d56dacd777a5dfb71edf402f" } +itertools = "0.10.5" +serde_json = "1.0.87" +serde_yaml = "0.9" +tokio = { version = "1", features = ["full"] } +tracing = "0.1.37" +tracing-subscriber = "0.3.16" diff --git a/simulators/portal/history/portal-interop/Dockerfile b/simulators/portal/history/portal-interop/Dockerfile new file mode 100644 index 0000000000..fcdb96f856 --- /dev/null +++ b/simulators/portal/history/portal-interop/Dockerfile @@ -0,0 +1,25 @@ +FROM rust:1.71.1 AS builder + +# create a new empty shell project +RUN USER=root cargo new --bin portal-interop +WORKDIR /portal-interop + +# copy over manifests and source to build image +COPY Cargo.toml ./Cargo.toml +COPY src ./src + +# build for release +RUN cargo build --release + +# final base +FROM ubuntu:22.04 + +RUN apt update && apt install wget -y + +# copy build artifacts from build stage +COPY --from=builder /portal-interop/target/release/portal-interop . +ADD https://raw.githubusercontent.com/ethereum/portal-spec-tests/master/tests/mainnet/history/hive/test_data_collection_of_forks_blocks.yaml ./test-data/test_data_collection_of_forks_blocks.yaml + +ENV RUST_LOG=debug + +ENTRYPOINT ["./portal-interop"] diff --git a/simulators/portal/history/portal-interop/src/constants.rs b/simulators/portal/history/portal-interop/src/constants.rs new file mode 100644 index 0000000000..f04015433e --- /dev/null +++ b/simulators/portal/history/portal-interop/src/constants.rs @@ -0,0 +1 @@ +pub const TEST_DATA_FILE_PATH: &str = "./test-data/test_data_collection_of_forks_blocks.yaml"; diff --git a/simulators/portal/history/portal-interop/src/main.rs b/simulators/portal/history/portal-interop/src/main.rs new file mode 100644 index 0000000000..4d60d1ac9b --- /dev/null +++ b/simulators/portal/history/portal-interop/src/main.rs @@ -0,0 +1,699 @@ +mod constants; + +use crate::constants::TEST_DATA_FILE_PATH; +use ethportal_api::types::portal::ContentInfo; +use ethportal_api::utils::bytes::hex_encode; +use ethportal_api::{ + ContentValue, Discv5ApiClient, HistoryContentKey, HistoryContentValue, HistoryNetworkApiClient, + OverlayContentKey, PossibleHistoryContentValue, +}; +use hivesim::{dyn_async, Client, NClientTestSpec, Simulation, Suite, Test, TestSpec}; +use itertools::Itertools; +use portal_spec_test_utils_rs::get_flair; +use serde_json::json; +use serde_yaml::Value; +use tokio::time::Duration; + +// This is taken from Trin. It should be fairly standard +const MAX_PORTAL_CONTENT_PAYLOAD_SIZE: usize = 1165; + +// Header with proof for block number 14764013 +const HEADER_WITH_PROOF_KEY: &str = + "0x00720704f3aa11c53cf344ea069db95cecb81ad7453c8f276b2a1062979611f09c"; + +#[tokio::main] +async fn main() { + tracing_subscriber::fmt::init(); + + let mut suite = Suite { + name: "portal-interop".to_string(), + description: + "The portal interop test suite runs a set of scenarios to test interoperability between + portal network clients" + .to_string(), + tests: vec![], + }; + + suite.add(TestSpec { + name: "Portal Network interop".to_string(), + description: "".to_string(), + always_run: false, + run: test_portal_interop, + client: None, + }); + + let sim = Simulation::new(); + run_suite(sim, suite).await; +} + +async fn run_suite(host: Simulation, suite: Suite) { + let name = suite.clone().name; + let description = suite.clone().description; + + let suite_id = host.start_suite(name, description, "".to_string()).await; + + for test in &suite.tests { + test.run_test(host.clone(), suite_id, suite.clone()).await; + } + + host.end_suite(suite_id).await; +} + +fn content_pair_to_string_pair( + content_pair: (HistoryContentKey, HistoryContentValue), +) -> (String, String) { + let (content_key, content_value) = content_pair; + (content_key.to_hex(), hex_encode(content_value.encode())) +} + +/// Processed content data for history tests +struct ProcessedContent { + content_type: String, + block_number: u64, + test_data: Vec<(String, String)>, +} + +fn process_content( + content: Vec<(HistoryContentKey, HistoryContentValue)>, +) -> Vec { + let mut last_header = content.first().unwrap().clone(); + + let mut result: Vec = vec![]; + for history_content in content.into_iter() { + if let HistoryContentKey::BlockHeaderWithProof(_) = &history_content.0 { + last_header = history_content.clone(); + } + let (content_type, block_number, test_data) = + if let HistoryContentValue::BlockHeaderWithProof(header_with_proof) = &last_header.1 { + match &history_content.0 { + HistoryContentKey::BlockHeaderWithProof(_) => ( + "Block Header".to_string(), + header_with_proof.header.number, + vec![content_pair_to_string_pair(last_header.clone())], + ), + HistoryContentKey::BlockBody(_) => ( + "Block Body".to_string(), + header_with_proof.header.number, + vec![ + content_pair_to_string_pair(last_header.clone()), + content_pair_to_string_pair(history_content), + ], + ), + HistoryContentKey::BlockReceipts(_) => ( + "Block Receipt".to_string(), + header_with_proof.header.number, + vec![ + content_pair_to_string_pair(last_header.clone()), + content_pair_to_string_pair(history_content), + ], + ), + HistoryContentKey::EpochAccumulator(_) => ( + "Epoch Accumulator".to_string(), + header_with_proof.header.number, + vec![], + ), + } + } else { + unreachable!("History test dated is formatted incorrectly") + }; + result.push(ProcessedContent { + content_type, + block_number, + test_data, + }) + } + result +} + +dyn_async! { + async fn test_portal_interop<'a> (test: &'a mut Test, _client: Option) { + // Get all available portal clients + let clients = test.sim.client_types().await; + + let values = std::fs::read_to_string(TEST_DATA_FILE_PATH) + .expect("cannot find test asset"); + let values: Value = serde_yaml::from_str(&values).unwrap(); + let content: Vec<(HistoryContentKey, HistoryContentValue)> = values.as_sequence().unwrap().iter().map(|value| { + let content_key: HistoryContentKey = + serde_yaml::from_value(value.get("content_key").unwrap().clone()).unwrap(); + let content_value: HistoryContentValue = + serde_yaml::from_value(value.get("content_value").unwrap().clone()).unwrap(); + (content_key, content_value) + }).collect(); + + // Iterate over all possible pairings of clients and run the tests (including self-pairings) + for (client_a, client_b) in clients.iter().cartesian_product(clients.iter()) { + for ProcessedContent { content_type, block_number, test_data } in process_content(content.clone()) { + test.run( + NClientTestSpec { + name: format!("OFFER {}: block number {}{} {} --> {}", content_type, block_number, get_flair(block_number), client_a.name, client_b.name), + description: "".to_string(), + always_run: false, + run: test_offer, + environments: None, + test_data: Some(test_data.clone()), + clients: vec![client_a.clone(), client_b.clone()], + } + ).await; + + test.run( + NClientTestSpec { + name: format!("RecursiveFindContent {}: block number {}{} {} --> {}", content_type, block_number, get_flair(block_number), client_a.name, client_b.name), + description: "".to_string(), + always_run: false, + run: test_recursive_find_content, + environments: None, + test_data: Some(test_data.clone()), + clients: vec![client_a.clone(), client_b.clone()], + } + ).await; + + test.run( + NClientTestSpec { + name: format!("FindContent {}: block number {}{} {} --> {}", content_type, block_number, get_flair(block_number), client_a.name, client_b.name), + description: "".to_string(), + always_run: false, + run: test_find_content, + environments: None, + test_data: Some(test_data), + clients: vec![client_a.clone(), client_b.clone()], + } + ).await; + } + + // Test portal history ping + test.run(NClientTestSpec { + name: format!("PING {} --> {}", client_a.name, client_b.name), + description: "".to_string(), + always_run: false, + run: test_ping, + environments: None, + test_data: None, + clients: vec![client_a.clone(), client_b.clone()], + } + ).await; + + // Test find content non-present + test.run(NClientTestSpec { + name: format!("FIND_CONTENT non present {} --> {}", client_a.name, client_b.name), + description: "find content: calls find content that doesn't exist".to_string(), + always_run: false, + run: test_find_content_non_present, + environments: None, + test_data: None, + clients: vec![client_a.clone(), client_b.clone()], + } + ).await; + + // Test find nodes distance zero + test.run(NClientTestSpec { + name: format!("FIND_NODES Distance 0 {} --> {}", client_a.name, client_b.name), + description: "find nodes: distance zero expect called nodes enr".to_string(), + always_run: false, + run: test_find_nodes_zero_distance, + environments: None, + test_data: None, + clients: vec![client_a.clone(), client_b.clone()], + } + ).await; + + // Test gossiping a collection of blocks to node B (B will gossip back to A) + test.run( + NClientTestSpec { + name: format!("GOSSIP blocks from A:{} --> B:{}", client_a.name, client_b.name), + description: "".to_string(), + always_run: false, + run: test_gossip_two_nodes, + environments: None, + test_data: Some(content.clone().into_iter().map(content_pair_to_string_pair).collect()), + clients: vec![client_a.clone(), client_b.clone()], + } + ).await; + } + } +} + +dyn_async! { + // test that a node will not return content via FINDCONTENT. + async fn test_find_content_non_present<'a>(clients: Vec, _: Option>) { + let (client_a, client_b) = match clients.iter().collect_tuple() { + Some((client_a, client_b)) => (client_a, client_b), + None => { + panic!("Unable to get expected amount of clients from NClientTestSpec"); + } + }; + let header_with_proof_key: HistoryContentKey = serde_json::from_value(json!(HEADER_WITH_PROOF_KEY)).unwrap(); + + let target_enr = match client_b.rpc.node_info().await { + Ok(node_info) => node_info.enr, + Err(err) => { + panic!("Error getting node info: {err:?}"); + } + }; + + let result = client_a.rpc.find_content(target_enr, header_with_proof_key.clone()).await; + + match result { + Ok(result) => { + match result { + ContentInfo::Enrs{ enrs: val } => { + if !val.is_empty() { + panic!("Error: Unexpected FINDCONTENT response: expected ContentInfo::Enrs length 0 got {}", val.len()); + } + }, + ContentInfo::Content{ content: _, .. } => { + panic!("Error: Unexpected FINDCONTENT response: wasn't supposed to return back content"); + }, + other => { + panic!("Error: Unexpected FINDCONTENT response: {other:?}"); + } + } + }, + Err(err) => { + panic!("Error: Unable to get response from FINDCONTENT request: {err:?}"); + } + } + } +} + +dyn_async! { + async fn test_offer<'a>(clients: Vec, test_data: Option>) { + let (client_a, client_b) = match clients.iter().collect_tuple() { + Some((client_a, client_b)) => (client_a, client_b), + None => { + panic!("Unable to get expected amount of clients from NClientTestSpec"); + } + }; + let test_data = match test_data { + Some(test_data) => test_data, + None => panic!("Expected test data non was provided"), + }; + if let Some((optional_key, optional_value)) = test_data.get(1) { + let optional_key: HistoryContentKey = + serde_json::from_value(json!(optional_key)).unwrap(); + let optional_value: HistoryContentValue = + serde_json::from_value(json!(optional_value)).unwrap(); + match client_b.rpc.store(optional_key, optional_value).await { + Ok(result) => if !result { + panic!("Unable to store optional content for recursive find content"); + }, + Err(err) => { + panic!("Error storing optional content for recursive find content: {err:?}"); + } + } + } + let (target_key, target_value) = test_data.first().expect("Target content is required for this test"); + let target_key: HistoryContentKey = + serde_json::from_value(json!(target_key)).unwrap(); + let target_value: HistoryContentValue = + serde_json::from_value(json!(target_value)).unwrap(); + match client_b.rpc.store(target_key.clone(), target_value.clone()).await { + Ok(result) => if !result { + panic!("Error storing target content for recursive find content"); + }, + Err(err) => { + panic!("Error storing target content: {err:?}"); + } + } + + let target_enr = match client_b.rpc.node_info().await { + Ok(node_info) => node_info.enr, + Err(err) => { + panic!("Error getting node info: {err:?}"); + } + }; + + let _ = client_a.rpc.offer(target_enr, target_key.clone(), Some(target_value.clone())).await; + + tokio::time::sleep(Duration::from_secs(8)).await; + + match client_b.rpc.local_content(target_key).await { + Ok(possible_content) => { + match possible_content { + PossibleHistoryContentValue::ContentPresent(content) => { + if content != target_value { + panic!("Error receiving content: Expected content: {target_value:?}, Received content: {content:?}"); + } + } + PossibleHistoryContentValue::ContentAbsent => { + panic!("Expected content not found!"); + } + } + } + Err(err) => { + panic!("Unable to get received content: {err:?}"); + } + } + } +} + +dyn_async! { + async fn test_ping<'a>(clients: Vec, _: Option>) { + let (client_a, client_b) = match clients.iter().collect_tuple() { + Some((client_a, client_b)) => (client_a, client_b), + None => { + panic!("Unable to get expected amount of clients from NClientTestSpec"); + } + }; + let target_enr = match client_b.rpc.node_info().await { + Ok(node_info) => node_info.enr, + Err(err) => { + panic!("Error getting node info: {err:?}"); + } + }; + + let pong = client_a.rpc.ping(target_enr).await; + + if let Err(err) = pong { + panic!("Unable to receive pong info: {err:?}"); + } + + // Verify that client_b stored client_a its ENR through the base layer + // handshake mechanism. + let stored_enr = match client_a.rpc.node_info().await { + Ok(node_info) => node_info.enr, + Err(err) => { + panic!("Error getting node info: {err:?}"); + } + }; + + match HistoryNetworkApiClient::get_enr(&client_b.rpc, stored_enr.node_id()).await { + Ok(response) => { + if response != stored_enr { + panic!("Response from GetEnr didn't return expected ENR. Got: {response}; Expected: {stored_enr}") + } + }, + Err(err) => panic!("Failed while trying to get client A's ENR from client B: {err}"), + } + } +} + +dyn_async! { + async fn test_find_nodes_zero_distance<'a>(clients: Vec, _: Option>) { + let (client_a, client_b) = match clients.iter().collect_tuple() { + Some((client_a, client_b)) => (client_a, client_b), + None => { + panic!("Unable to get expected amount of clients from NClientTestSpec"); + } + }; + let target_enr = match client_b.rpc.node_info().await { + Ok(node_info) => node_info.enr, + Err(err) => { + panic!("Error getting node info: {err:?}"); + } + }; + + match client_a.rpc.find_nodes(target_enr.clone(), vec![0]).await { + Ok(response) => { + if response.len() != 1 { + panic!("Response from FindNodes didn't return expected length of 1"); + } + + match response.first() { + Some(response_enr) => { + if *response_enr != target_enr { + panic!("Response from FindNodes didn't return expected Enr"); + } + }, + None => panic!("Error find nodes zero distance wasn't supposed to return None"), + } + } + Err(err) => panic!("{}", &err.to_string()), + } + } +} + +dyn_async! { + // test that a node will return a content via RECURSIVEFINDCONTENT template that it has stored locally + async fn test_recursive_find_content<'a>(clients: Vec, test_data: Option>) { + let (client_a, client_b) = match clients.iter().collect_tuple() { + Some((client_a, client_b)) => (client_a, client_b), + None => { + panic!("Unable to get expected amount of clients from NClientTestSpec"); + } + }; + let test_data = match test_data { + Some(test_data) => test_data, + None => panic!("Expected test data non was provided"), + }; + if let Some((optional_key, optional_value)) = test_data.get(1) { + let optional_key: HistoryContentKey = + serde_json::from_value(json!(optional_key)).unwrap(); + let optional_value: HistoryContentValue = + serde_json::from_value(json!(optional_value)).unwrap(); + match client_b.rpc.store(optional_key, optional_value).await { + Ok(result) => if !result { + panic!("Unable to store optional content for recursive find content"); + }, + Err(err) => { + panic!("Error storing optional content for recursive find content: {err:?}"); + } + } + } + + let (target_key, target_value) = test_data.first().expect("Target content is required for this test"); + let target_key: HistoryContentKey = + serde_json::from_value(json!(target_key)).unwrap(); + let target_value: HistoryContentValue = + serde_json::from_value(json!(target_value)).unwrap(); + match client_b.rpc.store(target_key.clone(), target_value.clone()).await { + Ok(result) => if !result { + panic!("Error storing target content for recursive find content"); + }, + Err(err) => { + panic!("Error storing target content: {err:?}"); + } + } + + let target_enr = match client_b.rpc.node_info().await { + Ok(node_info) => node_info.enr, + Err(err) => { + panic!("Error getting node info: {err:?}"); + } + }; + + match HistoryNetworkApiClient::add_enr(&client_a.rpc, target_enr.clone()).await { + Ok(response) => match response { + true => (), + false => panic!("AddEnr expected to get true and instead got false") + }, + Err(err) => panic!("{}", &err.to_string()), + } + + match client_a.rpc.recursive_find_content(target_key.clone()).await { + Ok(result) => { + match result { + ContentInfo::Content{ content: ethportal_api::PossibleHistoryContentValue::ContentPresent(val), utp_transfer } => { + if val != target_value { + panic!("Error: Unexpected RECURSIVEFINDCONTENT response: didn't return expected target content"); + } + + if target_value.encode().len() < MAX_PORTAL_CONTENT_PAYLOAD_SIZE { + if utp_transfer { + panic!("Error: Unexpected RECURSIVEFINDCONTENT response: utp_transfer was supposed to be false"); + } + } else if !utp_transfer { + panic!("Error: Unexpected RECURSIVEFINDCONTENT response: utp_transfer was supposed to be true"); + } + }, + other => { + panic!("Error: Unexpected RECURSIVEFINDCONTENT response: {other:?}"); + } + } + }, + Err(err) => { + panic!("Error: Unable to get response from RECURSIVEFINDCONTENT request: {err:?}"); + } + } + } +} + +dyn_async! { + // test that a node will return a x content via FINDCONTENT that it has stored locally + async fn test_find_content<'a> (clients: Vec, test_data: Option>) { + let (client_a, client_b) = match clients.iter().collect_tuple() { + Some((client_a, client_b)) => (client_a, client_b), + None => { + panic!("Unable to get expected amount of clients from NClientTestSpec"); + } + }; + let test_data = match test_data { + Some(test_data) => test_data, + None => panic!("Expected test data none was provided"), + }; + if let Some((optional_key, optional_value)) = test_data.get(1) { + let optional_key: HistoryContentKey = + serde_json::from_value(json!(optional_key)).unwrap(); + let optional_value: HistoryContentValue = + serde_json::from_value(json!(optional_value)).unwrap(); + match client_b.rpc.store(optional_key, optional_value).await { + Ok(result) => if !result { + panic!("Unable to store optional content for find content"); + }, + Err(err) => { + panic!("Error storing optional content for find content: {err:?}"); + } + } + } + + let (target_key, target_value) = test_data.first().expect("Target content is required for this test"); + let target_key: HistoryContentKey = + serde_json::from_value(json!(target_key)).unwrap(); + let target_value: HistoryContentValue = + serde_json::from_value(json!(target_value)).unwrap(); + match client_b.rpc.store(target_key.clone(), target_value.clone()).await { + Ok(result) => if !result { + panic!("Error storing target content for find content"); + }, + Err(err) => { + panic!("Error storing target content: {err:?}"); + } + } + + let target_enr = match client_b.rpc.node_info().await { + Ok(node_info) => node_info.enr, + Err(err) => { + panic!("Error getting node info: {err:?}"); + } + }; + + match client_a.rpc.find_content(target_enr, target_key.clone()).await { + Ok(result) => { + match result { + ContentInfo::Content{ content: ethportal_api::PossibleHistoryContentValue::ContentPresent(val), utp_transfer } => { + if val != target_value { + panic!("Error: Unexpected FINDCONTENT response: didn't return expected block body"); + } + + if target_value.encode().len() < MAX_PORTAL_CONTENT_PAYLOAD_SIZE { + if utp_transfer { + panic!("Error: Unexpected FINDCONTENT response: utp_transfer was supposed to be false"); + } + } else if !utp_transfer { + panic!("Error: Unexpected FINDCONTENT response: utp_transfer was supposed to be true"); + } + }, + other => { + panic!("Error: Unexpected FINDCONTENT response: {other:?}"); + } + } + }, + Err(err) => { + panic!("Error: Unable to get response from FINDCONTENT request: {err:?}"); + } + } + } +} + +dyn_async! { + async fn test_gossip_two_nodes<'a> (clients: Vec, test_data: Option>) { + let (client_a, client_b) = match clients.iter().collect_tuple() { + Some((client_a, client_b)) => (client_a, client_b), + None => { + panic!("Unable to get expected amount of clients from NClientTestSpec"); + } + }; + let test_data = match test_data { + Some(test_data) => test_data, + None => panic!("Expected test data non was provided"), + }; + // connect clients + let client_b_enr = match client_b.rpc.node_info().await { + Ok(node_info) => node_info.enr, + Err(err) => { + panic!("Error getting node info: {err:?}"); + } + }; + match HistoryNetworkApiClient::add_enr(&client_a.rpc, client_b_enr.clone()).await { + Ok(response) => match response { + true => (), + false => panic!("AddEnr expected to get true and instead got false") + }, + Err(err) => panic!("{}", &err.to_string()), + } + + // With default node settings nodes should be storing all content + for (content_key, content_value) in test_data.clone() { + let content_key: HistoryContentKey = + serde_json::from_value(json!(content_key)).unwrap(); + let content_value: HistoryContentValue = + serde_json::from_value(json!(content_value)).unwrap(); + + match client_a.rpc.gossip(content_key.clone(), content_value.clone()).await { + Ok(nodes_gossiped_to) => { + if nodes_gossiped_to != 1 { + panic!("We expected to gossip to 1 node instead we gossiped to: {nodes_gossiped_to}"); + } + } + Err(err) => { + panic!("Unable to get received content: {err:?}"); + } + } + + if let HistoryContentKey::BlockHeaderWithProof(_) = content_key { + tokio::time::sleep(Duration::from_secs(1)).await; + } + } + + // wait test_data.len() seconds for data to propagate, giving more time if more items are propagating + tokio::time::sleep(Duration::from_secs(test_data.len() as u64)).await; + + // process raw test data to generate content details for error output + let (first_header_key, first_header_value) = test_data.first().unwrap(); + let first_header_key: HistoryContentKey = + serde_json::from_value(json!(first_header_key)).unwrap(); + let first_header_value: HistoryContentValue = + serde_json::from_value(json!(first_header_value)).unwrap(); + let mut last_header_seen: (HistoryContentKey, HistoryContentValue) = (first_header_key, first_header_value); + let mut result = vec![]; + for (content_key, content_value) in test_data.into_iter() { + let content_key: HistoryContentKey = + serde_json::from_value(json!(content_key)).unwrap(); + let content_value: HistoryContentValue = + serde_json::from_value(json!(content_value)).unwrap(); + + if let HistoryContentKey::BlockHeaderWithProof(_) = &content_key { + last_header_seen = (content_key.clone(), content_value.clone()); + } + let content_details = + if let HistoryContentValue::BlockHeaderWithProof(header_with_proof) = &last_header_seen.1 { + let content_type = match &content_key { + HistoryContentKey::BlockHeaderWithProof(_) => "header".to_string(), + HistoryContentKey::BlockBody(_) => "body".to_string(), + HistoryContentKey::BlockReceipts(_) => "receipt".to_string(), + HistoryContentKey::EpochAccumulator(_) => "epoch accumulator".to_string(), + }; + format!( + "{}{} {}", + header_with_proof.header.number, + get_flair(header_with_proof.header.number), + content_type + ) + } else { + unreachable!("History test data is formatted incorrectly. Header wasn't infront of data. Please refer to test data file for more information") + }; + + match client_b.rpc.local_content(content_key.clone()).await { + Ok(expected_value) => { + match expected_value { + PossibleHistoryContentValue::ContentPresent(actual_value) => { + if actual_value != content_value { + result.push(format!("Error content received for block {content_details} was different then expected")); + } + } + PossibleHistoryContentValue::ContentAbsent => { + result.push(format!("Error content for block {content_details} was absent")); + } + } + } + Err(err) => { + panic!("Unable to get received content: {err:?}"); + } + } + } + + if !result.is_empty() { + panic!("Client B: {:?}", result); + } + } +} From dfa95c3d0aa2623a7eb6b6d3dd9270a385069d92 Mon Sep 17 00:00:00 2001 From: Kolby Moroz Liebl <31669092+KolbyML@users.noreply.github.com> Date: Mon, 5 Feb 2024 14:32:17 -0700 Subject: [PATCH 171/387] simulators/portal/history/portal-mesh: add portal network history portal-mesh simulator (#988) --- .../portal/history/portal-mesh/Cargo.toml | 14 + .../portal/history/portal-mesh/Dockerfile | 24 ++ .../portal/history/portal-mesh/src/main.rs | 250 ++++++++++++++++++ 3 files changed, 288 insertions(+) create mode 100644 simulators/portal/history/portal-mesh/Cargo.toml create mode 100644 simulators/portal/history/portal-mesh/Dockerfile create mode 100644 simulators/portal/history/portal-mesh/src/main.rs diff --git a/simulators/portal/history/portal-mesh/Cargo.toml b/simulators/portal/history/portal-mesh/Cargo.toml new file mode 100644 index 0000000000..c681c9ade6 --- /dev/null +++ b/simulators/portal/history/portal-mesh/Cargo.toml @@ -0,0 +1,14 @@ +[package] +name = "portal-mesh" +version = "0.1.0" +authors = ["Kolby ML (Moroz Liebl) "] +edition = "2021" + +[dependencies] +ethportal-api = { git = "https://github.com/ethereum/trin", rev = "2a32224e3c2b0b80bc37c1b692c33016371f197a" } +hivesim = { git = "https://github.com/ethereum/portal-hive", rev = "8ff1e3d3c941dd00d56dacd777a5dfb71edf402f" } +itertools = "0.10.5" +serde_json = "1.0.87" +tokio = { version = "1", features = ["full"] } +tracing = "0.1.37" +tracing-subscriber = "0.3.16" diff --git a/simulators/portal/history/portal-mesh/Dockerfile b/simulators/portal/history/portal-mesh/Dockerfile new file mode 100644 index 0000000000..98d5424429 --- /dev/null +++ b/simulators/portal/history/portal-mesh/Dockerfile @@ -0,0 +1,24 @@ +FROM rust:1.71.1 AS builder + +# create a new empty shell project +RUN USER=root cargo new --bin portal-mesh +WORKDIR /portal-mesh + +# copy over manifests and source to build image +COPY Cargo.toml ./Cargo.toml +COPY src ./src + +# build for release +RUN cargo build --release + +# final base +FROM ubuntu:22.04 + +RUN apt update && apt install wget -y + +# copy build artifacts from build stage +COPY --from=builder /portal-mesh/target/release/portal-mesh . + +ENV RUST_LOG=debug + +ENTRYPOINT ["./portal-mesh"] diff --git a/simulators/portal/history/portal-mesh/src/main.rs b/simulators/portal/history/portal-mesh/src/main.rs new file mode 100644 index 0000000000..1a1006e34b --- /dev/null +++ b/simulators/portal/history/portal-mesh/src/main.rs @@ -0,0 +1,250 @@ +use ethportal_api::jsonrpsee::core::__reexports::serde_json; +use ethportal_api::types::distance::{Metric, XorMetric}; +use ethportal_api::types::portal::ContentInfo; +use ethportal_api::{ + Discv5ApiClient, HistoryContentKey, HistoryContentValue, HistoryNetworkApiClient, +}; +use hivesim::{dyn_async, Client, NClientTestSpec, Simulation, Suite, Test, TestSpec}; +use itertools::Itertools; +use serde_json::json; +use std::collections::HashMap; + +// Header with proof for block number 14764013 +const HEADER_WITH_PROOF_KEY: &str = + "0x00720704f3aa11c53cf344ea069db95cecb81ad7453c8f276b2a1062979611f09c"; +const HEADER_WITH_PROOF_VALUE: &str = "0x080000002d020000f90222a02c58e3212c085178dbb1277e2f3c24b3f451267a75a234945c1581af639f4a7aa058a694212e0416353a4d3865ccf475496b55af3a3d3b002057000741af9731919400192fb10df37c9fb26829eb2cc623cd1bf599e8a067a9fb631f4579f9015ef3c6f1f3830dfa2dc08afe156f750e90022134b9ebf6a018a2978fc62cd1a23e90de920af68c0c3af3330327927cda4c005faccefb5ce7a0168a3827607627e781941dc777737fc4b6beb69a8b139240b881992b35b854eab9010000200000400000001000400080080000000000010004010001000008000000002000110000000000000090020001110402008000080208040010000000a8000000000000000000210822000900205020000000000160020020000400800040000000000042080000000400004008084020001000001004004000001000000000000001000000110000040000010200844040048101000008002000404810082002800000108020000200408008000100000000000000002020000b00010080600902000200000050000400000000000000400000002002101000000a00002000003420000800400000020100002000000000000000c00040000001000000100187327bd7ad3116ce83e147ed8401c9c36483140db184627d9afa9a457468657265756d50504c4e532f326d696e6572735f55534133a0f1a32e24eb62f01ec3f2b3b5893f7be9062fbf5482bc0d490a54352240350e26882087fbb243327696851aae1651b6010cc53ffa2df1bae1550a0000000000000000000000000000000000000000000063d45d0a2242d35484f289108b3c80cccf943005db0db6c67ffea4c4a47fd529f64d74fa6068a3fd89a2c0d9938c3a751c4706d0b0e8f99dec6b517cf12809cb413795c8c678b3171303ddce2fa1a91af6a0961b9db72750d4d5ea7d5103d8d25f23f522d9af4c13fe8ac7a7d9d64bb08d980281eea5298b93cb1085fedc19d4c60afdd52d116cfad030cf4223e50afa8031154a2263c76eb08b96b5b8fdf5e5c30825d5c918eefb89daaf0e8573f20643614d9843a1817b6186074e4e53b22cf49046d977c901ec00aef1555fa89468adc2a51a081f186c995153d1cba0f2887d585212d68be4b958d309fbe611abe98a9bfc3f4b7a7b72bb881b888d89a04ecfe08b1c1a48554a48328646e4f864fe722f12d850f0be29e3829d1f94b34083032a9b6f43abd559785c996229f8e022d4cd6dcde4aafcce6445fe8743e1fcbe8672a99f9d9e3a5ca10c01f3751d69fbd22197f0680bc1529151130b22759bf185f4dbce357f46eb9cc8e21ea78f49b298eea2756d761fe23de8bea0d2e15aed136d689f6d252c54ebadc3e46b84a397b681edf7ec63522b9a298301084d019d0020000000000000000000000000000000000000000000000000000000000000"; + +// private key hive environment variable +const PRIVATE_KEY_ENVIRONMENT_VARIABLE: &str = "HIVE_CLIENT_PRIVATE_KEY"; + +#[tokio::main] +async fn main() { + tracing_subscriber::fmt::init(); + + let mut suite = Suite { + name: "portal-mesh".to_string(), + description: "The portal mesh test suite runs a set of scenarios to test 3 clients" + .to_string(), + tests: vec![], + }; + + suite.add(TestSpec { + name: "Portal Network mesh".to_string(), + description: "".to_string(), + always_run: false, + run: test_portal_scenarios, + client: None, + }); + + let sim = Simulation::new(); + run_suite(sim, suite).await; +} + +async fn run_suite(host: Simulation, suite: Suite) { + let name = suite.clone().name; + let description = suite.clone().description; + + let suite_id = host.start_suite(name, description, "".to_string()).await; + + for test in &suite.tests { + test.run_test(host.clone(), suite_id, suite.clone()).await; + } + + host.end_suite(suite_id).await; +} + +dyn_async! { + async fn test_portal_scenarios<'a> (test: &'a mut Test, _client: Option) { + // Get all available portal clients + let clients = test.sim.client_types().await; + + let private_key_1 = "fc34e57cc83ed45aae140152fd84e2c21d1f4d46e19452e13acc7ee90daa5bac".to_string(); + let private_key_2 = "e5add57dc4c9ef382509e61ce106ec86f60eb73bbfe326b00f54bf8e1819ba11".to_string(); + + // Iterate over all possible pairings of clients and run the tests (including self-pairings) + for ((client_a, client_b), client_c) in clients.iter().cartesian_product(clients.iter()).cartesian_product(clients.iter()) { + test.run( + NClientTestSpec { + name: format!("FIND_CONTENT content stored 2 nodes away stored in client C (Client B closer to content then C). A:{} --> B:{} --> C:{}", client_a.name, client_b.name, client_c.name), + description: "".to_string(), + always_run: false, + run: test_find_content_two_jumps, + environments: Some(vec![None, Some(HashMap::from([(PRIVATE_KEY_ENVIRONMENT_VARIABLE.to_string(), private_key_2.clone())])), Some(HashMap::from([(PRIVATE_KEY_ENVIRONMENT_VARIABLE.to_string(), private_key_1.clone())]))]), + test_data: None, + clients: vec![client_a.clone(), client_b.clone(), client_c.clone()], + } + ).await; + + // Remove this after the clients are stable across two jumps test + test.run( + NClientTestSpec { + name: format!("FIND_CONTENT content stored 2 nodes away stored in client C (Client C closer to content then B). A:{} --> B:{} --> C:{}", client_a.name, client_b.name, client_c.name), + description: "".to_string(), + always_run: false, + run: test_find_content_two_jumps, + environments: Some(vec![None, Some(HashMap::from([(PRIVATE_KEY_ENVIRONMENT_VARIABLE.to_string(), private_key_1.clone())])), Some(HashMap::from([(PRIVATE_KEY_ENVIRONMENT_VARIABLE.to_string(), private_key_2.clone())]))]), + test_data: None, + clients: vec![client_a.clone(), client_b.clone(), client_c.clone()], + } + ).await; + + // Test find nodes distance of client a + test.run(NClientTestSpec { + name: format!("FIND_NODES distance of client C {} --> {} --> {}", client_a.name, client_b.name, client_c.name), + description: "find nodes: distance of client A expect seeded enr returned".to_string(), + always_run: false, + run: test_find_nodes_distance_of_client_c, + environments: None, + test_data: None, + clients: vec![client_a.clone(), client_b.clone(), client_c.clone()], + } + ).await; + } + } +} + +dyn_async! { + async fn test_find_content_two_jumps<'a> (clients: Vec, _: Option>) { + let (client_a, client_b, client_c) = match clients.iter().collect_tuple() { + Some((client_a, client_b, client_c)) => (client_a, client_b, client_c), + None => { + panic!("Unable to get expected amount of clients from NClientTestSpec"); + } + }; + + let header_with_proof_key: HistoryContentKey = serde_json::from_value(json!(HEADER_WITH_PROOF_KEY)).unwrap(); + let header_with_proof_value: HistoryContentValue = serde_json::from_value(json!(HEADER_WITH_PROOF_VALUE)).unwrap(); + + // get enr for b and c to seed for the jumps + let client_b_enr = match client_b.rpc.node_info().await { + Ok(node_info) => node_info.enr, + Err(err) => { + panic!("Error getting node info: {err:?}"); + } + }; + + let client_c_enr = match client_c.rpc.node_info().await { + Ok(node_info) => node_info.enr, + Err(err) => { + panic!("Error getting node info: {err:?}"); + } + }; + + // seed client_c_enr into routing table of client_b + match HistoryNetworkApiClient::add_enr(&client_b.rpc, client_c_enr.clone()).await { + Ok(response) => match response { + true => (), + false => panic!("AddEnr expected to get true and instead got false") + }, + Err(err) => panic!("{}", &err.to_string()), + } + + // send a ping from client B to C to connect the clients + if let Err(err) = client_b.rpc.ping(client_c_enr.clone()).await { + panic!("Unable to receive pong info: {err:?}"); + } + + // seed the data into client_c + match client_c.rpc.store(header_with_proof_key.clone(), header_with_proof_value.clone()).await { + Ok(result) => if !result { + panic!("Unable to store header with proof for find content immediate return test"); + }, + Err(err) => { + panic!("Error storing header with proof for find content immediate return test: {err:?}"); + } + } + + let enrs = match client_a.rpc.find_content(client_b_enr.clone(), header_with_proof_key.clone()).await { + Ok(result) => { + match result { + ContentInfo::Enrs{ enrs } => { + enrs + }, + other => { + panic!("Error: (Enrs) Unexpected FINDCONTENT response not: {other:?}"); + } + } + }, + Err(err) => { + panic!("Error: (Enrs) Unable to get response from FINDCONTENT request: {err:?}"); + } + }; + + if enrs.len() != 1 { + panic!("Known node is closer to content, Enrs returned should be 0 instead got: length {}", enrs.len()); + } + + match client_a.rpc.find_content(enrs[0].clone(), header_with_proof_key.clone()).await { + Ok(result) => { + match result { + ContentInfo::Content{ content: ethportal_api::PossibleHistoryContentValue::ContentPresent(val), utp_transfer } => { + if val != header_with_proof_value { + panic!("Error: Unexpected FINDCONTENT response: didn't return expected header with proof value"); + } + + if utp_transfer { + panic!("Error: Unexpected FINDCONTENT response: utp_transfer was supposed to be false"); + } + }, + other => { + panic!("Error: Unexpected FINDCONTENT response: {other:?}"); + } + } + }, + Err(err) => { + panic!("Error: Unable to get response from FINDCONTENT request: {err:?}"); + } + } + } +} + +dyn_async! { + async fn test_find_nodes_distance_of_client_c<'a>(clients: Vec, _: Option>) { + let (client_a, client_b, client_c) = match clients.iter().collect_tuple() { + Some((client_a, client_b, client_c)) => (client_a, client_b, client_c), + None => { + panic!("Unable to get expected amount of clients from NClientTestSpec"); + } + }; + + let target_enr = match client_b.rpc.node_info().await { + Ok(node_info) => node_info.enr, + Err(err) => { + panic!("Error getting node info: {err:?}"); + } + }; + + // We are adding client C to our list so we then can assume only one client per bucket + let client_c_enr = match client_c.rpc.node_info().await { + Ok(node_info) => node_info.enr, + Err(err) => { + panic!("Error getting node info: {err:?}"); + } + }; + + // seed enr into routing table + match HistoryNetworkApiClient::add_enr(&client_b.rpc, client_c_enr.clone()).await { + Ok(response) => if !response { + panic!("AddEnr expected to get true and instead got false") + }, + Err(err) => panic!("{}", &err.to_string()), + } + + if let Some(distance) = XorMetric::distance(&target_enr.node_id().raw(), &client_c_enr.node_id().raw()).log2() { + match client_a.rpc.find_nodes(target_enr.clone(), vec![distance as u16]).await { + Ok(response) => { + if response.is_empty() { + panic!("FindNodes expected to have received a non-empty response"); + } + + if !response.contains(&client_c_enr) { + panic!("FindNodes {distance} distance expected to contained seeded Enr"); + } + } + Err(err) => panic!("{}", &err.to_string()), + } + } else { + panic!("Distance calculation failed"); + } + } +} From 7417cdff9e76035ac8c2eb15797c30b51c9ae97d Mon Sep 17 00:00:00 2001 From: Kolby Moroz Liebl <31669092+KolbyML@users.noreply.github.com> Date: Mon, 5 Feb 2024 14:32:38 -0700 Subject: [PATCH 172/387] simulators/portal/history/trin-bridge: add portal network history trin-bridge simulator (#989) --- .../portal/history/trin-bridge/Cargo.toml | 15 ++ .../portal/history/trin-bridge/Dockerfile | 40 ++++ .../history/trin-bridge/src/constants.rs | 4 + .../portal/history/trin-bridge/src/main.rs | 183 ++++++++++++++++++ 4 files changed, 242 insertions(+) create mode 100644 simulators/portal/history/trin-bridge/Cargo.toml create mode 100644 simulators/portal/history/trin-bridge/Dockerfile create mode 100644 simulators/portal/history/trin-bridge/src/constants.rs create mode 100644 simulators/portal/history/trin-bridge/src/main.rs diff --git a/simulators/portal/history/trin-bridge/Cargo.toml b/simulators/portal/history/trin-bridge/Cargo.toml new file mode 100644 index 0000000000..fac1f5c65f --- /dev/null +++ b/simulators/portal/history/trin-bridge/Cargo.toml @@ -0,0 +1,15 @@ +[package] +name = "trin-bridge" +version = "0.1.0" +authors = ["Kolby ML (Moroz Liebl) "] +edition = "2021" + +[dependencies] +ethportal-api = { git = "https://github.com/ethereum/trin", rev = "b530dc3d40d51c21c800089eacb2852ebd8c4d45" } +portal-spec-test-utils-rs = { git = "https://github.com/ethereum/portal-spec-tests", rev = "d1e996d0d4dc2136b3cd38d9e25cdc3a6b74dcd9" } +hivesim = { git = "https://github.com/ethereum/portal-hive", rev = "8ff1e3d3c941dd00d56dacd777a5dfb71edf402f" } +itertools = "0.10.5" +serde_yaml = "0.9" +tokio = { version = "1", features = ["full"] } +tracing = "0.1.37" +tracing-subscriber = "0.3.16" diff --git a/simulators/portal/history/trin-bridge/Dockerfile b/simulators/portal/history/trin-bridge/Dockerfile new file mode 100644 index 0000000000..da91a6b211 --- /dev/null +++ b/simulators/portal/history/trin-bridge/Dockerfile @@ -0,0 +1,40 @@ +FROM rust:1.71.1 AS builder + +# create a new empty shell project +RUN USER=root cargo new --bin trin-bridge +WORKDIR /trin-bridge + +RUN apt-get update && apt-get install clang -y + +# copy over manifests and source to build image +COPY Cargo.toml ./Cargo.toml +COPY src ./src + +# build for release +RUN cargo build --release + +# final base +FROM ubuntu:22.04 + +RUN apt update && apt install wget -y + +# Use these for amd-based devices +RUN wget http://nz2.archive.ubuntu.com/ubuntu/pool/main/o/openssl/libssl1.1_1.1.0g-2ubuntu4_amd64.deb +RUN dpkg -i libssl1.1_1.1.0g-2ubuntu4_amd64.deb +# Use these for arm-based devices +#RUN wget http://ports.ubuntu.com/pool/main/o/openssl/libssl1.1_1.1.1f-1ubuntu2_arm64.deb +#RUN dpkg -i libssl1.1_1.1.1f-1ubuntu2_arm64.deb + +# copy build artifacts from build stage +COPY --from=builder /trin-bridge/target/release/trin-bridge . +ADD https://raw.githubusercontent.com/ethereum/portal-spec-tests/master/tests/mainnet/history/hive/test_data_collection_of_forks_blocks.yaml ./test-data/test_data_collection_of_forks_blocks.yaml + +RUN apt-get update && apt-get install libcurl4 -y + +ENV RUST_LOG=debug + +# Fake secrets for Trin bridge activation, not actually used in the used `BridgeMode::Test` mode +ENV PANDAOPS_CLIENT_ID=xxx +ENV PANDAOPS_CLIENT_SECRET=xxx + +ENTRYPOINT ["./trin-bridge"] diff --git a/simulators/portal/history/trin-bridge/src/constants.rs b/simulators/portal/history/trin-bridge/src/constants.rs new file mode 100644 index 0000000000..2679b06b62 --- /dev/null +++ b/simulators/portal/history/trin-bridge/src/constants.rs @@ -0,0 +1,4 @@ +pub const TRIN_BRIDGE_CLIENT_TYPE: &str = "trin-bridge"; +pub const BOOTNODES_ENVIRONMENT_VARIABLE: &str = "HIVE_BOOTNODES"; +pub const HIVE_CHECK_LIVE_PORT: &str = "HIVE_CHECK_LIVE_PORT"; +pub const TEST_DATA_FILE_PATH: &str = "./test-data/test_data_collection_of_forks_blocks.yaml"; diff --git a/simulators/portal/history/trin-bridge/src/main.rs b/simulators/portal/history/trin-bridge/src/main.rs new file mode 100644 index 0000000000..0fa8db0364 --- /dev/null +++ b/simulators/portal/history/trin-bridge/src/main.rs @@ -0,0 +1,183 @@ +mod constants; + +use crate::constants::{ + BOOTNODES_ENVIRONMENT_VARIABLE, HIVE_CHECK_LIVE_PORT, TEST_DATA_FILE_PATH, + TRIN_BRIDGE_CLIENT_TYPE, +}; +use ethportal_api::HistoryContentKey; +use ethportal_api::HistoryContentValue; +use ethportal_api::PossibleHistoryContentValue; +use ethportal_api::{Discv5ApiClient, HistoryNetworkApiClient}; +use hivesim::types::ClientDefinition; +use hivesim::{dyn_async, Client, NClientTestSpec, Simulation, Suite, Test, TestSpec}; +use itertools::Itertools; +use portal_spec_test_utils_rs::get_flair; +use serde_yaml::Value; +use std::collections::HashMap; +use tokio::time::Duration; + +fn process_content(content: Vec<(HistoryContentKey, HistoryContentValue)>) -> Vec { + let mut last_header = content.first().unwrap().clone(); + + let mut result: Vec = vec![]; + for history_content in content.into_iter() { + if let HistoryContentKey::BlockHeaderWithProof(_) = &history_content.0 { + last_header = history_content.clone(); + } + let comment = + if let HistoryContentValue::BlockHeaderWithProof(header_with_proof) = &last_header.1 { + let content_type = match &history_content.0 { + HistoryContentKey::BlockHeaderWithProof(_) => "header".to_string(), + HistoryContentKey::BlockBody(_) => "body".to_string(), + HistoryContentKey::BlockReceipts(_) => "receipt".to_string(), + HistoryContentKey::EpochAccumulator(_) => "epoch accumulator".to_string(), + }; + format!( + "{}{} {}", + header_with_proof.header.number, + get_flair(header_with_proof.header.number), + content_type + ) + } else { + unreachable!("History test dated is formatted incorrectly") + }; + result.push(comment) + } + result +} + +#[tokio::main] +async fn main() { + tracing_subscriber::fmt::init(); + + let mut suite = Suite { + name: "trin-bridge-tests".to_string(), + description: "The portal bridge test suite".to_string(), + tests: vec![], + }; + + suite.add(TestSpec { + name: "Trin bridge tests".to_string(), + description: "".to_string(), + always_run: false, + run: test_portal_bridge, + client: None, + }); + + let sim = Simulation::new(); + run_suite(sim, suite).await; +} + +async fn run_suite(host: Simulation, suite: Suite) { + let name = suite.clone().name; + let description = suite.clone().description; + + let suite_id = host.start_suite(name, description, "".to_string()).await; + + for test in &suite.tests { + test.run_test(host.clone(), suite_id, suite.clone()).await; + } + + host.end_suite(suite_id).await; +} + +dyn_async! { + async fn test_portal_bridge<'a> (test: &'a mut Test, _client: Option) { + // Get all available portal clients + let clients = test.sim.client_types().await; + if !clients.iter().any(|client_definition| client_definition.name == *TRIN_BRIDGE_CLIENT_TYPE) { + panic!("This simulator is required to be ran with client `trin-bridge`") + } + let clients: Vec = clients.into_iter().filter(|client| client.name != *TRIN_BRIDGE_CLIENT_TYPE).collect(); + + // Iterate over all possible pairings of clients and run the tests (including self-pairings) + for (client_a, client_b) in clients.iter().cartesian_product(clients.iter()) { + test.run( + NClientTestSpec { + name: format!("Bridge test. A:{} --> B:{}", client_a.name, client_b.name), + description: "".to_string(), + always_run: false, + run: test_bridge, + environments: None, + test_data: None, + clients: vec![client_a.clone(), client_b.clone()], + } + ).await; + } + } +} + +dyn_async! { + async fn test_bridge<'a>(clients: Vec, _: Option>) { + let (client_a, client_b) = match clients.iter().collect_tuple() { + Some((client_a, client_b)) => (client_a, client_b), + None => { + panic!("Unable to get expected amount of clients from NClientTestSpec"); + } + }; + + let client_b_enr = match client_b.rpc.node_info().await { + Ok(node_info) => node_info.enr, + Err(err) => { + panic!("Error getting node info: {err:?}"); + } + }; + match HistoryNetworkApiClient::add_enr(&client_a.rpc, client_b_enr.clone()).await { + Ok(response) => if !response { + panic!("AddEnr expected to get true and instead got false") + }, + Err(err) => panic!("{}", &err.to_string()), + } + + let client_a_enr = match client_a.rpc.node_info().await { + Ok(node_info) => node_info.enr, + Err(err) => { + panic!("Error getting node info: {err:?}"); + } + }; + client_a.test.start_client(TRIN_BRIDGE_CLIENT_TYPE.to_string(), Some(HashMap::from([(BOOTNODES_ENVIRONMENT_VARIABLE.to_string(), client_a_enr.to_base64()), (HIVE_CHECK_LIVE_PORT.to_string(), 0.to_string())]))).await; + + + + // With default node settings nodes should be storing all content + let values = std::fs::read_to_string(TEST_DATA_FILE_PATH) + .expect("cannot find test asset"); + let values: Value = serde_yaml::from_str(&values).unwrap(); + let content_vec: Vec<(HistoryContentKey, HistoryContentValue)> = values.as_sequence().unwrap().iter().map(|value| { + let content_key: HistoryContentKey = + serde_yaml::from_value(value.get("content_key").unwrap().clone()).unwrap(); + let content_value: HistoryContentValue = + serde_yaml::from_value(value.get("content_value").unwrap().clone()).unwrap(); + (content_key, content_value) + }).collect(); + let comments = process_content(content_vec.clone()); + + // wait content_vec.len() seconds for data to propagate, giving more time if more items are propagating + tokio::time::sleep(Duration::from_secs(content_vec.len() as u64)).await; + + let mut result = vec![]; + for (index, (content_key, content_value)) in content_vec.into_iter().enumerate() { + match client_b.rpc.local_content(content_key.clone()).await { + Ok(possible_content) => { + match possible_content { + PossibleHistoryContentValue::ContentPresent(content) => { + if content != content_value { + result.push(format!("Error content received for block {} was different then expected", comments[index])); + } + } + PossibleHistoryContentValue::ContentAbsent => { + result.push(format!("Error content for block {} was absent", comments[index])); + } + } + } + Err(err) => { + panic!("Unable to get received content: {err:?}"); + } + } + } + + if !result.is_empty() { + panic!("Client B: {:?}", result); + } + } +} From 1f76b2d75c6e557b5ce4fdaeafa2e3b4d1fe236d Mon Sep 17 00:00:00 2001 From: Kolby Moroz Liebl <31669092+KolbyML@users.noreply.github.com> Date: Mon, 5 Feb 2024 14:32:47 -0700 Subject: [PATCH 173/387] simulators/portal/beacon/rpc-compat: add portal network beacon rpc-compat simulator (#990) --- .../portal/beacon/rpc-compat/Cargo.toml | 14 + .../portal/beacon/rpc-compat/Dockerfile | 26 + .../portal/beacon/rpc-compat/src/constants.rs | 2 + .../portal/beacon/rpc-compat/src/main.rs | 635 ++++++++++++++++++ 4 files changed, 677 insertions(+) create mode 100755 simulators/portal/beacon/rpc-compat/Cargo.toml create mode 100644 simulators/portal/beacon/rpc-compat/Dockerfile create mode 100644 simulators/portal/beacon/rpc-compat/src/constants.rs create mode 100644 simulators/portal/beacon/rpc-compat/src/main.rs diff --git a/simulators/portal/beacon/rpc-compat/Cargo.toml b/simulators/portal/beacon/rpc-compat/Cargo.toml new file mode 100755 index 0000000000..44de28776a --- /dev/null +++ b/simulators/portal/beacon/rpc-compat/Cargo.toml @@ -0,0 +1,14 @@ +[package] +name = "rpc-compat" +version = "0.1.0" +authors = ["Ognyan Genev ", "Kolby ML (Moroz Liebl) "] +edition = "2021" + +[dependencies] +ethportal-api = { git = "https://github.com/ethereum/trin", rev = "1829841efca273844be93adf53ab84c2d1a020ed" } +hivesim = { git = "https://github.com/ethereum/portal-hive", rev = "8ff1e3d3c941dd00d56dacd777a5dfb71edf402f" } +futures = "0.3.25" +serde_json = "1.0.87" +tracing = "0.1.37" +tracing-subscriber = "0.3.16" +tokio = { version = "1", features = ["full"] } diff --git a/simulators/portal/beacon/rpc-compat/Dockerfile b/simulators/portal/beacon/rpc-compat/Dockerfile new file mode 100644 index 0000000000..6a0569bcbd --- /dev/null +++ b/simulators/portal/beacon/rpc-compat/Dockerfile @@ -0,0 +1,26 @@ +FROM rust:1.71.1 AS builder + +# create a new empty shell project +RUN USER=root cargo new --bin rpc-compat +WORKDIR /rpc-compat + +RUN apt-get update && apt-get install clang -y + +# copy over manifests and source to build image +COPY Cargo.toml ./Cargo.toml +COPY src ./src + +# build for release +RUN cargo build --release + +# final base +FROM ubuntu:22.04 + +RUN apt update && apt install wget -y + +# copy build artifacts from build stage +COPY --from=builder /rpc-compat/target/release/rpc-compat . + +ENV RUST_LOG=debug + +ENTRYPOINT ["./rpc-compat"] diff --git a/simulators/portal/beacon/rpc-compat/src/constants.rs b/simulators/portal/beacon/rpc-compat/src/constants.rs new file mode 100644 index 0000000000..ff8cb6ad9f --- /dev/null +++ b/simulators/portal/beacon/rpc-compat/src/constants.rs @@ -0,0 +1,2 @@ +pub const HIVE_PORTAL_NETWORKS_SELECTED: &str = "HIVE_PORTAL_NETWORKS_SELECTED"; +pub const BEACON_STRING: &str = "beacon"; diff --git a/simulators/portal/beacon/rpc-compat/src/main.rs b/simulators/portal/beacon/rpc-compat/src/main.rs new file mode 100644 index 0000000000..9fde98240c --- /dev/null +++ b/simulators/portal/beacon/rpc-compat/src/main.rs @@ -0,0 +1,635 @@ +mod constants; + +use crate::constants::BEACON_STRING; +use crate::constants::HIVE_PORTAL_NETWORKS_SELECTED; +use ethportal_api::types::beacon::ContentInfo; +use ethportal_api::types::enr::generate_random_remote_enr; +use ethportal_api::Discv5ApiClient; +use ethportal_api::PossibleBeaconContentValue::{ContentAbsent, ContentPresent}; +use ethportal_api::{BeaconContentKey, BeaconNetworkApiClient}; +use hivesim::{dyn_async, Client, NClientTestSpec, Simulation, Suite, Test, TestSpec}; +use serde_json::json; +use std::collections::HashMap; + +// Bootstrap https://github.com/ethereum/portal-spec-tests/blob/master/tests/mainnet/beacon_chain/light_client/bootstrap.json +const CONTENT_KEY: &str = "0x10bd9f42d9a42d972bdaf4dee84e5b419dd432b52867258acb7bcc7f567b6e3af1"; +const CONTENT_VALUE: &str = "0xbba4da96d4600000814453665c4b46dad568d69d0a3d211c70829ce7c5c17549713ed0996c8743e6b55b3797ea19c0eebac07b0e163fae9aa71bc2561705e492dd206730e8d7e731e621d2d7039ded027d9910bd41b23f642c609986a33f46fb3187faf6a0abc1809811c919b69e9ecbe5c129e3bc6cc6811de879149bf856984cc2a5162aed445600abaccb10a1b48694f150de473b893184c8200c822abc86d3d8d3bab7918b55963553bf9be9d2144a36827db66449e2302a49c72837b3e793666321ffa0a45089cb5f6af2380686485c4a85aa460dafff2c2681ffc4dd2a57ad488e53e904734908fa7759d18edb7e58d54ae6565774b607fd7488f013b6d02cd13beb3ed2a41d983f02f7eeac4b7f4222474252ef4538b5b09c3fe7ba6899412839fb79588387fd75faf7225e9dfd65bb46a795929d1a6a83113cc89c390ef293f9b73f336157e2f4abd6867a7a3aad6cb0472e1f17a73f913822642688fb28944b9df775593ac8a77bac24608066588ffc11a91b0c85d3f078be13ff586f7cdc20a23473f7a8c800c039edaa2ea42e15be9dbd47638ff4389b0a4e7daebe365aaf47ddbc16d3737ef8f4ed64da4ff89064056a794f9232ab744f72c5ae7fc674890d07027dc5541eaaf8dc1edc8d8fb4d5c763053a53697d9e5100ad9afa1e9fc888cf1197ad56d34d0f290b5d73dcb191ca444671fa433332f9d451efa4623ccaa1ca061827b86eafc6f771e184c48f4a3ab88c44829cb86aa86516cddcbe07bb52957e926dbb7bea95e9adb19ab3f99ff83279b5e41dd5cab1b5ee617340c8b46536a4e0b60d7235423760c2a72910dc838457a5a6c2d96bb1fe3c8b1cc292af040bcc5fb030d407a283dab7cf28b5fc8f651afb812b2b138c2dc05c2606320fd82ebe8ca7843ab0058ccdbdac8395bd65df3327fcbe1d8ac52b5e8e8970acf53a46d1ffa4ef16a472e24746a05f13399a7613a2b483855e7d67348cc8b51afec047355d3ba2a1f19d1e2fe3ee7b5137b4d0d257942118700ce0b506ee1b8b0c542ac600ffa734a960b60c13e89d3f60c5de14e3a557159326ae0eaa2328ee3d57ee2406ae9dae30d2bda566d5e22a2bf051a5ca0485b32edb939b949a967d315c0b771ae169433c6b683e0f58e5a4d874e4577d8ec74ee5466491a61cbd96f3d8ae11bb3d5818fda22b5f7914e82ff54d868983315df52ed8ce53b438b6f147343af4508813063e68b6416ddeb0eb0de1c494f0b40211bdf757919a28ef984ca6091f15f5953e0c8250fa5cfe4f1f5e54acd9faa8b5efe29a5daaf0494151b73f6dcc9f8b08558535b1b4887d275cd3feac9424be96efd63191c6fadebe8825917b58a7a286cbdba16cb3df97f1a94c1e41260bc4980ec4ed34032e8c714fe1ff769f8a79217a4a25c1efc38714c68eee4b7f8088e75fc044349471caa4b7fe94793d82e46e81f7bcac3ee933c043bcafb97882ee20d9d45d7c459934926b3079411afea06ae8cba6f092824313ca9998e067051b638b77ea5b90fb69af4ccc66218945554d9b78c3a5ea25d7e4eb9d68bbb40cb99176dd8ced6478af77e10570e5329683d66a2dcddfbcfac27f44ca51e7eb5ebe686e3bfae17a8415a2a13b29149c4392e4226a31225ba4af8df06e20d34c0a0b50376c28e0ff61f55588f8d77e481a3bda3eafb6af54015a2fe2b85c1292d883e4b074123a873f7bace327f77b37239841b1849e87fcd9f1f4c0b5e02ebaac21e3fda7c1f6e5c0bbde58071ff0101cb20fd117b265a8e87063f0b4c0ae6342af61107c2c2d0c9a68b39e8e609dcaea876bb2257d5c5a1e09c0451782ad560b8be7489a4c1e446b1fefe710d1b5d5fb2960d05e931f6fe0b6b85d4a9d4609370308774952614e889827eb7fa6017d5ab5285494620d2a3ead19245e4b6d389d503e7fb3faa7d71eaebd63d106bddee15ccbf80221a12d4cdee182fdabfcb8bd84db3e84cfa6b67d20ba17b7f96f2c9a5206dbdb251094ea01b174f664e3ecd145b876db7b5f900e23ff823e32cd19ee8a2dd30265e196615c6ce66d688fd344d68ffa7a7ad53e1570e5849d06a9d35c26cd41edfeaba7c0fffa5e2e017876d4a10453c906ac9f569ebe129692d49e6d4bfa42a4fe8f0838fcba8107576fa0b970433e1930c575f5827593bacbf77162a8187f7befbfc427bfca2273d24ddc67d7dea6116a1f25a02baf10460040120b6570c01b69a742d260351e64c1911daa80a4c8ca60e2c94b275c864f76a27f8edd99ae770d666f359cd4596978bbc50151ef313955cd867e9b1d4a76d501bc9999c1a5390cdc76333912ed4a3dd34290669a44392917052b1867d68f5ddd332f64e380d4631ded0ebecb92d09bcd7ac2a6f5f39e251f6b1070d614f716e2fb95d9f26aa8b1f8f201e6d473b2ea2624eca1cf297934720ce8e708b2cd1b992a9296232cda34f470a6d79f0ae5f2025f893bd15028988e14dd8074ce97010091de70685584e28bee1963f58a262c85df328377cb0c5cb3f39fe568684439916ec121766afe27abe8fd25ed47c06700b8629f27be989ae3e439aefec3861d3ddc2eab0281868e35001e26f98d7bff81c63c22ecbfb48060d0d8d1235ce28d9080dd2de2ac0408d583b8567309c4dbb0318dadfdeca8b8815fb08dd266955a05101c8a2432530535333ecdfb4f428eed385fb25a101c10a1f06e0d921978f3ea9f999459c488dde6035c1a6eca88998528f8e144b36320d6bb688450c9d394c3089d509cc8a906abb6c43a8b0537707c5bf7b1a9a7e573829fa3c9a415fb0001ffa4b4227e15f1e1f22d65996933cdf20ce49ceff76834f690caf6e012e209e34a4e814ed62d25b66424d5a788a4efc7aae897eb12ae3e51665f478332181fd04a995696afa831ebd6056629bc066cf36ddc88381d3c88fffd68e3cdc1fd9b06105066119994ae81040503f1f0a10c4153a11d1e609adfb9018431c31c1ff2807faab0e7af0239488bc063dec1190981964affee89ab22faaf23e3c24cbcc7d769e7102208d576bd26a640878650ca345aa680befa367dd105b3ebfd99391d53c66afd6154cfe7dd8813fe39059e8dc5027924e25cf94d13a9fa4ba1f16cfb442c8a8d3f898d141d9efae49249fab1d05cb3f9fb900aa0ee6aa232911822e0c17998201c896ee15deff92aab0c34413d132ab731c682c9f3b3d745e6c5e18e673c16a56c4646ec0c2ca04654bab28bb7a5ca579a9170ba9ff3e5363bce737acfdb1eac18377e33978ae4a82dba9bbd4419221e58a10ae80f91067754051ad9c16606b72752f43ecaeeefd9f0af140d0d4461a3d890cb07cbe2a9b001571001fefcc7f0e1b92abaa097e1566d5340853515a15fe4256b83ffe2b723e60e206b75f27ca1b99b1164484197d115a93f85aada209f8ab8a31ce3a66f23c820698febb8e95ba96ac28fca74bca0d504dca4cdba7e85bdaf7fef7b0f17d4b6fafe4c3e9810ee9fc1a83466fc3875eb8e22b2ad6e068b9b18bd9f60f9e66f823cc52a2ea0eea5a1c3e7756d82811c9da030bbc3a51c1150ca8cbf5ba38b106b185e0ac4331e8a0d653a66cad60427efc8b7dbdb817999e346152c197e1b2d61a5a9d7f2ed328aecab1ffee39b76c17dd3577cc399ac7c7e1cc48e4fac0aacc1451793db4f91b593f0ca06236425417238ea6d40e1837a9928af864d8b34fde1cee5bc2bc7e69bb9908c8de49df8c821f0fd6b497657b4ed5cde9502e86ae3e6f7c15189a96b31d30f59faa760de83831397c7f99cfc7e23f2687aaf2ae64deba1902f491299ae927ed9c10ff485f576cef160dd32c11e33003c9eaf468db444bdb715d97acc8df5e08e6aec88d91f747e897fffad73af7e05b0c5cfe23deb931f489763e876088841e9d7358c94619229ef27149b51f0a322200c103e80588e1f6f31a47f40b3b858d0995af11b99d7baa4c7cc145d58e14c240954234e32691001e9cdcde67429cad3962f37fd84a7c61857540799b8ff3d3cda254ba05880e680230712a0618054dd0c89b862e419172a0282277865a2dd45e14a49e31e73db870d70f238a29546e54eb601cc76b8837ceea671faa84f096bfb4b7eded007e12d2efc4f9ff8a421b2000a75c5a01695ab33f027429361fc9f46d0bd883d96a1f9b4b329a9c7256e45f13a298590c0ad15e3c16c73b541bef836e81ba5e18c844c1165fa23932c40287257bedeea72af52893990bd5a6bb57df63a2b6a1565680945f87326e38508918c0020e7f8cc2a26e381e34d8197cc45e0dfe975331d65494aeabece73b741ac9b192e930439dab6b62b91a9dac9f909d78111dd62a5f0561f5f47a9a60c5d55f309ddd4b7b94efc87dfab8effaba010041abafb8757d0f681e1a25939cc5ecf764bd83f2832653feaa0a18d86336aed2c73c84199afdd03171e74fc96b865d0bf7f4f5a54c15c823f27b209b5d34b64cedc5baeb0184b2d9524b012a2e4fd70dd539db32f6964c34d16399a16c5499597423149a97723cdf5b5deb33693d456213793adbe52ec75ea8934e38ecd9299ff8d57ef12e9b4e14806d103954b86321ea42aad93daf0ea876befa5bc2a7659b3608e9efff93a7b5201478798d65d892aeae9ded2fad2ea4007c0cfd35727d44f8ca4c7a52b4e331621e7dab1aa1f7aec02c7e7c3ae36489b421042a9f331cc609990c589f1048c10d1ff1873e9a871477ec91acfbdedcec1cc83e70447a117325ab16b1a69389f4f786acd857064e82ad1da1257e3ed9820be84d6972a5f90ccd96c6409124c845a3feb23a7b862dd28e094e2620ecc39fb590e6cb7444e66f202cf8922ccc47b807776a672aa35e4434e27ba331d0666ee19b472556951fa250b021dce47ac13a33264fcb87597ce6a7d66391d19da9758ef1ee7d19e1f774ce54c5e92a487735cbffd941210fcfc8c42b7af9fcbe376863e4e919916f0d0ccf8fd05d1d7b3b41401864f4c179bcbdfff434dfc4dc4171d35ce0887a0ac8e3d17f150411a09a74e02e47fb8f537f3add4377e0381015a79a5fc12fd86b521dde790030f0ddc7cc34305c0bc5e9e3b22460d405a3cf28761c0e7ada75fc69d11430c04bf856870b689e40491f49f76d18b6c62ee4a4937d2506e5658b2e71adf7fc9aefe03e6fedc0251a99760209fdad863928ff8050c39c8abeced80ecdb13fe10f0f65045f2e2d41958e49bbb4c4fc1c5fc15fddc7644e5366cb4e4416bb1a6afda3a8bcc5f7c51ff01135f7643dabe355f4cc241943521cfd15ea8c2e51bf44e17354353436ea6059f90e393790af9a011bda79f84675f83d3e4ab18a7530369a953490c20ebf4430a5398bf4738abe51a6e43974999d316259501c60c8d3a4efcbe8177833c67658921351d44588c2339704b9d6bcbe30f95b94328cf423be2fd387321e447dd5571a0c1992d091f4397fc47a835e25c6355488cbf4e2a06984410a8df4fb8bf596927531d59bb74f72e147453de54b4b82c99b836fe255878b4156eca6caac99209c9f0054f32c2138c9ecc834a2640d8ea4d6cb521bdc12f12d055774414ab86f995032ef0bf03ad45f1403161b848bd4ef4400e1778f32f5cba7274ffa117a1f3c96fcd6f0e387af6302ce40ed69cdb50b88c76388a3b80c3954c710f6617e44a986cd65909ed542614c1c6f80da78461192553d6e077e9bf8ea20b6016cdc0c995ae07bf473df39af8d0dafa160f252d58d394930d46ef2b2f0a7d1e48d8ef2aaac8a9ec0b7f00145922883de52436598fdf1fba9f1283d31b70ce0ae4daf3db610d970ec2582863e40458de4bc082dfaca451d756ef83a93baa3fa37b3f82ab8cdaa487087eb9175d846a789099e344b2ec58eac67185e6305a81f5f691330fad31715f8fef45e835a9da43a571a016a35bae46b3415ac704c66bc651fe079c797786e047187eb8c3eac665b521beff69db528d5a49568f2eb0030ccd6d5e19ad4adfb271ed46d44024356808f77e16573c4f0aa225694857c34c5f00bcae4ff15c91bc5917502dcb84b78f04e2627794268b54d9a670f0b97d9cb3a5ec637c0eb9f0922a70ba445fcc20710c56b7b05b902262c081958163c0036ddd7aca4daf4814ca4fb003b3f59a76adb7390155e0dd635b8c04ca59be1a0768463d94f49a021efb43645da70770e4b2f4d00bacaa91df4572fdc8903ff47df32da286a5f14a3ed8717e537b640aa123f6b64e5db9ea7e3abe9907fca059493075091e10815eb342b85326d35a5d978515882b8258c71ad6eaf9eebac6ef8284e4d7925d40b48fb1c4ed93ab6b4bc06411cc178e8ecea37cb50a7bea428417ab63dfa931f0885ac82f5330764294d0297003418e70fdc994adf9d0f23486520b8caa560e8c78251fe9c95861a45050797db4586e18d968f6104dc18c6dcb6652ba7f5f8504a76cdbd56c2fd9bb5c3b33384ff6718e9cf70fd97b62a4a2384807a6d5e9151e890ebf9e797c61b0eef785cf25b6e1f930320cf1ed97cc43490f3318d74cb4a5835e742f8ff9abba5562e791eac25fd8450b4f5458fab279ba50b06e2902d04d1f63dd6d08f515a87b1f13822f7fd88e464e384b2ebc91c2ff0a834655c632b5b7e3099132fe6adae081fa6d756e57949bdfaf00a3474b5b4b47442d160c66ad76d9bb755b144f49553feac5e772dfcaa944a31f4ecfe989ff4dc092525d7e95eeb938c87e22de2e18de8891db8fa0aff02dc0c936ee1c5846f454e6dd5a2a8a84111f213242ca48ec4a0ca42de208114b425884bf754f9891a511b6e149009346e2978a89df0394777a636bd6d6cc91cd06cd1395d9c42cd5f278e1ed46ec4799910d6ac90fa9fc346a09a83a27a096602b4269da59eddd4ae1c2f3f30cdb05131399cf3c50c913c683ee1a95ae748b674ccd3ae95b037aef9c98bc4693eeb2c68ec35bad4dfe85ff73b1df1584d3c99ca62f44bde2d01b4a1a20ed9e8309042005d373d3b93bfdc4ac7899a2f4fa9498275caa522098e7ac5d756414e3acbd875643c2525229105cd82a32669590f23573755c92518134dc29ed20ff7391a7d809a4a90d4f3ccd98417306079861565f24088c9f7145f44093f6dc62ed87b0b877110d22048df35d11a9c55f0242a1a4671ec29a9089afd2f394cba94281f8c21f56ae82332b7b04a61d99762498993fef839a27bcc305b47f0746f24394920e5ecb28ec54e49e6a6207c63fdf445b561ae777a5af4717bf84bbcbfd27b47f5a72308e46589dc13056956be4ae308bedd8e7e8f0e796679de5855aca48d26dad61e97f1b66681ab7d3277c7f77e1d69643db6ef966831fec812c326dca60b33f317a1cd6d055aecdc40bd5bd2199ab738595dc59d4fa794d63d7758c06a4aac989686cc8abd3c63122f089cbf5398e933313ccdd960903eb597954b2749b848056b996f5949ed81acead2823d11de1925c547b07fdd7a0764e65d42ba4cfa5277424bd750b6dd6a446752b4b8821949fdd4460c3ef0340de7e9687f468a9b77105354b55bc5eeffba2a27d845f79b7396446353efa313d4422bea82d8bcf95897b3f15aba174e91059115e5e0bd02dd9aa92397f35a424e925c297d70be682f17c470035b58ea2f17703c86333e5790dd1630559e4d4a0313cf7b069bb2467ed1a53f4ec4e2587c49d582a4b21ea988e620b91bd4647297050d64aec86b628bcbafc2106ce8c6e8f52101c0fbce580b18b309d3fafef0c81a3f1c7ffc66585b007270b3868a45bf9168ecbf82489324ca7c1feb0f99b27f9d9a294481c95d5ccfe1dbc888d1e2c4c506d375cbc89925113d25c47ffdf60818744c832a7abc4ab36dfb4a13dff1d2830e9e6fe3fb843a442303b1eb8cb8778ba9b3fbb273a8a91f5e19e09fd2a37738aa63fd26a0b630bb3b36c219b79831562877b484273e72c8b4320ab00d328c3bb1854c99b6aa8e2ee69d767cd5a205c8982ff75ce1a7a46cdde1651e3f8f1bd79ed3eb595e9efe010d59ee3c3fa9470bb03c285389790f8ab442884e4d64b0a479066e1f62f2a1561e0012e44def9309af5566e94d68e4f5ce455ba4f9afb0e662287f87b5b96e0b215a1b9baeb8fb46a52e711afacd1ba7bdfc50e1ff7305ab07264186c83ceb77cacf008b6c10d56fe1f4610cd05844f7e44af4f08e7d7d0e8f55d0f3734956fc9287e2a8294102c2d97ac21f9d741b32c3eb9086bde7712e164865bbf1a84f14d48e0b38f98ef54f06af33c916db45e6abbe3370c9e47c5a5f5cf73b4b784e47bc3f5574155c804c18ee4954f7e89c50ae9ba4d03123093a6500ded8a6118f7dca1fcf62614e68f38d2e598c54a065f228eef188cb7aaf1f41df6f3d4d788a88d204e9e285034a0c6c5b6b894e232b844a4696a3ef7d8f0811e32f6bbfffd557dab2b588eb918d8443d0a9f4a7c82b42c275bca9865e7ac38ca3e49dd150fe2f01fa8df60d6f581f050b3bbe0ef416ff657db803c0c4995b9b871a38a5fab90bb90732766d35452dd0ac64971d75a65d744baf6ca2340c26934f6527c29665ef128f17c20d8c1fcca12fac9d898893a664c600896a922ad526c6283050ae67863d2ec2f47eb01b1a3e19531a2213078edcbb953b57fe701f0445e95b6a78e45d1ba06e3b9077847e1017f6085f75d3bf0223c98fd32000d555b73e6c51ab57246e15d22531693894f793cd27d8fb68355030b0f7a357ab43192956b96afc377de9b07c41d30a6a23f461c47f40d5e2a023795c06fda75737e2a5143d325b86d62aee8500d1a76c1a96269817f465ed46b40140b7d892b68ab40d3430cea6f598b8279625deabc631a7114e99e43a36c83fb7d37a70d742d297b973fa7e0caf2b47ac62f0750e0c22a59ca5952ea74f0b59e16a1e3ce1b391f1a9f28345da7a5f0b37064ab736772f7941bc9b7c758a4c56f1fb5455ee551f5e9e02e8de051e339bf90ffbfa75c45319cad15e2c5aa87b98b604568dd1eb46c9b92d553c5c4268a1a2e44707b3e6538ebdfb5f504e73fd80b0d971a6c280fbf80a35a4723b9e1db4566ae59354322f6a6a2ef45c60ac12ea88edb34c90fbdf7b8bd8708cab7bd1a0b29be454c3479f2629c5018fea8285f03390c355e0accd89f6824d449a38e6d0a2ff8690da806ee42530867b3f363b3d49e738df1563c5600702ecb5bab1726ba55fd0d4ace1581d4f4108368b24fe4d4090b371052098c4974faa7e46e82cf07589822a39aba6b03c2f19746827fc4d2f2ba82df5923d5e2876872d840b657bb2646c9713cd61a83510e5d00a754fd43eaa7fa3a2509a74bc7076096b720b73ea207b4ca9aa638b78f4c0d4a4257fa3d3de17c30507af0a058d99db8706820cd18dad632b954374503edff3191fcbfc5b2b55be2b0b7504de5fe097d97147f788b55f6332331101ad4204cf5b18173d4d0809c7d9eec152c5cacc981b25c8aab74e3adfc472fa13e6f6b3212bf2293f96a2482ada1f4ef9dc524c2499e970eb4496da67b6948958f998dcd398b3aed89d5943d1529ffe74cb7a7c2df90043a24ec03fb8adfd9ed6cbec980b54d199f665e755060c796c9351353a23aa988ceedc8cee0d73be4ed1e3fc765edbf7d8dd5e102cab4181e53ad02a5fdcca3c534f9110e4e7f292f5f4aa5c3fa49ab9877cd3b1c6196f62ccc3f8fd616e08eb364faee03e79b96212a1f1887b85b3502ab1cc20df3480d71aa3db7f60ee2a3167ca7a530698c998ac2352f5043b632650175dd345a3bb805c2fb200eca4612732d72fca8a5501d73777b3bba9cc398f16ef01998e922d41ba8b0bac453b80d453b7ec869bd0d79e9a87cbe0fcbaf47a11849c6695f3b877ec1df5cd248bfb2296192da2af337d4767bc3008ae01b8228d94efd3b1adec17a5f9b2a12ab50175246356edd18bd8d5b363d1bdb7f58943d8bd84d91f1f324a74c654c6307450612e94635ff12c03f08ac4d9602e231bc81eeed25901c51e8c786f66448774e8d79492af9721ddf0e37a9c168287307f2b519864c2f897fea1d8a4b53bcc9b2c5ddc91c84b8c8b090a09da8fee5f148abef2304a840444bc005dd7652b89ba5576f6481891a8a71397348ac7829bf53e3c58e5e095567ebbc9848aca8f2b8d3b6c09af750a10f6a47bcc6a45480820742de945173cf4655d93916154597d1b8de6b5b01f18db2ff6176f0cb89b68f62a1bd48bf7ffb44274c599670ae58084d57d85f244811901762194be0023975a453bb177f136ad9495e9f24b0a781da39ab7832855952722ed031fd1820aab81752d67f23f30a6e3301f3729f6cb068ec65e1ceddeec8b2c163e8624f574a65cf8e7b81570277a08e035407611bc2b136459c96dc986f140dcca94d6c69784c79ee9100ec11d240f95c7920652b63d056b35fba4582471c23a9e5dfbd717a689d9776fe49d1f8ef8fc43b530597b6cc734edec8aaf1c19138f7c65b21766ba935b11ae420d2fd0945cf46e15868805dcbd39a9223c32176cdcc19f49db6ee857aa5b6ec01185255871c4f65edd837e51082cf069fbaf7c841f13eb91cf801ad1de660a0acd43fa5b2a7c49bcc61b744b05d25cc605c81fbfd829032ac6bfb8f328685938eedc8919de180badaf8980ca0745b79e18bfaf31ca778080ea486602c2f9b80db583b32c07353f23b31130770b37863f310ac5c5a9560b57430fbf5fc37359e66735c5867012f7059418714a76fa7c5cabb914f3f9531e4c8a0ff7f8bb5bc7b263660982be7e50e565c0ade5633d94f5de6c71ceb4af1ca4ac2137bb7c02f34d88860e312681e195320727fde90f17f982d04076ab3fdd2357fdc2037db0ed17506f194426e43b065b70ff8460a6234a93d0a5c54024e1c7593815c108cf6d545718b06178fdd7dffdafd222c94f649948e1290cb85f8b166d82b7ae97b3e3dfbf3d0f381318b0a15eee35bb3877e3b966181b5b521aeb4ce1bb11554e7f56d9065e4c849e2046ab6470bb9aa3fc407b0b676e60a60ea7570b3260c7a987a5b2e949ca039f3db17608b6586c169099482869b07f7325720e27f56d07a4656914b5328648296fb66bf95b76578a8fa4fdb83daa7a395008149fd3cdf6fdcf1c80a236b3a1a96e511898cb24b631cc56aa7c7173c36162bf4c2e4f5afac8da6c4385ae6405e88b25c719a464b9a6eb2a3453ed21f62728750af1ebe768c7205e8bbbbad32f61e1ddb6bdd2556b5b21bdaa11dd85717b5eb28d995889ab0b839d8c4a6183d3804cb4403c361b0b1d27bd0cdfb98631ada8be88e17ac77f2a697ba4fb4d98d96c01400454e9d80ef89d29139079ed143e50151bda9ff1f43eeadc6cea6e693d74f4cb1cfe09696d396c25ff629064aa2d8fe449bf9702b19634605d66471b2f74f6daada1d0528fbe4c76c5ac2918e48f0428f0d4388073784e68fc2c0cfa83bd1787849fd849762ad5bafe0ee3ebf8b0599b5a98a520a5be01732d5031bf92ad9ef0c235c582f4f970a502dc4e38ef8bd6e7963731a8e1fb1f2d8bda64d5989d9b8e8971140d5fc36ca356330ae603795e61ef15758b603b9cc62fc0fd03adc9988a7f62b6a18b60eccd1bccc3b27f03dea73d9300f38d7dc40123b365264b04aad43e6857ce22584d3ddd0646e318e204412350dced56e02bb8f30ad1cc553be2c11c989ad8969ebff9c3be0db0ba9cbfca59e7b053463a5fa16ef00c33c308df36f2a8d994e1d1d12297eca66ebf0295772d0e9ba8e6fc8d6fb36d74b86c4459ebc2001110da0b6273d04f8b0c23a16f64e405d72515578b0f2111a7e9c438fec08c60e21b42e396bd9cbc1eeff6e374978fe3e39d75e8fb3eb96a6fd485e4ce9361875470a5c3ff43a2efa1a00a78fc104bed02130fb180409ff8d2a8472285a0016c50a9a41901a4902c19f21e2c120044eacb6c48d3ca1ee79780370d47f296d8cf2b8d473b0e0dcd5feabe4d1d42ae77e7264cba987404969dbe514d2b1ef5b95e06b09d2688f2503ceefb50d21fdc4a897dd6deb6c4ca27eca219c58c1182383a04f500798a3a714802a2fd33cf2cfecc8719d925705e4fd8c491932131413b9f5498acd0463b02d4e6345a4f5ccb2c95a9ec60ca4f6acdd6ae0f2ab1c1f78ba945fd1c8d0d77b374281b49ecf0fae9b27afd520e577c01460bdd07ac1c521f94f3d21c4a87871ea9dd103323ace0bfd122a4993cde5584b69f58f2ecce55e424232db799bf2441aae86c51d22c8c9f4d17b94f786157a07dd8701a1dbb2878c3e6b3911a1d716160e45f83e7565d364d4b3ada1374b7696061d42552dbcb7647c8e4d91ad3e1846cb902c373b5b36e5a09b8ef95628c6c5f846e954d6c02e446210ae89385453948fe1669e52e185f7104efca5b505b14d17c0e6f9719ce4b22f71da941caff7827a8311a0a366afd8d274c76ccaf108626260bcee8f9c0f1d8bd5f979b6b8282103c2af61aded55e0f5a80b2b192f12c42b6929364648d9b4b5680b0ed1a77a21086910bb0c041ab86fc2b25aa395ecfd5d255413eac364998a091181ecc091c64050fdce03e6484815e580f21eb07e6267719a0d88b2291648fc9ae9ab444a5de7e5aedab55d27ce3f400c7dcb57bafcc24a30daac9eae10503b52054ccc8b18220418a850392bc20ec3f768b3a6a236fc237e0a197df2a164a3e49d4133423226783f49c7dd07cb840d128eba5316878e0f85c3ef30bad7ca5ea8a681ac8f6a216abb0d90ace55f37c7179797e8715c5640a0daa39981fa48ff73125f2e1ab1591402515f7ab7b533948d7987b3f237acb2821f2746099d4b714fa228fffa92f42d0c9929e912ca5eae07e07fdd35e62de79ab35f49543eb0a03ac1acc99570289106966173fbc2d594cef0da9da3ce46c046802c1716b380a307c10496b2bc330c2d146f62ca8d5dd254e58fb846bd1a3e50a1faf580735a473f6e40ce67a4696a4612098ef832ef13a82e756bf9b6431a598a12ca8fd80e1c1c52b6e66ca01f6331ff5bcd1821cf35df7e1288e3d72ce727ded3ad0ffee267e28737607c70aa57f72dc4aff85027dd2095866d46b070b26eb4cfaf5b2e5591e9898acd7be659d7780f9de34fd04aad926dc2cf06cbf7992965e7db0ff906029eb798f09924500a6ea5454425783a4f8f6cf623753e36f13f1487d4909bf552f60b64467def6ba257ffc25aa955b46ae2378025acce6a65e90f2ad6474c09ddb1f24ed893baba3facfe0033fe4e5649357d59a4077684a69df61933829bdd84909ab6d684ba7bccc57b5d4b67aec5a1ccfa2c858017c579cbed366c29b6cd1ce009d5879ffba0c650dc18e683b9610e651586954365d8dc567dd0a80f7785b3359e6371e699d57c61c08b9f65be0a23be376f5241a6688b918bf67f32e4576d58a6af7851edcb66b6b8745fbecf1064cc60ee6bc3de69b18cc411733e9a6af08115c2049018342146a9e518299b1e1631d9a2bcda23078ad50fcd658666cc7573031dc837d59df6836f02583ff70950c495b82c8ac1c7c1e15d9c4c83ac8fd9dcbdb44c81120f1f94695aa903ce6db48950003a556b7dc06627069806e71398860c3b619f1060a774e16f4b6dbba5c6c831a8a95f290e17b178dfe3f935fa9e897559e2539e4ba3eea81c61218b26c931c8a1224895f1de6468c97a89d14e5cd400845900af012b4d4d6e29f8a79215b052092c0a9e158e43cdb839c176d75e6e39ee6083494547cf175408d7d2effe17cc862f1246be9434d9e12b490f186be8f6ad7d3c7b5bd068ec6ef7962f49207b05af20eb5aaf7e99f80408556177c7a186b7c7432bdb577d7bfcdf3f485b91a57b60780d4dc41def326e3915a319aabf3e82a6b9708245648314723d2a331974f2a6bf02cd1af9dbbba3ebc42cd8d743724a4cf20eceed48902d52b9ab9f3c3e18f2377970a3fc5c194bd4cdf57c51e2278187b0e9a57f77ccbb39b15d7bcb76a84b0defeae1cd30b59f1c1e41f78f665e6d0a1de233b6d37a8bea9a3bb7fccfc9b102ca6fd636e48a71473c867893ce71f783c3659650266911965ad2ceb2003457a5016281f672f94644c5b58d285f9784e53a64021f3f48c949db5940e9153bf0c34d4ac8ec2628eb792535dbbe5d4547f97606e8d0811a4a342fcd95040371af516303c686793e16b51c8c107b6d1f22b60fc13ec118307aa1bec5041f5d0a9d6c7ac570632a609dae75d58a9b8004873b5f805a0e08482834477a8a9562482c88a9288b48afc8b2624b975f7a0637a5da4851cba6e5a751b891c46f2e2d818f4dbd516b7e6b46c83e8246d0aff2459703d9376138858c08d86ef6d6f3228d44218eb94244698a0bc448c70c340bfe857d4f27e988fa7467820742d641d5fe2679602bb5a146549e0e3e67fb6726d85834950e5c53dede23e0240ee9e3b26ca6cbd9c74562d77cfcf94b4269bd5cf892698a91c3ae42726ee9e07c69e6e38803f6631fd69c2de4a20c4f214a774a8b99eb737b4e8da5727b9dc0d0915c7eee78b1bfb42b9825b1d2c4c9442c952213d17cef7c181c23487149b5b681d7159ea45450e0f25e71aee4b9b50032f86ffc9f36ed9bd7ce63d688b9d8c1f084639bbc7c5262e9e0bb9eed8f7ddba446ecdca3984cde5d0e6bd1195226ddf47c895a64b44f27ba82218c48eafa271502f0705ff2e6f2cd291479c623b3477d67712c94902cca20f4d6dd7e09b1d252effa7c3800e1739f1fc220b91ff440bcd4500176a509889a104944318fd4bb4805d748b8a5a09656e497b46e4ad5ee6bd9477fc41cca86b66014c4dabbdd2825ec7256082774a6fe9ecef481b98ecb3237adeab1f476efe315fedc0d82356f60cc17f8ec26d9f565b16380f4d93f273c26c22f2a2c25c2b03e6ab418cae19711b2cf47a297f51dadab1dd129b0cbf9883553eb7f3f052a18a010f802c2d4d0fb40d891e4256476799d7e11ba0efda9aad41939a1498cc7db0198b09411d1760388527bf4a972a7a06cdc7d211bf85248cd0b783624e5c836c2cf3e1406d8427001ed79a8663fb9174d20d2a6c7adf02b5a0e1d4f7446252e082a0cb1bc524cef2dd07a9d5ffa7bee2f58d8579add29521a9ddc944532622424725bed49f2a6f047a1c770ea9bcbd8b9bf99e3e7ab09e8289b495780a2eb48ec0c45430942e7778dcdccb1de1411d40ba7de1f29cd3270d63ad58951f58275db500eb7c7781843cbef8360837a200b9dae2ef916de0c7c5c5e4c99bce7c2b0f4ac3491bbbe14c01f9e09717e7813beaf694768b53ff3e10dd2bf72ed87d239d8a7c9be4b0e4cb05e08bcb8d93819e197a462ca20b84ddfc071566f4124668c6c0f3f821fb2fc49d1587b58c87f56d3bf1aefee1868abcf44968cb526b7d572e9524bda19d38b57d55a13e529f457e1e2b2f8141396d01461774e350c1155320997151e870cc57dcea9dba96ae9962b0da0e26f21a55e8feafb8ab6383620d01c2b5564bcbdff7f79cd43034846f6a2b20b3da0717f99d394ed1e89349ca3d08a91e5f9595cb8ede82e07bffa174a1c99bd34887850917f10af5ade7e2bb7b1676b86d80e68492b838d6aab7f3f38f7463f2b944c8c2e8f050f93dd47b1ad02e3d7d3b4bcff207f6607eaac83aac5c5aab88cef53f6cc9c25ebcf8e4dbb0027ee977265e85dad4d35a70af240e1714eafe427ed99e7df48dd99c16e9e9a4ec56b0ef79b829d26590cbcf396bf41e06952a3ed7594837b434f5b90c166508aac0b6ebe8141e177e60caf14fd1acdce80c56cdea4182fca2da0b30ab58cff9b80a73302027f19aed6655fd9a86f236bcf134917ed8d7525c3447aec2d2207cb6c4b6761e885b59fb113824188068c32cdf08e973e0fc623e67fbd5bccecbf1ed00a0012df83dc254ebad178b28601d8f8eab90fcf97ff9d0189f9588fbddc7a1a7ba27f1c20427c61a46bdc2873bc8ef8c546503bdced0742951e3dc2a1755f1b0f042c14d5374d68310f10a87fd66287409129ca260d1e9aa34c0976f8cb5bd8d2daaf2761b36a5d3001bcf5fbe1c9b2b3c2b59013d6249a97f1708eead3eef3958ff9086e58e027aa039887b743eb03e02af6d465935df9605072207b6c595f0d9ad56896f010c8f7014cb9eac8f2187ecbe589010cc6563c2d9799ce3e10b66c546e9ee22e814c80d911ea853de53e83190286a87cf262d96441825ddfa696368214fa6dc5658e2c7aefdfa1644376b467bd295c9f1ac597c3a9e8011f03b02adda1cb0f77705a068d6ca6de5eace04fd4240d7972c777453e4f502f0f8d6f7861748250e448baf04f53ed5192ca782d008ed4159215c1031c37876e15a28988071384783d0983bb111940b9881f9c3b4864d2d220d742f9f1dddcaefc58bb9a27d30142b67fb074df8e9324c7bd3452377b6b761e2ff614c6f00e476fefd5396e6305101926fe8d6d48ce6da776b839ed7e1e6e64ac6bfd4dc597c221bb813c741912ec952a1611285b0a001adc61e51b05715129f9682252cbc8d40228401e5b8da773a3b44b23115d908ed8864b6632e95b676914634f4e779b76c4d920b0ac381bc348f2a7b496b90a4306b53a4ae2b8ddcc99b5fe0a10eeb9dc2081649237d24d52095f388f0baf408eaa1075ec09da6eed829ea2031cf95ab4365c9b73fd3b37305aa3a08964c995fd3da9badb11751d98163778a02abc1a08e1d52a4f315224371a8e582bde2ca33c0515d238927e1ed7712f03724b6280ec30f71fa84a30974a54bc0fd48215b6f062216407db840ed952379fc0a8a8c8a24bb1cad4c6f25d00e0f5a84252c3b9d11c2646de4b17cbf2c1cc6d651d3d479014258da22d75789291c510d28f2289b947309a42a0d8ae0f44a173c4c9eaa09893a271d8d7461a774027c234344c4c230ddaa857e1bf4dcd3ad3735f5b4d3448edf90c062e85055588062916434db91a0032c35b6d031425ea9eba1fbe4b3149591c90b5aa94338f5538dccd2654acfabf47daa81da2909f0988ddd16a61b2d4f6565ca852d94a1332f0d0c87c036ac4a9c867ad26030f216e054c9402a49fa5b406eb658e5f0ae9652c0c4575f0872d6065c0264afe7320ac52c3bac84b7285d0c07bac6eab329fdc8131604afd108707080e8df0375dffbc5dd180a798a327d50fd7e2279521b2899888504b9a33dcdb71f89e61093e5f128b5515f00eba90b8f0123f4edb0a485bc1e754e706b7aadc93d89e72e37df01ddcfe622a9ac8e33a4c30bfb7ebcd14296bff62d931007e62c97690636242af6d9875e260faa1d1aa4de4d906c679281d298ac932818fcdbf1ffef2ab9287cdf8662b6a6870f46c497d2364c0cedc1001f3d3ef7b34843f74a1e573a15d91e00ddbf851b3802f171288e0f2fde77937efcc50c2526c5cce34ade8478b148ef19f9454610c2fa62d8cc3983163be291b748dc4ed563b853fdd82b45d0533f5d5585b8d25f6c08f2ab378b803cb0e7802575fbbfd7ebe91c429db8766bd825f3b8ff98c76cee1a76105e2ff7685f4705499108d920dfe2389c2c65222f4ad435c78fa86ad94bcb34a168328161f74c445c8df82f296c5a6fe90d40c0b58d67dd0a07890eba26e2e3ea159ee0265067cc64a364eaaab228a60a9d4a153327cea5267f0aa7d6767ba2109727c244db2ac2d428e1442c200061d33e714976203a663913cc343b973a81b47c0a6832f5e36810c31f2e5fb9726a2a2c8bc7eb2c052125b5c287cefc7362c646c50427b721781d5fb006d018683ec7cc115ed664284748147adec635fb1d8d7e2f355239cfc55a325865523b44b795d389b21e93698eebc368e175b69a5f5faecfb58b96759b7164f193bbd5d2ecf5abfa2602cc23697cfddc6cca661ec574ca2993393ff985fb918fac4435f8177f1c84b8b51b98ec2c0a3e4c36fb09a181b89d93ff4082c9bdaae020a647728ed02ca1fffd408817e63f6d6f0d588873a25a3b8c84b6b6e9d1890ec888aa75eb293463848db0856e34a92be0183e2eb6b06e9ae045d7b9bf9714649fe70a1a4a0d348dab35962e42989d9c2ae38f92224d020ed5f851a3753b581261da8e2ac9511fe1ec0bfa29d3dfebf7a52cafc86ca47c3d25b89d850b20dba9818b375648562e28f93efbba12cf14b7a4203eb946d497b2db4ac73952e72064a48d6e894a35e5f2a82713b81eee2a2c754bc6ee9fa3ebb180c6bb438b9148c53f40c5076098a89a97be4952690c1f5635671f6917c34fa089850b77eb0a4b323ffe8abe46d9f16feb3fcfd7f40f2ded29ff70a9debe2531f343d0e1af3b0764bf5969d8b9fa03429759c29d22701a66bd246c6ddf5939136ad5eae6fa8775dcfcd28cd4e42ff7c8e05a5cdb1d99577a28a4b37aafc0d3f1553e2d2f3a31ffd3a1179e0b0d4dcc248b3b0ad89e3379aa1e404a85a9d33e4d332b970391c22d72c0c128e8c60103cf9a1ebdeee02843e03db59e1e9b8b007dae8a5f12ba87744bde58a11a1c5fa8e137dae0615b7ba3f2b0edc6697141c4b5e4d2e2c00bdb091907501ff54277e541ddf29897d3b90b45de171a78f54f25d7888bff7d0c5b0e3b061a463a093042a9026cf5112142cb504f9906f35cf99ba6726f366315c01dfbfe99d7ef249132b0c3a687dfaf7da86dff39929ab822328798f52de6d546632bb5b866598868a8cb3bb366fd9da63845e2c893d992201349e422e5c912956f2c21ec96db9a7c27c9829f1c7096dc2685ef66294f47023bddc418f91a211e23b25ad2991bf3cd62a81c4511494fbe06f7cca4c5281e14307e52f9da671e7627de5cc5c089697437bb683dfc9e0dac291d47e18586e0578e1d5365961b44451e282f6a54b928b514ec459c54c96e18f98851ab7e15348e34f47b932ae50078019f5d45f42d36f0b76fa4a8f7bb57952374c8e9ce09020053f97e818e2097212edd14bc23e7a165296c4e7b6939fd0720a865e05029bb7590f213541f05cb8edb197e6532b88741eb78ffa6c1103e7be4565111ac12e5c3d34cf595df0700d2ec64d312dbba5018218cf5a2b3e571c79d89f066c538ce63c1049de02982e7e2589da2eb5276a751aef35a676702a8033d4b491e03edf1a70d9fb16c9808a67474dccabc91981d6a6824f26441118059f1f60c72c0ee2225fcf7acb78229101f02b6b8421c9def1306a9f452e304ccfc0f715de13d48ac05a3684a130da6440838a789e946dbe6c7f44c44ffc7fd7c77b9497229052882ecfd0898168232cb4d796781d1054973dddf04e09577481baf23b5468b95a5416c76f28396411e7aad4cea8046591f664dfaa3af8985727ddcd8e8e4b87308ad0328ca4294e8b94fa41b4c2d0b137f93e4d9fa24a301804f5338ee5661eaea06be44df99db421712a1e6bf81713548807beb5aed4a1d78ad06f5c245564d377be61744d0a6db264741d50560469a055a1b8593fbf80ca2f99f819290043d4a68248d47f02432a6cad46b49b945835b230ad0630bf1fa12f698804cb07fafaac84ef483affffda64d7d23edfee1e35955111d1147682c9be955ffdc21298acab5c5b297e7d8e590db6f7a45e4b574cbbf30287fb72eca1a791319a4fd9b9dd8e3dd180d9ad7bbefcc28ab181d65ee89902c71ddcabe414cbfec469e8c6e7b11a2888d858cab007de7df4cd209354468918cd9196663192dd46b732e31235c603c46b00175bae3f536003a21eba94080cf5598533d633b5ba4aceee3d935aff8c6b960ab1f1f21f490c2b7d886377ef1f63d171f4b595e4001ea94a332c292fd6adc7870803e60a0f8a9d50607a2d35acef61f285ebc72479c4d4f7b73487caebddc99c65072eca60ec01543722e6423b02ebb527fbd4392ab3f3a617c89917813fe0f13de5712f80026acec24f31162b61da0a2781bc2676ef17c0eb9571c8b83b5669f22041134dc6574447832ec580337852fbe60a707747e4d4120050805fec5b36aef8d51729da48518bb27750752e7f7636d582edc45bb7cc45c6875fb80da53cdefcc845c4de6d75f593d59d06657dad71e7190551a471130215458df3b789228ab6530a8ab03af0f807228bb454ad9426e0b9dba26abcde8c2ce080b3c708e702057587db6e3078f1053ada7cb26bf2cad2c3cd54df2045b575b0f7a8925689d0344bb4655937c35fb3cfa8204a704cf7c0c8d74bfe5ba6c9e15ec26e38e46d44ef37da3466b28469a79828a99f08a4b2acb5b53b6ac6eaae47ff32d31f25b94d88aeb042b477c63e0f3bd414dd7dec80c23b22fb7f68cfeee7f2cc8e9d7d2638055aabcc033d7b563111f7fc746990f1f9bcba5a2c02dfa6fda46c53e19b150f6d7811d32d464bd76be286a36025679e47ab8cc83d79e08cfe97058872adc80e9bfd4ecad14cc948125ea34778ee0660f22bd7f6b4cdfc18f61eca9987ee73a1dde815cbd79f3e9e8bdc7ae1a03460c72326690e3ab6d68892e80ef0b28e7d7d1051031bdc8aac92f4f17b8abe7485c0dd9c4543e9ad148d7884d4bfe630f7b15d084f375d3c2246ab48992d8b251eb12af12b0fd75e07bfe05bc483b3d3c521b12206f223b24d0513faf45656fd70c4e40a2d85b06c14e633807463d35440c6e6ff9c90782677f1de6f8099f2e97cf700d04add6f380b772ff656a372f8bfe91bc16b8151fdef80d3482f7752adcc9f82c10f582f261ccc647958b3a1b34226972dde904d9ea698c2faf61adab492e3bb492060e2c2af0102e77de5bbfcc2dd0da70c87046be6e089a1be8ecd532b60d9581fcc9a75a9f97361290d2db5d2e4e5d216e8aae0851d8e3c5914b034206b99acd3627c23cc0e726c3da152529c0d0aeb2516b0375096af1da6e3e6ef8baf4bdc5285bc84ae41c351716d0252f073f149fa1e00bf834d44fb62b55f240c4cc22200144cf1b443e55e65d53af7ca9efc873f6040d98c571e5c010d88e20b85b804afdb1d42dbe07853e9934ff798f0c8f26190d28e5b3c1598ebf63781b49f1b5f5b944ef56ffff52b6565c5b96667ac49cc9536d1e7513024328350033b9a8a102aaaa49e9ecd0d0c142dc42c8faaab741240dddf76b02071c58deb5704324a5febe3709b9a87a3bd388d4376ece76ec4fa996f07618fecbb57e1a55c9cc6e5a63143d323003e935243c49552f83975569a59306521a267d826b1abc22f0db3b5db89a367f69c17053e309758a791a147408705182587226df276e11aeb6979114d6e6ea61bb45f68209215ffdc5a8c9d6fb7e775600e3710f3dd532a195a893a86a9324e7e1f5f2bf5bfe9383d6857a3243cbd1b8f726af46ab93ad06fba88b192ad46a15068027dc42131b0f482d146387b0b261a54664c81d41587a196963b55526d56e7317eff6f9859a9f580330bc37ba95be2bc8eabc45a50fe63929bd8b37f7ed3f4cb072272f50f61a66c2b25d676ecfc200a67b015a7255554d8633ec9a0025e249a4c746167c2a1060cc09d6bd69057cde004e8eafbfc6bd4574992ece5a5f6d03b9eaee48a75c72da57395e169e26041d6ed3b65b9c306254b06b09f394fda392e26d911e2f1ced495a2347e9c68138d96e1d84fb26f7e284626fcf756fbc9a4575305555b099f6832a2193c9eb6b5abb95fab25703852be6ff25ec40bbe0c8bfd118aa38f0e9554e00ba3bc7eef0213060d25b23cd6c32e5ff461d82124b519220b115b6f2f18cd3371cd837ced26b69814f0f09027cf1338dc424e9da44d1ffd5c3e0625bb2b8936d36f9430345af3e119f92994899174a0df8c0e4aefb3dd69119b7b957902caf98b1174df0e3b6e7eaf365178511f0ed1b31157730a389c558dfb71105d985c5ddf6e60588431d8adff58f0b5b6fb92ec73b16a6abafe862001f559c85850cffa583c07f0bb766af7d1a11d91bd1c51d4b2e760703b0868df98c4c79093782d7caef607b330a44e31281a812a80dd1ca1df8232a7eb9c7b12decc2ad8c1273051620fee9ba58de4b2879394a701880f75a372f50f25afaa95c4bd2318007851e1c7b04898446c8e792c9f467f169978fe22b4ff6d7f86573631ebf795e5c1ab8fe85b76022ae4b1ed6a5efc02ecfae8b8c96875a101670ec783394b3388b6bb2e49d93f35570fea9f66cb5aa13bf7c211ad307df3f270a4de667759673c4c0c8c70a740abbbf866d3ce9758c92732e8316cab0fd7b44083adda52db9206455dc03020d62863541165a35cc77dec1ff2f610d35d41e16841d87a4f2cb1a8b0e9f048c2c69649052bc798e91b8f7b1650707ebf7fd0b24509ce0e83c5d622bd0d4427262cd09752c22f3156e400fb256402f06603d1ca839ee8754f408603c21b35dffafa3ef07270f1014352be11744d77e1c365110e52cd516ec3d7258cb23037f35f963bf2eeee1ed77caaa2618444fdc739b0624540ceb791d912d077de3386641f2a1463aee3c73f61457b2d51ff1e18d5256da064a7cb04fd1682a48d26f6dc4be147e682957815d1e1c31ab208f79c254681bd008b01d9bbfd6df63fbd59a03dba903d39cb51dec5a38fd27e740310d70cfd2cd4d0839ef24e27725293f2af1d2b728dcda6fc444e3e35145c4cac1affce73b7b99181881ecbad24e47775d475fbb4869e216782ada651ce95af7ea1820f71baf1956f4cc4a487e33e1b284077e4a30509cd068d13b0aa146532ce8e10feb52e71bf2bf0476d99b634d198a1b85c4a7b8001a39d05ed4413ad53c1fc242e58a834d8d2c2c537ad6ba9d6b7e87373568b42cc3b8df4717812092c6f5ea91dbd72b59c827623bafe3999ca7fec5f1c4af8b66b305c9b138d6d79af07d0c780a27dad35ef50a711fc23a1bb70567a6754f3253090147984215275787afd2bb2c12787942e7dc7ec996f90be2173d3984206a6594899c181464fad9b78b718fdbca1ff0db5bf9720c1fceea2ebd62f0b81d943e2986eb204b6d7c64a0502c9f60458c349a1da820c25ff4341a72fea8f66251ee97f8f5721a4e691465f8f24c8454f7aa05a1f339581ca88fee21f5b27874a662eba05b2a28a8d10d17a1d8b5eb8d62386b74d8e87557137272619fbd3520c47ffb0371b04a88e548edf1e85657e912b658ecacdfc63cf007c2e3636575514ce402ea217756bc74d2f1fd8f57824d7718b7b80a27aa5bd9dd9f6375a28e009794cc8ea671e01e3c76a190f86d0647b941e779da687d1a47cefa9c52e85e4d715107e1c4e42ad65a834b403245dee643c2f7b0c355bc2aabc3e5502f6c3395899df540ff194bb0f614441b1104776e549634f217912aaf56fe539cf52436be520e49c6413af7be5f2bc567ce0b0030888491aaadcf5048e4be5534318b63ca18d24ae22ea8b84c534bb16b5e89be9a97df5f26bf9c196cbda125380ace6283f5ca1138096adc4cbfabef87ec0a214e489765302f5ba8d22d175f4c44a60f071c4a4cd70c72df3d3b679b80e8adb29f506a352b95f4a047cade72c49c8cf57f7256fc4bd2a80a76ce25bb2f69c56ef539a6fbfa5771f5b524d7c9668b9bdcf36b42f4972262f9620fd16623dcd7a01163972135544e28c7d7b3ba773eb4fc19a9f356147e87ceef0fae8239cd9af066e786b7e36f207bac0c99ca40c3fa8d174506bde6daada87881bab469fba3f374ce4d28a88b93c40275b4313f58a042bbd3661d67562b97fa0de72ddd9d3489b02508854e4496caffce26df866a25ec7e13e2402bb690d973ba0b0ace987a979de8e3c2b897018962203ffbe2cec697960adac97aa6d5789062eee3d39cba18c42c1aa6af4f22b20f1dddc734f611324debe43d44d2c349e45f16323ef62133aec203d3f3315f98377002665086077e31e210b49ac5a263cc58e55dffe61dcb46fde9b3254309d314e9aa8cdb7a578c46a797521760d51a565ca0d45d6dced98e7d215d1373d135088f434f9732b3a606548b4bbd6356c3cd6aa3d7bd785e3983016a4d81ad153813d24010ba8672d8060f538b759ec30bd1cad9e82fdd7da0a8b381603e9325978c0a466d1aadb59a29d3c71b1bcd1a9b3b0bedb29c3364e0e8ef26b85484fa43f6a37a3215fe6e3c12207cc8bb9c94b96e92b260e33e91cf90f21fb31083632b316424b7b19f2f5213fbca06f53b5091c3173b5fc94c1045e2e73f57ead0fcdb4458a35fdce2c0575225955d2f5939981731d22b33cff03fe767a013da0b22388ccf168a134b3a353513b7c2a6c4b529761a2838fddf68dfbd0a1abe473eace950cac266671f7857955fb84121e0a505a51f024bc94007a21354cdb48e884a4960c1ad204b6b55eaf941fc57fbfed7aa8af71fa142e9fb1746deacdaf0ef81a13e51d98525673b977ad737ad4fba87b7c3af16be2ca81a6b0b73040259380e99939bbf1074c47adf2990204d39101cf9449a7c29f4e21c583b7c40eca3aa0d3cb7e9f5566cb2114a70630df071375d7966eb0b79483698a170b21881c775ba624b80b668f70d714a6d87a0a051f7679852db65fb78ea5df2b5787cec29244eaaf1528b08d65169d6b9699a5598e76d9eb0390863c9ff2b96ea6991c7448c66a651474086a04d9f28b7a72e8bfb35a7eb575c1b9771d21863eaee37c14975c8826ab99b6d4d8a11ea511b60740dddcc6bd8a49b252814ad7512375cd966aed0ba3478a7ae1b3b3ffb0ca843f05160354c7c2afd4ac2ffd164f9b80c60ef761af30a2f379582d4cc9f94bd2df255983378295d436d0eb2bf3739f38eaa1577f9061662825c51cc09bf576b71ba4975b9a4a66ea37205ecb930f83327238518757ab2dfc9d25b63be8abf4d67657d5d98f9bdd7799183f9679443873a1a99160e5f1f66d2257c90baa19505fa70cec3335943bcb3dcca3028f9b34aef83f5e4355fef3790df44b4763aa7ddb5cbba7c04b08edf545e38316663b838302d412cbafb0fa14d633a3dabf53ffbcebf4f08844d5d8c333bff147af758fe9ceab7cfaeccf1fbe95cb6d96465a0bf8d6aa80cb96992fc7545f0b1098c426ddb2fed5ac2975ec6045e44b4025bc9d6c8a4a861758b92f30e5fb57f00dbe89dc7a5c6e0cd4b18ad48df4b359c814d1d7b9aa1b46cec8731ee5b519059934190fa2f7251db9d013dc3318c20aefbb428c6945360d32a598265e95d4512377c38d985bcd1b1ed0dc6a4e82173218eed37e922bfbbf00d9d5eea08abc367903b57fda42539fe2b6abca9670b23e3ce2866d7a0f0bd916551b93a0ab8c96b9a3cbe87a17fe600d691a9bd3e2d587efaedc2820060461a8b2dc3a1a178f0f7056503991b02e3e3ca5d98063d203dcc507faf5d902789acd973464bcf39e57907253c5cf18325d33a1e4b7b52c566aad61b2dd133368b1d892e904d012653fcc3bb7f8217b6cb912271a904764cc049f66a7ca75076ad6e88d7069ed7afd58e74fab8afc8eb34ada73e99d1f6657064e1396d91d7aa190e06502631f738a095baa076ba395dc989f9134b9b2cf562b344e1af1de8990c117e5423a93fbf2c6e18220fd5af039b5c40f87c05b969290d582e602e98abd58ee80e152f74c3094378722c31453e60a9167b2a6c10beba701d623d3f83fa4e77de477ee8dff968977c281f7df560e7d0cabc8ce1df034667d86b8613e8dc26268726ed726618f84e95aa27717d0a15f1c1aa21e7f7a19622df62fe68c8f539ccd858288250c23695bac0d7c97e4f4994cf2aa929edc0b13315f047ad463709dd2679023d79b06ae0deded9888c0a2a56389086c44ced7872fef9d7b6032f79be609d5009f94c89f35a31497d781aceacf77de80108cd70b72cdd70a0a96e03cb48bf429d7b8605e0cbb5e4af9ca117c509bd366ed7c6fe1244571acb410bc6f8d176426abcc73de789285187e0522a17a80aee5a7ec1f0e3ab1f7fde3e66e014b42f28e6590a56fb4d6162aa9e395ec4cf2cf54b4fa779674edc7ea49d6e837a783ea8488ff03f5d603490d1558393bcdfdfca159ea1c207885f2fa5fda4f16587238b18c45e2d83dfaa028ca2d67f0b7acb1c9935fc2301f7f4ba9bcbc06b9af3a326f611e1e9e6d93c93c11758c8092681d371bd85f25f00dcc46c1015d15d0911fa9f4b4db06e604e070bc64fb6169caf17a4844e39d3ca4ccd0efa930f91617d14bc64b2c915ab7d158bfd1a3edf99562af377bb50f371b38c6feac8424e8a034d1471d92a188478a7e41ef947052a0f2c1685a5ec2b1a66c08e5eb9d163d8e7201400a98a0ffd38ba2c917f07bb114ee0250eb2524f09abbcde8d7855bfcf44cf6430236bcb265571f1455e03c29909c9faf61bbc181120b72574627262e70792cc8149c015b475bfb19a6865aa98127ad20ce29306d624b5f1f9bf26ded991f6659a40f2f5d17b46514efb11f90afa868b03bf498392453f2e2bce86727f5eb77124e05ca41704640d5429f1d4aa3ef19661a8ad650e34f177ece60c059080d4d8149c39ab686569ce2aaff7943d992730a830f7584578fdbd3ebc98401a137e6cdeefe363838b3a2a56ea2ca66bdff94a20ef39affb210329181b356beb70545520cd5d9b4b6fcbb2407f97252acea3ed87f4218266291b9238c2a4eeda12f7ae2ef634e104c769d998216ca7392c91a65f7559e0108a636fbdc33a8eab7b545e4ff3da4a6f32fdb804f5c4c431ba0ed780d5214bc68399232a83774582743c696b89cc0ebd110ee1cb72fbf85991e0c2bd055801ae4d9484ec3c94ccf8c3f85190e64826fe955b55e4b04efe3e4cf406c0bea84c992a18af6d3640e88ab34ec92e69f4b51b7a715d2212dd768a019690f655d68d19a0805a7a53939124ee6f5b5e48b7de6bc3f9098fdb5facab6f973b5a1477c397aefe691c2099efb4fbdfbe99509f43c2f3f8452dfe1f63df92e7a0dbeecad2f2ee6012ccf33a627b33c7e2b70aae4bb7bef47dc6935ca79b085fb3094773b2367eb3b0e8d95c5a8c987fbc72d15170a3f966cd6308729a4a6e032033c781680641a0accab1e2682f7e0c19bbc3831d1b97efa0fba00b8bb99ece27370f16a6b4bd3926d4f98017d8b7a23584b34964dcc7602b368d82d2555a346b96677addc77573bed662d7862b576e7334a6223b6f36e141d06bf658bb5e47f405760322b46d37f63955bea7555f6065ac17a580d2eda371309d48759aa462bfd4067aac6730ea6391a9bdb0aaf00d7a5311c5e52a32259dc49466b2e5945f063ba34388c1b15b6900e8c1d8d6c90bb3b4e64e596024919bd4b331eb98fdf08e22b31dd59f9a791ef24c276fe1561a07f89666bee2ebc9916e94475150f9bc3e240db6a803f1ae34ad8efa474b9ffc8178a68e0ab05192f2b7a73389d47088c4a450b85838997a1404afec5cfcf9ad604a49203d1581048d1d8fa1d55a74c0da87171a6e1ed2f0f9f112460a7117a6aa267f4015f3406ff9cc475197d879e0301de7b2abe50b0cbf6cf55d3548f6104705be4b5216784db2effcd539a7956498ba4a2bcde46eaf08cc8baa5316d993b54599bd3b79201880e233c1473b196abc3d15da0b9cf5e51a82052bbf09af7c0e02290ebc360b63e713102ace0446810e80936f234af849dd6d5783cceaffbcc7e493d695c943787b51ff33a7d9ccbd2008ba86035673c8e8670d543ff3b2ba40387de9d7bc0419ebfa88e34058fdf39cf650c8a291446da83f976ee9bfbbe48385601dd0bcb5f2d85834fabe0fc0957338b04576ddd9d1c2fb8e65a36968d7c0e80d797b096603ab4436c3e980553c94808b4dc74e2e66afe93786afa9f2b7e521fae7730084b6ab8777fbfe6b7ba34a0504806f44ce87d02b9abe856a24baac924e6b1e9b0e4f666dfa8aee90d07135503bf628a3a8578b702673f98a8a81cd7833ccff398d692363c82a845516efd2ae4b9a74b72dd0ee69950113c59e61b31203d618882d73a7eba59f932a7b2aadcc971b743a65daed8b0c8d61d146358220844e4eb32302fe5ea871259374c57bb0f62195918a954ea74519530a6e960f38cfc57fe7dc575dc33697fef0ae3173bf23f359dab53fb25741ad295f2ced8924fb1902894e94e195920ea5596e49e05b3783abc3b946faae16c8ba8b3f9b1aa7aeebade70a9fd0b52ead76f176f355d7de239f77e63b038526144e1b49f6299c89fa3e18db1b3b0fbcccc40d0028c043e9783524c4b85fc6338fae6973f5293a55d9c118339777be91bfaa3932eae0f8d7525109a19bab187ca814a484ffce65f413a8ea22ea627f6ecc03a149f9254d45f9d5956e2083493e6f8aa874aeff7c6429d1a18335175c294377694438d3037b96e4aab9454f7dffef76b5813d31a5f377dddcc01e1ec860b88b5b67be6abb889d82da155739dd4860339d33e7ed7d2aa309646bef3390f43f8e1b8ee75468f9c89c8b798febe1acdd493858c3121e9d1e0c4887d9eccc200b7b6492656fd6e22786b6adbf49a0e11456da10afb1d3e896d10ff2c637c0add4e44b9d0156f599b4495ead0c91574cba37c422e5b67d3857e9b035c232ffe1173a387544f1d3735193e00d52bcd0a08402691955c0ec3576209bdb30d4b3dab09d2cf1731e9f36820ffafe6f1e958239fe606a4adde758c5a2fabd59f2a143aa9ff8e5f9b4b8e06eff7750c4d3b2e9f785f332ee74db963c0aad8565fb8f43852a2bba1c04c401f6ab2cbd33beef28da3d399ee4ef17bc8ec2edfb5a6d666e70a6038b6c92c3501c901b1e56510d9059d2f94b7c3e098f9237f62839dcea1dfd1df8daa3919321cdf69efa80b3c2c1b106dbf0bd644323911b0ecfacada1cb3ced99dc03a21781699af040c49cd45dd6292840951e0171922275a557720613e73638a7f0867090293a965081048cb13d17b76f5136ce638c70646157ee7e447a33ca6019d0d778f773ac2d14df176dd1f497cb0e8b7a97e4f71da1874db722b19dec913732aebac806c797798cbe1feec74a86c2f538e8125407db0b2e6edfd2f1b02d05c43e508641338204e633f278a92d1e4baa33db9b892d0c42e509ffba299949cfeb39d47220e65c0b47505d2639c92fa91afaaa31a11bc5d31db74782e1595ceed4b699e259df053642cb27feae1a5a6883c54ca9b5efbe8b802f94a14343ef10a1040649e29b9b886475942b32c57f68e7434d8756641d3d5b101dd36e09483e93bfcb4f25fc7c515779489b8c0a000a9980f21a50dd14c9b2c5d8c396dbde7a69d6d20e95f114996bbab845ac2944f9a81fc5ac476cbccda30e85acfc5c04b84f566b47dac340206744e800a7f4f54c4a7ff3b2f9af933d57ce277b334ad22f686d5603632bb7e2f08a8258ae75eff36b0d97f3d3613ff39f8730936513b8cd07542da0763942b20e66cc32fbf91600cdf92e7fc5255a6adbc1a3bfb6707d19a4c9f61261ce12387ec59d44ea032d10a282f038aa4907eb6fe8f317a89ae74ea6c1489dc3afa1d7d770e1d57d3db0a154ae981469129646f31821e1dd4cdd32d9bbb53044a9a84a52a97cccd41ac38d56075472104c6041a0776fcb067037f3a9117a7ad4c0e08210a35540aab1fe1c3d27535b8d0453ecbc2467a67d9b70b1a8006b7968a776532b04e6f688082651ad296d0b302c7908fdefe09320a67be5775025929120a509dc7dec726c8a0e82aa664a40972ade66cef98ada9cd14c77a11ff055d136c7fe89d3df498973dd5464586c80eb0e53e0e48370eef6faef20dcc95ae3b449920005194bc928290b0bacfc49e12a676f1f23c4cc1bc33dc6cbd86358fa9a30aa89eb2483c3cd6b83cca79891d0160de91d4ce57d5904007ef581d439586c80bbf1ae709f57f55db82553ae0bc18e6d47c2fcae7afd536b90ff52675d0133120dd85612fd7555cbc558343ea08806b1bcf3b7787f2c613080c4e2841489bfb180deb1b60cbc8119699b036dc0f1194c1a4070e8b91d30b7c47ec61e0bb6da86eb29c3ec1ad236aa1232a6c9abd2a1cc47c82b75c9f54b2b8956e9ba3aa11f82c98c1465d2108d0ceb71f527047a1a8160b84aa5fd28eb6f4f477964c3361cc1a20f5f9d0b66b5a8ced1f1fa37f868c513e6da1abe9fff7fe66434276703f6cc0612af0bf5f60f248735019c3140f05281e269d7f002ea6928ec0e8c18eb725b5351134a9ae9f7a6b067b2308a48145576b9019586725c23a80cbc830800c9ad1b9232f6ca0358eaeb361ffff7846fd261068ad6baed747b3dc550b416835fe3ce67ddfc698ef683804c227cb2302f6d82e85c5512f88539404f613a0ff0d438354ef7e52a28a36b98f66a805dd74484d6f3f73f0dc28edf76f3a7430a6130315154cf2550d953ca377bd83fc5df978058357fc6b714a52bf116c630b485916cfecc2b9bbf1b5ab4ccf26da8d1fa2a115ce51e09ae1c07596027f971273d977d42a8bce76daa6649e31da51709cb1cc5bdf9f7a8d25904f8f384531cd881e57b93cfee106e48f53946be9de00526872b46a40ec0abe3a6992b4f52c12643dcf8c0f4d4185eddad2f9d257eed1f49c18340871ff32de637892c5fa825e1227edad6f21dc5f808e08ffb44ac4e275f100925456630effb7e03f091cc7860c9698abd34b56171541edb31bb515a34b84a8d89ea0fbfbe7b2b8c88ddc963f8fa39da45aa99f3aa5693210f20cd848808dcbced3f730f0336b338456233bf5ec5b21df1a2a09f2379a8595ea637fcba01c7f6b765e330554e1966ab7219d004e855df754f5f0f1df247b8e9be7a1aae56a3fea12b3c4f376625b3c1bd50acf0da503314c38bf2c6cef380265fb62879c94d97a552f24fa431ca2a44f6c9c9c4baa2ad1169d3e95c75b29ef3c2922609cd4e08d7f38c3f996f79ce3353a6b79291b3490983a6b54126935b683f1e85e384909f2611f7f127149251b84c741700dc09372ee75bd35cabe2f4d78613d190d84b950159e0136fde672b03a1a3819679202df50d2e72a780e18bd1941bdd9d5284e0f3ad5ed2bfb8fabe287ca2f17267ca7a91cd73f15d2f7b4b9e40a0642c9c03adf2b2d276a2fd0e17991e6f9de0f7258e2a47c69f2544cb02aa8248f320f5967fc5a27cfdd3e1ab7887f2cac10640e1c872d29d01118aa37ceff8b9c7ce4522338891f168bf5c0b5322e003c57d679d9b5f4328f69a05c8fae75e1c7d893a96d759285341473fda21d0e33df6e7e01fd7f8b8fee4b6a3f168bb18e97175f19dbcf56a70bd985612d8e545b6c006c80202e53a1a2742bec72b68c03b36e7a08e9fff36973cb7888cbddc139d3bcff7f9bfb24fabf5de213c293790a9f878e43df13a17dc5828188f51b750bb7373cb932d85da51f8b23b37258e1c2fdb2a823986fcd4149e0d90b8a81b8fd59029b28d27e207e0cf2d4597c1ad425ccc655809a5e6bb1d6345509ed6c8af83685cd76b20de12c3a8dd23f6fb30263553f86d481f91f3c1d43b596ddf7eda69f5897a8ce6b2d080a9380bbb5af7eb3285fcb23d28eafb7648fb2065da3e52c8dbd0fd2bb195e87c2ebeaf72183e521347c2d69ce72ca4bef390868bec18586fd0d77282a92d7ac9f75b3bf58944485a236632f7d22b93984eae51fcff4f452829ea085fcc3fed18399f67240a8028fc578f8fc99b3e896fb845dd593a493e9706a174d89c0136e51df4e04b5a04c4cfca4130a830264fc3f3b7519bb81ccebccccf3a50a666006b264db55c68efd0a03e3c821b4e0aceed5eaea23a70d14956dabb9596674f2caba60f70e50d2733d8c1da23c7c6508eb6e16058377a07abb5056220bc98597969e33ce10d12cbc07cbea15f0195849a22629163755f829fad8227edc54c0a10039680330e490803ad441b8195afdd1ee7f9915f0b6daf48e8d88f46697ea697857a209d8b2c36a8dd89537b9454f23cef2d20258c08cb519dcf557d163a938db68e7058b6c6251380e69da1e751640fa32c12351aa0fd67b7662a65a3ce96f18b417bd6730a57bedc6c020fb2d9f39b2476afca83e7ac3eef594bdbc842b12f2838effa939b2952371af51144b1fd836bb63594501869dccd34f516f26f5251a3b05172eab489da8b4102b69276cc72c4a35502bdf92ad5d857616cf4dc9f919af32c2885aa928b9a8f432316f80101611772def843dd4be19d7bdaf083599b2a9a792bda771f4f4f646d9504fd3c29f8564c616e8820c48bb41898fa309168dde2ca94a0d45c84f950e632cd658c04fde9fb4b8c5ad242713137a21ece27c0fe739c197268e6a6528a158ae88a7eafc34f8ae4fe0f7cd04ec2e33dfe7b042a965e0f05fe2e3ac30f9f33698912aff56edf5756ec081b01b2816cdf34169b6064e69486e87fa0cdc7ecf330a65334fc7d7f7bbf08164466d956b0cc62cfe798fb4d6bd3bc4a429d5eb1d196177aa2ae5f31ae21dd3e7cc524da63a556858c0ccf6b3e0616be091f585b318f4f0c2a8622d0d9684dda67c3d28808495e8efd62b1f0fdae157e961c6c5bee6ee63b90cc61f612088800418609c3b197b7409d7bcd8a53369b4a9bc962548ec50fd3b752c88c6ae41785545617b49da4052fe9ed173899f98271e065ea8cf4d70400128a08c99e153a78efd9a24075b531e71ad876854bb22c3108229a55704627927535b43cdf4a438f046fe1785811347acc2004a91e9c60aa87ed660228f145f29e65e0f774d674a6869262aa14ade1588c4be8f198bf8e7df619b0e4331a5931a2e8b1246bde1938685266c8d6c4913cd5c6d5a278587c789176dde4bcd4390246123c8eaf7230b954f15d7b3ad89df310271a52276afe7a875509432a7658e6b96206d93e5b28056df1f10c9c4a35f40c1131f30290e7798e61d197ca0ea29d9edfa23bd269cc68b022a0236e2bf6d49f288641edd012ba7bb40c130ed612154f0ff101d43a924d06f9199f55b9dbf5a834d251957537db3d7d817be1de33bff93a56d72c9b3fb6f8a9050ec425bcd7666dc4677e954295c61d47743991acee7e796bd682080daa5fa12e314287337674ea0c0394b1e3660d8a3aec378fc8e2e1a159bab309bc2e3dc4a32744c9bb7672d2cc8f193059797683c8614abd3f9f8be9d255fba4cb3fbcd5023a3ab1118590b6b93c65d2440fee25409e92a246622edac62103c7bfaaf22feff70e956d64528b7c4f91e84197524a77807e68bd0a3933a96b488f8f02e5220b6577dc672b9a8b7d6ddf90ff6b585bef46708062b14438a4f3e950239e533a6313fa39afd4952307c996e359629da872755c30fc16b39a6a94cfd862ca86fe13b979b0ac6735ece74be12072ac15941fe6b0337f0ccc2e57c38a764390141847b855015c8b02bfd97fe79ba4a90a58d5ee2a17a734772ce4131d9323b4d5ce1d8df2c339489d7f862320c62357ff37c1b09f627f6f116599b51905402812a45651aad8e420bfc1ca5c31d9046a48bde485f2d326f1c775904afa48790dbc0ad56e1062fdaf4c88dd82645ff648baa453deadbcc18be9f94a8539650df746d13a85db47d45c8268a7c1ccc7c3a4245fa8eebdfdc0b172dc360201002afa077fa07fa5543960a82f81d81417f8d7c3070c3bb5dab0128a47838f2c43ac7ea4bc75b73afbab9fa42ee0deb10b93aaea0059bc38468e3e2b511833e5ebb0062645048c6106044866ed52d331a21fd90e9d2918d1e2b9e60110c6d1dfed8cab1a7e913ac3c4bd681493d398a0fc64108f7971c30184b5b202e69750f1d53140c0809a974341550e5faef1392a266c18333a19e48eafc6252138c7bf610aa440efee6ada47e619a1be9b9e89dbef8df1aab0446daa2e7f3ac9ceeed93886be8b63f56295bd43bde11be741238fb5754ef749df2962088c089adcb47612f1cf5a868e4c0a0c2437ecb5759da41989899951f96261d31343dc131de60243f48384e06faa87baac8da66ac6323a104f3c1b9013f79d9712befaf860c639739de3ab7f6f1376dd99cb7f6c8aa42fb0d0f2dc586b708bf2b8af0e681350663125e913f7c8f2cf03d566acc35f09bf46680fbb699bdbc06d2af725cebcca87caba9553d5fde4248360dde795a78dad54241cce04425902deab8aa6de34fea7ec003a8b9e94a1c82eb83ff19cf2ae9a5ddf59d6f5e0e96ade83eb8a07072fe4b497b26c09843f98a89d10719a4899c886240f395a527055b3b6a8f208bba4cf495dd8b04c5c4f684331929d638400cb8b4927368e7a2365753cdd5f206545a022cb412ae27176214efaaecc0578b9dc9b87610aea8dbe799a94c6ea88bf5ab3945534addd3f63d76856a0360a1eb505abb4be88ef6b571e8a692453f7b3c6e6051d5cc27bf7715af743dd6b6067ec7fb3e13219833198286ea8315faa6f367a606d8148972617d044f9af75f9f62e7db95fcf329273a8d3a328047cf1d25686cf6a696f5127ec71cdc7d5e1ecb212d8fa94f38a7c84d5cb5730f0a4ff8f70b4f41996092cff2ddd991ab30e22ba1ac0144ca776facd476ca07cb50d9289a234e9faf84926e322d271368682f3a0d403c7c80a04c48788742fd29c567806640b7f1bd8d1dd961d92edd846aead2d9f4ad6c6363b35ed5e7f872c32194fa6ff03d3696f2bf78f055e4019146b144ed1ad63be7c3022dec556cd8d2f3a0bbfe725ae304de8affffa097e7f8e2a91bbe59eb6cdeaa4246cff640dcf9824768418535effe74534331242e689734fc393ff38a8f3e88b450112ef26eb58df6d45d4c677aed1e7cfe1e5a681bb5f72aeace6b762cc72408cb004ec049c1cf4a31701068a1c7058cd2f0e98df911627bd791a85817cc503906256240fe4f830ebcc290ce216dfe5b6331d3cc612098e39b821e314b37858a40d1268f31f23bdb75ea64a5bfe3cbbd9284ea4caa57bc27ed3501e2419aa407e5f7b7a5dc7c64566f4abeaffb54d094357eaab85314c953a520eede2f4bbf2784b3cee19c5420e2d5a6a8b86c313605f16731ab67db8c8310290332d36e5db455da9a7c72de8a95c3794eb85614ba70eb39cddf29dc8971f253c73b14c073bda91d88f8acf246aaedbec7e3baa71bd7dbb6a9e2e610340374fd4f9a0e9ca8f3326126e07545f7ec6e32826f96837657dddbed096f2e9b488fe98165f70d23d3e8602ffdad9480a7dcec031ef6b62061c3121f284b609fa8c8f06c7a4a53324338e65db9af2a4607d2e2977ab4ef41ff93304539c9c0aa831dbbac328a5484a08366000000000037b10700000000002a7315c8ddfc25dc2266a6b221cb8f9fdf641970ab1f65a2754df4e14c432b9c446c604131913bed45976c4a8ea27df843a72d622f80ef15da622f0d56ec1ffe3021190177b0405c4fa1a0311a493c4dd095f24d386be6a03f5838a6b1008665f4000000f5c98fc152bf40e1ce216c8839b8ddd42ea5b355f0b5c700fc9b2cb7c802e1c8336488033fe5f3ef4ccc12af07b9370b92e553e35ecb4a337a1b1c0e4afe1e0edb56114e00fdd4c1f85c892bf35ac9a89289aaecb1ebd0a96cde606a748b5d71a533e05d648cb9635382f38b778dc3c76b18e4eab2d017fdb24c1c0e32d2991707a45ce3f26e443dafa697a76bf24122c9b19b57eebe798668dbd1a0da7c900795222290dd7278aa3ddd389cc1e1d165cc4bafe5c658153cdef5850f97c4d4fb6706b82310414a00fe7dc34b3043e0c7a8a24e810e3cec9de3e1dd7ce06bc191efd2273a357da4436fc4bf82069f6cb87d3d605aeda1336ac513f358b4296b8da51232896ad271063d93404eaa6b80960fa2d4b41d74a544eef94731f0b83ba2701e33b49e3191098c3369bc4658d82f536cb9d38285c51c7844292ced06dd2e8148f0bcd585dc1104e64aa930045e83d828ab436a0e587637e5ef83044d1c2918da284d7072847132885d443640979907485847368e32501345b0dc24c904c06732cc17d944b26181b0c05c6461bccbe4f7b2180a282b6871aa6472fa36cdc49ec50cf69d3eee4b26fe02bf48f39efb549d3963d19e4112c7250c580543516204ff1b0675680cfea02ac09f0b23d6e28c14b08421b3a10a9788442457d732b120c5c466c54ad938dedd3cd3701d9b32fa15dc8db3d6b1ea5d8495732477a72b34efcaf8c349aa40d8e1f21f226ca11182cff00921930b010000000080c3c901000000009104e90000000000d75b9464000000003802000076ab1c8604000000000000000000000000000000000000000000000000000000844f7a7e7585362114fc88a70654146215ab4eaad65ad54b64975840b78d365e8b75e78616a92294e747589c3ee4a845c2962e1cf6cd7fe8bfbd09439e5e6d5e4d4efdf181473803e734d97891388e1b50628658ac818599cf2cb069c8e6b38b6265617665726275696c642e6f7267"; + +#[tokio::main] +async fn main() { + tracing_subscriber::fmt::init(); + let mut suite = Suite { + name: "beacon-rpc-compat".to_string(), + description: "The RPC-compatibility test suite runs a set of RPC related tests against a + running node. It tests client implementations of the JSON-RPC API for + conformance with the portal network API specification." + .to_string(), + tests: vec![], + }; + + suite.add(TestSpec { + name: "client launch".to_string(), + description: "This test launches the client and collects its logs.".to_string(), + always_run: false, + run: run_all_client_tests, + client: None, + }); + + let sim = Simulation::new(); + run_suite(sim, suite).await; +} + +async fn run_suite(host: Simulation, suite: Suite) { + let name = suite.clone().name; + let description = suite.clone().description; + + let suite_id = host.start_suite(name, description, "".to_string()).await; + + for test in &suite.tests { + test.run_test(host.clone(), suite_id, suite.clone()).await; + } + + host.end_suite(suite_id).await; +} + +dyn_async! { + async fn run_all_client_tests<'a> (test: &'a mut Test, _client: Option) { + // Get all available portal clients + let clients = test.sim.client_types().await; + + // Test single type of client + for client in &clients { + test.run( + NClientTestSpec { + name: "discv5_nodeInfo".to_string(), + description: "".to_string(), + always_run: false, + run: test_node_info, + environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), BEACON_STRING.to_string())]))]), + test_data: None, + clients: vec![client.clone()], + } + ).await; + + test.run( + NClientTestSpec { + name: "portal_beaconLocalContent Expect ContentAbsent".to_string(), + description: "".to_string(), + always_run: false, + run: test_local_content_expect_content_absent, + environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), BEACON_STRING.to_string())]))]), + test_data: None, + clients: vec![client.clone()], + } + ).await; + + test.run( + NClientTestSpec { + name: "portal_beaconStore".to_string(), + description: "".to_string(), + always_run: false, + run: test_store, + environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), BEACON_STRING.to_string())]))]), + test_data: None, + clients: vec![client.clone()], + } + ).await; + + test.run( + NClientTestSpec { + name: "portal_beaconLocalContent Expect ContentPresent".to_string(), + description: "".to_string(), + always_run: false, + run: test_local_content_expect_content_present, + environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), BEACON_STRING.to_string())]))]), + test_data: None, + clients: vec![client.clone()], + } + ).await; + + test.run( + NClientTestSpec { + name: "portal_beaconAddEnr Expect true".to_string(), + description: "".to_string(), + always_run: false, + run: test_add_enr_expect_true, + environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), BEACON_STRING.to_string())]))]), + test_data: None, + clients: vec![client.clone()], + } + ).await; + + test.run( + NClientTestSpec { + name: "portal_beaconGetEnr None Found".to_string(), + description: "".to_string(), + always_run: false, + run: test_get_enr_non_present, + environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), BEACON_STRING.to_string())]))]), + test_data: None, + clients: vec![client.clone()], + } + ).await; + + test.run( + NClientTestSpec { + name: "portal_beaconGetEnr ENR Found".to_string(), + description: "".to_string(), + always_run: false, + run: test_get_enr_enr_present, + environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), BEACON_STRING.to_string())]))]), + test_data: None, + clients: vec![client.clone()], + } + ).await; + + test.run( + NClientTestSpec { + name: "portal_beaconGetEnr Local Enr".to_string(), + description: "".to_string(), + always_run: false, + run: test_get_enr_local_enr, + environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), BEACON_STRING.to_string())]))]), + test_data: None, + clients: vec![client.clone()], + } + ).await; + + test.run( + NClientTestSpec { + name: "portal_beaconDeleteEnr None Found".to_string(), + description: "".to_string(), + always_run: false, + run: test_delete_enr_non_present, + environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), BEACON_STRING.to_string())]))]), + test_data: None, + clients: vec![client.clone()], + } + ).await; + + test.run( + NClientTestSpec { + name: "portal_beaconDeleteEnr ENR Found".to_string(), + description: "".to_string(), + always_run: false, + run: test_delete_enr_enr_present, + environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), BEACON_STRING.to_string())]))]), + test_data: None, + clients: vec![client.clone()], + } + ).await; + + test.run( + NClientTestSpec { + name: "portal_beaconLookupEnr None Found".to_string(), + description: "".to_string(), + always_run: false, + run: test_lookup_enr_non_present, + environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), BEACON_STRING.to_string())]))]), + test_data: None, + clients: vec![client.clone()], + } + ).await; + + test.run( + NClientTestSpec { + name: "portal_beaconLookupEnr ENR Found".to_string(), + description: "".to_string(), + always_run: false, + run: test_lookup_enr_enr_present, + environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), BEACON_STRING.to_string())]))]), + test_data: None, + clients: vec![client.clone()], + } + ).await; + + test.run( + NClientTestSpec { + name: "portal_beaconLookupEnr Local Enr".to_string(), + description: "".to_string(), + always_run: false, + run: test_lookup_enr_local_enr, + environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), BEACON_STRING.to_string())]))]), + test_data: None, + clients: vec![client.clone()], + } + ).await; + + test.run( + NClientTestSpec { + name: "portal_beaconRecursiveFindContent Content Absent".to_string(), + description: "".to_string(), + always_run: false, + run: test_recursive_find_content_content_absent, + environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), BEACON_STRING.to_string())]))]), + test_data: None, + clients: vec![client.clone()], + } + ).await; + } + } +} + +dyn_async! { + async fn test_node_info<'a>(clients: Vec, _: Option>) { + let client = match clients.into_iter().next() { + Some((client)) => client, + None => { + panic!("Unable to get expected amount of clients from NClientTestSpec"); + } + }; + + let response = Discv5ApiClient::node_info(&client.rpc).await; + + if let Err(err) = response { + panic!("Expected response not received: {err}"); + } + } +} + +dyn_async! { + async fn test_local_content_expect_content_absent<'a>(clients: Vec, _: Option>) { + let client = match clients.into_iter().next() { + Some((client)) => client, + None => { + panic!("Unable to get expected amount of clients from NClientTestSpec"); + } + }; + let content_key = + serde_json::from_value(json!(CONTENT_KEY)); + + match content_key { + Ok(content_key) => { + let response = BeaconNetworkApiClient::local_content(&client.rpc, content_key).await; + + match response { + Ok(response) => { + match response { + ContentAbsent => (), + _ => panic!("Expected ContentAbsent, got ContentPresent") + } + }, + Err(err) => { + panic!("{}", &err.to_string()); + }, + } + } + Err(err) => { + panic!("{}", &err.to_string()); + } + } + } +} + +dyn_async! { + async fn test_store<'a>(clients: Vec, _: Option>) { + let client = match clients.into_iter().next() { + Some((client)) => client, + None => { + panic!("Unable to get expected amount of clients from NClientTestSpec"); + } + }; + let content_key = + serde_json::from_value(json!(CONTENT_KEY)); + + let content_value = + serde_json::from_value(json!(CONTENT_VALUE)); + + match content_key { + Ok(content_key) => { + match content_value { + Ok(content_value) => { + let response = BeaconNetworkApiClient::store(&client.rpc, content_key, content_value).await; + + if let Err(err) = response { + panic!("{}", &err.to_string()); + } + } + Err(err) => { + panic!("{}", &err.to_string()); + } + } + } + Err(err) => { + panic!("{}", &err.to_string()); + } + } + } +} + +dyn_async! { + async fn test_local_content_expect_content_present<'a>(clients: Vec, _: Option>) { + let client = match clients.into_iter().next() { + Some((client)) => client, + None => { + panic!("Unable to get expected amount of clients from NClientTestSpec"); + } + }; + let content_key: Result = + serde_json::from_value(json!(CONTENT_KEY)); + + let content_value = + serde_json::from_value(json!(CONTENT_VALUE)); + + + match content_key { + Ok(content_key) => { + // seed content_key/content_value onto the local node to test local_content expect content present + match content_value { + Ok(content_value) => { + let response = BeaconNetworkApiClient::store(&client.rpc, content_key.clone(), content_value).await; + + if let Err(err) = response { + panic!("{}", &err.to_string()); + } + } + Err(err) => { + panic!("{}", &err.to_string()); + } + } + + // Here we are calling local_content RPC to test if the content is present + let response = BeaconNetworkApiClient::local_content(&client.rpc, content_key).await; + + match response { + Ok(response) => { + match response { + ContentPresent(_) => (), + _ => panic!("Expected ContentPresent, got ContentAbsent") + } + }, + Err(err) => { + panic!("{}", &err.to_string()); + }, + } + } + Err(err) => { + panic!("{}", &err.to_string()); + } + } + } +} + +dyn_async! { + async fn test_add_enr_expect_true<'a>(clients: Vec, _: Option>) { + let client = match clients.into_iter().next() { + Some((client)) => client, + None => { + panic!("Unable to get expected amount of clients from NClientTestSpec"); + } + }; + let (_, enr) = generate_random_remote_enr(); + match BeaconNetworkApiClient::add_enr(&client.rpc, enr).await { + Ok(response) => match response { + true => (), + false => panic!("AddEnr expected to get true and instead got false") + }, + Err(err) => panic!("{}", &err.to_string()), + } + } +} + +dyn_async! { + async fn test_get_enr_non_present<'a>(clients: Vec, _: Option>) { + let client = match clients.into_iter().next() { + Some((client)) => client, + None => { + panic!("Unable to get expected amount of clients from NClientTestSpec"); + } + }; + let (_, enr) = generate_random_remote_enr(); + + if (BeaconNetworkApiClient::get_enr(&client.rpc, enr.node_id()).await).is_ok() { + panic!("GetEnr in this case is not supposed to return a value") + } + } +} + +dyn_async! { + async fn test_get_enr_local_enr<'a>(clients: Vec, _: Option>) { + let client = match clients.into_iter().next() { + Some((client)) => client, + None => { + panic!("Unable to get expected amount of clients from NClientTestSpec"); + } + }; + // get our local enr from NodeInfo + let target_enr = match Discv5ApiClient::node_info(&client.rpc).await { + Ok(node_info) => node_info.enr, + Err(err) => { + panic!("Error getting node info: {err:?}"); + } + }; + + // check if we can fetch data from routing table + match BeaconNetworkApiClient::get_enr(&client.rpc, target_enr.node_id()).await { + Ok(response) => { + if response != target_enr { + panic!("Response from GetEnr didn't return expected Enr") + } + }, + Err(err) => panic!("{}", &err.to_string()), + } + } +} + +dyn_async! { + async fn test_get_enr_enr_present<'a>(clients: Vec, _: Option>) { + let client = match clients.into_iter().next() { + Some((client)) => client, + None => { + panic!("Unable to get expected amount of clients from NClientTestSpec"); + } + }; + let (_, enr) = generate_random_remote_enr(); + + // seed enr into routing table + match BeaconNetworkApiClient::add_enr(&client.rpc, enr.clone()).await { + Ok(response) => match response { + true => (), + false => panic!("AddEnr expected to get true and instead got false") + }, + Err(err) => panic!("{}", &err.to_string()), + } + + // check if we can fetch data from routing table + match BeaconNetworkApiClient::get_enr(&client.rpc, enr.node_id()).await { + Ok(response) => { + if response != enr { + panic!("Response from GetEnr didn't return expected Enr") + } + }, + Err(err) => panic!("{}", &err.to_string()), + } + } +} + +dyn_async! { + async fn test_delete_enr_non_present<'a>(clients: Vec, _: Option>) { + let client = match clients.into_iter().next() { + Some((client)) => client, + None => { + panic!("Unable to get expected amount of clients from NClientTestSpec"); + } + }; + let (_, enr) = generate_random_remote_enr(); + match BeaconNetworkApiClient::delete_enr(&client.rpc, enr.node_id()).await { + Ok(response) => match response { + true => panic!("DeleteEnr expected to get false and instead got true"), + false => () + }, + Err(err) => panic!("{}", &err.to_string()), + }; + } +} + +dyn_async! { + async fn test_delete_enr_enr_present<'a>(clients: Vec, _: Option>) { + let client = match clients.into_iter().next() { + Some((client)) => client, + None => { + panic!("Unable to get expected amount of clients from NClientTestSpec"); + } + }; + let (_, enr) = generate_random_remote_enr(); + + // seed enr into routing table + match BeaconNetworkApiClient::add_enr(&client.rpc, enr.clone()).await { + Ok(response) => match response { + true => (), + false => panic!("AddEnr expected to get true and instead got false") + }, + Err(err) => panic!("{}", &err.to_string()), + } + + // check if data was seeded into the table + match BeaconNetworkApiClient::get_enr(&client.rpc, enr.node_id()).await { + Ok(response) => { + if response != enr { + panic!("Response from GetEnr didn't return expected Enr") + } + }, + Err(err) => panic!("{}", &err.to_string()), + } + + // delete the data from routing table + match BeaconNetworkApiClient::delete_enr(&client.rpc, enr.node_id()).await { + Ok(response) => match response { + true => (), + false => panic!("DeleteEnr expected to get true and instead got false") + }, + Err(err) => panic!("{}", &err.to_string()), + }; + + // check if the enr was actually deleted out of the table or not + if (BeaconNetworkApiClient::get_enr(&client.rpc, enr.node_id()).await).is_ok() { + panic!("GetEnr in this case is not supposed to return a value") + } + } +} + +dyn_async! { + async fn test_lookup_enr_non_present<'a>(clients: Vec, _: Option>) { + let client = match clients.into_iter().next() { + Some((client)) => client, + None => { + panic!("Unable to get expected amount of clients from NClientTestSpec"); + } + }; + let (_, enr) = generate_random_remote_enr(); + + if (BeaconNetworkApiClient::lookup_enr(&client.rpc, enr.node_id()).await).is_ok() { + panic!("LookupEnr in this case is not supposed to return a value") + } + } +} + +dyn_async! { + async fn test_lookup_enr_enr_present<'a>(clients: Vec, _: Option>) { + let client = match clients.into_iter().next() { + Some((client)) => client, + None => { + panic!("Unable to get expected amount of clients from NClientTestSpec"); + } + }; + let (_, enr) = generate_random_remote_enr(); + + // seed enr into routing table + match BeaconNetworkApiClient::add_enr(&client.rpc, enr.clone()).await { + Ok(response) => match response { + true => (), + false => panic!("AddEnr expected to get true and instead got false") + }, + Err(err) => panic!("{}", &err.to_string()), + } + + // check if we can fetch data from routing table + match BeaconNetworkApiClient::lookup_enr(&client.rpc, enr.node_id()).await { + Ok(response) => { + if response != enr { + panic!("Response from LookupEnr didn't return expected Enr") + } + }, + Err(err) => panic!("{}", &err.to_string()), + } + } +} + +dyn_async! { + async fn test_lookup_enr_local_enr<'a>(clients: Vec, _: Option>) { + let client = match clients.into_iter().next() { + Some((client)) => client, + None => { + panic!("Unable to get expected amount of clients from NClientTestSpec"); + } + }; + // get our local enr from NodeInfo + let target_enr = match Discv5ApiClient::node_info(&client.rpc).await { + Ok(node_info) => node_info.enr, + Err(err) => { + panic!("Error getting node info: {err:?}"); + } + }; + + // check if we can fetch data from routing table + match BeaconNetworkApiClient::lookup_enr(&client.rpc, target_enr.node_id()).await { + Ok(response) => { + if response != target_enr { + panic!("Response from LookupEnr didn't return expected Enr") + } + }, + Err(err) => panic!("{}", &err.to_string()), + } + } +} + +dyn_async! { + // test that a node will return a AbsentContent via RecursiveFindContent when the data doesn't exist + async fn test_recursive_find_content_content_absent<'a>(clients: Vec, _: Option>) { + let client = match clients.into_iter().next() { + Some((client)) => client, + None => { + panic!("Unable to get expected amount of clients from NClientTestSpec"); + } + }; + let header_with_proof_key: BeaconContentKey = serde_json::from_value(json!(CONTENT_KEY)).unwrap(); + + match BeaconNetworkApiClient::recursive_find_content(&client.rpc, header_with_proof_key).await { + Ok(result) => { + match result { + ContentInfo::Content{ content: ethportal_api::PossibleBeaconContentValue::ContentAbsent, utp_transfer } => { + if utp_transfer { + panic!("Error: Unexpected RecursiveFindContent response: utp_transfer was supposed to be false"); + } + }, + other => { + panic!("Error: Unexpected RecursiveFindContent response: {other:?}"); + } + } + }, + Err(err) => { + panic!("Error: Unable to get response from RecursiveFindContent request: {err:?}"); + } + } + } +} From d14caea415c43f8cae76cb7fa4a28f42727a379c Mon Sep 17 00:00:00 2001 From: Mario Vega Date: Mon, 5 Feb 2024 15:38:31 -0600 Subject: [PATCH 174/387] clients/prysm-vc: Use REST api (#906) --- clients/prysm-vc/prysm_vc.sh | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/clients/prysm-vc/prysm_vc.sh b/clients/prysm-vc/prysm_vc.sh index ebffd9f089..c7fb6260ff 100755 --- a/clients/prysm-vc/prysm_vc.sh +++ b/clients/prysm-vc/prysm_vc.sh @@ -50,11 +50,10 @@ echo Starting Prysm Validator Client --verbosity="$LOG" \ --accept-terms-of-use=true \ --prater \ - --beacon-rpc-provider="$HIVE_ETH2_BN_API_IP:${HIVE_ETH2_BN_GRPC_PORT:-3500}" \ - --beacon-rpc-gateway-provider="$HIVE_ETH2_BN_API_IP:${HIVE_ETH2_BN_API_PORT:-4000}" \ + --enable-beacon-rest-api=true \ + --beacon-rest-api-provider="http://$HIVE_ETH2_BN_API_IP:${HIVE_ETH2_BN_API_PORT:-4000}" \ --datadir="/data/vc" \ --wallet-dir="/data/validators" \ --wallet-password-file="/wallet.pass" \ --chain-config-file="/hive/input/config.yaml" \ - $builder_option -# NOTE: gRPC/RPC ports are inverted to allow the simulator to access the REST API \ No newline at end of file + $builder_option \ No newline at end of file From 693cba7f69832c51d68ab87d24e21d62a0f2bc81 Mon Sep 17 00:00:00 2001 From: Mario Vega Date: Mon, 5 Feb 2024 15:38:58 -0600 Subject: [PATCH 175/387] simulators/eth2/engine: Fix error checking (#897) --- simulators/eth2/engine/scenarios.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/simulators/eth2/engine/scenarios.go b/simulators/eth2/engine/scenarios.go index a44307afc9..5d04331bd8 100644 --- a/simulators/eth2/engine/scenarios.go +++ b/simulators/eth2/engine/scenarios.go @@ -171,7 +171,7 @@ func TestRPCError(t *hivesim.T, env *tn.Environment, t.Fatalf("FAIL: %v", err) } - if err := testnet.VerifyELHeads(ctx); err == nil { + if err := testnet.VerifyELHeads(ctx); err != nil { t.Fatalf("FAIL: Expected different heads after spoof %v", err) } } @@ -1225,7 +1225,7 @@ func SyncingWithInvalidChain( // Block can't contain an executable payload t.Fatalf("FAIL: Head of the chain is not a bellatrix fork block") } - if payload, err := versionedBlock.ExecutionPayload(); err == nil { + if payload, err := versionedBlock.ExecutionPayload(); err != nil { t.Fatalf( "FAIL: error getting execution payload: %v", err, From c1d8cfc40380a68e2f901ac93f0a06921b7095a5 Mon Sep 17 00:00:00 2001 From: Mario Vega Date: Mon, 5 Feb 2024 15:39:49 -0600 Subject: [PATCH 176/387] clients/lodestar-bn: Add optional flag to disable peer scoring (#911) --- clients/lodestar-bn/lodestar_bn.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/clients/lodestar-bn/lodestar_bn.sh b/clients/lodestar-bn/lodestar_bn.sh index 3837b60ad4..a14bb4aeaa 100755 --- a/clients/lodestar-bn/lodestar_bn.sh +++ b/clients/lodestar-bn/lodestar_bn.sh @@ -38,6 +38,7 @@ bootnodes_option=$([[ "$HIVE_ETH2_BOOTNODE_ENRS" == "" ]] && echo "" || echo "-- metrics_option=$([[ "$HIVE_ETH2_METRICS_PORT" == "" ]] && echo "" || echo "--metrics --metrics.address=$CONTAINER_IP --metrics.port=$HIVE_ETH2_METRICS_PORT") builder_option=$([[ "$HIVE_ETH2_BUILDER_ENDPOINT" == "" ]] && echo "" || echo "--builder --builder.urls $HIVE_ETH2_BUILDER_ENDPOINT") echo BUILDER=$builder_option +peer_score_option=$([[ "$HIVE_ETH2_DISABLE_PEER_SCORING" == "" ]] && echo "" || echo "--disablePeerScoring") echo "bootnodes option : ${bootnodes_option}" @@ -64,6 +65,7 @@ node /usr/app/node_modules/.bin/lodestar \ $metrics_option \ $bootnodes_option \ $builder_option \ + $peer_score_option \ --enr.ip="${CONTAINER_IP}" \ --enr.tcp="${HIVE_ETH2_P2P_TCP_PORT:-9000}" \ --enr.udp="${HIVE_ETH2_P2P_UDP_PORT:-9000}" \ From 2295e9a67428570daafccd253c8efe1f0bc510f2 Mon Sep 17 00:00:00 2001 From: spencer Date: Wed, 7 Feb 2024 00:28:37 +0700 Subject: [PATCH 177/387] clients/erigon: Configure snapshots flag (#992) clients/erigon/erigon.sh: Configure snapshots flag. --- clients/erigon/erigon.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/clients/erigon/erigon.sh b/clients/erigon/erigon.sh index 63fb3e0dc1..4877802b67 100644 --- a/clients/erigon/erigon.sh +++ b/clients/erigon/erigon.sh @@ -139,6 +139,9 @@ if [ "$HIVE_TERMINAL_TOTAL_DIFFICULTY" != "" ]; then FLAGS="$FLAGS --authrpc.addr=0.0.0.0 --authrpc.jwtsecret=/jwt.secret" fi +# Configure snapshots. +FLAGS="$FLAGS --snapshots=false" + # Launch the main client. FLAGS="$FLAGS --nat=none" echo "Running erigon with flags $FLAGS" From 9c14d61448dc1b924efd27268071b5cde79c257f Mon Sep 17 00:00:00 2001 From: spencer Date: Wed, 7 Feb 2024 16:42:05 +0700 Subject: [PATCH 178/387] clients/go-ethereum: Remove miner gasprice flag (#993) clients/go-ethereum/geth.sh: Remove miner gasprice flag. --- clients/go-ethereum/geth.sh | 1 - 1 file changed, 1 deletion(-) diff --git a/clients/go-ethereum/geth.sh b/clients/go-ethereum/geth.sh index 9f05cbc34e..5c8d83f97a 100644 --- a/clients/go-ethereum/geth.sh +++ b/clients/go-ethereum/geth.sh @@ -140,7 +140,6 @@ fi if [ "$HIVE_MINER_EXTRA" != "" ]; then FLAGS="$FLAGS --miner.extradata $HIVE_MINER_EXTRA" fi -FLAGS="$FLAGS --miner.gasprice 16000000000" # Configure LES. if [ "$HIVE_LES_SERVER" == "1" ]; then From b07223b59a6f9248271c8ccab9ab6cc6ac7e7dd7 Mon Sep 17 00:00:00 2001 From: Mario Vega Date: Wed, 7 Feb 2024 03:42:26 -0600 Subject: [PATCH 179/387] simulators/ethereum/engine: Fixes for execution-apis#498 (#974) * simulators/ethereum/engine: Fix expected error on fcu tests * simulators/ethereum/engine: Get Payload delay at spec level * simulators/ethereum/engine: Correct error code on inconsistent FcU * simulators/ethereum/engine: Invaild Payload Attributes Expectation Modification --- .../ethereum/engine/suites/cancun/tests.go | 28 +++++++++---------- .../engine/suites/engine/forkchoice.go | 3 +- .../suites/engine/payload_attributes.go | 9 ++---- simulators/ethereum/engine/test/spec.go | 7 +++++ 4 files changed, 24 insertions(+), 23 deletions(-) diff --git a/simulators/ethereum/engine/suites/cancun/tests.go b/simulators/ethereum/engine/suites/cancun/tests.go index da272edc46..689843d894 100644 --- a/simulators/ethereum/engine/suites/cancun/tests.go +++ b/simulators/ethereum/engine/suites/cancun/tests.go @@ -531,7 +531,7 @@ var Tests = []test.Spec{ - Payload Attributes uses Shanghai timestamp - Payload Attributes Beacon Root is null - Verify that client returns INVALID_PARAMS_ERROR. + Verify that client returns INVALID_PAYLOAD_ATTRIBUTES. `, MainFork: config.Cancun, ForkHeight: 2, @@ -541,12 +541,12 @@ var Tests = []test.Spec{ NewPayloads{ FcUOnPayloadRequest: &helper.UpgradeForkchoiceUpdatedVersion{ ForkchoiceUpdatedCustomizer: &helper.BaseForkchoiceUpdatedCustomizer{ - ExpectedError: globals.INVALID_PARAMS_ERROR, + ExpectedError: globals.INVALID_PAYLOAD_ATTRIBUTES, }, }, ExpectationDescription: fmt.Sprintf(` - ForkchoiceUpdatedV3 before Cancun with any null field must return INVALID_PARAMS_ERROR (code %d) - `, *globals.INVALID_PARAMS_ERROR), + ForkchoiceUpdatedV3 before Cancun with any null field must return INVALID_PAYLOAD_ATTRIBUTES (code %d) + `, *globals.INVALID_PAYLOAD_ATTRIBUTES), }, }, }, @@ -585,13 +585,13 @@ var Tests = []test.Spec{ // ForkchoiceUpdatedV2 before cancun with beacon root &CancunBaseSpec{ BaseSpec: test.BaseSpec{ - Name: "ForkchoiceUpdatedV2 To Request Shanghai Payload, Non-Null Beacon Root ", + Name: "ForkchoiceUpdatedV2 To Request Shanghai Payload, Non-Null Beacon Root", About: ` Test sending ForkchoiceUpdatedV2 to request a Shanghai payload: - Payload Attributes uses Shanghai timestamp - Payload Attributes Beacon Root is non-null - Verify that client returns INVALID_PARAMS_ERROR. + Verify that client returns INVALID_PAYLOAD_ATTRIBUTES. `, MainFork: config.Cancun, ForkHeight: 2, @@ -603,11 +603,11 @@ var Tests = []test.Spec{ PayloadAttributesCustomizer: &helper.BasePayloadAttributesCustomizer{ BeaconRoot: &(common.Hash{}), }, - ExpectedError: globals.INVALID_PARAMS_ERROR, + ExpectedError: globals.INVALID_PAYLOAD_ATTRIBUTES, }, ExpectationDescription: fmt.Sprintf(` - ForkchoiceUpdatedV2 before Cancun with beacon root field must return INVALID_PARAMS_ERROR (code %d) - `, *globals.INVALID_PARAMS_ERROR), + ForkchoiceUpdatedV2 before Cancun with beacon root field must return INVALID_PAYLOAD_ATTRIBUTES (code %d) + `, *globals.INVALID_PAYLOAD_ATTRIBUTES), }, }, }, @@ -621,7 +621,7 @@ var Tests = []test.Spec{ - Payload Attributes uses Cancun timestamp - Payload Attributes Beacon Root is non-null - Verify that client returns INVALID_PARAMS_ERROR. + Verify that client returns INVALID_PAYLOAD_ATTRIBUTES. `, MainFork: config.Cancun, ForkHeight: 1, @@ -634,12 +634,12 @@ var Tests = []test.Spec{ PayloadAttributesCustomizer: &helper.BasePayloadAttributesCustomizer{ BeaconRoot: &(common.Hash{}), }, - ExpectedError: globals.INVALID_PARAMS_ERROR, + ExpectedError: globals.INVALID_PAYLOAD_ATTRIBUTES, }, }, ExpectationDescription: fmt.Sprintf(` - ForkchoiceUpdatedV2 after Cancun with beacon root field must return INVALID_PARAMS_ERROR (code %d) - `, *globals.INVALID_PARAMS_ERROR), + ForkchoiceUpdatedV2 after Cancun with beacon root field must return INVALID_PAYLOAD_ATTRIBUTES (code %d) + `, *globals.INVALID_PAYLOAD_ATTRIBUTES), }, }, }, @@ -1813,8 +1813,6 @@ func init() { Customizer: &helper.BasePayloadAttributesCustomizer{ RemoveBeaconRoot: true, }, - // Error is expected on syncing because V3 checks all fields to be present - ErrorOnSync: true, }, } { Tests = append(Tests, t) diff --git a/simulators/ethereum/engine/suites/engine/forkchoice.go b/simulators/ethereum/engine/suites/engine/forkchoice.go index 81ef794143..bc90020733 100644 --- a/simulators/ethereum/engine/suites/engine/forkchoice.go +++ b/simulators/ethereum/engine/suites/engine/forkchoice.go @@ -7,6 +7,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/hive/simulators/ethereum/engine/clmock" "github.com/ethereum/hive/simulators/ethereum/engine/config" + "github.com/ethereum/hive/simulators/ethereum/engine/globals" "github.com/ethereum/hive/simulators/ethereum/engine/helper" "github.com/ethereum/hive/simulators/ethereum/engine/test" typ "github.com/ethereum/hive/simulators/ethereum/engine/types" @@ -79,7 +80,7 @@ func (tc InconsistentForkchoiceTest) Execute(t *test.Env) { inconsistentFcU.FinalizedBlockHash = alternativePayloads[len(canonicalPayloads)-3].BlockHash } r := t.TestEngine.TestEngineForkchoiceUpdated(&inconsistentFcU, nil, t.CLMock.LatestPayloadBuilt.Timestamp) - r.ExpectError() + r.ExpectErrorCode(*globals.INVALID_FORKCHOICE_STATE) // Return to the canonical chain r = t.TestEngine.TestEngineForkchoiceUpdated(&t.CLMock.LatestForkchoice, nil, t.CLMock.LatestPayloadBuilt.Timestamp) diff --git a/simulators/ethereum/engine/suites/engine/payload_attributes.go b/simulators/ethereum/engine/suites/engine/payload_attributes.go index 0f246a50ce..91b9cadae4 100644 --- a/simulators/ethereum/engine/suites/engine/payload_attributes.go +++ b/simulators/ethereum/engine/suites/engine/payload_attributes.go @@ -14,7 +14,6 @@ type InvalidPayloadAttributesTest struct { Description string Customizer helper.PayloadAttributesCustomizer Syncing bool - ErrorOnSync bool } func (s InvalidPayloadAttributesTest) WithMainFork(fork config.Fork) test.Spec { @@ -69,12 +68,8 @@ func (tc InvalidPayloadAttributesTest) Execute(t *test.Env) { if tc.Syncing { // If we are SYNCING, the outcome should be SYNCING regardless of the validity of the payload atttributes r := t.TestEngine.TestEngineForkchoiceUpdated(&fcu, attr, t.CLMock.LatestPayloadBuilt.Timestamp) - if tc.ErrorOnSync { - r.ExpectError() - } else { - r.ExpectPayloadStatus(test.Syncing) - r.ExpectPayloadID(nil) - } + r.ExpectPayloadStatus(test.Syncing) + r.ExpectPayloadID(nil) } else { r := t.TestEngine.TestEngineForkchoiceUpdated(&fcu, attr, t.CLMock.LatestPayloadBuilt.Timestamp) r.ExpectError() diff --git a/simulators/ethereum/engine/test/spec.go b/simulators/ethereum/engine/test/spec.go index bda2dfd4e6..52d6df775d 100644 --- a/simulators/ethereum/engine/test/spec.go +++ b/simulators/ethereum/engine/test/spec.go @@ -4,6 +4,7 @@ import ( "errors" "fmt" "math/big" + "time" "github.com/ethereum/go-ethereum/core" "github.com/ethereum/hive/simulators/ethereum/engine/clmock" @@ -60,6 +61,9 @@ type BaseSpec struct { // CL Mocker configuration for time increments BlockTimestampIncrement uint64 + // CL Mocker configuration for payload delay in seconds + GetPayloadDelay uint64 + // CL Mocker configuration for slots to `safe` and `finalized` respectively SlotsToSafe *big.Int SlotsToFinalized *big.Int @@ -109,6 +113,9 @@ func (s BaseSpec) ConfigureCLMock(cl *clmock.CLMocker) { cl.SafeSlotsToImportOptimistically = s.SafeSlotsToImportOptimistically } cl.BlockTimestampIncrement = new(big.Int).SetUint64(s.GetBlockTimeIncrements()) + if s.GetPayloadDelay != 0 { + cl.PayloadProductionClientDelay = time.Duration(s.GetPayloadDelay) * time.Second + } } func (s BaseSpec) GetAbout() string { From e7f4a4c92be5b7c5c34e7555cb60304538524eb7 Mon Sep 17 00:00:00 2001 From: Kolby Moroz Liebl <31669092+KolbyML@users.noreply.github.com> Date: Fri, 9 Feb 2024 09:47:51 -0700 Subject: [PATCH 180/387] simulators/portal: refactor simulators to run multiple suites (#994) This is just to cut down on the number of Rust projects and Dockerfiles. --- .circleci/continue_config.yml | 2 +- clients/trin-bridge/trin_bridge.sh | 2 +- .../portal/beacon/{rpc-compat => }/Cargo.toml | 2 +- .../portal/beacon/{rpc-compat => }/Dockerfile | 10 +- simulators/portal/beacon/src/main.rs | 43 +++++++++ .../src => src/suites}/constants.rs | 3 + simulators/portal/beacon/src/suites/mod.rs | 2 + .../src/main.rs => src/suites/rpc_compat.rs} | 51 ++-------- .../history/{portal-interop => }/Cargo.toml | 9 +- .../history/{portal-interop => }/Dockerfile | 10 +- .../history/portal-interop/src/constants.rs | 1 - .../portal/history/portal-mesh/Cargo.toml | 14 --- .../portal/history/portal-mesh/Dockerfile | 24 ----- .../portal/history/rpc-compat/Cargo.toml | 14 --- .../portal/history/rpc-compat/Dockerfile | 24 ----- simulators/portal/history/src/main.rs | 92 +++++++++++++++++++ .../src => src/suites}/constants.rs | 4 +- .../src/main.rs => src/suites/interop.rs} | 49 ++-------- .../src/main.rs => src/suites/mesh.rs} | 44 ++------- simulators/portal/history/src/suites/mod.rs | 5 + .../src/main.rs => src/suites/rpc_compat.rs} | 45 ++------- .../src/main.rs => src/suites/trin_bridge.rs} | 43 +-------- .../portal/history/trin-bridge/Cargo.toml | 15 --- .../portal/history/trin-bridge/Dockerfile | 40 -------- 24 files changed, 195 insertions(+), 353 deletions(-) rename simulators/portal/beacon/{rpc-compat => }/Cargo.toml (96%) rename simulators/portal/beacon/{rpc-compat => }/Dockerfile (66%) create mode 100644 simulators/portal/beacon/src/main.rs rename simulators/portal/beacon/{rpc-compat/src => src/suites}/constants.rs (59%) create mode 100644 simulators/portal/beacon/src/suites/mod.rs rename simulators/portal/beacon/{rpc-compat/src/main.rs => src/suites/rpc_compat.rs} (98%) rename simulators/portal/history/{portal-interop => }/Cargo.toml (94%) mode change 100644 => 100755 rename simulators/portal/history/{portal-interop => }/Dockerfile (71%) delete mode 100644 simulators/portal/history/portal-interop/src/constants.rs delete mode 100644 simulators/portal/history/portal-mesh/Cargo.toml delete mode 100644 simulators/portal/history/portal-mesh/Dockerfile delete mode 100755 simulators/portal/history/rpc-compat/Cargo.toml delete mode 100644 simulators/portal/history/rpc-compat/Dockerfile create mode 100644 simulators/portal/history/src/main.rs rename simulators/portal/history/{trin-bridge/src => src/suites}/constants.rs (91%) rename simulators/portal/history/{portal-interop/src/main.rs => src/suites/interop.rs} (95%) rename simulators/portal/history/{portal-mesh/src/main.rs => src/suites/mesh.rs} (91%) create mode 100644 simulators/portal/history/src/suites/mod.rs rename simulators/portal/history/{rpc-compat/src/main.rs => src/suites/rpc_compat.rs} (94%) rename simulators/portal/history/{trin-bridge/src/main.rs => src/suites/trin_bridge.rs} (85%) delete mode 100644 simulators/portal/history/trin-bridge/Cargo.toml delete mode 100644 simulators/portal/history/trin-bridge/Dockerfile diff --git a/.circleci/continue_config.yml b/.circleci/continue_config.yml index 399370a88a..992ff04cdd 100644 --- a/.circleci/continue_config.yml +++ b/.circleci/continue_config.yml @@ -75,7 +75,7 @@ jobs: # this makes sure the rust code is good rust-simulators: docker: - - image: cimg/rust:1.71.1 + - image: cimg/rust:1.75.0 steps: - checkout - run: diff --git a/clients/trin-bridge/trin_bridge.sh b/clients/trin-bridge/trin_bridge.sh index d67e0a94b8..5828de0cb7 100644 --- a/clients/trin-bridge/trin_bridge.sh +++ b/clients/trin-bridge/trin_bridge.sh @@ -13,4 +13,4 @@ else exit 1 fi -RUST_LOG=debug portal-bridge --node-count 1 $FLAGS --executable-path ./usr/bin/trin --mode test:/test_data_collection_of_forks_blocks.yaml --external-ip $IP_ADDR --epoch-accumulator-path . trin +RUST_LOG=debug portal-bridge --node-count 1 $FLAGS --executable-path ./usr/bin/trin --mode test:/test_data_collection_of_forks_blocks.yaml --el-provider test --external-ip $IP_ADDR --epoch-accumulator-path . trin diff --git a/simulators/portal/beacon/rpc-compat/Cargo.toml b/simulators/portal/beacon/Cargo.toml similarity index 96% rename from simulators/portal/beacon/rpc-compat/Cargo.toml rename to simulators/portal/beacon/Cargo.toml index 44de28776a..6199c2fbde 100755 --- a/simulators/portal/beacon/rpc-compat/Cargo.toml +++ b/simulators/portal/beacon/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "rpc-compat" +name = "beacon" version = "0.1.0" authors = ["Ognyan Genev ", "Kolby ML (Moroz Liebl) "] edition = "2021" diff --git a/simulators/portal/beacon/rpc-compat/Dockerfile b/simulators/portal/beacon/Dockerfile similarity index 66% rename from simulators/portal/beacon/rpc-compat/Dockerfile rename to simulators/portal/beacon/Dockerfile index 6a0569bcbd..9df9fbd849 100644 --- a/simulators/portal/beacon/rpc-compat/Dockerfile +++ b/simulators/portal/beacon/Dockerfile @@ -1,8 +1,8 @@ -FROM rust:1.71.1 AS builder +FROM rust:1.75.0 AS builder # create a new empty shell project -RUN USER=root cargo new --bin rpc-compat -WORKDIR /rpc-compat +RUN USER=root cargo new --bin beacon +WORKDIR /beacon RUN apt-get update && apt-get install clang -y @@ -19,8 +19,8 @@ FROM ubuntu:22.04 RUN apt update && apt install wget -y # copy build artifacts from build stage -COPY --from=builder /rpc-compat/target/release/rpc-compat . +COPY --from=builder /beacon/target/release/beacon . ENV RUST_LOG=debug -ENTRYPOINT ["./rpc-compat"] +ENTRYPOINT ["./beacon"] diff --git a/simulators/portal/beacon/src/main.rs b/simulators/portal/beacon/src/main.rs new file mode 100644 index 0000000000..c1a346fe2e --- /dev/null +++ b/simulators/portal/beacon/src/main.rs @@ -0,0 +1,43 @@ +mod suites; + +use hivesim::{Simulation, Suite, TestSpec}; +use suites::rpc_compat::run_rpc_compat_test_suite; + +#[tokio::main] +async fn main() { + tracing_subscriber::fmt::init(); + let mut beacon_rpc_compat = Suite { + name: "beacon-rpc-compat".to_string(), + description: "The RPC-compatibility test suite runs a set of RPC related tests against a + running node. It tests client implementations of the JSON-RPC API for + conformance with the portal network API specification." + .to_string(), + tests: vec![], + }; + + beacon_rpc_compat.add(TestSpec { + name: "client launch".to_string(), + description: "This test launches the client and collects its logs.".to_string(), + always_run: false, + run: run_rpc_compat_test_suite, + client: None, + }); + + let sim = Simulation::new(); + run_suite(sim, vec![beacon_rpc_compat]).await; +} + +async fn run_suite(host: Simulation, suites: Vec) { + for suite in suites { + let name = suite.clone().name; + let description = suite.clone().description; + + let suite_id = host.start_suite(name, description, "".to_string()).await; + + for test in &suite.tests { + test.run_test(host.clone(), suite_id, suite.clone()).await; + } + + host.end_suite(suite_id).await; + } +} diff --git a/simulators/portal/beacon/rpc-compat/src/constants.rs b/simulators/portal/beacon/src/suites/constants.rs similarity index 59% rename from simulators/portal/beacon/rpc-compat/src/constants.rs rename to simulators/portal/beacon/src/suites/constants.rs index ff8cb6ad9f..1ae0093185 100644 --- a/simulators/portal/beacon/rpc-compat/src/constants.rs +++ b/simulators/portal/beacon/src/suites/constants.rs @@ -1,2 +1,5 @@ pub const HIVE_PORTAL_NETWORKS_SELECTED: &str = "HIVE_PORTAL_NETWORKS_SELECTED"; pub const BEACON_STRING: &str = "beacon"; + +// trin-bridge constants +pub const TRIN_BRIDGE_CLIENT_TYPE: &str = "trin-bridge"; diff --git a/simulators/portal/beacon/src/suites/mod.rs b/simulators/portal/beacon/src/suites/mod.rs new file mode 100644 index 0000000000..7e92c503f8 --- /dev/null +++ b/simulators/portal/beacon/src/suites/mod.rs @@ -0,0 +1,2 @@ +pub mod constants; +pub mod rpc_compat; diff --git a/simulators/portal/beacon/rpc-compat/src/main.rs b/simulators/portal/beacon/src/suites/rpc_compat.rs similarity index 98% rename from simulators/portal/beacon/rpc-compat/src/main.rs rename to simulators/portal/beacon/src/suites/rpc_compat.rs index 9fde98240c..2bdc2ce73a 100644 --- a/simulators/portal/beacon/rpc-compat/src/main.rs +++ b/simulators/portal/beacon/src/suites/rpc_compat.rs @@ -1,13 +1,13 @@ -mod constants; - -use crate::constants::BEACON_STRING; -use crate::constants::HIVE_PORTAL_NETWORKS_SELECTED; +use crate::suites::constants::BEACON_STRING; +use crate::suites::constants::HIVE_PORTAL_NETWORKS_SELECTED; +use crate::suites::constants::TRIN_BRIDGE_CLIENT_TYPE; use ethportal_api::types::beacon::ContentInfo; use ethportal_api::types::enr::generate_random_remote_enr; use ethportal_api::Discv5ApiClient; use ethportal_api::PossibleBeaconContentValue::{ContentAbsent, ContentPresent}; use ethportal_api::{BeaconContentKey, BeaconNetworkApiClient}; -use hivesim::{dyn_async, Client, NClientTestSpec, Simulation, Suite, Test, TestSpec}; +use hivesim::types::ClientDefinition; +use hivesim::{dyn_async, Client, NClientTestSpec, Test}; use serde_json::json; use std::collections::HashMap; @@ -15,47 +15,12 @@ use std::collections::HashMap; const CONTENT_KEY: &str = "0x10bd9f42d9a42d972bdaf4dee84e5b419dd432b52867258acb7bcc7f567b6e3af1"; const CONTENT_VALUE: &str = "0xbba4da96d4600000814453665c4b46dad568d69d0a3d211c70829ce7c5c17549713ed0996c8743e6b55b3797ea19c0eebac07b0e163fae9aa71bc2561705e492dd206730e8d7e731e621d2d7039ded027d9910bd41b23f642c609986a33f46fb3187faf6a0abc1809811c919b69e9ecbe5c129e3bc6cc6811de879149bf856984cc2a5162aed445600abaccb10a1b48694f150de473b893184c8200c822abc86d3d8d3bab7918b55963553bf9be9d2144a36827db66449e2302a49c72837b3e793666321ffa0a45089cb5f6af2380686485c4a85aa460dafff2c2681ffc4dd2a57ad488e53e904734908fa7759d18edb7e58d54ae6565774b607fd7488f013b6d02cd13beb3ed2a41d983f02f7eeac4b7f4222474252ef4538b5b09c3fe7ba6899412839fb79588387fd75faf7225e9dfd65bb46a795929d1a6a83113cc89c390ef293f9b73f336157e2f4abd6867a7a3aad6cb0472e1f17a73f913822642688fb28944b9df775593ac8a77bac24608066588ffc11a91b0c85d3f078be13ff586f7cdc20a23473f7a8c800c039edaa2ea42e15be9dbd47638ff4389b0a4e7daebe365aaf47ddbc16d3737ef8f4ed64da4ff89064056a794f9232ab744f72c5ae7fc674890d07027dc5541eaaf8dc1edc8d8fb4d5c763053a53697d9e5100ad9afa1e9fc888cf1197ad56d34d0f290b5d73dcb191ca444671fa433332f9d451efa4623ccaa1ca061827b86eafc6f771e184c48f4a3ab88c44829cb86aa86516cddcbe07bb52957e926dbb7bea95e9adb19ab3f99ff83279b5e41dd5cab1b5ee617340c8b46536a4e0b60d7235423760c2a72910dc838457a5a6c2d96bb1fe3c8b1cc292af040bcc5fb030d407a283dab7cf28b5fc8f651afb812b2b138c2dc05c2606320fd82ebe8ca7843ab0058ccdbdac8395bd65df3327fcbe1d8ac52b5e8e8970acf53a46d1ffa4ef16a472e24746a05f13399a7613a2b483855e7d67348cc8b51afec047355d3ba2a1f19d1e2fe3ee7b5137b4d0d257942118700ce0b506ee1b8b0c542ac600ffa734a960b60c13e89d3f60c5de14e3a557159326ae0eaa2328ee3d57ee2406ae9dae30d2bda566d5e22a2bf051a5ca0485b32edb939b949a967d315c0b771ae169433c6b683e0f58e5a4d874e4577d8ec74ee5466491a61cbd96f3d8ae11bb3d5818fda22b5f7914e82ff54d868983315df52ed8ce53b438b6f147343af4508813063e68b6416ddeb0eb0de1c494f0b40211bdf757919a28ef984ca6091f15f5953e0c8250fa5cfe4f1f5e54acd9faa8b5efe29a5daaf0494151b73f6dcc9f8b08558535b1b4887d275cd3feac9424be96efd63191c6fadebe8825917b58a7a286cbdba16cb3df97f1a94c1e41260bc4980ec4ed34032e8c714fe1ff769f8a79217a4a25c1efc38714c68eee4b7f8088e75fc044349471caa4b7fe94793d82e46e81f7bcac3ee933c043bcafb97882ee20d9d45d7c459934926b3079411afea06ae8cba6f092824313ca9998e067051b638b77ea5b90fb69af4ccc66218945554d9b78c3a5ea25d7e4eb9d68bbb40cb99176dd8ced6478af77e10570e5329683d66a2dcddfbcfac27f44ca51e7eb5ebe686e3bfae17a8415a2a13b29149c4392e4226a31225ba4af8df06e20d34c0a0b50376c28e0ff61f55588f8d77e481a3bda3eafb6af54015a2fe2b85c1292d883e4b074123a873f7bace327f77b37239841b1849e87fcd9f1f4c0b5e02ebaac21e3fda7c1f6e5c0bbde58071ff0101cb20fd117b265a8e87063f0b4c0ae6342af61107c2c2d0c9a68b39e8e609dcaea876bb2257d5c5a1e09c0451782ad560b8be7489a4c1e446b1fefe710d1b5d5fb2960d05e931f6fe0b6b85d4a9d4609370308774952614e889827eb7fa6017d5ab5285494620d2a3ead19245e4b6d389d503e7fb3faa7d71eaebd63d106bddee15ccbf80221a12d4cdee182fdabfcb8bd84db3e84cfa6b67d20ba17b7f96f2c9a5206dbdb251094ea01b174f664e3ecd145b876db7b5f900e23ff823e32cd19ee8a2dd30265e196615c6ce66d688fd344d68ffa7a7ad53e1570e5849d06a9d35c26cd41edfeaba7c0fffa5e2e017876d4a10453c906ac9f569ebe129692d49e6d4bfa42a4fe8f0838fcba8107576fa0b970433e1930c575f5827593bacbf77162a8187f7befbfc427bfca2273d24ddc67d7dea6116a1f25a02baf10460040120b6570c01b69a742d260351e64c1911daa80a4c8ca60e2c94b275c864f76a27f8edd99ae770d666f359cd4596978bbc50151ef313955cd867e9b1d4a76d501bc9999c1a5390cdc76333912ed4a3dd34290669a44392917052b1867d68f5ddd332f64e380d4631ded0ebecb92d09bcd7ac2a6f5f39e251f6b1070d614f716e2fb95d9f26aa8b1f8f201e6d473b2ea2624eca1cf297934720ce8e708b2cd1b992a9296232cda34f470a6d79f0ae5f2025f893bd15028988e14dd8074ce97010091de70685584e28bee1963f58a262c85df328377cb0c5cb3f39fe568684439916ec121766afe27abe8fd25ed47c06700b8629f27be989ae3e439aefec3861d3ddc2eab0281868e35001e26f98d7bff81c63c22ecbfb48060d0d8d1235ce28d9080dd2de2ac0408d583b8567309c4dbb0318dadfdeca8b8815fb08dd266955a05101c8a2432530535333ecdfb4f428eed385fb25a101c10a1f06e0d921978f3ea9f999459c488dde6035c1a6eca88998528f8e144b36320d6bb688450c9d394c3089d509cc8a906abb6c43a8b0537707c5bf7b1a9a7e573829fa3c9a415fb0001ffa4b4227e15f1e1f22d65996933cdf20ce49ceff76834f690caf6e012e209e34a4e814ed62d25b66424d5a788a4efc7aae897eb12ae3e51665f478332181fd04a995696afa831ebd6056629bc066cf36ddc88381d3c88fffd68e3cdc1fd9b06105066119994ae81040503f1f0a10c4153a11d1e609adfb9018431c31c1ff2807faab0e7af0239488bc063dec1190981964affee89ab22faaf23e3c24cbcc7d769e7102208d576bd26a640878650ca345aa680befa367dd105b3ebfd99391d53c66afd6154cfe7dd8813fe39059e8dc5027924e25cf94d13a9fa4ba1f16cfb442c8a8d3f898d141d9efae49249fab1d05cb3f9fb900aa0ee6aa232911822e0c17998201c896ee15deff92aab0c34413d132ab731c682c9f3b3d745e6c5e18e673c16a56c4646ec0c2ca04654bab28bb7a5ca579a9170ba9ff3e5363bce737acfdb1eac18377e33978ae4a82dba9bbd4419221e58a10ae80f91067754051ad9c16606b72752f43ecaeeefd9f0af140d0d4461a3d890cb07cbe2a9b001571001fefcc7f0e1b92abaa097e1566d5340853515a15fe4256b83ffe2b723e60e206b75f27ca1b99b1164484197d115a93f85aada209f8ab8a31ce3a66f23c820698febb8e95ba96ac28fca74bca0d504dca4cdba7e85bdaf7fef7b0f17d4b6fafe4c3e9810ee9fc1a83466fc3875eb8e22b2ad6e068b9b18bd9f60f9e66f823cc52a2ea0eea5a1c3e7756d82811c9da030bbc3a51c1150ca8cbf5ba38b106b185e0ac4331e8a0d653a66cad60427efc8b7dbdb817999e346152c197e1b2d61a5a9d7f2ed328aecab1ffee39b76c17dd3577cc399ac7c7e1cc48e4fac0aacc1451793db4f91b593f0ca06236425417238ea6d40e1837a9928af864d8b34fde1cee5bc2bc7e69bb9908c8de49df8c821f0fd6b497657b4ed5cde9502e86ae3e6f7c15189a96b31d30f59faa760de83831397c7f99cfc7e23f2687aaf2ae64deba1902f491299ae927ed9c10ff485f576cef160dd32c11e33003c9eaf468db444bdb715d97acc8df5e08e6aec88d91f747e897fffad73af7e05b0c5cfe23deb931f489763e876088841e9d7358c94619229ef27149b51f0a322200c103e80588e1f6f31a47f40b3b858d0995af11b99d7baa4c7cc145d58e14c240954234e32691001e9cdcde67429cad3962f37fd84a7c61857540799b8ff3d3cda254ba05880e680230712a0618054dd0c89b862e419172a0282277865a2dd45e14a49e31e73db870d70f238a29546e54eb601cc76b8837ceea671faa84f096bfb4b7eded007e12d2efc4f9ff8a421b2000a75c5a01695ab33f027429361fc9f46d0bd883d96a1f9b4b329a9c7256e45f13a298590c0ad15e3c16c73b541bef836e81ba5e18c844c1165fa23932c40287257bedeea72af52893990bd5a6bb57df63a2b6a1565680945f87326e38508918c0020e7f8cc2a26e381e34d8197cc45e0dfe975331d65494aeabece73b741ac9b192e930439dab6b62b91a9dac9f909d78111dd62a5f0561f5f47a9a60c5d55f309ddd4b7b94efc87dfab8effaba010041abafb8757d0f681e1a25939cc5ecf764bd83f2832653feaa0a18d86336aed2c73c84199afdd03171e74fc96b865d0bf7f4f5a54c15c823f27b209b5d34b64cedc5baeb0184b2d9524b012a2e4fd70dd539db32f6964c34d16399a16c5499597423149a97723cdf5b5deb33693d456213793adbe52ec75ea8934e38ecd9299ff8d57ef12e9b4e14806d103954b86321ea42aad93daf0ea876befa5bc2a7659b3608e9efff93a7b5201478798d65d892aeae9ded2fad2ea4007c0cfd35727d44f8ca4c7a52b4e331621e7dab1aa1f7aec02c7e7c3ae36489b421042a9f331cc609990c589f1048c10d1ff1873e9a871477ec91acfbdedcec1cc83e70447a117325ab16b1a69389f4f786acd857064e82ad1da1257e3ed9820be84d6972a5f90ccd96c6409124c845a3feb23a7b862dd28e094e2620ecc39fb590e6cb7444e66f202cf8922ccc47b807776a672aa35e4434e27ba331d0666ee19b472556951fa250b021dce47ac13a33264fcb87597ce6a7d66391d19da9758ef1ee7d19e1f774ce54c5e92a487735cbffd941210fcfc8c42b7af9fcbe376863e4e919916f0d0ccf8fd05d1d7b3b41401864f4c179bcbdfff434dfc4dc4171d35ce0887a0ac8e3d17f150411a09a74e02e47fb8f537f3add4377e0381015a79a5fc12fd86b521dde790030f0ddc7cc34305c0bc5e9e3b22460d405a3cf28761c0e7ada75fc69d11430c04bf856870b689e40491f49f76d18b6c62ee4a4937d2506e5658b2e71adf7fc9aefe03e6fedc0251a99760209fdad863928ff8050c39c8abeced80ecdb13fe10f0f65045f2e2d41958e49bbb4c4fc1c5fc15fddc7644e5366cb4e4416bb1a6afda3a8bcc5f7c51ff01135f7643dabe355f4cc241943521cfd15ea8c2e51bf44e17354353436ea6059f90e393790af9a011bda79f84675f83d3e4ab18a7530369a953490c20ebf4430a5398bf4738abe51a6e43974999d316259501c60c8d3a4efcbe8177833c67658921351d44588c2339704b9d6bcbe30f95b94328cf423be2fd387321e447dd5571a0c1992d091f4397fc47a835e25c6355488cbf4e2a06984410a8df4fb8bf596927531d59bb74f72e147453de54b4b82c99b836fe255878b4156eca6caac99209c9f0054f32c2138c9ecc834a2640d8ea4d6cb521bdc12f12d055774414ab86f995032ef0bf03ad45f1403161b848bd4ef4400e1778f32f5cba7274ffa117a1f3c96fcd6f0e387af6302ce40ed69cdb50b88c76388a3b80c3954c710f6617e44a986cd65909ed542614c1c6f80da78461192553d6e077e9bf8ea20b6016cdc0c995ae07bf473df39af8d0dafa160f252d58d394930d46ef2b2f0a7d1e48d8ef2aaac8a9ec0b7f00145922883de52436598fdf1fba9f1283d31b70ce0ae4daf3db610d970ec2582863e40458de4bc082dfaca451d756ef83a93baa3fa37b3f82ab8cdaa487087eb9175d846a789099e344b2ec58eac67185e6305a81f5f691330fad31715f8fef45e835a9da43a571a016a35bae46b3415ac704c66bc651fe079c797786e047187eb8c3eac665b521beff69db528d5a49568f2eb0030ccd6d5e19ad4adfb271ed46d44024356808f77e16573c4f0aa225694857c34c5f00bcae4ff15c91bc5917502dcb84b78f04e2627794268b54d9a670f0b97d9cb3a5ec637c0eb9f0922a70ba445fcc20710c56b7b05b902262c081958163c0036ddd7aca4daf4814ca4fb003b3f59a76adb7390155e0dd635b8c04ca59be1a0768463d94f49a021efb43645da70770e4b2f4d00bacaa91df4572fdc8903ff47df32da286a5f14a3ed8717e537b640aa123f6b64e5db9ea7e3abe9907fca059493075091e10815eb342b85326d35a5d978515882b8258c71ad6eaf9eebac6ef8284e4d7925d40b48fb1c4ed93ab6b4bc06411cc178e8ecea37cb50a7bea428417ab63dfa931f0885ac82f5330764294d0297003418e70fdc994adf9d0f23486520b8caa560e8c78251fe9c95861a45050797db4586e18d968f6104dc18c6dcb6652ba7f5f8504a76cdbd56c2fd9bb5c3b33384ff6718e9cf70fd97b62a4a2384807a6d5e9151e890ebf9e797c61b0eef785cf25b6e1f930320cf1ed97cc43490f3318d74cb4a5835e742f8ff9abba5562e791eac25fd8450b4f5458fab279ba50b06e2902d04d1f63dd6d08f515a87b1f13822f7fd88e464e384b2ebc91c2ff0a834655c632b5b7e3099132fe6adae081fa6d756e57949bdfaf00a3474b5b4b47442d160c66ad76d9bb755b144f49553feac5e772dfcaa944a31f4ecfe989ff4dc092525d7e95eeb938c87e22de2e18de8891db8fa0aff02dc0c936ee1c5846f454e6dd5a2a8a84111f213242ca48ec4a0ca42de208114b425884bf754f9891a511b6e149009346e2978a89df0394777a636bd6d6cc91cd06cd1395d9c42cd5f278e1ed46ec4799910d6ac90fa9fc346a09a83a27a096602b4269da59eddd4ae1c2f3f30cdb05131399cf3c50c913c683ee1a95ae748b674ccd3ae95b037aef9c98bc4693eeb2c68ec35bad4dfe85ff73b1df1584d3c99ca62f44bde2d01b4a1a20ed9e8309042005d373d3b93bfdc4ac7899a2f4fa9498275caa522098e7ac5d756414e3acbd875643c2525229105cd82a32669590f23573755c92518134dc29ed20ff7391a7d809a4a90d4f3ccd98417306079861565f24088c9f7145f44093f6dc62ed87b0b877110d22048df35d11a9c55f0242a1a4671ec29a9089afd2f394cba94281f8c21f56ae82332b7b04a61d99762498993fef839a27bcc305b47f0746f24394920e5ecb28ec54e49e6a6207c63fdf445b561ae777a5af4717bf84bbcbfd27b47f5a72308e46589dc13056956be4ae308bedd8e7e8f0e796679de5855aca48d26dad61e97f1b66681ab7d3277c7f77e1d69643db6ef966831fec812c326dca60b33f317a1cd6d055aecdc40bd5bd2199ab738595dc59d4fa794d63d7758c06a4aac989686cc8abd3c63122f089cbf5398e933313ccdd960903eb597954b2749b848056b996f5949ed81acead2823d11de1925c547b07fdd7a0764e65d42ba4cfa5277424bd750b6dd6a446752b4b8821949fdd4460c3ef0340de7e9687f468a9b77105354b55bc5eeffba2a27d845f79b7396446353efa313d4422bea82d8bcf95897b3f15aba174e91059115e5e0bd02dd9aa92397f35a424e925c297d70be682f17c470035b58ea2f17703c86333e5790dd1630559e4d4a0313cf7b069bb2467ed1a53f4ec4e2587c49d582a4b21ea988e620b91bd4647297050d64aec86b628bcbafc2106ce8c6e8f52101c0fbce580b18b309d3fafef0c81a3f1c7ffc66585b007270b3868a45bf9168ecbf82489324ca7c1feb0f99b27f9d9a294481c95d5ccfe1dbc888d1e2c4c506d375cbc89925113d25c47ffdf60818744c832a7abc4ab36dfb4a13dff1d2830e9e6fe3fb843a442303b1eb8cb8778ba9b3fbb273a8a91f5e19e09fd2a37738aa63fd26a0b630bb3b36c219b79831562877b484273e72c8b4320ab00d328c3bb1854c99b6aa8e2ee69d767cd5a205c8982ff75ce1a7a46cdde1651e3f8f1bd79ed3eb595e9efe010d59ee3c3fa9470bb03c285389790f8ab442884e4d64b0a479066e1f62f2a1561e0012e44def9309af5566e94d68e4f5ce455ba4f9afb0e662287f87b5b96e0b215a1b9baeb8fb46a52e711afacd1ba7bdfc50e1ff7305ab07264186c83ceb77cacf008b6c10d56fe1f4610cd05844f7e44af4f08e7d7d0e8f55d0f3734956fc9287e2a8294102c2d97ac21f9d741b32c3eb9086bde7712e164865bbf1a84f14d48e0b38f98ef54f06af33c916db45e6abbe3370c9e47c5a5f5cf73b4b784e47bc3f5574155c804c18ee4954f7e89c50ae9ba4d03123093a6500ded8a6118f7dca1fcf62614e68f38d2e598c54a065f228eef188cb7aaf1f41df6f3d4d788a88d204e9e285034a0c6c5b6b894e232b844a4696a3ef7d8f0811e32f6bbfffd557dab2b588eb918d8443d0a9f4a7c82b42c275bca9865e7ac38ca3e49dd150fe2f01fa8df60d6f581f050b3bbe0ef416ff657db803c0c4995b9b871a38a5fab90bb90732766d35452dd0ac64971d75a65d744baf6ca2340c26934f6527c29665ef128f17c20d8c1fcca12fac9d898893a664c600896a922ad526c6283050ae67863d2ec2f47eb01b1a3e19531a2213078edcbb953b57fe701f0445e95b6a78e45d1ba06e3b9077847e1017f6085f75d3bf0223c98fd32000d555b73e6c51ab57246e15d22531693894f793cd27d8fb68355030b0f7a357ab43192956b96afc377de9b07c41d30a6a23f461c47f40d5e2a023795c06fda75737e2a5143d325b86d62aee8500d1a76c1a96269817f465ed46b40140b7d892b68ab40d3430cea6f598b8279625deabc631a7114e99e43a36c83fb7d37a70d742d297b973fa7e0caf2b47ac62f0750e0c22a59ca5952ea74f0b59e16a1e3ce1b391f1a9f28345da7a5f0b37064ab736772f7941bc9b7c758a4c56f1fb5455ee551f5e9e02e8de051e339bf90ffbfa75c45319cad15e2c5aa87b98b604568dd1eb46c9b92d553c5c4268a1a2e44707b3e6538ebdfb5f504e73fd80b0d971a6c280fbf80a35a4723b9e1db4566ae59354322f6a6a2ef45c60ac12ea88edb34c90fbdf7b8bd8708cab7bd1a0b29be454c3479f2629c5018fea8285f03390c355e0accd89f6824d449a38e6d0a2ff8690da806ee42530867b3f363b3d49e738df1563c5600702ecb5bab1726ba55fd0d4ace1581d4f4108368b24fe4d4090b371052098c4974faa7e46e82cf07589822a39aba6b03c2f19746827fc4d2f2ba82df5923d5e2876872d840b657bb2646c9713cd61a83510e5d00a754fd43eaa7fa3a2509a74bc7076096b720b73ea207b4ca9aa638b78f4c0d4a4257fa3d3de17c30507af0a058d99db8706820cd18dad632b954374503edff3191fcbfc5b2b55be2b0b7504de5fe097d97147f788b55f6332331101ad4204cf5b18173d4d0809c7d9eec152c5cacc981b25c8aab74e3adfc472fa13e6f6b3212bf2293f96a2482ada1f4ef9dc524c2499e970eb4496da67b6948958f998dcd398b3aed89d5943d1529ffe74cb7a7c2df90043a24ec03fb8adfd9ed6cbec980b54d199f665e755060c796c9351353a23aa988ceedc8cee0d73be4ed1e3fc765edbf7d8dd5e102cab4181e53ad02a5fdcca3c534f9110e4e7f292f5f4aa5c3fa49ab9877cd3b1c6196f62ccc3f8fd616e08eb364faee03e79b96212a1f1887b85b3502ab1cc20df3480d71aa3db7f60ee2a3167ca7a530698c998ac2352f5043b632650175dd345a3bb805c2fb200eca4612732d72fca8a5501d73777b3bba9cc398f16ef01998e922d41ba8b0bac453b80d453b7ec869bd0d79e9a87cbe0fcbaf47a11849c6695f3b877ec1df5cd248bfb2296192da2af337d4767bc3008ae01b8228d94efd3b1adec17a5f9b2a12ab50175246356edd18bd8d5b363d1bdb7f58943d8bd84d91f1f324a74c654c6307450612e94635ff12c03f08ac4d9602e231bc81eeed25901c51e8c786f66448774e8d79492af9721ddf0e37a9c168287307f2b519864c2f897fea1d8a4b53bcc9b2c5ddc91c84b8c8b090a09da8fee5f148abef2304a840444bc005dd7652b89ba5576f6481891a8a71397348ac7829bf53e3c58e5e095567ebbc9848aca8f2b8d3b6c09af750a10f6a47bcc6a45480820742de945173cf4655d93916154597d1b8de6b5b01f18db2ff6176f0cb89b68f62a1bd48bf7ffb44274c599670ae58084d57d85f244811901762194be0023975a453bb177f136ad9495e9f24b0a781da39ab7832855952722ed031fd1820aab81752d67f23f30a6e3301f3729f6cb068ec65e1ceddeec8b2c163e8624f574a65cf8e7b81570277a08e035407611bc2b136459c96dc986f140dcca94d6c69784c79ee9100ec11d240f95c7920652b63d056b35fba4582471c23a9e5dfbd717a689d9776fe49d1f8ef8fc43b530597b6cc734edec8aaf1c19138f7c65b21766ba935b11ae420d2fd0945cf46e15868805dcbd39a9223c32176cdcc19f49db6ee857aa5b6ec01185255871c4f65edd837e51082cf069fbaf7c841f13eb91cf801ad1de660a0acd43fa5b2a7c49bcc61b744b05d25cc605c81fbfd829032ac6bfb8f328685938eedc8919de180badaf8980ca0745b79e18bfaf31ca778080ea486602c2f9b80db583b32c07353f23b31130770b37863f310ac5c5a9560b57430fbf5fc37359e66735c5867012f7059418714a76fa7c5cabb914f3f9531e4c8a0ff7f8bb5bc7b263660982be7e50e565c0ade5633d94f5de6c71ceb4af1ca4ac2137bb7c02f34d88860e312681e195320727fde90f17f982d04076ab3fdd2357fdc2037db0ed17506f194426e43b065b70ff8460a6234a93d0a5c54024e1c7593815c108cf6d545718b06178fdd7dffdafd222c94f649948e1290cb85f8b166d82b7ae97b3e3dfbf3d0f381318b0a15eee35bb3877e3b966181b5b521aeb4ce1bb11554e7f56d9065e4c849e2046ab6470bb9aa3fc407b0b676e60a60ea7570b3260c7a987a5b2e949ca039f3db17608b6586c169099482869b07f7325720e27f56d07a4656914b5328648296fb66bf95b76578a8fa4fdb83daa7a395008149fd3cdf6fdcf1c80a236b3a1a96e511898cb24b631cc56aa7c7173c36162bf4c2e4f5afac8da6c4385ae6405e88b25c719a464b9a6eb2a3453ed21f62728750af1ebe768c7205e8bbbbad32f61e1ddb6bdd2556b5b21bdaa11dd85717b5eb28d995889ab0b839d8c4a6183d3804cb4403c361b0b1d27bd0cdfb98631ada8be88e17ac77f2a697ba4fb4d98d96c01400454e9d80ef89d29139079ed143e50151bda9ff1f43eeadc6cea6e693d74f4cb1cfe09696d396c25ff629064aa2d8fe449bf9702b19634605d66471b2f74f6daada1d0528fbe4c76c5ac2918e48f0428f0d4388073784e68fc2c0cfa83bd1787849fd849762ad5bafe0ee3ebf8b0599b5a98a520a5be01732d5031bf92ad9ef0c235c582f4f970a502dc4e38ef8bd6e7963731a8e1fb1f2d8bda64d5989d9b8e8971140d5fc36ca356330ae603795e61ef15758b603b9cc62fc0fd03adc9988a7f62b6a18b60eccd1bccc3b27f03dea73d9300f38d7dc40123b365264b04aad43e6857ce22584d3ddd0646e318e204412350dced56e02bb8f30ad1cc553be2c11c989ad8969ebff9c3be0db0ba9cbfca59e7b053463a5fa16ef00c33c308df36f2a8d994e1d1d12297eca66ebf0295772d0e9ba8e6fc8d6fb36d74b86c4459ebc2001110da0b6273d04f8b0c23a16f64e405d72515578b0f2111a7e9c438fec08c60e21b42e396bd9cbc1eeff6e374978fe3e39d75e8fb3eb96a6fd485e4ce9361875470a5c3ff43a2efa1a00a78fc104bed02130fb180409ff8d2a8472285a0016c50a9a41901a4902c19f21e2c120044eacb6c48d3ca1ee79780370d47f296d8cf2b8d473b0e0dcd5feabe4d1d42ae77e7264cba987404969dbe514d2b1ef5b95e06b09d2688f2503ceefb50d21fdc4a897dd6deb6c4ca27eca219c58c1182383a04f500798a3a714802a2fd33cf2cfecc8719d925705e4fd8c491932131413b9f5498acd0463b02d4e6345a4f5ccb2c95a9ec60ca4f6acdd6ae0f2ab1c1f78ba945fd1c8d0d77b374281b49ecf0fae9b27afd520e577c01460bdd07ac1c521f94f3d21c4a87871ea9dd103323ace0bfd122a4993cde5584b69f58f2ecce55e424232db799bf2441aae86c51d22c8c9f4d17b94f786157a07dd8701a1dbb2878c3e6b3911a1d716160e45f83e7565d364d4b3ada1374b7696061d42552dbcb7647c8e4d91ad3e1846cb902c373b5b36e5a09b8ef95628c6c5f846e954d6c02e446210ae89385453948fe1669e52e185f7104efca5b505b14d17c0e6f9719ce4b22f71da941caff7827a8311a0a366afd8d274c76ccaf108626260bcee8f9c0f1d8bd5f979b6b8282103c2af61aded55e0f5a80b2b192f12c42b6929364648d9b4b5680b0ed1a77a21086910bb0c041ab86fc2b25aa395ecfd5d255413eac364998a091181ecc091c64050fdce03e6484815e580f21eb07e6267719a0d88b2291648fc9ae9ab444a5de7e5aedab55d27ce3f400c7dcb57bafcc24a30daac9eae10503b52054ccc8b18220418a850392bc20ec3f768b3a6a236fc237e0a197df2a164a3e49d4133423226783f49c7dd07cb840d128eba5316878e0f85c3ef30bad7ca5ea8a681ac8f6a216abb0d90ace55f37c7179797e8715c5640a0daa39981fa48ff73125f2e1ab1591402515f7ab7b533948d7987b3f237acb2821f2746099d4b714fa228fffa92f42d0c9929e912ca5eae07e07fdd35e62de79ab35f49543eb0a03ac1acc99570289106966173fbc2d594cef0da9da3ce46c046802c1716b380a307c10496b2bc330c2d146f62ca8d5dd254e58fb846bd1a3e50a1faf580735a473f6e40ce67a4696a4612098ef832ef13a82e756bf9b6431a598a12ca8fd80e1c1c52b6e66ca01f6331ff5bcd1821cf35df7e1288e3d72ce727ded3ad0ffee267e28737607c70aa57f72dc4aff85027dd2095866d46b070b26eb4cfaf5b2e5591e9898acd7be659d7780f9de34fd04aad926dc2cf06cbf7992965e7db0ff906029eb798f09924500a6ea5454425783a4f8f6cf623753e36f13f1487d4909bf552f60b64467def6ba257ffc25aa955b46ae2378025acce6a65e90f2ad6474c09ddb1f24ed893baba3facfe0033fe4e5649357d59a4077684a69df61933829bdd84909ab6d684ba7bccc57b5d4b67aec5a1ccfa2c858017c579cbed366c29b6cd1ce009d5879ffba0c650dc18e683b9610e651586954365d8dc567dd0a80f7785b3359e6371e699d57c61c08b9f65be0a23be376f5241a6688b918bf67f32e4576d58a6af7851edcb66b6b8745fbecf1064cc60ee6bc3de69b18cc411733e9a6af08115c2049018342146a9e518299b1e1631d9a2bcda23078ad50fcd658666cc7573031dc837d59df6836f02583ff70950c495b82c8ac1c7c1e15d9c4c83ac8fd9dcbdb44c81120f1f94695aa903ce6db48950003a556b7dc06627069806e71398860c3b619f1060a774e16f4b6dbba5c6c831a8a95f290e17b178dfe3f935fa9e897559e2539e4ba3eea81c61218b26c931c8a1224895f1de6468c97a89d14e5cd400845900af012b4d4d6e29f8a79215b052092c0a9e158e43cdb839c176d75e6e39ee6083494547cf175408d7d2effe17cc862f1246be9434d9e12b490f186be8f6ad7d3c7b5bd068ec6ef7962f49207b05af20eb5aaf7e99f80408556177c7a186b7c7432bdb577d7bfcdf3f485b91a57b60780d4dc41def326e3915a319aabf3e82a6b9708245648314723d2a331974f2a6bf02cd1af9dbbba3ebc42cd8d743724a4cf20eceed48902d52b9ab9f3c3e18f2377970a3fc5c194bd4cdf57c51e2278187b0e9a57f77ccbb39b15d7bcb76a84b0defeae1cd30b59f1c1e41f78f665e6d0a1de233b6d37a8bea9a3bb7fccfc9b102ca6fd636e48a71473c867893ce71f783c3659650266911965ad2ceb2003457a5016281f672f94644c5b58d285f9784e53a64021f3f48c949db5940e9153bf0c34d4ac8ec2628eb792535dbbe5d4547f97606e8d0811a4a342fcd95040371af516303c686793e16b51c8c107b6d1f22b60fc13ec118307aa1bec5041f5d0a9d6c7ac570632a609dae75d58a9b8004873b5f805a0e08482834477a8a9562482c88a9288b48afc8b2624b975f7a0637a5da4851cba6e5a751b891c46f2e2d818f4dbd516b7e6b46c83e8246d0aff2459703d9376138858c08d86ef6d6f3228d44218eb94244698a0bc448c70c340bfe857d4f27e988fa7467820742d641d5fe2679602bb5a146549e0e3e67fb6726d85834950e5c53dede23e0240ee9e3b26ca6cbd9c74562d77cfcf94b4269bd5cf892698a91c3ae42726ee9e07c69e6e38803f6631fd69c2de4a20c4f214a774a8b99eb737b4e8da5727b9dc0d0915c7eee78b1bfb42b9825b1d2c4c9442c952213d17cef7c181c23487149b5b681d7159ea45450e0f25e71aee4b9b50032f86ffc9f36ed9bd7ce63d688b9d8c1f084639bbc7c5262e9e0bb9eed8f7ddba446ecdca3984cde5d0e6bd1195226ddf47c895a64b44f27ba82218c48eafa271502f0705ff2e6f2cd291479c623b3477d67712c94902cca20f4d6dd7e09b1d252effa7c3800e1739f1fc220b91ff440bcd4500176a509889a104944318fd4bb4805d748b8a5a09656e497b46e4ad5ee6bd9477fc41cca86b66014c4dabbdd2825ec7256082774a6fe9ecef481b98ecb3237adeab1f476efe315fedc0d82356f60cc17f8ec26d9f565b16380f4d93f273c26c22f2a2c25c2b03e6ab418cae19711b2cf47a297f51dadab1dd129b0cbf9883553eb7f3f052a18a010f802c2d4d0fb40d891e4256476799d7e11ba0efda9aad41939a1498cc7db0198b09411d1760388527bf4a972a7a06cdc7d211bf85248cd0b783624e5c836c2cf3e1406d8427001ed79a8663fb9174d20d2a6c7adf02b5a0e1d4f7446252e082a0cb1bc524cef2dd07a9d5ffa7bee2f58d8579add29521a9ddc944532622424725bed49f2a6f047a1c770ea9bcbd8b9bf99e3e7ab09e8289b495780a2eb48ec0c45430942e7778dcdccb1de1411d40ba7de1f29cd3270d63ad58951f58275db500eb7c7781843cbef8360837a200b9dae2ef916de0c7c5c5e4c99bce7c2b0f4ac3491bbbe14c01f9e09717e7813beaf694768b53ff3e10dd2bf72ed87d239d8a7c9be4b0e4cb05e08bcb8d93819e197a462ca20b84ddfc071566f4124668c6c0f3f821fb2fc49d1587b58c87f56d3bf1aefee1868abcf44968cb526b7d572e9524bda19d38b57d55a13e529f457e1e2b2f8141396d01461774e350c1155320997151e870cc57dcea9dba96ae9962b0da0e26f21a55e8feafb8ab6383620d01c2b5564bcbdff7f79cd43034846f6a2b20b3da0717f99d394ed1e89349ca3d08a91e5f9595cb8ede82e07bffa174a1c99bd34887850917f10af5ade7e2bb7b1676b86d80e68492b838d6aab7f3f38f7463f2b944c8c2e8f050f93dd47b1ad02e3d7d3b4bcff207f6607eaac83aac5c5aab88cef53f6cc9c25ebcf8e4dbb0027ee977265e85dad4d35a70af240e1714eafe427ed99e7df48dd99c16e9e9a4ec56b0ef79b829d26590cbcf396bf41e06952a3ed7594837b434f5b90c166508aac0b6ebe8141e177e60caf14fd1acdce80c56cdea4182fca2da0b30ab58cff9b80a73302027f19aed6655fd9a86f236bcf134917ed8d7525c3447aec2d2207cb6c4b6761e885b59fb113824188068c32cdf08e973e0fc623e67fbd5bccecbf1ed00a0012df83dc254ebad178b28601d8f8eab90fcf97ff9d0189f9588fbddc7a1a7ba27f1c20427c61a46bdc2873bc8ef8c546503bdced0742951e3dc2a1755f1b0f042c14d5374d68310f10a87fd66287409129ca260d1e9aa34c0976f8cb5bd8d2daaf2761b36a5d3001bcf5fbe1c9b2b3c2b59013d6249a97f1708eead3eef3958ff9086e58e027aa039887b743eb03e02af6d465935df9605072207b6c595f0d9ad56896f010c8f7014cb9eac8f2187ecbe589010cc6563c2d9799ce3e10b66c546e9ee22e814c80d911ea853de53e83190286a87cf262d96441825ddfa696368214fa6dc5658e2c7aefdfa1644376b467bd295c9f1ac597c3a9e8011f03b02adda1cb0f77705a068d6ca6de5eace04fd4240d7972c777453e4f502f0f8d6f7861748250e448baf04f53ed5192ca782d008ed4159215c1031c37876e15a28988071384783d0983bb111940b9881f9c3b4864d2d220d742f9f1dddcaefc58bb9a27d30142b67fb074df8e9324c7bd3452377b6b761e2ff614c6f00e476fefd5396e6305101926fe8d6d48ce6da776b839ed7e1e6e64ac6bfd4dc597c221bb813c741912ec952a1611285b0a001adc61e51b05715129f9682252cbc8d40228401e5b8da773a3b44b23115d908ed8864b6632e95b676914634f4e779b76c4d920b0ac381bc348f2a7b496b90a4306b53a4ae2b8ddcc99b5fe0a10eeb9dc2081649237d24d52095f388f0baf408eaa1075ec09da6eed829ea2031cf95ab4365c9b73fd3b37305aa3a08964c995fd3da9badb11751d98163778a02abc1a08e1d52a4f315224371a8e582bde2ca33c0515d238927e1ed7712f03724b6280ec30f71fa84a30974a54bc0fd48215b6f062216407db840ed952379fc0a8a8c8a24bb1cad4c6f25d00e0f5a84252c3b9d11c2646de4b17cbf2c1cc6d651d3d479014258da22d75789291c510d28f2289b947309a42a0d8ae0f44a173c4c9eaa09893a271d8d7461a774027c234344c4c230ddaa857e1bf4dcd3ad3735f5b4d3448edf90c062e85055588062916434db91a0032c35b6d031425ea9eba1fbe4b3149591c90b5aa94338f5538dccd2654acfabf47daa81da2909f0988ddd16a61b2d4f6565ca852d94a1332f0d0c87c036ac4a9c867ad26030f216e054c9402a49fa5b406eb658e5f0ae9652c0c4575f0872d6065c0264afe7320ac52c3bac84b7285d0c07bac6eab329fdc8131604afd108707080e8df0375dffbc5dd180a798a327d50fd7e2279521b2899888504b9a33dcdb71f89e61093e5f128b5515f00eba90b8f0123f4edb0a485bc1e754e706b7aadc93d89e72e37df01ddcfe622a9ac8e33a4c30bfb7ebcd14296bff62d931007e62c97690636242af6d9875e260faa1d1aa4de4d906c679281d298ac932818fcdbf1ffef2ab9287cdf8662b6a6870f46c497d2364c0cedc1001f3d3ef7b34843f74a1e573a15d91e00ddbf851b3802f171288e0f2fde77937efcc50c2526c5cce34ade8478b148ef19f9454610c2fa62d8cc3983163be291b748dc4ed563b853fdd82b45d0533f5d5585b8d25f6c08f2ab378b803cb0e7802575fbbfd7ebe91c429db8766bd825f3b8ff98c76cee1a76105e2ff7685f4705499108d920dfe2389c2c65222f4ad435c78fa86ad94bcb34a168328161f74c445c8df82f296c5a6fe90d40c0b58d67dd0a07890eba26e2e3ea159ee0265067cc64a364eaaab228a60a9d4a153327cea5267f0aa7d6767ba2109727c244db2ac2d428e1442c200061d33e714976203a663913cc343b973a81b47c0a6832f5e36810c31f2e5fb9726a2a2c8bc7eb2c052125b5c287cefc7362c646c50427b721781d5fb006d018683ec7cc115ed664284748147adec635fb1d8d7e2f355239cfc55a325865523b44b795d389b21e93698eebc368e175b69a5f5faecfb58b96759b7164f193bbd5d2ecf5abfa2602cc23697cfddc6cca661ec574ca2993393ff985fb918fac4435f8177f1c84b8b51b98ec2c0a3e4c36fb09a181b89d93ff4082c9bdaae020a647728ed02ca1fffd408817e63f6d6f0d588873a25a3b8c84b6b6e9d1890ec888aa75eb293463848db0856e34a92be0183e2eb6b06e9ae045d7b9bf9714649fe70a1a4a0d348dab35962e42989d9c2ae38f92224d020ed5f851a3753b581261da8e2ac9511fe1ec0bfa29d3dfebf7a52cafc86ca47c3d25b89d850b20dba9818b375648562e28f93efbba12cf14b7a4203eb946d497b2db4ac73952e72064a48d6e894a35e5f2a82713b81eee2a2c754bc6ee9fa3ebb180c6bb438b9148c53f40c5076098a89a97be4952690c1f5635671f6917c34fa089850b77eb0a4b323ffe8abe46d9f16feb3fcfd7f40f2ded29ff70a9debe2531f343d0e1af3b0764bf5969d8b9fa03429759c29d22701a66bd246c6ddf5939136ad5eae6fa8775dcfcd28cd4e42ff7c8e05a5cdb1d99577a28a4b37aafc0d3f1553e2d2f3a31ffd3a1179e0b0d4dcc248b3b0ad89e3379aa1e404a85a9d33e4d332b970391c22d72c0c128e8c60103cf9a1ebdeee02843e03db59e1e9b8b007dae8a5f12ba87744bde58a11a1c5fa8e137dae0615b7ba3f2b0edc6697141c4b5e4d2e2c00bdb091907501ff54277e541ddf29897d3b90b45de171a78f54f25d7888bff7d0c5b0e3b061a463a093042a9026cf5112142cb504f9906f35cf99ba6726f366315c01dfbfe99d7ef249132b0c3a687dfaf7da86dff39929ab822328798f52de6d546632bb5b866598868a8cb3bb366fd9da63845e2c893d992201349e422e5c912956f2c21ec96db9a7c27c9829f1c7096dc2685ef66294f47023bddc418f91a211e23b25ad2991bf3cd62a81c4511494fbe06f7cca4c5281e14307e52f9da671e7627de5cc5c089697437bb683dfc9e0dac291d47e18586e0578e1d5365961b44451e282f6a54b928b514ec459c54c96e18f98851ab7e15348e34f47b932ae50078019f5d45f42d36f0b76fa4a8f7bb57952374c8e9ce09020053f97e818e2097212edd14bc23e7a165296c4e7b6939fd0720a865e05029bb7590f213541f05cb8edb197e6532b88741eb78ffa6c1103e7be4565111ac12e5c3d34cf595df0700d2ec64d312dbba5018218cf5a2b3e571c79d89f066c538ce63c1049de02982e7e2589da2eb5276a751aef35a676702a8033d4b491e03edf1a70d9fb16c9808a67474dccabc91981d6a6824f26441118059f1f60c72c0ee2225fcf7acb78229101f02b6b8421c9def1306a9f452e304ccfc0f715de13d48ac05a3684a130da6440838a789e946dbe6c7f44c44ffc7fd7c77b9497229052882ecfd0898168232cb4d796781d1054973dddf04e09577481baf23b5468b95a5416c76f28396411e7aad4cea8046591f664dfaa3af8985727ddcd8e8e4b87308ad0328ca4294e8b94fa41b4c2d0b137f93e4d9fa24a301804f5338ee5661eaea06be44df99db421712a1e6bf81713548807beb5aed4a1d78ad06f5c245564d377be61744d0a6db264741d50560469a055a1b8593fbf80ca2f99f819290043d4a68248d47f02432a6cad46b49b945835b230ad0630bf1fa12f698804cb07fafaac84ef483affffda64d7d23edfee1e35955111d1147682c9be955ffdc21298acab5c5b297e7d8e590db6f7a45e4b574cbbf30287fb72eca1a791319a4fd9b9dd8e3dd180d9ad7bbefcc28ab181d65ee89902c71ddcabe414cbfec469e8c6e7b11a2888d858cab007de7df4cd209354468918cd9196663192dd46b732e31235c603c46b00175bae3f536003a21eba94080cf5598533d633b5ba4aceee3d935aff8c6b960ab1f1f21f490c2b7d886377ef1f63d171f4b595e4001ea94a332c292fd6adc7870803e60a0f8a9d50607a2d35acef61f285ebc72479c4d4f7b73487caebddc99c65072eca60ec01543722e6423b02ebb527fbd4392ab3f3a617c89917813fe0f13de5712f80026acec24f31162b61da0a2781bc2676ef17c0eb9571c8b83b5669f22041134dc6574447832ec580337852fbe60a707747e4d4120050805fec5b36aef8d51729da48518bb27750752e7f7636d582edc45bb7cc45c6875fb80da53cdefcc845c4de6d75f593d59d06657dad71e7190551a471130215458df3b789228ab6530a8ab03af0f807228bb454ad9426e0b9dba26abcde8c2ce080b3c708e702057587db6e3078f1053ada7cb26bf2cad2c3cd54df2045b575b0f7a8925689d0344bb4655937c35fb3cfa8204a704cf7c0c8d74bfe5ba6c9e15ec26e38e46d44ef37da3466b28469a79828a99f08a4b2acb5b53b6ac6eaae47ff32d31f25b94d88aeb042b477c63e0f3bd414dd7dec80c23b22fb7f68cfeee7f2cc8e9d7d2638055aabcc033d7b563111f7fc746990f1f9bcba5a2c02dfa6fda46c53e19b150f6d7811d32d464bd76be286a36025679e47ab8cc83d79e08cfe97058872adc80e9bfd4ecad14cc948125ea34778ee0660f22bd7f6b4cdfc18f61eca9987ee73a1dde815cbd79f3e9e8bdc7ae1a03460c72326690e3ab6d68892e80ef0b28e7d7d1051031bdc8aac92f4f17b8abe7485c0dd9c4543e9ad148d7884d4bfe630f7b15d084f375d3c2246ab48992d8b251eb12af12b0fd75e07bfe05bc483b3d3c521b12206f223b24d0513faf45656fd70c4e40a2d85b06c14e633807463d35440c6e6ff9c90782677f1de6f8099f2e97cf700d04add6f380b772ff656a372f8bfe91bc16b8151fdef80d3482f7752adcc9f82c10f582f261ccc647958b3a1b34226972dde904d9ea698c2faf61adab492e3bb492060e2c2af0102e77de5bbfcc2dd0da70c87046be6e089a1be8ecd532b60d9581fcc9a75a9f97361290d2db5d2e4e5d216e8aae0851d8e3c5914b034206b99acd3627c23cc0e726c3da152529c0d0aeb2516b0375096af1da6e3e6ef8baf4bdc5285bc84ae41c351716d0252f073f149fa1e00bf834d44fb62b55f240c4cc22200144cf1b443e55e65d53af7ca9efc873f6040d98c571e5c010d88e20b85b804afdb1d42dbe07853e9934ff798f0c8f26190d28e5b3c1598ebf63781b49f1b5f5b944ef56ffff52b6565c5b96667ac49cc9536d1e7513024328350033b9a8a102aaaa49e9ecd0d0c142dc42c8faaab741240dddf76b02071c58deb5704324a5febe3709b9a87a3bd388d4376ece76ec4fa996f07618fecbb57e1a55c9cc6e5a63143d323003e935243c49552f83975569a59306521a267d826b1abc22f0db3b5db89a367f69c17053e309758a791a147408705182587226df276e11aeb6979114d6e6ea61bb45f68209215ffdc5a8c9d6fb7e775600e3710f3dd532a195a893a86a9324e7e1f5f2bf5bfe9383d6857a3243cbd1b8f726af46ab93ad06fba88b192ad46a15068027dc42131b0f482d146387b0b261a54664c81d41587a196963b55526d56e7317eff6f9859a9f580330bc37ba95be2bc8eabc45a50fe63929bd8b37f7ed3f4cb072272f50f61a66c2b25d676ecfc200a67b015a7255554d8633ec9a0025e249a4c746167c2a1060cc09d6bd69057cde004e8eafbfc6bd4574992ece5a5f6d03b9eaee48a75c72da57395e169e26041d6ed3b65b9c306254b06b09f394fda392e26d911e2f1ced495a2347e9c68138d96e1d84fb26f7e284626fcf756fbc9a4575305555b099f6832a2193c9eb6b5abb95fab25703852be6ff25ec40bbe0c8bfd118aa38f0e9554e00ba3bc7eef0213060d25b23cd6c32e5ff461d82124b519220b115b6f2f18cd3371cd837ced26b69814f0f09027cf1338dc424e9da44d1ffd5c3e0625bb2b8936d36f9430345af3e119f92994899174a0df8c0e4aefb3dd69119b7b957902caf98b1174df0e3b6e7eaf365178511f0ed1b31157730a389c558dfb71105d985c5ddf6e60588431d8adff58f0b5b6fb92ec73b16a6abafe862001f559c85850cffa583c07f0bb766af7d1a11d91bd1c51d4b2e760703b0868df98c4c79093782d7caef607b330a44e31281a812a80dd1ca1df8232a7eb9c7b12decc2ad8c1273051620fee9ba58de4b2879394a701880f75a372f50f25afaa95c4bd2318007851e1c7b04898446c8e792c9f467f169978fe22b4ff6d7f86573631ebf795e5c1ab8fe85b76022ae4b1ed6a5efc02ecfae8b8c96875a101670ec783394b3388b6bb2e49d93f35570fea9f66cb5aa13bf7c211ad307df3f270a4de667759673c4c0c8c70a740abbbf866d3ce9758c92732e8316cab0fd7b44083adda52db9206455dc03020d62863541165a35cc77dec1ff2f610d35d41e16841d87a4f2cb1a8b0e9f048c2c69649052bc798e91b8f7b1650707ebf7fd0b24509ce0e83c5d622bd0d4427262cd09752c22f3156e400fb256402f06603d1ca839ee8754f408603c21b35dffafa3ef07270f1014352be11744d77e1c365110e52cd516ec3d7258cb23037f35f963bf2eeee1ed77caaa2618444fdc739b0624540ceb791d912d077de3386641f2a1463aee3c73f61457b2d51ff1e18d5256da064a7cb04fd1682a48d26f6dc4be147e682957815d1e1c31ab208f79c254681bd008b01d9bbfd6df63fbd59a03dba903d39cb51dec5a38fd27e740310d70cfd2cd4d0839ef24e27725293f2af1d2b728dcda6fc444e3e35145c4cac1affce73b7b99181881ecbad24e47775d475fbb4869e216782ada651ce95af7ea1820f71baf1956f4cc4a487e33e1b284077e4a30509cd068d13b0aa146532ce8e10feb52e71bf2bf0476d99b634d198a1b85c4a7b8001a39d05ed4413ad53c1fc242e58a834d8d2c2c537ad6ba9d6b7e87373568b42cc3b8df4717812092c6f5ea91dbd72b59c827623bafe3999ca7fec5f1c4af8b66b305c9b138d6d79af07d0c780a27dad35ef50a711fc23a1bb70567a6754f3253090147984215275787afd2bb2c12787942e7dc7ec996f90be2173d3984206a6594899c181464fad9b78b718fdbca1ff0db5bf9720c1fceea2ebd62f0b81d943e2986eb204b6d7c64a0502c9f60458c349a1da820c25ff4341a72fea8f66251ee97f8f5721a4e691465f8f24c8454f7aa05a1f339581ca88fee21f5b27874a662eba05b2a28a8d10d17a1d8b5eb8d62386b74d8e87557137272619fbd3520c47ffb0371b04a88e548edf1e85657e912b658ecacdfc63cf007c2e3636575514ce402ea217756bc74d2f1fd8f57824d7718b7b80a27aa5bd9dd9f6375a28e009794cc8ea671e01e3c76a190f86d0647b941e779da687d1a47cefa9c52e85e4d715107e1c4e42ad65a834b403245dee643c2f7b0c355bc2aabc3e5502f6c3395899df540ff194bb0f614441b1104776e549634f217912aaf56fe539cf52436be520e49c6413af7be5f2bc567ce0b0030888491aaadcf5048e4be5534318b63ca18d24ae22ea8b84c534bb16b5e89be9a97df5f26bf9c196cbda125380ace6283f5ca1138096adc4cbfabef87ec0a214e489765302f5ba8d22d175f4c44a60f071c4a4cd70c72df3d3b679b80e8adb29f506a352b95f4a047cade72c49c8cf57f7256fc4bd2a80a76ce25bb2f69c56ef539a6fbfa5771f5b524d7c9668b9bdcf36b42f4972262f9620fd16623dcd7a01163972135544e28c7d7b3ba773eb4fc19a9f356147e87ceef0fae8239cd9af066e786b7e36f207bac0c99ca40c3fa8d174506bde6daada87881bab469fba3f374ce4d28a88b93c40275b4313f58a042bbd3661d67562b97fa0de72ddd9d3489b02508854e4496caffce26df866a25ec7e13e2402bb690d973ba0b0ace987a979de8e3c2b897018962203ffbe2cec697960adac97aa6d5789062eee3d39cba18c42c1aa6af4f22b20f1dddc734f611324debe43d44d2c349e45f16323ef62133aec203d3f3315f98377002665086077e31e210b49ac5a263cc58e55dffe61dcb46fde9b3254309d314e9aa8cdb7a578c46a797521760d51a565ca0d45d6dced98e7d215d1373d135088f434f9732b3a606548b4bbd6356c3cd6aa3d7bd785e3983016a4d81ad153813d24010ba8672d8060f538b759ec30bd1cad9e82fdd7da0a8b381603e9325978c0a466d1aadb59a29d3c71b1bcd1a9b3b0bedb29c3364e0e8ef26b85484fa43f6a37a3215fe6e3c12207cc8bb9c94b96e92b260e33e91cf90f21fb31083632b316424b7b19f2f5213fbca06f53b5091c3173b5fc94c1045e2e73f57ead0fcdb4458a35fdce2c0575225955d2f5939981731d22b33cff03fe767a013da0b22388ccf168a134b3a353513b7c2a6c4b529761a2838fddf68dfbd0a1abe473eace950cac266671f7857955fb84121e0a505a51f024bc94007a21354cdb48e884a4960c1ad204b6b55eaf941fc57fbfed7aa8af71fa142e9fb1746deacdaf0ef81a13e51d98525673b977ad737ad4fba87b7c3af16be2ca81a6b0b73040259380e99939bbf1074c47adf2990204d39101cf9449a7c29f4e21c583b7c40eca3aa0d3cb7e9f5566cb2114a70630df071375d7966eb0b79483698a170b21881c775ba624b80b668f70d714a6d87a0a051f7679852db65fb78ea5df2b5787cec29244eaaf1528b08d65169d6b9699a5598e76d9eb0390863c9ff2b96ea6991c7448c66a651474086a04d9f28b7a72e8bfb35a7eb575c1b9771d21863eaee37c14975c8826ab99b6d4d8a11ea511b60740dddcc6bd8a49b252814ad7512375cd966aed0ba3478a7ae1b3b3ffb0ca843f05160354c7c2afd4ac2ffd164f9b80c60ef761af30a2f379582d4cc9f94bd2df255983378295d436d0eb2bf3739f38eaa1577f9061662825c51cc09bf576b71ba4975b9a4a66ea37205ecb930f83327238518757ab2dfc9d25b63be8abf4d67657d5d98f9bdd7799183f9679443873a1a99160e5f1f66d2257c90baa19505fa70cec3335943bcb3dcca3028f9b34aef83f5e4355fef3790df44b4763aa7ddb5cbba7c04b08edf545e38316663b838302d412cbafb0fa14d633a3dabf53ffbcebf4f08844d5d8c333bff147af758fe9ceab7cfaeccf1fbe95cb6d96465a0bf8d6aa80cb96992fc7545f0b1098c426ddb2fed5ac2975ec6045e44b4025bc9d6c8a4a861758b92f30e5fb57f00dbe89dc7a5c6e0cd4b18ad48df4b359c814d1d7b9aa1b46cec8731ee5b519059934190fa2f7251db9d013dc3318c20aefbb428c6945360d32a598265e95d4512377c38d985bcd1b1ed0dc6a4e82173218eed37e922bfbbf00d9d5eea08abc367903b57fda42539fe2b6abca9670b23e3ce2866d7a0f0bd916551b93a0ab8c96b9a3cbe87a17fe600d691a9bd3e2d587efaedc2820060461a8b2dc3a1a178f0f7056503991b02e3e3ca5d98063d203dcc507faf5d902789acd973464bcf39e57907253c5cf18325d33a1e4b7b52c566aad61b2dd133368b1d892e904d012653fcc3bb7f8217b6cb912271a904764cc049f66a7ca75076ad6e88d7069ed7afd58e74fab8afc8eb34ada73e99d1f6657064e1396d91d7aa190e06502631f738a095baa076ba395dc989f9134b9b2cf562b344e1af1de8990c117e5423a93fbf2c6e18220fd5af039b5c40f87c05b969290d582e602e98abd58ee80e152f74c3094378722c31453e60a9167b2a6c10beba701d623d3f83fa4e77de477ee8dff968977c281f7df560e7d0cabc8ce1df034667d86b8613e8dc26268726ed726618f84e95aa27717d0a15f1c1aa21e7f7a19622df62fe68c8f539ccd858288250c23695bac0d7c97e4f4994cf2aa929edc0b13315f047ad463709dd2679023d79b06ae0deded9888c0a2a56389086c44ced7872fef9d7b6032f79be609d5009f94c89f35a31497d781aceacf77de80108cd70b72cdd70a0a96e03cb48bf429d7b8605e0cbb5e4af9ca117c509bd366ed7c6fe1244571acb410bc6f8d176426abcc73de789285187e0522a17a80aee5a7ec1f0e3ab1f7fde3e66e014b42f28e6590a56fb4d6162aa9e395ec4cf2cf54b4fa779674edc7ea49d6e837a783ea8488ff03f5d603490d1558393bcdfdfca159ea1c207885f2fa5fda4f16587238b18c45e2d83dfaa028ca2d67f0b7acb1c9935fc2301f7f4ba9bcbc06b9af3a326f611e1e9e6d93c93c11758c8092681d371bd85f25f00dcc46c1015d15d0911fa9f4b4db06e604e070bc64fb6169caf17a4844e39d3ca4ccd0efa930f91617d14bc64b2c915ab7d158bfd1a3edf99562af377bb50f371b38c6feac8424e8a034d1471d92a188478a7e41ef947052a0f2c1685a5ec2b1a66c08e5eb9d163d8e7201400a98a0ffd38ba2c917f07bb114ee0250eb2524f09abbcde8d7855bfcf44cf6430236bcb265571f1455e03c29909c9faf61bbc181120b72574627262e70792cc8149c015b475bfb19a6865aa98127ad20ce29306d624b5f1f9bf26ded991f6659a40f2f5d17b46514efb11f90afa868b03bf498392453f2e2bce86727f5eb77124e05ca41704640d5429f1d4aa3ef19661a8ad650e34f177ece60c059080d4d8149c39ab686569ce2aaff7943d992730a830f7584578fdbd3ebc98401a137e6cdeefe363838b3a2a56ea2ca66bdff94a20ef39affb210329181b356beb70545520cd5d9b4b6fcbb2407f97252acea3ed87f4218266291b9238c2a4eeda12f7ae2ef634e104c769d998216ca7392c91a65f7559e0108a636fbdc33a8eab7b545e4ff3da4a6f32fdb804f5c4c431ba0ed780d5214bc68399232a83774582743c696b89cc0ebd110ee1cb72fbf85991e0c2bd055801ae4d9484ec3c94ccf8c3f85190e64826fe955b55e4b04efe3e4cf406c0bea84c992a18af6d3640e88ab34ec92e69f4b51b7a715d2212dd768a019690f655d68d19a0805a7a53939124ee6f5b5e48b7de6bc3f9098fdb5facab6f973b5a1477c397aefe691c2099efb4fbdfbe99509f43c2f3f8452dfe1f63df92e7a0dbeecad2f2ee6012ccf33a627b33c7e2b70aae4bb7bef47dc6935ca79b085fb3094773b2367eb3b0e8d95c5a8c987fbc72d15170a3f966cd6308729a4a6e032033c781680641a0accab1e2682f7e0c19bbc3831d1b97efa0fba00b8bb99ece27370f16a6b4bd3926d4f98017d8b7a23584b34964dcc7602b368d82d2555a346b96677addc77573bed662d7862b576e7334a6223b6f36e141d06bf658bb5e47f405760322b46d37f63955bea7555f6065ac17a580d2eda371309d48759aa462bfd4067aac6730ea6391a9bdb0aaf00d7a5311c5e52a32259dc49466b2e5945f063ba34388c1b15b6900e8c1d8d6c90bb3b4e64e596024919bd4b331eb98fdf08e22b31dd59f9a791ef24c276fe1561a07f89666bee2ebc9916e94475150f9bc3e240db6a803f1ae34ad8efa474b9ffc8178a68e0ab05192f2b7a73389d47088c4a450b85838997a1404afec5cfcf9ad604a49203d1581048d1d8fa1d55a74c0da87171a6e1ed2f0f9f112460a7117a6aa267f4015f3406ff9cc475197d879e0301de7b2abe50b0cbf6cf55d3548f6104705be4b5216784db2effcd539a7956498ba4a2bcde46eaf08cc8baa5316d993b54599bd3b79201880e233c1473b196abc3d15da0b9cf5e51a82052bbf09af7c0e02290ebc360b63e713102ace0446810e80936f234af849dd6d5783cceaffbcc7e493d695c943787b51ff33a7d9ccbd2008ba86035673c8e8670d543ff3b2ba40387de9d7bc0419ebfa88e34058fdf39cf650c8a291446da83f976ee9bfbbe48385601dd0bcb5f2d85834fabe0fc0957338b04576ddd9d1c2fb8e65a36968d7c0e80d797b096603ab4436c3e980553c94808b4dc74e2e66afe93786afa9f2b7e521fae7730084b6ab8777fbfe6b7ba34a0504806f44ce87d02b9abe856a24baac924e6b1e9b0e4f666dfa8aee90d07135503bf628a3a8578b702673f98a8a81cd7833ccff398d692363c82a845516efd2ae4b9a74b72dd0ee69950113c59e61b31203d618882d73a7eba59f932a7b2aadcc971b743a65daed8b0c8d61d146358220844e4eb32302fe5ea871259374c57bb0f62195918a954ea74519530a6e960f38cfc57fe7dc575dc33697fef0ae3173bf23f359dab53fb25741ad295f2ced8924fb1902894e94e195920ea5596e49e05b3783abc3b946faae16c8ba8b3f9b1aa7aeebade70a9fd0b52ead76f176f355d7de239f77e63b038526144e1b49f6299c89fa3e18db1b3b0fbcccc40d0028c043e9783524c4b85fc6338fae6973f5293a55d9c118339777be91bfaa3932eae0f8d7525109a19bab187ca814a484ffce65f413a8ea22ea627f6ecc03a149f9254d45f9d5956e2083493e6f8aa874aeff7c6429d1a18335175c294377694438d3037b96e4aab9454f7dffef76b5813d31a5f377dddcc01e1ec860b88b5b67be6abb889d82da155739dd4860339d33e7ed7d2aa309646bef3390f43f8e1b8ee75468f9c89c8b798febe1acdd493858c3121e9d1e0c4887d9eccc200b7b6492656fd6e22786b6adbf49a0e11456da10afb1d3e896d10ff2c637c0add4e44b9d0156f599b4495ead0c91574cba37c422e5b67d3857e9b035c232ffe1173a387544f1d3735193e00d52bcd0a08402691955c0ec3576209bdb30d4b3dab09d2cf1731e9f36820ffafe6f1e958239fe606a4adde758c5a2fabd59f2a143aa9ff8e5f9b4b8e06eff7750c4d3b2e9f785f332ee74db963c0aad8565fb8f43852a2bba1c04c401f6ab2cbd33beef28da3d399ee4ef17bc8ec2edfb5a6d666e70a6038b6c92c3501c901b1e56510d9059d2f94b7c3e098f9237f62839dcea1dfd1df8daa3919321cdf69efa80b3c2c1b106dbf0bd644323911b0ecfacada1cb3ced99dc03a21781699af040c49cd45dd6292840951e0171922275a557720613e73638a7f0867090293a965081048cb13d17b76f5136ce638c70646157ee7e447a33ca6019d0d778f773ac2d14df176dd1f497cb0e8b7a97e4f71da1874db722b19dec913732aebac806c797798cbe1feec74a86c2f538e8125407db0b2e6edfd2f1b02d05c43e508641338204e633f278a92d1e4baa33db9b892d0c42e509ffba299949cfeb39d47220e65c0b47505d2639c92fa91afaaa31a11bc5d31db74782e1595ceed4b699e259df053642cb27feae1a5a6883c54ca9b5efbe8b802f94a14343ef10a1040649e29b9b886475942b32c57f68e7434d8756641d3d5b101dd36e09483e93bfcb4f25fc7c515779489b8c0a000a9980f21a50dd14c9b2c5d8c396dbde7a69d6d20e95f114996bbab845ac2944f9a81fc5ac476cbccda30e85acfc5c04b84f566b47dac340206744e800a7f4f54c4a7ff3b2f9af933d57ce277b334ad22f686d5603632bb7e2f08a8258ae75eff36b0d97f3d3613ff39f8730936513b8cd07542da0763942b20e66cc32fbf91600cdf92e7fc5255a6adbc1a3bfb6707d19a4c9f61261ce12387ec59d44ea032d10a282f038aa4907eb6fe8f317a89ae74ea6c1489dc3afa1d7d770e1d57d3db0a154ae981469129646f31821e1dd4cdd32d9bbb53044a9a84a52a97cccd41ac38d56075472104c6041a0776fcb067037f3a9117a7ad4c0e08210a35540aab1fe1c3d27535b8d0453ecbc2467a67d9b70b1a8006b7968a776532b04e6f688082651ad296d0b302c7908fdefe09320a67be5775025929120a509dc7dec726c8a0e82aa664a40972ade66cef98ada9cd14c77a11ff055d136c7fe89d3df498973dd5464586c80eb0e53e0e48370eef6faef20dcc95ae3b449920005194bc928290b0bacfc49e12a676f1f23c4cc1bc33dc6cbd86358fa9a30aa89eb2483c3cd6b83cca79891d0160de91d4ce57d5904007ef581d439586c80bbf1ae709f57f55db82553ae0bc18e6d47c2fcae7afd536b90ff52675d0133120dd85612fd7555cbc558343ea08806b1bcf3b7787f2c613080c4e2841489bfb180deb1b60cbc8119699b036dc0f1194c1a4070e8b91d30b7c47ec61e0bb6da86eb29c3ec1ad236aa1232a6c9abd2a1cc47c82b75c9f54b2b8956e9ba3aa11f82c98c1465d2108d0ceb71f527047a1a8160b84aa5fd28eb6f4f477964c3361cc1a20f5f9d0b66b5a8ced1f1fa37f868c513e6da1abe9fff7fe66434276703f6cc0612af0bf5f60f248735019c3140f05281e269d7f002ea6928ec0e8c18eb725b5351134a9ae9f7a6b067b2308a48145576b9019586725c23a80cbc830800c9ad1b9232f6ca0358eaeb361ffff7846fd261068ad6baed747b3dc550b416835fe3ce67ddfc698ef683804c227cb2302f6d82e85c5512f88539404f613a0ff0d438354ef7e52a28a36b98f66a805dd74484d6f3f73f0dc28edf76f3a7430a6130315154cf2550d953ca377bd83fc5df978058357fc6b714a52bf116c630b485916cfecc2b9bbf1b5ab4ccf26da8d1fa2a115ce51e09ae1c07596027f971273d977d42a8bce76daa6649e31da51709cb1cc5bdf9f7a8d25904f8f384531cd881e57b93cfee106e48f53946be9de00526872b46a40ec0abe3a6992b4f52c12643dcf8c0f4d4185eddad2f9d257eed1f49c18340871ff32de637892c5fa825e1227edad6f21dc5f808e08ffb44ac4e275f100925456630effb7e03f091cc7860c9698abd34b56171541edb31bb515a34b84a8d89ea0fbfbe7b2b8c88ddc963f8fa39da45aa99f3aa5693210f20cd848808dcbced3f730f0336b338456233bf5ec5b21df1a2a09f2379a8595ea637fcba01c7f6b765e330554e1966ab7219d004e855df754f5f0f1df247b8e9be7a1aae56a3fea12b3c4f376625b3c1bd50acf0da503314c38bf2c6cef380265fb62879c94d97a552f24fa431ca2a44f6c9c9c4baa2ad1169d3e95c75b29ef3c2922609cd4e08d7f38c3f996f79ce3353a6b79291b3490983a6b54126935b683f1e85e384909f2611f7f127149251b84c741700dc09372ee75bd35cabe2f4d78613d190d84b950159e0136fde672b03a1a3819679202df50d2e72a780e18bd1941bdd9d5284e0f3ad5ed2bfb8fabe287ca2f17267ca7a91cd73f15d2f7b4b9e40a0642c9c03adf2b2d276a2fd0e17991e6f9de0f7258e2a47c69f2544cb02aa8248f320f5967fc5a27cfdd3e1ab7887f2cac10640e1c872d29d01118aa37ceff8b9c7ce4522338891f168bf5c0b5322e003c57d679d9b5f4328f69a05c8fae75e1c7d893a96d759285341473fda21d0e33df6e7e01fd7f8b8fee4b6a3f168bb18e97175f19dbcf56a70bd985612d8e545b6c006c80202e53a1a2742bec72b68c03b36e7a08e9fff36973cb7888cbddc139d3bcff7f9bfb24fabf5de213c293790a9f878e43df13a17dc5828188f51b750bb7373cb932d85da51f8b23b37258e1c2fdb2a823986fcd4149e0d90b8a81b8fd59029b28d27e207e0cf2d4597c1ad425ccc655809a5e6bb1d6345509ed6c8af83685cd76b20de12c3a8dd23f6fb30263553f86d481f91f3c1d43b596ddf7eda69f5897a8ce6b2d080a9380bbb5af7eb3285fcb23d28eafb7648fb2065da3e52c8dbd0fd2bb195e87c2ebeaf72183e521347c2d69ce72ca4bef390868bec18586fd0d77282a92d7ac9f75b3bf58944485a236632f7d22b93984eae51fcff4f452829ea085fcc3fed18399f67240a8028fc578f8fc99b3e896fb845dd593a493e9706a174d89c0136e51df4e04b5a04c4cfca4130a830264fc3f3b7519bb81ccebccccf3a50a666006b264db55c68efd0a03e3c821b4e0aceed5eaea23a70d14956dabb9596674f2caba60f70e50d2733d8c1da23c7c6508eb6e16058377a07abb5056220bc98597969e33ce10d12cbc07cbea15f0195849a22629163755f829fad8227edc54c0a10039680330e490803ad441b8195afdd1ee7f9915f0b6daf48e8d88f46697ea697857a209d8b2c36a8dd89537b9454f23cef2d20258c08cb519dcf557d163a938db68e7058b6c6251380e69da1e751640fa32c12351aa0fd67b7662a65a3ce96f18b417bd6730a57bedc6c020fb2d9f39b2476afca83e7ac3eef594bdbc842b12f2838effa939b2952371af51144b1fd836bb63594501869dccd34f516f26f5251a3b05172eab489da8b4102b69276cc72c4a35502bdf92ad5d857616cf4dc9f919af32c2885aa928b9a8f432316f80101611772def843dd4be19d7bdaf083599b2a9a792bda771f4f4f646d9504fd3c29f8564c616e8820c48bb41898fa309168dde2ca94a0d45c84f950e632cd658c04fde9fb4b8c5ad242713137a21ece27c0fe739c197268e6a6528a158ae88a7eafc34f8ae4fe0f7cd04ec2e33dfe7b042a965e0f05fe2e3ac30f9f33698912aff56edf5756ec081b01b2816cdf34169b6064e69486e87fa0cdc7ecf330a65334fc7d7f7bbf08164466d956b0cc62cfe798fb4d6bd3bc4a429d5eb1d196177aa2ae5f31ae21dd3e7cc524da63a556858c0ccf6b3e0616be091f585b318f4f0c2a8622d0d9684dda67c3d28808495e8efd62b1f0fdae157e961c6c5bee6ee63b90cc61f612088800418609c3b197b7409d7bcd8a53369b4a9bc962548ec50fd3b752c88c6ae41785545617b49da4052fe9ed173899f98271e065ea8cf4d70400128a08c99e153a78efd9a24075b531e71ad876854bb22c3108229a55704627927535b43cdf4a438f046fe1785811347acc2004a91e9c60aa87ed660228f145f29e65e0f774d674a6869262aa14ade1588c4be8f198bf8e7df619b0e4331a5931a2e8b1246bde1938685266c8d6c4913cd5c6d5a278587c789176dde4bcd4390246123c8eaf7230b954f15d7b3ad89df310271a52276afe7a875509432a7658e6b96206d93e5b28056df1f10c9c4a35f40c1131f30290e7798e61d197ca0ea29d9edfa23bd269cc68b022a0236e2bf6d49f288641edd012ba7bb40c130ed612154f0ff101d43a924d06f9199f55b9dbf5a834d251957537db3d7d817be1de33bff93a56d72c9b3fb6f8a9050ec425bcd7666dc4677e954295c61d47743991acee7e796bd682080daa5fa12e314287337674ea0c0394b1e3660d8a3aec378fc8e2e1a159bab309bc2e3dc4a32744c9bb7672d2cc8f193059797683c8614abd3f9f8be9d255fba4cb3fbcd5023a3ab1118590b6b93c65d2440fee25409e92a246622edac62103c7bfaaf22feff70e956d64528b7c4f91e84197524a77807e68bd0a3933a96b488f8f02e5220b6577dc672b9a8b7d6ddf90ff6b585bef46708062b14438a4f3e950239e533a6313fa39afd4952307c996e359629da872755c30fc16b39a6a94cfd862ca86fe13b979b0ac6735ece74be12072ac15941fe6b0337f0ccc2e57c38a764390141847b855015c8b02bfd97fe79ba4a90a58d5ee2a17a734772ce4131d9323b4d5ce1d8df2c339489d7f862320c62357ff37c1b09f627f6f116599b51905402812a45651aad8e420bfc1ca5c31d9046a48bde485f2d326f1c775904afa48790dbc0ad56e1062fdaf4c88dd82645ff648baa453deadbcc18be9f94a8539650df746d13a85db47d45c8268a7c1ccc7c3a4245fa8eebdfdc0b172dc360201002afa077fa07fa5543960a82f81d81417f8d7c3070c3bb5dab0128a47838f2c43ac7ea4bc75b73afbab9fa42ee0deb10b93aaea0059bc38468e3e2b511833e5ebb0062645048c6106044866ed52d331a21fd90e9d2918d1e2b9e60110c6d1dfed8cab1a7e913ac3c4bd681493d398a0fc64108f7971c30184b5b202e69750f1d53140c0809a974341550e5faef1392a266c18333a19e48eafc6252138c7bf610aa440efee6ada47e619a1be9b9e89dbef8df1aab0446daa2e7f3ac9ceeed93886be8b63f56295bd43bde11be741238fb5754ef749df2962088c089adcb47612f1cf5a868e4c0a0c2437ecb5759da41989899951f96261d31343dc131de60243f48384e06faa87baac8da66ac6323a104f3c1b9013f79d9712befaf860c639739de3ab7f6f1376dd99cb7f6c8aa42fb0d0f2dc586b708bf2b8af0e681350663125e913f7c8f2cf03d566acc35f09bf46680fbb699bdbc06d2af725cebcca87caba9553d5fde4248360dde795a78dad54241cce04425902deab8aa6de34fea7ec003a8b9e94a1c82eb83ff19cf2ae9a5ddf59d6f5e0e96ade83eb8a07072fe4b497b26c09843f98a89d10719a4899c886240f395a527055b3b6a8f208bba4cf495dd8b04c5c4f684331929d638400cb8b4927368e7a2365753cdd5f206545a022cb412ae27176214efaaecc0578b9dc9b87610aea8dbe799a94c6ea88bf5ab3945534addd3f63d76856a0360a1eb505abb4be88ef6b571e8a692453f7b3c6e6051d5cc27bf7715af743dd6b6067ec7fb3e13219833198286ea8315faa6f367a606d8148972617d044f9af75f9f62e7db95fcf329273a8d3a328047cf1d25686cf6a696f5127ec71cdc7d5e1ecb212d8fa94f38a7c84d5cb5730f0a4ff8f70b4f41996092cff2ddd991ab30e22ba1ac0144ca776facd476ca07cb50d9289a234e9faf84926e322d271368682f3a0d403c7c80a04c48788742fd29c567806640b7f1bd8d1dd961d92edd846aead2d9f4ad6c6363b35ed5e7f872c32194fa6ff03d3696f2bf78f055e4019146b144ed1ad63be7c3022dec556cd8d2f3a0bbfe725ae304de8affffa097e7f8e2a91bbe59eb6cdeaa4246cff640dcf9824768418535effe74534331242e689734fc393ff38a8f3e88b450112ef26eb58df6d45d4c677aed1e7cfe1e5a681bb5f72aeace6b762cc72408cb004ec049c1cf4a31701068a1c7058cd2f0e98df911627bd791a85817cc503906256240fe4f830ebcc290ce216dfe5b6331d3cc612098e39b821e314b37858a40d1268f31f23bdb75ea64a5bfe3cbbd9284ea4caa57bc27ed3501e2419aa407e5f7b7a5dc7c64566f4abeaffb54d094357eaab85314c953a520eede2f4bbf2784b3cee19c5420e2d5a6a8b86c313605f16731ab67db8c8310290332d36e5db455da9a7c72de8a95c3794eb85614ba70eb39cddf29dc8971f253c73b14c073bda91d88f8acf246aaedbec7e3baa71bd7dbb6a9e2e610340374fd4f9a0e9ca8f3326126e07545f7ec6e32826f96837657dddbed096f2e9b488fe98165f70d23d3e8602ffdad9480a7dcec031ef6b62061c3121f284b609fa8c8f06c7a4a53324338e65db9af2a4607d2e2977ab4ef41ff93304539c9c0aa831dbbac328a5484a08366000000000037b10700000000002a7315c8ddfc25dc2266a6b221cb8f9fdf641970ab1f65a2754df4e14c432b9c446c604131913bed45976c4a8ea27df843a72d622f80ef15da622f0d56ec1ffe3021190177b0405c4fa1a0311a493c4dd095f24d386be6a03f5838a6b1008665f4000000f5c98fc152bf40e1ce216c8839b8ddd42ea5b355f0b5c700fc9b2cb7c802e1c8336488033fe5f3ef4ccc12af07b9370b92e553e35ecb4a337a1b1c0e4afe1e0edb56114e00fdd4c1f85c892bf35ac9a89289aaecb1ebd0a96cde606a748b5d71a533e05d648cb9635382f38b778dc3c76b18e4eab2d017fdb24c1c0e32d2991707a45ce3f26e443dafa697a76bf24122c9b19b57eebe798668dbd1a0da7c900795222290dd7278aa3ddd389cc1e1d165cc4bafe5c658153cdef5850f97c4d4fb6706b82310414a00fe7dc34b3043e0c7a8a24e810e3cec9de3e1dd7ce06bc191efd2273a357da4436fc4bf82069f6cb87d3d605aeda1336ac513f358b4296b8da51232896ad271063d93404eaa6b80960fa2d4b41d74a544eef94731f0b83ba2701e33b49e3191098c3369bc4658d82f536cb9d38285c51c7844292ced06dd2e8148f0bcd585dc1104e64aa930045e83d828ab436a0e587637e5ef83044d1c2918da284d7072847132885d443640979907485847368e32501345b0dc24c904c06732cc17d944b26181b0c05c6461bccbe4f7b2180a282b6871aa6472fa36cdc49ec50cf69d3eee4b26fe02bf48f39efb549d3963d19e4112c7250c580543516204ff1b0675680cfea02ac09f0b23d6e28c14b08421b3a10a9788442457d732b120c5c466c54ad938dedd3cd3701d9b32fa15dc8db3d6b1ea5d8495732477a72b34efcaf8c349aa40d8e1f21f226ca11182cff00921930b010000000080c3c901000000009104e90000000000d75b9464000000003802000076ab1c8604000000000000000000000000000000000000000000000000000000844f7a7e7585362114fc88a70654146215ab4eaad65ad54b64975840b78d365e8b75e78616a92294e747589c3ee4a845c2962e1cf6cd7fe8bfbd09439e5e6d5e4d4efdf181473803e734d97891388e1b50628658ac818599cf2cb069c8e6b38b6265617665726275696c642e6f7267"; -#[tokio::main] -async fn main() { - tracing_subscriber::fmt::init(); - let mut suite = Suite { - name: "beacon-rpc-compat".to_string(), - description: "The RPC-compatibility test suite runs a set of RPC related tests against a - running node. It tests client implementations of the JSON-RPC API for - conformance with the portal network API specification." - .to_string(), - tests: vec![], - }; - - suite.add(TestSpec { - name: "client launch".to_string(), - description: "This test launches the client and collects its logs.".to_string(), - always_run: false, - run: run_all_client_tests, - client: None, - }); - - let sim = Simulation::new(); - run_suite(sim, suite).await; -} - -async fn run_suite(host: Simulation, suite: Suite) { - let name = suite.clone().name; - let description = suite.clone().description; - - let suite_id = host.start_suite(name, description, "".to_string()).await; - - for test in &suite.tests { - test.run_test(host.clone(), suite_id, suite.clone()).await; - } - - host.end_suite(suite_id).await; -} - dyn_async! { - async fn run_all_client_tests<'a> (test: &'a mut Test, _client: Option) { + pub async fn run_rpc_compat_test_suite<'a> (test: &'a mut Test, _client: Option) { // Get all available portal clients let clients = test.sim.client_types().await; + // todo: remove this once we implement role in hivesim-rs + let clients: Vec = clients.into_iter().filter(|client| client.name != *TRIN_BRIDGE_CLIENT_TYPE).collect(); // Test single type of client for client in &clients { diff --git a/simulators/portal/history/portal-interop/Cargo.toml b/simulators/portal/history/Cargo.toml old mode 100644 new mode 100755 similarity index 94% rename from simulators/portal/history/portal-interop/Cargo.toml rename to simulators/portal/history/Cargo.toml index cfcb9d33f3..e765ef9721 --- a/simulators/portal/history/portal-interop/Cargo.toml +++ b/simulators/portal/history/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "portal-interop" +name = "history" version = "0.1.0" authors = ["Ognyan Genev ", "Kolby ML (Moroz Liebl) "] edition = "2021" @@ -8,9 +8,10 @@ edition = "2021" ethportal-api = { git = "https://github.com/ethereum/trin", rev = "2a32224e3c2b0b80bc37c1b692c33016371f197a" } portal-spec-test-utils-rs = { git = "https://github.com/ethereum/portal-spec-tests", rev = "d1e996d0d4dc2136b3cd38d9e25cdc3a6b74dcd9" } hivesim = { git = "https://github.com/ethereum/portal-hive", rev = "8ff1e3d3c941dd00d56dacd777a5dfb71edf402f" } -itertools = "0.10.5" +futures = "0.3.25" serde_json = "1.0.87" -serde_yaml = "0.9" -tokio = { version = "1", features = ["full"] } tracing = "0.1.37" tracing-subscriber = "0.3.16" +itertools = "0.10.5" +serde_yaml = "0.9" +tokio = { version = "1", features = ["full"] } diff --git a/simulators/portal/history/portal-interop/Dockerfile b/simulators/portal/history/Dockerfile similarity index 71% rename from simulators/portal/history/portal-interop/Dockerfile rename to simulators/portal/history/Dockerfile index fcdb96f856..de403323fa 100644 --- a/simulators/portal/history/portal-interop/Dockerfile +++ b/simulators/portal/history/Dockerfile @@ -1,8 +1,8 @@ -FROM rust:1.71.1 AS builder +FROM rust:1.75.0 AS builder # create a new empty shell project -RUN USER=root cargo new --bin portal-interop -WORKDIR /portal-interop +RUN USER=root cargo new --bin history +WORKDIR /history # copy over manifests and source to build image COPY Cargo.toml ./Cargo.toml @@ -17,9 +17,9 @@ FROM ubuntu:22.04 RUN apt update && apt install wget -y # copy build artifacts from build stage -COPY --from=builder /portal-interop/target/release/portal-interop . +COPY --from=builder /history/target/release/history . ADD https://raw.githubusercontent.com/ethereum/portal-spec-tests/master/tests/mainnet/history/hive/test_data_collection_of_forks_blocks.yaml ./test-data/test_data_collection_of_forks_blocks.yaml ENV RUST_LOG=debug -ENTRYPOINT ["./portal-interop"] +ENTRYPOINT ["./history"] diff --git a/simulators/portal/history/portal-interop/src/constants.rs b/simulators/portal/history/portal-interop/src/constants.rs deleted file mode 100644 index f04015433e..0000000000 --- a/simulators/portal/history/portal-interop/src/constants.rs +++ /dev/null @@ -1 +0,0 @@ -pub const TEST_DATA_FILE_PATH: &str = "./test-data/test_data_collection_of_forks_blocks.yaml"; diff --git a/simulators/portal/history/portal-mesh/Cargo.toml b/simulators/portal/history/portal-mesh/Cargo.toml deleted file mode 100644 index c681c9ade6..0000000000 --- a/simulators/portal/history/portal-mesh/Cargo.toml +++ /dev/null @@ -1,14 +0,0 @@ -[package] -name = "portal-mesh" -version = "0.1.0" -authors = ["Kolby ML (Moroz Liebl) "] -edition = "2021" - -[dependencies] -ethportal-api = { git = "https://github.com/ethereum/trin", rev = "2a32224e3c2b0b80bc37c1b692c33016371f197a" } -hivesim = { git = "https://github.com/ethereum/portal-hive", rev = "8ff1e3d3c941dd00d56dacd777a5dfb71edf402f" } -itertools = "0.10.5" -serde_json = "1.0.87" -tokio = { version = "1", features = ["full"] } -tracing = "0.1.37" -tracing-subscriber = "0.3.16" diff --git a/simulators/portal/history/portal-mesh/Dockerfile b/simulators/portal/history/portal-mesh/Dockerfile deleted file mode 100644 index 98d5424429..0000000000 --- a/simulators/portal/history/portal-mesh/Dockerfile +++ /dev/null @@ -1,24 +0,0 @@ -FROM rust:1.71.1 AS builder - -# create a new empty shell project -RUN USER=root cargo new --bin portal-mesh -WORKDIR /portal-mesh - -# copy over manifests and source to build image -COPY Cargo.toml ./Cargo.toml -COPY src ./src - -# build for release -RUN cargo build --release - -# final base -FROM ubuntu:22.04 - -RUN apt update && apt install wget -y - -# copy build artifacts from build stage -COPY --from=builder /portal-mesh/target/release/portal-mesh . - -ENV RUST_LOG=debug - -ENTRYPOINT ["./portal-mesh"] diff --git a/simulators/portal/history/rpc-compat/Cargo.toml b/simulators/portal/history/rpc-compat/Cargo.toml deleted file mode 100755 index 693f587d49..0000000000 --- a/simulators/portal/history/rpc-compat/Cargo.toml +++ /dev/null @@ -1,14 +0,0 @@ -[package] -name = "rpc-compat" -version = "0.1.0" -authors = ["Ognyan Genev ", "Kolby ML (Moroz Liebl) "] -edition = "2021" - -[dependencies] -ethportal-api = { git = "https://github.com/ethereum/trin", rev = "2a32224e3c2b0b80bc37c1b692c33016371f197a" } -hivesim = { git = "https://github.com/ethereum/portal-hive", rev = "8ff1e3d3c941dd00d56dacd777a5dfb71edf402f" } -futures = "0.3.25" -serde_json = "1.0.87" -tracing = "0.1.37" -tracing-subscriber = "0.3.16" -tokio = { version = "1", features = ["full"] } diff --git a/simulators/portal/history/rpc-compat/Dockerfile b/simulators/portal/history/rpc-compat/Dockerfile deleted file mode 100644 index 353587e58b..0000000000 --- a/simulators/portal/history/rpc-compat/Dockerfile +++ /dev/null @@ -1,24 +0,0 @@ -FROM rust:1.71.1 AS builder - -# create a new empty shell project -RUN USER=root cargo new --bin rpc-compat -WORKDIR /rpc-compat - -# copy over manifests and source to build image -COPY Cargo.toml ./Cargo.toml -COPY src ./src - -# build for release -RUN cargo build --release - -# final base -FROM ubuntu:22.04 - -RUN apt update && apt install wget -y - -# copy build artifacts from build stage -COPY --from=builder /rpc-compat/target/release/rpc-compat . - -ENV RUST_LOG=debug - -ENTRYPOINT ["./rpc-compat"] diff --git a/simulators/portal/history/src/main.rs b/simulators/portal/history/src/main.rs new file mode 100644 index 0000000000..39216444fa --- /dev/null +++ b/simulators/portal/history/src/main.rs @@ -0,0 +1,92 @@ +pub mod suites; + +use hivesim::{Simulation, Suite, TestSpec}; +use suites::interop::test_portal_interop; +use suites::mesh::test_portal_scenarios; +use suites::rpc_compat::run_rpc_compat_test_suite; +use suites::trin_bridge::test_portal_bridge; + +#[tokio::main] +async fn main() { + tracing_subscriber::fmt::init(); + let mut rpc_compat = Suite { + name: "history-rpc-compat".to_string(), + description: "The RPC-compatibility test suite runs a set of RPC related tests against a + running node. It tests client implementations of the JSON-RPC API for + conformance with the portal network API specification." + .to_string(), + tests: vec![], + }; + + rpc_compat.add(TestSpec { + name: "client launch".to_string(), + description: "This test launches the client and collects its logs.".to_string(), + always_run: false, + run: run_rpc_compat_test_suite, + client: None, + }); + + let mut interop = Suite { + name: "history-interop".to_string(), + description: + "The interop test suite runs a set of scenarios to test interoperability between + portal network clients" + .to_string(), + tests: vec![], + }; + + interop.add(TestSpec { + name: "client launch".to_string(), + description: "This test launches the client and collects its logs.".to_string(), + always_run: false, + run: test_portal_interop, + client: None, + }); + + let mut mesh = Suite { + name: "history-mesh".to_string(), + description: "The portal mesh test suite runs a set of scenarios to test 3 clients" + .to_string(), + tests: vec![], + }; + + mesh.add(TestSpec { + name: "client launch".to_string(), + description: "This test launches the client and collects its logs.".to_string(), + always_run: false, + run: test_portal_scenarios, + client: None, + }); + + let mut trin_bridge = Suite { + name: "history-trin-bridge".to_string(), + description: "The portal bridge test suite".to_string(), + tests: vec![], + }; + + trin_bridge.add(TestSpec { + name: "client launch".to_string(), + description: "This test launches the client and collects its logs.".to_string(), + always_run: false, + run: test_portal_bridge, + client: None, + }); + + let sim = Simulation::new(); + run_suite(sim, vec![rpc_compat, interop, mesh, trin_bridge]).await; +} + +async fn run_suite(host: Simulation, suites: Vec) { + for suite in suites { + let name = suite.clone().name; + let description = suite.clone().description; + + let suite_id = host.start_suite(name, description, "".to_string()).await; + + for test in &suite.tests { + test.run_test(host.clone(), suite_id, suite.clone()).await; + } + + host.end_suite(suite_id).await; + } +} diff --git a/simulators/portal/history/trin-bridge/src/constants.rs b/simulators/portal/history/src/suites/constants.rs similarity index 91% rename from simulators/portal/history/trin-bridge/src/constants.rs rename to simulators/portal/history/src/suites/constants.rs index 2679b06b62..b7f0a53430 100644 --- a/simulators/portal/history/trin-bridge/src/constants.rs +++ b/simulators/portal/history/src/suites/constants.rs @@ -1,4 +1,6 @@ +pub const TEST_DATA_FILE_PATH: &str = "./test-data/test_data_collection_of_forks_blocks.yaml"; + +// trin-bridge constants pub const TRIN_BRIDGE_CLIENT_TYPE: &str = "trin-bridge"; pub const BOOTNODES_ENVIRONMENT_VARIABLE: &str = "HIVE_BOOTNODES"; pub const HIVE_CHECK_LIVE_PORT: &str = "HIVE_CHECK_LIVE_PORT"; -pub const TEST_DATA_FILE_PATH: &str = "./test-data/test_data_collection_of_forks_blocks.yaml"; diff --git a/simulators/portal/history/portal-interop/src/main.rs b/simulators/portal/history/src/suites/interop.rs similarity index 95% rename from simulators/portal/history/portal-interop/src/main.rs rename to simulators/portal/history/src/suites/interop.rs index 4d60d1ac9b..7f2e4a7b96 100644 --- a/simulators/portal/history/portal-interop/src/main.rs +++ b/simulators/portal/history/src/suites/interop.rs @@ -1,13 +1,12 @@ -mod constants; - -use crate::constants::TEST_DATA_FILE_PATH; +use crate::suites::constants::{TEST_DATA_FILE_PATH, TRIN_BRIDGE_CLIENT_TYPE}; use ethportal_api::types::portal::ContentInfo; use ethportal_api::utils::bytes::hex_encode; use ethportal_api::{ ContentValue, Discv5ApiClient, HistoryContentKey, HistoryContentValue, HistoryNetworkApiClient, OverlayContentKey, PossibleHistoryContentValue, }; -use hivesim::{dyn_async, Client, NClientTestSpec, Simulation, Suite, Test, TestSpec}; +use hivesim::types::ClientDefinition; +use hivesim::{dyn_async, Client, NClientTestSpec, Test}; use itertools::Itertools; use portal_spec_test_utils_rs::get_flair; use serde_json::json; @@ -21,44 +20,6 @@ const MAX_PORTAL_CONTENT_PAYLOAD_SIZE: usize = 1165; const HEADER_WITH_PROOF_KEY: &str = "0x00720704f3aa11c53cf344ea069db95cecb81ad7453c8f276b2a1062979611f09c"; -#[tokio::main] -async fn main() { - tracing_subscriber::fmt::init(); - - let mut suite = Suite { - name: "portal-interop".to_string(), - description: - "The portal interop test suite runs a set of scenarios to test interoperability between - portal network clients" - .to_string(), - tests: vec![], - }; - - suite.add(TestSpec { - name: "Portal Network interop".to_string(), - description: "".to_string(), - always_run: false, - run: test_portal_interop, - client: None, - }); - - let sim = Simulation::new(); - run_suite(sim, suite).await; -} - -async fn run_suite(host: Simulation, suite: Suite) { - let name = suite.clone().name; - let description = suite.clone().description; - - let suite_id = host.start_suite(name, description, "".to_string()).await; - - for test in &suite.tests { - test.run_test(host.clone(), suite_id, suite.clone()).await; - } - - host.end_suite(suite_id).await; -} - fn content_pair_to_string_pair( content_pair: (HistoryContentKey, HistoryContentValue), ) -> (String, String) { @@ -126,9 +87,11 @@ fn process_content( } dyn_async! { - async fn test_portal_interop<'a> (test: &'a mut Test, _client: Option) { + pub async fn test_portal_interop<'a> (test: &'a mut Test, _client: Option) { // Get all available portal clients let clients = test.sim.client_types().await; + // todo: remove this once we implement role in hivesim-rs + let clients: Vec = clients.into_iter().filter(|client| client.name != *TRIN_BRIDGE_CLIENT_TYPE).collect(); let values = std::fs::read_to_string(TEST_DATA_FILE_PATH) .expect("cannot find test asset"); diff --git a/simulators/portal/history/portal-mesh/src/main.rs b/simulators/portal/history/src/suites/mesh.rs similarity index 91% rename from simulators/portal/history/portal-mesh/src/main.rs rename to simulators/portal/history/src/suites/mesh.rs index 1a1006e34b..5b9c299e6c 100644 --- a/simulators/portal/history/portal-mesh/src/main.rs +++ b/simulators/portal/history/src/suites/mesh.rs @@ -1,10 +1,12 @@ +use crate::suites::constants::TRIN_BRIDGE_CLIENT_TYPE; use ethportal_api::jsonrpsee::core::__reexports::serde_json; use ethportal_api::types::distance::{Metric, XorMetric}; use ethportal_api::types::portal::ContentInfo; use ethportal_api::{ Discv5ApiClient, HistoryContentKey, HistoryContentValue, HistoryNetworkApiClient, }; -use hivesim::{dyn_async, Client, NClientTestSpec, Simulation, Suite, Test, TestSpec}; +use hivesim::types::ClientDefinition; +use hivesim::{dyn_async, Client, NClientTestSpec, Test}; use itertools::Itertools; use serde_json::json; use std::collections::HashMap; @@ -17,46 +19,12 @@ const HEADER_WITH_PROOF_VALUE: &str = "0x080000002d020000f90222a02c58e3212c08517 // private key hive environment variable const PRIVATE_KEY_ENVIRONMENT_VARIABLE: &str = "HIVE_CLIENT_PRIVATE_KEY"; -#[tokio::main] -async fn main() { - tracing_subscriber::fmt::init(); - - let mut suite = Suite { - name: "portal-mesh".to_string(), - description: "The portal mesh test suite runs a set of scenarios to test 3 clients" - .to_string(), - tests: vec![], - }; - - suite.add(TestSpec { - name: "Portal Network mesh".to_string(), - description: "".to_string(), - always_run: false, - run: test_portal_scenarios, - client: None, - }); - - let sim = Simulation::new(); - run_suite(sim, suite).await; -} - -async fn run_suite(host: Simulation, suite: Suite) { - let name = suite.clone().name; - let description = suite.clone().description; - - let suite_id = host.start_suite(name, description, "".to_string()).await; - - for test in &suite.tests { - test.run_test(host.clone(), suite_id, suite.clone()).await; - } - - host.end_suite(suite_id).await; -} - dyn_async! { - async fn test_portal_scenarios<'a> (test: &'a mut Test, _client: Option) { + pub async fn test_portal_scenarios<'a> (test: &'a mut Test, _client: Option) { // Get all available portal clients let clients = test.sim.client_types().await; + // todo: remove this once we implement role in hivesim-rs + let clients: Vec = clients.into_iter().filter(|client| client.name != *TRIN_BRIDGE_CLIENT_TYPE).collect(); let private_key_1 = "fc34e57cc83ed45aae140152fd84e2c21d1f4d46e19452e13acc7ee90daa5bac".to_string(); let private_key_2 = "e5add57dc4c9ef382509e61ce106ec86f60eb73bbfe326b00f54bf8e1819ba11".to_string(); diff --git a/simulators/portal/history/src/suites/mod.rs b/simulators/portal/history/src/suites/mod.rs new file mode 100644 index 0000000000..a6bd87537c --- /dev/null +++ b/simulators/portal/history/src/suites/mod.rs @@ -0,0 +1,5 @@ +pub mod constants; +pub mod interop; +pub mod mesh; +pub mod rpc_compat; +pub mod trin_bridge; diff --git a/simulators/portal/history/rpc-compat/src/main.rs b/simulators/portal/history/src/suites/rpc_compat.rs similarity index 94% rename from simulators/portal/history/rpc-compat/src/main.rs rename to simulators/portal/history/src/suites/rpc_compat.rs index 1e85314fcc..bdae9c3526 100644 --- a/simulators/portal/history/rpc-compat/src/main.rs +++ b/simulators/portal/history/src/suites/rpc_compat.rs @@ -1,56 +1,23 @@ +use crate::suites::constants::TRIN_BRIDGE_CLIENT_TYPE; use ethportal_api::types::enr::generate_random_remote_enr; use ethportal_api::types::portal::ContentInfo; use ethportal_api::Discv5ApiClient; use ethportal_api::PossibleHistoryContentValue::{ContentAbsent, ContentPresent}; use ethportal_api::{HistoryContentKey, HistoryNetworkApiClient}; -use hivesim::{dyn_async, Client, NClientTestSpec, Simulation, Suite, Test, TestSpec}; +use hivesim::types::ClientDefinition; +use hivesim::{dyn_async, Client, NClientTestSpec, Test}; use serde_json::json; // Header with proof for block number 14764013 const CONTENT_KEY: &str = "0x00720704f3aa11c53cf344ea069db95cecb81ad7453c8f276b2a1062979611f09c"; const CONTENT_VALUE: &str = "0x080000002d020000f90222a02c58e3212c085178dbb1277e2f3c24b3f451267a75a234945c1581af639f4a7aa058a694212e0416353a4d3865ccf475496b55af3a3d3b002057000741af9731919400192fb10df37c9fb26829eb2cc623cd1bf599e8a067a9fb631f4579f9015ef3c6f1f3830dfa2dc08afe156f750e90022134b9ebf6a018a2978fc62cd1a23e90de920af68c0c3af3330327927cda4c005faccefb5ce7a0168a3827607627e781941dc777737fc4b6beb69a8b139240b881992b35b854eab9010000200000400000001000400080080000000000010004010001000008000000002000110000000000000090020001110402008000080208040010000000a8000000000000000000210822000900205020000000000160020020000400800040000000000042080000000400004008084020001000001004004000001000000000000001000000110000040000010200844040048101000008002000404810082002800000108020000200408008000100000000000000002020000b00010080600902000200000050000400000000000000400000002002101000000a00002000003420000800400000020100002000000000000000c00040000001000000100187327bd7ad3116ce83e147ed8401c9c36483140db184627d9afa9a457468657265756d50504c4e532f326d696e6572735f55534133a0f1a32e24eb62f01ec3f2b3b5893f7be9062fbf5482bc0d490a54352240350e26882087fbb243327696851aae1651b6010cc53ffa2df1bae1550a0000000000000000000000000000000000000000000063d45d0a2242d35484f289108b3c80cccf943005db0db6c67ffea4c4a47fd529f64d74fa6068a3fd89a2c0d9938c3a751c4706d0b0e8f99dec6b517cf12809cb413795c8c678b3171303ddce2fa1a91af6a0961b9db72750d4d5ea7d5103d8d25f23f522d9af4c13fe8ac7a7d9d64bb08d980281eea5298b93cb1085fedc19d4c60afdd52d116cfad030cf4223e50afa8031154a2263c76eb08b96b5b8fdf5e5c30825d5c918eefb89daaf0e8573f20643614d9843a1817b6186074e4e53b22cf49046d977c901ec00aef1555fa89468adc2a51a081f186c995153d1cba0f2887d585212d68be4b958d309fbe611abe98a9bfc3f4b7a7b72bb881b888d89a04ecfe08b1c1a48554a48328646e4f864fe722f12d850f0be29e3829d1f94b34083032a9b6f43abd559785c996229f8e022d4cd6dcde4aafcce6445fe8743e1fcbe8672a99f9d9e3a5ca10c01f3751d69fbd22197f0680bc1529151130b22759bf185f4dbce357f46eb9cc8e21ea78f49b298eea2756d761fe23de8bea0d2e15aed136d689f6d252c54ebadc3e46b84a397b681edf7ec63522b9a298301084d019d0020000000000000000000000000000000000000000000000000000000000000"; -#[tokio::main] -async fn main() { - tracing_subscriber::fmt::init(); - let mut suite = Suite { - name: "history-rpc-compat".to_string(), - description: "The RPC-compatibility test suite runs a set of RPC related tests against a - running node. It tests client implementations of the JSON-RPC API for - conformance with the portal network API specification." - .to_string(), - tests: vec![], - }; - - suite.add(TestSpec { - name: "client launch".to_string(), - description: "This test launches the client and collects its logs.".to_string(), - always_run: false, - run: run_all_client_tests, - client: None, - }); - - let sim = Simulation::new(); - run_suite(sim, suite).await; -} - -async fn run_suite(host: Simulation, suite: Suite) { - let name = suite.clone().name; - let description = suite.clone().description; - - let suite_id = host.start_suite(name, description, "".to_string()).await; - - for test in &suite.tests { - test.run_test(host.clone(), suite_id, suite.clone()).await; - } - - host.end_suite(suite_id).await; -} - dyn_async! { - async fn run_all_client_tests<'a> (test: &'a mut Test, _client: Option) { + pub async fn run_rpc_compat_test_suite<'a> (test: &'a mut Test, _client: Option) { // Get all available portal clients let clients = test.sim.client_types().await; + // todo: remove this once we implement role in hivesim-rs + let clients: Vec = clients.into_iter().filter(|client| client.name != *TRIN_BRIDGE_CLIENT_TYPE).collect(); // Test single type of client for client in &clients { diff --git a/simulators/portal/history/trin-bridge/src/main.rs b/simulators/portal/history/src/suites/trin_bridge.rs similarity index 85% rename from simulators/portal/history/trin-bridge/src/main.rs rename to simulators/portal/history/src/suites/trin_bridge.rs index 0fa8db0364..9bbc991d17 100644 --- a/simulators/portal/history/trin-bridge/src/main.rs +++ b/simulators/portal/history/src/suites/trin_bridge.rs @@ -1,6 +1,4 @@ -mod constants; - -use crate::constants::{ +use super::constants::{ BOOTNODES_ENVIRONMENT_VARIABLE, HIVE_CHECK_LIVE_PORT, TEST_DATA_FILE_PATH, TRIN_BRIDGE_CLIENT_TYPE, }; @@ -9,7 +7,7 @@ use ethportal_api::HistoryContentValue; use ethportal_api::PossibleHistoryContentValue; use ethportal_api::{Discv5ApiClient, HistoryNetworkApiClient}; use hivesim::types::ClientDefinition; -use hivesim::{dyn_async, Client, NClientTestSpec, Simulation, Suite, Test, TestSpec}; +use hivesim::{dyn_async, Client, NClientTestSpec, Test}; use itertools::Itertools; use portal_spec_test_utils_rs::get_flair; use serde_yaml::Value; @@ -46,43 +44,8 @@ fn process_content(content: Vec<(HistoryContentKey, HistoryContentValue)>) -> Ve result } -#[tokio::main] -async fn main() { - tracing_subscriber::fmt::init(); - - let mut suite = Suite { - name: "trin-bridge-tests".to_string(), - description: "The portal bridge test suite".to_string(), - tests: vec![], - }; - - suite.add(TestSpec { - name: "Trin bridge tests".to_string(), - description: "".to_string(), - always_run: false, - run: test_portal_bridge, - client: None, - }); - - let sim = Simulation::new(); - run_suite(sim, suite).await; -} - -async fn run_suite(host: Simulation, suite: Suite) { - let name = suite.clone().name; - let description = suite.clone().description; - - let suite_id = host.start_suite(name, description, "".to_string()).await; - - for test in &suite.tests { - test.run_test(host.clone(), suite_id, suite.clone()).await; - } - - host.end_suite(suite_id).await; -} - dyn_async! { - async fn test_portal_bridge<'a> (test: &'a mut Test, _client: Option) { + pub async fn test_portal_bridge<'a> (test: &'a mut Test, _client: Option) { // Get all available portal clients let clients = test.sim.client_types().await; if !clients.iter().any(|client_definition| client_definition.name == *TRIN_BRIDGE_CLIENT_TYPE) { diff --git a/simulators/portal/history/trin-bridge/Cargo.toml b/simulators/portal/history/trin-bridge/Cargo.toml deleted file mode 100644 index fac1f5c65f..0000000000 --- a/simulators/portal/history/trin-bridge/Cargo.toml +++ /dev/null @@ -1,15 +0,0 @@ -[package] -name = "trin-bridge" -version = "0.1.0" -authors = ["Kolby ML (Moroz Liebl) "] -edition = "2021" - -[dependencies] -ethportal-api = { git = "https://github.com/ethereum/trin", rev = "b530dc3d40d51c21c800089eacb2852ebd8c4d45" } -portal-spec-test-utils-rs = { git = "https://github.com/ethereum/portal-spec-tests", rev = "d1e996d0d4dc2136b3cd38d9e25cdc3a6b74dcd9" } -hivesim = { git = "https://github.com/ethereum/portal-hive", rev = "8ff1e3d3c941dd00d56dacd777a5dfb71edf402f" } -itertools = "0.10.5" -serde_yaml = "0.9" -tokio = { version = "1", features = ["full"] } -tracing = "0.1.37" -tracing-subscriber = "0.3.16" diff --git a/simulators/portal/history/trin-bridge/Dockerfile b/simulators/portal/history/trin-bridge/Dockerfile deleted file mode 100644 index da91a6b211..0000000000 --- a/simulators/portal/history/trin-bridge/Dockerfile +++ /dev/null @@ -1,40 +0,0 @@ -FROM rust:1.71.1 AS builder - -# create a new empty shell project -RUN USER=root cargo new --bin trin-bridge -WORKDIR /trin-bridge - -RUN apt-get update && apt-get install clang -y - -# copy over manifests and source to build image -COPY Cargo.toml ./Cargo.toml -COPY src ./src - -# build for release -RUN cargo build --release - -# final base -FROM ubuntu:22.04 - -RUN apt update && apt install wget -y - -# Use these for amd-based devices -RUN wget http://nz2.archive.ubuntu.com/ubuntu/pool/main/o/openssl/libssl1.1_1.1.0g-2ubuntu4_amd64.deb -RUN dpkg -i libssl1.1_1.1.0g-2ubuntu4_amd64.deb -# Use these for arm-based devices -#RUN wget http://ports.ubuntu.com/pool/main/o/openssl/libssl1.1_1.1.1f-1ubuntu2_arm64.deb -#RUN dpkg -i libssl1.1_1.1.1f-1ubuntu2_arm64.deb - -# copy build artifacts from build stage -COPY --from=builder /trin-bridge/target/release/trin-bridge . -ADD https://raw.githubusercontent.com/ethereum/portal-spec-tests/master/tests/mainnet/history/hive/test_data_collection_of_forks_blocks.yaml ./test-data/test_data_collection_of_forks_blocks.yaml - -RUN apt-get update && apt-get install libcurl4 -y - -ENV RUST_LOG=debug - -# Fake secrets for Trin bridge activation, not actually used in the used `BridgeMode::Test` mode -ENV PANDAOPS_CLIENT_ID=xxx -ENV PANDAOPS_CLIENT_SECRET=xxx - -ENTRYPOINT ["./trin-bridge"] From 5347c9c2416d56c2deee9db957012230ad278fd5 Mon Sep 17 00:00:00 2001 From: spencer Date: Mon, 12 Feb 2024 20:56:24 +0700 Subject: [PATCH 181/387] simulators/ethereum/engine: Expect error code for invalid payload attributes tests (#996) simulators/ethereum/engine: Expect error code for invalid payload attributes tests. --- simulators/ethereum/engine/suites/engine/payload_attributes.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/simulators/ethereum/engine/suites/engine/payload_attributes.go b/simulators/ethereum/engine/suites/engine/payload_attributes.go index 91b9cadae4..540159b2a1 100644 --- a/simulators/ethereum/engine/suites/engine/payload_attributes.go +++ b/simulators/ethereum/engine/suites/engine/payload_attributes.go @@ -5,6 +5,7 @@ import ( "github.com/ethereum/hive/simulators/ethereum/engine/clmock" "github.com/ethereum/hive/simulators/ethereum/engine/config" + "github.com/ethereum/hive/simulators/ethereum/engine/globals" "github.com/ethereum/hive/simulators/ethereum/engine/helper" "github.com/ethereum/hive/simulators/ethereum/engine/test" ) @@ -72,7 +73,7 @@ func (tc InvalidPayloadAttributesTest) Execute(t *test.Env) { r.ExpectPayloadID(nil) } else { r := t.TestEngine.TestEngineForkchoiceUpdated(&fcu, attr, t.CLMock.LatestPayloadBuilt.Timestamp) - r.ExpectError() + r.ExpectErrorCode(*globals.INVALID_PAYLOAD_ATTRIBUTES) // Check that the forkchoice was applied, regardless of the error s := t.TestEngine.TestHeaderByNumber(Head) From c614d062adad4be3c6e6b7004841e78f62c5d5f8 Mon Sep 17 00:00:00 2001 From: Mario Vega Date: Tue, 13 Feb 2024 10:37:50 -0600 Subject: [PATCH 182/387] clients/lighthouse-bn: Add trusted peers env var (#908) --- clients/lighthouse-bn/lighthouse_bn.sh | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/clients/lighthouse-bn/lighthouse_bn.sh b/clients/lighthouse-bn/lighthouse_bn.sh index dea46b4ec3..398434b62c 100755 --- a/clients/lighthouse-bn/lighthouse_bn.sh +++ b/clients/lighthouse-bn/lighthouse_bn.sh @@ -51,6 +51,10 @@ if [[ "$HIVE_ETH2_BEACON_NODE_INDEX" != "" ]]; then fi fi +if [[ "$HIVE_ETH2_TRUSTED_PEER_IDS" != "" ]]; then + trustedpeers="$trustedpeers,$HIVE_ETH2_TRUSTED_PEER_IDS" +fi + LOG=info case "$HIVE_LOGLEVEL" in 0|1) LOG=error ;; From 4746f9b052327b0836eb07bd3c65f1c83e35535d Mon Sep 17 00:00:00 2001 From: Stefan Pingel <16143240+pinges@users.noreply.github.com> Date: Wed, 14 Feb 2024 22:46:01 +1000 Subject: [PATCH 183/387] clients/besu: fix merge block in mapper (#999) fix fork id problem Signed-off-by: stefan.pingel@consensys.net --- clients/besu/mapper.jq | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clients/besu/mapper.jq b/clients/besu/mapper.jq index c498e5a6e3..ab6ee6913b 100644 --- a/clients/besu/mapper.jq +++ b/clients/besu/mapper.jq @@ -45,7 +45,7 @@ def to_int: "londonBlock": env.HIVE_FORK_LONDON|to_int, "arrowGlacierBlock": env.HIVE_FORK_ARROW_GLACIER|to_int, "grayGlacierBlock": env.HIVE_FORK_GRAY_GLACIER|to_int, - "parisBlock": env.HIVE_MERGE_BLOCK_ID|to_int, + "mergeNetsplitBlock": env.HIVE_MERGE_BLOCK_ID|to_int, "terminalTotalDifficulty": env.HIVE_TERMINAL_TOTAL_DIFFICULTY|to_int, "shanghaiTime": env.HIVE_SHANGHAI_TIMESTAMP|to_int, "cancunTime": env.HIVE_CANCUN_TIMESTAMP|to_int, From a4d9e381f005cc54db5296460129e3a157589cff Mon Sep 17 00:00:00 2001 From: spencer Date: Wed, 14 Feb 2024 19:46:41 +0700 Subject: [PATCH 184/387] simulators/ethereum/consensus: add Paris as additional merge fork (#997) --- simulators/ethereum/consensus/forks.go | 313 ++++++++++++++++++++++++ simulators/ethereum/consensus/main.go | 316 +------------------------ 2 files changed, 317 insertions(+), 312 deletions(-) create mode 100644 simulators/ethereum/consensus/forks.go diff --git a/simulators/ethereum/consensus/forks.go b/simulators/ethereum/consensus/forks.go new file mode 100644 index 0000000000..fe3a024f9c --- /dev/null +++ b/simulators/ethereum/consensus/forks.go @@ -0,0 +1,313 @@ +package main + +var envForks = map[string]map[string]int{ + "Frontier": { + "HIVE_FORK_HOMESTEAD": 2000, + "HIVE_FORK_DAO_BLOCK": 2000, + "HIVE_FORK_TANGERINE": 2000, + "HIVE_FORK_SPURIOUS": 2000, + "HIVE_FORK_BYZANTIUM": 2000, + "HIVE_FORK_CONSTANTINOPLE": 2000, + "HIVE_FORK_PETERSBURG": 2000, + "HIVE_FORK_ISTANBUL": 2000, + "HIVE_FORK_BERLIN": 2000, + "HIVE_FORK_LONDON": 2000, + }, + "Homestead": { + "HIVE_FORK_HOMESTEAD": 0, + "HIVE_FORK_DAO_BLOCK": 2000, + "HIVE_FORK_TANGERINE": 2000, + "HIVE_FORK_SPURIOUS": 2000, + "HIVE_FORK_BYZANTIUM": 2000, + "HIVE_FORK_CONSTANTINOPLE": 2000, + "HIVE_FORK_PETERSBURG": 2000, + "HIVE_FORK_ISTANBUL": 2000, + "HIVE_FORK_BERLIN": 2000, + "HIVE_FORK_LONDON": 2000, + }, + "EIP150": { + "HIVE_FORK_HOMESTEAD": 0, + "HIVE_FORK_TANGERINE": 0, + "HIVE_FORK_SPURIOUS": 2000, + "HIVE_FORK_BYZANTIUM": 2000, + "HIVE_FORK_CONSTANTINOPLE": 2000, + "HIVE_FORK_PETERSBURG": 2000, + "HIVE_FORK_ISTANBUL": 2000, + "HIVE_FORK_BERLIN": 2000, + "HIVE_FORK_LONDON": 2000, + }, + "EIP158": { + "HIVE_FORK_HOMESTEAD": 0, + "HIVE_FORK_TANGERINE": 0, + "HIVE_FORK_SPURIOUS": 0, + "HIVE_FORK_BYZANTIUM": 2000, + "HIVE_FORK_CONSTANTINOPLE": 2000, + "HIVE_FORK_PETERSBURG": 2000, + "HIVE_FORK_ISTANBUL": 2000, + "HIVE_FORK_BERLIN": 2000, + "HIVE_FORK_LONDON": 2000, + }, + "Byzantium": { + "HIVE_FORK_HOMESTEAD": 0, + "HIVE_FORK_TANGERINE": 0, + "HIVE_FORK_SPURIOUS": 0, + "HIVE_FORK_BYZANTIUM": 0, + "HIVE_FORK_CONSTANTINOPLE": 2000, + "HIVE_FORK_PETERSBURG": 2000, + "HIVE_FORK_ISTANBUL": 2000, + "HIVE_FORK_BERLIN": 2000, + "HIVE_FORK_LONDON": 2000, + }, + "Constantinople": { + "HIVE_FORK_HOMESTEAD": 0, + "HIVE_FORK_TANGERINE": 0, + "HIVE_FORK_SPURIOUS": 0, + "HIVE_FORK_BYZANTIUM": 0, + "HIVE_FORK_CONSTANTINOPLE": 0, + "HIVE_FORK_PETERSBURG": 2000, + "HIVE_FORK_ISTANBUL": 2000, + "HIVE_FORK_BERLIN": 2000, + "HIVE_FORK_LONDON": 2000, + }, + "ConstantinopleFix": { + "HIVE_FORK_HOMESTEAD": 0, + "HIVE_FORK_TANGERINE": 0, + "HIVE_FORK_SPURIOUS": 0, + "HIVE_FORK_BYZANTIUM": 0, + "HIVE_FORK_CONSTANTINOPLE": 0, + "HIVE_FORK_PETERSBURG": 0, + "HIVE_FORK_ISTANBUL": 2000, + "HIVE_FORK_BERLIN": 2000, + "HIVE_FORK_LONDON": 2000, + }, + "Istanbul": { + "HIVE_FORK_HOMESTEAD": 0, + "HIVE_FORK_TANGERINE": 0, + "HIVE_FORK_SPURIOUS": 0, + "HIVE_FORK_BYZANTIUM": 0, + "HIVE_FORK_CONSTANTINOPLE": 0, + "HIVE_FORK_PETERSBURG": 0, + "HIVE_FORK_ISTANBUL": 0, + "HIVE_FORK_BERLIN": 2000, + "HIVE_FORK_LONDON": 2000, + }, + "Berlin": { + "HIVE_FORK_HOMESTEAD": 0, + "HIVE_FORK_TANGERINE": 0, + "HIVE_FORK_SPURIOUS": 0, + "HIVE_FORK_BYZANTIUM": 0, + "HIVE_FORK_CONSTANTINOPLE": 0, + "HIVE_FORK_PETERSBURG": 0, + "HIVE_FORK_ISTANBUL": 0, + "HIVE_FORK_BERLIN": 0, + "HIVE_FORK_LONDON": 2000, + }, + "FrontierToHomesteadAt5": { + "HIVE_FORK_HOMESTEAD": 5, + "HIVE_FORK_DAO_BLOCK": 2000, + "HIVE_FORK_TANGERINE": 2000, + "HIVE_FORK_SPURIOUS": 2000, + "HIVE_FORK_BYZANTIUM": 2000, + "HIVE_FORK_CONSTANTINOPLE": 2000, + "HIVE_FORK_PETERSBURG": 2000, + "HIVE_FORK_ISTANBUL": 2000, + "HIVE_FORK_BERLIN": 2000, + "HIVE_FORK_LONDON": 2000, + }, + "HomesteadToEIP150At5": { + "HIVE_FORK_HOMESTEAD": 0, + "HIVE_FORK_TANGERINE": 5, + "HIVE_FORK_SPURIOUS": 2000, + "HIVE_FORK_BYZANTIUM": 2000, + "HIVE_FORK_CONSTANTINOPLE": 2000, + "HIVE_FORK_PETERSBURG": 2000, + "HIVE_FORK_ISTANBUL": 2000, + "HIVE_FORK_BERLIN": 2000, + "HIVE_FORK_LONDON": 2000, + }, + "HomesteadToDaoAt5": { + "HIVE_FORK_HOMESTEAD": 0, + "HIVE_FORK_DAO_BLOCK": 5, + "HIVE_FORK_TANGERINE": 2000, + "HIVE_FORK_SPURIOUS": 2000, + "HIVE_FORK_BYZANTIUM": 2000, + "HIVE_FORK_CONSTANTINOPLE": 2000, + "HIVE_FORK_PETERSBURG": 2000, + "HIVE_FORK_ISTANBUL": 2000, + "HIVE_FORK_BERLIN": 2000, + "HIVE_FORK_LONDON": 2000, + }, + "EIP158ToByzantiumAt5": { + "HIVE_FORK_HOMESTEAD": 0, + "HIVE_FORK_TANGERINE": 0, + "HIVE_FORK_SPURIOUS": 0, + "HIVE_FORK_BYZANTIUM": 5, + "HIVE_FORK_CONSTANTINOPLE": 2000, + "HIVE_FORK_PETERSBURG": 2000, + "HIVE_FORK_ISTANBUL": 2000, + "HIVE_FORK_BERLIN": 2000, + "HIVE_FORK_LONDON": 2000, + }, + "ByzantiumToConstantinopleAt5": { + "HIVE_FORK_HOMESTEAD": 0, + "HIVE_FORK_TANGERINE": 0, + "HIVE_FORK_SPURIOUS": 0, + "HIVE_FORK_BYZANTIUM": 0, + "HIVE_FORK_CONSTANTINOPLE": 5, + "HIVE_FORK_PETERSBURG": 2000, + "HIVE_FORK_ISTANBUL": 2000, + "HIVE_FORK_BERLIN": 2000, + "HIVE_FORK_LONDON": 2000, + }, + "ByzantiumToConstantinopleFixAt5": { + "HIVE_FORK_HOMESTEAD": 0, + "HIVE_FORK_TANGERINE": 0, + "HIVE_FORK_SPURIOUS": 0, + "HIVE_FORK_BYZANTIUM": 0, + "HIVE_FORK_CONSTANTINOPLE": 5, + "HIVE_FORK_PETERSBURG": 5, + "HIVE_FORK_ISTANBUL": 2000, + "HIVE_FORK_BERLIN": 2000, + "HIVE_FORK_LONDON": 2000, + }, + "ConstantinopleFixToIstanbulAt5": { + "HIVE_FORK_HOMESTEAD": 0, + "HIVE_FORK_TANGERINE": 0, + "HIVE_FORK_SPURIOUS": 0, + "HIVE_FORK_BYZANTIUM": 0, + "HIVE_FORK_CONSTANTINOPLE": 0, + "HIVE_FORK_PETERSBURG": 0, + "HIVE_FORK_ISTANBUL": 5, + "HIVE_FORK_BERLIN": 2000, + "HIVE_FORK_LONDON": 2000, + }, + "IstanbulToBerlinAt5": { + "HIVE_FORK_HOMESTEAD": 0, + "HIVE_FORK_TANGERINE": 0, + "HIVE_FORK_SPURIOUS": 0, + "HIVE_FORK_BYZANTIUM": 0, + "HIVE_FORK_CONSTANTINOPLE": 0, + "HIVE_FORK_PETERSBURG": 0, + "HIVE_FORK_ISTANBUL": 0, + "HIVE_FORK_BERLIN": 5, + "HIVE_FORK_LONDON": 2000, + }, + "BerlinToLondonAt5": { + "HIVE_FORK_HOMESTEAD": 0, + "HIVE_FORK_TANGERINE": 0, + "HIVE_FORK_SPURIOUS": 0, + "HIVE_FORK_BYZANTIUM": 0, + "HIVE_FORK_CONSTANTINOPLE": 0, + "HIVE_FORK_PETERSBURG": 0, + "HIVE_FORK_ISTANBUL": 0, + "HIVE_FORK_BERLIN": 0, + "HIVE_FORK_LONDON": 5, + }, + "London": { + "HIVE_FORK_HOMESTEAD": 0, + "HIVE_FORK_TANGERINE": 0, + "HIVE_FORK_SPURIOUS": 0, + "HIVE_FORK_BYZANTIUM": 0, + "HIVE_FORK_CONSTANTINOPLE": 0, + "HIVE_FORK_PETERSBURG": 0, + "HIVE_FORK_ISTANBUL": 0, + "HIVE_FORK_BERLIN": 0, + "HIVE_FORK_LONDON": 0, + }, + "ArrowGlacierToMergeAtDiffC0000": { + "HIVE_FORK_HOMESTEAD": 0, + "HIVE_FORK_TANGERINE": 0, + "HIVE_FORK_SPURIOUS": 0, + "HIVE_FORK_BYZANTIUM": 0, + "HIVE_FORK_CONSTANTINOPLE": 0, + "HIVE_FORK_PETERSBURG": 0, + "HIVE_FORK_ISTANBUL": 0, + "HIVE_FORK_BERLIN": 0, + "HIVE_FORK_LONDON": 0, + "HIVE_TERMINAL_TOTAL_DIFFICULTY": 786432, + }, + "Merge": { // Remove once Paris replaces Merge + "HIVE_FORK_HOMESTEAD": 0, + "HIVE_FORK_TANGERINE": 0, + "HIVE_FORK_SPURIOUS": 0, + "HIVE_FORK_BYZANTIUM": 0, + "HIVE_FORK_CONSTANTINOPLE": 0, + "HIVE_FORK_PETERSBURG": 0, + "HIVE_FORK_ISTANBUL": 0, + "HIVE_FORK_BERLIN": 0, + "HIVE_FORK_LONDON": 0, + "HIVE_FORK_MERGE": 0, + "HIVE_TERMINAL_TOTAL_DIFFICULTY": 0, + }, + "Paris": { + "HIVE_FORK_HOMESTEAD": 0, + "HIVE_FORK_TANGERINE": 0, + "HIVE_FORK_SPURIOUS": 0, + "HIVE_FORK_BYZANTIUM": 0, + "HIVE_FORK_CONSTANTINOPLE": 0, + "HIVE_FORK_PETERSBURG": 0, + "HIVE_FORK_ISTANBUL": 0, + "HIVE_FORK_BERLIN": 0, + "HIVE_FORK_LONDON": 0, + "HIVE_FORK_MERGE": 0, + "HIVE_TERMINAL_TOTAL_DIFFICULTY": 0, + }, + "Shanghai": { + "HIVE_FORK_HOMESTEAD": 0, + "HIVE_FORK_TANGERINE": 0, + "HIVE_FORK_SPURIOUS": 0, + "HIVE_FORK_BYZANTIUM": 0, + "HIVE_FORK_CONSTANTINOPLE": 0, + "HIVE_FORK_PETERSBURG": 0, + "HIVE_FORK_ISTANBUL": 0, + "HIVE_FORK_BERLIN": 0, + "HIVE_FORK_LONDON": 0, + "HIVE_FORK_MERGE": 0, + "HIVE_TERMINAL_TOTAL_DIFFICULTY": 0, + "HIVE_SHANGHAI_TIMESTAMP": 0, + }, + "MergeToShanghaiAtTime15k": { + "HIVE_FORK_HOMESTEAD": 0, + "HIVE_FORK_TANGERINE": 0, + "HIVE_FORK_SPURIOUS": 0, + "HIVE_FORK_BYZANTIUM": 0, + "HIVE_FORK_CONSTANTINOPLE": 0, + "HIVE_FORK_PETERSBURG": 0, + "HIVE_FORK_ISTANBUL": 0, + "HIVE_FORK_BERLIN": 0, + "HIVE_FORK_LONDON": 0, + "HIVE_FORK_MERGE": 0, + "HIVE_TERMINAL_TOTAL_DIFFICULTY": 0, + "HIVE_SHANGHAI_TIMESTAMP": 15000, + }, + "Cancun": { + "HIVE_FORK_HOMESTEAD": 0, + "HIVE_FORK_TANGERINE": 0, + "HIVE_FORK_SPURIOUS": 0, + "HIVE_FORK_BYZANTIUM": 0, + "HIVE_FORK_CONSTANTINOPLE": 0, + "HIVE_FORK_PETERSBURG": 0, + "HIVE_FORK_ISTANBUL": 0, + "HIVE_FORK_BERLIN": 0, + "HIVE_FORK_LONDON": 0, + "HIVE_FORK_MERGE": 0, + "HIVE_TERMINAL_TOTAL_DIFFICULTY": 0, + "HIVE_SHANGHAI_TIMESTAMP": 0, + "HIVE_CANCUN_TIMESTAMP": 0, + }, + "ShanghaiToCancunAtTime15k": { + "HIVE_FORK_HOMESTEAD": 0, + "HIVE_FORK_TANGERINE": 0, + "HIVE_FORK_SPURIOUS": 0, + "HIVE_FORK_BYZANTIUM": 0, + "HIVE_FORK_CONSTANTINOPLE": 0, + "HIVE_FORK_PETERSBURG": 0, + "HIVE_FORK_ISTANBUL": 0, + "HIVE_FORK_BERLIN": 0, + "HIVE_FORK_LONDON": 0, + "HIVE_FORK_MERGE": 0, + "HIVE_TERMINAL_TOTAL_DIFFICULTY": 0, + "HIVE_SHANGHAI_TIMESTAMP": 0, + "HIVE_CANCUN_TIMESTAMP": 15000, + }, +} \ No newline at end of file diff --git a/simulators/ethereum/consensus/main.go b/simulators/ethereum/consensus/main.go index d08cd79b26..ba854dde64 100644 --- a/simulators/ethereum/consensus/main.go +++ b/simulators/ethereum/consensus/main.go @@ -19,314 +19,6 @@ import ( "github.com/ethereum/hive/hivesim" ) -type envvars map[string]int - -var ruleset = map[string]envvars{ - "Frontier": { - "HIVE_FORK_HOMESTEAD": 2000, - "HIVE_FORK_DAO_BLOCK": 2000, - "HIVE_FORK_TANGERINE": 2000, - "HIVE_FORK_SPURIOUS": 2000, - "HIVE_FORK_BYZANTIUM": 2000, - "HIVE_FORK_CONSTANTINOPLE": 2000, - "HIVE_FORK_PETERSBURG": 2000, - "HIVE_FORK_ISTANBUL": 2000, - "HIVE_FORK_BERLIN": 2000, - "HIVE_FORK_LONDON": 2000, - }, - "Homestead": { - "HIVE_FORK_HOMESTEAD": 0, - "HIVE_FORK_DAO_BLOCK": 2000, - "HIVE_FORK_TANGERINE": 2000, - "HIVE_FORK_SPURIOUS": 2000, - "HIVE_FORK_BYZANTIUM": 2000, - "HIVE_FORK_CONSTANTINOPLE": 2000, - "HIVE_FORK_PETERSBURG": 2000, - "HIVE_FORK_ISTANBUL": 2000, - "HIVE_FORK_BERLIN": 2000, - "HIVE_FORK_LONDON": 2000, - }, - "EIP150": { - "HIVE_FORK_HOMESTEAD": 0, - "HIVE_FORK_TANGERINE": 0, - "HIVE_FORK_SPURIOUS": 2000, - "HIVE_FORK_BYZANTIUM": 2000, - "HIVE_FORK_CONSTANTINOPLE": 2000, - "HIVE_FORK_PETERSBURG": 2000, - "HIVE_FORK_ISTANBUL": 2000, - "HIVE_FORK_BERLIN": 2000, - "HIVE_FORK_LONDON": 2000, - }, - "EIP158": { - "HIVE_FORK_HOMESTEAD": 0, - "HIVE_FORK_TANGERINE": 0, - "HIVE_FORK_SPURIOUS": 0, - "HIVE_FORK_BYZANTIUM": 2000, - "HIVE_FORK_CONSTANTINOPLE": 2000, - "HIVE_FORK_PETERSBURG": 2000, - "HIVE_FORK_ISTANBUL": 2000, - "HIVE_FORK_BERLIN": 2000, - "HIVE_FORK_LONDON": 2000, - }, - "Byzantium": { - "HIVE_FORK_HOMESTEAD": 0, - "HIVE_FORK_TANGERINE": 0, - "HIVE_FORK_SPURIOUS": 0, - "HIVE_FORK_BYZANTIUM": 0, - "HIVE_FORK_CONSTANTINOPLE": 2000, - "HIVE_FORK_PETERSBURG": 2000, - "HIVE_FORK_ISTANBUL": 2000, - "HIVE_FORK_BERLIN": 2000, - "HIVE_FORK_LONDON": 2000, - }, - "Constantinople": { - "HIVE_FORK_HOMESTEAD": 0, - "HIVE_FORK_TANGERINE": 0, - "HIVE_FORK_SPURIOUS": 0, - "HIVE_FORK_BYZANTIUM": 0, - "HIVE_FORK_CONSTANTINOPLE": 0, - "HIVE_FORK_PETERSBURG": 2000, - "HIVE_FORK_ISTANBUL": 2000, - "HIVE_FORK_BERLIN": 2000, - "HIVE_FORK_LONDON": 2000, - }, - "ConstantinopleFix": { - "HIVE_FORK_HOMESTEAD": 0, - "HIVE_FORK_TANGERINE": 0, - "HIVE_FORK_SPURIOUS": 0, - "HIVE_FORK_BYZANTIUM": 0, - "HIVE_FORK_CONSTANTINOPLE": 0, - "HIVE_FORK_PETERSBURG": 0, - "HIVE_FORK_ISTANBUL": 2000, - "HIVE_FORK_BERLIN": 2000, - "HIVE_FORK_LONDON": 2000, - }, - "Istanbul": { - "HIVE_FORK_HOMESTEAD": 0, - "HIVE_FORK_TANGERINE": 0, - "HIVE_FORK_SPURIOUS": 0, - "HIVE_FORK_BYZANTIUM": 0, - "HIVE_FORK_CONSTANTINOPLE": 0, - "HIVE_FORK_PETERSBURG": 0, - "HIVE_FORK_ISTANBUL": 0, - "HIVE_FORK_BERLIN": 2000, - "HIVE_FORK_LONDON": 2000, - }, - "Berlin": { - "HIVE_FORK_HOMESTEAD": 0, - "HIVE_FORK_TANGERINE": 0, - "HIVE_FORK_SPURIOUS": 0, - "HIVE_FORK_BYZANTIUM": 0, - "HIVE_FORK_CONSTANTINOPLE": 0, - "HIVE_FORK_PETERSBURG": 0, - "HIVE_FORK_ISTANBUL": 0, - "HIVE_FORK_BERLIN": 0, - "HIVE_FORK_LONDON": 2000, - }, - "FrontierToHomesteadAt5": { - "HIVE_FORK_HOMESTEAD": 5, - "HIVE_FORK_DAO_BLOCK": 2000, - "HIVE_FORK_TANGERINE": 2000, - "HIVE_FORK_SPURIOUS": 2000, - "HIVE_FORK_BYZANTIUM": 2000, - "HIVE_FORK_CONSTANTINOPLE": 2000, - "HIVE_FORK_PETERSBURG": 2000, - "HIVE_FORK_ISTANBUL": 2000, - "HIVE_FORK_BERLIN": 2000, - "HIVE_FORK_LONDON": 2000, - }, - "HomesteadToEIP150At5": { - "HIVE_FORK_HOMESTEAD": 0, - // "HIVE_FORK_DAO_BLOCK": 2000, - "HIVE_FORK_TANGERINE": 5, - "HIVE_FORK_SPURIOUS": 2000, - "HIVE_FORK_BYZANTIUM": 2000, - "HIVE_FORK_CONSTANTINOPLE": 2000, - "HIVE_FORK_PETERSBURG": 2000, - "HIVE_FORK_ISTANBUL": 2000, - "HIVE_FORK_BERLIN": 2000, - "HIVE_FORK_LONDON": 2000, - }, - "HomesteadToDaoAt5": { - "HIVE_FORK_HOMESTEAD": 0, - "HIVE_FORK_DAO_BLOCK": 5, - "HIVE_FORK_TANGERINE": 2000, - "HIVE_FORK_SPURIOUS": 2000, - "HIVE_FORK_BYZANTIUM": 2000, - "HIVE_FORK_CONSTANTINOPLE": 2000, - "HIVE_FORK_PETERSBURG": 2000, - "HIVE_FORK_ISTANBUL": 2000, - "HIVE_FORK_BERLIN": 2000, - "HIVE_FORK_LONDON": 2000, - }, - "EIP158ToByzantiumAt5": { - "HIVE_FORK_HOMESTEAD": 0, - //"HIVE_FORK_DAO_BLOCK": 2000, - "HIVE_FORK_TANGERINE": 0, - "HIVE_FORK_SPURIOUS": 0, - "HIVE_FORK_BYZANTIUM": 5, - "HIVE_FORK_CONSTANTINOPLE": 2000, - "HIVE_FORK_PETERSBURG": 2000, - "HIVE_FORK_ISTANBUL": 2000, - "HIVE_FORK_BERLIN": 2000, - "HIVE_FORK_LONDON": 2000, - }, - "ByzantiumToConstantinopleAt5": { - "HIVE_FORK_HOMESTEAD": 0, - //"HIVE_FORK_DAO_BLOCK": 2000, - "HIVE_FORK_TANGERINE": 0, - "HIVE_FORK_SPURIOUS": 0, - "HIVE_FORK_BYZANTIUM": 0, - "HIVE_FORK_CONSTANTINOPLE": 5, - "HIVE_FORK_PETERSBURG": 2000, - "HIVE_FORK_ISTANBUL": 2000, - "HIVE_FORK_BERLIN": 2000, - "HIVE_FORK_LONDON": 2000, - }, - "ByzantiumToConstantinopleFixAt5": { - "HIVE_FORK_HOMESTEAD": 0, - //"HIVE_FORK_DAO_BLOCK": 2000, - "HIVE_FORK_TANGERINE": 0, - "HIVE_FORK_SPURIOUS": 0, - "HIVE_FORK_BYZANTIUM": 0, - "HIVE_FORK_CONSTANTINOPLE": 5, - "HIVE_FORK_PETERSBURG": 5, - "HIVE_FORK_ISTANBUL": 2000, - "HIVE_FORK_BERLIN": 2000, - "HIVE_FORK_LONDON": 2000, - }, - "ConstantinopleFixToIstanbulAt5": { - "HIVE_FORK_HOMESTEAD": 0, - //"HIVE_FORK_DAO_BLOCK": 2000, - "HIVE_FORK_TANGERINE": 0, - "HIVE_FORK_SPURIOUS": 0, - "HIVE_FORK_BYZANTIUM": 0, - "HIVE_FORK_CONSTANTINOPLE": 0, - "HIVE_FORK_PETERSBURG": 0, - "HIVE_FORK_ISTANBUL": 5, - "HIVE_FORK_BERLIN": 2000, - "HIVE_FORK_LONDON": 2000, - }, - "IstanbulToBerlinAt5": { - "HIVE_FORK_HOMESTEAD": 0, - //"HIVE_FORK_DAO_BLOCK": 2000, - "HIVE_FORK_TANGERINE": 0, - "HIVE_FORK_SPURIOUS": 0, - "HIVE_FORK_BYZANTIUM": 0, - "HIVE_FORK_CONSTANTINOPLE": 0, - "HIVE_FORK_PETERSBURG": 0, - "HIVE_FORK_ISTANBUL": 0, - "HIVE_FORK_BERLIN": 5, - "HIVE_FORK_LONDON": 2000, - }, - "BerlinToLondonAt5": { - "HIVE_FORK_HOMESTEAD": 0, - //"HIVE_FORK_DAO_BLOCK": 2000, - "HIVE_FORK_TANGERINE": 0, - "HIVE_FORK_SPURIOUS": 0, - "HIVE_FORK_BYZANTIUM": 0, - "HIVE_FORK_CONSTANTINOPLE": 0, - "HIVE_FORK_PETERSBURG": 0, - "HIVE_FORK_ISTANBUL": 0, - "HIVE_FORK_BERLIN": 0, - "HIVE_FORK_LONDON": 5, - }, - "London": { - "HIVE_FORK_HOMESTEAD": 0, - "HIVE_FORK_TANGERINE": 0, - "HIVE_FORK_SPURIOUS": 0, - "HIVE_FORK_BYZANTIUM": 0, - "HIVE_FORK_CONSTANTINOPLE": 0, - "HIVE_FORK_PETERSBURG": 0, - "HIVE_FORK_ISTANBUL": 0, - "HIVE_FORK_BERLIN": 0, - "HIVE_FORK_LONDON": 0, - }, - "ArrowGlacierToMergeAtDiffC0000": { - "HIVE_FORK_HOMESTEAD": 0, - "HIVE_FORK_TANGERINE": 0, - "HIVE_FORK_SPURIOUS": 0, - "HIVE_FORK_BYZANTIUM": 0, - "HIVE_FORK_CONSTANTINOPLE": 0, - "HIVE_FORK_PETERSBURG": 0, - "HIVE_FORK_ISTANBUL": 0, - "HIVE_FORK_BERLIN": 0, - "HIVE_FORK_LONDON": 0, - "HIVE_TERMINAL_TOTAL_DIFFICULTY": 786432, - }, - "Merge": { - "HIVE_FORK_HOMESTEAD": 0, - "HIVE_FORK_TANGERINE": 0, - "HIVE_FORK_SPURIOUS": 0, - "HIVE_FORK_BYZANTIUM": 0, - "HIVE_FORK_CONSTANTINOPLE": 0, - "HIVE_FORK_PETERSBURG": 0, - "HIVE_FORK_ISTANBUL": 0, - "HIVE_FORK_BERLIN": 0, - "HIVE_FORK_LONDON": 0, - "HIVE_FORK_MERGE": 0, - "HIVE_TERMINAL_TOTAL_DIFFICULTY": 0, - }, - "Shanghai": { - "HIVE_FORK_HOMESTEAD": 0, - "HIVE_FORK_TANGERINE": 0, - "HIVE_FORK_SPURIOUS": 0, - "HIVE_FORK_BYZANTIUM": 0, - "HIVE_FORK_CONSTANTINOPLE": 0, - "HIVE_FORK_PETERSBURG": 0, - "HIVE_FORK_ISTANBUL": 0, - "HIVE_FORK_BERLIN": 0, - "HIVE_FORK_LONDON": 0, - "HIVE_FORK_MERGE": 0, - "HIVE_TERMINAL_TOTAL_DIFFICULTY": 0, - "HIVE_SHANGHAI_TIMESTAMP": 0, - }, - "MergeToShanghaiAtTime15k": { - "HIVE_FORK_HOMESTEAD": 0, - "HIVE_FORK_TANGERINE": 0, - "HIVE_FORK_SPURIOUS": 0, - "HIVE_FORK_BYZANTIUM": 0, - "HIVE_FORK_CONSTANTINOPLE": 0, - "HIVE_FORK_PETERSBURG": 0, - "HIVE_FORK_ISTANBUL": 0, - "HIVE_FORK_BERLIN": 0, - "HIVE_FORK_LONDON": 0, - "HIVE_FORK_MERGE": 0, - "HIVE_TERMINAL_TOTAL_DIFFICULTY": 0, - "HIVE_SHANGHAI_TIMESTAMP": 15000, - }, - "Cancun": { - "HIVE_FORK_HOMESTEAD": 0, - "HIVE_FORK_TANGERINE": 0, - "HIVE_FORK_SPURIOUS": 0, - "HIVE_FORK_BYZANTIUM": 0, - "HIVE_FORK_CONSTANTINOPLE": 0, - "HIVE_FORK_PETERSBURG": 0, - "HIVE_FORK_ISTANBUL": 0, - "HIVE_FORK_BERLIN": 0, - "HIVE_FORK_LONDON": 0, - "HIVE_FORK_MERGE": 0, - "HIVE_TERMINAL_TOTAL_DIFFICULTY": 0, - "HIVE_SHANGHAI_TIMESTAMP": 0, - "HIVE_CANCUN_TIMESTAMP": 0, - }, - "ShanghaiToCancunAtTime15k": { - "HIVE_FORK_HOMESTEAD": 0, - "HIVE_FORK_TANGERINE": 0, - "HIVE_FORK_SPURIOUS": 0, - "HIVE_FORK_BYZANTIUM": 0, - "HIVE_FORK_CONSTANTINOPLE": 0, - "HIVE_FORK_PETERSBURG": 0, - "HIVE_FORK_ISTANBUL": 0, - "HIVE_FORK_BERLIN": 0, - "HIVE_FORK_LONDON": 0, - "HIVE_FORK_MERGE": 0, - "HIVE_TERMINAL_TOTAL_DIFFICULTY": 0, - "HIVE_SHANGHAI_TIMESTAMP": 0, - "HIVE_CANCUN_TIMESTAMP": 15000, - }, -} - func main() { suite := hivesim.Suite{ Name: "consensus", @@ -470,7 +162,7 @@ type testcase struct { // validate returns error if the test's chain rules are not supported. func (tc *testcase) validate() error { net := tc.blockTest.json.Network - if _, exist := ruleset[net]; !exist { + if _, exist := envForks[net]; !exist { return fmt.Errorf("network `%v` not defined in ruleset", net) } return nil @@ -539,9 +231,9 @@ func (tc *testcase) run(t *hivesim.T) { // updateEnv sets environment variables from the test func (tc *testcase) updateEnv(env hivesim.Params) { - // Environment variables for rules. - rules := ruleset[tc.blockTest.json.Network] - for k, v := range rules { + // Environment variables for fork rules + forks := envForks[tc.blockTest.json.Network] + for k, v := range forks { env[k] = fmt.Sprintf("%d", v) } // Possibly disable POW. From 5511aef04fa67977a84d7b842b8ca7442d2eeb38 Mon Sep 17 00:00:00 2001 From: Kolby Moroz Liebl <31669092+KolbyML@users.noreply.github.com> Date: Wed, 14 Feb 2024 05:46:59 -0700 Subject: [PATCH 185/387] simulators/portal/history: trin_bridge suite remove redundant extra client (#998) --- .../portal/history/src/suites/trin_bridge.rs | 36 ++++++------------- 1 file changed, 10 insertions(+), 26 deletions(-) diff --git a/simulators/portal/history/src/suites/trin_bridge.rs b/simulators/portal/history/src/suites/trin_bridge.rs index 9bbc991d17..f630164e29 100644 --- a/simulators/portal/history/src/suites/trin_bridge.rs +++ b/simulators/portal/history/src/suites/trin_bridge.rs @@ -8,7 +8,6 @@ use ethportal_api::PossibleHistoryContentValue; use ethportal_api::{Discv5ApiClient, HistoryNetworkApiClient}; use hivesim::types::ClientDefinition; use hivesim::{dyn_async, Client, NClientTestSpec, Test}; -use itertools::Itertools; use portal_spec_test_utils_rs::get_flair; use serde_yaml::Value; use std::collections::HashMap; @@ -54,16 +53,16 @@ dyn_async! { let clients: Vec = clients.into_iter().filter(|client| client.name != *TRIN_BRIDGE_CLIENT_TYPE).collect(); // Iterate over all possible pairings of clients and run the tests (including self-pairings) - for (client_a, client_b) in clients.iter().cartesian_product(clients.iter()) { + for client in &clients { test.run( NClientTestSpec { - name: format!("Bridge test. A:{} --> B:{}", client_a.name, client_b.name), + name: format!("Bridge test. A:Trin Bridge --> B:{}", client.name), description: "".to_string(), always_run: false, run: test_bridge, environments: None, test_data: None, - clients: vec![client_a.clone(), client_b.clone()], + clients: vec![client.clone()], } ).await; } @@ -72,35 +71,20 @@ dyn_async! { dyn_async! { async fn test_bridge<'a>(clients: Vec, _: Option>) { - let (client_a, client_b) = match clients.iter().collect_tuple() { - Some((client_a, client_b)) => (client_a, client_b), + let client = match clients.into_iter().next() { + Some((client)) => client, None => { panic!("Unable to get expected amount of clients from NClientTestSpec"); } }; - let client_b_enr = match client_b.rpc.node_info().await { + let client_enr = match client.rpc.node_info().await { Ok(node_info) => node_info.enr, Err(err) => { panic!("Error getting node info: {err:?}"); } }; - match HistoryNetworkApiClient::add_enr(&client_a.rpc, client_b_enr.clone()).await { - Ok(response) => if !response { - panic!("AddEnr expected to get true and instead got false") - }, - Err(err) => panic!("{}", &err.to_string()), - } - - let client_a_enr = match client_a.rpc.node_info().await { - Ok(node_info) => node_info.enr, - Err(err) => { - panic!("Error getting node info: {err:?}"); - } - }; - client_a.test.start_client(TRIN_BRIDGE_CLIENT_TYPE.to_string(), Some(HashMap::from([(BOOTNODES_ENVIRONMENT_VARIABLE.to_string(), client_a_enr.to_base64()), (HIVE_CHECK_LIVE_PORT.to_string(), 0.to_string())]))).await; - - + client.test.start_client(TRIN_BRIDGE_CLIENT_TYPE.to_string(), Some(HashMap::from([(BOOTNODES_ENVIRONMENT_VARIABLE.to_string(), client_enr.to_base64()), (HIVE_CHECK_LIVE_PORT.to_string(), 0.to_string())]))).await; // With default node settings nodes should be storing all content let values = std::fs::read_to_string(TEST_DATA_FILE_PATH) @@ -116,11 +100,11 @@ dyn_async! { let comments = process_content(content_vec.clone()); // wait content_vec.len() seconds for data to propagate, giving more time if more items are propagating - tokio::time::sleep(Duration::from_secs(content_vec.len() as u64)).await; + tokio::time::sleep(Duration::from_secs(content_vec.len() as u64) * 2).await; let mut result = vec![]; for (index, (content_key, content_value)) in content_vec.into_iter().enumerate() { - match client_b.rpc.local_content(content_key.clone()).await { + match client.rpc.local_content(content_key.clone()).await { Ok(possible_content) => { match possible_content { PossibleHistoryContentValue::ContentPresent(content) => { @@ -140,7 +124,7 @@ dyn_async! { } if !result.is_empty() { - panic!("Client B: {:?}", result); + panic!("Client: {:?}", result); } } } From b74962e6e2ce66c5c1febddaddf424a7db76ae4f Mon Sep 17 00:00:00 2001 From: Somnath Date: Thu, 15 Feb 2024 00:36:56 +0400 Subject: [PATCH 186/387] clients/erigon: Increase blobpool limit in Erigon (#1000) --- clients/erigon/erigon.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clients/erigon/erigon.sh b/clients/erigon/erigon.sh index 4877802b67..47812d07b5 100644 --- a/clients/erigon/erigon.sh +++ b/clients/erigon/erigon.sh @@ -131,7 +131,7 @@ FLAGS="$FLAGS --http --http.addr=0.0.0.0 --http.api=admin,debug,eth,net,txpool,w FLAGS="$FLAGS --ws --ws.port=8546" # Increase blob slots for tests -FLAGS="$FLAGS --txpool.blobslots=1000" +FLAGS="$FLAGS --txpool.blobslots=1000 --txpool.totalblobpoollimit=10000" if [ "$HIVE_TERMINAL_TOTAL_DIFFICULTY" != "" ]; then JWT_SECRET="0x7365637265747365637265747365637265747365637265747365637265747365" From 2e26029e76cfd301b714a87e85a2810694487168 Mon Sep 17 00:00:00 2001 From: Mario Vega Date: Thu, 15 Feb 2024 14:16:33 -0600 Subject: [PATCH 187/387] simulators/ethereum/pyspec: Refactor, add sync payload verification (#995) * simulators/ethereum/pyspec: Refactor, add sync payload verification * simulators/ethereum/pyspec: Declare sync timeout constant * simulators/ethereum/pyspec: Disable timing print --- simulators/ethereum/pyspec/main.go | 14 +- simulators/ethereum/pyspec/runner.go | 269 +++++++++------------------ simulators/ethereum/pyspec/types.go | 225 +++++++++++++++++++--- 3 files changed, 298 insertions(+), 210 deletions(-) diff --git a/simulators/ethereum/pyspec/main.go b/simulators/ethereum/pyspec/main.go index e725efb987..72924f4e9c 100644 --- a/simulators/ethereum/pyspec/main.go +++ b/simulators/ethereum/pyspec/main.go @@ -68,21 +68,21 @@ func fixtureRunner(t *hivesim.T) { // spawn `parallelism` workers to run fixtures against clients var wg sync.WaitGroup - var testCh = make(chan *testcase) + var testCh = make(chan *TestCase) wg.Add(parallelism) for i := 0; i < parallelism; i++ { go func() { defer wg.Done() for test := range testCh { t.Run(hivesim.TestSpec{ - Name: test.name, + Name: test.Name, Description: ("Test Link: " + - repoLink(test.filepath)), + repoLink(test.FilePath)), Run: test.run, AlwaysRun: false, }) - if test.failedErr != nil { - failedTests[test.clientType+"/"+test.name] = test.failedErr + if test.FailedErr != nil { + failedTests[test.ClientType+"/"+test.Name] = test.FailedErr } } }() @@ -92,13 +92,13 @@ func fixtureRunner(t *hivesim.T) { re := regexp.MustCompile(testPattern) // deliver and run test cases against each client - loadFixtureTests(t, fileRoot, re, func(tc testcase) { + loadFixtureTests(t, fileRoot, re, func(tc TestCase) { for _, client := range clientTypes { if !client.HasRole("eth1") { continue } tc := tc // shallow copy - tc.clientType = client.Name + tc.ClientType = client.Name testCh <- &tc } }) diff --git a/simulators/ethereum/pyspec/runner.go b/simulators/ethereum/pyspec/runner.go index 6781b968ca..41e2946e63 100644 --- a/simulators/ethereum/pyspec/runner.go +++ b/simulators/ethereum/pyspec/runner.go @@ -2,7 +2,6 @@ package main import ( "context" - "errors" "fmt" "io/fs" "math/big" @@ -11,21 +10,19 @@ import ( "strings" "time" - api "github.com/ethereum/go-ethereum/beacon/engine" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core" - "github.com/ethereum/go-ethereum/rpc" - "github.com/ethereum/go-ethereum/tests" "github.com/ethereum/hive/hivesim" "github.com/ethereum/hive/simulators/ethereum/engine/client/hive_rpc" "github.com/ethereum/hive/simulators/ethereum/engine/globals" +) - typ "github.com/ethereum/hive/simulators/ethereum/engine/types" +var ( + SyncTimeout = 10 * time.Second ) // loadFixtureTests extracts tests from fixture.json files in a given directory, // creates a testcase for each test, and passes the testcase struct to fn. -func loadFixtureTests(t *hivesim.T, root string, re *regexp.Regexp, fn func(testcase)) { +func loadFixtureTests(t *hivesim.T, root string, re *regexp.Regexp, fn func(TestCase)) { filepath.WalkDir(root, func(path string, d fs.DirEntry, err error) error { // check file is actually a fixture if err != nil { @@ -40,8 +37,8 @@ func loadFixtureTests(t *hivesim.T, root string, re *regexp.Regexp, fn func(test return nil } - // extract fixture.json tests (multiple forks) into fixtureTest structs - var fixtureTests map[string]fixtureTest + // extract fixture.json tests (multiple forks) into fixture structs + var fixtureTests map[string]*Fixture if err := common.LoadJSON(path, &fixtureTests); err != nil { t.Logf("invalid test file: %v, unable to load json", err) return nil @@ -50,25 +47,20 @@ func loadFixtureTests(t *hivesim.T, root string, re *regexp.Regexp, fn func(test // create testcase structure from fixtureTests for name, fixture := range fixtureTests { // skip networks post merge or not supported - network := fixture.json.Fork + network := fixture.Fork if _, exist := envForks[network]; !exist { continue } // define testcase (tc) struct with initial fields - tc := testcase{ - fixture: fixture, - name: path[10:len(path)-5] + "/" + name, - filepath: path, + tc := TestCase{ + Name: path[10:len(path)-5] + "/" + name, + FilePath: path, + Fixture: fixture, } // match test case name against regex if provided - if !re.MatchString(tc.name) { + if !re.MatchString(tc.Name) { continue } - // extract genesis, payloads & post allocation field to tc - if err := tc.extractFixtureFields(fixture.json); err != nil { - t.Logf("test %v / %v: unable to extract fixture fields: %v", d.Name(), name, err) - tc.failedErr = fmt.Errorf("unable to extract fixture fields: %v", err) - } // feed tc to single worker within fixtureRunner() fn(tc) } @@ -80,12 +72,13 @@ func loadFixtureTests(t *hivesim.T, root string, re *regexp.Regexp, fn func(test // fixtureRunner, all testcase payloads are sent and executed using the EngineAPI. for // verification all fixture nonce, balance and storage values are checked against the // response received from the lastest block. -func (tc *testcase) run(t *hivesim.T) { +func (tc *TestCase) run(t *hivesim.T) { start := time.Now() + tc.FailCallback = t t.Log("setting variables required for starting client.") engineStarter := hive_rpc.HiveRPCEngineStarter{ - ClientType: tc.clientType, + ClientType: tc.ClientType, EnginePort: globals.EnginePortHTTP, EthPort: globals.EthPortHTTP, JWTSecret: globals.DefaultJwtTokenSecretBytes, @@ -99,123 +92,110 @@ func (tc *testcase) run(t *hivesim.T) { tc.updateEnv(env) t0 := time.Now() // If test is already failed, don't bother spinning up a client - if tc.failedErr != nil { - t.Errorf("test failed early: %v", tc.failedErr) - return + if tc.FailedErr != nil { + t.Fatalf("test failed early: %v", tc.FailedErr) } // start client (also creates an engine RPC client internally) t.Log("starting client with Engine API.") - engineClient, err := engineStarter.StartClient(t, ctx, tc.genesis, env, nil) + engineClient, err := engineStarter.StartClient(t, ctx, tc.Genesis(), env, nil) if err != nil { - tc.failedErr = err - t.Fatalf("can't start client with Engine API: %v", err) + tc.Fatalf("can't start client with Engine API: %v", err) } // verify genesis hash matches that of the fixture genesisBlock, err := engineClient.BlockByNumber(ctx, big.NewInt(0)) if err != nil { - tc.failedErr = err - t.Fatalf("unable to get genesis block: %v", err) + tc.Fatalf("unable to get genesis block: %v", err) } - if genesisBlock.Hash() != tc.fixture.json.Genesis.Hash { - tc.failedErr = errors.New("genesis hash mismatch") - t.Fatalf("genesis hash mismatch") + if genesisBlock.Hash() != tc.GenesisBlock.Hash { + tc.Fatalf("genesis hash mismatch") } t1 := time.Now() // send payloads and check response - latestValidHash := common.Hash{} - for _, engineNewPayload := range tc.engineNewPayloads { - plStatus, plErr := engineClient.NewPayload( - context.Background(), - int(engineNewPayload.Version), - engineNewPayload.HiveExecutionPayload, - ) - // check for rpc errors and compare error codes - errCode := int(engineNewPayload.ErrorCode) - if errCode != 0 { - checkRPCErrors(plErr, errCode, t, tc) - continue - } - // set expected payload return status - expectedStatus := "VALID" - if engineNewPayload.ValidationError != nil { - expectedStatus = "INVALID" - } - // check payload status matches expected - if plStatus.Status != expectedStatus { - tc.failedErr = fmt.Errorf("payload status mismatch: client returned %v and fixture expected %v", plStatus.Status, expectedStatus) - t.Fatalf("payload status mismatch: client returned %v fixture expected %v", plStatus.Status, expectedStatus) + var latestValidPayload *EngineNewPayload + for _, engineNewPayload := range tc.EngineNewPayloads { + engineNewPayload := engineNewPayload + if syncing, err := engineNewPayload.ExecuteValidate( + ctx, + engineClient, + ); err != nil { + tc.Fatalf("Payload validation error: %v", err) + } else if syncing { + tc.Fatalf("Payload validation failed (not synced)") } // update latest valid block hash if payload status is VALID - if plStatus.Status == "VALID" { - latestValidHash = *plStatus.LatestValidHash + if engineNewPayload.Valid() { + latestValidPayload = engineNewPayload } } t2 := time.Now() // only update head of beacon chain if valid response occurred - if latestValidHash != (common.Hash{}) { - // update with latest valid response - fcState := &api.ForkchoiceStateV1{HeadBlockHash: latestValidHash} - if _, fcErr := engineClient.ForkchoiceUpdated(ctx, int(tc.fixture.json.EngineFcuVersion), fcState, nil); fcErr != nil { - tc.failedErr = fcErr - t.Fatalf("unable to update head of beacon chain in test %s: %v ", tc.name, fcErr) + if latestValidPayload != nil { + if syncing, err := latestValidPayload.ForkchoiceValidate(ctx, engineClient, tc.EngineFcuVersion); err != nil { + tc.Fatalf("unable to update head of chain: %v", err) + } else if syncing { + tc.Fatalf("forkchoice update failed (not synced)") } } t3 := time.Now() - - // check nonce, balance & storage of accounts in final block against fixture values - for account, genesisAccount := range *tc.postAlloc { - // get nonce & balance from last block (end of test execution) - gotNonce, errN := engineClient.NonceAt(ctx, account, nil) - gotBalance, errB := engineClient.BalanceAt(ctx, account, nil) - if errN != nil { - tc.failedErr = errN - t.Errorf("unable to call nonce from account: %v, in test %s: %v", account, tc.name, errN) - } else if errB != nil { - tc.failedErr = errB - t.Errorf("unable to call balance from account: %v, in test %s: %v", account, tc.name, errB) - } - // check final nonce & balance matches expected in fixture - if genesisAccount.Nonce != gotNonce { - tc.failedErr = errors.New("nonce received doesn't match expected from fixture") - t.Errorf(`nonce received from account %v doesn't match expected from fixture in test %s: - received from block: %v - expected in fixture: %v`, account, tc.name, gotNonce, genesisAccount.Nonce) - } - if genesisAccount.Balance.Cmp(gotBalance) != 0 { - tc.failedErr = errors.New("balance received doesn't match expected from fixture") - t.Errorf(`balance received from account %v doesn't match expected from fixture in test %s: - received from block: %v - expected in fixture: %v`, account, tc.name, gotBalance, genesisAccount.Balance) - } - // check final storage - if len(genesisAccount.Storage) > 0 { - // extract fixture storage keys - keys := make([]common.Hash, 0, len(genesisAccount.Storage)) - for key := range genesisAccount.Storage { - keys = append(keys, key) - } - // get storage values for account with keys: keys - gotStorage, errS := engineClient.StorageAtKeys(ctx, account, keys, nil) - if errS != nil { - tc.failedErr = errS - t.Errorf("unable to get storage values from account: %v, in test %s: %v", account, tc.name, errS) + if err := tc.ValidatePost(ctx, engineClient); err != nil { + tc.Fatalf("unable to verify post allocation in test %s: %v", tc.Name, err) + } + + if tc.SyncPayload != nil { + // First send a new payload to the already running client + if syncing, err := tc.SyncPayload.ExecuteValidate( + ctx, + engineClient, + ); err != nil { + tc.Fatalf("unable to send sync payload: %v", err) + } else if syncing { + tc.Fatalf("sync payload failed (not synced)") + } + // Send a forkchoice update to the already running client to head to the sync payload + if syncing, err := tc.SyncPayload.ForkchoiceValidate(ctx, engineClient, tc.EngineFcuVersion); err != nil { + tc.Fatalf("unable to update head of chain: %v", err) + } else if syncing { + tc.Fatalf("forkchoice update failed (not synced)") + } + + // Spawn a second client connected to the already running client, + // send the forkchoice updated with the head hash and wait for sync. + // Then verify the post allocation. + // Add a timeout too. + secondEngineClient, err := engineStarter.StartClient(t, ctx, tc.Genesis(), env, nil, engineClient) + if err != nil { + tc.Fatalf("can't start client with Engine API: %v", err) + } + + if _, err := tc.SyncPayload.ExecuteValidate( + ctx, + secondEngineClient, + ); err != nil { + tc.Fatalf("unable to send sync payload: %v", err) + } // Don't check syncing here because some clients do sync immediately + + timeoutCtx, cancel := context.WithTimeout(ctx, SyncTimeout) + defer cancel() + for { + if syncing, err := tc.SyncPayload.ForkchoiceValidate(ctx, secondEngineClient, tc.EngineFcuVersion); err != nil { + tc.Fatalf("unable to update head of chain: %v", err) + } else if !syncing { + break } - // check values in storage match with fixture - for _, key := range keys { - if genesisAccount.Storage[key] != *gotStorage[key] { - tc.failedErr = errors.New("storage received doesn't match expected from fixture") - t.Errorf(`storage received from account %v doesn't match expected from fixture in test %s: from storage address: %v - received from block: %v - expected in fixture: %v`, account, tc.name, key, gotStorage[key], genesisAccount.Storage[key]) - } + select { + case <-timeoutCtx.Done(): + tc.Fatalf("timeout waiting for sync of secondary client") + default: } + time.Sleep(time.Second) } } + end := time.Now() - if tc.failedErr == nil { + if false { // TODO: Activate only on --sim.loglevel > 3 t.Logf(`test timing: setupClientEnv %v startClient %v @@ -229,74 +209,9 @@ func (tc *testcase) run(t *hivesim.T) { // updateEnv updates the environment variables against the fork rules // defined in envForks, for the network specified in the testcase fixture. -func (tc *testcase) updateEnv(env hivesim.Params) { - forkRules := envForks[tc.fixture.json.Fork] +func (tc *TestCase) updateEnv(env hivesim.Params) { + forkRules := envForks[tc.Fork] for k, v := range forkRules { env[k] = fmt.Sprintf("%d", v) } } - -// extractFixtureFields extracts the genesis, post allocation and payload -// fields from the given fixture test and stores them in the testcase struct. -func (tc *testcase) extractFixtureFields(fixture fixtureJSON) (err error) { - if tc.genesis, err = extractGenesis(fixture); err != nil { - return fmt.Errorf("failed to extract genesis: %w", err) - } - if tc.engineNewPayloads, err = extractEngineNewPayloads(fixture); err != nil { - return fmt.Errorf("failed to extract engineNewPayloads: %w", err) - } - tc.postAlloc = &fixture.Post - return nil -} - -// extracts the genesis block information from the given fixture. -func extractGenesis(fixture fixtureJSON) (*core.Genesis, error) { - genesis := &core.Genesis{ - Config: tests.Forks[fixture.Fork], - Coinbase: fixture.Genesis.Coinbase, - Difficulty: fixture.Genesis.Difficulty, - GasLimit: fixture.Genesis.GasLimit, - Timestamp: fixture.Genesis.Timestamp.Uint64(), - ExtraData: fixture.Genesis.ExtraData, - Mixhash: fixture.Genesis.MixHash, - Nonce: fixture.Genesis.Nonce.Uint64(), - BaseFee: fixture.Genesis.BaseFee, - BlobGasUsed: fixture.Genesis.BlobGasUsed, - ExcessBlobGas: fixture.Genesis.ExcessBlobGas, - Alloc: fixture.Pre, - } - return genesis, nil -} - -// extracts all the engineNewPayload information from the given fixture. -func extractEngineNewPayloads(fixture fixtureJSON) ([]engineNewPayload, error) { - var engineNewPayloads []engineNewPayload - for _, engineNewPayload := range fixture.EngineNewPayloads { - engineNewPayload := engineNewPayload - hiveExecutionPayload, err := typ.FromBeaconExecutableData(engineNewPayload.ExecutionPayload) - if err != nil { - return nil, errors.New("executionPayload param within engineNewPayload is invalid") - } - hiveExecutionPayload.VersionedHashes = &engineNewPayload.BlobVersionedHashes - hiveExecutionPayload.ParentBeaconBlockRoot = engineNewPayload.ParentBeaconBlockRoot - engineNewPayload.HiveExecutionPayload = &hiveExecutionPayload - engineNewPayloads = append(engineNewPayloads, engineNewPayload) - } - return engineNewPayloads, nil -} - -// checks for RPC errors and compares error codes if expected. -func checkRPCErrors(plErr error, fxErrCode int, t *hivesim.T, tc *testcase) { - rpcErr, isRpcErr := plErr.(rpc.Error) - if isRpcErr { - plErrCode := rpcErr.ErrorCode() - if plErrCode != fxErrCode { - tc.failedErr = fmt.Errorf("error code mismatch: client returned %v and fixture expected %v", plErrCode, fxErrCode) - t.Fatalf("error code mismatch\n client returned: %v\n fixture expected: %v\n in test %s", plErrCode, fxErrCode, tc.name) - } - t.Logf("expected error code caught by client: %v", plErrCode) - } else { - tc.failedErr = fmt.Errorf("fixture expected rpc error code: %v but none was returned from client", fxErrCode) - t.Fatalf("fixture expected rpc error code: %v but none was returned from client in test %s", fxErrCode, tc.name) - } -} diff --git a/simulators/ethereum/pyspec/types.go b/simulators/ethereum/pyspec/types.go index 7300df297d..1d763499c9 100644 --- a/simulators/ethereum/pyspec/types.go +++ b/simulators/ethereum/pyspec/types.go @@ -1,7 +1,9 @@ package main import ( - "encoding/json" + "context" + "errors" + "fmt" "math/big" api "github.com/ethereum/go-ethereum/beacon/engine" @@ -10,41 +12,105 @@ import ( "github.com/ethereum/go-ethereum/common/math" "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/rpc" + "github.com/ethereum/go-ethereum/tests" + "github.com/ethereum/hive/simulators/ethereum/engine/client" typ "github.com/ethereum/hive/simulators/ethereum/engine/types" ) -type testcase struct { +type Fail interface { + Fatalf(format string, args ...interface{}) +} + +type TestCase struct { // test meta data - name string - filepath string - clientType string - failedErr error + Name string + FilePath string + ClientType string + FailedErr error // test fixture data - fixture fixtureTest - genesis *core.Genesis - postAlloc *core.GenesisAlloc - engineNewPayloads []engineNewPayload + *Fixture + FailCallback Fail +} + +func (tc *TestCase) Fatalf(format string, args ...interface{}) { + tc.FailedErr = fmt.Errorf(format, args...) + tc.FailCallback.Fatalf(format, args...) } -type fixtureTest struct { - json fixtureJSON +type Fixture struct { + Fork string `json:"network"` + GenesisBlock genesisBlock `json:"genesisBlockHeader"` + EngineNewPayloads []*EngineNewPayload `json:"engineNewPayloads"` + EngineFcuVersion int `json:"engineFcuVersion,string"` + Pre core.GenesisAlloc `json:"pre"` + PostAlloc core.GenesisAlloc `json:"postState"` + SyncPayload *EngineNewPayload `json:"syncPayload"` } -func (t *fixtureTest) UnmarshalJSON(in []byte) error { - if err := json.Unmarshal(in, &t.json); err != nil { - return err +func (f *Fixture) Genesis() *core.Genesis { + return &core.Genesis{ + Config: tests.Forks[f.Fork], + Coinbase: f.GenesisBlock.Coinbase, + Difficulty: f.GenesisBlock.Difficulty, + GasLimit: f.GenesisBlock.GasLimit, + Timestamp: f.GenesisBlock.Timestamp.Uint64(), + ExtraData: f.GenesisBlock.ExtraData, + Mixhash: f.GenesisBlock.MixHash, + Nonce: f.GenesisBlock.Nonce.Uint64(), + BaseFee: f.GenesisBlock.BaseFee, + BlobGasUsed: f.GenesisBlock.BlobGasUsed, + ExcessBlobGas: f.GenesisBlock.ExcessBlobGas, + Alloc: f.Pre, } - return nil } -type fixtureJSON struct { - Fork string `json:"network"` - Genesis genesisBlock `json:"genesisBlockHeader"` - EngineNewPayloads []engineNewPayload `json:"engineNewPayloads"` - EngineFcuVersion math.HexOrDecimal64 `json:"engineFcuVersion"` - Pre core.GenesisAlloc `json:"pre"` - Post core.GenesisAlloc `json:"postState"` +func (f *Fixture) ValidatePost(ctx context.Context, engineClient client.EngineClient) error { + // check nonce, balance & storage of accounts in final block against fixture values + for address, account := range f.PostAlloc { + // get nonce & balance from last block (end of test execution) + gotNonce, errN := engineClient.NonceAt(ctx, address, nil) + gotBalance, errB := engineClient.BalanceAt(ctx, address, nil) + if errN != nil { + return fmt.Errorf("unable to call nonce from account: %v: %v", address, errN) + } else if errB != nil { + return fmt.Errorf("unable to call balance from account: %v: %v", address, errB) + } + // check final nonce & balance matches expected in fixture + if account.Nonce != gotNonce { + return fmt.Errorf(`nonce received from account %v doesn't match expected from fixture: + received from block: %v + expected in fixture: %v`, address, gotNonce, account.Nonce) + } + if account.Balance.Cmp(gotBalance) != 0 { + return fmt.Errorf(`balance received from account %v doesn't match expected from fixture: + received from block: %v + expected in fixture: %v`, address, gotBalance, account.Balance) + } + // check final storage + if len(account.Storage) > 0 { + // extract fixture storage keys + keys := make([]common.Hash, 0, len(account.Storage)) + for key := range account.Storage { + keys = append(keys, key) + } + // get storage values for account with keys: keys + gotStorage, errS := engineClient.StorageAtKeys(ctx, address, keys, nil) + if errS != nil { + return fmt.Errorf("unable to get storage values from account: %v: %v", address, errS) + } + // check values in storage match with fixture + for _, key := range keys { + if account.Storage[key] != *gotStorage[key] { + return fmt.Errorf(`storage received from account %v doesn't match expected from fixture: + received from block: %v + expected in fixture: %v`, address, gotStorage[key], account.Storage[key]) + } + } + } + } + return nil } //go:generate go run github.com/fjl/gencodec -type genesisBlock -field-override genesisBlockUnmarshaling -out gen_gb.go @@ -73,13 +139,120 @@ type genesisBlockUnmarshaling struct { ExcessBlobGas *math.HexOrDecimal64 `json:"excessDataGas"` } -type engineNewPayload struct { +type EngineNewPayload struct { ExecutionPayload *api.ExecutableData `json:"executionPayload"` BlobVersionedHashes []common.Hash `json:"expectedBlobVersionedHashes"` ParentBeaconBlockRoot *common.Hash `json:"parentBeaconBlockRoot"` Version math.HexOrDecimal64 `json:"version"` ValidationError *string `json:"validationError"` - ErrorCode int64 `json:"errorCode,string"` + ErrorCode int `json:"errorCode,string"` +} - HiveExecutionPayload *typ.ExecutableData +func (p *EngineNewPayload) ExecutableData() (*typ.ExecutableData, error) { + executableData, err := typ.FromBeaconExecutableData(p.ExecutionPayload) + if err != nil { + return nil, errors.New("executionPayload param within engineNewPayload is invalid") + } + executableData.VersionedHashes = &p.BlobVersionedHashes + executableData.ParentBeaconBlockRoot = p.ParentBeaconBlockRoot + return &executableData, nil +} + +func (p *EngineNewPayload) Valid() bool { + return p.ErrorCode == 0 && p.ValidationError == nil +} + +func (p *EngineNewPayload) ExpectedStatus() string { + if p.ValidationError != nil { + return "INVALID" + } + return "VALID" +} + +func (p *EngineNewPayload) Execute(ctx context.Context, engineClient client.EngineClient) (api.PayloadStatusV1, rpc.Error) { + executableData, err := p.ExecutableData() + if err != nil { + panic(err) + } + status, err := engineClient.NewPayload( + ctx, + int(p.Version), + executableData, + ) + return status, parseError(err) +} + +func (p *EngineNewPayload) ExecuteValidate(ctx context.Context, engineClient client.EngineClient) (bool, error) { + plStatus, plErr := p.Execute(ctx, engineClient) + if err := p.ValidateRPCError(plErr); err != nil { + return false, err + } else if plErr != nil { + // Got an expected error and is already validated in ValidateRPCError + return false, nil + } + if plStatus.Status == "SYNCING" { + return true, nil + } + // Check payload status matches expected + if plStatus.Status != p.ExpectedStatus() { + return false, fmt.Errorf("payload status mismatch: got %s, want %s", plStatus.Status, p.ExpectedStatus()) + } + return false, nil +} + +func (p *EngineNewPayload) ForkchoiceValidate(ctx context.Context, engineClient client.EngineClient, fcuVersion int) (bool, error) { + response, err := engineClient.ForkchoiceUpdated(ctx, fcuVersion, &api.ForkchoiceStateV1{HeadBlockHash: p.ExecutionPayload.BlockHash}, nil) + if err != nil { + return false, err + } + if response.PayloadStatus.Status == "SYNCING" { + return true, nil + } + if response.PayloadStatus.Status != p.ExpectedStatus() { + return false, fmt.Errorf("forkchoice update status mismatch: got %s, want %s", response.PayloadStatus.Status, p.ExpectedStatus()) + } + return false, nil +} + +type HTTPErrorWithCode struct { + rpc.HTTPError +} + +func (e HTTPErrorWithCode) ErrorCode() int { + return e.StatusCode +} + +func parseError(plErr interface{}) rpc.Error { + if plErr == nil { + return nil + } + rpcErr, isRpcErr := plErr.(rpc.Error) + if isRpcErr { + return rpcErr + } + httpErr, isHttpErr := plErr.(rpc.HTTPError) + if isHttpErr { + return HTTPErrorWithCode{httpErr} + } + panic("unable to parse") +} + +// checks for RPC errors and compares error codes if expected. +func (p *EngineNewPayload) ValidateRPCError(rpcErr rpc.Error) error { + if rpcErr == nil && p.ErrorCode == 0 { + return nil + } + if rpcErr == nil && p.ErrorCode != 0 { + return fmt.Errorf("expected error code %d but received no error", p.ErrorCode) + } + if rpcErr != nil && p.ErrorCode == 0 { + return fmt.Errorf("expected no error code but received %d", rpcErr.ErrorCode()) + } + if rpcErr != nil && p.ErrorCode != 0 { + plErrCode := rpcErr.ErrorCode() + if plErrCode != p.ErrorCode { + return fmt.Errorf("error code mismatch: got: %d, want: %d", plErrCode, p.ErrorCode) + } + } + return nil } From 37723c2d8afa35ef2ae5b09299c0022ddc5333aa Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Fri, 16 Feb 2024 10:15:23 +0100 Subject: [PATCH 188/387] simulators/ethereum/consensus: add more 'paris' forks --- simulators/ethereum/consensus/forks.go | 42 +++++++++++++++++++++----- 1 file changed, 34 insertions(+), 8 deletions(-) diff --git a/simulators/ethereum/consensus/forks.go b/simulators/ethereum/consensus/forks.go index fe3a024f9c..ed74c718e3 100644 --- a/simulators/ethereum/consensus/forks.go +++ b/simulators/ethereum/consensus/forks.go @@ -115,7 +115,7 @@ var envForks = map[string]map[string]int{ "HIVE_FORK_LONDON": 2000, }, "HomesteadToEIP150At5": { - "HIVE_FORK_HOMESTEAD": 0, + "HIVE_FORK_HOMESTEAD": 0, "HIVE_FORK_TANGERINE": 5, "HIVE_FORK_SPURIOUS": 2000, "HIVE_FORK_BYZANTIUM": 2000, @@ -138,7 +138,7 @@ var envForks = map[string]map[string]int{ "HIVE_FORK_LONDON": 2000, }, "EIP158ToByzantiumAt5": { - "HIVE_FORK_HOMESTEAD": 0, + "HIVE_FORK_HOMESTEAD": 0, "HIVE_FORK_TANGERINE": 0, "HIVE_FORK_SPURIOUS": 0, "HIVE_FORK_BYZANTIUM": 5, @@ -149,7 +149,7 @@ var envForks = map[string]map[string]int{ "HIVE_FORK_LONDON": 2000, }, "ByzantiumToConstantinopleAt5": { - "HIVE_FORK_HOMESTEAD": 0, + "HIVE_FORK_HOMESTEAD": 0, "HIVE_FORK_TANGERINE": 0, "HIVE_FORK_SPURIOUS": 0, "HIVE_FORK_BYZANTIUM": 0, @@ -160,7 +160,7 @@ var envForks = map[string]map[string]int{ "HIVE_FORK_LONDON": 2000, }, "ByzantiumToConstantinopleFixAt5": { - "HIVE_FORK_HOMESTEAD": 0, + "HIVE_FORK_HOMESTEAD": 0, "HIVE_FORK_TANGERINE": 0, "HIVE_FORK_SPURIOUS": 0, "HIVE_FORK_BYZANTIUM": 0, @@ -171,7 +171,7 @@ var envForks = map[string]map[string]int{ "HIVE_FORK_LONDON": 2000, }, "ConstantinopleFixToIstanbulAt5": { - "HIVE_FORK_HOMESTEAD": 0, + "HIVE_FORK_HOMESTEAD": 0, "HIVE_FORK_TANGERINE": 0, "HIVE_FORK_SPURIOUS": 0, "HIVE_FORK_BYZANTIUM": 0, @@ -182,7 +182,7 @@ var envForks = map[string]map[string]int{ "HIVE_FORK_LONDON": 2000, }, "IstanbulToBerlinAt5": { - "HIVE_FORK_HOMESTEAD": 0, + "HIVE_FORK_HOMESTEAD": 0, "HIVE_FORK_TANGERINE": 0, "HIVE_FORK_SPURIOUS": 0, "HIVE_FORK_BYZANTIUM": 0, @@ -193,7 +193,7 @@ var envForks = map[string]map[string]int{ "HIVE_FORK_LONDON": 2000, }, "BerlinToLondonAt5": { - "HIVE_FORK_HOMESTEAD": 0, + "HIVE_FORK_HOMESTEAD": 0, "HIVE_FORK_TANGERINE": 0, "HIVE_FORK_SPURIOUS": 0, "HIVE_FORK_BYZANTIUM": 0, @@ -226,6 +226,18 @@ var envForks = map[string]map[string]int{ "HIVE_FORK_LONDON": 0, "HIVE_TERMINAL_TOTAL_DIFFICULTY": 786432, }, + "ArrowGlacierToParisAtDiffC0000": { + "HIVE_FORK_HOMESTEAD": 0, + "HIVE_FORK_TANGERINE": 0, + "HIVE_FORK_SPURIOUS": 0, + "HIVE_FORK_BYZANTIUM": 0, + "HIVE_FORK_CONSTANTINOPLE": 0, + "HIVE_FORK_PETERSBURG": 0, + "HIVE_FORK_ISTANBUL": 0, + "HIVE_FORK_BERLIN": 0, + "HIVE_FORK_LONDON": 0, + "HIVE_TERMINAL_TOTAL_DIFFICULTY": 786432, + }, "Merge": { // Remove once Paris replaces Merge "HIVE_FORK_HOMESTEAD": 0, "HIVE_FORK_TANGERINE": 0, @@ -280,6 +292,20 @@ var envForks = map[string]map[string]int{ "HIVE_TERMINAL_TOTAL_DIFFICULTY": 0, "HIVE_SHANGHAI_TIMESTAMP": 15000, }, + "ParisToShanghaiAtTime15k": { + "HIVE_FORK_HOMESTEAD": 0, + "HIVE_FORK_TANGERINE": 0, + "HIVE_FORK_SPURIOUS": 0, + "HIVE_FORK_BYZANTIUM": 0, + "HIVE_FORK_CONSTANTINOPLE": 0, + "HIVE_FORK_PETERSBURG": 0, + "HIVE_FORK_ISTANBUL": 0, + "HIVE_FORK_BERLIN": 0, + "HIVE_FORK_LONDON": 0, + "HIVE_FORK_MERGE": 0, + "HIVE_TERMINAL_TOTAL_DIFFICULTY": 0, + "HIVE_SHANGHAI_TIMESTAMP": 15000, + }, "Cancun": { "HIVE_FORK_HOMESTEAD": 0, "HIVE_FORK_TANGERINE": 0, @@ -310,4 +336,4 @@ var envForks = map[string]map[string]int{ "HIVE_SHANGHAI_TIMESTAMP": 0, "HIVE_CANCUN_TIMESTAMP": 15000, }, -} \ No newline at end of file +} From b56b122d678ecff45ab0a787fc5a938d7a1e46be Mon Sep 17 00:00:00 2001 From: Kolby Moroz Liebl <31669092+KolbyML@users.noreply.github.com> Date: Mon, 26 Feb 2024 06:45:17 -0700 Subject: [PATCH 189/387] simulators/portal/history: fix bug where only headers were tested (#1001) --- simulators/portal/history/src/suites/interop.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/simulators/portal/history/src/suites/interop.rs b/simulators/portal/history/src/suites/interop.rs index 7f2e4a7b96..df6e3ceec7 100644 --- a/simulators/portal/history/src/suites/interop.rs +++ b/simulators/portal/history/src/suites/interop.rs @@ -56,16 +56,16 @@ fn process_content( "Block Body".to_string(), header_with_proof.header.number, vec![ - content_pair_to_string_pair(last_header.clone()), content_pair_to_string_pair(history_content), + content_pair_to_string_pair(last_header.clone()), ], ), HistoryContentKey::BlockReceipts(_) => ( "Block Receipt".to_string(), header_with_proof.header.number, vec![ - content_pair_to_string_pair(last_header.clone()), content_pair_to_string_pair(history_content), + content_pair_to_string_pair(last_header.clone()), ], ), HistoryContentKey::EpochAccumulator(_) => ( From ad0b0eea78de13c016a6d3dfa29ab34f48cc9999 Mon Sep 17 00:00:00 2001 From: joshieDo <93316087+joshieDo@users.noreply.github.com> Date: Tue, 27 Feb 2024 19:46:16 +0000 Subject: [PATCH 190/387] clients/reth: make sure pruner doesn't start on tests (#1002) --- clients/reth/reth.sh | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/clients/reth/reth.sh b/clients/reth/reth.sh index 0468bc96ba..a2b2a5d6a1 100644 --- a/clients/reth/reth.sh +++ b/clients/reth/reth.sh @@ -50,8 +50,9 @@ case "$HIVE_LOGLEVEL" in esac # Create the data directory. -mkdir /reth-hive-datadir -FLAGS="$FLAGS --datadir /reth-hive-datadir" +DATADIR="/reth-hive-datadir" +mkdir $DATADIR +FLAGS="$FLAGS --datadir $DATADIR" # TODO If a specific network ID is requested, use that #if [ "$HIVE_NETWORK_ID" != "" ]; then @@ -80,6 +81,9 @@ echo $FLAGS echo "Initializing database with genesis state..." $reth init $FLAGS --chain /genesis.json +# Make sure pruner doesn't start +echo -e "[prune]\\nblock_interval = 500_000" >> $DATADIR/reth.toml + # make sure we use the same genesis each time FLAGS="$FLAGS --chain /genesis.json" From 23767cbf94c22d054e779ff784cbdf04e3d02b3c Mon Sep 17 00:00:00 2001 From: Mario Vega Date: Tue, 27 Feb 2024 18:33:57 -0600 Subject: [PATCH 191/387] simulators/eth2: Fix Docker golang version (#1003) * simulators/eth2/engine: Dockerfile, golang:1.20 * simulators/eth2/testnet: Dockerfile, golang:1.20 * simulators/eth2/withdrawals: Dockerfile, golang:1.20 --- simulators/eth2/engine/Dockerfile | 2 +- simulators/eth2/testnet/Dockerfile | 2 +- simulators/eth2/withdrawals/Dockerfile | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/simulators/eth2/engine/Dockerfile b/simulators/eth2/engine/Dockerfile index 2a8ee69c5f..e3f4121b6c 100644 --- a/simulators/eth2/engine/Dockerfile +++ b/simulators/eth2/engine/Dockerfile @@ -1,5 +1,5 @@ # Build the simulator binary -FROM golang:1-alpine AS builder +FROM golang:1.20-alpine AS builder RUN apk --no-cache add gcc musl-dev linux-headers cmake make clang build-base clang-static clang-dev # Prepare workspace. diff --git a/simulators/eth2/testnet/Dockerfile b/simulators/eth2/testnet/Dockerfile index a8ec5ae3d7..d525ce5231 100644 --- a/simulators/eth2/testnet/Dockerfile +++ b/simulators/eth2/testnet/Dockerfile @@ -1,4 +1,4 @@ -FROM golang:1-alpine AS builder +FROM golang:1.20-alpine AS builder RUN apk --no-cache add gcc musl-dev linux-headers cmake make clang build-base clang-static clang-dev # Prepare workspace. diff --git a/simulators/eth2/withdrawals/Dockerfile b/simulators/eth2/withdrawals/Dockerfile index 999e8f550a..ec075d26cc 100644 --- a/simulators/eth2/withdrawals/Dockerfile +++ b/simulators/eth2/withdrawals/Dockerfile @@ -1,5 +1,5 @@ # Build the simulator binary -FROM golang:1-alpine AS builder +FROM golang:1.20-alpine AS builder RUN apk --no-cache add gcc musl-dev linux-headers cmake make clang build-base clang-static clang-dev # Prepare workspace. From 725bef02af6c7925dc8f497c34c228bd93a28bb0 Mon Sep 17 00:00:00 2001 From: Kolby Moroz Liebl <31669092+KolbyML@users.noreply.github.com> Date: Fri, 1 Mar 2024 00:45:34 -0700 Subject: [PATCH 192/387] clients/portal: update Dockerfiles to use baseimage/tag arg format (#1005) --- clients/fluffy/Dockerfile | 5 +++-- clients/trin-bridge/Dockerfile | 5 ++++- clients/trin-bridge/trin_bridge.sh | 2 +- clients/trin/Dockerfile | 5 +++-- clients/trin/trin.sh | 2 +- clients/ultralight/Dockerfile | 6 +++++- 6 files changed, 17 insertions(+), 8 deletions(-) diff --git a/clients/fluffy/Dockerfile b/clients/fluffy/Dockerfile index b34610724b..18c2aaf106 100644 --- a/clients/fluffy/Dockerfile +++ b/clients/fluffy/Dockerfile @@ -1,6 +1,7 @@ -ARG branch=amd64-master-latest +ARG baseimage=statusim/nimbus-fluffy +ARG tag=amd64-master-latest -FROM statusim/nimbus-fluffy:$branch +FROM $baseimage:$tag ADD fluffy.sh /fluffy.sh RUN chmod +x /fluffy.sh diff --git a/clients/trin-bridge/Dockerfile b/clients/trin-bridge/Dockerfile index aa7405a47d..4a5a468330 100644 --- a/clients/trin-bridge/Dockerfile +++ b/clients/trin-bridge/Dockerfile @@ -1,4 +1,7 @@ -FROM portalnetwork/trin:latest-bridge +ARG baseimage=portalnetwork/trin +ARG tag=latest-bridge + +FROM $baseimage:$tag ADD https://raw.githubusercontent.com/ethereum/portal-spec-tests/master/tests/mainnet/history/hive/test_data_collection_of_forks_blocks.yaml /test_data_collection_of_forks_blocks.yaml ADD trin_bridge.sh /trin_bridge.sh diff --git a/clients/trin-bridge/trin_bridge.sh b/clients/trin-bridge/trin_bridge.sh index 5828de0cb7..43418e9145 100644 --- a/clients/trin-bridge/trin_bridge.sh +++ b/clients/trin-bridge/trin_bridge.sh @@ -13,4 +13,4 @@ else exit 1 fi -RUST_LOG=debug portal-bridge --node-count 1 $FLAGS --executable-path ./usr/bin/trin --mode test:/test_data_collection_of_forks_blocks.yaml --el-provider test --external-ip $IP_ADDR --epoch-accumulator-path . trin +RUST_LOG=trace portal-bridge --node-count 1 $FLAGS --executable-path ./usr/bin/trin --mode test:/test_data_collection_of_forks_blocks.yaml --el-provider test --external-ip $IP_ADDR --epoch-accumulator-path . trin diff --git a/clients/trin/Dockerfile b/clients/trin/Dockerfile index 3f980aef80..7b3424019e 100644 --- a/clients/trin/Dockerfile +++ b/clients/trin/Dockerfile @@ -1,6 +1,7 @@ -ARG branch=latest +ARG baseimage=portalnetwork/trin +ARG tag=latest -FROM portalnetwork/trin:$branch +FROM $baseimage:$tag ADD trin.sh /trin.sh RUN chmod +x /trin.sh diff --git a/clients/trin/trin.sh b/clients/trin/trin.sh index 2677d2966d..a3469b1f67 100644 --- a/clients/trin/trin.sh +++ b/clients/trin/trin.sh @@ -16,4 +16,4 @@ else FLAGS="$FLAGS --networks history" fi -RUST_LOG=debug trin --web3-transport http --web3-http-address http://0.0.0.0:8545 --external-address "$IP_ADDR":9009 --bootnodes none $FLAGS +RUST_LOG=trace trin --web3-transport http --web3-http-address http://0.0.0.0:8545 --external-address "$IP_ADDR":9009 --bootnodes none $FLAGS diff --git a/clients/ultralight/Dockerfile b/clients/ultralight/Dockerfile index 011fe582d5..e7b2234f0a 100644 --- a/clients/ultralight/Dockerfile +++ b/clients/ultralight/Dockerfile @@ -1,4 +1,8 @@ -FROM ghcr.io/ethereumjs/ultralight:latest + +ARG baseimage=ghcr.io/ethereumjs/ultralight +ARG tag=latest + +FROM $baseimage:$tag COPY ultralight.sh /ultralight.sh RUN chmod +x /ultralight.sh From 42ff2c5135cfe732889f5f0c95692aae0aaec515 Mon Sep 17 00:00:00 2001 From: Kolby Moroz Liebl <31669092+KolbyML@users.noreply.github.com> Date: Fri, 1 Mar 2024 16:47:37 -0700 Subject: [PATCH 193/387] simulators/portal: bump version of ethportal-api used (#1007) --- simulators/portal/beacon/Cargo.toml | 2 +- simulators/portal/beacon/Dockerfile | 1 + .../portal/beacon/src/suites/rpc_compat.rs | 51 +++---------------- simulators/portal/history/Cargo.toml | 2 +- simulators/portal/history/Dockerfile | 1 + .../portal/history/src/suites/interop.rs | 36 ++++--------- simulators/portal/history/src/suites/mesh.rs | 6 +-- .../portal/history/src/suites/rpc_compat.rs | 48 +++-------------- .../portal/history/src/suites/trin_bridge.rs | 14 ++--- 9 files changed, 34 insertions(+), 127 deletions(-) diff --git a/simulators/portal/beacon/Cargo.toml b/simulators/portal/beacon/Cargo.toml index 6199c2fbde..1a11acce3c 100755 --- a/simulators/portal/beacon/Cargo.toml +++ b/simulators/portal/beacon/Cargo.toml @@ -5,7 +5,7 @@ authors = ["Ognyan Genev ", "Kolby ML (Moroz Liebl) { - let response = BeaconNetworkApiClient::local_content(&client.rpc, content_key).await; - - match response { - Ok(response) => { - match response { - ContentAbsent => (), - _ => panic!("Expected ContentAbsent, got ContentPresent") - } - }, - Err(err) => { - panic!("{}", &err.to_string()); - }, + if let Ok(response) = BeaconNetworkApiClient::local_content(&client.rpc, content_key).await { + panic!("Expected to recieve an error because content wasn't found {response:?}"); } } Err(err) => { @@ -314,18 +301,8 @@ dyn_async! { } // Here we are calling local_content RPC to test if the content is present - let response = BeaconNetworkApiClient::local_content(&client.rpc, content_key).await; - - match response { - Ok(response) => { - match response { - ContentPresent(_) => (), - _ => panic!("Expected ContentPresent, got ContentAbsent") - } - }, - Err(err) => { - panic!("{}", &err.to_string()); - }, + if let Err(err) = BeaconNetworkApiClient::local_content(&client.rpc, content_key).await { + panic!("Expected content returned from local_content to be present {}", &err.to_string()); } } Err(err) => { @@ -579,22 +556,8 @@ dyn_async! { }; let header_with_proof_key: BeaconContentKey = serde_json::from_value(json!(CONTENT_KEY)).unwrap(); - match BeaconNetworkApiClient::recursive_find_content(&client.rpc, header_with_proof_key).await { - Ok(result) => { - match result { - ContentInfo::Content{ content: ethportal_api::PossibleBeaconContentValue::ContentAbsent, utp_transfer } => { - if utp_transfer { - panic!("Error: Unexpected RecursiveFindContent response: utp_transfer was supposed to be false"); - } - }, - other => { - panic!("Error: Unexpected RecursiveFindContent response: {other:?}"); - } - } - }, - Err(err) => { - panic!("Error: Unable to get response from RecursiveFindContent request: {err:?}"); - } + if let Ok(content) = BeaconNetworkApiClient::recursive_find_content(&client.rpc, header_with_proof_key).await { + panic!("Error: Unexpected RecursiveFindContent expected to not get the content and instead get an error: {content:?}"); } } } diff --git a/simulators/portal/history/Cargo.toml b/simulators/portal/history/Cargo.toml index e765ef9721..f94123f827 100755 --- a/simulators/portal/history/Cargo.toml +++ b/simulators/portal/history/Cargo.toml @@ -5,7 +5,7 @@ authors = ["Ognyan Genev ", "Kolby ML (Moroz Liebl) { - match possible_content { - PossibleHistoryContentValue::ContentPresent(content) => { - if content != target_value { - panic!("Error receiving content: Expected content: {target_value:?}, Received content: {content:?}"); - } - } - PossibleHistoryContentValue::ContentAbsent => { - panic!("Expected content not found!"); - } + if possible_content != target_value { + panic!("Error receiving content: Expected content: {target_value:?}, Received content: {possible_content:?}"); } } Err(err) => { @@ -446,8 +439,8 @@ dyn_async! { match client_a.rpc.recursive_find_content(target_key.clone()).await { Ok(result) => { match result { - ContentInfo::Content{ content: ethportal_api::PossibleHistoryContentValue::ContentPresent(val), utp_transfer } => { - if val != target_value { + ContentInfo::Content{ content, utp_transfer } => { + if content != target_value { panic!("Error: Unexpected RECURSIVEFINDCONTENT response: didn't return expected target content"); } @@ -523,8 +516,8 @@ dyn_async! { match client_a.rpc.find_content(target_enr, target_key.clone()).await { Ok(result) => { match result { - ContentInfo::Content{ content: ethportal_api::PossibleHistoryContentValue::ContentPresent(val), utp_transfer } => { - if val != target_value { + ContentInfo::Content{ content, utp_transfer } => { + if content != target_value { panic!("Error: Unexpected FINDCONTENT response: didn't return expected block body"); } @@ -638,19 +631,12 @@ dyn_async! { match client_b.rpc.local_content(content_key.clone()).await { Ok(expected_value) => { - match expected_value { - PossibleHistoryContentValue::ContentPresent(actual_value) => { - if actual_value != content_value { - result.push(format!("Error content received for block {content_details} was different then expected")); - } - } - PossibleHistoryContentValue::ContentAbsent => { - result.push(format!("Error content for block {content_details} was absent")); - } + if expected_value != content_value { + result.push(format!("Error content received for block {content_details} was different then expected")); } } Err(err) => { - panic!("Unable to get received content: {err:?}"); + result.push(format!("Error content for block {err} was absent")); } } } diff --git a/simulators/portal/history/src/suites/mesh.rs b/simulators/portal/history/src/suites/mesh.rs index 5b9c299e6c..99dd7aa03c 100644 --- a/simulators/portal/history/src/suites/mesh.rs +++ b/simulators/portal/history/src/suites/mesh.rs @@ -1,7 +1,7 @@ use crate::suites::constants::TRIN_BRIDGE_CLIENT_TYPE; use ethportal_api::jsonrpsee::core::__reexports::serde_json; use ethportal_api::types::distance::{Metric, XorMetric}; -use ethportal_api::types::portal::ContentInfo; +use ethportal_api::types::history::ContentInfo; use ethportal_api::{ Discv5ApiClient, HistoryContentKey, HistoryContentValue, HistoryNetworkApiClient, }; @@ -145,8 +145,8 @@ dyn_async! { match client_a.rpc.find_content(enrs[0].clone(), header_with_proof_key.clone()).await { Ok(result) => { match result { - ContentInfo::Content{ content: ethportal_api::PossibleHistoryContentValue::ContentPresent(val), utp_transfer } => { - if val != header_with_proof_value { + ContentInfo::Content{ content, utp_transfer } => { + if content != header_with_proof_value { panic!("Error: Unexpected FINDCONTENT response: didn't return expected header with proof value"); } diff --git a/simulators/portal/history/src/suites/rpc_compat.rs b/simulators/portal/history/src/suites/rpc_compat.rs index bdae9c3526..7cc03401ee 100644 --- a/simulators/portal/history/src/suites/rpc_compat.rs +++ b/simulators/portal/history/src/suites/rpc_compat.rs @@ -1,8 +1,6 @@ use crate::suites::constants::TRIN_BRIDGE_CLIENT_TYPE; use ethportal_api::types::enr::generate_random_remote_enr; -use ethportal_api::types::portal::ContentInfo; use ethportal_api::Discv5ApiClient; -use ethportal_api::PossibleHistoryContentValue::{ContentAbsent, ContentPresent}; use ethportal_api::{HistoryContentKey, HistoryNetworkApiClient}; use hivesim::types::ClientDefinition; use hivesim::{dyn_async, Client, NClientTestSpec, Test}; @@ -222,18 +220,8 @@ dyn_async! { match content_key { Ok(content_key) => { - let response = HistoryNetworkApiClient::local_content(&client.rpc, content_key).await; - - match response { - Ok(response) => { - match response { - ContentAbsent => (), - _ => panic!("Expected ContentAbsent, got ContentPresent") - } - }, - Err(err) => { - panic!("{}", &err.to_string()); - }, + if let Ok(response) = HistoryNetworkApiClient::local_content(&client.rpc, content_key).await { + panic!("Expected to recieve an error because content wasn't found {response:?}"); } } Err(err) => { @@ -311,18 +299,8 @@ dyn_async! { } // Here we are calling local_content RPC to test if the content is present - let response = HistoryNetworkApiClient::local_content(&client.rpc, content_key).await; - - match response { - Ok(response) => { - match response { - ContentPresent(_) => (), - _ => panic!("Expected ContentPresent, got ContentAbsent") - } - }, - Err(err) => { - panic!("{}", &err.to_string()); - }, + if let Err(err) = HistoryNetworkApiClient::local_content(&client.rpc, content_key).await { + panic!("Expected content returned from local_content to be present {}", &err.to_string()); } } Err(err) => { @@ -576,22 +554,8 @@ dyn_async! { }; let header_with_proof_key: HistoryContentKey = serde_json::from_value(json!(CONTENT_KEY)).unwrap(); - match HistoryNetworkApiClient::recursive_find_content(&client.rpc, header_with_proof_key).await { - Ok(result) => { - match result { - ContentInfo::Content{ content: ethportal_api::PossibleHistoryContentValue::ContentAbsent, utp_transfer } => { - if utp_transfer { - panic!("Error: Unexpected RecursiveFindContent response: utp_transfer was supposed to be false"); - } - }, - other => { - panic!("Error: Unexpected RecursiveFindContent response: {other:?}"); - } - } - }, - Err(err) => { - panic!("Error: Unable to get response from RecursiveFindContent request: {err:?}"); - } + if let Ok(content) = HistoryNetworkApiClient::recursive_find_content(&client.rpc, header_with_proof_key).await { + panic!("Error: Unexpected RecursiveFindContent expected to not get the content and instead get an error: {content:?}"); } } } diff --git a/simulators/portal/history/src/suites/trin_bridge.rs b/simulators/portal/history/src/suites/trin_bridge.rs index f630164e29..3a10efc140 100644 --- a/simulators/portal/history/src/suites/trin_bridge.rs +++ b/simulators/portal/history/src/suites/trin_bridge.rs @@ -4,7 +4,6 @@ use super::constants::{ }; use ethportal_api::HistoryContentKey; use ethportal_api::HistoryContentValue; -use ethportal_api::PossibleHistoryContentValue; use ethportal_api::{Discv5ApiClient, HistoryNetworkApiClient}; use hivesim::types::ClientDefinition; use hivesim::{dyn_async, Client, NClientTestSpec, Test}; @@ -105,16 +104,9 @@ dyn_async! { let mut result = vec![]; for (index, (content_key, content_value)) in content_vec.into_iter().enumerate() { match client.rpc.local_content(content_key.clone()).await { - Ok(possible_content) => { - match possible_content { - PossibleHistoryContentValue::ContentPresent(content) => { - if content != content_value { - result.push(format!("Error content received for block {} was different then expected", comments[index])); - } - } - PossibleHistoryContentValue::ContentAbsent => { - result.push(format!("Error content for block {} was absent", comments[index])); - } + Ok(content) => { + if content != content_value { + result.push(format!("Error content received for block {} was different then expected: Provided: {content:?} Expected: {content_value:?}", comments[index])); } } Err(err) => { From 867fe9c618d4c3fe39089ad4eff99224ffdc1985 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BD=AD=E6=8C=AF?= <505380967@qq.com> Date: Mon, 4 Mar 2024 13:22:32 +0800 Subject: [PATCH 194/387] clients: add shisui (golang) portal client (#1018) * feat: add client shiui * format: add a new line at the end of the file * fix: Dockerfile Arg * fix: hive.yaml format * fix line ending --------- Co-authored-by: pengzhen Co-authored-by: Kolby Moroz Liebl <31669092+KolbyML@users.noreply.github.com> Co-authored-by: Chen Kai <281165273grape@gmail.com> --- clients/shisui/Dockerfile | 11 +++++++++++ clients/shisui/hive.yaml | 3 +++ 2 files changed, 14 insertions(+) create mode 100644 clients/shisui/Dockerfile create mode 100644 clients/shisui/hive.yaml diff --git a/clients/shisui/Dockerfile b/clients/shisui/Dockerfile new file mode 100644 index 0000000000..09030bea8e --- /dev/null +++ b/clients/shisui/Dockerfile @@ -0,0 +1,11 @@ +ARG baseimage=ghcr.io/optimism-java/shisui +ARG tag=latest + +FROM $baseimage:$tag + +RUN echo "latest" > /version.txt + +# Export the usual networking ports to allow outside access to the node +EXPOSE 8545 9009/udp + +ENTRYPOINT ["app"] diff --git a/clients/shisui/hive.yaml b/clients/shisui/hive.yaml new file mode 100644 index 0000000000..b1fda1c9fe --- /dev/null +++ b/clients/shisui/hive.yaml @@ -0,0 +1,3 @@ +roles: + - portal + From ebe431380e1c45aba138fa9c9e9fcf8fd28b5ba0 Mon Sep 17 00:00:00 2001 From: Mario Vega Date: Mon, 4 Mar 2024 18:33:23 -0600 Subject: [PATCH 195/387] simulators/ethereum/engine: Optimize Blob generation, KZG pre-compute (#1020) simulators/ethereum/engine: Optimize Blob generation, kzg pre-compute --- simulators/ethereum/engine/helper/blobs.go | 163 ++++++++++-------- .../ethereum/engine/helper/helper_test.go | 54 ++++++ .../engine/helper/kzg_commitments.bin | Bin 0 -> 480000 bytes .../engine/helper/kzg_precomputer/main.go | 44 +++++ .../ethereum/engine/helper/kzg_proofs.bin | Bin 0 -> 480000 bytes simulators/ethereum/engine/types/blobs.go | 24 --- 6 files changed, 188 insertions(+), 97 deletions(-) create mode 100644 simulators/ethereum/engine/helper/helper_test.go create mode 100644 simulators/ethereum/engine/helper/kzg_commitments.bin create mode 100644 simulators/ethereum/engine/helper/kzg_precomputer/main.go create mode 100644 simulators/ethereum/engine/helper/kzg_proofs.bin diff --git a/simulators/ethereum/engine/helper/blobs.go b/simulators/ethereum/engine/helper/blobs.go index 695d789a68..7d66fe4d46 100644 --- a/simulators/ethereum/engine/helper/blobs.go +++ b/simulators/ethereum/engine/helper/blobs.go @@ -103,6 +103,8 @@ type BlobTransactionCreator struct { Data []byte } +var uint256BlsModulus = new(uint256.Int).SetBytes32(gokzg4844.BlsModulus[:]) + func (blobId BlobID) VerifyBlob(blob *typ.Blob) (bool, error) { if blob == nil { return false, errors.New("nil blob") @@ -119,42 +121,24 @@ func (blobId BlobID) VerifyBlob(blob *typ.Blob) (bool, error) { } // Check the blob against the deterministic data - blobIdBytes := make([]byte, 8) - binary.BigEndian.PutUint64(blobIdBytes, uint64(blobId)) - - // First 32 bytes are the hash of the blob ID - currentHashed := sha256.Sum256(blobIdBytes) + // First 32 bytes are the sha256 hash of the blob ID + var currentU256 *uint256.Int + { + blobIdBytes := make([]byte, 8) + binary.BigEndian.PutUint64(blobIdBytes, uint64(blobId)) + currentHashedBuffer := sha256.Sum256(blobIdBytes) + currentU256 = new(uint256.Int).SetBytes(currentHashedBuffer[:]) + } + // Calculate modulus before starting + currentU256.Mod(currentU256, uint256BlsModulus) for chunkIdx := 0; chunkIdx < typ.FieldElementsPerBlob; chunkIdx++ { - var expectedFieldElem [32]byte - copy(expectedFieldElem[:], currentHashed[:]) - - // Check that no 32 bytes chunks are greater than the BLS modulus - for i := 0; i < 32; i++ { - // blobByteIdx := 32 - i - 1 - blobByteIdx := i - if expectedFieldElem[blobByteIdx] < gokzg4844.BlsModulus[i] { - // done with this field element - break - } else if expectedFieldElem[blobByteIdx] >= gokzg4844.BlsModulus[i] { - if gokzg4844.BlsModulus[i] > 0 { - // This chunk is greater than the modulus, and we can reduce it in this byte position - expectedFieldElem[blobByteIdx] = gokzg4844.BlsModulus[i] - 1 - // done with this field element - break - } else { - // This chunk is greater than the modulus, but we can't reduce it in this byte position, so we will try in the next byte position - expectedFieldElem[blobByteIdx] = gokzg4844.BlsModulus[i] - } - } - } - - if !bytes.Equal(blob[chunkIdx*32:(chunkIdx+1)*32], expectedFieldElem[:]) { + currentBlobFieldElem := new(uint256.Int).SetBytes32(blob[chunkIdx*32 : (chunkIdx+1)*32]) + if currentBlobFieldElem.Cmp(currentU256) != 0 { return false, nil } - - // Hash the current hash - currentHashed = sha256.Sum256(currentHashed[:]) + // Add the current hash + currentU256.AddMod(currentU256, currentU256, uint256BlsModulus) } return true, nil } @@ -168,61 +152,98 @@ func (blobId BlobID) FillBlob(blob *typ.Blob) error { return nil } // Fill the blob with deterministic data - blobIdBytes := make([]byte, 8) - binary.BigEndian.PutUint64(blobIdBytes, uint64(blobId)) - - // First 32 bytes are the hash of the blob ID - currentHashed := sha256.Sum256(blobIdBytes) + // First 32 bytes are the sha256 hash of the blob ID + var currentU256 *uint256.Int + { + blobIdBytes := make([]byte, 8) + binary.BigEndian.PutUint64(blobIdBytes, uint64(blobId)) + currentHashedBuffer := sha256.Sum256(blobIdBytes) + currentU256 = new(uint256.Int).SetBytes(currentHashedBuffer[:]) + } + // Calculate modulus before starting + currentU256.Mod(currentU256, uint256BlsModulus) for chunkIdx := 0; chunkIdx < typ.FieldElementsPerBlob; chunkIdx++ { - copy(blob[chunkIdx*32:(chunkIdx+1)*32], currentHashed[:]) - - // Check that no 32 bytes chunks are greater than the BLS modulus - for i := 0; i < 32; i++ { - //blobByteIdx := ((chunkIdx + 1) * 32) - i - 1 - blobByteIdx := (chunkIdx * 32) + i - if blob[blobByteIdx] < gokzg4844.BlsModulus[i] { - // go to next chunk - break - } else if blob[blobByteIdx] >= gokzg4844.BlsModulus[i] { - if gokzg4844.BlsModulus[i] > 0 { - // This chunk is greater than the modulus, and we can reduce it in this byte position - blob[blobByteIdx] = gokzg4844.BlsModulus[i] - 1 - // go to next chunk - break - } else { - // This chunk is greater than the modulus, but we can't reduce it in this byte position, so we will try in the next byte position - blob[blobByteIdx] = gokzg4844.BlsModulus[i] - } - } - } - - // Hash the current hash - currentHashed = sha256.Sum256(currentHashed[:]) + bytes32 := currentU256.Bytes32() + copy(blob[chunkIdx*32:(chunkIdx+1)*32], bytes32[:]) + // Add the current hash + currentU256.AddMod(currentU256, currentU256, uint256BlsModulus) } return nil } -func (blobId BlobID) GenerateBlob() (*typ.Blob, *typ.KZGCommitment, error) { +func (blobId BlobID) GenerateBlobNoKZGCache() (*typ.Blob, *typ.KZGCommitment, *typ.KZGProof, error) { blob := typ.Blob{} if err := blobId.FillBlob(&blob); err != nil { - return nil, nil, errors.Wrap(err, "GenerateBlob (1)") + return nil, nil, nil, errors.Wrap(err, "GenerateBlob: Filling Blob") } ctx_4844 := CryptoCtx() kzgCommitment, err := ctx_4844.BlobToKZGCommitment(gokzg4844.Blob(blob), 0) if err != nil { - return nil, nil, errors.Wrap(err, "GenerateBlob (2)") + return nil, nil, nil, errors.Wrap(err, "GenerateBlob: Generating commitment") + } + typesKzgCommitment := typ.KZGCommitment(kzgCommitment) + + proof, err := ctx_4844.ComputeBlobKZGProof(gokzg4844.Blob(blob), kzgCommitment, 1) + if err != nil { + return nil, nil, nil, errors.Wrap(err, "GenerateBlob: Generating proof") } + typesKzgProof := typ.KZGProof(proof) + return &blob, &typesKzgCommitment, &typesKzgProof, nil +} + +//go:embed kzg_commitments.bin +var kzgCommitments []byte + +//go:embed kzg_proofs.bin +var kzgProofs []byte + +func GetPrecomputedKZG(blobId BlobID) (*typ.KZGCommitment, *typ.KZGProof) { + if int(blobId) >= len(kzgCommitments)/48 || int(blobId) >= len(kzgProofs)/48 { + return nil, nil + } + var ( + commitment typ.KZGCommitment + proof typ.KZGProof + ) + copy(commitment[:], kzgCommitments[int(blobId)*48:(int(blobId)+1)*48]) + copy(proof[:], kzgProofs[int(blobId)*48:(int(blobId)+1)*48]) + return &commitment, &proof + +} + +//go:generate go run github.com/ethereum/hive/simulators/ethereum/engine/helper/kzg_precomputer 10000 +func (blobId BlobID) GenerateBlob() (*typ.Blob, *typ.KZGCommitment, *typ.KZGProof, error) { + blob := typ.Blob{} + if err := blobId.FillBlob(&blob); err != nil { + return nil, nil, nil, errors.Wrap(err, "GenerateBlob: Filling Blob") + } + // Use precomputed KZG commitments and proofs if available + if preComputedKZGCommitment, preComputedProof := GetPrecomputedKZG(blobId); preComputedKZGCommitment != nil && preComputedProof != nil { + return &blob, preComputedKZGCommitment, preComputedProof, nil + } + ctx_4844 := CryptoCtx() + + kzgCommitment, err := ctx_4844.BlobToKZGCommitment(gokzg4844.Blob(blob), 0) + if err != nil { + return nil, nil, nil, errors.Wrap(err, "GenerateBlob: Generating commitment") + } typesKzgCommitment := typ.KZGCommitment(kzgCommitment) - return &blob, &typesKzgCommitment, nil + proof, err := ctx_4844.ComputeBlobKZGProof(gokzg4844.Blob(blob), kzgCommitment, 1) + if err != nil { + return nil, nil, nil, errors.Wrap(err, "GenerateBlob: Generating proof") + } + typesKzgProof := typ.KZGProof(proof) + + return &blob, &typesKzgCommitment, &typesKzgProof, nil } func (blobId BlobID) GetVersionedHash(commitmentVersion byte) (common.Hash, error) { - _, kzgCommitment, err := blobId.GenerateBlob() + _, kzgCommitment, _, err := blobId.GenerateBlob() if err != nil { return common.Hash{}, errors.Wrap(err, "GetVersionedHash") } @@ -238,25 +259,21 @@ func BlobDataGenerator(startBlobId BlobID, blobCount uint64) ([]common.Hash, *ty blobData := typ.BlobTxWrapData{ Blobs: make(typ.Blobs, blobCount), Commitments: make([]typ.KZGCommitment, blobCount), + Proofs: make(typ.KZGProofs, blobCount), } for i := uint64(0); i < blobCount; i++ { - if blob, kzgCommitment, err := (startBlobId + BlobID(i)).GenerateBlob(); err != nil { + if blob, kzgCommitment, kzgProof, err := (startBlobId + BlobID(i)).GenerateBlob(); err != nil { return nil, nil, err } else { blobData.Blobs[i] = *blob blobData.Commitments[i] = *kzgCommitment + blobData.Proofs[i] = *kzgProof } } - var hashes []common.Hash for i := 0; i < len(blobData.Commitments); i++ { hashes = append(hashes, blobData.Commitments[i].ComputeVersionedHash()) } - _, _, proofs, err := blobData.Blobs.ComputeCommitmentsAndProofs(CryptoCtx()) - if err != nil { - return nil, nil, err - } - blobData.Proofs = proofs return hashes, &blobData, nil } diff --git a/simulators/ethereum/engine/helper/helper_test.go b/simulators/ethereum/engine/helper/helper_test.go new file mode 100644 index 0000000000..6f41a332aa --- /dev/null +++ b/simulators/ethereum/engine/helper/helper_test.go @@ -0,0 +1,54 @@ +package helper_test + +import ( + "testing" + + "github.com/ethereum/hive/simulators/ethereum/engine/helper" +) + +func TestBlobGeneration(t *testing.T) { + for blobID := helper.BlobID(0); blobID < 100; blobID++ { + blob, _, _, err := blobID.GenerateBlob() + if err != nil { + t.Fatal(err) + } + if len(blob) == 0 { + t.Fatal("blob is empty") + } + if eq, err := blobID.VerifyBlob(blob); err != nil { + t.Fatal(err) + } else if !eq { + t.Fatal("blob verification failed") + } + } +} + +func TestPrecomputedKZGCommitments(t *testing.T) { + for i := helper.BlobID(0); i < 100; i++ { + commitment, proof := helper.GetPrecomputedKZG(i) + if commitment == nil { + t.Fatal("precomputed KZG commitments and proofs are empty") + } + blobID := helper.BlobID(i) + _, kzgCommitment1, kzgProof1, err := blobID.GenerateBlobNoKZGCache() + if err != nil { + t.Fatal(err) + } + if *kzgCommitment1 != *commitment { + t.Fatalf("commitment %d does not match precomputed commitment", i) + } + if *kzgProof1 != *proof { + t.Fatalf("proof %d does not match precomputed proof", i) + } + _, kzgCommitment2, kzgProof2, err := blobID.GenerateBlob() + if err != nil { + t.Fatal(err) + } + if *kzgCommitment2 != *commitment { + t.Fatalf("commitment %d does not match precomputed commitment", i) + } + if *kzgProof2 != *proof { + t.Fatalf("proof %d does not match precomputed proof", i) + } + } +} diff --git a/simulators/ethereum/engine/helper/kzg_commitments.bin b/simulators/ethereum/engine/helper/kzg_commitments.bin new file mode 100644 index 0000000000000000000000000000000000000000..46165a07c1a9157843067b4ce0df4d960c9eb89d GIT binary patch literal 480000 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
_5NV$Fm>Z=z*+oP+%k^lJ+@LtM3L5*`}}F^ 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

F= zKR1tFoA=*BvPR@NF_7`)!cNz1z2C=myTHtH>wd;dyde$jp+QjM6Pt*)syEqimcnN3 znB}3p*@POzagw$)*B!Sm!e6ynr~4-2x#YB)37o5kb<^RoDMHMst@n(Rx2$JZUnn3d zR&dro5QQ=tKB}T@9m=49&>G35NaO{D8=8?SnKa`C#Ed7cgHb(%QK*i3!jB&q@~zM> zaj#bsxXc3*^1FqcITO{iR|g8eBMM4R1&k2pOvA&M*)T19 Z^ZV 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

LTd;kT6%z+=n({U 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 literal 0 HcmV?d00001 diff --git a/simulators/ethereum/engine/helper/kzg_precomputer/main.go b/simulators/ethereum/engine/helper/kzg_precomputer/main.go new file mode 100644 index 0000000000..b9823b7605 --- /dev/null +++ b/simulators/ethereum/engine/helper/kzg_precomputer/main.go @@ -0,0 +1,44 @@ +package main + +import ( + "os" + "strconv" + + "github.com/ethereum/hive/simulators/ethereum/engine/helper" +) + +func main() { + // First argument is the number of blobs to generate + arg := os.Args[1] + numBlobs, err := strconv.Atoi(arg) + if err != nil { + panic(err) + } + + commitmentsArray := make([]byte, numBlobs*48) + proofsArray := make([]byte, numBlobs*48) + + for i := 0; i < numBlobs; i++ { + blobID := helper.BlobID(i) + _, kzg, proof, err := blobID.GenerateBlobNoKZGCache() + if err != nil { + panic(err) + } + copy(commitmentsArray[i*48:], (*kzg)[:]) + copy(proofsArray[i*48:], (*proof)[:]) + } + + f, err := os.Create("./kzg_commitments.bin") + if err != nil { + panic(err) + } + f.Write(commitmentsArray) + defer f.Close() + + f, err = os.Create("./kzg_proofs.bin") + if err != nil { + panic(err) + } + f.Write(proofsArray) + defer f.Close() +} diff --git a/simulators/ethereum/engine/helper/kzg_proofs.bin b/simulators/ethereum/engine/helper/kzg_proofs.bin new file mode 100644 index 0000000000000000000000000000000000000000..840eaae80999da93ceb40c53403b954ada9701ff GIT binary patch literal 480000 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

5J~nAL`-Q*L~;|Cs`g{#IQscT^CL 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

  • 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

    I-2CH%( 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 literal 0 HcmV?d00001 diff --git a/simulators/ethereum/engine/types/blobs.go b/simulators/ethereum/engine/types/blobs.go index cbfc7df2ae..6cd97da73d 100644 --- a/simulators/ethereum/engine/types/blobs.go +++ b/simulators/ethereum/engine/types/blobs.go @@ -111,30 +111,6 @@ type KZGProofs []KZGProof type Blobs []Blob -// Return KZG commitments, versioned hashes and the proofs that correspond to these blobs -func (blobs Blobs) ComputeCommitmentsAndProofs(cryptoCtx gokzg4844.Context) (commitments []KZGCommitment, versionedHashes []common.Hash, proofs []KZGProof, err error) { - commitments = make([]KZGCommitment, len(blobs)) - proofs = make([]KZGProof, len(blobs)) - versionedHashes = make([]common.Hash, len(blobs)) - - for i, blob := range blobs { - commitment, err := cryptoCtx.BlobToKZGCommitment(gokzg4844.Blob(blob), 1) - if err != nil { - return nil, nil, nil, fmt.Errorf("could not convert blob to commitment: %v", err) - } - - proof, err := cryptoCtx.ComputeBlobKZGProof(gokzg4844.Blob(blob), commitment, 1) - if err != nil { - return nil, nil, nil, fmt.Errorf("could not compute proof for blob: %v", err) - } - commitments[i] = KZGCommitment(commitment) - proofs[i] = KZGProof(proof) - versionedHashes[i] = common.Hash(KZGToVersionedHash(gokzg4844.KZGCommitment(commitment))) - } - - return commitments, versionedHashes, proofs, nil -} - type BlobTxWrapData struct { Blobs Blobs Commitments BlobKzgs From ab757b2b0871ea2e6a6aa633b1327776d36e425d Mon Sep 17 00:00:00 2001 From: Kolby Moroz Liebl <31669092+KolbyML@users.noreply.github.com> Date: Mon, 4 Mar 2024 19:50:50 -0700 Subject: [PATCH 196/387] simulators/portal/state: simulator for Portal State Network testing (#1022) --- clients/fluffy/fluffy.sh | 3 + simulators/portal/beacon/Cargo.toml | 2 +- simulators/portal/state/Cargo.toml | 14 + simulators/portal/state/Dockerfile | 27 + simulators/portal/state/src/main.rs | 43 ++ .../portal/state/src/suites/constants.rs | 5 + simulators/portal/state/src/suites/mod.rs | 2 + .../portal/state/src/suites/rpc_compat.rs | 564 ++++++++++++++++++ 8 files changed, 659 insertions(+), 1 deletion(-) create mode 100755 simulators/portal/state/Cargo.toml create mode 100644 simulators/portal/state/Dockerfile create mode 100644 simulators/portal/state/src/main.rs create mode 100644 simulators/portal/state/src/suites/constants.rs create mode 100644 simulators/portal/state/src/suites/mod.rs create mode 100644 simulators/portal/state/src/suites/rpc_compat.rs diff --git a/clients/fluffy/fluffy.sh b/clients/fluffy/fluffy.sh index f9197904f8..57b91135f1 100755 --- a/clients/fluffy/fluffy.sh +++ b/clients/fluffy/fluffy.sh @@ -12,6 +12,9 @@ if [ "$HIVE_PORTAL_NETWORKS_SELECTED" != "" ]; then # It can be a made up value for now as tests are not doing any sync. FLAGS="$FLAGS --trusted-block-root:0x0000000000000000000000000000000000000000000000000000000000000000" fi + if [[ $HIVE_PORTAL_NETWORKS_SELECTED =~ "state" ]]; then + FLAGS="$FLAGS --state=true" + fi fi diff --git a/simulators/portal/beacon/Cargo.toml b/simulators/portal/beacon/Cargo.toml index 1a11acce3c..5690e3a017 100755 --- a/simulators/portal/beacon/Cargo.toml +++ b/simulators/portal/beacon/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "beacon" version = "0.1.0" -authors = ["Ognyan Genev ", "Kolby ML (Moroz Liebl) "] +authors = ["Kolby ML (Moroz Liebl) "] edition = "2021" [dependencies] diff --git a/simulators/portal/state/Cargo.toml b/simulators/portal/state/Cargo.toml new file mode 100755 index 0000000000..89dc09fc80 --- /dev/null +++ b/simulators/portal/state/Cargo.toml @@ -0,0 +1,14 @@ +[package] +name = "state" +version = "0.1.0" +authors = ["Kolby ML (Moroz Liebl) "] +edition = "2021" + +[dependencies] +ethportal-api = { git = "https://github.com/ethereum/trin", tag = "v0.1.0-alpha.22" } +hivesim = { git = "https://github.com/ethereum/portal-hive", rev = "8ff1e3d3c941dd00d56dacd777a5dfb71edf402f" } +futures = "0.3.25" +serde_json = "1.0.87" +tracing = "0.1.37" +tracing-subscriber = "0.3.16" +tokio = { version = "1", features = ["full"] } diff --git a/simulators/portal/state/Dockerfile b/simulators/portal/state/Dockerfile new file mode 100644 index 0000000000..534c001a4c --- /dev/null +++ b/simulators/portal/state/Dockerfile @@ -0,0 +1,27 @@ +FROM rust:1.75.0 AS builder + +# create a new empty shell project +RUN USER=root cargo new --bin state +WORKDIR /state + +RUN apt-get update && apt-get install clang -y + +# copy over manifests and source to build image +COPY Cargo.toml ./Cargo.toml +COPY src ./src +RUN apt-get update && apt-get install clang -y + +# build for release +RUN cargo build --release + +# final base +FROM ubuntu:22.04 + +RUN apt update && apt install wget -y + +# copy build artifacts from build stage +COPY --from=builder /state/target/release/state . + +ENV RUST_LOG=debug + +ENTRYPOINT ["./state"] diff --git a/simulators/portal/state/src/main.rs b/simulators/portal/state/src/main.rs new file mode 100644 index 0000000000..35e6aead5a --- /dev/null +++ b/simulators/portal/state/src/main.rs @@ -0,0 +1,43 @@ +mod suites; + +use hivesim::{Simulation, Suite, TestSpec}; +use suites::rpc_compat::run_rpc_compat_test_suite; + +#[tokio::main] +async fn main() { + tracing_subscriber::fmt::init(); + let mut state_rpc_compat = Suite { + name: "state-rpc-compat".to_string(), + description: "The RPC-compatibility test suite runs a set of RPC related tests against a + running node. It tests client implementations of the JSON-RPC API for + conformance with the portal network API specification." + .to_string(), + tests: vec![], + }; + + state_rpc_compat.add(TestSpec { + name: "client launch".to_string(), + description: "This test launches the client and collects its logs.".to_string(), + always_run: false, + run: run_rpc_compat_test_suite, + client: None, + }); + + let sim = Simulation::new(); + run_suite(sim, vec![state_rpc_compat]).await; +} + +async fn run_suite(host: Simulation, suites: Vec) { + for suite in suites { + let name = suite.clone().name; + let description = suite.clone().description; + + let suite_id = host.start_suite(name, description, "".to_string()).await; + + for test in &suite.tests { + test.run_test(host.clone(), suite_id, suite.clone()).await; + } + + host.end_suite(suite_id).await; + } +} diff --git a/simulators/portal/state/src/suites/constants.rs b/simulators/portal/state/src/suites/constants.rs new file mode 100644 index 0000000000..4215dcc0a7 --- /dev/null +++ b/simulators/portal/state/src/suites/constants.rs @@ -0,0 +1,5 @@ +pub const HIVE_PORTAL_NETWORKS_SELECTED: &str = "HIVE_PORTAL_NETWORKS_SELECTED"; +pub const STATE_STRING: &str = "state"; + +// trin-bridge constants +pub const TRIN_BRIDGE_CLIENT_TYPE: &str = "trin-bridge"; diff --git a/simulators/portal/state/src/suites/mod.rs b/simulators/portal/state/src/suites/mod.rs new file mode 100644 index 0000000000..7e92c503f8 --- /dev/null +++ b/simulators/portal/state/src/suites/mod.rs @@ -0,0 +1,2 @@ +pub mod constants; +pub mod rpc_compat; diff --git a/simulators/portal/state/src/suites/rpc_compat.rs b/simulators/portal/state/src/suites/rpc_compat.rs new file mode 100644 index 0000000000..06d54bb6fe --- /dev/null +++ b/simulators/portal/state/src/suites/rpc_compat.rs @@ -0,0 +1,564 @@ +use crate::suites::constants::HIVE_PORTAL_NETWORKS_SELECTED; +use crate::suites::constants::STATE_STRING; +use crate::suites::constants::TRIN_BRIDGE_CLIENT_TYPE; +use ethportal_api::types::enr::generate_random_remote_enr; +use ethportal_api::Discv5ApiClient; +use ethportal_api::{StateContentKey, StateNetworkApiClient}; +use hivesim::types::ClientDefinition; +use hivesim::{dyn_async, Client, NClientTestSpec, Test}; +use serde_json::json; +use std::collections::HashMap; + +// Bootstrap https://github.com/ethereum/portal-spec-tests/blob/master/tests/mainnet/state/validation/account_trie_node.yaml +const CONTENT_KEY: &str = + "0x20240000000ad14c73a3b489e9cb1c523aef684ed17363e03d33345f2b23c0407f87ee3ff000a97f"; +const CONTENT_VALUE: &str = "0x24000000d4e56740f876aef8c010b86a40d5f56745a118d0906a34e69aec8c0db1cb8fa314000000280200003c0400001006000033060000f90211a090dcaf88c40c7bbc95a912cbdde67c175767b31173df9ee4b0d733bfdd511c43a0babe369f6b12092f49181ae04ca173fb68d1a5456f18d20fa32cba73954052bda0473ecf8a7e36a829e75039a3b055e51b8332cbf03324ab4af2066bbd6fbf0021a0bbda34753d7aa6c38e603f360244e8f59611921d9e1f128372fec0d586d4f9e0a04e44caecff45c9891f74f6a2156735886eedf6f1a733628ebc802ec79d844648a0a5f3f2f7542148c973977c8a1e154c4300fec92f755f7846f1b734d3ab1d90e7a0e823850f50bf72baae9d1733a36a444ab65d0a6faaba404f0583ce0ca4dad92da0f7a00cbe7d4b30b11faea3ae61b7f1f2b315b61d9f6bd68bfe587ad0eeceb721a07117ef9fc932f1a88e908eaead8565c19b5645dc9e5b1b6e841c5edbdfd71681a069eb2de283f32c11f859d7bcf93da23990d3e662935ed4d6b39ce3673ec84472a0203d26456312bbc4da5cd293b75b840fc5045e493d6f904d180823ec22bfed8ea09287b5c21f2254af4e64fca76acc5cd87399c7f1ede818db4326c98ce2dc2208a06fc2d754e304c48ce6a517753c62b1a9c1d5925b89707486d7fc08919e0a94eca07b1c54f15e299bd58bdfef9741538c7828b5d7d11a489f9c20d052b3471df475a051f9dd3739a927c89e357580a4c97b40234aa01ed3d5e0390dc982a7975880a0a089d613f26159af43616fd9455bb461f4869bfede26f2130835ed067a8b967bfb80f90211a068c361d52a1ae36e33155313cd4e838c539d946d85925e5867b747e66995279ea04bfcad7bfdf0fb113e6bf0ebe4d55543688888bd6ad277de20aa0f8a85808808a086816b98cc35e76d6e811646f6c37a73d148a23420bcc03493090639bb8393eca0af4b0b8fcf790b63a8bbc3711f091758d3e4dd424cdc4ded526015c42ca50dcaa0158ecf58c068c4d0452dba821665bbdc6c9c57d6016e53abc18832e9ccfc0b86a016a6ebfa551718656d0b514f948a859964f83d3717e0f055f996772d2f228c2da0a9fd3ba226e84a434bc8d5b974b5131faccdefa6a58a02ddff829fa3d4bb27d5a0cf039eb80d70511d207a7e25160061689d9267630b66d2aaedac436872ae415ba0f24a488dd566079b384e558779c105af0d8f8c8ed564aeab9c7564f393bea56ea05132b24ec0dcf33ec24cb4678aa90b2622141c94345a5dceff21b22284c26251a0c093497e0aeeb4bd0bc461643cf003f87dde10cc1c9925a0b23a409f2048b8e2a0c03b6353e1dcdd3707caa20cd4d6a5c3c59da9f7424bba97ba643f17d42b8b86a0177fd57a9ee5d2d47d712d2daf75f5162a33b604b72766a98daad5509f607b45a09c7945f1f9517363d0cc19dde9ad91222f9d3c0162061182eb114e39a9f605c7a0a8440ef6e36d273b58c65344edab0583a03f09912d22e723dae51cc1d716d786a01df56337e1161f3fe7318ad10bd8e5c42f741c0652bd70d1292c7d0f2f7b88cb80f901d1a01a42abb27509a631169ab7e765e13dec0de47dac9cc7bba9cbc03d9086a0db71a0a0978af82352385b3ed1d0cd6c37a5b2613a989ea01df570edb06df32fdefaff80a0d1cf5bc45e21fa3960d172fe189be5978adab50ca77d11d1c2953eebbbd2d312a005b8054e0db723ad20cc31b1be4d987ae6c6c37c334207120b1f67506f84ad43a0430e5e56596211fcf7b7875da97ac1b1f6ba13189dce330bcaebb9e6d5569f01a003353e7e139443c7b994c347eb7636dcae5b3eac6ba09b3bbb8c588c2e41a958a0cf966488cfb696ed5ac8f67923e4c0912eef7656df7f7586ba2b7ad7072b34b6a0652fb2d2acc28fc9360ac63f29d7886abf602ccbc0cf865061b653415256f357a062d4f171bb087621727a87a01a29d4c8b20864fcb45eb6d60eb929af76aa3485a0dbf844359c229020360ae86751fed8ea41d985ee245da8a27893cc5e1cf55d6fa03ada43c4de6154b5f5567fc27f3a659c3028b321a8040c8713d8b347d7634d3080a0728693f4b5a3f28187456de3217e2985662d52979bfae5a49da65153c50ada8da03c0a8e099ac8060b14d7946c6abc5a0a428defe61781e2cb0736a20ad086e442a07ca441b942818197c8fa360f6d32113277c734eedac7a4539f62e5a27ce404e880e21fa00ad14c73a3b489e9cb1c523aef684ed17363e03d33345f2b23c0407f87ee3ff0f8518080808080808080a01908e7f8035023929a2fa13d9f801a42db49a3063a350da55dd94896a3e9be0a80808080a00cfd334f65fc252dbe0bfa903aaef7bb1546db01627d8eacd919c2bce43b6691808080"; + +dyn_async! { + pub async fn run_rpc_compat_test_suite<'a> (test: &'a mut Test, _client: Option) { + // Get all available portal clients + let clients = test.sim.client_types().await; + // todo: remove this once we implement role in hivesim-rs + let clients: Vec = clients.into_iter().filter(|client| client.name != *TRIN_BRIDGE_CLIENT_TYPE).collect(); + + // Test single type of client + for client in &clients { + test.run( + NClientTestSpec { + name: "discv5_nodeInfo".to_string(), + description: "".to_string(), + always_run: false, + run: test_node_info, + environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), STATE_STRING.to_string())]))]), + test_data: None, + clients: vec![client.clone()], + } + ).await; + + test.run( + NClientTestSpec { + name: "portal_stateLocalContent Expect ContentAbsent".to_string(), + description: "".to_string(), + always_run: false, + run: test_local_content_expect_content_absent, + environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), STATE_STRING.to_string())]))]), + test_data: None, + clients: vec![client.clone()], + } + ).await; + + test.run( + NClientTestSpec { + name: "portal_stateStore".to_string(), + description: "".to_string(), + always_run: false, + run: test_store, + environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), STATE_STRING.to_string())]))]), + test_data: None, + clients: vec![client.clone()], + } + ).await; + + test.run( + NClientTestSpec { + name: "portal_stateLocalContent Expect ContentPresent".to_string(), + description: "".to_string(), + always_run: false, + run: test_local_content_expect_content_present, + environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), STATE_STRING.to_string())]))]), + test_data: None, + clients: vec![client.clone()], + } + ).await; + + test.run( + NClientTestSpec { + name: "portal_stateAddEnr Expect true".to_string(), + description: "".to_string(), + always_run: false, + run: test_add_enr_expect_true, + environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), STATE_STRING.to_string())]))]), + test_data: None, + clients: vec![client.clone()], + } + ).await; + + test.run( + NClientTestSpec { + name: "portal_stateGetEnr None Found".to_string(), + description: "".to_string(), + always_run: false, + run: test_get_enr_non_present, + environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), STATE_STRING.to_string())]))]), + test_data: None, + clients: vec![client.clone()], + } + ).await; + + test.run( + NClientTestSpec { + name: "portal_stateGetEnr ENR Found".to_string(), + description: "".to_string(), + always_run: false, + run: test_get_enr_enr_present, + environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), STATE_STRING.to_string())]))]), + test_data: None, + clients: vec![client.clone()], + } + ).await; + + test.run( + NClientTestSpec { + name: "portal_stateGetEnr Local Enr".to_string(), + description: "".to_string(), + always_run: false, + run: test_get_enr_local_enr, + environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), STATE_STRING.to_string())]))]), + test_data: None, + clients: vec![client.clone()], + } + ).await; + + test.run( + NClientTestSpec { + name: "portal_stateDeleteEnr None Found".to_string(), + description: "".to_string(), + always_run: false, + run: test_delete_enr_non_present, + environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), STATE_STRING.to_string())]))]), + test_data: None, + clients: vec![client.clone()], + } + ).await; + + test.run( + NClientTestSpec { + name: "portal_stateDeleteEnr ENR Found".to_string(), + description: "".to_string(), + always_run: false, + run: test_delete_enr_enr_present, + environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), STATE_STRING.to_string())]))]), + test_data: None, + clients: vec![client.clone()], + } + ).await; + + test.run( + NClientTestSpec { + name: "portal_stateLookupEnr None Found".to_string(), + description: "".to_string(), + always_run: false, + run: test_lookup_enr_non_present, + environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), STATE_STRING.to_string())]))]), + test_data: None, + clients: vec![client.clone()], + } + ).await; + + test.run( + NClientTestSpec { + name: "portal_stateLookupEnr ENR Found".to_string(), + description: "".to_string(), + always_run: false, + run: test_lookup_enr_enr_present, + environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), STATE_STRING.to_string())]))]), + test_data: None, + clients: vec![client.clone()], + } + ).await; + + test.run( + NClientTestSpec { + name: "portal_stateLookupEnr Local Enr".to_string(), + description: "".to_string(), + always_run: false, + run: test_lookup_enr_local_enr, + environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), STATE_STRING.to_string())]))]), + test_data: None, + clients: vec![client.clone()], + } + ).await; + + test.run( + NClientTestSpec { + name: "portal_stateRecursiveFindContent Content Absent".to_string(), + description: "".to_string(), + always_run: false, + run: test_recursive_find_content_content_absent, + environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), STATE_STRING.to_string())]))]), + test_data: None, + clients: vec![client.clone()], + } + ).await; + } + } +} + +dyn_async! { + async fn test_node_info<'a>(clients: Vec, _: Option>) { + let client = match clients.into_iter().next() { + Some((client)) => client, + None => { + panic!("Unable to get expected amount of clients from NClientTestSpec"); + } + }; + + let response = Discv5ApiClient::node_info(&client.rpc).await; + + if let Err(err) = response { + panic!("Expected response not received: {err}"); + } + } +} + +dyn_async! { + async fn test_local_content_expect_content_absent<'a>(clients: Vec, _: Option>) { + let client = match clients.into_iter().next() { + Some((client)) => client, + None => { + panic!("Unable to get expected amount of clients from NClientTestSpec"); + } + }; + let content_key = serde_json::from_value(json!(CONTENT_KEY)); + + match content_key { + Ok(content_key) => { + if let Ok(response) = StateNetworkApiClient::local_content(&client.rpc, content_key).await { + panic!("Expected to recieve an error because content wasn't found {response:?}"); + } + } + Err(err) => { + panic!("{}", &err.to_string()); + } + } + } +} + +dyn_async! { + async fn test_store<'a>(clients: Vec, _: Option>) { + let client = match clients.into_iter().next() { + Some((client)) => client, + None => { + panic!("Unable to get expected amount of clients from NClientTestSpec"); + } + }; + let content_key = + serde_json::from_value(json!(CONTENT_KEY)); + + let content_value = + serde_json::from_value(json!(CONTENT_VALUE)); + + match content_key { + Ok(content_key) => { + match content_value { + Ok(content_value) => { + let response = StateNetworkApiClient::store(&client.rpc, content_key, content_value).await; + + if let Err(err) = response { + panic!("{}", &err.to_string()); + } + } + Err(err) => { + panic!("{}", &err.to_string()); + } + } + } + Err(err) => { + panic!("{}", &err.to_string()); + } + } + } +} + +dyn_async! { + async fn test_local_content_expect_content_present<'a>(clients: Vec, _: Option>) { + let client = match clients.into_iter().next() { + Some((client)) => client, + None => { + panic!("Unable to get expected amount of clients from NClientTestSpec"); + } + }; + let content_key: Result = + serde_json::from_value(json!(CONTENT_KEY)); + + let content_value = + serde_json::from_value(json!(CONTENT_VALUE)); + + + match content_key { + Ok(content_key) => { + // seed content_key/content_value onto the local node to test local_content expect content present + match content_value { + Ok(content_value) => { + let response = StateNetworkApiClient::store(&client.rpc, content_key.clone(), content_value).await; + + if let Err(err) = response { + panic!("{}", &err.to_string()); + } + } + Err(err) => { + panic!("{}", &err.to_string()); + } + } + + // Here we are calling local_content RPC to test if the content is present + if let Err(err) = StateNetworkApiClient::local_content(&client.rpc, content_key).await { + panic!("Expected content returned from local_content to be present {}", &err.to_string()); + } + } + Err(err) => { + panic!("{}", &err.to_string()); + } + } + } +} + +dyn_async! { + async fn test_add_enr_expect_true<'a>(clients: Vec, _: Option>) { + let client = match clients.into_iter().next() { + Some((client)) => client, + None => { + panic!("Unable to get expected amount of clients from NClientTestSpec"); + } + }; + let (_, enr) = generate_random_remote_enr(); + match StateNetworkApiClient::add_enr(&client.rpc, enr).await { + Ok(response) => match response { + true => (), + false => panic!("AddEnr expected to get true and instead got false") + }, + Err(err) => panic!("{}", &err.to_string()), + } + } +} + +dyn_async! { + async fn test_get_enr_non_present<'a>(clients: Vec, _: Option>) { + let client = match clients.into_iter().next() { + Some((client)) => client, + None => { + panic!("Unable to get expected amount of clients from NClientTestSpec"); + } + }; + let (_, enr) = generate_random_remote_enr(); + + if (StateNetworkApiClient::get_enr(&client.rpc, enr.node_id()).await).is_ok() { + panic!("GetEnr in this case is not supposed to return a value") + } + } +} + +dyn_async! { + async fn test_get_enr_local_enr<'a>(clients: Vec, _: Option>) { + let client = match clients.into_iter().next() { + Some((client)) => client, + None => { + panic!("Unable to get expected amount of clients from NClientTestSpec"); + } + }; + // get our local enr from NodeInfo + let target_enr = match Discv5ApiClient::node_info(&client.rpc).await { + Ok(node_info) => node_info.enr, + Err(err) => { + panic!("Error getting node info: {err:?}"); + } + }; + + // check if we can fetch data from routing table + match StateNetworkApiClient::get_enr(&client.rpc, target_enr.node_id()).await { + Ok(response) => { + if response != target_enr { + panic!("Response from GetEnr didn't return expected Enr") + } + }, + Err(err) => panic!("{}", &err.to_string()), + } + } +} + +dyn_async! { + async fn test_get_enr_enr_present<'a>(clients: Vec, _: Option>) { + let client = match clients.into_iter().next() { + Some((client)) => client, + None => { + panic!("Unable to get expected amount of clients from NClientTestSpec"); + } + }; + let (_, enr) = generate_random_remote_enr(); + + // seed enr into routing table + match StateNetworkApiClient::add_enr(&client.rpc, enr.clone()).await { + Ok(response) => match response { + true => (), + false => panic!("AddEnr expected to get true and instead got false") + }, + Err(err) => panic!("{}", &err.to_string()), + } + + // check if we can fetch data from routing table + match StateNetworkApiClient::get_enr(&client.rpc, enr.node_id()).await { + Ok(response) => { + if response != enr { + panic!("Response from GetEnr didn't return expected Enr") + } + }, + Err(err) => panic!("{}", &err.to_string()), + } + } +} + +dyn_async! { + async fn test_delete_enr_non_present<'a>(clients: Vec, _: Option>) { + let client = match clients.into_iter().next() { + Some((client)) => client, + None => { + panic!("Unable to get expected amount of clients from NClientTestSpec"); + } + }; + let (_, enr) = generate_random_remote_enr(); + match StateNetworkApiClient::delete_enr(&client.rpc, enr.node_id()).await { + Ok(response) => match response { + true => panic!("DeleteEnr expected to get false and instead got true"), + false => () + }, + Err(err) => panic!("{}", &err.to_string()), + }; + } +} + +dyn_async! { + async fn test_delete_enr_enr_present<'a>(clients: Vec, _: Option>) { + let client = match clients.into_iter().next() { + Some((client)) => client, + None => { + panic!("Unable to get expected amount of clients from NClientTestSpec"); + } + }; + let (_, enr) = generate_random_remote_enr(); + + // seed enr into routing table + match StateNetworkApiClient::add_enr(&client.rpc, enr.clone()).await { + Ok(response) => match response { + true => (), + false => panic!("AddEnr expected to get true and instead got false") + }, + Err(err) => panic!("{}", &err.to_string()), + } + + // check if data was seeded into the table + match StateNetworkApiClient::get_enr(&client.rpc, enr.node_id()).await { + Ok(response) => { + if response != enr { + panic!("Response from GetEnr didn't return expected Enr") + } + }, + Err(err) => panic!("{}", &err.to_string()), + } + + // delete the data from routing table + match StateNetworkApiClient::delete_enr(&client.rpc, enr.node_id()).await { + Ok(response) => match response { + true => (), + false => panic!("DeleteEnr expected to get true and instead got false") + }, + Err(err) => panic!("{}", &err.to_string()), + }; + + // check if the enr was actually deleted out of the table or not + if (StateNetworkApiClient::get_enr(&client.rpc, enr.node_id()).await).is_ok() { + panic!("GetEnr in this case is not supposed to return a value") + } + } +} + +dyn_async! { + async fn test_lookup_enr_non_present<'a>(clients: Vec, _: Option>) { + let client = match clients.into_iter().next() { + Some((client)) => client, + None => { + panic!("Unable to get expected amount of clients from NClientTestSpec"); + } + }; + let (_, enr) = generate_random_remote_enr(); + + if (StateNetworkApiClient::lookup_enr(&client.rpc, enr.node_id()).await).is_ok() { + panic!("LookupEnr in this case is not supposed to return a value") + } + } +} + +dyn_async! { + async fn test_lookup_enr_enr_present<'a>(clients: Vec, _: Option>) { + let client = match clients.into_iter().next() { + Some((client)) => client, + None => { + panic!("Unable to get expected amount of clients from NClientTestSpec"); + } + }; + let (_, enr) = generate_random_remote_enr(); + + // seed enr into routing table + match StateNetworkApiClient::add_enr(&client.rpc, enr.clone()).await { + Ok(response) => match response { + true => (), + false => panic!("AddEnr expected to get true and instead got false") + }, + Err(err) => panic!("{}", &err.to_string()), + } + + // check if we can fetch data from routing table + match StateNetworkApiClient::lookup_enr(&client.rpc, enr.node_id()).await { + Ok(response) => { + if response != enr { + panic!("Response from LookupEnr didn't return expected Enr") + } + }, + Err(err) => panic!("{}", &err.to_string()), + } + } +} + +dyn_async! { + async fn test_lookup_enr_local_enr<'a>(clients: Vec, _: Option>) { + let client = match clients.into_iter().next() { + Some((client)) => client, + None => { + panic!("Unable to get expected amount of clients from NClientTestSpec"); + } + }; + // get our local enr from NodeInfo + let target_enr = match Discv5ApiClient::node_info(&client.rpc).await { + Ok(node_info) => node_info.enr, + Err(err) => { + panic!("Error getting node info: {err:?}"); + } + }; + + // check if we can fetch data from routing table + match StateNetworkApiClient::lookup_enr(&client.rpc, target_enr.node_id()).await { + Ok(response) => { + if response != target_enr { + panic!("Response from LookupEnr didn't return expected Enr") + } + }, + Err(err) => panic!("{}", &err.to_string()), + } + } +} + +dyn_async! { + // test that a node will return a AbsentContent via RecursiveFindContent when the data doesn't exist + async fn test_recursive_find_content_content_absent<'a>(clients: Vec, _: Option>) { + let client = match clients.into_iter().next() { + Some((client)) => client, + None => { + panic!("Unable to get expected amount of clients from NClientTestSpec"); + } + }; + let header_with_proof_key: StateContentKey = serde_json::from_value(json!(CONTENT_KEY)).unwrap(); + + if let Ok(content) = StateNetworkApiClient::recursive_find_content(&client.rpc, header_with_proof_key).await { + panic!("Error: Unexpected RecursiveFindContent expected to not get the content and instead get an error: {content:?}"); + } + } +} From 1f306206e6dea5394116ff6ed6d02017a5e57dc8 Mon Sep 17 00:00:00 2001 From: Kolby Moroz Liebl <31669092+KolbyML@users.noreply.github.com> Date: Mon, 4 Mar 2024 22:00:02 -0700 Subject: [PATCH 197/387] simulators/portal/beacon: add beacon interop test suite (#1023) --- simulators/portal/beacon/Cargo.toml | 2 + simulators/portal/beacon/Dockerfile | 1 + simulators/portal/beacon/src/main.rs | 20 +- .../portal/beacon/src/suites/constants.rs | 1 + .../portal/beacon/src/suites/interop.rs | 574 ++++++++++++++++++ simulators/portal/beacon/src/suites/mod.rs | 1 + 6 files changed, 598 insertions(+), 1 deletion(-) create mode 100644 simulators/portal/beacon/src/suites/interop.rs diff --git a/simulators/portal/beacon/Cargo.toml b/simulators/portal/beacon/Cargo.toml index 5690e3a017..fc2094145a 100755 --- a/simulators/portal/beacon/Cargo.toml +++ b/simulators/portal/beacon/Cargo.toml @@ -8,6 +8,8 @@ edition = "2021" ethportal-api = { git = "https://github.com/ethereum/trin", tag = "v0.1.0-alpha.22" } hivesim = { git = "https://github.com/ethereum/portal-hive", rev = "8ff1e3d3c941dd00d56dacd777a5dfb71edf402f" } futures = "0.3.25" +itertools = "0.10.5" +serde_yaml = "0.9" serde_json = "1.0.87" tracing = "0.1.37" tracing-subscriber = "0.3.16" diff --git a/simulators/portal/beacon/Dockerfile b/simulators/portal/beacon/Dockerfile index 38367b6055..e5822e4e28 100644 --- a/simulators/portal/beacon/Dockerfile +++ b/simulators/portal/beacon/Dockerfile @@ -21,6 +21,7 @@ RUN apt update && apt install wget -y # copy build artifacts from build stage COPY --from=builder /beacon/target/release/beacon . +ADD https://raw.githubusercontent.com/ethereum/portal-spec-tests/master/tests/mainnet/beacon_chain/hive/test_data.yaml ./test-data/test_data.yaml ENV RUST_LOG=debug diff --git a/simulators/portal/beacon/src/main.rs b/simulators/portal/beacon/src/main.rs index c1a346fe2e..a7f851dde6 100644 --- a/simulators/portal/beacon/src/main.rs +++ b/simulators/portal/beacon/src/main.rs @@ -1,6 +1,7 @@ mod suites; use hivesim::{Simulation, Suite, TestSpec}; +use suites::interop::test_portal_interop; use suites::rpc_compat::run_rpc_compat_test_suite; #[tokio::main] @@ -23,8 +24,25 @@ async fn main() { client: None, }); + let mut interop = Suite { + name: "beacon-interop".to_string(), + description: + "The interop test suite runs a set of scenarios to test interoperability between + portal network clients" + .to_string(), + tests: vec![], + }; + + interop.add(TestSpec { + name: "client launch".to_string(), + description: "This test launches the client and collects its logs.".to_string(), + always_run: false, + run: test_portal_interop, + client: None, + }); + let sim = Simulation::new(); - run_suite(sim, vec![beacon_rpc_compat]).await; + run_suite(sim, vec![beacon_rpc_compat, interop]).await; } async fn run_suite(host: Simulation, suites: Vec) { diff --git a/simulators/portal/beacon/src/suites/constants.rs b/simulators/portal/beacon/src/suites/constants.rs index 1ae0093185..b219c0e19d 100644 --- a/simulators/portal/beacon/src/suites/constants.rs +++ b/simulators/portal/beacon/src/suites/constants.rs @@ -1,3 +1,4 @@ +pub const TEST_DATA_FILE_PATH: &str = "./test-data/test_data.yaml"; pub const HIVE_PORTAL_NETWORKS_SELECTED: &str = "HIVE_PORTAL_NETWORKS_SELECTED"; pub const BEACON_STRING: &str = "beacon"; diff --git a/simulators/portal/beacon/src/suites/interop.rs b/simulators/portal/beacon/src/suites/interop.rs new file mode 100644 index 0000000000..37d4b831cf --- /dev/null +++ b/simulators/portal/beacon/src/suites/interop.rs @@ -0,0 +1,574 @@ +use crate::suites::constants::{ + BEACON_STRING, HIVE_PORTAL_NETWORKS_SELECTED, TEST_DATA_FILE_PATH, TRIN_BRIDGE_CLIENT_TYPE, +}; +use ethportal_api::types::beacon::ContentInfo; +use ethportal_api::utils::bytes::hex_encode; +use ethportal_api::{ + BeaconContentKey, BeaconContentValue, BeaconNetworkApiClient, ContentValue, Discv5ApiClient, + OverlayContentKey, +}; +use hivesim::types::ClientDefinition; +use hivesim::{dyn_async, Client, NClientTestSpec, Test}; +use itertools::Itertools; +use serde_json::json; +use serde_yaml::Value; +use std::collections::HashMap; +use tokio::time::Duration; + +// This is taken from Trin. It should be fairly standard +const MAX_PORTAL_CONTENT_PAYLOAD_SIZE: usize = 1165; +const BOOTSTRAP_KEY: &str = "0x10bd9f42d9a42d972bdaf4dee84e5b419dd432b52867258acb7bcc7f567b6e3af1"; + +fn content_pair_to_string_pair( + content_pair: (BeaconContentKey, BeaconContentValue), +) -> (String, String) { + let (content_key, content_value) = content_pair; + (content_key.to_hex(), hex_encode(content_value.encode())) +} + +/// Processed content data for beacon tests +struct ProcessedContent { + content_type: String, + identifier: String, + test_data: Vec<(String, String)>, +} + +fn process_content(content: Vec<(BeaconContentKey, BeaconContentValue)>) -> Vec { + let mut result: Vec = vec![]; + for beacon_content in content.into_iter() { + let (content_type, identifier, test_data) = match &beacon_content.0 { + BeaconContentKey::LightClientBootstrap(bootstrap) => ( + "Bootstrap".to_string(), + hex_encode(bootstrap.block_hash), + vec![content_pair_to_string_pair(beacon_content)], + ), + BeaconContentKey::LightClientUpdatesByRange(updates_by_range) => ( + "Updates by Range".to_string(), + format!( + "start period: {} count: {}", + updates_by_range.start_period, updates_by_range.count + ), + vec![content_pair_to_string_pair(beacon_content)], + ), + BeaconContentKey::LightClientFinalityUpdate(finality_update) => ( + "Finality Update".to_string(), + format!("finalized slot: {}", finality_update.finalized_slot), + vec![content_pair_to_string_pair(beacon_content)], + ), + BeaconContentKey::LightClientOptimisticUpdate(optimistic_update) => ( + "Optimistic Update".to_string(), + format!("finalized slot: {}", optimistic_update.signature_slot), + vec![content_pair_to_string_pair(beacon_content)], + ), + }; + result.push(ProcessedContent { + content_type, + identifier, + test_data, + }) + } + result +} + +dyn_async! { + pub async fn test_portal_interop<'a> (test: &'a mut Test, _client: Option) { + // Get all available portal clients + let clients = test.sim.client_types().await; + // todo: remove this once we implement role in hivesim-rs + let clients: Vec = clients.into_iter().filter(|client| client.name != *TRIN_BRIDGE_CLIENT_TYPE).collect(); + + let values = std::fs::read_to_string(TEST_DATA_FILE_PATH) + .expect("cannot find test asset"); + let values: Value = serde_yaml::from_str(&values).unwrap(); + let content: Vec<(BeaconContentKey, BeaconContentValue)> = values.as_sequence().unwrap().iter().map(|value| { + let content_key: BeaconContentKey = + serde_yaml::from_value(value.get("content_key").unwrap().clone()).unwrap(); + let content_value: BeaconContentValue = + serde_yaml::from_value(value.get("content_value").unwrap().clone()).unwrap(); + (content_key, content_value) + }).collect(); + + // Iterate over all possible pairings of clients and run the tests (including self-pairings) + for (client_a, client_b) in clients.iter().cartesian_product(clients.iter()) { + for ProcessedContent { content_type, identifier, test_data } in process_content(content.clone()) { + test.run( + NClientTestSpec { + name: format!("OFFER {}: {} {} --> {}", content_type, identifier, client_a.name, client_b.name), + description: "".to_string(), + always_run: false, + run: test_offer, + environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), BEACON_STRING.to_string())])), Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), BEACON_STRING.to_string())]))]), + test_data: Some(test_data.clone()), + clients: vec![client_a.clone(), client_b.clone()], + } + ).await; + + test.run( + NClientTestSpec { + name: format!("RecursiveFindContent {}: {} {} --> {}", content_type, identifier, client_a.name, client_b.name), + description: "".to_string(), + always_run: false, + run: test_recursive_find_content, + environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), BEACON_STRING.to_string())])), Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), BEACON_STRING.to_string())]))]), + test_data: Some(test_data.clone()), + clients: vec![client_a.clone(), client_b.clone()], + } + ).await; + + test.run( + NClientTestSpec { + name: format!("FindContent {}: {} {} --> {}", content_type, identifier, client_a.name, client_b.name), + description: "".to_string(), + always_run: false, + run: test_find_content, + environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), BEACON_STRING.to_string())])), Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), BEACON_STRING.to_string())]))]), + test_data: Some(test_data), + clients: vec![client_a.clone(), client_b.clone()], + } + ).await; + } + + // Test portal beacon ping + test.run(NClientTestSpec { + name: format!("PING {} --> {}", client_a.name, client_b.name), + description: "".to_string(), + always_run: false, + run: test_ping, + environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), BEACON_STRING.to_string())])), Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), BEACON_STRING.to_string())]))]), + test_data: None, + clients: vec![client_a.clone(), client_b.clone()], + } + ).await; + + // Test find content non-present + test.run(NClientTestSpec { + name: format!("FIND_CONTENT non present {} --> {}", client_a.name, client_b.name), + description: "find content: calls find content that doesn't exist".to_string(), + always_run: false, + run: test_find_content_non_present, + environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), BEACON_STRING.to_string())])), Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), BEACON_STRING.to_string())]))]), + test_data: None, + clients: vec![client_a.clone(), client_b.clone()], + } + ).await; + + // Test find nodes distance zero + test.run(NClientTestSpec { + name: format!("FIND_NODES Distance 0 {} --> {}", client_a.name, client_b.name), + description: "find nodes: distance zero expect called nodes enr".to_string(), + always_run: false, + run: test_find_nodes_zero_distance, + environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), BEACON_STRING.to_string())])), Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), BEACON_STRING.to_string())]))]), + test_data: None, + clients: vec![client_a.clone(), client_b.clone()], + } + ).await; + + // Test gossiping a collection of blocks to node B (B will gossip back to A) + test.run( + NClientTestSpec { + name: format!("GOSSIP blocks from A:{} --> B:{}", client_a.name, client_b.name), + description: "".to_string(), + always_run: false, + run: test_gossip_two_nodes, + environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), BEACON_STRING.to_string())])), Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), BEACON_STRING.to_string())]))]), + test_data: Some(content.clone().into_iter().map(content_pair_to_string_pair).collect()), + clients: vec![client_a.clone(), client_b.clone()], + } + ).await; + } + } +} + +dyn_async! { + // test that a node will not return content via FINDCONTENT. + async fn test_find_content_non_present<'a>(clients: Vec, _: Option>) { + let (client_a, client_b) = match clients.iter().collect_tuple() { + Some((client_a, client_b)) => (client_a, client_b), + None => { + panic!("Unable to get expected amount of clients from NClientTestSpec"); + } + }; + let header_with_proof_key: BeaconContentKey = serde_json::from_value(json!(BOOTSTRAP_KEY)).unwrap(); + + let target_enr = match client_b.rpc.node_info().await { + Ok(node_info) => node_info.enr, + Err(err) => { + panic!("Error getting node info: {err:?}"); + } + }; + + let result = client_a.rpc.find_content(target_enr, header_with_proof_key.clone()).await; + + match result { + Ok(result) => { + match result { + ContentInfo::Enrs{ enrs: val } => { + if !val.is_empty() { + panic!("Error: Unexpected FINDCONTENT response: expected ContentInfo::Enrs length 0 got {}", val.len()); + } + }, + ContentInfo::Content{ content: _, .. } => { + panic!("Error: Unexpected FINDCONTENT response: wasn't supposed to return back content"); + }, + other => { + panic!("Error: Unexpected FINDCONTENT response: {other:?}"); + } + } + }, + Err(err) => { + panic!("Error: Unable to get response from FINDCONTENT request: {err:?}"); + } + } + } +} + +dyn_async! { + async fn test_offer<'a>(clients: Vec, test_data: Option>) { + let (client_a, client_b) = match clients.iter().collect_tuple() { + Some((client_a, client_b)) => (client_a, client_b), + None => { + panic!("Unable to get expected amount of clients from NClientTestSpec"); + } + }; + let test_data = match test_data { + Some(test_data) => test_data, + None => panic!("Expected test data non was provided"), + }; + let (target_key, target_value) = test_data.first().expect("Target content is required for this test"); + let target_key: BeaconContentKey = + serde_json::from_value(json!(target_key)).unwrap(); + let target_value: BeaconContentValue = + serde_json::from_value(json!(target_value)).unwrap(); + match client_b.rpc.store(target_key.clone(), target_value.clone()).await { + Ok(result) => if !result { + panic!("Error storing target content for recursive find content"); + }, + Err(err) => { + panic!("Error storing target content: {err:?}"); + } + } + + let target_enr = match client_b.rpc.node_info().await { + Ok(node_info) => node_info.enr, + Err(err) => { + panic!("Error getting node info: {err:?}"); + } + }; + + let _ = client_a.rpc.offer(target_enr, target_key.clone(), Some(target_value.clone())).await; + + tokio::time::sleep(Duration::from_secs(8)).await; + + match client_b.rpc.local_content(target_key).await { + Ok(possible_content) => { + if possible_content != target_value { + panic!("Error receiving content: Expected content: {target_value:?}, Received content: {possible_content:?}"); + } + } + Err(err) => { + panic!("Unable to get received content: {err:?}"); + } + } + } +} + +dyn_async! { + async fn test_ping<'a>(clients: Vec, _: Option>) { + let (client_a, client_b) = match clients.iter().collect_tuple() { + Some((client_a, client_b)) => (client_a, client_b), + None => { + panic!("Unable to get expected amount of clients from NClientTestSpec"); + } + }; + let target_enr = match client_b.rpc.node_info().await { + Ok(node_info) => node_info.enr, + Err(err) => { + panic!("Error getting node info: {err:?}"); + } + }; + + let pong = client_a.rpc.ping(target_enr).await; + + if let Err(err) = pong { + panic!("Unable to receive pong info: {err:?}"); + } + + // Verify that client_b stored client_a its ENR through the base layer + // handshake mechanism. + let stored_enr = match client_a.rpc.node_info().await { + Ok(node_info) => node_info.enr, + Err(err) => { + panic!("Error getting node info: {err:?}"); + } + }; + + match BeaconNetworkApiClient::get_enr(&client_b.rpc, stored_enr.node_id()).await { + Ok(response) => { + if response != stored_enr { + panic!("Response from GetEnr didn't return expected ENR. Got: {response}; Expected: {stored_enr}") + } + }, + Err(err) => panic!("Failed while trying to get client A's ENR from client B: {err}"), + } + } +} + +dyn_async! { + async fn test_find_nodes_zero_distance<'a>(clients: Vec, _: Option>) { + let (client_a, client_b) = match clients.iter().collect_tuple() { + Some((client_a, client_b)) => (client_a, client_b), + None => { + panic!("Unable to get expected amount of clients from NClientTestSpec"); + } + }; + let target_enr = match client_b.rpc.node_info().await { + Ok(node_info) => node_info.enr, + Err(err) => { + panic!("Error getting node info: {err:?}"); + } + }; + + match client_a.rpc.find_nodes(target_enr.clone(), vec![0]).await { + Ok(response) => { + if response.len() != 1 { + panic!("Response from FindNodes didn't return expected length of 1"); + } + + match response.first() { + Some(response_enr) => { + if *response_enr != target_enr { + panic!("Response from FindNodes didn't return expected Enr"); + } + }, + None => panic!("Error find nodes zero distance wasn't supposed to return None"), + } + } + Err(err) => panic!("{}", &err.to_string()), + } + } +} + +dyn_async! { + // test that a node will return a content via RECURSIVEFINDCONTENT template that it has stored locally + async fn test_recursive_find_content<'a>(clients: Vec, test_data: Option>) { + let (client_a, client_b) = match clients.iter().collect_tuple() { + Some((client_a, client_b)) => (client_a, client_b), + None => { + panic!("Unable to get expected amount of clients from NClientTestSpec"); + } + }; + let test_data = match test_data { + Some(test_data) => test_data, + None => panic!("Expected test data non was provided"), + }; + + let (target_key, target_value) = test_data.first().expect("Target content is required for this test"); + let target_key: BeaconContentKey = + serde_json::from_value(json!(target_key)).unwrap(); + let target_value: BeaconContentValue = + serde_json::from_value(json!(target_value)).unwrap(); + match client_b.rpc.store(target_key.clone(), target_value.clone()).await { + Ok(result) => if !result { + panic!("Error storing target content for recursive find content"); + }, + Err(err) => { + panic!("Error storing target content: {err:?}"); + } + } + + let target_enr = match client_b.rpc.node_info().await { + Ok(node_info) => node_info.enr, + Err(err) => { + panic!("Error getting node info: {err:?}"); + } + }; + + match BeaconNetworkApiClient::add_enr(&client_a.rpc, target_enr.clone()).await { + Ok(response) => match response { + true => (), + false => panic!("AddEnr expected to get true and instead got false") + }, + Err(err) => panic!("{}", &err.to_string()), + } + + match client_a.rpc.recursive_find_content(target_key.clone()).await { + Ok(result) => { + match result { + ContentInfo::Content{ content, utp_transfer } => { + if content != target_value { + panic!("Error: Unexpected RECURSIVEFINDCONTENT response: didn't return expected target content"); + } + + if target_value.encode().len() < MAX_PORTAL_CONTENT_PAYLOAD_SIZE { + if utp_transfer { + panic!("Error: Unexpected RECURSIVEFINDCONTENT response: utp_transfer was supposed to be false"); + } + } else if !utp_transfer { + panic!("Error: Unexpected RECURSIVEFINDCONTENT response: utp_transfer was supposed to be true"); + } + }, + other => { + panic!("Error: Unexpected RECURSIVEFINDCONTENT response: {other:?}"); + } + } + }, + Err(err) => { + panic!("Error: Unable to get response from RECURSIVEFINDCONTENT request: {err:?}"); + } + } + } +} + +dyn_async! { + // test that a node will return a x content via FINDCONTENT that it has stored locally + async fn test_find_content<'a> (clients: Vec, test_data: Option>) { + let (client_a, client_b) = match clients.iter().collect_tuple() { + Some((client_a, client_b)) => (client_a, client_b), + None => { + panic!("Unable to get expected amount of clients from NClientTestSpec"); + } + }; + let test_data = match test_data { + Some(test_data) => test_data, + None => panic!("Expected test data none was provided"), + }; + let (target_key, target_value) = test_data.first().expect("Target content is required for this test"); + let target_key: BeaconContentKey = + serde_json::from_value(json!(target_key)).unwrap(); + let target_value: BeaconContentValue = + serde_json::from_value(json!(target_value)).unwrap(); + match client_b.rpc.store(target_key.clone(), target_value.clone()).await { + Ok(result) => if !result { + panic!("Error storing target content for find content"); + }, + Err(err) => { + panic!("Error storing target content: {err:?}"); + } + } + + let target_enr = match client_b.rpc.node_info().await { + Ok(node_info) => node_info.enr, + Err(err) => { + panic!("Error getting node info: {err:?}"); + } + }; + + match client_a.rpc.find_content(target_enr, target_key.clone()).await { + Ok(result) => { + match result { + ContentInfo::Content{ content, utp_transfer } => { + if content != target_value { + panic!("Error: Unexpected FINDCONTENT response: didn't return expected block body"); + } + + if target_value.encode().len() < MAX_PORTAL_CONTENT_PAYLOAD_SIZE { + if utp_transfer { + panic!("Error: Unexpected FINDCONTENT response: utp_transfer was supposed to be false"); + } + } else if !utp_transfer { + panic!("Error: Unexpected FINDCONTENT response: utp_transfer was supposed to be true"); + } + }, + other => { + panic!("Error: Unexpected FINDCONTENT response: {other:?}"); + } + } + }, + Err(err) => { + panic!("Error: Unable to get response from FINDCONTENT request: {err:?}"); + } + } + } +} + +dyn_async! { + async fn test_gossip_two_nodes<'a> (clients: Vec, test_data: Option>) { + let (client_a, client_b) = match clients.iter().collect_tuple() { + Some((client_a, client_b)) => (client_a, client_b), + None => { + panic!("Unable to get expected amount of clients from NClientTestSpec"); + } + }; + let test_data = match test_data { + Some(test_data) => test_data, + None => panic!("Expected test data non was provided"), + }; + // connect clients + let client_b_enr = match client_b.rpc.node_info().await { + Ok(node_info) => node_info.enr, + Err(err) => { + panic!("Error getting node info: {err:?}"); + } + }; + match BeaconNetworkApiClient::add_enr(&client_a.rpc, client_b_enr.clone()).await { + Ok(response) => match response { + true => (), + false => panic!("AddEnr expected to get true and instead got false") + }, + Err(err) => panic!("{}", &err.to_string()), + } + + // With default node settings nodes should be storing all content + for (content_key, content_value) in test_data.clone() { + let content_key: BeaconContentKey = + serde_json::from_value(json!(content_key)).unwrap(); + let content_value: BeaconContentValue = + serde_json::from_value(json!(content_value)).unwrap(); + + match client_a.rpc.gossip(content_key.clone(), content_value.clone()).await { + Ok(nodes_gossiped_to) => { + if nodes_gossiped_to != 1 { + panic!("We expected to gossip to 1 node instead we gossiped to: {nodes_gossiped_to}"); + } + } + Err(err) => { + panic!("Unable to get received content: {err:?}"); + } + } + + tokio::time::sleep(Duration::from_secs(1)).await; + } + + // wait test_data.len() seconds for data to propagate, giving more time if more items are propagating + tokio::time::sleep(Duration::from_secs(test_data.len() as u64)).await; + + // process raw test data to generate content details for error output + let mut result = vec![]; + for (content_key, content_value) in test_data.into_iter() { + let content_key: BeaconContentKey = + serde_json::from_value(json!(content_key)).unwrap(); + let content_value: BeaconContentValue = + serde_json::from_value(json!(content_value)).unwrap(); + + let content_details = { + let content_type = match &content_key { + BeaconContentKey::LightClientBootstrap(_) => "bootstrap".to_string(), + BeaconContentKey::LightClientUpdatesByRange(_) => "updates by range".to_string(), + BeaconContentKey::LightClientFinalityUpdate(_) => "finality update".to_string(), + BeaconContentKey::LightClientOptimisticUpdate(_) => "optimistic update".to_string(), + }; + format!( + "{:?} {}", + content_key, + content_type + ) + }; + + match client_b.rpc.local_content(content_key.clone()).await { + Ok(expected_value) => { + if expected_value != content_value { + result.push(format!("Error content received for block {content_details} was different then expected")); + } + } + Err(err) => { + result.push(format!("Error content for block {err} was absent")); + } + } + } + + if !result.is_empty() { + panic!("Client B: {:?}", result); + } + } +} diff --git a/simulators/portal/beacon/src/suites/mod.rs b/simulators/portal/beacon/src/suites/mod.rs index 7e92c503f8..02a4b0c6d1 100644 --- a/simulators/portal/beacon/src/suites/mod.rs +++ b/simulators/portal/beacon/src/suites/mod.rs @@ -1,2 +1,3 @@ pub mod constants; +pub mod interop; pub mod rpc_compat; From 91f6043a86e073c789dfbf9ba590977a1b617835 Mon Sep 17 00:00:00 2001 From: Mario Vega Date: Sat, 21 Oct 2023 19:14:05 +0000 Subject: [PATCH 198/387] configs/cancun: Use ethpandaops branches --- configs/cancun.yaml | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/configs/cancun.yaml b/configs/cancun.yaml index 9b8fea123a..7a063f3c83 100644 --- a/configs/cancun.yaml +++ b/configs/cancun.yaml @@ -37,7 +37,15 @@ tag: main - client: teku-bn + nametag: deneb + build_args: + baseimage: ethpandaops/teku + tag: master - client: teku-vc + nametag: deneb + build_args: + baseimage: ethpandaops/teku + tag: master - client: prysm-bn nametag: deneb @@ -53,24 +61,24 @@ - client: lighthouse-bn nametag: deneb build_args: - baseimage: sigp/lighthouse - tag: deneb-modern + baseimage: ethpandaops/lighthouse + tag: unstable-linux-amd64 - client: lighthouse-vc nametag: deneb build_args: - baseimage: sigp/lighthouse - tag: deneb-modern + baseimage: ethpandaops/lighthouse + tag: unstable-linux-amd64 - client: lodestar-bn nametag: deneb build_args: baseimage: ethpandaops/lodestar - tag: deneb-builder + tag: unstable-linux-amd64 - client: lodestar-vc nametag: deneb build_args: baseimage: ethpandaops/lodestar - tag: deneb-builder + tag: unstable-linux-amd64 - client: nimbus-bn - client: nimbus-vc From fe9e0108826e6a7353cf5ed155fa5707c1e4264e Mon Sep 17 00:00:00 2001 From: Mario Vega Date: Tue, 27 Feb 2024 21:55:07 +0000 Subject: [PATCH 199/387] simulators/eth2/common: Deneb, add blobber, refactor --- .../eth2/common/chain_generators/pow/pow.go | 89 --- simulators/eth2/common/clients/hive.go | 18 + simulators/eth2/common/config/config.go | 54 ++ .../config/consensus/consensus_config.go | 158 ++++- .../eth2/common/config/consensus/genesis.go | 372 ----------- .../consensus/genesis/bellatrix/state.go | 101 +++ .../config/consensus/genesis/capella/state.go | 114 ++++ .../config/consensus/genesis/deneb/state.go | 129 ++++ .../config/consensus/genesis/genesis.go | 140 +++++ .../consensus/genesis/interfaces/state.go | 15 + .../common/config/consensus/validator_keys.go | 216 ++++--- .../config/execution/execution_config.go | 185 ++++-- .../config/execution/execution_config_test.go | 69 +++ simulators/eth2/common/debug/debug.go | 4 +- simulators/eth2/common/go.mod | 153 ++++- simulators/eth2/common/go.sum | 585 +++++++++++++++--- .../spoofing/beacon/beacon_verification.go | 4 + simulators/eth2/common/testnet/config.go | 61 +- simulators/eth2/common/testnet/environment.go | 4 +- .../eth2/common/testnet/prepared_testnet.go | 338 +++++----- .../eth2/common/testnet/running_testnet.go | 321 +++++++++- .../eth2/common/testnet/verification.go | 244 +++++++- simulators/eth2/common/utils/beacon_cache.go | 92 +++ simulators/eth2/common/utils/description.go | 75 +++ simulators/eth2/common/utils/tx_spammer.go | 67 ++ simulators/eth2/common/utils/validators.go | 528 ++++++++++++++++ .../eth2/common/utils/validators_test.go | 77 +++ 27 files changed, 3274 insertions(+), 939 deletions(-) delete mode 100644 simulators/eth2/common/chain_generators/pow/pow.go delete mode 100644 simulators/eth2/common/config/consensus/genesis.go create mode 100644 simulators/eth2/common/config/consensus/genesis/bellatrix/state.go create mode 100644 simulators/eth2/common/config/consensus/genesis/capella/state.go create mode 100644 simulators/eth2/common/config/consensus/genesis/deneb/state.go create mode 100644 simulators/eth2/common/config/consensus/genesis/genesis.go create mode 100644 simulators/eth2/common/config/consensus/genesis/interfaces/state.go create mode 100644 simulators/eth2/common/config/execution/execution_config_test.go create mode 100644 simulators/eth2/common/utils/beacon_cache.go create mode 100644 simulators/eth2/common/utils/description.go create mode 100644 simulators/eth2/common/utils/tx_spammer.go create mode 100644 simulators/eth2/common/utils/validators.go create mode 100644 simulators/eth2/common/utils/validators_test.go diff --git a/simulators/eth2/common/chain_generators/pow/pow.go b/simulators/eth2/common/chain_generators/pow/pow.go deleted file mode 100644 index d167d4d28f..0000000000 --- a/simulators/eth2/common/chain_generators/pow/pow.go +++ /dev/null @@ -1,89 +0,0 @@ -package pow - -import ( - "github.com/ethereum/go-ethereum/consensus" - "github.com/ethereum/go-ethereum/consensus/ethash" - "github.com/ethereum/go-ethereum/core" - "github.com/ethereum/go-ethereum/core/state" - "github.com/ethereum/go-ethereum/core/types" - execution_config "github.com/ethereum/hive/simulators/eth2/common/config/execution" -) - -var Defaults = ethash.Config{ - PowMode: ethash.ModeNormal, - CachesInMem: 2, - DatasetsOnDisk: 2, - DatasetDir: "/ethash", -} - -type ChainGenerator struct { - BlockCount int - ethash.Config - GenFunction func(int, *core.BlockGen) - blocks []*types.Block -} - -// instaSeal wraps a consensus engine with instant block sealing. When a block is produced -// using FinalizeAndAssemble, it also applies Seal. -type instaSeal struct{ consensus.Engine } - -// FinalizeAndAssemble implements consensus.Engine, accumulating the block and uncle rewards, -// setting the final state and assembling the block. -func (e instaSeal) FinalizeAndAssemble( - chain consensus.ChainHeaderReader, - header *types.Header, - state *state.StateDB, - txs []*types.Transaction, - uncles []*types.Header, - receipts []*types.Receipt, - withdrawals []*types.Withdrawal, -) (*types.Block, error) { - block, err := e.Engine.FinalizeAndAssemble( - chain, - header, - state, - txs, - uncles, - receipts, - withdrawals, - ) - if err != nil { - return nil, err - } - sealedBlock := make(chan *types.Block, 1) - if err = e.Engine.Seal(nil, block, sealedBlock, nil); err != nil { - return nil, err - } - return <-sealedBlock, nil -} - -func (p *ChainGenerator) Generate( - genesis *execution_config.ExecutionGenesis, -) ([]*types.Block, error) { - // We generate a new chain only if the generator had not generated one already. - // This is done because the chain generators can be reused on different clients to ensure - // they start with the same chain. - if p.blocks != nil { - return p.blocks, nil - } - engine := ethash.New(p.Config, nil, false) - insta := instaSeal{engine} - _, p.blocks, _ = core.GenerateChainWithGenesis( - genesis.Genesis, - insta, - p.BlockCount, - p.GenFunction, - ) - return p.blocks, nil -} - -func (p *ChainGenerator) Blocks() []*types.Block { - return p.blocks -} - -func (p *ChainGenerator) Head() *types.Block { - if p.blocks == nil || len(p.blocks) == 0 { - return nil - } - return p.blocks[len(p.blocks)-1] -} diff --git a/simulators/eth2/common/clients/hive.go b/simulators/eth2/common/clients/hive.go index 2df4348826..97f304feb0 100644 --- a/simulators/eth2/common/clients/hive.go +++ b/simulators/eth2/common/clients/hive.go @@ -16,6 +16,7 @@ type HiveManagedClient struct { T *hivesim.T OptionsGenerator HiveOptionsGenerator HiveClientDefinition *hivesim.ClientDefinition + Port int64 hiveClient *hivesim.Client extraStartOptions []hivesim.StartOption @@ -63,6 +64,16 @@ func (h *HiveManagedClient) AddStartOption(opts ...interface{}) { } } +func (h *HiveManagedClient) GetAddress() string { + if h.hiveClient == nil { + return "" + } + if h.Port > 0 { + return fmt.Sprintf("http://%s:%d", h.hiveClient.IP, h.Port) + } + return fmt.Sprintf("http://%s", h.hiveClient.IP) +} + func (h *HiveManagedClient) GetIP() net.IP { if h.hiveClient == nil { return net.IP{} @@ -70,6 +81,13 @@ func (h *HiveManagedClient) GetIP() net.IP { return h.hiveClient.IP } +func (h *HiveManagedClient) GetHost() string { + if h.hiveClient == nil { + return "" + } + return h.hiveClient.IP.String() +} + func (h *HiveManagedClient) Shutdown() error { if err := h.T.Sim.StopClient(h.T.SuiteID, h.T.TestID, h.hiveClient.Container); err != nil { return err diff --git a/simulators/eth2/common/config/config.go b/simulators/eth2/common/config/config.go index af9db03cf8..ed71f910ee 100644 --- a/simulators/eth2/common/config/config.go +++ b/simulators/eth2/common/config/config.go @@ -3,8 +3,62 @@ package config import ( "bytes" "io" + "math/big" ) +type ForkConfig struct { + TerminalTotalDifficulty *big.Int `json:"terminal_total_difficulty,omitempty"` + AltairForkEpoch *big.Int `json:"altair_fork_epoch,omitempty"` + BellatrixForkEpoch *big.Int `json:"bellatrix_fork_epoch,omitempty"` + CapellaForkEpoch *big.Int `json:"capella_fork_epoch,omitempty"` + DenebForkEpoch *big.Int `json:"deneb_fork_epoch,omitempty"` +} + +// Choose a configuration value. `b` takes precedence +func choose(a, b *big.Int) *big.Int { + if b != nil { + return new(big.Int).Set(b) + } + if a != nil { + return new(big.Int).Set(a) + } + return nil +} + +// Join two configurations. `b` takes precedence +func (a *ForkConfig) Join(b *ForkConfig) *ForkConfig { + if b == nil { + return a + } + if a == nil { + return b + } + c := ForkConfig{} + c.AltairForkEpoch = choose(a.AltairForkEpoch, b.AltairForkEpoch) + c.BellatrixForkEpoch = choose(a.BellatrixForkEpoch, b.BellatrixForkEpoch) + c.CapellaForkEpoch = choose(a.CapellaForkEpoch, b.CapellaForkEpoch) + c.DenebForkEpoch = choose(a.DenebForkEpoch, b.DenebForkEpoch) + c.TerminalTotalDifficulty = choose( + a.TerminalTotalDifficulty, + b.TerminalTotalDifficulty, + ) + return &c +} + +func (c *ForkConfig) GenesisBeaconFork() string { + if c.DenebForkEpoch != nil && c.DenebForkEpoch.Uint64() == 0 { + return "deneb" + } else if c.CapellaForkEpoch != nil && c.CapellaForkEpoch.Uint64() == 0 { + return "capella" + } else if c.BellatrixForkEpoch != nil && c.BellatrixForkEpoch.Uint64() == 0 { + return "bellatrix" + } else if c.AltairForkEpoch != nil && c.AltairForkEpoch.Uint64() == 0 { + return "altair" + } else { + return "phase0" + } +} + func BytesSource(data []byte) func() (io.ReadCloser, error) { return func() (io.ReadCloser, error) { return io.NopCloser(bytes.NewReader(data)), nil diff --git a/simulators/eth2/common/config/consensus/consensus_config.go b/simulators/eth2/common/config/consensus/consensus_config.go index 46b14d3297..6e22f2e8b5 100644 --- a/simulators/eth2/common/config/consensus/consensus_config.go +++ b/simulators/eth2/common/config/consensus/consensus_config.go @@ -3,15 +3,61 @@ package consensus_config import ( "bytes" "fmt" + "math/big" - "github.com/ethereum/go-ethereum/core" + el_common "github.com/ethereum/go-ethereum/common" "github.com/ethereum/hive/hivesim" "github.com/ethereum/hive/simulators/eth2/common/config" + execution_config "github.com/ethereum/hive/simulators/eth2/common/config/execution" + "github.com/holiman/uint256" "github.com/protolambda/zrnt/eth2/beacon/common" "github.com/protolambda/ztyp/codec" + "github.com/protolambda/ztyp/tree" + "github.com/protolambda/ztyp/view" "gopkg.in/yaml.v2" ) +type ConsensusConfig struct { + ValidatorCount *big.Int `json:"validator_count,omitempty"` + KeyTranches *big.Int `json:"key_tranches,omitempty"` + SlotsPerEpoch *big.Int `json:"slots_per_epoch,omitempty"` + SlotTime *big.Int `json:"slot_time,omitempty"` + SafeSlotsToImportOptimistically *big.Int `json:"safe_slots_to_import_optimistically,omitempty"` + ExtraShares *big.Int `json:"extra_shares,omitempty"` +} + +// Choose a configuration value. `b` takes precedence +func choose(a, b *big.Int) *big.Int { + if b != nil { + return new(big.Int).Set(b) + } + if a != nil { + return new(big.Int).Set(a) + } + return nil +} + +// Join two configurations. `b` takes precedence +func (a *ConsensusConfig) Join(b *ConsensusConfig) *ConsensusConfig { + if b == nil { + return a + } + if a == nil { + return b + } + c := ConsensusConfig{} + c.ValidatorCount = choose(a.ValidatorCount, b.ValidatorCount) + c.KeyTranches = choose(a.KeyTranches, b.KeyTranches) + c.SlotsPerEpoch = choose(a.SlotsPerEpoch, b.SlotsPerEpoch) + c.SlotTime = choose(a.SlotTime, b.SlotTime) + c.SafeSlotsToImportOptimistically = choose( + a.SafeSlotsToImportOptimistically, + b.SafeSlotsToImportOptimistically, + ) + c.ExtraShares = choose(a.ExtraShares, b.ExtraShares) + return &c +} + func StateBundle(state common.BeaconState) (hivesim.StartOption, error) { var stateBytes bytes.Buffer if err := state.Serialize(codec.NewEncodingWriter(&stateBytes)); err != nil { @@ -23,9 +69,106 @@ func StateBundle(state common.BeaconState) (hivesim.StartOption, error) { ), nil } +func BuildSpec( + baseSpec *common.Spec, + forkConfig *config.ForkConfig, + consensusConfig *ConsensusConfig, + depositAddress common.Eth1Address, + executionGenesis *execution_config.ExecutionGenesis, +) (*common.Spec, error) { + // Generate beacon spec + // TODO: specify build-target based on preset, to run clients in mainnet or minimal mode. + // copy the default mainnet config, and make some minimal modifications for testnet usage + specCpy := *baseSpec + spec := &specCpy + spec.Config.DEPOSIT_CONTRACT_ADDRESS = depositAddress + spec.Config.DEPOSIT_CHAIN_ID = view.Uint64View(executionGenesis.ChainID()) + spec.Config.DEPOSIT_NETWORK_ID = view.Uint64View(executionGenesis.NetworkID()) + spec.Config.ETH1_FOLLOW_DISTANCE = 1 + + for _, currentConfig := range []struct { + ForkName string + VersionConfig *common.Version + EpochConfig *common.Epoch + ForkConfig *big.Int + }{ + { + ForkName: "genesis", + VersionConfig: &spec.Config.GENESIS_FORK_VERSION, + EpochConfig: nil, + ForkConfig: nil, + }, + { + ForkName: "altair", + VersionConfig: &spec.Config.ALTAIR_FORK_VERSION, + EpochConfig: &spec.Config.ALTAIR_FORK_EPOCH, + ForkConfig: forkConfig.AltairForkEpoch, + }, + { + ForkName: "bellatrix", + VersionConfig: &spec.Config.BELLATRIX_FORK_VERSION, + EpochConfig: &spec.Config.BELLATRIX_FORK_EPOCH, + ForkConfig: forkConfig.BellatrixForkEpoch, + }, + { + ForkName: "capella", + VersionConfig: &spec.Config.CAPELLA_FORK_VERSION, + EpochConfig: &spec.Config.CAPELLA_FORK_EPOCH, + ForkConfig: forkConfig.CapellaForkEpoch, + }, + { + ForkName: "deneb", + VersionConfig: &spec.Config.DENEB_FORK_VERSION, + EpochConfig: &spec.Config.DENEB_FORK_EPOCH, + ForkConfig: forkConfig.DenebForkEpoch, + }, + } { + // Modify version to avoid conflicts with base spec values + if currentConfig.VersionConfig == nil { + return nil, fmt.Errorf("VersionConfig was not configured for %s", currentConfig.ForkName) + } + currentConfig.VersionConfig[3] = 0x0a + fmt.Printf("Fork %s version %s\n", currentConfig.ForkName, currentConfig.VersionConfig.String()) + + // Adjust epoch to the fork configuration if it is set + if currentConfig.EpochConfig != nil && currentConfig.ForkConfig != nil { + *currentConfig.EpochConfig = common.Epoch(currentConfig.ForkConfig.Uint64()) + fmt.Printf("Fork %s at epoch %d\n", currentConfig.ForkName, currentConfig.ForkConfig.Uint64()) + } + } + + if consensusConfig.ValidatorCount == nil { + return nil, fmt.Errorf("ValidatorCount was not configured") + } + spec.Config.MIN_GENESIS_ACTIVE_VALIDATOR_COUNT = view.Uint64View( + consensusConfig.ValidatorCount.Uint64(), + ) + if consensusConfig.SlotTime != nil { + spec.Config.SECONDS_PER_SLOT = common.Timestamp( + consensusConfig.SlotTime.Uint64(), + ) + } + tdd, _ := uint256.FromBig(forkConfig.TerminalTotalDifficulty) + spec.Config.TERMINAL_TOTAL_DIFFICULTY = view.Uint256View(*tdd) + if executionGenesis.IsPostMerge() { + spec.Config.TERMINAL_BLOCK_HASH = tree.Root(executionGenesis.Hash) + spec.Config.TERMINAL_BLOCK_HASH_ACTIVATION_EPOCH = common.Timestamp(0) + } + + // Validators can exit immediately + spec.Config.SHARD_COMMITTEE_PERIOD = 0 + spec.Config.CHURN_LIMIT_QUOTIENT = 2 + + // Validators can withdraw immediately + spec.Config.MIN_VALIDATOR_WITHDRAWABILITY_DELAY = 0 + + spec.Config.PROPOSER_SCORE_BOOST = 40 + return spec, nil +} + func ConsensusConfigsBundle( spec *common.Spec, - genesis *core.Genesis, + executionGenesisHash el_common.Hash, valCount uint64, ) (hivesim.StartOption, error) { specConfig, err := yaml.Marshal(spec.Config) @@ -48,7 +191,10 @@ func ConsensusConfigsBundle( if err != nil { return nil, err } - genesisHash := genesis.ToBlock().Hash() + denebPreset, err := yaml.Marshal(spec.DenebPreset) + if err != nil { + return nil, err + } return hivesim.Bundle( hivesim.WithDynamicFile( "/hive/input/config.yaml", @@ -70,8 +216,12 @@ func ConsensusConfigsBundle( "/hive/input/preset_capella.yaml", config.BytesSource(capellaPreset), ), + hivesim.WithDynamicFile( + "/hive/input/preset_deneb.yaml", + config.BytesSource(denebPreset), + ), hivesim.Params{ - "HIVE_ETH2_ETH1_GENESIS_HASH": genesisHash.String(), + "HIVE_ETH2_ETH1_GENESIS_HASH": executionGenesisHash.String(), }, ), nil } diff --git a/simulators/eth2/common/config/consensus/genesis.go b/simulators/eth2/common/config/consensus/genesis.go deleted file mode 100644 index 2288ffef52..0000000000 --- a/simulators/eth2/common/config/consensus/genesis.go +++ /dev/null @@ -1,372 +0,0 @@ -package consensus_config - -import ( - "fmt" - - "github.com/ethereum/go-ethereum/core" - "github.com/ethereum/go-ethereum/core/types" - "github.com/holiman/uint256" - "github.com/protolambda/zrnt/eth2/beacon/altair" - "github.com/protolambda/zrnt/eth2/beacon/bellatrix" - "github.com/protolambda/zrnt/eth2/beacon/capella" - "github.com/protolambda/zrnt/eth2/beacon/common" - "github.com/protolambda/zrnt/eth2/beacon/phase0" - "github.com/protolambda/zrnt/eth2/configs" - "github.com/protolambda/ztyp/tree" - "github.com/protolambda/ztyp/view" -) - -func genesisPayloadHeader( - eth1GenesisBlock *types.Block, - spec *common.Spec, -) (*bellatrix.ExecutionPayloadHeader, error) { - extra := eth1GenesisBlock.Extra() - if len(extra) > common.MAX_EXTRA_DATA_BYTES { - return nil, fmt.Errorf( - "extra data is %d bytes, max is %d", - len(extra), - common.MAX_EXTRA_DATA_BYTES, - ) - } - if len(eth1GenesisBlock.Transactions()) != 0 { - return nil, fmt.Errorf( - "expected no transactions in genesis execution payload", - ) - } - - baseFee, overflow := uint256.FromBig(eth1GenesisBlock.BaseFee()) - if overflow { - return nil, fmt.Errorf("basefee larger than 2^256-1") - } - - return &bellatrix.ExecutionPayloadHeader{ - ParentHash: common.Root(eth1GenesisBlock.ParentHash()), - FeeRecipient: common.Eth1Address(eth1GenesisBlock.Coinbase()), - StateRoot: common.Bytes32(eth1GenesisBlock.Root()), - ReceiptsRoot: common.Bytes32(eth1GenesisBlock.ReceiptHash()), - LogsBloom: common.LogsBloom(eth1GenesisBlock.Bloom()), - PrevRandao: common.Bytes32{}, - BlockNumber: view.Uint64View(eth1GenesisBlock.NumberU64()), - GasLimit: view.Uint64View(eth1GenesisBlock.GasLimit()), - GasUsed: view.Uint64View(eth1GenesisBlock.GasUsed()), - Timestamp: common.Timestamp(eth1GenesisBlock.Time()), - ExtraData: extra, - BaseFeePerGas: view.Uint256View(*baseFee), - BlockHash: common.Root(eth1GenesisBlock.Hash()), - // empty transactions root - TransactionsRoot: common.PayloadTransactionsType(spec). - DefaultNode(). - MerkleRoot(tree.GetHashFn()), - }, nil -} - -func genesisPayloadHeaderCapella( - eth1GenesisBlock *types.Block, - spec *common.Spec, -) (*capella.ExecutionPayloadHeader, error) { - extra := eth1GenesisBlock.Extra() - if len(extra) > common.MAX_EXTRA_DATA_BYTES { - return nil, fmt.Errorf( - "extra data is %d bytes, max is %d", - len(extra), - common.MAX_EXTRA_DATA_BYTES, - ) - } - if len(eth1GenesisBlock.Transactions()) != 0 { - return nil, fmt.Errorf( - "expected no transactions in genesis execution payload", - ) - } - if len(eth1GenesisBlock.Withdrawals()) != 0 { - return nil, fmt.Errorf( - "expected no withdrawals in genesis execution payload", - ) - } - - baseFee, overflow := uint256.FromBig(eth1GenesisBlock.BaseFee()) - if overflow { - return nil, fmt.Errorf("basefee larger than 2^256-1") - } - - return &capella.ExecutionPayloadHeader{ - ParentHash: common.Root(eth1GenesisBlock.ParentHash()), - FeeRecipient: common.Eth1Address(eth1GenesisBlock.Coinbase()), - StateRoot: common.Bytes32(eth1GenesisBlock.Root()), - ReceiptsRoot: common.Bytes32(eth1GenesisBlock.ReceiptHash()), - LogsBloom: common.LogsBloom(eth1GenesisBlock.Bloom()), - PrevRandao: common.Bytes32{}, - BlockNumber: view.Uint64View(eth1GenesisBlock.NumberU64()), - GasLimit: view.Uint64View(eth1GenesisBlock.GasLimit()), - GasUsed: view.Uint64View(eth1GenesisBlock.GasUsed()), - Timestamp: common.Timestamp(eth1GenesisBlock.Time()), - ExtraData: extra, - BaseFeePerGas: view.Uint256View(*baseFee), - BlockHash: common.Root(eth1GenesisBlock.Hash()), - // empty transactions root - TransactionsRoot: common.PayloadTransactionsType(spec). - DefaultNode(). - MerkleRoot(tree.GetHashFn()), - // empty withdrawals root - WithdrawalsRoot: common.WithdrawalsType(spec). - DefaultNode(). - MerkleRoot(tree.GetHashFn()), - }, nil -} - -func createValidators( - spec *common.Spec, - keys []*ValidatorDetails, -) []phase0.KickstartValidatorData { - validators := make([]phase0.KickstartValidatorData, 0, len(keys)) - for _, key := range keys { - validators = append(validators, phase0.KickstartValidatorData{ - Pubkey: key.ValidatorPubkey, - WithdrawalCredentials: key.WithdrawalCredentials(), - Balance: spec.MAX_EFFECTIVE_BALANCE + key.ExtraInitialBalance, - }) - } - return validators -} - -// BuildBeaconState creates a beacon state, with either ExecutionFromGenesis or NoExecutionFromGenesis, the given timestamp, and validators derived from the given keys. -// The deposit contract will be recognized as an empty tree, ready for new deposits, thus skipping any transactions for pre-mined validators. -// -// TODO: instead of providing a eth1 genesis, provide an eth1 chain, so we can simulate a merge genesis state that embeds an existing eth1 chain. -func BuildBeaconState( - spec *common.Spec, - eth1Genesis *core.Genesis, - eth2GenesisTime common.Timestamp, - keys []*ValidatorDetails, -) (common.BeaconState, error) { - if uint64(len(keys)) < uint64(spec.MIN_GENESIS_ACTIVE_VALIDATOR_COUNT) { - return nil, fmt.Errorf( - "not enough validator keys for genesis. Got %d, but need at least %d", - len(keys), - spec.MIN_GENESIS_ACTIVE_VALIDATOR_COUNT, - ) - } - - eth1GenesisBlock := eth1Genesis.ToBlock() - eth1BlockHash := common.Root(eth1GenesisBlock.Hash()) - - validators := createValidators(spec, keys) - - hFn := tree.GetHashFn() - - var state common.BeaconState - var forkVersion common.Version - var previousForkVersion common.Version - var emptyBodyRoot common.Root - if spec.CAPELLA_FORK_EPOCH == 0 { - stateView := capella.NewBeaconStateView(spec) - forkVersion = spec.CAPELLA_FORK_VERSION - previousForkVersion = spec.BELLATRIX_FORK_VERSION - emptyBodyRoot = capella.BeaconBlockBodyType(configs.Mainnet). - New(). - HashTreeRoot(hFn) - // TODO: Check if we need to add execution payload to the state - state = stateView - } else if spec.BELLATRIX_FORK_EPOCH == 0 { - stateView := bellatrix.NewBeaconStateView(spec) - forkVersion = spec.BELLATRIX_FORK_VERSION - previousForkVersion = spec.ALTAIR_FORK_VERSION - emptyBodyRoot = bellatrix.BeaconBlockBodyType(configs.Mainnet). - New(). - HashTreeRoot(hFn) - state = stateView - } else if spec.ALTAIR_FORK_EPOCH == 0 { - state = bellatrix.NewBeaconStateView(spec) - forkVersion = spec.ALTAIR_FORK_VERSION - previousForkVersion = spec.GENESIS_FORK_VERSION - emptyBodyRoot = altair.BeaconBlockBodyType(configs.Mainnet). - New(). - HashTreeRoot(hFn) - } else { - state = phase0.NewBeaconStateView(spec) - forkVersion = spec.GENESIS_FORK_VERSION - previousForkVersion = spec.GENESIS_FORK_VERSION - emptyBodyRoot = phase0.BeaconBlockBodyType(configs.Mainnet). - New(). - HashTreeRoot(hFn) - } - - if err := state.SetGenesisTime(eth2GenesisTime); err != nil { - return nil, err - } - - if err := state.SetFork(common.Fork{ - PreviousVersion: previousForkVersion, - CurrentVersion: forkVersion, - Epoch: common.GENESIS_EPOCH, - }); err != nil { - return nil, err - } - // Empty deposit-tree - eth1Dat := common.Eth1Data{ - DepositRoot: phase0.NewDepositRootsView(). - HashTreeRoot(tree.GetHashFn()), - DepositCount: 0, - BlockHash: eth1BlockHash, - } - if err := state.SetEth1Data(eth1Dat); err != nil { - return nil, err - } - // sanity check: Leave the deposit index to 0. No deposits happened. - if i, err := state.Eth1DepositIndex(); err != nil { - return nil, err - } else if i != 0 { - return nil, fmt.Errorf("expected 0 deposit index in state, got %d", i) - } - if err := state.SetLatestBlockHeader(&common.BeaconBlockHeader{BodyRoot: emptyBodyRoot}); err != nil { - return nil, err - } - // Seed RANDAO with Eth1 entropy - if err := state.SeedRandao(spec, eth1BlockHash); err != nil { - return nil, err - } - - for _, v := range validators { - if err := state.AddValidator(spec, v.Pubkey, v.WithdrawalCredentials, v.Balance); err != nil { - return nil, err - } - } - vals, err := state.Validators() - if err != nil { - return nil, err - } - // Process activations and exits - for i := 0; i < len(validators); i++ { - val, err := vals.Validator(common.ValidatorIndex(i)) - if err != nil { - return nil, err - } - vEff, err := val.EffectiveBalance() - if err != nil { - return nil, err - } - if vEff == spec.MAX_EFFECTIVE_BALANCE { - if err := val.SetActivationEligibilityEpoch(common.GENESIS_EPOCH); err != nil { - return nil, err - } - if err := val.SetActivationEpoch(common.GENESIS_EPOCH); err != nil { - return nil, err - } - } - // Process exits/slashings - slashings, err := state.Slashings() - if err != nil { - return nil, err - } - if keys[i].Exited || keys[i].Slashed { - exit_epoch := common.GENESIS_EPOCH - val.SetExitEpoch(exit_epoch) - val.SetWithdrawableEpoch( - exit_epoch + spec.MIN_VALIDATOR_WITHDRAWABILITY_DELAY, - ) - if keys[i].Slashed { - val.MakeSlashed() - - bal, err := val.EffectiveBalance() - if err != nil { - return nil, err - } - - if err := slashings.AddSlashing(exit_epoch, bal); err != nil { - return nil, err - } - } - } - } - - if err := state.SetGenesisValidatorsRoot(vals.HashTreeRoot(tree.GetHashFn())); err != nil { - return nil, err - } - if st, ok := state.(common.SyncCommitteeBeaconState); ok { - indicesBounded, err := common.LoadBoundedIndices(vals) - if err != nil { - return nil, err - } - active := common.ActiveIndices(indicesBounded, common.GENESIS_EPOCH) - indices, err := common.ComputeSyncCommitteeIndices( - spec, - state, - common.GENESIS_EPOCH, - active, - ) - if err != nil { - return nil, fmt.Errorf( - "failed to compute sync committee indices: %v", - err, - ) - } - pubs, err := common.NewPubkeyCache(vals) - if err != nil { - return nil, err - } - // Note: A duplicate committee is assigned for the current and next committee at genesis - syncCommittee, err := common.IndicesToSyncCommittee(indices, pubs) - if err != nil { - return nil, err - } - syncCommitteeView, err := syncCommittee.View(spec) - if err != nil { - return nil, err - } - if err := st.SetCurrentSyncCommittee(syncCommitteeView); err != nil { - return nil, err - } - if err := st.SetNextSyncCommittee(syncCommitteeView); err != nil { - return nil, err - } - } - - switch st := state.(type) { - case *bellatrix.BeaconStateView: - tdd := uint256.Int(spec.TERMINAL_TOTAL_DIFFICULTY) - embedExecAtGenesis := tdd.ToBig().Cmp(eth1Genesis.Difficulty) <= 0 - - var execPayloadHeader *bellatrix.ExecutionPayloadHeader - if embedExecAtGenesis { - execPayloadHeader, err = genesisPayloadHeader( - eth1GenesisBlock, - spec, - ) - if err != nil { - return nil, err - } - } else { - // we didn't build any on the eth1 chain though, - // so we just put the genesis hash here (it could be any block from eth1 chain before TTD that is not ahead of eth2) - execPayloadHeader = new(bellatrix.ExecutionPayloadHeader) - } - - if err := st.SetLatestExecutionPayloadHeader(execPayloadHeader); err != nil { - return nil, err - } - case *capella.BeaconStateView: - // did we hit the TTD at genesis block? - tdd := uint256.Int(spec.TERMINAL_TOTAL_DIFFICULTY) - embedExecAtGenesis := tdd.ToBig().Cmp(eth1Genesis.Difficulty) <= 0 - - var execPayloadHeader *capella.ExecutionPayloadHeader - if embedExecAtGenesis { - execPayloadHeader, err = genesisPayloadHeaderCapella( - eth1GenesisBlock, - spec, - ) - if err != nil { - return nil, err - } - } else { - // we didn't build any on the eth1 chain though, - // so we just put the genesis hash here (it could be any block from eth1 chain before TTD that is not ahead of eth2) - execPayloadHeader = new(capella.ExecutionPayloadHeader) - } - - if err := st.SetLatestExecutionPayloadHeader(execPayloadHeader); err != nil { - return nil, err - } - } - - return state, nil -} diff --git a/simulators/eth2/common/config/consensus/genesis/bellatrix/state.go b/simulators/eth2/common/config/consensus/genesis/bellatrix/state.go new file mode 100644 index 0000000000..db4e17a51e --- /dev/null +++ b/simulators/eth2/common/config/consensus/genesis/bellatrix/state.go @@ -0,0 +1,101 @@ +package bellatrix + +import ( + "encoding/json" + "fmt" + + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/hive/simulators/eth2/common/config/consensus/genesis/interfaces" + "github.com/holiman/uint256" + "github.com/protolambda/zrnt/eth2/beacon/bellatrix" + "github.com/protolambda/zrnt/eth2/beacon/common" + "github.com/protolambda/zrnt/eth2/configs" + "github.com/protolambda/ztyp/tree" + "github.com/protolambda/ztyp/view" +) + +type GenesisStateView struct { + *bellatrix.BeaconStateView + Spec *common.Spec +} + +func NewBeaconStateView(spec *common.Spec) interfaces.StateViewGenesis { + return &GenesisStateView{ + BeaconStateView: bellatrix.NewBeaconStateView(spec), + Spec: spec, + } +} + +func (g *GenesisStateView) ToJson() ([]byte, error) { + raw, err := g.BeaconStateView.Raw(g.Spec) + if err != nil { + return nil, err + } + return json.MarshalIndent(raw, "", " ") +} + +func (g *GenesisStateView) ForkVersion() common.Version { + return g.Spec.BELLATRIX_FORK_VERSION +} + +func (g *GenesisStateView) PreviousForkVersion() common.Version { + return g.Spec.ALTAIR_FORK_VERSION +} + +func (g *GenesisStateView) EmptyBodyRoot() common.Root { + return bellatrix.BeaconBlockBodyType(configs.Mainnet). + New(). + HashTreeRoot(tree.GetHashFn()) +} + +func (g *GenesisStateView) SetGenesisExecutionHeader( + executionGenesis *types.Block, +) error { + var execPayloadHeader *bellatrix.ExecutionPayloadHeader + + ttd := uint256.Int(g.Spec.TERMINAL_TOTAL_DIFFICULTY) + + if executionGenesis.Difficulty().Cmp(ttd.ToBig()) >= 0 { + extra := executionGenesis.Extra() + if len(extra) > common.MAX_EXTRA_DATA_BYTES { + return fmt.Errorf( + "extra data is %d bytes, max is %d", + len(extra), + common.MAX_EXTRA_DATA_BYTES, + ) + } + if len(executionGenesis.Transactions()) != 0 { + return fmt.Errorf( + "expected no transactions in genesis execution payload", + ) + } + + baseFee, overflow := uint256.FromBig(executionGenesis.BaseFee()) + if overflow { + return fmt.Errorf("basefee larger than 2^256-1") + } + + execPayloadHeader = &bellatrix.ExecutionPayloadHeader{ + ParentHash: common.Root(executionGenesis.ParentHash()), + FeeRecipient: common.Eth1Address(executionGenesis.Coinbase()), + StateRoot: common.Bytes32(executionGenesis.Root()), + ReceiptsRoot: common.Bytes32(executionGenesis.ReceiptHash()), + LogsBloom: common.LogsBloom(executionGenesis.Bloom()), + PrevRandao: common.Bytes32{}, + BlockNumber: view.Uint64View(executionGenesis.NumberU64()), + GasLimit: view.Uint64View(executionGenesis.GasLimit()), + GasUsed: view.Uint64View(executionGenesis.GasUsed()), + Timestamp: common.Timestamp(executionGenesis.Time()), + ExtraData: extra, + BaseFeePerGas: view.Uint256View(*baseFee), + BlockHash: common.Root(executionGenesis.Hash()), + // empty transactions root + TransactionsRoot: common.PayloadTransactionsType(g.Spec). + DefaultNode(). + MerkleRoot(tree.GetHashFn()), + } + } else { + execPayloadHeader = new(bellatrix.ExecutionPayloadHeader) + } + return g.SetLatestExecutionPayloadHeader(execPayloadHeader) +} diff --git a/simulators/eth2/common/config/consensus/genesis/capella/state.go b/simulators/eth2/common/config/consensus/genesis/capella/state.go new file mode 100644 index 0000000000..979437c7b6 --- /dev/null +++ b/simulators/eth2/common/config/consensus/genesis/capella/state.go @@ -0,0 +1,114 @@ +package capella + +import ( + "encoding/json" + "fmt" + + "github.com/ethereum/go-ethereum/core/types" + "github.com/holiman/uint256" + "github.com/protolambda/zrnt/eth2/beacon/capella" + "github.com/protolambda/zrnt/eth2/beacon/common" + "github.com/protolambda/zrnt/eth2/configs" + "github.com/protolambda/ztyp/tree" + "github.com/protolambda/ztyp/view" + + "github.com/ethereum/hive/simulators/eth2/common/config/consensus/genesis/interfaces" +) + +type GenesisStateView struct { + *capella.BeaconStateView + Spec *common.Spec +} + +func NewBeaconStateView(spec *common.Spec) interfaces.StateViewGenesis { + return &GenesisStateView{ + BeaconStateView: capella.NewBeaconStateView(spec), + Spec: spec, + } +} + +func (g *GenesisStateView) ToJson() ([]byte, error) { + raw, err := g.BeaconStateView.Raw(g.Spec) + if err != nil { + return nil, err + } + return json.MarshalIndent(raw, "", " ") +} + +func (g *GenesisStateView) ForkVersion() common.Version { + return g.Spec.CAPELLA_FORK_VERSION +} + +func (g *GenesisStateView) PreviousForkVersion() common.Version { + return g.Spec.BELLATRIX_FORK_VERSION +} + +func (g *GenesisStateView) EmptyBodyRoot() common.Root { + return capella.BeaconBlockBodyType(configs.Mainnet). + New(). + HashTreeRoot(tree.GetHashFn()) +} + +func (g *GenesisStateView) SetGenesisExecutionHeader( + executionGenesis *types.Block, +) error { + ttd := uint256.Int(g.Spec.TERMINAL_TOTAL_DIFFICULTY) + + if executionGenesis.Difficulty().Cmp(ttd.ToBig()) < 0 { + return fmt.Errorf( + "eth1 genesis difficulty %d is less than terminal total difficulty %d", + executionGenesis.Difficulty(), + ttd, + ) + } + + extra := executionGenesis.Extra() + if len(extra) > common.MAX_EXTRA_DATA_BYTES { + return fmt.Errorf( + "extra data is %d bytes, max is %d", + len(extra), + common.MAX_EXTRA_DATA_BYTES, + ) + } + if len(executionGenesis.Transactions()) != 0 { + return fmt.Errorf( + "expected no transactions in genesis execution payload", + ) + } + if len(executionGenesis.Withdrawals()) != 0 { + return fmt.Errorf( + "expected no withdrawals in genesis execution payload", + ) + } + + baseFee, overflow := uint256.FromBig(executionGenesis.BaseFee()) + if overflow { + return fmt.Errorf("basefee larger than 2^256-1") + } + + execPayloadHeader := &capella.ExecutionPayloadHeader{ + ParentHash: common.Root(executionGenesis.ParentHash()), + FeeRecipient: common.Eth1Address(executionGenesis.Coinbase()), + StateRoot: common.Bytes32(executionGenesis.Root()), + ReceiptsRoot: common.Bytes32(executionGenesis.ReceiptHash()), + LogsBloom: common.LogsBloom(executionGenesis.Bloom()), + PrevRandao: common.Bytes32{}, + BlockNumber: view.Uint64View(executionGenesis.NumberU64()), + GasLimit: view.Uint64View(executionGenesis.GasLimit()), + GasUsed: view.Uint64View(executionGenesis.GasUsed()), + Timestamp: common.Timestamp(executionGenesis.Time()), + ExtraData: extra, + BaseFeePerGas: view.Uint256View(*baseFee), + BlockHash: common.Root(executionGenesis.Hash()), + // empty transactions root + TransactionsRoot: common.PayloadTransactionsType(g.Spec). + DefaultNode(). + MerkleRoot(tree.GetHashFn()), + // empty withdrawals root + WithdrawalsRoot: common.WithdrawalsType(g.Spec). + DefaultNode(). + MerkleRoot(tree.GetHashFn()), + } + + return g.SetLatestExecutionPayloadHeader(execPayloadHeader) +} diff --git a/simulators/eth2/common/config/consensus/genesis/deneb/state.go b/simulators/eth2/common/config/consensus/genesis/deneb/state.go new file mode 100644 index 0000000000..bffba326c2 --- /dev/null +++ b/simulators/eth2/common/config/consensus/genesis/deneb/state.go @@ -0,0 +1,129 @@ +package deneb + +import ( + "encoding/json" + "fmt" + + "github.com/ethereum/go-ethereum/core/types" + "github.com/holiman/uint256" + "github.com/protolambda/zrnt/eth2/beacon/common" + "github.com/protolambda/zrnt/eth2/beacon/deneb" + "github.com/protolambda/zrnt/eth2/configs" + "github.com/protolambda/ztyp/tree" + "github.com/protolambda/ztyp/view" + + "github.com/ethereum/hive/simulators/eth2/common/config/consensus/genesis/interfaces" +) + +type GenesisStateView struct { + *deneb.BeaconStateView + Spec *common.Spec +} + +func NewBeaconStateView(spec *common.Spec) interfaces.StateViewGenesis { + return &GenesisStateView{ + BeaconStateView: deneb.NewBeaconStateView(spec), + Spec: spec, + } +} + +func (g *GenesisStateView) ToJson() ([]byte, error) { + raw, err := g.BeaconStateView.Raw(g.Spec) + if err != nil { + return nil, err + } + return json.MarshalIndent(raw, "", " ") +} + +func (g *GenesisStateView) ForkVersion() common.Version { + return g.Spec.DENEB_FORK_VERSION +} + +func (g *GenesisStateView) PreviousForkVersion() common.Version { + return g.Spec.CAPELLA_FORK_VERSION +} + +func (g *GenesisStateView) EmptyBodyRoot() common.Root { + return deneb.BeaconBlockBodyType(configs.Mainnet). + New(). + HashTreeRoot(tree.GetHashFn()) +} + +func (g *GenesisStateView) SetGenesisExecutionHeader( + executionGenesis *types.Block, +) error { + ttd := uint256.Int(g.Spec.TERMINAL_TOTAL_DIFFICULTY) + + if executionGenesis.Difficulty().Cmp(ttd.ToBig()) < 0 { + return fmt.Errorf( + "eth1 genesis difficulty %d is less than terminal total difficulty %d", + executionGenesis.Difficulty(), + ttd, + ) + } + + extra := executionGenesis.Extra() + if len(extra) > common.MAX_EXTRA_DATA_BYTES { + return fmt.Errorf( + "extra data is %d bytes, max is %d", + len(extra), + common.MAX_EXTRA_DATA_BYTES, + ) + } + if len(executionGenesis.Transactions()) != 0 { + return fmt.Errorf( + "expected no transactions in genesis execution payload", + ) + } + if len(executionGenesis.Withdrawals()) != 0 { + return fmt.Errorf( + "expected no withdrawals in genesis execution payload", + ) + } + + baseFee, overflow := uint256.FromBig(executionGenesis.BaseFee()) + if overflow { + return fmt.Errorf("basefee larger than 2^256-1") + } + + blobGasUsed := executionGenesis.BlobGasUsed() + if blobGasUsed == nil { + return fmt.Errorf("nil blob gas used in genesis block") + } + excessBlobGas := executionGenesis.ExcessBlobGas() + if excessBlobGas == nil { + return fmt.Errorf("nil excess blob gas in genesis block") + } + + if executionGenesis.BeaconRoot() == nil { + return fmt.Errorf("nil beacon root in genesis block") + } + + execPayloadHeader := &deneb.ExecutionPayloadHeader{ + ParentHash: common.Root(executionGenesis.ParentHash()), + FeeRecipient: common.Eth1Address(executionGenesis.Coinbase()), + StateRoot: common.Bytes32(executionGenesis.Root()), + ReceiptsRoot: common.Bytes32(executionGenesis.ReceiptHash()), + LogsBloom: common.LogsBloom(executionGenesis.Bloom()), + PrevRandao: common.Bytes32{}, + BlockNumber: view.Uint64View(executionGenesis.NumberU64()), + GasLimit: view.Uint64View(executionGenesis.GasLimit()), + GasUsed: view.Uint64View(executionGenesis.GasUsed()), + Timestamp: common.Timestamp(executionGenesis.Time()), + ExtraData: extra, + BaseFeePerGas: view.Uint256View(*baseFee), + BlockHash: common.Root(executionGenesis.Hash()), + // empty transactions root + TransactionsRoot: common.PayloadTransactionsType(g.Spec). + DefaultNode(). + MerkleRoot(tree.GetHashFn()), + // empty withdrawals root + WithdrawalsRoot: common.WithdrawalsType(g.Spec). + DefaultNode(). + MerkleRoot(tree.GetHashFn()), + BlobGasUsed: view.Uint64View(*blobGasUsed), + ExcessBlobGas: view.Uint64View(*excessBlobGas), + } + + return g.SetLatestExecutionPayloadHeader(execPayloadHeader) +} diff --git a/simulators/eth2/common/config/consensus/genesis/genesis.go b/simulators/eth2/common/config/consensus/genesis/genesis.go new file mode 100644 index 0000000000..a5e3a57373 --- /dev/null +++ b/simulators/eth2/common/config/consensus/genesis/genesis.go @@ -0,0 +1,140 @@ +package genesis + +import ( + "fmt" + + "github.com/ethereum/go-ethereum/core/types" + consensus_config "github.com/ethereum/hive/simulators/eth2/common/config/consensus" + "github.com/ethereum/hive/simulators/eth2/common/config/consensus/genesis/bellatrix" + "github.com/ethereum/hive/simulators/eth2/common/config/consensus/genesis/capella" + "github.com/ethereum/hive/simulators/eth2/common/config/consensus/genesis/deneb" + "github.com/ethereum/hive/simulators/eth2/common/config/consensus/genesis/interfaces" + "github.com/protolambda/zrnt/eth2/beacon/common" + "github.com/protolambda/zrnt/eth2/beacon/phase0" + "github.com/protolambda/ztyp/tree" +) + +// BuildBeaconState creates a beacon state, with either ExecutionFromGenesis or NoExecutionFromGenesis, the given timestamp, and validators derived from the given keys. +// The deposit contract will be recognized as an empty tree, ready for new deposits, thus skipping any transactions for pre-mined validators. +// +// TODO: instead of providing a eth1 genesis, provide an eth1 chain, so we can simulate a merge genesis state that embeds an existing eth1 chain. +func BuildBeaconState( + spec *common.Spec, + executionGenesis *types.Block, + beaconGenesisTime common.Timestamp, + keys consensus_config.ValidatorsSetupDetails, +) (common.BeaconState, error) { + if uint64(len(keys)) < uint64(spec.MIN_GENESIS_ACTIVE_VALIDATOR_COUNT) { + return nil, fmt.Errorf( + "not enough validator keys for genesis. Got %d, but need at least %d", + len(keys), + spec.MIN_GENESIS_ACTIVE_VALIDATOR_COUNT, + ) + } + + eth1BlockHash := common.Root(executionGenesis.Hash()) + + var state interfaces.StateViewGenesis + if spec.DENEB_FORK_EPOCH == 0 { + state = deneb.NewBeaconStateView(spec) + } else if spec.CAPELLA_FORK_EPOCH == 0 { + state = capella.NewBeaconStateView(spec) + } else if spec.BELLATRIX_FORK_EPOCH == 0 { + state = bellatrix.NewBeaconStateView(spec) + } else { + return nil, fmt.Errorf("pre-merge not supported") + } + + if err := state.SetGenesisTime(beaconGenesisTime); err != nil { + return nil, err + } + + if err := state.SetFork(common.Fork{ + PreviousVersion: state.PreviousForkVersion(), + CurrentVersion: state.ForkVersion(), + Epoch: common.GENESIS_EPOCH, + }); err != nil { + return nil, err + } + // Empty deposit-tree + eth1Dat := common.Eth1Data{ + DepositRoot: phase0.NewDepositRootsView(). + HashTreeRoot(tree.GetHashFn()), + DepositCount: 0, + BlockHash: eth1BlockHash, + } + if err := state.SetEth1Data(eth1Dat); err != nil { + return nil, err + } + // sanity check: Leave the deposit index to 0. No deposits happened. + if i, err := state.Eth1DepositIndex(); err != nil { + return nil, err + } else if i != 0 { + return nil, fmt.Errorf("expected 0 deposit index in state, got %d", i) + } + if err := state.SetLatestBlockHeader(&common.BeaconBlockHeader{BodyRoot: state.EmptyBodyRoot()}); err != nil { + return nil, err + } + // Seed RANDAO with Eth1 entropy + if err := state.SeedRandao(spec, eth1BlockHash); err != nil { + return nil, err + } + + if err := keys.AddToGenesisState(spec, state); err != nil { + return nil, err + } + + vals, err := state.Validators() + if err != nil { + return nil, err + } + + if err := state.SetGenesisValidatorsRoot(vals.HashTreeRoot(tree.GetHashFn())); err != nil { + return nil, err + } + if st, ok := state.(common.SyncCommitteeBeaconState); ok { + indicesBounded, err := common.LoadBoundedIndices(vals) + if err != nil { + return nil, err + } + active := common.ActiveIndices(indicesBounded, common.GENESIS_EPOCH) + indices, err := common.ComputeSyncCommitteeIndices( + spec, + state, + common.GENESIS_EPOCH, + active, + ) + if err != nil { + return nil, fmt.Errorf( + "failed to compute sync committee indices: %v", + err, + ) + } + pubs, err := common.NewPubkeyCache(vals) + if err != nil { + return nil, err + } + // Note: A duplicate committee is assigned for the current and next committee at genesis + syncCommittee, err := common.IndicesToSyncCommittee(indices, pubs) + if err != nil { + return nil, err + } + syncCommitteeView, err := syncCommittee.View(spec) + if err != nil { + return nil, err + } + if err := st.SetCurrentSyncCommittee(syncCommitteeView); err != nil { + return nil, err + } + if err := st.SetNextSyncCommittee(syncCommitteeView); err != nil { + return nil, err + } + } + + // Set execution payload header + if err := state.SetGenesisExecutionHeader(executionGenesis); err != nil { + return nil, err + } + + return state, nil +} diff --git a/simulators/eth2/common/config/consensus/genesis/interfaces/state.go b/simulators/eth2/common/config/consensus/genesis/interfaces/state.go new file mode 100644 index 0000000000..927ef6c4d5 --- /dev/null +++ b/simulators/eth2/common/config/consensus/genesis/interfaces/state.go @@ -0,0 +1,15 @@ +package interfaces + +import ( + "github.com/ethereum/go-ethereum/core/types" + "github.com/protolambda/zrnt/eth2/beacon/common" +) + +type StateViewGenesis interface { + common.BeaconState + ForkVersion() common.Version + PreviousForkVersion() common.Version + EmptyBodyRoot() common.Root + SetGenesisExecutionHeader(genesisBlock *types.Block) error + ToJson() ([]byte, error) +} diff --git a/simulators/eth2/common/config/consensus/validator_keys.go b/simulators/eth2/common/config/consensus/validator_keys.go index 06988ae394..e2c37028cf 100644 --- a/simulators/eth2/common/config/consensus/validator_keys.go +++ b/simulators/eth2/common/config/consensus/validator_keys.go @@ -12,12 +12,14 @@ import ( "github.com/ethereum/hive/hivesim" "github.com/ethereum/hive/simulators/eth2/common/config" + "github.com/ethereum/hive/simulators/eth2/common/config/consensus/genesis/interfaces" "github.com/google/uuid" hbls "github.com/herumi/bls-eth-go-binary/bls" "github.com/marioevz/eth-clients/clients/validator" "github.com/pkg/errors" "github.com/protolambda/go-keystorev4" "github.com/protolambda/zrnt/eth2/beacon/common" + "github.com/protolambda/zrnt/eth2/beacon/phase0" "github.com/tyler-smith/go-bip39" util "github.com/wealdtech/go-eth2-util" ) @@ -32,7 +34,7 @@ func init() { } } -type ValidatorDetails struct { +type ValidatorSetupDetails struct { validator.ValidatorKeys // Withdrawal credential type: can be 0, BLS, or 1, execution WithdrawalCredentialType int @@ -46,7 +48,14 @@ type ValidatorDetails struct { Slashed bool } -func (kd *ValidatorDetails) WithdrawalCredentials() (out common.Root) { +func (kd *ValidatorSetupDetails) KickstartValidatorData(spec *common.Spec) (out phase0.KickstartValidatorData) { + out.Pubkey = kd.ValidatorPubkey + out.WithdrawalCredentials = kd.WithdrawalCredentials() + out.Balance = spec.MAX_EFFECTIVE_BALANCE + kd.ExtraInitialBalance + return +} + +func (kd *ValidatorSetupDetails) WithdrawalCredentials() (out common.Root) { if kd.WithdrawalCredentialType == common.BLS_WITHDRAWAL_PREFIX { hasher := sha256.New() hasher.Write(kd.WithdrawalPubkey[:]) @@ -60,16 +69,131 @@ func (kd *ValidatorDetails) WithdrawalCredentials() (out common.Root) { return } -type ValidatorDetailsMap map[common.ValidatorIndex]*ValidatorDetails +type ValidatorsSetupDetails []*ValidatorSetupDetails -func (m ValidatorDetailsMap) Keys() map[common.ValidatorIndex]*validator.ValidatorKeys { - keys := make(map[common.ValidatorIndex]*validator.ValidatorKeys, len(m)) - for k, v := range m { - keys[k] = &v.ValidatorKeys +func (l ValidatorsSetupDetails) KeysMap(startIndex common.ValidatorIndex) ValidatorsKeys { + keys := make(ValidatorsKeys, len(l)) + for k, v := range l { + keys[common.ValidatorIndex(k)+startIndex] = &v.ValidatorKeys } return keys } +func (keys ValidatorsSetupDetails) KeyTranches(shares Shares) []ValidatorsKeys { + tranches := make( + []ValidatorsKeys, + 0, + len(shares), + ) + i := uint64(0) + for _, c := range shares.ValidatorSplits(uint64(len(keys))) { + tranche := make(ValidatorsKeys) + for j := i; j < (i + c); j++ { + tranche[common.ValidatorIndex(j)] = &keys[j].ValidatorKeys + } + tranches = append(tranches, tranche) + i += c + } + return tranches +} + +func (keys ValidatorsSetupDetails) CreateKickstartValidatorData(spec *common.Spec) []phase0.KickstartValidatorData { + validators := make([]phase0.KickstartValidatorData, 0, len(keys)) + for _, key := range keys { + validators = append(validators, key.KickstartValidatorData(spec)) + } + return validators +} + +func (keys ValidatorsSetupDetails) AddToGenesisState(spec *common.Spec, state interfaces.StateViewGenesis) error { + validators := keys.CreateKickstartValidatorData(spec) + + for _, v := range validators { + if err := state.AddValidator(spec, v.Pubkey, v.WithdrawalCredentials, v.Balance); err != nil { + return err + } + } + vals, err := state.Validators() + if err != nil { + return err + } + // Process activations and exits + for i := 0; i < len(validators); i++ { + val, err := vals.Validator(common.ValidatorIndex(i)) + if err != nil { + return err + } + vEff, err := val.EffectiveBalance() + if err != nil { + return err + } + if vEff == spec.MAX_EFFECTIVE_BALANCE { + if err := val.SetActivationEligibilityEpoch(common.GENESIS_EPOCH); err != nil { + return err + } + if err := val.SetActivationEpoch(common.GENESIS_EPOCH); err != nil { + return err + } + } + // Process exits/slashings + slashings, err := state.Slashings() + if err != nil { + return err + } + if keys[i].Exited || keys[i].Slashed { + exit_epoch := common.GENESIS_EPOCH + val.SetExitEpoch(exit_epoch) + val.SetWithdrawableEpoch( + exit_epoch + spec.MIN_VALIDATOR_WITHDRAWABILITY_DELAY, + ) + if keys[i].Slashed { + if err := val.MakeSlashed(); err != nil { + return err + } + + bal, err := val.EffectiveBalance() + if err != nil { + return err + } + + if err := slashings.AddSlashing(exit_epoch, bal); err != nil { + return err + } + } + } + } + + return nil +} + +type ValidatorsKeys map[common.ValidatorIndex]*validator.ValidatorKeys + +func (keys ValidatorsKeys) Bundle() hivesim.StartOption { + opts := make([]hivesim.StartOption, 0, len(keys)*2) + for _, k := range keys { + p := fmt.Sprintf( + "/hive/input/keystores/0x%x/keystore.json", + k.ValidatorPubkey[:], + ) + opts = append( + opts, + hivesim.WithDynamicFile( + p, + config.BytesSource(k.ValidatorKeystoreJSON), + ), + ) + p = fmt.Sprintf("/hive/input/secrets/0x%x", k.ValidatorPubkey[:]) + opts = append( + opts, + hivesim.WithDynamicFile( + p, + config.BytesSource([]byte(k.ValidatorKeystorePass)), + ), + ) + } + return hivesim.Bundle(opts...) +} + // MnemonicsKeySource creates a range of BLS validator and withdrawal keys. // "m/12381/3600/%d/0/0" path for validator keys // "m/12381/3600/%d/0" path for withdrawal keys @@ -78,15 +202,10 @@ type MnemonicsKeySource struct { From uint64 `yaml:"from"` // To account range end, exclusive To uint64 `yaml:"to"` - // Validator mnemonic - Validator string `yaml:"validator"` - // Withdrawal mnemonic - Withdrawal string `yaml:"withdrawal"` - // Withdrawal type - WithdrawalCredentialType int - + // Mnemonic seed + Mnemonic string `yaml:"mnemonic"` // cache loaded validator details - cache []*ValidatorDetails `yaml:"-"` + cache ValidatorsSetupDetails `yaml:"-"` } func mnemonicToSeed(mnemonic string) (seed []byte, err error) { @@ -156,15 +275,11 @@ func marshalWeakKeystoreJSON( return json.MarshalIndent(store, "", " ") } -func (k *MnemonicsKeySource) Keys() ([]*ValidatorDetails, error) { +func (k *MnemonicsKeySource) Keys() (ValidatorsSetupDetails, error) { if k.cache != nil { return k.cache, nil } - valSeed, err := mnemonicToSeed(k.Validator) - if err != nil { - return nil, fmt.Errorf("bad validator seed: %w", err) - } - withdrSeed, err := mnemonicToSeed(k.Withdrawal) + seed, err := mnemonicToSeed(k.Mnemonic) if err != nil { return nil, fmt.Errorf("bad validator seed: %w", err) } @@ -175,10 +290,10 @@ func (k *MnemonicsKeySource) Keys() ([]*ValidatorDetails, error) { k.To, ) } - out := make([]*ValidatorDetails, 0, k.To-k.From) + out := make(ValidatorsSetupDetails, 0, k.To-k.From) for i := k.From; i < k.To; i++ { valpath := fmt.Sprintf("m/12381/3600/%d/0/0", i) - valPrivateKey, err := util.PrivateKeyFromSeedAndPath(valSeed, valpath) + valPrivateKey, err := util.PrivateKeyFromSeedAndPath(seed, valpath) if err != nil { return nil, errors.Wrapf( err, @@ -188,7 +303,7 @@ func (k *MnemonicsKeySource) Keys() ([]*ValidatorDetails, error) { } path := fmt.Sprintf("m/12381/3600/%d/0", i) withdrPrivateKey, err := util.PrivateKeyFromSeedAndPath( - withdrSeed, + seed, path, ) if err != nil { @@ -245,7 +360,7 @@ func (k *MnemonicsKeySource) Keys() ([]*ValidatorDetails, error) { if err != nil { return nil, err } - k := &ValidatorDetails{ + k := &ValidatorSetupDetails{ ValidatorKeys: validator.ValidatorKeys{ ValidatorKeystoreJSON: jsonData, ValidatorKeystorePass: passphrase, @@ -262,7 +377,7 @@ func (k *MnemonicsKeySource) Keys() ([]*ValidatorDetails, error) { return out, nil } -func SecretKeys(keys []*ValidatorDetails) (*[]blsu.SecretKey, error) { +func SecretKeys(keys ValidatorsSetupDetails) (*[]blsu.SecretKey, error) { secrets := make([]blsu.SecretKey, len(keys)) for i := 0; i < len(keys); i++ { if err := secrets[i].Deserialize(&keys[i].ValidatorSecretKey); err != nil { @@ -295,52 +410,3 @@ func (shares Shares) ValidatorSplits(validatorTotalCount uint64) []uint64 { } return validators } - -func KeyTranches( - keys []*ValidatorDetails, - shares Shares, -) []ValidatorDetailsMap { - tranches := make( - []ValidatorDetailsMap, - 0, - len(shares), - ) - i := uint64(0) - for _, c := range shares.ValidatorSplits(uint64(len(keys))) { - tranche := make(ValidatorDetailsMap) - for j := i; j < (i + c); j++ { - tranche[common.ValidatorIndex(j)] = keys[j] - } - tranches = append(tranches, tranche) - i += c - } - return tranches -} - -func KeysBundle( - keys ValidatorDetailsMap, -) hivesim.StartOption { - opts := make([]hivesim.StartOption, 0, len(keys)*2) - for _, k := range keys { - p := fmt.Sprintf( - "/hive/input/keystores/0x%x/keystore.json", - k.ValidatorPubkey[:], - ) - opts = append( - opts, - hivesim.WithDynamicFile( - p, - config.BytesSource(k.ValidatorKeystoreJSON), - ), - ) - p = fmt.Sprintf("/hive/input/secrets/0x%x", k.ValidatorPubkey[:]) - opts = append( - opts, - hivesim.WithDynamicFile( - p, - config.BytesSource([]byte(k.ValidatorKeystorePass)), - ), - ) - } - return hivesim.Bundle(opts...) -} diff --git a/simulators/eth2/common/config/execution/execution_config.go b/simulators/eth2/common/config/execution/execution_config.go index 2b254c01b5..32b0407fec 100644 --- a/simulators/eth2/common/config/execution/execution_config.go +++ b/simulators/eth2/common/config/execution/execution_config.go @@ -56,6 +56,16 @@ var embeddedDepositContract = ` } } ` +var embeddedBeaconRootContract = ` +{ + "balance": "0", + "code": "0x3373fffffffffffffffffffffffffffffffffffffffe14604457602036146024575f5ffd5b620180005f350680545f35146037575f5ffd5b6201800001545f5260205ff35b42620180004206555f3562018000420662018000015500", + "nonce": "1", + "storage": {} + } + ` + +var beaconRootContractAddress = common.HexToAddress("0x000F3df6D732807Ef1319fB7B8bB8522d0Beac02") var ( CLIQUE_PERIOD_DEFAULT = uint64(2) @@ -196,19 +206,85 @@ func (c ExecutionCliqueConsensus) SecondsPerBlock() uint64 { return c.CliquePeriod } +func BuildChainConfig( + ttd *big.Int, + beaconChainGenesisTime uint64, + slotsPerEpoch uint64, + secondsPerSlot uint64, + config *config.ForkConfig, +) (*params.ChainConfig, error) { + chainConfig := ¶ms.ChainConfig{ + ChainID: big.NewInt(7), + HomesteadBlock: big.NewInt(0), + DAOForkBlock: nil, + DAOForkSupport: false, + EIP150Block: big.NewInt(0), + EIP155Block: big.NewInt(0), + EIP158Block: big.NewInt(0), + ByzantiumBlock: big.NewInt(0), + ConstantinopleBlock: big.NewInt(0), + PetersburgBlock: big.NewInt(0), + IstanbulBlock: big.NewInt(0), + MuirGlacierBlock: big.NewInt(0), + BerlinBlock: big.NewInt(0), + LondonBlock: big.NewInt(0), + ArrowGlacierBlock: big.NewInt(0), + MergeNetsplitBlock: big.NewInt(0), + TerminalTotalDifficulty: ttd, + Clique: nil, + } + + // Configure post-merge forks + var ( + previousForkTime = config.BellatrixForkEpoch + previousFork = "bellatrix" + ) + for _, forkConfig := range []struct { + ForkName string + BeaconForkTime *big.Int + ChainConfig **uint64 + }{ + { + ForkName: "capella", + BeaconForkTime: config.CapellaForkEpoch, + ChainConfig: &chainConfig.ShanghaiTime, + }, + { + ForkName: "deneb", + BeaconForkTime: config.DenebForkEpoch, + ChainConfig: &chainConfig.CancunTime, + }, + } { + if forkConfig.BeaconForkTime != nil { + if previousForkTime == nil { + return nil, fmt.Errorf("fork '%s' has a time but previous fork '%s' does not", forkConfig.ForkName, previousFork) + } + if forkConfig.BeaconForkTime.Cmp(previousForkTime) < 0 { + return nil, fmt.Errorf("fork '%s' has a time before previous fork '%s'", forkConfig.ForkName, previousFork) + } + timestamp := beaconChainGenesisTime + (forkConfig.BeaconForkTime.Uint64() * secondsPerSlot * slotsPerEpoch) + *forkConfig.ChainConfig = ×tamp + } + previousForkTime = forkConfig.BeaconForkTime + previousFork = forkConfig.ForkName + } + return chainConfig, nil +} + type ExecutionGenesis struct { Genesis *core.Genesis + Block *types.Block + Hash common.Hash DepositAddress common.Address - NetworkID uint64 } func BuildExecutionGenesis( - ttd *big.Int, genesisTime uint64, consensus ExecutionConsensus, - forkConfig *params.ChainConfig, + chainConfig *params.ChainConfig, genesisExecAccounts map[common.Address]core.GenesisAccount, -) *ExecutionGenesis { + initialBaseFee *big.Int, +) (*ExecutionGenesis, error) { depositContractAddr := common.HexToAddress( "0x4242424242424242424242424242424242424242", ) @@ -216,42 +292,19 @@ func BuildExecutionGenesis( if err := json.Unmarshal([]byte(embeddedDepositContract), &depositContractAcc); err != nil { panic(err) } - genesis := ExecutionGenesis{ - Genesis: &core.Genesis{ - Config: ¶ms.ChainConfig{ - ChainID: big.NewInt(7), - HomesteadBlock: big.NewInt(0), - DAOForkBlock: nil, - DAOForkSupport: false, - EIP150Block: big.NewInt(0), - EIP150Hash: common.Hash{}, - EIP155Block: big.NewInt(0), - EIP158Block: big.NewInt(0), - ByzantiumBlock: big.NewInt(0), - ConstantinopleBlock: big.NewInt(0), - PetersburgBlock: big.NewInt(0), - IstanbulBlock: big.NewInt(0), - MuirGlacierBlock: big.NewInt(0), - BerlinBlock: big.NewInt(0), - LondonBlock: big.NewInt(0), - ArrowGlacierBlock: big.NewInt(0), - MergeNetsplitBlock: big.NewInt(0), - TerminalTotalDifficulty: ttd, - Clique: nil, - }, - Nonce: 0, - Timestamp: genesisTime, - ExtraData: nil, - GasLimit: 30_000_000, - Difficulty: big.NewInt(0), - Mixhash: common.Hash{}, - Coinbase: common.Address{}, - Alloc: core.GenesisAlloc{ - depositContractAddr: depositContractAcc, - }, + genesis := &core.Genesis{ + Config: chainConfig, + Nonce: 0, + Timestamp: genesisTime, + ExtraData: nil, + GasLimit: 30_000_000, + Difficulty: big.NewInt(0), + BaseFee: initialBaseFee, + Mixhash: common.Hash{}, + Coinbase: common.Address{}, + Alloc: core.GenesisAlloc{ + depositContractAddr: depositContractAcc, }, - DepositAddress: depositContractAddr, - NetworkID: 7, } for addr, acc := range genesisExecAccounts { @@ -259,20 +312,51 @@ func BuildExecutionGenesis( if acc.Balance == nil { acc.Balance = common.Big0 } - genesis.Genesis.Alloc[addr] = acc + genesis.Alloc[addr] = acc } - // Configure post-merge forks - if forkConfig.ShanghaiTime != nil { - genesis.Genesis.Config.ShanghaiTime = forkConfig.ShanghaiTime + if chainConfig.CancunTime != nil { + var beaconRootContractAcc core.GenesisAccount + if err := json.Unmarshal([]byte(embeddedBeaconRootContract), &beaconRootContractAcc); err != nil { + panic(err) + } + genesis.Alloc[beaconRootContractAddress] = beaconRootContractAcc + + if genesis.Timestamp >= *chainConfig.CancunTime { + if genesis.BlobGasUsed == nil { + genesis.BlobGasUsed = new(uint64) + } + if genesis.ExcessBlobGas == nil { + genesis.ExcessBlobGas = new(uint64) + } + } + } + + wrappedGenesis := &ExecutionGenesis{ + Genesis: genesis, + Block: genesis.ToBlock(), + DepositAddress: depositContractAddr, } + wrappedGenesis.Hash = wrappedGenesis.Block.Hash() // Configure consensus - if err := consensus.Configure(&genesis); err != nil { - panic(err) + if err := consensus.Configure(wrappedGenesis); err != nil { + return nil, err } - return &genesis + return wrappedGenesis, nil +} + +func (genesis *ExecutionGenesis) NetworkID() uint64 { + return 7 +} + +func (genesis *ExecutionGenesis) ChainID() uint64 { + return genesis.Genesis.Config.ChainID.Uint64() +} + +func (genesis *ExecutionGenesis) IsPostMerge() bool { + return genesis.Block.Difficulty().Cmp(genesis.Genesis.Config.TerminalTotalDifficulty) >= 0 } func (conf *ExecutionGenesis) ToParams( @@ -280,7 +364,7 @@ func (conf *ExecutionGenesis) ToParams( ) hivesim.Params { params := hivesim.Params{ "HIVE_DEPOSIT_CONTRACT_ADDRESS": common.Address(depositAddress).String(), - "HIVE_NETWORK_ID": fmt.Sprintf("%d", conf.NetworkID), + "HIVE_NETWORK_ID": fmt.Sprintf("%d", conf.NetworkID()), "HIVE_CHAIN_ID": conf.Genesis.Config.ChainID.String(), "HIVE_FORK_HOMESTEAD": conf.Genesis.Config.HomesteadBlock.String(), //"HIVE_FORK_DAO_BLOCK": conf.Genesis.Config.DAOForkBlock.String(), // nil error, not used anyway @@ -300,16 +384,15 @@ func (conf *ExecutionGenesis) ToParams( if conf.Genesis.Config.ShanghaiTime != nil { params["HIVE_SHANGHAI_TIMESTAMP"] = fmt.Sprint(*conf.Genesis.Config.ShanghaiTime) } + if conf.Genesis.Config.CancunTime != nil { + params["HIVE_CANCUN_TIMESTAMP"] = fmt.Sprint(*conf.Genesis.Config.CancunTime) + } if conf.Genesis.Config.Clique != nil { params["HIVE_CLIQUE_PERIOD"] = fmt.Sprint(conf.Genesis.Config.Clique.Period) } return params } -func IsEth1GenesisPostMerge(genesis *core.Genesis) bool { - return genesis.Config.TerminalTotalDifficulty.Cmp(genesis.Difficulty) <= 0 -} - func ExecutionBundle(genesis *core.Genesis) (hivesim.StartOption, error) { out, err := json.Marshal(genesis) if err != nil { diff --git a/simulators/eth2/common/config/execution/execution_config_test.go b/simulators/eth2/common/config/execution/execution_config_test.go new file mode 100644 index 0000000000..2644428f79 --- /dev/null +++ b/simulators/eth2/common/config/execution/execution_config_test.go @@ -0,0 +1,69 @@ +package execution_config + +import ( + "math/big" + "testing" + + "github.com/ethereum/hive/simulators/eth2/common/config" +) + +func TestBuildChainConfig(t *testing.T) { + slotsPerEpoch := uint64(32) + slotTime := uint64(12) + beaconChainGenesisTime := uint64(1634025600) + ttd := big.NewInt(200) + chainConfig, err := BuildChainConfig(ttd, beaconChainGenesisTime, slotsPerEpoch, slotTime, &config.ForkConfig{ + AltairForkEpoch: big.NewInt(0), + BellatrixForkEpoch: big.NewInt(200), + CapellaForkEpoch: nil, + DenebForkEpoch: nil, + }) + if err != nil { + t.Fatalf("Error producing chainConfig: %v", err) + } + if chainConfig.ShanghaiTime != nil { + t.Fatal("ShanghaiTime is not nil") + } + if chainConfig.CancunTime != nil { + t.Fatal("CancunTime is not nil") + } + if chainConfig.TerminalTotalDifficulty.Cmp(ttd) != 0 { + t.Fatalf("Incorrect TerminalTotalDifficulty is not %d", ttd) + } + + // Shanghai Chain Config Test + ttd = big.NewInt(0) + chainConfig, err = BuildChainConfig(ttd, beaconChainGenesisTime, slotsPerEpoch, slotTime, &config.ForkConfig{ + AltairForkEpoch: big.NewInt(0), + BellatrixForkEpoch: big.NewInt(200), + CapellaForkEpoch: big.NewInt(200), + DenebForkEpoch: nil, + }) + if err != nil { + t.Fatalf("Error producing shanghaiChainConfig: %v", err) + } + if chainConfig.ShanghaiTime == nil { + t.Fatal("ShanghaiTime is nil") + } + if *chainConfig.ShanghaiTime != beaconChainGenesisTime+(slotsPerEpoch*slotTime*200) { + t.Fatalf("Incorrect ShanghaiTime is not %d", beaconChainGenesisTime+(slotsPerEpoch*slotTime)) + } + if chainConfig.CancunTime != nil { + t.Fatal("CancunTime is not nil") + } + if chainConfig.TerminalTotalDifficulty.Cmp(ttd) != 0 { + t.Fatalf("Incorrect TerminalTotalDifficulty is not %d", ttd) + } + + // Incorrectly configured epoch + ttd = big.NewInt(0) + chainConfig, err = BuildChainConfig(ttd, beaconChainGenesisTime, slotsPerEpoch, slotTime, &config.ForkConfig{ + AltairForkEpoch: big.NewInt(0), + BellatrixForkEpoch: big.NewInt(200), + CapellaForkEpoch: big.NewInt(199), + DenebForkEpoch: nil, + }) + if err == nil { + t.Fatalf("Expected error producing chainConfig") + } +} diff --git a/simulators/eth2/common/debug/debug.go b/simulators/eth2/common/debug/debug.go index e09253648d..8ac76cc486 100644 --- a/simulators/eth2/common/debug/debug.go +++ b/simulators/eth2/common/debug/debug.go @@ -45,7 +45,7 @@ func PrintAllBeaconBlocks( ) if versionedBlock, err := b.BlockV2(parentCtx, eth2api.BlockIdRoot(root)); err == nil { - if executionPayload, err := versionedBlock.ExecutionPayload(); err == nil { + if executionPayload, _, _, err := versionedBlock.ExecutionPayload(); err == nil { execution = utils.Shorten(executionPayload.BlockHash.Hex()) } } @@ -190,7 +190,7 @@ func PrintAllTestnetBeaconBlocks( ) if versionedBlock, err := beaconNode.BlockV2(parentCtx, eth2api.BlockIdRoot(root)); err == nil { - if executionPayload, err := versionedBlock.ExecutionPayload(); err == nil { + if executionPayload, _, _, err := versionedBlock.ExecutionPayload(); err == nil { execution = executionPayload.BlockHash l.Logf( "Node %d: Execution payload: hash=%s", diff --git a/simulators/eth2/common/go.mod b/simulators/eth2/common/go.mod index a69a55e15b..2534aaf89f 100644 --- a/simulators/eth2/common/go.mod +++ b/simulators/eth2/common/go.mod @@ -1,82 +1,171 @@ module github.com/ethereum/hive/simulators/eth2/common -go 1.18 +go 1.21 + +toolchain go1.22.0 require ( - github.com/ethereum/go-ethereum v1.11.5 - github.com/ethereum/hive v0.0.0-20230401205547-71595beab31d - github.com/google/uuid v1.3.0 + github.com/ethereum/go-ethereum v1.13.14 + github.com/ethereum/hive v0.0.0-20231031133732-dcd7ddb75960 + github.com/ethereum/hive/simulators/ethereum/engine v0.0.0-20240305003323-ebe431380e1c + github.com/google/uuid v1.6.0 github.com/herumi/bls-eth-go-binary v1.29.1 - github.com/holiman/uint256 v1.2.2 - github.com/marioevz/eth-clients v0.0.0-20230503173323-98293c926363 - github.com/marioevz/mock-builder v0.0.0-20230515180219-3b0b5c3eefe3 + github.com/holiman/uint256 v1.2.4 + github.com/lithammer/dedent v1.1.0 + github.com/marioevz/blobber v1.1.1-0.20240228051014-aa5f0f9031a9 + github.com/marioevz/eth-clients v0.0.0-20231123180401-b4230c802498 + github.com/marioevz/mock-builder v1.1.1-0.20231123171249-08b59e943190 github.com/pkg/errors v0.9.1 github.com/protolambda/bls12-381-util v0.0.0-20220416220906-d8552aa452c7 github.com/protolambda/eth2api v0.0.0-20230316214135-5f8afbd6d05d - github.com/protolambda/go-keystorev4 v0.0.0-20211007151826-f20444f6d564 - github.com/protolambda/zrnt v0.30.0 + github.com/protolambda/go-keystorev4 v0.1.0 + github.com/protolambda/zrnt v0.32.3 github.com/protolambda/ztyp v0.2.2 github.com/rauljordan/engine-proxy v0.0.0-20230316220057-4c80c36c4c3a github.com/tyler-smith/go-bip39 v1.1.0 github.com/wealdtech/go-eth2-util v1.8.1 - golang.org/x/exp v0.0.0-20230321023759-10a507213a29 + golang.org/x/exp v0.0.0-20240213143201-ec583247a57a gopkg.in/yaml.v2 v2.4.0 ) require ( github.com/DataDog/zstd v1.5.2 // indirect + github.com/Microsoft/go-winio v0.6.1 // indirect github.com/VictoriaMetrics/fastcache v1.12.1 // indirect + github.com/benbjohnson/clock v1.3.5 // indirect github.com/beorn7/perks v1.0.1 // indirect + github.com/bits-and-blooms/bitset v1.10.0 // indirect github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/cockroachdb/errors v1.9.1 // indirect github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect - github.com/cockroachdb/pebble v0.0.0-20230404150825-93eff0a72e22 // indirect + github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593 // indirect github.com/cockroachdb/redact v1.1.3 // indirect + github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect + github.com/consensys/bavard v0.1.13 // indirect + github.com/consensys/gnark-crypto v0.12.1 // indirect + github.com/containerd/cgroups v1.1.0 // indirect + github.com/coreos/go-systemd/v22 v22.5.0 // indirect + github.com/crate-crypto/go-kzg-4844 v0.7.0 // indirect + github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c // indirect github.com/deckarep/golang-set/v2 v2.3.0 // indirect - github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 // indirect - github.com/edsrzf/mmap-go v1.1.0 // indirect + github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 // indirect + github.com/docker/go-units v0.5.0 // indirect + github.com/elastic/gosigar v0.14.2 // indirect + github.com/ethereum/c-kzg-4844 v0.4.0 // indirect github.com/ferranbt/fastssz v0.1.3 // indirect + github.com/flynn/noise v1.1.0 // indirect + github.com/francoispqt/gojay v1.2.13 // indirect github.com/getsentry/sentry-go v0.20.0 // indirect github.com/go-ole/go-ole v1.2.6 // indirect github.com/go-stack/stack v1.8.1 // indirect + github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect + github.com/godbus/dbus/v5 v5.1.0 // indirect github.com/gofrs/flock v0.8.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang-jwt/jwt/v4 v4.5.0 // indirect - github.com/golang/protobuf v1.5.3 // indirect github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect + github.com/google/gopacket v1.1.19 // indirect + github.com/google/pprof v0.0.0-20240207164012-fb44976bdcd5 // indirect github.com/gorilla/mux v1.8.0 // indirect - github.com/gorilla/websocket v1.5.0 // indirect + github.com/gorilla/websocket v1.5.1 // indirect + github.com/hashicorp/golang-lru/v2 v2.0.5 // indirect github.com/holiman/bloomfilter/v2 v2.0.3 // indirect + github.com/huin/goupnp v1.3.0 // indirect + github.com/ipfs/go-cid v0.4.1 // indirect + github.com/ipfs/go-log/v2 v2.5.1 // indirect + github.com/jackpal/go-nat-pmp v1.0.2 // indirect + github.com/jbenet/go-temp-err-catcher v0.1.0 // indirect github.com/julienschmidt/httprouter v1.3.0 // indirect github.com/kilic/bls12-381 v0.1.0 // indirect - github.com/klauspost/compress v1.16.3 // indirect - github.com/klauspost/cpuid/v2 v2.2.4 // indirect + github.com/klauspost/compress v1.17.6 // indirect + github.com/klauspost/cpuid/v2 v2.2.7 // indirect + github.com/koron/go-ssdp v0.0.4 // indirect github.com/kr/pretty v0.3.1 // indirect github.com/kr/text v0.2.0 // indirect + github.com/libp2p/go-buffer-pool v0.1.0 // indirect + github.com/libp2p/go-flow-metrics v0.1.0 // indirect + github.com/libp2p/go-libp2p v0.33.0 // indirect + github.com/libp2p/go-libp2p-asn-util v0.4.1 // indirect + github.com/libp2p/go-libp2p-mplex v0.9.0 // indirect + github.com/libp2p/go-libp2p-pubsub v0.10.0 // indirect + github.com/libp2p/go-mplex v0.7.0 // indirect + github.com/libp2p/go-msgio v0.3.0 // indirect + github.com/libp2p/go-nat v0.2.0 // indirect + github.com/libp2p/go-netroute v0.2.1 // indirect + github.com/libp2p/go-reuseport v0.4.0 // indirect + github.com/libp2p/go-yamux/v4 v4.0.1 // indirect + github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd // indirect + github.com/mattn/go-isatty v0.0.20 // indirect github.com/mattn/go-runewidth v0.0.14 // indirect - github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect - github.com/minio/sha256-simd v1.0.0 // indirect + github.com/miekg/dns v1.1.58 // indirect + github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b // indirect + github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc // indirect + github.com/minio/sha256-simd v1.0.1 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect + github.com/mmcloughlin/addchain v0.4.0 // indirect + github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 // indirect + github.com/mr-tron/base58 v1.2.0 // indirect + github.com/multiformats/go-base32 v0.1.0 // indirect + github.com/multiformats/go-base36 v0.2.0 // indirect + github.com/multiformats/go-multiaddr v0.12.2 // indirect + github.com/multiformats/go-multiaddr-dns v0.3.1 // indirect + github.com/multiformats/go-multiaddr-fmt v0.1.0 // indirect + github.com/multiformats/go-multibase v0.2.0 // indirect + github.com/multiformats/go-multicodec v0.9.0 // indirect + github.com/multiformats/go-multihash v0.2.3 // indirect + github.com/multiformats/go-multistream v0.5.0 // indirect + github.com/multiformats/go-varint v0.0.7 // indirect github.com/olekukonko/tablewriter v0.0.5 // indirect - github.com/prometheus/client_golang v1.14.0 // indirect - github.com/prometheus/client_model v0.3.0 // indirect - github.com/prometheus/common v0.42.0 // indirect - github.com/prometheus/procfs v0.9.0 // indirect + github.com/onsi/ginkgo/v2 v2.15.0 // indirect + github.com/opencontainers/runtime-spec v1.2.0 // indirect + github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 // indirect + github.com/prometheus/client_golang v1.18.0 // indirect + github.com/prometheus/client_model v0.6.0 // indirect + github.com/prometheus/common v0.47.0 // indirect + github.com/prometheus/procfs v0.12.0 // indirect + github.com/prysmaticlabs/fastssz v0.0.0-20221107182844-78142813af44 // indirect + github.com/prysmaticlabs/gohashtree v0.0.3-alpha // indirect + github.com/prysmaticlabs/prysm/v4 v4.2.1 // indirect + github.com/quic-go/qpack v0.4.0 // indirect + github.com/quic-go/quic-go v0.41.0 // indirect + github.com/quic-go/webtransport-go v0.6.0 // indirect + github.com/raulk/go-watchdog v1.3.0 // indirect github.com/rivo/uniseg v0.4.4 // indirect github.com/rogpeppe/go-internal v1.10.0 // indirect github.com/shirou/gopsutil v3.21.11+incompatible // indirect - github.com/sirupsen/logrus v1.9.0 // indirect - github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a // indirect - github.com/tklauser/go-sysconf v0.3.11 // indirect - github.com/tklauser/numcpus v0.6.0 // indirect + github.com/sirupsen/logrus v1.9.3 // indirect + github.com/spaolacci/murmur3 v1.1.0 // indirect + github.com/supranational/blst v0.3.11 // indirect + github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d // indirect + github.com/thomaso-mirodin/intmath v0.0.0-20160323211736-5dc6d854e46e // indirect + github.com/tklauser/go-sysconf v0.3.12 // indirect + github.com/tklauser/numcpus v0.6.1 // indirect github.com/wealdtech/go-bytesutil v1.2.1 // indirect github.com/wealdtech/go-eth2-types/v2 v2.8.1 // indirect github.com/yusufpapurcu/wmi v1.2.2 // indirect - golang.org/x/crypto v0.7.0 // indirect - golang.org/x/sys v0.7.0 // indirect - golang.org/x/text v0.8.0 // indirect - google.golang.org/protobuf v1.30.0 // indirect - gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce // indirect + go.uber.org/dig v1.17.1 // indirect + go.uber.org/fx v1.20.1 // indirect + go.uber.org/mock v0.4.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + go.uber.org/zap v1.27.0 // indirect + golang.org/x/crypto v0.19.0 // indirect + golang.org/x/mod v0.15.0 // indirect + golang.org/x/net v0.21.0 // indirect + golang.org/x/sync v0.6.0 // indirect + golang.org/x/sys v0.17.0 // indirect + golang.org/x/text v0.14.0 // indirect + golang.org/x/tools v0.18.0 // indirect + google.golang.org/protobuf v1.32.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect + lukechampine.com/blake3 v1.2.1 // indirect + rsc.io/tmplfunc v0.0.3 // indirect ) + +replace github.com/protolambda/zrnt => github.com/marioevz/zrnt v0.26.2-0.20231109183115-d2098ec1f42c + +replace github.com/protolambda/eth2api => github.com/marioevz/eth2api v0.0.0-20230922201437-72bd1301e033 + +replace github.com/ethereum/go-ethereum => github.com/lightclient/go-ethereum v1.10.10-0.20231019143932-4d161dee0c4c + +replace github.com/protolambda/ztyp => github.com/marioevz/ztyp v0.0.0-20231106221254-dd6f24f13fd9 diff --git a/simulators/eth2/common/go.sum b/simulators/eth2/common/go.sum index afdad59ad9..04657910cf 100644 --- a/simulators/eth2/common/go.sum +++ b/simulators/eth2/common/go.sum @@ -1,107 +1,187 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.31.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.37.0/go.mod h1:TS1dMSSfndXH133OKGwekG838Om/cQT0BUHV3HcBgoo= +contrib.go.opencensus.io/exporter/jaeger v0.2.1 h1:yGBYzYMewVL0yO9qqJv3Z5+IRhPdU7e9o/2oKpX4YvI= +contrib.go.opencensus.io/exporter/jaeger v0.2.1/go.mod h1:Y8IsLgdxqh1QxYxPC5IgXVmBaeLUeQFfBeBi9PbeZd0= +dmitri.shuralyov.com/app/changes v0.0.0-20180602232624-0a106ad413e3/go.mod h1:Yl+fi1br7+Rr3LqpNJf1/uxUdtRUV+Tnj0o93V2B9MU= +dmitri.shuralyov.com/html/belt v0.0.0-20180602232347-f7d459c86be0/go.mod h1:JLBrvjyP0v+ecvNYvCpyZgu5/xkfAUhi6wJj28eUfSU= +dmitri.shuralyov.com/service/change v0.0.0-20181023043359-a85b471d5412/go.mod h1:a1inKt/atXimZ4Mv927x+r7UpyzRUf4emIoiiSC2TN4= +dmitri.shuralyov.com/state v0.0.0-20180228185332-28bcc343414c/go.mod h1:0PRwlb0D6DFvNNtx+9ybjezNCa8XF0xaYcETyp6rHWU= +git.apache.org/thrift.git v0.0.0-20180902110319-2566ecd5d999/go.mod h1:fPE2ZNJGynbRyZ4dJvy6G277gSllfV2HJqblrnkyeyg= github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/toml v1.3.2 h1:o7IhLm0Msx3BaB+n3Ag7L8EVlByGnpq14C4YWiu/gL8= +github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= github.com/CloudyKit/fastprinter v0.0.0-20200109182630-33d98a066a53/go.mod h1:+3IMCy2vIlbG1XG/0ggNQv0SvxCAIpPM5b1nCz56Xno= github.com/CloudyKit/jet/v3 v3.0.0/go.mod h1:HKQPgSJmdK8hdoAbKUUWajkHyHo4RaU5rMdUywE7VMo= github.com/DataDog/zstd v1.5.2 h1:vUG4lAyuPCXO0TLbXvPv7EB7cNK1QV/luu55UHLrrn8= github.com/DataDog/zstd v1.5.2/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= github.com/Joker/hpp v1.0.0/go.mod h1:8x5n+M1Hp5hC0g8okX3sR3vFQwynaX/UgSOM9MeBKzY= +github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= +github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= github.com/Shopify/goreferrer v0.0.0-20181106222321-ec9c9a553398/go.mod h1:a1uqRtAwp2Xwc6WNPJEufxJ7fx3npB4UV/JOLmbu5I0= github.com/VictoriaMetrics/fastcache v1.12.1 h1:i0mICQuojGDL3KblA7wUNlY5lOK6a4bwt3uRKnkZU40= github.com/VictoriaMetrics/fastcache v1.12.1/go.mod h1:tX04vaqcNoQeGLD+ra5pU5sWkuxnzWhEzLwhP9w653o= github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY= github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= github.com/allegro/bigcache v1.2.1 h1:hg1sY1raCwic3Vnsvje6TT7/pnZba83LeFck5NrFKSc= +github.com/allegro/bigcache v1.2.1/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= +github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/aymerick/raymond v2.0.3-0.20180322193309-b565731e1464+incompatible/go.mod h1:osfaiScAUVup+UC9Nfq76eWqDhXlp+4UYaA8uhTBO6g= +github.com/bazelbuild/rules_go v0.23.2 h1:Wxu7JjqnF78cKZbsBsARLSXx/jlGaSLCnUV3mTlyHvM= +github.com/bazelbuild/rules_go v0.23.2/go.mod h1:MC23Dc/wkXEyk3Wpq6lCqz0ZAYOZDw2DR5y3N1q2i7M= +github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= +github.com/benbjohnson/clock v1.3.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= +github.com/benbjohnson/clock v1.3.5 h1:VvXlSJBzZpA/zum6Sj74hxwYI2DIxRWuNIoXAzHZz5o= +github.com/benbjohnson/clock v1.3.5/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= +github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/bits-and-blooms/bitset v1.10.0 h1:ePXTeiPEazB5+opbv5fr8umg2R/1NlzgDsyepwsSr88= +github.com/bits-and-blooms/bitset v1.10.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= +github.com/bradfitz/go-smtpd v0.0.0-20170404230938-deb6d6237625/go.mod h1:HYsPBTaaSFSlLx/70C2HPIMNZpVV8+vt/A+FMnYP11g= github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U= github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= +github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= +github.com/buger/jsonparser v0.0.0-20181115193947-bf1c66bbce23/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/cilium/ebpf v0.2.0/go.mod h1:To2CFviqOWL/M0gIMsvSMlqe7em/l1ALkX1PyjrX2Qs= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cockroachdb/datadriven v1.0.2 h1:H9MtNqVoVhvd9nCBwOyDjUEdZCREqbIdCJD93PBm/jA= github.com/cockroachdb/datadriven v1.0.2/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= +github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f h1:otljaYPt5hWxV3MUfO5dFPFiOXg9CyG5/kCfayTqsJ4= +github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= github.com/cockroachdb/errors v1.9.1 h1:yFVvsI0VxmRShfawbt/laCIDy/mtTqqnvoNgiy5bEV8= github.com/cockroachdb/errors v1.9.1/go.mod h1:2sxOtL2WIc096WSZqZ5h8fa17rdDq9HZOZLBCor4mBk= github.com/cockroachdb/logtags v0.0.0-20211118104740-dabe8e521a4f/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= -github.com/cockroachdb/pebble v0.0.0-20230404150825-93eff0a72e22 h1:2Nwgec/S3FkQW3r807JL9+D2xb2XU9zbRCotvQWLIfY= -github.com/cockroachdb/pebble v0.0.0-20230404150825-93eff0a72e22/go.mod h1:9lRMC4XN3/BLPtIp6kAKwIaHu369NOf2rMucPzipz50= +github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593 h1:aPEJyR4rPBvDmeyi+l/FS/VtA00IWvjeFvjen1m1l1A= +github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593/go.mod h1:6hk1eMY/u5t+Cf18q5lFMUA1Rc+Sm5I6Ra1QuPyxXCo= github.com/cockroachdb/redact v1.1.3 h1:AKZds10rFSIj7qADf0g46UixK8NNLwWTNdCIGS5wfSQ= github.com/cockroachdb/redact v1.1.3/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= +github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo= +github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ= github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0/go.mod h1:4Zcjuz89kmFXt9morQgcfYZAYZ5n8WHjt81YYWIwtTM= +github.com/consensys/bavard v0.1.13 h1:oLhMLOFGTLdlda/kma4VOJazblc7IM5y5QPd2A/YjhQ= +github.com/consensys/bavard v0.1.13/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI= +github.com/consensys/gnark-crypto v0.12.1 h1:lHH39WuuFgVHONRl3J0LRBtuYdQTumFSDtJF7HpyG8M= +github.com/consensys/gnark-crypto v0.12.1/go.mod h1:v2Gy7L/4ZRosZ7Ivs+9SfUDr0f5UlG+EM5t7MPHiLuY= +github.com/containerd/cgroups v0.0.0-20201119153540-4cbc285b3327/go.mod h1:ZJeTFisyysqgcCdecO57Dj79RfL0LNeGiFUqLYQRYLE= +github.com/containerd/cgroups v1.1.0 h1:v8rEWFl6EoqHB+swVNjVoCJE8o3jX7e8nqBGPLaDFBM= +github.com/containerd/cgroups v1.1.0/go.mod h1:6ppBcbh/NOOUU+dMKrykgaBnK9lCIBxHqJDGwsa1mIw= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-systemd v0.0.0-20181012123002-c6f51f82210d/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd/v22 v22.1.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= +github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs= +github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/cpuguy83/go-md2man v1.0.10 h1:BSKMNlYxDvnunlTymqtgONjNnaRV1sTpcovwwjF22jk= github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= +github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= +github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/crate-crypto/go-kzg-4844 v0.7.0 h1:C0vgZRk4q4EZ/JgPfzuSoxdCq3C3mOZMBShovmncxvA= +github.com/crate-crypto/go-kzg-4844 v0.7.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/d4l3k/messagediff v1.2.1 h1:ZcAIMYsUg0EAp9X+tt8/enBE/Q8Yd5kzPynLyKptt9U= +github.com/d4l3k/messagediff v1.2.1/go.mod h1:Oozbb1TVXFac9FtSIxHBMnBCq2qeH/2KkEQxENCrlLo= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c h1:pFUpOrbxDR6AkioZ1ySsx5yxlDQZ8stG2b88gTPxgJU= +github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c/go.mod h1:6UhI8N9EjYm1c2odKpFpAYeR8dsBeM7PtzQhRgxRr9U= github.com/deckarep/golang-set/v2 v2.3.0 h1:qs18EKUfHm2X9fA50Mr/M5hccg2tNnVqsiBImnyDs0g= github.com/deckarep/golang-set/v2 v2.3.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= -github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0= -github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 h1:HbphB4TFFXpv7MNrT52FGrrgVXF1owhMVTHFZIlnvd4= -github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0/go.mod h1:DZGJHZMqrU4JJqFAWUS2UO1+lbSKsdiOoYi9Zzey7Fc= +github.com/decred/dcrd/crypto/blake256 v1.0.1 h1:7PltbUIQB7u/FfZ39+DGa/ShuMyJ5ilcvdfma9wOH6Y= +github.com/decred/dcrd/crypto/blake256 v1.0.1/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 h1:8UrgZ3GkP4i/CLijOJx79Yu+etlyjdBU4sfcs2WYQMs= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0= github.com/dgraph-io/badger v1.6.0/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6psNgSztDR4= github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= +github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/edsrzf/mmap-go v1.1.0 h1:6EUwBLQ/Mcr1EYLE4Tn1VdW1A4ckqCQWZBw8Hr0kjpQ= -github.com/edsrzf/mmap-go v1.1.0/go.mod h1:19H/e8pUPLicwkyNgOykDXkJ9F0MHE+Z52B8EIth78Q= github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385/go.mod h1:0vRUJqYpeSZifjYj7uP3BG/gKcuzL9xWVV/Y+cK33KM= +github.com/elastic/gosigar v0.12.0/go.mod h1:iXRIGg2tLnu7LBdpqzyQfGDEidKCfWcCMS0WKyPWoMs= +github.com/elastic/gosigar v0.14.2 h1:Dg80n8cr90OZ7x+bAax/QjoW/XqTI11RmA79ZwIm9/4= +github.com/elastic/gosigar v0.14.2/go.mod h1:iXRIGg2tLnu7LBdpqzyQfGDEidKCfWcCMS0WKyPWoMs= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/etcd-io/bbolt v1.3.3/go.mod h1:ZF2nL25h33cCyBtcyWeZ2/I3HQOfTP+0PIEvHjkjCrw= -github.com/ethereum/go-ethereum v1.11.5 h1:3M1uan+LAUvdn+7wCEFrcMM4LJTeuxDrPTg/f31a5QQ= -github.com/ethereum/go-ethereum v1.11.5/go.mod h1:it7x0DWnTDMfVFdXcU6Ti4KEFQynLHVRarcSlPr0HBo= -github.com/ethereum/hive v0.0.0-20230401205547-71595beab31d h1:aYS/z/WooDYsJKpOoZ/ha8Zg+CwSf9Kp1919rnmmC0s= -github.com/ethereum/hive v0.0.0-20230401205547-71595beab31d/go.mod h1:zKL2DscVzRusnGVpseAvLrXGJ3qrGHuSfOIrv4JfnRk= +github.com/ethereum/c-kzg-4844 v0.4.0 h1:3MS1s4JtA868KpJxroZoepdV0ZKBp3u/O5HcZ7R3nlY= +github.com/ethereum/c-kzg-4844 v0.4.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= +github.com/ethereum/hive v0.0.0-20231031133732-dcd7ddb75960 h1:7H9z2o/KImWQ/1PACU3ewsSFNxT/lzwYRnwit2YFqMg= +github.com/ethereum/hive v0.0.0-20231031133732-dcd7ddb75960/go.mod h1:sV7LrFBlEii71kI9udVbUVj7SXIifZ2VzFjQ8S6rZns= +github.com/ethereum/hive/simulators/ethereum/engine v0.0.0-20240305003323-ebe431380e1c h1:EBlnoT34Ea4Y7kVmmIoYqtdNvNmabQlir7SIQ0UCS/A= +github.com/ethereum/hive/simulators/ethereum/engine v0.0.0-20240305003323-ebe431380e1c/go.mod h1:nag0wj4K1/0AEP1VAKwY08N4I9yymrwXsX4+n0YFfdw= github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072/go.mod h1:duJ4Jxv5lDcvg4QuQr0oowTf7dz4/CR8NtyCooz9HL8= github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= github.com/ferranbt/fastssz v0.1.3 h1:ZI+z3JH05h4kgmFXdHuR1aWYsgrg7o+Fw7/NCzM16Mo= github.com/ferranbt/fastssz v0.1.3/go.mod h1:0Y9TEd/9XuFlh7mskMPfXiI2Dkw4Ddg9EyXt1W7MRvE= -github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5 h1:FtmdgXiUlNeRsoNMFlKLDt+S+6hbjVMEW6RGQ7aUf7c= +github.com/fjl/memsize v0.0.1 h1:+zhkb+dhUgx0/e+M8sF0QqiouvMQUiKR+QYvdxIOKcQ= +github.com/fjl/memsize v0.0.1/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= +github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= +github.com/flynn/noise v1.1.0 h1:KjPQoQCEFdZDiP03phOvGi11+SVVhBG2wOWAorLsstg= +github.com/flynn/noise v1.1.0/go.mod h1:xbMo+0i6+IGbYdJhF31t2eR1BIU0CYc12+BNAKwUTag= +github.com/francoispqt/gojay v1.2.13 h1:d2m3sFjloqoIUQU3TsHBgj6qg/BVGlTBeHDUmyJnXKk= +github.com/francoispqt/gojay v1.2.13/go.mod h1:ehT5mTG4ua4581f1++1WLG0vPdaA9HaiDsoyrBGkyDY= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= +github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= github.com/gavv/httpexpect v2.0.0+incompatible/go.mod h1:x+9tiU1YnrOvnB725RkpoLv1M62hOWzwo5OXotisrKc= -github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff h1:tY80oXqGNY4FhTFhk+o9oFHGINQ/+vhlm8HFzi6znCI= +github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08 h1:f6D9Hr8xV8uYKlyuj8XIruxlh9WjVjdh1gIicAS7ays= +github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= github.com/getsentry/sentry-go v0.12.0/go.mod h1:NSap0JBYWzHND8oMbyi0+XZhUalc1TBdRL1M71JZW2c= github.com/getsentry/sentry-go v0.20.0 h1:bwXW98iMRIWxn+4FgPW7vMrjmbym6HblXALmhjHmQaQ= github.com/getsentry/sentry-go v0.20.0/go.mod h1:lc76E2QywIyW8WuBnwl8Lc4bkmQH4+w1gwTf25trprY= +github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3/go.mod h1:VJ0WA2NBN22VlZ2dKZQPAPnyWw5XTlK1KymzLKsr59s= github.com/gin-gonic/gin v1.4.0/go.mod h1:OW2EZn3DO8Ln9oIKOvM++LBO+5UPHJJDH72/q/3rZdM= +github.com/gliderlabs/ssh v0.1.1/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= +github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= +github.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY= +github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab/go.mod h1:/P9AEU963A2AYjv4d1V5eVL1CQbEJq6aCNHDDjibzu8= github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-stack/stack v1.8.1 h1:ntEHSVwIt7PNXNpgPmVfMrNhLtgjlmnZha2kOpuRiDw= github.com/go-stack/stack v1.8.1/go.mod h1:dcoOX6HbPZSZptuspn9bctJ+N/CnF5gGygcUP3XYfe4= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= +github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= +github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= +github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk= +github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= github.com/gogo/googleapis v0.0.0-20180223154316-0cd9801be74a/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= github.com/gogo/googleapis v1.4.1/go.mod h1:2lpHqI5OcWCtVElxXnPt+s8oJvMpySlOyM6xDCrzib4= +github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/gogo/status v1.1.0/go.mod h1:BFv9nrluPLmrS0EmGVvLaPNmRosr9KapBYd5/hpY1WM= @@ -109,11 +189,14 @@ github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzq github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e h1:1r7pUrabqp18hOBcwBwiTsbnFeTZHV9eER/QT5JVZxY= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:tluoj9z5200jBnyusfRPU2LqT6J+DAorxEvtC7LHB+E= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= @@ -125,54 +208,92 @@ github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaS github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXiurYmW7fx4GZkL8feAMVq7nEjURHk= github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/gomodule/redigo v1.7.1-0.20190724094224-574c33c3df38/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4= +github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ= github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gopacket v1.1.19 h1:ves8RnFZPGiFnTS0uPQStjwru6uO6h+nlr9j6fL7kF8= +github.com/google/gopacket v1.1.19/go.mod h1:iJ8V8n6KS+z2U1A8pUwu8bW5SyEMkXJB8Yo/Vo+TKTo= +github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20240207164012-fb44976bdcd5 h1:E/LAvt58di64hlYjx7AsNS6C/ysHWYo+2qPCZKTQhRo= +github.com/google/pprof v0.0.0-20240207164012-fb44976bdcd5/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik= +github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= -github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/gax-go v2.0.0+incompatible/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY= +github.com/googleapis/gax-go/v2 v2.0.3/go.mod h1:LLvjysVCY1JZeum8Z6l8qUty8fiNwE08qbEPm1M08qg= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= -github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/hashicorp/go-bexpr v0.1.10 h1:9kuI5PFotCboP3dkDYFr/wi0gg0QVbSNz5oFRpxn4uE= +github.com/gorilla/websocket v1.5.1 h1:gmztn0JnHVt9JZquRuzLw3g4wouNVzKL15iLr/zn/QY= +github.com/gorilla/websocket v1.5.1/go.mod h1:x3kM2JMyaluk02fnUJpQuwD2dCS5NDG2ZHL0uE0tcaY= +github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= +github.com/grpc-ecosystem/grpc-gateway v1.5.0 h1:WcmKMm43DR7RdtlkEXQJyo5ws8iTp98CyhCCbOHMvNI= +github.com/grpc-ecosystem/grpc-gateway v1.5.0/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.0.1 h1:X2vfSnm1WC8HEo0MBHZg2TcuDUHJj6kd1TmEAQncnSA= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.0.1/go.mod h1:oVMjMN64nzEcepv1kdZKgx1qNYt4Ro0Gqefiq2JWdis= +github.com/hashicorp/go-bexpr v0.1.11 h1:6DqdA/KBjurGby9yTY0bmkathya0lfwF2SeuubCI7dY= +github.com/hashicorp/go-bexpr v0.1.11/go.mod h1:f03lAo0duBlDIUMGCuad8oLcgejw4m7U+N8T+6Kz1AE= github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d h1:dg1dEPuWpEqDnvIw251EVy4zlP8gWbsGj4BsUKCRpYs= +github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/golang-lru/v2 v2.0.5 h1:wW7h1TG88eUIJ2i69gaE3uNVtEPIagzhGvHgwfx2Vm4= +github.com/hashicorp/golang-lru/v2 v2.0.5/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/herumi/bls-eth-go-binary v1.29.1 h1:XcNSHYTyNjEUVfWDCE2gtG5r95biTwd7MJUJF09LtSE= github.com/herumi/bls-eth-go-binary v1.29.1/go.mod h1:luAnRm3OsMQeokhGzpYmc0ZKwawY7o87PUEP11Z7r7U= +github.com/holiman/billy v0.0.0-20230718173358-1c7e68d277a7 h1:3JQNjnMRil1yD0IfZKHF9GxxWKDJGj8I0IqOUol//sw= +github.com/holiman/billy v0.0.0-20230718173358-1c7e68d277a7/go.mod h1:5GuXa7vkL8u9FkFuWdVvfR5ix8hRB7DbOAaYULamFpc= github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao= github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA= github.com/holiman/uint256 v1.2.0/go.mod h1:y4ga/t+u+Xwd7CpDgZESaRcWy0I7XMlTMA25ApIH5Jw= -github.com/holiman/uint256 v1.2.2 h1:TXKcSGc2WaxPD2+bmzAsVthL4+pEN0YwXcL5qED83vk= -github.com/holiman/uint256 v1.2.2/go.mod h1:SC8Ryt4n+UBbPbIBKaG9zbbDlp4jOru9xFZmPzLUTxw= +github.com/holiman/uint256 v1.2.4 h1:jUc4Nk8fm9jZabQuqr2JzednajVmBpC+oiTiXZJEApU= +github.com/holiman/uint256 v1.2.4/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXeiRV4ng7E= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/huin/goupnp v1.0.3 h1:N8No57ls+MnjlB+JPiCVSOyy/ot7MJTqlo7rn+NYSqQ= +github.com/huin/goupnp v1.3.0 h1:UvLUlWDNpoUdYzb2TCn+MuTWtcjXKSza2n6CBdQ0xXc= +github.com/huin/goupnp v1.3.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8= github.com/hydrogen18/memlistener v0.0.0-20200120041712-dcc25e7acd91/go.mod h1:qEIFzExnS6016fRpRfxrExeVn2gbClQA99gQhnIcdhE= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/imkira/go-interpol v1.1.0/go.mod h1:z0h2/2T3XF8kyEPpRgJ3kmNv+C43p+I/CoI+jC3w2iA= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/ipfs/go-cid v0.4.1 h1:A/T3qGvxi4kpKWWcPC/PgbvDA2bjVLO7n4UeVwnbs/s= +github.com/ipfs/go-cid v0.4.1/go.mod h1:uQHwDeX4c6CtyrFwdqyhpNcxVewur1M7l7fNU7LKwZk= +github.com/ipfs/go-log/v2 v2.5.1 h1:1XdUzF7048prq4aBjDQQ4SL5RxftpRGdXhNRwKSAlcY= +github.com/ipfs/go-log/v2 v2.5.1/go.mod h1:prSpmC1Gpllc9UYWxDiZDreBYw7zp4Iqp1kOLU9U5UI= github.com/iris-contrib/blackfriday v2.0.0+incompatible/go.mod h1:UzZ2bDEoaSGPbkg6SAB4att1aAwTmVIx/5gCVqeyUdI= github.com/iris-contrib/go.uuid v2.0.0+incompatible/go.mod h1:iz2lgM/1UnEf1kP0L/+fafWORmlnuysV2EMP8MW+qe0= github.com/iris-contrib/jade v1.1.3/go.mod h1:H/geBymxJhShH5kecoiOCSssPX7QWYH7UaeZTSWddIk= github.com/iris-contrib/pongo2 v0.0.1/go.mod h1:Ssh+00+3GAZqSQb30AvBRNxBx7rf0GqwkjqxNd0u65g= github.com/iris-contrib/schema v0.0.1/go.mod h1:urYA3uvUNG1TIIjOSCzHr9/LmbQo8LrOcOqfqxa4hXw= github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= +github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= +github.com/jbenet/go-temp-err-catcher v0.1.0 h1:zpb3ZH6wIE8Shj2sKS+khgRvf7T7RABoLk/+KKHggpk= +github.com/jbenet/go-temp-err-catcher v0.1.0/go.mod h1:0kJRvmDZXNMIiJirNPEYfhpPwbGVtZVWC34vc5WLsDk= +github.com/jellevandenhooff/dkim v0.0.0-20150330215556-f50fe3d243e1/go.mod h1:E0B/fFc00Y+Rasa88328GlI/XbtyysCtTHZS8h7IrBU= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.3.0 h1:U0609e9tgbseu3rBINet9P48AI/D3oJs4dN7jwJOQ1U= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= @@ -184,73 +305,168 @@ github.com/kataras/pio v0.0.2/go.mod h1:hAoW0t9UmXi4R5Oyq5Z4irTbaTsOemSrDGUtaTl7 github.com/kataras/sitemap v0.0.5/go.mod h1:KY2eugMKiPwsJgx7+U103YZehfvNGOXURubcGyk0Bz8= github.com/kilic/bls12-381 v0.1.0 h1:encrdjqKMEvabVQ7qYOKu1OvhqpK4s47wDYtNiPtlp4= github.com/kilic/bls12-381 v0.1.0/go.mod h1:vDTTHJONJ6G+P2R74EhnyotQDTliQDnFEwhdmfzw1ig= +github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/compress v1.8.2/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= github.com/klauspost/compress v1.9.7/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= -github.com/klauspost/compress v1.16.3 h1:XuJt9zzcnaz6a16/OU53ZjWp/v7/42WcR5t2a0PcNQY= -github.com/klauspost/compress v1.16.3/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= +github.com/klauspost/compress v1.17.6 h1:60eq2E/jlfwQXtvZEeBUYADs+BwKBWURIY+Gj2eRGjI= +github.com/klauspost/compress v1.17.6/go.mod h1:/dCuZOvVtNoHsyb+cuJD3itjs3NbnF6KH9zAO4BDxPM= github.com/klauspost/cpuid v1.2.1/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= -github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -github.com/klauspost/cpuid/v2 v2.2.4 h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk= -github.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= +github.com/klauspost/cpuid/v2 v2.2.7 h1:ZWSB3igEs+d0qvnxR/ZBzXVmxkgt8DdzP6m9pfuVLDM= +github.com/klauspost/cpuid/v2 v2.2.7/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= +github.com/koron/go-ssdp v0.0.4 h1:1IDwrghSKYM7yLf7XCzbByg2sJ/JcNOZRXS2jczTwz0= +github.com/koron/go-ssdp v0.0.4/go.mod h1:oDXq+E5IL5q0U8uSBcoAXzTzInwy5lEgC91HoKtbmZk= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/pty v1.1.3/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= +github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/labstack/echo/v4 v4.5.0/go.mod h1:czIriw4a0C1dFun+ObrXp7ok03xON0N1awStJ6ArI7Y= github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= +github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c= +github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= +github.com/libp2p/go-buffer-pool v0.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6cdF0Y8= +github.com/libp2p/go-buffer-pool v0.1.0/go.mod h1:N+vh8gMqimBzdKkSMVuydVDq+UV5QTWy5HSiZacSbPg= +github.com/libp2p/go-flow-metrics v0.1.0 h1:0iPhMI8PskQwzh57jB9WxIuIOQ0r+15PChFGkx3Q3WM= +github.com/libp2p/go-flow-metrics v0.1.0/go.mod h1:4Xi8MX8wj5aWNDAZttg6UPmc0ZrnFNsMtpsYUClFtro= +github.com/libp2p/go-libp2p v0.33.0 h1:yTPSr8sJRbfeEYXyeN8VPVSlTlFjtMUwGDRniwaf/xQ= +github.com/libp2p/go-libp2p v0.33.0/go.mod h1:RIJFRQVUBKy82dnW7J5f1homqqv6NcsDJAl3e7CRGfE= +github.com/libp2p/go-libp2p-asn-util v0.4.1 h1:xqL7++IKD9TBFMgnLPZR6/6iYhawHKHl950SO9L6n94= +github.com/libp2p/go-libp2p-asn-util v0.4.1/go.mod h1:d/NI6XZ9qxw67b4e+NgpQexCIiFYJjErASrYW4PFDN8= +github.com/libp2p/go-libp2p-mplex v0.9.0 h1:R58pDRAmuBXkYugbSSXR9wrTX3+1pFM1xP2bLuodIq8= +github.com/libp2p/go-libp2p-mplex v0.9.0/go.mod h1:ro1i4kuwiFT+uMPbIDIFkcLs1KRbNp0QwnUXM+P64Og= +github.com/libp2p/go-libp2p-pubsub v0.10.0 h1:wS0S5FlISavMaAbxyQn3dxMOe2eegMfswM471RuHJwA= +github.com/libp2p/go-libp2p-pubsub v0.10.0/go.mod h1:1OxbaT/pFRO5h+Dpze8hdHQ63R0ke55XTs6b6NwLLkw= +github.com/libp2p/go-libp2p-testing v0.12.0 h1:EPvBb4kKMWO29qP4mZGyhVzUyR25dvfUIK5WDu6iPUA= +github.com/libp2p/go-libp2p-testing v0.12.0/go.mod h1:KcGDRXyN7sQCllucn1cOOS+Dmm7ujhfEyXQL5lvkcPg= +github.com/libp2p/go-mplex v0.7.0 h1:BDhFZdlk5tbr0oyFq/xv/NPGfjbnrsDam1EvutpBDbY= +github.com/libp2p/go-mplex v0.7.0/go.mod h1:rW8ThnRcYWft/Jb2jeORBmPd6xuG3dGxWN/W168L9EU= +github.com/libp2p/go-msgio v0.3.0 h1:mf3Z8B1xcFN314sWX+2vOTShIE0Mmn2TXn3YCUQGNj0= +github.com/libp2p/go-msgio v0.3.0/go.mod h1:nyRM819GmVaF9LX3l03RMh10QdOroF++NBbxAb0mmDM= +github.com/libp2p/go-nat v0.2.0 h1:Tyz+bUFAYqGyJ/ppPPymMGbIgNRH+WqC5QrT5fKrrGk= +github.com/libp2p/go-nat v0.2.0/go.mod h1:3MJr+GRpRkyT65EpVPBstXLvOlAPzUVlG6Pwg9ohLJk= +github.com/libp2p/go-netroute v0.2.1 h1:V8kVrpD8GK0Riv15/7VN6RbUQ3URNZVosw7H2v9tksU= +github.com/libp2p/go-netroute v0.2.1/go.mod h1:hraioZr0fhBjG0ZRXJJ6Zj2IVEVNx6tDTFQfSmcq7mQ= +github.com/libp2p/go-reuseport v0.4.0 h1:nR5KU7hD0WxXCJbmw7r2rhRYruNRl2koHw8fQscQm2s= +github.com/libp2p/go-reuseport v0.4.0/go.mod h1:ZtI03j/wO5hZVDFo2jKywN6bYKWLOy8Se6DrI2E1cLU= +github.com/libp2p/go-yamux/v4 v4.0.1 h1:FfDR4S1wj6Bw2Pqbc8Uz7pCxeRBPbwsBbEdfwiCypkQ= +github.com/libp2p/go-yamux/v4 v4.0.1/go.mod h1:NWjl8ZTLOGlozrXSOZ/HlfG++39iKNnM5wwmtQP1YB4= +github.com/lightclient/go-ethereum v1.10.10-0.20231019143932-4d161dee0c4c h1:UsDsJSV7/j0C4aGqECXoPvdL6a6y7myXMptcnQjflEY= +github.com/lightclient/go-ethereum v1.10.10-0.20231019143932-4d161dee0c4c/go.mod h1:CLSRGaP4Ev4DJOP+JSk3NHyJIillQLJc/ZAyCLI8NOs= +github.com/lithammer/dedent v1.1.0 h1:VNzHMVCBNG1j0fh3OrsFRkVUwStdDArbgBWoPAffktY= +github.com/lithammer/dedent v1.1.0/go.mod h1:jrXYCQtgg0nJiN+StA2KgR7w6CiQNv9Fd/Z9BP0jIOc= +github.com/lunixbochs/vtclean v1.0.0/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/marioevz/eth-clients v0.0.0-20230501225027-135b7d52b617 h1:sk4stg95D93cfiIIYI+XPRhXZQ91QGIPOHNDZjmpXms= -github.com/marioevz/eth-clients v0.0.0-20230501225027-135b7d52b617/go.mod h1:LnzXFKyMw3wF/3eaTfPhKiwkWkZJXokOWcUI02Ioi4s= -github.com/marioevz/eth-clients v0.0.0-20230503000902-6ba8d15dfe6a h1:EbX/rlcGlMXhwlTibd+TWuN2G2mQKiahwH4xBFpzXo0= -github.com/marioevz/eth-clients v0.0.0-20230503000902-6ba8d15dfe6a/go.mod h1:LnzXFKyMw3wF/3eaTfPhKiwkWkZJXokOWcUI02Ioi4s= -github.com/marioevz/eth-clients v0.0.0-20230503173323-98293c926363 h1:ONwsdY5/heIE0HHxh4+QXkwa69MZuaO+vONXduNBbrM= -github.com/marioevz/eth-clients v0.0.0-20230503173323-98293c926363/go.mod h1:LnzXFKyMw3wF/3eaTfPhKiwkWkZJXokOWcUI02Ioi4s= -github.com/marioevz/mock-builder v0.0.0-20230501225822-df434a88e375 h1:44F0CrAc81Nzsr/4BhkeKebbrHERHdCjO6jXS9VAE/0= -github.com/marioevz/mock-builder v0.0.0-20230501225822-df434a88e375/go.mod h1:FQIXEFViaQkOqKrqLC91JgqG+6YEvqMVh9D7g6PmFUg= -github.com/marioevz/mock-builder v0.0.0-20230515180219-3b0b5c3eefe3 h1:LbF6BNBYypeF1pjTulvFr4vUSXeeT8B9ZeYCU9KDbuo= -github.com/marioevz/mock-builder v0.0.0-20230515180219-3b0b5c3eefe3/go.mod h1:FQIXEFViaQkOqKrqLC91JgqG+6YEvqMVh9D7g6PmFUg= +github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/marioevz/blobber v1.1.1-0.20240228051014-aa5f0f9031a9 h1:0N0luMkryC9Z/UCsPnIdd3a6n1Iv786L8lRpBOp90GE= +github.com/marioevz/blobber v1.1.1-0.20240228051014-aa5f0f9031a9/go.mod h1:7wGWXnUInWpcluqhusompgjT18fujAK/ibNxsuH4sgM= +github.com/marioevz/eth-clients v0.0.0-20231123180401-b4230c802498 h1:FHzV7rVAhib6tRhR/e4UTWupqWw3ikIme06O1x96Ynk= +github.com/marioevz/eth-clients v0.0.0-20231123180401-b4230c802498/go.mod h1:bhR5rKHekIvdWmsWUqRP6X6dLl05ohnH3X/+ZvKs3xg= +github.com/marioevz/eth2api v0.0.0-20230922201437-72bd1301e033 h1:sn57n+lbJrLS8FKYs08W7TEzraTGOCQGrSC4hni6rYw= +github.com/marioevz/eth2api v0.0.0-20230922201437-72bd1301e033/go.mod h1:hcwWCT4sF1X7KsMZ535MvDZVk5M20Uyj+x2LARZjQsM= +github.com/marioevz/mock-builder v1.1.1-0.20231123171249-08b59e943190 h1:vBXJeLFGRKZid18H4JQ+vhR+AQKU6fkx0Uc8JVMc3OI= +github.com/marioevz/mock-builder v1.1.1-0.20231123171249-08b59e943190/go.mod h1:17VX12ir8TOY2Ln2vy3jhjeVIGfrwmcsxY9VI0ZP1Zk= +github.com/marioevz/zrnt v0.26.2-0.20231109183115-d2098ec1f42c h1:ZwKLkGVKnAq1JZql6SBrQici0la1X7APcbBLwmrSsd4= +github.com/marioevz/zrnt v0.26.2-0.20231109183115-d2098ec1f42c/go.mod h1:ZctXHBa/2rlF85iao8oqQ8264DbEBBGWr6lwIOW2yv4= +github.com/marioevz/ztyp v0.0.0-20231106221254-dd6f24f13fd9 h1:e40k7kQLw2jyDg4+Mc+TVSSfm1TO51NxPZo9T7nVCzM= +github.com/marioevz/ztyp v0.0.0-20231106221254-dd6f24f13fd9/go.mod h1:9bYgKGqg3wJqT9ac1gI2hnVb0STQq7p/1lapqrqY1dU= +github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd h1:br0buuQ854V8u83wA0rVZ8ttrq5CpaPZdvrK0LP2lOk= +github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd/go.mod h1:QuCEs1Nt24+FYQEqAAncTDPJIuGs+LxK1MCiFL25pMU= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.11/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= -github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.14 h1:+xnbZSEeDbOIg5/mE6JF0w6n9duR1l3/WmbinWVwUuU= github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw= -github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= -github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= +github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/mediocregopher/radix/v3 v3.4.2/go.mod h1:8FL3F6UQRXHXIBSPUs5h0RybMF8i4n7wVopoX3x7Bv8= +github.com/microcosm-cc/bluemonday v1.0.1/go.mod h1:hsXNsILzKxV+sX77C5b8FSuKF00vh2OMYv+xgHpAMF4= github.com/microcosm-cc/bluemonday v1.0.2/go.mod h1:iVP4YcDBq+n/5fb23BhYFvIMq/leAFZyRl6bYmGDlGc= -github.com/minio/sha256-simd v0.1.0/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= -github.com/minio/sha256-simd v1.0.0 h1:v1ta+49hkWZyvaKwrQB8elexRqm6Y0aMLjCNsrYxo6g= -github.com/minio/sha256-simd v1.0.0/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy5RFepssQM= +github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= +github.com/miekg/dns v1.1.58 h1:ca2Hdkz+cDg/7eNF6V56jjzuZ4aCAE+DbVkILdQWG/4= +github.com/miekg/dns v1.1.58/go.mod h1:Ypv+3b/KadlvW9vJfXOTf300O4UqaHFzFCuHz+rPkBY= +github.com/mikioh/tcp v0.0.0-20190314235350-803a9b46060c h1:bzE/A84HN25pxAuk9Eej1Kz9OUelF97nAc82bDquQI8= +github.com/mikioh/tcp v0.0.0-20190314235350-803a9b46060c/go.mod h1:0SQS9kMwD2VsyFEB++InYyBJroV/FRmBgcydeSUcJms= +github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b h1:z78hV3sbSMAUoyUMM0I83AUIT6Hu17AWfgjzIbtrYFc= +github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b/go.mod h1:lxPUiZwKoFL8DUUmalo2yJJUCxbPKtm8OKfqr2/FTNU= +github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc h1:PTfri+PuQmWDqERdnNMiD9ZejrlswWrCpBEZgWOiTrc= +github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc/go.mod h1:cGKTAVKx4SxOuR/czcZ/E2RSJ3sfHs8FpHhQ5CWMf9s= +github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1/go.mod h1:pD8RvIylQ358TN4wwqatJ8rNavkEINozVn9DtGI3dfQ= +github.com/minio/highwayhash v1.0.2 h1:Aak5U0nElisjDCfPSG79Tgzkn2gl66NxOMspRrKnA/g= +github.com/minio/highwayhash v1.0.2/go.mod h1:BQskDq+xkJ12lmlUUi7U0M5Swg3EWR+dLTk+kldvVxY= +github.com/minio/sha256-simd v0.1.1-0.20190913151208-6de447530771/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM= +github.com/minio/sha256-simd v1.0.1 h1:6kaan5IFmwTNynnKKpDHe6FWHohJOHhCPchzK49dzMM= +github.com/minio/sha256-simd v1.0.1/go.mod h1:Pz6AKMiUdngCLpeTL/RJY1M9rUuPMYujV5xJjtbRSN8= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/pointerstructure v1.2.0 h1:O+i9nHnXS3l/9Wu7r4NrEdwA2VFTicjUEN1uBnDo34A= +github.com/mitchellh/pointerstructure v1.2.1 h1:ZhBBeX8tSlRpu/FFhXH4RC4OJzFlqsQhoHZAz4x7TIw= +github.com/mitchellh/pointerstructure v1.2.1/go.mod h1:BRAsLI5zgXmw97Lf6s25bs8ohIXc3tViBH44KcwB2g4= +github.com/mmcloughlin/addchain v0.4.0 h1:SobOdjm2xLj1KkXN5/n0xTIWyZA2+s99UCY1iPfkHRY= +github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqkyU72HC5wJ4RlU= +github.com/mmcloughlin/profile v0.1.1/go.mod h1:IhHD7q1ooxgwTgjxQYkACGA77oFTDdFVejUS1/tS/qU= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 h1:RWengNIwukTxcDr9M+97sNutRR1RKhG96O6jWumTTnw= +github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8= github.com/moul/http2curl v1.0.0/go.mod h1:8UbvGypXm98wA/IqH45anm5Y2Z6ep6O31QGOAZ3H0fQ= +github.com/mr-tron/base58 v1.1.2/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= +github.com/mr-tron/base58 v1.2.0 h1:T/HDJBh4ZCPbU39/+c3rRvE0uKBQlU27+QI8LJ4t64o= +github.com/mr-tron/base58 v1.2.0/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= +github.com/multiformats/go-base32 v0.1.0 h1:pVx9xoSPqEIQG8o+UbAe7DNi51oej1NtK+aGkbLYxPE= +github.com/multiformats/go-base32 v0.1.0/go.mod h1:Kj3tFY6zNr+ABYMqeUNeGvkIC/UYgtWibDcT0rExnbI= +github.com/multiformats/go-base36 v0.2.0 h1:lFsAbNOGeKtuKozrtBsAkSVhv1p9D0/qedU9rQyccr0= +github.com/multiformats/go-base36 v0.2.0/go.mod h1:qvnKE++v+2MWCfePClUEjE78Z7P2a1UV0xHgWc0hkp4= +github.com/multiformats/go-multiaddr v0.1.1/go.mod h1:aMKBKNEYmzmDmxfX88/vz+J5IU55txyt0p4aiWVohjo= +github.com/multiformats/go-multiaddr v0.2.0/go.mod h1:0nO36NvPpyV4QzvTLi/lafl2y95ncPj0vFwVF6k6wJ4= +github.com/multiformats/go-multiaddr v0.12.2 h1:9G9sTY/wCYajKa9lyfWPmpZAwe6oV+Wb1zcmMS1HG24= +github.com/multiformats/go-multiaddr v0.12.2/go.mod h1:GKyaTYjZRdcUhyOetrxTk9z0cW+jA/YrnqTOvKgi44M= +github.com/multiformats/go-multiaddr-dns v0.3.1 h1:QgQgR+LQVt3NPTjbrLLpsaT2ufAA2y0Mkk+QRVJbW3A= +github.com/multiformats/go-multiaddr-dns v0.3.1/go.mod h1:G/245BRQ6FJGmryJCrOuTdB37AMA5AMOVuO6NY3JwTk= +github.com/multiformats/go-multiaddr-fmt v0.1.0 h1:WLEFClPycPkp4fnIzoFoV9FVd49/eQsuaL3/CWe167E= +github.com/multiformats/go-multiaddr-fmt v0.1.0/go.mod h1:hGtDIW4PU4BqJ50gW2quDuPVjyWNZxToGUh/HwTZYJo= +github.com/multiformats/go-multibase v0.2.0 h1:isdYCVLvksgWlMW9OZRYJEa9pZETFivncJHmHnnd87g= +github.com/multiformats/go-multibase v0.2.0/go.mod h1:bFBZX4lKCA/2lyOFSAoKH5SS6oPyjtnzK/XTFDPkNuk= +github.com/multiformats/go-multicodec v0.9.0 h1:pb/dlPnzee/Sxv/j4PmkDRxCOi3hXTz3IbPKOXWJkmg= +github.com/multiformats/go-multicodec v0.9.0/go.mod h1:L3QTQvMIaVBkXOXXtVmYE+LI16i14xuaojr/H7Ai54k= +github.com/multiformats/go-multihash v0.0.8/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpKa63epEDmG8nTduyAew= +github.com/multiformats/go-multihash v0.2.3 h1:7Lyc8XfX/IY2jWb/gI7JP+o7JEq9hOa7BFvVU9RSh+U= +github.com/multiformats/go-multihash v0.2.3/go.mod h1:dXgKXCXjBzdscBLk9JkjINiEsCKRVch90MdaGiKsvSM= +github.com/multiformats/go-multistream v0.5.0 h1:5htLSLl7lvJk3xx3qT/8Zm9J4K8vEOf/QGkvOGQAyiE= +github.com/multiformats/go-multistream v0.5.0/go.mod h1:n6tMZiwiP2wUsR8DgfDWw1dydlEqV3l6N3/GBsX6ILA= +github.com/multiformats/go-varint v0.0.1/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= +github.com/multiformats/go-varint v0.0.7 h1:sWSGR+f/eu5ABZA2ZpYKBILXTTs9JWpdEM/nEGOHFS8= +github.com/multiformats/go-varint v0.0.7/go.mod h1:r8PUYw/fD/SjBCiKOoDlGF6QawOELpZAu9eioSos/OU= github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= +github.com/neelance/astrewrite v0.0.0-20160511093645-99348263ae86/go.mod h1:kHJEU3ofeGjhHklVoIGuVj85JJwZ6kWPaJwCIxgnFmo= +github.com/neelance/sourcemap v0.0.0-20151028013722-8c68805598ab/go.mod h1:Qr6/a/Q4r9LP1IltGz7tA7iOK1WonHEYhu1HRBA7ZiM= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= @@ -263,11 +479,22 @@ github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vv github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= github.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= +github.com/onsi/ginkgo/v2 v2.15.0 h1:79HwNRBAZHOEwrczrgSOPy+eFTTlIGELKy5as+ClttY= +github.com/onsi/ginkgo/v2 v2.15.0/go.mod h1:HlxMHtYF57y6Dpf+mc5529KKmSq9h2FpCF+/ZkwUxKM= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= -github.com/onsi/gomega v1.19.0 h1:4ieX6qQjPP/BfC3mpsAtIGGlxTWPeA3Inl/7DtXw1tw= github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= +github.com/onsi/gomega v1.30.0 h1:hvMK7xYz4D3HapigLTeGdId/NcfQx1VHMJc60ew99+8= +github.com/onsi/gomega v1.30.0/go.mod h1:9sxs+SwGrKI0+PWe4Fxa9tFQQBG5xSsSbMXOI8PPpoQ= +github.com/opencontainers/runtime-spec v1.0.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-spec v1.2.0 h1:z97+pHb3uELt/yiAWD691HNHQIF07bE7dzrbT927iTk= +github.com/opencontainers/runtime-spec v1.2.0/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/openzipkin/zipkin-go v0.1.1/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTmOf0Erfk+hxe8= +github.com/patrickmn/go-cache v2.1.0+incompatible h1:HRMgzkcYKYpi3C8ajMPV8OFXaaRUnok+kx1WdO15EQc= +github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ= +github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 h1:onHthvaw9LFnH4t2DcNVpwGmV9E1BkGknEliJkfwQj0= +github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58/go.mod h1:DXv8WO4yhMYhSNPKjeNKa5WY9YCIEBRbNzFFPJbWO6Y= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= @@ -277,29 +504,41 @@ github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.14.0 h1:nJdhIvne2eSX/XRAFV9PcvFFRbrjbcTUj0VP62TMhnw= -github.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y= +github.com/prometheus/client_golang v0.8.0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v1.18.0 h1:HzFfmkOzH5Q8L8G+kSJKUx5dtG87sewO+FoDDqP5Tbk= +github.com/prometheus/client_golang v1.18.0/go.mod h1:T+GXkCk5wSJyOqMIzVgvvjFDlkOQntgjkJWKrN5txjA= +github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4= -github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= -github.com/prometheus/common v0.42.0 h1:EKsfXEYo4JpWMHH5cg+KOUWeuJSov1Id8zGR8eeI1YM= -github.com/prometheus/common v0.42.0/go.mod h1:xBwqVerjNdUDjgODMpudtOMwlOwf2SaTr1yjz4b7Zbc= -github.com/prometheus/procfs v0.9.0 h1:wzCHvIvM5SxWqYvwgVL7yJY8Lz3PKn49KQtpgMYJfhI= -github.com/prometheus/procfs v0.9.0/go.mod h1:+pB4zwohETzFnmlpe6yd2lSc+0/46IYZRB/chUwxUZY= -github.com/protolambda/bls12-381-util v0.0.0-20210720105258-a772f2aac13e/go.mod h1:MPZvj2Pr0N8/dXyTPS5REeg2sdLG7t8DRzC1rLv925w= +github.com/prometheus/client_model v0.6.0 h1:k1v3CzpSRUTrKMppY35TLwPvxHqBu0bYgxZzqGIgaos= +github.com/prometheus/client_model v0.6.0/go.mod h1:NTQHnmxFpouOD0DpvP4XujX3CdOAGQPoaGhyTchlyt8= +github.com/prometheus/common v0.0.0-20180801064454-c7de2306084e/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= +github.com/prometheus/common v0.47.0 h1:p5Cz0FNHo7SnWOmWmoRozVcjEp0bIVU8cV7OShpjL1k= +github.com/prometheus/common v0.47.0/go.mod h1:0/KsvlIEfPQCQ5I2iNSAWKPZziNCvRs5EC6ILDTlAPc= +github.com/prometheus/procfs v0.0.0-20180725123919-05ee40e3a273/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo= +github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo= github.com/protolambda/bls12-381-util v0.0.0-20220416220906-d8552aa452c7 h1:cZC+usqsYgHtlBaGulVnZ1hfKAi8iWtujBnRLQE698c= github.com/protolambda/bls12-381-util v0.0.0-20220416220906-d8552aa452c7/go.mod h1:IToEjHuttnUzwZI5KBSM/LOOW3qLbbrHOEfp3SbECGY= -github.com/protolambda/eth2api v0.0.0-20230316214135-5f8afbd6d05d h1:35qD9zgP3ApfcHsETuJyX3G5kVOgFgAx6kaRGzPC+FY= -github.com/protolambda/eth2api v0.0.0-20230316214135-5f8afbd6d05d/go.mod h1:4WbGGB4Bv17hKsiytlJY4IQDNpRS234DvFvIBNLnd60= -github.com/protolambda/go-keystorev4 v0.0.0-20211007151826-f20444f6d564 h1:yCXGkFjrZ8EggxW+Y7ueRZesNcBk0avLU0mVU/I2KtU= -github.com/protolambda/go-keystorev4 v0.0.0-20211007151826-f20444f6d564/go.mod h1:Xda3KO8+DMyWaTr+LwUUpVRTB5SdFzoKu0ivXNI6p1s= -github.com/protolambda/messagediff v1.4.0/go.mod h1:LboJp0EwIbJsePYpzh5Op/9G1/4mIztMRYzzwR0dR2M= -github.com/protolambda/zrnt v0.30.0 h1:pHEn69ZgaDFGpLGGYG1oD7DvYI7RDirbMBPfbC+8p4g= -github.com/protolambda/zrnt v0.30.0/go.mod h1:qcdX9CXFeVNCQK/q0nswpzhd+31RHMk2Ax/2lMsJ4Jw= -github.com/protolambda/ztyp v0.2.2 h1:rVcL3vBu9W/aV646zF6caLS/dyn9BN8NYiuJzicLNyY= -github.com/protolambda/ztyp v0.2.2/go.mod h1:9bYgKGqg3wJqT9ac1gI2hnVb0STQq7p/1lapqrqY1dU= +github.com/protolambda/go-keystorev4 v0.1.0 h1:mpuibfMTXPHhNIYNWFLimZ3xhpN/0YNh97jkA97Qe9Q= +github.com/protolambda/go-keystorev4 v0.1.0/go.mod h1:hTa0ss9+xwKt4okVJcpZcMpO9WFur30SSFqVZIY56hk= +github.com/prysmaticlabs/fastssz v0.0.0-20221107182844-78142813af44 h1:c3p3UzV4vFA7xaCDphnDWOjpxcadrQ26l5b+ypsvyxo= +github.com/prysmaticlabs/fastssz v0.0.0-20221107182844-78142813af44/go.mod h1:MA5zShstUwCQaE9faGHgCGvEWUbG87p4SAXINhmCkvg= +github.com/prysmaticlabs/go-bitfield v0.0.0-20210809151128-385d8c5e3fb7 h1:0tVE4tdWQK9ZpYygoV7+vS6QkDvQVySboMVEIxBJmXw= +github.com/prysmaticlabs/go-bitfield v0.0.0-20210809151128-385d8c5e3fb7/go.mod h1:wmuf/mdK4VMD+jA9ThwcUKjg3a2XWM9cVfFYjDyY4j4= +github.com/prysmaticlabs/gohashtree v0.0.3-alpha h1:1EVinCWdb3Lorq7xn8DYQHf48nCcdAM3Vb18KsFlRWY= +github.com/prysmaticlabs/gohashtree v0.0.3-alpha/go.mod h1:4pWaT30XoEx1j8KNJf3TV+E3mQkaufn7mf+jRNb/Fuk= +github.com/prysmaticlabs/prysm/v4 v4.2.1 h1:eHdK4OuJBUCJCmHgI3c07y0u/vWrKCyOsRN2l/VXQxc= +github.com/prysmaticlabs/prysm/v4 v4.2.1/go.mod h1:0Iz1Q/WiuClvdm/9vQbiKKeToeL/uD3QBjEwV9UExBQ= +github.com/quic-go/qpack v0.4.0 h1:Cr9BXA1sQS2SmDUWjSofMPNKmvF6IiIfDRmgU0w1ZCo= +github.com/quic-go/qpack v0.4.0/go.mod h1:UZVnYIfi5GRk+zI9UMaCPsmZ2xKJP7XBUvVyT1Knj9A= +github.com/quic-go/quic-go v0.41.0 h1:aD8MmHfgqTURWNJy48IYFg2OnxwHT3JL7ahGs73lb4k= +github.com/quic-go/quic-go v0.41.0/go.mod h1:qCkNjqczPEvgsOnxZ0eCD14lv+B2LHlFAB++CNOh9hA= +github.com/quic-go/webtransport-go v0.6.0 h1:CvNsKqc4W2HljHJnoT+rMmbRJybShZ0YPFDD3NxaZLY= +github.com/quic-go/webtransport-go v0.6.0/go.mod h1:9KjU4AEBqEQidGHNDkZrb8CAa1abRaosM2yGOyiikEc= github.com/rauljordan/engine-proxy v0.0.0-20230316220057-4c80c36c4c3a h1:ZIfMLprHVdo2vs3WcSqSDEyz2ZsSzDhGeOyxh8VQThA= github.com/rauljordan/engine-proxy v0.0.0-20230316220057-4c80c36c4c3a/go.mod h1:9OVXfWYnIV+wj1/SqfdREmE5mzN/OANAgdOJRtFtvpo= +github.com/raulk/go-watchdog v1.3.0 h1:oUmdlHxdkXRJlwfG0O9omj8ukerm8MEQavSiDTEtBsk= +github.com/raulk/go-watchdog v1.3.0/go.mod h1:fIvOnLbF0b0ZwkB9YU4mOW9Did//4vPZtDqv66NfsMU= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis= github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= @@ -308,20 +547,50 @@ github.com/rogpeppe/go-internal v1.8.1/go.mod h1:JeRgkft04UBgHMgCIwADu4Pn6Mtm5d4 github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= -github.com/rs/cors v1.8.3 h1:O+qNyWn7Z+F9M0ILBHgMVPuB1xTOucVd5gtaYyXBpRo= +github.com/rs/cors v1.8.2 h1:KCooALfAYGs415Cwu5ABvv9n9509fSiG5SQJn/AQo4U= +github.com/rs/cors v1.8.2/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/russross/blackfriday v1.5.2 h1:HyvC0ARfnZBqnXwABFeSZHpKvJHJJfPz81GNueLj0oo= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= +github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/schollz/closestmatch v2.1.0+incompatible/go.mod h1:RtP1ddjLong6gTkbtmuhtR2uUrrJOpYzYRvbcPAid+g= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI= github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= +github.com/shurcooL/component v0.0.0-20170202220835-f88ec8f54cc4/go.mod h1:XhFIlyj5a1fBNx5aJTbKoIq0mNaPvOagO+HjB3EtxrY= +github.com/shurcooL/events v0.0.0-20181021180414-410e4ca65f48/go.mod h1:5u70Mqkb5O5cxEA8nxTsgrgLehJeAw6Oc4Ab1c/P1HM= +github.com/shurcooL/github_flavored_markdown v0.0.0-20181002035957-2122de532470/go.mod h1:2dOwnU2uBioM+SGy2aZoq1f/Sd1l9OkAeAUvjSyvgU0= +github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk= +github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041/go.mod h1:N5mDOmsrJOB+vfqUK+7DmDyjhSLIIBnXo9lvZJj3MWQ= +github.com/shurcooL/gofontwoff v0.0.0-20180329035133-29b52fc0a18d/go.mod h1:05UtEgK5zq39gLST6uB0cf3NEHjETfB4Fgr3Gx5R9Vw= +github.com/shurcooL/gopherjslib v0.0.0-20160914041154-feb6d3990c2c/go.mod h1:8d3azKNyqcHP1GaQE/c6dDgjkgSx2BZ4IoEi4F1reUI= +github.com/shurcooL/highlight_diff v0.0.0-20170515013008-09bb4053de1b/go.mod h1:ZpfEhSmds4ytuByIcDnOLkTHGUI6KNqRNPDLHDk+mUU= +github.com/shurcooL/highlight_go v0.0.0-20181028180052-98c3abbbae20/go.mod h1:UDKB5a1T23gOMUJrI+uSuH0VRDStOiUVSjBTRDVBVag= +github.com/shurcooL/home v0.0.0-20181020052607-80b7ffcb30f9/go.mod h1:+rgNQw2P9ARFAs37qieuu7ohDNQ3gds9msbT2yn85sg= +github.com/shurcooL/htmlg v0.0.0-20170918183704-d01228ac9e50/go.mod h1:zPn1wHpTIePGnXSHpsVPWEktKXHr6+SS6x/IKRb7cpw= +github.com/shurcooL/httperror v0.0.0-20170206035902-86b7830d14cc/go.mod h1:aYMfkZ6DWSJPJ6c4Wwz3QtW22G7mf/PEgaB9k/ik5+Y= +github.com/shurcooL/httpfs v0.0.0-20171119174359-809beceb2371/go.mod h1:ZY1cvUeJuFPAdZ/B6v7RHavJWZn2YPVFQ1OSXhCGOkg= +github.com/shurcooL/httpgzip v0.0.0-20180522190206-b1c53ac65af9/go.mod h1:919LwcH0M7/W4fcZ0/jy0qGght1GIhqyS/EgWGH2j5Q= +github.com/shurcooL/issues v0.0.0-20181008053335-6292fdc1e191/go.mod h1:e2qWDig5bLteJ4fwvDAc2NHzqFEthkqn7aOZAOpj+PQ= +github.com/shurcooL/issuesapp v0.0.0-20180602232740-048589ce2241/go.mod h1:NPpHK2TI7iSaM0buivtFUc9offApnI0Alt/K8hcHy0I= +github.com/shurcooL/notifications v0.0.0-20181007000457-627ab5aea122/go.mod h1:b5uSkrEVM1jQUspwbixRBhaIjIzL2xazXp6kntxYle0= +github.com/shurcooL/octicon v0.0.0-20181028054416-fa4f57f9efb2/go.mod h1:eWdoE5JD4R5UVWDucdOPg1g2fqQRq78IQa9zlOV1vpQ= +github.com/shurcooL/reactions v0.0.0-20181006231557-f2e0b4ca5b82/go.mod h1:TCR1lToEk4d2s07G3XGfz2QrgHXg4RJBvjrOozvoWfk= +github.com/shurcooL/sanitized_anchor_name v0.0.0-20170918181015-86672fcb3f95/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0= -github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/shurcooL/users v0.0.0-20180125191416-49c67e49c537/go.mod h1:QJTqeLYEDaXHZDBsXlPCDqdhQuJkuw4NOtaxYe3xii4= +github.com/shurcooL/webdavfs v0.0.0-20170829043945-18c3829fa133/go.mod h1:hKmq5kWdCj2z2KEozexVbfEZIWiTjhE0+UjmZgPqehw= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= +github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/sourcegraph/annotate v0.0.0-20160123013949-f4cad6c6324d/go.mod h1:UdhH50NIW0fCiwBSr0co2m7BnFLdv4fQTgdqdJTHFeE= +github.com/sourcegraph/syntaxhighlight v0.0.0-20170531221838-bd320f5d308e/go.mod h1:HuIsMU8RRBOtsCgI77wP899iHVBQpCmg4ErYMZB+2IA= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= @@ -329,34 +598,50 @@ github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb6 github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= github.com/status-im/keycard-go v0.2.0 h1:QDLFswOQu1r5jsycloeQh3bVU8n/NatHHaZobtDnDzA= +github.com/status-im/keycard-go v0.2.0/go.mod h1:wlp8ZLbsmrF6g6WjugPAx+IzoLrkdf9+mHxBEeo3Hbg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= -github.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8= -github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a h1:1ur3QoCqvE5fl+nylMaIr9PVV1w343YRDtsy+Rwu7XI= -github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a/go.mod h1:RRCYJbIwD5jmqPI9XoAFR0OcDxqUctll6zUj/+B4S48= -github.com/tklauser/go-sysconf v0.3.11 h1:89WgdJhk5SNwJfu+GKyYveZ4IaJ7xAkecBo+KdJV0CM= -github.com/tklauser/go-sysconf v0.3.11/go.mod h1:GqXfhXY3kiPa0nAXPDIQIWzJbMCB7AmcWpGR8lSZfqI= -github.com/tklauser/numcpus v0.6.0 h1:kebhY2Qt+3U6RNK7UqpYNA+tJ23IBEGKkB7JQBfDYms= -github.com/tklauser/numcpus v0.6.0/go.mod h1:FEZLMke0lhOUG6w2JadTzp0a+Nl8PF/GFkQ5UVIcaL4= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/supranational/blst v0.3.11 h1:LyU6FolezeWAhvQk0k6O/d49jqgO52MSDDfYgbeoEm4= +github.com/supranational/blst v0.3.11/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= +github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d h1:vfofYNRScrDdvS342BElfbETmL1Aiz3i2t0zfRj16Hs= +github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d/go.mod h1:RRCYJbIwD5jmqPI9XoAFR0OcDxqUctll6zUj/+B4S48= +github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07/go.mod h1:kDXzergiv9cbyO7IOYJZWg1U88JhDg3PB6klq9Hg2pA= +github.com/thomaso-mirodin/intmath v0.0.0-20160323211736-5dc6d854e46e h1:cR8/SYRgyQCt5cNCMniB/ZScMkhI9nk8U5C7SbISXjo= +github.com/thomaso-mirodin/intmath v0.0.0-20160323211736-5dc6d854e46e/go.mod h1:Tu4lItkATkonrYuvtVjG0/rhy15qrNGNTjPdaphtZ/8= +github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= +github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= +github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= +github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= github.com/tyler-smith/go-bip39 v1.1.0 h1:5eUemwrMargf3BSLRRCalXT93Ns6pQJIjYQN2nyfOP8= github.com/tyler-smith/go-bip39 v1.1.0/go.mod h1:gUYDtqQw1JS3ZJ8UWVcGTGqqr6YIN3CWg+kkNaLt55U= +github.com/uber/jaeger-client-go v2.25.0+incompatible h1:IxcNZ7WRY1Y3G4poYlx24szfsn/3LvK9QHCq9oQw8+U= +github.com/uber/jaeger-client-go v2.25.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= github.com/umbracle/gohashtree v0.0.2-alpha.0.20230207094856-5b775a815c10 h1:CQh33pStIp/E30b7TxDlXfM0145bn2e8boI30IxAhTg= -github.com/urfave/cli/v2 v2.17.2-0.20221006022127-8f469abc00aa h1:5SqCsI/2Qya2bCzK15ozrqo2sZxkh0FHynJZOTVoV6Q= +github.com/umbracle/gohashtree v0.0.2-alpha.0.20230207094856-5b775a815c10/go.mod h1:x/Pa0FF5Te9kdrlZKJK82YmAkvL8+f989USgz6Jiw7M= +github.com/urfave/cli v1.22.2 h1:gsqYFH8bb9ekPA12kRo0hfjngWQjkJPlN9R0N78BoUo= +github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +github.com/urfave/cli/v2 v2.25.7 h1:VAzn5oq403l5pHjc4OhD54+XGO9cdKVL/7lDjF+iKUs= +github.com/urfave/cli/v2 v2.25.7/go.mod h1:8qnjx1vcq5s2/wpsqoZFndg2CE5tNFyrTvS6SinrnYQ= github.com/urfave/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/valyala/fasthttp v1.6.0/go.mod h1:FstJa9V+Pj9vQ7OJie2qMHdwemEDaDiSdBnvPM1Su9w= github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio= +github.com/viant/assertly v0.4.8/go.mod h1:aGifi++jvCrUaklKEKT0BU95igDNaqkvz+49uaYMPRU= +github.com/viant/toolbox v0.24.0/go.mod h1:OxMCG57V0PXuIP2HNQrtJf2CjqdmbrOx5EkMILuUhzM= github.com/wealdtech/go-bytesutil v1.2.1 h1:TjuRzcG5KaPwaR5JB7L/OgJqMQWvlrblA1n0GfcXFSY= github.com/wealdtech/go-bytesutil v1.2.1/go.mod h1:RhUDUGT1F4UP4ydqbYp2MWJbAel3M+mKd057Pad7oag= github.com/wealdtech/go-eth2-types/v2 v2.8.1 h1:y2N3xSIZ3tVqsnvj4AgPkh48U5sM612vhZwlK3k+3lM= @@ -368,6 +653,7 @@ github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1: github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU= +github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8= github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0/go.mod h1:/LWChgwKmvncFJFHJ7Gvn9wZArjbV5/FppcK2fKk/tI= github.com/yudai/gojsondiff v1.0.0/go.mod h1:AY32+k2cwILAkW1fbgxQ5mUmMiZFgLIV+FBNExI05xg= github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82/go.mod h1:lgjkn3NuSvDfVJdfcVVdX+jpBxNmX4rDAzaS45IcYoM= @@ -377,34 +663,69 @@ github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9dec github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yusufpapurcu/wmi v1.2.2 h1:KBNDSne4vP5mbSWnJbO+51IMOXJB67QiYCSBrubbPRg= github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +go.opencensus.io v0.18.0/go.mod h1:vKdFvxhtzZ9onBp9VKHK8z/sRpBMnKAsufL7wlDrCOA= +go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= +go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= +go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= +go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/dig v1.17.1 h1:Tga8Lz8PcYNsWsyHMZ1Vm0OQOUaJNDyvPImgbAu9YSc= +go.uber.org/dig v1.17.1/go.mod h1:Us0rSJiThwCv2GteUN0Q7OKvU7n5J4dxZ9JKUXozFdE= +go.uber.org/fx v1.20.1 h1:zVwVQGS8zYvhh9Xxcu4w1M6ESyeMzebzj2NbSayZ4Mk= +go.uber.org/fx v1.20.1/go.mod h1:iSYNbHf2y55acNCwCXKx7LbWb5WG1Bnue5RDXz1OREg= +go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/mock v0.4.0 h1:VcM4ZOtdbR4f6VXfiOpwpVJDL6lCReaZ6mw31wqh7KU= +go.uber.org/mock v0.4.0/go.mod h1:a6FSlNadKUHUa9IP5Vyt1zh4fC7uAwxMutEAscFbkZc= +go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +go4.org v0.0.0-20180809161055-417644f6feb5/go.mod h1:MkTOUMDaeVYJUOUsaDXIhWPZYa1yOyC1qaOBpL57BhE= +golang.org/x/build v0.0.0-20190111050920-041ab4dc3f9d/go.mod h1:OWs+y06UdEOHN4y+MfF/py+xQ/tYqIWW03b70/CG9Rw= +golang.org/x/crypto v0.0.0-20181030102418-4d3f4d9ffa16/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190313024323-a1f597ede03a/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191227163750-53104e6ec876/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200602180216-279210d13fed/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.7.0 h1:AvwMYaRytfdeVt3u6mLaxYtErKYjxA2OXjJ1HHq6t3A= -golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= +golang.org/x/crypto v0.19.0 h1:ENy+Az/9Y1vSrlrvBSyna3PITt4tiZLf7sgCjZBX7Wo= +golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20230321023759-10a507213a29 h1:ooxPy7fPvB4kwsA2h+iBNHkAbp/4JxTSwCmvdjEYmug= -golang.org/x/exp v0.0.0-20230321023759-10a507213a29/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc= +golang.org/x/exp v0.0.0-20240213143201-ec583247a57a h1:HinSgX1tJRX3KsL//Gxynpw5CTOAIPhgL4W8PNiIpVE= +golang.org/x/exp v0.0.0-20240213143201-ec583247a57a/go.mod h1:CxmFvTBINI24O/j8iY7H1xHzx2i4OsyguNBmN/uPtqc= +golang.org/x/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.15.0 h1:SernR4v+D55NyBH2QiEQrlBAnj1ECL6AGrA5+dPaMY8= +golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181029044818-c44066c5c816/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181106065722-10aee1819953/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190313220215-9f648a60d977/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190327091125-710a502c58a2/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= @@ -414,14 +735,22 @@ golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= golang.org/x/net v0.0.0-20211008194852-3b03d305991f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ= +golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4= +golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.16.0 h1:aDkGMBSYxElaoP81NpoUoz2oo2R2wHdZpGToUxfyQrQ= +golang.org/x/oauth2 v0.16.0/go.mod h1:hqZ+0LWXsiVoZpeld6jVt06P3adbS2Uu911W1SsJv2o= +golang.org/x/perf v0.0.0-20180704124530-6e6d33e29852/go.mod h1:JLpeXjPJfIyPr5TlbXLkXWLhP8nz10XfvxElABhCtcw= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -430,27 +759,35 @@ golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= +golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= +golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sys v0.0.0-20180810173357-98c5dad5d1a0/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181029174526-d69651ed3497/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190316082340-a2f829d7f35f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200602225109-6fdc65e7d980/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201101102859-da207088b7d1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -463,25 +800,35 @@ golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.7.0 h1:3jlCCIQZPdOYu1h8BkNvLz8Kgwtae2cagcG/VamtZRU= -golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.17.0 h1:25cE3gD+tdBA7lp7QfhuV+rJiE9YXTcS3VG1SqssI/Y= +golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.17.0 h1:mkTF7LCd6WGJNL3K1Ad7kwxNfYAW6a8a8QqtMblp/4U= +golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.8.0 h1:57P1ETyNKtuIjB4SRd15iJxuhj8Gc416Y78H3qgMh68= -golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= +golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181030000716-a0a13e073c7b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181221001348-537d06c36207/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= @@ -495,24 +842,47 @@ golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roY golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.18.0 h1:k8NLag8AGHnn+PHbl7g43CtqZAwG60vZkLqgyZgIHgQ= +golang.org/x/tools v0.18.0/go.mod h1:GL7B4CwcLLeo59yx/9UWWuNOW1n3VZ4f5axWfML7Lcg= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +google.golang.org/api v0.0.0-20180910000450-7ca32eb868bf/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= +google.golang.org/api v0.0.0-20181030000543-1d582fd0359e/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= +google.golang.org/api v0.1.0/go.mod h1:UGEZY7KEX120AnNLIHFMKIo4obdJhkp2tPbaPlQx13Y= +google.golang.org/api v0.44.0 h1:URs6qR1lAxDsqWITsQXI4ZkGiYJ5dHtRNiCpfs2OeKA= +google.golang.org/api v0.44.0/go.mod h1:EBOGZqzyhtvMDoxwS97ctnh0zUmYY6CxqXsc1AvkYD8= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.3.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= +google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/genproto v0.0.0-20180518175338-11a468237815/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20181029155118-b69ba1387ce2/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20181202183823-bd91e49a0898/go.mod h1:7Ep/1NZk928CDR8SjdVbjWNpdIf6nzjE3BTgJDr2Atg= +google.golang.org/genproto v0.0.0-20190306203927-b5d61aea6440/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= +google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 h1:KpwkzHKEF7B9Zxg18WzOa7djJ+Ha5DzthMyZYQfEn2A= +google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1/go.mod h1:nKE/iIaLqn2bQwXBg8f1g2Ylh6r5MN5CmZvuzZCgsCU= google.golang.org/grpc v1.12.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= +google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= +google.golang.org/grpc v1.16.0/go.mod h1:0JHn/cJsOMiMfNA9+DeHDlAU7KAAB5GDlYFpa9MZMio= +google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.56.3 h1:8I4C0Yq1EjstUzUJzpcRVbuYA2mODtEmpWiQoN/b2nc= +google.golang.org/grpc v1.56.3/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -524,25 +894,31 @@ google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpAD google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng= -google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I= +google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= gopkg.in/go-playground/validator.v8 v8.18.2/go.mod h1:RX2a/7Ha8BgOhfk7j780h4/u/RRjR0eouCJSH80/M2Y= gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1 h1:iiHuQZCNgYPmFQxd3BBN/Nc5+dAwzZuq5y40s20oQw0= +gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= +gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= +gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/ini.v1 v1.51.1/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= -gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce h1:+JknDZhAj8YMt7GC73Ei8pv4MzjDUNPHgQWJdtMAaDU= -gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:5AcXVHNjg+BDxry382+8OKon8SEWiKktQR07RKPsv1c= +gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8= +gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= @@ -551,5 +927,26 @@ gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +grpc.go4.org v0.0.0-20170609214715-11d0a25b4919/go.mod h1:77eQGdRu53HpSqPFJFmuJdjuHRquDANNeA4x7B8WQ9o= +honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +k8s.io/apimachinery v0.20.0 h1:jjzbTJRXk0unNS71L7h3lxGDH/2HPxMPaQY+MjECKL8= +k8s.io/apimachinery v0.20.0/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= +k8s.io/client-go v0.20.0 h1:Xlax8PKbZsjX4gFvNtt4F5MoJ1V5prDvCuoq9B7iax0= +k8s.io/client-go v0.20.0/go.mod h1:4KWh/g+Ocd8KkCwKF8vUNnmqgv+EVnQDK4MBF4oB5tY= +k8s.io/klog/v2 v2.80.0 h1:lyJt0TWMPaGoODa8B8bUuxgHS3W/m/bNr2cca3brA/g= +k8s.io/klog/v2 v2.80.0/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= +k8s.io/utils v0.0.0-20201110183641-67b214c5f920 h1:CbnUZsM497iRC5QMVkHwyl8s2tB3g7yaSHkYPkpgelw= +k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +lukechampine.com/blake3 v1.2.1 h1:YuqqRuaqsGV71BV/nm9xlI0MKUv4QC54jQnBChWbGnI= +lukechampine.com/blake3 v1.2.1/go.mod h1:0OFRp7fBtAylGVCO40o87sbupkyIGgbpv1+M1k1LM6k= +rsc.io/tmplfunc v0.0.3 h1:53XFQh69AfOa8Tw0Jm7t+GV7KZhOi6jzsCzTtKbMvzU= +rsc.io/tmplfunc v0.0.3/go.mod h1:AG3sTPzElb1Io3Yg4voV9AGZJuleGAwaVRxL9M49PhA= +sigs.k8s.io/structured-merge-diff/v4 v4.0.2 h1:YHQV7Dajm86OuqnIR6zAelnDWBRjo+YhYV9PmGrh1s8= +sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= +sigs.k8s.io/yaml v1.2.0 h1:kr/MCeFWJWTwyaHoR9c8EjH9OumOmoF9YGiZd7lFm/Q= +sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= +sourcegraph.com/sourcegraph/go-diff v0.5.0/go.mod h1:kuch7UrkMzY0X+p9CRK03kfuPQ2zzQcaEFbx8wA8rck= +sourcegraph.com/sqs/pbtypes v0.0.0-20180604144634-d3ebe8f20ae4/go.mod h1:ketZ/q3QxT9HOBeFhu6RdvsftgpsbFHBF5Cas6cDKZ0= diff --git a/simulators/eth2/common/spoofing/beacon/beacon_verification.go b/simulators/eth2/common/spoofing/beacon/beacon_verification.go index 941182c920..49cc2a09a0 100644 --- a/simulators/eth2/common/spoofing/beacon/beacon_verification.go +++ b/simulators/eth2/common/spoofing/beacon/beacon_verification.go @@ -13,18 +13,22 @@ import ( const ( EngineForkchoiceUpdatedV1 = "engine_forkchoiceUpdatedV1" EngineForkchoiceUpdatedV2 = "engine_forkchoiceUpdatedV2" + EngineForkchoiceUpdatedV3 = "engine_forkchoiceUpdatedV3" EngineNewPayloadV1 = "engine_newPayloadV1" EngineNewPayloadV2 = "engine_newPayloadV2" + EngineNewPayloadV3 = "engine_newPayloadV3" ) var EngineNewPayload = []string{ EngineNewPayloadV1, EngineNewPayloadV2, + EngineNewPayloadV3, } var EngineForkchoiceUpdated = []string{ EngineForkchoiceUpdatedV1, EngineForkchoiceUpdatedV2, + EngineForkchoiceUpdatedV3, } type FallibleLogger interface { diff --git a/simulators/eth2/common/testnet/config.go b/simulators/eth2/common/testnet/config.go index cb8c618cee..555d6e7cf5 100644 --- a/simulators/eth2/common/testnet/config.go +++ b/simulators/eth2/common/testnet/config.go @@ -7,7 +7,10 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core" "github.com/ethereum/hive/simulators/eth2/common/clients" + "github.com/ethereum/hive/simulators/eth2/common/config" + consensus_config "github.com/ethereum/hive/simulators/eth2/common/config/consensus" execution_config "github.com/ethereum/hive/simulators/eth2/common/config/execution" + blobber_config "github.com/marioevz/blobber/config" mock_builder "github.com/marioevz/mock-builder/mock" ) @@ -28,15 +31,8 @@ var ( ) type Config struct { - AltairForkEpoch *big.Int `json:"altair_fork_epoch,omitempty"` - BellatrixForkEpoch *big.Int `json:"bellatrix_fork_epoch,omitempty"` - CapellaForkEpoch *big.Int `json:"capella_fork_epoch,omitempty"` - ValidatorCount *big.Int `json:"validator_count,omitempty"` - KeyTranches *big.Int `json:"key_tranches,omitempty"` - SlotTime *big.Int `json:"slot_time,omitempty"` - TerminalTotalDifficulty *big.Int `json:"terminal_total_difficulty,omitempty"` - SafeSlotsToImportOptimistically *big.Int `json:"safe_slots_to_import_optimistically,omitempty"` - ExtraShares *big.Int `json:"extra_shares,omitempty"` + *config.ForkConfig `json:"fork_config,omitempty"` + *consensus_config.ConsensusConfig `json:"consensus_config,omitempty"` // Node configurations to launch. Each node as a proportional share of // validators. @@ -47,9 +43,16 @@ type Config struct { InitialBaseFeePerGas *big.Int `json:"initial_base_fee_per_gas,omitempty"` GenesisExecutionAccounts map[common.Address]core.GenesisAccount `json:"genesis_execution_accounts,omitempty"` + // Consensus Layer specific config + DisablePeerScoring bool `json:"disable_peer_scoring,omitempty"` + // Builders EnableBuilders bool `json:"enable_builders,omitempty"` BuilderOptions []mock_builder.Option `json:"builder_options,omitempty"` + + // Blobber + EnableBlobber bool `json:"enable_blobber,omitempty"` + BlobberOptions []blobber_config.Option `json:"blobber_options,omitempty"` } // Choose a configuration value. `b` takes precedence @@ -66,24 +69,11 @@ func choose(a, b *big.Int) *big.Int { // Join two configurations. `b` takes precedence func (a *Config) Join(b *Config) *Config { c := Config{} - // Forks - c.AltairForkEpoch = choose(a.AltairForkEpoch, b.AltairForkEpoch) - c.BellatrixForkEpoch = choose(a.BellatrixForkEpoch, b.BellatrixForkEpoch) - c.CapellaForkEpoch = choose(a.CapellaForkEpoch, b.CapellaForkEpoch) - - // Testnet config - c.ValidatorCount = choose(a.ValidatorCount, b.ValidatorCount) - c.KeyTranches = choose(a.KeyTranches, b.KeyTranches) - c.SlotTime = choose(a.SlotTime, b.SlotTime) - c.TerminalTotalDifficulty = choose( - a.TerminalTotalDifficulty, - b.TerminalTotalDifficulty, - ) - c.SafeSlotsToImportOptimistically = choose( - a.SafeSlotsToImportOptimistically, - b.SafeSlotsToImportOptimistically, - ) - c.ExtraShares = choose(a.ExtraShares, b.ExtraShares) + // ForkConfig + c.ForkConfig = a.ForkConfig.Join(b.ForkConfig) + + // ConsensusConfig + c.ConsensusConfig = a.ConsensusConfig.Join(b.ConsensusConfig) // EL config c.InitialBaseFeePerGas = choose( @@ -114,20 +104,11 @@ func (a *Config) Join(b *Config) *Config { return &c } -func (c *Config) activeFork() string { - if c.CapellaForkEpoch != nil && c.CapellaForkEpoch.Cmp(Big0) == 0 { - return "capella" - } else if c.BellatrixForkEpoch != nil && c.BellatrixForkEpoch.Cmp(Big0) == 0 { - return "bellatrix" - } else if c.AltairForkEpoch != nil && c.AltairForkEpoch.Cmp(Big0) == 0 { - return "altair" - } else { - return "phase0" - } -} - // Check the configuration and its support by the multiple client definitions -func (c *Config) fillDefaults() error { +func (c *Config) FillDefaults() error { + if c.SlotsPerEpoch == nil { + c.SlotsPerEpoch = big.NewInt(32) + } if c.SlotTime == nil { allNodeDefinitions := c.NodeDefinitions if len( diff --git a/simulators/eth2/common/testnet/environment.go b/simulators/eth2/common/testnet/environment.go index e6adfdb28f..4950a380f8 100644 --- a/simulators/eth2/common/testnet/environment.go +++ b/simulators/eth2/common/testnet/environment.go @@ -3,12 +3,10 @@ package testnet import ( "github.com/ethereum/hive/simulators/eth2/common/clients" consensus_config "github.com/ethereum/hive/simulators/eth2/common/config/consensus" - blsu "github.com/protolambda/bls12-381-util" ) type Environment struct { Clients *clients.ClientDefinitionsByRole - Keys []*consensus_config.ValidatorDetails - Secrets *[]blsu.SecretKey + Validators consensus_config.ValidatorsSetupDetails LogEngineCalls bool } diff --git a/simulators/eth2/common/testnet/prepared_testnet.go b/simulators/eth2/common/testnet/prepared_testnet.go index 0d7ece7533..f2a466c18a 100644 --- a/simulators/eth2/common/testnet/prepared_testnet.go +++ b/simulators/eth2/common/testnet/prepared_testnet.go @@ -7,23 +7,21 @@ import ( "math/big" "net" "os" + "strconv" "strings" "time" - "github.com/holiman/uint256" - blsu "github.com/protolambda/bls12-381-util" - "github.com/protolambda/ztyp/tree" - "github.com/protolambda/ztyp/view" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/params" + "github.com/protolambda/zrnt/eth2/beacon" "github.com/protolambda/zrnt/eth2/beacon/common" "github.com/protolambda/zrnt/eth2/configs" "github.com/ethereum/hive/hivesim" "github.com/ethereum/hive/simulators/eth2/common/clients" cl "github.com/ethereum/hive/simulators/eth2/common/config/consensus" + cl_genesis "github.com/ethereum/hive/simulators/eth2/common/config/consensus/genesis" el "github.com/ethereum/hive/simulators/eth2/common/config/execution" + "github.com/ethereum/hive/simulators/eth2/common/utils" beacon_client "github.com/marioevz/eth-clients/clients/beacon" exec_client "github.com/marioevz/eth-clients/clients/execution" validator_client "github.com/marioevz/eth-clients/clients/validator" @@ -46,15 +44,14 @@ func init() { // PreparedTestnet has all the options for starting nodes, ready to build the network. type PreparedTestnet struct { // Consensus chain configuration - spec *common.Spec + Spec *common.Spec // Execution chain configuration and genesis info - eth1Genesis *el.ExecutionGenesis + ExecutionGenesis *el.ExecutionGenesis // Consensus genesis state - eth2Genesis common.BeaconState - // Secret keys of validators, to fabricate extra signed test messages with during testnet/ - // E.g. to test a slashable offence that would not otherwise happen. - keys *[]blsu.SecretKey + BeaconGenesis common.BeaconState + + ValidatorsSetupDetails cl.ValidatorsSetupDetails // Configuration to apply to every node of the given type executionOpts hivesim.StartOption @@ -62,63 +59,69 @@ type PreparedTestnet struct { beaconOpts hivesim.StartOption // A tranche is a group of validator keys to run on 1 node - keyTranches []cl.ValidatorDetailsMap + keyTranches []cl.ValidatorsKeys } -// Prepares the fork timestamps of post-merge forks based on the -// consensus layer genesis time and the fork epochs -func prepareExecutionForkConfig( - eth2GenesisTime common.Timestamp, - config *Config, -) *params.ChainConfig { - chainConfig := params.ChainConfig{} - if config.CapellaForkEpoch != nil { - shanghai := uint64(eth2GenesisTime) - if config.CapellaForkEpoch.Uint64() != 0 { - shanghai += uint64( - config.CapellaForkEpoch.Int64() * config.SlotTime.Int64() * 32, - ) - } - chainConfig.ShanghaiTime = &shanghai - } - return &chainConfig +func getLogLevelString() string { + logLevelInt, _ := strconv.Atoi(os.Getenv("HIVE_LOGLEVEL")) + switch logLevelInt { + case 2: + return "warn" + case 3: + return "info" + case 4: + return "debug" + case 5: + return "trace" + } + return "error" } // Build all artifacts require to start a testnet. -func prepareTestnet( - t *hivesim.T, +func PrepareTestnet( env *Environment, config *Config, -) *PreparedTestnet { - eth1GenesisTime := common.Timestamp(time.Now().Unix()) - eth2GenesisTime := eth1GenesisTime + 30 +) (*PreparedTestnet, error) { + genesisTime := common.Timestamp(time.Now().Unix()) + 30 // Sanitize configuration according to the clients used - if err := config.fillDefaults(); err != nil { - t.Fatal(fmt.Errorf("FAIL: error filling defaults: %v", err)) + if err := config.FillDefaults(); err != nil { + return nil, fmt.Errorf("FAIL: error filling defaults: %v", err) } if configJson, err := json.MarshalIndent(config, "", " "); err != nil { panic(err) } else { - t.Logf("Testnet config: %s", configJson) + fmt.Printf("Testnet config: %s\n", configJson) } // Generate genesis for execution clients - eth1Genesis := el.BuildExecutionGenesis( + chainConfig, err := el.BuildChainConfig( config.TerminalTotalDifficulty, - uint64(eth1GenesisTime), + uint64(genesisTime), + config.SlotsPerEpoch.Uint64(), + config.SlotTime.Uint64(), + config.ForkConfig, + ) + if err != nil { + return nil, fmt.Errorf("error producing chainConfig: %v", err) + } + + executionGenesis, err := el.BuildExecutionGenesis( + uint64(genesisTime), config.Eth1Consensus, - prepareExecutionForkConfig(eth2GenesisTime, config), + chainConfig, config.GenesisExecutionAccounts, + config.InitialBaseFeePerGas, ) - if config.InitialBaseFeePerGas != nil { - eth1Genesis.Genesis.BaseFee = config.InitialBaseFeePerGas + if err != nil { + return nil, fmt.Errorf("error producing execution genesis: %v", err) } - eth1ConfigOpt := eth1Genesis.ToParams(depositAddress) - eth1Bundle, err := el.ExecutionBundle(eth1Genesis.Genesis) + + eth1ConfigOpt := executionGenesis.ToParams(depositAddress) + eth1Bundle, err := el.ExecutionBundle(executionGenesis.Genesis) if err != nil { - t.Fatal(err) + return nil, fmt.Errorf("unable to bundle execution genesis: %v", err) } execNodeOpts := hivesim.Params{ "HIVE_LOGLEVEL": os.Getenv("HIVE_LOGLEVEL"), @@ -136,10 +139,10 @@ func prepareTestnet( for i := 0; i < len(config.NodeDefinitions); i++ { if config.NodeDefinitions[i].ChainGenerator != nil { config.NodeDefinitions[i].Chain, err = config.NodeDefinitions[i].ChainGenerator.Generate( - eth1Genesis, + executionGenesis, ) if err != nil { - t.Fatal(err) + return nil, fmt.Errorf("unable to generate PoW chains for node %d: %v", i, err) } fmt.Printf("Generated chain for node %d:\n", i+1) for j, b := range config.NodeDefinitions[i].Chain { @@ -149,70 +152,17 @@ func prepareTestnet( } } - // Generate beacon spec - // - // TODO: specify build-target based on preset, to run clients in mainnet or minimal mode. - // copy the default mainnet config, and make some minimal modifications for testnet usage - specCpy := *configs.Mainnet - spec := &specCpy - spec.Config.DEPOSIT_CONTRACT_ADDRESS = depositAddress - spec.Config.DEPOSIT_CHAIN_ID = view.Uint64View( - eth1Genesis.Genesis.Config.ChainID.Uint64(), - ) - spec.Config.DEPOSIT_NETWORK_ID = view.Uint64View(eth1Genesis.NetworkID) - spec.Config.ETH1_FOLLOW_DISTANCE = 1 - - // Alter versions to avoid conflicts with mainnet values - spec.Config.GENESIS_FORK_VERSION = common.Version{0x00, 0x00, 0x00, 0x0a} - if config.AltairForkEpoch != nil { - spec.Config.ALTAIR_FORK_EPOCH = common.Epoch( - config.AltairForkEpoch.Uint64(), - ) - } - spec.Config.ALTAIR_FORK_VERSION = common.Version{0x01, 0x00, 0x00, 0x0a} - if config.BellatrixForkEpoch != nil { - spec.Config.BELLATRIX_FORK_EPOCH = common.Epoch( - config.BellatrixForkEpoch.Uint64(), - ) - } - spec.Config.BELLATRIX_FORK_VERSION = common.Version{0x02, 0x00, 0x00, 0x0a} - if config.CapellaForkEpoch != nil { - spec.Config.CAPELLA_FORK_EPOCH = common.Epoch( - config.CapellaForkEpoch.Uint64(), - ) - } - spec.Config.CAPELLA_FORK_VERSION = common.Version{0x03, 0x00, 0x00, 0x0a} - spec.Config.DENEB_FORK_VERSION = common.Version{0x04, 0x00, 0x00, 0x0a} - if config.ValidatorCount == nil { - t.Fatal(fmt.Errorf("ValidatorCount was not configured")) - } - spec.Config.MIN_GENESIS_ACTIVE_VALIDATOR_COUNT = view.Uint64View( - config.ValidatorCount.Uint64(), + spec, err := cl.BuildSpec( + configs.Mainnet, + config.ForkConfig, + config.ConsensusConfig, + depositAddress, + executionGenesis, ) - if config.SlotTime != nil { - spec.Config.SECONDS_PER_SLOT = common.Timestamp( - config.SlotTime.Uint64(), - ) - } - tdd, _ := uint256.FromBig(config.TerminalTotalDifficulty) - spec.Config.TERMINAL_TOTAL_DIFFICULTY = view.Uint256View(*tdd) - if el.IsEth1GenesisPostMerge(eth1Genesis.Genesis) { - genesisBlock := eth1Genesis.Genesis.ToBlock() - spec.Config.TERMINAL_BLOCK_HASH = tree.Root( - genesisBlock.Hash(), - ) - spec.Config.TERMINAL_BLOCK_HASH_ACTIVATION_EPOCH = common.Timestamp(0) + if err != nil { + return nil, fmt.Errorf("error producing spec: %v", err) } - // Validators can exit immediately - spec.Config.SHARD_COMMITTEE_PERIOD = 0 - spec.Config.CHURN_LIMIT_QUOTIENT = 2 - - // Validators can withdraw immediately - spec.Config.MIN_VALIDATOR_WITHDRAWABILITY_DELAY = 0 - - spec.Config.PROPOSER_SCORE_BOOST = 40 - // Generate keys opts for validators shares := config.NodeDefinitions.Shares() // ExtraShares defines an extra set of keys that none of the nodes will have. @@ -220,15 +170,15 @@ func prepareTestnet( if config.ExtraShares != nil { shares = append(shares, config.ExtraShares.Uint64()) } - keyTranches := cl.KeyTranches(env.Keys, shares) + keyTranches := env.Validators.KeyTranches(shares) consensusConfigOpts, err := cl.ConsensusConfigsBundle( spec, - eth1Genesis.Genesis, + executionGenesis.Hash, config.ValidatorCount.Uint64(), ) if err != nil { - t.Fatal(err) + return nil, fmt.Errorf("error producing consensus config bundle: %v", err) } var optimisticSync hivesim.Params @@ -241,28 +191,62 @@ func prepareTestnet( ) // prepare genesis beacon state, with all the validators in it. - state, err := cl.BuildBeaconState( + state, err := cl_genesis.BuildBeaconState( spec, - eth1Genesis.Genesis, - eth2GenesisTime, - env.Keys, + executionGenesis.Block, + genesisTime, + env.Validators, ) if err != nil { - t.Fatal(err) + return nil, fmt.Errorf("error producing beacon genesis state: %v", err) + } + genValRoot, err := state.GenesisValidatorsRoot() + if err != nil { + return nil, fmt.Errorf("error producing genesis validators root: %v", err) + } + fmt.Printf("Genesis validators root: %s\n", genValRoot) + + forkDecoder := beacon.NewForkDecoder(spec, genValRoot) + for _, currentConfig := range []struct { + ForkName string + VersionConfig *common.ForkDigest + }{ + { + ForkName: "genesis", + VersionConfig: &forkDecoder.Genesis, + }, + { + ForkName: "altair", + VersionConfig: &forkDecoder.Altair, + }, + { + ForkName: "bellatrix", + VersionConfig: &forkDecoder.Bellatrix, + }, + { + ForkName: "capella", + VersionConfig: &forkDecoder.Capella, + }, + { + ForkName: "deneb", + VersionConfig: &forkDecoder.Deneb, + }, + } { + fmt.Printf( + "Fork %s digest: %s\n", + currentConfig.ForkName, + currentConfig.VersionConfig.String(), + ) } // Write info so that the genesis state can be generated by the client stateOpt, err := cl.StateBundle(state) if err != nil { - t.Fatal(err) + return nil, fmt.Errorf("error producing state bundle: %v", err) } // Define additional start options for beacon chain commonOpts := hivesim.Params{ - "HIVE_ETH2_BN_API_PORT": fmt.Sprintf( - "%d", - beacon_client.PortBeaconAPI, - ), "HIVE_ETH2_BN_GRPC_PORT": fmt.Sprintf( "%d", beacon_client.PortBeaconGRPC, @@ -274,23 +258,28 @@ func prepareTestnet( "HIVE_ETH2_CONFIG_DEPOSIT_CONTRACT_ADDRESS": depositAddress.String(), "HIVE_ETH2_DEPOSIT_DEPLOY_BLOCK_HASH": fmt.Sprintf( "%s", - eth1Genesis.Genesis.ToBlock().Hash(), + executionGenesis.Hash, ), } + beaconParams := hivesim.Params{ + "HIVE_CHECK_LIVE_PORT": fmt.Sprintf( + "%d", + beacon_client.PortBeaconAPI, + ), + "HIVE_ETH2_MERGE_ENABLED": "1", + "HIVE_ETH2_ETH1_GENESIS_TIME": fmt.Sprintf( + "%d", + executionGenesis.Genesis.Timestamp, + ), + "HIVE_ETH2_GENESIS_FORK": config.GenesisBeaconFork(), + } + if config.DisablePeerScoring { + beaconParams["HIVE_ETH2_DISABLE_PEER_SCORING"] = "1" + } + beaconOpts := hivesim.Bundle( commonOpts, - hivesim.Params{ - "HIVE_CHECK_LIVE_PORT": fmt.Sprintf( - "%d", - beacon_client.PortBeaconAPI, - ), - "HIVE_ETH2_MERGE_ENABLED": "1", - "HIVE_ETH2_ETH1_GENESIS_TIME": fmt.Sprintf( - "%d", - eth1Genesis.Genesis.Timestamp, - ), - "HIVE_ETH2_GENESIS_FORK": config.activeFork(), - }, + beaconParams, stateOpt, consensusConfigOpts, optimisticSync, @@ -305,27 +294,34 @@ func prepareTestnet( ) return &PreparedTestnet{ - spec: spec, - eth1Genesis: eth1Genesis, - eth2Genesis: state, - keys: env.Secrets, - executionOpts: executionOpts, - beaconOpts: beaconOpts, - validatorOpts: validatorOpts, - keyTranches: keyTranches, - } + Spec: spec, + ExecutionGenesis: executionGenesis, + BeaconGenesis: state, + ValidatorsSetupDetails: env.Validators, + executionOpts: executionOpts, + beaconOpts: beaconOpts, + validatorOpts: validatorOpts, + keyTranches: keyTranches, + }, nil } func (p *PreparedTestnet) createTestnet(t *hivesim.T) *Testnet { - genesisTime, _ := p.eth2Genesis.GenesisTime() - genesisValidatorsRoot, _ := p.eth2Genesis.GenesisValidatorsRoot() + genesisTime, _ := p.BeaconGenesis.GenesisTime() + genesisValidatorsRoot, _ := p.BeaconGenesis.GenesisValidatorsRoot() + validators, err := utils.NewValidators(p.Spec, p.BeaconGenesis, p.ValidatorsSetupDetails.KeysMap(0)) + if err != nil { + panic(err) + } return &Testnet{ T: t, genesisTime: genesisTime, genesisValidatorsRoot: genesisValidatorsRoot, - spec: p.spec, - eth1Genesis: p.eth1Genesis, - eth2GenesisState: p.eth2Genesis, + spec: p.Spec, + executionGenesis: p.ExecutionGenesis, + eth2GenesisState: p.BeaconGenesis, + + Validators: validators, + ValidatorGroups: make(map[string]*utils.Validators), // Testing maxConsecutiveErrorsOnWaits: DEFAULT_MAX_CONSECUTIVE_ERRORS_ON_WAITS, @@ -351,6 +347,7 @@ func (p *PreparedTestnet) prepareExecutionNode( cm := &clients.HiveManagedClient{ T: testnet.T, HiveClientDefinition: eth1Def, + Port: exec_client.PortEngineRPC, } // This method will return the options used to run the client. @@ -445,6 +442,7 @@ func (p *PreparedTestnet) prepareBeaconNode( cm := &clients.HiveManagedClient{ T: testnet.T, HiveClientDefinition: beaconDef, + Port: int64(config.BeaconAPIPort), } cl := &beacon_client.BeaconClient{ @@ -470,7 +468,8 @@ func (p *PreparedTestnet) prepareBeaconNode( ), mock_builder.WithID(config.ClientIndex), mock_builder.WithBeaconGenesisTime(testnet.genesisTime), - mock_builder.WithSpec(p.spec), + mock_builder.WithSpec(p.Spec), + mock_builder.WithLogLevel(getLogLevelString()), } if builderOptions != nil { @@ -478,7 +477,7 @@ func (p *PreparedTestnet) prepareBeaconNode( } cl.Builder, err = mock_builder.NewMockBuilder( - context.Background(), + parentCtx, eth1Endpoints[0], cl, options..., @@ -528,6 +527,10 @@ func (p *PreparedTestnet) prepareBeaconNode( "%d", config.ClientIndex, ), + "HIVE_ETH2_BN_API_PORT": fmt.Sprintf( + "%d", + cl.Config.BeaconAPIPort, + ), }) currentlyRunningBcs := testnet.BeaconClients(). @@ -568,6 +571,8 @@ func (p *PreparedTestnet) prepareBeaconNode( opts = append(opts, hivesim.Params{ "HIVE_ETH2_BUILDER_ENDPOINT": builder.Address(), }) + } else { + panic(fmt.Errorf("builder is not a Builder")) } } @@ -620,10 +625,33 @@ func (p *PreparedTestnet) prepareValidatorClient( } // Hook up validator to beacon node bnAPIOpt := hivesim.Params{ - "HIVE_ETH2_BN_API_IP": bn.GetIP().String(), + "HIVE_ETH2_BN_API_IP": bn.GetHost(), + } + bnAPIOpt = bnAPIOpt.Set( + "HIVE_ETH2_BN_API_PORT", + fmt.Sprintf("%d", bn.Config.BeaconAPIPort), + ) + if testnet.blobber != nil { + simIP, err := testnet.T.Sim.ContainerNetworkIP( + testnet.T.SuiteID, + "bridge", + "simulation", + ) + if err != nil { + panic(err) + } + + p := testnet.blobber.AddBeaconClient(bn, true) + bnAPIOpt = bnAPIOpt.Set( + "HIVE_ETH2_BN_API_IP", + simIP, + ) + bnAPIOpt = bnAPIOpt.Set( + "HIVE_ETH2_BN_API_PORT", + fmt.Sprintf("%d", p.Port()), + ) } - keysOpt := cl.KeysBundle(keys) - opts := []hivesim.StartOption{p.validatorOpts, keysOpt, bnAPIOpt} + opts := []hivesim.StartOption{p.validatorOpts, keys.Bundle(), bnAPIOpt} if bn.Builder != nil { if builder, ok := bn.Builder.(builder_types.Builder); ok { @@ -644,7 +672,7 @@ func (p *PreparedTestnet) prepareValidatorClient( Client: cm, Logger: testnet.T, ClientIndex: keyIndex, - Keys: keys.Keys(), + Keys: keys, BeaconClient: bn, } } diff --git a/simulators/eth2/common/testnet/running_testnet.go b/simulators/eth2/common/testnet/running_testnet.go index 0214ce71dc..942d88344a 100644 --- a/simulators/eth2/common/testnet/running_testnet.go +++ b/simulators/eth2/common/testnet/running_testnet.go @@ -7,6 +7,7 @@ import ( "fmt" "math/big" "net" + "strings" "sync" "time" @@ -24,6 +25,9 @@ import ( "github.com/ethereum/hive/hivesim" execution_config "github.com/ethereum/hive/simulators/eth2/common/config/execution" "github.com/ethereum/hive/simulators/eth2/common/utils" + "github.com/marioevz/blobber" + blobber_config "github.com/marioevz/blobber/config" + "github.com/marioevz/blobber/keys" beacon_client "github.com/marioevz/eth-clients/clients/beacon" exec_client "github.com/marioevz/eth-clients/clients/execution" node "github.com/marioevz/eth-clients/clients/node" @@ -52,12 +56,19 @@ type Testnet struct { // Consensus chain configuration spec *common.Spec // Execution chain configuration and genesis info - eth1Genesis *execution_config.ExecutionGenesis + executionGenesis *execution_config.ExecutionGenesis // Consensus genesis state eth2GenesisState common.BeaconState + // Blobber + blobber *blobber.Blobber + // Test configuration maxConsecutiveErrorsOnWaits int + + // Validators + Validators *utils.Validators + ValidatorGroups map[string]*utils.Validators } type ActiveSpec struct { @@ -135,7 +146,11 @@ func (t *Testnet) GenesisValidatorsRoot() common.Root { } func (t *Testnet) ExecutionGenesis() *core.Genesis { - return t.eth1Genesis.Genesis + return t.executionGenesis.Genesis +} + +func (t *Testnet) Blobber() *blobber.Blobber { + return t.blobber } func StartTestnet( @@ -144,8 +159,11 @@ func StartTestnet( env *Environment, config *Config, ) *Testnet { + prep, err := PrepareTestnet(env, config) + if err != nil { + t.Fatalf("FAIL: Unable to prepare testnet: %v", err) + } var ( - prep = prepareTestnet(t, env, config) testnet = prep.createTestnet(t) genesisTime = testnet.GenesisTimeUnix() ) @@ -173,6 +191,37 @@ func StartTestnet( testnet.Nodes[nodeIndex] = new(node.Node) } + if config.EnableBlobber { + blobberKeys := make([]*keys.ValidatorKey, 0) + for _, key := range env.Validators { + validator := new(keys.ValidatorKey) + validator.FromBytes(key.ValidatorSecretKey[:]) + blobberKeys = append(blobberKeys, validator) + } + + blobberOpts := []blobber_config.Option{ + blobber_config.WithExternalIP(simulatorIP), + blobber_config.WithBeaconGenesisTime(testnet.genesisTime), + blobber_config.WithSpec(prep.Spec), + blobber_config.WithValidatorKeysList(blobberKeys), + blobber_config.WithGenesisValidatorsRoot(testnet.genesisValidatorsRoot), + blobber_config.WithLogLevel(getLogLevelString()), + } + blobberOpts = append(blobberOpts, config.BlobberOptions...) + + testnet.blobber, err = blobber.NewBlobber(parentCtx, blobberOpts...) + if err != nil { + t.Fatalf("FAIL: Unable to create blobber: %v", err) + } + + // Add the blobber as trusted peer to the beacon nodes + ids := testnet.blobber.GetNextPeerIDs(5) // Five should be enough for any test for now + prep.beaconOpts = hivesim.Bundle(prep.beaconOpts, + hivesim.Params{ + "HIVE_ETH2_TRUSTED_PEER_IDS": strings.Join(ids, ","), + }) + } + // For each key partition, we start a client bundle that consists of: // - 1 execution client // - 1 beacon client @@ -203,13 +252,13 @@ func StartTestnet( } if node.ExecutionClientTTD != nil { executionTTD = node.ExecutionClientTTD.Int64() - } else if testnet.eth1Genesis.Genesis.Config.TerminalTotalDifficulty != nil { - executionTTD = testnet.eth1Genesis.Genesis.Config.TerminalTotalDifficulty.Int64() + } else if testnet.executionGenesis.Genesis.Config.TerminalTotalDifficulty != nil { + executionTTD = testnet.executionGenesis.Genesis.Config.TerminalTotalDifficulty.Int64() } if node.BeaconNodeTTD != nil { beaconTTD = node.BeaconNodeTTD.Int64() - } else if testnet.eth1Genesis.Genesis.Config.TerminalTotalDifficulty != nil { - beaconTTD = testnet.eth1Genesis.Genesis.Config.TerminalTotalDifficulty.Int64() + } else if testnet.executionGenesis.Genesis.Config.TerminalTotalDifficulty != nil { + beaconTTD = testnet.executionGenesis.Genesis.Config.TerminalTotalDifficulty.Int64() } // Prepare the client objects with all the information necessary to @@ -228,7 +277,7 @@ func StartTestnet( ProxyConfig: &exec_client.ExecutionProxyConfig{ Host: simulatorIP, Port: exec_client.PortEngineRPC + nodeIndex, - TrackForkchoiceUpdated: true, + TrackForkchoiceUpdated: false, LogEngineCalls: env.LogEngineCalls, }, }, @@ -243,6 +292,7 @@ func StartTestnet( config.BuilderOptions, beacon_client.BeaconClientConfig{ ClientIndex: nodeIndex, + BeaconAPIPort: beacon_client.PortBeaconAPI, TerminalTotalDifficulty: beaconTTD, Spec: testnet.spec, GenesisValidatorsRoot: &testnet.genesisValidatorsRoot, @@ -267,9 +317,12 @@ func StartTestnet( nodeClient.Verification = node.TestVerificationNode // Start the node clients if specified so if !node.DisableStartup { + t.Logf("Starting node %d", nodeIndex) if err := nodeClient.Start(); err != nil { t.Fatalf("FAIL: Unable to start node %d: %v", nodeIndex, err) } + } else { + t.Logf("Node %d startup disabled, skipping", nodeIndex) } } @@ -287,6 +340,10 @@ func (t *Testnet) Stop() { } } } + + if t.blobber != nil { + t.blobber.Close() + } } func (t *Testnet) ValidatorClientIndex(pk [48]byte) (int, error) { @@ -320,6 +377,112 @@ func (t *Testnet) WaitSlots(ctx context.Context, slots common.Slot) error { return nil } +func (t *Testnet) WaitSlotsWithMaxMissedSlots(ctx context.Context, slots common.Slot, maxMissedSlots common.Slot) error { + var ( + genesis = t.GenesisTimeUnix() + slotDuration = time.Duration(t.spec.SECONDS_PER_SLOT) * time.Second + slotsPassed = common.Slot(0) + timer = time.NewTicker(slotDuration) + runningNodes = t.VerificationNodes().Running() + results = makeResults(runningNodes, t.maxConsecutiveErrorsOnWaits) + ) + + for { + select { + case <-ctx.Done(): + return ctx.Err() + case tim := <-timer.C: + // start polling after first slot of genesis + if tim.Before(genesis.Add(slotDuration)) { + t.Logf("Time till genesis: %s", genesis.Sub(tim)) + continue + } + + // new slot, log and check status of all beacon nodes + var ( + wg sync.WaitGroup + clockSlot = t.spec.TimeToSlot( + common.Timestamp(time.Now().Unix()), + t.GenesisTime(), + ) + ) + results.Clear() + + for i, n := range runningNodes { + wg.Add(1) + go func( + ctx context.Context, + n *node.Node, + r *result, + ) { + defer wg.Done() + + b := n.BeaconClient + + checkpoints, err := b.BlockFinalityCheckpoints( + ctx, + eth2api.BlockHead, + ) + if err != nil { + r.err = errors.Wrap( + err, + "failed to poll finality checkpoint", + ) + return + } + + versionedBlock, err := b.BlockV2( + ctx, + eth2api.BlockHead, + ) + if err != nil { + r.err = errors.Wrap(err, "failed to retrieve block") + return + } + + execution := ethcommon.Hash{} + if executionPayload, _, _, err := versionedBlock.ExecutionPayload(); err == nil { + execution = executionPayload.BlockHash + } + + slot := versionedBlock.Slot() + if clockSlot > slot && + (clockSlot-slot) >= maxMissedSlots { + r.fatal = fmt.Errorf( + "missed more slots than allowed (max=%d): clockSlot=%d, slot=%d", + maxMissedSlots, + clockSlot, + slot, + ) + return + } + + r.msg = fmt.Sprintf( + "fork=%s, clock_slot=%s, slot=%d, head=%s, exec_payload=%s, justified=%s, finalized=%s", + versionedBlock.Version, + clockSlot, + slot, + utils.Shorten(versionedBlock.Root().String()), + utils.Shorten(execution.String()), + utils.Shorten(checkpoints.CurrentJustified.String()), + utils.Shorten(checkpoints.Finalized.String()), + ) + }(ctx, n, results[i]) + } + wg.Wait() + + if err := results.CheckError(); err != nil { + return err + } + results.PrintMessages(t.Logf) + slotsPassed += 1 + if slotsPassed >= slots { + return nil + } + } + } +} + // WaitForFork blocks until a beacon client reaches specified fork, // or context finalizes, whichever happens first. func (t *Testnet) WaitForFork(ctx context.Context, fork string) error { @@ -385,7 +548,7 @@ func (t *Testnet) WaitForFork(ctx context.Context, fork string) error { } execution := ethcommon.Hash{} - if executionPayload, err := versionedBlock.ExecutionPayload(); err == nil { + if executionPayload, _, _, err := versionedBlock.ExecutionPayload(); err == nil { execution = executionPayload.BlockHash } @@ -491,7 +654,7 @@ func (t *Testnet) WaitForFinality(ctx context.Context) ( return } execution := ethcommon.Hash{} - if executionPayload, err := versionedBlock.ExecutionPayload(); err == nil { + if executionPayload, _, _, err := versionedBlock.ExecutionPayload(); err == nil { execution = executionPayload.BlockHash } @@ -543,6 +706,127 @@ func (t *Testnet) WaitForFinality(ctx context.Context) ( } } +// WaitForSync blocks until all beacon clients converge to the same head. +func (t *Testnet) WaitForSync(ctx context.Context) ( + tree.Root, error, +) { + var ( + genesis = t.GenesisTimeUnix() + slotDuration = time.Duration(t.spec.SECONDS_PER_SLOT) * time.Second + timer = time.NewTicker(slotDuration) + runningNodes = t.VerificationNodes().Running() + results = makeResults(runningNodes, t.maxConsecutiveErrorsOnWaits) + ) + + for { + select { + case <-ctx.Done(): + return tree.Root{}, ctx.Err() + case tim := <-timer.C: + // start polling after first slot of genesis + if tim.Before(genesis.Add(slotDuration)) { + t.Logf("Time till genesis: %s", genesis.Sub(tim)) + continue + } + + // new slot, log and check status of all beacon nodes + var ( + wg sync.WaitGroup + clockSlot = t.spec.TimeToSlot( + common.Timestamp(time.Now().Unix()), + t.GenesisTime(), + ) + heads = make(chan tree.Root, len(runningNodes)) + ) + results.Clear() + + for i, n := range runningNodes { + wg.Add(1) + go func(ctx context.Context, n *node.Node, r *result) { + defer wg.Done() + + b := n.BeaconClient + + checkpoints, err := b.BlockFinalityCheckpoints( + ctx, + eth2api.BlockHead, + ) + if err != nil { + r.err = errors.Wrap( + err, + "failed to poll finality checkpoint", + ) + return + } + + versionedBlock, err := b.BlockV2( + ctx, + eth2api.BlockHead, + ) + if err != nil { + r.err = errors.Wrap(err, "failed to retrieve block") + return + } + heads <- versionedBlock.Root() + + execution := ethcommon.Hash{} + if executionPayload, _, _, err := versionedBlock.ExecutionPayload(); err == nil { + execution = executionPayload.BlockHash + } + + slot := versionedBlock.Slot() + health, _ := GetHealth(ctx, b, t.spec, slot) + + r.msg = fmt.Sprintf( + "fork=%s, clock_slot=%d, slot=%d, head=%s, "+ + "health=%.2f, exec_payload=%s, justified=%s, "+ + "finalized=%s", + versionedBlock.Version, + clockSlot, + slot, + utils.Shorten(versionedBlock.Root().String()), + health, + utils.Shorten(execution.String()), + utils.Shorten(checkpoints.CurrentJustified.String()), + utils.Shorten(checkpoints.Finalized.String()), + ) + + if (checkpoints.Finalized != common.Checkpoint{}) { + r.done = true + r.result = checkpoints.Finalized + } + }(ctx, n, results[i]) + } + wg.Wait() + + if err := results.CheckError(); err != nil { + return tree.Root{}, err + } + results.PrintMessages(t.Logf) + + // Check if all heads are the same + close(heads) + var ( + head tree.Root + ok bool = true + ) + for h := range heads { + if head == EMPTY_TREE_ROOT { + head = h + continue + } + if !bytes.Equal(head[:], h[:]) { + ok = false + break + } + } + if ok && head != EMPTY_TREE_ROOT { + return head, nil + } + } + } +} + // WaitForExecutionFinality blocks until a beacon client reaches finality // and the finality checkpoint contains an execution payload, // or timeoutSlots have passed, whichever happens first. @@ -616,7 +900,7 @@ func (t *Testnet) WaitForExecutionFinality( } execution := ethcommon.Hash{} - if exeuctionPayload, err := headBlock.ExecutionPayload(); err == nil { + if exeuctionPayload, _, _, err := headBlock.ExecutionPayload(); err == nil { execution = exeuctionPayload.BlockHash } @@ -633,7 +917,7 @@ func (t *Testnet) WaitForExecutionFinality( return } else { finalizedFork = finalizedBlock.Version - if exeuctionPayload, err := finalizedBlock.ExecutionPayload(); err == nil { + if exeuctionPayload, _, _, err := finalizedBlock.ExecutionPayload(); err == nil { finalizedExecution = exeuctionPayload.BlockHash } } @@ -731,13 +1015,13 @@ func (t *Testnet) WaitForCurrentEpochFinalization( b := n.BeaconClient - headInfo, err := b.BlockHeader(ctx, eth2api.BlockHead) + headInfo, err := b.BlockV2(ctx, eth2api.BlockHead) if err != nil { r.err = errors.Wrap(err, "failed to poll head") return } - slot := headInfo.Header.Message.Slot + slot := headInfo.Slot() if clockSlot > slot && (clockSlot-slot) >= t.spec.SLOTS_PER_EPOCH { r.fatal = fmt.Errorf( @@ -761,11 +1045,12 @@ func (t *Testnet) WaitForCurrentEpochFinalization( } r.msg = fmt.Sprintf( - "clock_slot=%d, slot=%d, head=%s justified=%s, "+ + "fork=%s, clock_slot=%d, slot=%d, head=%s justified=%s, "+ "finalized=%s, epoch_to_finalize=%d", + headInfo.Version, clockSlot, slot, - utils.Shorten(headInfo.Root.String()), + utils.Shorten(headInfo.Root().String()), utils.Shorten(checkpoints.CurrentJustified.String()), utils.Shorten(checkpoints.Finalized.String()), epochToBeFinalized, @@ -828,7 +1113,7 @@ func (t *Testnet) WaitForExecutionPayload( // Check if TTD has been reached if td, err := executionClient.TotalDifficultyByNumber(ctx, nil); err == nil { if td.Cmp( - t.eth1Genesis.Genesis.Config.TerminalTotalDifficulty, + t.executionGenesis.Genesis.Config.TerminalTotalDifficulty, ) >= 0 { ttdReached = true } else { @@ -877,7 +1162,7 @@ func (t *Testnet) WaitForExecutionPayload( } executionHash := ethcommon.Hash{} - if executionPayload, err := versionedBlock.ExecutionPayload(); err == nil { + if executionPayload, _, _, err := versionedBlock.ExecutionPayload(); err == nil { executionHash = executionPayload.BlockHash } diff --git a/simulators/eth2/common/testnet/verification.go b/simulators/eth2/common/testnet/verification.go index 6ebf3b85e4..6f86904a1a 100644 --- a/simulators/eth2/common/testnet/verification.go +++ b/simulators/eth2/common/testnet/verification.go @@ -3,6 +3,8 @@ package testnet import ( "bytes" "context" + "crypto/sha256" + "encoding/json" "fmt" "math/big" "time" @@ -12,6 +14,7 @@ import ( beacon_client "github.com/marioevz/eth-clients/clients/beacon" "github.com/protolambda/eth2api" "github.com/protolambda/zrnt/eth2/beacon/common" + "github.com/protolambda/zrnt/eth2/beacon/deneb" "github.com/protolambda/ztyp/tree" ) @@ -29,6 +32,8 @@ type FirstSlotAfterCheckpoint struct { *common.Checkpoint } +var _ VerificationSlot = FirstSlotAfterCheckpoint{} + func (c FirstSlotAfterCheckpoint) Slot( ctx context.Context, t *Testnet, @@ -42,6 +47,8 @@ type LastSlotAtCheckpoint struct { *common.Checkpoint } +var _ VerificationSlot = LastSlotAtCheckpoint{} + func (c LastSlotAtCheckpoint) Slot( ctx context.Context, t *Testnet, @@ -53,6 +60,8 @@ func (c LastSlotAtCheckpoint) Slot( // Get last slot according to current time type LastestSlotByTime struct{} +var _ VerificationSlot = LastestSlotByTime{} + func (l LastestSlotByTime) Slot( ctx context.Context, t *Testnet, @@ -66,6 +75,8 @@ func (l LastestSlotByTime) Slot( // Get last slot according to current head of a beacon node type LastestSlotByHead struct{} +var _ VerificationSlot = LastestSlotByHead{} + func (l LastestSlotByHead) Slot( ctx context.Context, t *Testnet, @@ -151,7 +162,7 @@ func (t *Testnet) VerifyExecutionPayloadIsCanonical( ) } - payload, err := versionedBlock.ExecutionPayload() + payload, _, _, err := versionedBlock.ExecutionPayload() if err != nil { return err } @@ -216,7 +227,7 @@ func (t *Testnet) VerifyExecutionPayloadHashInclusionNode( if err != nil { continue } - if executionPayload, err := versionedBlock.ExecutionPayload(); err != nil { + if executionPayload, _, _, err := versionedBlock.ExecutionPayload(); err != nil { // Block can't contain an executable payload break } else if bytes.Equal(executionPayload.BlockHash[:], hash[:]) { @@ -323,7 +334,7 @@ func (t *Testnet) VerifyELBlockLabels(parentCtx context.Context) error { if err != nil { return err } - if executionPayload, err := versionedBlock.ExecutionPayload(); err != nil { + if executionPayload, _, _, err := versionedBlock.ExecutionPayload(); err != nil { // Get the el block and compare h, err := el.HeaderByLabel(parentCtx, label) if err != nil { @@ -373,7 +384,7 @@ func (t *Testnet) VerifyELHeads( if err != nil { return err } - if head.Hash() != head2.Hash() { + if head.Hash() != head2.Hash() && head.ParentHash != head2.Hash() && head.Hash() != head2.ParentHash { return fmt.Errorf( "different heads: %v: %v %v: %v", 0, @@ -385,3 +396,228 @@ func (t *Testnet) VerifyELHeads( } return nil } + +func (t *Testnet) VerifyBlobs( + parentCtx context.Context, + vs VerificationSlot, +) (uint64, error) { + nodes := t.VerificationNodes().Running() + beaconClients := nodes.BeaconClients() + if len(nodes) == 0 { + return 0, fmt.Errorf("no beacon clients running") + } + if len(nodes) == 1 { + return 0, fmt.Errorf("only one beacon client running, can't verify blobs") + } + var blobCount uint64 + + lastSlot, err := vs.Slot(parentCtx, t, beaconClients[0]) + if err != nil { + return 0, err + } + for slot := lastSlot; slot > 0; slot -= 1 { + + versionedBlock, err := beaconClients[0].BlockV2(parentCtx, eth2api.BlockIdSlot(slot)) + if err != nil { + continue + } + if !versionedBlock.ContainsKZGCommitments() { + // Block can't contain blobs before deneb + break + } + + // Get the block root + blockRoot := versionedBlock.Root() + + // Get the execution block from the execution client + executionPayload, _, _, err := versionedBlock.ExecutionPayload() + if err != nil { + panic(err) + } + executionBlock, err := nodes[0].ExecutionClient.BlockByHash(parentCtx, executionPayload.BlockHash) + if err != nil { + panic(err) + } + blockKzgCommitments := versionedBlock.KZGCommitments() + + refSidecars, err := beaconClients[0].BlobSidecars(parentCtx, eth2api.BlockIdSlot(slot)) + if err != nil && len(blockKzgCommitments) > 0 { // Prysm returns error on empty blobs + return 0, fmt.Errorf( + "node %d (%s): failed to retrieve blobs for slot %d: %v", + 0, + t.VerificationNodes().Running()[0].ClientNames(), + slot, + err, + ) + } + blobCount += uint64(len(refSidecars)) + + if len(refSidecars) != len(blockKzgCommitments) { + return 0, fmt.Errorf( + "node %d (%s): slot %d, block kzg commitments and sidecars length differ (sidecar count=%d, block kzg commitments=%d)", + 0, + t.VerificationNodes().Running()[0].ClientNames(), + slot, + len(refSidecars), + len(blockKzgCommitments), + ) + } + + // Verify against the execution block transactions + executionBlockHashesCount := 0 + for _, tx := range executionBlock.Transactions() { + blobHashes := tx.BlobHashes() + versionedHashVersion := byte(1) + if len(blobHashes) > 0 { + for _, blobHash := range blobHashes { + if executionBlockHashesCount < len(blockKzgCommitments) { + // Sha256 the kzg commitment and modify the first byte to be the version + hasher := sha256.New() + hasher.Write(blockKzgCommitments[executionBlockHashesCount][:]) + kzgHash := hasher.Sum(nil) + if !bytes.Equal(blobHash[1:], kzgHash[1:]) { + return 0, fmt.Errorf( + "node %d (%s): slot %d, block kzg commitments and execution block hashes differ (block kzg commitment=%x, execution block hash=%x)", + 0, + t.VerificationNodes().Running()[0].ClientNames(), + slot, + blockKzgCommitments[executionBlockHashesCount][:], + blobHash[:], + ) + } + if blobHash[0] != versionedHashVersion { + return 0, fmt.Errorf( + "node %d (%s): slot %d, execution blob hash does not contain the correct version: %d", + 0, + t.VerificationNodes().Running()[0].ClientNames(), + slot, + blobHash[0], + ) + } + } // else: test will fail after the loop, but we need to keep counting the hashes + executionBlockHashesCount++ + } + } + } + if executionBlockHashesCount != len(blockKzgCommitments) { + return 0, fmt.Errorf( + "node %d (%s): slot %d, block kzg commitments and execution block hashes length differ (block kzg commitment count=%d, execution block hash count=%d)", + 0, + t.VerificationNodes().Running()[0].ClientNames(), + slot, + len(blockKzgCommitments), + executionBlockHashesCount, + ) + } + + // Verify sidecars integrity + for i, sidecar := range refSidecars { + // Marshal the sidecar to json for logging + jsonSidecar, _ := json.MarshalIndent(sidecar, "", " ") + + // Check the blob index + if sidecar.Index != deneb.BlobIndex(i) { + t.Logf("INFO: sidecar: %s", jsonSidecar) + return 0, fmt.Errorf( + "node %d (%s): slot %d, blob index does not match (got=%d, expected=%d)", + 0, + t.VerificationNodes().Running()[0].ClientNames(), + slot, + sidecar.Index, + i, + ) + } + + // Verify the inclusion proof + if err := sidecar.VerifyProof(tree.GetHashFn()); err != nil { + // json log output the sidecar + t.Logf("INFO: sidecar: %s", jsonSidecar) + return 0, fmt.Errorf( + "node %d (%s): slot %d, failed to verify proof: %v", + 0, + t.VerificationNodes().Running()[0].ClientNames(), + slot, + err, + ) + } + + // Check the block root of included signed header + sidecarBlockRoot := sidecar.SignedBlockHeader.Message.HashTreeRoot(tree.GetHashFn()) + if !bytes.Equal(sidecarBlockRoot[:], blockRoot[:]) { + t.Logf("INFO: sidecar: %s", jsonSidecar) + return 0, fmt.Errorf( + "node %d (%s): block root of included signed header does not match (got=%x, expected=%x)", + 0, + t.VerificationNodes().Running()[0].ClientNames(), + sidecarBlockRoot[:], + blockRoot[:], + ) + } + + // Compare kzg commitment against the one in the block + if !bytes.Equal(sidecar.KZGCommitment[:], blockKzgCommitments[i][:]) { + t.Logf("INFO: sidecar: %s", jsonSidecar) + return 0, fmt.Errorf( + "node %d (%s): block kzg commitment and sidecar kzg commitment differ (block kzg commitment=%x, sidecar kzg commitment=%x)", + 0, + t.VerificationNodes().Running()[0].ClientNames(), + blockKzgCommitments[i][:], + sidecar.KZGCommitment[:], + ) + } + + // Compare the signature against the signed block + blockSignature := versionedBlock.Signature() + if !bytes.Equal(sidecar.SignedBlockHeader.Signature[:], blockSignature[:]) { + t.Logf("INFO: sidecar: %s", jsonSidecar) + return 0, fmt.Errorf( + "node %d (%s): block signature and sidecar signature differ (block signature=%s, sidecar block header signature=%s)", + 0, + t.VerificationNodes().Running()[0].ClientNames(), + blockSignature.String(), + sidecar.SignedBlockHeader.Signature.String(), + ) + } + + // TODO: Verify KZG Proof + } + + // Verify against the other beacon nodes + for i := 1; i < len(beaconClients); i++ { + // Check the reference client against the other clients, and verify that all clients return the same blobs + // Also keep count of blobs per client + bn := beaconClients[i] + // Get the sidecars for this client + sidecars, err := bn.BlobSidecars(parentCtx, eth2api.BlockIdSlot(slot)) + if err != nil && len(blockKzgCommitments) > 0 { // DEBUG!!! DO NOT MERGE!!! + // We already got some blobs from the reference client, so we should not get an error here + return 0, err + } + if len(sidecars) != len(refSidecars) { + return 0, fmt.Errorf( + "node %d (%s): different number of blobs (got=%d, expected=%d)", + i, + t.VerificationNodes().Running()[i].ClientNames(), + len(sidecars), + len(refSidecars), + ) + } + for j := 0; j < len(sidecars); j++ { + refSidecarRoot := refSidecars[j].HashTreeRoot(t.spec, tree.GetHashFn()) + sidecarRoot := sidecars[j].HashTreeRoot(t.spec, tree.GetHashFn()) + + // Verify the sidecar roots match + if !bytes.Equal(sidecarRoot[:], refSidecarRoot[:]) { + return 0, fmt.Errorf( + "node %d (%s): different sidecar roots\ngot=%s\nexpected=%s", + i, + bn.ClientName(), + sidecarRoot.String(), + refSidecarRoot.String(), + ) + } + } + } + } + return blobCount, nil +} diff --git a/simulators/eth2/common/utils/beacon_cache.go b/simulators/eth2/common/utils/beacon_cache.go new file mode 100644 index 0000000000..726773ea54 --- /dev/null +++ b/simulators/eth2/common/utils/beacon_cache.go @@ -0,0 +1,92 @@ +package utils + +import ( + "bytes" + "context" + "fmt" + + beacon_client "github.com/marioevz/eth-clients/clients/beacon" + "github.com/protolambda/eth2api" + beacon "github.com/protolambda/zrnt/eth2/beacon/common" + "github.com/protolambda/ztyp/tree" +) + +type BeaconBlockState struct { + *beacon_client.VersionedBeaconStateResponse + *beacon_client.VersionedSignedBeaconBlock +} + +type BeaconCache map[tree.Root]BeaconBlockState + +// Clear the cache for when there was a known/expected re-org to query everything again +func (c BeaconCache) Clear() error { + roots := make([]tree.Root, len(c)) + i := 0 + for s := range c { + roots[i] = s + i++ + } + for _, s := range roots { + delete(c, s) + } + return nil +} + +func (c BeaconCache) GetBlockStateByRoot( + ctx context.Context, + bc *beacon_client.BeaconClient, + blockroot tree.Root, +) (BeaconBlockState, error) { + if s, ok := c[blockroot]; ok { + return s, nil + } + b, err := bc.BlockV2(ctx, eth2api.BlockIdRoot(blockroot)) + if err != nil { + return BeaconBlockState{}, err + } + s, err := bc.BeaconStateV2(ctx, eth2api.StateIdSlot(b.Slot())) + if err != nil { + return BeaconBlockState{}, err + } + blockStateRoot := b.StateRoot() + stateRoot := s.Root() + if !bytes.Equal(blockStateRoot[:], stateRoot[:]) { + return BeaconBlockState{}, fmt.Errorf( + "state root missmatch while fetching state", + ) + } + both := BeaconBlockState{ + VersionedBeaconStateResponse: s, + VersionedSignedBeaconBlock: b, + } + c[blockroot] = both + return both, nil +} + +func (c BeaconCache) GetBlockStateBySlotFromHeadRoot( + ctx context.Context, + bc *beacon_client.BeaconClient, + headblockroot tree.Root, + slot beacon.Slot, +) (*BeaconBlockState, error) { + current, err := c.GetBlockStateByRoot(ctx, bc, headblockroot) + if err != nil { + return nil, err + } + if current.Slot() < slot { + return nil, fmt.Errorf("requested for slot above head") + } + for { + if current.Slot() == slot { + return ¤t, nil + } + if current.Slot() < slot || current.Slot() == 0 { + // Skipped slot probably, not a fatal error + return nil, nil + } + current, err = c.GetBlockStateByRoot(ctx, bc, current.ParentRoot()) + if err != nil { + return nil, err + } + } +} diff --git a/simulators/eth2/common/utils/description.go b/simulators/eth2/common/utils/description.go new file mode 100644 index 0000000000..8c67f03bb4 --- /dev/null +++ b/simulators/eth2/common/utils/description.go @@ -0,0 +1,75 @@ +// Test description struct and methods to add items to the description +package utils + +import ( + "fmt" + "strings" + + "github.com/lithammer/dedent" +) + +// Description struct to hold the description of a test structured in different categories +type Description struct { + Main string + Subsections []*subsection +} + +type subsection struct { + category string + items []string +} + +const ( + CategoryTestnetConfiguration = "Testnet Configuration" + CategoryVerificationsExecutionClient = "Verifications (Execution Client)" + CategoryVerificationsConsensusClient = "Verifications (Consensus Client)" +) + +// NewDescription creates a new instance of Description +func NewDescription(main string) *Description { + return &Description{ + Main: main, + Subsections: make([]*subsection, 0), + } +} + +func (d *Description) getSubsection(category string) *subsection { + for _, s := range d.Subsections { + if s.category == category { + return s + } + } + s := &subsection{ + category: category, + items: make([]string, 0), + } + d.Subsections = append(d.Subsections, s) + return s +} + +// Add method to add an item to a category +func (d *Description) Add(category, item string) { + // Check if the category already exists + s := d.getSubsection(category) + + // Append the item to the category + s.items = append(s.items, item) +} + +func (d *Description) Format() string { + // Create a string builder + sb := strings.Builder{} + // Add the main description + sb.WriteString(dedent.Dedent(d.Main)) + // Iterate over the categories + for _, s := range d.Subsections { + // Add the category to the string builder + sb.WriteString(fmt.Sprintf("\n\n#### %s\n\n", s.category)) + // Iterate over the Subsections + for _, item := range s.items { + // Add the item to the string builder + sb.WriteString(dedent.Dedent(item)) + } + } + return sb.String() +} diff --git a/simulators/eth2/common/utils/tx_spammer.go b/simulators/eth2/common/utils/tx_spammer.go new file mode 100644 index 0000000000..34f747ad4b --- /dev/null +++ b/simulators/eth2/common/utils/tx_spammer.go @@ -0,0 +1,67 @@ +package utils + +import ( + "context" + "time" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/hive/hivesim" + "github.com/ethereum/hive/simulators/ethereum/engine/globals" + "github.com/ethereum/hive/simulators/ethereum/engine/helper" + exec_client "github.com/marioevz/eth-clients/clients/execution" +) + +type TransactionSpammer struct { + *hivesim.T + Name string + ExecutionClients []*exec_client.ExecutionClient + Accounts []*globals.TestAccount + Recipient *common.Address + TransactionType helper.TestTransactionType + TransactionsPerIteration int + SecondsBetweenIterations int +} + +func (t *TransactionSpammer) Run(ctx context.Context) error { + // Send some transactions constantly in the bg + nonceMap := make(map[common.Address]uint64) + secondsBetweenIterations := time.Duration(t.SecondsBetweenIterations) + txCreator := helper.BaseTransactionCreator{ + Recipient: t.Recipient, + GasLimit: 500000, + Amount: common.Big1, + TxType: t.TransactionType, + } + txsSent := 0 + iteration := 0 + for { + select { + case <-ctx.Done(): + return ctx.Err() + case <-time.After(time.Second * secondsBetweenIterations): + currentClient := t.ExecutionClients[iteration%len(t.ExecutionClients)] + h, err := currentClient.HeaderByNumber(ctx, nil) + if err == nil { + for i := 0; i < t.TransactionsPerIteration; i++ { + sender := t.Accounts[txsSent%len(t.Accounts)] + nonce := nonceMap[sender.GetAddress()] + tx, err := txCreator.MakeTransaction(sender, nonce, h.Time) + if err != nil { + panic(err) + } + if err := currentClient.SendTransaction( + ctx, + tx, + ); err != nil { + t.Logf("INFO: Error sending tx (spammer %s): %v, sender: %s (%d), nonce=%d", t.Name, err, sender.GetAddress().String(), sender.GetIndex(), nonce) + } + nonceMap[sender.GetAddress()] = nonce + 1 + txsSent += 1 + } + iteration += 1 + } else { + t.Logf("INFO: Error fetching header: %v", err) + } + } + } +} diff --git a/simulators/eth2/common/utils/validators.go b/simulators/eth2/common/utils/validators.go new file mode 100644 index 0000000000..ad3967a980 --- /dev/null +++ b/simulators/eth2/common/utils/validators.go @@ -0,0 +1,528 @@ +// Utilities and methods to manage validators during the test cycle +package utils + +import ( + "bytes" + "context" + "fmt" + "math/big" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + beacon_client "github.com/marioevz/eth-clients/clients/beacon" + exec_client "github.com/marioevz/eth-clients/clients/execution" + "github.com/marioevz/eth-clients/clients/validator" + "github.com/pkg/errors" + blsu "github.com/protolambda/bls12-381-util" + beacon "github.com/protolambda/zrnt/eth2/beacon/common" + "github.com/protolambda/zrnt/eth2/beacon/phase0" + "github.com/protolambda/ztyp/tree" +) + +// Helper struct to keep track of current status of a validator withdrawal state +type Validator struct { + Spec *beacon.Spec + Index beacon.ValidatorIndex + PubKey *beacon.BLSPubkey + WithdrawAddress *common.Address + Exited bool + ExitInitiated bool + Slashed bool + ExactWithdrawableBalance *big.Int + Keys *validator.ValidatorKeys + InitialBalance beacon.Gwei + Balance beacon.Gwei + BlockStateCache BeaconCache +} + +// Signs the BLS-to-execution-change for the given address +func (v *Validator) SignBLSToExecutionChange( + executionAddress common.Address, + blsToExecutionChangeDomain beacon.BLSDomain, +) (*beacon.SignedBLSToExecutionChange, error) { + if v.Keys == nil { + return nil, fmt.Errorf("no key to sign") + } + if v.WithdrawAddress != nil { + return nil, fmt.Errorf("execution address already set") + } + kdPubKey := beacon.BLSPubkey{} + copy(kdPubKey[:], v.Keys.WithdrawalPubkey[:]) + eth1Address := beacon.Eth1Address{} + copy(eth1Address[:], executionAddress[:]) + blsToExecChange := beacon.BLSToExecutionChange{ + ValidatorIndex: v.Index, + FromBLSPubKey: kdPubKey, + ToExecutionAddress: eth1Address, + } + sigRoot := beacon.ComputeSigningRoot( + blsToExecChange.HashTreeRoot(tree.GetHashFn()), + blsToExecutionChangeDomain, + ) + sk := new(blsu.SecretKey) + sk.Deserialize(&v.Keys.WithdrawalSecretKey) + signature := blsu.Sign(sk, sigRoot[:]).Serialize() + return &beacon.SignedBLSToExecutionChange{ + BLSToExecutionChange: blsToExecChange, + Signature: beacon.BLSSignature(signature), + }, nil +} + +func (v *Validator) SignVoluntaryExit( + voluntaryExitDomain beacon.BLSDomain, +) (*phase0.SignedVoluntaryExit, error) { + if v.Keys == nil { + return nil, fmt.Errorf("no key to sign") + } + voluntaryExit := phase0.VoluntaryExit{ + ValidatorIndex: v.Index, + } + sigRoot := beacon.ComputeSigningRoot( + voluntaryExit.HashTreeRoot(tree.GetHashFn()), + voluntaryExitDomain, + ) + sk := new(blsu.SecretKey) + sk.Deserialize(&v.Keys.ValidatorSecretKey) + signature := blsu.Sign(sk, sigRoot[:]).Serialize() + return &phase0.SignedVoluntaryExit{ + Message: voluntaryExit, + Signature: beacon.BLSSignature(signature), + }, nil +} + +// Sign and send the BLS-to-execution-change. +// Also internally update the withdraw address. +func (v *Validator) SignSendBLSToExecutionChange( + ctx context.Context, + bc *beacon_client.BeaconClient, + executionAddress common.Address, + blsToExecutionChangeDomain beacon.BLSDomain, +) error { + signedBLS, err := v.SignBLSToExecutionChange(executionAddress, blsToExecutionChangeDomain) + if err != nil { + return err + } + if err := bc.SubmitPoolBLSToExecutionChange(ctx, beacon.SignedBLSToExecutionChanges{ + *signedBLS, + }); err != nil { + return err + } + + v.WithdrawAddress = &executionAddress + return nil +} + +// Sign and send the voluntary exit. +func (v *Validator) SignSendVoluntaryExit( + ctx context.Context, + bc *beacon_client.BeaconClient, + voluntaryExitDomain beacon.BLSDomain, +) error { + signedVoluntaryExit, err := v.SignVoluntaryExit(voluntaryExitDomain) + if err != nil { + return err + } + return bc.SubmitVoluntaryExit(ctx, signedVoluntaryExit) +} + +// Update the validator status from a beacon validator +func (v *Validator) updateFromBeaconValidator( + source beacon.Validator, + currentEpoch beacon.Epoch, + balance beacon.Gwei, +) error { + wc, err := source.WithdrawalCredentials() + if err != nil { + return err + } + if wc[0] == beacon.ETH1_ADDRESS_WITHDRAWAL_PREFIX { + withdrawAddress := common.Address{} + copy(withdrawAddress[:], wc[12:]) + v.WithdrawAddress = &withdrawAddress + } + + exitEpoch, err := source.ExitEpoch() + if err != nil { + return err + } + exitInitiated := exitEpoch != beacon.FAR_FUTURE_EPOCH + exited := exitEpoch <= currentEpoch + + slashed, err := source.Slashed() + if err != nil { + return err + } + + // If the validator just changed its state to exited, we can calculate the exact withdrawable balance (most of the time) + if exited && !v.Exited { + v.ExactWithdrawableBalance = big.NewInt(int64(balance)) + v.ExactWithdrawableBalance.Mul( + v.ExactWithdrawableBalance, + big.NewInt(1e9), + ) + } + + v.Exited = exited + v.ExitInitiated = exitInitiated + v.Slashed = slashed + v.Balance = balance + + return nil +} + +// Verifications +func WithdrawalsContainValidator( + ws []*types.Withdrawal, + vId beacon.ValidatorIndex, +) bool { + for _, w := range ws { + if w.Validator == uint64(vId) { + return true + } + } + return false +} + +func (v *Validator) VerifyWithdrawnBalance( + ctx context.Context, + bc *beacon_client.BeaconClient, + ec *exec_client.ExecutionClient, + headBlockRoot tree.Root, +) (bool, error) { + // Check the withdrawal address, if empty this is an error + if v.WithdrawAddress == nil { + return false, fmt.Errorf( + "checked balance for validator without a withdrawal address", + ) + } + execAddress := *v.WithdrawAddress + + // First get the head block + headBlockState, err := v.BlockStateCache.GetBlockStateByRoot( + ctx, + bc, + headBlockRoot, + ) + if err != nil { + return false, errors.Wrap(err, "failed to get head block state") + } + fmt.Printf( + "INFO: Verifying balance validator %d on slot %d\n", + v.Index, + headBlockState.Slot(), + ) + + // Then get the balance + execPayload, _, _, err := headBlockState.ExecutionPayload() + if err != nil { + return false, errors.Wrap( + err, + "failed to get execution payload from head", + ) + } + balance, err := ec.BalanceAt( + ctx, + execAddress, + big.NewInt(int64(execPayload.Number)), + ) + if err != nil { + return false, errors.Wrap(err, "failed to get balance") + } + + fmt.Printf( + "INFO: Balance of validator %d in the execution chain (block %d): %d\n", + v.Index, + execPayload.Number, + balance, + ) + + // If balance is zero, there have not been any withdrawals yet, + // but this is not an error + if balance.Cmp(common.Big0) == 0 { + return false, nil + } + + // If we have an exact withdrawal expected balance, then verify it + if v.ExactWithdrawableBalance != nil { + if v.ExactWithdrawableBalance.Cmp(balance) == 0 { + exitCondition := "Exited" + if v.Slashed { + exitCondition = "Slashed" + } + fmt.Printf( + "INFO: %s validator %d fully withdrawn: %d\n", + exitCondition, + v.Index, + v.ExactWithdrawableBalance, + ) + return true, nil + } else { + return true, fmt.Errorf("unexepected balance: want=%d, got=%d", v.ExactWithdrawableBalance, balance) + } + } else { + // We need to traverse the beacon state history to be able to compute + // the expected partial balance withdrawn + previousBalance := v.InitialBalance + expectedPartialWithdrawnBalance := beacon.Gwei(0) + for slot := beacon.Slot(0); slot <= headBlockState.Slot(); slot++ { + blockState, err := v.BlockStateCache.GetBlockStateBySlotFromHeadRoot(ctx, bc, headBlockRoot, slot) + if err != nil { + return false, errors.Wrapf(err, "failed to get block state, slot %d", slot) + } + if blockState == nil { + // Probably a skipped slot + continue + } + + execPayload, _, _, err := blockState.ExecutionPayload() + if err != nil { + return false, errors.Wrapf(err, "failed to get execution payload, slot %d", slot) + } + + if WithdrawalsContainValidator(execPayload.Withdrawals, v.Index) { + expectedPartialWithdrawnBalance += previousBalance - (v.Spec.MAX_EFFECTIVE_BALANCE) + } + + previousBalance = blockState.Balance(v.Index) + } + + if expectedPartialWithdrawnBalance != 0 { + expectedBalanceWei := new(big.Int).SetUint64(uint64(expectedPartialWithdrawnBalance)) + expectedBalanceWei.Mul(expectedBalanceWei, big.NewInt(1e9)) + if balance.Cmp(expectedBalanceWei) == 0 { + fmt.Printf( + "INFO: Validator %d partially withdrawn: %d\n", + v.Index, + balance, + ) + return true, nil + } else { + return true, fmt.Errorf("unexepected balance: want=%d, got=%d", expectedBalanceWei, balance) + } + + } else { + fmt.Printf( + "INFO: Validator %d expected withdraw balance is zero\n", + v.Index, + ) + } + + } + return false, nil +} + +type Validators struct { + vs map[beacon.ValidatorIndex]*Validator + spec *beacon.Spec + subset bool + BeaconCache + Keys map[beacon.ValidatorIndex]*validator.ValidatorKeys +} + +func NewValidators(spec *beacon.Spec, state beacon.BeaconState, keys map[beacon.ValidatorIndex]*validator.ValidatorKeys) (*Validators, error) { + vs := newValidators(spec, make(BeaconCache), keys, false) + if err := vs.updateFromBeaconState(state, true); err != nil { + return nil, err + } + // Set initial balance + for _, v := range vs.vs { + v.InitialBalance = v.Balance + } + return vs, nil +} + +func newValidators(spec *beacon.Spec, beaconCache BeaconCache, keys map[beacon.ValidatorIndex]*validator.ValidatorKeys, subset bool) *Validators { + return &Validators{ + vs: make(map[beacon.ValidatorIndex]*Validator), + spec: spec, + BeaconCache: beaconCache, + Keys: keys, + subset: subset, + } +} + +func (vs *Validators) GetValidatorByIndex(i beacon.ValidatorIndex) *Validator { + for _, v := range vs.vs { + if v.Index == i { + return v + } + } + return nil +} + +func (vs *Validators) Count() int { + return len(vs.vs) +} + +func (vs *Validators) ForEach(f func(*Validator)) { + for _, v := range vs.vs { + f(v) + } +} + +func (vs *Validators) Subset(incl func(*Validator) bool) *Validators { + ret := newValidators(vs.spec, vs.BeaconCache, vs.Keys, true) + for i, v := range vs.vs { + if incl(v) { + ret.vs[i] = v + } + } + return ret +} + +func (vs *Validators) NonWithdrawable() *Validators { + return vs.Subset(func(v *Validator) bool { + return v.WithdrawAddress == nil + }) +} + +func (vs *Validators) Withdrawable() *Validators { + return vs.Subset(func(v *Validator) bool { + return v.WithdrawAddress != nil + }) +} + +func (vs *Validators) FullyWithdrawable() *Validators { + return vs.Subset(func(v *Validator) bool { + return v.WithdrawAddress != nil && v.Exited + }) +} + +func (vs *Validators) Active() *Validators { + return vs.Subset(func(v *Validator) bool { + return !v.Exited && !v.Slashed + }) +} + +func (vs *Validators) Slashed() *Validators { + return vs.Subset(func(v *Validator) bool { + return v.Slashed + }) +} + +func (vs *Validators) Exited() *Validators { + return vs.Subset(func(v *Validator) bool { + return v.Exited + }) +} + +func (vs *Validators) ExitInitiated() *Validators { + return vs.Subset(func(v *Validator) bool { + return v.ExitInitiated + }) +} + +func (vs *Validators) Chunks(totalShares int) []*Validators { + ret := make([]*Validators, totalShares) + for i := range ret { + ret[i] = newValidators(vs.spec, vs.BeaconCache, vs.Keys, true) + } + i := 0 + for _, v := range vs.vs { + ret[i%totalShares].vs[v.Index] = v + i++ + } + return ret +} + +func (vs *Validators) SelectByIndex(indexes ...beacon.ValidatorIndex) *Validators { + return vs.Subset(func(v *Validator) bool { + for _, i := range indexes { + if v.Index == i { + return true + } + } + return false + }) +} + +func (vs *Validators) SelectByCount(count int) *Validators { + return vs.Subset(func(v *Validator) bool { + if count > 0 { + count-- + return true + } + return false + }) +} + +func (vs *Validators) UpdateFromBeaconState( + state beacon.BeaconState, +) error { + return vs.updateFromBeaconState(state, !vs.subset) +} + +func (vs *Validators) updateFromBeaconState( + state beacon.BeaconState, + appendNew bool, +) error { + slot, err := state.Slot() + if err != nil { + return err + } + currentEpoch := vs.spec.SlotToEpoch(slot) + + stateVals, err := state.Validators() + if err != nil { + return err + } + balances, err := state.Balances() + if err != nil { + return err + } + validatorCount, err := stateVals.ValidatorCount() + if err != nil { + return err + } else if validatorCount == 0 { + return fmt.Errorf("got zero validators") + } else if validatorCount != uint64(len(vs.Keys)) { + return fmt.Errorf("incorrect amount of keys: want=%d, got=%d", validatorCount, len(vs.Keys)) + } + for i := beacon.ValidatorIndex(0); i < beacon.ValidatorIndex(validatorCount); i++ { + beaconVal, err := stateVals.Validator(beacon.ValidatorIndex(i)) + if err != nil { + return err + } + balance, err := balances.GetBalance(i) + if err != nil { + return err + } + // Compare pub keys against the key we have + pubKey, err := beaconVal.Pubkey() + if err != nil { + return errors.Wrapf(err, "failed to get pubkey for validator %d", i) + } + + v := vs.vs[i] + if v == nil && appendNew { + // Check keys + keys := vs.Keys[i] + if keys == nil { + return fmt.Errorf("no key for validator %d", i) + } + + if !bytes.Equal(keys.ValidatorPubkey[:], pubKey[:]) { + return fmt.Errorf("pubkey mismatch for validator %d", i) + } + + v = &Validator{ + Index: i, + Keys: keys, + BlockStateCache: vs.BeaconCache, + PubKey: &pubKey, + } + vs.vs[i] = v + } + + if v != nil { + if err := v.updateFromBeaconValidator( + beaconVal, + currentEpoch, + balance, + ); err != nil { + return err + } + } + } + return nil +} diff --git a/simulators/eth2/common/utils/validators_test.go b/simulators/eth2/common/utils/validators_test.go new file mode 100644 index 0000000000..7f8dadf5c2 --- /dev/null +++ b/simulators/eth2/common/utils/validators_test.go @@ -0,0 +1,77 @@ +package utils_test + +import ( + "math/big" + "testing" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/hive/simulators/eth2/common/config" + cl "github.com/ethereum/hive/simulators/eth2/common/config/consensus" + el "github.com/ethereum/hive/simulators/eth2/common/config/execution" + "github.com/ethereum/hive/simulators/eth2/common/testnet" + "github.com/ethereum/hive/simulators/eth2/common/utils" +) + +var mnemonic = "couple kiwi radio river setup fortune hunt grief buddy forward perfect empty slim wear bounce drift execute nation tobacco dutch chapter festival ice fog" + +func TestValidatorKeys(t *testing.T) { + validatorCount := uint64(1024) + // Prepare a testnet + keySrc := &cl.MnemonicsKeySource{ + From: 0, + To: validatorCount, + Mnemonic: mnemonic, + } + keys, err := keySrc.Keys() + if err != nil { + t.Fatalf("failed to generate keys: %v", err) + } + + env := &testnet.Environment{ + Validators: keys, + } + config := &testnet.Config{ + ConsensusConfig: &cl.ConsensusConfig{ + ValidatorCount: new(big.Int).SetUint64(validatorCount), + }, + ForkConfig: &config.ForkConfig{ + TerminalTotalDifficulty: common.Big0, + AltairForkEpoch: common.Big0, + BellatrixForkEpoch: common.Big0, + CapellaForkEpoch: common.Big0, + DenebForkEpoch: common.Big1, + }, + Eth1Consensus: &el.ExecutionPostMergeGenesis{}, + } + + p, err := testnet.PrepareTestnet(env, config) + if err != nil { + t.Fatalf("failed to prepare testnet: %v", err) + } + + validators, err := utils.NewValidators(p.Spec, p.BeaconGenesis, p.ValidatorsSetupDetails.KeysMap(0)) + if err != nil { + t.Fatalf("failed to update validators: %v", err) + } + + if validators.Count() != int(validatorCount) { + t.Fatalf("invalid validator count: %d", validators.Count()) + } + + chunked := validators.Chunks(3) + if len(chunked) != 3 { + t.Fatalf("invalid chunk count: %d", len(chunked)) + } + if chunked[0].Count() != 342 { + t.Fatalf("invalid chunk count: %d", chunked[0].Count()) + } + if chunked[1].Count() != 341 { + t.Fatalf("invalid chunk count: %d", chunked[1].Count()) + } + if chunked[2].Count() != 341 { + t.Fatalf("invalid chunk count: %d", chunked[2].Count()) + } + if validators.Exited().Count() != 0 { + t.Fatalf("invalid exited validator count: %d", validators.Exited().Count()) + } +} From 2db3f419be2efa997a14d23f3be2aba1de954c94 Mon Sep 17 00:00:00 2001 From: Mario Vega Date: Mon, 25 Sep 2023 18:27:54 +0000 Subject: [PATCH 200/387] simulators/eth2/engine: remove pre-merge tests, fix updates to common --- simulators/eth2/engine/go.mod | 38 +- simulators/eth2/engine/go.sum | 133 +++-- simulators/eth2/engine/main.go | 21 +- simulators/eth2/engine/scenarios.go | 786 ++-------------------------- 4 files changed, 178 insertions(+), 800 deletions(-) diff --git a/simulators/eth2/engine/go.mod b/simulators/eth2/engine/go.mod index ba7e118f38..03a91617f8 100644 --- a/simulators/eth2/engine/go.mod +++ b/simulators/eth2/engine/go.mod @@ -3,10 +3,10 @@ module github.com/ethereum/hive/simulators/eth2/engine go 1.18 require ( - github.com/ethereum/go-ethereum v1.11.5 + github.com/ethereum/go-ethereum v1.13.1 github.com/ethereum/hive v0.0.0-20230313141339-8e3200bfc09e github.com/ethereum/hive/simulators/eth2/common v0.0.0-20230316220410-1364352c32a6 - github.com/marioevz/eth-clients v0.0.0-20230503173323-98293c926363 + github.com/marioevz/eth-clients v0.0.0-20230925201418-d5fbddd99b76 github.com/protolambda/eth2api v0.0.0-20230316214135-5f8afbd6d05d github.com/protolambda/zrnt v0.30.0 github.com/rauljordan/engine-proxy v0.0.0-20230316220057-4c80c36c4c3a @@ -18,7 +18,7 @@ require ( github.com/ferranbt/fastssz v0.1.2 // indirect github.com/go-ole/go-ole v1.2.6 // indirect github.com/go-stack/stack v1.8.1 // indirect - github.com/holiman/uint256 v1.2.2 // indirect + github.com/holiman/uint256 v1.2.3 // indirect github.com/mattn/go-runewidth v0.0.14 // indirect github.com/minio/sha256-simd v1.0.0 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect @@ -26,24 +26,29 @@ require ( github.com/protolambda/bls12-381-util v0.0.0-20220416220906-d8552aa452c7 // indirect github.com/shirou/gopsutil v3.21.11+incompatible // indirect github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a // indirect - github.com/tklauser/go-sysconf v0.3.11 // indirect - golang.org/x/sys v0.6.0 // indirect - golang.org/x/text v0.8.0 // indirect + github.com/tklauser/go-sysconf v0.3.12 // indirect + golang.org/x/sys v0.11.0 // indirect + golang.org/x/text v0.12.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) require ( github.com/DataDog/zstd v1.5.2 // indirect + github.com/Microsoft/go-winio v0.6.1 // indirect github.com/beorn7/perks v1.0.1 // indirect + github.com/bits-and-blooms/bitset v1.5.0 // indirect github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect github.com/cockroachdb/errors v1.9.1 // indirect github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect - github.com/cockroachdb/pebble v0.0.0-20230209160836-829675f94811 // indirect + github.com/cockroachdb/pebble v0.0.0-20230906160148-46873a6a7a06 // indirect github.com/cockroachdb/redact v1.1.3 // indirect + github.com/consensys/bavard v0.1.13 // indirect + github.com/consensys/gnark-crypto v0.10.0 // indirect + github.com/crate-crypto/go-kzg-4844 v0.3.0 // indirect github.com/deckarep/golang-set/v2 v2.1.0 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 // indirect - github.com/edsrzf/mmap-go v1.1.0 // indirect + github.com/ethereum/c-kzg-4844 v0.3.1 // indirect github.com/fjl/memsize v0.0.1 // indirect github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08 // indirect github.com/getsentry/sentry-go v0.18.0 // indirect @@ -65,6 +70,7 @@ require ( github.com/kr/pretty v0.3.1 // indirect github.com/kr/text v0.2.0 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect + github.com/mmcloughlin/addchain v0.4.0 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/prometheus/client_golang v1.14.0 // indirect github.com/prometheus/client_model v0.3.0 // indirect @@ -75,16 +81,20 @@ require ( github.com/rivo/uniseg v0.4.3 // indirect github.com/rogpeppe/go-internal v1.9.0 // indirect github.com/sirupsen/logrus v1.9.0 // indirect - github.com/tklauser/numcpus v0.6.0 // indirect + github.com/supranational/blst v0.3.11 // indirect + github.com/tklauser/numcpus v0.6.1 // indirect github.com/tyler-smith/go-bip39 v1.1.0 // indirect - github.com/urfave/cli/v2 v2.23.7 // indirect github.com/wealdtech/go-bytesutil v1.2.0 // indirect github.com/wealdtech/go-eth2-types/v2 v2.8.0 // indirect github.com/wealdtech/go-eth2-util v1.8.0 // indirect github.com/yusufpapurcu/wmi v1.2.2 // indirect - golang.org/x/crypto v0.4.0 // indirect - golang.org/x/exp v0.0.0-20230206171751-46f607a40771 // indirect - golang.org/x/time v0.3.0 // indirect + golang.org/x/crypto v0.12.0 // indirect + golang.org/x/exp v0.0.0-20230810033253-352e893a4cad // indirect + golang.org/x/mod v0.11.0 // indirect + golang.org/x/sync v0.3.0 // indirect + golang.org/x/tools v0.9.1 // indirect google.golang.org/protobuf v1.28.1 // indirect - gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce // indirect + rsc.io/tmplfunc v0.0.3 // indirect ) + +replace github.com/protolambda/eth2api => github.com/marioevz/eth2api v0.0.0-20230922201437-72bd1301e033 diff --git a/simulators/eth2/engine/go.sum b/simulators/eth2/engine/go.sum index 3c8aeb83df..3cead53528 100644 --- a/simulators/eth2/engine/go.sum +++ b/simulators/eth2/engine/go.sum @@ -1,25 +1,44 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= +github.com/Azure/azure-sdk-for-go/sdk/azcore v0.21.1/go.mod h1:fBF9PQNqB8scdgpZ3ufzaLntG0AG7C1WjPMsiFOmfHM= +github.com/Azure/azure-sdk-for-go/sdk/internal v0.8.3/go.mod h1:KLF4gFr6DcKFZwSuH8w8yEK6DpFl3LP5rhdvAb7Yz5I= +github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v0.3.0/go.mod h1:tPaiy8S5bQ+S5sOiDlINkp7+Ef339+Nz5L5XO+cnOHo= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/CloudyKit/fastprinter v0.0.0-20200109182630-33d98a066a53/go.mod h1:+3IMCy2vIlbG1XG/0ggNQv0SvxCAIpPM5b1nCz56Xno= github.com/CloudyKit/jet/v3 v3.0.0/go.mod h1:HKQPgSJmdK8hdoAbKUUWajkHyHo4RaU5rMdUywE7VMo= github.com/DataDog/zstd v1.5.2 h1:vUG4lAyuPCXO0TLbXvPv7EB7cNK1QV/luu55UHLrrn8= github.com/DataDog/zstd v1.5.2/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= github.com/Joker/hpp v1.0.0/go.mod h1:8x5n+M1Hp5hC0g8okX3sR3vFQwynaX/UgSOM9MeBKzY= +github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= +github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= github.com/Shopify/goreferrer v0.0.0-20181106222321-ec9c9a553398/go.mod h1:a1uqRtAwp2Xwc6WNPJEufxJ7fx3npB4UV/JOLmbu5I0= github.com/VictoriaMetrics/fastcache v1.12.0 h1:vnVi/y9yKDcD9akmc4NqAoqgQhJrOwUF+j9LTgn4QDE= github.com/VictoriaMetrics/fastcache v1.12.0/go.mod h1:tjiYeEfYXCqacuvYw/7UoDIeJaNxq6132xHICNP77w8= github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY= +github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= github.com/allegro/bigcache v1.2.1 h1:hg1sY1raCwic3Vnsvje6TT7/pnZba83LeFck5NrFKSc= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= +github.com/aws/aws-sdk-go-v2 v1.2.0/go.mod h1:zEQs02YRBw1DjK0PoJv3ygDYOFTre1ejlJWl8FwAuQo= +github.com/aws/aws-sdk-go-v2/config v1.1.1/go.mod h1:0XsVy9lBI/BCXm+2Tuvt39YmdHwS5unDQmxZOYe8F5Y= +github.com/aws/aws-sdk-go-v2/credentials v1.1.1/go.mod h1:mM2iIjwl7LULWtS6JCACyInboHirisUUdkBPoTHMOUo= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.0.2/go.mod h1:3hGg3PpiEjHnrkrlasTfxFqUsZ2GCk/fMUn4CbKgSkM= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.0.2/go.mod h1:45MfaXZ0cNbeuT0KQ1XJylq8A6+OpVV2E5kvY/Kq+u8= +github.com/aws/aws-sdk-go-v2/service/route53 v1.1.1/go.mod h1:rLiOUrPLW/Er5kRcQ7NkwbjlijluLsrIbu/iyl35RO4= +github.com/aws/aws-sdk-go-v2/service/sso v1.1.1/go.mod h1:SuZJxklHxLAXgLTc1iFXbEWkXs7QRTQpCLGaKIprQW0= +github.com/aws/aws-sdk-go-v2/service/sts v1.1.1/go.mod h1:Wi0EBZwiz/K44YliU0EKxqTCJGUfYTWXrrBwkq736bM= +github.com/aws/smithy-go v1.1.0/go.mod h1:EzMw8dbp/YJL4A5/sbhGddag+NPT7q084agLbB9LgIw= github.com/aymerick/raymond v2.0.3-0.20180322193309-b565731e1464+incompatible/go.mod h1:osfaiScAUVup+UC9Nfq76eWqDhXlp+4UYaA8uhTBO6g= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/bits-and-blooms/bitset v1.5.0 h1:NpE8frKRLGHIcEzkR+gZhiioW1+WbYV6fKwD6ZIpQT8= +github.com/bits-and-blooms/bitset v1.5.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U= github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/cespare/cp v0.1.0/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s= github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= @@ -27,52 +46,64 @@ github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWR github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cloudflare/cloudflare-go v0.14.0/go.mod h1:EnwdgGMaFOruiPZRFSgn+TsQ3hQ7C/YWzIGLeu5c304= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cockroachdb/datadriven v1.0.2 h1:H9MtNqVoVhvd9nCBwOyDjUEdZCREqbIdCJD93PBm/jA= github.com/cockroachdb/datadriven v1.0.2/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= +github.com/cockroachdb/datadriven v1.0.3-0.20230801171734-e384cf455877 h1:1MLK4YpFtIEo3ZtMA5C795Wtv5VuUnrXX7mQG+aHg6o= github.com/cockroachdb/errors v1.9.1 h1:yFVvsI0VxmRShfawbt/laCIDy/mtTqqnvoNgiy5bEV8= github.com/cockroachdb/errors v1.9.1/go.mod h1:2sxOtL2WIc096WSZqZ5h8fa17rdDq9HZOZLBCor4mBk= github.com/cockroachdb/logtags v0.0.0-20211118104740-dabe8e521a4f/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= -github.com/cockroachdb/pebble v0.0.0-20230209160836-829675f94811 h1:ytcWPaNPhNoGMWEhDvS3zToKcDpRsLuRolQJBVGdozk= -github.com/cockroachdb/pebble v0.0.0-20230209160836-829675f94811/go.mod h1:Nb5lgvnQ2+oGlE/EyZy4+2/CxRh9KfvCXnag1vtpxVM= +github.com/cockroachdb/pebble v0.0.0-20230906160148-46873a6a7a06 h1:T+Np/xtzIjYM/P5NAw0e2Rf1FGvzDau1h54MKvx8G7w= +github.com/cockroachdb/pebble v0.0.0-20230906160148-46873a6a7a06/go.mod h1:bynZ3gvVyhlvjLI7PT6dmZ7g76xzJ7HpxfjgkzCGz6s= github.com/cockroachdb/redact v1.1.3 h1:AKZds10rFSIj7qADf0g46UixK8NNLwWTNdCIGS5wfSQ= github.com/cockroachdb/redact v1.1.3/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= +github.com/cockroachdb/sentry-go v0.6.1-cockroachdb.2/go.mod h1:8BT+cPK6xvFOcRlk0R8eg+OTkcqI6baNH4xAkpiYVvQ= github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0/go.mod h1:4Zcjuz89kmFXt9morQgcfYZAYZ5n8WHjt81YYWIwtTM= +github.com/consensys/bavard v0.1.13 h1:oLhMLOFGTLdlda/kma4VOJazblc7IM5y5QPd2A/YjhQ= +github.com/consensys/bavard v0.1.13/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI= +github.com/consensys/gnark-crypto v0.10.0 h1:zRh22SR7o4K35SoNqouS9J/TKHTyU2QWaj5ldehyXtA= +github.com/consensys/gnark-crypto v0.10.0/go.mod h1:Iq/P3HHl0ElSjsg2E1gsMwhAyxnxoKK5nVyZKd+/KhU= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/cpuguy83/go-md2man v1.0.10 h1:BSKMNlYxDvnunlTymqtgONjNnaRV1sTpcovwwjF22jk= github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= +github.com/crate-crypto/go-kzg-4844 v0.3.0 h1:UBlWE0CgyFqqzTI+IFyCzA7A3Zw4iip6uzRv5NIXG0A= +github.com/crate-crypto/go-kzg-4844 v0.3.0/go.mod h1:SBP7ikXEgDnUPONgm33HtuDZEDtWa3L4QtN1ocJSEQ4= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/deckarep/golang-set v1.8.0/go.mod h1:5nI87KwE7wgsBU1F4GKAw2Qod7p5kyS383rP6+o6qqo= github.com/deckarep/golang-set/v2 v2.1.0 h1:g47V4Or+DUdzbs8FxCCmgb6VYd+ptPAngjM6dtGktsI= github.com/deckarep/golang-set/v2 v2.1.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0= +github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 h1:HbphB4TFFXpv7MNrT52FGrrgVXF1owhMVTHFZIlnvd4= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0/go.mod h1:DZGJHZMqrU4JJqFAWUS2UO1+lbSKsdiOoYi9Zzey7Fc= +github.com/deepmap/oapi-codegen v1.6.0/go.mod h1:ryDa9AgbELGeB+YEXE1dR53yAjHwFvE9iAUlWl9Al3M= github.com/dgraph-io/badger v1.6.0/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6psNgSztDR4= github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/edsrzf/mmap-go v1.1.0 h1:6EUwBLQ/Mcr1EYLE4Tn1VdW1A4ckqCQWZBw8Hr0kjpQ= -github.com/edsrzf/mmap-go v1.1.0/go.mod h1:19H/e8pUPLicwkyNgOykDXkJ9F0MHE+Z52B8EIth78Q= github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385/go.mod h1:0vRUJqYpeSZifjYj7uP3BG/gKcuzL9xWVV/Y+cK33KM= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/etcd-io/bbolt v1.3.3/go.mod h1:ZF2nL25h33cCyBtcyWeZ2/I3HQOfTP+0PIEvHjkjCrw= -github.com/ethereum/go-ethereum v1.11.5 h1:3M1uan+LAUvdn+7wCEFrcMM4LJTeuxDrPTg/f31a5QQ= -github.com/ethereum/go-ethereum v1.11.5/go.mod h1:it7x0DWnTDMfVFdXcU6Ti4KEFQynLHVRarcSlPr0HBo= +github.com/ethereum/c-kzg-4844 v0.3.1 h1:sR65+68+WdnMKxseNWxSJuAv2tsUrihTpVBTfM/U5Zg= +github.com/ethereum/c-kzg-4844 v0.3.1/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= +github.com/ethereum/go-ethereum v1.13.1 h1:UF2FaUKPIy5jeZk3X06ait3y2Q4wI+vJ1l7+UARp+60= +github.com/ethereum/go-ethereum v1.13.1/go.mod h1:xHQKzwkHSl0gnSjZK1mWa06XEdm9685AHqhRknOzqGQ= github.com/ethereum/hive v0.0.0-20230313141339-8e3200bfc09e h1:3g9cqRqpbZ92tSlGL4PfFoq435axKw6HiZ1Gz3fOkfk= github.com/ethereum/hive v0.0.0-20230313141339-8e3200bfc09e/go.mod h1:PlpDuxHg6q1jU0K8Ouf+RXlHguignJ7k8Eyukc9RCPQ= github.com/ethereum/hive/simulators/eth2/common v0.0.0-20230316220410-1364352c32a6 h1:LcSUNGwQuJyR/gdPcsif57yKX+3MyhpoAuChzR8k6Yk= github.com/ethereum/hive/simulators/eth2/common v0.0.0-20230316220410-1364352c32a6/go.mod h1:FX4oxNyTNw/P+TUWrb7vva7o/rFI0pHO7OYdtG6EtN4= github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072/go.mod h1:duJ4Jxv5lDcvg4QuQr0oowTf7dz4/CR8NtyCooz9HL8= +github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= github.com/ferranbt/fastssz v0.1.2 h1:Dky6dXlngF6Qjc+EfDipAkE83N5I5DE68bY6O0VLNPk= github.com/ferranbt/fastssz v0.1.2/go.mod h1:X5UPrE2u1UJjxHA8X54u04SBwdAQjG2sFtWs39YxyWs= @@ -93,9 +124,11 @@ github.com/gin-gonic/gin v1.4.0/go.mod h1:OW2EZn3DO8Ln9oIKOvM++LBO+5UPHJJDH72/q/ github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= +github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab/go.mod h1:/P9AEU963A2AYjv4d1V5eVL1CQbEJq6aCNHDDjibzu8= github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-sourcemap/sourcemap v2.1.3+incompatible/go.mod h1:F8jJfvm2KbVjc5NqelyYJmf/v5J0dwNLS2mL4sNA1Jg= github.com/go-stack/stack v1.8.1 h1:ntEHSVwIt7PNXNpgPmVfMrNhLtgjlmnZha2kOpuRiDw= github.com/go-stack/stack v1.8.1/go.mod h1:dcoOX6HbPZSZptuspn9bctJ+N/CnF5gGygcUP3XYfe4= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= @@ -143,7 +176,9 @@ github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.1.1-0.20200604201612-c04b05f3adfa/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -153,31 +188,38 @@ github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB7 github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/graph-gophers/graphql-go v1.3.0/go.mod h1:9CQHMSxwO4MprSdzoIEobiHpoLtHm77vfxsvsIN5Vuc= github.com/hashicorp/go-bexpr v0.1.11 h1:6DqdA/KBjurGby9yTY0bmkathya0lfwF2SeuubCI7dY= github.com/hashicorp/go-bexpr v0.1.11/go.mod h1:f03lAo0duBlDIUMGCuad8oLcgejw4m7U+N8T+6Kz1AE= github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/herumi/bls-eth-go-binary v1.28.1 h1:fcIZ48y5EE9973k05XjE8+P3YiQgjZz4JI/YabAm8KA= github.com/herumi/bls-eth-go-binary v1.28.1/go.mod h1:luAnRm3OsMQeokhGzpYmc0ZKwawY7o87PUEP11Z7r7U= +github.com/holiman/billy v0.0.0-20230718173358-1c7e68d277a7 h1:3JQNjnMRil1yD0IfZKHF9GxxWKDJGj8I0IqOUol//sw= github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao= github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA= github.com/holiman/uint256 v1.2.0/go.mod h1:y4ga/t+u+Xwd7CpDgZESaRcWy0I7XMlTMA25ApIH5Jw= -github.com/holiman/uint256 v1.2.2 h1:TXKcSGc2WaxPD2+bmzAsVthL4+pEN0YwXcL5qED83vk= -github.com/holiman/uint256 v1.2.2/go.mod h1:SC8Ryt4n+UBbPbIBKaG9zbbDlp4jOru9xFZmPzLUTxw= +github.com/holiman/uint256 v1.2.3 h1:K8UWO1HUJpRMXBxbmaY1Y8IAMZC/RsKB+ArEnnK4l5o= +github.com/holiman/uint256 v1.2.3/go.mod h1:SC8Ryt4n+UBbPbIBKaG9zbbDlp4jOru9xFZmPzLUTxw= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/huin/goupnp v1.0.3 h1:N8No57ls+MnjlB+JPiCVSOyy/ot7MJTqlo7rn+NYSqQ= +github.com/huin/goupnp v1.3.0 h1:UvLUlWDNpoUdYzb2TCn+MuTWtcjXKSza2n6CBdQ0xXc= github.com/hydrogen18/memlistener v0.0.0-20200120041712-dcc25e7acd91/go.mod h1:qEIFzExnS6016fRpRfxrExeVn2gbClQA99gQhnIcdhE= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/imkira/go-interpol v1.1.0/go.mod h1:z0h2/2T3XF8kyEPpRgJ3kmNv+C43p+I/CoI+jC3w2iA= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/influxdata/influxdb-client-go/v2 v2.4.0/go.mod h1:vLNHdxTJkIf2mSLvGrpj8TCcISApPoXkaxP8g9uRlW8= +github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo= github.com/iris-contrib/blackfriday v2.0.0+incompatible/go.mod h1:UzZ2bDEoaSGPbkg6SAB4att1aAwTmVIx/5gCVqeyUdI= github.com/iris-contrib/go.uuid v2.0.0+incompatible/go.mod h1:iz2lgM/1UnEf1kP0L/+fafWORmlnuysV2EMP8MW+qe0= github.com/iris-contrib/jade v1.1.3/go.mod h1:H/geBymxJhShH5kecoiOCSssPX7QWYH7UaeZTSWddIk= github.com/iris-contrib/pongo2 v0.0.1/go.mod h1:Ssh+00+3GAZqSQb30AvBRNxBx7rf0GqwkjqxNd0u65g= github.com/iris-contrib/schema v0.0.1/go.mod h1:urYA3uvUNG1TIIjOSCzHr9/LmbQo8LrOcOqfqxa4hXw= github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= +github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= +github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.3.0 h1:U0609e9tgbseu3rBINet9P48AI/D3oJs4dN7jwJOQ1U= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= @@ -208,13 +250,18 @@ github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= +github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/labstack/echo/v4 v4.5.0/go.mod h1:czIriw4a0C1dFun+ObrXp7ok03xON0N1awStJ6ArI7Y= github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= +github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c= +github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/marioevz/eth-clients v0.0.0-20230503171433-707db4e8bc85 h1:A3UX2d+yP+URXOlirB6ulC6mV6ET54MiMgEdgh29Wj8= -github.com/marioevz/eth-clients v0.0.0-20230503171433-707db4e8bc85/go.mod h1:LnzXFKyMw3wF/3eaTfPhKiwkWkZJXokOWcUI02Ioi4s= -github.com/marioevz/eth-clients v0.0.0-20230503173323-98293c926363 h1:ONwsdY5/heIE0HHxh4+QXkwa69MZuaO+vONXduNBbrM= -github.com/marioevz/eth-clients v0.0.0-20230503173323-98293c926363/go.mod h1:LnzXFKyMw3wF/3eaTfPhKiwkWkZJXokOWcUI02Ioi4s= +github.com/marioevz/eth-clients v0.0.0-20230925172743-e379ee1ecd6e h1:uBr6Gn5jBHnyoS34HV4GOiYjuua6J/F2FST0T6MO89E= +github.com/marioevz/eth-clients v0.0.0-20230925172743-e379ee1ecd6e/go.mod h1:YVrdn57Q3rAzm3wus4T9tg1vMPca4csVbzorPhkGCW0= +github.com/marioevz/eth-clients v0.0.0-20230925201418-d5fbddd99b76 h1:fj+aeR3YLmSRUWjOGgTxNMdvzm72J5JbKGKosNO/jkE= +github.com/marioevz/eth-clients v0.0.0-20230925201418-d5fbddd99b76/go.mod h1:YVrdn57Q3rAzm3wus4T9tg1vMPca4csVbzorPhkGCW0= +github.com/marioevz/eth2api v0.0.0-20230922201437-72bd1301e033 h1:sn57n+lbJrLS8FKYs08W7TEzraTGOCQGrSC4hni6rYw= +github.com/marioevz/eth2api v0.0.0-20230922201437-72bd1301e033/go.mod h1:hcwWCT4sF1X7KsMZ535MvDZVk5M20Uyj+x2LARZjQsM= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.11/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= @@ -243,11 +290,18 @@ github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyua github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/pointerstructure v1.2.1 h1:ZhBBeX8tSlRpu/FFhXH4RC4OJzFlqsQhoHZAz4x7TIw= github.com/mitchellh/pointerstructure v1.2.1/go.mod h1:BRAsLI5zgXmw97Lf6s25bs8ohIXc3tViBH44KcwB2g4= +github.com/mmcloughlin/addchain v0.4.0 h1:SobOdjm2xLj1KkXN5/n0xTIWyZA2+s99UCY1iPfkHRY= +github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqkyU72HC5wJ4RlU= +github.com/mmcloughlin/profile v0.1.1/go.mod h1:IhHD7q1ooxgwTgjxQYkACGA77oFTDdFVejUS1/tS/qU= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/moul/http2curl v1.0.0/go.mod h1:8UbvGypXm98wA/IqH45anm5Y2Z6ep6O31QGOAZ3H0fQ= +github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/naoina/go-stringutil v0.1.0/go.mod h1:XJ2SJL9jCtBh+P9q5btrd/Ylo8XwT/h1USek5+NqSA0= +github.com/naoina/toml v0.1.2-0.20170918210437-9fafd6967416/go.mod h1:NBIhNtsFMo3G2szEBne+bO4gS192HuIYRqfvOWb4i1E= github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= @@ -269,7 +323,9 @@ github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1y github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= github.com/onsi/gomega v1.19.0 h1:4ieX6qQjPP/BfC3mpsAtIGGlxTWPeA3Inl/7DtXw1tw= github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= +github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= +github.com/peterh/liner v1.1.1-0.20190123174540-a2c9a5303de7/go.mod h1:CRroGNssyjTd/qIG2FyxByd2S8JEAZXBl4qUrZf8GS0= github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= @@ -290,8 +346,6 @@ github.com/prometheus/procfs v0.9.0/go.mod h1:+pB4zwohETzFnmlpe6yd2lSc+0/46IYZRB github.com/protolambda/bls12-381-util v0.0.0-20210720105258-a772f2aac13e/go.mod h1:MPZvj2Pr0N8/dXyTPS5REeg2sdLG7t8DRzC1rLv925w= github.com/protolambda/bls12-381-util v0.0.0-20220416220906-d8552aa452c7 h1:cZC+usqsYgHtlBaGulVnZ1hfKAi8iWtujBnRLQE698c= github.com/protolambda/bls12-381-util v0.0.0-20220416220906-d8552aa452c7/go.mod h1:IToEjHuttnUzwZI5KBSM/LOOW3qLbbrHOEfp3SbECGY= -github.com/protolambda/eth2api v0.0.0-20230316214135-5f8afbd6d05d h1:35qD9zgP3ApfcHsETuJyX3G5kVOgFgAx6kaRGzPC+FY= -github.com/protolambda/eth2api v0.0.0-20230316214135-5f8afbd6d05d/go.mod h1:4WbGGB4Bv17hKsiytlJY4IQDNpRS234DvFvIBNLnd60= github.com/protolambda/go-keystorev4 v0.0.0-20211007151826-f20444f6d564 h1:yCXGkFjrZ8EggxW+Y7ueRZesNcBk0avLU0mVU/I2KtU= github.com/protolambda/go-keystorev4 v0.0.0-20211007151826-f20444f6d564/go.mod h1:Xda3KO8+DMyWaTr+LwUUpVRTB5SdFzoKu0ivXNI6p1s= github.com/protolambda/messagediff v1.4.0/go.mod h1:LboJp0EwIbJsePYpzh5Op/9G1/4mIztMRYzzwR0dR2M= @@ -338,20 +392,21 @@ github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5 github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= +github.com/supranational/blst v0.3.11 h1:LyU6FolezeWAhvQk0k6O/d49jqgO52MSDDfYgbeoEm4= +github.com/supranational/blst v0.3.11/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a h1:1ur3QoCqvE5fl+nylMaIr9PVV1w343YRDtsy+Rwu7XI= github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a/go.mod h1:RRCYJbIwD5jmqPI9XoAFR0OcDxqUctll6zUj/+B4S48= -github.com/tklauser/go-sysconf v0.3.11 h1:89WgdJhk5SNwJfu+GKyYveZ4IaJ7xAkecBo+KdJV0CM= -github.com/tklauser/go-sysconf v0.3.11/go.mod h1:GqXfhXY3kiPa0nAXPDIQIWzJbMCB7AmcWpGR8lSZfqI= -github.com/tklauser/numcpus v0.6.0 h1:kebhY2Qt+3U6RNK7UqpYNA+tJ23IBEGKkB7JQBfDYms= -github.com/tklauser/numcpus v0.6.0/go.mod h1:FEZLMke0lhOUG6w2JadTzp0a+Nl8PF/GFkQ5UVIcaL4= +github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= +github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= +github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= +github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= github.com/tyler-smith/go-bip39 v1.1.0 h1:5eUemwrMargf3BSLRRCalXT93Ns6pQJIjYQN2nyfOP8= github.com/tyler-smith/go-bip39 v1.1.0/go.mod h1:gUYDtqQw1JS3ZJ8UWVcGTGqqr6YIN3CWg+kkNaLt55U= github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= -github.com/urfave/cli/v2 v2.23.7 h1:YHDQ46s3VghFHFf1DdF+Sh7H4RqhcM+t0TmZRJx4oJY= -github.com/urfave/cli/v2 v2.23.7/go.mod h1:GHupkWPMM0M/sj1a2b4wUrWBPzazNrIjouW6fmdJLxc= +github.com/urfave/cli/v2 v2.25.7 h1:VAzn5oq403l5pHjc4OhD54+XGO9cdKVL/7lDjF+iKUs= github.com/urfave/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/valyala/fasthttp v1.6.0/go.mod h1:FstJa9V+Pj9vQ7OJie2qMHdwemEDaDiSdBnvPM1Su9w= @@ -387,11 +442,11 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.4.0 h1:UVQgzMY87xqpKNgb+kDsll2Igd33HszWHFLmpaRMq/8= -golang.org/x/crypto v0.4.0/go.mod h1:3quD/ATkf6oY+rnes5c3ExXTbLc8mueNue5/DoinL80= +golang.org/x/crypto v0.12.0 h1:tFM/ta59kqch6LlvYnPa0yx5a83cL2nHflFhYKvv9Yk= +golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20230206171751-46f607a40771 h1:xP7rWLUr1e1n2xkK5YB4LI0hPEy3LJC6Wk+D4pGlOJg= -golang.org/x/exp v0.0.0-20230206171751-46f607a40771/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc= +golang.org/x/exp v0.0.0-20230810033253-352e893a4cad h1:g0bG7Z4uG+OgH2QDODnjp6ggkk1bJDsINcuWmJN1iJU= +golang.org/x/exp v0.0.0-20230810033253-352e893a4cad/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= @@ -400,6 +455,8 @@ golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzB golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.11.0 h1:bUO06HqtnRcc/7l71XBe4WcqTZ+3AH1J59zWDDwLKgU= +golang.org/x/mod v0.11.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -421,7 +478,7 @@ golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT golang.org/x/net v0.0.0-20211008194852-3b03d305991f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.7.0 h1:rJrUqqhjsgNp7KqAIc25s9pZnjU7TUcSY7HcVZjdn1g= +golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -431,7 +488,8 @@ golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= +golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= +golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -467,9 +525,9 @@ golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ= -golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM= +golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -478,11 +536,10 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.8.0 h1:57P1ETyNKtuIjB4SRd15iJxuhj8Gc416Y78H3qgMh68= -golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc= +golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= -golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181221001348-537d06c36207/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -497,6 +554,8 @@ golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roY golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.9.1 h1:8WMNJAz3zrtPmnYC7ISf5dEn3MT0gY7jBJfw27yrrLo= +golang.org/x/tools v0.9.1/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -528,10 +587,12 @@ google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp0 google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= @@ -539,7 +600,7 @@ gopkg.in/go-playground/validator.v8 v8.18.2/go.mod h1:RX2a/7Ha8BgOhfk7j780h4/u/R gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1 h1:iiHuQZCNgYPmFQxd3BBN/Nc5+dAwzZuq5y40s20oQw0= gopkg.in/ini.v1 v1.51.1/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= -gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce h1:+JknDZhAj8YMt7GC73Ei8pv4MzjDUNPHgQWJdtMAaDU= +gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8= gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:5AcXVHNjg+BDxry382+8OKon8SEWiKktQR07RKPsv1c= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= @@ -555,3 +616,5 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +rsc.io/tmplfunc v0.0.3 h1:53XFQh69AfOa8Tw0Jm7t+GV7KZhOi6jzsCzTtKbMvzU= +rsc.io/tmplfunc v0.0.3/go.mod h1:AG3sTPzElb1Io3Yg4voV9AGZJuleGAwaVRxL9M49PhA= diff --git a/simulators/eth2/engine/main.go b/simulators/eth2/engine/main.go index 949cc6f7ad..75b5379732 100644 --- a/simulators/eth2/engine/main.go +++ b/simulators/eth2/engine/main.go @@ -32,6 +32,7 @@ var engineTests = []testSpec{ {Name: "invalid-quantity-fields", Run: InvalidQuantityPayloadFields}, {Name: "timeouts", Run: Timeouts}, } + var transitionTests = []testSpec{ // Transition (TERMINAL_TOTAL_DIFFICULTY) tests {Name: "invalid-transition-payload", Run: InvalidPayloadGen(1, Invalid)}, @@ -41,10 +42,6 @@ var transitionTests = []testSpec{ {Name: "invalid-terminal-block-payload-lower-ttd", Run: IncorrectTerminalBlockGen(-2)}, {Name: "invalid-terminal-block-payload-higher-ttd", Run: IncorrectTerminalBlockGen(1)}, {Name: "build-atop-invalid-terminal-block", Run: IncorrectTTDConfigEL}, - {Name: "syncing-with-chain-having-valid-transition-block", Run: SyncingWithChainHavingValidTransitionBlock}, - {Name: "syncing-with-chain-having-invalid-transition-block", Run: SyncingWithChainHavingInvalidTransitionBlock}, - {Name: "syncing-with-chain-having-invalid-post-transition-block", Run: SyncingWithChainHavingInvalidPostTransitionBlock}, - {Name: "re-org-and-sync-with-chain-having-invalid-terminal-block", Run: ReOrgSyncWithChainHavingInvalidTerminalBlock}, {Name: "no-viable-head-due-to-optimistic-sync", Run: NoViableHeadDueToOptimisticSync}, } @@ -91,19 +88,14 @@ func addAllTests(suite *hivesim.Suite, c *clients.ClientDefinitionsByRole, tests // Generate validator keys to use for all tests. keySrc := &consensus_config.MnemonicsKeySource{ - From: 0, - To: 64, - Validator: mnemonic, - Withdrawal: mnemonic, + From: 0, + To: 64, + Mnemonic: mnemonic, } keys, err := keySrc.Keys() if err != nil { panic(err) } - secrets, err := consensus_config.SecretKeys(keys) - if err != nil { - panic(err) - } for _, nodeDefinition := range c.Combinations() { for _, test := range tests { test := test @@ -112,9 +104,8 @@ func addAllTests(suite *hivesim.Suite, c *clients.ClientDefinitionsByRole, tests Description: test.About, Run: func(t *hivesim.T) { env := &testnet.Environment{ - Clients: c, - Keys: keys, - Secrets: secrets, + Clients: c, + Validators: keys, } test.Run(t, env, nodeDefinition) }, diff --git a/simulators/eth2/engine/scenarios.go b/simulators/eth2/engine/scenarios.go index 5d04331bd8..25fbea8c81 100644 --- a/simulators/eth2/engine/scenarios.go +++ b/simulators/eth2/engine/scenarios.go @@ -13,14 +13,14 @@ import ( api "github.com/ethereum/go-ethereum/beacon/engine" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/hive/hivesim" - "github.com/ethereum/hive/simulators/eth2/common/chain_generators/pow" "github.com/ethereum/hive/simulators/eth2/common/clients" + "github.com/ethereum/hive/simulators/eth2/common/config" + cl "github.com/ethereum/hive/simulators/eth2/common/config/consensus" el "github.com/ethereum/hive/simulators/eth2/common/config/execution" "github.com/ethereum/hive/simulators/eth2/common/debug" payload_spoof "github.com/ethereum/hive/simulators/eth2/common/spoofing/payload" tn "github.com/ethereum/hive/simulators/eth2/common/testnet" exec_client "github.com/marioevz/eth-clients/clients/execution" - "github.com/marioevz/eth-clients/clients/node" "github.com/protolambda/eth2api" beacon "github.com/protolambda/zrnt/eth2/beacon/common" spoof "github.com/rauljordan/engine-proxy/proxy" @@ -35,13 +35,17 @@ var ( // Default config used for all tests unless a client specific config exists DEFAULT_CONFIG = &tn.Config{ - ValidatorCount: big.NewInt(int64(DEFAULT_VALIDATOR_COUNT)), - TerminalTotalDifficulty: big.NewInt( - int64(DEFAULT_TERMINAL_TOTAL_DIFFICULTY), - ), - AltairForkEpoch: common.Big0, - BellatrixForkEpoch: common.Big0, - Eth1Consensus: &el.ExecutionCliqueConsensus{}, + ConsensusConfig: &cl.ConsensusConfig{ + ValidatorCount: big.NewInt(int64(DEFAULT_VALIDATOR_COUNT)), + }, + ForkConfig: &config.ForkConfig{ + TerminalTotalDifficulty: big.NewInt( + int64(DEFAULT_TERMINAL_TOTAL_DIFFICULTY), + ), + AltairForkEpoch: common.Big0, + BellatrixForkEpoch: common.Big0, + }, + Eth1Consensus: &el.ExecutionCliqueConsensus{}, } SAFE_SLOTS_TO_IMPORT_OPTIMISTICALLY_CLIENT_OVERRIDE = map[string]*big.Int{} @@ -671,7 +675,9 @@ func Timeouts(t *hivesim.T, env *tn.Environment, n clients.NodeDefinition) { n, }, // Use the default mainnet slot time to allow the timeout value to make sense - SlotTime: big.NewInt(int64(MAINNET_SLOT_TIME)), + ConsensusConfig: &cl.ConsensusConfig{ + SlotTime: big.NewInt(int64(MAINNET_SLOT_TIME)), + }, }) testnet := tn.StartTestnet(ctx, t, env, config) @@ -1225,7 +1231,7 @@ func SyncingWithInvalidChain( // Block can't contain an executable payload t.Fatalf("FAIL: Head of the chain is not a bellatrix fork block") } - if payload, err := versionedBlock.ExecutionPayload(); err != nil { + if payload, _, _, err := versionedBlock.ExecutionPayload(); err != nil { t.Fatalf( "FAIL: error getting execution payload: %v", err, @@ -1329,12 +1335,14 @@ func EqualTimestampTerminalTransitionBlock( n clients.NodeDefinition, ) { ctx := context.Background() - config := getClientConfig(n) - config = config.Join(&tn.Config{ - // We are increasing the clique period, therefore we can reduce the TTD - TerminalTotalDifficulty: big.NewInt( - config.TerminalTotalDifficulty.Int64() / 3, - ), + cfg := getClientConfig(n) + cfg = cfg.Join(&tn.Config{ + ForkConfig: &config.ForkConfig{ + // We are increasing the clique period, therefore we can reduce the TTD + TerminalTotalDifficulty: big.NewInt( + cfg.TerminalTotalDifficulty.Int64() / 3, + ), + }, NodeDefinitions: []clients.NodeDefinition{ n, n, @@ -1343,11 +1351,11 @@ func EqualTimestampTerminalTransitionBlock( // The clique period needs to be equal to the slot time to try to get the CL client to attempt to produce // a payload with the same timestamp as the terminal block Eth1Consensus: &el.ExecutionCliqueConsensus{ - CliquePeriod: config.SlotTime.Uint64(), + CliquePeriod: cfg.SlotTime.Uint64(), }, }) - testnet := tn.StartTestnet(ctx, t, env, config) + testnet := tn.StartTestnet(ctx, t, env, cfg) defer testnet.Stop() // No ForkchoiceUpdated with payload attributes should fail, which could happen if CL tries to create @@ -1383,23 +1391,25 @@ func TTDBeforeBellatrix( n clients.NodeDefinition, ) { ctx := context.Background() - config := getClientConfig(n) - config = config.Join(&tn.Config{ - AltairForkEpoch: common.Big1, - BellatrixForkEpoch: common.Big2, - TerminalTotalDifficulty: big.NewInt(150), + cfg := getClientConfig(n) + cfg = cfg.Join(&tn.Config{ + ForkConfig: &config.ForkConfig{ + AltairForkEpoch: common.Big1, + BellatrixForkEpoch: common.Big2, + TerminalTotalDifficulty: big.NewInt(150), + }, NodeDefinitions: []clients.NodeDefinition{ n, n, }, }) - testnet := tn.StartTestnet(ctx, t, env, config) + testnet := tn.StartTestnet(ctx, t, env, cfg) defer testnet.Stop() execPayloadCtx, cancel := testnet.Spec().SlotTimeoutContext( ctx, - SlotsUntilMerge(ctx, testnet, config), + SlotsUntilMerge(ctx, testnet, cfg), ) defer cancel() _, err := testnet.WaitForExecutionPayload(execPayloadCtx) @@ -1427,7 +1437,7 @@ func InvalidQuantityPayloadFields( n clients.NodeDefinition, ) { ctx := context.Background() - config := getClientConfig(n).Join(&tn.Config{ + cfg := getClientConfig(n).Join(&tn.Config{ NodeDefinitions: clients.NodeDefinitions{ n, n, @@ -1435,13 +1445,13 @@ func InvalidQuantityPayloadFields( }, }) - testnet := tn.StartTestnet(ctx, t, env, config) + testnet := tn.StartTestnet(ctx, t, env, cfg) defer testnet.Stop() // First we are going to wait for the transition to happen execPayloadCtx, cancel := testnet.Spec().SlotTimeoutContext( ctx, - SlotsUntilMerge(ctx, testnet, config), + SlotsUntilMerge(ctx, testnet, cfg), ) defer cancel() _, err := testnet.WaitForExecutionPayload(execPayloadCtx) @@ -1644,7 +1654,7 @@ func InvalidQuantityPayloadFields( t.Fatalf("FAIL: Error during payload verification: %v", err) } else if b != nil { - if execPayload, err := b.ExecutionPayload(); err != nil { + if execPayload, _, _, err := b.ExecutionPayload(); err != nil { t.Logf( "FAIL: Beacon block does not contain a payload, slot %d (%v)", b.Slot(), b.StateRoot(), @@ -1667,706 +1677,6 @@ func InvalidQuantityPayloadFields( } } -func SyncingWithChainHavingValidTransitionBlock( - t *hivesim.T, - env *tn.Environment, - n clients.NodeDefinition, -) { - var ( - safeSlotsToImportOptimistically = big.NewInt(8) - safeSlotsImportThreshold = uint64(4) - ctx = context.Background() - ) - if clientSafeSlots, ok := SAFE_SLOTS_TO_IMPORT_OPTIMISTICALLY_CLIENT_OVERRIDE[n.ConsensusClient]; ok { - safeSlotsToImportOptimistically = clientSafeSlots - } - - config := getClientConfig(n).Join(&tn.Config{ - NodeDefinitions: clients.NodeDefinitions{ - // Builder - clients.NodeDefinition{ - ExecutionClient: n.ExecutionClient, - ConsensusClient: n.ConsensusClient, - ValidatorShares: 1, - ChainGenerator: &pow.ChainGenerator{ - BlockCount: 1, - Config: pow.Defaults, - }, - }, - // Importer - clients.NodeDefinition{ - ExecutionClient: n.ExecutionClient, - ConsensusClient: n.ConsensusClient, - ValidatorShares: 0, - ChainGenerator: &pow.ChainGenerator{ - BlockCount: 1, - Config: pow.Defaults, - }, - }, - }, - Eth1Consensus: el.ExecutionPreChain{}, - SafeSlotsToImportOptimistically: safeSlotsToImportOptimistically, - }) - - testnet := tn.StartTestnet(ctx, t, env, config) - defer testnet.Stop() - - var ( - builder = testnet.BeaconClients()[0] - importer = testnet.BeaconClients()[1] - importerProxy = testnet.Proxies().Running()[1] - ) - - importerResponseMocker := payload_spoof.NewEngineResponseMocker( - &api.PayloadStatusV1{ - // By default we respond SYNCING to any payload - Status: Syncing, - LatestValidHash: nil, - }, - ) - importerResponseMocker.AddCallbacksToProxy(importerProxy) - - execPayloadCtx, cancel := testnet.Spec().SlotTimeoutContext( - ctx, - SlotsUntilMerge(ctx, testnet, config), - ) - defer cancel() - // Wait until the builder creates the first block with an execution payload - _, err := testnet.WaitForExecutionPayload(execPayloadCtx) - if err != nil { - t.Fatalf("FAIL: Waiting for execution payload on builder: %v", err) - } - - builderExecutionBlock, err := builder.GetFirstExecutionBeaconBlock(ctx) - if err != nil || builderExecutionBlock == nil { - t.Fatalf("FAIL: Could not find first execution block") - } - t.Logf( - "Builder Execution block found on slot %d", - builderExecutionBlock.Slot(), - ) - - // We wait until the importer reaches optimistic sync - optimisticStateCtx, cancel := testnet.Spec().SlotTimeoutContext( - ctx, - beacon.Slot( - safeSlotsToImportOptimistically.Uint64()+ - safeSlotsImportThreshold), - ) - defer cancel() - _, err = importer.WaitForOptimisticState( - optimisticStateCtx, - eth2api.BlockIdSlot(builderExecutionBlock.Slot()), - true, - ) - if err != nil { - t.Fatalf( - "FAIL: Timeout waiting for beacon node to become optimistic: %v", - err, - ) - } - - // Mocked responses are disabled, so the EL can finally validate payloads - importerResponseMocker.Mocking = false - - // Wait until newPayload or forkchoiceUpdated are called at least once - ctxTimeout, cancel := context.WithTimeout(ctx, time.Second*20) - defer cancel() - select { - case <-importerResponseMocker.NewPayloadCalled: - case <-importerResponseMocker.ForkchoiceUpdatedCalled: - case <-ctxTimeout.Done(): - t.Fatalf( - "FAIL: Timeout waiting for beacon node to send engine directive: %v", - err, - ) - } - - // Wait a couple of slots here to make sure syncing does not produce a false positive - time.Sleep(time.Duration(config.SlotTime.Uint64()*10) * time.Second) - - // Wait for the importer to get an execution payload - execPayloadCtx, cancel = testnet.Spec().SlotTimeoutContext( - ctx, - beacon.Slot(safeSlotsToImportOptimistically.Uint64()+safeSlotsImportThreshold), - ) - defer cancel() - _, err = importer.WaitForExecutionPayload(execPayloadCtx) - if err != nil { - t.Fatalf("FAIL: Waiting for execution payload on importer: %v", err) - } - - // Compare heads, the importer must have the same head as the builder, - // and `execution_optimistic==false`. - var ( - importerHeadInfo *eth2api.BeaconBlockHeaderAndInfo - builderHeadInfo *eth2api.BeaconBlockHeaderAndInfo - ) - importerHeadInfo, err = importer.BlockHeader(ctx, eth2api.BlockHead) - if err != nil { - t.Fatalf("FAIL: Failed to poll head importer head: %v", err) - } - - builderHeadInfo, err = builder.BlockHeader(ctx, eth2api.BlockHead) - if err != nil { - t.Fatalf("FAIL: Failed to poll head builder head: %v", err) - } - - if importerHeadInfo.Root != builderHeadInfo.Root { - t.Fatalf( - "FAIL: importer and builder heads are not equal: %v != %v", - importerHeadInfo.Root, - builderHeadInfo.Root, - ) - } - - optimistic, err := importer.BlockIsOptimistic(ctx, eth2api.BlockHead) - if err != nil { - t.Fatalf("FAIL: Failed to poll head importer head: %v", err) - } else if optimistic { - t.Fatalf( - "FAIL: importer still optimistic: execution_optimistic==%t", - optimistic, - ) - } -} - -func SyncingWithChainHavingInvalidTransitionBlock( - t *hivesim.T, - env *tn.Environment, - n clients.NodeDefinition, -) { - var ( - safeSlotsToImportOptimistically = big.NewInt(8) - safeSlotsImportThreshold = uint64(4) - ctx = context.Background() - ) - if clientSafeSlots, ok := SAFE_SLOTS_TO_IMPORT_OPTIMISTICALLY_CLIENT_OVERRIDE[n.ConsensusClient]; ok { - safeSlotsToImportOptimistically = clientSafeSlots - } - - config := getClientConfig(n).Join(&tn.Config{ - NodeDefinitions: clients.NodeDefinitions{ - // Builder - clients.NodeDefinition{ - ExecutionClient: n.ExecutionClient, - ConsensusClient: n.ConsensusClient, - ValidatorShares: 1, - ChainGenerator: &pow.ChainGenerator{ - BlockCount: 1, - Config: pow.Defaults, - }, - }, - // Importer - clients.NodeDefinition{ - ExecutionClient: n.ExecutionClient, - ConsensusClient: n.ConsensusClient, - ValidatorShares: 0, - ChainGenerator: &pow.ChainGenerator{ - BlockCount: 1, - Config: pow.Defaults, - }, - }, - }, - AltairForkEpoch: common.Big1, - BellatrixForkEpoch: common.Big2, - Eth1Consensus: el.ExecutionPreChain{}, - SafeSlotsToImportOptimistically: safeSlotsToImportOptimistically, - }) - - testnet := tn.StartTestnet(ctx, t, env, config) - defer testnet.Stop() - - var ( - builder = testnet.BeaconClients()[0] - importer = testnet.BeaconClients()[1] - importerProxy = testnet.Proxies().Running()[1] - ) - - importerResponseMocker := payload_spoof.NewEngineResponseMocker( - &api.PayloadStatusV1{ - // By default we respond SYNCING to any payload - Status: Syncing, - LatestValidHash: nil, - }, - ) - importerResponseMocker.AddCallbacksToProxy(importerProxy) - - // Wait until the builder creates the first block with an execution payload - execPayloadCtx, cancel := testnet.Spec().SlotTimeoutContext( - ctx, - SlotsUntilMerge(ctx, testnet, config), - ) - defer cancel() - _, err := testnet.WaitForExecutionPayload(execPayloadCtx) - if err != nil { - t.Fatalf( - "FAIL: Timeout waiting for execution payload on builder: %v", - err, - ) - } - - // Fetch the first execution block which will be used for verification - builderExecutionBlock, err := builder.GetFirstExecutionBeaconBlock(ctx) - if err != nil || builderExecutionBlock == nil { - t.Fatalf("FAIL: Could not find first execution block") - } - - t.Logf( - "INFO: First execution block: %d, %v", - builderExecutionBlock.Slot(), builderExecutionBlock.StateRoot(), - ) - - // We wait until the importer reaches optimistic sync - optimisticStateCtx, cancel := testnet.Spec().SlotTimeoutContext( - ctx, - beacon.Slot( - safeSlotsToImportOptimistically.Uint64()+ - safeSlotsImportThreshold), - ) - defer cancel() - _, err = importer.WaitForOptimisticState( - optimisticStateCtx, - eth2api.BlockIdSlot(builderExecutionBlock.Slot()), - true, - ) - if err != nil { - t.Fatalf( - "FAIL: Timeout waiting for beacon node to become optimistic: %v", - err, - ) - } - - // We invalidate the entire proof-of-stake chain - t.Logf("INFO: Changing default response to INVALID") - importerResponseMocker.SetDefaultResponse(&api.PayloadStatusV1{ - // The default is now that the execution client returns INVALID + LVH==0x00..00 - Status: Invalid, - LatestValidHash: &(common.Hash{}), - }) - - // Wait until newPayload or forkchoiceUpdated are called at least once - ctxTimeout, cancel := context.WithTimeout(ctx, time.Second*20) - defer cancel() - select { - case <-importerResponseMocker.NewPayloadCalled: - case <-importerResponseMocker.ForkchoiceUpdatedCalled: - case <-ctxTimeout.Done(): - t.Fatalf( - "FAIL: Timeout waiting for beacon node to send engine directive: %v", - err, - ) - } - - // Wait a couple of slots here to make sure syncing does not produce a false positive - time.Sleep(time.Duration(config.SlotTime.Uint64()*10) * time.Second) - - // Query the beacon chain head of the importer node, it should still - // point to a pre-merge block. - headInfo, err := importer.BlockHeader(ctx, eth2api.BlockHead) - if err != nil { - t.Fatalf("FAIL: Failed to poll head importer head: %v", err) - } - - if headInfo.Header.Message.Slot != (builderExecutionBlock.Slot() - 1) { - optimistic, err := importer.BlockIsOptimistic(ctx, eth2api.BlockHead) - if err != nil { - t.Fatalf("FAIL: Failed to poll head importer head: %v", err) - } - - t.Fatalf( - "FAIL: Importer head is beyond the invalid execution payload block: importer=%v:%d, builder=%v:%d, execution_optimistic=%t", - headInfo.Root, - headInfo.Header.Message.Slot, - builderExecutionBlock.StateRoot(), - builderExecutionBlock.Slot(), - optimistic, - ) - } -} - -func SyncingWithChainHavingInvalidPostTransitionBlock( - t *hivesim.T, - env *tn.Environment, - n clients.NodeDefinition, -) { - var ( - safeSlotsToImportOptimistically = big.NewInt(8) - safeSlotsImportThreshold = uint64(4) - ctx = context.Background() - ) - if clientSafeSlots, ok := SAFE_SLOTS_TO_IMPORT_OPTIMISTICALLY_CLIENT_OVERRIDE[n.ConsensusClient]; ok { - safeSlotsToImportOptimistically = clientSafeSlots - } - - config := getClientConfig(n).Join(&tn.Config{ - NodeDefinitions: clients.NodeDefinitions{ - // Builder - clients.NodeDefinition{ - ExecutionClient: n.ExecutionClient, - ConsensusClient: n.ConsensusClient, - ValidatorShares: 1, - ChainGenerator: &pow.ChainGenerator{ - BlockCount: 1, - Config: pow.Defaults, - }, - }, - // Importer - clients.NodeDefinition{ - ExecutionClient: n.ExecutionClient, - ConsensusClient: n.ConsensusClient, - ValidatorShares: 0, - ChainGenerator: &pow.ChainGenerator{ - BlockCount: 1, - Config: pow.Defaults, - }, - }, - }, - AltairForkEpoch: common.Big1, - BellatrixForkEpoch: common.Big2, - Eth1Consensus: el.ExecutionPreChain{}, - SafeSlotsToImportOptimistically: safeSlotsToImportOptimistically, - }) - - testnet := tn.StartTestnet(ctx, t, env, config) - defer testnet.Stop() - - var ( - builder = testnet.BeaconClients()[0] - importer = testnet.BeaconClients()[1] - importerProxy = testnet.Proxies().Running()[1] - ) - - importerResponseMocker := payload_spoof.NewEngineResponseMocker( - &api.PayloadStatusV1{ - // By default we respond SYNCING to any payload - Status: Syncing, - LatestValidHash: nil, - }, - ) - importerResponseMocker.AddCallbacksToProxy(importerProxy) - - // Wait until the builder creates the first block with an execution payload - execPayloadCtx, cancel := testnet.Spec().SlotTimeoutContext( - ctx, - SlotsUntilMerge(ctx, testnet, config), - ) - defer cancel() - _, err := testnet.WaitForExecutionPayload(execPayloadCtx) - if err != nil { - t.Fatalf("FAIL: Waiting for execution payload on builder: %v", err) - } - - // Fetch the first execution block which will be used for verification - builderExecutionBlock, err := builder.GetFirstExecutionBeaconBlock(ctx) - if err != nil || builderExecutionBlock == nil { - t.Fatalf("FAIL: Could not find first execution block") - } - execPayload, _ := builderExecutionBlock.ExecutionPayload() - transitionPayloadHash := execPayload.BlockHash - t.Logf( - "Builder Execution block found on slot %d, hash=%s", - builderExecutionBlock.Slot(), - transitionPayloadHash, - ) - - // We wait until the importer reaches optimistic sync - optimisticStateCtx, cancel := testnet.Spec().SlotTimeoutContext( - ctx, - beacon.Slot(safeSlotsToImportOptimistically.Uint64()+ - safeSlotsImportThreshold), - ) - defer cancel() - _, err = importer.WaitForOptimisticState( - optimisticStateCtx, - eth2api.BlockIdSlot(builderExecutionBlock.Slot()), - true, - ) - if err != nil { - t.Fatalf( - "FAIL: Timeout waiting for beacon node to become optimistic: %v", - err, - ) - } - - // We invalidate the chain after the transition payload - importerResponseMocker.AddResponse( - transitionPayloadHash, - &api.PayloadStatusV1{ - // Transition payload is valid - Status: Valid, - LatestValidHash: &transitionPayloadHash, - }, - ) - importerResponseMocker.SetDefaultResponse(&api.PayloadStatusV1{ - // The default is now that the execution client returns INVALID - // with latest valid hash equal to the transition payload - Status: Invalid, - LatestValidHash: &transitionPayloadHash, - }) - - // Wait until newPayload or forkchoiceUpdated are called at least once - ctxTimeout, cancel := context.WithTimeout(ctx, time.Second*20) - defer cancel() - select { - case <-importerResponseMocker.NewPayloadCalled: - case <-importerResponseMocker.ForkchoiceUpdatedCalled: - case <-ctxTimeout.Done(): - t.Fatalf( - "FAIL: Timeout waiting for beacon node to send engine directive: %v", - err, - ) - } - - // Wait a couple of slots here to make sure syncing does not produce a false positive - <-testnet.Spec().SlotsTimeout(5) - - // Query the beacon chain head of the importer node, - // it should point to transition payload block. - block, err := importer.GetFirstExecutionBeaconBlock(ctx) - if err != nil || block == nil { - t.Fatalf("FAIL: Block not found: %v", err) - } - payload, _ := block.ExecutionPayload() - if common.BytesToHash(payload.BlockHash[:]) != transitionPayloadHash { - t.Fatalf( - "FAIL: Latest payload in the importer is not the transition payload: %v", - common.BytesToHash(payload.BlockHash[:]), - ) - } -} - -func ReOrgSyncWithChainHavingInvalidTerminalBlock( - t *hivesim.T, - env *tn.Environment, - n clients.NodeDefinition, -) { - var ( - safeSlotsToImportOptimistically = big.NewInt(8) - ctx = context.Background() - ) - if clientSafeSlots, ok := SAFE_SLOTS_TO_IMPORT_OPTIMISTICALLY_CLIENT_OVERRIDE[n.ConsensusClient]; ok { - safeSlotsToImportOptimistically = clientSafeSlots - } - - // We are going to produce two PoW chains for three different clients - // EL_A: - EL_A := &pow.ChainGenerator{ // TD = 0x40000 - BlockCount: 2, - Config: pow.Defaults, - } - // EL_B: - EL_B := &pow.ChainGenerator{ // TD = 0x40000 - BlockCount: 2, - Config: pow.Defaults, - } - - // Network is partitioned from the start, execution client subnets A and B will never be able to communicate with - // each other. - config := getClientConfig(n).Join(&tn.Config{ - NodeDefinitions: clients.NodeDefinitions{ - // Builder 1 - clients.NodeDefinition{ - ExecutionClient: n.ExecutionClient, - ConsensusClient: n.ConsensusClient, - ValidatorShares: 10, - ChainGenerator: EL_A, - ExecutionSubnet: "A", - }, - // Importer 1 - clients.NodeDefinition{ - ExecutionClient: n.ExecutionClient, - ConsensusClient: n.ConsensusClient, - ValidatorShares: 0, - ChainGenerator: EL_A, - ExecutionSubnet: "A", - }, - // Builder 2 - clients.NodeDefinition{ - ExecutionClient: n.ExecutionClient, - ConsensusClient: n.ConsensusClient, - ValidatorShares: 10, - ChainGenerator: EL_B, - ExecutionSubnet: "B", - }, - // Importer 2 - clients.NodeDefinition{ - ExecutionClient: n.ExecutionClient, - ConsensusClient: n.ConsensusClient, - ValidatorShares: 0, - ChainGenerator: EL_B, - ExecutionSubnet: "B", - }, - }, - Eth1Consensus: el.ExecutionPreChain{}, - TerminalTotalDifficulty: big.NewInt(0x40000), - SafeSlotsToImportOptimistically: safeSlotsToImportOptimistically, - }) - - testnet := tn.StartTestnet(ctx, t, env, config) - defer testnet.Stop() - - // One pair of clients will produce the first execution payload, to which the other pair won't be able to sync, - // because they are not interconnected. - // Therefore only one client pair will end up in optimistic sync mode. - type BuilderImporterInfo struct { - Builder *node.Node - Importer *node.Node - ChainGenerator *pow.ChainGenerator - } - builderImporterPairs := []BuilderImporterInfo{ - { - Builder: testnet.Nodes[0], - Importer: testnet.Nodes[1], - ChainGenerator: EL_A, - }, - { - Builder: testnet.Nodes[2], - Importer: testnet.Nodes[3], - ChainGenerator: EL_B, - }, - } - optimisticPairChan := make(chan *BuilderImporterInfo) - for i, p := range builderImporterPairs { - p := p - // Only one pair will reach optimistic sync - go func(i int, p *BuilderImporterInfo) { - optimisticStateCtx, cancel := testnet.Spec().SlotTimeoutContext( - ctx, - SlotsUntilMerge(ctx, testnet, config)+ - beacon.Slot(safeSlotsToImportOptimistically.Uint64()+4), - ) - defer cancel() - _, err := p.Builder.BeaconClient.WaitForOptimisticState( - optimisticStateCtx, - eth2api.BlockHead, - true, - ) - if err != nil { - return - } - t.Logf("INFO: Detected optimistic sync on pair %d", i) - select { - case optimisticPairChan <- p: - default: - } - }(i, &p) - } - - var optimisticPair *BuilderImporterInfo - select { - case optimisticPair = <-optimisticPairChan: - case <-testnet.Spec().SlotsTimeout(SlotsUntilMerge(ctx, testnet, config) + - beacon.Slot(safeSlotsToImportOptimistically.Uint64()+4)): - t.Fatalf("FAIL: Timeout waiting for pair to become optimistic") - } - - t.Logf( - "INFO: Reached optimistic sync on nodes %d + %d", - optimisticPair.Builder.Index, - optimisticPair.Importer.Index, - ) - - // After the client pair reaches optimistic sync, invalidate the execution payload to trigger a - responseMocker := payload_spoof.NewEngineResponseMocker( - &api.PayloadStatusV1{ - Status: Invalid, - LatestValidHash: &(common.Hash{}), - }, - ) - // Every payload generated by this same pair is not invalidated - responseMocker.AddGetPayloadPassthroughToProxy( - optimisticPair.Builder.ExecutionClient.Proxy(), - ) - // The original head of the PoW chain needs to passthrough too - responseMocker.AddPassthrough( - optimisticPair.ChainGenerator.Head().Hash(), - true, - ) - // Add the callbacks to the optimistic sync pair - responseMocker.AddCallbacksToProxy( - optimisticPair.Builder.ExecutionClient.Proxy(), - ) - responseMocker.AddCallbacksToProxy( - optimisticPair.Importer.ExecutionClient.Proxy(), - ) - - // Wait until the optimistic builder creates its first block with an execution payload. - // At this point the builder is no longer optimistic - execPayloadCtx, cancel := testnet.Spec().SlotTimeoutContext( - ctx, - 12, - ) - defer cancel() - _, err := optimisticPair.Builder.BeaconClient.WaitForExecutionPayload( - execPayloadCtx) - if err != nil { - if err := debug.PrintAllTestnetBeaconBlocks(ctx, t, testnet.BeaconClients().Running()); err != nil { - t.Logf("FAIL: Error while printing all blocks: %v", err) - } - t.Fatalf( - "FAIL: Waiting for execution payload on optimistic builder: %v", - err, - ) - } - - // Wait until the optimistic importer fetches the first execution payload - // from the optimistic builder - execPayloadCtx, cancel = testnet.Spec().SlotTimeoutContext( - ctx, - 12, - ) - defer cancel() - _, err = optimisticPair.Importer.BeaconClient.WaitForExecutionPayload( - execPayloadCtx) - if err != nil { - // Print all heads for debugging - if err := debug.PrintAllTestnetBeaconBlocks(ctx, t, testnet.BeaconClients().Running()); err != nil { - t.Logf("FAIL: Error while printing all blocks: %v", err) - } - t.Fatalf( - "FAIL: Waiting for execution payload on optimistic importer: %v", - err, - ) - } - - // Verify the heads match - optimisticClients := exec_client.ExecutionClients{ - optimisticPair.Builder.ExecutionClient, - optimisticPair.Importer.ExecutionClient, - } - if match, err := optimisticClients.CheckHeads(t, ctx); err != nil { - t.Fatalf("FAIL: Error getting head of optimistic clients: %v", err) - } else if !match { - // Print all heads for debugging - if err := debug.PrintAllTestnetBeaconBlocks(ctx, t, testnet.BeaconClients().Running()); err != nil { - t.Logf("FAIL: Error while printing all blocks: %v", err) - } - t.Fatalf("FAIL: Heads of the optimistic clients don't match") - } - - // Verify heads of the two client pairs are different - forkedClients := exec_client.ExecutionClients{ - testnet.ExecutionClients().Running()[0], - testnet.ExecutionClients().Running()[2], - } - if match, err := forkedClients.CheckHeads(t, ctx); err != nil { - t.Fatalf("FAIL: Error getting head of clients: %v", err) - } else if match { - // Print all heads for debugging - if err := debug.PrintAllTestnetBeaconBlocks(ctx, t, testnet.BeaconClients().Running()); err != nil { - t.Logf("FAIL: Error while printing all blocks: %v", err) - } - t.Fatalf("FAIL: Heads of the clients match") - } - time.Sleep( - time.Duration(testnet.Spec().SECONDS_PER_SLOT) * time.Second * 6, - ) - if err := debug.PrintAllTestnetBeaconBlocks(ctx, t, testnet.BeaconClients().Running()); err != nil { - t.Fatalf("PrintAllTestnetBeaconBlocks failed: %v", err) - } -} - func NoViableHeadDueToOptimisticSync( t *hivesim.T, env *tn.Environment, @@ -2381,7 +1691,7 @@ func NoViableHeadDueToOptimisticSync( safeSlotsToImportOptimistically = clientSafeSlots } - config := getClientConfig(n).Join(&tn.Config{ + cfg := getClientConfig(n).Join(&tn.Config{ NodeDefinitions: clients.NodeDefinitions{ // Builder 1 clients.NodeDefinition{ @@ -2406,15 +1716,19 @@ func NoViableHeadDueToOptimisticSync( DisableStartup: true, }, }, - AltairForkEpoch: common.Big1, - BellatrixForkEpoch: big.NewInt(4), // Slot 128 + ForkConfig: &config.ForkConfig{ + AltairForkEpoch: common.Big1, + BellatrixForkEpoch: big.NewInt(4), // Slot 128 + }, Eth1Consensus: el.ExecutionEthashConsensus{ MiningNodes: 2, }, - SafeSlotsToImportOptimistically: safeSlotsToImportOptimistically, + ConsensusConfig: &cl.ConsensusConfig{ + SafeSlotsToImportOptimistically: safeSlotsToImportOptimistically, + }, }) - testnet := tn.StartTestnet(ctx, t, env, config) + testnet := tn.StartTestnet(ctx, t, env, cfg) defer testnet.Stop() var ( @@ -2552,7 +1866,7 @@ forloop: } // Sleep a few seconds so the invalid payload is incorporated into the chain - time.Sleep(time.Duration(config.SlotTime.Int64()/2) * time.Second) + time.Sleep(time.Duration(cfg.SlotTime.Int64()/2) * time.Second) // We need to check that the latestValidHash Block is indeed optimistic // First look for the block on the builder From 3490e848b400c52cda11cc00c5739e8ce6ea380d Mon Sep 17 00:00:00 2001 From: Mario Vega Date: Mon, 25 Sep 2023 18:18:46 +0000 Subject: [PATCH 201/387] simulators/eth2/withdrawals: Update to latest common --- simulators/eth2/withdrawals/go.mod | 41 ++++-- simulators/eth2/withdrawals/go.sum | 169 +++++++++++++---------- simulators/eth2/withdrawals/helper.go | 12 +- simulators/eth2/withdrawals/main.go | 11 +- simulators/eth2/withdrawals/scenarios.go | 22 ++- simulators/eth2/withdrawals/specs.go | 26 ++-- 6 files changed, 166 insertions(+), 115 deletions(-) diff --git a/simulators/eth2/withdrawals/go.mod b/simulators/eth2/withdrawals/go.mod index a010a2151b..a1de3a64a8 100644 --- a/simulators/eth2/withdrawals/go.mod +++ b/simulators/eth2/withdrawals/go.mod @@ -3,9 +3,12 @@ module github.com/ethereum/hive/simulators/eth2/withdrawals go 1.18 require ( - github.com/ethereum/go-ethereum v1.11.5 + github.com/ethereum/go-ethereum v1.13.1 github.com/ethereum/hive v0.0.0-20230313141339-8e3200bfc09e github.com/ethereum/hive/simulators/eth2/common v0.0.0-20230316220410-1364352c32a6 + github.com/marioevz/eth-clients v0.0.0-20230925201418-d5fbddd99b76 + github.com/marioevz/mock-builder v0.0.0-20230501225822-df434a88e375 + github.com/pkg/errors v0.9.1 github.com/protolambda/eth2api v0.0.0-20230316214135-5f8afbd6d05d github.com/protolambda/zrnt v0.30.0 github.com/protolambda/ztyp v0.2.2 @@ -17,7 +20,7 @@ require ( github.com/ferranbt/fastssz v0.1.2 // indirect github.com/go-ole/go-ole v1.2.6 // indirect github.com/go-stack/stack v1.8.1 // indirect - github.com/holiman/uint256 v1.2.2 // indirect + github.com/holiman/uint256 v1.2.3 // indirect github.com/mattn/go-runewidth v0.0.14 // indirect github.com/minio/sha256-simd v1.0.0 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect @@ -25,23 +28,29 @@ require ( github.com/protolambda/bls12-381-util v0.0.0-20220416220906-d8552aa452c7 github.com/shirou/gopsutil v3.21.11+incompatible // indirect github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a // indirect - github.com/tklauser/go-sysconf v0.3.11 // indirect - golang.org/x/sys v0.7.0 // indirect - golang.org/x/text v0.8.0 // indirect + github.com/tklauser/go-sysconf v0.3.12 // indirect + golang.org/x/sys v0.11.0 // indirect + golang.org/x/text v0.12.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) require ( github.com/DataDog/zstd v1.5.2 // indirect + github.com/Microsoft/go-winio v0.6.1 // indirect github.com/beorn7/perks v1.0.1 // indirect + github.com/bits-and-blooms/bitset v1.5.0 // indirect github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect github.com/cockroachdb/errors v1.9.1 // indirect github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect - github.com/cockroachdb/pebble v0.0.0-20230404150825-93eff0a72e22 // indirect + github.com/cockroachdb/pebble v0.0.0-20230906160148-46873a6a7a06 // indirect github.com/cockroachdb/redact v1.1.3 // indirect + github.com/consensys/bavard v0.1.13 // indirect + github.com/consensys/gnark-crypto v0.10.0 // indirect + github.com/crate-crypto/go-kzg-4844 v0.3.0 // indirect github.com/deckarep/golang-set/v2 v2.3.0 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 // indirect + github.com/ethereum/c-kzg-4844 v0.3.1 // indirect github.com/fjl/memsize v0.0.1 // indirect github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08 // indirect github.com/getsentry/sentry-go v0.20.0 // indirect @@ -62,10 +71,8 @@ require ( github.com/klauspost/cpuid/v2 v2.2.4 // indirect github.com/kr/pretty v0.3.1 // indirect github.com/kr/text v0.2.0 // indirect - github.com/marioevz/eth-clients v0.0.0-20230501225027-135b7d52b617 // indirect - github.com/marioevz/mock-builder v0.0.0-20230501225822-df434a88e375 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect - github.com/pkg/errors v0.9.1 // indirect + github.com/mmcloughlin/addchain v0.4.0 // indirect github.com/prometheus/client_golang v1.14.0 // indirect github.com/prometheus/client_model v0.3.0 // indirect github.com/prometheus/common v0.42.0 // indirect @@ -75,16 +82,20 @@ require ( github.com/rivo/uniseg v0.4.4 // indirect github.com/rogpeppe/go-internal v1.10.0 // indirect github.com/sirupsen/logrus v1.9.0 // indirect - github.com/tklauser/numcpus v0.6.0 // indirect + github.com/supranational/blst v0.3.11 // indirect + github.com/tklauser/numcpus v0.6.1 // indirect github.com/tyler-smith/go-bip39 v1.1.0 // indirect - github.com/urfave/cli/v2 v2.23.7 // indirect github.com/wealdtech/go-bytesutil v1.2.0 // indirect github.com/wealdtech/go-eth2-types/v2 v2.8.0 // indirect github.com/wealdtech/go-eth2-util v1.8.0 // indirect github.com/yusufpapurcu/wmi v1.2.2 // indirect - golang.org/x/crypto v0.7.0 // indirect - golang.org/x/exp v0.0.0-20230321023759-10a507213a29 // indirect - golang.org/x/time v0.3.0 // indirect + golang.org/x/crypto v0.12.0 // indirect + golang.org/x/exp v0.0.0-20230810033253-352e893a4cad // indirect + golang.org/x/mod v0.11.0 // indirect + golang.org/x/sync v0.3.0 // indirect + golang.org/x/tools v0.9.1 // indirect google.golang.org/protobuf v1.30.0 // indirect - gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce // indirect + rsc.io/tmplfunc v0.0.3 // indirect ) + +replace github.com/protolambda/eth2api => github.com/marioevz/eth2api v0.0.0-20230922201437-72bd1301e033 diff --git a/simulators/eth2/withdrawals/go.sum b/simulators/eth2/withdrawals/go.sum index 3de52d5233..04549da703 100644 --- a/simulators/eth2/withdrawals/go.sum +++ b/simulators/eth2/withdrawals/go.sum @@ -1,85 +1,106 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= +github.com/Azure/azure-sdk-for-go/sdk/azcore v0.21.1/go.mod h1:fBF9PQNqB8scdgpZ3ufzaLntG0AG7C1WjPMsiFOmfHM= +github.com/Azure/azure-sdk-for-go/sdk/internal v0.8.3/go.mod h1:KLF4gFr6DcKFZwSuH8w8yEK6DpFl3LP5rhdvAb7Yz5I= +github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v0.3.0/go.mod h1:tPaiy8S5bQ+S5sOiDlINkp7+Ef339+Nz5L5XO+cnOHo= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/CloudyKit/fastprinter v0.0.0-20200109182630-33d98a066a53/go.mod h1:+3IMCy2vIlbG1XG/0ggNQv0SvxCAIpPM5b1nCz56Xno= github.com/CloudyKit/jet/v3 v3.0.0/go.mod h1:HKQPgSJmdK8hdoAbKUUWajkHyHo4RaU5rMdUywE7VMo= github.com/DataDog/zstd v1.5.2 h1:vUG4lAyuPCXO0TLbXvPv7EB7cNK1QV/luu55UHLrrn8= github.com/DataDog/zstd v1.5.2/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= github.com/Joker/hpp v1.0.0/go.mod h1:8x5n+M1Hp5hC0g8okX3sR3vFQwynaX/UgSOM9MeBKzY= +github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= +github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= github.com/Shopify/goreferrer v0.0.0-20181106222321-ec9c9a553398/go.mod h1:a1uqRtAwp2Xwc6WNPJEufxJ7fx3npB4UV/JOLmbu5I0= -github.com/VictoriaMetrics/fastcache v1.12.0 h1:vnVi/y9yKDcD9akmc4NqAoqgQhJrOwUF+j9LTgn4QDE= -github.com/VictoriaMetrics/fastcache v1.12.0/go.mod h1:tjiYeEfYXCqacuvYw/7UoDIeJaNxq6132xHICNP77w8= github.com/VictoriaMetrics/fastcache v1.12.1 h1:i0mICQuojGDL3KblA7wUNlY5lOK6a4bwt3uRKnkZU40= github.com/VictoriaMetrics/fastcache v1.12.1/go.mod h1:tX04vaqcNoQeGLD+ra5pU5sWkuxnzWhEzLwhP9w653o= github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY= github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= github.com/allegro/bigcache v1.2.1 h1:hg1sY1raCwic3Vnsvje6TT7/pnZba83LeFck5NrFKSc= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= +github.com/aws/aws-sdk-go-v2 v1.2.0/go.mod h1:zEQs02YRBw1DjK0PoJv3ygDYOFTre1ejlJWl8FwAuQo= +github.com/aws/aws-sdk-go-v2/config v1.1.1/go.mod h1:0XsVy9lBI/BCXm+2Tuvt39YmdHwS5unDQmxZOYe8F5Y= +github.com/aws/aws-sdk-go-v2/credentials v1.1.1/go.mod h1:mM2iIjwl7LULWtS6JCACyInboHirisUUdkBPoTHMOUo= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.0.2/go.mod h1:3hGg3PpiEjHnrkrlasTfxFqUsZ2GCk/fMUn4CbKgSkM= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.0.2/go.mod h1:45MfaXZ0cNbeuT0KQ1XJylq8A6+OpVV2E5kvY/Kq+u8= +github.com/aws/aws-sdk-go-v2/service/route53 v1.1.1/go.mod h1:rLiOUrPLW/Er5kRcQ7NkwbjlijluLsrIbu/iyl35RO4= +github.com/aws/aws-sdk-go-v2/service/sso v1.1.1/go.mod h1:SuZJxklHxLAXgLTc1iFXbEWkXs7QRTQpCLGaKIprQW0= +github.com/aws/aws-sdk-go-v2/service/sts v1.1.1/go.mod h1:Wi0EBZwiz/K44YliU0EKxqTCJGUfYTWXrrBwkq736bM= +github.com/aws/smithy-go v1.1.0/go.mod h1:EzMw8dbp/YJL4A5/sbhGddag+NPT7q084agLbB9LgIw= github.com/aymerick/raymond v2.0.3-0.20180322193309-b565731e1464+incompatible/go.mod h1:osfaiScAUVup+UC9Nfq76eWqDhXlp+4UYaA8uhTBO6g= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/bits-and-blooms/bitset v1.5.0 h1:NpE8frKRLGHIcEzkR+gZhiioW1+WbYV6fKwD6ZIpQT8= +github.com/bits-and-blooms/bitset v1.5.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U= github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/cp v0.1.0/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s= github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cloudflare/cloudflare-go v0.14.0/go.mod h1:EnwdgGMaFOruiPZRFSgn+TsQ3hQ7C/YWzIGLeu5c304= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cockroachdb/datadriven v1.0.2 h1:H9MtNqVoVhvd9nCBwOyDjUEdZCREqbIdCJD93PBm/jA= github.com/cockroachdb/datadriven v1.0.2/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= +github.com/cockroachdb/datadriven v1.0.3-0.20230801171734-e384cf455877 h1:1MLK4YpFtIEo3ZtMA5C795Wtv5VuUnrXX7mQG+aHg6o= github.com/cockroachdb/errors v1.9.1 h1:yFVvsI0VxmRShfawbt/laCIDy/mtTqqnvoNgiy5bEV8= github.com/cockroachdb/errors v1.9.1/go.mod h1:2sxOtL2WIc096WSZqZ5h8fa17rdDq9HZOZLBCor4mBk= github.com/cockroachdb/logtags v0.0.0-20211118104740-dabe8e521a4f/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= -github.com/cockroachdb/pebble v0.0.0-20230209160836-829675f94811 h1:ytcWPaNPhNoGMWEhDvS3zToKcDpRsLuRolQJBVGdozk= -github.com/cockroachdb/pebble v0.0.0-20230209160836-829675f94811/go.mod h1:Nb5lgvnQ2+oGlE/EyZy4+2/CxRh9KfvCXnag1vtpxVM= -github.com/cockroachdb/pebble v0.0.0-20230404150825-93eff0a72e22 h1:2Nwgec/S3FkQW3r807JL9+D2xb2XU9zbRCotvQWLIfY= -github.com/cockroachdb/pebble v0.0.0-20230404150825-93eff0a72e22/go.mod h1:9lRMC4XN3/BLPtIp6kAKwIaHu369NOf2rMucPzipz50= +github.com/cockroachdb/pebble v0.0.0-20230906160148-46873a6a7a06 h1:T+Np/xtzIjYM/P5NAw0e2Rf1FGvzDau1h54MKvx8G7w= +github.com/cockroachdb/pebble v0.0.0-20230906160148-46873a6a7a06/go.mod h1:bynZ3gvVyhlvjLI7PT6dmZ7g76xzJ7HpxfjgkzCGz6s= github.com/cockroachdb/redact v1.1.3 h1:AKZds10rFSIj7qADf0g46UixK8NNLwWTNdCIGS5wfSQ= github.com/cockroachdb/redact v1.1.3/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= +github.com/cockroachdb/sentry-go v0.6.1-cockroachdb.2/go.mod h1:8BT+cPK6xvFOcRlk0R8eg+OTkcqI6baNH4xAkpiYVvQ= github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0/go.mod h1:4Zcjuz89kmFXt9morQgcfYZAYZ5n8WHjt81YYWIwtTM= +github.com/consensys/bavard v0.1.13 h1:oLhMLOFGTLdlda/kma4VOJazblc7IM5y5QPd2A/YjhQ= +github.com/consensys/bavard v0.1.13/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI= +github.com/consensys/gnark-crypto v0.10.0 h1:zRh22SR7o4K35SoNqouS9J/TKHTyU2QWaj5ldehyXtA= +github.com/consensys/gnark-crypto v0.10.0/go.mod h1:Iq/P3HHl0ElSjsg2E1gsMwhAyxnxoKK5nVyZKd+/KhU= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/cpuguy83/go-md2man v1.0.10 h1:BSKMNlYxDvnunlTymqtgONjNnaRV1sTpcovwwjF22jk= github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= +github.com/crate-crypto/go-kzg-4844 v0.3.0 h1:UBlWE0CgyFqqzTI+IFyCzA7A3Zw4iip6uzRv5NIXG0A= +github.com/crate-crypto/go-kzg-4844 v0.3.0/go.mod h1:SBP7ikXEgDnUPONgm33HtuDZEDtWa3L4QtN1ocJSEQ4= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/deckarep/golang-set/v2 v2.1.0 h1:g47V4Or+DUdzbs8FxCCmgb6VYd+ptPAngjM6dtGktsI= -github.com/deckarep/golang-set/v2 v2.1.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= +github.com/deckarep/golang-set v1.8.0/go.mod h1:5nI87KwE7wgsBU1F4GKAw2Qod7p5kyS383rP6+o6qqo= github.com/deckarep/golang-set/v2 v2.3.0 h1:qs18EKUfHm2X9fA50Mr/M5hccg2tNnVqsiBImnyDs0g= github.com/deckarep/golang-set/v2 v2.3.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0= +github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 h1:HbphB4TFFXpv7MNrT52FGrrgVXF1owhMVTHFZIlnvd4= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0/go.mod h1:DZGJHZMqrU4JJqFAWUS2UO1+lbSKsdiOoYi9Zzey7Fc= +github.com/deepmap/oapi-codegen v1.6.0/go.mod h1:ryDa9AgbELGeB+YEXE1dR53yAjHwFvE9iAUlWl9Al3M= github.com/dgraph-io/badger v1.6.0/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6psNgSztDR4= github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/edsrzf/mmap-go v1.1.0 h1:6EUwBLQ/Mcr1EYLE4Tn1VdW1A4ckqCQWZBw8Hr0kjpQ= github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385/go.mod h1:0vRUJqYpeSZifjYj7uP3BG/gKcuzL9xWVV/Y+cK33KM= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/etcd-io/bbolt v1.3.3/go.mod h1:ZF2nL25h33cCyBtcyWeZ2/I3HQOfTP+0PIEvHjkjCrw= -github.com/ethereum/go-ethereum v1.11.4 h1:KG81SnUHXWk8LJB3mBcHg/E2yLvXoiPmRMCIRxgx3cE= -github.com/ethereum/go-ethereum v1.11.4/go.mod h1:it7x0DWnTDMfVFdXcU6Ti4KEFQynLHVRarcSlPr0HBo= -github.com/ethereum/go-ethereum v1.11.5 h1:3M1uan+LAUvdn+7wCEFrcMM4LJTeuxDrPTg/f31a5QQ= -github.com/ethereum/go-ethereum v1.11.5/go.mod h1:it7x0DWnTDMfVFdXcU6Ti4KEFQynLHVRarcSlPr0HBo= +github.com/ethereum/c-kzg-4844 v0.3.1 h1:sR65+68+WdnMKxseNWxSJuAv2tsUrihTpVBTfM/U5Zg= +github.com/ethereum/c-kzg-4844 v0.3.1/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= +github.com/ethereum/go-ethereum v1.13.1 h1:UF2FaUKPIy5jeZk3X06ait3y2Q4wI+vJ1l7+UARp+60= +github.com/ethereum/go-ethereum v1.13.1/go.mod h1:xHQKzwkHSl0gnSjZK1mWa06XEdm9685AHqhRknOzqGQ= github.com/ethereum/hive v0.0.0-20230313141339-8e3200bfc09e h1:3g9cqRqpbZ92tSlGL4PfFoq435axKw6HiZ1Gz3fOkfk= github.com/ethereum/hive v0.0.0-20230313141339-8e3200bfc09e/go.mod h1:PlpDuxHg6q1jU0K8Ouf+RXlHguignJ7k8Eyukc9RCPQ= github.com/ethereum/hive/simulators/eth2/common v0.0.0-20230316220410-1364352c32a6 h1:LcSUNGwQuJyR/gdPcsif57yKX+3MyhpoAuChzR8k6Yk= github.com/ethereum/hive/simulators/eth2/common v0.0.0-20230316220410-1364352c32a6/go.mod h1:FX4oxNyTNw/P+TUWrb7vva7o/rFI0pHO7OYdtG6EtN4= github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072/go.mod h1:duJ4Jxv5lDcvg4QuQr0oowTf7dz4/CR8NtyCooz9HL8= +github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= github.com/ferranbt/fastssz v0.1.2 h1:Dky6dXlngF6Qjc+EfDipAkE83N5I5DE68bY6O0VLNPk= github.com/ferranbt/fastssz v0.1.2/go.mod h1:X5UPrE2u1UJjxHA8X54u04SBwdAQjG2sFtWs39YxyWs= @@ -93,8 +114,6 @@ github.com/gavv/httpexpect v2.0.0+incompatible/go.mod h1:x+9tiU1YnrOvnB725RkpoLv github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08 h1:f6D9Hr8xV8uYKlyuj8XIruxlh9WjVjdh1gIicAS7ays= github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= github.com/getsentry/sentry-go v0.12.0/go.mod h1:NSap0JBYWzHND8oMbyi0+XZhUalc1TBdRL1M71JZW2c= -github.com/getsentry/sentry-go v0.18.0 h1:MtBW5H9QgdcJabtZcuJG80BMOwaBpkRDZkxRkNC1sN0= -github.com/getsentry/sentry-go v0.18.0/go.mod h1:Kgon4Mby+FJ7ZWHFUAZgVaIa8sxHtnRJRLTXZr51aKQ= github.com/getsentry/sentry-go v0.20.0 h1:bwXW98iMRIWxn+4FgPW7vMrjmbym6HblXALmhjHmQaQ= github.com/getsentry/sentry-go v0.20.0/go.mod h1:lc76E2QywIyW8WuBnwl8Lc4bkmQH4+w1gwTf25trprY= github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3/go.mod h1:VJ0WA2NBN22VlZ2dKZQPAPnyWw5XTlK1KymzLKsr59s= @@ -102,9 +121,11 @@ github.com/gin-gonic/gin v1.4.0/go.mod h1:OW2EZn3DO8Ln9oIKOvM++LBO+5UPHJJDH72/q/ github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= +github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab/go.mod h1:/P9AEU963A2AYjv4d1V5eVL1CQbEJq6aCNHDDjibzu8= github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-sourcemap/sourcemap v2.1.3+incompatible/go.mod h1:F8jJfvm2KbVjc5NqelyYJmf/v5J0dwNLS2mL4sNA1Jg= github.com/go-stack/stack v1.8.1 h1:ntEHSVwIt7PNXNpgPmVfMrNhLtgjlmnZha2kOpuRiDw= github.com/go-stack/stack v1.8.1/go.mod h1:dcoOX6HbPZSZptuspn9bctJ+N/CnF5gGygcUP3XYfe4= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= @@ -120,8 +141,6 @@ github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/gogo/status v1.1.0/go.mod h1:BFv9nrluPLmrS0EmGVvLaPNmRosr9KapBYd5/hpY1WM= github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= -github.com/golang-jwt/jwt/v4 v4.4.3 h1:Hxl6lhQFj4AnOX6MLrsCb/+7tCj7DxP7VA+2rDIq5AU= -github.com/golang-jwt/jwt/v4 v4.4.3/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= @@ -138,12 +157,10 @@ github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvq github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXiurYmW7fx4GZkL8feAMVq7nEjURHk= github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= @@ -157,7 +174,9 @@ github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.1.1-0.20200604201612-c04b05f3adfa/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -167,33 +186,38 @@ github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB7 github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/graph-gophers/graphql-go v1.3.0/go.mod h1:9CQHMSxwO4MprSdzoIEobiHpoLtHm77vfxsvsIN5Vuc= github.com/hashicorp/go-bexpr v0.1.11 h1:6DqdA/KBjurGby9yTY0bmkathya0lfwF2SeuubCI7dY= github.com/hashicorp/go-bexpr v0.1.11/go.mod h1:f03lAo0duBlDIUMGCuad8oLcgejw4m7U+N8T+6Kz1AE= github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/herumi/bls-eth-go-binary v1.28.1 h1:fcIZ48y5EE9973k05XjE8+P3YiQgjZz4JI/YabAm8KA= github.com/herumi/bls-eth-go-binary v1.28.1/go.mod h1:luAnRm3OsMQeokhGzpYmc0ZKwawY7o87PUEP11Z7r7U= +github.com/holiman/billy v0.0.0-20230718173358-1c7e68d277a7 h1:3JQNjnMRil1yD0IfZKHF9GxxWKDJGj8I0IqOUol//sw= github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao= github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA= github.com/holiman/uint256 v1.2.0/go.mod h1:y4ga/t+u+Xwd7CpDgZESaRcWy0I7XMlTMA25ApIH5Jw= -github.com/holiman/uint256 v1.2.1 h1:XRtyuda/zw2l+Bq/38n5XUoEF72aSOu/77Thd9pPp2o= -github.com/holiman/uint256 v1.2.1/go.mod h1:y4ga/t+u+Xwd7CpDgZESaRcWy0I7XMlTMA25ApIH5Jw= -github.com/holiman/uint256 v1.2.2 h1:TXKcSGc2WaxPD2+bmzAsVthL4+pEN0YwXcL5qED83vk= -github.com/holiman/uint256 v1.2.2/go.mod h1:SC8Ryt4n+UBbPbIBKaG9zbbDlp4jOru9xFZmPzLUTxw= +github.com/holiman/uint256 v1.2.3 h1:K8UWO1HUJpRMXBxbmaY1Y8IAMZC/RsKB+ArEnnK4l5o= +github.com/holiman/uint256 v1.2.3/go.mod h1:SC8Ryt4n+UBbPbIBKaG9zbbDlp4jOru9xFZmPzLUTxw= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/huin/goupnp v1.0.3 h1:N8No57ls+MnjlB+JPiCVSOyy/ot7MJTqlo7rn+NYSqQ= +github.com/huin/goupnp v1.3.0 h1:UvLUlWDNpoUdYzb2TCn+MuTWtcjXKSza2n6CBdQ0xXc= github.com/hydrogen18/memlistener v0.0.0-20200120041712-dcc25e7acd91/go.mod h1:qEIFzExnS6016fRpRfxrExeVn2gbClQA99gQhnIcdhE= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/imkira/go-interpol v1.1.0/go.mod h1:z0h2/2T3XF8kyEPpRgJ3kmNv+C43p+I/CoI+jC3w2iA= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/influxdata/influxdb-client-go/v2 v2.4.0/go.mod h1:vLNHdxTJkIf2mSLvGrpj8TCcISApPoXkaxP8g9uRlW8= +github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo= github.com/iris-contrib/blackfriday v2.0.0+incompatible/go.mod h1:UzZ2bDEoaSGPbkg6SAB4att1aAwTmVIx/5gCVqeyUdI= github.com/iris-contrib/go.uuid v2.0.0+incompatible/go.mod h1:iz2lgM/1UnEf1kP0L/+fafWORmlnuysV2EMP8MW+qe0= github.com/iris-contrib/jade v1.1.3/go.mod h1:H/geBymxJhShH5kecoiOCSssPX7QWYH7UaeZTSWddIk= github.com/iris-contrib/pongo2 v0.0.1/go.mod h1:Ssh+00+3GAZqSQb30AvBRNxBx7rf0GqwkjqxNd0u65g= github.com/iris-contrib/schema v0.0.1/go.mod h1:urYA3uvUNG1TIIjOSCzHr9/LmbQo8LrOcOqfqxa4hXw= github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= +github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= +github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.3.0 h1:U0609e9tgbseu3rBINet9P48AI/D3oJs4dN7jwJOQ1U= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= @@ -209,14 +233,10 @@ github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/compress v1.8.2/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= github.com/klauspost/compress v1.9.7/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= -github.com/klauspost/compress v1.15.15 h1:EF27CXIuDsYJ6mmvtBRlEuB2UVOqHG1tAXgZ7yIO+lw= -github.com/klauspost/compress v1.15.15/go.mod h1:ZcK2JAFqKOpnBlxcLsJzYfrS9X1akm9fHZNnD9+Vo/4= github.com/klauspost/compress v1.16.3 h1:XuJt9zzcnaz6a16/OU53ZjWp/v7/42WcR5t2a0PcNQY= github.com/klauspost/compress v1.16.3/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= github.com/klauspost/cpuid v1.2.1/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -github.com/klauspost/cpuid/v2 v2.2.2 h1:xPMwiykqNK9VK0NYC3+jTMYv9I6Vl3YdjZgPZKG3zO0= -github.com/klauspost/cpuid/v2 v2.2.2/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= github.com/klauspost/cpuid/v2 v2.2.4 h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk= github.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= @@ -228,11 +248,18 @@ github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= +github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/labstack/echo/v4 v4.5.0/go.mod h1:czIriw4a0C1dFun+ObrXp7ok03xON0N1awStJ6ArI7Y= github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= +github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c= +github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/marioevz/eth-clients v0.0.0-20230501225027-135b7d52b617 h1:sk4stg95D93cfiIIYI+XPRhXZQ91QGIPOHNDZjmpXms= -github.com/marioevz/eth-clients v0.0.0-20230501225027-135b7d52b617/go.mod h1:LnzXFKyMw3wF/3eaTfPhKiwkWkZJXokOWcUI02Ioi4s= +github.com/marioevz/eth-clients v0.0.0-20230925172743-e379ee1ecd6e h1:uBr6Gn5jBHnyoS34HV4GOiYjuua6J/F2FST0T6MO89E= +github.com/marioevz/eth-clients v0.0.0-20230925172743-e379ee1ecd6e/go.mod h1:YVrdn57Q3rAzm3wus4T9tg1vMPca4csVbzorPhkGCW0= +github.com/marioevz/eth-clients v0.0.0-20230925201418-d5fbddd99b76 h1:fj+aeR3YLmSRUWjOGgTxNMdvzm72J5JbKGKosNO/jkE= +github.com/marioevz/eth-clients v0.0.0-20230925201418-d5fbddd99b76/go.mod h1:YVrdn57Q3rAzm3wus4T9tg1vMPca4csVbzorPhkGCW0= +github.com/marioevz/eth2api v0.0.0-20230922201437-72bd1301e033 h1:sn57n+lbJrLS8FKYs08W7TEzraTGOCQGrSC4hni6rYw= +github.com/marioevz/eth2api v0.0.0-20230922201437-72bd1301e033/go.mod h1:hcwWCT4sF1X7KsMZ535MvDZVk5M20Uyj+x2LARZjQsM= github.com/marioevz/mock-builder v0.0.0-20230501225822-df434a88e375 h1:44F0CrAc81Nzsr/4BhkeKebbrHERHdCjO6jXS9VAE/0= github.com/marioevz/mock-builder v0.0.0-20230501225822-df434a88e375/go.mod h1:FQIXEFViaQkOqKrqLC91JgqG+6YEvqMVh9D7g6PmFUg= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= @@ -244,7 +271,7 @@ github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hd github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= -github.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peKQ= +github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.14 h1:+xnbZSEeDbOIg5/mE6JF0w6n9duR1l3/WmbinWVwUuU= github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= @@ -263,11 +290,18 @@ github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyua github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/pointerstructure v1.2.1 h1:ZhBBeX8tSlRpu/FFhXH4RC4OJzFlqsQhoHZAz4x7TIw= github.com/mitchellh/pointerstructure v1.2.1/go.mod h1:BRAsLI5zgXmw97Lf6s25bs8ohIXc3tViBH44KcwB2g4= +github.com/mmcloughlin/addchain v0.4.0 h1:SobOdjm2xLj1KkXN5/n0xTIWyZA2+s99UCY1iPfkHRY= +github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqkyU72HC5wJ4RlU= +github.com/mmcloughlin/profile v0.1.1/go.mod h1:IhHD7q1ooxgwTgjxQYkACGA77oFTDdFVejUS1/tS/qU= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/moul/http2curl v1.0.0/go.mod h1:8UbvGypXm98wA/IqH45anm5Y2Z6ep6O31QGOAZ3H0fQ= +github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/naoina/go-stringutil v0.1.0/go.mod h1:XJ2SJL9jCtBh+P9q5btrd/Ylo8XwT/h1USek5+NqSA0= +github.com/naoina/toml v0.1.2-0.20170918210437-9fafd6967416/go.mod h1:NBIhNtsFMo3G2szEBne+bO4gS192HuIYRqfvOWb4i1E= github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= @@ -289,7 +323,9 @@ github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1y github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= github.com/onsi/gomega v1.19.0 h1:4ieX6qQjPP/BfC3mpsAtIGGlxTWPeA3Inl/7DtXw1tw= github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= +github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= +github.com/peterh/liner v1.1.1-0.20190123174540-a2c9a5303de7/go.mod h1:CRroGNssyjTd/qIG2FyxByd2S8JEAZXBl4qUrZf8GS0= github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= @@ -303,8 +339,6 @@ github.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQg github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4= github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= -github.com/prometheus/common v0.39.0 h1:oOyhkDq05hPZKItWVBkJ6g6AtGxi+fy7F4JvUV8uhsI= -github.com/prometheus/common v0.39.0/go.mod h1:6XBZ7lYdLCbkAVhwRsWTZn+IN5AB9F/NXd5w0BbEX0Y= github.com/prometheus/common v0.42.0 h1:EKsfXEYo4JpWMHH5cg+KOUWeuJSov1Id8zGR8eeI1YM= github.com/prometheus/common v0.42.0/go.mod h1:xBwqVerjNdUDjgODMpudtOMwlOwf2SaTr1yjz4b7Zbc= github.com/prometheus/procfs v0.9.0 h1:wzCHvIvM5SxWqYvwgVL7yJY8Lz3PKn49KQtpgMYJfhI= @@ -312,8 +346,6 @@ github.com/prometheus/procfs v0.9.0/go.mod h1:+pB4zwohETzFnmlpe6yd2lSc+0/46IYZRB github.com/protolambda/bls12-381-util v0.0.0-20210720105258-a772f2aac13e/go.mod h1:MPZvj2Pr0N8/dXyTPS5REeg2sdLG7t8DRzC1rLv925w= github.com/protolambda/bls12-381-util v0.0.0-20220416220906-d8552aa452c7 h1:cZC+usqsYgHtlBaGulVnZ1hfKAi8iWtujBnRLQE698c= github.com/protolambda/bls12-381-util v0.0.0-20220416220906-d8552aa452c7/go.mod h1:IToEjHuttnUzwZI5KBSM/LOOW3qLbbrHOEfp3SbECGY= -github.com/protolambda/eth2api v0.0.0-20230316214135-5f8afbd6d05d h1:35qD9zgP3ApfcHsETuJyX3G5kVOgFgAx6kaRGzPC+FY= -github.com/protolambda/eth2api v0.0.0-20230316214135-5f8afbd6d05d/go.mod h1:4WbGGB4Bv17hKsiytlJY4IQDNpRS234DvFvIBNLnd60= github.com/protolambda/go-keystorev4 v0.0.0-20211007151826-f20444f6d564 h1:yCXGkFjrZ8EggxW+Y7ueRZesNcBk0avLU0mVU/I2KtU= github.com/protolambda/go-keystorev4 v0.0.0-20211007151826-f20444f6d564/go.mod h1:Xda3KO8+DMyWaTr+LwUUpVRTB5SdFzoKu0ivXNI6p1s= github.com/protolambda/messagediff v1.4.0/go.mod h1:LboJp0EwIbJsePYpzh5Op/9G1/4mIztMRYzzwR0dR2M= @@ -325,17 +357,14 @@ github.com/prysmaticlabs/gohashtree v0.0.1-alpha.0.20220714111606-acbb2962fb48 h github.com/rauljordan/engine-proxy v0.0.0-20230316220057-4c80c36c4c3a h1:ZIfMLprHVdo2vs3WcSqSDEyz2ZsSzDhGeOyxh8VQThA= github.com/rauljordan/engine-proxy v0.0.0-20230316220057-4c80c36c4c3a/go.mod h1:9OVXfWYnIV+wj1/SqfdREmE5mzN/OANAgdOJRtFtvpo= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= -github.com/rivo/uniseg v0.4.3 h1:utMvzDsuh3suAEnhH0RdHmoPbU648o6CvXxTx4SBMOw= -github.com/rivo/uniseg v0.4.3/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis= github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rogpeppe/go-internal v1.8.1/go.mod h1:JeRgkft04UBgHMgCIwADu4Pn6Mtm5d4nPKWu0nJ5d+o= -github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= -github.com/rs/cors v1.8.2 h1:KCooALfAYGs415Cwu5ABvv9n9509fSiG5SQJn/AQo4U= +github.com/rs/cors v1.8.3 h1:O+qNyWn7Z+F9M0ILBHgMVPuB1xTOucVd5gtaYyXBpRo= github.com/russross/blackfriday v1.5.2 h1:HyvC0ARfnZBqnXwABFeSZHpKvJHJJfPz81GNueLj0oo= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= @@ -363,21 +392,22 @@ github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81P github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= -github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= +github.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8= +github.com/supranational/blst v0.3.11 h1:LyU6FolezeWAhvQk0k6O/d49jqgO52MSDDfYgbeoEm4= +github.com/supranational/blst v0.3.11/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a h1:1ur3QoCqvE5fl+nylMaIr9PVV1w343YRDtsy+Rwu7XI= github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a/go.mod h1:RRCYJbIwD5jmqPI9XoAFR0OcDxqUctll6zUj/+B4S48= -github.com/tklauser/go-sysconf v0.3.11 h1:89WgdJhk5SNwJfu+GKyYveZ4IaJ7xAkecBo+KdJV0CM= -github.com/tklauser/go-sysconf v0.3.11/go.mod h1:GqXfhXY3kiPa0nAXPDIQIWzJbMCB7AmcWpGR8lSZfqI= -github.com/tklauser/numcpus v0.6.0 h1:kebhY2Qt+3U6RNK7UqpYNA+tJ23IBEGKkB7JQBfDYms= -github.com/tklauser/numcpus v0.6.0/go.mod h1:FEZLMke0lhOUG6w2JadTzp0a+Nl8PF/GFkQ5UVIcaL4= +github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= +github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= +github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= +github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= github.com/tyler-smith/go-bip39 v1.1.0 h1:5eUemwrMargf3BSLRRCalXT93Ns6pQJIjYQN2nyfOP8= github.com/tyler-smith/go-bip39 v1.1.0/go.mod h1:gUYDtqQw1JS3ZJ8UWVcGTGqqr6YIN3CWg+kkNaLt55U= github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= -github.com/urfave/cli/v2 v2.23.7 h1:YHDQ46s3VghFHFf1DdF+Sh7H4RqhcM+t0TmZRJx4oJY= -github.com/urfave/cli/v2 v2.23.7/go.mod h1:GHupkWPMM0M/sj1a2b4wUrWBPzazNrIjouW6fmdJLxc= +github.com/urfave/cli/v2 v2.25.7 h1:VAzn5oq403l5pHjc4OhD54+XGO9cdKVL/7lDjF+iKUs= github.com/urfave/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/valyala/fasthttp v1.6.0/go.mod h1:FstJa9V+Pj9vQ7OJie2qMHdwemEDaDiSdBnvPM1Su9w= @@ -413,15 +443,11 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.4.0 h1:UVQgzMY87xqpKNgb+kDsll2Igd33HszWHFLmpaRMq/8= -golang.org/x/crypto v0.4.0/go.mod h1:3quD/ATkf6oY+rnes5c3ExXTbLc8mueNue5/DoinL80= -golang.org/x/crypto v0.7.0 h1:AvwMYaRytfdeVt3u6mLaxYtErKYjxA2OXjJ1HHq6t3A= -golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= +golang.org/x/crypto v0.12.0 h1:tFM/ta59kqch6LlvYnPa0yx5a83cL2nHflFhYKvv9Yk= +golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20230206171751-46f607a40771 h1:xP7rWLUr1e1n2xkK5YB4LI0hPEy3LJC6Wk+D4pGlOJg= -golang.org/x/exp v0.0.0-20230206171751-46f607a40771/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc= -golang.org/x/exp v0.0.0-20230321023759-10a507213a29 h1:ooxPy7fPvB4kwsA2h+iBNHkAbp/4JxTSwCmvdjEYmug= -golang.org/x/exp v0.0.0-20230321023759-10a507213a29/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc= +golang.org/x/exp v0.0.0-20230810033253-352e893a4cad h1:g0bG7Z4uG+OgH2QDODnjp6ggkk1bJDsINcuWmJN1iJU= +golang.org/x/exp v0.0.0-20230810033253-352e893a4cad/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= @@ -430,6 +456,8 @@ golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzB golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.11.0 h1:bUO06HqtnRcc/7l71XBe4WcqTZ+3AH1J59zWDDwLKgU= +golang.org/x/mod v0.11.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -451,7 +479,7 @@ golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT golang.org/x/net v0.0.0-20211008194852-3b03d305991f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.7.0 h1:rJrUqqhjsgNp7KqAIc25s9pZnjU7TUcSY7HcVZjdn1g= +golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -461,7 +489,8 @@ golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= +golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= +golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -492,16 +521,14 @@ golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220405052023-b1e9470b6e64/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.7.0 h1:3jlCCIQZPdOYu1h8BkNvLz8Kgwtae2cagcG/VamtZRU= -golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM= +golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -510,13 +537,10 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.7.0 h1:4BRB4x83lYWy72KwLD/qYDuTu7q9PjSagHvijDw7cLo= -golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.8.0 h1:57P1ETyNKtuIjB4SRd15iJxuhj8Gc416Y78H3qgMh68= -golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc= +golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= -golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181221001348-537d06c36207/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -531,6 +555,8 @@ golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roY golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.9.1 h1:8WMNJAz3zrtPmnYC7ISf5dEn3MT0gY7jBJfw27yrrLo= +golang.org/x/tools v0.9.1/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -560,14 +586,13 @@ google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpAD google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= -google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng= google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= @@ -575,7 +600,7 @@ gopkg.in/go-playground/validator.v8 v8.18.2/go.mod h1:RX2a/7Ha8BgOhfk7j780h4/u/R gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1 h1:iiHuQZCNgYPmFQxd3BBN/Nc5+dAwzZuq5y40s20oQw0= gopkg.in/ini.v1 v1.51.1/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= -gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce h1:+JknDZhAj8YMt7GC73Ei8pv4MzjDUNPHgQWJdtMAaDU= +gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8= gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:5AcXVHNjg+BDxry382+8OKon8SEWiKktQR07RKPsv1c= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= @@ -591,3 +616,5 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +rsc.io/tmplfunc v0.0.3 h1:53XFQh69AfOa8Tw0Jm7t+GV7KZhOi6jzsCzTtKbMvzU= +rsc.io/tmplfunc v0.0.3/go.mod h1:AG3sTPzElb1Io3Yg4voV9AGZJuleGAwaVRxL9M49PhA= diff --git a/simulators/eth2/withdrawals/helper.go b/simulators/eth2/withdrawals/helper.go index c246ab0583..38b524764e 100644 --- a/simulators/eth2/withdrawals/helper.go +++ b/simulators/eth2/withdrawals/helper.go @@ -197,7 +197,7 @@ type Validator struct { Exited bool ExitCondition string ExactWithdrawableBalance *big.Int - Keys *cl.ValidatorDetails + Keys *cl.ValidatorSetupDetails BLSToExecutionChangeDomain *beacon.BLSDomain Verified bool InitialBalance beacon.Gwei @@ -239,7 +239,7 @@ func (v *Validator) VerifyWithdrawnBalance( ) // Then get the balance - execPayload, err := headBlockState.ExecutionPayload() + execPayload, _, _, err := headBlockState.ExecutionPayload() if err != nil { return false, errors.Wrap( err, @@ -297,7 +297,7 @@ func (v *Validator) VerifyWithdrawnBalance( continue } - execPayload, err := blockState.ExecutionPayload() + execPayload, _, _, err := blockState.ExecutionPayload() if err != nil { return false, errors.Wrapf(err, "failed to get execution payload, slot %d", slot) } @@ -504,7 +504,7 @@ func ValidatorFromBeaconValidator( index beacon.ValidatorIndex, source beacon.Validator, balance beacon.Gwei, - keys *cl.ValidatorDetails, + keys *cl.ValidatorSetupDetails, domain *beacon.BLSDomain, beaconCache BeaconCache, ) (*Validator, error) { @@ -567,7 +567,7 @@ func ValidatorFromBeaconState( spec beacon.Spec, state beacon.BeaconState, index beacon.ValidatorIndex, - keys *cl.ValidatorDetails, + keys *cl.ValidatorSetupDetails, domain *beacon.BLSDomain, beaconCache BeaconCache, ) (*Validator, error) { @@ -601,7 +601,7 @@ func ValidatorFromBeaconState( func ValidatorsFromBeaconState( state beacon.BeaconState, spec beacon.Spec, - keys []*cl.ValidatorDetails, + keys []*cl.ValidatorSetupDetails, domain *beacon.BLSDomain, ) (Validators, error) { stateVals, err := state.Validators() diff --git a/simulators/eth2/withdrawals/main.go b/simulators/eth2/withdrawals/main.go index 966935fe0c..39e9fddbcb 100644 --- a/simulators/eth2/withdrawals/main.go +++ b/simulators/eth2/withdrawals/main.go @@ -29,7 +29,7 @@ type TestSpec interface { GetName() string GetDescription() string Execute(*hivesim.T, *testnet.Environment, []clients.NodeDefinition) - GetValidatorKeys(string) []*consensus_config.ValidatorDetails + GetValidatorKeys(string) []*consensus_config.ValidatorSetupDetails } var tests = []TestSpec{ @@ -216,14 +216,9 @@ func addAllTests( Description: test.GetDescription(), Run: func(t *hivesim.T) { keys := test.GetValidatorKeys(mnemonic) - secrets, err := consensus_config.SecretKeys(keys) - if err != nil { - panic(err) - } env := &testnet.Environment{ - Clients: c, - Keys: keys, - Secrets: secrets, + Clients: c, + Validators: keys, } test.Execute(t, env, clientCombinations) }, diff --git a/simulators/eth2/withdrawals/scenarios.go b/simulators/eth2/withdrawals/scenarios.go index 9465d26b95..5da4b24808 100644 --- a/simulators/eth2/withdrawals/scenarios.go +++ b/simulators/eth2/withdrawals/scenarios.go @@ -62,7 +62,7 @@ func (ts BaseWithdrawalsTestSpec) Execute( allValidators, err := ValidatorsFromBeaconState( testnet.GenesisBeaconState(), *testnet.Spec().Spec, - env.Keys, + env.Validators, &blsDomain, ) if err != nil { @@ -351,7 +351,7 @@ func (ts BuilderWithdrawalsTestSpec) Execute( allValidators, err := ValidatorsFromBeaconState( testnet.GenesisBeaconState(), *testnet.Spec().Spec, - env.Keys, + env.Validators, &blsDomain, ) if err != nil { @@ -472,7 +472,14 @@ func (ts BuilderWithdrawalsTestSpec) Execute( } ec := n.ExecutionClient includedPayloads := 0 - for _, p := range b.GetBuiltPayloads() { + for _, b := range b.GetBuiltPayloads() { + p, _, err := b.FullPayload().ToExecutableData() + if err != nil { + t.Fatalf( + "FAIL: error getting executable data from payload: %v", + err, + ) + } if p.Withdrawals != nil { if h, err := ec.HeaderByNumber(ctx, big.NewInt(int64(p.Number))); err != nil { t.Fatalf( @@ -509,7 +516,14 @@ func (ts BuilderWithdrawalsTestSpec) Execute( if len(modifiedPayloads) == 0 { t.Fatalf("FAIL: No payloads were modified by builder %d", i) } - for _, p := range modifiedPayloads { + for _, modP := range modifiedPayloads { + p, _, err := modP.ToExecutableData() + if err != nil { + t.Fatalf( + "FAIL: error getting executable data from payload: %v", + err, + ) + } for _, ec := range testnet.ExecutionClients().Running() { b, err := ec.BlockByNumber( ctx, diff --git a/simulators/eth2/withdrawals/specs.go b/simulators/eth2/withdrawals/specs.go index 8d39f93ae2..8d36033a14 100644 --- a/simulators/eth2/withdrawals/specs.go +++ b/simulators/eth2/withdrawals/specs.go @@ -9,6 +9,7 @@ import ( "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/params" "github.com/ethereum/hive/simulators/eth2/common/clients" + "github.com/ethereum/hive/simulators/eth2/common/config" cl "github.com/ethereum/hive/simulators/eth2/common/config/consensus" el "github.com/ethereum/hive/simulators/eth2/common/config/execution" "github.com/ethereum/hive/simulators/eth2/common/testnet" @@ -52,12 +53,16 @@ var ( // Default config used for all tests unless a client specific config exists DEFAULT_CONFIG = &testnet.Config{ - ValidatorCount: big.NewInt(int64(DEFAULT_VALIDATOR_COUNT)), - TerminalTotalDifficulty: common.Big0, - AltairForkEpoch: common.Big0, - BellatrixForkEpoch: common.Big0, - CapellaForkEpoch: common.Big1, - Eth1Consensus: &el.ExecutionPostMergeGenesis{}, + ForkConfig: &config.ForkConfig{ + TerminalTotalDifficulty: common.Big0, + AltairForkEpoch: common.Big0, + BellatrixForkEpoch: common.Big0, + CapellaForkEpoch: common.Big1, + }, + ConsensusConfig: &cl.ConsensusConfig{ + ValidatorCount: big.NewInt(int64(DEFAULT_VALIDATOR_COUNT)), + }, + Eth1Consensus: &el.ExecutionPostMergeGenesis{}, } // This is the account that sends vault funding transactions. @@ -152,12 +157,11 @@ func (ts BaseWithdrawalsTestSpec) GetValidatorCount() uint64 { func (ts BaseWithdrawalsTestSpec) GetValidatorKeys( mnemonic string, -) []*cl.ValidatorDetails { +) []*cl.ValidatorSetupDetails { keySrc := &cl.MnemonicsKeySource{ - From: 0, - To: ts.GetValidatorCount(), - Validator: mnemonic, - Withdrawal: mnemonic, + From: 0, + To: ts.GetValidatorCount(), + Mnemonic: mnemonic, } keys, err := keySrc.Keys() if err != nil { From 409585807c0e79b23511177de6300f247edbdbd9 Mon Sep 17 00:00:00 2001 From: Mario Vega Date: Mon, 2 Oct 2023 21:58:29 +0000 Subject: [PATCH 202/387] simulators/eth2/testnet: fix --- simulators/eth2/testnet/main.go | 16 +++++---------- simulators/eth2/testnet/scenarios.go | 30 ++++++++++++++++++---------- 2 files changed, 25 insertions(+), 21 deletions(-) diff --git a/simulators/eth2/testnet/main.go b/simulators/eth2/testnet/main.go index 475bb2a660..43ff7cdfea 100644 --- a/simulators/eth2/testnet/main.go +++ b/simulators/eth2/testnet/main.go @@ -54,19 +54,14 @@ func runAllTests(t *hivesim.T, c *clients.ClientDefinitionsByRole) { // Generate validator keys to use for all tests. keySrc := &cl.MnemonicsKeySource{ - From: 0, - To: 64, - Validator: mnemonic, - Withdrawal: mnemonic, + From: 0, + To: 64, + Mnemonic: mnemonic, } keys, err := keySrc.Keys() if err != nil { t.Fatal(err) } - secrets, err := cl.SecretKeys(keys) - if err != nil { - t.Fatal(err) - } for _, node := range c.Combinations() { for _, test := range tests { test := test @@ -75,9 +70,8 @@ func runAllTests(t *hivesim.T, c *clients.ClientDefinitionsByRole) { Description: test.About, Run: func(t *hivesim.T) { env := &testnet.Environment{ - Clients: c, - Keys: keys, - Secrets: secrets, + Clients: c, + Validators: keys, } test.Run(t, env, node) }, diff --git a/simulators/eth2/testnet/scenarios.go b/simulators/eth2/testnet/scenarios.go index 2c30f1ca98..f7b741bab2 100644 --- a/simulators/eth2/testnet/scenarios.go +++ b/simulators/eth2/testnet/scenarios.go @@ -6,6 +6,8 @@ import ( "github.com/ethereum/hive/hivesim" "github.com/ethereum/hive/simulators/eth2/common/clients" + "github.com/ethereum/hive/simulators/eth2/common/config" + consensus_config "github.com/ethereum/hive/simulators/eth2/common/config/consensus" el "github.com/ethereum/hive/simulators/eth2/common/config/execution" tn "github.com/ethereum/hive/simulators/eth2/common/testnet" ) @@ -18,11 +20,15 @@ var ( func Phase0Testnet(t *hivesim.T, env *tn.Environment, n clients.NodeDefinition) { config := tn.Config{ - AltairForkEpoch: big.NewInt(10), - BellatrixForkEpoch: big.NewInt(20), - ValidatorCount: VALIDATOR_COUNT, - SlotTime: SLOT_TIME, - TerminalTotalDifficulty: TERMINAL_TOTAL_DIFFICULTY, + ForkConfig: &config.ForkConfig{ + AltairForkEpoch: big.NewInt(10), + BellatrixForkEpoch: big.NewInt(20), + TerminalTotalDifficulty: TERMINAL_TOTAL_DIFFICULTY, + }, + ConsensusConfig: &consensus_config.ConsensusConfig{ + ValidatorCount: VALIDATOR_COUNT, + SlotTime: SLOT_TIME, + }, NodeDefinitions: []clients.NodeDefinition{ n, n, @@ -50,11 +56,15 @@ func Phase0Testnet(t *hivesim.T, env *tn.Environment, n clients.NodeDefinition) func TransitionTestnet(t *hivesim.T, env *tn.Environment, n clients.NodeDefinition) { config := tn.Config{ - AltairForkEpoch: big.NewInt(0), - BellatrixForkEpoch: big.NewInt(0), - ValidatorCount: VALIDATOR_COUNT, - SlotTime: SLOT_TIME, - TerminalTotalDifficulty: TERMINAL_TOTAL_DIFFICULTY, + ForkConfig: &config.ForkConfig{ + AltairForkEpoch: big.NewInt(0), + BellatrixForkEpoch: big.NewInt(0), + TerminalTotalDifficulty: TERMINAL_TOTAL_DIFFICULTY, + }, + ConsensusConfig: &consensus_config.ConsensusConfig{ + ValidatorCount: VALIDATOR_COUNT, + SlotTime: SLOT_TIME, + }, NodeDefinitions: []clients.NodeDefinition{ n, n, From b9919d4f1502c136adead60dc34b5cb0f6fc1d09 Mon Sep 17 00:00:00 2001 From: Mario Vega Date: Tue, 27 Feb 2024 21:58:11 +0000 Subject: [PATCH 203/387] simulators/eth2/dencun: Add suite --- simulators/eth2/dencun/Dockerfile | 18 + simulators/eth2/dencun/README.md | 9 + simulators/eth2/dencun/TESTS.md | 27 + simulators/eth2/dencun/go.mod | 180 ++ simulators/eth2/dencun/go.sum | 1180 ++++++++++++ simulators/eth2/dencun/hive_context.txt | 1 + simulators/eth2/dencun/main.go | 35 + simulators/eth2/dencun/suites/base/TESTS.md | 96 + simulators/eth2/dencun/suites/base/config.go | 256 +++ .../eth2/dencun/suites/base/execution.go | 346 ++++ simulators/eth2/dencun/suites/base/tests.go | 46 + .../eth2/dencun/suites/builder/TESTS.md | 322 ++++ .../eth2/dencun/suites/builder/config.go | 129 ++ .../eth2/dencun/suites/builder/execution.go | 337 ++++ .../eth2/dencun/suites/builder/tests.go | 126 ++ .../dencun/suites/p2p/gossip/blobs/TESTS.md | 463 +++++ .../dencun/suites/p2p/gossip/blobs/config.go | 79 + .../suites/p2p/gossip/blobs/execution.go | 68 + .../dencun/suites/p2p/gossip/blobs/tests.go | 200 ++ simulators/eth2/dencun/suites/reorg/TESTS.md | 99 + simulators/eth2/dencun/suites/reorg/config.go | 51 + .../eth2/dencun/suites/reorg/execution.go | 39 + simulators/eth2/dencun/suites/reorg/tests.go | 60 + simulators/eth2/dencun/suites/spec.go | 86 + simulators/eth2/dencun/suites/sync/TESTS.md | 122 ++ simulators/eth2/dencun/suites/sync/config.go | 22 + .../eth2/dencun/suites/sync/execution.go | 39 + simulators/eth2/dencun/suites/sync/tests.go | 83 + simulators/eth2/go.work | 5 +- simulators/eth2/go.work.sum | 1602 +++++++++++++---- 30 files changed, 5800 insertions(+), 326 deletions(-) create mode 100644 simulators/eth2/dencun/Dockerfile create mode 100644 simulators/eth2/dencun/README.md create mode 100644 simulators/eth2/dencun/TESTS.md create mode 100644 simulators/eth2/dencun/go.mod create mode 100644 simulators/eth2/dencun/go.sum create mode 100644 simulators/eth2/dencun/hive_context.txt create mode 100644 simulators/eth2/dencun/main.go create mode 100644 simulators/eth2/dencun/suites/base/TESTS.md create mode 100644 simulators/eth2/dencun/suites/base/config.go create mode 100644 simulators/eth2/dencun/suites/base/execution.go create mode 100644 simulators/eth2/dencun/suites/base/tests.go create mode 100644 simulators/eth2/dencun/suites/builder/TESTS.md create mode 100644 simulators/eth2/dencun/suites/builder/config.go create mode 100644 simulators/eth2/dencun/suites/builder/execution.go create mode 100644 simulators/eth2/dencun/suites/builder/tests.go create mode 100644 simulators/eth2/dencun/suites/p2p/gossip/blobs/TESTS.md create mode 100644 simulators/eth2/dencun/suites/p2p/gossip/blobs/config.go create mode 100644 simulators/eth2/dencun/suites/p2p/gossip/blobs/execution.go create mode 100644 simulators/eth2/dencun/suites/p2p/gossip/blobs/tests.go create mode 100644 simulators/eth2/dencun/suites/reorg/TESTS.md create mode 100644 simulators/eth2/dencun/suites/reorg/config.go create mode 100644 simulators/eth2/dencun/suites/reorg/execution.go create mode 100644 simulators/eth2/dencun/suites/reorg/tests.go create mode 100644 simulators/eth2/dencun/suites/spec.go create mode 100644 simulators/eth2/dencun/suites/sync/TESTS.md create mode 100644 simulators/eth2/dencun/suites/sync/config.go create mode 100644 simulators/eth2/dencun/suites/sync/execution.go create mode 100644 simulators/eth2/dencun/suites/sync/tests.go diff --git a/simulators/eth2/dencun/Dockerfile b/simulators/eth2/dencun/Dockerfile new file mode 100644 index 0000000000..7c70835c82 --- /dev/null +++ b/simulators/eth2/dencun/Dockerfile @@ -0,0 +1,18 @@ +# Build the simulator binary +FROM golang:1.21-alpine AS builder +RUN apk --no-cache add gcc musl-dev linux-headers cmake make clang build-base clang-static clang-dev + +# Prepare workspace. +# Note: the build context of this simulator image is the parent directory! +ADD . /source + +# Build within simulator folder +WORKDIR /source/dencun +RUN go build -o ./sim . + +# Build the runner container. +FROM alpine:latest +ADD . / +COPY --from=builder /source/dencun/sim / + +ENTRYPOINT ["./sim"] diff --git a/simulators/eth2/dencun/README.md b/simulators/eth2/dencun/README.md new file mode 100644 index 0000000000..977df31154 --- /dev/null +++ b/simulators/eth2/dencun/README.md @@ -0,0 +1,9 @@ +# Dencun Interop Hive Simulator + +The simulator contains implementation of tests that verify interoperability behavior of the +Execution and Consensus clients on the Deneb+Cancun (Dencun) hard-fork. + +## Test Suites + +[Link](TESTS.md) + diff --git a/simulators/eth2/dencun/TESTS.md b/simulators/eth2/dencun/TESTS.md new file mode 100644 index 0000000000..e182a4e415 --- /dev/null +++ b/simulators/eth2/dencun/TESTS.md @@ -0,0 +1,27 @@ +# Simulator `eth2/dencun` Test Cases + +## Test Suites + +### - [Deneb Testnet](suites/base/TESTS.md) +Collection of test vectors that use a ExecutionClient+BeaconNode+ValidatorClient testnet for Cancun+Deneb. + +### - [Deneb Sync](suites/sync/TESTS.md) +Collection of test vectors that use a ExecutionClient+BeaconNode+ValidatorClient testnet for Cancun+Deneb and test syncing of the beacon chain. + +### - [Deneb Builder](suites/builder/TESTS.md) + +Collection of test vectors that use a ExecutionClient+BeaconNode+ValidatorClient testnet and builder API for Cancun+Deneb. + + +### Clients that require finalization to enable builder +- Lighthouse +- Teku + + +### - [Deneb Reorg](suites/reorg/TESTS.md) +Collection of test vectors that use a ExecutionClient+BeaconNode+ValidatorClient testnet for Cancun+Deneb and test re-orgs of the beacon chain. + +### - [Deneb P2P Blobs Gossip](suites/p2p/gossip/blobs/TESTS.md) +Collection of test vectors that verify client behavior under different blob gossiping scenarios. + + diff --git a/simulators/eth2/dencun/go.mod b/simulators/eth2/dencun/go.mod new file mode 100644 index 0000000000..33ccdef660 --- /dev/null +++ b/simulators/eth2/dencun/go.mod @@ -0,0 +1,180 @@ +module github.com/ethereum/hive/simulators/eth2/dencun + +go 1.21 + +toolchain go1.22.0 + +require ( + github.com/ethereum/go-ethereum v1.13.14 + github.com/ethereum/hive v0.0.0-20231128202301-f931b46287a8 + github.com/ethereum/hive/simulators/eth2/common v0.0.0-20230316220410-1364352c32a6 + github.com/ethereum/hive/simulators/ethereum/engine v0.0.0-20240305003323-ebe431380e1c + github.com/lithammer/dedent v1.1.0 + github.com/marioevz/blobber v1.1.1-0.20240228051014-aa5f0f9031a9 + github.com/marioevz/mock-builder v1.1.1-0.20231123171249-08b59e943190 + github.com/protolambda/eth2api v0.0.0-20230316214135-5f8afbd6d05d + github.com/protolambda/zrnt v0.32.3 +) + +require ( + github.com/VictoriaMetrics/fastcache v1.12.1 // indirect + github.com/cespare/xxhash/v2 v2.2.0 // indirect + github.com/ferranbt/fastssz v0.1.2 // indirect + github.com/go-ole/go-ole v1.2.6 // indirect + github.com/go-stack/stack v1.8.1 // indirect + github.com/holiman/uint256 v1.2.4 // indirect + github.com/mattn/go-runewidth v0.0.14 // indirect + github.com/minio/sha256-simd v1.0.1 // indirect + github.com/mitchellh/mapstructure v1.5.0 // indirect + github.com/olekukonko/tablewriter v0.0.5 // indirect + github.com/protolambda/bls12-381-util v0.0.0-20220416220906-d8552aa452c7 // indirect + github.com/shirou/gopsutil v3.21.11+incompatible // indirect + github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d // indirect + github.com/tklauser/go-sysconf v0.3.12 // indirect + golang.org/x/sys v0.17.0 // indirect + golang.org/x/text v0.14.0 // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) + +require ( + github.com/DataDog/zstd v1.5.2 // indirect + github.com/Microsoft/go-winio v0.6.1 // indirect + github.com/benbjohnson/clock v1.3.5 // indirect + github.com/beorn7/perks v1.0.1 // indirect + github.com/bits-and-blooms/bitset v1.10.0 // indirect + github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect + github.com/cockroachdb/errors v1.9.1 // indirect + github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect + github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593 // indirect + github.com/cockroachdb/redact v1.1.3 // indirect + github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect + github.com/consensys/bavard v0.1.13 // indirect + github.com/consensys/gnark-crypto v0.12.1 // indirect + github.com/containerd/cgroups v1.1.0 // indirect + github.com/coreos/go-systemd/v22 v22.5.0 // indirect + github.com/crate-crypto/go-kzg-4844 v0.7.0 // indirect + github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c // indirect + github.com/deckarep/golang-set/v2 v2.3.0 // indirect + github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 // indirect + github.com/docker/go-units v0.5.0 // indirect + github.com/elastic/gosigar v0.14.2 // indirect + github.com/ethereum/c-kzg-4844 v0.4.0 // indirect + github.com/flynn/noise v1.1.0 // indirect + github.com/francoispqt/gojay v1.2.13 // indirect + github.com/getsentry/sentry-go v0.20.0 // indirect + github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect + github.com/godbus/dbus/v5 v5.1.0 // indirect + github.com/gofrs/flock v0.8.1 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang-jwt/jwt/v4 v4.5.0 // indirect + github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect + github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect + github.com/google/gopacket v1.1.19 // indirect + github.com/google/pprof v0.0.0-20240207164012-fb44976bdcd5 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/gorilla/mux v1.8.0 // indirect + github.com/gorilla/websocket v1.5.1 // indirect + github.com/hashicorp/golang-lru/v2 v2.0.5 // indirect + github.com/herumi/bls-eth-go-binary v1.28.1 // indirect + github.com/holiman/bloomfilter/v2 v2.0.3 // indirect + github.com/huin/goupnp v1.3.0 // indirect + github.com/ipfs/go-cid v0.4.1 // indirect + github.com/ipfs/go-log/v2 v2.5.1 // indirect + github.com/jackpal/go-nat-pmp v1.0.2 // indirect + github.com/jbenet/go-temp-err-catcher v0.1.0 // indirect + github.com/julienschmidt/httprouter v1.3.0 // indirect + github.com/kilic/bls12-381 v0.1.0 // indirect + github.com/klauspost/compress v1.17.6 // indirect + github.com/klauspost/cpuid/v2 v2.2.7 // indirect + github.com/koron/go-ssdp v0.0.4 // indirect + github.com/kr/pretty v0.3.1 // indirect + github.com/kr/text v0.2.0 // indirect + github.com/libp2p/go-buffer-pool v0.1.0 // indirect + github.com/libp2p/go-flow-metrics v0.1.0 // indirect + github.com/libp2p/go-libp2p v0.33.0 // indirect + github.com/libp2p/go-libp2p-asn-util v0.4.1 // indirect + github.com/libp2p/go-libp2p-mplex v0.9.0 // indirect + github.com/libp2p/go-libp2p-pubsub v0.10.0 // indirect + github.com/libp2p/go-mplex v0.7.0 // indirect + github.com/libp2p/go-msgio v0.3.0 // indirect + github.com/libp2p/go-nat v0.2.0 // indirect + github.com/libp2p/go-netroute v0.2.1 // indirect + github.com/libp2p/go-reuseport v0.4.0 // indirect + github.com/libp2p/go-yamux/v4 v4.0.1 // indirect + github.com/marioevz/eth-clients v0.0.0-20231123180401-b4230c802498 // indirect + github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd // indirect + github.com/mattn/go-colorable v0.1.13 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect + github.com/miekg/dns v1.1.58 // indirect + github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b // indirect + github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc // indirect + github.com/mmcloughlin/addchain v0.4.0 // indirect + github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 // indirect + github.com/mr-tron/base58 v1.2.0 // indirect + github.com/multiformats/go-base32 v0.1.0 // indirect + github.com/multiformats/go-base36 v0.2.0 // indirect + github.com/multiformats/go-multiaddr v0.12.2 // indirect + github.com/multiformats/go-multiaddr-dns v0.3.1 // indirect + github.com/multiformats/go-multiaddr-fmt v0.1.0 // indirect + github.com/multiformats/go-multibase v0.2.0 // indirect + github.com/multiformats/go-multicodec v0.9.0 // indirect + github.com/multiformats/go-multihash v0.2.3 // indirect + github.com/multiformats/go-multistream v0.5.0 // indirect + github.com/multiformats/go-varint v0.0.7 // indirect + github.com/onsi/ginkgo/v2 v2.15.0 // indirect + github.com/opencontainers/runtime-spec v1.2.0 // indirect + github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/prometheus/client_golang v1.18.0 // indirect + github.com/prometheus/client_model v0.6.0 // indirect + github.com/prometheus/common v0.47.0 // indirect + github.com/prometheus/procfs v0.12.0 // indirect + github.com/protolambda/go-keystorev4 v0.1.0 // indirect + github.com/protolambda/ztyp v0.2.2 // indirect + github.com/prysmaticlabs/fastssz v0.0.0-20221107182844-78142813af44 // indirect + github.com/prysmaticlabs/gohashtree v0.0.3-alpha // indirect + github.com/prysmaticlabs/prysm/v4 v4.2.1 // indirect + github.com/quic-go/qpack v0.4.0 // indirect + github.com/quic-go/quic-go v0.41.0 // indirect + github.com/quic-go/webtransport-go v0.6.0 // indirect + github.com/rauljordan/engine-proxy v0.0.0-20230316220057-4c80c36c4c3a // indirect + github.com/raulk/go-watchdog v1.3.0 // indirect + github.com/rivo/uniseg v0.4.4 // indirect + github.com/rogpeppe/go-internal v1.10.0 // indirect + github.com/sirupsen/logrus v1.9.3 // indirect + github.com/spaolacci/murmur3 v1.1.0 // indirect + github.com/supranational/blst v0.3.11 // indirect + github.com/thomaso-mirodin/intmath v0.0.0-20160323211736-5dc6d854e46e // indirect + github.com/tklauser/numcpus v0.6.1 // indirect + github.com/tyler-smith/go-bip39 v1.1.0 // indirect + github.com/wealdtech/go-bytesutil v1.2.0 // indirect + github.com/wealdtech/go-eth2-types/v2 v2.8.0 // indirect + github.com/wealdtech/go-eth2-util v1.8.0 // indirect + github.com/yusufpapurcu/wmi v1.2.2 // indirect + go.uber.org/dig v1.17.1 // indirect + go.uber.org/fx v1.20.1 // indirect + go.uber.org/mock v0.4.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + go.uber.org/zap v1.27.0 // indirect + golang.org/x/crypto v0.19.0 // indirect + golang.org/x/exp v0.0.0-20240213143201-ec583247a57a // indirect + golang.org/x/mod v0.15.0 // indirect + golang.org/x/net v0.21.0 // indirect + golang.org/x/sync v0.6.0 // indirect + golang.org/x/tools v0.18.0 // indirect + google.golang.org/protobuf v1.32.0 // indirect + gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1 // indirect + k8s.io/client-go v0.22.5 // indirect + k8s.io/utils v0.0.0-20210930125809-cb0fa318a74b // indirect + lukechampine.com/blake3 v1.2.1 // indirect + rsc.io/tmplfunc v0.0.3 // indirect +) + +replace github.com/protolambda/eth2api => github.com/marioevz/eth2api v0.0.0-20230922201437-72bd1301e033 + +replace github.com/protolambda/zrnt => github.com/marioevz/zrnt v0.26.2-0.20231109183115-d2098ec1f42c + +replace github.com/ethereum/go-ethereum => github.com/lightclient/go-ethereum v1.10.10-0.20231019143932-4d161dee0c4c + +replace github.com/protolambda/ztyp => github.com/marioevz/ztyp v0.0.0-20231106221254-dd6f24f13fd9 diff --git a/simulators/eth2/dencun/go.sum b/simulators/eth2/dencun/go.sum new file mode 100644 index 0000000000..5a1d60c25a --- /dev/null +++ b/simulators/eth2/dencun/go.sum @@ -0,0 +1,1180 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.31.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.37.0/go.mod h1:TS1dMSSfndXH133OKGwekG838Om/cQT0BUHV3HcBgoo= +cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= +cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= +cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= +cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= +cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= +cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= +cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= +cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= +cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= +cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= +cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= +cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= +cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= +cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= +cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= +cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= +cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= +cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= +cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= +contrib.go.opencensus.io/exporter/jaeger v0.2.1 h1:yGBYzYMewVL0yO9qqJv3Z5+IRhPdU7e9o/2oKpX4YvI= +contrib.go.opencensus.io/exporter/jaeger v0.2.1/go.mod h1:Y8IsLgdxqh1QxYxPC5IgXVmBaeLUeQFfBeBi9PbeZd0= +dmitri.shuralyov.com/app/changes v0.0.0-20180602232624-0a106ad413e3/go.mod h1:Yl+fi1br7+Rr3LqpNJf1/uxUdtRUV+Tnj0o93V2B9MU= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +dmitri.shuralyov.com/html/belt v0.0.0-20180602232347-f7d459c86be0/go.mod h1:JLBrvjyP0v+ecvNYvCpyZgu5/xkfAUhi6wJj28eUfSU= +dmitri.shuralyov.com/service/change v0.0.0-20181023043359-a85b471d5412/go.mod h1:a1inKt/atXimZ4Mv927x+r7UpyzRUf4emIoiiSC2TN4= +dmitri.shuralyov.com/state v0.0.0-20180228185332-28bcc343414c/go.mod h1:0PRwlb0D6DFvNNtx+9ybjezNCa8XF0xaYcETyp6rHWU= +git.apache.org/thrift.git v0.0.0-20180902110319-2566ecd5d999/go.mod h1:fPE2ZNJGynbRyZ4dJvy6G277gSllfV2HJqblrnkyeyg= +github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= +github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= +github.com/Azure/go-autorest/autorest v0.11.18/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= +github.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= +github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= +github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= +github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= +github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/toml v1.3.2 h1:o7IhLm0Msx3BaB+n3Ag7L8EVlByGnpq14C4YWiu/gL8= +github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/CloudyKit/fastprinter v0.0.0-20200109182630-33d98a066a53/go.mod h1:+3IMCy2vIlbG1XG/0ggNQv0SvxCAIpPM5b1nCz56Xno= +github.com/CloudyKit/jet/v3 v3.0.0/go.mod h1:HKQPgSJmdK8hdoAbKUUWajkHyHo4RaU5rMdUywE7VMo= +github.com/DataDog/zstd v1.5.2 h1:vUG4lAyuPCXO0TLbXvPv7EB7cNK1QV/luu55UHLrrn8= +github.com/DataDog/zstd v1.5.2/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= +github.com/Joker/hpp v1.0.0/go.mod h1:8x5n+M1Hp5hC0g8okX3sR3vFQwynaX/UgSOM9MeBKzY= +github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= +github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= +github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= +github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= +github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= +github.com/Shopify/goreferrer v0.0.0-20181106222321-ec9c9a553398/go.mod h1:a1uqRtAwp2Xwc6WNPJEufxJ7fx3npB4UV/JOLmbu5I0= +github.com/VictoriaMetrics/fastcache v1.12.1 h1:i0mICQuojGDL3KblA7wUNlY5lOK6a4bwt3uRKnkZU40= +github.com/VictoriaMetrics/fastcache v1.12.1/go.mod h1:tX04vaqcNoQeGLD+ra5pU5sWkuxnzWhEzLwhP9w653o= +github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY= +github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= +github.com/allegro/bigcache v1.2.1 h1:hg1sY1raCwic3Vnsvje6TT7/pnZba83LeFck5NrFKSc= +github.com/allegro/bigcache v1.2.1/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= +github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= +github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= +github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= +github.com/aymerick/raymond v2.0.3-0.20180322193309-b565731e1464+incompatible/go.mod h1:osfaiScAUVup+UC9Nfq76eWqDhXlp+4UYaA8uhTBO6g= +github.com/bazelbuild/rules_go v0.23.2 h1:Wxu7JjqnF78cKZbsBsARLSXx/jlGaSLCnUV3mTlyHvM= +github.com/bazelbuild/rules_go v0.23.2/go.mod h1:MC23Dc/wkXEyk3Wpq6lCqz0ZAYOZDw2DR5y3N1q2i7M= +github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= +github.com/benbjohnson/clock v1.3.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= +github.com/benbjohnson/clock v1.3.5 h1:VvXlSJBzZpA/zum6Sj74hxwYI2DIxRWuNIoXAzHZz5o= +github.com/benbjohnson/clock v1.3.5/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= +github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= +github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= +github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/bits-and-blooms/bitset v1.10.0 h1:ePXTeiPEazB5+opbv5fr8umg2R/1NlzgDsyepwsSr88= +github.com/bits-and-blooms/bitset v1.10.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= +github.com/bradfitz/go-smtpd v0.0.0-20170404230938-deb6d6237625/go.mod h1:HYsPBTaaSFSlLx/70C2HPIMNZpVV8+vt/A+FMnYP11g= +github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U= +github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= +github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= +github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= +github.com/buger/jsonparser v0.0.0-20181115193947-bf1c66bbce23/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= +github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/cilium/ebpf v0.2.0/go.mod h1:To2CFviqOWL/M0gIMsvSMlqe7em/l1ALkX1PyjrX2Qs= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cockroachdb/datadriven v1.0.2/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= +github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f h1:otljaYPt5hWxV3MUfO5dFPFiOXg9CyG5/kCfayTqsJ4= +github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= +github.com/cockroachdb/errors v1.9.1 h1:yFVvsI0VxmRShfawbt/laCIDy/mtTqqnvoNgiy5bEV8= +github.com/cockroachdb/errors v1.9.1/go.mod h1:2sxOtL2WIc096WSZqZ5h8fa17rdDq9HZOZLBCor4mBk= +github.com/cockroachdb/logtags v0.0.0-20211118104740-dabe8e521a4f/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= +github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE= +github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= +github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593 h1:aPEJyR4rPBvDmeyi+l/FS/VtA00IWvjeFvjen1m1l1A= +github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593/go.mod h1:6hk1eMY/u5t+Cf18q5lFMUA1Rc+Sm5I6Ra1QuPyxXCo= +github.com/cockroachdb/redact v1.1.3 h1:AKZds10rFSIj7qADf0g46UixK8NNLwWTNdCIGS5wfSQ= +github.com/cockroachdb/redact v1.1.3/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= +github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo= +github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ= +github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0/go.mod h1:4Zcjuz89kmFXt9morQgcfYZAYZ5n8WHjt81YYWIwtTM= +github.com/consensys/bavard v0.1.13 h1:oLhMLOFGTLdlda/kma4VOJazblc7IM5y5QPd2A/YjhQ= +github.com/consensys/bavard v0.1.13/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI= +github.com/consensys/gnark-crypto v0.12.1 h1:lHH39WuuFgVHONRl3J0LRBtuYdQTumFSDtJF7HpyG8M= +github.com/consensys/gnark-crypto v0.12.1/go.mod h1:v2Gy7L/4ZRosZ7Ivs+9SfUDr0f5UlG+EM5t7MPHiLuY= +github.com/containerd/cgroups v0.0.0-20201119153540-4cbc285b3327/go.mod h1:ZJeTFisyysqgcCdecO57Dj79RfL0LNeGiFUqLYQRYLE= +github.com/containerd/cgroups v1.1.0 h1:v8rEWFl6EoqHB+swVNjVoCJE8o3jX7e8nqBGPLaDFBM= +github.com/containerd/cgroups v1.1.0/go.mod h1:6ppBcbh/NOOUU+dMKrykgaBnK9lCIBxHqJDGwsa1mIw= +github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= +github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-systemd v0.0.0-20181012123002-c6f51f82210d/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd/v22 v22.1.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= +github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs= +github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +github.com/cpuguy83/go-md2man v1.0.10 h1:BSKMNlYxDvnunlTymqtgONjNnaRV1sTpcovwwjF22jk= +github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= +github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= +github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/crate-crypto/go-kzg-4844 v0.7.0 h1:C0vgZRk4q4EZ/JgPfzuSoxdCq3C3mOZMBShovmncxvA= +github.com/crate-crypto/go-kzg-4844 v0.7.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/d4l3k/messagediff v1.2.1 h1:ZcAIMYsUg0EAp9X+tt8/enBE/Q8Yd5kzPynLyKptt9U= +github.com/d4l3k/messagediff v1.2.1/go.mod h1:Oozbb1TVXFac9FtSIxHBMnBCq2qeH/2KkEQxENCrlLo= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c h1:pFUpOrbxDR6AkioZ1ySsx5yxlDQZ8stG2b88gTPxgJU= +github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c/go.mod h1:6UhI8N9EjYm1c2odKpFpAYeR8dsBeM7PtzQhRgxRr9U= +github.com/deckarep/golang-set/v2 v2.3.0 h1:qs18EKUfHm2X9fA50Mr/M5hccg2tNnVqsiBImnyDs0g= +github.com/deckarep/golang-set/v2 v2.3.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= +github.com/decred/dcrd/crypto/blake256 v1.0.1 h1:7PltbUIQB7u/FfZ39+DGa/ShuMyJ5ilcvdfma9wOH6Y= +github.com/decred/dcrd/crypto/blake256 v1.0.1/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 h1:8UrgZ3GkP4i/CLijOJx79Yu+etlyjdBU4sfcs2WYQMs= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0= +github.com/dgraph-io/badger v1.6.0/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6psNgSztDR4= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= +github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385/go.mod h1:0vRUJqYpeSZifjYj7uP3BG/gKcuzL9xWVV/Y+cK33KM= +github.com/elastic/gosigar v0.12.0/go.mod h1:iXRIGg2tLnu7LBdpqzyQfGDEidKCfWcCMS0WKyPWoMs= +github.com/elastic/gosigar v0.14.2 h1:Dg80n8cr90OZ7x+bAax/QjoW/XqTI11RmA79ZwIm9/4= +github.com/elastic/gosigar v0.14.2/go.mod h1:iXRIGg2tLnu7LBdpqzyQfGDEidKCfWcCMS0WKyPWoMs= +github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= +github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/etcd-io/bbolt v1.3.3/go.mod h1:ZF2nL25h33cCyBtcyWeZ2/I3HQOfTP+0PIEvHjkjCrw= +github.com/ethereum/c-kzg-4844 v0.4.0 h1:3MS1s4JtA868KpJxroZoepdV0ZKBp3u/O5HcZ7R3nlY= +github.com/ethereum/c-kzg-4844 v0.4.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= +github.com/ethereum/hive v0.0.0-20231128202301-f931b46287a8 h1:vpOgMOOh8lQHGL8lSl9Lhqk3TcwuaNBObBilP5iK4RQ= +github.com/ethereum/hive v0.0.0-20231128202301-f931b46287a8/go.mod h1:lT6CsiAFb+HTThYzu3veK2x2/BlazxNQD6KWPDlvjfo= +github.com/ethereum/hive/simulators/eth2/common v0.0.0-20230316220410-1364352c32a6 h1:LcSUNGwQuJyR/gdPcsif57yKX+3MyhpoAuChzR8k6Yk= +github.com/ethereum/hive/simulators/eth2/common v0.0.0-20230316220410-1364352c32a6/go.mod h1:FX4oxNyTNw/P+TUWrb7vva7o/rFI0pHO7OYdtG6EtN4= +github.com/ethereum/hive/simulators/ethereum/engine v0.0.0-20240305003323-ebe431380e1c h1:EBlnoT34Ea4Y7kVmmIoYqtdNvNmabQlir7SIQ0UCS/A= +github.com/ethereum/hive/simulators/ethereum/engine v0.0.0-20240305003323-ebe431380e1c/go.mod h1:nag0wj4K1/0AEP1VAKwY08N4I9yymrwXsX4+n0YFfdw= +github.com/evanphx/json-patch v4.11.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= +github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072/go.mod h1:duJ4Jxv5lDcvg4QuQr0oowTf7dz4/CR8NtyCooz9HL8= +github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= +github.com/ferranbt/fastssz v0.1.2 h1:Dky6dXlngF6Qjc+EfDipAkE83N5I5DE68bY6O0VLNPk= +github.com/ferranbt/fastssz v0.1.2/go.mod h1:X5UPrE2u1UJjxHA8X54u04SBwdAQjG2sFtWs39YxyWs= +github.com/fjl/memsize v0.0.1 h1:+zhkb+dhUgx0/e+M8sF0QqiouvMQUiKR+QYvdxIOKcQ= +github.com/fjl/memsize v0.0.1/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= +github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= +github.com/flynn/noise v1.1.0 h1:KjPQoQCEFdZDiP03phOvGi11+SVVhBG2wOWAorLsstg= +github.com/flynn/noise v1.1.0/go.mod h1:xbMo+0i6+IGbYdJhF31t2eR1BIU0CYc12+BNAKwUTag= +github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= +github.com/form3tech-oss/jwt-go v3.2.3+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= +github.com/francoispqt/gojay v1.2.13 h1:d2m3sFjloqoIUQU3TsHBgj6qg/BVGlTBeHDUmyJnXKk= +github.com/francoispqt/gojay v1.2.13/go.mod h1:ehT5mTG4ua4581f1++1WLG0vPdaA9HaiDsoyrBGkyDY= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= +github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= +github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= +github.com/gavv/httpexpect v2.0.0+incompatible/go.mod h1:x+9tiU1YnrOvnB725RkpoLv1M62hOWzwo5OXotisrKc= +github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08 h1:f6D9Hr8xV8uYKlyuj8XIruxlh9WjVjdh1gIicAS7ays= +github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= +github.com/getsentry/sentry-go v0.12.0/go.mod h1:NSap0JBYWzHND8oMbyi0+XZhUalc1TBdRL1M71JZW2c= +github.com/getsentry/sentry-go v0.20.0 h1:bwXW98iMRIWxn+4FgPW7vMrjmbym6HblXALmhjHmQaQ= +github.com/getsentry/sentry-go v0.20.0/go.mod h1:lc76E2QywIyW8WuBnwl8Lc4bkmQH4+w1gwTf25trprY= +github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3/go.mod h1:VJ0WA2NBN22VlZ2dKZQPAPnyWw5XTlK1KymzLKsr59s= +github.com/gin-gonic/gin v1.4.0/go.mod h1:OW2EZn3DO8Ln9oIKOvM++LBO+5UPHJJDH72/q/3rZdM= +github.com/gliderlabs/ssh v0.1.1/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= +github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= +github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= +github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= +github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= +github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= +github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= +github.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY= +github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab/go.mod h1:/P9AEU963A2AYjv4d1V5eVL1CQbEJq6aCNHDDjibzu8= +github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= +github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= +github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= +github.com/go-stack/stack v1.8.1 h1:ntEHSVwIt7PNXNpgPmVfMrNhLtgjlmnZha2kOpuRiDw= +github.com/go-stack/stack v1.8.1/go.mod h1:dcoOX6HbPZSZptuspn9bctJ+N/CnF5gGygcUP3XYfe4= +github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= +github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= +github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= +github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= +github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= +github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= +github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk= +github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= +github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= +github.com/gogo/googleapis v0.0.0-20180223154316-0cd9801be74a/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= +github.com/gogo/googleapis v1.4.1/go.mod h1:2lpHqI5OcWCtVElxXnPt+s8oJvMpySlOyM6xDCrzib4= +github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/gogo/status v1.1.0/go.mod h1:BFv9nrluPLmrS0EmGVvLaPNmRosr9KapBYd5/hpY1WM= +github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= +github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= +github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:tluoj9z5200jBnyusfRPU2LqT6J+DAorxEvtC7LHB+E= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= +github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= +github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXiurYmW7fx4GZkL8feAMVq7nEjURHk= +github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/gomodule/redigo v1.7.1-0.20190724094224-574c33c3df38/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4= +github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ= +github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gopacket v1.1.19 h1:ves8RnFZPGiFnTS0uPQStjwru6uO6h+nlr9j6fL7kF8= +github.com/google/gopacket v1.1.19/go.mod h1:iJ8V8n6KS+z2U1A8pUwu8bW5SyEMkXJB8Yo/Vo+TKTo= +github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20240207164012-fb44976bdcd5 h1:E/LAvt58di64hlYjx7AsNS6C/ysHWYo+2qPCZKTQhRo= +github.com/google/pprof v0.0.0-20240207164012-fb44976bdcd5/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= +github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/gax-go v2.0.0+incompatible/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY= +github.com/googleapis/gax-go/v2 v2.0.3/go.mod h1:LLvjysVCY1JZeum8Z6l8qUty8fiNwE08qbEPm1M08qg= +github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= +github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= +github.com/googleapis/gnostic v0.5.1/go.mod h1:6U4PtQXGIEt/Z3h5MAT7FNofLnw9vXk2cUuW7uA/OeU= +github.com/googleapis/gnostic v0.5.5/go.mod h1:7+EbHbldMins07ALC74bsA81Ovc97DwqyJO1AENw9kA= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= +github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= +github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/gorilla/websocket v1.5.1 h1:gmztn0JnHVt9JZquRuzLw3g4wouNVzKL15iLr/zn/QY= +github.com/gorilla/websocket v1.5.1/go.mod h1:x3kM2JMyaluk02fnUJpQuwD2dCS5NDG2ZHL0uE0tcaY= +github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= +github.com/grpc-ecosystem/grpc-gateway v1.5.0 h1:WcmKMm43DR7RdtlkEXQJyo5ws8iTp98CyhCCbOHMvNI= +github.com/grpc-ecosystem/grpc-gateway v1.5.0/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.0.1 h1:X2vfSnm1WC8HEo0MBHZg2TcuDUHJj6kd1TmEAQncnSA= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.0.1/go.mod h1:oVMjMN64nzEcepv1kdZKgx1qNYt4Ro0Gqefiq2JWdis= +github.com/hashicorp/go-bexpr v0.1.11 h1:6DqdA/KBjurGby9yTY0bmkathya0lfwF2SeuubCI7dY= +github.com/hashicorp/go-bexpr v0.1.11/go.mod h1:f03lAo0duBlDIUMGCuad8oLcgejw4m7U+N8T+6Kz1AE= +github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d h1:dg1dEPuWpEqDnvIw251EVy4zlP8gWbsGj4BsUKCRpYs= +github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/golang-lru/v2 v2.0.5 h1:wW7h1TG88eUIJ2i69gaE3uNVtEPIagzhGvHgwfx2Vm4= +github.com/hashicorp/golang-lru/v2 v2.0.5/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= +github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/herumi/bls-eth-go-binary v1.28.1 h1:fcIZ48y5EE9973k05XjE8+P3YiQgjZz4JI/YabAm8KA= +github.com/herumi/bls-eth-go-binary v1.28.1/go.mod h1:luAnRm3OsMQeokhGzpYmc0ZKwawY7o87PUEP11Z7r7U= +github.com/holiman/billy v0.0.0-20230718173358-1c7e68d277a7 h1:3JQNjnMRil1yD0IfZKHF9GxxWKDJGj8I0IqOUol//sw= +github.com/holiman/billy v0.0.0-20230718173358-1c7e68d277a7/go.mod h1:5GuXa7vkL8u9FkFuWdVvfR5ix8hRB7DbOAaYULamFpc= +github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao= +github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA= +github.com/holiman/uint256 v1.2.0/go.mod h1:y4ga/t+u+Xwd7CpDgZESaRcWy0I7XMlTMA25ApIH5Jw= +github.com/holiman/uint256 v1.2.4 h1:jUc4Nk8fm9jZabQuqr2JzednajVmBpC+oiTiXZJEApU= +github.com/holiman/uint256 v1.2.4/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXeiRV4ng7E= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/huin/goupnp v1.3.0 h1:UvLUlWDNpoUdYzb2TCn+MuTWtcjXKSza2n6CBdQ0xXc= +github.com/huin/goupnp v1.3.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8= +github.com/hydrogen18/memlistener v0.0.0-20200120041712-dcc25e7acd91/go.mod h1:qEIFzExnS6016fRpRfxrExeVn2gbClQA99gQhnIcdhE= +github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/imkira/go-interpol v1.1.0/go.mod h1:z0h2/2T3XF8kyEPpRgJ3kmNv+C43p+I/CoI+jC3w2iA= +github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/ipfs/go-cid v0.4.1 h1:A/T3qGvxi4kpKWWcPC/PgbvDA2bjVLO7n4UeVwnbs/s= +github.com/ipfs/go-cid v0.4.1/go.mod h1:uQHwDeX4c6CtyrFwdqyhpNcxVewur1M7l7fNU7LKwZk= +github.com/ipfs/go-log/v2 v2.5.1 h1:1XdUzF7048prq4aBjDQQ4SL5RxftpRGdXhNRwKSAlcY= +github.com/ipfs/go-log/v2 v2.5.1/go.mod h1:prSpmC1Gpllc9UYWxDiZDreBYw7zp4Iqp1kOLU9U5UI= +github.com/iris-contrib/blackfriday v2.0.0+incompatible/go.mod h1:UzZ2bDEoaSGPbkg6SAB4att1aAwTmVIx/5gCVqeyUdI= +github.com/iris-contrib/go.uuid v2.0.0+incompatible/go.mod h1:iz2lgM/1UnEf1kP0L/+fafWORmlnuysV2EMP8MW+qe0= +github.com/iris-contrib/jade v1.1.3/go.mod h1:H/geBymxJhShH5kecoiOCSssPX7QWYH7UaeZTSWddIk= +github.com/iris-contrib/pongo2 v0.0.1/go.mod h1:Ssh+00+3GAZqSQb30AvBRNxBx7rf0GqwkjqxNd0u65g= +github.com/iris-contrib/schema v0.0.1/go.mod h1:urYA3uvUNG1TIIjOSCzHr9/LmbQo8LrOcOqfqxa4hXw= +github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= +github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= +github.com/jbenet/go-temp-err-catcher v0.1.0 h1:zpb3ZH6wIE8Shj2sKS+khgRvf7T7RABoLk/+KKHggpk= +github.com/jbenet/go-temp-err-catcher v0.1.0/go.mod h1:0kJRvmDZXNMIiJirNPEYfhpPwbGVtZVWC34vc5WLsDk= +github.com/jellevandenhooff/dkim v0.0.0-20150330215556-f50fe3d243e1/go.mod h1:E0B/fFc00Y+Rasa88328GlI/XbtyysCtTHZS8h7IrBU= +github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= +github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= +github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= +github.com/julienschmidt/httprouter v1.3.0 h1:U0609e9tgbseu3rBINet9P48AI/D3oJs4dN7jwJOQ1U= +github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= +github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88/go.mod h1:3w7q1U84EfirKl04SVQ/s7nPm1ZPhiXd34z40TNz36k= +github.com/kataras/golog v0.0.10/go.mod h1:yJ8YKCmyL+nWjERB90Qwn+bdyBZsaQwU3bTVFgkFIp8= +github.com/kataras/iris/v12 v12.1.8/go.mod h1:LMYy4VlP67TQ3Zgriz8RE2h2kMZV2SgMYbq3UhfoFmE= +github.com/kataras/neffos v0.0.14/go.mod h1:8lqADm8PnbeFfL7CLXh1WHw53dG27MC3pgi2R1rmoTE= +github.com/kataras/pio v0.0.2/go.mod h1:hAoW0t9UmXi4R5Oyq5Z4irTbaTsOemSrDGUtaTl7Dro= +github.com/kataras/sitemap v0.0.5/go.mod h1:KY2eugMKiPwsJgx7+U103YZehfvNGOXURubcGyk0Bz8= +github.com/kilic/bls12-381 v0.1.0 h1:encrdjqKMEvabVQ7qYOKu1OvhqpK4s47wDYtNiPtlp4= +github.com/kilic/bls12-381 v0.1.0/go.mod h1:vDTTHJONJ6G+P2R74EhnyotQDTliQDnFEwhdmfzw1ig= +github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.8.2/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= +github.com/klauspost/compress v1.9.7/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= +github.com/klauspost/compress v1.17.6 h1:60eq2E/jlfwQXtvZEeBUYADs+BwKBWURIY+Gj2eRGjI= +github.com/klauspost/compress v1.17.6/go.mod h1:/dCuZOvVtNoHsyb+cuJD3itjs3NbnF6KH9zAO4BDxPM= +github.com/klauspost/cpuid v1.2.1/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= +github.com/klauspost/cpuid/v2 v2.2.7 h1:ZWSB3igEs+d0qvnxR/ZBzXVmxkgt8DdzP6m9pfuVLDM= +github.com/klauspost/cpuid/v2 v2.2.7/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= +github.com/koron/go-ssdp v0.0.4 h1:1IDwrghSKYM7yLf7XCzbByg2sJ/JcNOZRXS2jczTwz0= +github.com/koron/go-ssdp v0.0.4/go.mod h1:oDXq+E5IL5q0U8uSBcoAXzTzInwy5lEgC91HoKtbmZk= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/pty v1.1.3/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= +github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= +github.com/labstack/echo/v4 v4.5.0/go.mod h1:czIriw4a0C1dFun+ObrXp7ok03xON0N1awStJ6ArI7Y= +github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= +github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c= +github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= +github.com/libp2p/go-buffer-pool v0.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6cdF0Y8= +github.com/libp2p/go-buffer-pool v0.1.0/go.mod h1:N+vh8gMqimBzdKkSMVuydVDq+UV5QTWy5HSiZacSbPg= +github.com/libp2p/go-flow-metrics v0.1.0 h1:0iPhMI8PskQwzh57jB9WxIuIOQ0r+15PChFGkx3Q3WM= +github.com/libp2p/go-flow-metrics v0.1.0/go.mod h1:4Xi8MX8wj5aWNDAZttg6UPmc0ZrnFNsMtpsYUClFtro= +github.com/libp2p/go-libp2p v0.33.0 h1:yTPSr8sJRbfeEYXyeN8VPVSlTlFjtMUwGDRniwaf/xQ= +github.com/libp2p/go-libp2p v0.33.0/go.mod h1:RIJFRQVUBKy82dnW7J5f1homqqv6NcsDJAl3e7CRGfE= +github.com/libp2p/go-libp2p-asn-util v0.4.1 h1:xqL7++IKD9TBFMgnLPZR6/6iYhawHKHl950SO9L6n94= +github.com/libp2p/go-libp2p-asn-util v0.4.1/go.mod h1:d/NI6XZ9qxw67b4e+NgpQexCIiFYJjErASrYW4PFDN8= +github.com/libp2p/go-libp2p-mplex v0.9.0 h1:R58pDRAmuBXkYugbSSXR9wrTX3+1pFM1xP2bLuodIq8= +github.com/libp2p/go-libp2p-mplex v0.9.0/go.mod h1:ro1i4kuwiFT+uMPbIDIFkcLs1KRbNp0QwnUXM+P64Og= +github.com/libp2p/go-libp2p-pubsub v0.10.0 h1:wS0S5FlISavMaAbxyQn3dxMOe2eegMfswM471RuHJwA= +github.com/libp2p/go-libp2p-pubsub v0.10.0/go.mod h1:1OxbaT/pFRO5h+Dpze8hdHQ63R0ke55XTs6b6NwLLkw= +github.com/libp2p/go-libp2p-testing v0.12.0 h1:EPvBb4kKMWO29qP4mZGyhVzUyR25dvfUIK5WDu6iPUA= +github.com/libp2p/go-libp2p-testing v0.12.0/go.mod h1:KcGDRXyN7sQCllucn1cOOS+Dmm7ujhfEyXQL5lvkcPg= +github.com/libp2p/go-mplex v0.7.0 h1:BDhFZdlk5tbr0oyFq/xv/NPGfjbnrsDam1EvutpBDbY= +github.com/libp2p/go-mplex v0.7.0/go.mod h1:rW8ThnRcYWft/Jb2jeORBmPd6xuG3dGxWN/W168L9EU= +github.com/libp2p/go-msgio v0.3.0 h1:mf3Z8B1xcFN314sWX+2vOTShIE0Mmn2TXn3YCUQGNj0= +github.com/libp2p/go-msgio v0.3.0/go.mod h1:nyRM819GmVaF9LX3l03RMh10QdOroF++NBbxAb0mmDM= +github.com/libp2p/go-nat v0.2.0 h1:Tyz+bUFAYqGyJ/ppPPymMGbIgNRH+WqC5QrT5fKrrGk= +github.com/libp2p/go-nat v0.2.0/go.mod h1:3MJr+GRpRkyT65EpVPBstXLvOlAPzUVlG6Pwg9ohLJk= +github.com/libp2p/go-netroute v0.2.1 h1:V8kVrpD8GK0Riv15/7VN6RbUQ3URNZVosw7H2v9tksU= +github.com/libp2p/go-netroute v0.2.1/go.mod h1:hraioZr0fhBjG0ZRXJJ6Zj2IVEVNx6tDTFQfSmcq7mQ= +github.com/libp2p/go-reuseport v0.4.0 h1:nR5KU7hD0WxXCJbmw7r2rhRYruNRl2koHw8fQscQm2s= +github.com/libp2p/go-reuseport v0.4.0/go.mod h1:ZtI03j/wO5hZVDFo2jKywN6bYKWLOy8Se6DrI2E1cLU= +github.com/libp2p/go-yamux/v4 v4.0.1 h1:FfDR4S1wj6Bw2Pqbc8Uz7pCxeRBPbwsBbEdfwiCypkQ= +github.com/libp2p/go-yamux/v4 v4.0.1/go.mod h1:NWjl8ZTLOGlozrXSOZ/HlfG++39iKNnM5wwmtQP1YB4= +github.com/lightclient/go-ethereum v1.10.10-0.20231019143932-4d161dee0c4c h1:UsDsJSV7/j0C4aGqECXoPvdL6a6y7myXMptcnQjflEY= +github.com/lightclient/go-ethereum v1.10.10-0.20231019143932-4d161dee0c4c/go.mod h1:CLSRGaP4Ev4DJOP+JSk3NHyJIillQLJc/ZAyCLI8NOs= +github.com/lithammer/dedent v1.1.0 h1:VNzHMVCBNG1j0fh3OrsFRkVUwStdDArbgBWoPAffktY= +github.com/lithammer/dedent v1.1.0/go.mod h1:jrXYCQtgg0nJiN+StA2KgR7w6CiQNv9Fd/Z9BP0jIOc= +github.com/lunixbochs/vtclean v1.0.0/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI= +github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/marioevz/blobber v1.1.1-0.20240228051014-aa5f0f9031a9 h1:0N0luMkryC9Z/UCsPnIdd3a6n1Iv786L8lRpBOp90GE= +github.com/marioevz/blobber v1.1.1-0.20240228051014-aa5f0f9031a9/go.mod h1:7wGWXnUInWpcluqhusompgjT18fujAK/ibNxsuH4sgM= +github.com/marioevz/eth-clients v0.0.0-20231123180401-b4230c802498 h1:FHzV7rVAhib6tRhR/e4UTWupqWw3ikIme06O1x96Ynk= +github.com/marioevz/eth-clients v0.0.0-20231123180401-b4230c802498/go.mod h1:bhR5rKHekIvdWmsWUqRP6X6dLl05ohnH3X/+ZvKs3xg= +github.com/marioevz/eth2api v0.0.0-20230922201437-72bd1301e033 h1:sn57n+lbJrLS8FKYs08W7TEzraTGOCQGrSC4hni6rYw= +github.com/marioevz/eth2api v0.0.0-20230922201437-72bd1301e033/go.mod h1:hcwWCT4sF1X7KsMZ535MvDZVk5M20Uyj+x2LARZjQsM= +github.com/marioevz/mock-builder v1.1.1-0.20231123171249-08b59e943190 h1:vBXJeLFGRKZid18H4JQ+vhR+AQKU6fkx0Uc8JVMc3OI= +github.com/marioevz/mock-builder v1.1.1-0.20231123171249-08b59e943190/go.mod h1:17VX12ir8TOY2Ln2vy3jhjeVIGfrwmcsxY9VI0ZP1Zk= +github.com/marioevz/zrnt v0.26.2-0.20231109183115-d2098ec1f42c h1:ZwKLkGVKnAq1JZql6SBrQici0la1X7APcbBLwmrSsd4= +github.com/marioevz/zrnt v0.26.2-0.20231109183115-d2098ec1f42c/go.mod h1:ZctXHBa/2rlF85iao8oqQ8264DbEBBGWr6lwIOW2yv4= +github.com/marioevz/ztyp v0.0.0-20231106221254-dd6f24f13fd9 h1:e40k7kQLw2jyDg4+Mc+TVSSfm1TO51NxPZo9T7nVCzM= +github.com/marioevz/ztyp v0.0.0-20231106221254-dd6f24f13fd9/go.mod h1:9bYgKGqg3wJqT9ac1gI2hnVb0STQq7p/1lapqrqY1dU= +github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd h1:br0buuQ854V8u83wA0rVZ8ttrq5CpaPZdvrK0LP2lOk= +github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd/go.mod h1:QuCEs1Nt24+FYQEqAAncTDPJIuGs+LxK1MCiFL25pMU= +github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.11/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= +github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= +github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/mattn/go-runewidth v0.0.14 h1:+xnbZSEeDbOIg5/mE6JF0w6n9duR1l3/WmbinWVwUuU= +github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw= +github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/mediocregopher/radix/v3 v3.4.2/go.mod h1:8FL3F6UQRXHXIBSPUs5h0RybMF8i4n7wVopoX3x7Bv8= +github.com/microcosm-cc/bluemonday v1.0.1/go.mod h1:hsXNsILzKxV+sX77C5b8FSuKF00vh2OMYv+xgHpAMF4= +github.com/microcosm-cc/bluemonday v1.0.2/go.mod h1:iVP4YcDBq+n/5fb23BhYFvIMq/leAFZyRl6bYmGDlGc= +github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= +github.com/miekg/dns v1.1.58 h1:ca2Hdkz+cDg/7eNF6V56jjzuZ4aCAE+DbVkILdQWG/4= +github.com/miekg/dns v1.1.58/go.mod h1:Ypv+3b/KadlvW9vJfXOTf300O4UqaHFzFCuHz+rPkBY= +github.com/mikioh/tcp v0.0.0-20190314235350-803a9b46060c h1:bzE/A84HN25pxAuk9Eej1Kz9OUelF97nAc82bDquQI8= +github.com/mikioh/tcp v0.0.0-20190314235350-803a9b46060c/go.mod h1:0SQS9kMwD2VsyFEB++InYyBJroV/FRmBgcydeSUcJms= +github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b h1:z78hV3sbSMAUoyUMM0I83AUIT6Hu17AWfgjzIbtrYFc= +github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b/go.mod h1:lxPUiZwKoFL8DUUmalo2yJJUCxbPKtm8OKfqr2/FTNU= +github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc h1:PTfri+PuQmWDqERdnNMiD9ZejrlswWrCpBEZgWOiTrc= +github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc/go.mod h1:cGKTAVKx4SxOuR/czcZ/E2RSJ3sfHs8FpHhQ5CWMf9s= +github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1/go.mod h1:pD8RvIylQ358TN4wwqatJ8rNavkEINozVn9DtGI3dfQ= +github.com/minio/highwayhash v1.0.2 h1:Aak5U0nElisjDCfPSG79Tgzkn2gl66NxOMspRrKnA/g= +github.com/minio/highwayhash v1.0.2/go.mod h1:BQskDq+xkJ12lmlUUi7U0M5Swg3EWR+dLTk+kldvVxY= +github.com/minio/sha256-simd v0.1.1-0.20190913151208-6de447530771/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM= +github.com/minio/sha256-simd v1.0.1 h1:6kaan5IFmwTNynnKKpDHe6FWHohJOHhCPchzK49dzMM= +github.com/minio/sha256-simd v1.0.1/go.mod h1:Pz6AKMiUdngCLpeTL/RJY1M9rUuPMYujV5xJjtbRSN8= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= +github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/pointerstructure v1.2.1 h1:ZhBBeX8tSlRpu/FFhXH4RC4OJzFlqsQhoHZAz4x7TIw= +github.com/mitchellh/pointerstructure v1.2.1/go.mod h1:BRAsLI5zgXmw97Lf6s25bs8ohIXc3tViBH44KcwB2g4= +github.com/mmcloughlin/addchain v0.4.0 h1:SobOdjm2xLj1KkXN5/n0xTIWyZA2+s99UCY1iPfkHRY= +github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqkyU72HC5wJ4RlU= +github.com/mmcloughlin/profile v0.1.1/go.mod h1:IhHD7q1ooxgwTgjxQYkACGA77oFTDdFVejUS1/tS/qU= +github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 h1:RWengNIwukTxcDr9M+97sNutRR1RKhG96O6jWumTTnw= +github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8= +github.com/moul/http2curl v1.0.0/go.mod h1:8UbvGypXm98wA/IqH45anm5Y2Z6ep6O31QGOAZ3H0fQ= +github.com/mr-tron/base58 v1.1.2/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= +github.com/mr-tron/base58 v1.2.0 h1:T/HDJBh4ZCPbU39/+c3rRvE0uKBQlU27+QI8LJ4t64o= +github.com/mr-tron/base58 v1.2.0/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= +github.com/multiformats/go-base32 v0.1.0 h1:pVx9xoSPqEIQG8o+UbAe7DNi51oej1NtK+aGkbLYxPE= +github.com/multiformats/go-base32 v0.1.0/go.mod h1:Kj3tFY6zNr+ABYMqeUNeGvkIC/UYgtWibDcT0rExnbI= +github.com/multiformats/go-base36 v0.2.0 h1:lFsAbNOGeKtuKozrtBsAkSVhv1p9D0/qedU9rQyccr0= +github.com/multiformats/go-base36 v0.2.0/go.mod h1:qvnKE++v+2MWCfePClUEjE78Z7P2a1UV0xHgWc0hkp4= +github.com/multiformats/go-multiaddr v0.1.1/go.mod h1:aMKBKNEYmzmDmxfX88/vz+J5IU55txyt0p4aiWVohjo= +github.com/multiformats/go-multiaddr v0.2.0/go.mod h1:0nO36NvPpyV4QzvTLi/lafl2y95ncPj0vFwVF6k6wJ4= +github.com/multiformats/go-multiaddr v0.12.2 h1:9G9sTY/wCYajKa9lyfWPmpZAwe6oV+Wb1zcmMS1HG24= +github.com/multiformats/go-multiaddr v0.12.2/go.mod h1:GKyaTYjZRdcUhyOetrxTk9z0cW+jA/YrnqTOvKgi44M= +github.com/multiformats/go-multiaddr-dns v0.3.1 h1:QgQgR+LQVt3NPTjbrLLpsaT2ufAA2y0Mkk+QRVJbW3A= +github.com/multiformats/go-multiaddr-dns v0.3.1/go.mod h1:G/245BRQ6FJGmryJCrOuTdB37AMA5AMOVuO6NY3JwTk= +github.com/multiformats/go-multiaddr-fmt v0.1.0 h1:WLEFClPycPkp4fnIzoFoV9FVd49/eQsuaL3/CWe167E= +github.com/multiformats/go-multiaddr-fmt v0.1.0/go.mod h1:hGtDIW4PU4BqJ50gW2quDuPVjyWNZxToGUh/HwTZYJo= +github.com/multiformats/go-multibase v0.2.0 h1:isdYCVLvksgWlMW9OZRYJEa9pZETFivncJHmHnnd87g= +github.com/multiformats/go-multibase v0.2.0/go.mod h1:bFBZX4lKCA/2lyOFSAoKH5SS6oPyjtnzK/XTFDPkNuk= +github.com/multiformats/go-multicodec v0.9.0 h1:pb/dlPnzee/Sxv/j4PmkDRxCOi3hXTz3IbPKOXWJkmg= +github.com/multiformats/go-multicodec v0.9.0/go.mod h1:L3QTQvMIaVBkXOXXtVmYE+LI16i14xuaojr/H7Ai54k= +github.com/multiformats/go-multihash v0.0.8/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpKa63epEDmG8nTduyAew= +github.com/multiformats/go-multihash v0.2.3 h1:7Lyc8XfX/IY2jWb/gI7JP+o7JEq9hOa7BFvVU9RSh+U= +github.com/multiformats/go-multihash v0.2.3/go.mod h1:dXgKXCXjBzdscBLk9JkjINiEsCKRVch90MdaGiKsvSM= +github.com/multiformats/go-multistream v0.5.0 h1:5htLSLl7lvJk3xx3qT/8Zm9J4K8vEOf/QGkvOGQAyiE= +github.com/multiformats/go-multistream v0.5.0/go.mod h1:n6tMZiwiP2wUsR8DgfDWw1dydlEqV3l6N3/GBsX6ILA= +github.com/multiformats/go-varint v0.0.1/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= +github.com/multiformats/go-varint v0.0.7 h1:sWSGR+f/eu5ABZA2ZpYKBILXTTs9JWpdEM/nEGOHFS8= +github.com/multiformats/go-varint v0.0.7/go.mod h1:r8PUYw/fD/SjBCiKOoDlGF6QawOELpZAu9eioSos/OU= +github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= +github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= +github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= +github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= +github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= +github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= +github.com/neelance/astrewrite v0.0.0-20160511093645-99348263ae86/go.mod h1:kHJEU3ofeGjhHklVoIGuVj85JJwZ6kWPaJwCIxgnFmo= +github.com/neelance/sourcemap v0.0.0-20151028013722-8c68805598ab/go.mod h1:Qr6/a/Q4r9LP1IltGz7tA7iOK1WonHEYhu1HRBA7ZiM= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= +github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= +github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= +github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= +github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= +github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= +github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= +github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= +github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= +github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= +github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= +github.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= +github.com/onsi/ginkgo/v2 v2.15.0 h1:79HwNRBAZHOEwrczrgSOPy+eFTTlIGELKy5as+ClttY= +github.com/onsi/ginkgo/v2 v2.15.0/go.mod h1:HlxMHtYF57y6Dpf+mc5529KKmSq9h2FpCF+/ZkwUxKM= +github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= +github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= +github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= +github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= +github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= +github.com/onsi/gomega v1.30.0 h1:hvMK7xYz4D3HapigLTeGdId/NcfQx1VHMJc60ew99+8= +github.com/onsi/gomega v1.30.0/go.mod h1:9sxs+SwGrKI0+PWe4Fxa9tFQQBG5xSsSbMXOI8PPpoQ= +github.com/opencontainers/runtime-spec v1.0.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-spec v1.2.0 h1:z97+pHb3uELt/yiAWD691HNHQIF07bE7dzrbT927iTk= +github.com/opencontainers/runtime-spec v1.2.0/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/openzipkin/zipkin-go v0.1.1/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTmOf0Erfk+hxe8= +github.com/patrickmn/go-cache v2.1.0+incompatible h1:HRMgzkcYKYpi3C8ajMPV8OFXaaRUnok+kx1WdO15EQc= +github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ= +github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 h1:onHthvaw9LFnH4t2DcNVpwGmV9E1BkGknEliJkfwQj0= +github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58/go.mod h1:DXv8WO4yhMYhSNPKjeNKa5WY9YCIEBRbNzFFPJbWO6Y= +github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= +github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= +github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= +github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/prometheus/client_golang v0.8.0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v1.18.0 h1:HzFfmkOzH5Q8L8G+kSJKUx5dtG87sewO+FoDDqP5Tbk= +github.com/prometheus/client_golang v1.18.0/go.mod h1:T+GXkCk5wSJyOqMIzVgvvjFDlkOQntgjkJWKrN5txjA= +github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.6.0 h1:k1v3CzpSRUTrKMppY35TLwPvxHqBu0bYgxZzqGIgaos= +github.com/prometheus/client_model v0.6.0/go.mod h1:NTQHnmxFpouOD0DpvP4XujX3CdOAGQPoaGhyTchlyt8= +github.com/prometheus/common v0.0.0-20180801064454-c7de2306084e/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= +github.com/prometheus/common v0.47.0 h1:p5Cz0FNHo7SnWOmWmoRozVcjEp0bIVU8cV7OShpjL1k= +github.com/prometheus/common v0.47.0/go.mod h1:0/KsvlIEfPQCQ5I2iNSAWKPZziNCvRs5EC6ILDTlAPc= +github.com/prometheus/procfs v0.0.0-20180725123919-05ee40e3a273/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo= +github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo= +github.com/protolambda/bls12-381-util v0.0.0-20220416220906-d8552aa452c7 h1:cZC+usqsYgHtlBaGulVnZ1hfKAi8iWtujBnRLQE698c= +github.com/protolambda/bls12-381-util v0.0.0-20220416220906-d8552aa452c7/go.mod h1:IToEjHuttnUzwZI5KBSM/LOOW3qLbbrHOEfp3SbECGY= +github.com/protolambda/go-keystorev4 v0.1.0 h1:mpuibfMTXPHhNIYNWFLimZ3xhpN/0YNh97jkA97Qe9Q= +github.com/protolambda/go-keystorev4 v0.1.0/go.mod h1:hTa0ss9+xwKt4okVJcpZcMpO9WFur30SSFqVZIY56hk= +github.com/prysmaticlabs/fastssz v0.0.0-20221107182844-78142813af44 h1:c3p3UzV4vFA7xaCDphnDWOjpxcadrQ26l5b+ypsvyxo= +github.com/prysmaticlabs/fastssz v0.0.0-20221107182844-78142813af44/go.mod h1:MA5zShstUwCQaE9faGHgCGvEWUbG87p4SAXINhmCkvg= +github.com/prysmaticlabs/go-bitfield v0.0.0-20210809151128-385d8c5e3fb7 h1:0tVE4tdWQK9ZpYygoV7+vS6QkDvQVySboMVEIxBJmXw= +github.com/prysmaticlabs/go-bitfield v0.0.0-20210809151128-385d8c5e3fb7/go.mod h1:wmuf/mdK4VMD+jA9ThwcUKjg3a2XWM9cVfFYjDyY4j4= +github.com/prysmaticlabs/gohashtree v0.0.3-alpha h1:1EVinCWdb3Lorq7xn8DYQHf48nCcdAM3Vb18KsFlRWY= +github.com/prysmaticlabs/gohashtree v0.0.3-alpha/go.mod h1:4pWaT30XoEx1j8KNJf3TV+E3mQkaufn7mf+jRNb/Fuk= +github.com/prysmaticlabs/prysm/v4 v4.2.1 h1:eHdK4OuJBUCJCmHgI3c07y0u/vWrKCyOsRN2l/VXQxc= +github.com/prysmaticlabs/prysm/v4 v4.2.1/go.mod h1:0Iz1Q/WiuClvdm/9vQbiKKeToeL/uD3QBjEwV9UExBQ= +github.com/quic-go/qpack v0.4.0 h1:Cr9BXA1sQS2SmDUWjSofMPNKmvF6IiIfDRmgU0w1ZCo= +github.com/quic-go/qpack v0.4.0/go.mod h1:UZVnYIfi5GRk+zI9UMaCPsmZ2xKJP7XBUvVyT1Knj9A= +github.com/quic-go/quic-go v0.41.0 h1:aD8MmHfgqTURWNJy48IYFg2OnxwHT3JL7ahGs73lb4k= +github.com/quic-go/quic-go v0.41.0/go.mod h1:qCkNjqczPEvgsOnxZ0eCD14lv+B2LHlFAB++CNOh9hA= +github.com/quic-go/webtransport-go v0.6.0 h1:CvNsKqc4W2HljHJnoT+rMmbRJybShZ0YPFDD3NxaZLY= +github.com/quic-go/webtransport-go v0.6.0/go.mod h1:9KjU4AEBqEQidGHNDkZrb8CAa1abRaosM2yGOyiikEc= +github.com/rauljordan/engine-proxy v0.0.0-20230316220057-4c80c36c4c3a h1:ZIfMLprHVdo2vs3WcSqSDEyz2ZsSzDhGeOyxh8VQThA= +github.com/rauljordan/engine-proxy v0.0.0-20230316220057-4c80c36c4c3a/go.mod h1:9OVXfWYnIV+wj1/SqfdREmE5mzN/OANAgdOJRtFtvpo= +github.com/raulk/go-watchdog v1.3.0 h1:oUmdlHxdkXRJlwfG0O9omj8ukerm8MEQavSiDTEtBsk= +github.com/raulk/go-watchdog v1.3.0/go.mod h1:fIvOnLbF0b0ZwkB9YU4mOW9Did//4vPZtDqv66NfsMU= +github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis= +github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= +github.com/rogpeppe/go-internal v1.8.1/go.mod h1:JeRgkft04UBgHMgCIwADu4Pn6Mtm5d4nPKWu0nJ5d+o= +github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= +github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= +github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= +github.com/rs/cors v1.8.2 h1:KCooALfAYGs415Cwu5ABvv9n9509fSiG5SQJn/AQo4U= +github.com/rs/cors v1.8.2/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= +github.com/russross/blackfriday v1.5.2 h1:HyvC0ARfnZBqnXwABFeSZHpKvJHJJfPz81GNueLj0oo= +github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= +github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/schollz/closestmatch v2.1.0+incompatible/go.mod h1:RtP1ddjLong6gTkbtmuhtR2uUrrJOpYzYRvbcPAid+g= +github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= +github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI= +github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= +github.com/shurcooL/component v0.0.0-20170202220835-f88ec8f54cc4/go.mod h1:XhFIlyj5a1fBNx5aJTbKoIq0mNaPvOagO+HjB3EtxrY= +github.com/shurcooL/events v0.0.0-20181021180414-410e4ca65f48/go.mod h1:5u70Mqkb5O5cxEA8nxTsgrgLehJeAw6Oc4Ab1c/P1HM= +github.com/shurcooL/github_flavored_markdown v0.0.0-20181002035957-2122de532470/go.mod h1:2dOwnU2uBioM+SGy2aZoq1f/Sd1l9OkAeAUvjSyvgU0= +github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk= +github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041/go.mod h1:N5mDOmsrJOB+vfqUK+7DmDyjhSLIIBnXo9lvZJj3MWQ= +github.com/shurcooL/gofontwoff v0.0.0-20180329035133-29b52fc0a18d/go.mod h1:05UtEgK5zq39gLST6uB0cf3NEHjETfB4Fgr3Gx5R9Vw= +github.com/shurcooL/gopherjslib v0.0.0-20160914041154-feb6d3990c2c/go.mod h1:8d3azKNyqcHP1GaQE/c6dDgjkgSx2BZ4IoEi4F1reUI= +github.com/shurcooL/highlight_diff v0.0.0-20170515013008-09bb4053de1b/go.mod h1:ZpfEhSmds4ytuByIcDnOLkTHGUI6KNqRNPDLHDk+mUU= +github.com/shurcooL/highlight_go v0.0.0-20181028180052-98c3abbbae20/go.mod h1:UDKB5a1T23gOMUJrI+uSuH0VRDStOiUVSjBTRDVBVag= +github.com/shurcooL/home v0.0.0-20181020052607-80b7ffcb30f9/go.mod h1:+rgNQw2P9ARFAs37qieuu7ohDNQ3gds9msbT2yn85sg= +github.com/shurcooL/htmlg v0.0.0-20170918183704-d01228ac9e50/go.mod h1:zPn1wHpTIePGnXSHpsVPWEktKXHr6+SS6x/IKRb7cpw= +github.com/shurcooL/httperror v0.0.0-20170206035902-86b7830d14cc/go.mod h1:aYMfkZ6DWSJPJ6c4Wwz3QtW22G7mf/PEgaB9k/ik5+Y= +github.com/shurcooL/httpfs v0.0.0-20171119174359-809beceb2371/go.mod h1:ZY1cvUeJuFPAdZ/B6v7RHavJWZn2YPVFQ1OSXhCGOkg= +github.com/shurcooL/httpgzip v0.0.0-20180522190206-b1c53ac65af9/go.mod h1:919LwcH0M7/W4fcZ0/jy0qGght1GIhqyS/EgWGH2j5Q= +github.com/shurcooL/issues v0.0.0-20181008053335-6292fdc1e191/go.mod h1:e2qWDig5bLteJ4fwvDAc2NHzqFEthkqn7aOZAOpj+PQ= +github.com/shurcooL/issuesapp v0.0.0-20180602232740-048589ce2241/go.mod h1:NPpHK2TI7iSaM0buivtFUc9offApnI0Alt/K8hcHy0I= +github.com/shurcooL/notifications v0.0.0-20181007000457-627ab5aea122/go.mod h1:b5uSkrEVM1jQUspwbixRBhaIjIzL2xazXp6kntxYle0= +github.com/shurcooL/octicon v0.0.0-20181028054416-fa4f57f9efb2/go.mod h1:eWdoE5JD4R5UVWDucdOPg1g2fqQRq78IQa9zlOV1vpQ= +github.com/shurcooL/reactions v0.0.0-20181006231557-f2e0b4ca5b82/go.mod h1:TCR1lToEk4d2s07G3XGfz2QrgHXg4RJBvjrOozvoWfk= +github.com/shurcooL/sanitized_anchor_name v0.0.0-20170918181015-86672fcb3f95/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/shurcooL/users v0.0.0-20180125191416-49c67e49c537/go.mod h1:QJTqeLYEDaXHZDBsXlPCDqdhQuJkuw4NOtaxYe3xii4= +github.com/shurcooL/webdavfs v0.0.0-20170829043945-18c3829fa133/go.mod h1:hKmq5kWdCj2z2KEozexVbfEZIWiTjhE0+UjmZgPqehw= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= +github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/sourcegraph/annotate v0.0.0-20160123013949-f4cad6c6324d/go.mod h1:UdhH50NIW0fCiwBSr0co2m7BnFLdv4fQTgdqdJTHFeE= +github.com/sourcegraph/syntaxhighlight v0.0.0-20170531221838-bd320f5d308e/go.mod h1:HuIsMU8RRBOtsCgI77wP899iHVBQpCmg4ErYMZB+2IA= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= +github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= +github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= +github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= +github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= +github.com/status-im/keycard-go v0.2.0 h1:QDLFswOQu1r5jsycloeQh3bVU8n/NatHHaZobtDnDzA= +github.com/status-im/keycard-go v0.2.0/go.mod h1:wlp8ZLbsmrF6g6WjugPAx+IzoLrkdf9+mHxBEeo3Hbg= +github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/supranational/blst v0.3.11 h1:LyU6FolezeWAhvQk0k6O/d49jqgO52MSDDfYgbeoEm4= +github.com/supranational/blst v0.3.11/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= +github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d h1:vfofYNRScrDdvS342BElfbETmL1Aiz3i2t0zfRj16Hs= +github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d/go.mod h1:RRCYJbIwD5jmqPI9XoAFR0OcDxqUctll6zUj/+B4S48= +github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07/go.mod h1:kDXzergiv9cbyO7IOYJZWg1U88JhDg3PB6klq9Hg2pA= +github.com/thomaso-mirodin/intmath v0.0.0-20160323211736-5dc6d854e46e h1:cR8/SYRgyQCt5cNCMniB/ZScMkhI9nk8U5C7SbISXjo= +github.com/thomaso-mirodin/intmath v0.0.0-20160323211736-5dc6d854e46e/go.mod h1:Tu4lItkATkonrYuvtVjG0/rhy15qrNGNTjPdaphtZ/8= +github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= +github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= +github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= +github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= +github.com/tyler-smith/go-bip39 v1.1.0 h1:5eUemwrMargf3BSLRRCalXT93Ns6pQJIjYQN2nyfOP8= +github.com/tyler-smith/go-bip39 v1.1.0/go.mod h1:gUYDtqQw1JS3ZJ8UWVcGTGqqr6YIN3CWg+kkNaLt55U= +github.com/uber/jaeger-client-go v2.25.0+incompatible h1:IxcNZ7WRY1Y3G4poYlx24szfsn/3LvK9QHCq9oQw8+U= +github.com/uber/jaeger-client-go v2.25.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= +github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= +github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= +github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= +github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= +github.com/urfave/cli v1.22.2 h1:gsqYFH8bb9ekPA12kRo0hfjngWQjkJPlN9R0N78BoUo= +github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +github.com/urfave/cli/v2 v2.25.7 h1:VAzn5oq403l5pHjc4OhD54+XGO9cdKVL/7lDjF+iKUs= +github.com/urfave/cli/v2 v2.25.7/go.mod h1:8qnjx1vcq5s2/wpsqoZFndg2CE5tNFyrTvS6SinrnYQ= +github.com/urfave/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4= +github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= +github.com/valyala/fasthttp v1.6.0/go.mod h1:FstJa9V+Pj9vQ7OJie2qMHdwemEDaDiSdBnvPM1Su9w= +github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= +github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= +github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio= +github.com/viant/assertly v0.4.8/go.mod h1:aGifi++jvCrUaklKEKT0BU95igDNaqkvz+49uaYMPRU= +github.com/viant/toolbox v0.24.0/go.mod h1:OxMCG57V0PXuIP2HNQrtJf2CjqdmbrOx5EkMILuUhzM= +github.com/wealdtech/go-bytesutil v1.2.0 h1:GEIzvAZEIgqOoRfnEAaMRNL73gl8e+YlQzqxhFyR30Y= +github.com/wealdtech/go-bytesutil v1.2.0/go.mod h1:FHQSlwhzfSZGffu1osaUGdnNtl5C8tBKwmqvPdB66pM= +github.com/wealdtech/go-eth2-types/v2 v2.8.0 h1:Cts9J78ryXVp8jwotdSSVU75S+QWJrgVCArXreD2X8A= +github.com/wealdtech/go-eth2-types/v2 v2.8.0/go.mod h1:tJazo9o28kdQs3V/U4VafQ4neG+/sL3OBozQ8J3CWmo= +github.com/wealdtech/go-eth2-util v1.8.0 h1:hhs3h2y3Ldty18lppFdpe46nZpdDAMbY7QqiHO5BvE0= +github.com/wealdtech/go-eth2-util v1.8.0/go.mod h1:rSuE0v5zX+uyZrqW/iUmXOxeDpB7lTvhcZvAVh0KlMU= +github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= +github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= +github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= +github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU= +github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8= +github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0/go.mod h1:/LWChgwKmvncFJFHJ7Gvn9wZArjbV5/FppcK2fKk/tI= +github.com/yudai/gojsondiff v1.0.0/go.mod h1:AY32+k2cwILAkW1fbgxQ5mUmMiZFgLIV+FBNExI05xg= +github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82/go.mod h1:lgjkn3NuSvDfVJdfcVVdX+jpBxNmX4rDAzaS45IcYoM= +github.com/yudai/pp v2.0.1+incompatible/go.mod h1:PuxR/8QJ7cyCkFp/aUDS+JY727OFEZkTdatxwunjIkc= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yusufpapurcu/wmi v1.2.2 h1:KBNDSne4vP5mbSWnJbO+51IMOXJB67QiYCSBrubbPRg= +github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +go.opencensus.io v0.18.0/go.mod h1:vKdFvxhtzZ9onBp9VKHK8z/sRpBMnKAsufL7wlDrCOA= +go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= +go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= +go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= +go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= +go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= +go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/dig v1.17.1 h1:Tga8Lz8PcYNsWsyHMZ1Vm0OQOUaJNDyvPImgbAu9YSc= +go.uber.org/dig v1.17.1/go.mod h1:Us0rSJiThwCv2GteUN0Q7OKvU7n5J4dxZ9JKUXozFdE= +go.uber.org/fx v1.20.1 h1:zVwVQGS8zYvhh9Xxcu4w1M6ESyeMzebzj2NbSayZ4Mk= +go.uber.org/fx v1.20.1/go.mod h1:iSYNbHf2y55acNCwCXKx7LbWb5WG1Bnue5RDXz1OREg= +go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/mock v0.4.0 h1:VcM4ZOtdbR4f6VXfiOpwpVJDL6lCReaZ6mw31wqh7KU= +go.uber.org/mock v0.4.0/go.mod h1:a6FSlNadKUHUa9IP5Vyt1zh4fC7uAwxMutEAscFbkZc= +go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +go4.org v0.0.0-20180809161055-417644f6feb5/go.mod h1:MkTOUMDaeVYJUOUsaDXIhWPZYa1yOyC1qaOBpL57BhE= +golang.org/x/build v0.0.0-20190111050920-041ab4dc3f9d/go.mod h1:OWs+y06UdEOHN4y+MfF/py+xQ/tYqIWW03b70/CG9Rw= +golang.org/x/crypto v0.0.0-20181030102418-4d3f4d9ffa16/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190313024323-a1f597ede03a/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191227163750-53104e6ec876/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200602180216-279210d13fed/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= +golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.19.0 h1:ENy+Az/9Y1vSrlrvBSyna3PITt4tiZLf7sgCjZBX7Wo= +golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= +golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= +golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= +golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= +golang.org/x/exp v0.0.0-20240213143201-ec583247a57a h1:HinSgX1tJRX3KsL//Gxynpw5CTOAIPhgL4W8PNiIpVE= +golang.org/x/exp v0.0.0-20240213143201-ec583247a57a/go.mod h1:CxmFvTBINI24O/j8iY7H1xHzx2i4OsyguNBmN/uPtqc= +golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= +golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= +golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= +golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= +golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= +golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.15.0 h1:SernR4v+D55NyBH2QiEQrlBAnj1ECL6AGrA5+dPaMY8= +golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181029044818-c44066c5c816/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181106065722-10aee1819953/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190313220215-9f648a60d977/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190327091125-710a502c58a2/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= +golang.org/x/net v0.0.0-20211008194852-3b03d305991f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211209124913-491a49abca63/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4= +golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.16.0 h1:aDkGMBSYxElaoP81NpoUoz2oo2R2wHdZpGToUxfyQrQ= +golang.org/x/oauth2 v0.16.0/go.mod h1:hqZ+0LWXsiVoZpeld6jVt06P3adbS2Uu911W1SsJv2o= +golang.org/x/perf v0.0.0-20180704124530-6e6d33e29852/go.mod h1:JLpeXjPJfIyPr5TlbXLkXWLhP8nz10XfvxElABhCtcw= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= +golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sys v0.0.0-20180810173357-98c5dad5d1a0/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181029174526-d69651ed3497/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190316082340-a2f829d7f35f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200602225109-6fdc65e7d980/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201101102859-da207088b7d1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.17.0 h1:25cE3gD+tdBA7lp7QfhuV+rJiE9YXTcS3VG1SqssI/Y= +golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.17.0 h1:mkTF7LCd6WGJNL3K1Ad7kwxNfYAW6a8a8QqtMblp/4U= +golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= +golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= +golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181030000716-a0a13e073c7b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181221001348-537d06c36207/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190327201419-c70d86f8b7cf/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.18.0 h1:k8NLag8AGHnn+PHbl7g43CtqZAwG60vZkLqgyZgIHgQ= +golang.org/x/tools v0.18.0/go.mod h1:GL7B4CwcLLeo59yx/9UWWuNOW1n3VZ4f5axWfML7Lcg= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +google.golang.org/api v0.0.0-20180910000450-7ca32eb868bf/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= +google.golang.org/api v0.0.0-20181030000543-1d582fd0359e/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= +google.golang.org/api v0.1.0/go.mod h1:UGEZY7KEX120AnNLIHFMKIo4obdJhkp2tPbaPlQx13Y= +google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= +google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= +google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.44.0 h1:URs6qR1lAxDsqWITsQXI4ZkGiYJ5dHtRNiCpfs2OeKA= +google.golang.org/api v0.44.0/go.mod h1:EBOGZqzyhtvMDoxwS97ctnh0zUmYY6CxqXsc1AvkYD8= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.3.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= +google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= +google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/genproto v0.0.0-20180518175338-11a468237815/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20181029155118-b69ba1387ce2/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20181202183823-bd91e49a0898/go.mod h1:7Ep/1NZk928CDR8SjdVbjWNpdIf6nzjE3BTgJDr2Atg= +google.golang.org/genproto v0.0.0-20190306203927-b5d61aea6440/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= +google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= +google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= +google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 h1:KpwkzHKEF7B9Zxg18WzOa7djJ+Ha5DzthMyZYQfEn2A= +google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1/go.mod h1:nKE/iIaLqn2bQwXBg8f1g2Ylh6r5MN5CmZvuzZCgsCU= +google.golang.org/grpc v1.12.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= +google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= +google.golang.org/grpc v1.16.0/go.mod h1:0JHn/cJsOMiMfNA9+DeHDlAU7KAAB5GDlYFpa9MZMio= +google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= +google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.56.3 h1:8I4C0Yq1EjstUzUJzpcRVbuYA2mODtEmpWiQoN/b2nc= +google.golang.org/grpc v1.56.3/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= +google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I= +google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= +gopkg.in/go-playground/validator.v8 v8.18.2/go.mod h1:RX2a/7Ha8BgOhfk7j780h4/u/RRjR0eouCJSH80/M2Y= +gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1 h1:iiHuQZCNgYPmFQxd3BBN/Nc5+dAwzZuq5y40s20oQw0= +gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= +gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= +gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= +gopkg.in/ini.v1 v1.51.1/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= +gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8= +gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.0-20191120175047-4206685974f2/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +grpc.go4.org v0.0.0-20170609214715-11d0a25b4919/go.mod h1:77eQGdRu53HpSqPFJFmuJdjuHRquDANNeA4x7B8WQ9o= +honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +k8s.io/api v0.22.5/go.mod h1:mEhXyLaSD1qTOf40rRiKXkc+2iCem09rWLlFwhCEiAs= +k8s.io/apimachinery v0.22.5 h1:cIPwldOYm1Slq9VLBRPtEYpyhjIm1C6aAMAoENuvN9s= +k8s.io/apimachinery v0.22.5/go.mod h1:xziclGKwuuJ2RM5/rSFQSYAj0zdbci3DH8kj+WvyN0U= +k8s.io/client-go v0.22.5 h1:I8Zn/UqIdi2r02aZmhaJ1hqMxcpfJ3t5VqvHtctHYFo= +k8s.io/client-go v0.22.5/go.mod h1:cs6yf/61q2T1SdQL5Rdcjg9J1ElXSwbjSrW2vFImM4Y= +k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= +k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= +k8s.io/klog/v2 v2.9.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec= +k8s.io/klog/v2 v2.80.0 h1:lyJt0TWMPaGoODa8B8bUuxgHS3W/m/bNr2cca3brA/g= +k8s.io/klog/v2 v2.80.0/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= +k8s.io/kube-openapi v0.0.0-20211109043538-20434351676c/go.mod h1:vHXdDvt9+2spS2Rx9ql3I8tycm3H9FDfdUoIuKCefvw= +k8s.io/utils v0.0.0-20210819203725-bdf08cb9a70a/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +k8s.io/utils v0.0.0-20210930125809-cb0fa318a74b h1:wxEMGetGMur3J1xuGLQY7GEQYg9bZxKn3tKo5k/eYcs= +k8s.io/utils v0.0.0-20210930125809-cb0fa318a74b/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +lukechampine.com/blake3 v1.2.1 h1:YuqqRuaqsGV71BV/nm9xlI0MKUv4QC54jQnBChWbGnI= +lukechampine.com/blake3 v1.2.1/go.mod h1:0OFRp7fBtAylGVCO40o87sbupkyIGgbpv1+M1k1LM6k= +rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= +rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= +rsc.io/tmplfunc v0.0.3 h1:53XFQh69AfOa8Tw0Jm7t+GV7KZhOi6jzsCzTtKbMvzU= +rsc.io/tmplfunc v0.0.3/go.mod h1:AG3sTPzElb1Io3Yg4voV9AGZJuleGAwaVRxL9M49PhA= +sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= +sigs.k8s.io/structured-merge-diff/v4 v4.1.2 h1:Hr/htKFmJEbtMgS/UD0N+gtgctAqz81t3nu+sPzynno= +sigs.k8s.io/structured-merge-diff/v4 v4.1.2/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4= +sigs.k8s.io/yaml v1.2.0 h1:kr/MCeFWJWTwyaHoR9c8EjH9OumOmoF9YGiZd7lFm/Q= +sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= +sourcegraph.com/sourcegraph/go-diff v0.5.0/go.mod h1:kuch7UrkMzY0X+p9CRK03kfuPQ2zzQcaEFbx8wA8rck= +sourcegraph.com/sqs/pbtypes v0.0.0-20180604144634-d3ebe8f20ae4/go.mod h1:ketZ/q3QxT9HOBeFhu6RdvsftgpsbFHBF5Cas6cDKZ0= diff --git a/simulators/eth2/dencun/hive_context.txt b/simulators/eth2/dencun/hive_context.txt new file mode 100644 index 0000000000..a96aa0ea9d --- /dev/null +++ b/simulators/eth2/dencun/hive_context.txt @@ -0,0 +1 @@ +.. \ No newline at end of file diff --git a/simulators/eth2/dencun/main.go b/simulators/eth2/dencun/main.go new file mode 100644 index 0000000000..19d4c02494 --- /dev/null +++ b/simulators/eth2/dencun/main.go @@ -0,0 +1,35 @@ +package main + +import ( + "github.com/ethereum/hive/hivesim" + "github.com/ethereum/hive/simulators/eth2/common/clients" + suite_base "github.com/ethereum/hive/simulators/eth2/dencun/suites/base" + suite_builder "github.com/ethereum/hive/simulators/eth2/dencun/suites/builder" + suite_blobs_gossip "github.com/ethereum/hive/simulators/eth2/dencun/suites/p2p/gossip/blobs" + suite_reorg "github.com/ethereum/hive/simulators/eth2/dencun/suites/reorg" + suite_sync "github.com/ethereum/hive/simulators/eth2/dencun/suites/sync" +) + +func main() { + // Create simulator that runs all tests + sim := hivesim.New() + if sim == nil { + panic("failed to create simulator") + } + // From the simulator we can get all client types provided + clientTypes, err := sim.ClientTypes() + if err != nil { + panic(err) + } + clientsByRole := clients.ClientsByRole(clientTypes) + if clientsByRole == nil { + panic("failed to create clients by role") + } + + // Mark suites for execution + hivesim.MustRunSuite(sim, suite_base.Suite(clientsByRole)) + hivesim.MustRunSuite(sim, suite_sync.Suite(clientsByRole)) + hivesim.MustRunSuite(sim, suite_builder.Suite(clientsByRole)) + hivesim.MustRunSuite(sim, suite_reorg.Suite(clientsByRole)) + hivesim.MustRunSuite(sim, suite_blobs_gossip.Suite(clientsByRole)) +} diff --git a/simulators/eth2/dencun/suites/base/TESTS.md b/simulators/eth2/dencun/suites/base/TESTS.md new file mode 100644 index 0000000000..2265488e1a --- /dev/null +++ b/simulators/eth2/dencun/suites/base/TESTS.md @@ -0,0 +1,96 @@ +# Deneb Testnet - Test Cases + +Collection of test vectors that use a ExecutionClient+BeaconNode+ValidatorClient testnet for Cancun+Deneb. + +## Run Suite + +
    +Command-line + +```bash +./hive --client --sim eth2/dencun --sim.limit "eth2-deneb-testnet/" +``` + +
    + +## Test Cases + +### - Deneb Fork + +#### Run + +
    +Command-line + +```bash +./hive --client --sim eth2/dencun --sim.limit "eth2-deneb-testnet/test-deneb-fork-" +``` + +
    + +#### Description + +Sanity test to check the fork transition to deneb. + +#### Testnet Configuration + + +- Node Count: 2 +- Validating Node Count: 2 +- Validator Key Count: 128 +- Validator Key per Node: 64- Genesis Fork: Capella +- Execution Withdrawal Credentials Count: 128 +- BLS Withdrawal Credentials Count: 0 + +#### Verifications (Execution Client) + + +- Blob (type-3) transactions are included in the blocks + +#### Verifications (Consensus Client) + + +- For each blob transaction on the execution chain, the blob sidecars are available for the beacon block at the same height +- The beacon block lists the correct commitments for each blob + +### - Deneb Genesis + +#### Run + +
    +Command-line + +```bash +./hive --client --sim eth2/dencun --sim.limit "eth2-deneb-testnet/test-deneb-genesis-" +``` + +
    + +#### Description + + +Sanity test to check the beacon clients can start with deneb genesis. + + +#### Testnet Configuration + + +- Node Count: 2 +- Validating Node Count: 2 +- Validator Key Count: 128 +- Validator Key per Node: 64- Genesis Fork: Deneb +- Execution Withdrawal Credentials Count: 128 +- BLS Withdrawal Credentials Count: 0 + +#### Verifications (Execution Client) + + +- Blob (type-3) transactions are included in the blocks + +#### Verifications (Consensus Client) + + +- For each blob transaction on the execution chain, the blob sidecars are available for the beacon block at the same height +- The beacon block lists the correct commitments for each blob +- After all other verifications are done, the beacon chain is able to finalize the current epoch + diff --git a/simulators/eth2/dencun/suites/base/config.go b/simulators/eth2/dencun/suites/base/config.go new file mode 100644 index 0000000000..fc846cb04c --- /dev/null +++ b/simulators/eth2/dencun/suites/base/config.go @@ -0,0 +1,256 @@ +package suite_base + +import ( + "fmt" + "math/big" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/params" + "github.com/ethereum/hive/simulators/eth2/common/clients" + "github.com/ethereum/hive/simulators/eth2/common/config" + cl "github.com/ethereum/hive/simulators/eth2/common/config/consensus" + el "github.com/ethereum/hive/simulators/eth2/common/config/execution" + "github.com/ethereum/hive/simulators/eth2/common/testnet" + "github.com/ethereum/hive/simulators/eth2/common/utils" + "github.com/ethereum/hive/simulators/ethereum/engine/globals" + beacon "github.com/protolambda/zrnt/eth2/beacon/common" +) + +type BaseTestSpec struct { + // Spec + Name string + DisplayName string + Description string + + // Testnet Nodes + NodeCount int + ValidatingNodeCount int + + // Beacon Chain + ValidatorCount uint64 + DenebGenesis bool + + // Genesis Validators Configuration + // (One every Nth validator, 1 means all validators, 2 means half, etc...) + GenesisExecutionWithdrawalCredentialsShares int + GenesisExitedShares int + GenesisSlashedShares int + + // Actions + ExitValidatorsShare int + + // Verifications + EpochsAfterFork beacon.Epoch + WaitForBlobs bool + WaitForFinality bool + + // Extra Gwei + ExtraGwei beacon.Gwei +} + +var ( + DEFAULT_VALIDATOR_COUNT uint64 = 128 + + EPOCHS_TO_FINALITY beacon.Epoch = 4 + + // Default config used for all tests unless a client specific config exists + DEFAULT_CONFIG = &testnet.Config{ + ConsensusConfig: &cl.ConsensusConfig{ + ValidatorCount: big.NewInt(int64(DEFAULT_VALIDATOR_COUNT)), + }, + ForkConfig: &config.ForkConfig{ + TerminalTotalDifficulty: common.Big0, + AltairForkEpoch: common.Big0, + BellatrixForkEpoch: common.Big0, + CapellaForkEpoch: common.Big0, + DenebForkEpoch: common.Big1, + }, + Eth1Consensus: &el.ExecutionPostMergeGenesis{}, + } + + // This is the account that sends vault funding transactions. + VaultStartAmount, _ = new(big.Int).SetString("d3c21bcecceda1000000", 16) + + CodeContractAddress = common.HexToAddress( + "0xcccccccccccccccccccccccccccccccccccccccc", + ) + CodeContract = common.Hex2Bytes("0x328043558043600080a250") + + BeaconRootContractAddress = common.HexToAddress( + "0xbEAC020008aFF7331c0A389CB2AAb67597567d7a", + ) + + GasPrice = big.NewInt(30 * params.GWei) + GasTipPrice = big.NewInt(1 * params.GWei) + + ChainID = big.NewInt(7) +) + +func (ts BaseTestSpec) GetNodeCount() int { + if ts.NodeCount > 0 { + return ts.NodeCount + } + return 2 +} + +func (ts BaseTestSpec) GetValidatingNodeCount() int { + if ts.ValidatingNodeCount > 0 { + return ts.ValidatingNodeCount + } + return ts.GetNodeCount() +} + +func (ts BaseTestSpec) GetTestnetConfig( + allNodeDefinitions clients.NodeDefinitions, +) *testnet.Config { + config := *DEFAULT_CONFIG + + if ts.DenebGenesis { + config.DenebForkEpoch = common.Big0 + } + + nodeCount := ts.GetNodeCount() + + maxValidatingNodeIndex := ts.GetValidatingNodeCount() - 1 + nodeDefinitions := make(clients.NodeDefinitions, 0) + for i := 0; i < nodeCount; i++ { + n := allNodeDefinitions[i%len(allNodeDefinitions)] + if i <= maxValidatingNodeIndex { + n.ValidatorShares = 1 + } else { + n.ValidatorShares = 0 + } + nodeDefinitions = append(nodeDefinitions, n) + } + + // Fund execution layer account for transactions + config.GenesisExecutionAccounts = map[common.Address]core.GenesisAccount{ + CodeContractAddress: { + Balance: common.Big0, + Code: CodeContract, + }, + } + + for _, acc := range globals.TestAccounts { + config.GenesisExecutionAccounts[acc.GetAddress()] = core.GenesisAccount{ + Balance: VaultStartAmount, + } + } + + return config.Join(&testnet.Config{ + NodeDefinitions: nodeDefinitions, + }) +} + +func (ts BaseTestSpec) CanRun(clients.NodeDefinitions) bool { + // Base test specs can always run + return true +} + +func (ts BaseTestSpec) GetName() string { + return ts.Name +} + +func (ts BaseTestSpec) GetDisplayName() string { + return ts.DisplayName +} + +func (ts BaseTestSpec) GetDescription() *utils.Description { + desc := utils.NewDescription(ts.Description) + + // Add the testnet config description + desc.Add(utils.CategoryTestnetConfiguration, fmt.Sprintf(` + - Node Count: %d + - Validating Node Count: %d + - Validator Key Count: %d + - Validator Key per Node: %d`, + ts.GetNodeCount(), + ts.GetValidatingNodeCount(), + ts.GetValidatorCount(), + ts.GetValidatorCount()/uint64(ts.GetValidatingNodeCount()), + )) + if ts.DenebGenesis { + desc.Add(utils.CategoryTestnetConfiguration, "- Genesis Fork: Deneb") + } else { + desc.Add(utils.CategoryTestnetConfiguration, "- Genesis Fork: Capella") + } + execCredentialCount := ts.GetExecutionWithdrawalCredentialCount() + blsCredentialCount := ts.GetValidatorCount() - execCredentialCount + desc.Add(utils.CategoryTestnetConfiguration, fmt.Sprintf(` + - Execution Withdrawal Credentials Count: %d + - BLS Withdrawal Credentials Count: %d`, + execCredentialCount, + blsCredentialCount, + )) + + // Add the verifications description + desc.Add(utils.CategoryVerificationsExecutionClient, ` + - Blob (type-3) transactions are included in the blocks`) + desc.Add(utils.CategoryVerificationsConsensusClient, ` + - For each blob transaction on the execution chain, the blob sidecars are available for the beacon block at the same height + - The beacon block lists the correct commitments for each blob`) + if ts.WaitForFinality { + desc.Add(utils.CategoryVerificationsConsensusClient, ` + - After all other verifications are done, the beacon chain is able to finalize the current epoch`) + } + + return desc +} + +func (ts BaseTestSpec) GetValidatorCount() uint64 { + if ts.ValidatorCount != 0 { + return ts.ValidatorCount + } + return DEFAULT_VALIDATOR_COUNT +} + +func (ts BaseTestSpec) GetExecutionWithdrawalCredentialCount() uint64 { + if ts.GenesisExecutionWithdrawalCredentialsShares != 0 { + return ts.GetValidatorCount() / uint64(ts.GenesisExecutionWithdrawalCredentialsShares) + } + return 0 +} + +func (ts BaseTestSpec) GetValidatorKeys( + mnemonic string, +) cl.ValidatorsSetupDetails { + keySrc := &cl.MnemonicsKeySource{ + From: 0, + To: ts.GetValidatorCount(), + Mnemonic: mnemonic, + } + keys, err := keySrc.Keys() + if err != nil { + panic(err) + } + + for index, key := range keys { + // All validators have idiosyncratic balance amounts to identify them. + // Also include a high amount in order to guarantee withdrawals. + key.ExtraInitialBalance = beacon.Gwei((index+1)*1000000) + ts.ExtraGwei + + if ts.GenesisExecutionWithdrawalCredentialsShares > 0 && + (index%ts.GenesisExecutionWithdrawalCredentialsShares) == 0 { + key.WithdrawalCredentialType = beacon.ETH1_ADDRESS_WITHDRAWAL_PREFIX + key.WithdrawalExecAddress = beacon.Eth1Address{byte(index + 0x100)} + } + if ts.GenesisExitedShares > 1 && (index%ts.GenesisExitedShares) == 1 { + key.Exited = true + } + if ts.GenesisSlashedShares > 2 && + (index%ts.GenesisSlashedShares) == 2 { + key.Slashed = true + } + fmt.Printf( + "INFO: Validator %d, extra_gwei=%d, exited=%v, slashed=%v, key_type=%d\n", + index, + key.ExtraInitialBalance, + key.Exited, + key.Slashed, + key.WithdrawalCredentialType, + ) + } + + return keys +} diff --git a/simulators/eth2/dencun/suites/base/execution.go b/simulators/eth2/dencun/suites/base/execution.go new file mode 100644 index 0000000000..09ac66cb52 --- /dev/null +++ b/simulators/eth2/dencun/suites/base/execution.go @@ -0,0 +1,346 @@ +package suite_base + +import ( + "context" + "time" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/hive/hivesim" + + beacon_verification "github.com/ethereum/hive/simulators/eth2/common/spoofing/beacon" + tn "github.com/ethereum/hive/simulators/eth2/common/testnet" + "github.com/ethereum/hive/simulators/eth2/common/utils" + "github.com/ethereum/hive/simulators/ethereum/engine/globals" + engine_helper "github.com/ethereum/hive/simulators/ethereum/engine/helper" + "github.com/protolambda/eth2api" + beacon "github.com/protolambda/zrnt/eth2/beacon/common" +) + +var Deneb string = "deneb" + +var ( + normalTxAccounts = globals.TestAccounts[:len(globals.TestAccounts)/2] + blobTxAccounts = globals.TestAccounts[len(globals.TestAccounts)/2:] +) + +func WithdrawalAddress(vI beacon.ValidatorIndex) common.Address { + return common.Address{byte(vI + 0x100)} +} + +// Generic Deneb test routine, capable of running most of the test +// scenarios. +func (ts BaseTestSpec) ExecutePreFork( + t *hivesim.T, + ctx context.Context, + testnet *tn.Testnet, + env *tn.Environment, + config *tn.Config, +) { + // Setup the transaction spammers, both normal and blob transactions + normalTxSpammer := utils.TransactionSpammer{ + T: t, + Name: "normal", + Recipient: &CodeContractAddress, + ExecutionClients: testnet.ExecutionClients().Running(), + Accounts: normalTxAccounts, + TransactionType: engine_helper.DynamicFeeTxOnly, + TransactionsPerIteration: 40, + SecondsBetweenIterations: int(testnet.Spec().SECONDS_PER_SLOT), + } + + // Start sending normal transactions from dedicated accounts + go normalTxSpammer.Run(ctx) + + // Add verification of Beacon->Execution Engine API calls to the proxies + chainconfig := testnet.ExecutionGenesis().Config + // NewPayloadV2 expires at CancunTime: if a client sends a payload with + // a timestamp greater than CancunTime, and it's using NewPayloadV2, it + // must result in test failure. + newPayloadV2ExpireVerifier := beacon_verification.NewEngineMaxTimestampVerifier( + t, + beacon_verification.EngineNewPayloadV2, + *chainconfig.CancunTime, + ) + // ForkchoiceUpdatedV2 expires at CancunTime: if a client sends a payload with + // a timestamp greater than CancunTime, and it's using ForkchoiceUpdatedV2, it + // must result in test failure. + forkchoiceUpdatedV2ExpireVerifier := beacon_verification.NewEngineMaxTimestampVerifier( + t, + beacon_verification.EngineForkchoiceUpdatedV2, + *chainconfig.CancunTime, + ) + for _, e := range testnet.ExecutionClients() { + newPayloadV2ExpireVerifier.AddToProxy(e.Proxy()) + forkchoiceUpdatedV2ExpireVerifier.AddToProxy(e.Proxy()) + } + + // Wait for beacon chain genesis to happen + testnet.WaitForGenesis(ctx) +} + +// Wait for the fork to happen. +// Under normal circumstances, the fork should happen at the specified slot. +// If a test injects an error at the time of the fork, the test should wait +// for the fork by clock time, and not by the client's response. +func (ts BaseTestSpec) WaitForFork( + t *hivesim.T, + ctx context.Context, + testnet *tn.Testnet, + env *tn.Environment, + config *tn.Config, +) { + slotsUntilFork := beacon.Slot( + config.DenebForkEpoch.Uint64(), + )*testnet.Spec().SLOTS_PER_EPOCH + 4 + timeoutCtx, cancel := testnet.Spec().SlotTimeoutContext(ctx, slotsUntilFork) + defer cancel() + if err := testnet.WaitForFork(timeoutCtx, Deneb); err != nil { + t.Fatalf("FAIL: error waiting for deneb: %v", err) + } +} + +func (ts BaseTestSpec) ExecutePostFork( + t *hivesim.T, + ctx context.Context, + testnet *tn.Testnet, + env *tn.Environment, + config *tn.Config, +) { + // Wait one more slot before continuing + testnet.WaitSlots(ctx, 1) + + // Start sending blob transactions from dedicated accounts + blobTxSpammer := utils.TransactionSpammer{ + T: t, + Name: "blobs", + Recipient: &CodeContractAddress, + ExecutionClients: testnet.ExecutionClients().Running(), + Accounts: blobTxAccounts, + TransactionType: engine_helper.BlobTxOnly, + TransactionsPerIteration: 2, + SecondsBetweenIterations: int(testnet.Spec().SECONDS_PER_SLOT), + } + + go blobTxSpammer.Run(ctx) + + // Send BLSToExecutionChanges messages during Deneb for all validators on BLS credentials + nonWithdrawableValidators := testnet.Validators.NonWithdrawable() + testnet.ValidatorGroups["nonWithdrawable"] = nonWithdrawableValidators + if nonWithdrawableValidators.Count() > 0 { + beaconClients := testnet.BeaconClients().Running() + domainType := beacon.DOMAIN_BLS_TO_EXECUTION_CHANGE + forkVersion := testnet.Spec().GENESIS_FORK_VERSION + validatorsRoot := testnet.GenesisValidatorsRoot() + domain := beacon.ComputeDomain( + domainType, + forkVersion, + validatorsRoot, + ) + t.Logf("INFO: BLS to execution domain=%s, domain type = %s, fork version = %s, validators root = %s", domain.String(), domainType.String(), forkVersion.String(), validatorsRoot.String()) + i := 0 + nonWithdrawableValidators.ForEach(func(v *utils.Validator) { + b := beaconClients[i%len(beaconClients)] + if err := v.SignSendBLSToExecutionChange( + ctx, + b, + WithdrawalAddress(v.Index), + domain, + ); err != nil { + t.Fatalf( + "FAIL: Unable to submit bls-to-execution changes: %v", + err, + ) + } + i++ + }) + t.Logf("INFO: sent bls-to-execution changes of %d validators", i) + } else { + t.Logf("INFO: no validators left on BLS credentials") + } + + // Send exit messages for the share of validators that will exit + // at the fork + if ts.ExitValidatorsShare > 0 { + // Get the validators that will exit + exitValidators := testnet.Validators.Chunks(ts.ExitValidatorsShare)[0] + testnet.ValidatorGroups["toExit"] = exitValidators + if exitValidators.Count() > 0 { + beaconClients := testnet.BeaconClients().Running() + domain := beacon.ComputeDomain( + beacon.DOMAIN_VOLUNTARY_EXIT, + testnet.Spec().CAPELLA_FORK_VERSION, + testnet.GenesisValidatorsRoot(), + ) + i := 0 + exitValidators.ForEach(func(v *utils.Validator) { + b := beaconClients[i%len(beaconClients)] + if err := v.SignSendVoluntaryExit( + ctx, + b, + domain, + ); err != nil { + t.Fatalf( + "FAIL: Unable to submit exit: %v", + err, + ) + } + i++ + }) + + } else { + t.Logf("INFO: no validators to exit") + } + } +} + +func (ts BaseTestSpec) ExecutePostForkWait( + t *hivesim.T, + ctx context.Context, + testnet *tn.Testnet, + env *tn.Environment, + config *tn.Config, +) { + if ts.EpochsAfterFork != 0 { + // Wait for the specified number of epochs after fork + if err := testnet.WaitSlots(ctx, beacon.Slot(ts.EpochsAfterFork)*testnet.Spec().SLOTS_PER_EPOCH); err != nil { + t.Fatalf("FAIL: error waiting for %d epochs after fork: %v", ts.EpochsAfterFork, err) + } + } + if ts.WaitForBlobs { + // Check that the latest head contains blobs + blobsWaitCtx, cancel := testnet.Spec().EpochTimeoutContext(ctx, 1) + defer cancel() + for { + select { + case <-blobsWaitCtx.Done(): + t.Fatalf("FAIL: context expired waiting for blobs: %v", blobsWaitCtx.Err()) + case <-time.After(time.Duration(testnet.Spec().SECONDS_PER_SLOT) * time.Second): + if blobCount, err := testnet.VerifyBlobs(ctx, tn.LastestSlotByHead{}); err != nil { + t.Fatalf("FAIL: error verifying blobs: %v", err) + } else if blobCount > 0 { + t.Logf("INFO: blobs have been included in the chain") + return + } + } + } + } + if ts.WaitForFinality { + finalityCtx, cancel := testnet.Spec().EpochTimeoutContext(ctx, 5) + defer cancel() + if _, err := testnet.WaitForCurrentEpochFinalization(finalityCtx); err != nil { + t.Fatalf("FAIL: error waiting for epoch finalization: %v", err) + } + } +} + +func (ts BaseTestSpec) Verify( + t *hivesim.T, + ctx context.Context, + testnet *tn.Testnet, + env *tn.Environment, + config *tn.Config, +) { + // Check all clients are on the same head + if err := testnet.VerifyELHeads(ctx); err != nil { + t.Fatalf("FAIL: error verifying execution layer heads: %v", err) + } + + // Check for optimistic sync + for i, n := range testnet.Nodes.Running() { + bc := n.BeaconClient + if op, err := bc.BlockIsOptimistic(ctx, eth2api.BlockHead); op { + t.Fatalf( + "FAIL: client %d (%s) is optimistic, it should be synced.", + i, + n.ClientNames(), + ) + } else if err != nil { + t.Fatalf("FAIL: error querying optimistic state on client %d (%s): %v", i, n.ClientNames(), err) + } + } + + // Set timeout for the following checks + timeoutCtx, cancel := testnet.Spec().EpochTimeoutContext(ctx, 2) + defer cancel() + + // Check non-withdrawable validators changed their credentials + nonWithdrawableValidators := testnet.ValidatorGroups["nonWithdrawable"] + if nonWithdrawableValidators != nil && nonWithdrawableValidators.Count() > 0 { + for { + select { + case <-time.After(time.Duration(testnet.Spec().SECONDS_PER_SLOT) * time.Second): + case <-timeoutCtx.Done(): + t.Fatalf("FAIL: context expired waiting for non-withdrawable validators to change credentials: %v", timeoutCtx.Err()) + } + // Update the validator set from state + state, err := testnet.BeaconClients().Running()[0].BeaconStateV2(ctx, eth2api.StateHead) + if err != nil { + t.Fatalf("FAIL: error getting beacon state: %v", err) + } + + beaconState, err := state.Tree(testnet.Spec().Spec) + if err != nil { + t.Fatalf("FAIL: error getting beacon state tree: %v", err) + } + + nonWithdrawableValidators.UpdateFromBeaconState(beaconState) + + // Check if all validators have changed their credentials + if nonWithdrawableValidators.NonWithdrawable().Count() == 0 { + t.Logf("INFO: all non-withdrawable validators have changed credentials") + break + } else { + t.Logf( + "INFO: %d non-withdrawable validators have not changed credentials", + nonWithdrawableValidators.NonWithdrawable().Count(), + ) + } + } + } + + // Check exit validators have an exit epoch set + toExitValidators := testnet.ValidatorGroups["toExit"] + if toExitValidators != nil && toExitValidators.Count() > 0 { + toExitValidatorsCount := toExitValidators.Count() + for { + select { + case <-time.After(time.Duration(testnet.Spec().SECONDS_PER_SLOT) * time.Second): + case <-timeoutCtx.Done(): + t.Fatalf("FAIL: context expired waiting for validators to exit: %v", timeoutCtx.Err()) + } + // Update the validator set from state + state, err := testnet.BeaconClients().Running()[0].BeaconStateV2(ctx, eth2api.StateHead) + if err != nil { + t.Fatalf("FAIL: error getting beacon state: %v", err) + } + + beaconState, err := state.Tree(testnet.Spec().Spec) + if err != nil { + t.Fatalf("FAIL: error getting beacon state tree: %v", err) + } + + toExitValidators.UpdateFromBeaconState(beaconState) + + // Check if all validators have initiated exit + exitInitiatedCount := toExitValidators.ExitInitiated().Count() + if exitInitiatedCount == toExitValidatorsCount { + t.Logf("INFO: all validators have initiated exit") + break + } else { + t.Logf( + "INFO: %d validators have not initiated exit", + toExitValidatorsCount-exitInitiatedCount, + ) + } + } + } + + // Verify all clients agree on blobs for each slot + if blobCount, err := testnet.VerifyBlobs(ctx, tn.LastestSlotByHead{}); err != nil { + t.Fatalf("FAIL: error verifying blobs: %v", err) + } else if blobCount == 0 { + t.Fatalf("FAIL: no blobs were included in the chain") + } else { + t.Logf("INFO: %d blobs were included in the chain", blobCount) + } +} diff --git a/simulators/eth2/dencun/suites/base/tests.go b/simulators/eth2/dencun/suites/base/tests.go new file mode 100644 index 0000000000..3f3a4abe08 --- /dev/null +++ b/simulators/eth2/dencun/suites/base/tests.go @@ -0,0 +1,46 @@ +package suite_base + +import ( + "github.com/ethereum/hive/hivesim" + "github.com/ethereum/hive/simulators/eth2/common/clients" + "github.com/ethereum/hive/simulators/eth2/dencun/suites" +) + +var testSuite = hivesim.Suite{ + Name: "eth2-deneb-testnet", + DisplayName: "Deneb Testnet", + Description: `Collection of test vectors that use a ExecutionClient+BeaconNode+ValidatorClient testnet for Cancun+Deneb.`, + Location: "suites/base", +} + +var Tests = make([]suites.TestSpec, 0) + +func init() { + Tests = append(Tests, + BaseTestSpec{ + Name: "test-deneb-fork", + DisplayName: "Deneb Fork", + Description: `Sanity test to check the fork transition to deneb.`, + DenebGenesis: false, + GenesisExecutionWithdrawalCredentialsShares: 1, + EpochsAfterFork: 1, + ExitValidatorsShare: 10, + }, + BaseTestSpec{ + Name: "test-deneb-genesis", + DisplayName: "Deneb Genesis", + Description: ` + Sanity test to check the beacon clients can start with deneb genesis. + `, + DenebGenesis: true, + GenesisExecutionWithdrawalCredentialsShares: 1, + WaitForFinality: true, + ExitValidatorsShare: 10, + }, + ) +} + +func Suite(c *clients.ClientDefinitionsByRole) hivesim.Suite { + suites.SuiteHydrate(&testSuite, c, Tests) + return testSuite +} diff --git a/simulators/eth2/dencun/suites/builder/TESTS.md b/simulators/eth2/dencun/suites/builder/TESTS.md new file mode 100644 index 0000000000..c283800f46 --- /dev/null +++ b/simulators/eth2/dencun/suites/builder/TESTS.md @@ -0,0 +1,322 @@ +# Deneb Builder - Test Cases + + +Collection of test vectors that use a ExecutionClient+BeaconNode+ValidatorClient testnet and builder API for Cancun+Deneb. + + +### Clients that require finalization to enable builder +- Lighthouse +- Teku + + +## Run Suite + +
    +Command-line + +```bash +./hive --client --sim eth2/dencun --sim.limit "eth2-deneb-builder/" +``` + +
    + +## Test Cases + +### - Deneb Builder Workflow From Capella Transition + +#### Run + +
    +Command-line + +```bash +./hive --client --sim eth2/dencun --sim.limit "eth2-deneb-builder/test-builders-sanity-" +``` + +
    + +#### Description + + +Test canonical chain includes deneb payloads built by the builder api. + +#### Testnet Configuration + + +- Node Count: 2 +- Validating Node Count: 2 +- Validator Key Count: 128 +- Validator Key per Node: 64- Genesis Fork: Capella +- Execution Withdrawal Credentials Count: 0 +- BLS Withdrawal Credentials Count: 128 +- Deneb/Cancun transition occurs on Epoch 1 or 5 + - Epoch depends on whether builder workflow activation requires finalization [on the CL client](#clients-that-require-finalization-to-enable-builder). +- Builder is enabled for all nodes +- Builder action is only enabled after fork +- Nodes have the mock-builder configured as builder endpoint + +#### Verifications (Execution Client) + + +- Blob (type-3) transactions are included in the blocks + +#### Verifications (Consensus Client) + + +- For each blob transaction on the execution chain, the blob sidecars are available for the beacon block at the same height +- The beacon block lists the correct commitments for each blob +- Verify that the builder, up to before Deneb fork, has been able to produce blocks and they have been included in the canonical chain +- After Deneb fork, the builder must be able to include blocks with blobs in the canonical chain, which implicitly verifies: + - Consensus client is able to properly format header requests to the builder + - Consensus client is able to properly format blinded signed requests to the builder + - No signed block contained an invalid format or signature + - Test fails with a timeout if no payload with blobs is produced after the fork + +### - Deneb Builder Builds Block With Invalid Beacon Root, Correct State Root + +#### Run + +
    +Command-line + +```bash +./hive --client --sim eth2/dencun --sim.limit "eth2-deneb-builder/test-builders-invalid-payload-attributes-beacon-root-" +``` + +
    + +#### Description + + +Test canonical chain can still finalize if the builders start +building payloads with invalid parent beacon block root. + +#### Testnet Configuration + + +- Node Count: 2 +- Validating Node Count: 2 +- Validator Key Count: 128 +- Validator Key per Node: 64- Genesis Fork: Capella +- Execution Withdrawal Credentials Count: 128 +- BLS Withdrawal Credentials Count: 0 +- Deneb/Cancun transition occurs on Epoch 1 or 5 + - Epoch depends on whether builder workflow activation requires finalization [on the CL client](#clients-that-require-finalization-to-enable-builder). +- Builder is enabled for all nodes +- Builder action is only enabled after fork +- Nodes have the mock-builder configured as builder endpoint + +#### Verifications (Execution Client) + + +- Blob (type-3) transactions are included in the blocks + +#### Verifications (Consensus Client) + + +- For each blob transaction on the execution chain, the blob sidecars are available for the beacon block at the same height +- The beacon block lists the correct commitments for each blob +- Verify that the builder, up to before Deneb fork, has been able to produce blocks and they have been included in the canonical chain +- After Deneb fork, the builder starts producing invalid payloads, verify that: + - None of the produced payloads are included in the canonical chain +- Since action causes missed slot, verify that the circuit breaker correctly kicks in and disables the builder workflow. Builder starts corrupting payloads after fork, hence a single block in the canonical chain after the fork is enough to verify the circuit breaker + +### - Deneb Builder Errors Out on Header Requests After Deneb Transition + +#### Run + +
    +Command-line + +```bash +./hive --client --sim eth2/dencun --sim.limit "eth2-deneb-builder/test-builders-error-on-deneb-header-request-" +``` + +
    + +#### Description + + +Test canonical chain can still finalize if the builders start +returning error on header request after deneb transition. + +#### Testnet Configuration + + +- Node Count: 2 +- Validating Node Count: 2 +- Validator Key Count: 128 +- Validator Key per Node: 64- Genesis Fork: Capella +- Execution Withdrawal Credentials Count: 128 +- BLS Withdrawal Credentials Count: 0 +- Deneb/Cancun transition occurs on Epoch 1 or 5 + - Epoch depends on whether builder workflow activation requires finalization [on the CL client](#clients-that-require-finalization-to-enable-builder). +- Builder is enabled for all nodes +- Builder action is only enabled after fork +- Nodes have the mock-builder configured as builder endpoint + +#### Verifications (Execution Client) + + +- Blob (type-3) transactions are included in the blocks + +#### Verifications (Consensus Client) + + +- For each blob transaction on the execution chain, the blob sidecars are available for the beacon block at the same height +- The beacon block lists the correct commitments for each blob +- Verify that the builder, up to before Deneb fork, has been able to produce blocks and they have been included in the canonical chain +- After Deneb fork, the builder starts producing invalid payloads, verify that: + - None of the produced payloads are included in the canonical chain + +### - Deneb Builder Errors Out on Signed Blinded Beacon Block/Blob Sidecars Submission After Deneb Transition + +#### Run + +
    +Command-line + +```bash +./hive --client --sim eth2/dencun --sim.limit "eth2-deneb-builder/test-builders-error-on-deneb-unblind-payload-request-" +``` + +
    + +#### Description + + +Test canonical chain can still finalize if the builders start +returning error on unblinded payload request after deneb transition. + +#### Testnet Configuration + + +- Node Count: 2 +- Validating Node Count: 2 +- Validator Key Count: 128 +- Validator Key per Node: 64- Genesis Fork: Capella +- Execution Withdrawal Credentials Count: 128 +- BLS Withdrawal Credentials Count: 0 +- Deneb/Cancun transition occurs on Epoch 1 or 5 + - Epoch depends on whether builder workflow activation requires finalization [on the CL client](#clients-that-require-finalization-to-enable-builder). +- Builder is enabled for all nodes +- Builder action is only enabled after fork +- Nodes have the mock-builder configured as builder endpoint + +#### Verifications (Execution Client) + + +- Blob (type-3) transactions are included in the blocks + +#### Verifications (Consensus Client) + + +- For each blob transaction on the execution chain, the blob sidecars are available for the beacon block at the same height +- The beacon block lists the correct commitments for each blob +- Verify that the builder, up to before Deneb fork, has been able to produce blocks and they have been included in the canonical chain +- After Deneb fork, the builder starts producing invalid payloads, verify that: + - None of the produced payloads are included in the canonical chain +- Since action causes missed slot, verify that the circuit breaker correctly kicks in and disables the builder workflow. Builder starts corrupting payloads after fork, hence a single block in the canonical chain after the fork is enough to verify the circuit breaker + +### - Deneb Builder Builds Block With Invalid Payload Version + +#### Run + +
    +Command-line + +```bash +./hive --client --sim eth2/dencun --sim.limit "eth2-deneb-builder/test-builders-invalid-payload-version-" +``` + +
    + +#### Description + + +Test consensus clients correctly reject a built payload if the +version is outdated (capella instead of deneb). + +#### Testnet Configuration + + +- Node Count: 2 +- Validating Node Count: 2 +- Validator Key Count: 128 +- Validator Key per Node: 64- Genesis Fork: Capella +- Execution Withdrawal Credentials Count: 128 +- BLS Withdrawal Credentials Count: 0 +- Deneb/Cancun transition occurs on Epoch 1 or 5 + - Epoch depends on whether builder workflow activation requires finalization [on the CL client](#clients-that-require-finalization-to-enable-builder). +- Builder is enabled for all nodes +- Builder action is only enabled after fork +- Nodes have the mock-builder configured as builder endpoint + +#### Verifications (Execution Client) + + +- Blob (type-3) transactions are included in the blocks + +#### Verifications (Consensus Client) + + +- For each blob transaction on the execution chain, the blob sidecars are available for the beacon block at the same height +- The beacon block lists the correct commitments for each blob +- Verify that the builder, up to before Deneb fork, has been able to produce blocks and they have been included in the canonical chain +- After Deneb fork, the builder starts producing invalid payloads, verify that: + - None of the produced payloads are included in the canonical chain + +### - Deneb Builder Builds Block With Invalid Beacon Root, Incorrect State Root + +#### Run + +
    +Command-line + +```bash +./hive --client --sim eth2/dencun --sim.limit "eth2-deneb-builder/test-builders-invalid-payload-beacon-root-" +``` + +
    + +#### Description + + +Test consensus clients correctly circuit break builder after a +period of empty blocks due to invalid unblinded blocks. + +The payloads are built using an invalid parent beacon block root, which can only +be caught after unblinding the entire payload and running it in the +local execution client, at which point another payload cannot be +produced locally and results in an empty slot. + +#### Testnet Configuration + + +- Node Count: 2 +- Validating Node Count: 2 +- Validator Key Count: 128 +- Validator Key per Node: 64- Genesis Fork: Capella +- Execution Withdrawal Credentials Count: 128 +- BLS Withdrawal Credentials Count: 0 +- Deneb/Cancun transition occurs on Epoch 1 or 5 + - Epoch depends on whether builder workflow activation requires finalization [on the CL client](#clients-that-require-finalization-to-enable-builder). +- Builder is enabled for all nodes +- Builder action is only enabled after fork +- Nodes have the mock-builder configured as builder endpoint + +#### Verifications (Execution Client) + + +- Blob (type-3) transactions are included in the blocks + +#### Verifications (Consensus Client) + + +- For each blob transaction on the execution chain, the blob sidecars are available for the beacon block at the same height +- The beacon block lists the correct commitments for each blob +- Verify that the builder, up to before Deneb fork, has been able to produce blocks and they have been included in the canonical chain +- After Deneb fork, the builder starts producing invalid payloads, verify that: + - None of the produced payloads are included in the canonical chain +- Since action causes missed slot, verify that the circuit breaker correctly kicks in and disables the builder workflow. Builder starts corrupting payloads after fork, hence a single block in the canonical chain after the fork is enough to verify the circuit breaker + diff --git a/simulators/eth2/dencun/suites/builder/config.go b/simulators/eth2/dencun/suites/builder/config.go new file mode 100644 index 0000000000..89b689f239 --- /dev/null +++ b/simulators/eth2/dencun/suites/builder/config.go @@ -0,0 +1,129 @@ +package suite_builder + +import ( + "math/big" + + "github.com/ethereum/hive/simulators/eth2/common/clients" + "github.com/ethereum/hive/simulators/eth2/common/testnet" + "github.com/ethereum/hive/simulators/eth2/common/utils" + suite_base "github.com/ethereum/hive/simulators/eth2/dencun/suites/base" + mock_builder "github.com/marioevz/mock-builder/mock" + beacon "github.com/protolambda/zrnt/eth2/beacon/common" +) + +var REQUIRES_FINALIZATION_TO_ACTIVATE_BUILDER = []string{ + "lighthouse", + "teku", +} + +type BuilderTestSpec struct { + suite_base.BaseTestSpec + VerifyMissedSlotsCount bool + ErrorOnHeaderRequest bool + ErrorOnPayloadReveal bool + InvalidPayloadVersion bool + InvalidatePayload mock_builder.PayloadInvalidation + InvalidatePayloadAttributes mock_builder.PayloadAttributesInvalidation +} + +func (ts BuilderTestSpec) GetTestnetConfig( + allNodeDefinitions clients.NodeDefinitions, +) *testnet.Config { + tc := ts.BaseTestSpec.GetTestnetConfig(allNodeDefinitions) + + tc.DenebForkEpoch = big.NewInt(1) + + if len( + allNodeDefinitions.FilterByCL( + REQUIRES_FINALIZATION_TO_ACTIVATE_BUILDER, + ), + ) > 0 { + // At least one of the CLs require finalization to start requesting + // headers from the builder + tc.DenebForkEpoch = big.NewInt(5) + } + + // Builders are always enabled for these tests + tc.EnableBuilders = true + + // Builder config + // Configure the builder according to the error + tc.BuilderOptions = make([]mock_builder.Option, 0) + + // Bump the built payloads value + tc.BuilderOptions = append( + tc.BuilderOptions, + mock_builder.WithPayloadWeiValueMultiplier(big.NewInt(10)), + mock_builder.WithExtraDataWatermark("builder payload tst"), + ) + + // Inject test error + denebEpoch := beacon.Epoch(tc.DenebForkEpoch.Uint64()) + if ts.ErrorOnHeaderRequest { + tc.BuilderOptions = append( + tc.BuilderOptions, + mock_builder.WithErrorOnHeaderRequestAtEpoch(denebEpoch), + ) + } + if ts.ErrorOnPayloadReveal { + tc.BuilderOptions = append( + tc.BuilderOptions, + mock_builder.WithErrorOnPayloadRevealAtEpoch(denebEpoch), + ) + } + if ts.InvalidatePayload != "" { + tc.BuilderOptions = append( + tc.BuilderOptions, + mock_builder.WithPayloadInvalidatorAtEpoch( + denebEpoch, + ts.InvalidatePayload, + ), + ) + } + if ts.InvalidatePayloadAttributes != "" { + tc.BuilderOptions = append( + tc.BuilderOptions, + mock_builder.WithPayloadAttributesInvalidatorAtEpoch( + denebEpoch, + ts.InvalidatePayloadAttributes, + ), + ) + } + if ts.InvalidPayloadVersion { + tc.BuilderOptions = append( + tc.BuilderOptions, + mock_builder.WithInvalidBuilderBidVersionAtEpoch(denebEpoch), + ) + } + + return tc +} + +func (ts BuilderTestSpec) GetDescription() *utils.Description { + desc := ts.BaseTestSpec.GetDescription() + desc.Add(utils.CategoryTestnetConfiguration, ` + - Deneb/Cancun transition occurs on Epoch 1 or 5 + - Epoch depends on whether builder workflow activation requires finalization [on the CL client](#clients-that-require-finalization-to-enable-builder). + - Builder is enabled for all nodes + - Builder action is only enabled after fork + - Nodes have the mock-builder configured as builder endpoint`) + desc.Add(utils.CategoryVerificationsConsensusClient, ` + - Verify that the builder, up to before Deneb fork, has been able to produce blocks and they have been included in the canonical chain`) + if ts.BuilderProducesValidPayload() { + desc.Add(utils.CategoryVerificationsConsensusClient, ` + - After Deneb fork, the builder must be able to include blocks with blobs in the canonical chain, which implicitly verifies: + - Consensus client is able to properly format header requests to the builder + - Consensus client is able to properly format blinded signed requests to the builder + - No signed block contained an invalid format or signature + - Test fails with a timeout if no payload with blobs is produced after the fork`) + } else { + desc.Add(utils.CategoryVerificationsConsensusClient, ` + - After Deneb fork, the builder starts producing invalid payloads, verify that: + - None of the produced payloads are included in the canonical chain`) + if ts.CausesMissedSlot() { + desc.Add(utils.CategoryVerificationsConsensusClient, ` + - Since action causes missed slot, verify that the circuit breaker correctly kicks in and disables the builder workflow. Builder starts corrupting payloads after fork, hence a single block in the canonical chain after the fork is enough to verify the circuit breaker`) + } + } + return desc +} diff --git a/simulators/eth2/dencun/suites/builder/execution.go b/simulators/eth2/dencun/suites/builder/execution.go new file mode 100644 index 0000000000..22a0212e41 --- /dev/null +++ b/simulators/eth2/dencun/suites/builder/execution.go @@ -0,0 +1,337 @@ +package suite_builder + +import ( + "bytes" + "context" + "encoding/json" + "math/big" + + "github.com/ethereum/hive/hivesim" + tn "github.com/ethereum/hive/simulators/eth2/common/testnet" + mock_builder "github.com/marioevz/mock-builder/mock" + beacon "github.com/protolambda/zrnt/eth2/beacon/common" +) + +const ( + MAX_MISSED_SLOTS_BEFORE_CIRCUIT_BREAKER uint64 = 10 + MAX_MISSED_SLOTS_NO_CIRCUIT_BREAKER uint64 = 1 +) + +var Deneb string = "deneb" + +// Wait for the fork to happen. +// Under normal circumstances, the fork should happen at the specified slot. +// If a test injects an error at the time of the fork, it's possible that we +// will miss slots until the circuit breaker is active, so we need to increase +// the timeout. +func (ts BuilderTestSpec) WaitForFork( + t *hivesim.T, + ctx context.Context, + testnet *tn.Testnet, + env *tn.Environment, + config *tn.Config, +) { + extraSlotsTimeout := beacon.Slot(4) + if ts.CausesMissedSlot() { + // The error cannot be caught by the consensus client until the payload is revealed, + // and the beacon block had been signed. Therefore there will be missed slots + // until the circuit breaker kicks in. + extraSlotsTimeout += testnet.Spec().SLOTS_PER_EPOCH + } + slotsUntilFork := beacon.Slot( + config.DenebForkEpoch.Uint64(), + )*testnet.Spec().SLOTS_PER_EPOCH + extraSlotsTimeout + timeoutCtx, cancel := testnet.Spec().SlotTimeoutContext(ctx, slotsUntilFork) + defer cancel() + if err := testnet.WaitForFork(timeoutCtx, Deneb); err != nil { + t.Fatalf("FAIL: error waiting for deneb: %v", err) + } +} + +// Builder testnet. +func (ts BuilderTestSpec) ExecutePostFork( + t *hivesim.T, + ctx context.Context, + testnet *tn.Testnet, + env *tn.Environment, + config *tn.Config, +) { + // Run the base test spec execute function + ts.BaseTestSpec.ExecutePostFork(t, ctx, testnet, env, config) + + // Check that the builder was working properly until now + if !ts.DenebGenesis { + for i, b := range testnet.BeaconClients().Running() { + builder, ok := b.Builder.(*mock_builder.MockBuilder) + if !ok { + t.Fatalf( + "FAIL: client %d (%s) is not a mock builder", + i, + b.ClientName(), + ) + } + if builder.GetBuiltPayloadsCount() == 0 { + t.Fatalf("FAIL: builder %d did not build any payloads", i) + } + if builder.GetSignedBeaconBlockCount() == 0 { + t.Fatalf( + "FAIL: builder %d did not produce any signed beacon blocks", + i, + ) + } + } + } +} + +func (ts BuilderTestSpec) BuilderProducesValidPayload() bool { + // If true, the builder is expected to produce a valid payload that should + // be included in the canonical chain. + if ts.ErrorOnHeaderRequest || ts.InvalidPayloadVersion || + ts.ErrorOnPayloadReveal || ts.InvalidatePayload != "" || + ts.InvalidatePayloadAttributes != "" { + return false + } + return true +} + +func (ts BuilderTestSpec) CausesMissedSlot() bool { + // If true, the test is expected to cause a missed slot. + if ts.ErrorOnHeaderRequest || ts.InvalidPayloadVersion { + // An error on header request to the builder should fallback to local block production, + // hence no missed slot. + return false + } + if ts.ErrorOnPayloadReveal { + // An error on payload reveal means that, since the mock builder does _not_ relay unblinded + // payloads to the p2p network, the consensus client will not be able to produce a block + // for the slot, and hence a missed slot is expected. + return true + } + if ts.InvalidatePayloadAttributes == "" && ts.InvalidatePayload == "" { + // If no payload is invalidated, then no missed slot is expected. + return false + } + if ts.InvalidatePayload != "" { + // An invalid payload cannot be detected by the consensus client until the payload is + // revealed, and the beacon block had been signed. Therefore there will be missed slots. + return true + } + if ts.InvalidatePayloadAttributes == mock_builder.INVALIDATE_ATTR_BEACON_ROOT { + // Invalid Beacon Root is special because the modified value is not in the response, + // and hence can only be detected by the consensus client after the payload is + // revealed and executed. + return true + } + // The rest of payload attributes invalidations can be detected by the consensus client + return false +} + +func (ts BuilderTestSpec) Verify( + t *hivesim.T, + ctx context.Context, + testnet *tn.Testnet, + env *tn.Environment, + config *tn.Config, +) { + // Run the base test spec verify function + ts.BaseTestSpec.Verify(t, ctx, testnet, env, config) + + // Verify any modified payloads did not make it into the + // canonical chain + if !ts.ErrorOnHeaderRequest && !ts.ErrorOnPayloadReveal && + !ts.InvalidPayloadVersion && + ts.InvalidatePayload == "" && + ts.InvalidatePayloadAttributes == "" { + // Simply verify that builder's deneb payloads were included in the + // canonical chain + t.Logf("INFO: Verifying builder payloads were included in the canonical chain") + for i, n := range testnet.Nodes.Running() { + b, ok := n.BeaconClient.Builder.(*mock_builder.MockBuilder) + if !ok { + t.Fatalf( + "FAIL: client %d (%s) is not a mock builder", + i, + n.BeaconClient.ClientName(), + ) + } + ec := n.ExecutionClient + includedPayloads := 0 + includedPayloadsWithBlobs := 0 + for _, p := range b.GetBuiltPayloads() { + p, _, err := p.FullPayload().ToExecutableData() + if err != nil { + t.Fatalf( + "FAIL: error converting payload to executable data: %v", + err, + ) + } + if testnet.ExecutionGenesis().Config.CancunTime == nil { + t.Fatalf("FAIL: Cancun time is nil") + } + if p.Timestamp >= *testnet.ExecutionGenesis().Config.CancunTime { + if h, err := ec.HeaderByNumber(ctx, big.NewInt(int64(p.Number))); err != nil { + t.Fatalf( + "FAIL: error getting execution header from node %d: %v", + i, + err, + ) + } else if h != nil { + hash := h.Hash() + if bytes.Equal(hash[:], p.BlockHash[:]) { + includedPayloads++ + // On deneb we also need to make sure at least one payload has blobs + if p.BlobGasUsed != nil && *p.BlobGasUsed > 0 { + includedPayloadsWithBlobs++ + } + } + } + } + } + if includedPayloads == 0 { + t.Fatalf( + "FAIL: builder %d did not produce deneb payloads included in the canonical chain", + i, + ) + } + if includedPayloadsWithBlobs == 0 { + t.Fatalf( + "FAIL: builder %d did not produce deneb payloads with blobs included in the canonical chain", + i, + ) + } + } + } else { + // TODO: INVALIDATE_ATTR_BEACON_ROOT cannot be detected by the consensus client + // on a blinded payload + t.Logf("INFO: Verifying builder payloads were NOT included in the canonical chain") + for i, n := range testnet.VerificationNodes().Running() { + b, ok := n.BeaconClient.Builder.(*mock_builder.MockBuilder) + if !ok { + t.Fatalf( + "FAIL: client %d (%s) is not a mock builder", + i, + n.BeaconClient.ClientName(), + ) + } + builtPayloads := b.GetBuiltPayloads() + if len(builtPayloads) == 0 { + if ts.ErrorOnHeaderRequest { + continue + } + t.Fatalf("FAIL: No payloads were modified by builder %d", i) + } + for s, p := range builtPayloads { + if s >= beacon.Slot( + config.DenebForkEpoch.Uint64(), + )*testnet.Spec().SLOTS_PER_EPOCH { + payload, _, err := p.FullPayload().ToExecutableData() + if err != nil { + t.Fatalf( + "FAIL: error converting payload to executable data: %v", + err, + ) + } + for i, ec := range testnet.ExecutionClients().Running() { + b, err := ec.BlockByNumber( + ctx, + new(big.Int).SetUint64(payload.Number), + ) + if err == nil { + // If block is found, verify that this is different from the modified payload + h := b.Hash() + if bytes.Equal(h[:], payload.BlockHash[:]) { + t.Fatalf( + "FAIL: node %d: modified payload included in canonical chain: %d (%s)", + i, + payload.Number, + payload.BlockHash, + ) + } + } // else: block not found, payload not included in canonical chain + } + } + } + t.Logf( + "INFO: No modified payloads were included in canonical chain of node %d", + i, + ) + } + } + + // Count, print and verify missed slots + if ts.VerifyMissedSlotsCount { + if count, err := testnet.BeaconClients().Running()[0].GetFilledSlotsCountPerEpoch(ctx); err != nil { + t.Fatalf("FAIL: unable to obtain slot count per epoch: %v", err) + } else { + for ep, slots := range count { + t.Logf("INFO: Epoch %d, filled slots=%d", ep, slots) + } + + var max_missed_slots uint64 = 0 + if !ts.CausesMissedSlot() { + // These errors should be caught by the CL client when the built blinded + // payload is received. Hence, a low number of missed slots is expected. + max_missed_slots = MAX_MISSED_SLOTS_NO_CIRCUIT_BREAKER + } else { + // All other errors cannot be caught by the CL client until the + // payload is revealed, and the beacon block had been signed. + // Hence, a high number of missed slots is expected because the + // circuit breaker is a mechanism that only kicks in after many + // missed slots. + max_missed_slots = MAX_MISSED_SLOTS_BEFORE_CIRCUIT_BREAKER + } + + denebEpoch := beacon.Epoch(config.DenebForkEpoch.Uint64()) + + if count[denebEpoch] < uint64(testnet.Spec().SLOTS_PER_EPOCH)-max_missed_slots { + t.Fatalf( + "FAIL: Epoch %d should have at least %d filled slots, but has %d", + denebEpoch, + uint64(testnet.Spec().SLOTS_PER_EPOCH)-max_missed_slots, + count[denebEpoch], + ) + } + + } + } + + // Verify all submited blinded beacon blocks have correct signatures + for i, n := range testnet.Nodes.Running() { + b, ok := n.BeaconClient.Builder.(*mock_builder.MockBuilder) + if !ok { + t.Fatalf( + "FAIL: client %d (%s) is not a mock builder", + i, + n.BeaconClient.ClientName(), + ) + } + + if b.GetValidationErrorsCount() > 0 { + // Validation errors should never happen, this means the submited blinded + // beacon response received from the consensus client was incorrect. + validationErrorsMap := b.GetValidationErrors() + for slot, validationError := range validationErrorsMap { + signedBeaconResponse, ok := b.GetSignedBeaconBlock(slot) + if ok { + signedBeaconResponseJson, _ := json.MarshalIndent(signedBeaconResponse, "", " ") + t.Logf( + "INFO: builder %d encountered a validation error on slot %d: %v\n%s", + i, + slot, + validationError, + signedBeaconResponseJson, + ) + } + t.Fatalf( + "FAIL: builder %d encountered a validation error on slot %d: %v", + i, + slot, + validationError, + ) + } + } + } + t.Logf( + "INFO: Validated all signatures of beacon blocks received by builders", + ) +} diff --git a/simulators/eth2/dencun/suites/builder/tests.go b/simulators/eth2/dencun/suites/builder/tests.go new file mode 100644 index 0000000000..e0c1e87497 --- /dev/null +++ b/simulators/eth2/dencun/suites/builder/tests.go @@ -0,0 +1,126 @@ +package suite_builder + +import ( + "strings" + + "github.com/ethereum/hive/hivesim" + "github.com/ethereum/hive/simulators/eth2/common/clients" + "github.com/ethereum/hive/simulators/eth2/dencun/suites" + suite_base "github.com/ethereum/hive/simulators/eth2/dencun/suites/base" + "github.com/lithammer/dedent" + mock_builder "github.com/marioevz/mock-builder/mock" +) + +var testSuite = hivesim.Suite{ + Name: "eth2-deneb-builder", + DisplayName: "Deneb Builder", + Description: ` + Collection of test vectors that use a ExecutionClient+BeaconNode+ValidatorClient testnet and builder API for Cancun+Deneb. + `, + Location: "suites/builder", +} + +var Tests = make([]suites.TestSpec, 0) + +func init() { + Tests = append(Tests, + BuilderTestSpec{ + BaseTestSpec: suite_base.BaseTestSpec{ + Name: "test-builders-sanity", + DisplayName: "Deneb Builder Workflow From Capella Transition", + Description: ` + Test canonical chain includes deneb payloads built by the builder api.`, + // All validators start with BLS withdrawal credentials + GenesisExecutionWithdrawalCredentialsShares: 0, + WaitForBlobs: true, + }, + }, + BuilderTestSpec{ + BaseTestSpec: suite_base.BaseTestSpec{ + Name: "test-builders-invalid-payload-attributes-beacon-root", + DisplayName: "Deneb Builder Builds Block With Invalid Beacon Root, Correct State Root", + Description: ` + Test canonical chain can still finalize if the builders start + building payloads with invalid parent beacon block root.`, + // All validators can withdraw from the start + GenesisExecutionWithdrawalCredentialsShares: 1, + WaitForBlobs: true, + }, + InvalidatePayloadAttributes: mock_builder.INVALIDATE_ATTR_BEACON_ROOT, + }, + BuilderTestSpec{ + BaseTestSpec: suite_base.BaseTestSpec{ + Name: "test-builders-error-on-deneb-header-request", + DisplayName: "Deneb Builder Errors Out on Header Requests After Deneb Transition", + Description: ` + Test canonical chain can still finalize if the builders start + returning error on header request after deneb transition.`, + // All validators can withdraw from the start + GenesisExecutionWithdrawalCredentialsShares: 1, + WaitForBlobs: true, + }, + ErrorOnHeaderRequest: true, + }, + BuilderTestSpec{ + BaseTestSpec: suite_base.BaseTestSpec{ + Name: "test-builders-error-on-deneb-unblind-payload-request", + DisplayName: "Deneb Builder Errors Out on Signed Blinded Beacon Block/Blob Sidecars Submission After Deneb Transition", + Description: ` + Test canonical chain can still finalize if the builders start + returning error on unblinded payload request after deneb transition.`, + // All validators can withdraw from the start + GenesisExecutionWithdrawalCredentialsShares: 1, + WaitForBlobs: true, + }, + ErrorOnPayloadReveal: true, + }, + BuilderTestSpec{ + BaseTestSpec: suite_base.BaseTestSpec{ + Name: "test-builders-invalid-payload-version", + DisplayName: "Deneb Builder Builds Block With Invalid Payload Version", + Description: ` + Test consensus clients correctly reject a built payload if the + version is outdated (capella instead of deneb).`, + // All validators can withdraw from the start + GenesisExecutionWithdrawalCredentialsShares: 1, + WaitForBlobs: true, + }, + InvalidPayloadVersion: true, + }, + BuilderTestSpec{ + BaseTestSpec: suite_base.BaseTestSpec{ + Name: "test-builders-invalid-payload-beacon-root", + DisplayName: "Deneb Builder Builds Block With Invalid Beacon Root, Incorrect State Root", + Description: ` + Test consensus clients correctly circuit break builder after a + period of empty blocks due to invalid unblinded blocks. + + The payloads are built using an invalid parent beacon block root, which can only + be caught after unblinding the entire payload and running it in the + local execution client, at which point another payload cannot be + produced locally and results in an empty slot.`, + // All validators can withdraw from the start + GenesisExecutionWithdrawalCredentialsShares: 1, + WaitForBlobs: true, + }, + InvalidatePayload: mock_builder.INVALIDATE_PAYLOAD_BEACON_ROOT, + }, + ) + + // Add clients that require finalization to the description of the suite + sb := strings.Builder{} + sb.WriteString(dedent.Dedent(testSuite.Description)) + sb.WriteString("\n\n") + sb.WriteString("### Clients that require finalization to enable builder\n") + for _, client := range REQUIRES_FINALIZATION_TO_ACTIVATE_BUILDER { + sb.WriteString("- ") + sb.WriteString(strings.Title(client)) + sb.WriteString("\n") + } + testSuite.Description = sb.String() +} + +func Suite(c *clients.ClientDefinitionsByRole) hivesim.Suite { + suites.SuiteHydrate(&testSuite, c, Tests) + return testSuite +} diff --git a/simulators/eth2/dencun/suites/p2p/gossip/blobs/TESTS.md b/simulators/eth2/dencun/suites/p2p/gossip/blobs/TESTS.md new file mode 100644 index 0000000000..e30700922a --- /dev/null +++ b/simulators/eth2/dencun/suites/p2p/gossip/blobs/TESTS.md @@ -0,0 +1,463 @@ +# Deneb P2P Blobs Gossip - Test Cases + +Collection of test vectors that verify client behavior under different blob gossiping scenarios. + +## Run Suite + +
    +Command-line + +```bash +./hive --client --sim eth2/dencun --sim.limit "eth2-deneb-p2p-blobs-gossip/" +``` + +
    + +## Test Cases + +### - Blob Gossiping Sanity + +#### Run + +
    +Command-line + +```bash +./hive --client --sim eth2/dencun --sim.limit "eth2-deneb-p2p-blobs-gossip/blob-gossiping-sanity-" +``` + +
    + +#### Description + + +Sanity test where the blobber is verified to be working correctly + + +#### Testnet Configuration + + +- Node Count: 2 +- Validating Node Count: 2 +- Validator Key Count: 128 +- Validator Key per Node: 64- Genesis Fork: Deneb +- Execution Withdrawal Credentials Count: 128 +- BLS Withdrawal Credentials Count: 0 + +#### Verifications (Execution Client) + + +- Blob (type-3) transactions are included in the blocks + +#### Verifications (Consensus Client) + + +- For each blob transaction on the execution chain, the blob sidecars are available for the beacon block at the same height +- The beacon block lists the correct commitments for each blob + +#### Blobber Behavior + + +- Sign the block +- Generate the blob sidecars using signed header +- Broadcast the block +- Broadcast the blob sidecars + +### - Blob Gossiping Before Block + +#### Run + +
    +Command-line + +```bash +./hive --client --sim eth2/dencun --sim.limit "eth2-deneb-p2p-blobs-gossip/blob-gossiping-before-block-" +``` + +
    + +#### Description + + +Test chain health where the blobs are gossiped before the block + + +#### Testnet Configuration + + +- Node Count: 2 +- Validating Node Count: 2 +- Validator Key Count: 128 +- Validator Key per Node: 64- Genesis Fork: Deneb +- Execution Withdrawal Credentials Count: 128 +- BLS Withdrawal Credentials Count: 0 + +#### Verifications (Execution Client) + + +- Blob (type-3) transactions are included in the blocks + +#### Verifications (Consensus Client) + + +- For each blob transaction on the execution chain, the blob sidecars are available for the beacon block at the same height +- The beacon block lists the correct commitments for each blob + +#### Blobber Behavior + + +- Sign the block +- Generate the blob sidecars using signed header +- Broadcast the blob sidecars +- Broadcast the block + +### - Blob Gossiping Delay + +#### Run + +
    +Command-line + +```bash +./hive --client --sim eth2/dencun --sim.limit "eth2-deneb-p2p-blobs-gossip/blob-gossiping-delay-" +``` + +
    + +#### Description + + +Test chain health where the blobs are gossiped after the block with a 500ms delay + + +#### Testnet Configuration + + +- Node Count: 2 +- Validating Node Count: 2 +- Validator Key Count: 128 +- Validator Key per Node: 64- Genesis Fork: Deneb +- Execution Withdrawal Credentials Count: 128 +- BLS Withdrawal Credentials Count: 0 + +#### Verifications (Execution Client) + + +- Blob (type-3) transactions are included in the blocks + +#### Verifications (Consensus Client) + + +- For each blob transaction on the execution chain, the blob sidecars are available for the beacon block at the same height +- The beacon block lists the correct commitments for each blob + +#### Blobber Behavior + + +- Sign the block +- Generate the blob sidecars using signed header +- Broadcast the block +- Insert a delay of 500 milliseconds +- Broadcast the blob sidecars + +### - Blob Gossiping One-Slot Delay + +#### Run + +
    +Command-line + +```bash +./hive --client --sim eth2/dencun --sim.limit "eth2-deneb-p2p-blobs-gossip/blob-gossiping-one-slot-delay-" +``` + +
    + +#### Description + + +Test chain health where the blobs are gossiped after the block with a 6s delay + + +#### Testnet Configuration + + +- Node Count: 2 +- Validating Node Count: 2 +- Validator Key Count: 128 +- Validator Key per Node: 64- Genesis Fork: Deneb +- Execution Withdrawal Credentials Count: 128 +- BLS Withdrawal Credentials Count: 0 + +#### Verifications (Execution Client) + + +- Blob (type-3) transactions are included in the blocks + +#### Verifications (Consensus Client) + + +- For each blob transaction on the execution chain, the blob sidecars are available for the beacon block at the same height +- The beacon block lists the correct commitments for each blob + +#### Blobber Behavior + + +- Sign the block +- Generate the blob sidecars using signed header +- Broadcast the block +- Insert a delay of 6000 milliseconds +- Broadcast the blob sidecars + +### - Invalid Equivocating Block + +#### Run + +
    +Command-line + +```bash +./hive --client --sim eth2/dencun --sim.limit "eth2-deneb-p2p-blobs-gossip/invalid-equivocating-block-" +``` + +
    + +#### Description + + +Test chain health if a proposer sends an invalid equivocating block and the correct block +at the same time to different peers. + +Blob sidecars contain the correct block header. + +Slot action is executed every other slot because, although it does not cause a missed slot, +clients might reject the p2p block message due to it being a slashable offense, so this +delay makes the test more deterministic. + + +#### Testnet Configuration + + +- Node Count: 2 +- Validating Node Count: 2 +- Validator Key Count: 128 +- Validator Key per Node: 64- Genesis Fork: Deneb +- Execution Withdrawal Credentials Count: 128 +- BLS Withdrawal Credentials Count: 0 + +#### Verifications (Execution Client) + + +- Blob (type-3) transactions are included in the blocks + +#### Verifications (Consensus Client) + + +- For each blob transaction on the execution chain, the blob sidecars are available for the beacon block at the same height +- The beacon block lists the correct commitments for each blob + +#### Blobber Behavior + + +- Create an invalid equivocating block by modifying the graffiti +- Sign both blocks +- Generate the sidecars out of the correct block only +- Broadcast the blob sidecars +- Broadcast the equivocating signed block and the correct signed block to different peers + +### - Equivocating Block and Blobs + +#### Run + +
    +Command-line + +```bash +./hive --client --sim eth2/dencun --sim.limit "eth2-deneb-p2p-blobs-gossip/equivocating-block-and-blobs-" +``` + +
    + +#### Description + + +Test chain health if a proposer sends equivocating blobs and block to different peers + + +#### Testnet Configuration + + +- Node Count: 2 +- Validating Node Count: 2 +- Validator Key Count: 128 +- Validator Key per Node: 64- Genesis Fork: Deneb +- Execution Withdrawal Credentials Count: 128 +- BLS Withdrawal Credentials Count: 0 + +#### Verifications (Execution Client) + + +- Blob (type-3) transactions are included in the blocks + +#### Verifications (Consensus Client) + + +- For each blob transaction on the execution chain, the blob sidecars are available for the beacon block at the same height +- The beacon block lists the correct commitments for each blob + +#### Blobber Behavior + + +- Create an equivocating block by modifying the graffiti +- Sign both blocks +- Generate blob sidecars for both blocks +- Broadcast the blob sidecars for both blocks to different peers +- Broadcast the signed blocks to different peers + +### - Equivocating Block Header in Blob Sidecars + +#### Run + +
    +Command-line + +```bash +./hive --client --sim eth2/dencun --sim.limit "eth2-deneb-p2p-blobs-gossip/equivocating-block-header-in-blob-sidecars-" +``` + +
    + +#### Description + + +Test chain health if a proposer sends equivocating blob sidecars (equivocating block header), but the correct full block is sent first. + + +#### Testnet Configuration + + +- Node Count: 2 +- Validating Node Count: 2 +- Validator Key Count: 128 +- Validator Key per Node: 64- Genesis Fork: Deneb +- Execution Withdrawal Credentials Count: 128 +- BLS Withdrawal Credentials Count: 0 + +#### Verifications (Execution Client) + + +- Blob (type-3) transactions are included in the blocks + +#### Verifications (Consensus Client) + + +- For each blob transaction on the execution chain, the blob sidecars are available for the beacon block at the same height +- The beacon block lists the correct commitments for each blob + +#### Blobber Behavior + + +- Create an invalid equivocating block by modifying the graffiti +- Sign both blocks +- Generate the sidecars out of the equivocating signed block only +- Broadcast the original signed block only +- Broadcast the blob sidecars with the equivocating block header + +### - Equivocating Block Header in Blob Sidecars 2 + +#### Run + +
    +Command-line + +```bash +./hive --client --sim eth2/dencun --sim.limit "eth2-deneb-p2p-blobs-gossip/equivocating-block-header-in-blob-sidecars-2-" +``` + +
    + +#### Description + + +Test chain health if a proposer sends equivocating blob sidecars (equivocating block header), and the correct full block is sent afterwards. + + +#### Testnet Configuration + + +- Node Count: 2 +- Validating Node Count: 2 +- Validator Key Count: 128 +- Validator Key per Node: 64- Genesis Fork: Deneb +- Execution Withdrawal Credentials Count: 128 +- BLS Withdrawal Credentials Count: 0 + +#### Verifications (Execution Client) + + +- Blob (type-3) transactions are included in the blocks + +#### Verifications (Consensus Client) + + +- For each blob transaction on the execution chain, the blob sidecars are available for the beacon block at the same height +- The beacon block lists the correct commitments for each blob + +#### Blobber Behavior + + +- Create an invalid equivocating block by modifying the graffiti +- Sign both blocks +- Generate the sidecars out of the equivocating signed block only +- Broadcast the blob sidecars with the equivocating block header +- Broadcast the original signed block only + +### - Equivocating Blob Sidecars + +#### Run + +
    +Command-line + +```bash +./hive --client --sim eth2/dencun --sim.limit "eth2-deneb-p2p-blobs-gossip/equivocating-blobs-" +``` + +
    + +#### Description + + +Test chain health if a proposer sends equivocating blob sidecars (equivocating block header) to a set of peers, and the correct blob sidecars to another set of peers. The correct block is sent to all peers afterwards. + + +#### Testnet Configuration + + +- Node Count: 2 +- Validating Node Count: 2 +- Validator Key Count: 128 +- Validator Key per Node: 64- Genesis Fork: Deneb +- Execution Withdrawal Credentials Count: 128 +- BLS Withdrawal Credentials Count: 0 + +#### Verifications (Execution Client) + + +- Blob (type-3) transactions are included in the blocks + +#### Verifications (Consensus Client) + + +- For each blob transaction on the execution chain, the blob sidecars are available for the beacon block at the same height +- The beacon block lists the correct commitments for each blob + +#### Blobber Behavior + + +- Create an equivocating block by modifying the graffiti +- Sign both blocks +- Generate blob sidecar bundles out of both signed blocks +- Broadcast both blob sidecar bundles to different peers +- Broadcast the original signed block only + diff --git a/simulators/eth2/dencun/suites/p2p/gossip/blobs/config.go b/simulators/eth2/dencun/suites/p2p/gossip/blobs/config.go new file mode 100644 index 0000000000..71b8fb91dc --- /dev/null +++ b/simulators/eth2/dencun/suites/p2p/gossip/blobs/config.go @@ -0,0 +1,79 @@ +package suite_blobs_gossip + +import ( + "context" + + "github.com/ethereum/hive/hivesim" + "github.com/ethereum/hive/simulators/eth2/common/clients" + tn "github.com/ethereum/hive/simulators/eth2/common/testnet" + "github.com/ethereum/hive/simulators/eth2/common/utils" + suite_base "github.com/ethereum/hive/simulators/eth2/dencun/suites/base" + blobber_config "github.com/marioevz/blobber/config" + blobber_proposal_actions "github.com/marioevz/blobber/proposal_actions" + beacon "github.com/protolambda/zrnt/eth2/beacon/common" +) + +type P2PBlobsGossipTestSpec struct { + suite_base.BaseTestSpec + + BlobberProposalAction blobber_proposal_actions.ProposalAction + BlobberActionCausesMissedSlot bool + + MaxMissedSlots beacon.Slot +} + +const ( + WAIT_EPOCHS_AFTER_FORK = 1 + MAX_MISSED_SLOTS = 3 +) + +func (ts P2PBlobsGossipTestSpec) GetDescription() *utils.Description { + desc := ts.BaseTestSpec.GetDescription() + + // Print the base test spec description plus the blobber action description + desc.Add("Blobber Behavior", ts.BlobberProposalAction.Description()) + return desc +} + +func (ts P2PBlobsGossipTestSpec) GetMaxMissedSlots() beacon.Slot { + if ts.MaxMissedSlots > 0 { + return ts.MaxMissedSlots + } + return MAX_MISSED_SLOTS +} + +func (ts P2PBlobsGossipTestSpec) GetTestnetConfig( + allNodeDefinitions clients.NodeDefinitions, +) *tn.Config { + config := ts.BaseTestSpec.GetTestnetConfig(allNodeDefinitions) + + config.EnableBlobber = true + if ts.BlobberActionCausesMissedSlot { + // Since we are missing slots due to the blobber action, we need to execute it every 2 slots to guarantee the chain doesn't stall + ts.BlobberProposalAction.SetFrequency(2) + } + config.BlobberOptions = []blobber_config.Option{ + blobber_config.WithProposalAction(ts.BlobberProposalAction), + blobber_config.WithAlwaysErrorValidatorResponse(), + blobber_config.WithMaxDevP2PSessionReuses(0), // Always reuse the same peer id + } + + config.DisablePeerScoring = true + + return config +} + +func (ts P2PBlobsGossipTestSpec) ExecutePostForkWait(t *hivesim.T, + ctx context.Context, + testnet *tn.Testnet, + env *tn.Environment, + config *tn.Config, +) { + // By default all blobber tests simply wait an epoch with a max amount of missed slots to check that the chain doesn't stall + epochsAfterFork := WAIT_EPOCHS_AFTER_FORK + maxMissedSlots := ts.GetMaxMissedSlots() + + if err := testnet.WaitSlotsWithMaxMissedSlots(ctx, beacon.Slot(epochsAfterFork)*testnet.Spec().SLOTS_PER_EPOCH, maxMissedSlots); err != nil { + t.Fatalf("FAIL: error waiting for %d epochs after fork: %v", beacon.Slot(epochsAfterFork), err) + } +} diff --git a/simulators/eth2/dencun/suites/p2p/gossip/blobs/execution.go b/simulators/eth2/dencun/suites/p2p/gossip/blobs/execution.go new file mode 100644 index 0000000000..1b2d7ad96f --- /dev/null +++ b/simulators/eth2/dencun/suites/p2p/gossip/blobs/execution.go @@ -0,0 +1,68 @@ +package suite_blobs_gossip + +import ( + "bytes" + "context" + + "github.com/ethereum/hive/hivesim" + + tn "github.com/ethereum/hive/simulators/eth2/common/testnet" + blobber_common "github.com/marioevz/blobber/common" + "github.com/protolambda/eth2api" + "github.com/protolambda/zrnt/eth2/beacon/common" +) + +func KZGListContains(list common.KZGCommitments, kzg common.KZGCommitment) bool { + for _, l := range list { + if bytes.Equal(kzg[:], l[:]) { + return true + } + } + return false +} + +func (ts P2PBlobsGossipTestSpec) Verify( + t *hivesim.T, + ctx context.Context, + testnet *tn.Testnet, + env *tn.Environment, + config *tn.Config, +) { + // Do base verifications + ts.BaseTestSpec.Verify(t, ctx, testnet, env, config) + + // Check that the blobber produced something + if len(testnet.Blobber().GetProducedBlockRoots()) == 0 { + t.Fatalf("FAIL: Blobber did not produce any blocks") + } + + // Check the must-include/reject blobs, and make sure that the must-include blobs are in the chain whereas the must-reject blobs are not + mustIncludeBlobs := testnet.Blobber().IncludeBlobRecord() + mustRejectBlobs := testnet.Blobber().RejectBlobRecord() + allSlots := blobber_common.GetAllSlots(mustIncludeBlobs, mustRejectBlobs) + + for _, slot := range allSlots { + for i, bn := range testnet.BeaconClients().Running() { + versionedBlock, err := bn.BlockV2(ctx, eth2api.BlockIdSlot(slot)) + if err != nil { + continue + } + blockKzgCommitments := versionedBlock.KZGCommitments() + + // Check that the must-include blobs are in the chain + for _, includeKzg := range mustIncludeBlobs.Get(slot) { + if !KZGListContains(blockKzgCommitments, includeKzg) { + t.Fatalf("FAIL: Good blob missing from the chain: node=%d, slot=%d, kzg_commitment=%s", i, slot, includeKzg) + } + } + + // Check that the must-reject blobs are not in the chain + for _, rejectKzg := range mustRejectBlobs.Get(slot) { + if KZGListContains(blockKzgCommitments, rejectKzg) { + t.Fatalf("FAIL: Bad blob in the chain: node=%d, slot=%d, kzg_commitment=%s", i, slot, rejectKzg) + } + } + + } + } +} diff --git a/simulators/eth2/dencun/suites/p2p/gossip/blobs/tests.go b/simulators/eth2/dencun/suites/p2p/gossip/blobs/tests.go new file mode 100644 index 0000000000..107e0cb5c6 --- /dev/null +++ b/simulators/eth2/dencun/suites/p2p/gossip/blobs/tests.go @@ -0,0 +1,200 @@ +package suite_blobs_gossip + +import ( + "github.com/ethereum/hive/hivesim" + "github.com/ethereum/hive/simulators/eth2/common/clients" + "github.com/ethereum/hive/simulators/eth2/dencun/suites" + suite_base "github.com/ethereum/hive/simulators/eth2/dencun/suites/base" + bpa "github.com/marioevz/blobber/proposal_actions" +) + +var testSuite = hivesim.Suite{ + Name: "eth2-deneb-p2p-blobs-gossip", + DisplayName: "Deneb P2P Blobs Gossip", + Description: `Collection of test vectors that verify client behavior under different blob gossiping scenarios.`, + Location: "suites/p2p/gossip/blobs", +} + +var Tests = make([]suites.TestSpec, 0) + +func init() { + Tests = append(Tests, + P2PBlobsGossipTestSpec{ + BlobberProposalAction: bpa.ConfigureProposalAction(bpa.Default{}, nil), + BaseTestSpec: suite_base.BaseTestSpec{ + Name: "blob-gossiping-sanity", + DisplayName: "Blob Gossiping Sanity", + Description: ` + Sanity test where the blobber is verified to be working correctly + `, + DenebGenesis: true, + GenesisExecutionWithdrawalCredentialsShares: 1, + }, + }, + P2PBlobsGossipTestSpec{ + BlobberProposalAction: bpa.ConfigureProposalAction( + bpa.Default{ + BroadcastBlobsFirst: true, + }, + nil), + BaseTestSpec: suite_base.BaseTestSpec{ + Name: "blob-gossiping-before-block", + DisplayName: "Blob Gossiping Before Block", + Description: ` + Test chain health where the blobs are gossiped before the block + `, + DenebGenesis: true, + GenesisExecutionWithdrawalCredentialsShares: 1, + }, + }, + P2PBlobsGossipTestSpec{ + BlobberProposalAction: bpa.ConfigureProposalAction( + bpa.BlobGossipDelay{ + DelayMilliseconds: 500, + }, nil), + BaseTestSpec: suite_base.BaseTestSpec{ + Name: "blob-gossiping-delay", + DisplayName: "Blob Gossiping Delay", + Description: ` + Test chain health where the blobs are gossiped after the block with a 500ms delay + `, + DenebGenesis: true, + GenesisExecutionWithdrawalCredentialsShares: 1, + }, + }, + P2PBlobsGossipTestSpec{ + BlobberProposalAction: bpa.ConfigureProposalAction( + bpa.BlobGossipDelay{ + DelayMilliseconds: 6000, + }, + nil), + BaseTestSpec: suite_base.BaseTestSpec{ + Name: "blob-gossiping-one-slot-delay", + DisplayName: "Blob Gossiping One-Slot Delay", + Description: ` + Test chain health where the blobs are gossiped after the block with a 6s delay + `, + DenebGenesis: true, + GenesisExecutionWithdrawalCredentialsShares: 1, + }, + // A slot might be missed due to blobs arriving late + BlobberActionCausesMissedSlot: true, + }, + P2PBlobsGossipTestSpec{ + BlobberProposalAction: bpa.ConfigureProposalAction( + bpa.InvalidEquivocatingBlock{}, + nil, + ), + BaseTestSpec: suite_base.BaseTestSpec{ + Name: "invalid-equivocating-block", + DisplayName: "Invalid Equivocating Block", + Description: ` + Test chain health if a proposer sends an invalid equivocating block and the correct block + at the same time to different peers. + + Blob sidecars contain the correct block header. + + Slot action is executed every other slot because, although it does not cause a missed slot, + clients might reject the p2p block message due to it being a slashable offense, so this + delay makes the test more deterministic. + `, + DenebGenesis: true, + GenesisExecutionWithdrawalCredentialsShares: 1, + }, + // Action does not cause a missed slot but clients do reject the p2p block message + // due to it being a slashable offense, so this delay makes the test more deterministic. + BlobberActionCausesMissedSlot: true, + }, + P2PBlobsGossipTestSpec{ + BlobberProposalAction: bpa.ConfigureProposalAction( + bpa.InvalidEquivocatingBlockAndBlobs{ + BroadcastBlobsFirst: true, + }, + &bpa.ProposalActionConfig{ + MaxExecTimes: 1, // Only one execution and then disable + }, + ), + BaseTestSpec: suite_base.BaseTestSpec{ + Name: "equivocating-block-and-blobs", + DisplayName: "Equivocating Block and Blobs", + Description: ` + Test chain health if a proposer sends equivocating blobs and block to different peers + `, + DenebGenesis: true, + GenesisExecutionWithdrawalCredentialsShares: 1, + }, + // A slot might be missed due to re-orgs + BlobberActionCausesMissedSlot: true, + }, + + P2PBlobsGossipTestSpec{ + BlobberProposalAction: bpa.ConfigureProposalAction( + bpa.EquivocatingBlockHeaderInBlobs{ + BroadcastBlobsFirst: false, + }, + &bpa.ProposalActionConfig{ + MaxExecTimes: 1, // Only one execution and then disable + }, + ), + BaseTestSpec: suite_base.BaseTestSpec{ + Name: "equivocating-block-header-in-blob-sidecars", + DisplayName: "Equivocating Block Header in Blob Sidecars", + Description: ` + Test chain health if a proposer sends equivocating blob sidecars (equivocating block header), but the correct full block is sent first. + `, + DenebGenesis: true, + GenesisExecutionWithdrawalCredentialsShares: 1, + }, + // Slot is missed because the blob with the correct header are never sent + BlobberActionCausesMissedSlot: true, + }, + + P2PBlobsGossipTestSpec{ + BlobberProposalAction: bpa.ConfigureProposalAction( + bpa.EquivocatingBlockHeaderInBlobs{ + BroadcastBlobsFirst: true, + }, + &bpa.ProposalActionConfig{ + MaxExecTimes: 1, // Only one execution and then disable + }, + ), + BaseTestSpec: suite_base.BaseTestSpec{ + Name: "equivocating-block-header-in-blob-sidecars-2", + DisplayName: "Equivocating Block Header in Blob Sidecars 2", + Description: ` + Test chain health if a proposer sends equivocating blob sidecars (equivocating block header), and the correct full block is sent afterwards. + `, + DenebGenesis: true, + GenesisExecutionWithdrawalCredentialsShares: 1, + }, + // Slot is missed because the blob with the correct header are never sent + BlobberActionCausesMissedSlot: true, + }, + + P2PBlobsGossipTestSpec{ + BlobberProposalAction: bpa.ConfigureProposalAction( + bpa.EquivocatingBlobSidecars{ + BroadcastBlobsFirst: true, + }, + &bpa.ProposalActionConfig{ + MaxExecTimes: 1, // Only one execution and then disable + }, + ), + BaseTestSpec: suite_base.BaseTestSpec{ + Name: "equivocating-blobs", + DisplayName: "Equivocating Blob Sidecars", + Description: ` + Test chain health if a proposer sends equivocating blob sidecars (equivocating block header) to a set of peers, and the correct blob sidecars to another set of peers. The correct block is sent to all peers afterwards. + `, + DenebGenesis: true, + GenesisExecutionWithdrawalCredentialsShares: 1, + }, + BlobberActionCausesMissedSlot: false, + }, + ) +} + +func Suite(c *clients.ClientDefinitionsByRole) hivesim.Suite { + suites.SuiteHydrate(&testSuite, c, Tests) + return testSuite +} diff --git a/simulators/eth2/dencun/suites/reorg/TESTS.md b/simulators/eth2/dencun/suites/reorg/TESTS.md new file mode 100644 index 0000000000..ed37ef6301 --- /dev/null +++ b/simulators/eth2/dencun/suites/reorg/TESTS.md @@ -0,0 +1,99 @@ +# Deneb Reorg - Test Cases + +Collection of test vectors that use a ExecutionClient+BeaconNode+ValidatorClient testnet for Cancun+Deneb and test re-orgs of the beacon chain. + +## Run Suite + +
    +Command-line + +```bash +./hive --client --sim eth2/dencun --sim.limit "eth2-deneb-reorg/" +``` + +
    + +## Test Cases + +### - test-reorg-from-capella- + +#### Run + +
    +Command-line + +```bash +./hive --client --sim eth2/dencun --sim.limit "eth2-deneb-reorg/test-reorg-from-capella-" +``` + +
    + +#### Description + + +Test re-org of the beacon chain by a third non-validating client, re-org from capella. +Start two clients disconnected from each other, then connect them through a third client and check that they re-org. + + +#### Testnet Configuration + + +- Node Count: 5 +- Validating Node Count: 5 +- Validator Key Count: 128 +- Validator Key per Node: 25- Genesis Fork: Capella +- Execution Withdrawal Credentials Count: 0 +- BLS Withdrawal Credentials Count: 128 + +#### Verifications (Execution Client) + + +- Blob (type-3) transactions are included in the blocks + +#### Verifications (Consensus Client) + + +- For each blob transaction on the execution chain, the blob sidecars are available for the beacon block at the same height +- The beacon block lists the correct commitments for each blob + +### - test-reorg-from-deneb- + +#### Run + +
    +Command-line + +```bash +./hive --client --sim eth2/dencun --sim.limit "eth2-deneb-reorg/test-reorg-from-deneb-" +``` + +
    + +#### Description + + +Test re-org of the beacon chain by a third non-validating client, re-org from deneb. +Start two clients disconnected from each other, then connect them through a third client and check that they re-org. + + +#### Testnet Configuration + + +- Node Count: 5 +- Validating Node Count: 5 +- Validator Key Count: 128 +- Validator Key per Node: 25- Genesis Fork: Deneb +- Execution Withdrawal Credentials Count: 0 +- BLS Withdrawal Credentials Count: 128 + +#### Verifications (Execution Client) + + +- Blob (type-3) transactions are included in the blocks + +#### Verifications (Consensus Client) + + +- For each blob transaction on the execution chain, the blob sidecars are available for the beacon block at the same height +- The beacon block lists the correct commitments for each blob + diff --git a/simulators/eth2/dencun/suites/reorg/config.go b/simulators/eth2/dencun/suites/reorg/config.go new file mode 100644 index 0000000000..d304803816 --- /dev/null +++ b/simulators/eth2/dencun/suites/reorg/config.go @@ -0,0 +1,51 @@ +package suite_reorg + +import ( + "fmt" + + "github.com/ethereum/hive/simulators/eth2/common/clients" + "github.com/ethereum/hive/simulators/eth2/common/testnet" + suite_base "github.com/ethereum/hive/simulators/eth2/dencun/suites/base" +) + +type ReorgTestSpec struct { + suite_base.BaseTestSpec + + // Array of weights for each chain, the last client re-orgs to the chain with the highest weight. + // The length of the array also determines the number of chains to generate. + ChainWeights []uint64 +} + +func (ts ReorgTestSpec) GetTestnetConfig( + allNodeDefinitions clients.NodeDefinitions, +) *testnet.Config { + // By default the last client does not validate and must sync to the other clients + if ts.BaseTestSpec.ValidatingNodeCount == 0 { + ts.BaseTestSpec.ValidatingNodeCount = ts.BaseTestSpec.NodeCount - 1 + } + + chains := ts.ChainWeights + if len(chains) == 0 { + chains = []uint64{1, 1} + } + + if ts.NodeCount < (len(chains) + 1) { + panic(fmt.Errorf("need at least %d nodes to generate %d different chains", len(chains)+1, len(chains))) + } + + tc := ts.BaseTestSpec.GetTestnetConfig(allNodeDefinitions) + + for i := 0; i < len(tc.NodeDefinitions); i++ { + if i == len(tc.NodeDefinitions)-1 { + // The last node is the one that re-orgs all other nodes + tc.NodeDefinitions[i].DisableStartup = true + } else { + // Other clients are disconnected from each other to form different chains + tc.NodeDefinitions[i].ConsensusSubnet = fmt.Sprintf("%d", i%len(chains)) + tc.NodeDefinitions[i].ExecutionSubnet = fmt.Sprintf("%d", i%len(chains)) + tc.NodeDefinitions[i].ValidatorShares = chains[i%len(chains)] + } + } + + return tc +} diff --git a/simulators/eth2/dencun/suites/reorg/execution.go b/simulators/eth2/dencun/suites/reorg/execution.go new file mode 100644 index 0000000000..f2653e90ff --- /dev/null +++ b/simulators/eth2/dencun/suites/reorg/execution.go @@ -0,0 +1,39 @@ +package suite_reorg + +import ( + "context" + + "github.com/ethereum/hive/hivesim" + tn "github.com/ethereum/hive/simulators/eth2/common/testnet" +) + +// Re-org testnet. +func (ts ReorgTestSpec) Verify( + t *hivesim.T, + ctx context.Context, + testnet *tn.Testnet, + env *tn.Environment, + config *tn.Config, +) { + t.Logf("INFO: Starting secondary clients") + // Start the other clients + for _, n := range testnet.Nodes { + if !n.IsRunning() { + if err := n.Start(); err != nil { + t.Fatalf("FAIL: error starting node %s: %v", n.ClientNames(), err) + } + } + } + + // Wait for all other clients to sync with a timeout of 1 epoch + syncCtx, cancel := testnet.Spec().EpochTimeoutContext(ctx, 1) + defer cancel() + if h, err := testnet.WaitForSync(syncCtx); err != nil { + t.Fatalf("FAIL: error waiting for canonincal chain: %v", err) + } else { + t.Logf("INFO: all clients synced at head %s", h) + } + + // Run the base test spec verifications + ts.BaseTestSpec.Verify(t, ctx, testnet, env, config) +} diff --git a/simulators/eth2/dencun/suites/reorg/tests.go b/simulators/eth2/dencun/suites/reorg/tests.go new file mode 100644 index 0000000000..db6dd184af --- /dev/null +++ b/simulators/eth2/dencun/suites/reorg/tests.go @@ -0,0 +1,60 @@ +package suite_reorg + +import ( + "github.com/ethereum/hive/hivesim" + "github.com/ethereum/hive/simulators/eth2/common/clients" + "github.com/ethereum/hive/simulators/eth2/dencun/suites" + suite_base "github.com/ethereum/hive/simulators/eth2/dencun/suites/base" +) + +var testSuite = hivesim.Suite{ + Name: "eth2-deneb-reorg", + DisplayName: "Deneb Reorg", + Description: `Collection of test vectors that use a ExecutionClient+BeaconNode+ValidatorClient testnet for Cancun+Deneb and test re-orgs of the beacon chain.`, + Location: "suites/reorg", +} + +var Tests = make([]suites.TestSpec, 0) + +func init() { + Tests = append(Tests, + ReorgTestSpec{ + BaseTestSpec: suite_base.BaseTestSpec{ + Name: "test-reorg-from-capella", + Description: ` + Test re-org of the beacon chain by a third non-validating client, re-org from capella. + Start two clients disconnected from each other, then connect them through a third client and check that they re-org. + `, + NodeCount: 5, + // Wait for 1 epoch after the fork to start the last client + EpochsAfterFork: 1, + // All validators start with BLS withdrawal credentials + GenesisExecutionWithdrawalCredentialsShares: 0, + }, + // Chain A has 66% of the validators, chain B has 33% of the validators + ChainWeights: []uint64{2, 1}, + }, + ReorgTestSpec{ + BaseTestSpec: suite_base.BaseTestSpec{ + Name: "test-reorg-from-deneb", + Description: ` + Test re-org of the beacon chain by a third non-validating client, re-org from deneb. + Start two clients disconnected from each other, then connect them through a third client and check that they re-org. + `, + NodeCount: 5, + // Wait for 1 epoch after the fork to start the last client + EpochsAfterFork: 1, + // All validators start with BLS withdrawal credentials + GenesisExecutionWithdrawalCredentialsShares: 0, + DenebGenesis: true, + }, + // Chain A has 66% of the validators, chain B has 33% of the validators + ChainWeights: []uint64{2, 1}, + }, + ) +} + +func Suite(c *clients.ClientDefinitionsByRole) hivesim.Suite { + suites.SuiteHydrate(&testSuite, c, Tests) + return testSuite +} diff --git a/simulators/eth2/dencun/suites/spec.go b/simulators/eth2/dencun/suites/spec.go new file mode 100644 index 0000000000..98b605152d --- /dev/null +++ b/simulators/eth2/dencun/suites/spec.go @@ -0,0 +1,86 @@ +package suites + +import ( + "context" + "fmt" + "strings" + + "github.com/ethereum/hive/hivesim" + "github.com/ethereum/hive/simulators/eth2/common/clients" + consensus_config "github.com/ethereum/hive/simulators/eth2/common/config/consensus" + "github.com/ethereum/hive/simulators/eth2/common/testnet" + "github.com/ethereum/hive/simulators/eth2/common/utils" +) + +var Deneb string = "deneb" + +type TestSpec interface { + GetName() string + GetTestnetConfig(clients.NodeDefinitions) *testnet.Config + GetDisplayName() string + GetDescription() *utils.Description + ExecutePreFork(*hivesim.T, context.Context, *testnet.Testnet, *testnet.Environment, *testnet.Config) + WaitForFork(*hivesim.T, context.Context, *testnet.Testnet, *testnet.Environment, *testnet.Config) + ExecutePostFork(*hivesim.T, context.Context, *testnet.Testnet, *testnet.Environment, *testnet.Config) + ExecutePostForkWait(*hivesim.T, context.Context, *testnet.Testnet, *testnet.Environment, *testnet.Config) + Verify(*hivesim.T, context.Context, *testnet.Testnet, *testnet.Environment, *testnet.Config) + GetValidatorKeys(string) consensus_config.ValidatorsSetupDetails +} + +// Add all tests to the suite +func SuiteHydrate( + suite *hivesim.Suite, + c *clients.ClientDefinitionsByRole, + tests []TestSpec, +) { + mnemonic := "couple kiwi radio river setup fortune hunt grief buddy forward perfect empty slim wear bounce drift execute nation tobacco dutch chapter festival ice fog" + + clientCombinations := c.Combinations() + for _, test := range tests { + test := test + suite.Add(hivesim.TestSpec{ + Name: fmt.Sprintf( + "%s-%s", + test.GetName(), + strings.Join(clientCombinations.ClientTypes(), "-"), + ), + DisplayName: test.GetDisplayName(), + Description: test.GetDescription().Format(), + Run: func(t *hivesim.T) { + t.Logf("Starting test: %s", test.GetName()) + defer t.Logf("Finished test: %s", test.GetName()) + keys := test.GetValidatorKeys(mnemonic) + env := &testnet.Environment{ + Clients: c, + Validators: keys, + } + config := test.GetTestnetConfig(clientCombinations) + + // Create the testnet + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + testnet := testnet.StartTestnet(ctx, t, env, config) + if testnet == nil { + t.Fatalf("failed to start testnet") + } + defer testnet.Stop() + + // Execute pre-fork + test.ExecutePreFork(t, ctx, testnet, env, config) + + // Wait for the fork + test.WaitForFork(t, ctx, testnet, env, config) + + // Execute post-fork + test.ExecutePostFork(t, ctx, testnet, env, config) + + // Execute post-fork wait + test.ExecutePostForkWait(t, ctx, testnet, env, config) + + // Verify + test.Verify(t, ctx, testnet, env, config) + }, + }, + ) + } +} diff --git a/simulators/eth2/dencun/suites/sync/TESTS.md b/simulators/eth2/dencun/suites/sync/TESTS.md new file mode 100644 index 0000000000..84a3193441 --- /dev/null +++ b/simulators/eth2/dencun/suites/sync/TESTS.md @@ -0,0 +1,122 @@ +# Deneb Sync - Test Cases + +Collection of test vectors that use a ExecutionClient+BeaconNode+ValidatorClient testnet for Cancun+Deneb and test syncing of the beacon chain. + +## Run Suite + +
    +Command-line + +```bash +./hive --client --sim eth2/dencun --sim.limit "eth2-deneb-sync/" +``` + +
    + +## Test Cases + +### - Sync From Capella Transition + +#### Run + +
    +Command-line + +```bash +./hive --client --sim eth2/dencun --sim.limit "eth2-deneb-sync/test-sync-from-capella-" +``` + +
    + +#### Description + + +Test syncing of the beacon chain by a secondary non-validating client, sync from capella. + +- Start two validating nodes that begin on Capella/Shanghai genesis +- Deneb/Cancun transition occurs on Epoch 1 +- Total of 128 Validators, 64 for each validating node +- Wait for Deneb fork and start sending blob transactions to the Execution client +- Wait one more epoch for the chain to progress and include blobs +- Start a third client with the first two validating nodes as bootnodes +- Wait for the third client to reach the head of the canonical chain +- Verify on the consensus client on the synced client that: + - For each blob transaction on the execution chain, the blob sidecars are available for the + beacon block at the same height + - The beacon block lists the correct commitments for each blob + - The blob sidecars and kzg commitments match on each block for the synced client + + +#### Testnet Configuration + + +- Node Count: 3 +- Validating Node Count: 2 +- Validator Key Count: 128 +- Validator Key per Node: 64- Genesis Fork: Capella +- Execution Withdrawal Credentials Count: 0 +- BLS Withdrawal Credentials Count: 128 + +#### Verifications (Execution Client) + + +- Blob (type-3) transactions are included in the blocks + +#### Verifications (Consensus Client) + + +- For each blob transaction on the execution chain, the blob sidecars are available for the beacon block at the same height +- The beacon block lists the correct commitments for each blob + +### - Sync From Deneb Genesis + +#### Run + +
    +Command-line + +```bash +./hive --client --sim eth2/dencun --sim.limit "eth2-deneb-sync/test-sync-from-deneb-" +``` + +
    + +#### Description + + +Test syncing of the beacon chain by a secondary non-validating client, sync from deneb. + +- Start two validating nodes that begin on Deneb genesis +- Total of 128 Validators, 64 for each validating node +- Start sending blob transactions to the Execution client +- Wait one epoch for the chain to progress and include blobs +- Start a third client with the first two validating nodes as bootnodes +- Wait for the third client to reach the head of the canonical chain +- Verify on the consensus client on the synced client that: + - For each blob transaction on the execution chain, the blob sidecars are available for the + beacon block at the same height + - The beacon block lists the correct commitments for each blob + - The blob sidecars and kzg commitments match on each block for the synced client + + +#### Testnet Configuration + + +- Node Count: 3 +- Validating Node Count: 2 +- Validator Key Count: 128 +- Validator Key per Node: 64- Genesis Fork: Deneb +- Execution Withdrawal Credentials Count: 0 +- BLS Withdrawal Credentials Count: 128 + +#### Verifications (Execution Client) + + +- Blob (type-3) transactions are included in the blocks + +#### Verifications (Consensus Client) + + +- For each blob transaction on the execution chain, the blob sidecars are available for the beacon block at the same height +- The beacon block lists the correct commitments for each blob + diff --git a/simulators/eth2/dencun/suites/sync/config.go b/simulators/eth2/dencun/suites/sync/config.go new file mode 100644 index 0000000000..a44cae6a45 --- /dev/null +++ b/simulators/eth2/dencun/suites/sync/config.go @@ -0,0 +1,22 @@ +package suite_sync + +import ( + "github.com/ethereum/hive/simulators/eth2/common/clients" + "github.com/ethereum/hive/simulators/eth2/common/testnet" + suite_base "github.com/ethereum/hive/simulators/eth2/dencun/suites/base" +) + +type SyncTestSpec struct { + suite_base.BaseTestSpec +} + +func (ts SyncTestSpec) GetTestnetConfig( + allNodeDefinitions clients.NodeDefinitions, +) *testnet.Config { + tc := ts.BaseTestSpec.GetTestnetConfig(allNodeDefinitions) + + // We disable the start of the last node + tc.NodeDefinitions[len(tc.NodeDefinitions)-1].DisableStartup = true + + return tc +} diff --git a/simulators/eth2/dencun/suites/sync/execution.go b/simulators/eth2/dencun/suites/sync/execution.go new file mode 100644 index 0000000000..aeb3e4490f --- /dev/null +++ b/simulators/eth2/dencun/suites/sync/execution.go @@ -0,0 +1,39 @@ +package suite_sync + +import ( + "context" + + "github.com/ethereum/hive/hivesim" + tn "github.com/ethereum/hive/simulators/eth2/common/testnet" +) + +// Re-org testnet. +func (ts SyncTestSpec) Verify( + t *hivesim.T, + ctx context.Context, + testnet *tn.Testnet, + env *tn.Environment, + config *tn.Config, +) { + t.Logf("INFO: Starting secondary clients") + // Start the other clients + for _, n := range testnet.Nodes { + if !n.IsRunning() { + if err := n.Start(); err != nil { + t.Fatalf("FAIL: error starting node %s: %v", n.ClientNames(), err) + } + } + } + + // Wait for all other clients to sync with a timeout of 1 epoch + syncCtx, cancel := testnet.Spec().EpochTimeoutContext(ctx, 1) + defer cancel() + if h, err := testnet.WaitForSync(syncCtx); err != nil { + t.Fatalf("FAIL: error waiting for sync: %v", err) + } else { + t.Logf("INFO: all clients synced at head %s", h) + } + + // Run the base test spec verifications + ts.BaseTestSpec.Verify(t, ctx, testnet, env, config) +} diff --git a/simulators/eth2/dencun/suites/sync/tests.go b/simulators/eth2/dencun/suites/sync/tests.go new file mode 100644 index 0000000000..a286fccf86 --- /dev/null +++ b/simulators/eth2/dencun/suites/sync/tests.go @@ -0,0 +1,83 @@ +package suite_sync + +import ( + "github.com/ethereum/hive/hivesim" + "github.com/ethereum/hive/simulators/eth2/common/clients" + "github.com/ethereum/hive/simulators/eth2/dencun/suites" + suite_base "github.com/ethereum/hive/simulators/eth2/dencun/suites/base" +) + +var testSuite = hivesim.Suite{ + Name: "eth2-deneb-sync", + DisplayName: "Deneb Sync", + Description: `Collection of test vectors that use a ExecutionClient+BeaconNode+ValidatorClient testnet for Cancun+Deneb and test syncing of the beacon chain.`, + Location: "suites/sync", +} + +var Tests = make([]suites.TestSpec, 0) + +func init() { + Tests = append(Tests, + SyncTestSpec{ + BaseTestSpec: suite_base.BaseTestSpec{ + Name: "test-sync-from-capella", + DisplayName: "Sync From Capella Transition", + Description: ` + Test syncing of the beacon chain by a secondary non-validating client, sync from capella. + + - Start two validating nodes that begin on Capella/Shanghai genesis + - Deneb/Cancun transition occurs on Epoch 1 + - Total of 128 Validators, 64 for each validating node + - Wait for Deneb fork and start sending blob transactions to the Execution client + - Wait one more epoch for the chain to progress and include blobs + - Start a third client with the first two validating nodes as bootnodes + - Wait for the third client to reach the head of the canonical chain + - Verify on the consensus client on the synced client that: + - For each blob transaction on the execution chain, the blob sidecars are available for the + beacon block at the same height + - The beacon block lists the correct commitments for each blob + - The blob sidecars and kzg commitments match on each block for the synced client + `, + NodeCount: 3, + ValidatingNodeCount: 2, + // Wait for 1 epoch after the fork to start the syncing client + EpochsAfterFork: 1, + // All validators start with BLS withdrawal credentials + GenesisExecutionWithdrawalCredentialsShares: 0, + }, + }, + SyncTestSpec{ + BaseTestSpec: suite_base.BaseTestSpec{ + Name: "test-sync-from-deneb", + DisplayName: "Sync From Deneb Genesis", + Description: ` + Test syncing of the beacon chain by a secondary non-validating client, sync from deneb. + + - Start two validating nodes that begin on Deneb genesis + - Total of 128 Validators, 64 for each validating node + - Start sending blob transactions to the Execution client + - Wait one epoch for the chain to progress and include blobs + - Start a third client with the first two validating nodes as bootnodes + - Wait for the third client to reach the head of the canonical chain + - Verify on the consensus client on the synced client that: + - For each blob transaction on the execution chain, the blob sidecars are available for the + beacon block at the same height + - The beacon block lists the correct commitments for each blob + - The blob sidecars and kzg commitments match on each block for the synced client + `, + NodeCount: 3, + ValidatingNodeCount: 2, + // Wait for 1 epoch after the fork to start the syncing client + EpochsAfterFork: 1, + // All validators start with BLS withdrawal credentials + GenesisExecutionWithdrawalCredentialsShares: 0, + DenebGenesis: true, + }, + }, + ) +} + +func Suite(c *clients.ClientDefinitionsByRole) hivesim.Suite { + suites.SuiteHydrate(&testSuite, c, Tests) + return testSuite +} diff --git a/simulators/eth2/go.work b/simulators/eth2/go.work index e7295a1dba..eda1a95dc3 100644 --- a/simulators/eth2/go.work +++ b/simulators/eth2/go.work @@ -1,7 +1,10 @@ -go 1.18 +go 1.21 + +toolchain go1.22.0 use ( ./common + ./dencun ./engine ./testnet ./withdrawals diff --git a/simulators/eth2/go.work.sum b/simulators/eth2/go.work.sum index a5d4d9c1f7..60e14391d6 100644 --- a/simulators/eth2/go.work.sum +++ b/simulators/eth2/go.work.sum @@ -1,61 +1,330 @@ bazil.org/fuse v0.0.0-20160811212531-371fbbdaa898/go.mod h1:Xbm+BRKSBEpa4q4hTSxohYNQpsxXPbPry4JJWOB3LB8= cloud.google.com/go v0.0.0-20170206221025-ce650573d812/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= +cloud.google.com/go v0.16.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.43.0/go.mod h1:BOSR3VbTLkk6FDC/TcffxP4NF/FFBGA5ku+jvKOP7pg= -cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= -cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= -cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= -cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= +cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= cloud.google.com/go v0.51.0/go.mod h1:hWtGJ6gnXH+KgDv+V0zFGDvpi07n3z8ZNj3T1RW0Gcw= -cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= -cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= -cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= -cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= -cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= -cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= +cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= +cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= +cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= +cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= +cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= +cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= +cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= +cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= +cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= +cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= +cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= +cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= +cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= +cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= +cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= +cloud.google.com/go v0.102.0/go.mod h1:oWcCzKlqJ5zgHQt9YsaeTY9KzIvjyy0ArmiBUgpQ+nc= +cloud.google.com/go v0.104.0/go.mod h1:OO6xxXdJyvuJPcEPBLN9BJPD+jep5G1+2U5B5gkRYtA= +cloud.google.com/go v0.105.0/go.mod h1:PrLgOJNe5nfE9UMxKxgXj4mD3voiP+YQ6gdt6KMFOKM= +cloud.google.com/go v0.107.0/go.mod h1:wpc2eNrD7hXUTy8EKS10jkxpZBjASrORK7goS+3YX2I= +cloud.google.com/go v0.110.0/go.mod h1:SJnCLqQ0FCFGSZMUNUf84MV3Aia54kn7pi8st7tMzaY= +cloud.google.com/go v0.110.2/go.mod h1:k04UEeEtb6ZBRTv3dZz4CeJC3jKGxyhl0sAiVVquxiw= +cloud.google.com/go/accessapproval v1.5.0/go.mod h1:HFy3tuiGvMdcd/u+Cu5b9NkO1pEICJ46IR82PoUdplw= +cloud.google.com/go/accessapproval v1.6.0/go.mod h1:R0EiYnwV5fsRFiKZkPHr6mwyk2wxUJ30nL4j2pcFY2E= +cloud.google.com/go/accesscontextmanager v1.4.0/go.mod h1:/Kjh7BBu/Gh83sv+K60vN9QE5NJcd80sU33vIe2IFPE= +cloud.google.com/go/accesscontextmanager v1.7.0/go.mod h1:CEGLewx8dwa33aDAZQujl7Dx+uYhS0eay198wB/VumQ= +cloud.google.com/go/aiplatform v1.27.0/go.mod h1:Bvxqtl40l0WImSb04d0hXFU7gDOiq9jQmorivIiWcKg= +cloud.google.com/go/aiplatform v1.37.0/go.mod h1:IU2Cv29Lv9oCn/9LkFiiuKfwrRTq+QQMbW+hPCxJGZw= +cloud.google.com/go/analytics v0.12.0/go.mod h1:gkfj9h6XRf9+TS4bmuhPEShsh3hH8PAZzm/41OOhQd4= +cloud.google.com/go/analytics v0.19.0/go.mod h1:k8liqf5/HCnOUkbawNtrWWc+UAzyDlW89doe8TtoDsE= +cloud.google.com/go/apigateway v1.4.0/go.mod h1:pHVY9MKGaH9PQ3pJ4YLzoj6U5FUDeDFBllIz7WmzJoc= +cloud.google.com/go/apigateway v1.5.0/go.mod h1:GpnZR3Q4rR7LVu5951qfXPJCHquZt02jf7xQx7kpqN8= +cloud.google.com/go/apigeeconnect v1.4.0/go.mod h1:kV4NwOKqjvt2JYR0AoIWo2QGfoRtn/pkS3QlHp0Ni04= +cloud.google.com/go/apigeeconnect v1.5.0/go.mod h1:KFaCqvBRU6idyhSNyn3vlHXc8VMDJdRmwDF6JyFRqZ8= +cloud.google.com/go/apigeeregistry v0.6.0/go.mod h1:BFNzW7yQVLZ3yj0TKcwzb8n25CFBri51GVGOEUcgQsc= +cloud.google.com/go/apikeys v0.6.0/go.mod h1:kbpXu5upyiAlGkKrJgQl8A0rKNNJ7dQ377pdroRSSi8= +cloud.google.com/go/appengine v1.5.0/go.mod h1:TfasSozdkFI0zeoxW3PTBLiNqRmzraodCWatWI9Dmak= +cloud.google.com/go/appengine v1.7.1/go.mod h1:IHLToyb/3fKutRysUlFO0BPt5j7RiQ45nrzEJmKTo6E= +cloud.google.com/go/area120 v0.6.0/go.mod h1:39yFJqWVgm0UZqWTOdqkLhjoC7uFfgXRC8g/ZegeAh0= +cloud.google.com/go/area120 v0.7.1/go.mod h1:j84i4E1RboTWjKtZVWXPqvK5VHQFJRF2c1Nm69pWm9k= +cloud.google.com/go/artifactregistry v1.9.0/go.mod h1:2K2RqvA2CYvAeARHRkLDhMDJ3OXy26h3XW+3/Jh2uYc= +cloud.google.com/go/artifactregistry v1.13.0/go.mod h1:uy/LNfoOIivepGhooAUpL1i30Hgee3Cu0l4VTWHUC08= +cloud.google.com/go/asset v1.10.0/go.mod h1:pLz7uokL80qKhzKr4xXGvBQXnzHn5evJAEAtZiIb0wY= +cloud.google.com/go/asset v1.13.0/go.mod h1:WQAMyYek/b7NBpYq/K4KJWcRqzoalEsxz/t/dTk4THw= +cloud.google.com/go/assuredworkloads v1.9.0/go.mod h1:kFuI1P78bplYtT77Tb1hi0FMxM0vVpRC7VVoJC3ZoT0= +cloud.google.com/go/assuredworkloads v1.10.0/go.mod h1:kwdUQuXcedVdsIaKgKTp9t0UJkE5+PAVNhdQm4ZVq2E= +cloud.google.com/go/automl v1.8.0/go.mod h1:xWx7G/aPEe/NP+qzYXktoBSDfjO+vnKMGgsApGJJquM= +cloud.google.com/go/automl v1.12.0/go.mod h1:tWDcHDp86aMIuHmyvjuKeeHEGq76lD7ZqfGLN6B0NuU= +cloud.google.com/go/baremetalsolution v0.4.0/go.mod h1:BymplhAadOO/eBa7KewQ0Ppg4A4Wplbn+PsFKRLo0uI= +cloud.google.com/go/baremetalsolution v0.5.0/go.mod h1:dXGxEkmR9BMwxhzBhV0AioD0ULBmuLZI8CdwalUxuss= +cloud.google.com/go/batch v0.4.0/go.mod h1:WZkHnP43R/QCGQsZ+0JyG4i79ranE2u8xvjq/9+STPE= +cloud.google.com/go/batch v0.7.0/go.mod h1:vLZN95s6teRUqRQ4s3RLDsH8PvboqBK+rn1oevL159g= +cloud.google.com/go/beyondcorp v0.3.0/go.mod h1:E5U5lcrcXMsCuoDNyGrpyTm/hn7ne941Jz2vmksAxW8= +cloud.google.com/go/beyondcorp v0.5.0/go.mod h1:uFqj9X+dSfrheVp7ssLTaRHd2EHqSL4QZmH4e8WXGGU= cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= +cloud.google.com/go/bigquery v1.44.0/go.mod h1:0Y33VqXTEsbamHJvJHdFmtqHvMIY28aK1+dFsvaChGc= +cloud.google.com/go/bigquery v1.50.0/go.mod h1:YrleYEh2pSEbgTBZYMJ5SuSr0ML3ypjRB1zgf7pvQLU= cloud.google.com/go/bigtable v1.2.0/go.mod h1:JcVAOl45lrTmQfLj7T6TxyMzIN/3FGGcFm+2xVAli2o= +cloud.google.com/go/billing v1.7.0/go.mod h1:q457N3Hbj9lYwwRbnlD7vUpyjq6u5U1RAOArInEiD5Y= +cloud.google.com/go/billing v1.13.0/go.mod h1:7kB2W9Xf98hP9Sr12KfECgfGclsH3CQR0R08tnRlRbc= +cloud.google.com/go/binaryauthorization v1.4.0/go.mod h1:tsSPQrBd77VLplV70GUhBf/Zm3FsKmgSqgm4UmiDItk= +cloud.google.com/go/binaryauthorization v1.5.0/go.mod h1:OSe4OU1nN/VswXKRBmciKpo9LulY41gch5c68htf3/Q= +cloud.google.com/go/certificatemanager v1.4.0/go.mod h1:vowpercVFyqs8ABSmrdV+GiFf2H/ch3KyudYQEMM590= +cloud.google.com/go/certificatemanager v1.6.0/go.mod h1:3Hh64rCKjRAX8dXgRAyOcY5vQ/fE1sh8o+Mdd6KPgY8= +cloud.google.com/go/channel v1.9.0/go.mod h1:jcu05W0my9Vx4mt3/rEHpfxc9eKi9XwsdDL8yBMbKUk= +cloud.google.com/go/channel v1.12.0/go.mod h1:VkxCGKASi4Cq7TbXxlaBezonAYpp1GCnKMY6tnMQnLU= +cloud.google.com/go/cloudbuild v1.4.0/go.mod h1:5Qwa40LHiOXmz3386FrjrYM93rM/hdRr7b53sySrTqA= +cloud.google.com/go/cloudbuild v1.9.0/go.mod h1:qK1d7s4QlO0VwfYn5YuClDGg2hfmLZEb4wQGAbIgL1s= +cloud.google.com/go/clouddms v1.4.0/go.mod h1:Eh7sUGCC+aKry14O1NRljhjyrr0NFC0G2cjwX0cByRk= +cloud.google.com/go/clouddms v1.5.0/go.mod h1:QSxQnhikCLUw13iAbffF2CZxAER3xDGNHjsTAkQJcQA= +cloud.google.com/go/cloudtasks v1.8.0/go.mod h1:gQXUIwCSOI4yPVK7DgTVFiiP0ZW/eQkydWzwVMdHxrI= +cloud.google.com/go/cloudtasks v1.10.0/go.mod h1:NDSoTLkZ3+vExFEWu2UJV1arUyzVDAiZtdWcsUyNwBs= +cloud.google.com/go/compute v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= +cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= +cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M= +cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz/FMzPu0s= +cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU= +cloud.google.com/go/compute v1.7.0/go.mod h1:435lt8av5oL9P3fv1OEzSbSUe+ybHXGMPQHHZWZxy9U= +cloud.google.com/go/compute v1.10.0/go.mod h1:ER5CLbMxl90o2jtNbGSbtfOpQKR0t15FOtRsugnLrlU= +cloud.google.com/go/compute v1.12.1/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU= +cloud.google.com/go/compute v1.13.0/go.mod h1:5aPTS0cUNMIc1CE546K+Th6weJUNQErARyZtRXDJ8GE= +cloud.google.com/go/compute v1.14.0/go.mod h1:YfLtxrj9sU4Yxv+sXzZkyPjEyPBZfXHUvjxega5vAdo= +cloud.google.com/go/compute v1.15.1/go.mod h1:bjjoF/NtFUrkD/urWfdHaKuOPDR5nWIs63rR+SXhcpA= +cloud.google.com/go/compute v1.18.0/go.mod h1:1X7yHxec2Ga+Ss6jPyjxRxpu2uu7PLgsOVXvgU0yacs= +cloud.google.com/go/compute v1.19.0/go.mod h1:rikpw2y+UMidAe9tISo04EHNOIf42RLYF/q8Bs93scU= +cloud.google.com/go/compute v1.19.1/go.mod h1:6ylj3a05WF8leseCdIf77NK0g1ey+nj5IKd5/kvShxE= +cloud.google.com/go/compute v1.19.3/go.mod h1:qxvISKp/gYnXkSAD1ppcSOveRAmzxicEv/JlizULFrI= +cloud.google.com/go/compute v1.20.1/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM= cloud.google.com/go/compute/metadata v0.2.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= -cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= -cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= -cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= -cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= +cloud.google.com/go/compute/metadata v0.2.1/go.mod h1:jgHgmJd2RKBGzXqF5LR2EZMGxBkeanZ9wwa75XHJgOM= +cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= +cloud.google.com/go/contactcenterinsights v1.4.0/go.mod h1:L2YzkGbPsv+vMQMCADxJoT9YiTTnSEd6fEvCeHTYVck= +cloud.google.com/go/contactcenterinsights v1.6.0/go.mod h1:IIDlT6CLcDoyv79kDv8iWxMSTZhLxSCofVV5W6YFM/w= +cloud.google.com/go/container v1.7.0/go.mod h1:Dp5AHtmothHGX3DwwIHPgq45Y8KmNsgN3amoYfxVkLo= +cloud.google.com/go/container v1.15.0/go.mod h1:ft+9S0WGjAyjDggg5S06DXj+fHJICWg8L7isCQe9pQA= +cloud.google.com/go/containeranalysis v0.6.0/go.mod h1:HEJoiEIu+lEXM+k7+qLCci0h33lX3ZqoYFdmPcoO7s4= +cloud.google.com/go/containeranalysis v0.9.0/go.mod h1:orbOANbwk5Ejoom+s+DUCTTJ7IBdBQJDcSylAx/on9s= +cloud.google.com/go/datacatalog v1.8.0/go.mod h1:KYuoVOv9BM8EYz/4eMFxrr4DUKhGIOXxZoKYF5wdISM= +cloud.google.com/go/datacatalog v1.13.0/go.mod h1:E4Rj9a5ZtAxcQJlEBTLgMTphfP11/lNaAshpoBgemX8= +cloud.google.com/go/dataflow v0.7.0/go.mod h1:PX526vb4ijFMesO1o202EaUmouZKBpjHsTlCtB4parQ= +cloud.google.com/go/dataflow v0.8.0/go.mod h1:Rcf5YgTKPtQyYz8bLYhFoIV/vP39eL7fWNcSOyFfLJE= +cloud.google.com/go/dataform v0.5.0/go.mod h1:GFUYRe8IBa2hcomWplodVmUx/iTL0FrsauObOM3Ipr0= +cloud.google.com/go/dataform v0.7.0/go.mod h1:7NulqnVozfHvWUBpMDfKMUESr+85aJsC/2O0o3jWPDE= +cloud.google.com/go/datafusion v1.5.0/go.mod h1:Kz+l1FGHB0J+4XF2fud96WMmRiq/wj8N9u007vyXZ2w= +cloud.google.com/go/datafusion v1.6.0/go.mod h1:WBsMF8F1RhSXvVM8rCV3AeyWVxcC2xY6vith3iw3S+8= +cloud.google.com/go/datalabeling v0.6.0/go.mod h1:WqdISuk/+WIGeMkpw/1q7bK/tFEZxsrFJOJdY2bXvTQ= +cloud.google.com/go/datalabeling v0.7.0/go.mod h1:WPQb1y08RJbmpM3ww0CSUAGweL0SxByuW2E+FU+wXcM= +cloud.google.com/go/dataplex v1.4.0/go.mod h1:X51GfLXEMVJ6UN47ESVqvlsRplbLhcsAt0kZCCKsU0A= +cloud.google.com/go/dataplex v1.6.0/go.mod h1:bMsomC/aEJOSpHXdFKFGQ1b0TDPIeL28nJObeO1ppRs= +cloud.google.com/go/dataproc v1.8.0/go.mod h1:5OW+zNAH0pMpw14JVrPONsxMQYMBqJuzORhIBfBn9uI= +cloud.google.com/go/dataproc v1.12.0/go.mod h1:zrF3aX0uV3ikkMz6z4uBbIKyhRITnxvr4i3IjKsKrw4= +cloud.google.com/go/dataqna v0.6.0/go.mod h1:1lqNpM7rqNLVgWBJyk5NF6Uen2PHym0jtVJonplVsDA= +cloud.google.com/go/dataqna v0.7.0/go.mod h1:Lx9OcIIeqCrw1a6KdO3/5KMP1wAmTc0slZWwP12Qq3c= +cloud.google.com/go/datastore v1.10.0/go.mod h1:PC5UzAmDEkAmkfaknstTYbNpgE49HAgW2J1gcgUfmdM= +cloud.google.com/go/datastore v1.11.0/go.mod h1:TvGxBIHCS50u8jzG+AW/ppf87v1of8nwzFNgEZU1D3c= +cloud.google.com/go/datastream v1.5.0/go.mod h1:6TZMMNPwjUqZHBKPQ1wwXpb0d5VDVPl2/XoS5yi88q4= +cloud.google.com/go/datastream v1.7.0/go.mod h1:uxVRMm2elUSPuh65IbZpzJNMbuzkcvu5CjMqVIUHrww= +cloud.google.com/go/deploy v1.5.0/go.mod h1:ffgdD0B89tToyW/U/D2eL0jN2+IEV/3EMuXHA0l4r+s= +cloud.google.com/go/deploy v1.8.0/go.mod h1:z3myEJnA/2wnB4sgjqdMfgxCA0EqC3RBTNcVPs93mtQ= +cloud.google.com/go/dialogflow v1.19.0/go.mod h1:JVmlG1TwykZDtxtTXujec4tQ+D8SBFMoosgy+6Gn0s0= +cloud.google.com/go/dialogflow v1.32.0/go.mod h1:jG9TRJl8CKrDhMEcvfcfFkkpp8ZhgPz3sBGmAUYJ2qE= +cloud.google.com/go/dlp v1.7.0/go.mod h1:68ak9vCiMBjbasxeVD17hVPxDEck+ExiHavX8kiHG+Q= +cloud.google.com/go/dlp v1.9.0/go.mod h1:qdgmqgTyReTz5/YNSSuueR8pl7hO0o9bQ39ZhtgkWp4= +cloud.google.com/go/documentai v1.10.0/go.mod h1:vod47hKQIPeCfN2QS/jULIvQTugbmdc0ZvxxfQY1bg4= +cloud.google.com/go/documentai v1.18.0/go.mod h1:F6CK6iUH8J81FehpskRmhLq/3VlwQvb7TvwOceQ2tbs= +cloud.google.com/go/domains v0.7.0/go.mod h1:PtZeqS1xjnXuRPKE/88Iru/LdfoRyEHYA9nFQf4UKpg= +cloud.google.com/go/domains v0.8.0/go.mod h1:M9i3MMDzGFXsydri9/vW+EWz9sWb4I6WyHqdlAk0idE= +cloud.google.com/go/edgecontainer v0.2.0/go.mod h1:RTmLijy+lGpQ7BXuTDa4C4ssxyXT34NIuHIgKuP4s5w= +cloud.google.com/go/edgecontainer v1.0.0/go.mod h1:cttArqZpBB2q58W/upSG++ooo6EsblxDIolxa3jSjbY= +cloud.google.com/go/errorreporting v0.3.0/go.mod h1:xsP2yaAp+OAW4OIm60An2bbLpqIhKXdWR/tawvl7QzU= +cloud.google.com/go/essentialcontacts v1.4.0/go.mod h1:8tRldvHYsmnBCHdFpvU+GL75oWiBKl80BiqlFh9tp+8= +cloud.google.com/go/essentialcontacts v1.5.0/go.mod h1:ay29Z4zODTuwliK7SnX8E86aUF2CTzdNtvv42niCX0M= +cloud.google.com/go/eventarc v1.8.0/go.mod h1:imbzxkyAU4ubfsaKYdQg04WS1NvncblHEup4kvF+4gw= +cloud.google.com/go/eventarc v1.11.0/go.mod h1:PyUjsUKPWoRBCHeOxZd/lbOOjahV41icXyUY5kSTvVY= +cloud.google.com/go/filestore v1.4.0/go.mod h1:PaG5oDfo9r224f8OYXURtAsY+Fbyq/bLYoINEK8XQAI= +cloud.google.com/go/filestore v1.6.0/go.mod h1:di5unNuss/qfZTw2U9nhFqo8/ZDSc466dre85Kydllg= +cloud.google.com/go/firestore v1.9.0/go.mod h1:HMkjKHNTtRyZNiMzu7YAsLr9K3X2udY2AMwDaMEQiiE= +cloud.google.com/go/functions v1.9.0/go.mod h1:Y+Dz8yGguzO3PpIjhLTbnqV1CWmgQ5UwtlpzoyquQ08= +cloud.google.com/go/functions v1.13.0/go.mod h1:EU4O007sQm6Ef/PwRsI8N2umygGqPBS/IZQKBQBcJ3c= +cloud.google.com/go/gaming v1.8.0/go.mod h1:xAqjS8b7jAVW0KFYeRUxngo9My3f33kFmua++Pi+ggM= +cloud.google.com/go/gaming v1.9.0/go.mod h1:Fc7kEmCObylSWLO334NcO+O9QMDyz+TKC4v1D7X+Bc0= +cloud.google.com/go/gkebackup v0.3.0/go.mod h1:n/E671i1aOQvUxT541aTkCwExO/bTer2HDlj4TsBRAo= +cloud.google.com/go/gkebackup v0.4.0/go.mod h1:byAyBGUwYGEEww7xsbnUTBHIYcOPy/PgUWUtOeRm9Vg= +cloud.google.com/go/gkeconnect v0.6.0/go.mod h1:Mln67KyU/sHJEBY8kFZ0xTeyPtzbq9StAVvEULYK16A= +cloud.google.com/go/gkeconnect v0.7.0/go.mod h1:SNfmVqPkaEi3bF/B3CNZOAYPYdg7sU+obZ+QTky2Myw= +cloud.google.com/go/gkehub v0.10.0/go.mod h1:UIPwxI0DsrpsVoWpLB0stwKCP+WFVG9+y977wO+hBH0= +cloud.google.com/go/gkehub v0.12.0/go.mod h1:djiIwwzTTBrF5NaXCGv3mf7klpEMcST17VBTVVDcuaw= +cloud.google.com/go/gkemulticloud v0.4.0/go.mod h1:E9gxVBnseLWCk24ch+P9+B2CoDFJZTyIgLKSalC7tuI= +cloud.google.com/go/gkemulticloud v0.5.0/go.mod h1:W0JDkiyi3Tqh0TJr//y19wyb1yf8llHVto2Htf2Ja3Y= +cloud.google.com/go/grafeas v0.2.0/go.mod h1:KhxgtF2hb0P191HlY5besjYm6MqTSTj3LSI+M+ByZHc= +cloud.google.com/go/gsuiteaddons v1.4.0/go.mod h1:rZK5I8hht7u7HxFQcFei0+AtfS9uSushomRlg+3ua1o= +cloud.google.com/go/gsuiteaddons v1.5.0/go.mod h1:TFCClYLd64Eaa12sFVmUyG62tk4mdIsI7pAnSXRkcFo= +cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= +cloud.google.com/go/iam v0.6.0/go.mod h1:+1AH33ueBne5MzYccyMHtEKqLE4/kJOibtffMHDMFMc= +cloud.google.com/go/iam v0.8.0/go.mod h1:lga0/y3iH6CX7sYqypWJ33hf7kkfXJag67naqGESjkE= +cloud.google.com/go/iam v0.13.0/go.mod h1:ljOg+rcNfzZ5d6f1nAUJ8ZIxOaZUVoS14bKCtaLZ/D0= +cloud.google.com/go/iap v1.5.0/go.mod h1:UH/CGgKd4KyohZL5Pt0jSKE4m3FR51qg6FKQ/z/Ix9A= +cloud.google.com/go/iap v1.7.1/go.mod h1:WapEwPc7ZxGt2jFGB/C/bm+hP0Y6NXzOYGjpPnmMS74= +cloud.google.com/go/ids v1.2.0/go.mod h1:5WXvp4n25S0rA/mQWAg1YEEBBq6/s+7ml1RDCW1IrcY= +cloud.google.com/go/ids v1.3.0/go.mod h1:JBdTYwANikFKaDP6LtW5JAi4gubs57SVNQjemdt6xV4= +cloud.google.com/go/iot v1.4.0/go.mod h1:dIDxPOn0UvNDUMD8Ger7FIaTuvMkj+aGk94RPP0iV+g= +cloud.google.com/go/iot v1.6.0/go.mod h1:IqdAsmE2cTYYNO1Fvjfzo9po179rAtJeVGUvkLN3rLE= +cloud.google.com/go/kms v1.6.0/go.mod h1:Jjy850yySiasBUDi6KFUwUv2n1+o7QZFyuUJg6OgjA0= +cloud.google.com/go/kms v1.10.1/go.mod h1:rIWk/TryCkR59GMC3YtHtXeLzd634lBbKenvyySAyYI= +cloud.google.com/go/language v1.8.0/go.mod h1:qYPVHf7SPoNNiCL2Dr0FfEFNil1qi3pQEyygwpgVKB8= +cloud.google.com/go/language v1.9.0/go.mod h1:Ns15WooPM5Ad/5no/0n81yUetis74g3zrbeJBE+ptUY= +cloud.google.com/go/lifesciences v0.6.0/go.mod h1:ddj6tSX/7BOnhxCSd3ZcETvtNr8NZ6t/iPhY2Tyfu08= +cloud.google.com/go/lifesciences v0.8.0/go.mod h1:lFxiEOMqII6XggGbOnKiyZ7IBwoIqA84ClvoezaA/bo= +cloud.google.com/go/logging v1.6.1/go.mod h1:5ZO0mHHbvm8gEmeEUHrmDlTDSu5imF6MUP9OfilNXBw= +cloud.google.com/go/logging v1.7.0/go.mod h1:3xjP2CjkM3ZkO73aj4ASA5wRPGGCRrPIAeNqVNkzY8M= +cloud.google.com/go/longrunning v0.3.0/go.mod h1:qth9Y41RRSUE69rDcOn6DdK3HfQfsUI0YSmW3iIlLJc= +cloud.google.com/go/longrunning v0.4.1/go.mod h1:4iWDqhBZ70CvZ6BfETbvam3T8FMvLK+eFj0E6AaRQTo= +cloud.google.com/go/managedidentities v1.4.0/go.mod h1:NWSBYbEMgqmbZsLIyKvxrYbtqOsxY1ZrGM+9RgDqInM= +cloud.google.com/go/managedidentities v1.5.0/go.mod h1:+dWcZ0JlUmpuxpIDfyP5pP5y0bLdRwOS4Lp7gMni/LA= +cloud.google.com/go/maps v0.1.0/go.mod h1:BQM97WGyfw9FWEmQMpZ5T6cpovXXSd1cGmFma94eubI= +cloud.google.com/go/maps v0.7.0/go.mod h1:3GnvVl3cqeSvgMcpRlQidXsPYuDGQ8naBis7MVzpXsY= +cloud.google.com/go/mediatranslation v0.6.0/go.mod h1:hHdBCTYNigsBxshbznuIMFNe5QXEowAuNmmC7h8pu5w= +cloud.google.com/go/mediatranslation v0.7.0/go.mod h1:LCnB/gZr90ONOIQLgSXagp8XUW1ODs2UmUMvcgMfI2I= +cloud.google.com/go/memcache v1.7.0/go.mod h1:ywMKfjWhNtkQTxrWxCkCFkoPjLHPW6A7WOTVI8xy3LY= +cloud.google.com/go/memcache v1.9.0/go.mod h1:8oEyzXCu+zo9RzlEaEjHl4KkgjlNDaXbCQeQWlzNFJM= +cloud.google.com/go/metastore v1.8.0/go.mod h1:zHiMc4ZUpBiM7twCIFQmJ9JMEkDSyZS9U12uf7wHqSI= +cloud.google.com/go/metastore v1.10.0/go.mod h1:fPEnH3g4JJAk+gMRnrAnoqyv2lpUCqJPWOodSaf45Eo= +cloud.google.com/go/monitoring v1.8.0/go.mod h1:E7PtoMJ1kQXWxPjB6mv2fhC5/15jInuulFdYYtlcvT4= +cloud.google.com/go/monitoring v1.13.0/go.mod h1:k2yMBAB1H9JT/QETjNkgdCGD9bPF712XiLTVr+cBrpw= +cloud.google.com/go/networkconnectivity v1.7.0/go.mod h1:RMuSbkdbPwNMQjB5HBWD5MpTBnNm39iAVpC3TmsExt8= +cloud.google.com/go/networkconnectivity v1.11.0/go.mod h1:iWmDD4QF16VCDLXUqvyspJjIEtBR/4zq5hwnY2X3scM= +cloud.google.com/go/networkmanagement v1.5.0/go.mod h1:ZnOeZ/evzUdUsnvRt792H0uYEnHQEMaz+REhhzJRcf4= +cloud.google.com/go/networkmanagement v1.6.0/go.mod h1:5pKPqyXjB/sgtvB5xqOemumoQNB7y95Q7S+4rjSOPYY= +cloud.google.com/go/networksecurity v0.6.0/go.mod h1:Q5fjhTr9WMI5mbpRYEbiexTzROf7ZbDzvzCrNl14nyU= +cloud.google.com/go/networksecurity v0.8.0/go.mod h1:B78DkqsxFG5zRSVuwYFRZ9Xz8IcQ5iECsNrPn74hKHU= +cloud.google.com/go/notebooks v1.5.0/go.mod h1:q8mwhnP9aR8Hpfnrc5iN5IBhrXUy8S2vuYs+kBJ/gu0= +cloud.google.com/go/notebooks v1.8.0/go.mod h1:Lq6dYKOYOWUCTvw5t2q1gp1lAp0zxAxRycayS0iJcqQ= +cloud.google.com/go/optimization v1.2.0/go.mod h1:Lr7SOHdRDENsh+WXVmQhQTrzdu9ybg0NecjHidBq6xs= +cloud.google.com/go/optimization v1.3.1/go.mod h1:IvUSefKiwd1a5p0RgHDbWCIbDFgKuEdB+fPPuP0IDLI= +cloud.google.com/go/orchestration v1.4.0/go.mod h1:6W5NLFWs2TlniBphAViZEVhrXRSMgUGDfW7vrWKvsBk= +cloud.google.com/go/orchestration v1.6.0/go.mod h1:M62Bevp7pkxStDfFfTuCOaXgaaqRAga1yKyoMtEoWPQ= +cloud.google.com/go/orgpolicy v1.5.0/go.mod h1:hZEc5q3wzwXJaKrsx5+Ewg0u1LxJ51nNFlext7Tanwc= +cloud.google.com/go/orgpolicy v1.10.0/go.mod h1:w1fo8b7rRqlXlIJbVhOMPrwVljyuW5mqssvBtU18ONc= +cloud.google.com/go/osconfig v1.10.0/go.mod h1:uMhCzqC5I8zfD9zDEAfvgVhDS8oIjySWh+l4WK6GnWw= +cloud.google.com/go/osconfig v1.11.0/go.mod h1:aDICxrur2ogRd9zY5ytBLV89KEgT2MKB2L/n6x1ooPw= +cloud.google.com/go/oslogin v1.7.0/go.mod h1:e04SN0xO1UNJ1M5GP0vzVBFicIe4O53FOfcixIqTyXo= +cloud.google.com/go/oslogin v1.9.0/go.mod h1:HNavntnH8nzrn8JCTT5fj18FuJLFJc4NaZJtBnQtKFs= +cloud.google.com/go/phishingprotection v0.6.0/go.mod h1:9Y3LBLgy0kDTcYET8ZH3bq/7qni15yVUoAxiFxnlSUA= +cloud.google.com/go/phishingprotection v0.7.0/go.mod h1:8qJI4QKHoda/sb/7/YmMQ2omRLSLYSu9bU0EKCNI+Lk= +cloud.google.com/go/policytroubleshooter v1.4.0/go.mod h1:DZT4BcRw3QoO8ota9xw/LKtPa8lKeCByYeKTIf/vxdE= +cloud.google.com/go/policytroubleshooter v1.6.0/go.mod h1:zYqaPTsmfvpjm5ULxAyD/lINQxJ0DDsnWOP/GZ7xzBc= +cloud.google.com/go/privatecatalog v0.6.0/go.mod h1:i/fbkZR0hLN29eEWiiwue8Pb+GforiEIBnV9yrRUOKI= +cloud.google.com/go/privatecatalog v0.8.0/go.mod h1:nQ6pfaegeDAq/Q5lrfCQzQLhubPiZhSaNhIgfJlnIXs= cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= -cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= -cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= -cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= +cloud.google.com/go/pubsub v1.27.1/go.mod h1:hQN39ymbV9geqBnfQq6Xf63yNhUAhv9CZhzp5O6qsW0= +cloud.google.com/go/pubsub v1.30.0/go.mod h1:qWi1OPS0B+b5L+Sg6Gmc9zD1Y+HaM0MdUr7LsupY1P4= +cloud.google.com/go/pubsublite v1.5.0/go.mod h1:xapqNQ1CuLfGi23Yda/9l4bBCKz/wC3KIJ5gKcxveZg= +cloud.google.com/go/pubsublite v1.7.0/go.mod h1:8hVMwRXfDfvGm3fahVbtDbiLePT3gpoiJYJY+vxWxVM= +cloud.google.com/go/recaptchaenterprise v1.3.1/go.mod h1:OdD+q+y4XGeAlxRaMn1Y7/GveP6zmq76byL6tjPE7d4= +cloud.google.com/go/recaptchaenterprise/v2 v2.5.0/go.mod h1:O8LzcHXN3rz0j+LBC91jrwI3R+1ZSZEWrfL7XHgNo9U= +cloud.google.com/go/recaptchaenterprise/v2 v2.7.0/go.mod h1:19wVj/fs5RtYtynAPJdDTb69oW0vNHYDBTbB4NvMD9c= +cloud.google.com/go/recommendationengine v0.6.0/go.mod h1:08mq2umu9oIqc7tDy8sx+MNJdLG0fUi3vaSVbztHgJ4= +cloud.google.com/go/recommendationengine v0.7.0/go.mod h1:1reUcE3GIu6MeBz/h5xZJqNLuuVjNg1lmWMPyjatzac= +cloud.google.com/go/recommender v1.8.0/go.mod h1:PkjXrTT05BFKwxaUxQmtIlrtj0kph108r02ZZQ5FE70= +cloud.google.com/go/recommender v1.9.0/go.mod h1:PnSsnZY7q+VL1uax2JWkt/UegHssxjUVVCrX52CuEmQ= +cloud.google.com/go/redis v1.10.0/go.mod h1:ThJf3mMBQtW18JzGgh41/Wld6vnDDc/F/F35UolRZPM= +cloud.google.com/go/redis v1.11.0/go.mod h1:/X6eicana+BWcUda5PpwZC48o37SiFVTFSs0fWAJ7uQ= +cloud.google.com/go/resourcemanager v1.4.0/go.mod h1:MwxuzkumyTX7/a3n37gmsT3py7LIXwrShilPh3P1tR0= +cloud.google.com/go/resourcemanager v1.7.0/go.mod h1:HlD3m6+bwhzj9XCouqmeiGuni95NTrExfhoSrkC/3EI= +cloud.google.com/go/resourcesettings v1.4.0/go.mod h1:ldiH9IJpcrlC3VSuCGvjR5of/ezRrOxFtpJoJo5SmXg= +cloud.google.com/go/resourcesettings v1.5.0/go.mod h1:+xJF7QSG6undsQDfsCJyqWXyBwUoJLhetkRMDRnIoXA= +cloud.google.com/go/retail v1.11.0/go.mod h1:MBLk1NaWPmh6iVFSz9MeKG/Psyd7TAgm6y/9L2B4x9Y= +cloud.google.com/go/retail v1.12.0/go.mod h1:UMkelN/0Z8XvKymXFbD4EhFJlYKRx1FGhQkVPU5kF14= +cloud.google.com/go/run v0.3.0/go.mod h1:TuyY1+taHxTjrD0ZFk2iAR+xyOXEA0ztb7U3UNA0zBo= +cloud.google.com/go/run v0.9.0/go.mod h1:Wwu+/vvg8Y+JUApMwEDfVfhetv30hCG4ZwDR/IXl2Qg= +cloud.google.com/go/scheduler v1.7.0/go.mod h1:jyCiBqWW956uBjjPMMuX09n3x37mtyPJegEWKxRsn44= +cloud.google.com/go/scheduler v1.9.0/go.mod h1:yexg5t+KSmqu+njTIh3b7oYPheFtBWGcbVUYF1GGMIc= +cloud.google.com/go/secretmanager v1.9.0/go.mod h1:b71qH2l1yHmWQHt9LC80akm86mX8AL6X1MA01dW8ht4= +cloud.google.com/go/secretmanager v1.10.0/go.mod h1:MfnrdvKMPNra9aZtQFvBcvRU54hbPD8/HayQdlUgJpU= +cloud.google.com/go/security v1.10.0/go.mod h1:QtOMZByJVlibUT2h9afNDWRZ1G96gVywH8T5GUSb9IA= +cloud.google.com/go/security v1.13.0/go.mod h1:Q1Nvxl1PAgmeW0y3HTt54JYIvUdtcpYKVfIB8AOMZ+0= +cloud.google.com/go/securitycenter v1.16.0/go.mod h1:Q9GMaLQFUD+5ZTabrbujNWLtSLZIZF7SAR0wWECrjdk= +cloud.google.com/go/securitycenter v1.19.0/go.mod h1:LVLmSg8ZkkyaNy4u7HCIshAngSQ8EcIRREP3xBnyfag= +cloud.google.com/go/servicecontrol v1.5.0/go.mod h1:qM0CnXHhyqKVuiZnGKrIurvVImCs8gmqWsDoqe9sU1s= +cloud.google.com/go/servicecontrol v1.11.1/go.mod h1:aSnNNlwEFBY+PWGQ2DoM0JJ/QUXqV5/ZD9DOLB7SnUk= +cloud.google.com/go/servicedirectory v1.7.0/go.mod h1:5p/U5oyvgYGYejufvxhgwjL8UVXjkuw7q5XcG10wx1U= +cloud.google.com/go/servicedirectory v1.9.0/go.mod h1:29je5JjiygNYlmsGz8k6o+OZ8vd4f//bQLtvzkPPT/s= +cloud.google.com/go/servicemanagement v1.5.0/go.mod h1:XGaCRe57kfqu4+lRxaFEAuqmjzF0r+gWHjWqKqBvKFo= +cloud.google.com/go/servicemanagement v1.8.0/go.mod h1:MSS2TDlIEQD/fzsSGfCdJItQveu9NXnUniTrq/L8LK4= +cloud.google.com/go/serviceusage v1.4.0/go.mod h1:SB4yxXSaYVuUBYUml6qklyONXNLt83U0Rb+CXyhjEeU= +cloud.google.com/go/serviceusage v1.6.0/go.mod h1:R5wwQcbOWsyuOfbP9tGdAnCAc6B9DRwPG1xtWMDeuPA= +cloud.google.com/go/shell v1.4.0/go.mod h1:HDxPzZf3GkDdhExzD/gs8Grqk+dmYcEjGShZgYa9URw= +cloud.google.com/go/shell v1.6.0/go.mod h1:oHO8QACS90luWgxP3N9iZVuEiSF84zNyLytb+qE2f9A= +cloud.google.com/go/spanner v1.41.0/go.mod h1:MLYDBJR/dY4Wt7ZaMIQ7rXOTLjYrmxLE/5ve9vFfWos= +cloud.google.com/go/spanner v1.45.0/go.mod h1:FIws5LowYz8YAE1J8fOS7DJup8ff7xJeetWEo5REA2M= +cloud.google.com/go/speech v1.9.0/go.mod h1:xQ0jTcmnRFFM2RfX/U+rk6FQNUF6DQlydUSyoooSpco= +cloud.google.com/go/speech v1.15.0/go.mod h1:y6oH7GhqCaZANH7+Oe0BhgIogsNInLlz542tg3VqeYI= cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= +cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= +cloud.google.com/go/storage v1.22.1/go.mod h1:S8N1cAStu7BOeFfE8KAQzmyyLkK8p/vmRq6kuBTW58Y= +cloud.google.com/go/storage v1.27.0/go.mod h1:x9DOL8TK/ygDUMieqwfhdpQryTeEkhGKMi80i/iqR2s= +cloud.google.com/go/storage v1.29.0/go.mod h1:4puEjyTKnku6gfKoTfNOU/W+a9JyuVNxjpS5GBrB8h4= +cloud.google.com/go/storagetransfer v1.6.0/go.mod h1:y77xm4CQV/ZhFZH75PLEXY0ROiS7Gh6pSKrM8dJyg6I= +cloud.google.com/go/storagetransfer v1.8.0/go.mod h1:JpegsHHU1eXg7lMHkvf+KE5XDJ7EQu0GwNJbbVGanEw= +cloud.google.com/go/talent v1.4.0/go.mod h1:ezFtAgVuRf8jRsvyE6EwmbTK5LKciD4KVnHuDEFmOOA= +cloud.google.com/go/talent v1.5.0/go.mod h1:G+ODMj9bsasAEJkQSzO2uHQWXHHXUomArjWQQYkqK6c= +cloud.google.com/go/texttospeech v1.5.0/go.mod h1:oKPLhR4n4ZdQqWKURdwxMy0uiTS1xU161C8W57Wkea4= +cloud.google.com/go/texttospeech v1.6.0/go.mod h1:YmwmFT8pj1aBblQOI3TfKmwibnsfvhIBzPXcW4EBovc= +cloud.google.com/go/tpu v1.4.0/go.mod h1:mjZaX8p0VBgllCzF6wcU2ovUXN9TONFLd7iz227X2Xg= +cloud.google.com/go/tpu v1.5.0/go.mod h1:8zVo1rYDFuW2l4yZVY0R0fb/v44xLh3llq7RuV61fPM= +cloud.google.com/go/trace v1.4.0/go.mod h1:UG0v8UBqzusp+z63o7FK74SdFE+AXpCLdFb1rshXG+Y= +cloud.google.com/go/trace v1.9.0/go.mod h1:lOQqpE5IaWY0Ixg7/r2SjixMuc6lfTFeO4QGM4dQWOk= +cloud.google.com/go/translate v1.4.0/go.mod h1:06Dn/ppvLD6WvA5Rhdp029IX2Mi3Mn7fpMRLPvXT5Wg= +cloud.google.com/go/translate v1.7.0/go.mod h1:lMGRudH1pu7I3n3PETiOB2507gf3HnfLV8qlkHZEyos= +cloud.google.com/go/video v1.9.0/go.mod h1:0RhNKFRF5v92f8dQt0yhaHrEuH95m068JYOvLZYnJSw= +cloud.google.com/go/video v1.15.0/go.mod h1:SkgaXwT+lIIAKqWAJfktHT/RbgjSuY6DobxEp0C5yTQ= +cloud.google.com/go/videointelligence v1.9.0/go.mod h1:29lVRMPDYHikk3v8EdPSaL8Ku+eMzDljjuvRs105XoU= +cloud.google.com/go/videointelligence v1.10.0/go.mod h1:LHZngX1liVtUhZvi2uNS0VQuOzNi2TkY1OakiuoUOjU= +cloud.google.com/go/vision v1.2.0/go.mod h1:SmNwgObm5DpFBme2xpyOyasvBc1aPdjvMk2bBk0tKD0= +cloud.google.com/go/vision/v2 v2.5.0/go.mod h1:MmaezXOOE+IWa+cS7OhRRLK2cNv1ZL98zhqFFZaaH2E= +cloud.google.com/go/vision/v2 v2.7.0/go.mod h1:H89VysHy21avemp6xcf9b9JvZHVehWbET0uT/bcuY/0= +cloud.google.com/go/vmmigration v1.3.0/go.mod h1:oGJ6ZgGPQOFdjHuocGcLqX4lc98YQ7Ygq8YQwHh9A7g= +cloud.google.com/go/vmmigration v1.6.0/go.mod h1:bopQ/g4z+8qXzichC7GW1w2MjbErL54rk3/C843CjfY= +cloud.google.com/go/vmwareengine v0.1.0/go.mod h1:RsdNEf/8UDvKllXhMz5J40XxDrNJNN4sagiox+OI208= +cloud.google.com/go/vmwareengine v0.3.0/go.mod h1:wvoyMvNWdIzxMYSpH/R7y2h5h3WFkx6d+1TIsP39WGY= +cloud.google.com/go/vpcaccess v1.5.0/go.mod h1:drmg4HLk9NkZpGfCmZ3Tz0Bwnm2+DKqViEpeEpOq0m8= +cloud.google.com/go/vpcaccess v1.6.0/go.mod h1:wX2ILaNhe7TlVa4vC5xce1bCnqE3AeH27RV31lnmZes= +cloud.google.com/go/webrisk v1.7.0/go.mod h1:mVMHgEYH0r337nmt1JyLthzMr6YxwN1aAIEc2fTcq7A= +cloud.google.com/go/webrisk v1.8.0/go.mod h1:oJPDuamzHXgUc+b8SiHRcVInZQuybnvEW72PqTc7sSg= +cloud.google.com/go/websecurityscanner v1.4.0/go.mod h1:ebit/Fp0a+FWu5j4JOmJEV8S8CzdTkAS77oDsiSqYWQ= +cloud.google.com/go/websecurityscanner v1.5.0/go.mod h1:Y6xdCPy81yi0SQnDY1xdNTNpfY1oAgXUlcfN3B3eSng= +cloud.google.com/go/workflows v1.9.0/go.mod h1:ZGkj1aFIOd9c8Gerkjjq7OW7I5+l6cSvT3ujaO/WwSA= +cloud.google.com/go/workflows v1.10.0/go.mod h1:fZ8LmRmZQWacon9UCX1r/g/DfAXx5VcPALq2CxzdePw= collectd.org v0.3.0/go.mod h1:A/8DzQBkF6abtvrT2j/AU/4tiBgJWYyh0y/oB/4MlWE= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= gioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8= +github.com/AdaLogics/go-fuzz-headers v0.0.0-20210715213245-6c3934b029d8/go.mod h1:CzsSbkDixRphAF5hS6wbMKq0eI6ccJRb7/A0M6JBnwg= +github.com/AndreasBriese/bbloom v0.0.0-20190825152654-46b345b51c96/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= github.com/Azure/azure-sdk-for-go v16.2.1+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/azure-sdk-for-go/sdk/azcore v0.21.1/go.mod h1:fBF9PQNqB8scdgpZ3ufzaLntG0AG7C1WjPMsiFOmfHM= -github.com/Azure/azure-sdk-for-go/sdk/internal v0.8.3/go.mod h1:KLF4gFr6DcKFZwSuH8w8yEK6DpFl3LP5rhdvAb7Yz5I= -github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v0.3.0/go.mod h1:tPaiy8S5bQ+S5sOiDlINkp7+Ef339+Nz5L5XO+cnOHo= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.0.0/go.mod h1:uGG2W01BaETf0Ozp+QxxKJdMBNRWPdstHG0Fmdwn1/U= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.6.0/go.mod h1:bjGvMhVMb+EEm3VRNQawDMUyMMjo+S5ewNjflkep/0Q= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.0/go.mod h1:bjGvMhVMb+EEm3VRNQawDMUyMMjo+S5ewNjflkep/0Q= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.0.0/go.mod h1:+6sju8gk8FRmSajX3Oz4G5Gm7P+mbqE9FVaXXFYTkCM= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.0/go.mod h1:OQeznEEkTZ9OrhHJoDD8ZDq51FHgXjqtP9z6bEwBq9U= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.0.0/go.mod h1:eWRD7oawr1Mu1sLCawqVc0CUiF43ia3qQMxLscsKQ9w= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0/go.mod h1:okt5dMMTOFjX/aovMlrjvvXoPMBVSPzk9185BT0+eZM= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/internal v1.0.0/go.mod h1:ceIuwmxDWptoW3eCqSXlnPsZFKh4X+R38dWPv7GS9Vs= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.0.0/go.mod h1:s1tW/At+xHqjNFvWU4G0c0Qv33KOhvbGNj0RCTQDV8s= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.2.0/go.mod h1:c+Lifp3EDEamAkPVzMooRNOK6CZjNSdEnf1A7jsI9u4= +github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.2.0/go.mod h1:+6KLcKIVgxoBDMqMO/Nvy7bZ9a0nbU3I1DtFQK3YvB4= github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= github.com/Azure/go-autorest v10.8.1+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= github.com/Azure/go-autorest/autorest v0.11.1/go.mod h1:JFgpikqFJ/MleTTxwepExTKnFUKKszPS8UavbQYUMuw= github.com/Azure/go-autorest/autorest/adal v0.9.0/go.mod h1:/c022QCutn2P7uY+/oQWWNcK9YU+MH96NgK+jErpbcg= github.com/Azure/go-autorest/autorest/adal v0.9.5/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A= -github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= github.com/Azure/go-autorest/autorest/mocks v0.4.0/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= -github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= github.com/Azure/go-autorest/logger v0.2.0/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= -github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= +github.com/AzureAD/microsoft-authentication-library-for-go v0.4.0/go.mod h1:Vt9sXTKwMyGcOxSmLDMnGPgqsUg7m8pe215qMLrDXw4= +github.com/AzureAD/microsoft-authentication-library-for-go v1.0.0/go.mod h1:kgDmCTgBzIEPFElEF+FK0SdjAor06dRq2Go927dnQ6o= github.com/BurntSushi/toml v1.2.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/CloudyKit/fastprinter v0.0.0-20170127035650-74b38d55f37a/go.mod h1:EFZQ978U7x8IRnstaskI3IysnWY5Ao3QgZUKOXlsAdw= github.com/CloudyKit/jet v2.1.3-0.20180809161101-62edd43e4f88+incompatible/go.mod h1:HPYO+50pSWkPoj9Q/eq0aRGByCL6ScRlUmiEX5Zgm+w= github.com/CloudyKit/jet/v6 v6.2.0/go.mod h1:d3ypHeIRNo2+XyqnGA8s+aphtcVpjP5hPwP/Lzo7Ro4= @@ -65,6 +334,9 @@ github.com/GoogleCloudPlatform/cloudsql-proxy v0.0.0-20190129172621-c8b1d7a94ddf github.com/HdrHistogram/hdrhistogram-go v1.1.2/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo= github.com/Joker/jade v1.0.1-0.20190614124447-d475f43051e7/go.mod h1:6E6s8o2AE4KhCrqr6GRJjdC/gNfTdxkIXvuGZZda2VM= github.com/Joker/jade v1.1.3/go.mod h1:T+2WLyt7VH6Lp0TRxQrUYEs64nRc83wkMQrfeIQKduM= +github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= +github.com/MariusVanDerWijden/FuzzyVM v0.0.0-20221202121132-bd37e8fb1d0d/go.mod h1:BSKhCg8phwi9taTm849mjagbJqs5fpFFXCc6uH4qaT4= +github.com/MariusVanDerWijden/tx-fuzz v1.0.2/go.mod h1:jrK+Lr2mr1+6Pm3LlQ6rGHgK3WRQ9VMTiX+2mPMe6ys= github.com/Microsoft/go-winio v0.4.11/go.mod h1:VhR8bwka0BXejwEJY73c50VrPtXAaKcyvVC4A4RozmA= github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= github.com/Microsoft/go-winio v0.4.15-0.20190919025122-fc70bd9a86b5/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw= @@ -85,69 +357,100 @@ github.com/Microsoft/hcsshim v0.8.21/go.mod h1:+w2gRZ5ReXQhFOrvSQeNfhrYB/dg3oDwT github.com/Microsoft/hcsshim v0.9.6/go.mod h1:7pLA8lDk46WKDWlVsENo92gC0XFa8rbKfyFRBqxEbCc= github.com/Microsoft/hcsshim/test v0.0.0-20201218223536-d3e5debf77da/go.mod h1:5hlzMzRKMLyo42nCZ9oml8AdTlq/0cvIaBv6tK1RehU= github.com/Microsoft/hcsshim/test v0.0.0-20210227013316-43a75bb4edd3/go.mod h1:mw7qgWloBUl75W/gVH3cQszUg1+gUITj7D6NY7ywVnY= -github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= +github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= +github.com/RaveNoX/go-jsoncommentstrip v1.0.0/go.mod h1:78ihd09MekBnJnxpICcwzCMzGrKSKYe4AqU6PDYYpjk= github.com/Shopify/goreferrer v0.0.0-20220729165902-8cddb4f5de06/go.mod h1:7erjKLwalezA0k99cWs5L11HWOAPNjdUZ6RxH1BXbbM= github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d/go.mod h1:HI8ITrYtUY+O+ZhtlqUnD8+KwNPOyugEhfP9fdUIaEQ= -github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= +github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= +github.com/Shopify/sarama v1.26.1/go.mod h1:NbSGBSSndYaIhRcBtY9V0U7AyH+x71bG668AuWys/yU= +github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= +github.com/StackExchange/wmi v1.2.1/go.mod h1:rcmrprowKIVzvc+NUiLncP2uuArMWLCbu9SBzvHz7e8= github.com/VictoriaMetrics/fastcache v1.6.0/go.mod h1:0qHz5QP0GMX4pfmMA/zt5RgfNuXJrTP0zS7DqpHGGTw= +github.com/VictoriaMetrics/fastcache v1.10.0/go.mod h1:tjiYeEfYXCqacuvYw/7UoDIeJaNxq6132xHICNP77w8= +github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= github.com/aclements/go-gg v0.0.0-20170118225347-6dbb4e4fefb0/go.mod h1:55qNq4vcpkIuHowELi5C8e+1yUHtoLoOUR9QU5j7Tes= github.com/aclements/go-moremath v0.0.0-20210112150236-f10218a38794/go.mod h1:7e+I0LQFUI9AXWxOfsQROs9xPhoJtbsyWcjJqDd4KPY= +github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= github.com/ajstarks/svgo v0.0.0-20210923152817-c3b6e2f0c527/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= github.com/alecthomas/kingpin/v2 v2.3.1/go.mod h1:oYL5vtsvEHZGHxU7DMp32Dvx+qL+ptGn6lWaot2vCNE= +github.com/alecthomas/kingpin/v2 v2.4.0/go.mod h1:0gyi0zQnjuFk8xrkNKamJoyUo382HRL7ATRpFZCw6tE= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE= github.com/alexflint/go-filemutex v0.0.0-20171022225611-72bdc8eae2ae/go.mod h1:CgnQgUtFrFz9mxFNtED3jI5tLDjKlOM+oUF/sTk6ps0= -github.com/allegro/bigcache v1.2.1/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= github.com/andybalholm/brotli v1.0.5/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/apache/arrow/go/arrow v0.0.0-20191024131854-af6fa24be0db/go.mod h1:VTxUBvSJ3s3eHAg65PNgrsn5BtqCRPdmyXh6rAfdxN0= -github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= +github.com/apache/arrow/go/v11 v11.0.0/go.mod h1:Eg5OsL5H+e299f7u5ssuXsuHQVEGC4xei5aX110hRiI= +github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= +github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= +github.com/apache/thrift v0.16.0/go.mod h1:PHK3hniurgQaNMZYaCLEqXKsYK8upmhPbmdP2FXSqgU= +github.com/apapsch/go-jsonmerge/v2 v2.0.0/go.mod h1:lvDnEdqiQrp0O42VQGgmlKpxL1AP2+08jFMw88y4klk= +github.com/aristanetworks/fsnotify v1.4.2/go.mod h1:D/rtu7LpjYM8tRJphJ0hUBYpjai8SfX+aSNsWDTq/Ks= +github.com/aristanetworks/glog v0.0.0-20191112221043-67e8567f59f3/go.mod h1:KASm+qXFKs/xjSoWn30NrWBBvdTTQq+UjkhjEJHfSFA= +github.com/aristanetworks/goarista v0.0.0-20200805130819-fd197cf57d96 h1:XJH0YfVFKbq782tlNThzN/Ud5qm/cx6LXOA/P6RkTxc= +github.com/aristanetworks/goarista v0.0.0-20200805130819-fd197cf57d96/go.mod h1:QZe5Yh80Hp1b6JxQdpfSEEe8X7hTyTEZSosSrFf/oJE= +github.com/aristanetworks/splunk-hec-go v0.3.3/go.mod h1:1VHO9r17b0K7WmOlLb9nTk/2YanvOEnLMUgsFrxBROc= +github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= +github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= +github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= +github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= github.com/aws/aws-sdk-go v1.15.11/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= -github.com/aws/aws-sdk-go-v2 v1.2.0/go.mod h1:zEQs02YRBw1DjK0PoJv3ygDYOFTre1ejlJWl8FwAuQo= -github.com/aws/aws-sdk-go-v2/config v1.1.1/go.mod h1:0XsVy9lBI/BCXm+2Tuvt39YmdHwS5unDQmxZOYe8F5Y= -github.com/aws/aws-sdk-go-v2/credentials v1.1.1/go.mod h1:mM2iIjwl7LULWtS6JCACyInboHirisUUdkBPoTHMOUo= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.0.2/go.mod h1:3hGg3PpiEjHnrkrlasTfxFqUsZ2GCk/fMUn4CbKgSkM= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.0.2/go.mod h1:45MfaXZ0cNbeuT0KQ1XJylq8A6+OpVV2E5kvY/Kq+u8= -github.com/aws/aws-sdk-go-v2/service/route53 v1.1.1/go.mod h1:rLiOUrPLW/Er5kRcQ7NkwbjlijluLsrIbu/iyl35RO4= -github.com/aws/aws-sdk-go-v2/service/sso v1.1.1/go.mod h1:SuZJxklHxLAXgLTc1iFXbEWkXs7QRTQpCLGaKIprQW0= -github.com/aws/aws-sdk-go-v2/service/sts v1.1.1/go.mod h1:Wi0EBZwiz/K44YliU0EKxqTCJGUfYTWXrrBwkq736bM= -github.com/aws/smithy-go v1.1.0/go.mod h1:EzMw8dbp/YJL4A5/sbhGddag+NPT7q084agLbB9LgIw= +github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= +github.com/aws/aws-sdk-go-v2 v1.21.2/go.mod h1:ErQhvNuEMhJjweavOYhxVkn2RUx7kQXVATHrjKtxIpM= +github.com/aws/aws-sdk-go-v2/config v1.18.45/go.mod h1:ZwDUgFnQgsazQTnWfeLWk5GjeqTQTL8lMkoE1UXzxdE= +github.com/aws/aws-sdk-go-v2/credentials v1.13.43/go.mod h1:zWJBz1Yf1ZtX5NGax9ZdNjhhI4rgjfgsyk6vTY1yfVg= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.13/go.mod h1:f/Ib/qYjhV2/qdsf79H3QP/eRE4AkVyEf6sk7XfZ1tg= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.43/go.mod h1:auo+PiyLl0n1l8A0e8RIeR8tOzYPfZZH/JNlrJ8igTQ= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.37/go.mod h1:Qe+2KtKml+FEsQF/DHmDV+xjtche/hwoF75EG4UlHW8= +github.com/aws/aws-sdk-go-v2/internal/ini v1.3.45/go.mod h1:lD5M20o09/LCuQ2mE62Mb/iSdSlCNuj6H5ci7tW7OsE= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.37/go.mod h1:vBmDnwWXWxNPFRMmG2m/3MKOe+xEcMDo1tanpaWCcck= +github.com/aws/aws-sdk-go-v2/service/route53 v1.30.2/go.mod h1:TQZBt/WaQy+zTHoW++rnl8JBrmZ0VO6EUbVua1+foCA= +github.com/aws/aws-sdk-go-v2/service/sso v1.15.2/go.mod h1:gsL4keucRCgW+xA85ALBpRFfdSLH4kHOVSnLMSuBECo= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.17.3/go.mod h1:a7bHA82fyUXOm+ZSWKU6PIoBxrjSprdLoM8xPYvzYVg= +github.com/aws/aws-sdk-go-v2/service/sts v1.23.2/go.mod h1:Eows6e1uQEsc4ZaHANmsPRzAKcVDrcmjjWiih2+HUUQ= +github.com/aws/smithy-go v1.15.0/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4= github.com/beorn7/perks v0.0.0-20160804104726-4c0e84591b9a/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/bitly/go-simplejson v0.5.0/go.mod h1:cXHtHw4XUPsvGaxgjIAn8PhEWG9NfngEKAMDJEczWVA= github.com/bits-and-blooms/bitset v1.2.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= +github.com/bits-and-blooms/bitset v1.7.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= github.com/blang/semver v3.1.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= +github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= +github.com/bmatcuk/doublestar v1.1.1/go.mod h1:UD6OnuiIn0yFxxA2le/rnRU1G4RaI4UvFv1sNto9p6w= github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= github.com/bmizerany/pat v0.0.0-20170815010413-6226ea591a40/go.mod h1:8rLXio+WjiTceGBHIoTvn60HIbs7Hm7bcHjyrSqYB9c= github.com/boltdb/bolt v1.3.1/go.mod h1:clJnj/oiGkjum5o1McbSZDSLxVThjynRyGBgiAx27Ps= github.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= github.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= +github.com/bradfitz/gomemcache v0.0.0-20170208213004-1952afaa557d/go.mod h1:PmM6Mmwb0LSuEubjR8N7PtNe1KxZLtOUHtbeikc5h60= github.com/bshuster-repo/logrus-logstash-hook v0.4.1/go.mod h1:zsTqEiSzDgAa/8GZR7E1qaXrhYNDKBYy5/dWPTIflbk= github.com/btcsuite/btcd/btcec/v2 v2.2.0/go.mod h1:U7MHm051Al6XmscBQ0BoNydpOTsFAn707034b5nY8zU= -github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= github.com/buger/jsonparser v0.0.0-20180808090653-f4dd9f5a6b44/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s= github.com/bugsnag/bugsnag-go v0.0.0-20141110184014-b1d153021fcd/go.mod h1:2oa8nejYd4cQ/b0hMIopN0lCRxU0bueqREvZLWFrtK8= github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b/go.mod h1:obH5gd0BsqsP2LwDJ9aOkm/6J86V6lyAXCoQWGw3K50= github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0/go.mod h1:D/8v3kj0zr8ZAKg1AQ6crr+5VwKN5eIywRkfhyM/+dE= github.com/c-bata/go-prompt v0.2.2/go.mod h1:VzqtzE2ksDBcdln8G7mk2RX9QyGjH+OVqOCSiVIqS34= +github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= +github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= -github.com/cespare/cp v0.1.0/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s= +github.com/cenkalti/backoff/v4 v4.1.2/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= +github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw= +github.com/cespare/cp v1.1.1 h1:nCb6ZLdB7NRaqsm91JtQTAme2SKJzXVsdPIPkyJr1MU= +github.com/cespare/cp v1.1.1/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s= github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= @@ -155,27 +458,44 @@ github.com/checkpoint-restore/go-criu/v4 v4.1.0/go.mod h1:xUQBLp4RLc5zJtWY++yjOo github.com/checkpoint-restore/go-criu/v5 v5.0.0/go.mod h1:cfwC0EG7HMUenopBsUf9d89JlCLQIfgVcNsNN0t6T2M= github.com/checkpoint-restore/go-criu/v5 v5.3.0/go.mod h1:E/eQpaFtUKGOOSEBZgmKAcn+zUUwWxqcaKZlF54wK8E= github.com/cheekybits/is v0.0.0-20150225183255-68e9c0620927/go.mod h1:h/aW8ynjgkuj+NQRlZcDbAbM1ORAbXjXX77sX7T289U= +github.com/chromedp/cdproto v0.0.0-20230802225258-3cf4e6d46a89/go.mod h1:GKljq0VrfU4D5yc+2qA6OVr8pmO/MBbPEWqWQ/oqGEs= +github.com/chromedp/chromedp v0.9.2/go.mod h1:LkSXJKONWTCHAfQasKFUZI+mxqS4tZqhmtGzzhLsnLs= +github.com/chromedp/sysutil v1.0.0/go.mod h1:kgWmDdq8fTzXYcKIBqIYvRRTnYb9aNS9moAV0xufSww= +github.com/chzyer/logex v1.2.0/go.mod h1:9+9sk7u7pGNWYMkh0hdiL++6OeibzJccyQU4p4MedaY= +github.com/chzyer/logex v1.2.1/go.mod h1:JLbx6lG2kDbNRFnfkgvh4eRJRPX1QCoOIWomwysCBrQ= +github.com/chzyer/readline v1.5.0/go.mod h1:x22KAscuvRqlLoK9CsoYsmxoXZMMFVyOl86cAH8qUic= +github.com/chzyer/readline v1.5.1/go.mod h1:Eh+b79XXUwfKfcPLepksvw2tcLE/Ct21YObkaSkeBlk= +github.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/chzyer/test v1.0.0/go.mod h1:2JlltgoNkt4TW/z9V/IzDdFaMTM2JPIi26O1pF38GC8= github.com/cilium/ebpf v0.0.0-20200110133405-4032b1d8aae3/go.mod h1:MA5e5Lr8slmEg9bt0VpxxWqJlO4iwu3FBdHUzV7wQVg= github.com/cilium/ebpf v0.0.0-20200702112145-1c8d4c9ef775/go.mod h1:7cR51M8ViRLIdUjrmSXlK9pkrsDlLHbO8jiB8X8JnOc= -github.com/cilium/ebpf v0.2.0/go.mod h1:To2CFviqOWL/M0gIMsvSMlqe7em/l1ALkX1PyjrX2Qs= github.com/cilium/ebpf v0.4.0/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs= github.com/cilium/ebpf v0.6.2/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs= github.com/cilium/ebpf v0.7.0/go.mod h1:/oI2+1shJiTGAMgl6/RgJr36Eo1jzrRcAWbcXO2usCA= -github.com/cloudflare/cloudflare-go v0.14.0/go.mod h1:EnwdgGMaFOruiPZRFSgn+TsQ3hQ7C/YWzIGLeu5c304= +github.com/cilium/ebpf v0.9.1/go.mod h1:+OhNOIXx/Fnu1IE8bJz2dzOA+VSfyTfdNUVdlQnxUFY= +github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= +github.com/cloudflare/cloudflare-go v0.79.0/go.mod h1:gkHQf9xEubaQPEuerBuoinR9P8bf8a05Lq0X6WKy1Oc= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= +github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20220314180256-7f1daf1720fc/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20230105202645-06c439db220b/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= github.com/cockroachdb/datadriven v1.0.0/go.mod h1:5Ib8Meh+jk1RlHIXej6Pzevx/NLlNvQB9pmSBZErGA4= +github.com/cockroachdb/datadriven v1.0.3-0.20230801171734-e384cf455877/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= github.com/cockroachdb/errors v1.6.1/go.mod h1:tm6FTP5G81vwJ5lC0SizQo374JNCOPrHyXGitRJoDqM= github.com/cockroachdb/errors v1.8.1/go.mod h1:qGwQn6JmZ+oMjuLwjWzUNqblqk0xl4CVV3SQbGwK7Ac= github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI= +github.com/cockroachdb/pebble v0.0.0-20230821143352-55b44ac08de8/go.mod h1:bynZ3gvVyhlvjLI7PT6dmZ7g76xzJ7HpxfjgkzCGz6s= github.com/cockroachdb/redact v1.0.8/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= -github.com/cockroachdb/sentry-go v0.6.1-cockroachdb.2/go.mod h1:8BT+cPK6xvFOcRlk0R8eg+OTkcqI6baNH4xAkpiYVvQ= -github.com/consensys/bavard v0.1.13/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI= +github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= github.com/consensys/gnark-crypto v0.9.1-0.20230105202408-1a7a29904a7c/go.mod h1:CkbdF9hbRidRJYMRzmfX8TMOr95I2pYXRHF18MzRrvA= github.com/containerd/aufs v0.0.0-20200908144142-dab0cbea06f4/go.mod h1:nukgQABAEopAHvB6j7cnP5zJ+/3aVcE7hCYqvIwAHyE= github.com/containerd/aufs v0.0.0-20201003224125-76a6863f2989/go.mod h1:AkGGQs9NM2vtYHaUen+NljV0/baGCAPELGm2q9ZXpWU= @@ -212,7 +532,6 @@ github.com/containerd/containerd v1.5.0-beta.4/go.mod h1:GmdgZd2zA2GYIBZ0w09Zvgq github.com/containerd/containerd v1.5.0-rc.0/go.mod h1:V/IXoMqNGgBlabz3tHD2TWDoTJseu1FGOKuoA4nNb2s= github.com/containerd/containerd v1.5.1/go.mod h1:0DOxVqwDy2iZvrZp2JUx/E+hS0UNTVn7dJnIOwtYR4g= github.com/containerd/containerd v1.5.7/go.mod h1:gyvv6+ugqY25TiXxcZC3L5yOeYgEw0QMhscqVp1AR9c= -github.com/containerd/containerd v1.6.18 h1:qZbsLvmyu+Vlty0/Ex5xc0z2YtKpIsb5n45mAMI+2Ns= github.com/containerd/containerd v1.6.18/go.mod h1:1RdCUu95+gc2v9t3IL+zIlpClSmew7/0YS8O5eQZrOw= github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= github.com/containerd/continuity v0.0.0-20190815185530-f2a389ac0a02/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= @@ -221,6 +540,7 @@ github.com/containerd/continuity v0.0.0-20200710164510-efbc4488d8fe/go.mod h1:cE github.com/containerd/continuity v0.0.0-20201208142359-180525291bb7/go.mod h1:kR3BEg7bDFaEddKm54WSmrol1fKWDU1nKYkgrcgZT7Y= github.com/containerd/continuity v0.0.0-20210208174643-50096c924a4e/go.mod h1:EXlVlkqNba9rJe3j7w3Xa924itAMLgZH4UD/Q4PExuQ= github.com/containerd/continuity v0.1.0/go.mod h1:ICJu0PwR54nI0yPEnJ6jcS+J7CZAUXrLh8lPo2knzsM= +github.com/containerd/continuity v0.3.0/go.mod h1:wJEAIwKOm/pBZuBd0JmeTvnLquTB1Ag8espWhkykbPM= github.com/containerd/fifo v0.0.0-20180307165137-3d5202aec260/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI= github.com/containerd/fifo v0.0.0-20190226154929-a9fb20d87448/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI= github.com/containerd/fifo v0.0.0-20200410184934-f15a3290365b/go.mod h1:jPQ2IAeZRCYxpS/Cm1495vGFww6ecHmMk1YJH2Q5ln0= @@ -229,6 +549,7 @@ github.com/containerd/fifo v0.0.0-20210316144830-115abcc95a1d/go.mod h1:ocF/ME1S github.com/containerd/fifo v1.0.0/go.mod h1:ocF/ME1SX5b1AOlWi9r677YJmCPSwwWnQ9O123vzpE4= github.com/containerd/go-cni v1.0.1/go.mod h1:+vUpYxKvAF72G9i1WoDOiPGRtQpqsNW/ZHtSlv++smU= github.com/containerd/go-cni v1.0.2/go.mod h1:nrNABBHzu0ZwCug9Ije8hL2xBCYh/pjfMb1aZGrrohk= +github.com/containerd/go-cni v1.1.6/go.mod h1:BWtoWl5ghVymxu6MBjg79W9NZrCRyHIdUtk4cauMe34= github.com/containerd/go-runc v0.0.0-20180907222934-5a6d9f37cfa3/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0= github.com/containerd/go-runc v0.0.0-20190911050354-e029b79d8cda/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0= github.com/containerd/go-runc v0.0.0-20200220073739-7016d3ce2328/go.mod h1:PpyHrqVs8FTi9vpyHwPwiNEGaACDxT/N/pLcvMSRA9g= @@ -238,6 +559,7 @@ github.com/containerd/imgcrypt v1.0.1/go.mod h1:mdd8cEPW7TPgNG4FpuP3sGBiQ7Yi/zak github.com/containerd/imgcrypt v1.0.4-0.20210301171431-0ae5c75f59ba/go.mod h1:6TNsg0ctmizkrOgXRNQjAPFWpMYRWuiB6dSF4Pfa5SA= github.com/containerd/imgcrypt v1.1.1-0.20210312161619-7ed62a527887/go.mod h1:5AZJNI6sLHJljKuI9IHnw1pWqo/F0nGDOuR9zgTs7ow= github.com/containerd/imgcrypt v1.1.1/go.mod h1:xpLnwiQmEUJPvQoAapeb2SNCxz7Xr6PJrXQb0Dpc4ms= +github.com/containerd/imgcrypt v1.1.4/go.mod h1:LorQnPtzL/T0IyCeftcsMEO7AqxUDbdO8j/tSUpgxvo= github.com/containerd/nri v0.0.0-20201007170849-eb1350a75164/go.mod h1:+2wGSDGFYfE5+So4M5syatU0N0f0LbWpuqyMi4/BE8c= github.com/containerd/nri v0.0.0-20210316161719-dbaa18c31c14/go.mod h1:lmxnXF6oMkbqs39FiCt1s0R2HSMhcLel9vNL3m4AaeY= github.com/containerd/nri v0.1.0/go.mod h1:lmxnXF6oMkbqs39FiCt1s0R2HSMhcLel9vNL3m4AaeY= @@ -260,11 +582,14 @@ github.com/containerd/zfs v1.0.0/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNR github.com/containernetworking/cni v0.7.1/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= github.com/containernetworking/cni v0.8.0/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= github.com/containernetworking/cni v0.8.1/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= +github.com/containernetworking/cni v1.1.1/go.mod h1:sDpYKmGVENF3s6uvMvGgldDWeG8dMxakj/u+i9ht9vw= github.com/containernetworking/plugins v0.8.6/go.mod h1:qnw5mN19D8fIwkqW7oHHYDHVlzhJpcY6TQxn/fUyDDM= github.com/containernetworking/plugins v0.9.1/go.mod h1:xP/idU2ldlzN6m4p5LmGiwRDjeJr6FLK6vuiUwoH7P8= +github.com/containernetworking/plugins v1.1.1/go.mod h1:Sr5TH/eBsGLXK/h71HeLfX19sZPp3ry5uHSkI4LPxV8= github.com/containers/ocicrypt v1.0.1/go.mod h1:MeJDzk1RJHv89LjsH0Sp5KTY3ZYkjXO/C+bKAeWFIrc= github.com/containers/ocicrypt v1.1.0/go.mod h1:b8AOe0YR67uU8OqfVNcznfFpAzu3rdgUV4GP9qXPfu4= github.com/containers/ocicrypt v1.1.1/go.mod h1:Dm55fwWm1YZAjYRaJ94z2mfZikIyIN4B0oB3dj3jFxY= +github.com/containers/ocicrypt v1.1.3/go.mod h1:xpdkbVAuaH3WzbEabUd5yDsl9SwJA5pABH85425Es2g= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/go-iptables v0.4.5/go.mod h1:/mVI274lEDI2ns62jHCDnCyBF9Iwsmekav8Dbxlm1MU= github.com/coreos/go-iptables v0.5.0/go.mod h1:/mVI274lEDI2ns62jHCDnCyBF9Iwsmekav8Dbxlm1MU= @@ -273,15 +598,16 @@ github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3Ee github.com/coreos/go-systemd v0.0.0-20161114122254-48702e0da86b/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf h1:iW4rZ826su+pqaw19uhpSCzhj44qo35pNgKFGqzDKkU= +github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd/v22 v22.0.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= -github.com/coreos/go-systemd/v22 v22.1.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/crate-crypto/go-ipa v0.0.0-20220523130400-f11357ae11c7/go.mod h1:gFnFS95y8HstDP6P9pPwzrxOOC5TRDkwbM+ao15ChAI= +github.com/crate-crypto/go-ipa v0.0.0-20230601170251-1830d0757c80/go.mod h1:gzbVz57IDJgQ9rLQwfSk696JGWof8ftznEL9GoAv3NI= +github.com/crate-crypto/go-ipa v0.0.0-20231025140028-3c0104f4b233/go.mod h1:geZJZH3SzKCqnz5VT0q/DyIG/tvu/dZk+VIfXicupJs= +github.com/crate-crypto/go-kzg-4844 v0.6.1-0.20231019121413-3621cc59f0c7/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/cyberdelia/templates v0.0.0-20141128023046-ca7fffd4298c/go.mod h1:GyV+0YP4qX0UQ7r2MoYZ+AvYDp12OF5yg4q8rGnyNh4= @@ -293,14 +619,22 @@ github.com/d2g/dhcp4server v0.0.0-20181031114812-7d4a0a7f59a5/go.mod h1:Eo87+Kg/ github.com/d2g/hardwareaddr v0.0.0-20190221164911-e7d9fbe030e4/go.mod h1:bMl4RjIciD2oAxI7DmWRx6gbeqrkoLqv3MV0vzNad+I= github.com/dave/jennifer v1.2.0/go.mod h1:fIb+770HOpJ2fmN9EPPKOqm1vMGhB+TwXKMZhrIygKg= github.com/deckarep/golang-set v1.8.0 h1:sk9/l/KqpunDwP7pSjUg0keiOOLEnOBHzykLrsPppp4= -github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.0-20210816181553-5444fa50b93d/go.mod h1:tmAIfUFEirG/Y8jhZ9M+h36obRZAk/1fcSpXwAVlfqE= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs= -github.com/deepmap/oapi-codegen v1.6.0/go.mod h1:ryDa9AgbELGeB+YEXE1dR53yAjHwFvE9iAUlWl9Al3M= github.com/deepmap/oapi-codegen v1.8.2/go.mod h1:YLgSKSDv/bZQB7N4ws6luhozi3cEdRktEqrX88CvjIw= +github.com/deepmap/oapi-codegen v1.12.4/go.mod h1:3lgHGMu6myQ2vqbbTXH2H1o4eXFTGnFiDaOaKKl5yas= github.com/denverdino/aliyungo v0.0.0-20190125010748-a747050bb1ba/go.mod h1:dV8lFg6daOBZbT6/BDGIz6Y3WFGn8juu6G+CQ6LHtl0= +github.com/dgraph-io/badger v1.6.2/go.mod h1:JW2yswe3V058sS0kZ2h/AXeDSqFjxnZcRrVH//y2UQE= +github.com/dgraph-io/badger/v2 v2.2007.4/go.mod h1:vSw/ax2qojzbN6eXHIx6KPKtCSHJN/Uz0X0VPruTIhk= +github.com/dgraph-io/ristretto v0.0.2/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= +github.com/dgraph-io/ristretto v0.0.3-0.20200630154024-f66de99634de/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= +github.com/dgraph-io/ristretto v0.0.4-0.20210318174700-74754f61e018 h1:cNcG4c2n5xanQzp2hMyxDxPYVQmZ91y4WN6fJFlndLo= +github.com/dgraph-io/ristretto v0.0.4-0.20210318174700-74754f61e018/go.mod h1:MIonLggsKgZLUSt414ExgwNtlOL5MuEoAJP514mwGe8= github.com/dgrijalva/jwt-go v0.0.0-20170104182250-a601269ab70c/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/go-bitstream v0.0.0-20180413035011-3522498ce2c8/go.mod h1:VMaSuZ+SZcx/wljOQKvp5srsbCiKDEb6K2wC4+PiBmQ= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2 h1:tdlZCpZ/P9DhczCTSixgIKmwPv6+wP5DGjqLYw5SUiA= +github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= github.com/djherbis/atime v1.1.0/go.mod h1:28OF6Y8s3NQWwacXc5eZTsEsiMzp7LF8MbXE+XJPdBE= github.com/dlclark/regexp2 v1.4.1-0.20201116162257-a2a8dda75c91/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= @@ -316,75 +650,110 @@ github.com/docker/docker v1.4.2-0.20190924003213-a8608b5b67c7/go.mod h1:eEKB0N0r github.com/docker/docker v1.6.2/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/docker v20.10.17+incompatible h1:JYCuMrWaVNophQTOrMMoSwudOVEfcegoZZrleKc1xwE= github.com/docker/docker v20.10.17+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v24.0.5+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v24.0.7+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/docker-credential-helpers v0.6.3/go.mod h1:WRaJzqw3CTB9bk10avuGsjVBZsD05qeibJ1/TYlvc0Y= -github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= github.com/docker/go-events v0.0.0-20170721190031-9461782956ad/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA= github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA= github.com/docker/go-metrics v0.0.0-20180209012529-399ea8c73916/go.mod h1:/u0gXw0Gay3ceNrsHubL3BtdOL2fHf93USgMTe0W5dI= github.com/docker/go-metrics v0.0.1/go.mod h1:cG1hvH2utMXtqgqqYE9plW6lDxS3/5ayHzueweSI3Vw= github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw= -github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/docker/libtrust v0.0.0-20150114040149-fa567046d9b1/go.mod h1:cyGadeNEkKy96OOhEzfZl+yxihPEzKnqJwvfuSUqbZE= github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= -github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= github.com/dop251/goja v0.0.0-20211022113120-dc8c55024d06/go.mod h1:R9ET47fwRVRPZnOGvHxxhuZcbrMCuiqOz3Rlrh4KSnk= github.com/dop251/goja v0.0.0-20230122112309-96b1610dd4f7/go.mod h1:yRkwfj0CBpOGre+TwBsqPV0IH0Pk73e4PXJOeNDboGs= +github.com/dop251/goja v0.0.0-20230806174421-c933cf95e127/go.mod h1:QMWlm50DNe14hD7t24KEqZuUdC9sOTy8W6XbCU1mlw4= github.com/dop251/goja_nodejs v0.0.0-20210225215109-d91c329300e7/go.mod h1:hn7BA7c8pLvoGndExHudxTDKZ84Pyvv+90pbBjbTz0Y= github.com/dop251/goja_nodejs v0.0.0-20211022123610-8dd9abb0616d/go.mod h1:DngW8aVqWbuLRMHItjPUyqdj+HWPvnQe8V8y1nDpIbM= github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= +github.com/dvyukov/go-fuzz v0.0.0-20220726122315-1d375ef9f9f6/go.mod h1:11Gm+ccJnvAhCNLlf5+cS9KjtbaD5I5zaZpFMsTHWTw= +github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= +github.com/eapache/go-resiliency v1.2.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= +github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= +github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= github.com/eclipse/paho.mqtt.golang v1.2.0/go.mod h1:H9keYFcgq3Qr5OUJm/JZI/i6U7joQ8SYLhZwfeOo6Ts= github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= -github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= -github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= +github.com/edsrzf/mmap-go v1.1.0/go.mod h1:19H/e8pUPLicwkyNgOykDXkJ9F0MHE+Z52B8EIth78Q= +github.com/emicklei/dot v0.11.0/go.mod h1:DeV7GvQtIw4h2u73RKBkkFdvVAz0D9fzeJrgPW6gy/s= github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= +github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= +github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= +github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= +github.com/envoyproxy/go-control-plane v0.10.3/go.mod h1:fJJn/j26vwOu972OllsvAgJJM//w9BV6Fxbg2LuVd34= +github.com/envoyproxy/go-control-plane v0.11.1-0.20230524094728-9239064ad72f/go.mod h1:sfYdkwUW4BA3PbKjySwjJy+O4Pu0h62rlqCMHNk+K+Q= +github.com/envoyproxy/protoc-gen-validate v0.6.7/go.mod h1:dyJXwwfPK2VSqiB9Klm1J6romD608Ba7Hij42vrOBCo= +github.com/envoyproxy/protoc-gen-validate v0.9.1/go.mod h1:OKNgG7TCp5pF4d6XftA0++PMirau2/yoOwVac3AbF2w= +github.com/envoyproxy/protoc-gen-validate v0.10.1/go.mod h1:DRjgyB0I43LtJapqN6NiRwroiAU2PaFuvk/vjgh61ss= +github.com/ethereum/c-kzg-4844 v0.3.0/go.mod h1:WI2Nd82DMZAAZI1wV2neKGost9EKjvbpQR9OqE5Qqa8= +github.com/ethereum/c-kzg-4844 v0.3.2-0.20231019020040-748283cced54/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= +github.com/ethereum/go-ethereum v1.12.2-0.20230815181937-e0b119884c6a/go.mod h1:1JU/x0JQLBndZb2727eswdCzyF2rFd8SZUj7HDQuVqc= +github.com/ethereum/hive v0.0.0-20230401205547-71595beab31d/go.mod h1:zKL2DscVzRusnGVpseAvLrXGJ3qrGHuSfOIrv4JfnRk= github.com/ethereum/hive/hiveproxy v0.0.0-20230313101845-c7dfe88c8138 h1:Y74Ksk90DLCMWnpOfOEWRLxVjsf/67vY+hX5kWu9UY0= github.com/ethereum/hive/hiveproxy v0.0.0-20230313101845-c7dfe88c8138/go.mod h1:1LWNU6/EYsIOXZGa2KdklD1ET77gLTeEyhq+WTZ+37o= +github.com/ethereum/hive/hiveproxy v0.0.0-20230919105823-37cbbe1ef86d/go.mod h1:0tWUtPhJgk9z3K41wqHV0IYY6/jJWOlfo4rI4v3Mr1E= github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanw/esbuild v0.17.6/go.mod h1:iINY06rn799hi48UqEnaQvVfZWe6W9bET78LbvN8VWk= -github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/evanw/esbuild v0.18.11/go.mod h1:iINY06rn799hi48UqEnaQvVfZWe6W9bET78LbvN8VWk= +github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= +github.com/ferranbt/fastssz v0.0.0-20210120143747-11b9eff30ea9/go.mod h1:DyEu2iuLBnb/T51BlsiO3yLYdJC6UbGMrIkqK1KmQxM= github.com/fjl/gencodec v0.0.0-20220412091415-8bb9e558978c/go.mod h1:AzA8Lj6YtixmJWL+wkKoBGsLWy9gFrAzi4g+5bCKwpY= +github.com/fjl/gencodec v0.0.0-20230517082657-f9840df7b83e/go.mod h1:AzA8Lj6YtixmJWL+wkKoBGsLWy9gFrAzi4g+5bCKwpY= github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= github.com/flosch/pongo2 v0.0.0-20190707114632-bbf5a6c351f4/go.mod h1:T9YF2M40nIgbVgp3rreNmTged+9HrbNTIQf1PsaIiTA= github.com/flosch/pongo2/v4 v4.0.2/go.mod h1:B5ObFANs/36VwxxlgKpdchIJHMvHB562PW+BWPhwZD8= github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= -github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= +github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= +github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= +github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= +github.com/frankban/quicktest v1.7.2/go.mod h1:jaStnuzAqU1AJdCO0l53JDCJrVDKcS03DbaAcR7Ks/o= github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= -github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= +github.com/fsnotify/fsnotify v1.4.3-0.20170329110642-4da3e2cfbabc/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsouza/go-dockerclient v1.8.1 h1:a27vHYqNSZz88nUAurI1o6W5PgEt63nAWilOI+j63RE= github.com/fsouza/go-dockerclient v1.8.1/go.mod h1:zmA2ogSxRnXmbZcy0Aq7yhRoCdP/bDns/qghCK9SWtM= +github.com/fsouza/go-dockerclient v1.9.8/go.mod h1:74lNReDQxrOaogajs51IvZgkDME4qe9yPJAUEUTJtHw= github.com/fullsailor/pkcs7 v0.0.0-20190404230743-d7302db945fa/go.mod h1:KnogPXtdwXqoenmZCw6S+25EAm2MkxbG0deNDu4cbSA= github.com/garslo/gogen v0.0.0-20170306192744-1d203ffc1f61/go.mod h1:Q0X6pkwTILDlzrGEckF6HKjXe48EgsY/l7K7vhY4MW8= github.com/garyburd/redigo v0.0.0-20150301180006-535138d7bcd7/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY= +github.com/garyburd/redigo v1.1.1-0.20170914051019-70e1b1943d4f/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY= +github.com/garyburd/redigo v1.6.0/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY= github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= github.com/gballet/go-verkle v0.0.0-20220902153445-097bd83b7732/go.mod h1:o/XfIXWi4/GqbQirfRm5uTbXMG5NpqxkxblnbZ+QM9I= +github.com/gballet/go-verkle v0.0.0-20230607174250-df487255f46b/go.mod h1:CDncRYVRSDqwakm282WEkjfaAj1hxU/v5RXxk5nXOiI= +github.com/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46/go.mod h1:QNpY22eby74jVhqH4WhDLDwxc/vqsern6pW+u2kbkpc= +github.com/gdamore/encoding v1.0.0/go.mod h1:alR0ol34c49FCSBLjhosxzcPHQbf2trDkoo5dl+VrEg= +github.com/gdamore/tcell/v2 v2.4.1-0.20210905002822-f057f0a857a1/go.mod h1:Az6Jt+M5idSED2YPGtwnfJV0kXohgdCBPmHGSYc1r04= +github.com/gdamore/tcell/v2 v2.5.3/go.mod h1:wSkrPaXoiIWZqW/g7Px4xc79di6FTcpB8tvaKJ6uGBo= github.com/getkin/kin-openapi v0.53.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW6yheSwk8Yi4= github.com/getkin/kin-openapi v0.61.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW6yheSwk8Yi4= +github.com/getkin/kin-openapi v0.107.0/go.mod h1:9Dhr+FasATJZjS4iOLvB0hkaxgYdulrNYm2e9epLWOo= github.com/ghemawat/stream v0.0.0-20171120220530-696b145b53b9/go.mod h1:106OIgooyS7OzLDOpUGgm9fA3bQENb/cFSyyBmMoJDs= github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= +github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M= +github.com/gin-gonic/gin v1.8.1 h1:4+fr/el88TOO3ewCmQr8cx/CtZ/umlIRIs5M4NTNjf8= github.com/gin-gonic/gin v1.8.1/go.mod h1:ji8BvRH1azfM+SYow9zQ6SZMvR8qOMZHmsCuWR9tTTk= github.com/glycerine/go-unsnap-stream v0.0.0-20180323001048-9f0cb55181dd/go.mod h1:/20jfyN9Y5QPEAprSgKAUr+glWDY39ZiUEAYOEv5dsE= github.com/glycerine/goconvey v0.0.0-20190410193231-58a59202ab31/go.mod h1:Ogl1Tioa0aV7gstGFO7KhffUsb9M4ydbEbbxpcEDc24= github.com/go-chi/chi/v5 v5.0.0/go.mod h1:BBug9lr0cqtdAhsu6R4AAdvufI0/XBzAQSsUqJpoZOs= -github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= +github.com/go-chi/chi/v5 v5.0.7/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g= github.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks= github.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= github.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= github.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY= -github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-ini/ini v1.25.4/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o= github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= github.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= @@ -393,253 +762,430 @@ github.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpx github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= -github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= -github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= +github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8= +github.com/go-ole/go-ole v1.2.5/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0= github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= -github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9/go.mod h1:W3Z9FmVs9qj+KR4zFKmDPGiLdk1D9Rlm7cyMvf57TTg= github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= -github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501/go.mod h1:J8+jY1nAiCcj+friV/PDoE1/3eeccG9LYBs0tYvLOWc= github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87/go.mod h1:DXUve3Dpr1UfpPtxFw+EFuQ41HhCWZfha5jSVRG7C7I= github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= +github.com/go-openapi/swag v0.21.1/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= github.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M= github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= +github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= +github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= github.com/go-playground/locales v0.14.0/go.mod h1:sawfccIbzZTqEDETgFXqTho0QybSa7l++s0DH+LDiLs= +github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= +github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= +github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= github.com/go-playground/universal-translator v0.18.0/go.mod h1:UvRDBj+xPUEGrFYl+lu/H90nyDXpg0fqeB/AQUGNTVA= +github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= +github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= +github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI= github.com/go-playground/validator/v10 v10.11.1/go.mod h1:i+3WkQ1FvaUjjxh1kSvIA4dMGDBiPU55YFDl0WbKdWU= -github.com/go-sourcemap/sourcemap v2.1.3+incompatible/go.mod h1:F8jJfvm2KbVjc5NqelyYJmf/v5J0dwNLS2mL4sNA1Jg= +github.com/go-playground/validator/v10 v10.13.0 h1:cFRQdfaSMCOSfGCCLB20MHvuoHb/s5G8L5pu2ppK5AQ= +github.com/go-playground/validator/v10 v10.13.0/go.mod h1:dwu7+CG8/CtBiJFZDz4e+5Upb6OLw04gtBYw0mcG/z4= +github.com/go-redis/redis/v8 v8.11.5/go.mod h1:gREzHqY1hg6oD9ngVRbLStwAWKhA0FEgq8Jd4h5lpwo= +github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= +github.com/go-stack/stack v1.6.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/go-yaml/yaml v2.1.0+incompatible h1:RYi2hDdss1u4YE7GwixGzWwVo47T8UQwnTLB6vQiq+o= +github.com/go-yaml/yaml v2.1.0+incompatible/go.mod h1:w2MrLa16VYP0jy6N7M5kHaCkaLENm+P+Tv+MfurjSw0= +github.com/gobwas/httphead v0.1.0 h1:exrUm0f4YX0L7EBwZHuCF4GDp8aJfVeBrlLQrs6NqWU= +github.com/gobwas/httphead v0.1.0/go.mod h1:O/RXo79gxV8G+RqlR/otEwx4Q36zl9rqC5u12GKvMCM= +github.com/gobwas/pool v0.2.1 h1:xfeeEhW7pwmX8nuLVlqbzVc7udMDrwetjEv+TZIz1og= +github.com/gobwas/pool v0.2.1/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= +github.com/gobwas/ws v1.1.0/go.mod h1:nzvNcVha5eUziGrbxFCo6qFIojQHjJV5cLYIbezhfL0= +github.com/gobwas/ws v1.2.1 h1:F2aeBZrm2NDsc7vbovKrWSogd4wvfAxg0FQ89/iqOTk= +github.com/gobwas/ws v1.2.1/go.mod h1:hRKAFb8wOxFROYNsT1bqfWnhX+b5MFeJM9r2ZSwg/KY= +github.com/goccy/go-json v0.9.7/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= github.com/goccy/go-json v0.9.11/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= github.com/godbus/dbus v0.0.0-20151105175453-c7fdd8b5cd55/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= github.com/godbus/dbus v0.0.0-20180201030542-885f9cc04c9c/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= -github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/godbus/dbus/v5 v5.0.6/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gofrs/uuid v3.3.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= +github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= github.com/gogo/googleapis v1.2.0/go.mod h1:Njal3psf3qN6dwBtQfUmBZh2ybovJ0tlu3o/AC7HYjU= github.com/gogo/googleapis v1.4.0/go.mod h1:5YRNX2z1oM5gXdAkurHa942MDgEJyk02w4OecKY87+c= -github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.0/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= +github.com/golang-jwt/jwt v3.2.1+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY= +github.com/golang-jwt/jwt/v4 v4.2.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= +github.com/golang-jwt/jwt/v4 v4.4.3/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= +github.com/golang/gddo v0.0.0-20200528160355-8d077c1d8f4c/go.mod h1:sam69Hju0uq+5uvLJUMDlsKlQ21Vrs1Kd/1YFPNYdOU= github.com/golang/geo v0.0.0-20190916061304-5b978397cfec/go.mod h1:QZ0nwyI2jOfgRAoBvP+ab5aRr7c9x7lhGEJrKvBwjWI= +github.com/golang/glog v1.0.0 h1:nfP3RFugxnNRyKgeWd4oI1nYvXpxrx8ck8ZrcizshdQ= +github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= +github.com/golang/glog v1.1.0/go.mod h1:pfYeQZ3JWZoXTV5sFc986z3HTpwQs9At6P4ImfuP3NQ= github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= -github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/lint v0.0.0-20170918230701-e5d664eb928e/go.mod h1:tluoj9z5200jBnyusfRPU2LqT6J+DAorxEvtC7LHB+E= github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= +github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= -github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= +github.com/golang/snappy v0.0.0-20170215233205-553a64147049/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golangci/lint-1 v0.0.0-20181222135242-d2cdd8c08219/go.mod h1:/X8TswGSh1pIozq4ZwCfxS0WA5JGXguxk94ar/4c87Y= github.com/gonum/blas v0.0.0-20181208220705-f22b278b28ac/go.mod h1:P32wAyui1PQ58Oce/KYkOqQv8cVw1zAapXOl+dRFGbc= github.com/gonum/floats v0.0.0-20181209220543-c233463c7e82/go.mod h1:PxC8OnwL11+aosOB5+iEPoV3picfs8tUpkVd0pDo+Kg= github.com/gonum/internal v0.0.0-20181124074243-f884aa714029/go.mod h1:Pu4dmpkhSyOzRwuXkOgAvijx4o+4YMUJJo9OvPYMkks= github.com/gonum/lapack v0.0.0-20181123203213-e4cdc5a0bff9/go.mod h1:XA3DeT6rxh2EAE789SSiSJNqxPaC0aE9J8NTOI0Jo/A= github.com/gonum/matrix v0.0.0-20181209220409-c518dec07be9/go.mod h1:0EXg4mc1CNP0HCqCz+K4ts155PXIlUywf0wqN+GfPZw= -github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/flatbuffers v1.11.0/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= +github.com/google/flatbuffers v2.0.8+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= +github.com/google/go-cmp v0.1.1-0.20171103154506-982329095285/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-containerregistry v0.5.1/go.mod h1:Ct15B4yir3PLOP5jsy0GNeYVaIZs/MK/Jz5any1wFW0= -github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/gofuzz v1.1.1-0.20200604201612-c04b05f3adfa/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= +github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20230207041349-798e818bf904/go.mod h1:uglQLonpP8qtYCYyzA+8c/9qtqgA3qsXGYqCPKARAFg= +github.com/google/pprof v0.0.0-20230821062121-407c9e7a662f/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik= +github.com/google/pprof v0.0.0-20231023181126-ff6d637d2a7b/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik= +github.com/google/s2a-go v0.1.0/go.mod h1:OJpEgntRZo8ugHpF9hkoLJbS5dSI20XZeXJ9JVywLlM= +github.com/google/s2a-go v0.1.4/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A= github.com/google/safehtml v0.0.2/go.mod h1:L4KWwDsUJdECRAEpZoBn3O64bQaywRscowZjJAzjHnU= -github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= +github.com/googleapis/enterprise-certificate-proxy v0.1.0/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= +github.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg= +github.com/googleapis/enterprise-certificate-proxy v0.2.1/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= +github.com/googleapis/enterprise-certificate-proxy v0.2.3/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= github.com/googleapis/gax-go v0.0.0-20161107002406-da06d194a00e/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY= -github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= +github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= +github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= +github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= +github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99EXz9pXxye9YM= +github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c= +github.com/googleapis/gax-go/v2 v2.5.1/go.mod h1:h6B0KMMFNtI2ddbGJn3T3ZbwkeT6yqEF02fYlzkUCyo= +github.com/googleapis/gax-go/v2 v2.6.0/go.mod h1:1mjbznJAPHFpesgE5ucqfYEscaz5kMdcIDwU/6+DDoY= +github.com/googleapis/gax-go/v2 v2.7.0/go.mod h1:TEop28CZZQ2y+c0VxMUmu1lV+fQx57QpBWsYpwqHJx8= +github.com/googleapis/gax-go/v2 v2.8.0/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI= +github.com/googleapis/gax-go/v2 v2.10.0/go.mod h1:4UOEnMCrxsSqQ940WnTiD6qJ63le2ev3xfyagutxiPw= +github.com/googleapis/gax-go/v2 v2.11.0/go.mod h1:DxmR61SGKkGLa2xigwuZIQpkCI2S5iydzRfb3peWZJI= github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= +github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= +github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= +github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= github.com/gorilla/css v1.0.0/go.mod h1:Dn721qIggHpt4+EFCcTLTU/vk5ySda2ReITrtgBl60c= github.com/gorilla/handlers v0.0.0-20150720190736-60c7bfde3e33/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= +github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.7.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/graph-gophers/graphql-go v1.3.0/go.mod h1:9CQHMSxwO4MprSdzoIEobiHpoLtHm77vfxsvsIN5Vuc= -github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= +github.com/gostaticanalysis/comment v1.4.2/go.mod h1:KLUTGDv6HOCotCH8h2erHKmpci2ZoR8VPu34YA2uzdM= +github.com/gostaticanalysis/testutil v0.3.1-0.20210208050101-bfb5c8eec0e4/go.mod h1:D+FIZ+7OahH3ePw/izIEeH5I06eKs1IKI4Xr64/Am3M= +github.com/graph-gophers/graphql-go v1.4.0/go.mod h1:YtmJZDLbF1YYNrlNAuiO5zAStUWc3XZT07iGsVqe1Os= +github.com/gregjones/httpcache v0.0.0-20170920190843-316c5e0ff04e/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= +github.com/grpc-ecosystem/go-grpc-middleware v1.2.2/go.mod h1:EaizFBKfUKtMIF5iaDEhniwNedqGo9FuLFzppDr3uwI= +github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0/go.mod h1:hgWBS7lorOAVIJEQMi4ZsPv9hVvWI6+ch50m39Pf2Ks= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.11.3 h1:lLT7ZLSzGLI08vc9cpd+tYmNWjdKDqyr/2L+f6U12Fk= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.11.3/go.mod h1:o//XUCC/F+yRGJoPO/VU0GSB0f8Nhgmxx0VIRUvaC0w= github.com/guptarohit/asciigraph v0.5.5/go.mod h1:dYl5wwK4gNsnFf9Zp+l06rFiDZ5YtXM6x7SRWZ3KGag= +github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= +github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= github.com/hashicorp/errwrap v0.0.0-20141028054710-7554cd9344ce/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/go-bexpr v0.1.10/go.mod h1:oxlubA2vC/gFVfX1A6JGp7ls7uCDlfJn732ehYYg+g0= +github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= +github.com/hashicorp/go-hclog v0.9.2/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= +github.com/hashicorp/go-hclog v1.2.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= +github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= github.com/hashicorp/go-multierror v0.0.0-20161216184304-ed905158d874/go.mod h1:JMRHfdO9jKNzS/+BTlxCjKNQHg/jZAft8U7LloJvN7I= github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/yamux v0.1.1 h1:yrQxtgseBDrq9Y652vSRDvsKCJKOUD+GzTS4Y0Y8pvE= +github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= +github.com/hashicorp/go-retryablehttp v0.7.4/go.mod h1:Jy/gPYAdjqffZ/yFGCFV2doI5wjtH1ewM9u8iYVjtX8= +github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= +github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= +github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= +github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= +github.com/hashicorp/golang-lru/arc/v2 v2.0.5/go.mod h1:ny6zBSQZi2JxIeYcv7kt2sH2PXJtirBN7RDhRpxPkxU= +github.com/hashicorp/hcl v0.0.0-20170914154624-68e816d1c783/go.mod h1:oZtUIOe8dh44I2q6ScRibXws4Ajl+d+nod3AaR9vL5w= +github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= +github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= +github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= +github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= github.com/hashicorp/yamux v0.1.1/go.mod h1:CtWFDAQgb7dxtzFs4tWbplKIe2jSi3+5vKbgIO0SLnQ= +github.com/herumi/bls-eth-go-binary v0.0.0-20210130185500-57372fb27371/go.mod h1:luAnRm3OsMQeokhGzpYmc0ZKwawY7o87PUEP11Z7r7U= +github.com/herumi/bls-eth-go-binary v0.0.0-20210917013441-d37c07cfda4e/go.mod h1:luAnRm3OsMQeokhGzpYmc0ZKwawY7o87PUEP11Z7r7U= +github.com/holiman/goevmlab v0.0.0-20221201133036-b31966a5267d/go.mod h1:tQJ4EfAokPShVDyEwKslIWKyt0qA/z8u+iK3kAwO424= +github.com/holiman/goevmlab v0.0.0-20221207202144-89074274e1b7/go.mod h1:t5n9hEKnVqrEclta+MoEDjI2D9X7bi8OiWGmyYuNhMk= +github.com/holiman/goevmlab v0.0.0-20230917164918-f3777d0b880b/go.mod h1:Xf54jEqUJ0PwTEF9Z6e8FSLpnLpyB0QUfdHA3you/sw= +github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= github.com/huin/goupnp v1.0.3/go.mod h1:ZxNlw5WqJj6wSsRK5+YfflQGXYfccj5VgQsMNixHM7Y= -github.com/huin/goutil v0.0.0-20170803182201-1ca381bf3150/go.mod h1:PpLOETDnJ0o3iZrZfqZzyLl6l7F3c6L1oWn7OICBi6o= +github.com/huin/goupnp v1.2.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8= github.com/hydrogen18/memlistener v0.0.0-20141126152155-54553eb933fb/go.mod h1:qEIFzExnS6016fRpRfxrExeVn2gbClQA99gQhnIcdhE= -github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= +github.com/ianlancetaylor/cgosymbolizer v0.0.0-20200424224625-be1b05b0b279/go.mod h1:a5aratAVTWyz+nJMmDsN8O4XTfaLfdAsB1ysCmZX5Bw= +github.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w= +github.com/ianlancetaylor/demangle v0.0.0-20220517205856-0058ec4f073c/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w= +github.com/ianlancetaylor/demangle v0.0.0-20230524184225-eabc099b10ab/go.mod h1:gx7rwoVhcfuVKG5uya9Hs3Sxj7EIvldVofAWIUtGouw= github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.10/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= +github.com/inconshreveable/log15 v0.0.0-20170622235902-74a0988b5f80/go.mod h1:cOaXtrgN4ScfRrD9Bre7U1thNq5RtJ8ZoP4iXVGRj6o= github.com/influxdata/flux v0.65.1/go.mod h1:J754/zds0vvpfwuq7Gc2wRdVwEodfpCFM7mYlOw2LqY= github.com/influxdata/influxdb v1.8.3/go.mod h1:JugdFhsvvI8gadxOI6noqNeeBHvWNTbfYGtiAn+2jhI= -github.com/influxdata/influxdb-client-go/v2 v2.4.0/go.mod h1:vLNHdxTJkIf2mSLvGrpj8TCcISApPoXkaxP8g9uRlW8= +github.com/influxdata/influxdb-client-go/v2 v2.12.1/go.mod h1:YteV91FiQxRdccyJ2cHvj2f/5sq4y4Njqu1fQzsQCOU= +github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= +github.com/influxdata/influxdb1-client v0.0.0-20220302092344-a9ab5670611c/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= github.com/influxdata/influxql v1.1.1-0.20200828144457-65d3ef77d385/go.mod h1:gHp9y86a/pxhjJ+zMjNXiQAA197Xk9wLxaz+fGG+kWk= github.com/influxdata/line-protocol v0.0.0-20180522152040-32c6aa80de5e/go.mod h1:4kt73NQhadE3daL3WhR5EJ/J2ocX0PZzwxQ0gXJ7oFE= -github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo= github.com/influxdata/line-protocol v0.0.0-20210311194329-9aa0e372d097/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo= +github.com/influxdata/line-protocol v0.0.0-20210922203350-b1ad95c89adf/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo= github.com/influxdata/promql/v2 v2.12.0/go.mod h1:fxOPu+DY0bqCTCECchSRtWfc+0X19ybifQhZoQNF5D8= github.com/influxdata/roaring v0.4.13-0.20180809181101-fc520f41fab6/go.mod h1:bSgUQ7q5ZLSO+bKBGqJiCBGAl+9DxyW63zLTujjUlOE= github.com/influxdata/tdigest v0.0.0-20181121200506-bf2b5ad3c0a9/go.mod h1:Js0mqiSBE6Ffsg94weZZ2c+v/ciT8QRHFOap7EKDrR0= github.com/influxdata/usage-client v0.0.0-20160829180054-6d3895376368/go.mod h1:Wbbw6tYNvwa5dlB6304Sd+82Z3f7PmVZHVKU637d4po= +github.com/intel/goresctrl v0.2.0/go.mod h1:+CZdzouYFn5EsxgqAQTEzMfwKwuc0fVdMrT9FCCAVRQ= +github.com/invopop/yaml v0.1.0/go.mod h1:2XuRLgs/ouIrW3XNzuNj7J3Nvu/Dig5MXvbCEdiBN3Q= +github.com/ipfs/go-cid v0.0.7/go.mod h1:6Ux9z5e+HpkQdckYoX1PG/6xqKspzlEIR5SDmgqgC/I= +github.com/ipfs/go-datastore v0.5.0/go.mod h1:9zhEApYMTl17C8YDp7JmU7sQZi2/wqiYh73hakZ90Bk= +github.com/ipfs/go-datastore v0.6.0/go.mod h1:rt5M3nNbSO/8q1t4LNkLyUwRs8HupMeN/8O4Vn9YAT8= +github.com/ipfs/go-detect-race v0.0.1/go.mod h1:8BNT7shDZPo99Q74BpGMK+4D8Mn4j46UU0LZ723meps= +github.com/ipfs/go-ds-badger v0.3.0/go.mod h1:1ke6mXNqeV8K3y5Ak2bAA0osoTfmxUdupVCGm4QUIek= +github.com/ipfs/go-ds-leveldb v0.5.0/go.mod h1:d3XG9RUDzQ6V4SHi8+Xgj9j1XuEk1z82lquxrVbml/Q= +github.com/ipfs/go-ipfs-delay v0.0.0-20181109222059-70721b86a9a8/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG9QfXmbRPrw= +github.com/ipfs/go-ipfs-util v0.0.2/go.mod h1:CbPtkWJzjLdEcezDns2XYaehFVNXG9zrdrtMecczcsQ= +github.com/ipfs/go-log/v2 v2.0.5/go.mod h1:eZs4Xt4ZUJQFM3DlanGhy7TkwwawCZcSByscwkWG+dw= +github.com/iris-contrib/httpexpect/v2 v2.12.1/go.mod h1:7+RB6W5oNClX7PTwJgJnsQP3ZuUUYB3u61KCqeSgZ88= github.com/iris-contrib/i18n v0.0.0-20171121225848-987a633949d0/go.mod h1:pMCz62A0xJL6I+umB2YTlFRwWXaDFA0jy+5HzGiJjqI= +github.com/iris-contrib/jade v1.1.4/go.mod h1:EDqR+ur9piDl6DUgs6qRrlfzmlx/D5UybogqrXvJTBE= github.com/iris-contrib/schema v0.0.6/go.mod h1:iYszG0IOsuIsfzjymw1kMzTL8YQcCWlm65f3wX8J5iA= github.com/j-keck/arping v0.0.0-20160618110441-2cf9dc699c56/go.mod h1:ymszkNOg6tORTn+6F6j+Jc8TOr5osrynvN6ivFWZ2GA= -github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= -github.com/jedisct1/go-minisign v0.0.0-20190909160543-45766022959e/go.mod h1:G1CVv03EnqU1wYL2dFwXxW2An0az9JTl/ZsqXQeBlkU= +github.com/jbenet/go-cienv v0.1.0/go.mod h1:TqNnHUmJgXau0nCzC7kXWeotg3J9W34CUv5Djy1+FlA= +github.com/jbenet/goprocess v0.1.4/go.mod h1:5yspPrukOVuOLORacaBi858NqyClJPQxYZlqdZVfqY4= +github.com/jcmturner/gofork v1.0.0/go.mod h1:MK8+TM0La+2rjBD4jE12Kj1pCCxK7d2LK/UM3ncEo0o= +github.com/jedisct1/go-minisign v0.0.0-20230811132847-661be99b8267/go.mod h1:h1nSAbGFqGVzn6Jyl1R/iCcBUHN4g+gW1u9CoBTrb9E= github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmespath/go-jmespath v0.0.0-20160803190731-bd40a432e4c7/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= +github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= github.com/joefitzgerald/rainbow-reporter v0.1.0/go.mod h1:481CNgqmVHQZzdIbN52CupLJyoVwB10FQ/IQlF1pdL8= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/joonix/log v0.0.0-20200409080653-9c1d2ceb5f1d/go.mod h1:fS54ONkjDV71zS9CDx3V9K21gJg7byKSvI4ajuWFNJw= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= -github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= -github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= -github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/jsternberg/zap-logfmt v1.0.0/go.mod h1:uvPs/4X51zdkcm5jXl5SYoN+4RK21K8mysFmDaM/h+o= +github.com/juju/ansiterm v0.0.0-20180109212912-720a0952cc2a/go.mod h1:UJSiEoRfvx3hP73CvoARgeLjaIOjybY9vj8PUPPFGeU= github.com/juju/errors v0.0.0-20181118221551-089d3ea4e4d5/go.mod h1:W54LbzXuIE0boCoNJfwqpmkKJ1O4TCTZMetAt6jGk7Q= +github.com/juju/gnuflag v0.0.0-20171113085948-2ce1bb71843d/go.mod h1:2PavIy+JPciBPrBUjwbNvtwB6RQlve+hkpll6QSNmOE= github.com/juju/loggo v0.0.0-20180524022052-584905176618/go.mod h1:vgyd7OREkbtVEN/8IXZe5Ooef3LQePvuBm9UWj6ZL8U= github.com/juju/testing v0.0.0-20180920084828-472a3e8b2073/go.mod h1:63prj8cnj0tU0S9OHjGJn+b1h0ZghCndfnbQolrYTwA= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= github.com/jwilder/encoding v0.0.0-20170811194829-b4e1701a28ef/go.mod h1:Ct9fl0F6iIOGgxJ5npU/IUOhOhqlVrGjyIZc8/MagT0= +github.com/k0kubun/go-ansi v0.0.0-20180517002512-3bf9e2903213 h1:qGQQKEcAR99REcMpsXCp3lJ03zYT1PkRd3kQGPn9GVg= +github.com/k0kubun/go-ansi v0.0.0-20180517002512-3bf9e2903213/go.mod h1:vNUNkEQ1e29fT/6vq2aBdFsgNPmy8qMdSay1npru+Sw= github.com/karalabe/usb v0.0.2/go.mod h1:Od972xHfMJowv7NGVDiWVxk2zxnWgjLlJzE+F4F7AGU= +github.com/karalabe/usb v0.0.3-0.20230711191512-61db3e06439c/go.mod h1:Od972xHfMJowv7NGVDiWVxk2zxnWgjLlJzE+F4F7AGU= github.com/kataras/blocks v0.0.7/go.mod h1:UJIU97CluDo0f+zEjbnbkeMRlvYORtmc1304EeyXf4I= github.com/kataras/golog v0.0.9/go.mod h1:12HJgwBIZFNGL0EJnMRhmvGA0PQGx8VFwrZtM4CqbAk= github.com/kataras/golog v0.1.8/go.mod h1:rGPAin4hYROfk1qT9wZP6VY2rsb4zzc37QpdPjdkqVw= github.com/kataras/iris/v12 v12.0.1/go.mod h1:udK4vLQKkdDqMGJJVd/msuMtN6hpYJhg/lSzuxjhO+U= github.com/kataras/iris/v12 v12.2.0/go.mod h1:BLzBpEunc41GbE68OUaQlqX4jzi791mx5HU04uPb90Y= +github.com/kataras/jwt v0.1.8/go.mod h1:Q5j2IkcIHnfwy+oNY3TVWuEBJNw0ADgCcXK9CaZwV4o= github.com/kataras/neffos v0.0.10/go.mod h1:ZYmJC07hQPW67eKuzlfY7SO3bC0mw83A3j6im82hfqw= +github.com/kataras/neffos v0.0.21/go.mod h1:FeGka8lu8cjD2H+0OpBvW8c6xXawy3fj5VX6xcIJ1Fg= github.com/kataras/pio v0.0.0-20190103105442-ea782b38602d/go.mod h1:NV88laa9UiiDuX9AhMbDPkGYSPugBOV6yTZB1l2K9Z0= github.com/kataras/pio v0.0.11/go.mod h1:38hH6SWH6m4DKSYmRhlrCJ5WItwWgCVrTNU62XZyUvI= github.com/kataras/sitemap v0.0.6/go.mod h1:dW4dOCNs896OR1HmG+dMLdT7JjDk7mYBzoIRwuj5jA4= github.com/kataras/tunnel v0.0.4/go.mod h1:9FkU4LaeifdMWqZu7o20ojmW4B7hdhv2CMLwfnHGpYw= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= -github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= +github.com/klauspost/asmfmt v1.3.2/go.mod h1:AG8TuvYojzulgDAMCnYn50l/5QV3Bs/tp6j0HLHbNSE= github.com/klauspost/compress v1.4.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= github.com/klauspost/compress v1.9.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= +github.com/klauspost/compress v1.9.8/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= +github.com/klauspost/compress v1.10.1/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= +github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.11.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.11.13/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.15.0/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= github.com/klauspost/compress v1.16.0/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= +github.com/klauspost/compress v1.17.2/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= github.com/klauspost/cpuid v0.0.0-20170728055534-ae7887de9fa5/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= github.com/klauspost/cpuid v1.2.1 h1:vJi+O/nMdFt0vqm8NZBI6wzALWdA2X+egi0ogNyrC/w= +github.com/klauspost/cpuid v1.2.3 h1:CCtW0xUnWGVINKvE/WWOYKdsPV6mawAtvQuSl8guwQs= +github.com/klauspost/cpuid v1.2.3/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/klauspost/cpuid/v2 v2.2.3/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= +github.com/klauspost/cpuid/v2 v2.2.5/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= +github.com/klauspost/cpuid/v2 v2.2.6/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= github.com/klauspost/crc32 v0.0.0-20161016154125-cb6bfca970f6/go.mod h1:+ZoRqAPRLkC4NPOvfYeR5KNOrY6TD+/sAC3HXPZgDYg= github.com/klauspost/pgzip v1.0.2-0.20170402124221-0bf5dcad4ada/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= +github.com/klauspost/reedsolomon v1.9.3/go.mod h1:CwCi+NUr9pqSVktrkN+Ondf06rkhYZ/pcNv7fu+8Un4= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/korovkin/limiter v0.0.0-20221015170604-22eb1ceceddc/go.mod h1:mM0lzivCxB6c8msz/LOP9lJgZxy92GXwGcNG1A7UZEE= +github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= -github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= -github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= +github.com/kylelemons/godebug v0.0.0-20170224010052-a616ab194758/go.mod h1:B69LEHPfb2qLo0BaaOLcbitczOKLWTsrBG9LczfCD4k= github.com/labstack/echo/v4 v4.1.11/go.mod h1:i541M3Fj6f76NZtHSj7TXnyM8n2gaodfvfxNnFqi74g= github.com/labstack/echo/v4 v4.2.1/go.mod h1:AA49e0DZ8kk5jTOOCKNuPR6oTnBS0dYiM4FW1e6jwpg= +github.com/labstack/echo/v4 v4.9.1/go.mod h1:Pop5HLc+xoc4qhTZ1ip6C0RtP7Z+4VzRLWZZFKqbbjo= github.com/labstack/echo/v4 v4.10.0/go.mod h1:S/T/5fy/GigaXnHTkh0ZGe4LpkkQysvRjFMSUTkDRNQ= github.com/labstack/gommon v0.4.0/go.mod h1:uW6kP17uPlLJsD3ijUYn3/M5bAxtlZhMI6m3MFxTMTM= -github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= +github.com/ledongthuc/pdf v0.0.0-20220302134840-0c2507a12d80/go.mod h1:imJHygn/1yfhB7XSJJKlFZKl/J+dCPAknuiaGOshXAs= +github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY= +github.com/leodido/go-urn v1.2.3 h1:6BE2vPT0lqoz3fmOesHZiaiFh7889ssCo2GMvLCfiuA= +github.com/leodido/go-urn v1.2.3/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNaVckg+4= +github.com/lestrrat-go/backoff/v2 v2.0.8/go.mod h1:rHP/q/r9aT27n24JQLa7JhSQZCKBBOiM/uP402WwN8Y= +github.com/lestrrat-go/blackmagic v1.0.0/go.mod h1:TNgH//0vYSs8VXDCfkZLgIrVTTXQELZffUV0tz3MtdQ= +github.com/lestrrat-go/httpcc v1.0.1/go.mod h1:qiltp3Mt56+55GPVCbTdM9MlqhvzyuL6W/NMDA8vA5E= +github.com/lestrrat-go/iter v1.0.1/go.mod h1:zIdgO1mRKhn8l9vrZJZz9TUMMFbQbLeTsbqPDrJ/OJc= +github.com/lestrrat-go/jwx v1.2.25/go.mod h1:zoNuZymNl5lgdcu6P7K6ie2QRll5HVfF4xwxBBK1NxY= +github.com/lestrrat-go/option v1.0.0/go.mod h1:5ZHFbivi4xwXxhxY9XHDe2FHo6/Z7WWmtT7T5nBBp3I= github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/libp2p/go-buffer-pool v0.0.2/go.mod h1:MvaB6xw5vOrDl8rYZGLFdKAuk/hRoRZd1Vi32+RXyFM= +github.com/libp2p/go-cidranger v1.1.0/go.mod h1:KWZTfSr+r9qEo9OkI9/SIEeAtw+NNoU0dXIXt15Okic= +github.com/libp2p/go-libp2p v0.32.0/go.mod h1:hXXC3kXPlBZ1eu8Q2hptGrMB4mZ3048JUoS4EKaHW5c= +github.com/libp2p/go-libp2p v0.32.1/go.mod h1:hXXC3kXPlBZ1eu8Q2hptGrMB4mZ3048JUoS4EKaHW5c= +github.com/libp2p/zeroconf/v2 v2.2.0/go.mod h1:fuJqLnUwZTshS3U/bMRJ3+ow/v9oid1n0DmyYyNO1Xs= +github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= +github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= github.com/linuxkit/virtsock v0.0.0-20201010232012-f8cee7dfc7a3/go.mod h1:3r6x7q95whyfWQpmGZTu3gk3v2YkMi05HEzl7Tf7YEo= +github.com/logrusorgru/aurora v2.0.3+incompatible h1:tOpm7WcpBTn4fjmVfgpQq0EfczGlG91VSDkswnjF5A8= +github.com/logrusorgru/aurora v2.0.3+incompatible/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4= +github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= +github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= +github.com/lunixbochs/vtclean v0.0.0-20180621232353-2d01aacdc34a/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI= +github.com/lyft/protoc-gen-star v0.6.0/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA= +github.com/lyft/protoc-gen-star v0.6.1/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA= +github.com/lyft/protoc-gen-star/v2 v2.0.1/go.mod h1:RcCdONR2ScXaYnQC5tUzxzlpA3WVYF7/opLeUgcQs/o= +github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= +github.com/magiconair/properties v1.7.4-0.20170902060319-8d7837e64d3c/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/mailgun/raymond/v2 v2.0.48/go.mod h1:lsgvL50kgt1ylcFJYZiULi5fjPBkkhNfj4KA0W54Z18= github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= +github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/manifoldco/promptui v0.7.0/go.mod h1:n4zTdgP0vr0S3w7/O/g98U+e0gwLScEXGwov2nIKuGQ= +github.com/marioevz/eth-clients v0.0.0-20230823175101-fdc85382188d/go.mod h1:LZb4HPhmomFs5C3Rxj57X83yp3qzQHgB/xDAsvrFmDw= +github.com/marioevz/eth-clients v0.0.0-20231018141729-9f6835ddc56b/go.mod h1:YVrdn57Q3rAzm3wus4T9tg1vMPca4csVbzorPhkGCW0= +github.com/marioevz/zrnt v0.26.2-0.20230828220330-2bd62bc28aed h1:sXvMvzGd7Q28BcDrE8vxaN0iAYwo8y+qL6dDIx/kg78= +github.com/marioevz/zrnt v0.26.2-0.20230828220330-2bd62bc28aed/go.mod h1:qcdX9CXFeVNCQK/q0nswpzhd+31RHMk2Ax/2lMsJ4Jw= github.com/marstr/guid v1.1.0/go.mod h1:74gB1z2wpxxInTG6yaqA7KrtM0NZ+RbrcqDvYHefzho= github.com/matryer/moq v0.0.0-20190312154309-6cfb0558e1bd/go.mod h1:9ELz6aaclSIGnZBoaSLZ3NAl1VTufbOrXBPvtcy6WiQ= +github.com/matryer/moq v0.2.7/go.mod h1:kITsx543GOENm48TUAQyJ9+SAvFSr7iGQXPoth/VUBk= github.com/matryer/try v0.0.0-20161228173917-9ac251b645a2/go.mod h1:0KeJpeMD6o+O4hW7qJOT7vyQPKrWmj26uf5wMc/IiIs= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= +github.com/mattn/go-colorable v0.0.10-0.20170816031813-ad5389df28cd/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= +github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.7/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= +github.com/mattn/go-isatty v0.0.2/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= +github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/mattn/go-shellwords v1.0.3/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o= github.com/mattn/go-shellwords v1.0.6/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o= github.com/mattn/go-sqlite3 v1.11.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= github.com/mattn/go-sqlite3 v1.14.5/go.mod h1:WVKg1VTActs4Qso6iwGbiFih2UIHo0ENGwNd0Lj+XmI= github.com/mattn/go-tty v0.0.0-20180907095812-13ff1204f104/go.mod h1:XPvLUNfbS4fJH25nqRHfWLMa1ONC8Amw+mIA639KxkE= -github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= +github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0/go.mod h1:QUyp042oQthUoa9bqDv0ER0wrtXnBruoNd7aNjkbP+k= github.com/maxbrunsfeld/counterfeiter/v6 v6.2.2/go.mod h1:eD9eIE7cdwcMi9rYluz88Jz2VyhSmden33/aXg4oVIY= github.com/mediocregopher/mediocre-go-lib v0.0.0-20181029021733-cb65787f37ed/go.mod h1:dSsfyI2zABAdhcbvkXqgxOxrCsbYeHCPgrZkku60dSg= github.com/mediocregopher/radix/v3 v3.3.0/go.mod h1:EmfVyvspXz1uZEyPBMyGK+kjWiKQGvsUt6O3Pj+LDCQ= +github.com/mediocregopher/radix/v3 v3.8.1/go.mod h1:8FL3F6UQRXHXIBSPUs5h0RybMF8i4n7wVopoX3x7Bv8= +github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= github.com/microcosm-cc/bluemonday v1.0.23/go.mod h1:mN70sk7UkkF8TUr2IGBpNN0jAgStuPzlK76QuruE/z4= +github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= +github.com/miekg/dns v1.1.43/go.mod h1:+evo5L0630/F6ca/Z9+GAqzhjGyn8/c+TBaOyfEl0V4= +github.com/miekg/dns v1.1.56/go.mod h1:cRm6Oo2C8TY9ZS/TqsSrseAcncm74lfK5G+ikN2SWWY= github.com/miekg/pkcs11 v1.0.3/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= +github.com/miekg/pkcs11 v1.1.1/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= +github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8/go.mod h1:mC1jAcsrzbxHt8iiaC+zU4b1ylILSosueou12R++wfY= +github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3/go.mod h1:RagcQ7I8IeTMnF8JTXieKnO4Z6JCsikNEzj0DwauVzE= +github.com/minio/sha256-simd v0.1.1/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM= github.com/mistifyio/go-zfs v2.1.2-0.20190413222219-f784269be439+incompatible/go.mod h1:8AuVvqP/mXw1px98n46wfvcGfQ4ci2FwoAjKYxuo3Z4= +github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= +github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db h1:62I3jR2EmQ4l5rM/4FEfDWcRD+abF5XlKShorW5LRoQ= +github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db/go.mod h1:l0dey0ia/Uv7NcFFVbCLtqEBQbrT4OCwCSKTEv6enCw= +github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= +github.com/mitchellh/go-wordwrap v1.0.1/go.mod h1:R62XHJLzvMFRBbcrT7m7WgmE1eOyTSsCt+hzestvNj0= +github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= +github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= +github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v0.0.0-20170523030023-d0303fe80992/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.3.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/osext v0.0.0-20151018003038-5e2d6d41470f/go.mod h1:OkQIRizQZAeMln+1tSwduZz7+Af5oFlKirV/MSYes2A= github.com/mitchellh/pointerstructure v1.2.0/go.mod h1:BRAsLI5zgXmw97Lf6s25bs8ohIXc3tViBH44KcwB2g4= -github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqkyU72HC5wJ4RlU= -github.com/mmcloughlin/profile v0.1.1/go.mod h1:IhHD7q1ooxgwTgjxQYkACGA77oFTDdFVejUS1/tS/qU= github.com/moby/locker v1.0.1/go.mod h1:S7SDdo5zpBK84bzzVlKr2V0hz+7x9hWbYC/kq7oQppc= +github.com/moby/patternmatcher v0.6.0/go.mod h1:hDPoyOpDY7OrrMDLaYoY3hf52gNCR/YOUYxkhApJIxc= github.com/moby/sys/mount v0.3.3 h1:fX1SVkXFJ47XWDoeFW4Sq7PdQJnV2QIDZAqjNqgEjUs= github.com/moby/sys/mount v0.3.3/go.mod h1:PBaEorSNTLG5t/+4EgukEQVlAvVEc6ZjTySwKdqp5K0= github.com/moby/sys/mountinfo v0.4.0/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2JI+6q0qou+A= @@ -647,52 +1193,76 @@ github.com/moby/sys/mountinfo v0.4.1/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2J github.com/moby/sys/mountinfo v0.5.0/go.mod h1:3bMD3Rg+zkqx8MRYPi7Pyb0Ie97QEBmdxbhnCLlSvSU= github.com/moby/sys/mountinfo v0.6.2 h1:BzJjoreD5BMFNmD9Rus6gdd1pLuecOFPt8wC+Vygl78= github.com/moby/sys/mountinfo v0.6.2/go.mod h1:IJb6JQeOklcdMU9F5xQ8ZALD+CUr5VlGpwtX+VE0rpI= +github.com/moby/sys/sequential v0.5.0/go.mod h1:tH2cOOs5V9MlPiXcQzRC+eEyab644PWKGRYaaV5ZZlo= +github.com/moby/sys/signal v0.6.0/go.mod h1:GQ6ObYZfqacOwTtlXvcmh9A26dVRul/hbOZn88Kg8Tg= github.com/moby/sys/symlink v0.1.0/go.mod h1:GGDODQmbFOjFsXvfLVn3+ZRxkch54RkSiGqsZeMYowQ= +github.com/moby/sys/symlink v0.2.0/go.mod h1:7uZVF2dqJjG/NsClqul95CqKOBRQyYSNnJ6BMgR/gFs= github.com/moby/term v0.0.0-20200312100748-672ec06f55cd/go.mod h1:DdlQx2hp0Ss5/fLikoLlEeIYiATotOjgB//nb973jeo= -github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6 h1:dcztxKSvZ4Id8iPpHERQBbIJfabdt4wUm5qy3wOL2Zc= github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6/go.mod h1:E2VnQOmVuvZB6UYnnDB0qG5Nq/1tD9acaOpo6xmt0Kw= -github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5/go.mod h1:caMODM3PzxT8aQXRPkAt8xlV/e7d7w8GM5g0fa5F0D8= -github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= +github.com/montanaflynn/stats v0.6.6/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= +github.com/montanaflynn/stats v0.7.0/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= +github.com/mr-tron/base58 v1.1.0/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= +github.com/mr-tron/base58 v1.1.3/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= github.com/mrunalp/fileutils v0.5.0/go.mod h1:M1WthSahJixYnrXQl/DFQuteStB1weuxD2QJNHXfbSQ= github.com/mschoch/smat v0.0.0-20160514031455-90eadee771ae/go.mod h1:qAyveg+e4CE+eKJXWVjKXM4ck2QobLqTDytGJbLLhJg= -github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= +github.com/multiformats/go-base32 v0.0.3/go.mod h1:pLiuGC8y0QR3Ue4Zug5UzK9LjgbkL8NSQj0zQ5Nz/AA= +github.com/multiformats/go-base36 v0.1.0/go.mod h1:kFGE83c6s80PklsHO9sRn2NCoffoRdUUOENyW/Vv6sM= +github.com/multiformats/go-multiaddr v0.12.0/go.mod h1:WmZXgObOQOYp9r3cslLlppkrz1FYSHmE834dfz/lWu8= +github.com/multiformats/go-multiaddr v0.12.1/go.mod h1:7mPkiBMmLeFipt+nNSq9pHZUeJSt8lHBgH6yhj0YQzE= +github.com/multiformats/go-multibase v0.0.3/go.mod h1:5+1R4eQrT3PkYZ24C3W2Ue2tPwIdYQD509ZjSb5y9Oc= +github.com/multiformats/go-multihash v0.0.13/go.mod h1:VdAWLKTwram9oKAatUcLxBNUjdtcVwxObEQBtRfuyjc= +github.com/multiformats/go-multihash v0.0.15/go.mod h1:D6aZrWNLFTV/ynMpKsNtB40mJzmCl4jb1alC0OvHiHg= +github.com/multiformats/go-varint v0.0.5/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= +github.com/multiformats/go-varint v0.0.6/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= -github.com/naoina/go-stringutil v0.1.0/go.mod h1:XJ2SJL9jCtBh+P9q5btrd/Ylo8XwT/h1USek5+NqSA0= -github.com/naoina/toml v0.1.2-0.20170918210437-9fafd6967416/go.mod h1:NBIhNtsFMo3G2szEBne+bO4gS192HuIYRqfvOWb4i1E= +github.com/nats-io/jwt v0.3.2/go.mod h1:/euKqTS1ZD+zzjYrY7pseZrTtWQSjujC7xjPc8wL6eU= +github.com/nats-io/jwt/v2 v2.3.0/go.mod h1:0tqz9Hlu6bCBFLWAASKhE5vUA4c24L9KPUUgvwumE/k= +github.com/nats-io/nats-server/v2 v2.1.2/go.mod h1:Afk+wRZqkMQs/p45uXdrVLuab3gwv3Z8C4HTBu8GD/k= github.com/nats-io/nats.go v1.8.1/go.mod h1:BrFz9vVn0fU3AcH9Vn4Kd7W0NpJ651tD5omQ3M8LwxM= +github.com/nats-io/nats.go v1.23.0/go.mod h1:ki/Scsa23edbh8IRZbCuNXR9TDcbvfaSijKtaqQgw+Q= github.com/nats-io/nkeys v0.0.2/go.mod h1:dab7URMsZm6Z/jp9Z5UGa87Uutgc2mVpXLC4B7TDb/4= +github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= +github.com/nats-io/nkeys v0.3.0/go.mod h1:gvUNGjVcM2IPr5rCsRsC6Wb3Hr2CQAm08dsxtV6A5y4= github.com/ncw/swift v1.0.47/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= +github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= +github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= github.com/onsi/ginkgo v0.0.0-20151202141238-7f8ab55aaf3b/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg= github.com/onsi/ginkgo v1.13.0/go.mod h1:+REjRxOmWfHCjfv9TTWB1jD1Frx4XydAD3zm1lskyM0= -github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= +github.com/onsi/ginkgo/v2 v2.0.0/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= +github.com/onsi/ginkgo/v2 v2.9.1/go.mod h1:FEcmzVcCHl+4o9bQZVab+4dC9+j+91t2FHSzmGAPfuo= +github.com/onsi/ginkgo/v2 v2.9.5/go.mod h1:tvAoo1QUJwNEU2ITftXTpR7R1RbCzoZUOs3RonqW57k= +github.com/onsi/ginkgo/v2 v2.12.0/go.mod h1:ZNEzXISYlqpb8S36iN71ifqLi3vVD1rVJGvWRCJOUpQ= +github.com/onsi/ginkgo/v2 v2.13.0/go.mod h1:TE309ZR8s5FsKKpuB1YAQYBzCaAfUgatB/xlT/ETL/o= github.com/onsi/gomega v0.0.0-20151007035656-2152b45fa28a/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= +github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= github.com/onsi/gomega v1.10.3/go.mod h1:V9xEwhxec5O8UDM77eCW8vLymOMltsqPVYWrpDsH8xc= +github.com/onsi/gomega v1.18.1/go.mod h1:0q+aL8jAiMXy9hbwj2mr5GziHiwhAIQpFmmtT5hitRs= +github.com/onsi/gomega v1.27.4/go.mod h1:riYq/GJKh8hhoM01HN6Vmuy93AarCXCBGpvFDK3q3fQ= +github.com/onsi/gomega v1.27.6/go.mod h1:PIQNjfQwkP3aQAH7lf7j87O/5FiNr+ZR8+ipb+qQlhg= +github.com/onsi/gomega v1.27.10/go.mod h1:RsS8tutOdbdgzbPtzzATp12yT7kM5I5aElG3evPbQ0M= +github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= +github.com/openconfig/gnmi v0.0.0-20190823184014-89b2bf29312c/go.mod h1:t+O9It+LKzfOAhKTT5O0ehDix+MTqbtT0T9t+7zzOvc= +github.com/openconfig/reference v0.0.0-20190727015836-8dfd928c9696/go.mod h1:ym2A+zigScwkSEb/cVQB0/ZMpU3rqiH6X7WRRsxgOGw= github.com/opencontainers/go-digest v0.0.0-20170106003457-a6d0ee40d420/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= github.com/opencontainers/go-digest v0.0.0-20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= github.com/opencontainers/go-digest v1.0.0-rc1.0.20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= -github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opencontainers/image-spec v1.0.0/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= -github.com/opencontainers/image-spec v1.0.3-0.20211202183452-c5a74bcca799 h1:rc3tiVYb5z54aKaDfakKn0dDjIyPpTtszkjuMzyt7ec= github.com/opencontainers/image-spec v1.0.3-0.20211202183452-c5a74bcca799/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= github.com/opencontainers/runc v0.0.0-20190115041553-12f6a991201f/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= github.com/opencontainers/runc v0.1.1/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= @@ -700,118 +1270,230 @@ github.com/opencontainers/runc v1.0.0-rc8.0.20190926000215-3e425f80a8c9/go.mod h github.com/opencontainers/runc v1.0.0-rc9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= github.com/opencontainers/runc v1.0.0-rc93/go.mod h1:3NOsor4w32B2tC0Zbl8Knk4Wg84SM2ImC1fxBuqJ/H0= github.com/opencontainers/runc v1.0.2/go.mod h1:aTaHFFwQXuA71CiyxOdFFIorAoemI04suvGRQFzWTD0= -github.com/opencontainers/runc v1.1.5 h1:L44KXEpKmfWDcS02aeGm8QNTFXTo2D+8MYGDIJ/GDEs= github.com/opencontainers/runc v1.1.5/go.mod h1:1J5XiS+vdZ3wCyZybsuxXZWGrgSr8fFJHLXuG2PsnNg= github.com/opencontainers/runtime-spec v0.1.2-0.20190507144316-5b71a03e2700/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opencontainers/runtime-spec v1.0.1/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opencontainers/runtime-spec v1.0.2-0.20190207185410-29686dbc5559/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-spec v1.0.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opencontainers/runtime-spec v1.0.3-0.20200929063507-e6143ca7d51d/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-spec v1.1.0/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opencontainers/runtime-tools v0.0.0-20181011054405-1d69bd0f9c39/go.mod h1:r3f7wjNzSs2extwzU3Y+6pKfobzPh+kKFJ3ofN+3nfs= github.com/opencontainers/selinux v1.6.0/go.mod h1:VVGKuOLlE7v4PJyT6h7mNWvq1rzqiriPsEqVhc+svHE= github.com/opencontainers/selinux v1.8.0/go.mod h1:RScLhm78qiWa2gbVCcGkC7tCGdgk3ogry1nUQF8Evvo= github.com/opencontainers/selinux v1.8.2/go.mod h1:MUIHuUEvKB1wtJjQdOyYRgOnLD2xAPP8dBsCoU0KuF8= github.com/opencontainers/selinux v1.10.0/go.mod h1:2i0OySw99QjzBBQByd1Gr9gSjvuho1lHsJxIJ3gGbJI= +github.com/opencontainers/selinux v1.10.1/go.mod h1:2i0OySw99QjzBBQByd1Gr9gSjvuho1lHsJxIJ3gGbJI= +github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis= +github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74= github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/opentracing/opentracing-go v1.0.3-0.20180606204148-bd9c31933947/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= +github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.5/go.mod h1:/wsWhb9smxSfWAKL3wpBW7V8scJMt8N8gnaMCS9E/cA= +github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= +github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= +github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= +github.com/orisano/pixelmatch v0.0.0-20220722002657-fb0b55479cde/go.mod h1:nZgzbfBr3hhjoZnS66nKrHmduYNpc34ny7RK4z5/HM0= +github.com/otiai10/copy v1.2.0/go.mod h1:rrF5dJ5F0t/EWSYODDu4j9/vEeYHMkc8jt0zJChqQWw= +github.com/otiai10/curr v0.0.0-20150429015615-9b4961190c95/go.mod h1:9qAhocn7zKJG+0mI8eUu6xqkFDYS2kb2saOteoSB3cE= +github.com/otiai10/curr v1.0.0/go.mod h1:LskTG5wDwr8Rs+nNQ+1LlxRjAtTZZjtJW4rMXl6j4vs= +github.com/otiai10/mint v1.3.0/go.mod h1:F5AjcsTsWUqX+Na9fpHb52P8pcRX2CI6A3ctIT91xUo= +github.com/otiai10/mint v1.3.1/go.mod h1:/yxELlJQ0ufhjUwhshSj+wFjZ78CnZ48/1wtmBH1OTc= +github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM= +github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/paulbellamy/ratecounter v0.2.0/go.mod h1:Hfx1hDpSGoqxkVVpBi/IlYD7kChlfo5C6hzIHwPqfFE= +github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= +github.com/pborman/uuid v1.2.1/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= +github.com/pelletier/go-toml v1.0.1-0.20170904195809-1d6b12b7cb29/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pelletier/go-toml v1.8.1/go.mod h1:T2/BmBdy8dvIRq1a/8aqjN41wvWlN4lrapLU/GW4pbc= +github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= +github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= +github.com/pelletier/go-toml/v2 v2.0.5 h1:ipoSadvV8oGUjnUbMub59IDPPwfxF694nG/jwbMiyQg= github.com/pelletier/go-toml/v2 v2.0.5/go.mod h1:OMHamSCAODeSsVrwwvcJOaoN0LIUIaFVNZzmWyNfXas= -github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= +github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= github.com/peterh/liner v1.0.1-0.20180619022028-8c1271fcf47f/go.mod h1:xIteQHvHuaLYG9IFj6mSxM0fCKrs34IrEQUhOYuGPHc= -github.com/peterh/liner v1.1.1-0.20190123174540-a2c9a5303de7/go.mod h1:CRroGNssyjTd/qIG2FyxByd2S8JEAZXBl4qUrZf8GS0= +github.com/peterh/liner v1.2.0/go.mod h1:CRroGNssyjTd/qIG2FyxByd2S8JEAZXBl4qUrZf8GS0= +github.com/peterh/liner v1.2.2/go.mod h1:xFwJyiKIXJZUKItq5dGHZSTBRAuG/CpeNpWLyiNRNwI= github.com/philhofer/fwd v1.0.0/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU= github.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY= github.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= github.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= +github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= +github.com/pierrec/lz4 v2.4.1+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= +github.com/pierrec/lz4/v4 v4.1.15/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= +github.com/pion/datachannel v1.5.5/go.mod h1:iMz+lECmfdCMqFRhXhcA/219B0SQlbpoR2V118yimL0= +github.com/pion/dtls/v2 v2.2.7/go.mod h1:8WiMkebSHFD0T+dIU+UeBaoV7kDhOW5oDCzZ7WZ/F9s= +github.com/pion/dtls/v2 v2.2.8/go.mod h1:8WiMkebSHFD0T+dIU+UeBaoV7kDhOW5oDCzZ7WZ/F9s= +github.com/pion/ice/v2 v2.3.11/go.mod h1:hPcLC3kxMa+JGRzMHqQzjoSj3xtE9F+eoncmXLlCL4E= +github.com/pion/interceptor v0.1.25/go.mod h1:wkbPYAak5zKsfpVDYMtEfWEy8D4zL+rpxCxPImLOg3Y= +github.com/pion/logging v0.2.2/go.mod h1:k0/tDVsRCX2Mb2ZEmTqNa7CWsQPc+YYCB7Q+5pahoms= +github.com/pion/mdns v0.0.8/go.mod h1:hYE72WX8WDveIhg7fmXgMKivD3Puklk0Ymzog0lSyaI= +github.com/pion/mdns v0.0.9/go.mod h1:2JA5exfxwzXiCihmxpTKgFUpiQws2MnipoPK09vecIc= +github.com/pion/randutil v0.1.0/go.mod h1:XcJrSMMbbMRhASFVOlj/5hQial/Y8oH/HVo7TBZq+j8= +github.com/pion/rtcp v1.2.10/go.mod h1:ztfEwXZNLGyF1oQDttz/ZKIBaeeg/oWbRYqzBM9TL1I= +github.com/pion/rtcp v1.2.12/go.mod h1:sn6qjxvnwyAkkPzPULIbVqSKI5Dv54Rv7VG0kNxh9L4= +github.com/pion/rtcp v1.2.13/go.mod h1:sn6qjxvnwyAkkPzPULIbVqSKI5Dv54Rv7VG0kNxh9L4= +github.com/pion/rtp v1.8.2/go.mod h1:pBGHaFt/yW7bf1jjWAoUjpSNoDnw98KTMg+jWWvziqU= +github.com/pion/rtp v1.8.3/go.mod h1:pBGHaFt/yW7bf1jjWAoUjpSNoDnw98KTMg+jWWvziqU= +github.com/pion/sctp v1.8.5/go.mod h1:SUFFfDpViyKejTAdwD1d/HQsCu+V/40cCs2nZIvC3s0= +github.com/pion/sctp v1.8.8/go.mod h1:igF9nZBrjh5AtmKc7U30jXltsFHicFCXSmWA2GWRaWs= +github.com/pion/sctp v1.8.9/go.mod h1:cMLT45jqw3+jiJCrtHVwfQLnfR0MGZ4rgOJwUOIqLkI= +github.com/pion/sdp/v3 v3.0.6/go.mod h1:iiFWFpQO8Fy3S5ldclBkpXqmWy02ns78NOKoLLL0YQw= +github.com/pion/srtp/v2 v2.0.18/go.mod h1:0KJQjA99A6/a0DOVTu1PhDSw0CXF2jTkqOoMg3ODqdA= +github.com/pion/stun v0.6.1/go.mod h1:/hO7APkX4hZKu/D0f2lHzNyvdkTGtIy3NDmLR7kSz/8= +github.com/pion/transport v0.14.1/go.mod h1:4tGmbk00NeYA3rUa9+n+dzCCoKkcy3YlYb99Jn2fNnI= +github.com/pion/transport/v2 v2.2.1/go.mod h1:cXXWavvCnFF6McHTft3DWS9iic2Mftcz1Aq29pGcU5g= +github.com/pion/transport/v2 v2.2.2/go.mod h1:OJg3ojoBJopjEeECq2yJdXH9YVrUJ1uQ++NjXLOUorc= +github.com/pion/transport/v2 v2.2.3/go.mod h1:q2U/tf9FEfnSBGSW6w5Qp5PFWRLRj3NjLhCCgpRK4p0= +github.com/pion/transport/v2 v2.2.4/go.mod h1:q2U/tf9FEfnSBGSW6w5Qp5PFWRLRj3NjLhCCgpRK4p0= +github.com/pion/transport/v3 v3.0.1/go.mod h1:UY7kiITrlMv7/IKgd5eTUcaahZx5oUN3l9SzK5f5xE0= +github.com/pion/turn/v2 v2.1.3/go.mod h1:huEpByKKHix2/b9kmTAM3YoX6MKP+/D//0ClgUYR2fY= +github.com/pion/turn/v2 v2.1.4/go.mod h1:huEpByKKHix2/b9kmTAM3YoX6MKP+/D//0ClgUYR2fY= +github.com/pion/webrtc/v3 v3.2.23/go.mod h1:1CaT2fcZzZ6VZA+O1i9yK2DU4EOcXVvSbWG9pr5jefs= +github.com/pkg/browser v0.0.0-20210115035449-ce105d075bb4/go.mod h1:N6UoU20jOqggOuDwUaBQpluzLNDqif3kq9z2wpdYEfQ= +github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1-0.20171018195549-f15c970de5b7/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA= +github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= +github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= github.com/pkg/term v0.0.0-20180730021639-bffc007b7fd5/go.mod h1:eCbImbZ95eXtAUIbLAuAVnBnwf83mjf6QIVH8SHYwqQ= +github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= +github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= +github.com/prashantv/gostub v1.1.0/go.mod h1:A5zLQHz7ieHGG7is6LLXLz7I8+3LZzsrV0P1IAHhP5U= github.com/prometheus/client_golang v0.0.0-20180209125602-c332b6f63c06/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs= github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g= +github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og= +github.com/prometheus/client_golang v1.4.1/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= +github.com/prometheus/client_golang v1.9.0/go.mod h1:FqZLKOZnGdFAhOK4nqGHa7D66IdsO+O441Eve7ptJDU= github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= github.com/prometheus/client_golang v1.12.0/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= github.com/prometheus/client_model v0.0.0-20171117100541-99fa1f4be8e5/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.2.1-0.20210607210712-147c58e9608a/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= +github.com/prometheus/client_model v0.4.0/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU= +github.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI= github.com/prometheus/common v0.0.0-20180110214958-89604d197083/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= +github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc= +github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= +github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= +github.com/prometheus/common v0.15.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= github.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA= +github.com/prometheus/common v0.45.0/go.mod h1:YJmSTw9BoKxJplESWWxlbyttQR4uaEcGyv9MZjVOJsY= github.com/prometheus/procfs v0.0.0-20180125133057-cb4147076ac7/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.0-20190522114515-bc1a522cf7b1/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= github.com/prometheus/procfs v0.0.5/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= +github.com/prometheus/procfs v0.0.10/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4= +github.com/prometheus/prom2json v1.3.0 h1:BlqrtbT9lLH3ZsOVhXPsHzFrApCTKRifB7gjJuypu6Y= +github.com/prometheus/prom2json v1.3.0/go.mod h1:rMN7m0ApCowcoDlypBHlkNbp5eJQf/+1isKykIP5ZnM= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= +github.com/prometheus/tsdb v0.10.0/go.mod h1:oi49uRhEe9dPUTlS3JRZOwJuVi6tmh10QSgwXEyGCt4= +github.com/protolambda/messagediff v1.4.0 h1:fk6gxK7WybJCaeOFK1yuh2Ldplx7qYMLibiMwWFcSZY= +github.com/prysmaticlabs/go-bitfield v0.0.0-20210108222456-8e92c3709aa0/go.mod h1:hCwmef+4qXWjv0jLDbQdWnL0Ol7cS7/lCSS26WR+u6s= +github.com/prysmaticlabs/gohashtree v0.0.1-alpha.0.20220714111606-acbb2962fb48/go.mod h1:4pWaT30XoEx1j8KNJf3TV+E3mQkaufn7mf+jRNb/Fuk= +github.com/prysmaticlabs/prombbolt v0.0.0-20210126082820-9b7adba6db7c h1:9PHRCuO/VN0s9k+RmLykho7AjDxblNYI5bYKed16NPU= +github.com/prysmaticlabs/prombbolt v0.0.0-20210126082820-9b7adba6db7c/go.mod h1:ZRws458tYHS/Zs936OQ6oCrL+Ict5O4Xpwve1UQ6C9M= +github.com/prysmaticlabs/protoc-gen-go-cast v0.0.0-20230228205207-28762a7b9294/go.mod h1:ZVEbRdnMkGhp/pu35zq4SXxtvUwWK0J1MATtekZpH2Y= +github.com/quic-go/qtls-go1-18 v0.2.0/go.mod h1:moGulGHK7o6O8lSPSZNoOwcLvJKJ85vVNc7oJFD65bc= +github.com/quic-go/qtls-go1-19 v0.3.3/go.mod h1:ySOI96ew8lnoKPtSqx2BlI5wCpUVPT05RMAlajtnyOI= +github.com/quic-go/qtls-go1-20 v0.3.4 h1:MfFAPULvst4yoMgY9QmtpYmfij/em7O8UUi+bNVm7Cg= +github.com/quic-go/qtls-go1-20 v0.3.4/go.mod h1:X9Nh97ZL80Z+bX/gUXMbipO6OxdiDi58b/fMC9mAL+k= +github.com/quic-go/quic-go v0.39.0/go.mod h1:T09QsDQWjLiQ74ZmacDfqZmhY/NLnw5BC40MANNNZ1Q= +github.com/quic-go/quic-go v0.39.3/go.mod h1:T09QsDQWjLiQ74ZmacDfqZmhY/NLnw5BC40MANNNZ1Q= +github.com/quic-go/quic-go v0.39.4/go.mod h1:T09QsDQWjLiQ74ZmacDfqZmhY/NLnw5BC40MANNNZ1Q= +github.com/r3labs/sse/v2 v2.10.0/go.mod h1:Igau6Whc+F17QUgML1fYe1VPZzTV6EMCnYktEmkNJ7I= +github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= +github.com/rcrowley/go-metrics v0.0.0-20190826022208-cac0b30c2563/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/retailnext/hllpp v1.0.1-0.20180308014038-101a6d2f8b52/go.mod h1:RDpi1RftBQPUCDRw6SmxeaREsAaRKnOclghuzp/WRzc= +github.com/rivo/tview v0.0.0-20221117065207-09f052e6ca98/go.mod h1:YX2wUZOcJGOIycErz2s9KvDaP0jnWwRCirQMPLPpQ+Y= +github.com/rivo/uniseg v0.4.2/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= +github.com/rjeczalik/notify v0.9.1/go.mod h1:rKwnCoCGeuQnwBtTSPL9Dad03Vh2n40ePRrjvIXnJho= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/rs/cors v1.8.3/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= -github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w= github.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk= +github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/safchain/ethtool v0.0.0-20190326074333-42ed695e3de8/go.mod h1:Z0q5wiBQGYcxhMZ6gUqHn6pYNLypFAvaL3UvgZLR0U4= +github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= +github.com/sanity-io/litter v1.5.5/go.mod h1:9gzJgR2i4ZpjZHsKvUXIRQVk7P+yM3e+jAF7bU2UI5U= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= +github.com/schollz/progressbar/v3 v3.3.4 h1:nMinx+JaEm/zJz4cEyClQeAw5rsYSB5th3xv+5lV6Vg= +github.com/schollz/progressbar/v3 v3.3.4/go.mod h1:Rp5lZwpgtYmlvmGo1FyDwXMqagyRBQYSDwzlP9QDu84= github.com/sclevine/agouti v3.0.0+incompatible/go.mod h1:b4WX9W9L1sfQKXeJf1mUTLZKJ48R1S7H23Ji7oFO5Bw= github.com/sclevine/spec v1.2.0/go.mod h1:W4J29eT/Kzv7/b9IWLB055Z+qvVC9vt0Arko24q7p+U= +github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/seccomp/libseccomp-golang v0.9.1/go.mod h1:GbW5+tmTXfcxTToHLXlScSlAvWlF4P2Ca7zGrPiEpWo= github.com/seccomp/libseccomp-golang v0.9.2-0.20220502022130-f33da4d89646/go.mod h1:JA8cRccbGaA1s33RQf7Y1+q9gHmZX1yB/z9WDN1C6fg= github.com/segmentio/kafka-go v0.1.0/go.mod h1:X6itGqS9L4jDletMsxZ7Dz+JFWxM6JHfPOCvTvk+EJo= github.com/segmentio/kafka-go v0.2.0/go.mod h1:X6itGqS9L4jDletMsxZ7Dz+JFWxM6JHfPOCvTvk+EJo= github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= +github.com/shirou/gopsutil/v3 v3.23.2/go.mod h1:gv0aQw33GLo3pG8SiWKiQrbDzbRY1K80RyZJ7V4Th1M= github.com/sirupsen/logrus v1.0.4-0.20170822132746-89742aefa4b2/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= github.com/sirupsen/logrus v1.0.6/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= -github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= +github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= +github.com/spf13/afero v0.0.0-20170901052352-ee1bd8ee15a1/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= +github.com/spf13/afero v1.3.3/go.mod h1:5KUK8ByomD5Ti5Artl0RtHeI5pTF7MIDuXL3yY520V4= +github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= +github.com/spf13/afero v1.9.2/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y= +github.com/spf13/afero v1.10.0/go.mod h1:UBogFpq8E9Hx+xc5CNTTEpTnuHVmXDwZcZcE1eb/UhQ= +github.com/spf13/cast v1.1.0/go.mod h1:r2rcYCSwa1IExKTDiTfzaxqT2FNHs8hODu4LnUfgKEg= github.com/spf13/cobra v0.0.2-0.20171109065643-2da4a54c5cee/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= github.com/spf13/cobra v1.5.0/go.mod h1:dWXEIy2H428czQCjInthrTRUg7yKbok+2Qi/yBIJoUM= -github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/jwalterweatherman v0.0.0-20170901151539-12bd96e66386/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= +github.com/spf13/pflag v1.0.1-0.20170901120850-7aff26db30c1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.1-0.20171106142849-4c012f6dcd95/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= +github.com/spf13/viper v1.0.0/go.mod h1:A8kyI5cUJhb8N+3pkfONlcEcZbueH6nhAm0Fq7SrnBM= github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= -github.com/status-im/keycard-go v0.2.0/go.mod h1:wlp8ZLbsmrF6g6WjugPAx+IzoLrkdf9+mHxBEeo3Hbg= +github.com/spkg/bom v0.0.0-20160624110644-59b7046e48ad/go.mod h1:qLr4V1qq6nMqFKkMo8ZTx3f+BZEkzsRUY10Xsm2mwU0= +github.com/status-im/keycard-go v0.0.0-20190316090335-8537d3370df4/go.mod h1:RZLeN1LMWmRsyYjvAu+I6Dm9QmlDaIIt+Y+4Kd7Tp+Q= github.com/stefanberger/go-pkcs11uri v0.0.0-20201008174630-78d3cae3a980/go.mod h1:AO3tvPzVZ/ayst6UlUKUv6rcPQInYe3IknH3jYhAKu8= +github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= +github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= +github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= github.com/stretchr/objx v0.0.0-20180129172003-8a3f7159479f/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= @@ -819,53 +1501,80 @@ github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSS github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v0.0.0-20180303142811-b89eecf5ca5d/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.0/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/supranational/blst v0.3.8-0.20220526154634-513d2456b344/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= github.com/syndtr/gocapability v0.0.0-20170704070218-db04d3cc01c8/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= github.com/syndtr/gocapability v0.0.0-20180916011248-d98352740cb2/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= +github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ= github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc= github.com/tchap/go-patricia v2.2.6+incompatible/go.mod h1:bmLyhP68RS6kStMGxByiQ23RP/odRBOTVjwp2cDyi6I= github.com/tdewolff/minify/v2 v2.12.4/go.mod h1:h+SRvSIX3kwgwTFOpSckvSxgax3uy8kZTSF1Ojrr3bk= github.com/tdewolff/parse/v2 v2.6.4/go.mod h1:woz0cgbLwFdtbjJu8PIKxhW05KplTFQkOdX78o+Jgrs= github.com/tdewolff/test v1.0.7/go.mod h1:6DAvZliBAAnD7rhVgwaM7DE5/d9NMOAJ09SqYqeK4QE= +github.com/templexxx/cpufeat v0.0.0-20180724012125-cef66df7f161/go.mod h1:wM7WEvslTq+iOEAMDLSzhVuOt5BRZ05WirO+b09GHQU= +github.com/templexxx/xor v0.0.0-20191217153810-f85b25db303b/go.mod h1:5XA7W9S6mni3h5uvOC75dA3m9CCCaS83lltmc0ukdi4= +github.com/tenntenn/modver v1.0.1/go.mod h1:bePIyQPb7UeioSRkw3Q0XeMhYZSMx9B8ePqg6SAMGH0= +github.com/tenntenn/text/transform v0.0.0-20200319021203-7eef512accb3/go.mod h1:ON8b8w4BN/kE1EOhwT0o+d62W65a6aPw1nouo9LMgyY= github.com/tinylib/msgp v1.0.2/go.mod h1:+d+yLhGm8mzTaHzB+wgMYrodPfmZrzkirds8fDWklFE= +github.com/tjfoc/gmsm v1.3.0/go.mod h1:HaUcFuY0auTiaHB9MHFGCPx5IaLhTUd2atbCFBQXn9w= github.com/tklauser/go-sysconf v0.3.5/go.mod h1:MkWzOF4RMCshBAMXuhXJs64Rte09mITnppBXY/rYEFI= +github.com/tklauser/go-sysconf v0.3.10/go.mod h1:C8XykCvCb+Gn0oNCWPIlcb0RuglQTYaQ2hGm7jmxEFk= github.com/tklauser/numcpus v0.2.2/go.mod h1:x3qojaO3uyYt0i56EW/VUYs7uBvdl2fkfZFu0T9wgjM= +github.com/tklauser/numcpus v0.4.0/go.mod h1:1+UI3pD8NW14VMwdgJNJ1ESk2UnwhAnz5hMwiKKqXCQ= +github.com/tklauser/numcpus v0.5.0/go.mod h1:OGzpTxpcIMNGYQdit2BYL1pvk/dSOaJWjKoflh+RQjo= github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/trailofbits/go-mutexasserts v0.0.0-20230328101604-8cdbc5f3d279 h1:+LynomhWB+14Plp/bOONEAZCtvCZk4leRbTvNzNVkL0= +github.com/trailofbits/go-mutexasserts v0.0.0-20230328101604-8cdbc5f3d279/go.mod h1:GA3+Mq3kt3tYAfM0WZCu7ofy+GW9PuGysHfhr+6JX7s= +github.com/tyler-smith/go-bip39 v1.0.1-0.20181017060643-dbb3b84ba2ef/go.mod h1:sJ5fKU0s6JVwZjjcUEX2zFOnvq0ASQ2K9Zr6cf67kNs= +github.com/ugorji/go v1.2.7 h1:qYhyWUUd6WbiM+C6JZAUkIJt/1WrjzNHY9+KCIjVqTo= github.com/ugorji/go v1.2.7/go.mod h1:nF9osbDWLy6bDVv/Rtoh6QgnvNDpmCalQV5urGCCS6M= +github.com/ugorji/go/codec v1.2.7 h1:YPXUKf7fYbp/y8xloBqZOw2qaVggbfwMlI8WM3wZUJ0= github.com/ugorji/go/codec v1.2.7/go.mod h1:WGN1fab3R1fzQlVQTkfxVtIBhWDRqOviHU95kRgeqEY= -github.com/umbracle/gohashtree v0.0.2-alpha.0.20230207094856-5b775a815c10/go.mod h1:x/Pa0FF5Te9kdrlZKJK82YmAkvL8+f989USgz6Jiw7M= github.com/urfave/cli v0.0.0-20171014202726-7bc6a0acffa5/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/XcUArI= github.com/urfave/cli/v2 v2.17.2-0.20221006022127-8f469abc00aa/go.mod h1:1CNUng3PtjQMtRzJO4FMXBQvkGtuYRxxiR9xMa7jMwI= +github.com/urfave/cli/v2 v2.23.5/go.mod h1:GHupkWPMM0M/sj1a2b4wUrWBPzazNrIjouW6fmdJLxc= +github.com/urfave/cli/v2 v2.23.7/go.mod h1:GHupkWPMM0M/sj1a2b4wUrWBPzazNrIjouW6fmdJLxc= +github.com/urfave/cli/v2 v2.24.1/go.mod h1:GHupkWPMM0M/sj1a2b4wUrWBPzazNrIjouW6fmdJLxc= +github.com/uudashr/gocognit v1.0.5/go.mod h1:wgYz0mitoKOTysqxTDMOUXg+Jb5SvtihkfmugIZYpEA= github.com/valyala/fasthttp v1.40.0/go.mod h1:t/G+3rLek+CyY9bnIE+YlMRddxVAAGjhxndDB4i4C0I= github.com/valyala/fasttemplate v1.2.2/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc= github.com/vishvananda/netlink v0.0.0-20181108222139-023a6dafdcdf/go.mod h1:+SR5DhBJrl6ZM7CoCKvpw5BKroDKQ+PJqOg65H/2ktk= github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE= github.com/vishvananda/netlink v1.1.1-0.20201029203352-d40f9887b852/go.mod h1:twkDnbuQxJYemMlGd4JFIcuhgX83tXhKS2B/PRMpOho= +github.com/vishvananda/netlink v1.1.1-0.20210330154013-f5de75959ad5/go.mod h1:twkDnbuQxJYemMlGd4JFIcuhgX83tXhKS2B/PRMpOho= github.com/vishvananda/netns v0.0.0-20180720170159-13995c7128cc/go.mod h1:ZjcWmFBXmLKZu9Nxj3WKYEafiSqer2rnvPr0en9UNpI= github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU= github.com/vishvananda/netns v0.0.0-20200728191858-db3c7e526aae/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= +github.com/vishvananda/netns v0.0.0-20210104183010-2eb08e3e575f/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= github.com/vmihailenco/msgpack/v5 v5.3.5/go.mod h1:7xyJ9e+0+9SaZT0Wt1RGleJXzli6Q/V5KbhBonMG9jc= github.com/vmihailenco/tagparser/v2 v2.0.0/go.mod h1:Wri+At7QHww0WTrCBeu4J6bNtoV6mEfg5OIWRZA9qds= +github.com/wealdtech/go-bytesutil v1.1.1/go.mod h1:jENeMqeTEU8FNZyDFRVc7KqBdRKSnJ9CCh26TcuNb9s= +github.com/wealdtech/go-eth2-types/v2 v2.5.2/go.mod h1:8lkNUbgklSQ4LZ2oMSuxSdR7WwJW3L9ge1dcoCVyzws= +github.com/wealdtech/go-eth2-util v1.6.3/go.mod h1:0hFMj/qtio288oZFHmAbCnPQ9OB3c4WFzs5NVPKTY4k= +github.com/wealdtech/go-eth2-wallet-encryptor-keystorev4 v1.1.3/go.mod h1:qiIimacW5NhVRy8o+YxWo9YrecXqDAKKbL0+sOa0SJ4= +github.com/wealdtech/go-eth2-wallet-types/v2 v2.8.2/go.mod h1:k6kmiKWSWBTd4OxFifTEkPaBLhZspnO2KFD5XJY9nqg= github.com/willf/bitset v1.1.3/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4= github.com/willf/bitset v1.1.11-0.20200630133818-d5bec3311243/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4= github.com/willf/bitset v1.1.11/go.mod h1:83CECat5yLh5zVOf4P1ErAgKA5UDvKtgyUABdr3+MjI= +github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c/go.mod h1:lB8K/P019DLNhemzwFU4jHLhdvlE6uDZjXFejJXr49I= +github.com/xdg/stringprep v1.0.0/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y= github.com/xeipuuv/gojsonschema v0.0.0-20180618132009-1d523034197f/go.mod h1:5yf86TLmAcydyeJq5YvxkGPE2fm/u4myDekKRoLuqhs= github.com/xhit/go-str2duration v1.2.0/go.mod h1:3cPSlfZlUHVlneIVfePFWcJZsuwf+P1v2SRTV4cUmp4= +github.com/xhit/go-str2duration/v2 v2.1.0/go.mod h1:ohY8p+0f07DiV6Em5LKB0s2YpLtXVyJfNt1+BlmyAsU= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xlab/treeprint v0.0.0-20180616005107-d6fb6747feb6/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg= -github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8= +github.com/xtaci/kcp-go v5.4.20+incompatible/go.mod h1:bN6vIwHQbfHaHtFpEssmWsN45a+AZwO7eyRCmEIbtvE= +github.com/xtaci/lossyconn v0.0.0-20190602105132-8df528c0c9ae/go.mod h1:gXtu8J62kEgmN++bm9BVICuT/e8yiLI2KFobd/TRFsE= github.com/yosssi/ace v0.0.5/go.mod h1:ALfIzm2vT7t5ZE7uoIZqF3TQ7SAOyupFZnkrF5id+K0= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= @@ -874,56 +1583,106 @@ github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5t github.com/yvasiyarov/go-metrics v0.0.0-20140926110328-57bccd1ccd43/go.mod h1:aX5oPXxHm3bOH+xeAttToC8pqch2ScQN/JoXYupl6xs= github.com/yvasiyarov/gorelic v0.0.0-20141212073537-a9bba5b9ab50/go.mod h1:NUSPSUX/bi6SeDMUh6brw0nXpxHnc96TguQh0+r/ssA= github.com/yvasiyarov/newrelic_platform_go v0.0.0-20140908184405-b21fdbd4370f/go.mod h1:GlGEuHIJweS1mbCqG+7vt2nvWLzLLnRHbXz5JKd/Qbg= +github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.5/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4= +go.etcd.io/bbolt v1.3.7 h1:j+zJOnnEjF/kyHlDDgGnVL/AIqIJPq8UoB2GSNfkUfQ= +go.etcd.io/bbolt v1.3.7/go.mod h1:N9Mkw9X8x5fupy0IKsmuqVtoGDyxsaDlbk4Rd05IAQw= +go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= go.etcd.io/etcd v0.5.0-alpha.5.0.20200910180754-dd1b699fc489/go.mod h1:yVHk9ub3CSBatqGNg7GRmsnfLWtoW60w4eDYfh7vHDg= +go.etcd.io/gofail v0.1.0/go.mod h1:VZBCXYGZhHAinaBiiqYvuDynvahNsAyLFwB3kEHKz1M= go.mozilla.org/pkcs7 v0.0.0-20200128120323-432b2356ecb1/go.mod h1:SNgMg+EgDFwmvSmLRTNKC5fegJjB7v23qTQ0XLGUNHk= -go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= -go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= +go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.28.0/go.mod h1:vEhqr0m4eTc+DWxfsXoXue2GBgV2uUwVznkGIHW/e5w= +go.opentelemetry.io/otel v1.6.3/go.mod h1:7BgNga5fNlF/iZjG06hM3yofffp0ofKCDwSXx1GC4dI= +go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.3.0/go.mod h1:VpP4/RMn8bv8gNo9uK7/IMY4mtWLELsS+JIP0inH0h4= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.3.0/go.mod h1:hO1KLR7jcKaDDKDkvI9dP/FIhpmna5lkqPUQdEjFAM8= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.3.0/go.mod h1:keUU7UfnwWTWpJ+FWnyqmogPa82nuU5VUANFq49hlMY= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.3.0/go.mod h1:QNX1aly8ehqqX1LEa6YniTU7VY9I6R3X/oPxhGdTceE= +go.opentelemetry.io/otel/sdk v1.3.0/go.mod h1:rIo4suHNhQwBIPg9axF8V9CA72Wz2mKF1teNrup8yzs= +go.opentelemetry.io/otel/trace v1.6.3/go.mod h1:GNJQusJlUgZl9/TQBPKU/Y/ty+0iVB5fjhKeJGZPGFs= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= +go.opentelemetry.io/proto/otlp v0.11.0/go.mod h1:QpEjXPrNQzrFDZgoTo49dgHR9RYRSrg3NAKnUGl9YpQ= +go.opentelemetry.io/proto/otlp v0.15.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= +go.opentelemetry.io/proto/otlp v0.19.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= +go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= +go.uber.org/automaxprocs v1.5.2/go.mod h1:eRbA25aqJrxAbsLO0xy5jVwPt7FQnRgjW+efnwa1WM0= +go.uber.org/dig v1.17.0/go.mod h1:rTxpf7l5I0eBTlE6/9RL+lDybC7WFwY2QH55ZSjy1mU= +go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= +go.uber.org/goleak v1.1.12/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= +go.uber.org/mock v0.3.0/go.mod h1:a6FSlNadKUHUa9IP5Vyt1zh4fC7uAwxMutEAscFbkZc= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= +go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= +go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= +go.uber.org/multierr v1.10.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= +go.uber.org/zap v1.14.1/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc= +go.uber.org/zap v1.23.0/go.mod h1:D+nX8jyLsMHMYrln8A0rJjFt/T/9/bGgIhAqxv5URuY= +go.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so= golang.org/x/crypto v0.0.0-20171113213409-9f005a07e0d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181009213950-7c1a557ab941/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190909091759-094676da4a83/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191219195013-becbf705a915/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200204104054-c9f3fb736b72/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200221231518-2aa609cf4a9d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= +golang.org/x/crypto v0.0.0-20210314154223-e6e6c4f2bb5b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= +golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= +golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220314234659-1baeb1ce4c0b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220427172511-eb4f295cb31f/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220511200225-c6db032c6c88/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= +golang.org/x/crypto v0.2.0/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= +golang.org/x/crypto v0.3.0/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= +golang.org/x/crypto v0.5.0/go.mod h1:NK/OQwhpMQP3MwtdjgLlYHnH9ebylxKWv3e0fK+mkQU= golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= +golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= +golang.org/x/crypto v0.8.0/go.mod h1:mRqEX+O9/h5TFCrQhkgjo2yKi0yYA+9ecGkdQoHrywE= +golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= +golang.org/x/crypto v0.10.0/go.mod h1:o4eNf7Ede1fv+hwOwZsTHl9EsPFO6q6ZvYR8vYfY45I= +golang.org/x/crypto v0.11.0/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio= +golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= +golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= +golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= +golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= golang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE= -golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= -golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= -golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= +golang.org/x/exp v0.0.0-20200331195152-e8c3332aa8e5/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw= golang.org/x/exp v0.0.0-20200513190911-00229845015e/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw= +golang.org/x/exp v0.0.0-20220426173459-3bcf042a4bf5/go.mod h1:lgLbSvA5ygNOMpwM/9anMpWVlVJ7Z+cHWq/eFuinpGE= +golang.org/x/exp v0.0.0-20221205204356-47842c84f3db/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc= +golang.org/x/exp v0.0.0-20230626212559-97b1e661b5df/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc= +golang.org/x/exp v0.0.0-20230725012225-302865e7556b/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc= +golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63/go.mod h1:0v4NqG35kSWCMzLaMeX+IQrlSnVE/bqGSyC2cz/9Le8= +golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k= +golang.org/x/exp v0.0.0-20231006140011-7918f672742d/go.mod h1:ldy0pHrwJyGW56pPQzzkH36rKxoZW1tw7ZJpeKx+hdo= +golang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611/go.mod h1:iRJReGqOEeBhDZGkGbynYwcHlctCvnjTYIamk7uXpHI= +golang.org/x/exp/typeparams v0.0.0-20231108232855-2478ac86f678/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= @@ -932,38 +1691,32 @@ golang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+o golang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= golang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= -golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= -golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= -golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= +golang.org/x/mod v0.6.0-dev.0.20211013180041-c96bc1413d57/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= +golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.6.0/go.mod h1:4mET923SAdbXp2ki8ey+zGs1SLqsuM2Y0uvdZR/fUNI= +golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/net v0.0.0-20181011144130-49bb7cea24b1/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/mod v0.10.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.13.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190619014844-b5b0513f8c1b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200421231249-e086a090c8fd/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= @@ -974,74 +1727,114 @@ golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81R golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201006153459-a7d1128ccaa0/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201010224723-4f7140c49acb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210220033124-5f55cee0dc0d/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= +golang.org/x/net v0.0.0-20210423184538-5f58ad60dda6/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= +golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210610132358-84b48f89b13b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210825183410-e898025ed96a/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220909164309-bea034e7d591/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= +golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= +golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= +golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= golang.org/x/net v0.4.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= +golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= +golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +golang.org/x/net v0.11.0/go.mod h1:2L/ixqYpgIVXmeoSA/4Lu7BzTG4KIyPIryS4IsOd1oQ= +golang.org/x/net v0.13.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA= +golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= +golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= +golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= +golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U= +golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= golang.org/x/oauth2 v0.0.0-20170207211851-4464e7848382/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20170912212905-13449ad91cb2/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.0.0-20220608161450-d0670ef3b1eb/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= +golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= +golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= +golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= +golang.org/x/oauth2 v0.4.0/go.mod h1:RznEsdpjGAINPTOF0UH/t+xJ75L18YO3Ho6Pyn+uRec= golang.org/x/oauth2 v0.5.0/go.mod h1:9/XBHVqLaWO3/BRHs5jbpYCnOZVjj5V0ndyaAM7KB4I= +golang.org/x/oauth2 v0.7.0/go.mod h1:hPLQkd9LyjfXTiRohC/41GhcFqxisoUQ99sCUOHO9x4= +golang.org/x/oauth2 v0.8.0/go.mod h1:yr7u4HXZRm1R1kBWqr/xKNqewf0plRYoB7sla+BCIXE= +golang.org/x/oauth2 v0.12.0/go.mod h1:A74bZ3aGXgCY0qaIC9Ahg6Lglin4AMAco8cIv9baba4= golang.org/x/perf v0.0.0-20230113213139-801c7ef9e5c5/go.mod h1:UBKtEnL8aqnd+0JHqZ+2qoMDwtuy6cYhhKNoHLBiTQc= +golang.org/x/sync v0.0.0-20170517211232-f52d1811a629/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.2.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.4.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= +golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190130150945-aca44879d564/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190514135907-3a4b5fb9f71f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190522044717-8097e1b27ff5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190602015325-4c4f7f33c9ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190606203320-7fc4e5ec1444/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190812073006-9eafafc0a87e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191022100944-742c48ecaeb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191115151921-52ab43148777/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191210023423-ac6580df4449/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200107162124-548cf772de50/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200120151820-655fe14d7479/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200217220822-9197077df867/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200219091948-cb0a6d8edb6c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200420163511-1957bb5e6d1f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1051,6 +1844,7 @@ golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200817155316-9781c653f443/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200826173525-f9321e4c35a6/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200909081042-eff7692f9009/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200916030750-2334cc1a136f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200922070232-aee5d888a860/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1059,75 +1853,109 @@ golang.org/x/sys v0.0.0-20201112073958-5cba982894dd/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20201117170446-d9b008d0a637/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201202213521-69691e467435/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201214210602-f9fddec55a1e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210309074719-68d13333faf2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210316164454-77fc1eacc6aa/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210426080607-c94f62235c83/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210426230700-d19ff857e887/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210616045830-e2b7044e8c71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210906170528-6f6e22806c34/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211020174200-9d6173849985/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211103235746-7861aae1554b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211116061358-0a5406a5449c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211117180635-dee7805ff2e1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220318055525-2edf467146b5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220422013727-9388b58f7150/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220502124256-b6088ccd6cba/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220610221304-9f5ed59c137d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220919091848-fb04ddd9f9c8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= +golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/telemetry v0.0.0-20240208230135-b75ee8823808/go.mod h1:KG1lNk5ZFNssSZLrpVb4sMXKMpGwGXOxSG3rnu2gZQQ= +golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= +golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= -golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= +golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= +golang.org/x/term v0.9.0/go.mod h1:M6DEAAIenWoTxdKrOltXcmDY3rSplQUkrvaDU5FcQyo= +golang.org/x/term v0.10.0/go.mod h1:lpqdcUyK/oCiQxvxVrppt5ggO2KCZ5QblwqPnfZ6d5o= +golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= +golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= +golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= +golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= +golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.10.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/time v0.0.0-20170424234030-8be79e1e0910/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20220411224347-583f2d630306/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20220922220347-f3bd1da661af/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.2.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181011042414-1f849cf54d09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190706070813-72ffa07ba3db/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI= -golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191126055441-b0650ceb63d9/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200108203644-89082a384178/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200221224223-e1da425f72fd/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= @@ -1139,12 +1967,36 @@ golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roY golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= golang.org/x/tools v0.0.0-20200916195026-c9a70fc28ce3/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= +golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= +golang.org/x/tools v0.1.1-0.20210205202024-ef80cdb6ec6d/go.mod h1:9bzcO0MWcOuT0tm1iBGzDVPshzfwoVvREIui8C+MHqU= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.8-0.20211029000441-d6a9af8af023/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= golang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= +golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.2.0/go.mod h1:y4OqIKeOV/fWJetJ8bXPU1sEVniLMIyDAZWeHdV+NTA= +golang.org/x/tools v0.3.0/go.mod h1:/rWhSS2+zyEVwoJf8YAX6L2f0ntZ7Kn/mGgAWcipA5k= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= +golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= +golang.org/x/tools v0.12.0/go.mod h1:Sc0INKfu04TlqNoRA1hgpFZbhYXHPr4V5DzpSBTPqQM= +golang.org/x/tools v0.12.1-0.20230815132531-74c255bcf846/go.mod h1:Sc0INKfu04TlqNoRA1hgpFZbhYXHPr4V5DzpSBTPqQM= +golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= +golang.org/x/tools v0.14.0/go.mod h1:uYBEerGOWcJyEORxN+Ek8+TT266gXkNlHdJBwexUsBg= +golang.org/x/tools v0.16.0/go.mod h1:kYVVN6I1mBNoB1OX+noeBjbRk4IUEPa7JJ+TJMEooJ0= +golang.org/x/tools v0.16.1/go.mod h1:kYVVN6I1mBNoB1OX+noeBjbRk4IUEPa7JJ+TJMEooJ0= +golang.org/x/tools v0.17.0/go.mod h1:xsh6VxdV005rRVaS6SSAf9oiAqljS7UZUacMZ8Bnsps= +golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= gonum.org/v1/gonum v0.0.0-20181121035319-3f7ecaa7e8ca/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= gonum.org/v1/gonum v0.6.0/go.mod h1:9mxDZsDKxgMAuccQkewq682L+0eCu4dCN2yonUJTCLU= @@ -1157,51 +2009,59 @@ gonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY= gonum.org/v1/plot v0.10.0/go.mod h1:JWIHJ7U20drSQb/aDpTetJzfC1KlAPldJLpkSy88dvQ= google.golang.org/api v0.0.0-20160322025152-9bf6e6e569ff/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= google.golang.org/api v0.0.0-20170206182103-3d017632ea10/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= -google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= -google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.0.0-20170921000349-586095a6e407/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= +google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= +google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= +google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= +google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= +google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= +google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= +google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= +google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= +google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= +google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= +google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= +google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= +google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= +google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= +google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= +google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= +google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA= +google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8= +google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs= +google.golang.org/api v0.75.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= +google.golang.org/api v0.78.0/go.mod h1:1Sg78yoMLOhlQTeF+ARBoytAcH1NNyyl390YMy6rKmw= +google.golang.org/api v0.80.0/go.mod h1:xY3nI94gbvBrE0J6NHXhxOmW97HG7Khjkku6AFB3Hyg= +google.golang.org/api v0.84.0/go.mod h1:NTsGnUFJMYROtiquksZHBWtHfeMC7iYthki7Eq3pa8o= +google.golang.org/api v0.97.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= +google.golang.org/api v0.100.0/go.mod h1:ZE3Z2+ZOr87Rx7dqFsdRQkRBk36kDtp/h+QpHbB7a70= +google.golang.org/api v0.102.0/go.mod h1:3VFl6/fzoA+qNuS1N1/VfXY4LjoXN/wzeIp7TweWwGo= +google.golang.org/api v0.103.0 h1:9yuVqlu2JCvcLg9p8S3fcFLZij8EPSyvODIY1rkMizQ= +google.golang.org/api v0.103.0/go.mod h1:hGtW6nK1AC+d9si/UBhw8Xli+QMOf6xyNAyJw4qU9w0= +google.golang.org/api v0.106.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= +google.golang.org/api v0.110.0/go.mod h1:7FC4Vvx1Mooxh8C5HWjzZHcavuS2f6pmJpZx60ca7iI= +google.golang.org/api v0.118.0/go.mod h1:76TtD3vkgmZ66zZzp72bUUklpmQmKlhh6sYtIjYK+5E= +google.golang.org/api v0.126.0/go.mod h1:mBwVAtz+87bEN6CbA1GtZPDOqY2R5ONPqJeIlvyo4Aw= google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/cloud v0.0.0-20151119220103-975617b05ea8/go.mod h1:0H1ncTHf11KCFhTc/+EFRbzSCOZx+VUbRMk55Yv5MYk= -google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20170918111702-1e559d0a00ee/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190522204451-c2c4e71fbf69/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= +google.golang.org/genproto v0.0.0-20190530194941-fb225487d101/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= google.golang.org/genproto v0.0.0-20190716160619-c506a9f90610/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20200108215221-bd8f9a0ef82f/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20200117163144-32f20d992d24/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= -google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200218151345-dad8c97a84f5/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= @@ -1211,60 +2071,153 @@ google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7Fc google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201110150050-8816d57aaa9a/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210329143202-679c6ae281ee/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= +google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= +google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= +google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= +google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= +google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= +google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= +google.golang.org/genproto v0.0.0-20220329172620-7be39ac1afc7/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220407144326-9054f6ed7bac/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220413183235-5e96e2839df9/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220421151946-72621c1f0bd3/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220429170224-98d788798c3e/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= google.golang.org/genproto v0.0.0-20220502173005-c8bf987b8c21/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220505152158-f39f71e6c8f3/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220518221133-4f43b3371335/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220523171625-347a074981d8/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220608133413-ed9918b62aac/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220616135557-88e70c0c3a90/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220624142145-8cd45d7dbd1f/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220822174746-9e6da59bd2fc/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220920201722-2b89144ce006/go.mod h1:ht8XFiar2npT/g4vkk7O0WYS1sHOHbdujxbEp7CJWbw= +google.golang.org/genproto v0.0.0-20221014213838-99cd37c6964a/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= +google.golang.org/genproto v0.0.0-20221024183307-1bc688fe9f3e/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= +google.golang.org/genproto v0.0.0-20221027153422-115e99e71e1c/go.mod h1:CGI5F/G+E5bKwmfYo09AXuVN4dD894kIKUFmVbP2/Fo= +google.golang.org/genproto v0.0.0-20221201164419-0e50fba7f41c/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221202195650-67e5cbc046fd/go.mod h1:cTsE614GARnxrLsqKREzmNYJACSWWpAWdNMwnD7c2BE= +google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230222225845-10f96fb3dbec/go.mod h1:3Dl5ZL0q0isWJt+FVcfpQyirqemEuLAK/iFvg1UP1Hw= +google.golang.org/genproto v0.0.0-20230525234025-438c736192d0/go.mod h1:9ExIQyXL5hZrHzQceCwuSYwZZ5QZBazOcprJ5rgs3lY= +google.golang.org/genproto v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:xZnkP7mREFX5MORlOPEzLMr+90PPZQ2QWzrVTWfAq64= +google.golang.org/genproto/googleapis/api v0.0.0-20230526203410-71b5a4ffd15e/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= +google.golang.org/genproto/googleapis/api v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= +google.golang.org/genproto/googleapis/bytestream v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:ylj+BE99M198VPbBh6A8d9n3w8fChvyLK3wwBOjXBFA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234030-28d5490b6b19/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230526203410-71b5a4ffd15e/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= google.golang.org/grpc v0.0.0-20160317175043-d3ddb4469d5a/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v0.0.0-20170208002647-2a6bf6142e96/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= -google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= +google.golang.org/grpc v1.2.1-0.20170921194603-d4b75ebd4f9f/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= +google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.22.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA= -google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= +google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= +google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= +google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= +google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= +google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= +google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= +google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc v1.46.2/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= google.golang.org/grpc v1.47.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= +google.golang.org/grpc v1.48.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= +google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= +google.golang.org/grpc v1.51.0/go.mod h1:wgNDFcnuBGmxLKI/qn4T+m5BtEBYXJPvibbUPsAIPww= +google.golang.org/grpc v1.53.0/go.mod h1:OnIrk0ipVdj4N5d9IUoFUx72/VlD7+jUsHwZgwSMQpw= +google.golang.org/grpc v1.54.0/go.mod h1:PUSEXI6iWghWaB6lXM4knEgpJNu2qUcKfDtNci3EC2g= +google.golang.org/grpc v1.55.0/go.mod h1:iYEXKGkEBhg1PjZQvoYEVPTDkHo1/bjTnfwTeGONTY8= +google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.0.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= +google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.29.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U= -gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= +gopkg.in/bsm/ratelimit.v1 v1.0.0-20160220154919-db14e161995a/go.mod h1:KF9sEfUPAXdG8Oev9e99iLGnl2uJMjc5B+4y3O7x610= +gopkg.in/cenkalti/backoff.v1 v1.1.0/go.mod h1:J6Vskwqd+OMVJl8C33mmtxTBs2gyzfv7UDAkHu8BrjI= gopkg.in/check.v1 v1.0.0-20141024133853-64131543e789/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= +gopkg.in/d4l3k/messagediff.v1 v1.2.1/go.mod h1:EUzikiKadqXWcD1AzJLagx0j/BeeWGtn++04Xniyg44= +gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo= -gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= -gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= +gopkg.in/jcmturner/aescts.v1 v1.0.1/go.mod h1:nsR8qBOg+OucoIW+WMhB3GspUQXq9XorLnQb9XtvcOo= +gopkg.in/jcmturner/dnsutils.v1 v1.0.1/go.mod h1:m3v+5svpVOhtFAP/wSz+yzh4Mc0Fg7eRhxkJMWSIz9Q= +gopkg.in/jcmturner/goidentity.v3 v3.0.0/go.mod h1:oG2kH0IvSYNIu80dVAyu/yoefjq1mNfM5bm88whjWx4= +gopkg.in/jcmturner/gokrb5.v7 v7.5.0/go.mod h1:l8VISx+WGYp+Fp7KRbsiUuXTTOnxIc3Tuvyavf11/WM= +gopkg.in/jcmturner/rpc.v1 v1.1.0/go.mod h1:YIdkC4XfD6GXbzje11McwsDuOlZQSb9W4vfLvuNnlv8= +gopkg.in/redis.v4 v4.2.4/go.mod h1:8KREHdypkCEojGKQcjMqAODMICIVwZAONWq8RowTITA= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/square/go-jose.v2 v2.3.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/square/go-jose.v2 v2.5.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= +gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8= -honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +gotest.tools/v3 v3.5.0/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= +gotest.tools/v3 v3.5.1/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +honnef.co/go/tools v0.5.0-0.dev.0.20231205170804-aef76f4feee2/go.mod h1:J8YyqAvNy0yWpeKUOCONA1m2G4hH2CqUSo/5ZO2/5UA= +k8s.io/api v0.20.0/go.mod h1:HyLC5l5eoS/ygQYl1BXBgFzWNlkHiAuyNAbevIn+FKg= k8s.io/api v0.20.1/go.mod h1:KqwcCVogGxQY3nBlRpwt+wpAMF/KjaCc7RpywacvqUo= k8s.io/api v0.20.4/go.mod h1:++lNL1AJMkDymriNniQsWRkMDzRaX2Y/POTUi8yvqYQ= k8s.io/api v0.20.6/go.mod h1:X9e8Qag6JV/bL5G6bU8sdVRltWKmdHsFUGS3eVndqE8= @@ -1274,6 +2227,7 @@ k8s.io/apimachinery v0.20.6/go.mod h1:ejZXtW1Ra6V1O5H8xPBGz+T3+4gfkTCeExAHKU57MA k8s.io/apiserver v0.20.1/go.mod h1:ro5QHeQkgMS7ZGpvf4tSMx6bBOgPfE+f52KwvXfScaU= k8s.io/apiserver v0.20.4/go.mod h1:Mc80thBKOyy7tbvFtB4kJv1kbdD0eIH8k8vianJcbFM= k8s.io/apiserver v0.20.6/go.mod h1:QIJXNt6i6JB+0YQRNcS0hdRHJlMhflFmsBDeSgT1r8Q= +k8s.io/apiserver v0.22.5/go.mod h1:s2WbtgZAkTKt679sYtSudEQrTGWUSQAPe6MupLnlmaQ= k8s.io/client-go v0.20.1/go.mod h1:/zcHdt1TeWSd5HoUe6elJmHSQ6uLLgp4bIJHVEuy+/Y= k8s.io/client-go v0.20.4/go.mod h1:LiMv25ND1gLUdBeYxBIwKpkSC5IsozMMmOOeSJboP+k= k8s.io/client-go v0.20.6/go.mod h1:nNQMnOvEUEsOzRRFIIkdmYOjAZrC8bgq0ExboWSU1I0= @@ -1281,29 +2235,27 @@ k8s.io/code-generator v0.19.7/go.mod h1:lwEq3YnLYb/7uVXLorOJfxg+cUu2oihFhHZ0n9NI k8s.io/component-base v0.20.1/go.mod h1:guxkoJnNoh8LNrbtiQOlyp2Y2XFCZQmrcg2n/DeYNLk= k8s.io/component-base v0.20.4/go.mod h1:t4p9EdiagbVCJKrQ1RsA5/V4rFQNDfRlevJajlGwgjI= k8s.io/component-base v0.20.6/go.mod h1:6f1MPBAeI+mvuts3sIdtpjljHWBQ2cIy38oBIWMYnrM= +k8s.io/component-base v0.22.5/go.mod h1:VK3I+TjuF9eaa+Ln67dKxhGar5ynVbwnGrUiNF4MqCI= k8s.io/cri-api v0.17.3/go.mod h1:X1sbHmuXhwaHs9xxYffLqJogVsnI+f6cPRcgPel7ywM= k8s.io/cri-api v0.20.1/go.mod h1:2JRbKt+BFLTjtrILYVqQK5jqhI+XNdF6UiGMgczeBCI= k8s.io/cri-api v0.20.4/go.mod h1:2JRbKt+BFLTjtrILYVqQK5jqhI+XNdF6UiGMgczeBCI= k8s.io/cri-api v0.20.6/go.mod h1:ew44AjNXwyn1s0U4xCKGodU7J1HzBeZ1MpGrpa5r8Yc= -k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= +k8s.io/cri-api v0.25.0/go.mod h1:J1rAyQkSJ2Q6I+aBMOVgg2/cbbebso6FNa0UagiR0kc= k8s.io/gengo v0.0.0-20200428234225-8167cfdcfc14/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= k8s.io/gengo v0.0.0-20201113003025-83324d819ded/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= -k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= k8s.io/klog/v2 v2.4.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= +k8s.io/klog/v2 v2.30.0/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= k8s.io/kube-openapi v0.0.0-20200805222855-6aeccd4b50c6/go.mod h1:UuqjUnNftUyPE5H64/qeyjQoUZhGpeFDVdxjTeEVN2o= k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd/go.mod h1:WOJ3KddDSol4tAGcJo0Tvi+dK12EcqSLqcWsryKMpfM= k8s.io/kubernetes v1.13.0/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk= -k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +lukechampine.com/blake3 v1.1.6/go.mod h1:tkKEOtDkNtklkXtLNEOGNq5tcV90tJiA1vAA12R78LA= +moul.io/http2curl/v2 v2.3.0/go.mod h1:RW4hyBjTWSYDOxapodpNEtX0g5Eb16sxklBqmd2RHcE= +nhooyr.io/websocket v1.8.7/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0= rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= -rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= -rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= -rsc.io/tmplfunc v0.0.3/go.mod h1:AG3sTPzElb1Io3Yg4voV9AGZJuleGAwaVRxL9M49PhA= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.14/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.15/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= sigs.k8s.io/structured-merge-diff/v4 v4.0.1/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= sigs.k8s.io/structured-merge-diff/v4 v4.0.3/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= -sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= +sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU= From 81d0209abc099697d17e0e5d0bb9a7d0b27e6b83 Mon Sep 17 00:00:00 2001 From: Mario Vega Date: Tue, 5 Mar 2024 15:52:09 -0600 Subject: [PATCH 204/387] circleci: Use default ubuntu machine (#1021) * circleci: default ubuntu machine * circleci: remove docker version --- .circleci/continue_config.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.circleci/continue_config.yml b/.circleci/continue_config.yml index 992ff04cdd..d7c185cb9c 100644 --- a/.circleci/continue_config.yml +++ b/.circleci/continue_config.yml @@ -29,7 +29,7 @@ jobs: # hive needs to be able to talk to the docker containers it creates. smoke-tests: machine: - image: ubuntu-2004:202201-02 + image: default steps: - checkout - attach_workspace: {at: "/tmp/build"} @@ -45,7 +45,7 @@ jobs: steps: - checkout - attach_workspace: {at: "/tmp/build"} - - setup_remote_docker: {version: 20.10.14} + - setup_remote_docker - run: command: "/tmp/build/hive --sim=smoke/genesis --client=go-ethereum --loglevel 5" - run: From 4fdf90e86cddc3bf1546c048bee177286517fe77 Mon Sep 17 00:00:00 2001 From: Kim De Mey Date: Tue, 5 Mar 2024 22:57:49 +0100 Subject: [PATCH 205/387] clients/fluffy: use --networks cli option in fluffy client start script (#1029) --- clients/fluffy/fluffy.sh | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/clients/fluffy/fluffy.sh b/clients/fluffy/fluffy.sh index 57b91135f1..50c826c222 100755 --- a/clients/fluffy/fluffy.sh +++ b/clients/fluffy/fluffy.sh @@ -7,14 +7,15 @@ IP_ADDR=$(hostname -i | awk '{print $1}') FLAGS="" if [ "$HIVE_PORTAL_NETWORKS_SELECTED" != "" ]; then + FLAGS="$FLAGS --networks=$HIVE_PORTAL_NETWORKS_SELECTED" + if [[ $HIVE_PORTAL_NETWORKS_SELECTED =~ "beacon" ]]; then - # Providing atrusted block root is required currently to enable the beacon network. + # Providing a trusted block root is required currently to fully enable the beacon network. # It can be a made up value for now as tests are not doing any sync. FLAGS="$FLAGS --trusted-block-root:0x0000000000000000000000000000000000000000000000000000000000000000" fi - if [[ $HIVE_PORTAL_NETWORKS_SELECTED =~ "state" ]]; then - FLAGS="$FLAGS --state=true" - fi +else + FLAGS="$FLAGS --networks=history" fi @@ -22,5 +23,4 @@ if [ "$HIVE_CLIENT_PRIVATE_KEY" != "" ]; then FLAGS="$FLAGS --netkey-unsafe=0x$HIVE_CLIENT_PRIVATE_KEY" fi -# Fluffy runs all networks by default, so we can not configure to run networks individually -fluffy --rpc --rpc-address="0.0.0.0" --nat:extip:"$IP_ADDR" --network=none --log-level="debug" $FLAGS +fluffy --rpc --rpc-address="0.0.0.0" --nat:extip:"$IP_ADDR" --portal-network=none --log-level="debug" $FLAGS From f69df863de20bcab33b2b9577c0cbf1df6b87581 Mon Sep 17 00:00:00 2001 From: Mario Vega Date: Tue, 5 Mar 2024 17:10:22 -0600 Subject: [PATCH 206/387] simulators/ethereum/engine: TransactionCreator - Keep track of blobs (#1030) * simulators/ethereum/engine: TransactionCreator: keep track of blobs * simulators/ethereum/engine: Fix blob lists --- simulators/ethereum/engine/helper/blobs.go | 4 +++- simulators/ethereum/engine/helper/tx.go | 7 +++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/simulators/ethereum/engine/helper/blobs.go b/simulators/ethereum/engine/helper/blobs.go index 7d66fe4d46..3227d7ce47 100644 --- a/simulators/ethereum/engine/helper/blobs.go +++ b/simulators/ethereum/engine/helper/blobs.go @@ -83,7 +83,7 @@ func GetBlobListByIndex(startIndex BlobID, endIndex BlobID) BlobIDs { } } else { for i := uint64(0); i < count; i++ { - blobList[i] = endIndex - BlobID(i) + blobList[i] = startIndex - BlobID(i) } } @@ -224,6 +224,8 @@ func (blobId BlobID) GenerateBlob() (*typ.Blob, *typ.KZGCommitment, *typ.KZGProo // Use precomputed KZG commitments and proofs if available if preComputedKZGCommitment, preComputedProof := GetPrecomputedKZG(blobId); preComputedKZGCommitment != nil && preComputedProof != nil { return &blob, preComputedKZGCommitment, preComputedProof, nil + } else { + fmt.Printf("INFO: No precomputed KZG for blob %d\n", blobId) } ctx_4844 := CryptoCtx() diff --git a/simulators/ethereum/engine/helper/tx.go b/simulators/ethereum/engine/helper/tx.go index d2c1602662..860e0dff5b 100644 --- a/simulators/ethereum/engine/helper/tx.go +++ b/simulators/ethereum/engine/helper/tx.go @@ -258,8 +258,6 @@ type TransactionCreator interface { MakeTransaction(sender SenderAccount, nonce uint64, blockTimestamp uint64) (typ.Transaction, error) } -const BLOBS_PER_SENDER_ACCOUNT = 10000 - type BaseTransactionCreator struct { Recipient *common.Address GasFee *big.Int @@ -267,6 +265,7 @@ type BaseTransactionCreator struct { GasLimit uint64 BlobGasFee *big.Int BlobCount *big.Int + BlobID BlobID Amount *big.Int Payload []byte AccessList types.AccessList @@ -373,8 +372,8 @@ func (tc *BaseTransactionCreator) MakeTransaction(sender SenderAccount, nonce ui } // Need tx wrap data that will pass blob verification - blobID := BlobID((nonce * cancun.MAX_BLOBS_PER_BLOCK) + (sender.GetIndex() * BLOBS_PER_SENDER_ACCOUNT)) - hashes, blobData, err := BlobDataGenerator(blobID, blobCount) + hashes, blobData, err := BlobDataGenerator(tc.BlobID, blobCount) + tc.BlobID += BlobID(blobCount) if err != nil { return nil, err } From 80304c6d8c576ba1966ca12ac25cff3c752f85f4 Mon Sep 17 00:00:00 2001 From: Mario Vega Date: Tue, 5 Mar 2024 17:35:41 -0600 Subject: [PATCH 207/387] simulators/eth2/dencun: Fixes to builder tests (#1028) * simulators/eth2/common: Add `GetProposer` * simulators/eth2/dencun: Builder suite fixes * simulators/eth2/dencun: Blob account indexes * simulators/eth2: Use tx spammer fix commit --- simulators/eth2/common/go.mod | 2 +- simulators/eth2/common/go.sum | 4 +- .../eth2/common/testnet/verification.go | 41 +++++++++++++++++++ simulators/eth2/dencun/go.mod | 2 +- simulators/eth2/dencun/go.sum | 4 +- .../eth2/dencun/suites/base/execution.go | 27 +++++++++--- .../eth2/dencun/suites/builder/config.go | 9 +++- 7 files changed, 76 insertions(+), 13 deletions(-) diff --git a/simulators/eth2/common/go.mod b/simulators/eth2/common/go.mod index 2534aaf89f..53467fbb85 100644 --- a/simulators/eth2/common/go.mod +++ b/simulators/eth2/common/go.mod @@ -7,7 +7,7 @@ toolchain go1.22.0 require ( github.com/ethereum/go-ethereum v1.13.14 github.com/ethereum/hive v0.0.0-20231031133732-dcd7ddb75960 - github.com/ethereum/hive/simulators/ethereum/engine v0.0.0-20240305003323-ebe431380e1c + github.com/ethereum/hive/simulators/ethereum/engine v0.0.0-20240305231022-f69df863de20 github.com/google/uuid v1.6.0 github.com/herumi/bls-eth-go-binary v1.29.1 github.com/holiman/uint256 v1.2.4 diff --git a/simulators/eth2/common/go.sum b/simulators/eth2/common/go.sum index 04657910cf..6810278448 100644 --- a/simulators/eth2/common/go.sum +++ b/simulators/eth2/common/go.sum @@ -126,8 +126,8 @@ github.com/ethereum/c-kzg-4844 v0.4.0 h1:3MS1s4JtA868KpJxroZoepdV0ZKBp3u/O5HcZ7R github.com/ethereum/c-kzg-4844 v0.4.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= github.com/ethereum/hive v0.0.0-20231031133732-dcd7ddb75960 h1:7H9z2o/KImWQ/1PACU3ewsSFNxT/lzwYRnwit2YFqMg= github.com/ethereum/hive v0.0.0-20231031133732-dcd7ddb75960/go.mod h1:sV7LrFBlEii71kI9udVbUVj7SXIifZ2VzFjQ8S6rZns= -github.com/ethereum/hive/simulators/ethereum/engine v0.0.0-20240305003323-ebe431380e1c h1:EBlnoT34Ea4Y7kVmmIoYqtdNvNmabQlir7SIQ0UCS/A= -github.com/ethereum/hive/simulators/ethereum/engine v0.0.0-20240305003323-ebe431380e1c/go.mod h1:nag0wj4K1/0AEP1VAKwY08N4I9yymrwXsX4+n0YFfdw= +github.com/ethereum/hive/simulators/ethereum/engine v0.0.0-20240305231022-f69df863de20 h1:Bf9mev5lvesQIIpJtzO+vnGQ3Jv3NuLa2buY2+2pQzg= +github.com/ethereum/hive/simulators/ethereum/engine v0.0.0-20240305231022-f69df863de20/go.mod h1:nag0wj4K1/0AEP1VAKwY08N4I9yymrwXsX4+n0YFfdw= github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072/go.mod h1:duJ4Jxv5lDcvg4QuQr0oowTf7dz4/CR8NtyCooz9HL8= github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= github.com/ferranbt/fastssz v0.1.3 h1:ZI+z3JH05h4kgmFXdHuR1aWYsgrg7o+Fw7/NCzM16Mo= diff --git a/simulators/eth2/common/testnet/verification.go b/simulators/eth2/common/testnet/verification.go index 6f86904a1a..43b1eedcf9 100644 --- a/simulators/eth2/common/testnet/verification.go +++ b/simulators/eth2/common/testnet/verification.go @@ -299,6 +299,47 @@ func (t *Testnet) VerifyProposers( return nil } +// GetProposer returns the node id of the proposer for the requested slot. +func (t *Testnet) GetProposer( + parentCtx context.Context, + vs VerificationSlot, +) (int, error) { + runningNodes := t.VerificationNodes().Running() + bn := runningNodes[0].BeaconClient + slot, err := vs.Slot(parentCtx, t, bn) + if err != nil { + return 0, err + } + + versionedBlock, err := bn.BlockV2(parentCtx, eth2api.BlockIdSlot(slot)) + if err != nil { + return 0, fmt.Errorf( + "node %d (%s): failed to retrieve beacon block: %v", + 0, + runningNodes[0].ClientNames(), + err, + ) + } + + validator, err := bn.StateValidator( + parentCtx, + eth2api.StateIdSlot(slot), + eth2api.ValidatorIdIndex(versionedBlock.ProposerIndex()), + ) + if err != nil { + return 0, fmt.Errorf( + "node %d (%s): failed to retrieve validator: %v", + 0, + runningNodes[0].ClientNames(), + err, + ) + } + + return t.ValidatorClientIndex( + [48]byte(validator.Validator.Pubkey), + ) +} + func (t *Testnet) VerifyELBlockLabels(parentCtx context.Context) error { runningNodes := t.VerificationNodes().Running() for i := 0; i < len(runningNodes); i++ { diff --git a/simulators/eth2/dencun/go.mod b/simulators/eth2/dencun/go.mod index 33ccdef660..a94151081b 100644 --- a/simulators/eth2/dencun/go.mod +++ b/simulators/eth2/dencun/go.mod @@ -8,7 +8,7 @@ require ( github.com/ethereum/go-ethereum v1.13.14 github.com/ethereum/hive v0.0.0-20231128202301-f931b46287a8 github.com/ethereum/hive/simulators/eth2/common v0.0.0-20230316220410-1364352c32a6 - github.com/ethereum/hive/simulators/ethereum/engine v0.0.0-20240305003323-ebe431380e1c + github.com/ethereum/hive/simulators/ethereum/engine v0.0.0-20240305231022-f69df863de20 github.com/lithammer/dedent v1.1.0 github.com/marioevz/blobber v1.1.1-0.20240228051014-aa5f0f9031a9 github.com/marioevz/mock-builder v1.1.1-0.20231123171249-08b59e943190 diff --git a/simulators/eth2/dencun/go.sum b/simulators/eth2/dencun/go.sum index 5a1d60c25a..a485aa2700 100644 --- a/simulators/eth2/dencun/go.sum +++ b/simulators/eth2/dencun/go.sum @@ -164,8 +164,8 @@ github.com/ethereum/hive v0.0.0-20231128202301-f931b46287a8 h1:vpOgMOOh8lQHGL8lS github.com/ethereum/hive v0.0.0-20231128202301-f931b46287a8/go.mod h1:lT6CsiAFb+HTThYzu3veK2x2/BlazxNQD6KWPDlvjfo= github.com/ethereum/hive/simulators/eth2/common v0.0.0-20230316220410-1364352c32a6 h1:LcSUNGwQuJyR/gdPcsif57yKX+3MyhpoAuChzR8k6Yk= github.com/ethereum/hive/simulators/eth2/common v0.0.0-20230316220410-1364352c32a6/go.mod h1:FX4oxNyTNw/P+TUWrb7vva7o/rFI0pHO7OYdtG6EtN4= -github.com/ethereum/hive/simulators/ethereum/engine v0.0.0-20240305003323-ebe431380e1c h1:EBlnoT34Ea4Y7kVmmIoYqtdNvNmabQlir7SIQ0UCS/A= -github.com/ethereum/hive/simulators/ethereum/engine v0.0.0-20240305003323-ebe431380e1c/go.mod h1:nag0wj4K1/0AEP1VAKwY08N4I9yymrwXsX4+n0YFfdw= +github.com/ethereum/hive/simulators/ethereum/engine v0.0.0-20240305231022-f69df863de20 h1:Bf9mev5lvesQIIpJtzO+vnGQ3Jv3NuLa2buY2+2pQzg= +github.com/ethereum/hive/simulators/ethereum/engine v0.0.0-20240305231022-f69df863de20/go.mod h1:nag0wj4K1/0AEP1VAKwY08N4I9yymrwXsX4+n0YFfdw= github.com/evanphx/json-patch v4.11.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072/go.mod h1:duJ4Jxv5lDcvg4QuQr0oowTf7dz4/CR8NtyCooz9HL8= github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= diff --git a/simulators/eth2/dencun/suites/base/execution.go b/simulators/eth2/dencun/suites/base/execution.go index 09ac66cb52..dc38a65164 100644 --- a/simulators/eth2/dencun/suites/base/execution.go +++ b/simulators/eth2/dencun/suites/base/execution.go @@ -19,8 +19,8 @@ import ( var Deneb string = "deneb" var ( - normalTxAccounts = globals.TestAccounts[:len(globals.TestAccounts)/2] - blobTxAccounts = globals.TestAccounts[len(globals.TestAccounts)/2:] + blobTxAccounts = globals.TestAccounts[:len(globals.TestAccounts)/2] + normalTxAccounts = globals.TestAccounts[len(globals.TestAccounts)/2:] ) func WithdrawalAddress(vI beacon.ValidatorIndex) common.Address { @@ -207,9 +207,12 @@ func (ts BaseTestSpec) ExecutePostForkWait( } } if ts.WaitForBlobs { - // Check that the latest head contains blobs + // Check that all clients have produced at least one block with blobs + blobProposers := make([]bool, len(testnet.VerificationNodes().Running())) + blobsWaitCtx, cancel := testnet.Spec().EpochTimeoutContext(ctx, 1) defer cancel() + out: for { select { case <-blobsWaitCtx.Done(): @@ -218,8 +221,22 @@ func (ts BaseTestSpec) ExecutePostForkWait( if blobCount, err := testnet.VerifyBlobs(ctx, tn.LastestSlotByHead{}); err != nil { t.Fatalf("FAIL: error verifying blobs: %v", err) } else if blobCount > 0 { - t.Logf("INFO: blobs have been included in the chain") - return + proposerIdx, err := testnet.GetProposer(blobsWaitCtx, tn.LastestSlotByHead{}) + if err != nil { + t.Fatalf("FAIL: error getting proposer: %v", err) + } + t.Logf("INFO: blobs have been included in the chain by proposer %d", proposerIdx) + blobProposers[proposerIdx] = true + } + + // Check if all clients have produced a block with blobs + allProposers := true + for _, p := range blobProposers { + allProposers = allProposers && p + } + if allProposers { + t.Logf("INFO: all clients have produced a block with blobs") + break out } } } diff --git a/simulators/eth2/dencun/suites/builder/config.go b/simulators/eth2/dencun/suites/builder/config.go index 89b689f239..678b2388c8 100644 --- a/simulators/eth2/dencun/suites/builder/config.go +++ b/simulators/eth2/dencun/suites/builder/config.go @@ -16,6 +16,11 @@ var REQUIRES_FINALIZATION_TO_ACTIVATE_BUILDER = []string{ "teku", } +var ( + DEFAULT_FORK_WAIT_EPOCHS = int64(2) + DEFAULT_FORK_WAIT_FOR_FINALIZATION_EPOCHS = int64(5) +) + type BuilderTestSpec struct { suite_base.BaseTestSpec VerifyMissedSlotsCount bool @@ -31,7 +36,7 @@ func (ts BuilderTestSpec) GetTestnetConfig( ) *testnet.Config { tc := ts.BaseTestSpec.GetTestnetConfig(allNodeDefinitions) - tc.DenebForkEpoch = big.NewInt(1) + tc.DenebForkEpoch = big.NewInt(DEFAULT_FORK_WAIT_EPOCHS) if len( allNodeDefinitions.FilterByCL( @@ -40,7 +45,7 @@ func (ts BuilderTestSpec) GetTestnetConfig( ) > 0 { // At least one of the CLs require finalization to start requesting // headers from the builder - tc.DenebForkEpoch = big.NewInt(5) + tc.DenebForkEpoch = big.NewInt(DEFAULT_FORK_WAIT_FOR_FINALIZATION_EPOCHS) } // Builders are always enabled for these tests From 7fa0cebb9ee4a9e1566dcb018969f485b2f216e6 Mon Sep 17 00:00:00 2001 From: Mario Vega Date: Wed, 6 Mar 2024 02:07:57 -0600 Subject: [PATCH 208/387] clients/nimbus-bn,vc: use ethpandaops prebuilt docker images (#1027) Currently nimbus images take too long to generate and they seem to randomly trigger a full rebuild even when the image was just recently built. This PR changes the default Dockerfile to use the prebuilt ethpandaops images to speed up test execution while leaving the original file as the optional Dockerfile.git to be able to build from source and run hive tests. --- clients/nimbus-bn/Dockerfile | 28 +++---------------- clients/nimbus-bn/Dockerfile.git | 46 ++++++++++++++++++++++++++++++++ clients/nimbus-vc/Dockerfile | 28 +++---------------- clients/nimbus-vc/Dockerfile.git | 44 ++++++++++++++++++++++++++++++ 4 files changed, 98 insertions(+), 48 deletions(-) create mode 100644 clients/nimbus-bn/Dockerfile.git create mode 100644 clients/nimbus-vc/Dockerfile.git diff --git a/clients/nimbus-bn/Dockerfile b/clients/nimbus-bn/Dockerfile index 16652b8a3b..fec04f31c7 100644 --- a/clients/nimbus-bn/Dockerfile +++ b/clients/nimbus-bn/Dockerfile @@ -1,36 +1,16 @@ -# Docker container spec for building the unstable branch of nimbus. - -FROM debian:buster-slim AS build - ARG tag=unstable -ARG github=status-im/nimbus-eth2 - -RUN apt-get update \ - && apt-get install -y --fix-missing build-essential make git libpcre3-dev librocksdb-dev curl \ - && apt-get clean \ - && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* - -RUN git clone --recurse-submodules --depth 1 --branch "$tag" https://github.com/$github - -WORKDIR /nimbus-eth2 - -RUN NPROC=$(nproc); make -j${NPROC} NIMFLAGS="--parallelBuild:${NPROC}" V=1 update - -RUN NPROC=$(nproc); make -j${NPROC} NIMFLAGS="--parallelBuild:${NPROC}" nimbus_beacon_node && \ - mv build/nimbus_beacon_node /usr/bin/ +ARG baseimage=ethpandaops/nimbus-eth2 -# --------------------------------- # -# Starting new image to reduce size # -# --------------------------------- # +FROM $baseimage:$tag AS source -FROM debian:buster-slim AS deploy +FROM debian:bookworm-slim AS deploy RUN apt-get update \ && apt-get install -y librocksdb-dev bash curl jq\ && apt-get clean \ && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* -COPY --from=build /usr/bin/nimbus_beacon_node /usr/bin/nimbus_beacon_node +COPY --from=source /home/user/nimbus-eth2/build/nimbus_beacon_node /usr/bin/nimbus_beacon_node RUN usr/bin/nimbus_beacon_node --version > /version.txt diff --git a/clients/nimbus-bn/Dockerfile.git b/clients/nimbus-bn/Dockerfile.git new file mode 100644 index 0000000000..16652b8a3b --- /dev/null +++ b/clients/nimbus-bn/Dockerfile.git @@ -0,0 +1,46 @@ +# Docker container spec for building the unstable branch of nimbus. + +FROM debian:buster-slim AS build + +ARG tag=unstable +ARG github=status-im/nimbus-eth2 + +RUN apt-get update \ + && apt-get install -y --fix-missing build-essential make git libpcre3-dev librocksdb-dev curl \ + && apt-get clean \ + && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* + +RUN git clone --recurse-submodules --depth 1 --branch "$tag" https://github.com/$github + +WORKDIR /nimbus-eth2 + +RUN NPROC=$(nproc); make -j${NPROC} NIMFLAGS="--parallelBuild:${NPROC}" V=1 update + +RUN NPROC=$(nproc); make -j${NPROC} NIMFLAGS="--parallelBuild:${NPROC}" nimbus_beacon_node && \ + mv build/nimbus_beacon_node /usr/bin/ + +# --------------------------------- # +# Starting new image to reduce size # +# --------------------------------- # + +FROM debian:buster-slim AS deploy + +RUN apt-get update \ + && apt-get install -y librocksdb-dev bash curl jq\ + && apt-get clean \ + && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* + +COPY --from=build /usr/bin/nimbus_beacon_node /usr/bin/nimbus_beacon_node + +RUN usr/bin/nimbus_beacon_node --version > /version.txt + +ADD nimbus_bn.sh /nimbus_bn.sh +RUN chmod +x /nimbus_bn.sh +ADD nimbus_version.sh /nimbus_version.sh +RUN chmod +x /nimbus_version.sh + +RUN /nimbus_version.sh > /version.txt + +EXPOSE 9000 9000/udp 4000 4000/udp + +ENTRYPOINT ["/nimbus_bn.sh"] diff --git a/clients/nimbus-vc/Dockerfile b/clients/nimbus-vc/Dockerfile index 85a2ecd6b3..3bb4847aca 100644 --- a/clients/nimbus-vc/Dockerfile +++ b/clients/nimbus-vc/Dockerfile @@ -1,36 +1,16 @@ -# Docker container spec for building the unstable branch of nimbus. - -FROM debian:buster-slim AS build - ARG tag=unstable -ARG github=status-im/nimbus-eth2 - -RUN apt-get update \ - && apt-get install -y --fix-missing build-essential make git libpcre3-dev librocksdb-dev curl \ - && apt-get clean \ - && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* - -RUN git clone --recurse-submodules --depth 1 --branch "$tag" https://github.com/$github - -WORKDIR /nimbus-eth2 - -RUN NPROC=$(nproc); make -j${NPROC} NIMFLAGS="--parallelBuild:${NPROC}" V=1 update - -RUN NPROC=$(nproc); make -j${NPROC} NIMFLAGS="--parallelBuild:${NPROC}" nimbus_validator_client && \ - mv build/nimbus_validator_client /usr/bin/ +ARG baseimage=ethpandaops/nimbus-validator-client -# --------------------------------- # -# Starting new image to reduce size # -# --------------------------------- # +FROM $baseimage:$tag AS source -FROM debian:buster-slim AS deploy +FROM debian:bookworm-slim AS deploy RUN apt-get update \ && apt-get install -y librocksdb-dev bash curl jq\ && apt-get clean \ && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* -COPY --from=build /usr/bin/nimbus_validator_client /usr/bin/nimbus_validator_client +COPY --from=source /home/user/nimbus-eth2/build/nimbus_validator_client /usr/bin/nimbus_validator_client # Add the startup script. ADD nimbus_vc.sh /nimbus_vc.sh diff --git a/clients/nimbus-vc/Dockerfile.git b/clients/nimbus-vc/Dockerfile.git new file mode 100644 index 0000000000..85a2ecd6b3 --- /dev/null +++ b/clients/nimbus-vc/Dockerfile.git @@ -0,0 +1,44 @@ +# Docker container spec for building the unstable branch of nimbus. + +FROM debian:buster-slim AS build + +ARG tag=unstable +ARG github=status-im/nimbus-eth2 + +RUN apt-get update \ + && apt-get install -y --fix-missing build-essential make git libpcre3-dev librocksdb-dev curl \ + && apt-get clean \ + && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* + +RUN git clone --recurse-submodules --depth 1 --branch "$tag" https://github.com/$github + +WORKDIR /nimbus-eth2 + +RUN NPROC=$(nproc); make -j${NPROC} NIMFLAGS="--parallelBuild:${NPROC}" V=1 update + +RUN NPROC=$(nproc); make -j${NPROC} NIMFLAGS="--parallelBuild:${NPROC}" nimbus_validator_client && \ + mv build/nimbus_validator_client /usr/bin/ + +# --------------------------------- # +# Starting new image to reduce size # +# --------------------------------- # + +FROM debian:buster-slim AS deploy + +RUN apt-get update \ + && apt-get install -y librocksdb-dev bash curl jq\ + && apt-get clean \ + && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* + +COPY --from=build /usr/bin/nimbus_validator_client /usr/bin/nimbus_validator_client + +# Add the startup script. +ADD nimbus_vc.sh /nimbus_vc.sh +RUN chmod +x /nimbus_vc.sh + +ADD nimbus_version.sh /nimbus_version.sh +RUN chmod +x /nimbus_version.sh + +RUN /nimbus_version.sh > /version.txt + +ENTRYPOINT ["/nimbus_vc.sh"] From c78f8728f233c0d6382bfdce5ec456d5592cdcbd Mon Sep 17 00:00:00 2001 From: spencer Date: Thu, 7 Mar 2024 01:28:23 +0800 Subject: [PATCH 209/387] clients/nethermind: enable snap serving (#1004) --- clients/nethermind/mkconfig.jq | 3 +++ 1 file changed, 3 insertions(+) diff --git a/clients/nethermind/mkconfig.jq b/clients/nethermind/mkconfig.jq index 5f19c00a66..6a4661bfa2 100644 --- a/clients/nethermind/mkconfig.jq +++ b/clients/nethermind/mkconfig.jq @@ -109,6 +109,9 @@ def base_config: "BlocksDir": "/blocks", "KeysDir": "/keys" }, + "Sync": { + "SnapServingEnabled": true, + }, } ; From 4fa9f12fcb9b56638ccc66b3a187a922fed1f289 Mon Sep 17 00:00:00 2001 From: Mario Vega Date: Wed, 6 Mar 2024 16:59:26 -0600 Subject: [PATCH 210/387] simulators/eth2: Update blobber (#1031) simulators/eth2: update blobber --- simulators/eth2/common/go.mod | 2 +- simulators/eth2/common/go.sum | 4 ++-- simulators/eth2/dencun/go.mod | 2 +- simulators/eth2/dencun/go.sum | 4 ++-- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/simulators/eth2/common/go.mod b/simulators/eth2/common/go.mod index 53467fbb85..6539ed9237 100644 --- a/simulators/eth2/common/go.mod +++ b/simulators/eth2/common/go.mod @@ -12,7 +12,7 @@ require ( github.com/herumi/bls-eth-go-binary v1.29.1 github.com/holiman/uint256 v1.2.4 github.com/lithammer/dedent v1.1.0 - github.com/marioevz/blobber v1.1.1-0.20240228051014-aa5f0f9031a9 + github.com/marioevz/blobber v1.1.1-0.20240306221924-a7e22e59ea34 github.com/marioevz/eth-clients v0.0.0-20231123180401-b4230c802498 github.com/marioevz/mock-builder v1.1.1-0.20231123171249-08b59e943190 github.com/pkg/errors v0.9.1 diff --git a/simulators/eth2/common/go.sum b/simulators/eth2/common/go.sum index 6810278448..cea7090af5 100644 --- a/simulators/eth2/common/go.sum +++ b/simulators/eth2/common/go.sum @@ -366,8 +366,8 @@ github.com/lithammer/dedent v1.1.0/go.mod h1:jrXYCQtgg0nJiN+StA2KgR7w6CiQNv9Fd/Z github.com/lunixbochs/vtclean v1.0.0/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/marioevz/blobber v1.1.1-0.20240228051014-aa5f0f9031a9 h1:0N0luMkryC9Z/UCsPnIdd3a6n1Iv786L8lRpBOp90GE= -github.com/marioevz/blobber v1.1.1-0.20240228051014-aa5f0f9031a9/go.mod h1:7wGWXnUInWpcluqhusompgjT18fujAK/ibNxsuH4sgM= +github.com/marioevz/blobber v1.1.1-0.20240306221924-a7e22e59ea34 h1:8Dq4RK6bFDm6GJTU3iEaUCSt2+85GReA7wxfeAfYD0w= +github.com/marioevz/blobber v1.1.1-0.20240306221924-a7e22e59ea34/go.mod h1:7wGWXnUInWpcluqhusompgjT18fujAK/ibNxsuH4sgM= github.com/marioevz/eth-clients v0.0.0-20231123180401-b4230c802498 h1:FHzV7rVAhib6tRhR/e4UTWupqWw3ikIme06O1x96Ynk= github.com/marioevz/eth-clients v0.0.0-20231123180401-b4230c802498/go.mod h1:bhR5rKHekIvdWmsWUqRP6X6dLl05ohnH3X/+ZvKs3xg= github.com/marioevz/eth2api v0.0.0-20230922201437-72bd1301e033 h1:sn57n+lbJrLS8FKYs08W7TEzraTGOCQGrSC4hni6rYw= diff --git a/simulators/eth2/dencun/go.mod b/simulators/eth2/dencun/go.mod index a94151081b..126ca2c875 100644 --- a/simulators/eth2/dencun/go.mod +++ b/simulators/eth2/dencun/go.mod @@ -10,7 +10,7 @@ require ( github.com/ethereum/hive/simulators/eth2/common v0.0.0-20230316220410-1364352c32a6 github.com/ethereum/hive/simulators/ethereum/engine v0.0.0-20240305231022-f69df863de20 github.com/lithammer/dedent v1.1.0 - github.com/marioevz/blobber v1.1.1-0.20240228051014-aa5f0f9031a9 + github.com/marioevz/blobber v1.1.1-0.20240306221924-a7e22e59ea34 github.com/marioevz/mock-builder v1.1.1-0.20231123171249-08b59e943190 github.com/protolambda/eth2api v0.0.0-20230316214135-5f8afbd6d05d github.com/protolambda/zrnt v0.32.3 diff --git a/simulators/eth2/dencun/go.sum b/simulators/eth2/dencun/go.sum index a485aa2700..acefc8671a 100644 --- a/simulators/eth2/dencun/go.sum +++ b/simulators/eth2/dencun/go.sum @@ -446,8 +446,8 @@ github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czP github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/marioevz/blobber v1.1.1-0.20240228051014-aa5f0f9031a9 h1:0N0luMkryC9Z/UCsPnIdd3a6n1Iv786L8lRpBOp90GE= -github.com/marioevz/blobber v1.1.1-0.20240228051014-aa5f0f9031a9/go.mod h1:7wGWXnUInWpcluqhusompgjT18fujAK/ibNxsuH4sgM= +github.com/marioevz/blobber v1.1.1-0.20240306221924-a7e22e59ea34 h1:8Dq4RK6bFDm6GJTU3iEaUCSt2+85GReA7wxfeAfYD0w= +github.com/marioevz/blobber v1.1.1-0.20240306221924-a7e22e59ea34/go.mod h1:7wGWXnUInWpcluqhusompgjT18fujAK/ibNxsuH4sgM= github.com/marioevz/eth-clients v0.0.0-20231123180401-b4230c802498 h1:FHzV7rVAhib6tRhR/e4UTWupqWw3ikIme06O1x96Ynk= github.com/marioevz/eth-clients v0.0.0-20231123180401-b4230c802498/go.mod h1:bhR5rKHekIvdWmsWUqRP6X6dLl05ohnH3X/+ZvKs3xg= github.com/marioevz/eth2api v0.0.0-20230922201437-72bd1301e033 h1:sn57n+lbJrLS8FKYs08W7TEzraTGOCQGrSC4hni6rYw= From cedfedfb3e1853083bf97e20da51e06dcf82adad Mon Sep 17 00:00:00 2001 From: Kolby Moroz Liebl <31669092+KolbyML@users.noreply.github.com> Date: Thu, 7 Mar 2024 11:26:09 -0700 Subject: [PATCH 211/387] simulators/portal/beacon: add beacon mesh test suite (#1032) --- simulators/portal/beacon/src/main.rs | 18 +- .../portal/beacon/src/suites/constants.rs | 8 + simulators/portal/beacon/src/suites/mesh.rs | 215 ++++++++++++++++++ simulators/portal/beacon/src/suites/mod.rs | 1 + .../portal/beacon/src/suites/rpc_compat.rs | 20 +- 5 files changed, 250 insertions(+), 12 deletions(-) create mode 100644 simulators/portal/beacon/src/suites/mesh.rs diff --git a/simulators/portal/beacon/src/main.rs b/simulators/portal/beacon/src/main.rs index a7f851dde6..9b80ba675c 100644 --- a/simulators/portal/beacon/src/main.rs +++ b/simulators/portal/beacon/src/main.rs @@ -2,6 +2,7 @@ mod suites; use hivesim::{Simulation, Suite, TestSpec}; use suites::interop::test_portal_interop; +use suites::mesh::test_portal_scenarios; use suites::rpc_compat::run_rpc_compat_test_suite; #[tokio::main] @@ -41,8 +42,23 @@ async fn main() { client: None, }); + let mut mesh = Suite { + name: "beacon-mesh".to_string(), + description: "The portal mesh test suite runs a set of scenarios to test 3 clients" + .to_string(), + tests: vec![], + }; + + mesh.add(TestSpec { + name: "client launch".to_string(), + description: "This test launches the client and collects its logs.".to_string(), + always_run: false, + run: test_portal_scenarios, + client: None, + }); + let sim = Simulation::new(); - run_suite(sim, vec![beacon_rpc_compat, interop]).await; + run_suite(sim, vec![beacon_rpc_compat, interop, mesh]).await; } async fn run_suite(host: Simulation, suites: Vec) { diff --git a/simulators/portal/beacon/src/suites/constants.rs b/simulators/portal/beacon/src/suites/constants.rs index b219c0e19d..f1a06efc14 100644 --- a/simulators/portal/beacon/src/suites/constants.rs +++ b/simulators/portal/beacon/src/suites/constants.rs @@ -2,5 +2,13 @@ pub const TEST_DATA_FILE_PATH: &str = "./test-data/test_data.yaml"; pub const HIVE_PORTAL_NETWORKS_SELECTED: &str = "HIVE_PORTAL_NETWORKS_SELECTED"; pub const BEACON_STRING: &str = "beacon"; +// private key hive environment variable +pub const PRIVATE_KEY_ENVIRONMENT_VARIABLE: &str = "HIVE_CLIENT_PRIVATE_KEY"; + // trin-bridge constants pub const TRIN_BRIDGE_CLIENT_TYPE: &str = "trin-bridge"; + +// Bootstrap https://github.com/ethereum/portal-spec-tests/blob/master/tests/mainnet/beacon_chain/light_client/bootstrap.json +pub const CONSTANT_CONTENT_KEY: &str = + "0x10bd9f42d9a42d972bdaf4dee84e5b419dd432b52867258acb7bcc7f567b6e3af1"; +pub const CONSTANT_CONTENT_VALUE: &str = "0xbba4da96d4600000814453665c4b46dad568d69d0a3d211c70829ce7c5c17549713ed0996c8743e6b55b3797ea19c0eebac07b0e163fae9aa71bc2561705e492dd206730e8d7e731e621d2d7039ded027d9910bd41b23f642c609986a33f46fb3187faf6a0abc1809811c919b69e9ecbe5c129e3bc6cc6811de879149bf856984cc2a5162aed445600abaccb10a1b48694f150de473b893184c8200c822abc86d3d8d3bab7918b55963553bf9be9d2144a36827db66449e2302a49c72837b3e793666321ffa0a45089cb5f6af2380686485c4a85aa460dafff2c2681ffc4dd2a57ad488e53e904734908fa7759d18edb7e58d54ae6565774b607fd7488f013b6d02cd13beb3ed2a41d983f02f7eeac4b7f4222474252ef4538b5b09c3fe7ba6899412839fb79588387fd75faf7225e9dfd65bb46a795929d1a6a83113cc89c390ef293f9b73f336157e2f4abd6867a7a3aad6cb0472e1f17a73f913822642688fb28944b9df775593ac8a77bac24608066588ffc11a91b0c85d3f078be13ff586f7cdc20a23473f7a8c800c039edaa2ea42e15be9dbd47638ff4389b0a4e7daebe365aaf47ddbc16d3737ef8f4ed64da4ff89064056a794f9232ab744f72c5ae7fc674890d07027dc5541eaaf8dc1edc8d8fb4d5c763053a53697d9e5100ad9afa1e9fc888cf1197ad56d34d0f290b5d73dcb191ca444671fa433332f9d451efa4623ccaa1ca061827b86eafc6f771e184c48f4a3ab88c44829cb86aa86516cddcbe07bb52957e926dbb7bea95e9adb19ab3f99ff83279b5e41dd5cab1b5ee617340c8b46536a4e0b60d7235423760c2a72910dc838457a5a6c2d96bb1fe3c8b1cc292af040bcc5fb030d407a283dab7cf28b5fc8f651afb812b2b138c2dc05c2606320fd82ebe8ca7843ab0058ccdbdac8395bd65df3327fcbe1d8ac52b5e8e8970acf53a46d1ffa4ef16a472e24746a05f13399a7613a2b483855e7d67348cc8b51afec047355d3ba2a1f19d1e2fe3ee7b5137b4d0d257942118700ce0b506ee1b8b0c542ac600ffa734a960b60c13e89d3f60c5de14e3a557159326ae0eaa2328ee3d57ee2406ae9dae30d2bda566d5e22a2bf051a5ca0485b32edb939b949a967d315c0b771ae169433c6b683e0f58e5a4d874e4577d8ec74ee5466491a61cbd96f3d8ae11bb3d5818fda22b5f7914e82ff54d868983315df52ed8ce53b438b6f147343af4508813063e68b6416ddeb0eb0de1c494f0b40211bdf757919a28ef984ca6091f15f5953e0c8250fa5cfe4f1f5e54acd9faa8b5efe29a5daaf0494151b73f6dcc9f8b08558535b1b4887d275cd3feac9424be96efd63191c6fadebe8825917b58a7a286cbdba16cb3df97f1a94c1e41260bc4980ec4ed34032e8c714fe1ff769f8a79217a4a25c1efc38714c68eee4b7f8088e75fc044349471caa4b7fe94793d82e46e81f7bcac3ee933c043bcafb97882ee20d9d45d7c459934926b3079411afea06ae8cba6f092824313ca9998e067051b638b77ea5b90fb69af4ccc66218945554d9b78c3a5ea25d7e4eb9d68bbb40cb99176dd8ced6478af77e10570e5329683d66a2dcddfbcfac27f44ca51e7eb5ebe686e3bfae17a8415a2a13b29149c4392e4226a31225ba4af8df06e20d34c0a0b50376c28e0ff61f55588f8d77e481a3bda3eafb6af54015a2fe2b85c1292d883e4b074123a873f7bace327f77b37239841b1849e87fcd9f1f4c0b5e02ebaac21e3fda7c1f6e5c0bbde58071ff0101cb20fd117b265a8e87063f0b4c0ae6342af61107c2c2d0c9a68b39e8e609dcaea876bb2257d5c5a1e09c0451782ad560b8be7489a4c1e446b1fefe710d1b5d5fb2960d05e931f6fe0b6b85d4a9d4609370308774952614e889827eb7fa6017d5ab5285494620d2a3ead19245e4b6d389d503e7fb3faa7d71eaebd63d106bddee15ccbf80221a12d4cdee182fdabfcb8bd84db3e84cfa6b67d20ba17b7f96f2c9a5206dbdb251094ea01b174f664e3ecd145b876db7b5f900e23ff823e32cd19ee8a2dd30265e196615c6ce66d688fd344d68ffa7a7ad53e1570e5849d06a9d35c26cd41edfeaba7c0fffa5e2e017876d4a10453c906ac9f569ebe129692d49e6d4bfa42a4fe8f0838fcba8107576fa0b970433e1930c575f5827593bacbf77162a8187f7befbfc427bfca2273d24ddc67d7dea6116a1f25a02baf10460040120b6570c01b69a742d260351e64c1911daa80a4c8ca60e2c94b275c864f76a27f8edd99ae770d666f359cd4596978bbc50151ef313955cd867e9b1d4a76d501bc9999c1a5390cdc76333912ed4a3dd34290669a44392917052b1867d68f5ddd332f64e380d4631ded0ebecb92d09bcd7ac2a6f5f39e251f6b1070d614f716e2fb95d9f26aa8b1f8f201e6d473b2ea2624eca1cf297934720ce8e708b2cd1b992a9296232cda34f470a6d79f0ae5f2025f893bd15028988e14dd8074ce97010091de70685584e28bee1963f58a262c85df328377cb0c5cb3f39fe568684439916ec121766afe27abe8fd25ed47c06700b8629f27be989ae3e439aefec3861d3ddc2eab0281868e35001e26f98d7bff81c63c22ecbfb48060d0d8d1235ce28d9080dd2de2ac0408d583b8567309c4dbb0318dadfdeca8b8815fb08dd266955a05101c8a2432530535333ecdfb4f428eed385fb25a101c10a1f06e0d921978f3ea9f999459c488dde6035c1a6eca88998528f8e144b36320d6bb688450c9d394c3089d509cc8a906abb6c43a8b0537707c5bf7b1a9a7e573829fa3c9a415fb0001ffa4b4227e15f1e1f22d65996933cdf20ce49ceff76834f690caf6e012e209e34a4e814ed62d25b66424d5a788a4efc7aae897eb12ae3e51665f478332181fd04a995696afa831ebd6056629bc066cf36ddc88381d3c88fffd68e3cdc1fd9b06105066119994ae81040503f1f0a10c4153a11d1e609adfb9018431c31c1ff2807faab0e7af0239488bc063dec1190981964affee89ab22faaf23e3c24cbcc7d769e7102208d576bd26a640878650ca345aa680befa367dd105b3ebfd99391d53c66afd6154cfe7dd8813fe39059e8dc5027924e25cf94d13a9fa4ba1f16cfb442c8a8d3f898d141d9efae49249fab1d05cb3f9fb900aa0ee6aa232911822e0c17998201c896ee15deff92aab0c34413d132ab731c682c9f3b3d745e6c5e18e673c16a56c4646ec0c2ca04654bab28bb7a5ca579a9170ba9ff3e5363bce737acfdb1eac18377e33978ae4a82dba9bbd4419221e58a10ae80f91067754051ad9c16606b72752f43ecaeeefd9f0af140d0d4461a3d890cb07cbe2a9b001571001fefcc7f0e1b92abaa097e1566d5340853515a15fe4256b83ffe2b723e60e206b75f27ca1b99b1164484197d115a93f85aada209f8ab8a31ce3a66f23c820698febb8e95ba96ac28fca74bca0d504dca4cdba7e85bdaf7fef7b0f17d4b6fafe4c3e9810ee9fc1a83466fc3875eb8e22b2ad6e068b9b18bd9f60f9e66f823cc52a2ea0eea5a1c3e7756d82811c9da030bbc3a51c1150ca8cbf5ba38b106b185e0ac4331e8a0d653a66cad60427efc8b7dbdb817999e346152c197e1b2d61a5a9d7f2ed328aecab1ffee39b76c17dd3577cc399ac7c7e1cc48e4fac0aacc1451793db4f91b593f0ca06236425417238ea6d40e1837a9928af864d8b34fde1cee5bc2bc7e69bb9908c8de49df8c821f0fd6b497657b4ed5cde9502e86ae3e6f7c15189a96b31d30f59faa760de83831397c7f99cfc7e23f2687aaf2ae64deba1902f491299ae927ed9c10ff485f576cef160dd32c11e33003c9eaf468db444bdb715d97acc8df5e08e6aec88d91f747e897fffad73af7e05b0c5cfe23deb931f489763e876088841e9d7358c94619229ef27149b51f0a322200c103e80588e1f6f31a47f40b3b858d0995af11b99d7baa4c7cc145d58e14c240954234e32691001e9cdcde67429cad3962f37fd84a7c61857540799b8ff3d3cda254ba05880e680230712a0618054dd0c89b862e419172a0282277865a2dd45e14a49e31e73db870d70f238a29546e54eb601cc76b8837ceea671faa84f096bfb4b7eded007e12d2efc4f9ff8a421b2000a75c5a01695ab33f027429361fc9f46d0bd883d96a1f9b4b329a9c7256e45f13a298590c0ad15e3c16c73b541bef836e81ba5e18c844c1165fa23932c40287257bedeea72af52893990bd5a6bb57df63a2b6a1565680945f87326e38508918c0020e7f8cc2a26e381e34d8197cc45e0dfe975331d65494aeabece73b741ac9b192e930439dab6b62b91a9dac9f909d78111dd62a5f0561f5f47a9a60c5d55f309ddd4b7b94efc87dfab8effaba010041abafb8757d0f681e1a25939cc5ecf764bd83f2832653feaa0a18d86336aed2c73c84199afdd03171e74fc96b865d0bf7f4f5a54c15c823f27b209b5d34b64cedc5baeb0184b2d9524b012a2e4fd70dd539db32f6964c34d16399a16c5499597423149a97723cdf5b5deb33693d456213793adbe52ec75ea8934e38ecd9299ff8d57ef12e9b4e14806d103954b86321ea42aad93daf0ea876befa5bc2a7659b3608e9efff93a7b5201478798d65d892aeae9ded2fad2ea4007c0cfd35727d44f8ca4c7a52b4e331621e7dab1aa1f7aec02c7e7c3ae36489b421042a9f331cc609990c589f1048c10d1ff1873e9a871477ec91acfbdedcec1cc83e70447a117325ab16b1a69389f4f786acd857064e82ad1da1257e3ed9820be84d6972a5f90ccd96c6409124c845a3feb23a7b862dd28e094e2620ecc39fb590e6cb7444e66f202cf8922ccc47b807776a672aa35e4434e27ba331d0666ee19b472556951fa250b021dce47ac13a33264fcb87597ce6a7d66391d19da9758ef1ee7d19e1f774ce54c5e92a487735cbffd941210fcfc8c42b7af9fcbe376863e4e919916f0d0ccf8fd05d1d7b3b41401864f4c179bcbdfff434dfc4dc4171d35ce0887a0ac8e3d17f150411a09a74e02e47fb8f537f3add4377e0381015a79a5fc12fd86b521dde790030f0ddc7cc34305c0bc5e9e3b22460d405a3cf28761c0e7ada75fc69d11430c04bf856870b689e40491f49f76d18b6c62ee4a4937d2506e5658b2e71adf7fc9aefe03e6fedc0251a99760209fdad863928ff8050c39c8abeced80ecdb13fe10f0f65045f2e2d41958e49bbb4c4fc1c5fc15fddc7644e5366cb4e4416bb1a6afda3a8bcc5f7c51ff01135f7643dabe355f4cc241943521cfd15ea8c2e51bf44e17354353436ea6059f90e393790af9a011bda79f84675f83d3e4ab18a7530369a953490c20ebf4430a5398bf4738abe51a6e43974999d316259501c60c8d3a4efcbe8177833c67658921351d44588c2339704b9d6bcbe30f95b94328cf423be2fd387321e447dd5571a0c1992d091f4397fc47a835e25c6355488cbf4e2a06984410a8df4fb8bf596927531d59bb74f72e147453de54b4b82c99b836fe255878b4156eca6caac99209c9f0054f32c2138c9ecc834a2640d8ea4d6cb521bdc12f12d055774414ab86f995032ef0bf03ad45f1403161b848bd4ef4400e1778f32f5cba7274ffa117a1f3c96fcd6f0e387af6302ce40ed69cdb50b88c76388a3b80c3954c710f6617e44a986cd65909ed542614c1c6f80da78461192553d6e077e9bf8ea20b6016cdc0c995ae07bf473df39af8d0dafa160f252d58d394930d46ef2b2f0a7d1e48d8ef2aaac8a9ec0b7f00145922883de52436598fdf1fba9f1283d31b70ce0ae4daf3db610d970ec2582863e40458de4bc082dfaca451d756ef83a93baa3fa37b3f82ab8cdaa487087eb9175d846a789099e344b2ec58eac67185e6305a81f5f691330fad31715f8fef45e835a9da43a571a016a35bae46b3415ac704c66bc651fe079c797786e047187eb8c3eac665b521beff69db528d5a49568f2eb0030ccd6d5e19ad4adfb271ed46d44024356808f77e16573c4f0aa225694857c34c5f00bcae4ff15c91bc5917502dcb84b78f04e2627794268b54d9a670f0b97d9cb3a5ec637c0eb9f0922a70ba445fcc20710c56b7b05b902262c081958163c0036ddd7aca4daf4814ca4fb003b3f59a76adb7390155e0dd635b8c04ca59be1a0768463d94f49a021efb43645da70770e4b2f4d00bacaa91df4572fdc8903ff47df32da286a5f14a3ed8717e537b640aa123f6b64e5db9ea7e3abe9907fca059493075091e10815eb342b85326d35a5d978515882b8258c71ad6eaf9eebac6ef8284e4d7925d40b48fb1c4ed93ab6b4bc06411cc178e8ecea37cb50a7bea428417ab63dfa931f0885ac82f5330764294d0297003418e70fdc994adf9d0f23486520b8caa560e8c78251fe9c95861a45050797db4586e18d968f6104dc18c6dcb6652ba7f5f8504a76cdbd56c2fd9bb5c3b33384ff6718e9cf70fd97b62a4a2384807a6d5e9151e890ebf9e797c61b0eef785cf25b6e1f930320cf1ed97cc43490f3318d74cb4a5835e742f8ff9abba5562e791eac25fd8450b4f5458fab279ba50b06e2902d04d1f63dd6d08f515a87b1f13822f7fd88e464e384b2ebc91c2ff0a834655c632b5b7e3099132fe6adae081fa6d756e57949bdfaf00a3474b5b4b47442d160c66ad76d9bb755b144f49553feac5e772dfcaa944a31f4ecfe989ff4dc092525d7e95eeb938c87e22de2e18de8891db8fa0aff02dc0c936ee1c5846f454e6dd5a2a8a84111f213242ca48ec4a0ca42de208114b425884bf754f9891a511b6e149009346e2978a89df0394777a636bd6d6cc91cd06cd1395d9c42cd5f278e1ed46ec4799910d6ac90fa9fc346a09a83a27a096602b4269da59eddd4ae1c2f3f30cdb05131399cf3c50c913c683ee1a95ae748b674ccd3ae95b037aef9c98bc4693eeb2c68ec35bad4dfe85ff73b1df1584d3c99ca62f44bde2d01b4a1a20ed9e8309042005d373d3b93bfdc4ac7899a2f4fa9498275caa522098e7ac5d756414e3acbd875643c2525229105cd82a32669590f23573755c92518134dc29ed20ff7391a7d809a4a90d4f3ccd98417306079861565f24088c9f7145f44093f6dc62ed87b0b877110d22048df35d11a9c55f0242a1a4671ec29a9089afd2f394cba94281f8c21f56ae82332b7b04a61d99762498993fef839a27bcc305b47f0746f24394920e5ecb28ec54e49e6a6207c63fdf445b561ae777a5af4717bf84bbcbfd27b47f5a72308e46589dc13056956be4ae308bedd8e7e8f0e796679de5855aca48d26dad61e97f1b66681ab7d3277c7f77e1d69643db6ef966831fec812c326dca60b33f317a1cd6d055aecdc40bd5bd2199ab738595dc59d4fa794d63d7758c06a4aac989686cc8abd3c63122f089cbf5398e933313ccdd960903eb597954b2749b848056b996f5949ed81acead2823d11de1925c547b07fdd7a0764e65d42ba4cfa5277424bd750b6dd6a446752b4b8821949fdd4460c3ef0340de7e9687f468a9b77105354b55bc5eeffba2a27d845f79b7396446353efa313d4422bea82d8bcf95897b3f15aba174e91059115e5e0bd02dd9aa92397f35a424e925c297d70be682f17c470035b58ea2f17703c86333e5790dd1630559e4d4a0313cf7b069bb2467ed1a53f4ec4e2587c49d582a4b21ea988e620b91bd4647297050d64aec86b628bcbafc2106ce8c6e8f52101c0fbce580b18b309d3fafef0c81a3f1c7ffc66585b007270b3868a45bf9168ecbf82489324ca7c1feb0f99b27f9d9a294481c95d5ccfe1dbc888d1e2c4c506d375cbc89925113d25c47ffdf60818744c832a7abc4ab36dfb4a13dff1d2830e9e6fe3fb843a442303b1eb8cb8778ba9b3fbb273a8a91f5e19e09fd2a37738aa63fd26a0b630bb3b36c219b79831562877b484273e72c8b4320ab00d328c3bb1854c99b6aa8e2ee69d767cd5a205c8982ff75ce1a7a46cdde1651e3f8f1bd79ed3eb595e9efe010d59ee3c3fa9470bb03c285389790f8ab442884e4d64b0a479066e1f62f2a1561e0012e44def9309af5566e94d68e4f5ce455ba4f9afb0e662287f87b5b96e0b215a1b9baeb8fb46a52e711afacd1ba7bdfc50e1ff7305ab07264186c83ceb77cacf008b6c10d56fe1f4610cd05844f7e44af4f08e7d7d0e8f55d0f3734956fc9287e2a8294102c2d97ac21f9d741b32c3eb9086bde7712e164865bbf1a84f14d48e0b38f98ef54f06af33c916db45e6abbe3370c9e47c5a5f5cf73b4b784e47bc3f5574155c804c18ee4954f7e89c50ae9ba4d03123093a6500ded8a6118f7dca1fcf62614e68f38d2e598c54a065f228eef188cb7aaf1f41df6f3d4d788a88d204e9e285034a0c6c5b6b894e232b844a4696a3ef7d8f0811e32f6bbfffd557dab2b588eb918d8443d0a9f4a7c82b42c275bca9865e7ac38ca3e49dd150fe2f01fa8df60d6f581f050b3bbe0ef416ff657db803c0c4995b9b871a38a5fab90bb90732766d35452dd0ac64971d75a65d744baf6ca2340c26934f6527c29665ef128f17c20d8c1fcca12fac9d898893a664c600896a922ad526c6283050ae67863d2ec2f47eb01b1a3e19531a2213078edcbb953b57fe701f0445e95b6a78e45d1ba06e3b9077847e1017f6085f75d3bf0223c98fd32000d555b73e6c51ab57246e15d22531693894f793cd27d8fb68355030b0f7a357ab43192956b96afc377de9b07c41d30a6a23f461c47f40d5e2a023795c06fda75737e2a5143d325b86d62aee8500d1a76c1a96269817f465ed46b40140b7d892b68ab40d3430cea6f598b8279625deabc631a7114e99e43a36c83fb7d37a70d742d297b973fa7e0caf2b47ac62f0750e0c22a59ca5952ea74f0b59e16a1e3ce1b391f1a9f28345da7a5f0b37064ab736772f7941bc9b7c758a4c56f1fb5455ee551f5e9e02e8de051e339bf90ffbfa75c45319cad15e2c5aa87b98b604568dd1eb46c9b92d553c5c4268a1a2e44707b3e6538ebdfb5f504e73fd80b0d971a6c280fbf80a35a4723b9e1db4566ae59354322f6a6a2ef45c60ac12ea88edb34c90fbdf7b8bd8708cab7bd1a0b29be454c3479f2629c5018fea8285f03390c355e0accd89f6824d449a38e6d0a2ff8690da806ee42530867b3f363b3d49e738df1563c5600702ecb5bab1726ba55fd0d4ace1581d4f4108368b24fe4d4090b371052098c4974faa7e46e82cf07589822a39aba6b03c2f19746827fc4d2f2ba82df5923d5e2876872d840b657bb2646c9713cd61a83510e5d00a754fd43eaa7fa3a2509a74bc7076096b720b73ea207b4ca9aa638b78f4c0d4a4257fa3d3de17c30507af0a058d99db8706820cd18dad632b954374503edff3191fcbfc5b2b55be2b0b7504de5fe097d97147f788b55f6332331101ad4204cf5b18173d4d0809c7d9eec152c5cacc981b25c8aab74e3adfc472fa13e6f6b3212bf2293f96a2482ada1f4ef9dc524c2499e970eb4496da67b6948958f998dcd398b3aed89d5943d1529ffe74cb7a7c2df90043a24ec03fb8adfd9ed6cbec980b54d199f665e755060c796c9351353a23aa988ceedc8cee0d73be4ed1e3fc765edbf7d8dd5e102cab4181e53ad02a5fdcca3c534f9110e4e7f292f5f4aa5c3fa49ab9877cd3b1c6196f62ccc3f8fd616e08eb364faee03e79b96212a1f1887b85b3502ab1cc20df3480d71aa3db7f60ee2a3167ca7a530698c998ac2352f5043b632650175dd345a3bb805c2fb200eca4612732d72fca8a5501d73777b3bba9cc398f16ef01998e922d41ba8b0bac453b80d453b7ec869bd0d79e9a87cbe0fcbaf47a11849c6695f3b877ec1df5cd248bfb2296192da2af337d4767bc3008ae01b8228d94efd3b1adec17a5f9b2a12ab50175246356edd18bd8d5b363d1bdb7f58943d8bd84d91f1f324a74c654c6307450612e94635ff12c03f08ac4d9602e231bc81eeed25901c51e8c786f66448774e8d79492af9721ddf0e37a9c168287307f2b519864c2f897fea1d8a4b53bcc9b2c5ddc91c84b8c8b090a09da8fee5f148abef2304a840444bc005dd7652b89ba5576f6481891a8a71397348ac7829bf53e3c58e5e095567ebbc9848aca8f2b8d3b6c09af750a10f6a47bcc6a45480820742de945173cf4655d93916154597d1b8de6b5b01f18db2ff6176f0cb89b68f62a1bd48bf7ffb44274c599670ae58084d57d85f244811901762194be0023975a453bb177f136ad9495e9f24b0a781da39ab7832855952722ed031fd1820aab81752d67f23f30a6e3301f3729f6cb068ec65e1ceddeec8b2c163e8624f574a65cf8e7b81570277a08e035407611bc2b136459c96dc986f140dcca94d6c69784c79ee9100ec11d240f95c7920652b63d056b35fba4582471c23a9e5dfbd717a689d9776fe49d1f8ef8fc43b530597b6cc734edec8aaf1c19138f7c65b21766ba935b11ae420d2fd0945cf46e15868805dcbd39a9223c32176cdcc19f49db6ee857aa5b6ec01185255871c4f65edd837e51082cf069fbaf7c841f13eb91cf801ad1de660a0acd43fa5b2a7c49bcc61b744b05d25cc605c81fbfd829032ac6bfb8f328685938eedc8919de180badaf8980ca0745b79e18bfaf31ca778080ea486602c2f9b80db583b32c07353f23b31130770b37863f310ac5c5a9560b57430fbf5fc37359e66735c5867012f7059418714a76fa7c5cabb914f3f9531e4c8a0ff7f8bb5bc7b263660982be7e50e565c0ade5633d94f5de6c71ceb4af1ca4ac2137bb7c02f34d88860e312681e195320727fde90f17f982d04076ab3fdd2357fdc2037db0ed17506f194426e43b065b70ff8460a6234a93d0a5c54024e1c7593815c108cf6d545718b06178fdd7dffdafd222c94f649948e1290cb85f8b166d82b7ae97b3e3dfbf3d0f381318b0a15eee35bb3877e3b966181b5b521aeb4ce1bb11554e7f56d9065e4c849e2046ab6470bb9aa3fc407b0b676e60a60ea7570b3260c7a987a5b2e949ca039f3db17608b6586c169099482869b07f7325720e27f56d07a4656914b5328648296fb66bf95b76578a8fa4fdb83daa7a395008149fd3cdf6fdcf1c80a236b3a1a96e511898cb24b631cc56aa7c7173c36162bf4c2e4f5afac8da6c4385ae6405e88b25c719a464b9a6eb2a3453ed21f62728750af1ebe768c7205e8bbbbad32f61e1ddb6bdd2556b5b21bdaa11dd85717b5eb28d995889ab0b839d8c4a6183d3804cb4403c361b0b1d27bd0cdfb98631ada8be88e17ac77f2a697ba4fb4d98d96c01400454e9d80ef89d29139079ed143e50151bda9ff1f43eeadc6cea6e693d74f4cb1cfe09696d396c25ff629064aa2d8fe449bf9702b19634605d66471b2f74f6daada1d0528fbe4c76c5ac2918e48f0428f0d4388073784e68fc2c0cfa83bd1787849fd849762ad5bafe0ee3ebf8b0599b5a98a520a5be01732d5031bf92ad9ef0c235c582f4f970a502dc4e38ef8bd6e7963731a8e1fb1f2d8bda64d5989d9b8e8971140d5fc36ca356330ae603795e61ef15758b603b9cc62fc0fd03adc9988a7f62b6a18b60eccd1bccc3b27f03dea73d9300f38d7dc40123b365264b04aad43e6857ce22584d3ddd0646e318e204412350dced56e02bb8f30ad1cc553be2c11c989ad8969ebff9c3be0db0ba9cbfca59e7b053463a5fa16ef00c33c308df36f2a8d994e1d1d12297eca66ebf0295772d0e9ba8e6fc8d6fb36d74b86c4459ebc2001110da0b6273d04f8b0c23a16f64e405d72515578b0f2111a7e9c438fec08c60e21b42e396bd9cbc1eeff6e374978fe3e39d75e8fb3eb96a6fd485e4ce9361875470a5c3ff43a2efa1a00a78fc104bed02130fb180409ff8d2a8472285a0016c50a9a41901a4902c19f21e2c120044eacb6c48d3ca1ee79780370d47f296d8cf2b8d473b0e0dcd5feabe4d1d42ae77e7264cba987404969dbe514d2b1ef5b95e06b09d2688f2503ceefb50d21fdc4a897dd6deb6c4ca27eca219c58c1182383a04f500798a3a714802a2fd33cf2cfecc8719d925705e4fd8c491932131413b9f5498acd0463b02d4e6345a4f5ccb2c95a9ec60ca4f6acdd6ae0f2ab1c1f78ba945fd1c8d0d77b374281b49ecf0fae9b27afd520e577c01460bdd07ac1c521f94f3d21c4a87871ea9dd103323ace0bfd122a4993cde5584b69f58f2ecce55e424232db799bf2441aae86c51d22c8c9f4d17b94f786157a07dd8701a1dbb2878c3e6b3911a1d716160e45f83e7565d364d4b3ada1374b7696061d42552dbcb7647c8e4d91ad3e1846cb902c373b5b36e5a09b8ef95628c6c5f846e954d6c02e446210ae89385453948fe1669e52e185f7104efca5b505b14d17c0e6f9719ce4b22f71da941caff7827a8311a0a366afd8d274c76ccaf108626260bcee8f9c0f1d8bd5f979b6b8282103c2af61aded55e0f5a80b2b192f12c42b6929364648d9b4b5680b0ed1a77a21086910bb0c041ab86fc2b25aa395ecfd5d255413eac364998a091181ecc091c64050fdce03e6484815e580f21eb07e6267719a0d88b2291648fc9ae9ab444a5de7e5aedab55d27ce3f400c7dcb57bafcc24a30daac9eae10503b52054ccc8b18220418a850392bc20ec3f768b3a6a236fc237e0a197df2a164a3e49d4133423226783f49c7dd07cb840d128eba5316878e0f85c3ef30bad7ca5ea8a681ac8f6a216abb0d90ace55f37c7179797e8715c5640a0daa39981fa48ff73125f2e1ab1591402515f7ab7b533948d7987b3f237acb2821f2746099d4b714fa228fffa92f42d0c9929e912ca5eae07e07fdd35e62de79ab35f49543eb0a03ac1acc99570289106966173fbc2d594cef0da9da3ce46c046802c1716b380a307c10496b2bc330c2d146f62ca8d5dd254e58fb846bd1a3e50a1faf580735a473f6e40ce67a4696a4612098ef832ef13a82e756bf9b6431a598a12ca8fd80e1c1c52b6e66ca01f6331ff5bcd1821cf35df7e1288e3d72ce727ded3ad0ffee267e28737607c70aa57f72dc4aff85027dd2095866d46b070b26eb4cfaf5b2e5591e9898acd7be659d7780f9de34fd04aad926dc2cf06cbf7992965e7db0ff906029eb798f09924500a6ea5454425783a4f8f6cf623753e36f13f1487d4909bf552f60b64467def6ba257ffc25aa955b46ae2378025acce6a65e90f2ad6474c09ddb1f24ed893baba3facfe0033fe4e5649357d59a4077684a69df61933829bdd84909ab6d684ba7bccc57b5d4b67aec5a1ccfa2c858017c579cbed366c29b6cd1ce009d5879ffba0c650dc18e683b9610e651586954365d8dc567dd0a80f7785b3359e6371e699d57c61c08b9f65be0a23be376f5241a6688b918bf67f32e4576d58a6af7851edcb66b6b8745fbecf1064cc60ee6bc3de69b18cc411733e9a6af08115c2049018342146a9e518299b1e1631d9a2bcda23078ad50fcd658666cc7573031dc837d59df6836f02583ff70950c495b82c8ac1c7c1e15d9c4c83ac8fd9dcbdb44c81120f1f94695aa903ce6db48950003a556b7dc06627069806e71398860c3b619f1060a774e16f4b6dbba5c6c831a8a95f290e17b178dfe3f935fa9e897559e2539e4ba3eea81c61218b26c931c8a1224895f1de6468c97a89d14e5cd400845900af012b4d4d6e29f8a79215b052092c0a9e158e43cdb839c176d75e6e39ee6083494547cf175408d7d2effe17cc862f1246be9434d9e12b490f186be8f6ad7d3c7b5bd068ec6ef7962f49207b05af20eb5aaf7e99f80408556177c7a186b7c7432bdb577d7bfcdf3f485b91a57b60780d4dc41def326e3915a319aabf3e82a6b9708245648314723d2a331974f2a6bf02cd1af9dbbba3ebc42cd8d743724a4cf20eceed48902d52b9ab9f3c3e18f2377970a3fc5c194bd4cdf57c51e2278187b0e9a57f77ccbb39b15d7bcb76a84b0defeae1cd30b59f1c1e41f78f665e6d0a1de233b6d37a8bea9a3bb7fccfc9b102ca6fd636e48a71473c867893ce71f783c3659650266911965ad2ceb2003457a5016281f672f94644c5b58d285f9784e53a64021f3f48c949db5940e9153bf0c34d4ac8ec2628eb792535dbbe5d4547f97606e8d0811a4a342fcd95040371af516303c686793e16b51c8c107b6d1f22b60fc13ec118307aa1bec5041f5d0a9d6c7ac570632a609dae75d58a9b8004873b5f805a0e08482834477a8a9562482c88a9288b48afc8b2624b975f7a0637a5da4851cba6e5a751b891c46f2e2d818f4dbd516b7e6b46c83e8246d0aff2459703d9376138858c08d86ef6d6f3228d44218eb94244698a0bc448c70c340bfe857d4f27e988fa7467820742d641d5fe2679602bb5a146549e0e3e67fb6726d85834950e5c53dede23e0240ee9e3b26ca6cbd9c74562d77cfcf94b4269bd5cf892698a91c3ae42726ee9e07c69e6e38803f6631fd69c2de4a20c4f214a774a8b99eb737b4e8da5727b9dc0d0915c7eee78b1bfb42b9825b1d2c4c9442c952213d17cef7c181c23487149b5b681d7159ea45450e0f25e71aee4b9b50032f86ffc9f36ed9bd7ce63d688b9d8c1f084639bbc7c5262e9e0bb9eed8f7ddba446ecdca3984cde5d0e6bd1195226ddf47c895a64b44f27ba82218c48eafa271502f0705ff2e6f2cd291479c623b3477d67712c94902cca20f4d6dd7e09b1d252effa7c3800e1739f1fc220b91ff440bcd4500176a509889a104944318fd4bb4805d748b8a5a09656e497b46e4ad5ee6bd9477fc41cca86b66014c4dabbdd2825ec7256082774a6fe9ecef481b98ecb3237adeab1f476efe315fedc0d82356f60cc17f8ec26d9f565b16380f4d93f273c26c22f2a2c25c2b03e6ab418cae19711b2cf47a297f51dadab1dd129b0cbf9883553eb7f3f052a18a010f802c2d4d0fb40d891e4256476799d7e11ba0efda9aad41939a1498cc7db0198b09411d1760388527bf4a972a7a06cdc7d211bf85248cd0b783624e5c836c2cf3e1406d8427001ed79a8663fb9174d20d2a6c7adf02b5a0e1d4f7446252e082a0cb1bc524cef2dd07a9d5ffa7bee2f58d8579add29521a9ddc944532622424725bed49f2a6f047a1c770ea9bcbd8b9bf99e3e7ab09e8289b495780a2eb48ec0c45430942e7778dcdccb1de1411d40ba7de1f29cd3270d63ad58951f58275db500eb7c7781843cbef8360837a200b9dae2ef916de0c7c5c5e4c99bce7c2b0f4ac3491bbbe14c01f9e09717e7813beaf694768b53ff3e10dd2bf72ed87d239d8a7c9be4b0e4cb05e08bcb8d93819e197a462ca20b84ddfc071566f4124668c6c0f3f821fb2fc49d1587b58c87f56d3bf1aefee1868abcf44968cb526b7d572e9524bda19d38b57d55a13e529f457e1e2b2f8141396d01461774e350c1155320997151e870cc57dcea9dba96ae9962b0da0e26f21a55e8feafb8ab6383620d01c2b5564bcbdff7f79cd43034846f6a2b20b3da0717f99d394ed1e89349ca3d08a91e5f9595cb8ede82e07bffa174a1c99bd34887850917f10af5ade7e2bb7b1676b86d80e68492b838d6aab7f3f38f7463f2b944c8c2e8f050f93dd47b1ad02e3d7d3b4bcff207f6607eaac83aac5c5aab88cef53f6cc9c25ebcf8e4dbb0027ee977265e85dad4d35a70af240e1714eafe427ed99e7df48dd99c16e9e9a4ec56b0ef79b829d26590cbcf396bf41e06952a3ed7594837b434f5b90c166508aac0b6ebe8141e177e60caf14fd1acdce80c56cdea4182fca2da0b30ab58cff9b80a73302027f19aed6655fd9a86f236bcf134917ed8d7525c3447aec2d2207cb6c4b6761e885b59fb113824188068c32cdf08e973e0fc623e67fbd5bccecbf1ed00a0012df83dc254ebad178b28601d8f8eab90fcf97ff9d0189f9588fbddc7a1a7ba27f1c20427c61a46bdc2873bc8ef8c546503bdced0742951e3dc2a1755f1b0f042c14d5374d68310f10a87fd66287409129ca260d1e9aa34c0976f8cb5bd8d2daaf2761b36a5d3001bcf5fbe1c9b2b3c2b59013d6249a97f1708eead3eef3958ff9086e58e027aa039887b743eb03e02af6d465935df9605072207b6c595f0d9ad56896f010c8f7014cb9eac8f2187ecbe589010cc6563c2d9799ce3e10b66c546e9ee22e814c80d911ea853de53e83190286a87cf262d96441825ddfa696368214fa6dc5658e2c7aefdfa1644376b467bd295c9f1ac597c3a9e8011f03b02adda1cb0f77705a068d6ca6de5eace04fd4240d7972c777453e4f502f0f8d6f7861748250e448baf04f53ed5192ca782d008ed4159215c1031c37876e15a28988071384783d0983bb111940b9881f9c3b4864d2d220d742f9f1dddcaefc58bb9a27d30142b67fb074df8e9324c7bd3452377b6b761e2ff614c6f00e476fefd5396e6305101926fe8d6d48ce6da776b839ed7e1e6e64ac6bfd4dc597c221bb813c741912ec952a1611285b0a001adc61e51b05715129f9682252cbc8d40228401e5b8da773a3b44b23115d908ed8864b6632e95b676914634f4e779b76c4d920b0ac381bc348f2a7b496b90a4306b53a4ae2b8ddcc99b5fe0a10eeb9dc2081649237d24d52095f388f0baf408eaa1075ec09da6eed829ea2031cf95ab4365c9b73fd3b37305aa3a08964c995fd3da9badb11751d98163778a02abc1a08e1d52a4f315224371a8e582bde2ca33c0515d238927e1ed7712f03724b6280ec30f71fa84a30974a54bc0fd48215b6f062216407db840ed952379fc0a8a8c8a24bb1cad4c6f25d00e0f5a84252c3b9d11c2646de4b17cbf2c1cc6d651d3d479014258da22d75789291c510d28f2289b947309a42a0d8ae0f44a173c4c9eaa09893a271d8d7461a774027c234344c4c230ddaa857e1bf4dcd3ad3735f5b4d3448edf90c062e85055588062916434db91a0032c35b6d031425ea9eba1fbe4b3149591c90b5aa94338f5538dccd2654acfabf47daa81da2909f0988ddd16a61b2d4f6565ca852d94a1332f0d0c87c036ac4a9c867ad26030f216e054c9402a49fa5b406eb658e5f0ae9652c0c4575f0872d6065c0264afe7320ac52c3bac84b7285d0c07bac6eab329fdc8131604afd108707080e8df0375dffbc5dd180a798a327d50fd7e2279521b2899888504b9a33dcdb71f89e61093e5f128b5515f00eba90b8f0123f4edb0a485bc1e754e706b7aadc93d89e72e37df01ddcfe622a9ac8e33a4c30bfb7ebcd14296bff62d931007e62c97690636242af6d9875e260faa1d1aa4de4d906c679281d298ac932818fcdbf1ffef2ab9287cdf8662b6a6870f46c497d2364c0cedc1001f3d3ef7b34843f74a1e573a15d91e00ddbf851b3802f171288e0f2fde77937efcc50c2526c5cce34ade8478b148ef19f9454610c2fa62d8cc3983163be291b748dc4ed563b853fdd82b45d0533f5d5585b8d25f6c08f2ab378b803cb0e7802575fbbfd7ebe91c429db8766bd825f3b8ff98c76cee1a76105e2ff7685f4705499108d920dfe2389c2c65222f4ad435c78fa86ad94bcb34a168328161f74c445c8df82f296c5a6fe90d40c0b58d67dd0a07890eba26e2e3ea159ee0265067cc64a364eaaab228a60a9d4a153327cea5267f0aa7d6767ba2109727c244db2ac2d428e1442c200061d33e714976203a663913cc343b973a81b47c0a6832f5e36810c31f2e5fb9726a2a2c8bc7eb2c052125b5c287cefc7362c646c50427b721781d5fb006d018683ec7cc115ed664284748147adec635fb1d8d7e2f355239cfc55a325865523b44b795d389b21e93698eebc368e175b69a5f5faecfb58b96759b7164f193bbd5d2ecf5abfa2602cc23697cfddc6cca661ec574ca2993393ff985fb918fac4435f8177f1c84b8b51b98ec2c0a3e4c36fb09a181b89d93ff4082c9bdaae020a647728ed02ca1fffd408817e63f6d6f0d588873a25a3b8c84b6b6e9d1890ec888aa75eb293463848db0856e34a92be0183e2eb6b06e9ae045d7b9bf9714649fe70a1a4a0d348dab35962e42989d9c2ae38f92224d020ed5f851a3753b581261da8e2ac9511fe1ec0bfa29d3dfebf7a52cafc86ca47c3d25b89d850b20dba9818b375648562e28f93efbba12cf14b7a4203eb946d497b2db4ac73952e72064a48d6e894a35e5f2a82713b81eee2a2c754bc6ee9fa3ebb180c6bb438b9148c53f40c5076098a89a97be4952690c1f5635671f6917c34fa089850b77eb0a4b323ffe8abe46d9f16feb3fcfd7f40f2ded29ff70a9debe2531f343d0e1af3b0764bf5969d8b9fa03429759c29d22701a66bd246c6ddf5939136ad5eae6fa8775dcfcd28cd4e42ff7c8e05a5cdb1d99577a28a4b37aafc0d3f1553e2d2f3a31ffd3a1179e0b0d4dcc248b3b0ad89e3379aa1e404a85a9d33e4d332b970391c22d72c0c128e8c60103cf9a1ebdeee02843e03db59e1e9b8b007dae8a5f12ba87744bde58a11a1c5fa8e137dae0615b7ba3f2b0edc6697141c4b5e4d2e2c00bdb091907501ff54277e541ddf29897d3b90b45de171a78f54f25d7888bff7d0c5b0e3b061a463a093042a9026cf5112142cb504f9906f35cf99ba6726f366315c01dfbfe99d7ef249132b0c3a687dfaf7da86dff39929ab822328798f52de6d546632bb5b866598868a8cb3bb366fd9da63845e2c893d992201349e422e5c912956f2c21ec96db9a7c27c9829f1c7096dc2685ef66294f47023bddc418f91a211e23b25ad2991bf3cd62a81c4511494fbe06f7cca4c5281e14307e52f9da671e7627de5cc5c089697437bb683dfc9e0dac291d47e18586e0578e1d5365961b44451e282f6a54b928b514ec459c54c96e18f98851ab7e15348e34f47b932ae50078019f5d45f42d36f0b76fa4a8f7bb57952374c8e9ce09020053f97e818e2097212edd14bc23e7a165296c4e7b6939fd0720a865e05029bb7590f213541f05cb8edb197e6532b88741eb78ffa6c1103e7be4565111ac12e5c3d34cf595df0700d2ec64d312dbba5018218cf5a2b3e571c79d89f066c538ce63c1049de02982e7e2589da2eb5276a751aef35a676702a8033d4b491e03edf1a70d9fb16c9808a67474dccabc91981d6a6824f26441118059f1f60c72c0ee2225fcf7acb78229101f02b6b8421c9def1306a9f452e304ccfc0f715de13d48ac05a3684a130da6440838a789e946dbe6c7f44c44ffc7fd7c77b9497229052882ecfd0898168232cb4d796781d1054973dddf04e09577481baf23b5468b95a5416c76f28396411e7aad4cea8046591f664dfaa3af8985727ddcd8e8e4b87308ad0328ca4294e8b94fa41b4c2d0b137f93e4d9fa24a301804f5338ee5661eaea06be44df99db421712a1e6bf81713548807beb5aed4a1d78ad06f5c245564d377be61744d0a6db264741d50560469a055a1b8593fbf80ca2f99f819290043d4a68248d47f02432a6cad46b49b945835b230ad0630bf1fa12f698804cb07fafaac84ef483affffda64d7d23edfee1e35955111d1147682c9be955ffdc21298acab5c5b297e7d8e590db6f7a45e4b574cbbf30287fb72eca1a791319a4fd9b9dd8e3dd180d9ad7bbefcc28ab181d65ee89902c71ddcabe414cbfec469e8c6e7b11a2888d858cab007de7df4cd209354468918cd9196663192dd46b732e31235c603c46b00175bae3f536003a21eba94080cf5598533d633b5ba4aceee3d935aff8c6b960ab1f1f21f490c2b7d886377ef1f63d171f4b595e4001ea94a332c292fd6adc7870803e60a0f8a9d50607a2d35acef61f285ebc72479c4d4f7b73487caebddc99c65072eca60ec01543722e6423b02ebb527fbd4392ab3f3a617c89917813fe0f13de5712f80026acec24f31162b61da0a2781bc2676ef17c0eb9571c8b83b5669f22041134dc6574447832ec580337852fbe60a707747e4d4120050805fec5b36aef8d51729da48518bb27750752e7f7636d582edc45bb7cc45c6875fb80da53cdefcc845c4de6d75f593d59d06657dad71e7190551a471130215458df3b789228ab6530a8ab03af0f807228bb454ad9426e0b9dba26abcde8c2ce080b3c708e702057587db6e3078f1053ada7cb26bf2cad2c3cd54df2045b575b0f7a8925689d0344bb4655937c35fb3cfa8204a704cf7c0c8d74bfe5ba6c9e15ec26e38e46d44ef37da3466b28469a79828a99f08a4b2acb5b53b6ac6eaae47ff32d31f25b94d88aeb042b477c63e0f3bd414dd7dec80c23b22fb7f68cfeee7f2cc8e9d7d2638055aabcc033d7b563111f7fc746990f1f9bcba5a2c02dfa6fda46c53e19b150f6d7811d32d464bd76be286a36025679e47ab8cc83d79e08cfe97058872adc80e9bfd4ecad14cc948125ea34778ee0660f22bd7f6b4cdfc18f61eca9987ee73a1dde815cbd79f3e9e8bdc7ae1a03460c72326690e3ab6d68892e80ef0b28e7d7d1051031bdc8aac92f4f17b8abe7485c0dd9c4543e9ad148d7884d4bfe630f7b15d084f375d3c2246ab48992d8b251eb12af12b0fd75e07bfe05bc483b3d3c521b12206f223b24d0513faf45656fd70c4e40a2d85b06c14e633807463d35440c6e6ff9c90782677f1de6f8099f2e97cf700d04add6f380b772ff656a372f8bfe91bc16b8151fdef80d3482f7752adcc9f82c10f582f261ccc647958b3a1b34226972dde904d9ea698c2faf61adab492e3bb492060e2c2af0102e77de5bbfcc2dd0da70c87046be6e089a1be8ecd532b60d9581fcc9a75a9f97361290d2db5d2e4e5d216e8aae0851d8e3c5914b034206b99acd3627c23cc0e726c3da152529c0d0aeb2516b0375096af1da6e3e6ef8baf4bdc5285bc84ae41c351716d0252f073f149fa1e00bf834d44fb62b55f240c4cc22200144cf1b443e55e65d53af7ca9efc873f6040d98c571e5c010d88e20b85b804afdb1d42dbe07853e9934ff798f0c8f26190d28e5b3c1598ebf63781b49f1b5f5b944ef56ffff52b6565c5b96667ac49cc9536d1e7513024328350033b9a8a102aaaa49e9ecd0d0c142dc42c8faaab741240dddf76b02071c58deb5704324a5febe3709b9a87a3bd388d4376ece76ec4fa996f07618fecbb57e1a55c9cc6e5a63143d323003e935243c49552f83975569a59306521a267d826b1abc22f0db3b5db89a367f69c17053e309758a791a147408705182587226df276e11aeb6979114d6e6ea61bb45f68209215ffdc5a8c9d6fb7e775600e3710f3dd532a195a893a86a9324e7e1f5f2bf5bfe9383d6857a3243cbd1b8f726af46ab93ad06fba88b192ad46a15068027dc42131b0f482d146387b0b261a54664c81d41587a196963b55526d56e7317eff6f9859a9f580330bc37ba95be2bc8eabc45a50fe63929bd8b37f7ed3f4cb072272f50f61a66c2b25d676ecfc200a67b015a7255554d8633ec9a0025e249a4c746167c2a1060cc09d6bd69057cde004e8eafbfc6bd4574992ece5a5f6d03b9eaee48a75c72da57395e169e26041d6ed3b65b9c306254b06b09f394fda392e26d911e2f1ced495a2347e9c68138d96e1d84fb26f7e284626fcf756fbc9a4575305555b099f6832a2193c9eb6b5abb95fab25703852be6ff25ec40bbe0c8bfd118aa38f0e9554e00ba3bc7eef0213060d25b23cd6c32e5ff461d82124b519220b115b6f2f18cd3371cd837ced26b69814f0f09027cf1338dc424e9da44d1ffd5c3e0625bb2b8936d36f9430345af3e119f92994899174a0df8c0e4aefb3dd69119b7b957902caf98b1174df0e3b6e7eaf365178511f0ed1b31157730a389c558dfb71105d985c5ddf6e60588431d8adff58f0b5b6fb92ec73b16a6abafe862001f559c85850cffa583c07f0bb766af7d1a11d91bd1c51d4b2e760703b0868df98c4c79093782d7caef607b330a44e31281a812a80dd1ca1df8232a7eb9c7b12decc2ad8c1273051620fee9ba58de4b2879394a701880f75a372f50f25afaa95c4bd2318007851e1c7b04898446c8e792c9f467f169978fe22b4ff6d7f86573631ebf795e5c1ab8fe85b76022ae4b1ed6a5efc02ecfae8b8c96875a101670ec783394b3388b6bb2e49d93f35570fea9f66cb5aa13bf7c211ad307df3f270a4de667759673c4c0c8c70a740abbbf866d3ce9758c92732e8316cab0fd7b44083adda52db9206455dc03020d62863541165a35cc77dec1ff2f610d35d41e16841d87a4f2cb1a8b0e9f048c2c69649052bc798e91b8f7b1650707ebf7fd0b24509ce0e83c5d622bd0d4427262cd09752c22f3156e400fb256402f06603d1ca839ee8754f408603c21b35dffafa3ef07270f1014352be11744d77e1c365110e52cd516ec3d7258cb23037f35f963bf2eeee1ed77caaa2618444fdc739b0624540ceb791d912d077de3386641f2a1463aee3c73f61457b2d51ff1e18d5256da064a7cb04fd1682a48d26f6dc4be147e682957815d1e1c31ab208f79c254681bd008b01d9bbfd6df63fbd59a03dba903d39cb51dec5a38fd27e740310d70cfd2cd4d0839ef24e27725293f2af1d2b728dcda6fc444e3e35145c4cac1affce73b7b99181881ecbad24e47775d475fbb4869e216782ada651ce95af7ea1820f71baf1956f4cc4a487e33e1b284077e4a30509cd068d13b0aa146532ce8e10feb52e71bf2bf0476d99b634d198a1b85c4a7b8001a39d05ed4413ad53c1fc242e58a834d8d2c2c537ad6ba9d6b7e87373568b42cc3b8df4717812092c6f5ea91dbd72b59c827623bafe3999ca7fec5f1c4af8b66b305c9b138d6d79af07d0c780a27dad35ef50a711fc23a1bb70567a6754f3253090147984215275787afd2bb2c12787942e7dc7ec996f90be2173d3984206a6594899c181464fad9b78b718fdbca1ff0db5bf9720c1fceea2ebd62f0b81d943e2986eb204b6d7c64a0502c9f60458c349a1da820c25ff4341a72fea8f66251ee97f8f5721a4e691465f8f24c8454f7aa05a1f339581ca88fee21f5b27874a662eba05b2a28a8d10d17a1d8b5eb8d62386b74d8e87557137272619fbd3520c47ffb0371b04a88e548edf1e85657e912b658ecacdfc63cf007c2e3636575514ce402ea217756bc74d2f1fd8f57824d7718b7b80a27aa5bd9dd9f6375a28e009794cc8ea671e01e3c76a190f86d0647b941e779da687d1a47cefa9c52e85e4d715107e1c4e42ad65a834b403245dee643c2f7b0c355bc2aabc3e5502f6c3395899df540ff194bb0f614441b1104776e549634f217912aaf56fe539cf52436be520e49c6413af7be5f2bc567ce0b0030888491aaadcf5048e4be5534318b63ca18d24ae22ea8b84c534bb16b5e89be9a97df5f26bf9c196cbda125380ace6283f5ca1138096adc4cbfabef87ec0a214e489765302f5ba8d22d175f4c44a60f071c4a4cd70c72df3d3b679b80e8adb29f506a352b95f4a047cade72c49c8cf57f7256fc4bd2a80a76ce25bb2f69c56ef539a6fbfa5771f5b524d7c9668b9bdcf36b42f4972262f9620fd16623dcd7a01163972135544e28c7d7b3ba773eb4fc19a9f356147e87ceef0fae8239cd9af066e786b7e36f207bac0c99ca40c3fa8d174506bde6daada87881bab469fba3f374ce4d28a88b93c40275b4313f58a042bbd3661d67562b97fa0de72ddd9d3489b02508854e4496caffce26df866a25ec7e13e2402bb690d973ba0b0ace987a979de8e3c2b897018962203ffbe2cec697960adac97aa6d5789062eee3d39cba18c42c1aa6af4f22b20f1dddc734f611324debe43d44d2c349e45f16323ef62133aec203d3f3315f98377002665086077e31e210b49ac5a263cc58e55dffe61dcb46fde9b3254309d314e9aa8cdb7a578c46a797521760d51a565ca0d45d6dced98e7d215d1373d135088f434f9732b3a606548b4bbd6356c3cd6aa3d7bd785e3983016a4d81ad153813d24010ba8672d8060f538b759ec30bd1cad9e82fdd7da0a8b381603e9325978c0a466d1aadb59a29d3c71b1bcd1a9b3b0bedb29c3364e0e8ef26b85484fa43f6a37a3215fe6e3c12207cc8bb9c94b96e92b260e33e91cf90f21fb31083632b316424b7b19f2f5213fbca06f53b5091c3173b5fc94c1045e2e73f57ead0fcdb4458a35fdce2c0575225955d2f5939981731d22b33cff03fe767a013da0b22388ccf168a134b3a353513b7c2a6c4b529761a2838fddf68dfbd0a1abe473eace950cac266671f7857955fb84121e0a505a51f024bc94007a21354cdb48e884a4960c1ad204b6b55eaf941fc57fbfed7aa8af71fa142e9fb1746deacdaf0ef81a13e51d98525673b977ad737ad4fba87b7c3af16be2ca81a6b0b73040259380e99939bbf1074c47adf2990204d39101cf9449a7c29f4e21c583b7c40eca3aa0d3cb7e9f5566cb2114a70630df071375d7966eb0b79483698a170b21881c775ba624b80b668f70d714a6d87a0a051f7679852db65fb78ea5df2b5787cec29244eaaf1528b08d65169d6b9699a5598e76d9eb0390863c9ff2b96ea6991c7448c66a651474086a04d9f28b7a72e8bfb35a7eb575c1b9771d21863eaee37c14975c8826ab99b6d4d8a11ea511b60740dddcc6bd8a49b252814ad7512375cd966aed0ba3478a7ae1b3b3ffb0ca843f05160354c7c2afd4ac2ffd164f9b80c60ef761af30a2f379582d4cc9f94bd2df255983378295d436d0eb2bf3739f38eaa1577f9061662825c51cc09bf576b71ba4975b9a4a66ea37205ecb930f83327238518757ab2dfc9d25b63be8abf4d67657d5d98f9bdd7799183f9679443873a1a99160e5f1f66d2257c90baa19505fa70cec3335943bcb3dcca3028f9b34aef83f5e4355fef3790df44b4763aa7ddb5cbba7c04b08edf545e38316663b838302d412cbafb0fa14d633a3dabf53ffbcebf4f08844d5d8c333bff147af758fe9ceab7cfaeccf1fbe95cb6d96465a0bf8d6aa80cb96992fc7545f0b1098c426ddb2fed5ac2975ec6045e44b4025bc9d6c8a4a861758b92f30e5fb57f00dbe89dc7a5c6e0cd4b18ad48df4b359c814d1d7b9aa1b46cec8731ee5b519059934190fa2f7251db9d013dc3318c20aefbb428c6945360d32a598265e95d4512377c38d985bcd1b1ed0dc6a4e82173218eed37e922bfbbf00d9d5eea08abc367903b57fda42539fe2b6abca9670b23e3ce2866d7a0f0bd916551b93a0ab8c96b9a3cbe87a17fe600d691a9bd3e2d587efaedc2820060461a8b2dc3a1a178f0f7056503991b02e3e3ca5d98063d203dcc507faf5d902789acd973464bcf39e57907253c5cf18325d33a1e4b7b52c566aad61b2dd133368b1d892e904d012653fcc3bb7f8217b6cb912271a904764cc049f66a7ca75076ad6e88d7069ed7afd58e74fab8afc8eb34ada73e99d1f6657064e1396d91d7aa190e06502631f738a095baa076ba395dc989f9134b9b2cf562b344e1af1de8990c117e5423a93fbf2c6e18220fd5af039b5c40f87c05b969290d582e602e98abd58ee80e152f74c3094378722c31453e60a9167b2a6c10beba701d623d3f83fa4e77de477ee8dff968977c281f7df560e7d0cabc8ce1df034667d86b8613e8dc26268726ed726618f84e95aa27717d0a15f1c1aa21e7f7a19622df62fe68c8f539ccd858288250c23695bac0d7c97e4f4994cf2aa929edc0b13315f047ad463709dd2679023d79b06ae0deded9888c0a2a56389086c44ced7872fef9d7b6032f79be609d5009f94c89f35a31497d781aceacf77de80108cd70b72cdd70a0a96e03cb48bf429d7b8605e0cbb5e4af9ca117c509bd366ed7c6fe1244571acb410bc6f8d176426abcc73de789285187e0522a17a80aee5a7ec1f0e3ab1f7fde3e66e014b42f28e6590a56fb4d6162aa9e395ec4cf2cf54b4fa779674edc7ea49d6e837a783ea8488ff03f5d603490d1558393bcdfdfca159ea1c207885f2fa5fda4f16587238b18c45e2d83dfaa028ca2d67f0b7acb1c9935fc2301f7f4ba9bcbc06b9af3a326f611e1e9e6d93c93c11758c8092681d371bd85f25f00dcc46c1015d15d0911fa9f4b4db06e604e070bc64fb6169caf17a4844e39d3ca4ccd0efa930f91617d14bc64b2c915ab7d158bfd1a3edf99562af377bb50f371b38c6feac8424e8a034d1471d92a188478a7e41ef947052a0f2c1685a5ec2b1a66c08e5eb9d163d8e7201400a98a0ffd38ba2c917f07bb114ee0250eb2524f09abbcde8d7855bfcf44cf6430236bcb265571f1455e03c29909c9faf61bbc181120b72574627262e70792cc8149c015b475bfb19a6865aa98127ad20ce29306d624b5f1f9bf26ded991f6659a40f2f5d17b46514efb11f90afa868b03bf498392453f2e2bce86727f5eb77124e05ca41704640d5429f1d4aa3ef19661a8ad650e34f177ece60c059080d4d8149c39ab686569ce2aaff7943d992730a830f7584578fdbd3ebc98401a137e6cdeefe363838b3a2a56ea2ca66bdff94a20ef39affb210329181b356beb70545520cd5d9b4b6fcbb2407f97252acea3ed87f4218266291b9238c2a4eeda12f7ae2ef634e104c769d998216ca7392c91a65f7559e0108a636fbdc33a8eab7b545e4ff3da4a6f32fdb804f5c4c431ba0ed780d5214bc68399232a83774582743c696b89cc0ebd110ee1cb72fbf85991e0c2bd055801ae4d9484ec3c94ccf8c3f85190e64826fe955b55e4b04efe3e4cf406c0bea84c992a18af6d3640e88ab34ec92e69f4b51b7a715d2212dd768a019690f655d68d19a0805a7a53939124ee6f5b5e48b7de6bc3f9098fdb5facab6f973b5a1477c397aefe691c2099efb4fbdfbe99509f43c2f3f8452dfe1f63df92e7a0dbeecad2f2ee6012ccf33a627b33c7e2b70aae4bb7bef47dc6935ca79b085fb3094773b2367eb3b0e8d95c5a8c987fbc72d15170a3f966cd6308729a4a6e032033c781680641a0accab1e2682f7e0c19bbc3831d1b97efa0fba00b8bb99ece27370f16a6b4bd3926d4f98017d8b7a23584b34964dcc7602b368d82d2555a346b96677addc77573bed662d7862b576e7334a6223b6f36e141d06bf658bb5e47f405760322b46d37f63955bea7555f6065ac17a580d2eda371309d48759aa462bfd4067aac6730ea6391a9bdb0aaf00d7a5311c5e52a32259dc49466b2e5945f063ba34388c1b15b6900e8c1d8d6c90bb3b4e64e596024919bd4b331eb98fdf08e22b31dd59f9a791ef24c276fe1561a07f89666bee2ebc9916e94475150f9bc3e240db6a803f1ae34ad8efa474b9ffc8178a68e0ab05192f2b7a73389d47088c4a450b85838997a1404afec5cfcf9ad604a49203d1581048d1d8fa1d55a74c0da87171a6e1ed2f0f9f112460a7117a6aa267f4015f3406ff9cc475197d879e0301de7b2abe50b0cbf6cf55d3548f6104705be4b5216784db2effcd539a7956498ba4a2bcde46eaf08cc8baa5316d993b54599bd3b79201880e233c1473b196abc3d15da0b9cf5e51a82052bbf09af7c0e02290ebc360b63e713102ace0446810e80936f234af849dd6d5783cceaffbcc7e493d695c943787b51ff33a7d9ccbd2008ba86035673c8e8670d543ff3b2ba40387de9d7bc0419ebfa88e34058fdf39cf650c8a291446da83f976ee9bfbbe48385601dd0bcb5f2d85834fabe0fc0957338b04576ddd9d1c2fb8e65a36968d7c0e80d797b096603ab4436c3e980553c94808b4dc74e2e66afe93786afa9f2b7e521fae7730084b6ab8777fbfe6b7ba34a0504806f44ce87d02b9abe856a24baac924e6b1e9b0e4f666dfa8aee90d07135503bf628a3a8578b702673f98a8a81cd7833ccff398d692363c82a845516efd2ae4b9a74b72dd0ee69950113c59e61b31203d618882d73a7eba59f932a7b2aadcc971b743a65daed8b0c8d61d146358220844e4eb32302fe5ea871259374c57bb0f62195918a954ea74519530a6e960f38cfc57fe7dc575dc33697fef0ae3173bf23f359dab53fb25741ad295f2ced8924fb1902894e94e195920ea5596e49e05b3783abc3b946faae16c8ba8b3f9b1aa7aeebade70a9fd0b52ead76f176f355d7de239f77e63b038526144e1b49f6299c89fa3e18db1b3b0fbcccc40d0028c043e9783524c4b85fc6338fae6973f5293a55d9c118339777be91bfaa3932eae0f8d7525109a19bab187ca814a484ffce65f413a8ea22ea627f6ecc03a149f9254d45f9d5956e2083493e6f8aa874aeff7c6429d1a18335175c294377694438d3037b96e4aab9454f7dffef76b5813d31a5f377dddcc01e1ec860b88b5b67be6abb889d82da155739dd4860339d33e7ed7d2aa309646bef3390f43f8e1b8ee75468f9c89c8b798febe1acdd493858c3121e9d1e0c4887d9eccc200b7b6492656fd6e22786b6adbf49a0e11456da10afb1d3e896d10ff2c637c0add4e44b9d0156f599b4495ead0c91574cba37c422e5b67d3857e9b035c232ffe1173a387544f1d3735193e00d52bcd0a08402691955c0ec3576209bdb30d4b3dab09d2cf1731e9f36820ffafe6f1e958239fe606a4adde758c5a2fabd59f2a143aa9ff8e5f9b4b8e06eff7750c4d3b2e9f785f332ee74db963c0aad8565fb8f43852a2bba1c04c401f6ab2cbd33beef28da3d399ee4ef17bc8ec2edfb5a6d666e70a6038b6c92c3501c901b1e56510d9059d2f94b7c3e098f9237f62839dcea1dfd1df8daa3919321cdf69efa80b3c2c1b106dbf0bd644323911b0ecfacada1cb3ced99dc03a21781699af040c49cd45dd6292840951e0171922275a557720613e73638a7f0867090293a965081048cb13d17b76f5136ce638c70646157ee7e447a33ca6019d0d778f773ac2d14df176dd1f497cb0e8b7a97e4f71da1874db722b19dec913732aebac806c797798cbe1feec74a86c2f538e8125407db0b2e6edfd2f1b02d05c43e508641338204e633f278a92d1e4baa33db9b892d0c42e509ffba299949cfeb39d47220e65c0b47505d2639c92fa91afaaa31a11bc5d31db74782e1595ceed4b699e259df053642cb27feae1a5a6883c54ca9b5efbe8b802f94a14343ef10a1040649e29b9b886475942b32c57f68e7434d8756641d3d5b101dd36e09483e93bfcb4f25fc7c515779489b8c0a000a9980f21a50dd14c9b2c5d8c396dbde7a69d6d20e95f114996bbab845ac2944f9a81fc5ac476cbccda30e85acfc5c04b84f566b47dac340206744e800a7f4f54c4a7ff3b2f9af933d57ce277b334ad22f686d5603632bb7e2f08a8258ae75eff36b0d97f3d3613ff39f8730936513b8cd07542da0763942b20e66cc32fbf91600cdf92e7fc5255a6adbc1a3bfb6707d19a4c9f61261ce12387ec59d44ea032d10a282f038aa4907eb6fe8f317a89ae74ea6c1489dc3afa1d7d770e1d57d3db0a154ae981469129646f31821e1dd4cdd32d9bbb53044a9a84a52a97cccd41ac38d56075472104c6041a0776fcb067037f3a9117a7ad4c0e08210a35540aab1fe1c3d27535b8d0453ecbc2467a67d9b70b1a8006b7968a776532b04e6f688082651ad296d0b302c7908fdefe09320a67be5775025929120a509dc7dec726c8a0e82aa664a40972ade66cef98ada9cd14c77a11ff055d136c7fe89d3df498973dd5464586c80eb0e53e0e48370eef6faef20dcc95ae3b449920005194bc928290b0bacfc49e12a676f1f23c4cc1bc33dc6cbd86358fa9a30aa89eb2483c3cd6b83cca79891d0160de91d4ce57d5904007ef581d439586c80bbf1ae709f57f55db82553ae0bc18e6d47c2fcae7afd536b90ff52675d0133120dd85612fd7555cbc558343ea08806b1bcf3b7787f2c613080c4e2841489bfb180deb1b60cbc8119699b036dc0f1194c1a4070e8b91d30b7c47ec61e0bb6da86eb29c3ec1ad236aa1232a6c9abd2a1cc47c82b75c9f54b2b8956e9ba3aa11f82c98c1465d2108d0ceb71f527047a1a8160b84aa5fd28eb6f4f477964c3361cc1a20f5f9d0b66b5a8ced1f1fa37f868c513e6da1abe9fff7fe66434276703f6cc0612af0bf5f60f248735019c3140f05281e269d7f002ea6928ec0e8c18eb725b5351134a9ae9f7a6b067b2308a48145576b9019586725c23a80cbc830800c9ad1b9232f6ca0358eaeb361ffff7846fd261068ad6baed747b3dc550b416835fe3ce67ddfc698ef683804c227cb2302f6d82e85c5512f88539404f613a0ff0d438354ef7e52a28a36b98f66a805dd74484d6f3f73f0dc28edf76f3a7430a6130315154cf2550d953ca377bd83fc5df978058357fc6b714a52bf116c630b485916cfecc2b9bbf1b5ab4ccf26da8d1fa2a115ce51e09ae1c07596027f971273d977d42a8bce76daa6649e31da51709cb1cc5bdf9f7a8d25904f8f384531cd881e57b93cfee106e48f53946be9de00526872b46a40ec0abe3a6992b4f52c12643dcf8c0f4d4185eddad2f9d257eed1f49c18340871ff32de637892c5fa825e1227edad6f21dc5f808e08ffb44ac4e275f100925456630effb7e03f091cc7860c9698abd34b56171541edb31bb515a34b84a8d89ea0fbfbe7b2b8c88ddc963f8fa39da45aa99f3aa5693210f20cd848808dcbced3f730f0336b338456233bf5ec5b21df1a2a09f2379a8595ea637fcba01c7f6b765e330554e1966ab7219d004e855df754f5f0f1df247b8e9be7a1aae56a3fea12b3c4f376625b3c1bd50acf0da503314c38bf2c6cef380265fb62879c94d97a552f24fa431ca2a44f6c9c9c4baa2ad1169d3e95c75b29ef3c2922609cd4e08d7f38c3f996f79ce3353a6b79291b3490983a6b54126935b683f1e85e384909f2611f7f127149251b84c741700dc09372ee75bd35cabe2f4d78613d190d84b950159e0136fde672b03a1a3819679202df50d2e72a780e18bd1941bdd9d5284e0f3ad5ed2bfb8fabe287ca2f17267ca7a91cd73f15d2f7b4b9e40a0642c9c03adf2b2d276a2fd0e17991e6f9de0f7258e2a47c69f2544cb02aa8248f320f5967fc5a27cfdd3e1ab7887f2cac10640e1c872d29d01118aa37ceff8b9c7ce4522338891f168bf5c0b5322e003c57d679d9b5f4328f69a05c8fae75e1c7d893a96d759285341473fda21d0e33df6e7e01fd7f8b8fee4b6a3f168bb18e97175f19dbcf56a70bd985612d8e545b6c006c80202e53a1a2742bec72b68c03b36e7a08e9fff36973cb7888cbddc139d3bcff7f9bfb24fabf5de213c293790a9f878e43df13a17dc5828188f51b750bb7373cb932d85da51f8b23b37258e1c2fdb2a823986fcd4149e0d90b8a81b8fd59029b28d27e207e0cf2d4597c1ad425ccc655809a5e6bb1d6345509ed6c8af83685cd76b20de12c3a8dd23f6fb30263553f86d481f91f3c1d43b596ddf7eda69f5897a8ce6b2d080a9380bbb5af7eb3285fcb23d28eafb7648fb2065da3e52c8dbd0fd2bb195e87c2ebeaf72183e521347c2d69ce72ca4bef390868bec18586fd0d77282a92d7ac9f75b3bf58944485a236632f7d22b93984eae51fcff4f452829ea085fcc3fed18399f67240a8028fc578f8fc99b3e896fb845dd593a493e9706a174d89c0136e51df4e04b5a04c4cfca4130a830264fc3f3b7519bb81ccebccccf3a50a666006b264db55c68efd0a03e3c821b4e0aceed5eaea23a70d14956dabb9596674f2caba60f70e50d2733d8c1da23c7c6508eb6e16058377a07abb5056220bc98597969e33ce10d12cbc07cbea15f0195849a22629163755f829fad8227edc54c0a10039680330e490803ad441b8195afdd1ee7f9915f0b6daf48e8d88f46697ea697857a209d8b2c36a8dd89537b9454f23cef2d20258c08cb519dcf557d163a938db68e7058b6c6251380e69da1e751640fa32c12351aa0fd67b7662a65a3ce96f18b417bd6730a57bedc6c020fb2d9f39b2476afca83e7ac3eef594bdbc842b12f2838effa939b2952371af51144b1fd836bb63594501869dccd34f516f26f5251a3b05172eab489da8b4102b69276cc72c4a35502bdf92ad5d857616cf4dc9f919af32c2885aa928b9a8f432316f80101611772def843dd4be19d7bdaf083599b2a9a792bda771f4f4f646d9504fd3c29f8564c616e8820c48bb41898fa309168dde2ca94a0d45c84f950e632cd658c04fde9fb4b8c5ad242713137a21ece27c0fe739c197268e6a6528a158ae88a7eafc34f8ae4fe0f7cd04ec2e33dfe7b042a965e0f05fe2e3ac30f9f33698912aff56edf5756ec081b01b2816cdf34169b6064e69486e87fa0cdc7ecf330a65334fc7d7f7bbf08164466d956b0cc62cfe798fb4d6bd3bc4a429d5eb1d196177aa2ae5f31ae21dd3e7cc524da63a556858c0ccf6b3e0616be091f585b318f4f0c2a8622d0d9684dda67c3d28808495e8efd62b1f0fdae157e961c6c5bee6ee63b90cc61f612088800418609c3b197b7409d7bcd8a53369b4a9bc962548ec50fd3b752c88c6ae41785545617b49da4052fe9ed173899f98271e065ea8cf4d70400128a08c99e153a78efd9a24075b531e71ad876854bb22c3108229a55704627927535b43cdf4a438f046fe1785811347acc2004a91e9c60aa87ed660228f145f29e65e0f774d674a6869262aa14ade1588c4be8f198bf8e7df619b0e4331a5931a2e8b1246bde1938685266c8d6c4913cd5c6d5a278587c789176dde4bcd4390246123c8eaf7230b954f15d7b3ad89df310271a52276afe7a875509432a7658e6b96206d93e5b28056df1f10c9c4a35f40c1131f30290e7798e61d197ca0ea29d9edfa23bd269cc68b022a0236e2bf6d49f288641edd012ba7bb40c130ed612154f0ff101d43a924d06f9199f55b9dbf5a834d251957537db3d7d817be1de33bff93a56d72c9b3fb6f8a9050ec425bcd7666dc4677e954295c61d47743991acee7e796bd682080daa5fa12e314287337674ea0c0394b1e3660d8a3aec378fc8e2e1a159bab309bc2e3dc4a32744c9bb7672d2cc8f193059797683c8614abd3f9f8be9d255fba4cb3fbcd5023a3ab1118590b6b93c65d2440fee25409e92a246622edac62103c7bfaaf22feff70e956d64528b7c4f91e84197524a77807e68bd0a3933a96b488f8f02e5220b6577dc672b9a8b7d6ddf90ff6b585bef46708062b14438a4f3e950239e533a6313fa39afd4952307c996e359629da872755c30fc16b39a6a94cfd862ca86fe13b979b0ac6735ece74be12072ac15941fe6b0337f0ccc2e57c38a764390141847b855015c8b02bfd97fe79ba4a90a58d5ee2a17a734772ce4131d9323b4d5ce1d8df2c339489d7f862320c62357ff37c1b09f627f6f116599b51905402812a45651aad8e420bfc1ca5c31d9046a48bde485f2d326f1c775904afa48790dbc0ad56e1062fdaf4c88dd82645ff648baa453deadbcc18be9f94a8539650df746d13a85db47d45c8268a7c1ccc7c3a4245fa8eebdfdc0b172dc360201002afa077fa07fa5543960a82f81d81417f8d7c3070c3bb5dab0128a47838f2c43ac7ea4bc75b73afbab9fa42ee0deb10b93aaea0059bc38468e3e2b511833e5ebb0062645048c6106044866ed52d331a21fd90e9d2918d1e2b9e60110c6d1dfed8cab1a7e913ac3c4bd681493d398a0fc64108f7971c30184b5b202e69750f1d53140c0809a974341550e5faef1392a266c18333a19e48eafc6252138c7bf610aa440efee6ada47e619a1be9b9e89dbef8df1aab0446daa2e7f3ac9ceeed93886be8b63f56295bd43bde11be741238fb5754ef749df2962088c089adcb47612f1cf5a868e4c0a0c2437ecb5759da41989899951f96261d31343dc131de60243f48384e06faa87baac8da66ac6323a104f3c1b9013f79d9712befaf860c639739de3ab7f6f1376dd99cb7f6c8aa42fb0d0f2dc586b708bf2b8af0e681350663125e913f7c8f2cf03d566acc35f09bf46680fbb699bdbc06d2af725cebcca87caba9553d5fde4248360dde795a78dad54241cce04425902deab8aa6de34fea7ec003a8b9e94a1c82eb83ff19cf2ae9a5ddf59d6f5e0e96ade83eb8a07072fe4b497b26c09843f98a89d10719a4899c886240f395a527055b3b6a8f208bba4cf495dd8b04c5c4f684331929d638400cb8b4927368e7a2365753cdd5f206545a022cb412ae27176214efaaecc0578b9dc9b87610aea8dbe799a94c6ea88bf5ab3945534addd3f63d76856a0360a1eb505abb4be88ef6b571e8a692453f7b3c6e6051d5cc27bf7715af743dd6b6067ec7fb3e13219833198286ea8315faa6f367a606d8148972617d044f9af75f9f62e7db95fcf329273a8d3a328047cf1d25686cf6a696f5127ec71cdc7d5e1ecb212d8fa94f38a7c84d5cb5730f0a4ff8f70b4f41996092cff2ddd991ab30e22ba1ac0144ca776facd476ca07cb50d9289a234e9faf84926e322d271368682f3a0d403c7c80a04c48788742fd29c567806640b7f1bd8d1dd961d92edd846aead2d9f4ad6c6363b35ed5e7f872c32194fa6ff03d3696f2bf78f055e4019146b144ed1ad63be7c3022dec556cd8d2f3a0bbfe725ae304de8affffa097e7f8e2a91bbe59eb6cdeaa4246cff640dcf9824768418535effe74534331242e689734fc393ff38a8f3e88b450112ef26eb58df6d45d4c677aed1e7cfe1e5a681bb5f72aeace6b762cc72408cb004ec049c1cf4a31701068a1c7058cd2f0e98df911627bd791a85817cc503906256240fe4f830ebcc290ce216dfe5b6331d3cc612098e39b821e314b37858a40d1268f31f23bdb75ea64a5bfe3cbbd9284ea4caa57bc27ed3501e2419aa407e5f7b7a5dc7c64566f4abeaffb54d094357eaab85314c953a520eede2f4bbf2784b3cee19c5420e2d5a6a8b86c313605f16731ab67db8c8310290332d36e5db455da9a7c72de8a95c3794eb85614ba70eb39cddf29dc8971f253c73b14c073bda91d88f8acf246aaedbec7e3baa71bd7dbb6a9e2e610340374fd4f9a0e9ca8f3326126e07545f7ec6e32826f96837657dddbed096f2e9b488fe98165f70d23d3e8602ffdad9480a7dcec031ef6b62061c3121f284b609fa8c8f06c7a4a53324338e65db9af2a4607d2e2977ab4ef41ff93304539c9c0aa831dbbac328a5484a08366000000000037b10700000000002a7315c8ddfc25dc2266a6b221cb8f9fdf641970ab1f65a2754df4e14c432b9c446c604131913bed45976c4a8ea27df843a72d622f80ef15da622f0d56ec1ffe3021190177b0405c4fa1a0311a493c4dd095f24d386be6a03f5838a6b1008665f4000000f5c98fc152bf40e1ce216c8839b8ddd42ea5b355f0b5c700fc9b2cb7c802e1c8336488033fe5f3ef4ccc12af07b9370b92e553e35ecb4a337a1b1c0e4afe1e0edb56114e00fdd4c1f85c892bf35ac9a89289aaecb1ebd0a96cde606a748b5d71a533e05d648cb9635382f38b778dc3c76b18e4eab2d017fdb24c1c0e32d2991707a45ce3f26e443dafa697a76bf24122c9b19b57eebe798668dbd1a0da7c900795222290dd7278aa3ddd389cc1e1d165cc4bafe5c658153cdef5850f97c4d4fb6706b82310414a00fe7dc34b3043e0c7a8a24e810e3cec9de3e1dd7ce06bc191efd2273a357da4436fc4bf82069f6cb87d3d605aeda1336ac513f358b4296b8da51232896ad271063d93404eaa6b80960fa2d4b41d74a544eef94731f0b83ba2701e33b49e3191098c3369bc4658d82f536cb9d38285c51c7844292ced06dd2e8148f0bcd585dc1104e64aa930045e83d828ab436a0e587637e5ef83044d1c2918da284d7072847132885d443640979907485847368e32501345b0dc24c904c06732cc17d944b26181b0c05c6461bccbe4f7b2180a282b6871aa6472fa36cdc49ec50cf69d3eee4b26fe02bf48f39efb549d3963d19e4112c7250c580543516204ff1b0675680cfea02ac09f0b23d6e28c14b08421b3a10a9788442457d732b120c5c466c54ad938dedd3cd3701d9b32fa15dc8db3d6b1ea5d8495732477a72b34efcaf8c349aa40d8e1f21f226ca11182cff00921930b010000000080c3c901000000009104e90000000000d75b9464000000003802000076ab1c8604000000000000000000000000000000000000000000000000000000844f7a7e7585362114fc88a70654146215ab4eaad65ad54b64975840b78d365e8b75e78616a92294e747589c3ee4a845c2962e1cf6cd7fe8bfbd09439e5e6d5e4d4efdf181473803e734d97891388e1b50628658ac818599cf2cb069c8e6b38b6265617665726275696c642e6f7267"; diff --git a/simulators/portal/beacon/src/suites/mesh.rs b/simulators/portal/beacon/src/suites/mesh.rs new file mode 100644 index 0000000000..3e8811f2a6 --- /dev/null +++ b/simulators/portal/beacon/src/suites/mesh.rs @@ -0,0 +1,215 @@ +use crate::suites::constants::BEACON_STRING; +use crate::suites::constants::CONSTANT_CONTENT_KEY; +use crate::suites::constants::CONSTANT_CONTENT_VALUE; +use crate::suites::constants::HIVE_PORTAL_NETWORKS_SELECTED; +use crate::suites::constants::PRIVATE_KEY_ENVIRONMENT_VARIABLE; +use crate::suites::constants::TRIN_BRIDGE_CLIENT_TYPE; +use ethportal_api::jsonrpsee::core::__reexports::serde_json; +use ethportal_api::types::beacon::ContentInfo; +use ethportal_api::types::distance::{Metric, XorMetric}; +use ethportal_api::{ + BeaconContentKey, BeaconContentValue, BeaconNetworkApiClient, Discv5ApiClient, +}; +use hivesim::types::ClientDefinition; +use hivesim::{dyn_async, Client, NClientTestSpec, Test}; +use itertools::Itertools; +use serde_json::json; +use std::collections::HashMap; + +dyn_async! { + pub async fn test_portal_scenarios<'a> (test: &'a mut Test, _client: Option) { + // Get all available portal clients + let clients = test.sim.client_types().await; + // todo: remove this once we implement role in hivesim-rs + let clients: Vec = clients.into_iter().filter(|client| client.name != *TRIN_BRIDGE_CLIENT_TYPE).collect(); + + let private_key_1 = "fc34e57cc83ed45aae140152fd84e2c21d1f4d46e19452e13acc7ee90daa5bac".to_string(); + let private_key_2 = "e5add57dc4c9ef382509e61ce106ec86f60eb73bbfe326b00f54bf8e1819ba11".to_string(); + + // Iterate over all possible pairings of clients and run the tests (including self-pairings) + for ((client_a, client_b), client_c) in clients.iter().cartesian_product(clients.iter()).cartesian_product(clients.iter()) { + test.run( + NClientTestSpec { + name: format!("FIND_CONTENT content stored 2 nodes away stored in client C (Client B closer to content then C). A:{} --> B:{} --> C:{}", client_a.name, client_b.name, client_c.name), + description: "".to_string(), + always_run: false, + run: test_find_content_two_jumps, + environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), BEACON_STRING.to_string())])), Some(HashMap::from([(PRIVATE_KEY_ENVIRONMENT_VARIABLE.to_string(), private_key_2.clone()), (HIVE_PORTAL_NETWORKS_SELECTED.to_string(), BEACON_STRING.to_string())])), Some(HashMap::from([(PRIVATE_KEY_ENVIRONMENT_VARIABLE.to_string(), private_key_1.clone()), (HIVE_PORTAL_NETWORKS_SELECTED.to_string(), BEACON_STRING.to_string())]))]), + test_data: None, + clients: vec![client_a.clone(), client_b.clone(), client_c.clone()], + } + ).await; + + // Remove this after the clients are stable across two jumps test + test.run( + NClientTestSpec { + name: format!("FIND_CONTENT content stored 2 nodes away stored in client C (Client C closer to content then B). A:{} --> B:{} --> C:{}", client_a.name, client_b.name, client_c.name), + description: "".to_string(), + always_run: false, + run: test_find_content_two_jumps, + environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), BEACON_STRING.to_string())])), Some(HashMap::from([(PRIVATE_KEY_ENVIRONMENT_VARIABLE.to_string(), private_key_1.clone()), (HIVE_PORTAL_NETWORKS_SELECTED.to_string(), BEACON_STRING.to_string())])), Some(HashMap::from([(PRIVATE_KEY_ENVIRONMENT_VARIABLE.to_string(), private_key_2.clone()), (HIVE_PORTAL_NETWORKS_SELECTED.to_string(), BEACON_STRING.to_string())]))]), + test_data: None, + clients: vec![client_a.clone(), client_b.clone(), client_c.clone()], + } + ).await; + + // Test find nodes distance of client a + test.run(NClientTestSpec { + name: format!("FIND_NODES distance of client C {} --> {} --> {}", client_a.name, client_b.name, client_c.name), + description: "find nodes: distance of client A expect seeded enr returned".to_string(), + always_run: false, + run: test_find_nodes_distance_of_client_c, + environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), BEACON_STRING.to_string())])), Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), BEACON_STRING.to_string())])), Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), BEACON_STRING.to_string())]))]), + test_data: None, + clients: vec![client_a.clone(), client_b.clone(), client_c.clone()], + } + ).await; + } + } +} + +dyn_async! { + async fn test_find_content_two_jumps<'a> (clients: Vec, _: Option>) { + let (client_a, client_b, client_c) = match clients.iter().collect_tuple() { + Some((client_a, client_b, client_c)) => (client_a, client_b, client_c), + None => { + panic!("Unable to get expected amount of clients from NClientTestSpec"); + } + }; + + let content_key: BeaconContentKey = serde_json::from_value(json!(CONSTANT_CONTENT_KEY)).unwrap(); + let content_value: BeaconContentValue = serde_json::from_value(json!(CONSTANT_CONTENT_VALUE)).unwrap(); + + // get enr for b and c to seed for the jumps + let client_b_enr = match client_b.rpc.node_info().await { + Ok(node_info) => node_info.enr, + Err(err) => { + panic!("Error getting node info: {err:?}"); + } + }; + + let client_c_enr = match client_c.rpc.node_info().await { + Ok(node_info) => node_info.enr, + Err(err) => { + panic!("Error getting node info: {err:?}"); + } + }; + + // seed client_c_enr into routing table of client_b + match BeaconNetworkApiClient::add_enr(&client_b.rpc, client_c_enr.clone()).await { + Ok(response) => match response { + true => (), + false => panic!("AddEnr expected to get true and instead got false") + }, + Err(err) => panic!("{}", &err.to_string()), + } + + // send a ping from client B to C to connect the clients + if let Err(err) = client_b.rpc.ping(client_c_enr.clone()).await { + panic!("Unable to receive pong info: {err:?}"); + } + + // seed the data into client_c + match client_c.rpc.store(content_key.clone(), content_value.clone()).await { + Ok(result) => if !result { + panic!("Unable to store header with proof for find content immediate return test"); + }, + Err(err) => { + panic!("Error storing header with proof for find content immediate return test: {err:?}"); + } + } + + let enrs = match client_a.rpc.find_content(client_b_enr.clone(), content_key.clone()).await { + Ok(result) => { + match result { + ContentInfo::Enrs{ enrs } => { + enrs + }, + other => { + panic!("Error: (Enrs) Unexpected FINDCONTENT response not: {other:?}"); + } + } + }, + Err(err) => { + panic!("Error: (Enrs) Unable to get response from FINDCONTENT request: {err:?}"); + } + }; + + if enrs.len() != 1 { + panic!("Known node is closer to content, Enrs returned should be 0 instead got: length {}", enrs.len()); + } + + match client_a.rpc.find_content(enrs[0].clone(), content_key.clone()).await { + Ok(result) => { + match result { + ContentInfo::Content{ content, utp_transfer } => { + if content != content_value { + panic!("Error: Unexpected FINDCONTENT response: didn't return expected header with proof value"); + } + + if !utp_transfer { + panic!("Error: Unexpected FINDCONTENT response: utp_transfer was supposed to be true"); + } + }, + other => { + panic!("Error: Unexpected FINDCONTENT response: {other:?}"); + } + } + }, + Err(err) => { + panic!("Error: Unable to get response from FINDCONTENT request: {err:?}"); + } + } + } +} + +dyn_async! { + async fn test_find_nodes_distance_of_client_c<'a>(clients: Vec, _: Option>) { + let (client_a, client_b, client_c) = match clients.iter().collect_tuple() { + Some((client_a, client_b, client_c)) => (client_a, client_b, client_c), + None => { + panic!("Unable to get expected amount of clients from NClientTestSpec"); + } + }; + + let target_enr = match client_b.rpc.node_info().await { + Ok(node_info) => node_info.enr, + Err(err) => { + panic!("Error getting node info: {err:?}"); + } + }; + + // We are adding client C to our list so we then can assume only one client per bucket + let client_c_enr = match client_c.rpc.node_info().await { + Ok(node_info) => node_info.enr, + Err(err) => { + panic!("Error getting node info: {err:?}"); + } + }; + + // seed enr into routing table + match BeaconNetworkApiClient::add_enr(&client_b.rpc, client_c_enr.clone()).await { + Ok(response) => if !response { + panic!("AddEnr expected to get true and instead got false") + }, + Err(err) => panic!("{}", &err.to_string()), + } + + if let Some(distance) = XorMetric::distance(&target_enr.node_id().raw(), &client_c_enr.node_id().raw()).log2() { + match client_a.rpc.find_nodes(target_enr.clone(), vec![distance as u16]).await { + Ok(response) => { + if response.is_empty() { + panic!("FindNodes expected to have received a non-empty response"); + } + + if !response.contains(&client_c_enr) { + panic!("FindNodes {distance} distance expected to contained seeded Enr"); + } + } + Err(err) => panic!("{}", &err.to_string()), + } + } else { + panic!("Distance calculation failed"); + } + } +} diff --git a/simulators/portal/beacon/src/suites/mod.rs b/simulators/portal/beacon/src/suites/mod.rs index 02a4b0c6d1..aa23404843 100644 --- a/simulators/portal/beacon/src/suites/mod.rs +++ b/simulators/portal/beacon/src/suites/mod.rs @@ -1,3 +1,4 @@ pub mod constants; pub mod interop; +pub mod mesh; pub mod rpc_compat; diff --git a/simulators/portal/beacon/src/suites/rpc_compat.rs b/simulators/portal/beacon/src/suites/rpc_compat.rs index d22dae1378..79329bb6c1 100644 --- a/simulators/portal/beacon/src/suites/rpc_compat.rs +++ b/simulators/portal/beacon/src/suites/rpc_compat.rs @@ -1,4 +1,6 @@ use crate::suites::constants::BEACON_STRING; +use crate::suites::constants::CONSTANT_CONTENT_KEY; +use crate::suites::constants::CONSTANT_CONTENT_VALUE; use crate::suites::constants::HIVE_PORTAL_NETWORKS_SELECTED; use crate::suites::constants::TRIN_BRIDGE_CLIENT_TYPE; use ethportal_api::types::enr::generate_random_remote_enr; @@ -9,10 +11,6 @@ use hivesim::{dyn_async, Client, NClientTestSpec, Test}; use serde_json::json; use std::collections::HashMap; -// Bootstrap https://github.com/ethereum/portal-spec-tests/blob/master/tests/mainnet/beacon_chain/light_client/bootstrap.json -const CONTENT_KEY: &str = "0x10bd9f42d9a42d972bdaf4dee84e5b419dd432b52867258acb7bcc7f567b6e3af1"; -const CONTENT_VALUE: &str = "0xbba4da96d4600000814453665c4b46dad568d69d0a3d211c70829ce7c5c17549713ed0996c8743e6b55b3797ea19c0eebac07b0e163fae9aa71bc2561705e492dd206730e8d7e731e621d2d7039ded027d9910bd41b23f642c609986a33f46fb3187faf6a0abc1809811c919b69e9ecbe5c129e3bc6cc6811de879149bf856984cc2a5162aed445600abaccb10a1b48694f150de473b893184c8200c822abc86d3d8d3bab7918b55963553bf9be9d2144a36827db66449e2302a49c72837b3e793666321ffa0a45089cb5f6af2380686485c4a85aa460dafff2c2681ffc4dd2a57ad488e53e904734908fa7759d18edb7e58d54ae6565774b607fd7488f013b6d02cd13beb3ed2a41d983f02f7eeac4b7f4222474252ef4538b5b09c3fe7ba6899412839fb79588387fd75faf7225e9dfd65bb46a795929d1a6a83113cc89c390ef293f9b73f336157e2f4abd6867a7a3aad6cb0472e1f17a73f913822642688fb28944b9df775593ac8a77bac24608066588ffc11a91b0c85d3f078be13ff586f7cdc20a23473f7a8c800c039edaa2ea42e15be9dbd47638ff4389b0a4e7daebe365aaf47ddbc16d3737ef8f4ed64da4ff89064056a794f9232ab744f72c5ae7fc674890d07027dc5541eaaf8dc1edc8d8fb4d5c763053a53697d9e5100ad9afa1e9fc888cf1197ad56d34d0f290b5d73dcb191ca444671fa433332f9d451efa4623ccaa1ca061827b86eafc6f771e184c48f4a3ab88c44829cb86aa86516cddcbe07bb52957e926dbb7bea95e9adb19ab3f99ff83279b5e41dd5cab1b5ee617340c8b46536a4e0b60d7235423760c2a72910dc838457a5a6c2d96bb1fe3c8b1cc292af040bcc5fb030d407a283dab7cf28b5fc8f651afb812b2b138c2dc05c2606320fd82ebe8ca7843ab0058ccdbdac8395bd65df3327fcbe1d8ac52b5e8e8970acf53a46d1ffa4ef16a472e24746a05f13399a7613a2b483855e7d67348cc8b51afec047355d3ba2a1f19d1e2fe3ee7b5137b4d0d257942118700ce0b506ee1b8b0c542ac600ffa734a960b60c13e89d3f60c5de14e3a557159326ae0eaa2328ee3d57ee2406ae9dae30d2bda566d5e22a2bf051a5ca0485b32edb939b949a967d315c0b771ae169433c6b683e0f58e5a4d874e4577d8ec74ee5466491a61cbd96f3d8ae11bb3d5818fda22b5f7914e82ff54d868983315df52ed8ce53b438b6f147343af4508813063e68b6416ddeb0eb0de1c494f0b40211bdf757919a28ef984ca6091f15f5953e0c8250fa5cfe4f1f5e54acd9faa8b5efe29a5daaf0494151b73f6dcc9f8b08558535b1b4887d275cd3feac9424be96efd63191c6fadebe8825917b58a7a286cbdba16cb3df97f1a94c1e41260bc4980ec4ed34032e8c714fe1ff769f8a79217a4a25c1efc38714c68eee4b7f8088e75fc044349471caa4b7fe94793d82e46e81f7bcac3ee933c043bcafb97882ee20d9d45d7c459934926b3079411afea06ae8cba6f092824313ca9998e067051b638b77ea5b90fb69af4ccc66218945554d9b78c3a5ea25d7e4eb9d68bbb40cb99176dd8ced6478af77e10570e5329683d66a2dcddfbcfac27f44ca51e7eb5ebe686e3bfae17a8415a2a13b29149c4392e4226a31225ba4af8df06e20d34c0a0b50376c28e0ff61f55588f8d77e481a3bda3eafb6af54015a2fe2b85c1292d883e4b074123a873f7bace327f77b37239841b1849e87fcd9f1f4c0b5e02ebaac21e3fda7c1f6e5c0bbde58071ff0101cb20fd117b265a8e87063f0b4c0ae6342af61107c2c2d0c9a68b39e8e609dcaea876bb2257d5c5a1e09c0451782ad560b8be7489a4c1e446b1fefe710d1b5d5fb2960d05e931f6fe0b6b85d4a9d4609370308774952614e889827eb7fa6017d5ab5285494620d2a3ead19245e4b6d389d503e7fb3faa7d71eaebd63d106bddee15ccbf80221a12d4cdee182fdabfcb8bd84db3e84cfa6b67d20ba17b7f96f2c9a5206dbdb251094ea01b174f664e3ecd145b876db7b5f900e23ff823e32cd19ee8a2dd30265e196615c6ce66d688fd344d68ffa7a7ad53e1570e5849d06a9d35c26cd41edfeaba7c0fffa5e2e017876d4a10453c906ac9f569ebe129692d49e6d4bfa42a4fe8f0838fcba8107576fa0b970433e1930c575f5827593bacbf77162a8187f7befbfc427bfca2273d24ddc67d7dea6116a1f25a02baf10460040120b6570c01b69a742d260351e64c1911daa80a4c8ca60e2c94b275c864f76a27f8edd99ae770d666f359cd4596978bbc50151ef313955cd867e9b1d4a76d501bc9999c1a5390cdc76333912ed4a3dd34290669a44392917052b1867d68f5ddd332f64e380d4631ded0ebecb92d09bcd7ac2a6f5f39e251f6b1070d614f716e2fb95d9f26aa8b1f8f201e6d473b2ea2624eca1cf297934720ce8e708b2cd1b992a9296232cda34f470a6d79f0ae5f2025f893bd15028988e14dd8074ce97010091de70685584e28bee1963f58a262c85df328377cb0c5cb3f39fe568684439916ec121766afe27abe8fd25ed47c06700b8629f27be989ae3e439aefec3861d3ddc2eab0281868e35001e26f98d7bff81c63c22ecbfb48060d0d8d1235ce28d9080dd2de2ac0408d583b8567309c4dbb0318dadfdeca8b8815fb08dd266955a05101c8a2432530535333ecdfb4f428eed385fb25a101c10a1f06e0d921978f3ea9f999459c488dde6035c1a6eca88998528f8e144b36320d6bb688450c9d394c3089d509cc8a906abb6c43a8b0537707c5bf7b1a9a7e573829fa3c9a415fb0001ffa4b4227e15f1e1f22d65996933cdf20ce49ceff76834f690caf6e012e209e34a4e814ed62d25b66424d5a788a4efc7aae897eb12ae3e51665f478332181fd04a995696afa831ebd6056629bc066cf36ddc88381d3c88fffd68e3cdc1fd9b06105066119994ae81040503f1f0a10c4153a11d1e609adfb9018431c31c1ff2807faab0e7af0239488bc063dec1190981964affee89ab22faaf23e3c24cbcc7d769e7102208d576bd26a640878650ca345aa680befa367dd105b3ebfd99391d53c66afd6154cfe7dd8813fe39059e8dc5027924e25cf94d13a9fa4ba1f16cfb442c8a8d3f898d141d9efae49249fab1d05cb3f9fb900aa0ee6aa232911822e0c17998201c896ee15deff92aab0c34413d132ab731c682c9f3b3d745e6c5e18e673c16a56c4646ec0c2ca04654bab28bb7a5ca579a9170ba9ff3e5363bce737acfdb1eac18377e33978ae4a82dba9bbd4419221e58a10ae80f91067754051ad9c16606b72752f43ecaeeefd9f0af140d0d4461a3d890cb07cbe2a9b001571001fefcc7f0e1b92abaa097e1566d5340853515a15fe4256b83ffe2b723e60e206b75f27ca1b99b1164484197d115a93f85aada209f8ab8a31ce3a66f23c820698febb8e95ba96ac28fca74bca0d504dca4cdba7e85bdaf7fef7b0f17d4b6fafe4c3e9810ee9fc1a83466fc3875eb8e22b2ad6e068b9b18bd9f60f9e66f823cc52a2ea0eea5a1c3e7756d82811c9da030bbc3a51c1150ca8cbf5ba38b106b185e0ac4331e8a0d653a66cad60427efc8b7dbdb817999e346152c197e1b2d61a5a9d7f2ed328aecab1ffee39b76c17dd3577cc399ac7c7e1cc48e4fac0aacc1451793db4f91b593f0ca06236425417238ea6d40e1837a9928af864d8b34fde1cee5bc2bc7e69bb9908c8de49df8c821f0fd6b497657b4ed5cde9502e86ae3e6f7c15189a96b31d30f59faa760de83831397c7f99cfc7e23f2687aaf2ae64deba1902f491299ae927ed9c10ff485f576cef160dd32c11e33003c9eaf468db444bdb715d97acc8df5e08e6aec88d91f747e897fffad73af7e05b0c5cfe23deb931f489763e876088841e9d7358c94619229ef27149b51f0a322200c103e80588e1f6f31a47f40b3b858d0995af11b99d7baa4c7cc145d58e14c240954234e32691001e9cdcde67429cad3962f37fd84a7c61857540799b8ff3d3cda254ba05880e680230712a0618054dd0c89b862e419172a0282277865a2dd45e14a49e31e73db870d70f238a29546e54eb601cc76b8837ceea671faa84f096bfb4b7eded007e12d2efc4f9ff8a421b2000a75c5a01695ab33f027429361fc9f46d0bd883d96a1f9b4b329a9c7256e45f13a298590c0ad15e3c16c73b541bef836e81ba5e18c844c1165fa23932c40287257bedeea72af52893990bd5a6bb57df63a2b6a1565680945f87326e38508918c0020e7f8cc2a26e381e34d8197cc45e0dfe975331d65494aeabece73b741ac9b192e930439dab6b62b91a9dac9f909d78111dd62a5f0561f5f47a9a60c5d55f309ddd4b7b94efc87dfab8effaba010041abafb8757d0f681e1a25939cc5ecf764bd83f2832653feaa0a18d86336aed2c73c84199afdd03171e74fc96b865d0bf7f4f5a54c15c823f27b209b5d34b64cedc5baeb0184b2d9524b012a2e4fd70dd539db32f6964c34d16399a16c5499597423149a97723cdf5b5deb33693d456213793adbe52ec75ea8934e38ecd9299ff8d57ef12e9b4e14806d103954b86321ea42aad93daf0ea876befa5bc2a7659b3608e9efff93a7b5201478798d65d892aeae9ded2fad2ea4007c0cfd35727d44f8ca4c7a52b4e331621e7dab1aa1f7aec02c7e7c3ae36489b421042a9f331cc609990c589f1048c10d1ff1873e9a871477ec91acfbdedcec1cc83e70447a117325ab16b1a69389f4f786acd857064e82ad1da1257e3ed9820be84d6972a5f90ccd96c6409124c845a3feb23a7b862dd28e094e2620ecc39fb590e6cb7444e66f202cf8922ccc47b807776a672aa35e4434e27ba331d0666ee19b472556951fa250b021dce47ac13a33264fcb87597ce6a7d66391d19da9758ef1ee7d19e1f774ce54c5e92a487735cbffd941210fcfc8c42b7af9fcbe376863e4e919916f0d0ccf8fd05d1d7b3b41401864f4c179bcbdfff434dfc4dc4171d35ce0887a0ac8e3d17f150411a09a74e02e47fb8f537f3add4377e0381015a79a5fc12fd86b521dde790030f0ddc7cc34305c0bc5e9e3b22460d405a3cf28761c0e7ada75fc69d11430c04bf856870b689e40491f49f76d18b6c62ee4a4937d2506e5658b2e71adf7fc9aefe03e6fedc0251a99760209fdad863928ff8050c39c8abeced80ecdb13fe10f0f65045f2e2d41958e49bbb4c4fc1c5fc15fddc7644e5366cb4e4416bb1a6afda3a8bcc5f7c51ff01135f7643dabe355f4cc241943521cfd15ea8c2e51bf44e17354353436ea6059f90e393790af9a011bda79f84675f83d3e4ab18a7530369a953490c20ebf4430a5398bf4738abe51a6e43974999d316259501c60c8d3a4efcbe8177833c67658921351d44588c2339704b9d6bcbe30f95b94328cf423be2fd387321e447dd5571a0c1992d091f4397fc47a835e25c6355488cbf4e2a06984410a8df4fb8bf596927531d59bb74f72e147453de54b4b82c99b836fe255878b4156eca6caac99209c9f0054f32c2138c9ecc834a2640d8ea4d6cb521bdc12f12d055774414ab86f995032ef0bf03ad45f1403161b848bd4ef4400e1778f32f5cba7274ffa117a1f3c96fcd6f0e387af6302ce40ed69cdb50b88c76388a3b80c3954c710f6617e44a986cd65909ed542614c1c6f80da78461192553d6e077e9bf8ea20b6016cdc0c995ae07bf473df39af8d0dafa160f252d58d394930d46ef2b2f0a7d1e48d8ef2aaac8a9ec0b7f00145922883de52436598fdf1fba9f1283d31b70ce0ae4daf3db610d970ec2582863e40458de4bc082dfaca451d756ef83a93baa3fa37b3f82ab8cdaa487087eb9175d846a789099e344b2ec58eac67185e6305a81f5f691330fad31715f8fef45e835a9da43a571a016a35bae46b3415ac704c66bc651fe079c797786e047187eb8c3eac665b521beff69db528d5a49568f2eb0030ccd6d5e19ad4adfb271ed46d44024356808f77e16573c4f0aa225694857c34c5f00bcae4ff15c91bc5917502dcb84b78f04e2627794268b54d9a670f0b97d9cb3a5ec637c0eb9f0922a70ba445fcc20710c56b7b05b902262c081958163c0036ddd7aca4daf4814ca4fb003b3f59a76adb7390155e0dd635b8c04ca59be1a0768463d94f49a021efb43645da70770e4b2f4d00bacaa91df4572fdc8903ff47df32da286a5f14a3ed8717e537b640aa123f6b64e5db9ea7e3abe9907fca059493075091e10815eb342b85326d35a5d978515882b8258c71ad6eaf9eebac6ef8284e4d7925d40b48fb1c4ed93ab6b4bc06411cc178e8ecea37cb50a7bea428417ab63dfa931f0885ac82f5330764294d0297003418e70fdc994adf9d0f23486520b8caa560e8c78251fe9c95861a45050797db4586e18d968f6104dc18c6dcb6652ba7f5f8504a76cdbd56c2fd9bb5c3b33384ff6718e9cf70fd97b62a4a2384807a6d5e9151e890ebf9e797c61b0eef785cf25b6e1f930320cf1ed97cc43490f3318d74cb4a5835e742f8ff9abba5562e791eac25fd8450b4f5458fab279ba50b06e2902d04d1f63dd6d08f515a87b1f13822f7fd88e464e384b2ebc91c2ff0a834655c632b5b7e3099132fe6adae081fa6d756e57949bdfaf00a3474b5b4b47442d160c66ad76d9bb755b144f49553feac5e772dfcaa944a31f4ecfe989ff4dc092525d7e95eeb938c87e22de2e18de8891db8fa0aff02dc0c936ee1c5846f454e6dd5a2a8a84111f213242ca48ec4a0ca42de208114b425884bf754f9891a511b6e149009346e2978a89df0394777a636bd6d6cc91cd06cd1395d9c42cd5f278e1ed46ec4799910d6ac90fa9fc346a09a83a27a096602b4269da59eddd4ae1c2f3f30cdb05131399cf3c50c913c683ee1a95ae748b674ccd3ae95b037aef9c98bc4693eeb2c68ec35bad4dfe85ff73b1df1584d3c99ca62f44bde2d01b4a1a20ed9e8309042005d373d3b93bfdc4ac7899a2f4fa9498275caa522098e7ac5d756414e3acbd875643c2525229105cd82a32669590f23573755c92518134dc29ed20ff7391a7d809a4a90d4f3ccd98417306079861565f24088c9f7145f44093f6dc62ed87b0b877110d22048df35d11a9c55f0242a1a4671ec29a9089afd2f394cba94281f8c21f56ae82332b7b04a61d99762498993fef839a27bcc305b47f0746f24394920e5ecb28ec54e49e6a6207c63fdf445b561ae777a5af4717bf84bbcbfd27b47f5a72308e46589dc13056956be4ae308bedd8e7e8f0e796679de5855aca48d26dad61e97f1b66681ab7d3277c7f77e1d69643db6ef966831fec812c326dca60b33f317a1cd6d055aecdc40bd5bd2199ab738595dc59d4fa794d63d7758c06a4aac989686cc8abd3c63122f089cbf5398e933313ccdd960903eb597954b2749b848056b996f5949ed81acead2823d11de1925c547b07fdd7a0764e65d42ba4cfa5277424bd750b6dd6a446752b4b8821949fdd4460c3ef0340de7e9687f468a9b77105354b55bc5eeffba2a27d845f79b7396446353efa313d4422bea82d8bcf95897b3f15aba174e91059115e5e0bd02dd9aa92397f35a424e925c297d70be682f17c470035b58ea2f17703c86333e5790dd1630559e4d4a0313cf7b069bb2467ed1a53f4ec4e2587c49d582a4b21ea988e620b91bd4647297050d64aec86b628bcbafc2106ce8c6e8f52101c0fbce580b18b309d3fafef0c81a3f1c7ffc66585b007270b3868a45bf9168ecbf82489324ca7c1feb0f99b27f9d9a294481c95d5ccfe1dbc888d1e2c4c506d375cbc89925113d25c47ffdf60818744c832a7abc4ab36dfb4a13dff1d2830e9e6fe3fb843a442303b1eb8cb8778ba9b3fbb273a8a91f5e19e09fd2a37738aa63fd26a0b630bb3b36c219b79831562877b484273e72c8b4320ab00d328c3bb1854c99b6aa8e2ee69d767cd5a205c8982ff75ce1a7a46cdde1651e3f8f1bd79ed3eb595e9efe010d59ee3c3fa9470bb03c285389790f8ab442884e4d64b0a479066e1f62f2a1561e0012e44def9309af5566e94d68e4f5ce455ba4f9afb0e662287f87b5b96e0b215a1b9baeb8fb46a52e711afacd1ba7bdfc50e1ff7305ab07264186c83ceb77cacf008b6c10d56fe1f4610cd05844f7e44af4f08e7d7d0e8f55d0f3734956fc9287e2a8294102c2d97ac21f9d741b32c3eb9086bde7712e164865bbf1a84f14d48e0b38f98ef54f06af33c916db45e6abbe3370c9e47c5a5f5cf73b4b784e47bc3f5574155c804c18ee4954f7e89c50ae9ba4d03123093a6500ded8a6118f7dca1fcf62614e68f38d2e598c54a065f228eef188cb7aaf1f41df6f3d4d788a88d204e9e285034a0c6c5b6b894e232b844a4696a3ef7d8f0811e32f6bbfffd557dab2b588eb918d8443d0a9f4a7c82b42c275bca9865e7ac38ca3e49dd150fe2f01fa8df60d6f581f050b3bbe0ef416ff657db803c0c4995b9b871a38a5fab90bb90732766d35452dd0ac64971d75a65d744baf6ca2340c26934f6527c29665ef128f17c20d8c1fcca12fac9d898893a664c600896a922ad526c6283050ae67863d2ec2f47eb01b1a3e19531a2213078edcbb953b57fe701f0445e95b6a78e45d1ba06e3b9077847e1017f6085f75d3bf0223c98fd32000d555b73e6c51ab57246e15d22531693894f793cd27d8fb68355030b0f7a357ab43192956b96afc377de9b07c41d30a6a23f461c47f40d5e2a023795c06fda75737e2a5143d325b86d62aee8500d1a76c1a96269817f465ed46b40140b7d892b68ab40d3430cea6f598b8279625deabc631a7114e99e43a36c83fb7d37a70d742d297b973fa7e0caf2b47ac62f0750e0c22a59ca5952ea74f0b59e16a1e3ce1b391f1a9f28345da7a5f0b37064ab736772f7941bc9b7c758a4c56f1fb5455ee551f5e9e02e8de051e339bf90ffbfa75c45319cad15e2c5aa87b98b604568dd1eb46c9b92d553c5c4268a1a2e44707b3e6538ebdfb5f504e73fd80b0d971a6c280fbf80a35a4723b9e1db4566ae59354322f6a6a2ef45c60ac12ea88edb34c90fbdf7b8bd8708cab7bd1a0b29be454c3479f2629c5018fea8285f03390c355e0accd89f6824d449a38e6d0a2ff8690da806ee42530867b3f363b3d49e738df1563c5600702ecb5bab1726ba55fd0d4ace1581d4f4108368b24fe4d4090b371052098c4974faa7e46e82cf07589822a39aba6b03c2f19746827fc4d2f2ba82df5923d5e2876872d840b657bb2646c9713cd61a83510e5d00a754fd43eaa7fa3a2509a74bc7076096b720b73ea207b4ca9aa638b78f4c0d4a4257fa3d3de17c30507af0a058d99db8706820cd18dad632b954374503edff3191fcbfc5b2b55be2b0b7504de5fe097d97147f788b55f6332331101ad4204cf5b18173d4d0809c7d9eec152c5cacc981b25c8aab74e3adfc472fa13e6f6b3212bf2293f96a2482ada1f4ef9dc524c2499e970eb4496da67b6948958f998dcd398b3aed89d5943d1529ffe74cb7a7c2df90043a24ec03fb8adfd9ed6cbec980b54d199f665e755060c796c9351353a23aa988ceedc8cee0d73be4ed1e3fc765edbf7d8dd5e102cab4181e53ad02a5fdcca3c534f9110e4e7f292f5f4aa5c3fa49ab9877cd3b1c6196f62ccc3f8fd616e08eb364faee03e79b96212a1f1887b85b3502ab1cc20df3480d71aa3db7f60ee2a3167ca7a530698c998ac2352f5043b632650175dd345a3bb805c2fb200eca4612732d72fca8a5501d73777b3bba9cc398f16ef01998e922d41ba8b0bac453b80d453b7ec869bd0d79e9a87cbe0fcbaf47a11849c6695f3b877ec1df5cd248bfb2296192da2af337d4767bc3008ae01b8228d94efd3b1adec17a5f9b2a12ab50175246356edd18bd8d5b363d1bdb7f58943d8bd84d91f1f324a74c654c6307450612e94635ff12c03f08ac4d9602e231bc81eeed25901c51e8c786f66448774e8d79492af9721ddf0e37a9c168287307f2b519864c2f897fea1d8a4b53bcc9b2c5ddc91c84b8c8b090a09da8fee5f148abef2304a840444bc005dd7652b89ba5576f6481891a8a71397348ac7829bf53e3c58e5e095567ebbc9848aca8f2b8d3b6c09af750a10f6a47bcc6a45480820742de945173cf4655d93916154597d1b8de6b5b01f18db2ff6176f0cb89b68f62a1bd48bf7ffb44274c599670ae58084d57d85f244811901762194be0023975a453bb177f136ad9495e9f24b0a781da39ab7832855952722ed031fd1820aab81752d67f23f30a6e3301f3729f6cb068ec65e1ceddeec8b2c163e8624f574a65cf8e7b81570277a08e035407611bc2b136459c96dc986f140dcca94d6c69784c79ee9100ec11d240f95c7920652b63d056b35fba4582471c23a9e5dfbd717a689d9776fe49d1f8ef8fc43b530597b6cc734edec8aaf1c19138f7c65b21766ba935b11ae420d2fd0945cf46e15868805dcbd39a9223c32176cdcc19f49db6ee857aa5b6ec01185255871c4f65edd837e51082cf069fbaf7c841f13eb91cf801ad1de660a0acd43fa5b2a7c49bcc61b744b05d25cc605c81fbfd829032ac6bfb8f328685938eedc8919de180badaf8980ca0745b79e18bfaf31ca778080ea486602c2f9b80db583b32c07353f23b31130770b37863f310ac5c5a9560b57430fbf5fc37359e66735c5867012f7059418714a76fa7c5cabb914f3f9531e4c8a0ff7f8bb5bc7b263660982be7e50e565c0ade5633d94f5de6c71ceb4af1ca4ac2137bb7c02f34d88860e312681e195320727fde90f17f982d04076ab3fdd2357fdc2037db0ed17506f194426e43b065b70ff8460a6234a93d0a5c54024e1c7593815c108cf6d545718b06178fdd7dffdafd222c94f649948e1290cb85f8b166d82b7ae97b3e3dfbf3d0f381318b0a15eee35bb3877e3b966181b5b521aeb4ce1bb11554e7f56d9065e4c849e2046ab6470bb9aa3fc407b0b676e60a60ea7570b3260c7a987a5b2e949ca039f3db17608b6586c169099482869b07f7325720e27f56d07a4656914b5328648296fb66bf95b76578a8fa4fdb83daa7a395008149fd3cdf6fdcf1c80a236b3a1a96e511898cb24b631cc56aa7c7173c36162bf4c2e4f5afac8da6c4385ae6405e88b25c719a464b9a6eb2a3453ed21f62728750af1ebe768c7205e8bbbbad32f61e1ddb6bdd2556b5b21bdaa11dd85717b5eb28d995889ab0b839d8c4a6183d3804cb4403c361b0b1d27bd0cdfb98631ada8be88e17ac77f2a697ba4fb4d98d96c01400454e9d80ef89d29139079ed143e50151bda9ff1f43eeadc6cea6e693d74f4cb1cfe09696d396c25ff629064aa2d8fe449bf9702b19634605d66471b2f74f6daada1d0528fbe4c76c5ac2918e48f0428f0d4388073784e68fc2c0cfa83bd1787849fd849762ad5bafe0ee3ebf8b0599b5a98a520a5be01732d5031bf92ad9ef0c235c582f4f970a502dc4e38ef8bd6e7963731a8e1fb1f2d8bda64d5989d9b8e8971140d5fc36ca356330ae603795e61ef15758b603b9cc62fc0fd03adc9988a7f62b6a18b60eccd1bccc3b27f03dea73d9300f38d7dc40123b365264b04aad43e6857ce22584d3ddd0646e318e204412350dced56e02bb8f30ad1cc553be2c11c989ad8969ebff9c3be0db0ba9cbfca59e7b053463a5fa16ef00c33c308df36f2a8d994e1d1d12297eca66ebf0295772d0e9ba8e6fc8d6fb36d74b86c4459ebc2001110da0b6273d04f8b0c23a16f64e405d72515578b0f2111a7e9c438fec08c60e21b42e396bd9cbc1eeff6e374978fe3e39d75e8fb3eb96a6fd485e4ce9361875470a5c3ff43a2efa1a00a78fc104bed02130fb180409ff8d2a8472285a0016c50a9a41901a4902c19f21e2c120044eacb6c48d3ca1ee79780370d47f296d8cf2b8d473b0e0dcd5feabe4d1d42ae77e7264cba987404969dbe514d2b1ef5b95e06b09d2688f2503ceefb50d21fdc4a897dd6deb6c4ca27eca219c58c1182383a04f500798a3a714802a2fd33cf2cfecc8719d925705e4fd8c491932131413b9f5498acd0463b02d4e6345a4f5ccb2c95a9ec60ca4f6acdd6ae0f2ab1c1f78ba945fd1c8d0d77b374281b49ecf0fae9b27afd520e577c01460bdd07ac1c521f94f3d21c4a87871ea9dd103323ace0bfd122a4993cde5584b69f58f2ecce55e424232db799bf2441aae86c51d22c8c9f4d17b94f786157a07dd8701a1dbb2878c3e6b3911a1d716160e45f83e7565d364d4b3ada1374b7696061d42552dbcb7647c8e4d91ad3e1846cb902c373b5b36e5a09b8ef95628c6c5f846e954d6c02e446210ae89385453948fe1669e52e185f7104efca5b505b14d17c0e6f9719ce4b22f71da941caff7827a8311a0a366afd8d274c76ccaf108626260bcee8f9c0f1d8bd5f979b6b8282103c2af61aded55e0f5a80b2b192f12c42b6929364648d9b4b5680b0ed1a77a21086910bb0c041ab86fc2b25aa395ecfd5d255413eac364998a091181ecc091c64050fdce03e6484815e580f21eb07e6267719a0d88b2291648fc9ae9ab444a5de7e5aedab55d27ce3f400c7dcb57bafcc24a30daac9eae10503b52054ccc8b18220418a850392bc20ec3f768b3a6a236fc237e0a197df2a164a3e49d4133423226783f49c7dd07cb840d128eba5316878e0f85c3ef30bad7ca5ea8a681ac8f6a216abb0d90ace55f37c7179797e8715c5640a0daa39981fa48ff73125f2e1ab1591402515f7ab7b533948d7987b3f237acb2821f2746099d4b714fa228fffa92f42d0c9929e912ca5eae07e07fdd35e62de79ab35f49543eb0a03ac1acc99570289106966173fbc2d594cef0da9da3ce46c046802c1716b380a307c10496b2bc330c2d146f62ca8d5dd254e58fb846bd1a3e50a1faf580735a473f6e40ce67a4696a4612098ef832ef13a82e756bf9b6431a598a12ca8fd80e1c1c52b6e66ca01f6331ff5bcd1821cf35df7e1288e3d72ce727ded3ad0ffee267e28737607c70aa57f72dc4aff85027dd2095866d46b070b26eb4cfaf5b2e5591e9898acd7be659d7780f9de34fd04aad926dc2cf06cbf7992965e7db0ff906029eb798f09924500a6ea5454425783a4f8f6cf623753e36f13f1487d4909bf552f60b64467def6ba257ffc25aa955b46ae2378025acce6a65e90f2ad6474c09ddb1f24ed893baba3facfe0033fe4e5649357d59a4077684a69df61933829bdd84909ab6d684ba7bccc57b5d4b67aec5a1ccfa2c858017c579cbed366c29b6cd1ce009d5879ffba0c650dc18e683b9610e651586954365d8dc567dd0a80f7785b3359e6371e699d57c61c08b9f65be0a23be376f5241a6688b918bf67f32e4576d58a6af7851edcb66b6b8745fbecf1064cc60ee6bc3de69b18cc411733e9a6af08115c2049018342146a9e518299b1e1631d9a2bcda23078ad50fcd658666cc7573031dc837d59df6836f02583ff70950c495b82c8ac1c7c1e15d9c4c83ac8fd9dcbdb44c81120f1f94695aa903ce6db48950003a556b7dc06627069806e71398860c3b619f1060a774e16f4b6dbba5c6c831a8a95f290e17b178dfe3f935fa9e897559e2539e4ba3eea81c61218b26c931c8a1224895f1de6468c97a89d14e5cd400845900af012b4d4d6e29f8a79215b052092c0a9e158e43cdb839c176d75e6e39ee6083494547cf175408d7d2effe17cc862f1246be9434d9e12b490f186be8f6ad7d3c7b5bd068ec6ef7962f49207b05af20eb5aaf7e99f80408556177c7a186b7c7432bdb577d7bfcdf3f485b91a57b60780d4dc41def326e3915a319aabf3e82a6b9708245648314723d2a331974f2a6bf02cd1af9dbbba3ebc42cd8d743724a4cf20eceed48902d52b9ab9f3c3e18f2377970a3fc5c194bd4cdf57c51e2278187b0e9a57f77ccbb39b15d7bcb76a84b0defeae1cd30b59f1c1e41f78f665e6d0a1de233b6d37a8bea9a3bb7fccfc9b102ca6fd636e48a71473c867893ce71f783c3659650266911965ad2ceb2003457a5016281f672f94644c5b58d285f9784e53a64021f3f48c949db5940e9153bf0c34d4ac8ec2628eb792535dbbe5d4547f97606e8d0811a4a342fcd95040371af516303c686793e16b51c8c107b6d1f22b60fc13ec118307aa1bec5041f5d0a9d6c7ac570632a609dae75d58a9b8004873b5f805a0e08482834477a8a9562482c88a9288b48afc8b2624b975f7a0637a5da4851cba6e5a751b891c46f2e2d818f4dbd516b7e6b46c83e8246d0aff2459703d9376138858c08d86ef6d6f3228d44218eb94244698a0bc448c70c340bfe857d4f27e988fa7467820742d641d5fe2679602bb5a146549e0e3e67fb6726d85834950e5c53dede23e0240ee9e3b26ca6cbd9c74562d77cfcf94b4269bd5cf892698a91c3ae42726ee9e07c69e6e38803f6631fd69c2de4a20c4f214a774a8b99eb737b4e8da5727b9dc0d0915c7eee78b1bfb42b9825b1d2c4c9442c952213d17cef7c181c23487149b5b681d7159ea45450e0f25e71aee4b9b50032f86ffc9f36ed9bd7ce63d688b9d8c1f084639bbc7c5262e9e0bb9eed8f7ddba446ecdca3984cde5d0e6bd1195226ddf47c895a64b44f27ba82218c48eafa271502f0705ff2e6f2cd291479c623b3477d67712c94902cca20f4d6dd7e09b1d252effa7c3800e1739f1fc220b91ff440bcd4500176a509889a104944318fd4bb4805d748b8a5a09656e497b46e4ad5ee6bd9477fc41cca86b66014c4dabbdd2825ec7256082774a6fe9ecef481b98ecb3237adeab1f476efe315fedc0d82356f60cc17f8ec26d9f565b16380f4d93f273c26c22f2a2c25c2b03e6ab418cae19711b2cf47a297f51dadab1dd129b0cbf9883553eb7f3f052a18a010f802c2d4d0fb40d891e4256476799d7e11ba0efda9aad41939a1498cc7db0198b09411d1760388527bf4a972a7a06cdc7d211bf85248cd0b783624e5c836c2cf3e1406d8427001ed79a8663fb9174d20d2a6c7adf02b5a0e1d4f7446252e082a0cb1bc524cef2dd07a9d5ffa7bee2f58d8579add29521a9ddc944532622424725bed49f2a6f047a1c770ea9bcbd8b9bf99e3e7ab09e8289b495780a2eb48ec0c45430942e7778dcdccb1de1411d40ba7de1f29cd3270d63ad58951f58275db500eb7c7781843cbef8360837a200b9dae2ef916de0c7c5c5e4c99bce7c2b0f4ac3491bbbe14c01f9e09717e7813beaf694768b53ff3e10dd2bf72ed87d239d8a7c9be4b0e4cb05e08bcb8d93819e197a462ca20b84ddfc071566f4124668c6c0f3f821fb2fc49d1587b58c87f56d3bf1aefee1868abcf44968cb526b7d572e9524bda19d38b57d55a13e529f457e1e2b2f8141396d01461774e350c1155320997151e870cc57dcea9dba96ae9962b0da0e26f21a55e8feafb8ab6383620d01c2b5564bcbdff7f79cd43034846f6a2b20b3da0717f99d394ed1e89349ca3d08a91e5f9595cb8ede82e07bffa174a1c99bd34887850917f10af5ade7e2bb7b1676b86d80e68492b838d6aab7f3f38f7463f2b944c8c2e8f050f93dd47b1ad02e3d7d3b4bcff207f6607eaac83aac5c5aab88cef53f6cc9c25ebcf8e4dbb0027ee977265e85dad4d35a70af240e1714eafe427ed99e7df48dd99c16e9e9a4ec56b0ef79b829d26590cbcf396bf41e06952a3ed7594837b434f5b90c166508aac0b6ebe8141e177e60caf14fd1acdce80c56cdea4182fca2da0b30ab58cff9b80a73302027f19aed6655fd9a86f236bcf134917ed8d7525c3447aec2d2207cb6c4b6761e885b59fb113824188068c32cdf08e973e0fc623e67fbd5bccecbf1ed00a0012df83dc254ebad178b28601d8f8eab90fcf97ff9d0189f9588fbddc7a1a7ba27f1c20427c61a46bdc2873bc8ef8c546503bdced0742951e3dc2a1755f1b0f042c14d5374d68310f10a87fd66287409129ca260d1e9aa34c0976f8cb5bd8d2daaf2761b36a5d3001bcf5fbe1c9b2b3c2b59013d6249a97f1708eead3eef3958ff9086e58e027aa039887b743eb03e02af6d465935df9605072207b6c595f0d9ad56896f010c8f7014cb9eac8f2187ecbe589010cc6563c2d9799ce3e10b66c546e9ee22e814c80d911ea853de53e83190286a87cf262d96441825ddfa696368214fa6dc5658e2c7aefdfa1644376b467bd295c9f1ac597c3a9e8011f03b02adda1cb0f77705a068d6ca6de5eace04fd4240d7972c777453e4f502f0f8d6f7861748250e448baf04f53ed5192ca782d008ed4159215c1031c37876e15a28988071384783d0983bb111940b9881f9c3b4864d2d220d742f9f1dddcaefc58bb9a27d30142b67fb074df8e9324c7bd3452377b6b761e2ff614c6f00e476fefd5396e6305101926fe8d6d48ce6da776b839ed7e1e6e64ac6bfd4dc597c221bb813c741912ec952a1611285b0a001adc61e51b05715129f9682252cbc8d40228401e5b8da773a3b44b23115d908ed8864b6632e95b676914634f4e779b76c4d920b0ac381bc348f2a7b496b90a4306b53a4ae2b8ddcc99b5fe0a10eeb9dc2081649237d24d52095f388f0baf408eaa1075ec09da6eed829ea2031cf95ab4365c9b73fd3b37305aa3a08964c995fd3da9badb11751d98163778a02abc1a08e1d52a4f315224371a8e582bde2ca33c0515d238927e1ed7712f03724b6280ec30f71fa84a30974a54bc0fd48215b6f062216407db840ed952379fc0a8a8c8a24bb1cad4c6f25d00e0f5a84252c3b9d11c2646de4b17cbf2c1cc6d651d3d479014258da22d75789291c510d28f2289b947309a42a0d8ae0f44a173c4c9eaa09893a271d8d7461a774027c234344c4c230ddaa857e1bf4dcd3ad3735f5b4d3448edf90c062e85055588062916434db91a0032c35b6d031425ea9eba1fbe4b3149591c90b5aa94338f5538dccd2654acfabf47daa81da2909f0988ddd16a61b2d4f6565ca852d94a1332f0d0c87c036ac4a9c867ad26030f216e054c9402a49fa5b406eb658e5f0ae9652c0c4575f0872d6065c0264afe7320ac52c3bac84b7285d0c07bac6eab329fdc8131604afd108707080e8df0375dffbc5dd180a798a327d50fd7e2279521b2899888504b9a33dcdb71f89e61093e5f128b5515f00eba90b8f0123f4edb0a485bc1e754e706b7aadc93d89e72e37df01ddcfe622a9ac8e33a4c30bfb7ebcd14296bff62d931007e62c97690636242af6d9875e260faa1d1aa4de4d906c679281d298ac932818fcdbf1ffef2ab9287cdf8662b6a6870f46c497d2364c0cedc1001f3d3ef7b34843f74a1e573a15d91e00ddbf851b3802f171288e0f2fde77937efcc50c2526c5cce34ade8478b148ef19f9454610c2fa62d8cc3983163be291b748dc4ed563b853fdd82b45d0533f5d5585b8d25f6c08f2ab378b803cb0e7802575fbbfd7ebe91c429db8766bd825f3b8ff98c76cee1a76105e2ff7685f4705499108d920dfe2389c2c65222f4ad435c78fa86ad94bcb34a168328161f74c445c8df82f296c5a6fe90d40c0b58d67dd0a07890eba26e2e3ea159ee0265067cc64a364eaaab228a60a9d4a153327cea5267f0aa7d6767ba2109727c244db2ac2d428e1442c200061d33e714976203a663913cc343b973a81b47c0a6832f5e36810c31f2e5fb9726a2a2c8bc7eb2c052125b5c287cefc7362c646c50427b721781d5fb006d018683ec7cc115ed664284748147adec635fb1d8d7e2f355239cfc55a325865523b44b795d389b21e93698eebc368e175b69a5f5faecfb58b96759b7164f193bbd5d2ecf5abfa2602cc23697cfddc6cca661ec574ca2993393ff985fb918fac4435f8177f1c84b8b51b98ec2c0a3e4c36fb09a181b89d93ff4082c9bdaae020a647728ed02ca1fffd408817e63f6d6f0d588873a25a3b8c84b6b6e9d1890ec888aa75eb293463848db0856e34a92be0183e2eb6b06e9ae045d7b9bf9714649fe70a1a4a0d348dab35962e42989d9c2ae38f92224d020ed5f851a3753b581261da8e2ac9511fe1ec0bfa29d3dfebf7a52cafc86ca47c3d25b89d850b20dba9818b375648562e28f93efbba12cf14b7a4203eb946d497b2db4ac73952e72064a48d6e894a35e5f2a82713b81eee2a2c754bc6ee9fa3ebb180c6bb438b9148c53f40c5076098a89a97be4952690c1f5635671f6917c34fa089850b77eb0a4b323ffe8abe46d9f16feb3fcfd7f40f2ded29ff70a9debe2531f343d0e1af3b0764bf5969d8b9fa03429759c29d22701a66bd246c6ddf5939136ad5eae6fa8775dcfcd28cd4e42ff7c8e05a5cdb1d99577a28a4b37aafc0d3f1553e2d2f3a31ffd3a1179e0b0d4dcc248b3b0ad89e3379aa1e404a85a9d33e4d332b970391c22d72c0c128e8c60103cf9a1ebdeee02843e03db59e1e9b8b007dae8a5f12ba87744bde58a11a1c5fa8e137dae0615b7ba3f2b0edc6697141c4b5e4d2e2c00bdb091907501ff54277e541ddf29897d3b90b45de171a78f54f25d7888bff7d0c5b0e3b061a463a093042a9026cf5112142cb504f9906f35cf99ba6726f366315c01dfbfe99d7ef249132b0c3a687dfaf7da86dff39929ab822328798f52de6d546632bb5b866598868a8cb3bb366fd9da63845e2c893d992201349e422e5c912956f2c21ec96db9a7c27c9829f1c7096dc2685ef66294f47023bddc418f91a211e23b25ad2991bf3cd62a81c4511494fbe06f7cca4c5281e14307e52f9da671e7627de5cc5c089697437bb683dfc9e0dac291d47e18586e0578e1d5365961b44451e282f6a54b928b514ec459c54c96e18f98851ab7e15348e34f47b932ae50078019f5d45f42d36f0b76fa4a8f7bb57952374c8e9ce09020053f97e818e2097212edd14bc23e7a165296c4e7b6939fd0720a865e05029bb7590f213541f05cb8edb197e6532b88741eb78ffa6c1103e7be4565111ac12e5c3d34cf595df0700d2ec64d312dbba5018218cf5a2b3e571c79d89f066c538ce63c1049de02982e7e2589da2eb5276a751aef35a676702a8033d4b491e03edf1a70d9fb16c9808a67474dccabc91981d6a6824f26441118059f1f60c72c0ee2225fcf7acb78229101f02b6b8421c9def1306a9f452e304ccfc0f715de13d48ac05a3684a130da6440838a789e946dbe6c7f44c44ffc7fd7c77b9497229052882ecfd0898168232cb4d796781d1054973dddf04e09577481baf23b5468b95a5416c76f28396411e7aad4cea8046591f664dfaa3af8985727ddcd8e8e4b87308ad0328ca4294e8b94fa41b4c2d0b137f93e4d9fa24a301804f5338ee5661eaea06be44df99db421712a1e6bf81713548807beb5aed4a1d78ad06f5c245564d377be61744d0a6db264741d50560469a055a1b8593fbf80ca2f99f819290043d4a68248d47f02432a6cad46b49b945835b230ad0630bf1fa12f698804cb07fafaac84ef483affffda64d7d23edfee1e35955111d1147682c9be955ffdc21298acab5c5b297e7d8e590db6f7a45e4b574cbbf30287fb72eca1a791319a4fd9b9dd8e3dd180d9ad7bbefcc28ab181d65ee89902c71ddcabe414cbfec469e8c6e7b11a2888d858cab007de7df4cd209354468918cd9196663192dd46b732e31235c603c46b00175bae3f536003a21eba94080cf5598533d633b5ba4aceee3d935aff8c6b960ab1f1f21f490c2b7d886377ef1f63d171f4b595e4001ea94a332c292fd6adc7870803e60a0f8a9d50607a2d35acef61f285ebc72479c4d4f7b73487caebddc99c65072eca60ec01543722e6423b02ebb527fbd4392ab3f3a617c89917813fe0f13de5712f80026acec24f31162b61da0a2781bc2676ef17c0eb9571c8b83b5669f22041134dc6574447832ec580337852fbe60a707747e4d4120050805fec5b36aef8d51729da48518bb27750752e7f7636d582edc45bb7cc45c6875fb80da53cdefcc845c4de6d75f593d59d06657dad71e7190551a471130215458df3b789228ab6530a8ab03af0f807228bb454ad9426e0b9dba26abcde8c2ce080b3c708e702057587db6e3078f1053ada7cb26bf2cad2c3cd54df2045b575b0f7a8925689d0344bb4655937c35fb3cfa8204a704cf7c0c8d74bfe5ba6c9e15ec26e38e46d44ef37da3466b28469a79828a99f08a4b2acb5b53b6ac6eaae47ff32d31f25b94d88aeb042b477c63e0f3bd414dd7dec80c23b22fb7f68cfeee7f2cc8e9d7d2638055aabcc033d7b563111f7fc746990f1f9bcba5a2c02dfa6fda46c53e19b150f6d7811d32d464bd76be286a36025679e47ab8cc83d79e08cfe97058872adc80e9bfd4ecad14cc948125ea34778ee0660f22bd7f6b4cdfc18f61eca9987ee73a1dde815cbd79f3e9e8bdc7ae1a03460c72326690e3ab6d68892e80ef0b28e7d7d1051031bdc8aac92f4f17b8abe7485c0dd9c4543e9ad148d7884d4bfe630f7b15d084f375d3c2246ab48992d8b251eb12af12b0fd75e07bfe05bc483b3d3c521b12206f223b24d0513faf45656fd70c4e40a2d85b06c14e633807463d35440c6e6ff9c90782677f1de6f8099f2e97cf700d04add6f380b772ff656a372f8bfe91bc16b8151fdef80d3482f7752adcc9f82c10f582f261ccc647958b3a1b34226972dde904d9ea698c2faf61adab492e3bb492060e2c2af0102e77de5bbfcc2dd0da70c87046be6e089a1be8ecd532b60d9581fcc9a75a9f97361290d2db5d2e4e5d216e8aae0851d8e3c5914b034206b99acd3627c23cc0e726c3da152529c0d0aeb2516b0375096af1da6e3e6ef8baf4bdc5285bc84ae41c351716d0252f073f149fa1e00bf834d44fb62b55f240c4cc22200144cf1b443e55e65d53af7ca9efc873f6040d98c571e5c010d88e20b85b804afdb1d42dbe07853e9934ff798f0c8f26190d28e5b3c1598ebf63781b49f1b5f5b944ef56ffff52b6565c5b96667ac49cc9536d1e7513024328350033b9a8a102aaaa49e9ecd0d0c142dc42c8faaab741240dddf76b02071c58deb5704324a5febe3709b9a87a3bd388d4376ece76ec4fa996f07618fecbb57e1a55c9cc6e5a63143d323003e935243c49552f83975569a59306521a267d826b1abc22f0db3b5db89a367f69c17053e309758a791a147408705182587226df276e11aeb6979114d6e6ea61bb45f68209215ffdc5a8c9d6fb7e775600e3710f3dd532a195a893a86a9324e7e1f5f2bf5bfe9383d6857a3243cbd1b8f726af46ab93ad06fba88b192ad46a15068027dc42131b0f482d146387b0b261a54664c81d41587a196963b55526d56e7317eff6f9859a9f580330bc37ba95be2bc8eabc45a50fe63929bd8b37f7ed3f4cb072272f50f61a66c2b25d676ecfc200a67b015a7255554d8633ec9a0025e249a4c746167c2a1060cc09d6bd69057cde004e8eafbfc6bd4574992ece5a5f6d03b9eaee48a75c72da57395e169e26041d6ed3b65b9c306254b06b09f394fda392e26d911e2f1ced495a2347e9c68138d96e1d84fb26f7e284626fcf756fbc9a4575305555b099f6832a2193c9eb6b5abb95fab25703852be6ff25ec40bbe0c8bfd118aa38f0e9554e00ba3bc7eef0213060d25b23cd6c32e5ff461d82124b519220b115b6f2f18cd3371cd837ced26b69814f0f09027cf1338dc424e9da44d1ffd5c3e0625bb2b8936d36f9430345af3e119f92994899174a0df8c0e4aefb3dd69119b7b957902caf98b1174df0e3b6e7eaf365178511f0ed1b31157730a389c558dfb71105d985c5ddf6e60588431d8adff58f0b5b6fb92ec73b16a6abafe862001f559c85850cffa583c07f0bb766af7d1a11d91bd1c51d4b2e760703b0868df98c4c79093782d7caef607b330a44e31281a812a80dd1ca1df8232a7eb9c7b12decc2ad8c1273051620fee9ba58de4b2879394a701880f75a372f50f25afaa95c4bd2318007851e1c7b04898446c8e792c9f467f169978fe22b4ff6d7f86573631ebf795e5c1ab8fe85b76022ae4b1ed6a5efc02ecfae8b8c96875a101670ec783394b3388b6bb2e49d93f35570fea9f66cb5aa13bf7c211ad307df3f270a4de667759673c4c0c8c70a740abbbf866d3ce9758c92732e8316cab0fd7b44083adda52db9206455dc03020d62863541165a35cc77dec1ff2f610d35d41e16841d87a4f2cb1a8b0e9f048c2c69649052bc798e91b8f7b1650707ebf7fd0b24509ce0e83c5d622bd0d4427262cd09752c22f3156e400fb256402f06603d1ca839ee8754f408603c21b35dffafa3ef07270f1014352be11744d77e1c365110e52cd516ec3d7258cb23037f35f963bf2eeee1ed77caaa2618444fdc739b0624540ceb791d912d077de3386641f2a1463aee3c73f61457b2d51ff1e18d5256da064a7cb04fd1682a48d26f6dc4be147e682957815d1e1c31ab208f79c254681bd008b01d9bbfd6df63fbd59a03dba903d39cb51dec5a38fd27e740310d70cfd2cd4d0839ef24e27725293f2af1d2b728dcda6fc444e3e35145c4cac1affce73b7b99181881ecbad24e47775d475fbb4869e216782ada651ce95af7ea1820f71baf1956f4cc4a487e33e1b284077e4a30509cd068d13b0aa146532ce8e10feb52e71bf2bf0476d99b634d198a1b85c4a7b8001a39d05ed4413ad53c1fc242e58a834d8d2c2c537ad6ba9d6b7e87373568b42cc3b8df4717812092c6f5ea91dbd72b59c827623bafe3999ca7fec5f1c4af8b66b305c9b138d6d79af07d0c780a27dad35ef50a711fc23a1bb70567a6754f3253090147984215275787afd2bb2c12787942e7dc7ec996f90be2173d3984206a6594899c181464fad9b78b718fdbca1ff0db5bf9720c1fceea2ebd62f0b81d943e2986eb204b6d7c64a0502c9f60458c349a1da820c25ff4341a72fea8f66251ee97f8f5721a4e691465f8f24c8454f7aa05a1f339581ca88fee21f5b27874a662eba05b2a28a8d10d17a1d8b5eb8d62386b74d8e87557137272619fbd3520c47ffb0371b04a88e548edf1e85657e912b658ecacdfc63cf007c2e3636575514ce402ea217756bc74d2f1fd8f57824d7718b7b80a27aa5bd9dd9f6375a28e009794cc8ea671e01e3c76a190f86d0647b941e779da687d1a47cefa9c52e85e4d715107e1c4e42ad65a834b403245dee643c2f7b0c355bc2aabc3e5502f6c3395899df540ff194bb0f614441b1104776e549634f217912aaf56fe539cf52436be520e49c6413af7be5f2bc567ce0b0030888491aaadcf5048e4be5534318b63ca18d24ae22ea8b84c534bb16b5e89be9a97df5f26bf9c196cbda125380ace6283f5ca1138096adc4cbfabef87ec0a214e489765302f5ba8d22d175f4c44a60f071c4a4cd70c72df3d3b679b80e8adb29f506a352b95f4a047cade72c49c8cf57f7256fc4bd2a80a76ce25bb2f69c56ef539a6fbfa5771f5b524d7c9668b9bdcf36b42f4972262f9620fd16623dcd7a01163972135544e28c7d7b3ba773eb4fc19a9f356147e87ceef0fae8239cd9af066e786b7e36f207bac0c99ca40c3fa8d174506bde6daada87881bab469fba3f374ce4d28a88b93c40275b4313f58a042bbd3661d67562b97fa0de72ddd9d3489b02508854e4496caffce26df866a25ec7e13e2402bb690d973ba0b0ace987a979de8e3c2b897018962203ffbe2cec697960adac97aa6d5789062eee3d39cba18c42c1aa6af4f22b20f1dddc734f611324debe43d44d2c349e45f16323ef62133aec203d3f3315f98377002665086077e31e210b49ac5a263cc58e55dffe61dcb46fde9b3254309d314e9aa8cdb7a578c46a797521760d51a565ca0d45d6dced98e7d215d1373d135088f434f9732b3a606548b4bbd6356c3cd6aa3d7bd785e3983016a4d81ad153813d24010ba8672d8060f538b759ec30bd1cad9e82fdd7da0a8b381603e9325978c0a466d1aadb59a29d3c71b1bcd1a9b3b0bedb29c3364e0e8ef26b85484fa43f6a37a3215fe6e3c12207cc8bb9c94b96e92b260e33e91cf90f21fb31083632b316424b7b19f2f5213fbca06f53b5091c3173b5fc94c1045e2e73f57ead0fcdb4458a35fdce2c0575225955d2f5939981731d22b33cff03fe767a013da0b22388ccf168a134b3a353513b7c2a6c4b529761a2838fddf68dfbd0a1abe473eace950cac266671f7857955fb84121e0a505a51f024bc94007a21354cdb48e884a4960c1ad204b6b55eaf941fc57fbfed7aa8af71fa142e9fb1746deacdaf0ef81a13e51d98525673b977ad737ad4fba87b7c3af16be2ca81a6b0b73040259380e99939bbf1074c47adf2990204d39101cf9449a7c29f4e21c583b7c40eca3aa0d3cb7e9f5566cb2114a70630df071375d7966eb0b79483698a170b21881c775ba624b80b668f70d714a6d87a0a051f7679852db65fb78ea5df2b5787cec29244eaaf1528b08d65169d6b9699a5598e76d9eb0390863c9ff2b96ea6991c7448c66a651474086a04d9f28b7a72e8bfb35a7eb575c1b9771d21863eaee37c14975c8826ab99b6d4d8a11ea511b60740dddcc6bd8a49b252814ad7512375cd966aed0ba3478a7ae1b3b3ffb0ca843f05160354c7c2afd4ac2ffd164f9b80c60ef761af30a2f379582d4cc9f94bd2df255983378295d436d0eb2bf3739f38eaa1577f9061662825c51cc09bf576b71ba4975b9a4a66ea37205ecb930f83327238518757ab2dfc9d25b63be8abf4d67657d5d98f9bdd7799183f9679443873a1a99160e5f1f66d2257c90baa19505fa70cec3335943bcb3dcca3028f9b34aef83f5e4355fef3790df44b4763aa7ddb5cbba7c04b08edf545e38316663b838302d412cbafb0fa14d633a3dabf53ffbcebf4f08844d5d8c333bff147af758fe9ceab7cfaeccf1fbe95cb6d96465a0bf8d6aa80cb96992fc7545f0b1098c426ddb2fed5ac2975ec6045e44b4025bc9d6c8a4a861758b92f30e5fb57f00dbe89dc7a5c6e0cd4b18ad48df4b359c814d1d7b9aa1b46cec8731ee5b519059934190fa2f7251db9d013dc3318c20aefbb428c6945360d32a598265e95d4512377c38d985bcd1b1ed0dc6a4e82173218eed37e922bfbbf00d9d5eea08abc367903b57fda42539fe2b6abca9670b23e3ce2866d7a0f0bd916551b93a0ab8c96b9a3cbe87a17fe600d691a9bd3e2d587efaedc2820060461a8b2dc3a1a178f0f7056503991b02e3e3ca5d98063d203dcc507faf5d902789acd973464bcf39e57907253c5cf18325d33a1e4b7b52c566aad61b2dd133368b1d892e904d012653fcc3bb7f8217b6cb912271a904764cc049f66a7ca75076ad6e88d7069ed7afd58e74fab8afc8eb34ada73e99d1f6657064e1396d91d7aa190e06502631f738a095baa076ba395dc989f9134b9b2cf562b344e1af1de8990c117e5423a93fbf2c6e18220fd5af039b5c40f87c05b969290d582e602e98abd58ee80e152f74c3094378722c31453e60a9167b2a6c10beba701d623d3f83fa4e77de477ee8dff968977c281f7df560e7d0cabc8ce1df034667d86b8613e8dc26268726ed726618f84e95aa27717d0a15f1c1aa21e7f7a19622df62fe68c8f539ccd858288250c23695bac0d7c97e4f4994cf2aa929edc0b13315f047ad463709dd2679023d79b06ae0deded9888c0a2a56389086c44ced7872fef9d7b6032f79be609d5009f94c89f35a31497d781aceacf77de80108cd70b72cdd70a0a96e03cb48bf429d7b8605e0cbb5e4af9ca117c509bd366ed7c6fe1244571acb410bc6f8d176426abcc73de789285187e0522a17a80aee5a7ec1f0e3ab1f7fde3e66e014b42f28e6590a56fb4d6162aa9e395ec4cf2cf54b4fa779674edc7ea49d6e837a783ea8488ff03f5d603490d1558393bcdfdfca159ea1c207885f2fa5fda4f16587238b18c45e2d83dfaa028ca2d67f0b7acb1c9935fc2301f7f4ba9bcbc06b9af3a326f611e1e9e6d93c93c11758c8092681d371bd85f25f00dcc46c1015d15d0911fa9f4b4db06e604e070bc64fb6169caf17a4844e39d3ca4ccd0efa930f91617d14bc64b2c915ab7d158bfd1a3edf99562af377bb50f371b38c6feac8424e8a034d1471d92a188478a7e41ef947052a0f2c1685a5ec2b1a66c08e5eb9d163d8e7201400a98a0ffd38ba2c917f07bb114ee0250eb2524f09abbcde8d7855bfcf44cf6430236bcb265571f1455e03c29909c9faf61bbc181120b72574627262e70792cc8149c015b475bfb19a6865aa98127ad20ce29306d624b5f1f9bf26ded991f6659a40f2f5d17b46514efb11f90afa868b03bf498392453f2e2bce86727f5eb77124e05ca41704640d5429f1d4aa3ef19661a8ad650e34f177ece60c059080d4d8149c39ab686569ce2aaff7943d992730a830f7584578fdbd3ebc98401a137e6cdeefe363838b3a2a56ea2ca66bdff94a20ef39affb210329181b356beb70545520cd5d9b4b6fcbb2407f97252acea3ed87f4218266291b9238c2a4eeda12f7ae2ef634e104c769d998216ca7392c91a65f7559e0108a636fbdc33a8eab7b545e4ff3da4a6f32fdb804f5c4c431ba0ed780d5214bc68399232a83774582743c696b89cc0ebd110ee1cb72fbf85991e0c2bd055801ae4d9484ec3c94ccf8c3f85190e64826fe955b55e4b04efe3e4cf406c0bea84c992a18af6d3640e88ab34ec92e69f4b51b7a715d2212dd768a019690f655d68d19a0805a7a53939124ee6f5b5e48b7de6bc3f9098fdb5facab6f973b5a1477c397aefe691c2099efb4fbdfbe99509f43c2f3f8452dfe1f63df92e7a0dbeecad2f2ee6012ccf33a627b33c7e2b70aae4bb7bef47dc6935ca79b085fb3094773b2367eb3b0e8d95c5a8c987fbc72d15170a3f966cd6308729a4a6e032033c781680641a0accab1e2682f7e0c19bbc3831d1b97efa0fba00b8bb99ece27370f16a6b4bd3926d4f98017d8b7a23584b34964dcc7602b368d82d2555a346b96677addc77573bed662d7862b576e7334a6223b6f36e141d06bf658bb5e47f405760322b46d37f63955bea7555f6065ac17a580d2eda371309d48759aa462bfd4067aac6730ea6391a9bdb0aaf00d7a5311c5e52a32259dc49466b2e5945f063ba34388c1b15b6900e8c1d8d6c90bb3b4e64e596024919bd4b331eb98fdf08e22b31dd59f9a791ef24c276fe1561a07f89666bee2ebc9916e94475150f9bc3e240db6a803f1ae34ad8efa474b9ffc8178a68e0ab05192f2b7a73389d47088c4a450b85838997a1404afec5cfcf9ad604a49203d1581048d1d8fa1d55a74c0da87171a6e1ed2f0f9f112460a7117a6aa267f4015f3406ff9cc475197d879e0301de7b2abe50b0cbf6cf55d3548f6104705be4b5216784db2effcd539a7956498ba4a2bcde46eaf08cc8baa5316d993b54599bd3b79201880e233c1473b196abc3d15da0b9cf5e51a82052bbf09af7c0e02290ebc360b63e713102ace0446810e80936f234af849dd6d5783cceaffbcc7e493d695c943787b51ff33a7d9ccbd2008ba86035673c8e8670d543ff3b2ba40387de9d7bc0419ebfa88e34058fdf39cf650c8a291446da83f976ee9bfbbe48385601dd0bcb5f2d85834fabe0fc0957338b04576ddd9d1c2fb8e65a36968d7c0e80d797b096603ab4436c3e980553c94808b4dc74e2e66afe93786afa9f2b7e521fae7730084b6ab8777fbfe6b7ba34a0504806f44ce87d02b9abe856a24baac924e6b1e9b0e4f666dfa8aee90d07135503bf628a3a8578b702673f98a8a81cd7833ccff398d692363c82a845516efd2ae4b9a74b72dd0ee69950113c59e61b31203d618882d73a7eba59f932a7b2aadcc971b743a65daed8b0c8d61d146358220844e4eb32302fe5ea871259374c57bb0f62195918a954ea74519530a6e960f38cfc57fe7dc575dc33697fef0ae3173bf23f359dab53fb25741ad295f2ced8924fb1902894e94e195920ea5596e49e05b3783abc3b946faae16c8ba8b3f9b1aa7aeebade70a9fd0b52ead76f176f355d7de239f77e63b038526144e1b49f6299c89fa3e18db1b3b0fbcccc40d0028c043e9783524c4b85fc6338fae6973f5293a55d9c118339777be91bfaa3932eae0f8d7525109a19bab187ca814a484ffce65f413a8ea22ea627f6ecc03a149f9254d45f9d5956e2083493e6f8aa874aeff7c6429d1a18335175c294377694438d3037b96e4aab9454f7dffef76b5813d31a5f377dddcc01e1ec860b88b5b67be6abb889d82da155739dd4860339d33e7ed7d2aa309646bef3390f43f8e1b8ee75468f9c89c8b798febe1acdd493858c3121e9d1e0c4887d9eccc200b7b6492656fd6e22786b6adbf49a0e11456da10afb1d3e896d10ff2c637c0add4e44b9d0156f599b4495ead0c91574cba37c422e5b67d3857e9b035c232ffe1173a387544f1d3735193e00d52bcd0a08402691955c0ec3576209bdb30d4b3dab09d2cf1731e9f36820ffafe6f1e958239fe606a4adde758c5a2fabd59f2a143aa9ff8e5f9b4b8e06eff7750c4d3b2e9f785f332ee74db963c0aad8565fb8f43852a2bba1c04c401f6ab2cbd33beef28da3d399ee4ef17bc8ec2edfb5a6d666e70a6038b6c92c3501c901b1e56510d9059d2f94b7c3e098f9237f62839dcea1dfd1df8daa3919321cdf69efa80b3c2c1b106dbf0bd644323911b0ecfacada1cb3ced99dc03a21781699af040c49cd45dd6292840951e0171922275a557720613e73638a7f0867090293a965081048cb13d17b76f5136ce638c70646157ee7e447a33ca6019d0d778f773ac2d14df176dd1f497cb0e8b7a97e4f71da1874db722b19dec913732aebac806c797798cbe1feec74a86c2f538e8125407db0b2e6edfd2f1b02d05c43e508641338204e633f278a92d1e4baa33db9b892d0c42e509ffba299949cfeb39d47220e65c0b47505d2639c92fa91afaaa31a11bc5d31db74782e1595ceed4b699e259df053642cb27feae1a5a6883c54ca9b5efbe8b802f94a14343ef10a1040649e29b9b886475942b32c57f68e7434d8756641d3d5b101dd36e09483e93bfcb4f25fc7c515779489b8c0a000a9980f21a50dd14c9b2c5d8c396dbde7a69d6d20e95f114996bbab845ac2944f9a81fc5ac476cbccda30e85acfc5c04b84f566b47dac340206744e800a7f4f54c4a7ff3b2f9af933d57ce277b334ad22f686d5603632bb7e2f08a8258ae75eff36b0d97f3d3613ff39f8730936513b8cd07542da0763942b20e66cc32fbf91600cdf92e7fc5255a6adbc1a3bfb6707d19a4c9f61261ce12387ec59d44ea032d10a282f038aa4907eb6fe8f317a89ae74ea6c1489dc3afa1d7d770e1d57d3db0a154ae981469129646f31821e1dd4cdd32d9bbb53044a9a84a52a97cccd41ac38d56075472104c6041a0776fcb067037f3a9117a7ad4c0e08210a35540aab1fe1c3d27535b8d0453ecbc2467a67d9b70b1a8006b7968a776532b04e6f688082651ad296d0b302c7908fdefe09320a67be5775025929120a509dc7dec726c8a0e82aa664a40972ade66cef98ada9cd14c77a11ff055d136c7fe89d3df498973dd5464586c80eb0e53e0e48370eef6faef20dcc95ae3b449920005194bc928290b0bacfc49e12a676f1f23c4cc1bc33dc6cbd86358fa9a30aa89eb2483c3cd6b83cca79891d0160de91d4ce57d5904007ef581d439586c80bbf1ae709f57f55db82553ae0bc18e6d47c2fcae7afd536b90ff52675d0133120dd85612fd7555cbc558343ea08806b1bcf3b7787f2c613080c4e2841489bfb180deb1b60cbc8119699b036dc0f1194c1a4070e8b91d30b7c47ec61e0bb6da86eb29c3ec1ad236aa1232a6c9abd2a1cc47c82b75c9f54b2b8956e9ba3aa11f82c98c1465d2108d0ceb71f527047a1a8160b84aa5fd28eb6f4f477964c3361cc1a20f5f9d0b66b5a8ced1f1fa37f868c513e6da1abe9fff7fe66434276703f6cc0612af0bf5f60f248735019c3140f05281e269d7f002ea6928ec0e8c18eb725b5351134a9ae9f7a6b067b2308a48145576b9019586725c23a80cbc830800c9ad1b9232f6ca0358eaeb361ffff7846fd261068ad6baed747b3dc550b416835fe3ce67ddfc698ef683804c227cb2302f6d82e85c5512f88539404f613a0ff0d438354ef7e52a28a36b98f66a805dd74484d6f3f73f0dc28edf76f3a7430a6130315154cf2550d953ca377bd83fc5df978058357fc6b714a52bf116c630b485916cfecc2b9bbf1b5ab4ccf26da8d1fa2a115ce51e09ae1c07596027f971273d977d42a8bce76daa6649e31da51709cb1cc5bdf9f7a8d25904f8f384531cd881e57b93cfee106e48f53946be9de00526872b46a40ec0abe3a6992b4f52c12643dcf8c0f4d4185eddad2f9d257eed1f49c18340871ff32de637892c5fa825e1227edad6f21dc5f808e08ffb44ac4e275f100925456630effb7e03f091cc7860c9698abd34b56171541edb31bb515a34b84a8d89ea0fbfbe7b2b8c88ddc963f8fa39da45aa99f3aa5693210f20cd848808dcbced3f730f0336b338456233bf5ec5b21df1a2a09f2379a8595ea637fcba01c7f6b765e330554e1966ab7219d004e855df754f5f0f1df247b8e9be7a1aae56a3fea12b3c4f376625b3c1bd50acf0da503314c38bf2c6cef380265fb62879c94d97a552f24fa431ca2a44f6c9c9c4baa2ad1169d3e95c75b29ef3c2922609cd4e08d7f38c3f996f79ce3353a6b79291b3490983a6b54126935b683f1e85e384909f2611f7f127149251b84c741700dc09372ee75bd35cabe2f4d78613d190d84b950159e0136fde672b03a1a3819679202df50d2e72a780e18bd1941bdd9d5284e0f3ad5ed2bfb8fabe287ca2f17267ca7a91cd73f15d2f7b4b9e40a0642c9c03adf2b2d276a2fd0e17991e6f9de0f7258e2a47c69f2544cb02aa8248f320f5967fc5a27cfdd3e1ab7887f2cac10640e1c872d29d01118aa37ceff8b9c7ce4522338891f168bf5c0b5322e003c57d679d9b5f4328f69a05c8fae75e1c7d893a96d759285341473fda21d0e33df6e7e01fd7f8b8fee4b6a3f168bb18e97175f19dbcf56a70bd985612d8e545b6c006c80202e53a1a2742bec72b68c03b36e7a08e9fff36973cb7888cbddc139d3bcff7f9bfb24fabf5de213c293790a9f878e43df13a17dc5828188f51b750bb7373cb932d85da51f8b23b37258e1c2fdb2a823986fcd4149e0d90b8a81b8fd59029b28d27e207e0cf2d4597c1ad425ccc655809a5e6bb1d6345509ed6c8af83685cd76b20de12c3a8dd23f6fb30263553f86d481f91f3c1d43b596ddf7eda69f5897a8ce6b2d080a9380bbb5af7eb3285fcb23d28eafb7648fb2065da3e52c8dbd0fd2bb195e87c2ebeaf72183e521347c2d69ce72ca4bef390868bec18586fd0d77282a92d7ac9f75b3bf58944485a236632f7d22b93984eae51fcff4f452829ea085fcc3fed18399f67240a8028fc578f8fc99b3e896fb845dd593a493e9706a174d89c0136e51df4e04b5a04c4cfca4130a830264fc3f3b7519bb81ccebccccf3a50a666006b264db55c68efd0a03e3c821b4e0aceed5eaea23a70d14956dabb9596674f2caba60f70e50d2733d8c1da23c7c6508eb6e16058377a07abb5056220bc98597969e33ce10d12cbc07cbea15f0195849a22629163755f829fad8227edc54c0a10039680330e490803ad441b8195afdd1ee7f9915f0b6daf48e8d88f46697ea697857a209d8b2c36a8dd89537b9454f23cef2d20258c08cb519dcf557d163a938db68e7058b6c6251380e69da1e751640fa32c12351aa0fd67b7662a65a3ce96f18b417bd6730a57bedc6c020fb2d9f39b2476afca83e7ac3eef594bdbc842b12f2838effa939b2952371af51144b1fd836bb63594501869dccd34f516f26f5251a3b05172eab489da8b4102b69276cc72c4a35502bdf92ad5d857616cf4dc9f919af32c2885aa928b9a8f432316f80101611772def843dd4be19d7bdaf083599b2a9a792bda771f4f4f646d9504fd3c29f8564c616e8820c48bb41898fa309168dde2ca94a0d45c84f950e632cd658c04fde9fb4b8c5ad242713137a21ece27c0fe739c197268e6a6528a158ae88a7eafc34f8ae4fe0f7cd04ec2e33dfe7b042a965e0f05fe2e3ac30f9f33698912aff56edf5756ec081b01b2816cdf34169b6064e69486e87fa0cdc7ecf330a65334fc7d7f7bbf08164466d956b0cc62cfe798fb4d6bd3bc4a429d5eb1d196177aa2ae5f31ae21dd3e7cc524da63a556858c0ccf6b3e0616be091f585b318f4f0c2a8622d0d9684dda67c3d28808495e8efd62b1f0fdae157e961c6c5bee6ee63b90cc61f612088800418609c3b197b7409d7bcd8a53369b4a9bc962548ec50fd3b752c88c6ae41785545617b49da4052fe9ed173899f98271e065ea8cf4d70400128a08c99e153a78efd9a24075b531e71ad876854bb22c3108229a55704627927535b43cdf4a438f046fe1785811347acc2004a91e9c60aa87ed660228f145f29e65e0f774d674a6869262aa14ade1588c4be8f198bf8e7df619b0e4331a5931a2e8b1246bde1938685266c8d6c4913cd5c6d5a278587c789176dde4bcd4390246123c8eaf7230b954f15d7b3ad89df310271a52276afe7a875509432a7658e6b96206d93e5b28056df1f10c9c4a35f40c1131f30290e7798e61d197ca0ea29d9edfa23bd269cc68b022a0236e2bf6d49f288641edd012ba7bb40c130ed612154f0ff101d43a924d06f9199f55b9dbf5a834d251957537db3d7d817be1de33bff93a56d72c9b3fb6f8a9050ec425bcd7666dc4677e954295c61d47743991acee7e796bd682080daa5fa12e314287337674ea0c0394b1e3660d8a3aec378fc8e2e1a159bab309bc2e3dc4a32744c9bb7672d2cc8f193059797683c8614abd3f9f8be9d255fba4cb3fbcd5023a3ab1118590b6b93c65d2440fee25409e92a246622edac62103c7bfaaf22feff70e956d64528b7c4f91e84197524a77807e68bd0a3933a96b488f8f02e5220b6577dc672b9a8b7d6ddf90ff6b585bef46708062b14438a4f3e950239e533a6313fa39afd4952307c996e359629da872755c30fc16b39a6a94cfd862ca86fe13b979b0ac6735ece74be12072ac15941fe6b0337f0ccc2e57c38a764390141847b855015c8b02bfd97fe79ba4a90a58d5ee2a17a734772ce4131d9323b4d5ce1d8df2c339489d7f862320c62357ff37c1b09f627f6f116599b51905402812a45651aad8e420bfc1ca5c31d9046a48bde485f2d326f1c775904afa48790dbc0ad56e1062fdaf4c88dd82645ff648baa453deadbcc18be9f94a8539650df746d13a85db47d45c8268a7c1ccc7c3a4245fa8eebdfdc0b172dc360201002afa077fa07fa5543960a82f81d81417f8d7c3070c3bb5dab0128a47838f2c43ac7ea4bc75b73afbab9fa42ee0deb10b93aaea0059bc38468e3e2b511833e5ebb0062645048c6106044866ed52d331a21fd90e9d2918d1e2b9e60110c6d1dfed8cab1a7e913ac3c4bd681493d398a0fc64108f7971c30184b5b202e69750f1d53140c0809a974341550e5faef1392a266c18333a19e48eafc6252138c7bf610aa440efee6ada47e619a1be9b9e89dbef8df1aab0446daa2e7f3ac9ceeed93886be8b63f56295bd43bde11be741238fb5754ef749df2962088c089adcb47612f1cf5a868e4c0a0c2437ecb5759da41989899951f96261d31343dc131de60243f48384e06faa87baac8da66ac6323a104f3c1b9013f79d9712befaf860c639739de3ab7f6f1376dd99cb7f6c8aa42fb0d0f2dc586b708bf2b8af0e681350663125e913f7c8f2cf03d566acc35f09bf46680fbb699bdbc06d2af725cebcca87caba9553d5fde4248360dde795a78dad54241cce04425902deab8aa6de34fea7ec003a8b9e94a1c82eb83ff19cf2ae9a5ddf59d6f5e0e96ade83eb8a07072fe4b497b26c09843f98a89d10719a4899c886240f395a527055b3b6a8f208bba4cf495dd8b04c5c4f684331929d638400cb8b4927368e7a2365753cdd5f206545a022cb412ae27176214efaaecc0578b9dc9b87610aea8dbe799a94c6ea88bf5ab3945534addd3f63d76856a0360a1eb505abb4be88ef6b571e8a692453f7b3c6e6051d5cc27bf7715af743dd6b6067ec7fb3e13219833198286ea8315faa6f367a606d8148972617d044f9af75f9f62e7db95fcf329273a8d3a328047cf1d25686cf6a696f5127ec71cdc7d5e1ecb212d8fa94f38a7c84d5cb5730f0a4ff8f70b4f41996092cff2ddd991ab30e22ba1ac0144ca776facd476ca07cb50d9289a234e9faf84926e322d271368682f3a0d403c7c80a04c48788742fd29c567806640b7f1bd8d1dd961d92edd846aead2d9f4ad6c6363b35ed5e7f872c32194fa6ff03d3696f2bf78f055e4019146b144ed1ad63be7c3022dec556cd8d2f3a0bbfe725ae304de8affffa097e7f8e2a91bbe59eb6cdeaa4246cff640dcf9824768418535effe74534331242e689734fc393ff38a8f3e88b450112ef26eb58df6d45d4c677aed1e7cfe1e5a681bb5f72aeace6b762cc72408cb004ec049c1cf4a31701068a1c7058cd2f0e98df911627bd791a85817cc503906256240fe4f830ebcc290ce216dfe5b6331d3cc612098e39b821e314b37858a40d1268f31f23bdb75ea64a5bfe3cbbd9284ea4caa57bc27ed3501e2419aa407e5f7b7a5dc7c64566f4abeaffb54d094357eaab85314c953a520eede2f4bbf2784b3cee19c5420e2d5a6a8b86c313605f16731ab67db8c8310290332d36e5db455da9a7c72de8a95c3794eb85614ba70eb39cddf29dc8971f253c73b14c073bda91d88f8acf246aaedbec7e3baa71bd7dbb6a9e2e610340374fd4f9a0e9ca8f3326126e07545f7ec6e32826f96837657dddbed096f2e9b488fe98165f70d23d3e8602ffdad9480a7dcec031ef6b62061c3121f284b609fa8c8f06c7a4a53324338e65db9af2a4607d2e2977ab4ef41ff93304539c9c0aa831dbbac328a5484a08366000000000037b10700000000002a7315c8ddfc25dc2266a6b221cb8f9fdf641970ab1f65a2754df4e14c432b9c446c604131913bed45976c4a8ea27df843a72d622f80ef15da622f0d56ec1ffe3021190177b0405c4fa1a0311a493c4dd095f24d386be6a03f5838a6b1008665f4000000f5c98fc152bf40e1ce216c8839b8ddd42ea5b355f0b5c700fc9b2cb7c802e1c8336488033fe5f3ef4ccc12af07b9370b92e553e35ecb4a337a1b1c0e4afe1e0edb56114e00fdd4c1f85c892bf35ac9a89289aaecb1ebd0a96cde606a748b5d71a533e05d648cb9635382f38b778dc3c76b18e4eab2d017fdb24c1c0e32d2991707a45ce3f26e443dafa697a76bf24122c9b19b57eebe798668dbd1a0da7c900795222290dd7278aa3ddd389cc1e1d165cc4bafe5c658153cdef5850f97c4d4fb6706b82310414a00fe7dc34b3043e0c7a8a24e810e3cec9de3e1dd7ce06bc191efd2273a357da4436fc4bf82069f6cb87d3d605aeda1336ac513f358b4296b8da51232896ad271063d93404eaa6b80960fa2d4b41d74a544eef94731f0b83ba2701e33b49e3191098c3369bc4658d82f536cb9d38285c51c7844292ced06dd2e8148f0bcd585dc1104e64aa930045e83d828ab436a0e587637e5ef83044d1c2918da284d7072847132885d443640979907485847368e32501345b0dc24c904c06732cc17d944b26181b0c05c6461bccbe4f7b2180a282b6871aa6472fa36cdc49ec50cf69d3eee4b26fe02bf48f39efb549d3963d19e4112c7250c580543516204ff1b0675680cfea02ac09f0b23d6e28c14b08421b3a10a9788442457d732b120c5c466c54ad938dedd3cd3701d9b32fa15dc8db3d6b1ea5d8495732477a72b34efcaf8c349aa40d8e1f21f226ca11182cff00921930b010000000080c3c901000000009104e90000000000d75b9464000000003802000076ab1c8604000000000000000000000000000000000000000000000000000000844f7a7e7585362114fc88a70654146215ab4eaad65ad54b64975840b78d365e8b75e78616a92294e747589c3ee4a845c2962e1cf6cd7fe8bfbd09439e5e6d5e4d4efdf181473803e734d97891388e1b50628658ac818599cf2cb069c8e6b38b6265617665726275696c642e6f7267"; - dyn_async! { pub async fn run_rpc_compat_test_suite<'a> (test: &'a mut Test, _client: Option) { // Get all available portal clients @@ -218,7 +216,7 @@ dyn_async! { panic!("Unable to get expected amount of clients from NClientTestSpec"); } }; - let content_key = serde_json::from_value(json!(CONTENT_KEY)); + let content_key = serde_json::from_value(json!(CONSTANT_CONTENT_KEY)); match content_key { Ok(content_key) => { @@ -242,10 +240,10 @@ dyn_async! { } }; let content_key = - serde_json::from_value(json!(CONTENT_KEY)); + serde_json::from_value(json!(CONSTANT_CONTENT_KEY)); let content_value = - serde_json::from_value(json!(CONTENT_VALUE)); + serde_json::from_value(json!(CONSTANT_CONTENT_VALUE)); match content_key { Ok(content_key) => { @@ -278,15 +276,15 @@ dyn_async! { } }; let content_key: Result = - serde_json::from_value(json!(CONTENT_KEY)); + serde_json::from_value(json!(CONSTANT_CONTENT_KEY)); let content_value = - serde_json::from_value(json!(CONTENT_VALUE)); + serde_json::from_value(json!(CONSTANT_CONTENT_VALUE)); match content_key { Ok(content_key) => { - // seed content_key/content_value onto the local node to test local_content expect content present + // seed CONTENT_KEY/content_value onto the local node to test local_content expect content present match content_value { Ok(content_value) => { let response = BeaconNetworkApiClient::store(&client.rpc, content_key.clone(), content_value).await; @@ -554,7 +552,7 @@ dyn_async! { panic!("Unable to get expected amount of clients from NClientTestSpec"); } }; - let header_with_proof_key: BeaconContentKey = serde_json::from_value(json!(CONTENT_KEY)).unwrap(); + let header_with_proof_key: BeaconContentKey = serde_json::from_value(json!(CONSTANT_CONTENT_KEY)).unwrap(); if let Ok(content) = BeaconNetworkApiClient::recursive_find_content(&client.rpc, header_with_proof_key).await { panic!("Error: Unexpected RecursiveFindContent expected to not get the content and instead get an error: {content:?}"); From 22557d0f4867c320eb682979639a1cf856f399cd Mon Sep 17 00:00:00 2001 From: Kolby Moroz Liebl <31669092+KolbyML@users.noreply.github.com> Date: Thu, 7 Mar 2024 18:55:32 -0700 Subject: [PATCH 212/387] simulators/portal: update hivesim-rs dependency (#1034) --- simulators/portal/beacon/Cargo.toml | 2 +- .../portal/beacon/src/suites/interop.rs | 51 ++++++++-------- simulators/portal/beacon/src/suites/mesh.rs | 5 +- .../portal/beacon/src/suites/rpc_compat.rs | 29 ++++----- simulators/portal/history/Cargo.toml | 2 +- .../portal/history/src/suites/interop.rs | 59 ++++++++++--------- simulators/portal/history/src/suites/mesh.rs | 5 +- .../portal/history/src/suites/rpc_compat.rs | 29 ++++----- .../portal/history/src/suites/trin_bridge.rs | 3 +- simulators/portal/state/Cargo.toml | 2 +- .../portal/state/src/suites/rpc_compat.rs | 29 ++++----- 11 files changed, 116 insertions(+), 100 deletions(-) diff --git a/simulators/portal/beacon/Cargo.toml b/simulators/portal/beacon/Cargo.toml index fc2094145a..d38d620c6a 100755 --- a/simulators/portal/beacon/Cargo.toml +++ b/simulators/portal/beacon/Cargo.toml @@ -6,7 +6,7 @@ edition = "2021" [dependencies] ethportal-api = { git = "https://github.com/ethereum/trin", tag = "v0.1.0-alpha.22" } -hivesim = { git = "https://github.com/ethereum/portal-hive", rev = "8ff1e3d3c941dd00d56dacd777a5dfb71edf402f" } +hivesim = { git = "https://github.com/ethereum/portal-hive", rev = "0f830ea8999f2878eb78ef67efc9f80cc888413e" } futures = "0.3.25" itertools = "0.10.5" serde_yaml = "0.9" diff --git a/simulators/portal/beacon/src/suites/interop.rs b/simulators/portal/beacon/src/suites/interop.rs index 37d4b831cf..eeb11c18b6 100644 --- a/simulators/portal/beacon/src/suites/interop.rs +++ b/simulators/portal/beacon/src/suites/interop.rs @@ -8,6 +8,8 @@ use ethportal_api::{ OverlayContentKey, }; use hivesim::types::ClientDefinition; +use hivesim::types::ContentKeyValue; +use hivesim::types::TestData; use hivesim::{dyn_async, Client, NClientTestSpec, Test}; use itertools::Itertools; use serde_json::json; @@ -21,16 +23,19 @@ const BOOTSTRAP_KEY: &str = "0x10bd9f42d9a42d972bdaf4dee84e5b419dd432b52867258ac fn content_pair_to_string_pair( content_pair: (BeaconContentKey, BeaconContentValue), -) -> (String, String) { +) -> ContentKeyValue { let (content_key, content_value) = content_pair; - (content_key.to_hex(), hex_encode(content_value.encode())) + ContentKeyValue { + key: content_key.to_hex(), + value: hex_encode(content_value.encode()), + } } /// Processed content data for beacon tests struct ProcessedContent { content_type: String, identifier: String, - test_data: Vec<(String, String)>, + test_data: Vec, } fn process_content(content: Vec<(BeaconContentKey, BeaconContentValue)>) -> Vec { @@ -98,7 +103,7 @@ dyn_async! { always_run: false, run: test_offer, environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), BEACON_STRING.to_string())])), Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), BEACON_STRING.to_string())]))]), - test_data: Some(test_data.clone()), + test_data: Some(TestData::ContentList(test_data.clone())), clients: vec![client_a.clone(), client_b.clone()], } ).await; @@ -110,7 +115,7 @@ dyn_async! { always_run: false, run: test_recursive_find_content, environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), BEACON_STRING.to_string())])), Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), BEACON_STRING.to_string())]))]), - test_data: Some(test_data.clone()), + test_data: Some(TestData::ContentList(test_data.clone())), clients: vec![client_a.clone(), client_b.clone()], } ).await; @@ -122,7 +127,7 @@ dyn_async! { always_run: false, run: test_find_content, environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), BEACON_STRING.to_string())])), Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), BEACON_STRING.to_string())]))]), - test_data: Some(test_data), + test_data: Some(TestData::ContentList(test_data)), clients: vec![client_a.clone(), client_b.clone()], } ).await; @@ -172,7 +177,7 @@ dyn_async! { always_run: false, run: test_gossip_two_nodes, environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), BEACON_STRING.to_string())])), Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), BEACON_STRING.to_string())]))]), - test_data: Some(content.clone().into_iter().map(content_pair_to_string_pair).collect()), + test_data: Some(TestData::ContentList(content.clone().into_iter().map(content_pair_to_string_pair).collect())), clients: vec![client_a.clone(), client_b.clone()], } ).await; @@ -182,7 +187,7 @@ dyn_async! { dyn_async! { // test that a node will not return content via FINDCONTENT. - async fn test_find_content_non_present<'a>(clients: Vec, _: Option>) { + async fn test_find_content_non_present<'a>(clients: Vec, _: Option) { let (client_a, client_b) = match clients.iter().collect_tuple() { Some((client_a, client_b)) => (client_a, client_b), None => { @@ -224,18 +229,18 @@ dyn_async! { } dyn_async! { - async fn test_offer<'a>(clients: Vec, test_data: Option>) { + async fn test_offer<'a>(clients: Vec, test_data: Option) { let (client_a, client_b) = match clients.iter().collect_tuple() { Some((client_a, client_b)) => (client_a, client_b), None => { panic!("Unable to get expected amount of clients from NClientTestSpec"); } }; - let test_data = match test_data { + let test_data = match test_data.map(|data| data.content_list()) { Some(test_data) => test_data, None => panic!("Expected test data non was provided"), }; - let (target_key, target_value) = test_data.first().expect("Target content is required for this test"); + let ContentKeyValue { key: target_key, value: target_value } = test_data.first().expect("Target content is required for this test"); let target_key: BeaconContentKey = serde_json::from_value(json!(target_key)).unwrap(); let target_value: BeaconContentValue = @@ -274,7 +279,7 @@ dyn_async! { } dyn_async! { - async fn test_ping<'a>(clients: Vec, _: Option>) { + async fn test_ping<'a>(clients: Vec, _: Option) { let (client_a, client_b) = match clients.iter().collect_tuple() { Some((client_a, client_b)) => (client_a, client_b), None => { @@ -315,7 +320,7 @@ dyn_async! { } dyn_async! { - async fn test_find_nodes_zero_distance<'a>(clients: Vec, _: Option>) { + async fn test_find_nodes_zero_distance<'a>(clients: Vec, _: Option) { let (client_a, client_b) = match clients.iter().collect_tuple() { Some((client_a, client_b)) => (client_a, client_b), None => { @@ -351,19 +356,19 @@ dyn_async! { dyn_async! { // test that a node will return a content via RECURSIVEFINDCONTENT template that it has stored locally - async fn test_recursive_find_content<'a>(clients: Vec, test_data: Option>) { + async fn test_recursive_find_content<'a>(clients: Vec, test_data: Option) { let (client_a, client_b) = match clients.iter().collect_tuple() { Some((client_a, client_b)) => (client_a, client_b), None => { panic!("Unable to get expected amount of clients from NClientTestSpec"); } }; - let test_data = match test_data { + let test_data = match test_data.map(|data| data.content_list()) { Some(test_data) => test_data, None => panic!("Expected test data non was provided"), }; - let (target_key, target_value) = test_data.first().expect("Target content is required for this test"); + let ContentKeyValue { key: target_key, value: target_value } = test_data.first().expect("Target content is required for this test"); let target_key: BeaconContentKey = serde_json::from_value(json!(target_key)).unwrap(); let target_value: BeaconContentValue = @@ -422,18 +427,18 @@ dyn_async! { dyn_async! { // test that a node will return a x content via FINDCONTENT that it has stored locally - async fn test_find_content<'a> (clients: Vec, test_data: Option>) { + async fn test_find_content<'a> (clients: Vec, test_data: Option) { let (client_a, client_b) = match clients.iter().collect_tuple() { Some((client_a, client_b)) => (client_a, client_b), None => { panic!("Unable to get expected amount of clients from NClientTestSpec"); } }; - let test_data = match test_data { + let test_data = match test_data.map(|data| data.content_list()) { Some(test_data) => test_data, None => panic!("Expected test data none was provided"), }; - let (target_key, target_value) = test_data.first().expect("Target content is required for this test"); + let ContentKeyValue { key: target_key, value: target_value } = test_data.first().expect("Target content is required for this test"); let target_key: BeaconContentKey = serde_json::from_value(json!(target_key)).unwrap(); let target_value: BeaconContentValue = @@ -483,14 +488,14 @@ dyn_async! { } dyn_async! { - async fn test_gossip_two_nodes<'a> (clients: Vec, test_data: Option>) { + async fn test_gossip_two_nodes<'a> (clients: Vec, test_data: Option) { let (client_a, client_b) = match clients.iter().collect_tuple() { Some((client_a, client_b)) => (client_a, client_b), None => { panic!("Unable to get expected amount of clients from NClientTestSpec"); } }; - let test_data = match test_data { + let test_data = match test_data.map(|data| data.content_list()) { Some(test_data) => test_data, None => panic!("Expected test data non was provided"), }; @@ -510,7 +515,7 @@ dyn_async! { } // With default node settings nodes should be storing all content - for (content_key, content_value) in test_data.clone() { + for ContentKeyValue { key: content_key, value: content_value } in test_data.clone() { let content_key: BeaconContentKey = serde_json::from_value(json!(content_key)).unwrap(); let content_value: BeaconContentValue = @@ -535,7 +540,7 @@ dyn_async! { // process raw test data to generate content details for error output let mut result = vec![]; - for (content_key, content_value) in test_data.into_iter() { + for ContentKeyValue { key: content_key, value: content_value } in test_data.into_iter() { let content_key: BeaconContentKey = serde_json::from_value(json!(content_key)).unwrap(); let content_value: BeaconContentValue = diff --git a/simulators/portal/beacon/src/suites/mesh.rs b/simulators/portal/beacon/src/suites/mesh.rs index 3e8811f2a6..84d6d858c7 100644 --- a/simulators/portal/beacon/src/suites/mesh.rs +++ b/simulators/portal/beacon/src/suites/mesh.rs @@ -11,6 +11,7 @@ use ethportal_api::{ BeaconContentKey, BeaconContentValue, BeaconNetworkApiClient, Discv5ApiClient, }; use hivesim::types::ClientDefinition; +use hivesim::types::TestData; use hivesim::{dyn_async, Client, NClientTestSpec, Test}; use itertools::Itertools; use serde_json::json; @@ -69,7 +70,7 @@ dyn_async! { } dyn_async! { - async fn test_find_content_two_jumps<'a> (clients: Vec, _: Option>) { + async fn test_find_content_two_jumps<'a> (clients: Vec, _: Option) { let (client_a, client_b, client_c) = match clients.iter().collect_tuple() { Some((client_a, client_b, client_c)) => (client_a, client_b, client_c), None => { @@ -164,7 +165,7 @@ dyn_async! { } dyn_async! { - async fn test_find_nodes_distance_of_client_c<'a>(clients: Vec, _: Option>) { + async fn test_find_nodes_distance_of_client_c<'a>(clients: Vec, _: Option) { let (client_a, client_b, client_c) = match clients.iter().collect_tuple() { Some((client_a, client_b, client_c)) => (client_a, client_b, client_c), None => { diff --git a/simulators/portal/beacon/src/suites/rpc_compat.rs b/simulators/portal/beacon/src/suites/rpc_compat.rs index 79329bb6c1..44c664912a 100644 --- a/simulators/portal/beacon/src/suites/rpc_compat.rs +++ b/simulators/portal/beacon/src/suites/rpc_compat.rs @@ -7,6 +7,7 @@ use ethportal_api::types::enr::generate_random_remote_enr; use ethportal_api::Discv5ApiClient; use ethportal_api::{BeaconContentKey, BeaconNetworkApiClient}; use hivesim::types::ClientDefinition; +use hivesim::types::TestData; use hivesim::{dyn_async, Client, NClientTestSpec, Test}; use serde_json::json; use std::collections::HashMap; @@ -192,7 +193,7 @@ dyn_async! { } dyn_async! { - async fn test_node_info<'a>(clients: Vec, _: Option>) { + async fn test_node_info<'a>(clients: Vec, _: Option) { let client = match clients.into_iter().next() { Some((client)) => client, None => { @@ -209,7 +210,7 @@ dyn_async! { } dyn_async! { - async fn test_local_content_expect_content_absent<'a>(clients: Vec, _: Option>) { + async fn test_local_content_expect_content_absent<'a>(clients: Vec, _: Option) { let client = match clients.into_iter().next() { Some((client)) => client, None => { @@ -232,7 +233,7 @@ dyn_async! { } dyn_async! { - async fn test_store<'a>(clients: Vec, _: Option>) { + async fn test_store<'a>(clients: Vec, _: Option) { let client = match clients.into_iter().next() { Some((client)) => client, None => { @@ -268,7 +269,7 @@ dyn_async! { } dyn_async! { - async fn test_local_content_expect_content_present<'a>(clients: Vec, _: Option>) { + async fn test_local_content_expect_content_present<'a>(clients: Vec, _: Option) { let client = match clients.into_iter().next() { Some((client)) => client, None => { @@ -311,7 +312,7 @@ dyn_async! { } dyn_async! { - async fn test_add_enr_expect_true<'a>(clients: Vec, _: Option>) { + async fn test_add_enr_expect_true<'a>(clients: Vec, _: Option) { let client = match clients.into_iter().next() { Some((client)) => client, None => { @@ -330,7 +331,7 @@ dyn_async! { } dyn_async! { - async fn test_get_enr_non_present<'a>(clients: Vec, _: Option>) { + async fn test_get_enr_non_present<'a>(clients: Vec, _: Option) { let client = match clients.into_iter().next() { Some((client)) => client, None => { @@ -346,7 +347,7 @@ dyn_async! { } dyn_async! { - async fn test_get_enr_local_enr<'a>(clients: Vec, _: Option>) { + async fn test_get_enr_local_enr<'a>(clients: Vec, _: Option) { let client = match clients.into_iter().next() { Some((client)) => client, None => { @@ -374,7 +375,7 @@ dyn_async! { } dyn_async! { - async fn test_get_enr_enr_present<'a>(clients: Vec, _: Option>) { + async fn test_get_enr_enr_present<'a>(clients: Vec, _: Option) { let client = match clients.into_iter().next() { Some((client)) => client, None => { @@ -405,7 +406,7 @@ dyn_async! { } dyn_async! { - async fn test_delete_enr_non_present<'a>(clients: Vec, _: Option>) { + async fn test_delete_enr_non_present<'a>(clients: Vec, _: Option) { let client = match clients.into_iter().next() { Some((client)) => client, None => { @@ -424,7 +425,7 @@ dyn_async! { } dyn_async! { - async fn test_delete_enr_enr_present<'a>(clients: Vec, _: Option>) { + async fn test_delete_enr_enr_present<'a>(clients: Vec, _: Option) { let client = match clients.into_iter().next() { Some((client)) => client, None => { @@ -469,7 +470,7 @@ dyn_async! { } dyn_async! { - async fn test_lookup_enr_non_present<'a>(clients: Vec, _: Option>) { + async fn test_lookup_enr_non_present<'a>(clients: Vec, _: Option) { let client = match clients.into_iter().next() { Some((client)) => client, None => { @@ -485,7 +486,7 @@ dyn_async! { } dyn_async! { - async fn test_lookup_enr_enr_present<'a>(clients: Vec, _: Option>) { + async fn test_lookup_enr_enr_present<'a>(clients: Vec, _: Option) { let client = match clients.into_iter().next() { Some((client)) => client, None => { @@ -516,7 +517,7 @@ dyn_async! { } dyn_async! { - async fn test_lookup_enr_local_enr<'a>(clients: Vec, _: Option>) { + async fn test_lookup_enr_local_enr<'a>(clients: Vec, _: Option) { let client = match clients.into_iter().next() { Some((client)) => client, None => { @@ -545,7 +546,7 @@ dyn_async! { dyn_async! { // test that a node will return a AbsentContent via RecursiveFindContent when the data doesn't exist - async fn test_recursive_find_content_content_absent<'a>(clients: Vec, _: Option>) { + async fn test_recursive_find_content_content_absent<'a>(clients: Vec, _: Option) { let client = match clients.into_iter().next() { Some((client)) => client, None => { diff --git a/simulators/portal/history/Cargo.toml b/simulators/portal/history/Cargo.toml index f94123f827..0057f4e5e2 100755 --- a/simulators/portal/history/Cargo.toml +++ b/simulators/portal/history/Cargo.toml @@ -7,7 +7,7 @@ edition = "2021" [dependencies] ethportal-api = { git = "https://github.com/ethereum/trin", tag = "v0.1.0-alpha.22" } portal-spec-test-utils-rs = { git = "https://github.com/ethereum/portal-spec-tests", rev = "d1e996d0d4dc2136b3cd38d9e25cdc3a6b74dcd9" } -hivesim = { git = "https://github.com/ethereum/portal-hive", rev = "8ff1e3d3c941dd00d56dacd777a5dfb71edf402f" } +hivesim = { git = "https://github.com/ethereum/portal-hive", rev = "0f830ea8999f2878eb78ef67efc9f80cc888413e" } futures = "0.3.25" serde_json = "1.0.87" tracing = "0.1.37" diff --git a/simulators/portal/history/src/suites/interop.rs b/simulators/portal/history/src/suites/interop.rs index 9686e7129f..8c70ffc045 100644 --- a/simulators/portal/history/src/suites/interop.rs +++ b/simulators/portal/history/src/suites/interop.rs @@ -6,6 +6,8 @@ use ethportal_api::{ OverlayContentKey, }; use hivesim::types::ClientDefinition; +use hivesim::types::ContentKeyValue; +use hivesim::types::TestData; use hivesim::{dyn_async, Client, NClientTestSpec, Test}; use itertools::Itertools; use portal_spec_test_utils_rs::get_flair; @@ -22,16 +24,19 @@ const HEADER_WITH_PROOF_KEY: &str = fn content_pair_to_string_pair( content_pair: (HistoryContentKey, HistoryContentValue), -) -> (String, String) { +) -> ContentKeyValue { let (content_key, content_value) = content_pair; - (content_key.to_hex(), hex_encode(content_value.encode())) + ContentKeyValue { + key: content_key.to_hex(), + value: hex_encode(content_value.encode()), + } } /// Processed content data for history tests struct ProcessedContent { content_type: String, block_number: u64, - test_data: Vec<(String, String)>, + test_data: Vec, } fn process_content( @@ -114,7 +119,7 @@ dyn_async! { always_run: false, run: test_offer, environments: None, - test_data: Some(test_data.clone()), + test_data: Some(TestData::ContentList(test_data.clone())), clients: vec![client_a.clone(), client_b.clone()], } ).await; @@ -126,7 +131,7 @@ dyn_async! { always_run: false, run: test_recursive_find_content, environments: None, - test_data: Some(test_data.clone()), + test_data: Some(TestData::ContentList(test_data.clone())), clients: vec![client_a.clone(), client_b.clone()], } ).await; @@ -138,7 +143,7 @@ dyn_async! { always_run: false, run: test_find_content, environments: None, - test_data: Some(test_data), + test_data: Some(TestData::ContentList(test_data)), clients: vec![client_a.clone(), client_b.clone()], } ).await; @@ -188,7 +193,7 @@ dyn_async! { always_run: false, run: test_gossip_two_nodes, environments: None, - test_data: Some(content.clone().into_iter().map(content_pair_to_string_pair).collect()), + test_data: Some(TestData::ContentList(content.clone().into_iter().map(content_pair_to_string_pair).collect())), clients: vec![client_a.clone(), client_b.clone()], } ).await; @@ -198,7 +203,7 @@ dyn_async! { dyn_async! { // test that a node will not return content via FINDCONTENT. - async fn test_find_content_non_present<'a>(clients: Vec, _: Option>) { + async fn test_find_content_non_present<'a>(clients: Vec, _: Option) { let (client_a, client_b) = match clients.iter().collect_tuple() { Some((client_a, client_b)) => (client_a, client_b), None => { @@ -240,18 +245,18 @@ dyn_async! { } dyn_async! { - async fn test_offer<'a>(clients: Vec, test_data: Option>) { + async fn test_offer<'a>(clients: Vec, test_data: Option) { let (client_a, client_b) = match clients.iter().collect_tuple() { Some((client_a, client_b)) => (client_a, client_b), None => { panic!("Unable to get expected amount of clients from NClientTestSpec"); } }; - let test_data = match test_data { + let test_data = match test_data.map(|data| data.content_list()) { Some(test_data) => test_data, None => panic!("Expected test data non was provided"), }; - if let Some((optional_key, optional_value)) = test_data.get(1) { + if let Some(ContentKeyValue { key: optional_key, value: optional_value }) = test_data.get(1) { let optional_key: HistoryContentKey = serde_json::from_value(json!(optional_key)).unwrap(); let optional_value: HistoryContentValue = @@ -265,7 +270,7 @@ dyn_async! { } } } - let (target_key, target_value) = test_data.first().expect("Target content is required for this test"); + let ContentKeyValue { key: target_key, value: target_value } = test_data.first().expect("Target content is required for this test"); let target_key: HistoryContentKey = serde_json::from_value(json!(target_key)).unwrap(); let target_value: HistoryContentValue = @@ -304,7 +309,7 @@ dyn_async! { } dyn_async! { - async fn test_ping<'a>(clients: Vec, _: Option>) { + async fn test_ping<'a>(clients: Vec, _: Option) { let (client_a, client_b) = match clients.iter().collect_tuple() { Some((client_a, client_b)) => (client_a, client_b), None => { @@ -345,7 +350,7 @@ dyn_async! { } dyn_async! { - async fn test_find_nodes_zero_distance<'a>(clients: Vec, _: Option>) { + async fn test_find_nodes_zero_distance<'a>(clients: Vec, _: Option) { let (client_a, client_b) = match clients.iter().collect_tuple() { Some((client_a, client_b)) => (client_a, client_b), None => { @@ -381,18 +386,18 @@ dyn_async! { dyn_async! { // test that a node will return a content via RECURSIVEFINDCONTENT template that it has stored locally - async fn test_recursive_find_content<'a>(clients: Vec, test_data: Option>) { + async fn test_recursive_find_content<'a>(clients: Vec, test_data: Option) { let (client_a, client_b) = match clients.iter().collect_tuple() { Some((client_a, client_b)) => (client_a, client_b), None => { panic!("Unable to get expected amount of clients from NClientTestSpec"); } }; - let test_data = match test_data { + let test_data = match test_data.map(|data| data.content_list()) { Some(test_data) => test_data, None => panic!("Expected test data non was provided"), }; - if let Some((optional_key, optional_value)) = test_data.get(1) { + if let Some(ContentKeyValue { key: optional_key, value: optional_value }) = test_data.get(1) { let optional_key: HistoryContentKey = serde_json::from_value(json!(optional_key)).unwrap(); let optional_value: HistoryContentValue = @@ -407,7 +412,7 @@ dyn_async! { } } - let (target_key, target_value) = test_data.first().expect("Target content is required for this test"); + let ContentKeyValue { key: target_key, value: target_value } = test_data.first().expect("Target content is required for this test"); let target_key: HistoryContentKey = serde_json::from_value(json!(target_key)).unwrap(); let target_value: HistoryContentValue = @@ -466,18 +471,18 @@ dyn_async! { dyn_async! { // test that a node will return a x content via FINDCONTENT that it has stored locally - async fn test_find_content<'a> (clients: Vec, test_data: Option>) { + async fn test_find_content<'a> (clients: Vec, test_data: Option) { let (client_a, client_b) = match clients.iter().collect_tuple() { Some((client_a, client_b)) => (client_a, client_b), None => { panic!("Unable to get expected amount of clients from NClientTestSpec"); } }; - let test_data = match test_data { + let test_data = match test_data.map(|data| data.content_list()) { Some(test_data) => test_data, None => panic!("Expected test data none was provided"), }; - if let Some((optional_key, optional_value)) = test_data.get(1) { + if let Some(ContentKeyValue { key: optional_key, value: optional_value }) = test_data.get(1) { let optional_key: HistoryContentKey = serde_json::from_value(json!(optional_key)).unwrap(); let optional_value: HistoryContentValue = @@ -492,7 +497,7 @@ dyn_async! { } } - let (target_key, target_value) = test_data.first().expect("Target content is required for this test"); + let ContentKeyValue { key: target_key, value: target_value } = test_data.first().expect("Target content is required for this test"); let target_key: HistoryContentKey = serde_json::from_value(json!(target_key)).unwrap(); let target_value: HistoryContentValue = @@ -542,14 +547,14 @@ dyn_async! { } dyn_async! { - async fn test_gossip_two_nodes<'a> (clients: Vec, test_data: Option>) { + async fn test_gossip_two_nodes<'a> (clients: Vec, test_data: Option) { let (client_a, client_b) = match clients.iter().collect_tuple() { Some((client_a, client_b)) => (client_a, client_b), None => { panic!("Unable to get expected amount of clients from NClientTestSpec"); } }; - let test_data = match test_data { + let test_data = match test_data.map(|data| data.content_list()) { Some(test_data) => test_data, None => panic!("Expected test data non was provided"), }; @@ -569,7 +574,7 @@ dyn_async! { } // With default node settings nodes should be storing all content - for (content_key, content_value) in test_data.clone() { + for ContentKeyValue { key: content_key, value: content_value } in test_data.clone() { let content_key: HistoryContentKey = serde_json::from_value(json!(content_key)).unwrap(); let content_value: HistoryContentValue = @@ -595,14 +600,14 @@ dyn_async! { tokio::time::sleep(Duration::from_secs(test_data.len() as u64)).await; // process raw test data to generate content details for error output - let (first_header_key, first_header_value) = test_data.first().unwrap(); + let ContentKeyValue { key: first_header_key, value: first_header_value } = test_data.first().unwrap(); let first_header_key: HistoryContentKey = serde_json::from_value(json!(first_header_key)).unwrap(); let first_header_value: HistoryContentValue = serde_json::from_value(json!(first_header_value)).unwrap(); let mut last_header_seen: (HistoryContentKey, HistoryContentValue) = (first_header_key, first_header_value); let mut result = vec![]; - for (content_key, content_value) in test_data.into_iter() { + for ContentKeyValue { key: content_key, value: content_value } in test_data.into_iter() { let content_key: HistoryContentKey = serde_json::from_value(json!(content_key)).unwrap(); let content_value: HistoryContentValue = diff --git a/simulators/portal/history/src/suites/mesh.rs b/simulators/portal/history/src/suites/mesh.rs index 99dd7aa03c..7686c19afb 100644 --- a/simulators/portal/history/src/suites/mesh.rs +++ b/simulators/portal/history/src/suites/mesh.rs @@ -6,6 +6,7 @@ use ethportal_api::{ Discv5ApiClient, HistoryContentKey, HistoryContentValue, HistoryNetworkApiClient, }; use hivesim::types::ClientDefinition; +use hivesim::types::TestData; use hivesim::{dyn_async, Client, NClientTestSpec, Test}; use itertools::Itertools; use serde_json::json; @@ -72,7 +73,7 @@ dyn_async! { } dyn_async! { - async fn test_find_content_two_jumps<'a> (clients: Vec, _: Option>) { + async fn test_find_content_two_jumps<'a> (clients: Vec, _: Option) { let (client_a, client_b, client_c) = match clients.iter().collect_tuple() { Some((client_a, client_b, client_c)) => (client_a, client_b, client_c), None => { @@ -167,7 +168,7 @@ dyn_async! { } dyn_async! { - async fn test_find_nodes_distance_of_client_c<'a>(clients: Vec, _: Option>) { + async fn test_find_nodes_distance_of_client_c<'a>(clients: Vec, _: Option) { let (client_a, client_b, client_c) = match clients.iter().collect_tuple() { Some((client_a, client_b, client_c)) => (client_a, client_b, client_c), None => { diff --git a/simulators/portal/history/src/suites/rpc_compat.rs b/simulators/portal/history/src/suites/rpc_compat.rs index 7cc03401ee..497380088e 100644 --- a/simulators/portal/history/src/suites/rpc_compat.rs +++ b/simulators/portal/history/src/suites/rpc_compat.rs @@ -3,6 +3,7 @@ use ethportal_api::types::enr::generate_random_remote_enr; use ethportal_api::Discv5ApiClient; use ethportal_api::{HistoryContentKey, HistoryNetworkApiClient}; use hivesim::types::ClientDefinition; +use hivesim::types::TestData; use hivesim::{dyn_async, Client, NClientTestSpec, Test}; use serde_json::json; @@ -191,7 +192,7 @@ dyn_async! { } dyn_async! { - async fn test_node_info<'a>(clients: Vec, _: Option>) { + async fn test_node_info<'a>(clients: Vec, _: Option) { let client = match clients.into_iter().next() { Some((client)) => client, None => { @@ -208,7 +209,7 @@ dyn_async! { } dyn_async! { - async fn test_local_content_expect_content_absent<'a>(clients: Vec, _: Option>) { + async fn test_local_content_expect_content_absent<'a>(clients: Vec, _: Option) { let client = match clients.into_iter().next() { Some((client)) => client, None => { @@ -232,7 +233,7 @@ dyn_async! { } dyn_async! { - async fn test_store<'a>(clients: Vec, _: Option>) { + async fn test_store<'a>(clients: Vec, _: Option) { let client = match clients.into_iter().next() { Some((client)) => client, None => { @@ -268,7 +269,7 @@ dyn_async! { } dyn_async! { - async fn test_local_content_expect_content_present<'a>(clients: Vec, _: Option>) { + async fn test_local_content_expect_content_present<'a>(clients: Vec, _: Option) { let client = match clients.into_iter().next() { Some((client)) => client, None => { @@ -311,7 +312,7 @@ dyn_async! { } dyn_async! { - async fn test_add_enr_expect_true<'a>(clients: Vec, _: Option>) { + async fn test_add_enr_expect_true<'a>(clients: Vec, _: Option) { let client = match clients.into_iter().next() { Some((client)) => client, None => { @@ -330,7 +331,7 @@ dyn_async! { } dyn_async! { - async fn test_get_enr_non_present<'a>(clients: Vec, _: Option>) { + async fn test_get_enr_non_present<'a>(clients: Vec, _: Option) { let client = match clients.into_iter().next() { Some((client)) => client, None => { @@ -346,7 +347,7 @@ dyn_async! { } dyn_async! { - async fn test_get_enr_local_enr<'a>(clients: Vec, _: Option>) { + async fn test_get_enr_local_enr<'a>(clients: Vec, _: Option) { let client = match clients.into_iter().next() { Some((client)) => client, None => { @@ -374,7 +375,7 @@ dyn_async! { } dyn_async! { - async fn test_get_enr_enr_present<'a>(clients: Vec, _: Option>) { + async fn test_get_enr_enr_present<'a>(clients: Vec, _: Option) { let client = match clients.into_iter().next() { Some((client)) => client, None => { @@ -405,7 +406,7 @@ dyn_async! { } dyn_async! { - async fn test_delete_enr_non_present<'a>(clients: Vec, _: Option>) { + async fn test_delete_enr_non_present<'a>(clients: Vec, _: Option) { let client = match clients.into_iter().next() { Some((client)) => client, None => { @@ -424,7 +425,7 @@ dyn_async! { } dyn_async! { - async fn test_delete_enr_enr_present<'a>(clients: Vec, _: Option>) { + async fn test_delete_enr_enr_present<'a>(clients: Vec, _: Option) { let client = match clients.into_iter().next() { Some((client)) => client, None => { @@ -469,7 +470,7 @@ dyn_async! { } dyn_async! { - async fn test_lookup_enr_non_present<'a>(clients: Vec, _: Option>) { + async fn test_lookup_enr_non_present<'a>(clients: Vec, _: Option) { let client = match clients.into_iter().next() { Some((client)) => client, None => { @@ -485,7 +486,7 @@ dyn_async! { } dyn_async! { - async fn test_lookup_enr_enr_present<'a>(clients: Vec, _: Option>) { + async fn test_lookup_enr_enr_present<'a>(clients: Vec, _: Option) { let client = match clients.into_iter().next() { Some((client)) => client, None => { @@ -516,7 +517,7 @@ dyn_async! { } dyn_async! { - async fn test_lookup_enr_local_enr<'a>(clients: Vec, _: Option>) { + async fn test_lookup_enr_local_enr<'a>(clients: Vec, _: Option) { let client = match clients.into_iter().next() { Some((client)) => client, None => { @@ -545,7 +546,7 @@ dyn_async! { dyn_async! { // test that a node will return a AbsentContent via RecursiveFindContent when the data doesn't exist - async fn test_recursive_find_content_content_absent<'a>(clients: Vec, _: Option>) { + async fn test_recursive_find_content_content_absent<'a>(clients: Vec, _: Option) { let client = match clients.into_iter().next() { Some((client)) => client, None => { diff --git a/simulators/portal/history/src/suites/trin_bridge.rs b/simulators/portal/history/src/suites/trin_bridge.rs index 3a10efc140..fcd1ee4702 100644 --- a/simulators/portal/history/src/suites/trin_bridge.rs +++ b/simulators/portal/history/src/suites/trin_bridge.rs @@ -6,6 +6,7 @@ use ethportal_api::HistoryContentKey; use ethportal_api::HistoryContentValue; use ethportal_api::{Discv5ApiClient, HistoryNetworkApiClient}; use hivesim::types::ClientDefinition; +use hivesim::types::TestData; use hivesim::{dyn_async, Client, NClientTestSpec, Test}; use portal_spec_test_utils_rs::get_flair; use serde_yaml::Value; @@ -69,7 +70,7 @@ dyn_async! { } dyn_async! { - async fn test_bridge<'a>(clients: Vec, _: Option>) { + async fn test_bridge<'a>(clients: Vec, _: Option) { let client = match clients.into_iter().next() { Some((client)) => client, None => { diff --git a/simulators/portal/state/Cargo.toml b/simulators/portal/state/Cargo.toml index 89dc09fc80..a26640cd6b 100755 --- a/simulators/portal/state/Cargo.toml +++ b/simulators/portal/state/Cargo.toml @@ -6,7 +6,7 @@ edition = "2021" [dependencies] ethportal-api = { git = "https://github.com/ethereum/trin", tag = "v0.1.0-alpha.22" } -hivesim = { git = "https://github.com/ethereum/portal-hive", rev = "8ff1e3d3c941dd00d56dacd777a5dfb71edf402f" } +hivesim = { git = "https://github.com/ethereum/portal-hive", rev = "0f830ea8999f2878eb78ef67efc9f80cc888413e" } futures = "0.3.25" serde_json = "1.0.87" tracing = "0.1.37" diff --git a/simulators/portal/state/src/suites/rpc_compat.rs b/simulators/portal/state/src/suites/rpc_compat.rs index 06d54bb6fe..df14c7b8ae 100644 --- a/simulators/portal/state/src/suites/rpc_compat.rs +++ b/simulators/portal/state/src/suites/rpc_compat.rs @@ -5,6 +5,7 @@ use ethportal_api::types::enr::generate_random_remote_enr; use ethportal_api::Discv5ApiClient; use ethportal_api::{StateContentKey, StateNetworkApiClient}; use hivesim::types::ClientDefinition; +use hivesim::types::TestData; use hivesim::{dyn_async, Client, NClientTestSpec, Test}; use serde_json::json; use std::collections::HashMap; @@ -195,7 +196,7 @@ dyn_async! { } dyn_async! { - async fn test_node_info<'a>(clients: Vec, _: Option>) { + async fn test_node_info<'a>(clients: Vec, _: Option) { let client = match clients.into_iter().next() { Some((client)) => client, None => { @@ -212,7 +213,7 @@ dyn_async! { } dyn_async! { - async fn test_local_content_expect_content_absent<'a>(clients: Vec, _: Option>) { + async fn test_local_content_expect_content_absent<'a>(clients: Vec, _: Option) { let client = match clients.into_iter().next() { Some((client)) => client, None => { @@ -235,7 +236,7 @@ dyn_async! { } dyn_async! { - async fn test_store<'a>(clients: Vec, _: Option>) { + async fn test_store<'a>(clients: Vec, _: Option) { let client = match clients.into_iter().next() { Some((client)) => client, None => { @@ -271,7 +272,7 @@ dyn_async! { } dyn_async! { - async fn test_local_content_expect_content_present<'a>(clients: Vec, _: Option>) { + async fn test_local_content_expect_content_present<'a>(clients: Vec, _: Option) { let client = match clients.into_iter().next() { Some((client)) => client, None => { @@ -314,7 +315,7 @@ dyn_async! { } dyn_async! { - async fn test_add_enr_expect_true<'a>(clients: Vec, _: Option>) { + async fn test_add_enr_expect_true<'a>(clients: Vec, _: Option) { let client = match clients.into_iter().next() { Some((client)) => client, None => { @@ -333,7 +334,7 @@ dyn_async! { } dyn_async! { - async fn test_get_enr_non_present<'a>(clients: Vec, _: Option>) { + async fn test_get_enr_non_present<'a>(clients: Vec, _: Option) { let client = match clients.into_iter().next() { Some((client)) => client, None => { @@ -349,7 +350,7 @@ dyn_async! { } dyn_async! { - async fn test_get_enr_local_enr<'a>(clients: Vec, _: Option>) { + async fn test_get_enr_local_enr<'a>(clients: Vec, _: Option) { let client = match clients.into_iter().next() { Some((client)) => client, None => { @@ -377,7 +378,7 @@ dyn_async! { } dyn_async! { - async fn test_get_enr_enr_present<'a>(clients: Vec, _: Option>) { + async fn test_get_enr_enr_present<'a>(clients: Vec, _: Option) { let client = match clients.into_iter().next() { Some((client)) => client, None => { @@ -408,7 +409,7 @@ dyn_async! { } dyn_async! { - async fn test_delete_enr_non_present<'a>(clients: Vec, _: Option>) { + async fn test_delete_enr_non_present<'a>(clients: Vec, _: Option) { let client = match clients.into_iter().next() { Some((client)) => client, None => { @@ -427,7 +428,7 @@ dyn_async! { } dyn_async! { - async fn test_delete_enr_enr_present<'a>(clients: Vec, _: Option>) { + async fn test_delete_enr_enr_present<'a>(clients: Vec, _: Option) { let client = match clients.into_iter().next() { Some((client)) => client, None => { @@ -472,7 +473,7 @@ dyn_async! { } dyn_async! { - async fn test_lookup_enr_non_present<'a>(clients: Vec, _: Option>) { + async fn test_lookup_enr_non_present<'a>(clients: Vec, _: Option) { let client = match clients.into_iter().next() { Some((client)) => client, None => { @@ -488,7 +489,7 @@ dyn_async! { } dyn_async! { - async fn test_lookup_enr_enr_present<'a>(clients: Vec, _: Option>) { + async fn test_lookup_enr_enr_present<'a>(clients: Vec, _: Option) { let client = match clients.into_iter().next() { Some((client)) => client, None => { @@ -519,7 +520,7 @@ dyn_async! { } dyn_async! { - async fn test_lookup_enr_local_enr<'a>(clients: Vec, _: Option>) { + async fn test_lookup_enr_local_enr<'a>(clients: Vec, _: Option) { let client = match clients.into_iter().next() { Some((client)) => client, None => { @@ -548,7 +549,7 @@ dyn_async! { dyn_async! { // test that a node will return a AbsentContent via RecursiveFindContent when the data doesn't exist - async fn test_recursive_find_content_content_absent<'a>(clients: Vec, _: Option>) { + async fn test_recursive_find_content_content_absent<'a>(clients: Vec, _: Option) { let client = match clients.into_iter().next() { Some((client)) => client, None => { From 014678260f6a5b137ab998673c947f9920244f04 Mon Sep 17 00:00:00 2001 From: Kolby Moroz Liebl <31669092+KolbyML@users.noreply.github.com> Date: Thu, 7 Mar 2024 21:33:45 -0700 Subject: [PATCH 213/387] simulators/portal/state: add state interop test suite (#1035) --- .../portal/beacon/src/suites/interop.rs | 9 - .../portal/history/src/suites/interop.rs | 8 - simulators/portal/state/Cargo.toml | 2 + simulators/portal/state/Dockerfile | 1 + simulators/portal/state/src/main.rs | 20 +- .../portal/state/src/suites/constants.rs | 6 + simulators/portal/state/src/suites/interop.rs | 587 ++++++++++++++++++ simulators/portal/state/src/suites/mod.rs | 1 + .../portal/state/src/suites/rpc_compat.rs | 7 +- 9 files changed, 618 insertions(+), 23 deletions(-) create mode 100644 simulators/portal/state/src/suites/interop.rs diff --git a/simulators/portal/beacon/src/suites/interop.rs b/simulators/portal/beacon/src/suites/interop.rs index eeb11c18b6..206dbe381c 100644 --- a/simulators/portal/beacon/src/suites/interop.rs +++ b/simulators/portal/beacon/src/suites/interop.rs @@ -245,15 +245,6 @@ dyn_async! { serde_json::from_value(json!(target_key)).unwrap(); let target_value: BeaconContentValue = serde_json::from_value(json!(target_value)).unwrap(); - match client_b.rpc.store(target_key.clone(), target_value.clone()).await { - Ok(result) => if !result { - panic!("Error storing target content for recursive find content"); - }, - Err(err) => { - panic!("Error storing target content: {err:?}"); - } - } - let target_enr = match client_b.rpc.node_info().await { Ok(node_info) => node_info.enr, Err(err) => { diff --git a/simulators/portal/history/src/suites/interop.rs b/simulators/portal/history/src/suites/interop.rs index 8c70ffc045..a6153d5af6 100644 --- a/simulators/portal/history/src/suites/interop.rs +++ b/simulators/portal/history/src/suites/interop.rs @@ -275,14 +275,6 @@ dyn_async! { serde_json::from_value(json!(target_key)).unwrap(); let target_value: HistoryContentValue = serde_json::from_value(json!(target_value)).unwrap(); - match client_b.rpc.store(target_key.clone(), target_value.clone()).await { - Ok(result) => if !result { - panic!("Error storing target content for recursive find content"); - }, - Err(err) => { - panic!("Error storing target content: {err:?}"); - } - } let target_enr = match client_b.rpc.node_info().await { Ok(node_info) => node_info.enr, diff --git a/simulators/portal/state/Cargo.toml b/simulators/portal/state/Cargo.toml index a26640cd6b..a028738eb9 100755 --- a/simulators/portal/state/Cargo.toml +++ b/simulators/portal/state/Cargo.toml @@ -8,7 +8,9 @@ edition = "2021" ethportal-api = { git = "https://github.com/ethereum/trin", tag = "v0.1.0-alpha.22" } hivesim = { git = "https://github.com/ethereum/portal-hive", rev = "0f830ea8999f2878eb78ef67efc9f80cc888413e" } futures = "0.3.25" +itertools = "0.10.5" serde_json = "1.0.87" +serde_yaml = "0.9" tracing = "0.1.37" tracing-subscriber = "0.3.16" tokio = { version = "1", features = ["full"] } diff --git a/simulators/portal/state/Dockerfile b/simulators/portal/state/Dockerfile index 534c001a4c..66ee5f2ba7 100644 --- a/simulators/portal/state/Dockerfile +++ b/simulators/portal/state/Dockerfile @@ -21,6 +21,7 @@ RUN apt update && apt install wget -y # copy build artifacts from build stage COPY --from=builder /state/target/release/state . +ADD https://raw.githubusercontent.com/ethereum/portal-spec-tests/master/tests/mainnet/state/hive/test_data.yaml ./test-data/test_data.yaml ENV RUST_LOG=debug diff --git a/simulators/portal/state/src/main.rs b/simulators/portal/state/src/main.rs index 35e6aead5a..1e628014d4 100644 --- a/simulators/portal/state/src/main.rs +++ b/simulators/portal/state/src/main.rs @@ -1,6 +1,7 @@ mod suites; use hivesim::{Simulation, Suite, TestSpec}; +use suites::interop::test_portal_interop; use suites::rpc_compat::run_rpc_compat_test_suite; #[tokio::main] @@ -23,8 +24,25 @@ async fn main() { client: None, }); + let mut interop = Suite { + name: "history-interop".to_string(), + description: + "The interop test suite runs a set of scenarios to test interoperability between + portal network clients" + .to_string(), + tests: vec![], + }; + + interop.add(TestSpec { + name: "client launch".to_string(), + description: "This test launches the client and collects its logs.".to_string(), + always_run: false, + run: test_portal_interop, + client: None, + }); + let sim = Simulation::new(); - run_suite(sim, vec![state_rpc_compat]).await; + run_suite(sim, vec![state_rpc_compat, interop]).await; } async fn run_suite(host: Simulation, suites: Vec) { diff --git a/simulators/portal/state/src/suites/constants.rs b/simulators/portal/state/src/suites/constants.rs index 4215dcc0a7..9b811cb2e8 100644 --- a/simulators/portal/state/src/suites/constants.rs +++ b/simulators/portal/state/src/suites/constants.rs @@ -1,5 +1,11 @@ +pub const TEST_DATA_FILE_PATH: &str = "./test-data/test_data.yaml"; pub const HIVE_PORTAL_NETWORKS_SELECTED: &str = "HIVE_PORTAL_NETWORKS_SELECTED"; pub const STATE_STRING: &str = "state"; // trin-bridge constants pub const TRIN_BRIDGE_CLIENT_TYPE: &str = "trin-bridge"; + +// Account Trie Node https://github.com/ethereum/portal-spec-tests/blob/master/tests/mainnet/state/validation/account_trie_node.yaml +pub const CONTENT_KEY: &str = + "0x20240000000ad14c73a3b489e9cb1c523aef684ed17363e03d33345f2b23c0407f87ee3ff000a97f"; +pub const CONTENT_VALUE: &str = "0x24000000d4e56740f876aef8c010b86a40d5f56745a118d0906a34e69aec8c0db1cb8fa314000000280200003c0400001006000033060000f90211a090dcaf88c40c7bbc95a912cbdde67c175767b31173df9ee4b0d733bfdd511c43a0babe369f6b12092f49181ae04ca173fb68d1a5456f18d20fa32cba73954052bda0473ecf8a7e36a829e75039a3b055e51b8332cbf03324ab4af2066bbd6fbf0021a0bbda34753d7aa6c38e603f360244e8f59611921d9e1f128372fec0d586d4f9e0a04e44caecff45c9891f74f6a2156735886eedf6f1a733628ebc802ec79d844648a0a5f3f2f7542148c973977c8a1e154c4300fec92f755f7846f1b734d3ab1d90e7a0e823850f50bf72baae9d1733a36a444ab65d0a6faaba404f0583ce0ca4dad92da0f7a00cbe7d4b30b11faea3ae61b7f1f2b315b61d9f6bd68bfe587ad0eeceb721a07117ef9fc932f1a88e908eaead8565c19b5645dc9e5b1b6e841c5edbdfd71681a069eb2de283f32c11f859d7bcf93da23990d3e662935ed4d6b39ce3673ec84472a0203d26456312bbc4da5cd293b75b840fc5045e493d6f904d180823ec22bfed8ea09287b5c21f2254af4e64fca76acc5cd87399c7f1ede818db4326c98ce2dc2208a06fc2d754e304c48ce6a517753c62b1a9c1d5925b89707486d7fc08919e0a94eca07b1c54f15e299bd58bdfef9741538c7828b5d7d11a489f9c20d052b3471df475a051f9dd3739a927c89e357580a4c97b40234aa01ed3d5e0390dc982a7975880a0a089d613f26159af43616fd9455bb461f4869bfede26f2130835ed067a8b967bfb80f90211a068c361d52a1ae36e33155313cd4e838c539d946d85925e5867b747e66995279ea04bfcad7bfdf0fb113e6bf0ebe4d55543688888bd6ad277de20aa0f8a85808808a086816b98cc35e76d6e811646f6c37a73d148a23420bcc03493090639bb8393eca0af4b0b8fcf790b63a8bbc3711f091758d3e4dd424cdc4ded526015c42ca50dcaa0158ecf58c068c4d0452dba821665bbdc6c9c57d6016e53abc18832e9ccfc0b86a016a6ebfa551718656d0b514f948a859964f83d3717e0f055f996772d2f228c2da0a9fd3ba226e84a434bc8d5b974b5131faccdefa6a58a02ddff829fa3d4bb27d5a0cf039eb80d70511d207a7e25160061689d9267630b66d2aaedac436872ae415ba0f24a488dd566079b384e558779c105af0d8f8c8ed564aeab9c7564f393bea56ea05132b24ec0dcf33ec24cb4678aa90b2622141c94345a5dceff21b22284c26251a0c093497e0aeeb4bd0bc461643cf003f87dde10cc1c9925a0b23a409f2048b8e2a0c03b6353e1dcdd3707caa20cd4d6a5c3c59da9f7424bba97ba643f17d42b8b86a0177fd57a9ee5d2d47d712d2daf75f5162a33b604b72766a98daad5509f607b45a09c7945f1f9517363d0cc19dde9ad91222f9d3c0162061182eb114e39a9f605c7a0a8440ef6e36d273b58c65344edab0583a03f09912d22e723dae51cc1d716d786a01df56337e1161f3fe7318ad10bd8e5c42f741c0652bd70d1292c7d0f2f7b88cb80f901d1a01a42abb27509a631169ab7e765e13dec0de47dac9cc7bba9cbc03d9086a0db71a0a0978af82352385b3ed1d0cd6c37a5b2613a989ea01df570edb06df32fdefaff80a0d1cf5bc45e21fa3960d172fe189be5978adab50ca77d11d1c2953eebbbd2d312a005b8054e0db723ad20cc31b1be4d987ae6c6c37c334207120b1f67506f84ad43a0430e5e56596211fcf7b7875da97ac1b1f6ba13189dce330bcaebb9e6d5569f01a003353e7e139443c7b994c347eb7636dcae5b3eac6ba09b3bbb8c588c2e41a958a0cf966488cfb696ed5ac8f67923e4c0912eef7656df7f7586ba2b7ad7072b34b6a0652fb2d2acc28fc9360ac63f29d7886abf602ccbc0cf865061b653415256f357a062d4f171bb087621727a87a01a29d4c8b20864fcb45eb6d60eb929af76aa3485a0dbf844359c229020360ae86751fed8ea41d985ee245da8a27893cc5e1cf55d6fa03ada43c4de6154b5f5567fc27f3a659c3028b321a8040c8713d8b347d7634d3080a0728693f4b5a3f28187456de3217e2985662d52979bfae5a49da65153c50ada8da03c0a8e099ac8060b14d7946c6abc5a0a428defe61781e2cb0736a20ad086e442a07ca441b942818197c8fa360f6d32113277c734eedac7a4539f62e5a27ce404e880e21fa00ad14c73a3b489e9cb1c523aef684ed17363e03d33345f2b23c0407f87ee3ff0f8518080808080808080a01908e7f8035023929a2fa13d9f801a42db49a3063a350da55dd94896a3e9be0a80808080a00cfd334f65fc252dbe0bfa903aaef7bb1546db01627d8eacd919c2bce43b6691808080"; diff --git a/simulators/portal/state/src/suites/interop.rs b/simulators/portal/state/src/suites/interop.rs new file mode 100644 index 0000000000..177681e6fa --- /dev/null +++ b/simulators/portal/state/src/suites/interop.rs @@ -0,0 +1,587 @@ +use crate::suites::constants::{ + CONTENT_KEY, HIVE_PORTAL_NETWORKS_SELECTED, STATE_STRING, TEST_DATA_FILE_PATH, + TRIN_BRIDGE_CLIENT_TYPE, +}; +use ethportal_api::types::state::ContentInfo; +use ethportal_api::utils::bytes::hex_encode; +use ethportal_api::{ + ContentValue, Discv5ApiClient, OverlayContentKey, StateContentKey, StateContentValue, + StateNetworkApiClient, +}; +use hivesim::types::ClientDefinition; +use hivesim::types::ContentKeyOfferLookupValues; +use hivesim::types::TestData; +use hivesim::{dyn_async, Client, NClientTestSpec, Test}; +use itertools::Itertools; +use serde_json::json; +use serde_yaml::Value; +use std::collections::HashMap; +use tokio::time::Duration; + +// This is taken from Trin. It should be fairly standard +const MAX_PORTAL_CONTENT_PAYLOAD_SIZE: usize = 1165; + +fn content_pair_to_string_pair( + content_pair: (StateContentKey, StateContentValue, StateContentValue), +) -> ContentKeyOfferLookupValues { + let (content_key, content_offer_value, content_lookup_value) = content_pair; + ContentKeyOfferLookupValues { + key: content_key.to_hex(), + offer_value: hex_encode(content_offer_value.encode()), + lookup_value: hex_encode(content_lookup_value.encode()), + } +} + +/// Processed content data for state tests +struct ProcessedContent { + content_type: String, + identifier: String, + test_data: Vec, +} + +fn process_content( + content: Vec<(StateContentKey, StateContentValue, StateContentValue)>, +) -> Vec { + let mut result: Vec = vec![]; + for state_content in content.into_iter() { + let (content_type, identifier, test_data) = match &state_content.0 { + StateContentKey::AccountTrieNode(account_trie_node) => ( + "Account Trie Node".to_string(), + format!( + "path: {} node hash: {}", + hex_encode(account_trie_node.path.nibbles()), + hex_encode(account_trie_node.node_hash.as_bytes()) + ), + vec![content_pair_to_string_pair(state_content)], + ), + StateContentKey::ContractStorageTrieNode(contract_storage_trie_node) => ( + "Contract Storage Trie Node".to_string(), + format!( + "address: {} path: {} node hash: {}", + hex_encode(contract_storage_trie_node.address.as_bytes()), + hex_encode(contract_storage_trie_node.path.nibbles()), + hex_encode(contract_storage_trie_node.node_hash.as_bytes()) + ), + vec![content_pair_to_string_pair(state_content)], + ), + StateContentKey::ContractBytecode(contract_bytecode) => ( + "Contract Bytecode".to_string(), + format!( + "address: {} code hash: {}", + hex_encode(contract_bytecode.address.as_bytes()), + hex_encode(contract_bytecode.code_hash.as_bytes()) + ), + vec![content_pair_to_string_pair(state_content)], + ), + }; + result.push(ProcessedContent { + content_type, + identifier, + test_data, + }) + } + result +} + +dyn_async! { + pub async fn test_portal_interop<'a> (test: &'a mut Test, _client: Option) { + // Get all available portal clients + let clients = test.sim.client_types().await; + // todo: remove this once we implement role in hivesim-rs + let clients: Vec = clients.into_iter().filter(|client| client.name != *TRIN_BRIDGE_CLIENT_TYPE).collect(); + + let values = std::fs::read_to_string(TEST_DATA_FILE_PATH) + .expect("cannot find test asset"); + let values: Value = serde_yaml::from_str(&values).unwrap(); + let content: Vec<(StateContentKey, StateContentValue, StateContentValue)> = values.as_sequence().unwrap().iter().map(|value| { + let content_key: StateContentKey = + serde_yaml::from_value(value.get("content_key").unwrap().clone()).unwrap(); + let content_offer_value: StateContentValue = + serde_yaml::from_value(value.get("content_value_offer").unwrap().clone()).unwrap(); + let content_lookup_value: StateContentValue = + serde_yaml::from_value(value.get("content_value_retrieval").unwrap().clone()).unwrap(); + (content_key, content_offer_value, content_lookup_value) + }).collect(); + + // Iterate over all possible pairings of clients and run the tests (including self-pairings) + for (client_a, client_b) in clients.iter().cartesian_product(clients.iter()) { + for ProcessedContent { content_type, identifier, test_data } in process_content(content.clone()) { + test.run( + NClientTestSpec { + name: format!("OFFER {}: {} {} --> {}", content_type, identifier, client_a.name, client_b.name), + description: "".to_string(), + always_run: false, + run: test_offer, + environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), STATE_STRING.to_string())])), Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), STATE_STRING.to_string())]))]), + test_data: Some(TestData::StateContentList(test_data.clone())), + clients: vec![client_a.clone(), client_b.clone()], + } + ).await; + + test.run( + NClientTestSpec { + name: format!("RecursiveFindContent {}: {} {} --> {}", content_type, identifier, client_a.name, client_b.name), + description: "".to_string(), + always_run: false, + run: test_recursive_find_content, + environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), STATE_STRING.to_string())])), Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), STATE_STRING.to_string())]))]), + test_data: Some(TestData::StateContentList(test_data.clone())), + clients: vec![client_a.clone(), client_b.clone()], + } + ).await; + + test.run( + NClientTestSpec { + name: format!("FindContent {}: {} {} --> {}", content_type, identifier, client_a.name, client_b.name), + description: "".to_string(), + always_run: false, + run: test_find_content, + environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), STATE_STRING.to_string())])), Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), STATE_STRING.to_string())]))]), + test_data: Some(TestData::StateContentList(test_data)), + clients: vec![client_a.clone(), client_b.clone()], + } + ).await; + } + + // Test portal state ping + test.run(NClientTestSpec { + name: format!("PING {} --> {}", client_a.name, client_b.name), + description: "".to_string(), + always_run: false, + run: test_ping, + environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), STATE_STRING.to_string())])), Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), STATE_STRING.to_string())]))]), + test_data: None, + clients: vec![client_a.clone(), client_b.clone()], + } + ).await; + + // Test find content non-present + test.run(NClientTestSpec { + name: format!("FIND_CONTENT non present {} --> {}", client_a.name, client_b.name), + description: "find content: calls find content that doesn't exist".to_string(), + always_run: false, + run: test_find_content_non_present, + environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), STATE_STRING.to_string())])), Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), STATE_STRING.to_string())]))]), + test_data: None, + clients: vec![client_a.clone(), client_b.clone()], + } + ).await; + + // Test find nodes distance zero + test.run(NClientTestSpec { + name: format!("FIND_NODES Distance 0 {} --> {}", client_a.name, client_b.name), + description: "find nodes: distance zero expect called nodes enr".to_string(), + always_run: false, + run: test_find_nodes_zero_distance, + environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), STATE_STRING.to_string())])), Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), STATE_STRING.to_string())]))]), + test_data: None, + clients: vec![client_a.clone(), client_b.clone()], + } + ).await; + + // Test gossiping a collection of blocks to node B (B will gossip back to A) + test.run( + NClientTestSpec { + name: format!("GOSSIP blocks from A:{} --> B:{}", client_a.name, client_b.name), + description: "".to_string(), + always_run: false, + run: test_gossip_two_nodes, + environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), STATE_STRING.to_string())])), Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), STATE_STRING.to_string())]))]), + test_data: Some(TestData::StateContentList(content.clone().into_iter().map(content_pair_to_string_pair).collect())), + clients: vec![client_a.clone(), client_b.clone()], + } + ).await; + } + } +} + +dyn_async! { + // test that a node will not return content via FINDCONTENT. + async fn test_find_content_non_present<'a>(clients: Vec, _: Option) { + let (client_a, client_b) = match clients.iter().collect_tuple() { + Some((client_a, client_b)) => (client_a, client_b), + None => { + panic!("Unable to get expected amount of clients from NClientTestSpec"); + } + }; + let header_with_proof_key: StateContentKey = serde_json::from_value(json!(CONTENT_KEY)).unwrap(); + + let target_enr = match client_b.rpc.node_info().await { + Ok(node_info) => node_info.enr, + Err(err) => { + panic!("Error getting node info: {err:?}"); + } + }; + + let result = client_a.rpc.find_content(target_enr, header_with_proof_key.clone()).await; + + match result { + Ok(result) => { + match result { + ContentInfo::Enrs{ enrs: val } => { + if !val.is_empty() { + panic!("Error: Unexpected FINDCONTENT response: expected ContentInfo::Enrs length 0 got {}", val.len()); + } + }, + ContentInfo::Content{ content: _, .. } => { + panic!("Error: Unexpected FINDCONTENT response: wasn't supposed to return back content"); + }, + other => { + panic!("Error: Unexpected FINDCONTENT response: {other:?}"); + } + } + }, + Err(err) => { + panic!("Error: Unable to get response from FINDCONTENT request: {err:?}"); + } + } + } +} + +dyn_async! { + async fn test_offer<'a>(clients: Vec, test_data: Option) { + let (client_a, client_b) = match clients.iter().collect_tuple() { + Some((client_a, client_b)) => (client_a, client_b), + None => { + panic!("Unable to get expected amount of clients from NClientTestSpec"); + } + }; + let test_data = match test_data.map(|data| data.state_content_list()) { + Some(test_data) => test_data, + None => panic!("Expected test data non was provided"), + }; + let ContentKeyOfferLookupValues { key: target_key, offer_value: target_offer_value, lookup_value: target_lookup_value } = test_data.first().expect("Target content is required for this test"); + let target_key: StateContentKey = + serde_json::from_value(json!(target_key)).unwrap(); + let target_offer_value: StateContentValue = + serde_json::from_value(json!(target_offer_value)).unwrap(); + let target_lookup_value: StateContentValue = + serde_json::from_value(json!(target_lookup_value)).unwrap(); + + let target_enr = match client_b.rpc.node_info().await { + Ok(node_info) => node_info.enr, + Err(err) => { + panic!("Error getting node info: {err:?}"); + } + }; + + let _ = client_a.rpc.offer(target_enr, target_key.clone(), Some(target_offer_value.clone())).await; + + tokio::time::sleep(Duration::from_secs(8)).await; + + match client_b.rpc.local_content(target_key).await { + Ok(possible_content) => { + if possible_content != target_lookup_value { + panic!("Error receiving content: Expected content: {target_lookup_value:?}, Received content: {possible_content:?}"); + } + } + Err(err) => { + panic!("Unable to get received content: {err:?}"); + } + } + } +} + +dyn_async! { + async fn test_ping<'a>(clients: Vec, _: Option) { + let (client_a, client_b) = match clients.iter().collect_tuple() { + Some((client_a, client_b)) => (client_a, client_b), + None => { + panic!("Unable to get expected amount of clients from NClientTestSpec"); + } + }; + let target_enr = match client_b.rpc.node_info().await { + Ok(node_info) => node_info.enr, + Err(err) => { + panic!("Error getting node info: {err:?}"); + } + }; + + let pong = client_a.rpc.ping(target_enr).await; + + if let Err(err) = pong { + panic!("Unable to receive pong info: {err:?}"); + } + + // Verify that client_b stored client_a its ENR through the base layer + // handshake mechanism. + let stored_enr = match client_a.rpc.node_info().await { + Ok(node_info) => node_info.enr, + Err(err) => { + panic!("Error getting node info: {err:?}"); + } + }; + + match StateNetworkApiClient::get_enr(&client_b.rpc, stored_enr.node_id()).await { + Ok(response) => { + if response != stored_enr { + panic!("Response from GetEnr didn't return expected ENR. Got: {response}; Expected: {stored_enr}") + } + }, + Err(err) => panic!("Failed while trying to get client A's ENR from client B: {err}"), + } + } +} + +dyn_async! { + async fn test_find_nodes_zero_distance<'a>(clients: Vec, _: Option) { + let (client_a, client_b) = match clients.iter().collect_tuple() { + Some((client_a, client_b)) => (client_a, client_b), + None => { + panic!("Unable to get expected amount of clients from NClientTestSpec"); + } + }; + let target_enr = match client_b.rpc.node_info().await { + Ok(node_info) => node_info.enr, + Err(err) => { + panic!("Error getting node info: {err:?}"); + } + }; + + match client_a.rpc.find_nodes(target_enr.clone(), vec![0]).await { + Ok(response) => { + if response.len() != 1 { + panic!("Response from FindNodes didn't return expected length of 1"); + } + + match response.first() { + Some(response_enr) => { + if *response_enr != target_enr { + panic!("Response from FindNodes didn't return expected Enr"); + } + }, + None => panic!("Error find nodes zero distance wasn't supposed to return None"), + } + } + Err(err) => panic!("{}", &err.to_string()), + } + } +} + +dyn_async! { + // test that a node will return a content via RECURSIVEFINDCONTENT template that it has stored locally + async fn test_recursive_find_content<'a>(clients: Vec, test_data: Option) { + let (client_a, client_b) = match clients.iter().collect_tuple() { + Some((client_a, client_b)) => (client_a, client_b), + None => { + panic!("Unable to get expected amount of clients from NClientTestSpec"); + } + }; + let test_data = match test_data.map(|data| data.state_content_list()) { + Some(test_data) => test_data, + None => panic!("Expected test data non was provided"), + }; + + let ContentKeyOfferLookupValues { key: target_key, offer_value: target_offer_value, lookup_value: target_lookup_value } = test_data.first().expect("Target content is required for this test"); + let target_key: StateContentKey = + serde_json::from_value(json!(target_key)).unwrap(); + let target_offer_value: StateContentValue = + serde_json::from_value(json!(target_offer_value)).unwrap(); + let target_lookup_value: StateContentValue = + serde_json::from_value(json!(target_lookup_value)).unwrap(); + match client_b.rpc.store(target_key.clone(), target_offer_value.clone()).await { + Ok(result) => if !result { + panic!("Error storing target content for recursive find content"); + }, + Err(err) => { + panic!("Error storing target content: {err:?}"); + } + } + + let target_enr = match client_b.rpc.node_info().await { + Ok(node_info) => node_info.enr, + Err(err) => { + panic!("Error getting node info: {err:?}"); + } + }; + + match StateNetworkApiClient::add_enr(&client_a.rpc, target_enr.clone()).await { + Ok(response) => match response { + true => (), + false => panic!("AddEnr expected to get true and instead got false") + }, + Err(err) => panic!("{}", &err.to_string()), + } + + match client_a.rpc.recursive_find_content(target_key.clone()).await { + Ok(result) => { + match result { + ContentInfo::Content{ content, utp_transfer } => { + if content != target_lookup_value { + panic!("Error: Unexpected RECURSIVEFINDCONTENT response: didn't return expected target content"); + } + + if target_lookup_value.encode().len() < MAX_PORTAL_CONTENT_PAYLOAD_SIZE { + if utp_transfer { + panic!("Error: Unexpected RECURSIVEFINDCONTENT response: utp_transfer was supposed to be false"); + } + } else if !utp_transfer { + panic!("Error: Unexpected RECURSIVEFINDCONTENT response: utp_transfer was supposed to be true"); + } + }, + other => { + panic!("Error: Unexpected RECURSIVEFINDCONTENT response: {other:?}"); + } + } + }, + Err(err) => { + panic!("Error: Unable to get response from RECURSIVEFINDCONTENT request: {err:?}"); + } + } + } +} + +dyn_async! { + // test that a node will return a x content via FINDCONTENT that it has stored locally + async fn test_find_content<'a> (clients: Vec, test_data: Option) { + let (client_a, client_b) = match clients.iter().collect_tuple() { + Some((client_a, client_b)) => (client_a, client_b), + None => { + panic!("Unable to get expected amount of clients from NClientTestSpec"); + } + }; + let test_data = match test_data.map(|data| data.state_content_list()) { + Some(test_data) => test_data, + None => panic!("Expected test data none was provided"), + }; + + let ContentKeyOfferLookupValues { key: target_key, offer_value: target_offer_value, lookup_value: target_lookup_value } = test_data.first().expect("Target content is required for this test"); + let target_key: StateContentKey = + serde_json::from_value(json!(target_key)).unwrap(); + let target_offer_value: StateContentValue = + serde_json::from_value(json!(target_offer_value)).unwrap(); + let target_lookup_value: StateContentValue = + serde_json::from_value(json!(target_lookup_value)).unwrap(); + match client_b.rpc.store(target_key.clone(), target_offer_value.clone()).await { + Ok(result) => if !result { + panic!("Error storing target content for find content"); + }, + Err(err) => { + panic!("Error storing target content: {err:?}"); + } + } + + let target_enr = match client_b.rpc.node_info().await { + Ok(node_info) => node_info.enr, + Err(err) => { + panic!("Error getting node info: {err:?}"); + } + }; + + match client_a.rpc.find_content(target_enr, target_key.clone()).await { + Ok(result) => { + match result { + ContentInfo::Content{ content, utp_transfer } => { + if content != target_lookup_value { + panic!("Error: Unexpected FINDCONTENT response: didn't return expected block body"); + } + + if target_lookup_value.encode().len() < MAX_PORTAL_CONTENT_PAYLOAD_SIZE { + if utp_transfer { + panic!("Error: Unexpected FINDCONTENT response: utp_transfer was supposed to be false"); + } + } else if !utp_transfer { + panic!("Error: Unexpected FINDCONTENT response: utp_transfer was supposed to be true"); + } + }, + other => { + panic!("Error: Unexpected FINDCONTENT response: {other:?}"); + } + } + }, + Err(err) => { + panic!("Error: Unable to get response from FINDCONTENT request: {err:?}"); + } + } + } +} + +dyn_async! { + async fn test_gossip_two_nodes<'a> (clients: Vec, test_data: Option) { + let (client_a, client_b) = match clients.iter().collect_tuple() { + Some((client_a, client_b)) => (client_a, client_b), + None => { + panic!("Unable to get expected amount of clients from NClientTestSpec"); + } + }; + let test_data = match test_data.map(|data| data.state_content_list()) { + Some(test_data) => test_data, + None => panic!("Expected test data non was provided"), + }; + // connect clients + let client_b_enr = match client_b.rpc.node_info().await { + Ok(node_info) => node_info.enr, + Err(err) => { + panic!("Error getting node info: {err:?}"); + } + }; + match StateNetworkApiClient::add_enr(&client_a.rpc, client_b_enr.clone()).await { + Ok(response) => match response { + true => (), + false => panic!("AddEnr expected to get true and instead got false") + }, + Err(err) => panic!("{}", &err.to_string()), + } + + // With default node settings nodes should be storing all content + for ContentKeyOfferLookupValues { key: content_key, offer_value: content_offer_value, lookup_value: _ } in test_data.clone().into_iter() { + let content_key: StateContentKey = + serde_json::from_value(json!(content_key)).unwrap(); + let content_offer_value: StateContentValue = + serde_json::from_value(json!(content_offer_value)).unwrap(); + + match client_a.rpc.gossip(content_key.clone(), content_offer_value.clone()).await { + Ok(nodes_gossiped_to) => { + if nodes_gossiped_to != 1 { + panic!("We expected to gossip to 1 node instead we gossiped to: {nodes_gossiped_to}"); + } + } + Err(err) => { + panic!("Unable to get received content: {err:?}"); + } + } + + tokio::time::sleep(Duration::from_secs(1)).await; + } + + // wait test_data.len() seconds for data to propagate, giving more time if more items are propagating + tokio::time::sleep(Duration::from_secs(test_data.len() as u64)).await; + + // process raw test data to generate content details for error output + let mut result = vec![]; + for ContentKeyOfferLookupValues { key: content_key, offer_value: _, lookup_value: content_lookup_value } in test_data.into_iter() { + let content_key: StateContentKey = + serde_json::from_value(json!(content_key)).unwrap(); + let content_lookup_value: StateContentValue = + serde_json::from_value(json!(content_lookup_value)).unwrap(); + + let content_details = { + let content_type = match &content_key { + StateContentKey::AccountTrieNode(_) => "account trie node".to_string(), + StateContentKey::ContractStorageTrieNode(_) => "contract stroage trie node".to_string(), + StateContentKey::ContractBytecode(_) => "contract bytecode".to_string(), + }; + format!( + "{:?} {}", + content_key, + content_type + ) + }; + + match client_b.rpc.local_content(content_key.clone()).await { + Ok(expected_value) => { + if expected_value != content_lookup_value { + result.push(format!("Error content received for block {content_details} was different then expected")); + } + } + Err(err) => { + result.push(format!("Error content for block {err} was absent")); + } + } + } + + if !result.is_empty() { + panic!("Client B: {:?}", result); + } + } +} diff --git a/simulators/portal/state/src/suites/mod.rs b/simulators/portal/state/src/suites/mod.rs index 7e92c503f8..02a4b0c6d1 100644 --- a/simulators/portal/state/src/suites/mod.rs +++ b/simulators/portal/state/src/suites/mod.rs @@ -1,2 +1,3 @@ pub mod constants; +pub mod interop; pub mod rpc_compat; diff --git a/simulators/portal/state/src/suites/rpc_compat.rs b/simulators/portal/state/src/suites/rpc_compat.rs index df14c7b8ae..43414c803a 100644 --- a/simulators/portal/state/src/suites/rpc_compat.rs +++ b/simulators/portal/state/src/suites/rpc_compat.rs @@ -1,3 +1,5 @@ +use crate::suites::constants::CONTENT_KEY; +use crate::suites::constants::CONTENT_VALUE; use crate::suites::constants::HIVE_PORTAL_NETWORKS_SELECTED; use crate::suites::constants::STATE_STRING; use crate::suites::constants::TRIN_BRIDGE_CLIENT_TYPE; @@ -10,11 +12,6 @@ use hivesim::{dyn_async, Client, NClientTestSpec, Test}; use serde_json::json; use std::collections::HashMap; -// Bootstrap https://github.com/ethereum/portal-spec-tests/blob/master/tests/mainnet/state/validation/account_trie_node.yaml -const CONTENT_KEY: &str = - "0x20240000000ad14c73a3b489e9cb1c523aef684ed17363e03d33345f2b23c0407f87ee3ff000a97f"; -const CONTENT_VALUE: &str = "0x24000000d4e56740f876aef8c010b86a40d5f56745a118d0906a34e69aec8c0db1cb8fa314000000280200003c0400001006000033060000f90211a090dcaf88c40c7bbc95a912cbdde67c175767b31173df9ee4b0d733bfdd511c43a0babe369f6b12092f49181ae04ca173fb68d1a5456f18d20fa32cba73954052bda0473ecf8a7e36a829e75039a3b055e51b8332cbf03324ab4af2066bbd6fbf0021a0bbda34753d7aa6c38e603f360244e8f59611921d9e1f128372fec0d586d4f9e0a04e44caecff45c9891f74f6a2156735886eedf6f1a733628ebc802ec79d844648a0a5f3f2f7542148c973977c8a1e154c4300fec92f755f7846f1b734d3ab1d90e7a0e823850f50bf72baae9d1733a36a444ab65d0a6faaba404f0583ce0ca4dad92da0f7a00cbe7d4b30b11faea3ae61b7f1f2b315b61d9f6bd68bfe587ad0eeceb721a07117ef9fc932f1a88e908eaead8565c19b5645dc9e5b1b6e841c5edbdfd71681a069eb2de283f32c11f859d7bcf93da23990d3e662935ed4d6b39ce3673ec84472a0203d26456312bbc4da5cd293b75b840fc5045e493d6f904d180823ec22bfed8ea09287b5c21f2254af4e64fca76acc5cd87399c7f1ede818db4326c98ce2dc2208a06fc2d754e304c48ce6a517753c62b1a9c1d5925b89707486d7fc08919e0a94eca07b1c54f15e299bd58bdfef9741538c7828b5d7d11a489f9c20d052b3471df475a051f9dd3739a927c89e357580a4c97b40234aa01ed3d5e0390dc982a7975880a0a089d613f26159af43616fd9455bb461f4869bfede26f2130835ed067a8b967bfb80f90211a068c361d52a1ae36e33155313cd4e838c539d946d85925e5867b747e66995279ea04bfcad7bfdf0fb113e6bf0ebe4d55543688888bd6ad277de20aa0f8a85808808a086816b98cc35e76d6e811646f6c37a73d148a23420bcc03493090639bb8393eca0af4b0b8fcf790b63a8bbc3711f091758d3e4dd424cdc4ded526015c42ca50dcaa0158ecf58c068c4d0452dba821665bbdc6c9c57d6016e53abc18832e9ccfc0b86a016a6ebfa551718656d0b514f948a859964f83d3717e0f055f996772d2f228c2da0a9fd3ba226e84a434bc8d5b974b5131faccdefa6a58a02ddff829fa3d4bb27d5a0cf039eb80d70511d207a7e25160061689d9267630b66d2aaedac436872ae415ba0f24a488dd566079b384e558779c105af0d8f8c8ed564aeab9c7564f393bea56ea05132b24ec0dcf33ec24cb4678aa90b2622141c94345a5dceff21b22284c26251a0c093497e0aeeb4bd0bc461643cf003f87dde10cc1c9925a0b23a409f2048b8e2a0c03b6353e1dcdd3707caa20cd4d6a5c3c59da9f7424bba97ba643f17d42b8b86a0177fd57a9ee5d2d47d712d2daf75f5162a33b604b72766a98daad5509f607b45a09c7945f1f9517363d0cc19dde9ad91222f9d3c0162061182eb114e39a9f605c7a0a8440ef6e36d273b58c65344edab0583a03f09912d22e723dae51cc1d716d786a01df56337e1161f3fe7318ad10bd8e5c42f741c0652bd70d1292c7d0f2f7b88cb80f901d1a01a42abb27509a631169ab7e765e13dec0de47dac9cc7bba9cbc03d9086a0db71a0a0978af82352385b3ed1d0cd6c37a5b2613a989ea01df570edb06df32fdefaff80a0d1cf5bc45e21fa3960d172fe189be5978adab50ca77d11d1c2953eebbbd2d312a005b8054e0db723ad20cc31b1be4d987ae6c6c37c334207120b1f67506f84ad43a0430e5e56596211fcf7b7875da97ac1b1f6ba13189dce330bcaebb9e6d5569f01a003353e7e139443c7b994c347eb7636dcae5b3eac6ba09b3bbb8c588c2e41a958a0cf966488cfb696ed5ac8f67923e4c0912eef7656df7f7586ba2b7ad7072b34b6a0652fb2d2acc28fc9360ac63f29d7886abf602ccbc0cf865061b653415256f357a062d4f171bb087621727a87a01a29d4c8b20864fcb45eb6d60eb929af76aa3485a0dbf844359c229020360ae86751fed8ea41d985ee245da8a27893cc5e1cf55d6fa03ada43c4de6154b5f5567fc27f3a659c3028b321a8040c8713d8b347d7634d3080a0728693f4b5a3f28187456de3217e2985662d52979bfae5a49da65153c50ada8da03c0a8e099ac8060b14d7946c6abc5a0a428defe61781e2cb0736a20ad086e442a07ca441b942818197c8fa360f6d32113277c734eedac7a4539f62e5a27ce404e880e21fa00ad14c73a3b489e9cb1c523aef684ed17363e03d33345f2b23c0407f87ee3ff0f8518080808080808080a01908e7f8035023929a2fa13d9f801a42db49a3063a350da55dd94896a3e9be0a80808080a00cfd334f65fc252dbe0bfa903aaef7bb1546db01627d8eacd919c2bce43b6691808080"; - dyn_async! { pub async fn run_rpc_compat_test_suite<'a> (test: &'a mut Test, _client: Option) { // Get all available portal clients From e428fe21a8b062b276274c88643b8fe075392809 Mon Sep 17 00:00:00 2001 From: Kolby Moroz Liebl <31669092+KolbyML@users.noreply.github.com> Date: Thu, 7 Mar 2024 22:43:50 -0700 Subject: [PATCH 214/387] simulators/portal: clean up rpc_compat (#1036) --- .../portal/beacon/src/suites/rpc_compat.rs | 86 +++++------------- .../portal/history/src/suites/rpc_compat.rs | 88 +++++------------- .../portal/state/src/suites/constants.rs | 3 +- .../portal/state/src/suites/rpc_compat.rs | 90 ++++++------------- 4 files changed, 73 insertions(+), 194 deletions(-) diff --git a/simulators/portal/beacon/src/suites/rpc_compat.rs b/simulators/portal/beacon/src/suites/rpc_compat.rs index 44c664912a..c1a78503d7 100644 --- a/simulators/portal/beacon/src/suites/rpc_compat.rs +++ b/simulators/portal/beacon/src/suites/rpc_compat.rs @@ -4,6 +4,7 @@ use crate::suites::constants::CONSTANT_CONTENT_VALUE; use crate::suites::constants::HIVE_PORTAL_NETWORKS_SELECTED; use crate::suites::constants::TRIN_BRIDGE_CLIENT_TYPE; use ethportal_api::types::enr::generate_random_remote_enr; +use ethportal_api::BeaconContentValue; use ethportal_api::Discv5ApiClient; use ethportal_api::{BeaconContentKey, BeaconNetworkApiClient}; use hivesim::types::ClientDefinition; @@ -201,9 +202,7 @@ dyn_async! { } }; - let response = Discv5ApiClient::node_info(&client.rpc).await; - - if let Err(err) = response { + if let Err(err) = Discv5ApiClient::node_info(&client.rpc).await { panic!("Expected response not received: {err}"); } } @@ -217,17 +216,10 @@ dyn_async! { panic!("Unable to get expected amount of clients from NClientTestSpec"); } }; - let content_key = serde_json::from_value(json!(CONSTANT_CONTENT_KEY)); + let content_key: BeaconContentKey = serde_json::from_value(json!(CONSTANT_CONTENT_KEY)).unwrap(); - match content_key { - Ok(content_key) => { - if let Ok(response) = BeaconNetworkApiClient::local_content(&client.rpc, content_key).await { - panic!("Expected to recieve an error because content wasn't found {response:?}"); - } - } - Err(err) => { - panic!("{}", &err.to_string()); - } + if let Ok(response) = BeaconNetworkApiClient::local_content(&client.rpc, content_key).await { + panic!("Expected to recieve an error because content wasn't found {response:?}"); } } } @@ -240,30 +232,11 @@ dyn_async! { panic!("Unable to get expected amount of clients from NClientTestSpec"); } }; - let content_key = - serde_json::from_value(json!(CONSTANT_CONTENT_KEY)); - - let content_value = - serde_json::from_value(json!(CONSTANT_CONTENT_VALUE)); - - match content_key { - Ok(content_key) => { - match content_value { - Ok(content_value) => { - let response = BeaconNetworkApiClient::store(&client.rpc, content_key, content_value).await; - - if let Err(err) = response { - panic!("{}", &err.to_string()); - } - } - Err(err) => { - panic!("{}", &err.to_string()); - } - } - } - Err(err) => { - panic!("{}", &err.to_string()); - } + let content_key: BeaconContentKey = serde_json::from_value(json!(CONSTANT_CONTENT_KEY)).unwrap(); + let content_value: BeaconContentValue = serde_json::from_value(json!(CONSTANT_CONTENT_VALUE)).unwrap(); + + if let Err(err) = BeaconNetworkApiClient::store(&client.rpc, content_key, content_value).await { + panic!("{}", &err.to_string()); } } } @@ -276,36 +249,23 @@ dyn_async! { panic!("Unable to get expected amount of clients from NClientTestSpec"); } }; - let content_key: Result = - serde_json::from_value(json!(CONSTANT_CONTENT_KEY)); - - let content_value = - serde_json::from_value(json!(CONSTANT_CONTENT_VALUE)); - - - match content_key { - Ok(content_key) => { - // seed CONTENT_KEY/content_value onto the local node to test local_content expect content present - match content_value { - Ok(content_value) => { - let response = BeaconNetworkApiClient::store(&client.rpc, content_key.clone(), content_value).await; - - if let Err(err) = response { - panic!("{}", &err.to_string()); - } - } - Err(err) => { - panic!("{}", &err.to_string()); - } - } + let content_key: BeaconContentKey = serde_json::from_value(json!(CONSTANT_CONTENT_KEY)).unwrap(); + let content_value: BeaconContentValue = serde_json::from_value(json!(CONSTANT_CONTENT_VALUE)).unwrap(); + + // seed CONTENT_KEY/content_value onto the local node to test local_content expect content present + if let Err(err) = BeaconNetworkApiClient::store(&client.rpc, content_key.clone(), content_value.clone()).await { + panic!("{}", &err.to_string()); + } - // Here we are calling local_content RPC to test if the content is present - if let Err(err) = BeaconNetworkApiClient::local_content(&client.rpc, content_key).await { - panic!("Expected content returned from local_content to be present {}", &err.to_string()); + // Here we are calling local_content RPC to test if the content is present + match BeaconNetworkApiClient::local_content(&client.rpc, content_key).await { + Ok(possible_content) => { + if possible_content != content_value { + panic!("Error receiving content: Expected content: {content_value:?}, Received content: {possible_content:?}"); } } Err(err) => { - panic!("{}", &err.to_string()); + panic!("Expected content returned from local_content to be present {}", &err.to_string()); } } } diff --git a/simulators/portal/history/src/suites/rpc_compat.rs b/simulators/portal/history/src/suites/rpc_compat.rs index 497380088e..d3a588f81f 100644 --- a/simulators/portal/history/src/suites/rpc_compat.rs +++ b/simulators/portal/history/src/suites/rpc_compat.rs @@ -1,7 +1,7 @@ use crate::suites::constants::TRIN_BRIDGE_CLIENT_TYPE; use ethportal_api::types::enr::generate_random_remote_enr; use ethportal_api::Discv5ApiClient; -use ethportal_api::{HistoryContentKey, HistoryNetworkApiClient}; +use ethportal_api::{HistoryContentKey, HistoryContentValue, HistoryNetworkApiClient}; use hivesim::types::ClientDefinition; use hivesim::types::TestData; use hivesim::{dyn_async, Client, NClientTestSpec, Test}; @@ -200,9 +200,7 @@ dyn_async! { } }; - let response = Discv5ApiClient::node_info(&client.rpc).await; - - if let Err(err) = response { + if let Err(err) = Discv5ApiClient::node_info(&client.rpc).await { panic!("Expected response not received: {err}"); } } @@ -216,18 +214,10 @@ dyn_async! { panic!("Unable to get expected amount of clients from NClientTestSpec"); } }; - let content_key = - serde_json::from_value(json!(CONTENT_KEY)); + let content_key: HistoryContentKey = serde_json::from_value(json!(CONTENT_KEY)).unwrap(); - match content_key { - Ok(content_key) => { - if let Ok(response) = HistoryNetworkApiClient::local_content(&client.rpc, content_key).await { - panic!("Expected to recieve an error because content wasn't found {response:?}"); - } - } - Err(err) => { - panic!("{}", &err.to_string()); - } + if let Ok(response) = HistoryNetworkApiClient::local_content(&client.rpc, content_key).await { + panic!("Expected to recieve an error because content wasn't found {response:?}"); } } } @@ -240,30 +230,11 @@ dyn_async! { panic!("Unable to get expected amount of clients from NClientTestSpec"); } }; - let content_key = - serde_json::from_value(json!(CONTENT_KEY)); - - let content_value = - serde_json::from_value(json!(CONTENT_VALUE)); - - match content_key { - Ok(content_key) => { - match content_value { - Ok(content_value) => { - let response = HistoryNetworkApiClient::store(&client.rpc, content_key, content_value).await; - - if let Err(err) = response { - panic!("{}", &err.to_string()); - } - } - Err(err) => { - panic!("{}", &err.to_string()); - } - } - } - Err(err) => { - panic!("{}", &err.to_string()); - } + let content_key: HistoryContentKey = serde_json::from_value(json!(CONTENT_KEY)).unwrap(); + let content_value: HistoryContentValue = serde_json::from_value(json!(CONTENT_VALUE)).unwrap(); + + if let Err(err) = HistoryNetworkApiClient::store(&client.rpc, content_key, content_value).await { + panic!("{}", &err.to_string()); } } } @@ -276,36 +247,23 @@ dyn_async! { panic!("Unable to get expected amount of clients from NClientTestSpec"); } }; - let content_key: Result = - serde_json::from_value(json!(CONTENT_KEY)); - - let content_value = - serde_json::from_value(json!(CONTENT_VALUE)); - - - match content_key { - Ok(content_key) => { - // seed content_key/content_value onto the local node to test local_content expect content present - match content_value { - Ok(content_value) => { - let response = HistoryNetworkApiClient::store(&client.rpc, content_key.clone(), content_value).await; - - if let Err(err) = response { - panic!("{}", &err.to_string()); - } - } - Err(err) => { - panic!("{}", &err.to_string()); - } - } + let content_key: HistoryContentKey = serde_json::from_value(json!(CONTENT_KEY)).unwrap(); + let content_value: HistoryContentValue = serde_json::from_value(json!(CONTENT_VALUE)).unwrap(); + + // seed content_key/content_value onto the local node to test local_content expect content present + if let Err(err) = HistoryNetworkApiClient::store(&client.rpc, content_key.clone(), content_value.clone()).await { + panic!("{}", &err.to_string()); + } - // Here we are calling local_content RPC to test if the content is present - if let Err(err) = HistoryNetworkApiClient::local_content(&client.rpc, content_key).await { - panic!("Expected content returned from local_content to be present {}", &err.to_string()); + // Here we are calling local_content RPC to test if the content is present + match HistoryNetworkApiClient::local_content(&client.rpc, content_key).await { + Ok(possible_content) => { + if possible_content != content_value { + panic!("Error receiving content: Expected content: {content_value:?}, Received content: {possible_content:?}"); } } Err(err) => { - panic!("{}", &err.to_string()); + panic!("Expected content returned from local_content to be present {}", &err.to_string()); } } } diff --git a/simulators/portal/state/src/suites/constants.rs b/simulators/portal/state/src/suites/constants.rs index 9b811cb2e8..a7375647d4 100644 --- a/simulators/portal/state/src/suites/constants.rs +++ b/simulators/portal/state/src/suites/constants.rs @@ -8,4 +8,5 @@ pub const TRIN_BRIDGE_CLIENT_TYPE: &str = "trin-bridge"; // Account Trie Node https://github.com/ethereum/portal-spec-tests/blob/master/tests/mainnet/state/validation/account_trie_node.yaml pub const CONTENT_KEY: &str = "0x20240000000ad14c73a3b489e9cb1c523aef684ed17363e03d33345f2b23c0407f87ee3ff000a97f"; -pub const CONTENT_VALUE: &str = "0x24000000d4e56740f876aef8c010b86a40d5f56745a118d0906a34e69aec8c0db1cb8fa314000000280200003c0400001006000033060000f90211a090dcaf88c40c7bbc95a912cbdde67c175767b31173df9ee4b0d733bfdd511c43a0babe369f6b12092f49181ae04ca173fb68d1a5456f18d20fa32cba73954052bda0473ecf8a7e36a829e75039a3b055e51b8332cbf03324ab4af2066bbd6fbf0021a0bbda34753d7aa6c38e603f360244e8f59611921d9e1f128372fec0d586d4f9e0a04e44caecff45c9891f74f6a2156735886eedf6f1a733628ebc802ec79d844648a0a5f3f2f7542148c973977c8a1e154c4300fec92f755f7846f1b734d3ab1d90e7a0e823850f50bf72baae9d1733a36a444ab65d0a6faaba404f0583ce0ca4dad92da0f7a00cbe7d4b30b11faea3ae61b7f1f2b315b61d9f6bd68bfe587ad0eeceb721a07117ef9fc932f1a88e908eaead8565c19b5645dc9e5b1b6e841c5edbdfd71681a069eb2de283f32c11f859d7bcf93da23990d3e662935ed4d6b39ce3673ec84472a0203d26456312bbc4da5cd293b75b840fc5045e493d6f904d180823ec22bfed8ea09287b5c21f2254af4e64fca76acc5cd87399c7f1ede818db4326c98ce2dc2208a06fc2d754e304c48ce6a517753c62b1a9c1d5925b89707486d7fc08919e0a94eca07b1c54f15e299bd58bdfef9741538c7828b5d7d11a489f9c20d052b3471df475a051f9dd3739a927c89e357580a4c97b40234aa01ed3d5e0390dc982a7975880a0a089d613f26159af43616fd9455bb461f4869bfede26f2130835ed067a8b967bfb80f90211a068c361d52a1ae36e33155313cd4e838c539d946d85925e5867b747e66995279ea04bfcad7bfdf0fb113e6bf0ebe4d55543688888bd6ad277de20aa0f8a85808808a086816b98cc35e76d6e811646f6c37a73d148a23420bcc03493090639bb8393eca0af4b0b8fcf790b63a8bbc3711f091758d3e4dd424cdc4ded526015c42ca50dcaa0158ecf58c068c4d0452dba821665bbdc6c9c57d6016e53abc18832e9ccfc0b86a016a6ebfa551718656d0b514f948a859964f83d3717e0f055f996772d2f228c2da0a9fd3ba226e84a434bc8d5b974b5131faccdefa6a58a02ddff829fa3d4bb27d5a0cf039eb80d70511d207a7e25160061689d9267630b66d2aaedac436872ae415ba0f24a488dd566079b384e558779c105af0d8f8c8ed564aeab9c7564f393bea56ea05132b24ec0dcf33ec24cb4678aa90b2622141c94345a5dceff21b22284c26251a0c093497e0aeeb4bd0bc461643cf003f87dde10cc1c9925a0b23a409f2048b8e2a0c03b6353e1dcdd3707caa20cd4d6a5c3c59da9f7424bba97ba643f17d42b8b86a0177fd57a9ee5d2d47d712d2daf75f5162a33b604b72766a98daad5509f607b45a09c7945f1f9517363d0cc19dde9ad91222f9d3c0162061182eb114e39a9f605c7a0a8440ef6e36d273b58c65344edab0583a03f09912d22e723dae51cc1d716d786a01df56337e1161f3fe7318ad10bd8e5c42f741c0652bd70d1292c7d0f2f7b88cb80f901d1a01a42abb27509a631169ab7e765e13dec0de47dac9cc7bba9cbc03d9086a0db71a0a0978af82352385b3ed1d0cd6c37a5b2613a989ea01df570edb06df32fdefaff80a0d1cf5bc45e21fa3960d172fe189be5978adab50ca77d11d1c2953eebbbd2d312a005b8054e0db723ad20cc31b1be4d987ae6c6c37c334207120b1f67506f84ad43a0430e5e56596211fcf7b7875da97ac1b1f6ba13189dce330bcaebb9e6d5569f01a003353e7e139443c7b994c347eb7636dcae5b3eac6ba09b3bbb8c588c2e41a958a0cf966488cfb696ed5ac8f67923e4c0912eef7656df7f7586ba2b7ad7072b34b6a0652fb2d2acc28fc9360ac63f29d7886abf602ccbc0cf865061b653415256f357a062d4f171bb087621727a87a01a29d4c8b20864fcb45eb6d60eb929af76aa3485a0dbf844359c229020360ae86751fed8ea41d985ee245da8a27893cc5e1cf55d6fa03ada43c4de6154b5f5567fc27f3a659c3028b321a8040c8713d8b347d7634d3080a0728693f4b5a3f28187456de3217e2985662d52979bfae5a49da65153c50ada8da03c0a8e099ac8060b14d7946c6abc5a0a428defe61781e2cb0736a20ad086e442a07ca441b942818197c8fa360f6d32113277c734eedac7a4539f62e5a27ce404e880e21fa00ad14c73a3b489e9cb1c523aef684ed17363e03d33345f2b23c0407f87ee3ff0f8518080808080808080a01908e7f8035023929a2fa13d9f801a42db49a3063a350da55dd94896a3e9be0a80808080a00cfd334f65fc252dbe0bfa903aaef7bb1546db01627d8eacd919c2bce43b6691808080"; +pub const CONTENT_OFFER_VALUE: &str = "0x24000000d4e56740f876aef8c010b86a40d5f56745a118d0906a34e69aec8c0db1cb8fa314000000280200003c0400001006000033060000f90211a090dcaf88c40c7bbc95a912cbdde67c175767b31173df9ee4b0d733bfdd511c43a0babe369f6b12092f49181ae04ca173fb68d1a5456f18d20fa32cba73954052bda0473ecf8a7e36a829e75039a3b055e51b8332cbf03324ab4af2066bbd6fbf0021a0bbda34753d7aa6c38e603f360244e8f59611921d9e1f128372fec0d586d4f9e0a04e44caecff45c9891f74f6a2156735886eedf6f1a733628ebc802ec79d844648a0a5f3f2f7542148c973977c8a1e154c4300fec92f755f7846f1b734d3ab1d90e7a0e823850f50bf72baae9d1733a36a444ab65d0a6faaba404f0583ce0ca4dad92da0f7a00cbe7d4b30b11faea3ae61b7f1f2b315b61d9f6bd68bfe587ad0eeceb721a07117ef9fc932f1a88e908eaead8565c19b5645dc9e5b1b6e841c5edbdfd71681a069eb2de283f32c11f859d7bcf93da23990d3e662935ed4d6b39ce3673ec84472a0203d26456312bbc4da5cd293b75b840fc5045e493d6f904d180823ec22bfed8ea09287b5c21f2254af4e64fca76acc5cd87399c7f1ede818db4326c98ce2dc2208a06fc2d754e304c48ce6a517753c62b1a9c1d5925b89707486d7fc08919e0a94eca07b1c54f15e299bd58bdfef9741538c7828b5d7d11a489f9c20d052b3471df475a051f9dd3739a927c89e357580a4c97b40234aa01ed3d5e0390dc982a7975880a0a089d613f26159af43616fd9455bb461f4869bfede26f2130835ed067a8b967bfb80f90211a068c361d52a1ae36e33155313cd4e838c539d946d85925e5867b747e66995279ea04bfcad7bfdf0fb113e6bf0ebe4d55543688888bd6ad277de20aa0f8a85808808a086816b98cc35e76d6e811646f6c37a73d148a23420bcc03493090639bb8393eca0af4b0b8fcf790b63a8bbc3711f091758d3e4dd424cdc4ded526015c42ca50dcaa0158ecf58c068c4d0452dba821665bbdc6c9c57d6016e53abc18832e9ccfc0b86a016a6ebfa551718656d0b514f948a859964f83d3717e0f055f996772d2f228c2da0a9fd3ba226e84a434bc8d5b974b5131faccdefa6a58a02ddff829fa3d4bb27d5a0cf039eb80d70511d207a7e25160061689d9267630b66d2aaedac436872ae415ba0f24a488dd566079b384e558779c105af0d8f8c8ed564aeab9c7564f393bea56ea05132b24ec0dcf33ec24cb4678aa90b2622141c94345a5dceff21b22284c26251a0c093497e0aeeb4bd0bc461643cf003f87dde10cc1c9925a0b23a409f2048b8e2a0c03b6353e1dcdd3707caa20cd4d6a5c3c59da9f7424bba97ba643f17d42b8b86a0177fd57a9ee5d2d47d712d2daf75f5162a33b604b72766a98daad5509f607b45a09c7945f1f9517363d0cc19dde9ad91222f9d3c0162061182eb114e39a9f605c7a0a8440ef6e36d273b58c65344edab0583a03f09912d22e723dae51cc1d716d786a01df56337e1161f3fe7318ad10bd8e5c42f741c0652bd70d1292c7d0f2f7b88cb80f901d1a01a42abb27509a631169ab7e765e13dec0de47dac9cc7bba9cbc03d9086a0db71a0a0978af82352385b3ed1d0cd6c37a5b2613a989ea01df570edb06df32fdefaff80a0d1cf5bc45e21fa3960d172fe189be5978adab50ca77d11d1c2953eebbbd2d312a005b8054e0db723ad20cc31b1be4d987ae6c6c37c334207120b1f67506f84ad43a0430e5e56596211fcf7b7875da97ac1b1f6ba13189dce330bcaebb9e6d5569f01a003353e7e139443c7b994c347eb7636dcae5b3eac6ba09b3bbb8c588c2e41a958a0cf966488cfb696ed5ac8f67923e4c0912eef7656df7f7586ba2b7ad7072b34b6a0652fb2d2acc28fc9360ac63f29d7886abf602ccbc0cf865061b653415256f357a062d4f171bb087621727a87a01a29d4c8b20864fcb45eb6d60eb929af76aa3485a0dbf844359c229020360ae86751fed8ea41d985ee245da8a27893cc5e1cf55d6fa03ada43c4de6154b5f5567fc27f3a659c3028b321a8040c8713d8b347d7634d3080a0728693f4b5a3f28187456de3217e2985662d52979bfae5a49da65153c50ada8da03c0a8e099ac8060b14d7946c6abc5a0a428defe61781e2cb0736a20ad086e442a07ca441b942818197c8fa360f6d32113277c734eedac7a4539f62e5a27ce404e880e21fa00ad14c73a3b489e9cb1c523aef684ed17363e03d33345f2b23c0407f87ee3ff0f8518080808080808080a01908e7f8035023929a2fa13d9f801a42db49a3063a350da55dd94896a3e9be0a80808080a00cfd334f65fc252dbe0bfa903aaef7bb1546db01627d8eacd919c2bce43b6691808080"; +pub const CONTENT_LOOKUP_VALUE: &str = "0x04000000f8518080808080808080a01908e7f8035023929a2fa13d9f801a42db49a3063a350da55dd94896a3e9be0a80808080a00cfd334f65fc252dbe0bfa903aaef7bb1546db01627d8eacd919c2bce43b6691808080"; diff --git a/simulators/portal/state/src/suites/rpc_compat.rs b/simulators/portal/state/src/suites/rpc_compat.rs index 43414c803a..ce716a7834 100644 --- a/simulators/portal/state/src/suites/rpc_compat.rs +++ b/simulators/portal/state/src/suites/rpc_compat.rs @@ -1,11 +1,12 @@ use crate::suites::constants::CONTENT_KEY; -use crate::suites::constants::CONTENT_VALUE; +use crate::suites::constants::CONTENT_LOOKUP_VALUE; +use crate::suites::constants::CONTENT_OFFER_VALUE; use crate::suites::constants::HIVE_PORTAL_NETWORKS_SELECTED; use crate::suites::constants::STATE_STRING; use crate::suites::constants::TRIN_BRIDGE_CLIENT_TYPE; use ethportal_api::types::enr::generate_random_remote_enr; use ethportal_api::Discv5ApiClient; -use ethportal_api::{StateContentKey, StateNetworkApiClient}; +use ethportal_api::{StateContentKey, StateContentValue, StateNetworkApiClient}; use hivesim::types::ClientDefinition; use hivesim::types::TestData; use hivesim::{dyn_async, Client, NClientTestSpec, Test}; @@ -201,9 +202,7 @@ dyn_async! { } }; - let response = Discv5ApiClient::node_info(&client.rpc).await; - - if let Err(err) = response { + if let Err(err) = Discv5ApiClient::node_info(&client.rpc).await { panic!("Expected response not received: {err}"); } } @@ -217,17 +216,10 @@ dyn_async! { panic!("Unable to get expected amount of clients from NClientTestSpec"); } }; - let content_key = serde_json::from_value(json!(CONTENT_KEY)); + let content_key: StateContentKey = serde_json::from_value(json!(CONTENT_KEY)).unwrap(); - match content_key { - Ok(content_key) => { - if let Ok(response) = StateNetworkApiClient::local_content(&client.rpc, content_key).await { - panic!("Expected to recieve an error because content wasn't found {response:?}"); - } - } - Err(err) => { - panic!("{}", &err.to_string()); - } + if let Ok(response) = StateNetworkApiClient::local_content(&client.rpc, content_key).await { + panic!("Expected to recieve an error because content wasn't found {response:?}"); } } } @@ -240,30 +232,11 @@ dyn_async! { panic!("Unable to get expected amount of clients from NClientTestSpec"); } }; - let content_key = - serde_json::from_value(json!(CONTENT_KEY)); - - let content_value = - serde_json::from_value(json!(CONTENT_VALUE)); - - match content_key { - Ok(content_key) => { - match content_value { - Ok(content_value) => { - let response = StateNetworkApiClient::store(&client.rpc, content_key, content_value).await; - - if let Err(err) = response { - panic!("{}", &err.to_string()); - } - } - Err(err) => { - panic!("{}", &err.to_string()); - } - } - } - Err(err) => { - panic!("{}", &err.to_string()); - } + let content_key: StateContentKey = serde_json::from_value(json!(CONTENT_KEY)).unwrap(); + let content_value: StateContentValue = serde_json::from_value(json!(CONTENT_OFFER_VALUE)).unwrap(); + + if let Err(err) = StateNetworkApiClient::store(&client.rpc, content_key, content_value).await { + panic!("{}", &err.to_string()); } } } @@ -276,36 +249,23 @@ dyn_async! { panic!("Unable to get expected amount of clients from NClientTestSpec"); } }; - let content_key: Result = - serde_json::from_value(json!(CONTENT_KEY)); - - let content_value = - serde_json::from_value(json!(CONTENT_VALUE)); - - - match content_key { - Ok(content_key) => { - // seed content_key/content_value onto the local node to test local_content expect content present - match content_value { - Ok(content_value) => { - let response = StateNetworkApiClient::store(&client.rpc, content_key.clone(), content_value).await; - - if let Err(err) = response { - panic!("{}", &err.to_string()); - } - } - Err(err) => { - panic!("{}", &err.to_string()); - } - } + let content_key: StateContentKey = serde_json::from_value(json!(CONTENT_KEY)).unwrap(); + let content_offer_value: StateContentValue = serde_json::from_value(json!(CONTENT_OFFER_VALUE)).unwrap(); + let content_lookup_value: StateContentValue = serde_json::from_value(json!(CONTENT_LOOKUP_VALUE)).unwrap(); + + if let Err(err) = StateNetworkApiClient::store(&client.rpc, content_key.clone(), content_offer_value).await { + panic!("{}", &err.to_string()); + } - // Here we are calling local_content RPC to test if the content is present - if let Err(err) = StateNetworkApiClient::local_content(&client.rpc, content_key).await { - panic!("Expected content returned from local_content to be present {}", &err.to_string()); + // Here we are calling local_content RPC to test if the content is present + match StateNetworkApiClient::local_content(&client.rpc, content_key).await { + Ok(possible_content) => { + if possible_content != content_lookup_value { + panic!("Error receiving content: Expected content: {content_lookup_value:?}, Received content: {possible_content:?}"); } } Err(err) => { - panic!("{}", &err.to_string()); + panic!("Expected content returned from local_content to be present {}", &err.to_string()); } } } From b19a15182902087fd17ae3b500bc42a24c39422f Mon Sep 17 00:00:00 2001 From: Kolby Moroz Liebl <31669092+KolbyML@users.noreply.github.com> Date: Fri, 8 Mar 2024 03:04:15 -0700 Subject: [PATCH 215/387] simulators/portal/state: fix state interop suite name (#1037) --- simulators/portal/state/src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/simulators/portal/state/src/main.rs b/simulators/portal/state/src/main.rs index 1e628014d4..ef286b1623 100644 --- a/simulators/portal/state/src/main.rs +++ b/simulators/portal/state/src/main.rs @@ -25,7 +25,7 @@ async fn main() { }); let mut interop = Suite { - name: "history-interop".to_string(), + name: "state-interop".to_string(), description: "The interop test suite runs a set of scenarios to test interoperability between portal network clients" From d78973b36630ca3d4e39e971d2f680a6dffac57a Mon Sep 17 00:00:00 2001 From: Mario Vega Date: Fri, 8 Mar 2024 15:20:29 -0600 Subject: [PATCH 216/387] clients/prysm: use `latest` tag instead of `latest-debug` (#1038) --- clients/prysm-bn/Dockerfile | 2 +- clients/prysm-vc/Dockerfile | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/clients/prysm-bn/Dockerfile b/clients/prysm-bn/Dockerfile index ba2ff1241b..520c7087f7 100644 --- a/clients/prysm-bn/Dockerfile +++ b/clients/prysm-bn/Dockerfile @@ -1,5 +1,5 @@ ARG baseimage=gcr.io/prysmaticlabs/prysm/beacon-chain -ARG tag=latest-debug +ARG tag=latest FROM $baseimage:$tag as upstream diff --git a/clients/prysm-vc/Dockerfile b/clients/prysm-vc/Dockerfile index 98b0395699..5431580a0e 100644 --- a/clients/prysm-vc/Dockerfile +++ b/clients/prysm-vc/Dockerfile @@ -1,5 +1,5 @@ ARG baseimage=gcr.io/prysmaticlabs/prysm/validator -ARG tag=latest-debug +ARG tag=latest FROM $baseimage:$tag as upstream From 51dd64e2db4ef458768c26eeea90a0ab1a901c69 Mon Sep 17 00:00:00 2001 From: Mario Vega Date: Tue, 12 Mar 2024 18:23:55 -0600 Subject: [PATCH 217/387] simulators/eth2/dencun: Builder suite: Poll mock builder to wait for the CL to request payloads (#1039) * simulators/eth2/dencun: Builder: Poll get-header requests instead of static wait * simulators/eth2/dencun: Docs update --- simulators/eth2/common/go.mod | 2 +- simulators/eth2/common/go.sum | 2 + simulators/eth2/dencun/go.mod | 2 +- simulators/eth2/dencun/go.sum | 2 + simulators/eth2/dencun/suites/base/TESTS.md | 6 +- simulators/eth2/dencun/suites/base/config.go | 4 +- .../eth2/dencun/suites/base/execution.go | 2 + .../eth2/dencun/suites/builder/TESTS.md | 66 +++++++++---------- .../eth2/dencun/suites/builder/config.go | 40 +++-------- .../eth2/dencun/suites/builder/execution.go | 45 +++++++++++-- .../eth2/dencun/suites/builder/tests.go | 6 ++ .../dencun/suites/p2p/gossip/blobs/TESTS.md | 27 +++++--- simulators/eth2/dencun/suites/reorg/TESTS.md | 6 +- simulators/eth2/dencun/suites/sync/TESTS.md | 6 +- 14 files changed, 126 insertions(+), 90 deletions(-) diff --git a/simulators/eth2/common/go.mod b/simulators/eth2/common/go.mod index 6539ed9237..a4118cfd68 100644 --- a/simulators/eth2/common/go.mod +++ b/simulators/eth2/common/go.mod @@ -14,7 +14,7 @@ require ( github.com/lithammer/dedent v1.1.0 github.com/marioevz/blobber v1.1.1-0.20240306221924-a7e22e59ea34 github.com/marioevz/eth-clients v0.0.0-20231123180401-b4230c802498 - github.com/marioevz/mock-builder v1.1.1-0.20231123171249-08b59e943190 + github.com/marioevz/mock-builder v1.2.1-0.20240312201838-ad9ba388e88b github.com/pkg/errors v0.9.1 github.com/protolambda/bls12-381-util v0.0.0-20220416220906-d8552aa452c7 github.com/protolambda/eth2api v0.0.0-20230316214135-5f8afbd6d05d diff --git a/simulators/eth2/common/go.sum b/simulators/eth2/common/go.sum index cea7090af5..efe35ac17b 100644 --- a/simulators/eth2/common/go.sum +++ b/simulators/eth2/common/go.sum @@ -374,6 +374,8 @@ github.com/marioevz/eth2api v0.0.0-20230922201437-72bd1301e033 h1:sn57n+lbJrLS8F github.com/marioevz/eth2api v0.0.0-20230922201437-72bd1301e033/go.mod h1:hcwWCT4sF1X7KsMZ535MvDZVk5M20Uyj+x2LARZjQsM= github.com/marioevz/mock-builder v1.1.1-0.20231123171249-08b59e943190 h1:vBXJeLFGRKZid18H4JQ+vhR+AQKU6fkx0Uc8JVMc3OI= github.com/marioevz/mock-builder v1.1.1-0.20231123171249-08b59e943190/go.mod h1:17VX12ir8TOY2Ln2vy3jhjeVIGfrwmcsxY9VI0ZP1Zk= +github.com/marioevz/mock-builder v1.2.1-0.20240312201838-ad9ba388e88b h1:tQ+fxfY5YHxOimJN1/NJ/ofPGMZA1ZX0OsU2Rm/xfE0= +github.com/marioevz/mock-builder v1.2.1-0.20240312201838-ad9ba388e88b/go.mod h1:17VX12ir8TOY2Ln2vy3jhjeVIGfrwmcsxY9VI0ZP1Zk= github.com/marioevz/zrnt v0.26.2-0.20231109183115-d2098ec1f42c h1:ZwKLkGVKnAq1JZql6SBrQici0la1X7APcbBLwmrSsd4= github.com/marioevz/zrnt v0.26.2-0.20231109183115-d2098ec1f42c/go.mod h1:ZctXHBa/2rlF85iao8oqQ8264DbEBBGWr6lwIOW2yv4= github.com/marioevz/ztyp v0.0.0-20231106221254-dd6f24f13fd9 h1:e40k7kQLw2jyDg4+Mc+TVSSfm1TO51NxPZo9T7nVCzM= diff --git a/simulators/eth2/dencun/go.mod b/simulators/eth2/dencun/go.mod index 126ca2c875..62d23e23f1 100644 --- a/simulators/eth2/dencun/go.mod +++ b/simulators/eth2/dencun/go.mod @@ -11,7 +11,7 @@ require ( github.com/ethereum/hive/simulators/ethereum/engine v0.0.0-20240305231022-f69df863de20 github.com/lithammer/dedent v1.1.0 github.com/marioevz/blobber v1.1.1-0.20240306221924-a7e22e59ea34 - github.com/marioevz/mock-builder v1.1.1-0.20231123171249-08b59e943190 + github.com/marioevz/mock-builder v1.2.1-0.20240312201838-ad9ba388e88b github.com/protolambda/eth2api v0.0.0-20230316214135-5f8afbd6d05d github.com/protolambda/zrnt v0.32.3 ) diff --git a/simulators/eth2/dencun/go.sum b/simulators/eth2/dencun/go.sum index acefc8671a..9af310a1bc 100644 --- a/simulators/eth2/dencun/go.sum +++ b/simulators/eth2/dencun/go.sum @@ -454,6 +454,8 @@ github.com/marioevz/eth2api v0.0.0-20230922201437-72bd1301e033 h1:sn57n+lbJrLS8F github.com/marioevz/eth2api v0.0.0-20230922201437-72bd1301e033/go.mod h1:hcwWCT4sF1X7KsMZ535MvDZVk5M20Uyj+x2LARZjQsM= github.com/marioevz/mock-builder v1.1.1-0.20231123171249-08b59e943190 h1:vBXJeLFGRKZid18H4JQ+vhR+AQKU6fkx0Uc8JVMc3OI= github.com/marioevz/mock-builder v1.1.1-0.20231123171249-08b59e943190/go.mod h1:17VX12ir8TOY2Ln2vy3jhjeVIGfrwmcsxY9VI0ZP1Zk= +github.com/marioevz/mock-builder v1.2.1-0.20240312201838-ad9ba388e88b h1:tQ+fxfY5YHxOimJN1/NJ/ofPGMZA1ZX0OsU2Rm/xfE0= +github.com/marioevz/mock-builder v1.2.1-0.20240312201838-ad9ba388e88b/go.mod h1:17VX12ir8TOY2Ln2vy3jhjeVIGfrwmcsxY9VI0ZP1Zk= github.com/marioevz/zrnt v0.26.2-0.20231109183115-d2098ec1f42c h1:ZwKLkGVKnAq1JZql6SBrQici0la1X7APcbBLwmrSsd4= github.com/marioevz/zrnt v0.26.2-0.20231109183115-d2098ec1f42c/go.mod h1:ZctXHBa/2rlF85iao8oqQ8264DbEBBGWr6lwIOW2yv4= github.com/marioevz/ztyp v0.0.0-20231106221254-dd6f24f13fd9 h1:e40k7kQLw2jyDg4+Mc+TVSSfm1TO51NxPZo9T7nVCzM= diff --git a/simulators/eth2/dencun/suites/base/TESTS.md b/simulators/eth2/dencun/suites/base/TESTS.md index 2265488e1a..783ce8371b 100644 --- a/simulators/eth2/dencun/suites/base/TESTS.md +++ b/simulators/eth2/dencun/suites/base/TESTS.md @@ -38,7 +38,8 @@ Sanity test to check the fork transition to deneb. - Node Count: 2 - Validating Node Count: 2 - Validator Key Count: 128 -- Validator Key per Node: 64- Genesis Fork: Capella +- Validator Key per Node: 64 +- Genesis Fork: Capella - Execution Withdrawal Credentials Count: 128 - BLS Withdrawal Credentials Count: 0 @@ -78,7 +79,8 @@ Sanity test to check the beacon clients can start with deneb genesis. - Node Count: 2 - Validating Node Count: 2 - Validator Key Count: 128 -- Validator Key per Node: 64- Genesis Fork: Deneb +- Validator Key per Node: 64 +- Genesis Fork: Deneb - Execution Withdrawal Credentials Count: 128 - BLS Withdrawal Credentials Count: 0 diff --git a/simulators/eth2/dencun/suites/base/config.go b/simulators/eth2/dencun/suites/base/config.go index fc846cb04c..3a00e40b26 100644 --- a/simulators/eth2/dencun/suites/base/config.go +++ b/simulators/eth2/dencun/suites/base/config.go @@ -171,9 +171,9 @@ func (ts BaseTestSpec) GetDescription() *utils.Description { ts.GetValidatorCount()/uint64(ts.GetValidatingNodeCount()), )) if ts.DenebGenesis { - desc.Add(utils.CategoryTestnetConfiguration, "- Genesis Fork: Deneb") + desc.Add(utils.CategoryTestnetConfiguration, "\n- Genesis Fork: Deneb") } else { - desc.Add(utils.CategoryTestnetConfiguration, "- Genesis Fork: Capella") + desc.Add(utils.CategoryTestnetConfiguration, "\n- Genesis Fork: Capella") } execCredentialCount := ts.GetExecutionWithdrawalCredentialCount() blsCredentialCount := ts.GetValidatorCount() - execCredentialCount diff --git a/simulators/eth2/dencun/suites/base/execution.go b/simulators/eth2/dencun/suites/base/execution.go index dc38a65164..b58aded748 100644 --- a/simulators/eth2/dencun/suites/base/execution.go +++ b/simulators/eth2/dencun/suites/base/execution.go @@ -238,6 +238,8 @@ func (ts BaseTestSpec) ExecutePostForkWait( t.Logf("INFO: all clients have produced a block with blobs") break out } + + testnet.BeaconClients().Running().PrintStatus(blobsWaitCtx) } } } diff --git a/simulators/eth2/dencun/suites/builder/TESTS.md b/simulators/eth2/dencun/suites/builder/TESTS.md index c283800f46..5267d0053c 100644 --- a/simulators/eth2/dencun/suites/builder/TESTS.md +++ b/simulators/eth2/dencun/suites/builder/TESTS.md @@ -46,13 +46,13 @@ Test canonical chain includes deneb payloads built by the builder api. - Node Count: 2 - Validating Node Count: 2 - Validator Key Count: 128 -- Validator Key per Node: 64- Genesis Fork: Capella +- Validator Key per Node: 64 +- Genesis Fork: Deneb - Execution Withdrawal Credentials Count: 0 - BLS Withdrawal Credentials Count: 128 -- Deneb/Cancun transition occurs on Epoch 1 or 5 - - Epoch depends on whether builder workflow activation requires finalization [on the CL client](#clients-that-require-finalization-to-enable-builder). +- Deneb starts from genesis. - Builder is enabled for all nodes -- Builder action is only enabled after fork +- Builder action is enabled from genesis - Nodes have the mock-builder configured as builder endpoint #### Verifications (Execution Client) @@ -65,8 +65,7 @@ Test canonical chain includes deneb payloads built by the builder api. - For each blob transaction on the execution chain, the blob sidecars are available for the beacon block at the same height - The beacon block lists the correct commitments for each blob -- Verify that the builder, up to before Deneb fork, has been able to produce blocks and they have been included in the canonical chain -- After Deneb fork, the builder must be able to include blocks with blobs in the canonical chain, which implicitly verifies: +- The builder must be able to include blocks with blobs in the canonical chain, which implicitly verifies: - Consensus client is able to properly format header requests to the builder - Consensus client is able to properly format blinded signed requests to the builder - No signed block contained an invalid format or signature @@ -97,13 +96,13 @@ building payloads with invalid parent beacon block root. - Node Count: 2 - Validating Node Count: 2 - Validator Key Count: 128 -- Validator Key per Node: 64- Genesis Fork: Capella +- Validator Key per Node: 64 +- Genesis Fork: Deneb - Execution Withdrawal Credentials Count: 128 - BLS Withdrawal Credentials Count: 0 -- Deneb/Cancun transition occurs on Epoch 1 or 5 - - Epoch depends on whether builder workflow activation requires finalization [on the CL client](#clients-that-require-finalization-to-enable-builder). +- Deneb starts from genesis. - Builder is enabled for all nodes -- Builder action is only enabled after fork +- Builder action is enabled from genesis - Nodes have the mock-builder configured as builder endpoint #### Verifications (Execution Client) @@ -116,8 +115,7 @@ building payloads with invalid parent beacon block root. - For each blob transaction on the execution chain, the blob sidecars are available for the beacon block at the same height - The beacon block lists the correct commitments for each blob -- Verify that the builder, up to before Deneb fork, has been able to produce blocks and they have been included in the canonical chain -- After Deneb fork, the builder starts producing invalid payloads, verify that: +- The builder starts producing invalid payloads, verify that: - None of the produced payloads are included in the canonical chain - Since action causes missed slot, verify that the circuit breaker correctly kicks in and disables the builder workflow. Builder starts corrupting payloads after fork, hence a single block in the canonical chain after the fork is enough to verify the circuit breaker @@ -146,13 +144,13 @@ returning error on header request after deneb transition. - Node Count: 2 - Validating Node Count: 2 - Validator Key Count: 128 -- Validator Key per Node: 64- Genesis Fork: Capella +- Validator Key per Node: 64 +- Genesis Fork: Deneb - Execution Withdrawal Credentials Count: 128 - BLS Withdrawal Credentials Count: 0 -- Deneb/Cancun transition occurs on Epoch 1 or 5 - - Epoch depends on whether builder workflow activation requires finalization [on the CL client](#clients-that-require-finalization-to-enable-builder). +- Deneb starts from genesis. - Builder is enabled for all nodes -- Builder action is only enabled after fork +- Builder action is enabled from genesis - Nodes have the mock-builder configured as builder endpoint #### Verifications (Execution Client) @@ -165,8 +163,7 @@ returning error on header request after deneb transition. - For each blob transaction on the execution chain, the blob sidecars are available for the beacon block at the same height - The beacon block lists the correct commitments for each blob -- Verify that the builder, up to before Deneb fork, has been able to produce blocks and they have been included in the canonical chain -- After Deneb fork, the builder starts producing invalid payloads, verify that: +- The builder starts producing invalid payloads, verify that: - None of the produced payloads are included in the canonical chain ### - Deneb Builder Errors Out on Signed Blinded Beacon Block/Blob Sidecars Submission After Deneb Transition @@ -194,13 +191,13 @@ returning error on unblinded payload request after deneb transition. - Node Count: 2 - Validating Node Count: 2 - Validator Key Count: 128 -- Validator Key per Node: 64- Genesis Fork: Capella +- Validator Key per Node: 64 +- Genesis Fork: Deneb - Execution Withdrawal Credentials Count: 128 - BLS Withdrawal Credentials Count: 0 -- Deneb/Cancun transition occurs on Epoch 1 or 5 - - Epoch depends on whether builder workflow activation requires finalization [on the CL client](#clients-that-require-finalization-to-enable-builder). +- Deneb starts from genesis. - Builder is enabled for all nodes -- Builder action is only enabled after fork +- Builder action is enabled from genesis - Nodes have the mock-builder configured as builder endpoint #### Verifications (Execution Client) @@ -213,8 +210,7 @@ returning error on unblinded payload request after deneb transition. - For each blob transaction on the execution chain, the blob sidecars are available for the beacon block at the same height - The beacon block lists the correct commitments for each blob -- Verify that the builder, up to before Deneb fork, has been able to produce blocks and they have been included in the canonical chain -- After Deneb fork, the builder starts producing invalid payloads, verify that: +- The builder starts producing invalid payloads, verify that: - None of the produced payloads are included in the canonical chain - Since action causes missed slot, verify that the circuit breaker correctly kicks in and disables the builder workflow. Builder starts corrupting payloads after fork, hence a single block in the canonical chain after the fork is enough to verify the circuit breaker @@ -243,13 +239,13 @@ version is outdated (capella instead of deneb). - Node Count: 2 - Validating Node Count: 2 - Validator Key Count: 128 -- Validator Key per Node: 64- Genesis Fork: Capella +- Validator Key per Node: 64 +- Genesis Fork: Deneb - Execution Withdrawal Credentials Count: 128 - BLS Withdrawal Credentials Count: 0 -- Deneb/Cancun transition occurs on Epoch 1 or 5 - - Epoch depends on whether builder workflow activation requires finalization [on the CL client](#clients-that-require-finalization-to-enable-builder). +- Deneb starts from genesis. - Builder is enabled for all nodes -- Builder action is only enabled after fork +- Builder action is enabled from genesis - Nodes have the mock-builder configured as builder endpoint #### Verifications (Execution Client) @@ -262,8 +258,7 @@ version is outdated (capella instead of deneb). - For each blob transaction on the execution chain, the blob sidecars are available for the beacon block at the same height - The beacon block lists the correct commitments for each blob -- Verify that the builder, up to before Deneb fork, has been able to produce blocks and they have been included in the canonical chain -- After Deneb fork, the builder starts producing invalid payloads, verify that: +- The builder starts producing invalid payloads, verify that: - None of the produced payloads are included in the canonical chain ### - Deneb Builder Builds Block With Invalid Beacon Root, Incorrect State Root @@ -296,13 +291,13 @@ produced locally and results in an empty slot. - Node Count: 2 - Validating Node Count: 2 - Validator Key Count: 128 -- Validator Key per Node: 64- Genesis Fork: Capella +- Validator Key per Node: 64 +- Genesis Fork: Deneb - Execution Withdrawal Credentials Count: 128 - BLS Withdrawal Credentials Count: 0 -- Deneb/Cancun transition occurs on Epoch 1 or 5 - - Epoch depends on whether builder workflow activation requires finalization [on the CL client](#clients-that-require-finalization-to-enable-builder). +- Deneb starts from genesis. - Builder is enabled for all nodes -- Builder action is only enabled after fork +- Builder action is enabled from genesis - Nodes have the mock-builder configured as builder endpoint #### Verifications (Execution Client) @@ -315,8 +310,7 @@ produced locally and results in an empty slot. - For each blob transaction on the execution chain, the blob sidecars are available for the beacon block at the same height - The beacon block lists the correct commitments for each blob -- Verify that the builder, up to before Deneb fork, has been able to produce blocks and they have been included in the canonical chain -- After Deneb fork, the builder starts producing invalid payloads, verify that: +- The builder starts producing invalid payloads, verify that: - None of the produced payloads are included in the canonical chain - Since action causes missed slot, verify that the circuit breaker correctly kicks in and disables the builder workflow. Builder starts corrupting payloads after fork, hence a single block in the canonical chain after the fork is enough to verify the circuit breaker diff --git a/simulators/eth2/dencun/suites/builder/config.go b/simulators/eth2/dencun/suites/builder/config.go index 678b2388c8..fdf46ec2cc 100644 --- a/simulators/eth2/dencun/suites/builder/config.go +++ b/simulators/eth2/dencun/suites/builder/config.go @@ -16,11 +16,6 @@ var REQUIRES_FINALIZATION_TO_ACTIVATE_BUILDER = []string{ "teku", } -var ( - DEFAULT_FORK_WAIT_EPOCHS = int64(2) - DEFAULT_FORK_WAIT_FOR_FINALIZATION_EPOCHS = int64(5) -) - type BuilderTestSpec struct { suite_base.BaseTestSpec VerifyMissedSlotsCount bool @@ -36,18 +31,6 @@ func (ts BuilderTestSpec) GetTestnetConfig( ) *testnet.Config { tc := ts.BaseTestSpec.GetTestnetConfig(allNodeDefinitions) - tc.DenebForkEpoch = big.NewInt(DEFAULT_FORK_WAIT_EPOCHS) - - if len( - allNodeDefinitions.FilterByCL( - REQUIRES_FINALIZATION_TO_ACTIVATE_BUILDER, - ), - ) > 0 { - // At least one of the CLs require finalization to start requesting - // headers from the builder - tc.DenebForkEpoch = big.NewInt(DEFAULT_FORK_WAIT_FOR_FINALIZATION_EPOCHS) - } - // Builders are always enabled for these tests tc.EnableBuilders = true @@ -63,24 +46,24 @@ func (ts BuilderTestSpec) GetTestnetConfig( ) // Inject test error - denebEpoch := beacon.Epoch(tc.DenebForkEpoch.Uint64()) + errorInjectEpoch := beacon.Epoch(0) if ts.ErrorOnHeaderRequest { tc.BuilderOptions = append( tc.BuilderOptions, - mock_builder.WithErrorOnHeaderRequestAtEpoch(denebEpoch), + mock_builder.WithErrorOnHeaderRequestAtEpoch(errorInjectEpoch), ) } if ts.ErrorOnPayloadReveal { tc.BuilderOptions = append( tc.BuilderOptions, - mock_builder.WithErrorOnPayloadRevealAtEpoch(denebEpoch), + mock_builder.WithErrorOnPayloadRevealAtEpoch(errorInjectEpoch), ) } if ts.InvalidatePayload != "" { tc.BuilderOptions = append( tc.BuilderOptions, mock_builder.WithPayloadInvalidatorAtEpoch( - denebEpoch, + errorInjectEpoch, ts.InvalidatePayload, ), ) @@ -89,7 +72,7 @@ func (ts BuilderTestSpec) GetTestnetConfig( tc.BuilderOptions = append( tc.BuilderOptions, mock_builder.WithPayloadAttributesInvalidatorAtEpoch( - denebEpoch, + errorInjectEpoch, ts.InvalidatePayloadAttributes, ), ) @@ -97,7 +80,7 @@ func (ts BuilderTestSpec) GetTestnetConfig( if ts.InvalidPayloadVersion { tc.BuilderOptions = append( tc.BuilderOptions, - mock_builder.WithInvalidBuilderBidVersionAtEpoch(denebEpoch), + mock_builder.WithInvalidBuilderBidVersionAtEpoch(errorInjectEpoch), ) } @@ -107,23 +90,20 @@ func (ts BuilderTestSpec) GetTestnetConfig( func (ts BuilderTestSpec) GetDescription() *utils.Description { desc := ts.BaseTestSpec.GetDescription() desc.Add(utils.CategoryTestnetConfiguration, ` - - Deneb/Cancun transition occurs on Epoch 1 or 5 - - Epoch depends on whether builder workflow activation requires finalization [on the CL client](#clients-that-require-finalization-to-enable-builder). + - Deneb starts from genesis. - Builder is enabled for all nodes - - Builder action is only enabled after fork + - Builder action is enabled from genesis - Nodes have the mock-builder configured as builder endpoint`) - desc.Add(utils.CategoryVerificationsConsensusClient, ` - - Verify that the builder, up to before Deneb fork, has been able to produce blocks and they have been included in the canonical chain`) if ts.BuilderProducesValidPayload() { desc.Add(utils.CategoryVerificationsConsensusClient, ` - - After Deneb fork, the builder must be able to include blocks with blobs in the canonical chain, which implicitly verifies: + - The builder must be able to include blocks with blobs in the canonical chain, which implicitly verifies: - Consensus client is able to properly format header requests to the builder - Consensus client is able to properly format blinded signed requests to the builder - No signed block contained an invalid format or signature - Test fails with a timeout if no payload with blobs is produced after the fork`) } else { desc.Add(utils.CategoryVerificationsConsensusClient, ` - - After Deneb fork, the builder starts producing invalid payloads, verify that: + - The builder starts producing invalid payloads, verify that: - None of the produced payloads are included in the canonical chain`) if ts.CausesMissedSlot() { desc.Add(utils.CategoryVerificationsConsensusClient, ` diff --git a/simulators/eth2/dencun/suites/builder/execution.go b/simulators/eth2/dencun/suites/builder/execution.go index 22a0212e41..2635ccd2bb 100644 --- a/simulators/eth2/dencun/suites/builder/execution.go +++ b/simulators/eth2/dencun/suites/builder/execution.go @@ -5,6 +5,7 @@ import ( "context" "encoding/json" "math/big" + "time" "github.com/ethereum/hive/hivesim" tn "github.com/ethereum/hive/simulators/eth2/common/testnet" @@ -56,11 +57,42 @@ func (ts BuilderTestSpec) ExecutePostFork( env *tn.Environment, config *tn.Config, ) { - // Run the base test spec execute function - ts.BaseTestSpec.ExecutePostFork(t, ctx, testnet, env, config) - - // Check that the builder was working properly until now - if !ts.DenebGenesis { + if ts.DenebGenesis { + // Wait until the builder has been requested at least one header with + // a max timeout of 5 epochs. + t.Log("INFO: waiting for the builder to be requested for payloads") + timeoutCtx, cancel := testnet.Spec().EpochTimeoutContext(ctx, 5) + defer cancel() + for { + select { + case <-timeoutCtx.Done(): + t.Fatalf("FAIL: timeout waiting for the builder to be request for payloads") + case <-time.After(time.Duration(testnet.Spec().SECONDS_PER_SLOT) * time.Second): + } + allClientsRequested := true + for i, b := range testnet.BeaconClients().Running() { + builder, ok := b.Builder.(*mock_builder.MockBuilder) + if !ok { + t.Fatalf( + "FAIL: client %d (%s) is not a mock builder", + i, + b.ClientName(), + ) + } + headerRequests := builder.GetHeaderRequests() + if len(headerRequests) == 0 { + allClientsRequested = false + break + } + } + if allClientsRequested { + t.Log("INFO: all clients requested their respective builders") + break + } + testnet.BeaconClients().Running().PrintStatus(timeoutCtx) + } + } else { + // Check that the builder was working properly until now for i, b := range testnet.BeaconClients().Running() { builder, ok := b.Builder.(*mock_builder.MockBuilder) if !ok { @@ -81,6 +113,9 @@ func (ts BuilderTestSpec) ExecutePostFork( } } } + + // Run the base test spec execute function + ts.BaseTestSpec.ExecutePostFork(t, ctx, testnet, env, config) } func (ts BuilderTestSpec) BuilderProducesValidPayload() bool { diff --git a/simulators/eth2/dencun/suites/builder/tests.go b/simulators/eth2/dencun/suites/builder/tests.go index e0c1e87497..ad88df4e75 100644 --- a/simulators/eth2/dencun/suites/builder/tests.go +++ b/simulators/eth2/dencun/suites/builder/tests.go @@ -32,6 +32,7 @@ func init() { Test canonical chain includes deneb payloads built by the builder api.`, // All validators start with BLS withdrawal credentials GenesisExecutionWithdrawalCredentialsShares: 0, + DenebGenesis: true, WaitForBlobs: true, }, }, @@ -44,6 +45,7 @@ func init() { building payloads with invalid parent beacon block root.`, // All validators can withdraw from the start GenesisExecutionWithdrawalCredentialsShares: 1, + DenebGenesis: true, WaitForBlobs: true, }, InvalidatePayloadAttributes: mock_builder.INVALIDATE_ATTR_BEACON_ROOT, @@ -57,6 +59,7 @@ func init() { returning error on header request after deneb transition.`, // All validators can withdraw from the start GenesisExecutionWithdrawalCredentialsShares: 1, + DenebGenesis: true, WaitForBlobs: true, }, ErrorOnHeaderRequest: true, @@ -70,6 +73,7 @@ func init() { returning error on unblinded payload request after deneb transition.`, // All validators can withdraw from the start GenesisExecutionWithdrawalCredentialsShares: 1, + DenebGenesis: true, WaitForBlobs: true, }, ErrorOnPayloadReveal: true, @@ -83,6 +87,7 @@ func init() { version is outdated (capella instead of deneb).`, // All validators can withdraw from the start GenesisExecutionWithdrawalCredentialsShares: 1, + DenebGenesis: true, WaitForBlobs: true, }, InvalidPayloadVersion: true, @@ -101,6 +106,7 @@ func init() { produced locally and results in an empty slot.`, // All validators can withdraw from the start GenesisExecutionWithdrawalCredentialsShares: 1, + DenebGenesis: true, WaitForBlobs: true, }, InvalidatePayload: mock_builder.INVALIDATE_PAYLOAD_BEACON_ROOT, diff --git a/simulators/eth2/dencun/suites/p2p/gossip/blobs/TESTS.md b/simulators/eth2/dencun/suites/p2p/gossip/blobs/TESTS.md index e30700922a..d5804b7320 100644 --- a/simulators/eth2/dencun/suites/p2p/gossip/blobs/TESTS.md +++ b/simulators/eth2/dencun/suites/p2p/gossip/blobs/TESTS.md @@ -40,7 +40,8 @@ Sanity test where the blobber is verified to be working correctly - Node Count: 2 - Validating Node Count: 2 - Validator Key Count: 128 -- Validator Key per Node: 64- Genesis Fork: Deneb +- Validator Key per Node: 64 +- Genesis Fork: Deneb - Execution Withdrawal Credentials Count: 128 - BLS Withdrawal Credentials Count: 0 @@ -88,7 +89,8 @@ Test chain health where the blobs are gossiped before the block - Node Count: 2 - Validating Node Count: 2 - Validator Key Count: 128 -- Validator Key per Node: 64- Genesis Fork: Deneb +- Validator Key per Node: 64 +- Genesis Fork: Deneb - Execution Withdrawal Credentials Count: 128 - BLS Withdrawal Credentials Count: 0 @@ -136,7 +138,8 @@ Test chain health where the blobs are gossiped after the block with a 500ms dela - Node Count: 2 - Validating Node Count: 2 - Validator Key Count: 128 -- Validator Key per Node: 64- Genesis Fork: Deneb +- Validator Key per Node: 64 +- Genesis Fork: Deneb - Execution Withdrawal Credentials Count: 128 - BLS Withdrawal Credentials Count: 0 @@ -185,7 +188,8 @@ Test chain health where the blobs are gossiped after the block with a 6s delay - Node Count: 2 - Validating Node Count: 2 - Validator Key Count: 128 -- Validator Key per Node: 64- Genesis Fork: Deneb +- Validator Key per Node: 64 +- Genesis Fork: Deneb - Execution Withdrawal Credentials Count: 128 - BLS Withdrawal Credentials Count: 0 @@ -241,7 +245,8 @@ delay makes the test more deterministic. - Node Count: 2 - Validating Node Count: 2 - Validator Key Count: 128 -- Validator Key per Node: 64- Genesis Fork: Deneb +- Validator Key per Node: 64 +- Genesis Fork: Deneb - Execution Withdrawal Credentials Count: 128 - BLS Withdrawal Credentials Count: 0 @@ -290,7 +295,8 @@ Test chain health if a proposer sends equivocating blobs and block to different - Node Count: 2 - Validating Node Count: 2 - Validator Key Count: 128 -- Validator Key per Node: 64- Genesis Fork: Deneb +- Validator Key per Node: 64 +- Genesis Fork: Deneb - Execution Withdrawal Credentials Count: 128 - BLS Withdrawal Credentials Count: 0 @@ -339,7 +345,8 @@ Test chain health if a proposer sends equivocating blob sidecars (equivocating b - Node Count: 2 - Validating Node Count: 2 - Validator Key Count: 128 -- Validator Key per Node: 64- Genesis Fork: Deneb +- Validator Key per Node: 64 +- Genesis Fork: Deneb - Execution Withdrawal Credentials Count: 128 - BLS Withdrawal Credentials Count: 0 @@ -388,7 +395,8 @@ Test chain health if a proposer sends equivocating blob sidecars (equivocating b - Node Count: 2 - Validating Node Count: 2 - Validator Key Count: 128 -- Validator Key per Node: 64- Genesis Fork: Deneb +- Validator Key per Node: 64 +- Genesis Fork: Deneb - Execution Withdrawal Credentials Count: 128 - BLS Withdrawal Credentials Count: 0 @@ -437,7 +445,8 @@ Test chain health if a proposer sends equivocating blob sidecars (equivocating b - Node Count: 2 - Validating Node Count: 2 - Validator Key Count: 128 -- Validator Key per Node: 64- Genesis Fork: Deneb +- Validator Key per Node: 64 +- Genesis Fork: Deneb - Execution Withdrawal Credentials Count: 128 - BLS Withdrawal Credentials Count: 0 diff --git a/simulators/eth2/dencun/suites/reorg/TESTS.md b/simulators/eth2/dencun/suites/reorg/TESTS.md index ed37ef6301..378f55d6fd 100644 --- a/simulators/eth2/dencun/suites/reorg/TESTS.md +++ b/simulators/eth2/dencun/suites/reorg/TESTS.md @@ -41,7 +41,8 @@ Start two clients disconnected from each other, then connect them through a thir - Node Count: 5 - Validating Node Count: 5 - Validator Key Count: 128 -- Validator Key per Node: 25- Genesis Fork: Capella +- Validator Key per Node: 25 +- Genesis Fork: Capella - Execution Withdrawal Credentials Count: 0 - BLS Withdrawal Credentials Count: 128 @@ -82,7 +83,8 @@ Start two clients disconnected from each other, then connect them through a thir - Node Count: 5 - Validating Node Count: 5 - Validator Key Count: 128 -- Validator Key per Node: 25- Genesis Fork: Deneb +- Validator Key per Node: 25 +- Genesis Fork: Deneb - Execution Withdrawal Credentials Count: 0 - BLS Withdrawal Credentials Count: 128 diff --git a/simulators/eth2/dencun/suites/sync/TESTS.md b/simulators/eth2/dencun/suites/sync/TESTS.md index 84a3193441..c0cf94995c 100644 --- a/simulators/eth2/dencun/suites/sync/TESTS.md +++ b/simulators/eth2/dencun/suites/sync/TESTS.md @@ -53,7 +53,8 @@ Test syncing of the beacon chain by a secondary non-validating client, sync from - Node Count: 3 - Validating Node Count: 2 - Validator Key Count: 128 -- Validator Key per Node: 64- Genesis Fork: Capella +- Validator Key per Node: 64 +- Genesis Fork: Capella - Execution Withdrawal Credentials Count: 0 - BLS Withdrawal Credentials Count: 128 @@ -105,7 +106,8 @@ Test syncing of the beacon chain by a secondary non-validating client, sync from - Node Count: 3 - Validating Node Count: 2 - Validator Key Count: 128 -- Validator Key per Node: 64- Genesis Fork: Deneb +- Validator Key per Node: 64 +- Genesis Fork: Deneb - Execution Withdrawal Credentials Count: 0 - BLS Withdrawal Credentials Count: 128 From 6b77836d629036d51811c4d70e54391cf9dfc1dd Mon Sep 17 00:00:00 2001 From: Kolby Moroz Liebl <31669092+KolbyML@users.noreply.github.com> Date: Thu, 14 Mar 2024 23:53:52 -0600 Subject: [PATCH 218/387] simulators/portal: set version of sigp/enr library as breaking change was pushed on minor release (#1053) simulators/portal: fix the version of sigp/enr library as breaking change was pushed on minor release --- simulators/portal/beacon/Cargo.toml | 3 +++ simulators/portal/history/Cargo.toml | 3 +++ simulators/portal/state/Cargo.toml | 3 +++ 3 files changed, 9 insertions(+) diff --git a/simulators/portal/beacon/Cargo.toml b/simulators/portal/beacon/Cargo.toml index d38d620c6a..09e24c86b9 100755 --- a/simulators/portal/beacon/Cargo.toml +++ b/simulators/portal/beacon/Cargo.toml @@ -14,3 +14,6 @@ serde_json = "1.0.87" tracing = "0.1.37" tracing-subscriber = "0.3.16" tokio = { version = "1", features = ["full"] } + +# todo: remove this when we update discv5. Added this because enr 10.1 is a breaking change +enr = { version = "=0.10.0", features = ["k256", "ed25519"] } diff --git a/simulators/portal/history/Cargo.toml b/simulators/portal/history/Cargo.toml index 0057f4e5e2..3a0332d1bd 100755 --- a/simulators/portal/history/Cargo.toml +++ b/simulators/portal/history/Cargo.toml @@ -15,3 +15,6 @@ tracing-subscriber = "0.3.16" itertools = "0.10.5" serde_yaml = "0.9" tokio = { version = "1", features = ["full"] } + +# todo: remove this when we update discv5. Added this because enr 10.1 is a breaking change +enr = { version = "=0.10.0", features = ["k256", "ed25519"] } diff --git a/simulators/portal/state/Cargo.toml b/simulators/portal/state/Cargo.toml index a028738eb9..9b2a3aa94e 100755 --- a/simulators/portal/state/Cargo.toml +++ b/simulators/portal/state/Cargo.toml @@ -14,3 +14,6 @@ serde_yaml = "0.9" tracing = "0.1.37" tracing-subscriber = "0.3.16" tokio = { version = "1", features = ["full"] } + +# todo: remove this when we update discv5. Added this because enr 10.1 is a breaking change +enr = { version = "=0.10.0", features = ["k256", "ed25519"] } From 11ac58e07fe33c8d495eca68aa9272b4c868f40b Mon Sep 17 00:00:00 2001 From: Kolby Moroz Liebl <31669092+KolbyML@users.noreply.github.com> Date: Mon, 18 Mar 2024 11:38:05 -0600 Subject: [PATCH 219/387] simulators/portal: bump ethportal-api (#1054) --- simulators/portal/beacon/Cargo.toml | 2 +- simulators/portal/history/Cargo.toml | 2 +- simulators/portal/state/Cargo.toml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/simulators/portal/beacon/Cargo.toml b/simulators/portal/beacon/Cargo.toml index 09e24c86b9..e349247665 100755 --- a/simulators/portal/beacon/Cargo.toml +++ b/simulators/portal/beacon/Cargo.toml @@ -5,7 +5,7 @@ authors = ["Kolby ML (Moroz Liebl) "] edition = "2021" [dependencies] -ethportal-api = { git = "https://github.com/ethereum/trin", tag = "v0.1.0-alpha.22" } +ethportal-api = { git = "https://github.com/ethereum/trin", rev = "33ea99da64216899f7ab2778d117a18506d963dd" } hivesim = { git = "https://github.com/ethereum/portal-hive", rev = "0f830ea8999f2878eb78ef67efc9f80cc888413e" } futures = "0.3.25" itertools = "0.10.5" diff --git a/simulators/portal/history/Cargo.toml b/simulators/portal/history/Cargo.toml index 3a0332d1bd..bd06fa9667 100755 --- a/simulators/portal/history/Cargo.toml +++ b/simulators/portal/history/Cargo.toml @@ -5,7 +5,7 @@ authors = ["Ognyan Genev ", "Kolby ML (Moroz Liebl) "] edition = "2021" [dependencies] -ethportal-api = { git = "https://github.com/ethereum/trin", tag = "v0.1.0-alpha.22" } +ethportal-api = { git = "https://github.com/ethereum/trin", rev = "33ea99da64216899f7ab2778d117a18506d963dd" } hivesim = { git = "https://github.com/ethereum/portal-hive", rev = "0f830ea8999f2878eb78ef67efc9f80cc888413e" } futures = "0.3.25" itertools = "0.10.5" From 0db3956a7025fa111380dde23f2b1689e7da0212 Mon Sep 17 00:00:00 2001 From: Kolby Moroz Liebl <31669092+KolbyML@users.noreply.github.com> Date: Mon, 18 Mar 2024 14:49:58 -0600 Subject: [PATCH 220/387] simulators/portal/history: bump tests util crate adding cancun (#1055) --- simulators/portal/history/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/simulators/portal/history/Cargo.toml b/simulators/portal/history/Cargo.toml index bd06fa9667..24103d2bf3 100755 --- a/simulators/portal/history/Cargo.toml +++ b/simulators/portal/history/Cargo.toml @@ -6,7 +6,7 @@ edition = "2021" [dependencies] ethportal-api = { git = "https://github.com/ethereum/trin", rev = "33ea99da64216899f7ab2778d117a18506d963dd" } -portal-spec-test-utils-rs = { git = "https://github.com/ethereum/portal-spec-tests", rev = "d1e996d0d4dc2136b3cd38d9e25cdc3a6b74dcd9" } +portal-spec-test-utils-rs = { git = "https://github.com/ethereum/portal-spec-tests", rev = "954f7d0eb2950a2131048404a1a4ce476bb64657" } hivesim = { git = "https://github.com/ethereum/portal-hive", rev = "0f830ea8999f2878eb78ef67efc9f80cc888413e" } futures = "0.3.25" serde_json = "1.0.87" From 370b08386cd860c62680415e68165101d73d62af Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Tue, 19 Mar 2024 16:09:18 +0100 Subject: [PATCH 221/387] go.mod: upgrade to github.com/fsouza/go-dockerclient v1.11.0 --- go.mod | 22 +++++++++++++--------- go.sum | 23 +++++++++++++++++++++++ 2 files changed, 36 insertions(+), 9 deletions(-) diff --git a/go.mod b/go.mod index 3ceb02db0b..ea7d1c4634 100644 --- a/go.mod +++ b/go.mod @@ -1,15 +1,17 @@ module github.com/ethereum/hive -go 1.20 +go 1.21 + +toolchain go1.22.1 require ( github.com/davecgh/go-spew v1.1.1 github.com/ethereum/go-ethereum v1.13.5-0.20231031113925-bc42e88415d3 github.com/ethereum/hive/hiveproxy v0.0.0-20230919105823-37cbbe1ef86d github.com/evanw/esbuild v0.18.11 - github.com/fsouza/go-dockerclient v1.9.8 + github.com/fsouza/go-dockerclient v1.11.0 github.com/golang-jwt/jwt/v4 v4.5.0 - github.com/gorilla/mux v1.8.0 + github.com/gorilla/mux v1.8.1 github.com/holiman/uint256 v1.2.3 github.com/lithammer/dedent v1.1.0 golang.org/x/exp v0.0.0-20230905200255-921286631fa9 @@ -35,11 +37,12 @@ require ( github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect github.com/consensys/bavard v0.1.13 // indirect github.com/consensys/gnark-crypto v0.12.1 // indirect - github.com/containerd/containerd v1.6.18 // indirect + github.com/containerd/containerd v1.6.26 // indirect + github.com/containerd/log v0.1.0 // indirect github.com/crate-crypto/go-kzg-4844 v0.7.0 // indirect github.com/deckarep/golang-set/v2 v2.1.0 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 // indirect - github.com/docker/docker v24.0.7+incompatible // indirect + github.com/docker/docker v25.0.4+incompatible // indirect github.com/docker/go-connections v0.4.0 // indirect github.com/docker/go-units v0.5.0 // indirect github.com/ethereum/c-kzg-4844 v0.4.0 // indirect @@ -63,11 +66,12 @@ require ( github.com/mmcloughlin/addchain v0.4.0 // indirect github.com/moby/patternmatcher v0.6.0 // indirect github.com/moby/sys/sequential v0.5.0 // indirect + github.com/moby/sys/user v0.1.0 // indirect github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6 // indirect github.com/morikuni/aec v1.0.0 // indirect github.com/olekukonko/tablewriter v0.0.5 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect - github.com/opencontainers/image-spec v1.0.3-0.20211202183452-c5a74bcca799 // indirect + github.com/opencontainers/image-spec v1.1.0-rc2.0.20221005185240-3a7f492d3f1b // indirect github.com/opencontainers/runc v1.1.5 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/prometheus/client_golang v1.14.0 // indirect @@ -77,7 +81,7 @@ require ( github.com/rivo/uniseg v0.4.3 // indirect github.com/rogpeppe/go-internal v1.9.0 // indirect github.com/shirou/gopsutil v3.21.11+incompatible // indirect - github.com/sirupsen/logrus v1.9.0 // indirect + github.com/sirupsen/logrus v1.9.3 // indirect github.com/supranational/blst v0.3.11 // indirect github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a // indirect github.com/tklauser/go-sysconf v0.3.12 // indirect @@ -86,10 +90,10 @@ require ( golang.org/x/crypto v0.14.0 // indirect golang.org/x/mod v0.12.0 // indirect golang.org/x/sync v0.3.0 // indirect - golang.org/x/sys v0.13.0 // indirect + golang.org/x/sys v0.18.0 // indirect golang.org/x/text v0.13.0 // indirect golang.org/x/tools v0.13.0 // indirect - google.golang.org/protobuf v1.28.1 // indirect + google.golang.org/protobuf v1.31.0 // indirect rsc.io/tmplfunc v0.0.3 // indirect ) diff --git a/go.sum b/go.sum index 437148d4f5..285faef9f2 100644 --- a/go.sum +++ b/go.sum @@ -12,6 +12,7 @@ github.com/Joker/hpp v1.0.0/go.mod h1:8x5n+M1Hp5hC0g8okX3sR3vFQwynaX/UgSOM9MeBKz github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= github.com/Microsoft/hcsshim v0.9.6 h1:VwnDOgLeoi2du6dAznfmspNqTiwczvjv4K7NxuY9jsY= +github.com/Microsoft/hcsshim v0.9.10 h1:TxXGNmcbQxBKVWvjvTocNb6jrPyeHlk5EiDhhgHgggs= github.com/Shopify/goreferrer v0.0.0-20181106222321-ec9c9a553398/go.mod h1:a1uqRtAwp2Xwc6WNPJEufxJ7fx3npB4UV/JOLmbu5I0= github.com/VictoriaMetrics/fastcache v1.12.1 h1:i0mICQuojGDL3KblA7wUNlY5lOK6a4bwt3uRKnkZU40= github.com/VictoriaMetrics/fastcache v1.12.1/go.mod h1:tX04vaqcNoQeGLD+ra5pU5sWkuxnzWhEzLwhP9w653o= @@ -59,6 +60,10 @@ github.com/consensys/gnark-crypto v0.12.1/go.mod h1:v2Gy7L/4ZRosZ7Ivs+9SfUDr0f5U github.com/containerd/console v1.0.3/go.mod h1:7LqA/THxQ86k76b8c/EMSiaJ3h1eZkMkXar0TQ1gf3U= github.com/containerd/containerd v1.6.18 h1:qZbsLvmyu+Vlty0/Ex5xc0z2YtKpIsb5n45mAMI+2Ns= github.com/containerd/containerd v1.6.18/go.mod h1:1RdCUu95+gc2v9t3IL+zIlpClSmew7/0YS8O5eQZrOw= +github.com/containerd/containerd v1.6.26 h1:VVfrE6ZpyisvB1fzoY8Vkiq4sy+i5oF4uk7zu03RaHs= +github.com/containerd/containerd v1.6.26/go.mod h1:I4TRdsdoo5MlKob5khDJS2EPT1l1oMNaE2MBm6FrwxM= +github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I= +github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= @@ -83,6 +88,8 @@ github.com/dgraph-io/badger v1.6.0/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6ps github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/docker/docker v24.0.7+incompatible h1:Wo6l37AuwP3JaMnZa226lzVXGA3F9Ig1seQen0cKYlM= github.com/docker/docker v24.0.7+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v25.0.4+incompatible h1:XITZTrq+52tZyZxUOtFIahUf3aH367FLxJzt9vZeAF8= +github.com/docker/docker v25.0.4+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= @@ -110,6 +117,8 @@ github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmV github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= github.com/fsouza/go-dockerclient v1.9.8 h1:UdfyV4/w8VthS2VS0muJqUSPL/e6XSj49jqPnbuUOWA= github.com/fsouza/go-dockerclient v1.9.8/go.mod h1:74lNReDQxrOaogajs51IvZgkDME4qe9yPJAUEUTJtHw= +github.com/fsouza/go-dockerclient v1.11.0 h1:4ZAk6W7rPAtPXm7198EFqA5S68rwnNQORxlOA5OurCA= +github.com/fsouza/go-dockerclient v1.11.0/go.mod h1:0I3TQCRseuPTzqlY4Y3ajfsg2VAdMQoazrkxJTiJg8s= github.com/gavv/httpexpect v2.0.0+incompatible/go.mod h1:x+9tiU1YnrOvnB725RkpoLv1M62hOWzwo5OXotisrKc= github.com/getsentry/sentry-go v0.12.0/go.mod h1:NSap0JBYWzHND8oMbyi0+XZhUalc1TBdRL1M71JZW2c= github.com/getsentry/sentry-go v0.18.0 h1:MtBW5H9QgdcJabtZcuJG80BMOwaBpkRDZkxRkNC1sN0= @@ -170,6 +179,7 @@ github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= @@ -178,6 +188,8 @@ github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+ github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= +github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= +github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= @@ -262,6 +274,8 @@ github.com/moby/patternmatcher v0.6.0/go.mod h1:hDPoyOpDY7OrrMDLaYoY3hf52gNCR/YO github.com/moby/sys/mountinfo v0.5.0/go.mod h1:3bMD3Rg+zkqx8MRYPi7Pyb0Ie97QEBmdxbhnCLlSvSU= github.com/moby/sys/sequential v0.5.0 h1:OPvI35Lzn9K04PBbCLW0g4LcFAJgHsvXsRyewg5lXtc= github.com/moby/sys/sequential v0.5.0/go.mod h1:tH2cOOs5V9MlPiXcQzRC+eEyab644PWKGRYaaV5ZZlo= +github.com/moby/sys/user v0.1.0 h1:WmZ93f5Ux6het5iituh9x2zAG7NFY9Aqi49jjE1PaQg= +github.com/moby/sys/user v0.1.0/go.mod h1:fKJhFOnsCN6xZ5gSfbM6zaHGgDJMrqt9/reuj4T7MmU= github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6 h1:dcztxKSvZ4Id8iPpHERQBbIJfabdt4wUm5qy3wOL2Zc= github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6/go.mod h1:E2VnQOmVuvZB6UYnnDB0qG5Nq/1tD9acaOpo6xmt0Kw= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -297,6 +311,8 @@ github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8 github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opencontainers/image-spec v1.0.3-0.20211202183452-c5a74bcca799 h1:rc3tiVYb5z54aKaDfakKn0dDjIyPpTtszkjuMzyt7ec= github.com/opencontainers/image-spec v1.0.3-0.20211202183452-c5a74bcca799/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= +github.com/opencontainers/image-spec v1.1.0-rc2.0.20221005185240-3a7f492d3f1b h1:YWuSjZCQAPM8UUBLkYUk1e+rZcvWHJmFb6i6rM44Xs8= +github.com/opencontainers/image-spec v1.1.0-rc2.0.20221005185240-3a7f492d3f1b/go.mod h1:3OVijpioIKYWTqjiG0zfF6wvoJ4fAXGbjdZuI2NgsRQ= github.com/opencontainers/runc v1.1.5 h1:L44KXEpKmfWDcS02aeGm8QNTFXTo2D+8MYGDIJ/GDEs= github.com/opencontainers/runc v1.1.5/go.mod h1:1J5XiS+vdZ3wCyZybsuxXZWGrgSr8fFJHLXuG2PsnNg= github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= @@ -338,6 +354,8 @@ github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeV github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0= github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= +github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= @@ -493,9 +511,12 @@ golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= +golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.13.0 h1:bb+I9cTfFazGW51MZqBVmZy7+JEJMouUHTUSKVQLBek= +golang.org/x/term v0.18.0 h1:FcHjZXDMxI8mM3nwhX9HlKop4C0YQvCVCdwYl2wOtE8= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= @@ -554,6 +575,8 @@ google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQ google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= +google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= From d286d6d14d654d2bb6a63618f0a078e1ccc4c709 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Tue, 19 Mar 2024 16:14:28 +0100 Subject: [PATCH 222/387] go.mod: remove github.com/opencontainers/runc dependency --- go.mod | 1 - go.sum | 69 +++++++++++++--------------------------------------------- 2 files changed, 15 insertions(+), 55 deletions(-) diff --git a/go.mod b/go.mod index ea7d1c4634..4084baceee 100644 --- a/go.mod +++ b/go.mod @@ -72,7 +72,6 @@ require ( github.com/olekukonko/tablewriter v0.0.5 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect github.com/opencontainers/image-spec v1.1.0-rc2.0.20221005185240-3a7f492d3f1b // indirect - github.com/opencontainers/runc v1.1.5 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/prometheus/client_golang v1.14.0 // indirect github.com/prometheus/client_model v0.3.0 // indirect diff --git a/go.sum b/go.sum index 285faef9f2..ff66ad2c6b 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,6 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= github.com/AdaLogics/go-fuzz-headers v0.0.0-20210715213245-6c3934b029d8 h1:V8krnnfGj4pV65YLUm3C0/8bl7V5Nry2Pwvy3ru/wLc= +github.com/AdaLogics/go-fuzz-headers v0.0.0-20210715213245-6c3934b029d8/go.mod h1:CzsSbkDixRphAF5hS6wbMKq0eI6ccJRb7/A0M6JBnwg= github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8= github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= @@ -11,8 +12,8 @@ github.com/DataDog/zstd v1.5.2/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwS github.com/Joker/hpp v1.0.0/go.mod h1:8x5n+M1Hp5hC0g8okX3sR3vFQwynaX/UgSOM9MeBKzY= github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= -github.com/Microsoft/hcsshim v0.9.6 h1:VwnDOgLeoi2du6dAznfmspNqTiwczvjv4K7NxuY9jsY= github.com/Microsoft/hcsshim v0.9.10 h1:TxXGNmcbQxBKVWvjvTocNb6jrPyeHlk5EiDhhgHgggs= +github.com/Microsoft/hcsshim v0.9.10/go.mod h1:7pLA8lDk46WKDWlVsENo92gC0XFa8rbKfyFRBqxEbCc= github.com/Shopify/goreferrer v0.0.0-20181106222321-ec9c9a553398/go.mod h1:a1uqRtAwp2Xwc6WNPJEufxJ7fx3npB4UV/JOLmbu5I0= github.com/VictoriaMetrics/fastcache v1.12.1 h1:i0mICQuojGDL3KblA7wUNlY5lOK6a4bwt3uRKnkZU40= github.com/VictoriaMetrics/fastcache v1.12.1/go.mod h1:tX04vaqcNoQeGLD+ra5pU5sWkuxnzWhEzLwhP9w653o= @@ -29,18 +30,18 @@ github.com/bits-and-blooms/bitset v1.7.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edY github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U= github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= +github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/checkpoint-restore/go-criu/v5 v5.3.0/go.mod h1:E/eQpaFtUKGOOSEBZgmKAcn+zUUwWxqcaKZlF54wK8E= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/cilium/ebpf v0.7.0/go.mod h1:/oI2+1shJiTGAMgl6/RgJr36Eo1jzrRcAWbcXO2usCA= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cockroachdb/datadriven v1.0.2/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f h1:otljaYPt5hWxV3MUfO5dFPFiOXg9CyG5/kCfayTqsJ4= +github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= github.com/cockroachdb/errors v1.9.1 h1:yFVvsI0VxmRShfawbt/laCIDy/mtTqqnvoNgiy5bEV8= github.com/cockroachdb/errors v1.9.1/go.mod h1:2sxOtL2WIc096WSZqZ5h8fa17rdDq9HZOZLBCor4mBk= github.com/cockroachdb/logtags v0.0.0-20211118104740-dabe8e521a4f/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= @@ -57,9 +58,6 @@ github.com/consensys/bavard v0.1.13 h1:oLhMLOFGTLdlda/kma4VOJazblc7IM5y5QPd2A/Yj github.com/consensys/bavard v0.1.13/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI= github.com/consensys/gnark-crypto v0.12.1 h1:lHH39WuuFgVHONRl3J0LRBtuYdQTumFSDtJF7HpyG8M= github.com/consensys/gnark-crypto v0.12.1/go.mod h1:v2Gy7L/4ZRosZ7Ivs+9SfUDr0f5UlG+EM5t7MPHiLuY= -github.com/containerd/console v1.0.3/go.mod h1:7LqA/THxQ86k76b8c/EMSiaJ3h1eZkMkXar0TQ1gf3U= -github.com/containerd/containerd v1.6.18 h1:qZbsLvmyu+Vlty0/Ex5xc0z2YtKpIsb5n45mAMI+2Ns= -github.com/containerd/containerd v1.6.18/go.mod h1:1RdCUu95+gc2v9t3IL+zIlpClSmew7/0YS8O5eQZrOw= github.com/containerd/containerd v1.6.26 h1:VVfrE6ZpyisvB1fzoY8Vkiq4sy+i5oF4uk7zu03RaHs= github.com/containerd/containerd v1.6.26/go.mod h1:I4TRdsdoo5MlKob5khDJS2EPT1l1oMNaE2MBm6FrwxM= github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I= @@ -67,32 +65,27 @@ github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3 github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= -github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/crate-crypto/go-kzg-4844 v0.7.0 h1:C0vgZRk4q4EZ/JgPfzuSoxdCq3C3mOZMBShovmncxvA= github.com/crate-crypto/go-kzg-4844 v0.7.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/creack/pty v1.1.11 h1:07n33Z8lZxZ2qwegKbObQohDhXDQxiMMz1NOUGYlesw= github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/cyphar/filepath-securejoin v0.2.3/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/deckarep/golang-set/v2 v2.1.0 h1:g47V4Or+DUdzbs8FxCCmgb6VYd+ptPAngjM6dtGktsI= github.com/deckarep/golang-set/v2 v2.1.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0= +github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 h1:HbphB4TFFXpv7MNrT52FGrrgVXF1owhMVTHFZIlnvd4= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0/go.mod h1:DZGJHZMqrU4JJqFAWUS2UO1+lbSKsdiOoYi9Zzey7Fc= github.com/dgraph-io/badger v1.6.0/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6psNgSztDR4= github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= -github.com/docker/docker v24.0.7+incompatible h1:Wo6l37AuwP3JaMnZa226lzVXGA3F9Ig1seQen0cKYlM= -github.com/docker/docker v24.0.7+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/docker v25.0.4+incompatible h1:XITZTrq+52tZyZxUOtFIahUf3aH367FLxJzt9vZeAF8= github.com/docker/docker v25.0.4+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= -github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= @@ -110,13 +103,11 @@ github.com/evanw/esbuild v0.18.11 h1:Mb0qb9KyJQraob0Y7LA0DOdD8ijJs2TxhqgqrDeGq4w github.com/evanw/esbuild v0.18.11/go.mod h1:iINY06rn799hi48UqEnaQvVfZWe6W9bET78LbvN8VWk= github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072/go.mod h1:duJ4Jxv5lDcvg4QuQr0oowTf7dz4/CR8NtyCooz9HL8= github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= -github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= -github.com/fsouza/go-dockerclient v1.9.8 h1:UdfyV4/w8VthS2VS0muJqUSPL/e6XSj49jqPnbuUOWA= -github.com/fsouza/go-dockerclient v1.9.8/go.mod h1:74lNReDQxrOaogajs51IvZgkDME4qe9yPJAUEUTJtHw= +github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= github.com/fsouza/go-dockerclient v1.11.0 h1:4ZAk6W7rPAtPXm7198EFqA5S68rwnNQORxlOA5OurCA= github.com/fsouza/go-dockerclient v1.11.0/go.mod h1:0I3TQCRseuPTzqlY4Y3ajfsg2VAdMQoazrkxJTiJg8s= github.com/gavv/httpexpect v2.0.0+incompatible/go.mod h1:x+9tiU1YnrOvnB725RkpoLv1M62hOWzwo5OXotisrKc= @@ -128,6 +119,7 @@ github.com/gin-gonic/gin v1.4.0/go.mod h1:OW2EZn3DO8Ln9oIKOvM++LBO+5UPHJJDH72/q/ github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= +github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab/go.mod h1:/P9AEU963A2AYjv4d1V5eVL1CQbEJq6aCNHDDjibzu8= github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= @@ -137,8 +129,6 @@ github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg78 github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= -github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/godbus/dbus/v5 v5.0.6/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= github.com/gogo/googleapis v0.0.0-20180223154316-0cd9801be74a/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= @@ -176,18 +166,15 @@ github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMyw github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= -github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= @@ -228,7 +215,6 @@ github.com/klauspost/compress v1.15.15 h1:EF27CXIuDsYJ6mmvtBRlEuB2UVOqHG1tAXgZ7y github.com/klauspost/compress v1.15.15/go.mod h1:ZcK2JAFqKOpnBlxcLsJzYfrS9X1akm9fHZNnD9+Vo/4= github.com/klauspost/cpuid v1.2.1/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= @@ -237,9 +223,11 @@ github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= +github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/labstack/echo/v4 v4.5.0/go.mod h1:czIriw4a0C1dFun+ObrXp7ok03xON0N1awStJ6ArI7Y= github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c= +github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= github.com/lithammer/dedent v1.1.0 h1:VNzHMVCBNG1j0fh3OrsFRkVUwStdDArbgBWoPAffktY= github.com/lithammer/dedent v1.1.0/go.mod h1:jrXYCQtgg0nJiN+StA2KgR7w6CiQNv9Fd/Z9BP0jIOc= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= @@ -271,7 +259,6 @@ github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqky github.com/mmcloughlin/profile v0.1.1/go.mod h1:IhHD7q1ooxgwTgjxQYkACGA77oFTDdFVejUS1/tS/qU= github.com/moby/patternmatcher v0.6.0 h1:GmP9lR19aU5GqSSFko+5pRqHi+Ohk1O69aFiKkVGiPk= github.com/moby/patternmatcher v0.6.0/go.mod h1:hDPoyOpDY7OrrMDLaYoY3hf52gNCR/YOUYxkhApJIxc= -github.com/moby/sys/mountinfo v0.5.0/go.mod h1:3bMD3Rg+zkqx8MRYPi7Pyb0Ie97QEBmdxbhnCLlSvSU= github.com/moby/sys/sequential v0.5.0 h1:OPvI35Lzn9K04PBbCLW0g4LcFAJgHsvXsRyewg5lXtc= github.com/moby/sys/sequential v0.5.0/go.mod h1:tH2cOOs5V9MlPiXcQzRC+eEyab644PWKGRYaaV5ZZlo= github.com/moby/sys/user v0.1.0 h1:WmZ93f5Ux6het5iituh9x2zAG7NFY9Aqi49jjE1PaQg= @@ -285,7 +272,6 @@ github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3Rllmb github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= github.com/moul/http2curl v1.0.0/go.mod h1:8UbvGypXm98wA/IqH45anm5Y2Z6ep6O31QGOAZ3H0fQ= -github.com/mrunalp/fileutils v0.5.0/go.mod h1:M1WthSahJixYnrXQl/DFQuteStB1weuxD2QJNHXfbSQ= github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= @@ -309,14 +295,8 @@ github.com/onsi/gomega v1.19.0 h1:4ieX6qQjPP/BfC3mpsAtIGGlxTWPeA3Inl/7DtXw1tw= github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= -github.com/opencontainers/image-spec v1.0.3-0.20211202183452-c5a74bcca799 h1:rc3tiVYb5z54aKaDfakKn0dDjIyPpTtszkjuMzyt7ec= -github.com/opencontainers/image-spec v1.0.3-0.20211202183452-c5a74bcca799/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= github.com/opencontainers/image-spec v1.1.0-rc2.0.20221005185240-3a7f492d3f1b h1:YWuSjZCQAPM8UUBLkYUk1e+rZcvWHJmFb6i6rM44Xs8= github.com/opencontainers/image-spec v1.1.0-rc2.0.20221005185240-3a7f492d3f1b/go.mod h1:3OVijpioIKYWTqjiG0zfF6wvoJ4fAXGbjdZuI2NgsRQ= -github.com/opencontainers/runc v1.1.5 h1:L44KXEpKmfWDcS02aeGm8QNTFXTo2D+8MYGDIJ/GDEs= -github.com/opencontainers/runc v1.1.5/go.mod h1:1J5XiS+vdZ3wCyZybsuxXZWGrgSr8fFJHLXuG2PsnNg= -github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/selinux v1.10.0/go.mod h1:2i0OySw99QjzBBQByd1Gr9gSjvuho1lHsJxIJ3gGbJI= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= @@ -343,17 +323,12 @@ github.com/rogpeppe/go-internal v1.8.1/go.mod h1:JeRgkft04UBgHMgCIwADu4Pn6Mtm5d4 github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= -github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/schollz/closestmatch v2.1.0+incompatible/go.mod h1:RtP1ddjLong6gTkbtmuhtR2uUrrJOpYzYRvbcPAid+g= -github.com/seccomp/libseccomp-golang v0.9.2-0.20220502022130-f33da4d89646/go.mod h1:JA8cRccbGaA1s33RQf7Y1+q9gHmZX1yB/z9WDN1C6fg= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI= github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0= -github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= @@ -372,9 +347,9 @@ github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5 github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/supranational/blst v0.3.11 h1:LyU6FolezeWAhvQk0k6O/d49jqgO52MSDDfYgbeoEm4= github.com/supranational/blst v0.3.11/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= -github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a h1:1ur3QoCqvE5fl+nylMaIr9PVV1w343YRDtsy+Rwu7XI= github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a/go.mod h1:RRCYJbIwD5jmqPI9XoAFR0OcDxqUctll6zUj/+B4S48= github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= @@ -385,15 +360,12 @@ github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGr github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= -github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/urfave/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/valyala/fasthttp v1.6.0/go.mod h1:FstJa9V+Pj9vQ7OJie2qMHdwemEDaDiSdBnvPM1Su9w= github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio= -github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE= -github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU= github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= @@ -445,7 +417,6 @@ golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= @@ -471,14 +442,11 @@ golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606203320-7fc4e5ec1444/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191115151921-52ab43148777/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -487,7 +455,6 @@ golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -495,11 +462,8 @@ golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210906170528-6f6e22806c34/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211116061358-0a5406a5449c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -509,14 +473,12 @@ golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= -golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.13.0 h1:bb+I9cTfFazGW51MZqBVmZy7+JEJMouUHTUSKVQLBek= golang.org/x/term v0.18.0 h1:FcHjZXDMxI8mM3nwhX9HlKop4C0YQvCVCdwYl2wOtE8= +golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= @@ -572,15 +534,13 @@ google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpAD google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= -google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= @@ -602,7 +562,8 @@ gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= -gotest.tools/v3 v3.0.3 h1:4AuOwCGf4lLR9u3YOe2awrHygurzhO/HeQ6laiA6Sx0= +gotest.tools/v3 v3.5.0 h1:Ljk6PdHdOhAb5aDMWXjDLMMhph+BpztA4v1QdqEW2eY= +gotest.tools/v3 v3.5.0/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= rsc.io/tmplfunc v0.0.3 h1:53XFQh69AfOa8Tw0Jm7t+GV7KZhOi6jzsCzTtKbMvzU= From d7a0be0a0f686fe3deda984e59e6dbcea5918ff5 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Tue, 19 Mar 2024 16:15:03 +0100 Subject: [PATCH 223/387] go.mod: upgrade to google.golang.org/protobuf v1.33.0 --- go.mod | 2 +- go.sum | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/go.mod b/go.mod index 4084baceee..c28617285e 100644 --- a/go.mod +++ b/go.mod @@ -92,7 +92,7 @@ require ( golang.org/x/sys v0.18.0 // indirect golang.org/x/text v0.13.0 // indirect golang.org/x/tools v0.13.0 // indirect - google.golang.org/protobuf v1.31.0 // indirect + google.golang.org/protobuf v1.33.0 // indirect rsc.io/tmplfunc v0.0.3 // indirect ) diff --git a/go.sum b/go.sum index ff66ad2c6b..dab917d47a 100644 --- a/go.sum +++ b/go.sum @@ -536,6 +536,8 @@ google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp0 google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= +google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= From f3b989e38dd83b0c87247ccb058a3f302e68c46e Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Tue, 19 Mar 2024 16:18:36 +0100 Subject: [PATCH 224/387] .circleci: update go mod tidy target version in script --- .circleci/upgrade-hivesim.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/upgrade-hivesim.sh b/.circleci/upgrade-hivesim.sh index bc078d9904..0b8f7d5b32 100755 --- a/.circleci/upgrade-hivesim.sh +++ b/.circleci/upgrade-hivesim.sh @@ -13,6 +13,6 @@ for d in $sims; do set -e cd $d go get -d "github.com/ethereum/hive@$version" - go mod tidy -compat=1.17 + go mod tidy -compat=1.21 ) done From ae224371b4e52b6a04d32e1876fa14866530c0ae Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Tue, 19 Mar 2024 16:28:21 +0100 Subject: [PATCH 225/387] hivesim: remove reference to internal package in API --- hivesim/data.go | 9 +++++++++ hivesim/docs.go | 6 +++--- hivesim/hive.go | 2 +- hivesim/hive_test.go | 10 +++++----- hivesim/testapi.go | 4 ++-- 5 files changed, 20 insertions(+), 11 deletions(-) diff --git a/hivesim/data.go b/hivesim/data.go index 130cfde1b7..aec449fb17 100644 --- a/hivesim/data.go +++ b/hivesim/data.go @@ -12,6 +12,15 @@ type TestResult struct { Details string `json:"details"` } +// TestStartInfo contains metadata about a test which is supplied to the hive API. +type TestStartInfo struct { + Name string `json:"name"` + DisplayName string `json:"display_name"` + Location string `json:"location"` + Category string `json:"category"` + Description string `json:"description"` +} + // ExecInfo is the result of running a command in a client container. type ExecInfo struct { Stdout string `json:"stdout"` diff --git a/hivesim/docs.go b/hivesim/docs.go index 4cdd9f1fe2..7b1d90a9fd 100644 --- a/hivesim/docs.go +++ b/hivesim/docs.go @@ -33,7 +33,7 @@ func formatDescription(desc string) string { } // Represents a single test case to be printed in the markdown file. -type markdownTestCase simapi.TestRequest +type markdownTestCase TestStartInfo // Returns the command-line to run the test case. func (tc *markdownTestCase) commandLine(simName string, suiteName string) string { @@ -341,9 +341,9 @@ func (docs *docsCollector) EndSuite(testSuite SuiteID) error { // Starts a new test case, and appends it to the tests map in the test suite. // If the suite does not exist, returns an error. -func (docs *docsCollector) StartTest(testSuite SuiteID, test *simapi.TestRequest) (TestID, error) { +func (docs *docsCollector) StartTest(testSuite SuiteID, test TestStartInfo) (TestID, error) { // Create a new markdown test case. - markdownTest := markdownTestCase(*test) + markdownTest := markdownTestCase(test) // Check if suite exists. if _, ok := docs.suites[testSuite]; !ok { return 0, fmt.Errorf("test suite %d does not exist", testSuite) diff --git a/hivesim/hive.go b/hivesim/hive.go index 1837fec34d..6cf3b64b2b 100644 --- a/hivesim/hive.go +++ b/hivesim/hive.go @@ -129,7 +129,7 @@ func (sim *Simulation) EndSuite(testSuite SuiteID) error { } // StartTest starts a new test case, returning the testcase id as a context identifier. -func (sim *Simulation) StartTest(testSuite SuiteID, test *simapi.TestRequest) (TestID, error) { +func (sim *Simulation) StartTest(testSuite SuiteID, test TestStartInfo) (TestID, error) { if sim.docs != nil { return sim.docs.StartTest(testSuite, test) } diff --git a/hivesim/hive_test.go b/hivesim/hive_test.go index 8c0016bcf1..0a76b6f491 100644 --- a/hivesim/hive_test.go +++ b/hivesim/hive_test.go @@ -78,7 +78,7 @@ func TestEnodeReplaceIP(t *testing.T) { if err != nil { t.Fatal("can't start suite:", err) } - testID, err := sim.StartTest(suiteID, &simapi.TestRequest{Name: "test"}) + testID, err := sim.StartTest(suiteID, TestStartInfo{Name: "test"}) if err != nil { t.Fatal("can't start test:", err) } @@ -130,7 +130,7 @@ func TestStartClientStartOptions(t *testing.T) { if err != nil { t.Fatal("can't start suite:", err) } - testID, err := sim.StartTest(suiteID, &simapi.TestRequest{Name: "test"}) + testID, err := sim.StartTest(suiteID, TestStartInfo{Name: "test"}) if err != nil { t.Fatal("can't start test:", err) } @@ -267,7 +267,7 @@ func TestRunProgram(t *testing.T) { if err != nil { t.Fatal("can't start suite:", err) } - testID, err := sim.StartTest(suiteID, &simapi.TestRequest{Name: "test"}) + testID, err := sim.StartTest(suiteID, TestStartInfo{Name: "test"}) if err != nil { t.Fatal("can't start test:", err) } @@ -314,7 +314,7 @@ func TestStartClientErrors(t *testing.T) { if err != nil { t.Fatal("can't start suite:", err) } - testID, err := sim.StartTest(suiteID, &simapi.TestRequest{Name: "test"}) + testID, err := sim.StartTest(suiteID, TestStartInfo{Name: "test"}) if err != nil { t.Fatal("can't start test:", err) } @@ -370,7 +370,7 @@ func TestStartClientInitialNetworks(t *testing.T) { if err != nil { t.Fatal("can't start suite:", err) } - testID, err := sim.StartTest(suiteID, &simapi.TestRequest{Name: "test"}) + testID, err := sim.StartTest(suiteID, TestStartInfo{Name: "test"}) if err != nil { t.Fatal("can't start test:", err) } diff --git a/hivesim/testapi.go b/hivesim/testapi.go index b9ac41de93..8fa0dda97c 100644 --- a/hivesim/testapi.go +++ b/hivesim/testapi.go @@ -343,8 +343,8 @@ type testSpec struct { alwaysRun bool } -func (spec testSpec) request() *simapi.TestRequest { - return &simapi.TestRequest{ +func (spec testSpec) request() TestStartInfo { + return TestStartInfo{ Name: spec.name, DisplayName: spec.displayName, Category: spec.category, From 5218b7c09d66b15e43b856a986969a8e8d21dd57 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Tue, 19 Mar 2024 16:35:26 +0100 Subject: [PATCH 226/387] simulators/devp2p: upgrade hivesim --- simulators/devp2p/go.mod | 13 ++++++++++--- simulators/devp2p/go.sum | 27 ++++++++++++++++++++++----- simulators/devp2p/main.go | 2 +- 3 files changed, 33 insertions(+), 9 deletions(-) diff --git a/simulators/devp2p/go.mod b/simulators/devp2p/go.mod index 81d3f87a73..06604e08b4 100644 --- a/simulators/devp2p/go.mod +++ b/simulators/devp2p/go.mod @@ -1,9 +1,11 @@ module github.com/ethereum/hive/simulators/devp2p -go 1.18 +go 1.21 + +toolchain go1.22.1 require ( - github.com/ethereum/hive v0.0.0-20231031133732-dcd7ddb75960 + github.com/ethereum/hive v0.0.0-20240319152821-ae224371b4e5 github.com/shogo82148/go-tap v0.0.3 ) @@ -15,9 +17,13 @@ require ( github.com/ethereum/go-ethereum v1.13.5-0.20231031113925-bc42e88415d3 // indirect github.com/go-ole/go-ole v1.2.6 // indirect github.com/go-stack/stack v1.8.1 // indirect + github.com/golang-jwt/jwt/v4 v4.5.0 // indirect github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect github.com/gorilla/websocket v1.5.0 // indirect github.com/holiman/uint256 v1.2.3 // indirect + github.com/lithammer/dedent v1.1.0 // indirect + github.com/mattn/go-colorable v0.1.13 // indirect + github.com/mattn/go-isatty v0.0.17 // indirect github.com/shirou/gopsutil v3.21.11+incompatible // indirect github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a // indirect github.com/tklauser/go-sysconf v0.3.12 // indirect @@ -26,6 +32,7 @@ require ( golang.org/x/crypto v0.14.0 // indirect golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect golang.org/x/mod v0.12.0 // indirect - golang.org/x/sys v0.13.0 // indirect + golang.org/x/sys v0.18.0 // indirect golang.org/x/tools v0.13.0 // indirect + gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1 // indirect ) diff --git a/simulators/devp2p/go.sum b/simulators/devp2p/go.sum index 97a50bfc35..3477a1e176 100644 --- a/simulators/devp2p/go.sum +++ b/simulators/devp2p/go.sum @@ -3,6 +3,7 @@ github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5 github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U= github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= +github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= @@ -12,21 +13,25 @@ github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs github.com/deckarep/golang-set/v2 v2.1.0 h1:g47V4Or+DUdzbs8FxCCmgb6VYd+ptPAngjM6dtGktsI= github.com/deckarep/golang-set/v2 v2.1.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0= +github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 h1:HbphB4TFFXpv7MNrT52FGrrgVXF1owhMVTHFZIlnvd4= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0/go.mod h1:DZGJHZMqrU4JJqFAWUS2UO1+lbSKsdiOoYi9Zzey7Fc= github.com/ethereum/go-ethereum v1.13.5-0.20231031113925-bc42e88415d3 h1:i4TE0DmzMYcr2IiCdlTGGk+7Q/EzXvBKbbG4uRxMjJ0= github.com/ethereum/go-ethereum v1.13.5-0.20231031113925-bc42e88415d3/go.mod h1:yMTu38GSuyxaYzQMViqNmQ1s3cE84abZexQmTgenWk0= -github.com/ethereum/hive v0.0.0-20231031133732-dcd7ddb75960 h1:7H9z2o/KImWQ/1PACU3ewsSFNxT/lzwYRnwit2YFqMg= -github.com/ethereum/hive v0.0.0-20231031133732-dcd7ddb75960/go.mod h1:sV7LrFBlEii71kI9udVbUVj7SXIifZ2VzFjQ8S6rZns= +github.com/ethereum/hive v0.0.0-20240319152821-ae224371b4e5 h1:2Rc3v1mqWgUl8gSHFh7+FmVcyB1AI/9THxhEDjNK+PI= +github.com/ethereum/hive v0.0.0-20240319152821-ae224371b4e5/go.mod h1:MGwUXPGco6YS3brOf5WEILfUnnUL/XuX1224ab3D7XA= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= +github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-stack/stack v1.8.1 h1:ntEHSVwIt7PNXNpgPmVfMrNhLtgjlmnZha2kOpuRiDw= github.com/go-stack/stack v1.8.1/go.mod h1:dcoOX6HbPZSZptuspn9bctJ+N/CnF5gGygcUP3XYfe4= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= +github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= +github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= @@ -44,15 +49,21 @@ github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMyw github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= +github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= +github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/holiman/uint256 v1.2.3 h1:K8UWO1HUJpRMXBxbmaY1Y8IAMZC/RsKB+ArEnnK4l5o= github.com/holiman/uint256 v1.2.3/go.mod h1:SC8Ryt4n+UBbPbIBKaG9zbbDlp4jOru9xFZmPzLUTxw= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/lithammer/dedent v1.1.0 h1:VNzHMVCBNG1j0fh3OrsFRkVUwStdDArbgBWoPAffktY= +github.com/lithammer/dedent v1.1.0/go.mod h1:jrXYCQtgg0nJiN+StA2KgR7w6CiQNv9Fd/Z9BP0jIOc= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng= +github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= @@ -77,6 +88,7 @@ github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+ github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a h1:1ur3QoCqvE5fl+nylMaIr9PVV1w343YRDtsy+Rwu7XI= github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a/go.mod h1:RRCYJbIwD5jmqPI9XoAFR0OcDxqUctll6zUj/+B4S48= github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= @@ -105,10 +117,12 @@ golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= +golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= +golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -126,10 +140,11 @@ golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= -golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= +golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -137,6 +152,7 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= +golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= @@ -158,6 +174,7 @@ google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQ gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1 h1:iiHuQZCNgYPmFQxd3BBN/Nc5+dAwzZuq5y40s20oQw0= +gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/simulators/devp2p/main.go b/simulators/devp2p/main.go index 0f710a8854..4dae20c042 100644 --- a/simulators/devp2p/main.go +++ b/simulators/devp2p/main.go @@ -283,7 +283,7 @@ func reportTAP(t *hivesim.T, clientName string, output io.Reader) error { } // Forward result to hive. name := fmt.Sprintf("%s (%s)", test.Description, clientName) - testID, err := t.Sim.StartTest(t.SuiteID, name, "") + testID, err := t.Sim.StartTest(t.SuiteID, hivesim.TestStartInfo{Name: name}) if err != nil { return fmt.Errorf("can't report sub-test result: %v", err) } From 4264633680c4e8d04eea0f6fce7ef9464d49c612 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Tue, 19 Mar 2024 16:35:44 +0100 Subject: [PATCH 227/387] simulators/ethereum/consensus: upgrade hivesim --- simulators/ethereum/consensus/go.mod | 16 +++++++++--- simulators/ethereum/consensus/go.sum | 38 ++++++++++++++++++++++------ 2 files changed, 42 insertions(+), 12 deletions(-) diff --git a/simulators/ethereum/consensus/go.mod b/simulators/ethereum/consensus/go.mod index c92fbf7f16..b6cae6f8e5 100644 --- a/simulators/ethereum/consensus/go.mod +++ b/simulators/ethereum/consensus/go.mod @@ -1,10 +1,12 @@ module github.com/ethereum/hive/simulators/ethereum/consensus -go 1.18 +go 1.21 + +toolchain go1.22.1 require ( github.com/ethereum/go-ethereum v1.13.5-0.20231031113925-bc42e88415d3 - github.com/ethereum/hive v0.0.0-20231031133732-dcd7ddb75960 + github.com/ethereum/hive v0.0.0-20240319152821-ae224371b4e5 ) require ( @@ -31,14 +33,19 @@ require ( github.com/go-stack/stack v1.8.1 // indirect github.com/gofrs/flock v0.8.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang-jwt/jwt/v4 v4.5.0 // indirect github.com/golang/protobuf v1.5.3 // indirect github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect + github.com/google/go-cmp v0.6.0 // indirect github.com/gorilla/websocket v1.5.0 // indirect github.com/holiman/bloomfilter/v2 v2.0.3 // indirect github.com/holiman/uint256 v1.2.3 // indirect github.com/klauspost/compress v1.15.15 // indirect github.com/kr/pretty v0.3.1 // indirect github.com/kr/text v0.2.0 // indirect + github.com/lithammer/dedent v1.1.0 // indirect + github.com/mattn/go-colorable v0.1.13 // indirect + github.com/mattn/go-isatty v0.0.17 // indirect github.com/mattn/go-runewidth v0.0.14 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect github.com/mmcloughlin/addchain v0.4.0 // indirect @@ -60,9 +67,10 @@ require ( golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect golang.org/x/mod v0.12.0 // indirect golang.org/x/sync v0.3.0 // indirect - golang.org/x/sys v0.13.0 // indirect + golang.org/x/sys v0.18.0 // indirect golang.org/x/text v0.13.0 // indirect golang.org/x/tools v0.13.0 // indirect - google.golang.org/protobuf v1.28.1 // indirect + google.golang.org/protobuf v1.33.0 // indirect + gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1 // indirect rsc.io/tmplfunc v0.0.3 // indirect ) diff --git a/simulators/ethereum/consensus/go.sum b/simulators/ethereum/consensus/go.sum index 3e0d7fbc2c..5ff9564d48 100644 --- a/simulators/ethereum/consensus/go.sum +++ b/simulators/ethereum/consensus/go.sum @@ -14,6 +14,7 @@ github.com/VictoriaMetrics/fastcache v1.12.1/go.mod h1:tX04vaqcNoQeGLD+ra5pU5sWk github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY= github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= github.com/allegro/bigcache v1.2.1 h1:hg1sY1raCwic3Vnsvje6TT7/pnZba83LeFck5NrFKSc= +github.com/allegro/bigcache v1.2.1/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/aymerick/raymond v2.0.3-0.20180322193309-b565731e1464+incompatible/go.mod h1:osfaiScAUVup+UC9Nfq76eWqDhXlp+4UYaA8uhTBO6g= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= @@ -23,6 +24,7 @@ github.com/bits-and-blooms/bitset v1.7.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edY github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U= github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= +github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= @@ -33,6 +35,7 @@ github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDk github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cockroachdb/datadriven v1.0.2/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f h1:otljaYPt5hWxV3MUfO5dFPFiOXg9CyG5/kCfayTqsJ4= +github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= github.com/cockroachdb/errors v1.9.1 h1:yFVvsI0VxmRShfawbt/laCIDy/mtTqqnvoNgiy5bEV8= github.com/cockroachdb/errors v1.9.1/go.mod h1:2sxOtL2WIc096WSZqZ5h8fa17rdDq9HZOZLBCor4mBk= github.com/cockroachdb/logtags v0.0.0-20211118104740-dabe8e521a4f/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= @@ -62,6 +65,7 @@ github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs github.com/deckarep/golang-set/v2 v2.1.0 h1:g47V4Or+DUdzbs8FxCCmgb6VYd+ptPAngjM6dtGktsI= github.com/deckarep/golang-set/v2 v2.1.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0= +github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 h1:HbphB4TFFXpv7MNrT52FGrrgVXF1owhMVTHFZIlnvd4= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0/go.mod h1:DZGJHZMqrU4JJqFAWUS2UO1+lbSKsdiOoYi9Zzey7Fc= github.com/dgraph-io/badger v1.6.0/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6psNgSztDR4= @@ -77,14 +81,15 @@ github.com/ethereum/c-kzg-4844 v0.4.0 h1:3MS1s4JtA868KpJxroZoepdV0ZKBp3u/O5HcZ7R github.com/ethereum/c-kzg-4844 v0.4.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= github.com/ethereum/go-ethereum v1.13.5-0.20231031113925-bc42e88415d3 h1:i4TE0DmzMYcr2IiCdlTGGk+7Q/EzXvBKbbG4uRxMjJ0= github.com/ethereum/go-ethereum v1.13.5-0.20231031113925-bc42e88415d3/go.mod h1:yMTu38GSuyxaYzQMViqNmQ1s3cE84abZexQmTgenWk0= -github.com/ethereum/hive v0.0.0-20231031133732-dcd7ddb75960 h1:7H9z2o/KImWQ/1PACU3ewsSFNxT/lzwYRnwit2YFqMg= -github.com/ethereum/hive v0.0.0-20231031133732-dcd7ddb75960/go.mod h1:sV7LrFBlEii71kI9udVbUVj7SXIifZ2VzFjQ8S6rZns= +github.com/ethereum/hive v0.0.0-20240319152821-ae224371b4e5 h1:2Rc3v1mqWgUl8gSHFh7+FmVcyB1AI/9THxhEDjNK+PI= +github.com/ethereum/hive v0.0.0-20240319152821-ae224371b4e5/go.mod h1:MGwUXPGco6YS3brOf5WEILfUnnUL/XuX1224ab3D7XA= github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072/go.mod h1:duJ4Jxv5lDcvg4QuQr0oowTf7dz4/CR8NtyCooz9HL8= github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= +github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= github.com/gavv/httpexpect v2.0.0+incompatible/go.mod h1:x+9tiU1YnrOvnB725RkpoLv1M62hOWzwo5OXotisrKc= github.com/getsentry/sentry-go v0.12.0/go.mod h1:NSap0JBYWzHND8oMbyi0+XZhUalc1TBdRL1M71JZW2c= github.com/getsentry/sentry-go v0.18.0 h1:MtBW5H9QgdcJabtZcuJG80BMOwaBpkRDZkxRkNC1sN0= @@ -94,6 +99,7 @@ github.com/gin-gonic/gin v1.4.0/go.mod h1:OW2EZn3DO8Ln9oIKOvM++LBO+5UPHJJDH72/q/ github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= +github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab/go.mod h1:/P9AEU963A2AYjv4d1V5eVL1CQbEJq6aCNHDDjibzu8= github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= @@ -112,6 +118,8 @@ github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/gogo/status v1.1.0/go.mod h1:BFv9nrluPLmrS0EmGVvLaPNmRosr9KapBYd5/hpY1WM= github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= +github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= +github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -139,14 +147,16 @@ github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMyw github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= +github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= +github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= @@ -191,20 +201,27 @@ github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= +github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/labstack/echo/v4 v4.5.0/go.mod h1:czIriw4a0C1dFun+ObrXp7ok03xON0N1awStJ6ArI7Y= github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c= +github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= +github.com/lithammer/dedent v1.1.0 h1:VNzHMVCBNG1j0fh3OrsFRkVUwStdDArbgBWoPAffktY= +github.com/lithammer/dedent v1.1.0/go.mod h1:jrXYCQtgg0nJiN+StA2KgR7w6CiQNv9Fd/Z9BP0jIOc= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.11/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng= +github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.14 h1:+xnbZSEeDbOIg5/mE6JF0w6n9duR1l3/WmbinWVwUuU= github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= @@ -292,6 +309,7 @@ github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5 github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/supranational/blst v0.3.11 h1:LyU6FolezeWAhvQk0k6O/d49jqgO52MSDDfYgbeoEm4= github.com/supranational/blst v0.3.11/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a h1:1ur3QoCqvE5fl+nylMaIr9PVV1w343YRDtsy+Rwu7XI= @@ -368,6 +386,7 @@ golang.org/x/net v0.0.0-20211008194852-3b03d305991f/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= +golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -410,11 +429,12 @@ golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= -golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= +golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -471,17 +491,19 @@ google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpAD google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= -google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= +google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= gopkg.in/go-playground/validator.v8 v8.18.2/go.mod h1:RX2a/7Ha8BgOhfk7j780h4/u/RRjR0eouCJSH80/M2Y= gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1 h1:iiHuQZCNgYPmFQxd3BBN/Nc5+dAwzZuq5y40s20oQw0= +gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= gopkg.in/ini.v1 v1.51.1/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= From 533b2ae01b6d560984aa9ff68ce0c01bf8789a04 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Tue, 19 Mar 2024 16:35:55 +0100 Subject: [PATCH 228/387] simulators/ethereum/engine: upgrade hivesim --- simulators/ethereum/engine/go.mod | 13 +++++++++---- simulators/ethereum/engine/go.sum | 32 +++++++++++++++++++++++-------- 2 files changed, 33 insertions(+), 12 deletions(-) diff --git a/simulators/ethereum/engine/go.mod b/simulators/ethereum/engine/go.mod index e53c6fe269..5013b18df8 100644 --- a/simulators/ethereum/engine/go.mod +++ b/simulators/ethereum/engine/go.mod @@ -1,12 +1,14 @@ module github.com/ethereum/hive/simulators/ethereum/engine -go 1.20 +go 1.21 + +toolchain go1.22.1 require ( github.com/crate-crypto/go-kzg-4844 v0.7.0 github.com/davecgh/go-spew v1.1.1 github.com/ethereum/go-ethereum v1.13.5-0.20231127143928-5b57727d6de2 - github.com/ethereum/hive v0.0.0-20231031133732-dcd7ddb75960 + github.com/ethereum/hive v0.0.0-20240319152821-ae224371b4e5 github.com/golang-jwt/jwt/v4 v4.5.0 github.com/holiman/uint256 v1.2.4 github.com/pkg/errors v0.9.1 @@ -47,6 +49,7 @@ require ( github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/protobuf v1.5.3 // indirect github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect + github.com/google/go-cmp v0.6.0 // indirect github.com/google/uuid v1.3.0 // indirect github.com/gorilla/websocket v1.5.0 // indirect github.com/graph-gophers/graphql-go v1.4.0 // indirect @@ -61,6 +64,7 @@ require ( github.com/klauspost/compress v1.15.15 // indirect github.com/kr/pretty v0.3.1 // indirect github.com/kr/text v0.2.0 // indirect + github.com/lithammer/dedent v1.1.0 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.17 // indirect github.com/mattn/go-runewidth v0.0.14 // indirect @@ -92,11 +96,12 @@ require ( golang.org/x/mod v0.12.0 // indirect golang.org/x/net v0.17.0 // indirect golang.org/x/sync v0.4.0 // indirect - golang.org/x/sys v0.13.0 // indirect + golang.org/x/sys v0.18.0 // indirect golang.org/x/text v0.13.0 // indirect golang.org/x/time v0.3.0 // indirect golang.org/x/tools v0.13.0 // indirect - google.golang.org/protobuf v1.28.1 // indirect + google.golang.org/protobuf v1.33.0 // indirect + gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1 // indirect gopkg.in/natefinch/lumberjack.v2 v2.0.0 // indirect rsc.io/tmplfunc v0.0.3 // indirect ) diff --git a/simulators/ethereum/engine/go.sum b/simulators/ethereum/engine/go.sum index 0ae8ee4c6d..e1805b432e 100644 --- a/simulators/ethereum/engine/go.sum +++ b/simulators/ethereum/engine/go.sum @@ -2,6 +2,7 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMT github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/toml v1.3.2 h1:o7IhLm0Msx3BaB+n3Ag7L8EVlByGnpq14C4YWiu/gL8= +github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= github.com/CloudyKit/fastprinter v0.0.0-20200109182630-33d98a066a53/go.mod h1:+3IMCy2vIlbG1XG/0ggNQv0SvxCAIpPM5b1nCz56Xno= github.com/CloudyKit/jet/v3 v3.0.0/go.mod h1:HKQPgSJmdK8hdoAbKUUWajkHyHo4RaU5rMdUywE7VMo= github.com/DataDog/zstd v1.5.2 h1:vUG4lAyuPCXO0TLbXvPv7EB7cNK1QV/luu55UHLrrn8= @@ -16,6 +17,7 @@ github.com/VictoriaMetrics/fastcache v1.12.1/go.mod h1:tX04vaqcNoQeGLD+ra5pU5sWk github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY= github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= github.com/allegro/bigcache v1.2.1 h1:hg1sY1raCwic3Vnsvje6TT7/pnZba83LeFck5NrFKSc= +github.com/allegro/bigcache v1.2.1/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= github.com/apapsch/go-jsonmerge/v2 v2.0.0 h1:axGnT1gRIfimI7gJifB699GoE/oq+F2MU7Dml6nw9rQ= github.com/apapsch/go-jsonmerge/v2 v2.0.0/go.mod h1:lvDnEdqiQrp0O42VQGgmlKpxL1AP2+08jFMw88y4klk= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= @@ -28,6 +30,7 @@ github.com/bmatcuk/doublestar v1.1.1/go.mod h1:UD6OnuiIn0yFxxA2le/rnRU1G4RaI4UvF github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U= github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= +github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/cp v1.1.1 h1:nCb6ZLdB7NRaqsm91JtQTAme2SKJzXVsdPIPkyJr1MU= github.com/cespare/cp v1.1.1/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s= @@ -40,6 +43,7 @@ github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDk github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cockroachdb/datadriven v1.0.2/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f h1:otljaYPt5hWxV3MUfO5dFPFiOXg9CyG5/kCfayTqsJ4= +github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= github.com/cockroachdb/errors v1.9.1 h1:yFVvsI0VxmRShfawbt/laCIDy/mtTqqnvoNgiy5bEV8= github.com/cockroachdb/errors v1.9.1/go.mod h1:2sxOtL2WIc096WSZqZ5h8fa17rdDq9HZOZLBCor4mBk= github.com/cockroachdb/logtags v0.0.0-20211118104740-dabe8e521a4f/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= @@ -73,6 +77,7 @@ github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs github.com/deckarep/golang-set/v2 v2.1.0 h1:g47V4Or+DUdzbs8FxCCmgb6VYd+ptPAngjM6dtGktsI= github.com/deckarep/golang-set/v2 v2.1.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0= +github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 h1:HbphB4TFFXpv7MNrT52FGrrgVXF1owhMVTHFZIlnvd4= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0/go.mod h1:DZGJHZMqrU4JJqFAWUS2UO1+lbSKsdiOoYi9Zzey7Fc= github.com/deepmap/oapi-codegen v1.12.4 h1:pPmn6qI9MuOtCz82WY2Xaw46EQjgvxednXXrP7g5Q2s= @@ -90,8 +95,8 @@ github.com/ethereum/c-kzg-4844 v0.4.0 h1:3MS1s4JtA868KpJxroZoepdV0ZKBp3u/O5HcZ7R github.com/ethereum/c-kzg-4844 v0.4.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= github.com/ethereum/go-ethereum v1.13.5-0.20231127143928-5b57727d6de2 h1:aQz+Zhve06dQU6qqnCQ3TuZ7nFWxFvnNt+PY+LA8ZjM= github.com/ethereum/go-ethereum v1.13.5-0.20231127143928-5b57727d6de2/go.mod h1:iogCB+O7R3eFmlyiEKRDqjmJbSgOsDHTjxE0PU6CYC8= -github.com/ethereum/hive v0.0.0-20231031133732-dcd7ddb75960 h1:7H9z2o/KImWQ/1PACU3ewsSFNxT/lzwYRnwit2YFqMg= -github.com/ethereum/hive v0.0.0-20231031133732-dcd7ddb75960/go.mod h1:sV7LrFBlEii71kI9udVbUVj7SXIifZ2VzFjQ8S6rZns= +github.com/ethereum/hive v0.0.0-20240319152821-ae224371b4e5 h1:2Rc3v1mqWgUl8gSHFh7+FmVcyB1AI/9THxhEDjNK+PI= +github.com/ethereum/hive v0.0.0-20240319152821-ae224371b4e5/go.mod h1:MGwUXPGco6YS3brOf5WEILfUnnUL/XuX1224ab3D7XA= github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072/go.mod h1:duJ4Jxv5lDcvg4QuQr0oowTf7dz4/CR8NtyCooz9HL8= github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= github.com/fjl/memsize v0.0.1 h1:+zhkb+dhUgx0/e+M8sF0QqiouvMQUiKR+QYvdxIOKcQ= @@ -114,6 +119,7 @@ github.com/gin-gonic/gin v1.4.0/go.mod h1:OW2EZn3DO8Ln9oIKOvM++LBO+5UPHJJDH72/q/ github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= +github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= @@ -165,17 +171,20 @@ github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= +github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= +github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= @@ -237,9 +246,13 @@ github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= +github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/labstack/echo/v4 v4.5.0/go.mod h1:czIriw4a0C1dFun+ObrXp7ok03xON0N1awStJ6ArI7Y= github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c= +github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= +github.com/lithammer/dedent v1.1.0 h1:VNzHMVCBNG1j0fh3OrsFRkVUwStdDArbgBWoPAffktY= +github.com/lithammer/dedent v1.1.0/go.mod h1:jrXYCQtgg0nJiN+StA2KgR7w6CiQNv9Fd/Z9BP0jIOc= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= @@ -358,6 +371,7 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/supranational/blst v0.3.11 h1:LyU6FolezeWAhvQk0k6O/d49jqgO52MSDDfYgbeoEm4= github.com/supranational/blst v0.3.11/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a h1:1ur3QoCqvE5fl+nylMaIr9PVV1w343YRDtsy+Rwu7XI= @@ -491,8 +505,8 @@ golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= -golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= +golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -551,17 +565,19 @@ google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpAD google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= -google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= +google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= gopkg.in/go-playground/validator.v8 v8.18.2/go.mod h1:RX2a/7Ha8BgOhfk7j780h4/u/RRjR0eouCJSH80/M2Y= gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1 h1:iiHuQZCNgYPmFQxd3BBN/Nc5+dAwzZuq5y40s20oQw0= +gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= gopkg.in/ini.v1 v1.51.1/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8= From 7ddf6a83e5f0a3b7e6555fb8d66ca1c3e01a1ae3 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Tue, 19 Mar 2024 16:36:05 +0100 Subject: [PATCH 229/387] simulators/ethereum/graphql: upgrade hivesim --- simulators/ethereum/graphql/go.mod | 16 +++++++++---- simulators/ethereum/graphql/go.sum | 38 +++++++++++++++++++++++------- 2 files changed, 42 insertions(+), 12 deletions(-) diff --git a/simulators/ethereum/graphql/go.mod b/simulators/ethereum/graphql/go.mod index 0143390520..f3166d86bb 100644 --- a/simulators/ethereum/graphql/go.mod +++ b/simulators/ethereum/graphql/go.mod @@ -1,10 +1,12 @@ module github.com/ethereum/hive/simulators/ethereum/graphql -go 1.18 +go 1.21 + +toolchain go1.22.1 require ( github.com/ethereum/go-ethereum v1.13.5-0.20231031113925-bc42e88415d3 - github.com/ethereum/hive v0.0.0-20231031133732-dcd7ddb75960 + github.com/ethereum/hive v0.0.0-20240319152821-ae224371b4e5 ) require ( @@ -31,14 +33,19 @@ require ( github.com/go-stack/stack v1.8.1 // indirect github.com/gofrs/flock v0.8.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang-jwt/jwt/v4 v4.5.0 // indirect github.com/golang/protobuf v1.5.3 // indirect github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect + github.com/google/go-cmp v0.6.0 // indirect github.com/gorilla/websocket v1.5.0 // indirect github.com/holiman/bloomfilter/v2 v2.0.3 // indirect github.com/holiman/uint256 v1.2.3 // indirect github.com/klauspost/compress v1.15.15 // indirect github.com/kr/pretty v0.3.1 // indirect github.com/kr/text v0.2.0 // indirect + github.com/lithammer/dedent v1.1.0 // indirect + github.com/mattn/go-colorable v0.1.13 // indirect + github.com/mattn/go-isatty v0.0.17 // indirect github.com/mattn/go-runewidth v0.0.14 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect github.com/mmcloughlin/addchain v0.4.0 // indirect @@ -60,9 +67,10 @@ require ( golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect golang.org/x/mod v0.12.0 // indirect golang.org/x/sync v0.3.0 // indirect - golang.org/x/sys v0.13.0 // indirect + golang.org/x/sys v0.18.0 // indirect golang.org/x/text v0.13.0 // indirect golang.org/x/tools v0.13.0 // indirect - google.golang.org/protobuf v1.28.1 // indirect + google.golang.org/protobuf v1.33.0 // indirect + gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1 // indirect rsc.io/tmplfunc v0.0.3 // indirect ) diff --git a/simulators/ethereum/graphql/go.sum b/simulators/ethereum/graphql/go.sum index 3e0d7fbc2c..5ff9564d48 100644 --- a/simulators/ethereum/graphql/go.sum +++ b/simulators/ethereum/graphql/go.sum @@ -14,6 +14,7 @@ github.com/VictoriaMetrics/fastcache v1.12.1/go.mod h1:tX04vaqcNoQeGLD+ra5pU5sWk github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY= github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= github.com/allegro/bigcache v1.2.1 h1:hg1sY1raCwic3Vnsvje6TT7/pnZba83LeFck5NrFKSc= +github.com/allegro/bigcache v1.2.1/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/aymerick/raymond v2.0.3-0.20180322193309-b565731e1464+incompatible/go.mod h1:osfaiScAUVup+UC9Nfq76eWqDhXlp+4UYaA8uhTBO6g= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= @@ -23,6 +24,7 @@ github.com/bits-and-blooms/bitset v1.7.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edY github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U= github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= +github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= @@ -33,6 +35,7 @@ github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDk github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cockroachdb/datadriven v1.0.2/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f h1:otljaYPt5hWxV3MUfO5dFPFiOXg9CyG5/kCfayTqsJ4= +github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= github.com/cockroachdb/errors v1.9.1 h1:yFVvsI0VxmRShfawbt/laCIDy/mtTqqnvoNgiy5bEV8= github.com/cockroachdb/errors v1.9.1/go.mod h1:2sxOtL2WIc096WSZqZ5h8fa17rdDq9HZOZLBCor4mBk= github.com/cockroachdb/logtags v0.0.0-20211118104740-dabe8e521a4f/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= @@ -62,6 +65,7 @@ github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs github.com/deckarep/golang-set/v2 v2.1.0 h1:g47V4Or+DUdzbs8FxCCmgb6VYd+ptPAngjM6dtGktsI= github.com/deckarep/golang-set/v2 v2.1.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0= +github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 h1:HbphB4TFFXpv7MNrT52FGrrgVXF1owhMVTHFZIlnvd4= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0/go.mod h1:DZGJHZMqrU4JJqFAWUS2UO1+lbSKsdiOoYi9Zzey7Fc= github.com/dgraph-io/badger v1.6.0/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6psNgSztDR4= @@ -77,14 +81,15 @@ github.com/ethereum/c-kzg-4844 v0.4.0 h1:3MS1s4JtA868KpJxroZoepdV0ZKBp3u/O5HcZ7R github.com/ethereum/c-kzg-4844 v0.4.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= github.com/ethereum/go-ethereum v1.13.5-0.20231031113925-bc42e88415d3 h1:i4TE0DmzMYcr2IiCdlTGGk+7Q/EzXvBKbbG4uRxMjJ0= github.com/ethereum/go-ethereum v1.13.5-0.20231031113925-bc42e88415d3/go.mod h1:yMTu38GSuyxaYzQMViqNmQ1s3cE84abZexQmTgenWk0= -github.com/ethereum/hive v0.0.0-20231031133732-dcd7ddb75960 h1:7H9z2o/KImWQ/1PACU3ewsSFNxT/lzwYRnwit2YFqMg= -github.com/ethereum/hive v0.0.0-20231031133732-dcd7ddb75960/go.mod h1:sV7LrFBlEii71kI9udVbUVj7SXIifZ2VzFjQ8S6rZns= +github.com/ethereum/hive v0.0.0-20240319152821-ae224371b4e5 h1:2Rc3v1mqWgUl8gSHFh7+FmVcyB1AI/9THxhEDjNK+PI= +github.com/ethereum/hive v0.0.0-20240319152821-ae224371b4e5/go.mod h1:MGwUXPGco6YS3brOf5WEILfUnnUL/XuX1224ab3D7XA= github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072/go.mod h1:duJ4Jxv5lDcvg4QuQr0oowTf7dz4/CR8NtyCooz9HL8= github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= +github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= github.com/gavv/httpexpect v2.0.0+incompatible/go.mod h1:x+9tiU1YnrOvnB725RkpoLv1M62hOWzwo5OXotisrKc= github.com/getsentry/sentry-go v0.12.0/go.mod h1:NSap0JBYWzHND8oMbyi0+XZhUalc1TBdRL1M71JZW2c= github.com/getsentry/sentry-go v0.18.0 h1:MtBW5H9QgdcJabtZcuJG80BMOwaBpkRDZkxRkNC1sN0= @@ -94,6 +99,7 @@ github.com/gin-gonic/gin v1.4.0/go.mod h1:OW2EZn3DO8Ln9oIKOvM++LBO+5UPHJJDH72/q/ github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= +github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab/go.mod h1:/P9AEU963A2AYjv4d1V5eVL1CQbEJq6aCNHDDjibzu8= github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= @@ -112,6 +118,8 @@ github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/gogo/status v1.1.0/go.mod h1:BFv9nrluPLmrS0EmGVvLaPNmRosr9KapBYd5/hpY1WM= github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= +github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= +github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -139,14 +147,16 @@ github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMyw github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= +github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= +github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= @@ -191,20 +201,27 @@ github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= +github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/labstack/echo/v4 v4.5.0/go.mod h1:czIriw4a0C1dFun+ObrXp7ok03xON0N1awStJ6ArI7Y= github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c= +github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= +github.com/lithammer/dedent v1.1.0 h1:VNzHMVCBNG1j0fh3OrsFRkVUwStdDArbgBWoPAffktY= +github.com/lithammer/dedent v1.1.0/go.mod h1:jrXYCQtgg0nJiN+StA2KgR7w6CiQNv9Fd/Z9BP0jIOc= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.11/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng= +github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.14 h1:+xnbZSEeDbOIg5/mE6JF0w6n9duR1l3/WmbinWVwUuU= github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= @@ -292,6 +309,7 @@ github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5 github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/supranational/blst v0.3.11 h1:LyU6FolezeWAhvQk0k6O/d49jqgO52MSDDfYgbeoEm4= github.com/supranational/blst v0.3.11/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a h1:1ur3QoCqvE5fl+nylMaIr9PVV1w343YRDtsy+Rwu7XI= @@ -368,6 +386,7 @@ golang.org/x/net v0.0.0-20211008194852-3b03d305991f/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= +golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -410,11 +429,12 @@ golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= -golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= +golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -471,17 +491,19 @@ google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpAD google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= -google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= +google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= gopkg.in/go-playground/validator.v8 v8.18.2/go.mod h1:RX2a/7Ha8BgOhfk7j780h4/u/RRjR0eouCJSH80/M2Y= gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1 h1:iiHuQZCNgYPmFQxd3BBN/Nc5+dAwzZuq5y40s20oQw0= +gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= gopkg.in/ini.v1 v1.51.1/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= From dd932a7d45271ea93eb2d1905dda7221161f5030 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Tue, 19 Mar 2024 16:36:15 +0100 Subject: [PATCH 230/387] simulators/ethereum/pyspec: upgrade hivesim --- simulators/ethereum/pyspec/go.mod | 14 +++++--- simulators/ethereum/pyspec/go.sum | 54 ++++++++++++++++++++++++++----- 2 files changed, 56 insertions(+), 12 deletions(-) diff --git a/simulators/ethereum/pyspec/go.mod b/simulators/ethereum/pyspec/go.mod index 0d6f87f63f..08ddfd8bd8 100644 --- a/simulators/ethereum/pyspec/go.mod +++ b/simulators/ethereum/pyspec/go.mod @@ -1,10 +1,12 @@ module github.com/ethereum/hive/simulators/ethereum/pyspec -go 1.20 +go 1.21 + +toolchain go1.22.1 require ( github.com/ethereum/go-ethereum v1.13.5-0.20231127143928-5b57727d6de2 - github.com/ethereum/hive v0.0.0-20231031133732-dcd7ddb75960 + github.com/ethereum/hive v0.0.0-20240319152821-ae224371b4e5 github.com/ethereum/hive/simulators/ethereum/engine v0.0.0-20230919054339-322945164a97 ) @@ -43,6 +45,9 @@ require ( github.com/klauspost/compress v1.15.15 // indirect github.com/kr/pretty v0.3.1 // indirect github.com/kr/text v0.2.0 // indirect + github.com/lithammer/dedent v1.1.0 // indirect + github.com/mattn/go-colorable v0.1.13 // indirect + github.com/mattn/go-isatty v0.0.17 // indirect github.com/mattn/go-runewidth v0.0.14 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect github.com/mmcloughlin/addchain v0.4.0 // indirect @@ -64,10 +69,11 @@ require ( golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect golang.org/x/mod v0.12.0 // indirect golang.org/x/sync v0.4.0 // indirect - golang.org/x/sys v0.13.0 // indirect + golang.org/x/sys v0.18.0 // indirect golang.org/x/text v0.13.0 // indirect golang.org/x/tools v0.13.0 // indirect - google.golang.org/protobuf v1.28.1 // indirect + google.golang.org/protobuf v1.33.0 // indirect + gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1 // indirect rsc.io/tmplfunc v0.0.3 // indirect ) diff --git a/simulators/ethereum/pyspec/go.sum b/simulators/ethereum/pyspec/go.sum index cb531a2a64..076a17dc43 100644 --- a/simulators/ethereum/pyspec/go.sum +++ b/simulators/ethereum/pyspec/go.sum @@ -14,6 +14,7 @@ github.com/VictoriaMetrics/fastcache v1.12.1/go.mod h1:tX04vaqcNoQeGLD+ra5pU5sWk github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY= github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= github.com/allegro/bigcache v1.2.1 h1:hg1sY1raCwic3Vnsvje6TT7/pnZba83LeFck5NrFKSc= +github.com/allegro/bigcache v1.2.1/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/aymerick/raymond v2.0.3-0.20180322193309-b565731e1464+incompatible/go.mod h1:osfaiScAUVup+UC9Nfq76eWqDhXlp+4UYaA8uhTBO6g= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= @@ -23,6 +24,7 @@ github.com/bits-and-blooms/bitset v1.10.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6 github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U= github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= +github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= @@ -33,6 +35,7 @@ github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDk github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cockroachdb/datadriven v1.0.2/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f h1:otljaYPt5hWxV3MUfO5dFPFiOXg9CyG5/kCfayTqsJ4= +github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= github.com/cockroachdb/errors v1.9.1 h1:yFVvsI0VxmRShfawbt/laCIDy/mtTqqnvoNgiy5bEV8= github.com/cockroachdb/errors v1.9.1/go.mod h1:2sxOtL2WIc096WSZqZ5h8fa17rdDq9HZOZLBCor4mBk= github.com/cockroachdb/logtags v0.0.0-20211118104740-dabe8e521a4f/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= @@ -55,6 +58,7 @@ github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3Ee github.com/cpuguy83/go-md2man v1.0.10 h1:BSKMNlYxDvnunlTymqtgONjNnaRV1sTpcovwwjF22jk= github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= +github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/crate-crypto/go-ipa v0.0.0-20231025140028-3c0104f4b233 h1:d28BXYi+wUpz1KBmiF9bWrjEMacUEREV6MBi2ODnrfQ= github.com/crate-crypto/go-ipa v0.0.0-20231025140028-3c0104f4b233/go.mod h1:geZJZH3SzKCqnz5VT0q/DyIG/tvu/dZk+VIfXicupJs= github.com/crate-crypto/go-kzg-4844 v0.7.0 h1:C0vgZRk4q4EZ/JgPfzuSoxdCq3C3mOZMBShovmncxvA= @@ -66,6 +70,7 @@ github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs github.com/deckarep/golang-set/v2 v2.1.0 h1:g47V4Or+DUdzbs8FxCCmgb6VYd+ptPAngjM6dtGktsI= github.com/deckarep/golang-set/v2 v2.1.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0= +github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 h1:HbphB4TFFXpv7MNrT52FGrrgVXF1owhMVTHFZIlnvd4= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0/go.mod h1:DZGJHZMqrU4JJqFAWUS2UO1+lbSKsdiOoYi9Zzey7Fc= github.com/dgraph-io/badger v1.6.0/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6psNgSztDR4= @@ -81,17 +86,20 @@ github.com/ethereum/c-kzg-4844 v0.4.0 h1:3MS1s4JtA868KpJxroZoepdV0ZKBp3u/O5HcZ7R github.com/ethereum/c-kzg-4844 v0.4.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= github.com/ethereum/go-ethereum v1.13.5-0.20231127143928-5b57727d6de2 h1:aQz+Zhve06dQU6qqnCQ3TuZ7nFWxFvnNt+PY+LA8ZjM= github.com/ethereum/go-ethereum v1.13.5-0.20231127143928-5b57727d6de2/go.mod h1:iogCB+O7R3eFmlyiEKRDqjmJbSgOsDHTjxE0PU6CYC8= -github.com/ethereum/hive v0.0.0-20231031133732-dcd7ddb75960 h1:7H9z2o/KImWQ/1PACU3ewsSFNxT/lzwYRnwit2YFqMg= -github.com/ethereum/hive v0.0.0-20231031133732-dcd7ddb75960/go.mod h1:sV7LrFBlEii71kI9udVbUVj7SXIifZ2VzFjQ8S6rZns= +github.com/ethereum/hive v0.0.0-20240319152821-ae224371b4e5 h1:2Rc3v1mqWgUl8gSHFh7+FmVcyB1AI/9THxhEDjNK+PI= +github.com/ethereum/hive v0.0.0-20240319152821-ae224371b4e5/go.mod h1:MGwUXPGco6YS3brOf5WEILfUnnUL/XuX1224ab3D7XA= github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072/go.mod h1:duJ4Jxv5lDcvg4QuQr0oowTf7dz4/CR8NtyCooz9HL8= github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= github.com/fjl/memsize v0.0.1 h1:+zhkb+dhUgx0/e+M8sF0QqiouvMQUiKR+QYvdxIOKcQ= +github.com/fjl/memsize v0.0.1/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= +github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= github.com/gavv/httpexpect v2.0.0+incompatible/go.mod h1:x+9tiU1YnrOvnB725RkpoLv1M62hOWzwo5OXotisrKc= github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08 h1:f6D9Hr8xV8uYKlyuj8XIruxlh9WjVjdh1gIicAS7ays= +github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= github.com/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46 h1:BAIP2GihuqhwdILrV+7GJel5lyPV3u1+PgzrWLc0TkE= github.com/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46/go.mod h1:QNpY22eby74jVhqH4WhDLDwxc/vqsern6pW+u2kbkpc= github.com/getsentry/sentry-go v0.12.0/go.mod h1:NSap0JBYWzHND8oMbyi0+XZhUalc1TBdRL1M71JZW2c= @@ -102,6 +110,7 @@ github.com/gin-gonic/gin v1.4.0/go.mod h1:OW2EZn3DO8Ln9oIKOvM++LBO+5UPHJJDH72/q/ github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= +github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab/go.mod h1:/P9AEU963A2AYjv4d1V5eVL1CQbEJq6aCNHDDjibzu8= github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= @@ -149,28 +158,34 @@ github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMyw github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= +github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= +github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= +github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/hashicorp/go-bexpr v0.1.11 h1:6DqdA/KBjurGby9yTY0bmkathya0lfwF2SeuubCI7dY= +github.com/hashicorp/go-bexpr v0.1.11/go.mod h1:f03lAo0duBlDIUMGCuad8oLcgejw4m7U+N8T+6Kz1AE= github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/holiman/billy v0.0.0-20230718173358-1c7e68d277a7 h1:3JQNjnMRil1yD0IfZKHF9GxxWKDJGj8I0IqOUol//sw= +github.com/holiman/billy v0.0.0-20230718173358-1c7e68d277a7/go.mod h1:5GuXa7vkL8u9FkFuWdVvfR5ix8hRB7DbOAaYULamFpc= github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao= github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA= github.com/holiman/uint256 v1.2.4 h1:jUc4Nk8fm9jZabQuqr2JzednajVmBpC+oiTiXZJEApU= github.com/holiman/uint256 v1.2.4/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXeiRV4ng7E= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/huin/goupnp v1.3.0 h1:UvLUlWDNpoUdYzb2TCn+MuTWtcjXKSza2n6CBdQ0xXc= +github.com/huin/goupnp v1.3.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8= github.com/hydrogen18/memlistener v0.0.0-20200120041712-dcc25e7acd91/go.mod h1:qEIFzExnS6016fRpRfxrExeVn2gbClQA99gQhnIcdhE= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/imkira/go-interpol v1.1.0/go.mod h1:z0h2/2T3XF8kyEPpRgJ3kmNv+C43p+I/CoI+jC3w2iA= @@ -181,6 +196,7 @@ github.com/iris-contrib/jade v1.1.3/go.mod h1:H/geBymxJhShH5kecoiOCSssPX7QWYH7Ua github.com/iris-contrib/pongo2 v0.0.1/go.mod h1:Ssh+00+3GAZqSQb30AvBRNxBx7rf0GqwkjqxNd0u65g= github.com/iris-contrib/schema v0.0.1/go.mod h1:urYA3uvUNG1TIIjOSCzHr9/LmbQo8LrOcOqfqxa4hXw= github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= +github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= @@ -206,20 +222,27 @@ github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= +github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/labstack/echo/v4 v4.5.0/go.mod h1:czIriw4a0C1dFun+ObrXp7ok03xON0N1awStJ6ArI7Y= github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c= +github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= +github.com/lithammer/dedent v1.1.0 h1:VNzHMVCBNG1j0fh3OrsFRkVUwStdDArbgBWoPAffktY= +github.com/lithammer/dedent v1.1.0/go.mod h1:jrXYCQtgg0nJiN+StA2KgR7w6CiQNv9Fd/Z9BP0jIOc= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.11/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng= +github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.14 h1:+xnbZSEeDbOIg5/mE6JF0w6n9duR1l3/WmbinWVwUuU= github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= @@ -231,7 +254,9 @@ github.com/microcosm-cc/bluemonday v1.0.2/go.mod h1:iVP4YcDBq+n/5fb23BhYFvIMq/le github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= +github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/pointerstructure v1.2.1 h1:ZhBBeX8tSlRpu/FFhXH4RC4OJzFlqsQhoHZAz4x7TIw= +github.com/mitchellh/pointerstructure v1.2.1/go.mod h1:BRAsLI5zgXmw97Lf6s25bs8ohIXc3tViBH44KcwB2g4= github.com/mmcloughlin/addchain v0.4.0 h1:SobOdjm2xLj1KkXN5/n0xTIWyZA2+s99UCY1iPfkHRY= github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqkyU72HC5wJ4RlU= github.com/mmcloughlin/profile v0.1.1/go.mod h1:IhHD7q1ooxgwTgjxQYkACGA77oFTDdFVejUS1/tS/qU= @@ -287,9 +312,11 @@ github.com/rogpeppe/go-internal v1.8.1/go.mod h1:JeRgkft04UBgHMgCIwADu4Pn6Mtm5d4 github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/rs/cors v1.8.2 h1:KCooALfAYGs415Cwu5ABvv9n9509fSiG5SQJn/AQo4U= +github.com/rs/cors v1.8.2/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/russross/blackfriday v1.5.2 h1:HyvC0ARfnZBqnXwABFeSZHpKvJHJJfPz81GNueLj0oo= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/schollz/closestmatch v2.1.0+incompatible/go.mod h1:RtP1ddjLong6gTkbtmuhtR2uUrrJOpYzYRvbcPAid+g= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= @@ -305,6 +332,7 @@ github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb6 github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= github.com/status-im/keycard-go v0.2.0 h1:QDLFswOQu1r5jsycloeQh3bVU8n/NatHHaZobtDnDzA= +github.com/status-im/keycard-go v0.2.0/go.mod h1:wlp8ZLbsmrF6g6WjugPAx+IzoLrkdf9+mHxBEeo3Hbg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= @@ -313,6 +341,7 @@ github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5 github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/supranational/blst v0.3.11 h1:LyU6FolezeWAhvQk0k6O/d49jqgO52MSDDfYgbeoEm4= github.com/supranational/blst v0.3.11/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a h1:1ur3QoCqvE5fl+nylMaIr9PVV1w343YRDtsy+Rwu7XI= @@ -322,11 +351,13 @@ github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0h github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= github.com/tyler-smith/go-bip39 v1.1.0 h1:5eUemwrMargf3BSLRRCalXT93Ns6pQJIjYQN2nyfOP8= +github.com/tyler-smith/go-bip39 v1.1.0/go.mod h1:gUYDtqQw1JS3ZJ8UWVcGTGqqr6YIN3CWg+kkNaLt55U= github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= github.com/urfave/cli/v2 v2.25.7 h1:VAzn5oq403l5pHjc4OhD54+XGO9cdKVL/7lDjF+iKUs= +github.com/urfave/cli/v2 v2.25.7/go.mod h1:8qnjx1vcq5s2/wpsqoZFndg2CE5tNFyrTvS6SinrnYQ= github.com/urfave/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/valyala/fasthttp v1.6.0/go.mod h1:FstJa9V+Pj9vQ7OJie2qMHdwemEDaDiSdBnvPM1Su9w= @@ -338,6 +369,7 @@ github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1: github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU= +github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8= github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0/go.mod h1:/LWChgwKmvncFJFHJ7Gvn9wZArjbV5/FppcK2fKk/tI= github.com/yudai/gojsondiff v1.0.0/go.mod h1:AY32+k2cwILAkW1fbgxQ5mUmMiZFgLIV+FBNExI05xg= github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82/go.mod h1:lgjkn3NuSvDfVJdfcVVdX+jpBxNmX4rDAzaS45IcYoM= @@ -392,6 +424,7 @@ golang.org/x/net v0.0.0-20211008194852-3b03d305991f/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= +golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -434,11 +467,12 @@ golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= -golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= +golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -451,6 +485,7 @@ golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= +golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181221001348-537d06c36207/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -496,20 +531,23 @@ google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpAD google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= -google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= +google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= gopkg.in/go-playground/validator.v8 v8.18.2/go.mod h1:RX2a/7Ha8BgOhfk7j780h4/u/RRjR0eouCJSH80/M2Y= gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1 h1:iiHuQZCNgYPmFQxd3BBN/Nc5+dAwzZuq5y40s20oQw0= +gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= gopkg.in/ini.v1 v1.51.1/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8= +gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= From b09ef917c82d2caa6754e1b33985912ba26966a0 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Tue, 19 Mar 2024 16:36:29 +0100 Subject: [PATCH 231/387] simulators/ethereum/rpc-compat: upgrade hivesim --- simulators/ethereum/rpc-compat/go.mod | 12 +++++++----- simulators/ethereum/rpc-compat/go.sum | 19 +++++++++++++------ 2 files changed, 20 insertions(+), 11 deletions(-) diff --git a/simulators/ethereum/rpc-compat/go.mod b/simulators/ethereum/rpc-compat/go.mod index ecfe1d5a79..c3ed7ab548 100644 --- a/simulators/ethereum/rpc-compat/go.mod +++ b/simulators/ethereum/rpc-compat/go.mod @@ -1,10 +1,14 @@ module github.com/ethereum/hive/simulators/ethereum/rpc-compat -go 1.18 +go 1.21 + +toolchain go1.22.1 require ( github.com/ethereum/go-ethereum v1.13.5-0.20231031113925-bc42e88415d3 - github.com/ethereum/hive v0.0.0-20240131232337-d38a51d4e475 + github.com/ethereum/hive v0.0.0-20240319152821-ae224371b4e5 + github.com/tidwall/gjson v1.17.0 + github.com/tidwall/sjson v1.2.5 github.com/yudai/gojsondiff v1.0.0 ) @@ -25,10 +29,8 @@ require ( github.com/sergi/go-diff v1.2.0 // indirect github.com/shirou/gopsutil v3.21.11+incompatible // indirect github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a // indirect - github.com/tidwall/gjson v1.17.0 // indirect github.com/tidwall/match v1.1.1 // indirect github.com/tidwall/pretty v1.2.0 // indirect - github.com/tidwall/sjson v1.2.5 // indirect github.com/tklauser/go-sysconf v0.3.12 // indirect github.com/tklauser/numcpus v0.6.1 // indirect github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82 // indirect @@ -37,7 +39,7 @@ require ( golang.org/x/crypto v0.14.0 // indirect golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect golang.org/x/mod v0.12.0 // indirect - golang.org/x/sys v0.13.0 // indirect + golang.org/x/sys v0.18.0 // indirect golang.org/x/tools v0.13.0 // indirect gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1 // indirect ) diff --git a/simulators/ethereum/rpc-compat/go.sum b/simulators/ethereum/rpc-compat/go.sum index cd8f144914..bb521b77c0 100644 --- a/simulators/ethereum/rpc-compat/go.sum +++ b/simulators/ethereum/rpc-compat/go.sum @@ -3,6 +3,7 @@ github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5 github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U= github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= +github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= @@ -12,16 +13,18 @@ github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs github.com/deckarep/golang-set/v2 v2.1.0 h1:g47V4Or+DUdzbs8FxCCmgb6VYd+ptPAngjM6dtGktsI= github.com/deckarep/golang-set/v2 v2.1.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0= +github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 h1:HbphB4TFFXpv7MNrT52FGrrgVXF1owhMVTHFZIlnvd4= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0/go.mod h1:DZGJHZMqrU4JJqFAWUS2UO1+lbSKsdiOoYi9Zzey7Fc= github.com/ethereum/go-ethereum v1.13.5-0.20231031113925-bc42e88415d3 h1:i4TE0DmzMYcr2IiCdlTGGk+7Q/EzXvBKbbG4uRxMjJ0= github.com/ethereum/go-ethereum v1.13.5-0.20231031113925-bc42e88415d3/go.mod h1:yMTu38GSuyxaYzQMViqNmQ1s3cE84abZexQmTgenWk0= -github.com/ethereum/hive v0.0.0-20240131232337-d38a51d4e475 h1:IlQwBa8MmXq/pfdDbzCwYYqf3PVEXIvI6xkf3ZB8p4E= -github.com/ethereum/hive v0.0.0-20240131232337-d38a51d4e475/go.mod h1:D0RJuJaAolOejqq/n0YoX7VbPzkooLHwCSoaQn2z6xY= +github.com/ethereum/hive v0.0.0-20240319152821-ae224371b4e5 h1:2Rc3v1mqWgUl8gSHFh7+FmVcyB1AI/9THxhEDjNK+PI= +github.com/ethereum/hive v0.0.0-20240319152821-ae224371b4e5/go.mod h1:MGwUXPGco6YS3brOf5WEILfUnnUL/XuX1224ab3D7XA= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= +github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-stack/stack v1.8.1 h1:ntEHSVwIt7PNXNpgPmVfMrNhLtgjlmnZha2kOpuRiDw= @@ -46,7 +49,8 @@ github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMyw github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= +github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= +github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/holiman/uint256 v1.2.3 h1:K8UWO1HUJpRMXBxbmaY1Y8IAMZC/RsKB+ArEnnK4l5o= @@ -88,9 +92,9 @@ github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81P github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a h1:1ur3QoCqvE5fl+nylMaIr9PVV1w343YRDtsy+Rwu7XI= github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a/go.mod h1:RRCYJbIwD5jmqPI9XoAFR0OcDxqUctll6zUj/+B4S48= -github.com/tidwall/gjson v1.14.2 h1:6BBkirS0rAHjumnjHF6qgy5d2YAJ1TLIaFE2lzfOLqo= github.com/tidwall/gjson v1.14.2/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= github.com/tidwall/gjson v1.17.0 h1:/Jocvlh98kcTfpN2+JzGQWQcqrPQwDrVEMApx/M5ZwM= github.com/tidwall/gjson v1.17.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= @@ -132,10 +136,12 @@ golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= +golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= +golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -156,8 +162,8 @@ golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= -golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= +golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -165,6 +171,7 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= +golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= From fa5064172432a55c201d264a305a6654d64d0e02 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Tue, 19 Mar 2024 16:36:41 +0100 Subject: [PATCH 232/387] simulators/ethereum/rpc: upgrade hivesim --- simulators/ethereum/rpc/go.mod | 16 +++++++++--- simulators/ethereum/rpc/go.sum | 48 +++++++++++++++++++++++++++------- 2 files changed, 51 insertions(+), 13 deletions(-) diff --git a/simulators/ethereum/rpc/go.mod b/simulators/ethereum/rpc/go.mod index 5450dfb20f..0f924b751c 100644 --- a/simulators/ethereum/rpc/go.mod +++ b/simulators/ethereum/rpc/go.mod @@ -1,10 +1,12 @@ module github.com/ethereum/hive/simulators/ethereum/rpc -go 1.18 +go 1.21 + +toolchain go1.22.1 require ( github.com/ethereum/go-ethereum v1.13.5-0.20231031113925-bc42e88415d3 - github.com/ethereum/hive v0.0.0-20231031133732-dcd7ddb75960 + github.com/ethereum/hive v0.0.0-20240319152821-ae224371b4e5 github.com/kr/pretty v0.3.1 ) @@ -36,8 +38,10 @@ require ( github.com/go-stack/stack v1.8.1 // indirect github.com/gofrs/flock v0.8.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang-jwt/jwt/v4 v4.5.0 // indirect github.com/golang/protobuf v1.5.3 // indirect github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect + github.com/google/go-cmp v0.6.0 // indirect github.com/google/uuid v1.3.0 // indirect github.com/gorilla/websocket v1.5.0 // indirect github.com/hashicorp/go-bexpr v0.1.11 // indirect @@ -45,6 +49,9 @@ require ( github.com/holiman/uint256 v1.2.3 // indirect github.com/klauspost/compress v1.15.15 // indirect github.com/kr/text v0.2.0 // indirect + github.com/lithammer/dedent v1.1.0 // indirect + github.com/mattn/go-colorable v0.1.13 // indirect + github.com/mattn/go-isatty v0.0.17 // indirect github.com/mattn/go-runewidth v0.0.14 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect @@ -68,9 +75,10 @@ require ( golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect golang.org/x/mod v0.12.0 // indirect golang.org/x/sync v0.3.0 // indirect - golang.org/x/sys v0.13.0 // indirect + golang.org/x/sys v0.18.0 // indirect golang.org/x/text v0.13.0 // indirect golang.org/x/tools v0.13.0 // indirect - google.golang.org/protobuf v1.28.1 // indirect + google.golang.org/protobuf v1.33.0 // indirect + gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1 // indirect rsc.io/tmplfunc v0.0.3 // indirect ) diff --git a/simulators/ethereum/rpc/go.sum b/simulators/ethereum/rpc/go.sum index 3d25c04512..b203a982a5 100644 --- a/simulators/ethereum/rpc/go.sum +++ b/simulators/ethereum/rpc/go.sum @@ -14,6 +14,7 @@ github.com/VictoriaMetrics/fastcache v1.12.1/go.mod h1:tX04vaqcNoQeGLD+ra5pU5sWk github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY= github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= github.com/allegro/bigcache v1.2.1 h1:hg1sY1raCwic3Vnsvje6TT7/pnZba83LeFck5NrFKSc= +github.com/allegro/bigcache v1.2.1/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/aymerick/raymond v2.0.3-0.20180322193309-b565731e1464+incompatible/go.mod h1:osfaiScAUVup+UC9Nfq76eWqDhXlp+4UYaA8uhTBO6g= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= @@ -23,6 +24,7 @@ github.com/bits-and-blooms/bitset v1.7.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edY github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U= github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= +github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/cp v1.1.1 h1:nCb6ZLdB7NRaqsm91JtQTAme2SKJzXVsdPIPkyJr1MU= github.com/cespare/cp v1.1.1/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s= @@ -35,6 +37,7 @@ github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDk github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cockroachdb/datadriven v1.0.2/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f h1:otljaYPt5hWxV3MUfO5dFPFiOXg9CyG5/kCfayTqsJ4= +github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= github.com/cockroachdb/errors v1.9.1 h1:yFVvsI0VxmRShfawbt/laCIDy/mtTqqnvoNgiy5bEV8= github.com/cockroachdb/errors v1.9.1/go.mod h1:2sxOtL2WIc096WSZqZ5h8fa17rdDq9HZOZLBCor4mBk= github.com/cockroachdb/logtags v0.0.0-20211118104740-dabe8e521a4f/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= @@ -57,6 +60,7 @@ github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3Ee github.com/cpuguy83/go-md2man v1.0.10 h1:BSKMNlYxDvnunlTymqtgONjNnaRV1sTpcovwwjF22jk= github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= +github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/crate-crypto/go-kzg-4844 v0.7.0 h1:C0vgZRk4q4EZ/JgPfzuSoxdCq3C3mOZMBShovmncxvA= github.com/crate-crypto/go-kzg-4844 v0.7.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= @@ -66,6 +70,7 @@ github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs github.com/deckarep/golang-set/v2 v2.1.0 h1:g47V4Or+DUdzbs8FxCCmgb6VYd+ptPAngjM6dtGktsI= github.com/deckarep/golang-set/v2 v2.1.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0= +github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 h1:HbphB4TFFXpv7MNrT52FGrrgVXF1owhMVTHFZIlnvd4= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0/go.mod h1:DZGJHZMqrU4JJqFAWUS2UO1+lbSKsdiOoYi9Zzey7Fc= github.com/dgraph-io/badger v1.6.0/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6psNgSztDR4= @@ -81,8 +86,8 @@ github.com/ethereum/c-kzg-4844 v0.4.0 h1:3MS1s4JtA868KpJxroZoepdV0ZKBp3u/O5HcZ7R github.com/ethereum/c-kzg-4844 v0.4.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= github.com/ethereum/go-ethereum v1.13.5-0.20231031113925-bc42e88415d3 h1:i4TE0DmzMYcr2IiCdlTGGk+7Q/EzXvBKbbG4uRxMjJ0= github.com/ethereum/go-ethereum v1.13.5-0.20231031113925-bc42e88415d3/go.mod h1:yMTu38GSuyxaYzQMViqNmQ1s3cE84abZexQmTgenWk0= -github.com/ethereum/hive v0.0.0-20231031133732-dcd7ddb75960 h1:7H9z2o/KImWQ/1PACU3ewsSFNxT/lzwYRnwit2YFqMg= -github.com/ethereum/hive v0.0.0-20231031133732-dcd7ddb75960/go.mod h1:sV7LrFBlEii71kI9udVbUVj7SXIifZ2VzFjQ8S6rZns= +github.com/ethereum/hive v0.0.0-20240319152821-ae224371b4e5 h1:2Rc3v1mqWgUl8gSHFh7+FmVcyB1AI/9THxhEDjNK+PI= +github.com/ethereum/hive v0.0.0-20240319152821-ae224371b4e5/go.mod h1:MGwUXPGco6YS3brOf5WEILfUnnUL/XuX1224ab3D7XA= github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072/go.mod h1:duJ4Jxv5lDcvg4QuQr0oowTf7dz4/CR8NtyCooz9HL8= github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= github.com/fjl/memsize v0.0.1 h1:+zhkb+dhUgx0/e+M8sF0QqiouvMQUiKR+QYvdxIOKcQ= @@ -103,6 +108,7 @@ github.com/gin-gonic/gin v1.4.0/go.mod h1:OW2EZn3DO8Ln9oIKOvM++LBO+5UPHJJDH72/q/ github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= +github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab/go.mod h1:/P9AEU963A2AYjv4d1V5eVL1CQbEJq6aCNHDDjibzu8= github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= @@ -120,9 +126,9 @@ github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7a github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/gogo/status v1.1.0/go.mod h1:BFv9nrluPLmrS0EmGVvLaPNmRosr9KapBYd5/hpY1WM= -github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY= github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= +github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -150,7 +156,8 @@ github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMyw github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= @@ -159,7 +166,8 @@ github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+ github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= +github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= +github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= @@ -168,12 +176,14 @@ github.com/hashicorp/go-bexpr v0.1.11/go.mod h1:f03lAo0duBlDIUMGCuad8oLcgejw4m7U github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/holiman/billy v0.0.0-20230718173358-1c7e68d277a7 h1:3JQNjnMRil1yD0IfZKHF9GxxWKDJGj8I0IqOUol//sw= +github.com/holiman/billy v0.0.0-20230718173358-1c7e68d277a7/go.mod h1:5GuXa7vkL8u9FkFuWdVvfR5ix8hRB7DbOAaYULamFpc= github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao= github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA= github.com/holiman/uint256 v1.2.3 h1:K8UWO1HUJpRMXBxbmaY1Y8IAMZC/RsKB+ArEnnK4l5o= github.com/holiman/uint256 v1.2.3/go.mod h1:SC8Ryt4n+UBbPbIBKaG9zbbDlp4jOru9xFZmPzLUTxw= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/huin/goupnp v1.3.0 h1:UvLUlWDNpoUdYzb2TCn+MuTWtcjXKSza2n6CBdQ0xXc= +github.com/huin/goupnp v1.3.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8= github.com/hydrogen18/memlistener v0.0.0-20200120041712-dcc25e7acd91/go.mod h1:qEIFzExnS6016fRpRfxrExeVn2gbClQA99gQhnIcdhE= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/imkira/go-interpol v1.1.0/go.mod h1:z0h2/2T3XF8kyEPpRgJ3kmNv+C43p+I/CoI+jC3w2iA= @@ -184,6 +194,7 @@ github.com/iris-contrib/jade v1.1.3/go.mod h1:H/geBymxJhShH5kecoiOCSssPX7QWYH7Ua github.com/iris-contrib/pongo2 v0.0.1/go.mod h1:Ssh+00+3GAZqSQb30AvBRNxBx7rf0GqwkjqxNd0u65g= github.com/iris-contrib/schema v0.0.1/go.mod h1:urYA3uvUNG1TIIjOSCzHr9/LmbQo8LrOcOqfqxa4hXw= github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= +github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= @@ -209,20 +220,27 @@ github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= +github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/labstack/echo/v4 v4.5.0/go.mod h1:czIriw4a0C1dFun+ObrXp7ok03xON0N1awStJ6ArI7Y= github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c= +github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= +github.com/lithammer/dedent v1.1.0 h1:VNzHMVCBNG1j0fh3OrsFRkVUwStdDArbgBWoPAffktY= +github.com/lithammer/dedent v1.1.0/go.mod h1:jrXYCQtgg0nJiN+StA2KgR7w6CiQNv9Fd/Z9BP0jIOc= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.11/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng= +github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.14 h1:+xnbZSEeDbOIg5/mE6JF0w6n9duR1l3/WmbinWVwUuU= github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= @@ -297,6 +315,7 @@ github.com/rs/cors v1.8.2/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/russross/blackfriday v1.5.2 h1:HyvC0ARfnZBqnXwABFeSZHpKvJHJJfPz81GNueLj0oo= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/schollz/closestmatch v2.1.0+incompatible/go.mod h1:RtP1ddjLong6gTkbtmuhtR2uUrrJOpYzYRvbcPAid+g= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= @@ -312,6 +331,7 @@ github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb6 github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= github.com/status-im/keycard-go v0.2.0 h1:QDLFswOQu1r5jsycloeQh3bVU8n/NatHHaZobtDnDzA= +github.com/status-im/keycard-go v0.2.0/go.mod h1:wlp8ZLbsmrF6g6WjugPAx+IzoLrkdf9+mHxBEeo3Hbg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= @@ -320,6 +340,7 @@ github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5 github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/supranational/blst v0.3.11 h1:LyU6FolezeWAhvQk0k6O/d49jqgO52MSDDfYgbeoEm4= github.com/supranational/blst v0.3.11/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a h1:1ur3QoCqvE5fl+nylMaIr9PVV1w343YRDtsy+Rwu7XI= @@ -329,11 +350,13 @@ github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0h github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= github.com/tyler-smith/go-bip39 v1.1.0 h1:5eUemwrMargf3BSLRRCalXT93Ns6pQJIjYQN2nyfOP8= +github.com/tyler-smith/go-bip39 v1.1.0/go.mod h1:gUYDtqQw1JS3ZJ8UWVcGTGqqr6YIN3CWg+kkNaLt55U= github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= github.com/urfave/cli/v2 v2.25.7 h1:VAzn5oq403l5pHjc4OhD54+XGO9cdKVL/7lDjF+iKUs= +github.com/urfave/cli/v2 v2.25.7/go.mod h1:8qnjx1vcq5s2/wpsqoZFndg2CE5tNFyrTvS6SinrnYQ= github.com/urfave/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/valyala/fasthttp v1.6.0/go.mod h1:FstJa9V+Pj9vQ7OJie2qMHdwemEDaDiSdBnvPM1Su9w= @@ -345,6 +368,7 @@ github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1: github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU= +github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8= github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0/go.mod h1:/LWChgwKmvncFJFHJ7Gvn9wZArjbV5/FppcK2fKk/tI= github.com/yudai/gojsondiff v1.0.0/go.mod h1:AY32+k2cwILAkW1fbgxQ5mUmMiZFgLIV+FBNExI05xg= github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82/go.mod h1:lgjkn3NuSvDfVJdfcVVdX+jpBxNmX4rDAzaS45IcYoM= @@ -399,6 +423,7 @@ golang.org/x/net v0.0.0-20211008194852-3b03d305991f/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= +golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -441,12 +466,13 @@ golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= -golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= +golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -459,6 +485,7 @@ golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= +golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181221001348-537d06c36207/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -504,20 +531,23 @@ google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpAD google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= -google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= +google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= gopkg.in/go-playground/validator.v8 v8.18.2/go.mod h1:RX2a/7Ha8BgOhfk7j780h4/u/RRjR0eouCJSH80/M2Y= gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1 h1:iiHuQZCNgYPmFQxd3BBN/Nc5+dAwzZuq5y40s20oQw0= +gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= gopkg.in/ini.v1 v1.51.1/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8= +gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= From 790492dcb7a9c37885a183e0dfdd22a18cdc7f36 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Tue, 19 Mar 2024 16:36:50 +0100 Subject: [PATCH 233/387] simulators/ethereum/sync: upgrade hivesim --- simulators/ethereum/sync/go.mod | 11 +++++--- simulators/ethereum/sync/go.sum | 48 +++++++++++++++++++++++++++------ 2 files changed, 47 insertions(+), 12 deletions(-) diff --git a/simulators/ethereum/sync/go.mod b/simulators/ethereum/sync/go.mod index c0bd451159..8f1b00ea1b 100644 --- a/simulators/ethereum/sync/go.mod +++ b/simulators/ethereum/sync/go.mod @@ -1,10 +1,12 @@ module github.com/ethereum/hive/simulators/ethereum/sync -go 1.20 +go 1.21 + +toolchain go1.22.1 require ( github.com/ethereum/go-ethereum v1.13.5-0.20231031113925-bc42e88415d3 - github.com/ethereum/hive v0.0.0-20240131232337-d38a51d4e475 + github.com/ethereum/hive v0.0.0-20240319152821-ae224371b4e5 ) require ( @@ -34,6 +36,7 @@ require ( github.com/golang-jwt/jwt/v4 v4.5.0 // indirect github.com/golang/protobuf v1.5.3 // indirect github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect + github.com/google/go-cmp v0.6.0 // indirect github.com/gorilla/websocket v1.5.0 // indirect github.com/holiman/uint256 v1.2.3 // indirect github.com/klauspost/compress v1.15.15 // indirect @@ -63,10 +66,10 @@ require ( golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect golang.org/x/mod v0.12.0 // indirect golang.org/x/sync v0.3.0 // indirect - golang.org/x/sys v0.13.0 // indirect + golang.org/x/sys v0.18.0 // indirect golang.org/x/text v0.13.0 // indirect golang.org/x/tools v0.13.0 // indirect - google.golang.org/protobuf v1.28.1 // indirect + google.golang.org/protobuf v1.33.0 // indirect gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1 // indirect rsc.io/tmplfunc v0.0.3 // indirect ) diff --git a/simulators/ethereum/sync/go.sum b/simulators/ethereum/sync/go.sum index aa33968c89..d643fcd748 100644 --- a/simulators/ethereum/sync/go.sum +++ b/simulators/ethereum/sync/go.sum @@ -14,6 +14,7 @@ github.com/VictoriaMetrics/fastcache v1.12.1/go.mod h1:tX04vaqcNoQeGLD+ra5pU5sWk github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY= github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= github.com/allegro/bigcache v1.2.1 h1:hg1sY1raCwic3Vnsvje6TT7/pnZba83LeFck5NrFKSc= +github.com/allegro/bigcache v1.2.1/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/aymerick/raymond v2.0.3-0.20180322193309-b565731e1464+incompatible/go.mod h1:osfaiScAUVup+UC9Nfq76eWqDhXlp+4UYaA8uhTBO6g= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= @@ -23,6 +24,7 @@ github.com/bits-and-blooms/bitset v1.7.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edY github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U= github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= +github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= @@ -33,6 +35,7 @@ github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDk github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cockroachdb/datadriven v1.0.2/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f h1:otljaYPt5hWxV3MUfO5dFPFiOXg9CyG5/kCfayTqsJ4= +github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= github.com/cockroachdb/errors v1.9.1 h1:yFVvsI0VxmRShfawbt/laCIDy/mtTqqnvoNgiy5bEV8= github.com/cockroachdb/errors v1.9.1/go.mod h1:2sxOtL2WIc096WSZqZ5h8fa17rdDq9HZOZLBCor4mBk= github.com/cockroachdb/logtags v0.0.0-20211118104740-dabe8e521a4f/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= @@ -55,6 +58,7 @@ github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3Ee github.com/cpuguy83/go-md2man v1.0.10 h1:BSKMNlYxDvnunlTymqtgONjNnaRV1sTpcovwwjF22jk= github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= +github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/crate-crypto/go-kzg-4844 v0.7.0 h1:C0vgZRk4q4EZ/JgPfzuSoxdCq3C3mOZMBShovmncxvA= github.com/crate-crypto/go-kzg-4844 v0.7.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= @@ -64,6 +68,7 @@ github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs github.com/deckarep/golang-set/v2 v2.1.0 h1:g47V4Or+DUdzbs8FxCCmgb6VYd+ptPAngjM6dtGktsI= github.com/deckarep/golang-set/v2 v2.1.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0= +github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 h1:HbphB4TFFXpv7MNrT52FGrrgVXF1owhMVTHFZIlnvd4= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0/go.mod h1:DZGJHZMqrU4JJqFAWUS2UO1+lbSKsdiOoYi9Zzey7Fc= github.com/dgraph-io/badger v1.6.0/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6psNgSztDR4= @@ -79,17 +84,20 @@ github.com/ethereum/c-kzg-4844 v0.4.0 h1:3MS1s4JtA868KpJxroZoepdV0ZKBp3u/O5HcZ7R github.com/ethereum/c-kzg-4844 v0.4.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= github.com/ethereum/go-ethereum v1.13.5-0.20231031113925-bc42e88415d3 h1:i4TE0DmzMYcr2IiCdlTGGk+7Q/EzXvBKbbG4uRxMjJ0= github.com/ethereum/go-ethereum v1.13.5-0.20231031113925-bc42e88415d3/go.mod h1:yMTu38GSuyxaYzQMViqNmQ1s3cE84abZexQmTgenWk0= -github.com/ethereum/hive v0.0.0-20240131232337-d38a51d4e475 h1:IlQwBa8MmXq/pfdDbzCwYYqf3PVEXIvI6xkf3ZB8p4E= -github.com/ethereum/hive v0.0.0-20240131232337-d38a51d4e475/go.mod h1:D0RJuJaAolOejqq/n0YoX7VbPzkooLHwCSoaQn2z6xY= +github.com/ethereum/hive v0.0.0-20240319152821-ae224371b4e5 h1:2Rc3v1mqWgUl8gSHFh7+FmVcyB1AI/9THxhEDjNK+PI= +github.com/ethereum/hive v0.0.0-20240319152821-ae224371b4e5/go.mod h1:MGwUXPGco6YS3brOf5WEILfUnnUL/XuX1224ab3D7XA= github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072/go.mod h1:duJ4Jxv5lDcvg4QuQr0oowTf7dz4/CR8NtyCooz9HL8= github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5 h1:FtmdgXiUlNeRsoNMFlKLDt+S+6hbjVMEW6RGQ7aUf7c= +github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= +github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= github.com/gavv/httpexpect v2.0.0+incompatible/go.mod h1:x+9tiU1YnrOvnB725RkpoLv1M62hOWzwo5OXotisrKc= github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff h1:tY80oXqGNY4FhTFhk+o9oFHGINQ/+vhlm8HFzi6znCI= +github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= github.com/getsentry/sentry-go v0.12.0/go.mod h1:NSap0JBYWzHND8oMbyi0+XZhUalc1TBdRL1M71JZW2c= github.com/getsentry/sentry-go v0.18.0 h1:MtBW5H9QgdcJabtZcuJG80BMOwaBpkRDZkxRkNC1sN0= github.com/getsentry/sentry-go v0.18.0/go.mod h1:Kgon4Mby+FJ7ZWHFUAZgVaIa8sxHtnRJRLTXZr51aKQ= @@ -98,6 +106,7 @@ github.com/gin-gonic/gin v1.4.0/go.mod h1:OW2EZn3DO8Ln9oIKOvM++LBO+5UPHJJDH72/q/ github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= +github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab/go.mod h1:/P9AEU963A2AYjv4d1V5eVL1CQbEJq6aCNHDDjibzu8= github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= @@ -145,27 +154,34 @@ github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMyw github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= +github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= +github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= +github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/hashicorp/go-bexpr v0.1.10 h1:9kuI5PFotCboP3dkDYFr/wi0gg0QVbSNz5oFRpxn4uE= +github.com/hashicorp/go-bexpr v0.1.10/go.mod h1:oxlubA2vC/gFVfX1A6JGp7ls7uCDlfJn732ehYYg+g0= github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/holiman/billy v0.0.0-20230718173358-1c7e68d277a7 h1:3JQNjnMRil1yD0IfZKHF9GxxWKDJGj8I0IqOUol//sw= +github.com/holiman/billy v0.0.0-20230718173358-1c7e68d277a7/go.mod h1:5GuXa7vkL8u9FkFuWdVvfR5ix8hRB7DbOAaYULamFpc= github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao= +github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA= github.com/holiman/uint256 v1.2.3 h1:K8UWO1HUJpRMXBxbmaY1Y8IAMZC/RsKB+ArEnnK4l5o= github.com/holiman/uint256 v1.2.3/go.mod h1:SC8Ryt4n+UBbPbIBKaG9zbbDlp4jOru9xFZmPzLUTxw= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/huin/goupnp v1.3.0 h1:UvLUlWDNpoUdYzb2TCn+MuTWtcjXKSza2n6CBdQ0xXc= +github.com/huin/goupnp v1.3.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8= github.com/hydrogen18/memlistener v0.0.0-20200120041712-dcc25e7acd91/go.mod h1:qEIFzExnS6016fRpRfxrExeVn2gbClQA99gQhnIcdhE= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/imkira/go-interpol v1.1.0/go.mod h1:z0h2/2T3XF8kyEPpRgJ3kmNv+C43p+I/CoI+jC3w2iA= @@ -176,6 +192,7 @@ github.com/iris-contrib/jade v1.1.3/go.mod h1:H/geBymxJhShH5kecoiOCSssPX7QWYH7Ua github.com/iris-contrib/pongo2 v0.0.1/go.mod h1:Ssh+00+3GAZqSQb30AvBRNxBx7rf0GqwkjqxNd0u65g= github.com/iris-contrib/schema v0.0.1/go.mod h1:urYA3uvUNG1TIIjOSCzHr9/LmbQo8LrOcOqfqxa4hXw= github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= +github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= @@ -201,9 +218,11 @@ github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= +github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/labstack/echo/v4 v4.5.0/go.mod h1:czIriw4a0C1dFun+ObrXp7ok03xON0N1awStJ6ArI7Y= github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c= +github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= github.com/lithammer/dedent v1.1.0 h1:VNzHMVCBNG1j0fh3OrsFRkVUwStdDArbgBWoPAffktY= github.com/lithammer/dedent v1.1.0/go.mod h1:jrXYCQtgg0nJiN+StA2KgR7w6CiQNv9Fd/Z9BP0jIOc= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= @@ -231,7 +250,9 @@ github.com/microcosm-cc/bluemonday v1.0.2/go.mod h1:iVP4YcDBq+n/5fb23BhYFvIMq/le github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.4.1 h1:CpVNEelQCZBooIPDn+AR3NpivK/TIKU8bDxdASFVQag= +github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/pointerstructure v1.2.0 h1:O+i9nHnXS3l/9Wu7r4NrEdwA2VFTicjUEN1uBnDo34A= +github.com/mitchellh/pointerstructure v1.2.0/go.mod h1:BRAsLI5zgXmw97Lf6s25bs8ohIXc3tViBH44KcwB2g4= github.com/mmcloughlin/addchain v0.4.0 h1:SobOdjm2xLj1KkXN5/n0xTIWyZA2+s99UCY1iPfkHRY= github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqkyU72HC5wJ4RlU= github.com/mmcloughlin/profile v0.1.1/go.mod h1:IhHD7q1ooxgwTgjxQYkACGA77oFTDdFVejUS1/tS/qU= @@ -287,9 +308,11 @@ github.com/rogpeppe/go-internal v1.8.1/go.mod h1:JeRgkft04UBgHMgCIwADu4Pn6Mtm5d4 github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/rs/cors v1.7.0 h1:+88SsELBHx5r+hZ8TCkggzSstaWNbDvThkVK8H6f9ik= +github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/russross/blackfriday v1.5.2 h1:HyvC0ARfnZBqnXwABFeSZHpKvJHJJfPz81GNueLj0oo= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/schollz/closestmatch v2.1.0+incompatible/go.mod h1:RtP1ddjLong6gTkbtmuhtR2uUrrJOpYzYRvbcPAid+g= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= @@ -305,6 +328,7 @@ github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb6 github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= github.com/status-im/keycard-go v0.2.0 h1:QDLFswOQu1r5jsycloeQh3bVU8n/NatHHaZobtDnDzA= +github.com/status-im/keycard-go v0.2.0/go.mod h1:wlp8ZLbsmrF6g6WjugPAx+IzoLrkdf9+mHxBEeo3Hbg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= @@ -313,6 +337,7 @@ github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5 github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/supranational/blst v0.3.11 h1:LyU6FolezeWAhvQk0k6O/d49jqgO52MSDDfYgbeoEm4= github.com/supranational/blst v0.3.11/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a h1:1ur3QoCqvE5fl+nylMaIr9PVV1w343YRDtsy+Rwu7XI= @@ -322,11 +347,13 @@ github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0h github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= github.com/tyler-smith/go-bip39 v1.1.0 h1:5eUemwrMargf3BSLRRCalXT93Ns6pQJIjYQN2nyfOP8= +github.com/tyler-smith/go-bip39 v1.1.0/go.mod h1:gUYDtqQw1JS3ZJ8UWVcGTGqqr6YIN3CWg+kkNaLt55U= github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= github.com/urfave/cli/v2 v2.25.7 h1:VAzn5oq403l5pHjc4OhD54+XGO9cdKVL/7lDjF+iKUs= +github.com/urfave/cli/v2 v2.25.7/go.mod h1:8qnjx1vcq5s2/wpsqoZFndg2CE5tNFyrTvS6SinrnYQ= github.com/urfave/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/valyala/fasthttp v1.6.0/go.mod h1:FstJa9V+Pj9vQ7OJie2qMHdwemEDaDiSdBnvPM1Su9w= @@ -338,6 +365,7 @@ github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1: github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU= +github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8= github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0/go.mod h1:/LWChgwKmvncFJFHJ7Gvn9wZArjbV5/FppcK2fKk/tI= github.com/yudai/gojsondiff v1.0.0/go.mod h1:AY32+k2cwILAkW1fbgxQ5mUmMiZFgLIV+FBNExI05xg= github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82/go.mod h1:lgjkn3NuSvDfVJdfcVVdX+jpBxNmX4rDAzaS45IcYoM= @@ -392,6 +420,7 @@ golang.org/x/net v0.0.0-20211008194852-3b03d305991f/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= +golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -438,8 +467,8 @@ golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= -golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= +golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -452,6 +481,7 @@ golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= +golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181221001348-537d06c36207/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -497,12 +527,13 @@ google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpAD google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= -google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= +google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= @@ -512,6 +543,7 @@ gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1/go.mod h1:a gopkg.in/ini.v1 v1.51.1/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8= +gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= From 6268c39bf09687b49ba68dbe5d98bc4a3c8f8e1c Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Tue, 19 Mar 2024 16:37:00 +0100 Subject: [PATCH 234/387] simulators/smoke: upgrade hivesim --- simulators/smoke/clique/go.mod | 13 ++++++++++--- simulators/smoke/clique/go.sum | 27 ++++++++++++++++++++++----- simulators/smoke/genesis/go.mod | 13 ++++++++++--- simulators/smoke/genesis/go.sum | 27 ++++++++++++++++++++++----- simulators/smoke/network/go.mod | 13 ++++++++++--- simulators/smoke/network/go.sum | 27 ++++++++++++++++++++++----- 6 files changed, 96 insertions(+), 24 deletions(-) diff --git a/simulators/smoke/clique/go.mod b/simulators/smoke/clique/go.mod index bbec5ed65e..2cfab2e44f 100644 --- a/simulators/smoke/clique/go.mod +++ b/simulators/smoke/clique/go.mod @@ -1,8 +1,10 @@ module github.com/ethereum/hive/simulators/smoke/clique -go 1.18 +go 1.21 -require github.com/ethereum/hive v0.0.0-20231031133732-dcd7ddb75960 +toolchain go1.22.1 + +require github.com/ethereum/hive v0.0.0-20240319152821-ae224371b4e5 require ( github.com/Microsoft/go-winio v0.6.1 // indirect @@ -12,9 +14,13 @@ require ( github.com/ethereum/go-ethereum v1.13.5-0.20231031113925-bc42e88415d3 // indirect github.com/go-ole/go-ole v1.2.6 // indirect github.com/go-stack/stack v1.8.1 // indirect + github.com/golang-jwt/jwt/v4 v4.5.0 // indirect github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect github.com/gorilla/websocket v1.5.0 // indirect github.com/holiman/uint256 v1.2.3 // indirect + github.com/lithammer/dedent v1.1.0 // indirect + github.com/mattn/go-colorable v0.1.13 // indirect + github.com/mattn/go-isatty v0.0.17 // indirect github.com/shirou/gopsutil v3.21.11+incompatible // indirect github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a // indirect github.com/tklauser/go-sysconf v0.3.12 // indirect @@ -23,6 +29,7 @@ require ( golang.org/x/crypto v0.14.0 // indirect golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect golang.org/x/mod v0.12.0 // indirect - golang.org/x/sys v0.13.0 // indirect + golang.org/x/sys v0.18.0 // indirect golang.org/x/tools v0.13.0 // indirect + gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1 // indirect ) diff --git a/simulators/smoke/clique/go.sum b/simulators/smoke/clique/go.sum index ad328b19d0..f1a59624ea 100644 --- a/simulators/smoke/clique/go.sum +++ b/simulators/smoke/clique/go.sum @@ -3,6 +3,7 @@ github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5 github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U= github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= +github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= @@ -12,21 +13,25 @@ github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs github.com/deckarep/golang-set/v2 v2.1.0 h1:g47V4Or+DUdzbs8FxCCmgb6VYd+ptPAngjM6dtGktsI= github.com/deckarep/golang-set/v2 v2.1.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0= +github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 h1:HbphB4TFFXpv7MNrT52FGrrgVXF1owhMVTHFZIlnvd4= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0/go.mod h1:DZGJHZMqrU4JJqFAWUS2UO1+lbSKsdiOoYi9Zzey7Fc= github.com/ethereum/go-ethereum v1.13.5-0.20231031113925-bc42e88415d3 h1:i4TE0DmzMYcr2IiCdlTGGk+7Q/EzXvBKbbG4uRxMjJ0= github.com/ethereum/go-ethereum v1.13.5-0.20231031113925-bc42e88415d3/go.mod h1:yMTu38GSuyxaYzQMViqNmQ1s3cE84abZexQmTgenWk0= -github.com/ethereum/hive v0.0.0-20231031133732-dcd7ddb75960 h1:7H9z2o/KImWQ/1PACU3ewsSFNxT/lzwYRnwit2YFqMg= -github.com/ethereum/hive v0.0.0-20231031133732-dcd7ddb75960/go.mod h1:sV7LrFBlEii71kI9udVbUVj7SXIifZ2VzFjQ8S6rZns= +github.com/ethereum/hive v0.0.0-20240319152821-ae224371b4e5 h1:2Rc3v1mqWgUl8gSHFh7+FmVcyB1AI/9THxhEDjNK+PI= +github.com/ethereum/hive v0.0.0-20240319152821-ae224371b4e5/go.mod h1:MGwUXPGco6YS3brOf5WEILfUnnUL/XuX1224ab3D7XA= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= +github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-stack/stack v1.8.1 h1:ntEHSVwIt7PNXNpgPmVfMrNhLtgjlmnZha2kOpuRiDw= github.com/go-stack/stack v1.8.1/go.mod h1:dcoOX6HbPZSZptuspn9bctJ+N/CnF5gGygcUP3XYfe4= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= +github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= +github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= @@ -44,15 +49,21 @@ github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMyw github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= +github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= +github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/holiman/uint256 v1.2.3 h1:K8UWO1HUJpRMXBxbmaY1Y8IAMZC/RsKB+ArEnnK4l5o= github.com/holiman/uint256 v1.2.3/go.mod h1:SC8Ryt4n+UBbPbIBKaG9zbbDlp4jOru9xFZmPzLUTxw= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/lithammer/dedent v1.1.0 h1:VNzHMVCBNG1j0fh3OrsFRkVUwStdDArbgBWoPAffktY= +github.com/lithammer/dedent v1.1.0/go.mod h1:jrXYCQtgg0nJiN+StA2KgR7w6CiQNv9Fd/Z9BP0jIOc= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng= +github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= @@ -75,6 +86,7 @@ github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+ github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a h1:1ur3QoCqvE5fl+nylMaIr9PVV1w343YRDtsy+Rwu7XI= github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a/go.mod h1:RRCYJbIwD5jmqPI9XoAFR0OcDxqUctll6zUj/+B4S48= github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= @@ -103,10 +115,12 @@ golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= +golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= +golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -124,10 +138,11 @@ golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= -golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= +golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -135,6 +150,7 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= +golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= @@ -156,6 +172,7 @@ google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQ gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1 h1:iiHuQZCNgYPmFQxd3BBN/Nc5+dAwzZuq5y40s20oQw0= +gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/simulators/smoke/genesis/go.mod b/simulators/smoke/genesis/go.mod index 7c713dd956..c5e5ecd82a 100644 --- a/simulators/smoke/genesis/go.mod +++ b/simulators/smoke/genesis/go.mod @@ -1,8 +1,10 @@ module github.com/ethereum/hive/simulators/smoke/genesis -go 1.18 +go 1.21 -require github.com/ethereum/hive v0.0.0-20231031133732-dcd7ddb75960 +toolchain go1.22.1 + +require github.com/ethereum/hive v0.0.0-20240319152821-ae224371b4e5 require ( github.com/Microsoft/go-winio v0.6.1 // indirect @@ -12,9 +14,13 @@ require ( github.com/ethereum/go-ethereum v1.13.5-0.20231031113925-bc42e88415d3 // indirect github.com/go-ole/go-ole v1.2.6 // indirect github.com/go-stack/stack v1.8.1 // indirect + github.com/golang-jwt/jwt/v4 v4.5.0 // indirect github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect github.com/gorilla/websocket v1.5.0 // indirect github.com/holiman/uint256 v1.2.3 // indirect + github.com/lithammer/dedent v1.1.0 // indirect + github.com/mattn/go-colorable v0.1.13 // indirect + github.com/mattn/go-isatty v0.0.17 // indirect github.com/shirou/gopsutil v3.21.11+incompatible // indirect github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a // indirect github.com/tklauser/go-sysconf v0.3.12 // indirect @@ -23,6 +29,7 @@ require ( golang.org/x/crypto v0.14.0 // indirect golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect golang.org/x/mod v0.12.0 // indirect - golang.org/x/sys v0.13.0 // indirect + golang.org/x/sys v0.18.0 // indirect golang.org/x/tools v0.13.0 // indirect + gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1 // indirect ) diff --git a/simulators/smoke/genesis/go.sum b/simulators/smoke/genesis/go.sum index ad328b19d0..f1a59624ea 100644 --- a/simulators/smoke/genesis/go.sum +++ b/simulators/smoke/genesis/go.sum @@ -3,6 +3,7 @@ github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5 github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U= github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= +github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= @@ -12,21 +13,25 @@ github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs github.com/deckarep/golang-set/v2 v2.1.0 h1:g47V4Or+DUdzbs8FxCCmgb6VYd+ptPAngjM6dtGktsI= github.com/deckarep/golang-set/v2 v2.1.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0= +github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 h1:HbphB4TFFXpv7MNrT52FGrrgVXF1owhMVTHFZIlnvd4= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0/go.mod h1:DZGJHZMqrU4JJqFAWUS2UO1+lbSKsdiOoYi9Zzey7Fc= github.com/ethereum/go-ethereum v1.13.5-0.20231031113925-bc42e88415d3 h1:i4TE0DmzMYcr2IiCdlTGGk+7Q/EzXvBKbbG4uRxMjJ0= github.com/ethereum/go-ethereum v1.13.5-0.20231031113925-bc42e88415d3/go.mod h1:yMTu38GSuyxaYzQMViqNmQ1s3cE84abZexQmTgenWk0= -github.com/ethereum/hive v0.0.0-20231031133732-dcd7ddb75960 h1:7H9z2o/KImWQ/1PACU3ewsSFNxT/lzwYRnwit2YFqMg= -github.com/ethereum/hive v0.0.0-20231031133732-dcd7ddb75960/go.mod h1:sV7LrFBlEii71kI9udVbUVj7SXIifZ2VzFjQ8S6rZns= +github.com/ethereum/hive v0.0.0-20240319152821-ae224371b4e5 h1:2Rc3v1mqWgUl8gSHFh7+FmVcyB1AI/9THxhEDjNK+PI= +github.com/ethereum/hive v0.0.0-20240319152821-ae224371b4e5/go.mod h1:MGwUXPGco6YS3brOf5WEILfUnnUL/XuX1224ab3D7XA= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= +github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-stack/stack v1.8.1 h1:ntEHSVwIt7PNXNpgPmVfMrNhLtgjlmnZha2kOpuRiDw= github.com/go-stack/stack v1.8.1/go.mod h1:dcoOX6HbPZSZptuspn9bctJ+N/CnF5gGygcUP3XYfe4= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= +github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= +github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= @@ -44,15 +49,21 @@ github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMyw github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= +github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= +github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/holiman/uint256 v1.2.3 h1:K8UWO1HUJpRMXBxbmaY1Y8IAMZC/RsKB+ArEnnK4l5o= github.com/holiman/uint256 v1.2.3/go.mod h1:SC8Ryt4n+UBbPbIBKaG9zbbDlp4jOru9xFZmPzLUTxw= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/lithammer/dedent v1.1.0 h1:VNzHMVCBNG1j0fh3OrsFRkVUwStdDArbgBWoPAffktY= +github.com/lithammer/dedent v1.1.0/go.mod h1:jrXYCQtgg0nJiN+StA2KgR7w6CiQNv9Fd/Z9BP0jIOc= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng= +github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= @@ -75,6 +86,7 @@ github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+ github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a h1:1ur3QoCqvE5fl+nylMaIr9PVV1w343YRDtsy+Rwu7XI= github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a/go.mod h1:RRCYJbIwD5jmqPI9XoAFR0OcDxqUctll6zUj/+B4S48= github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= @@ -103,10 +115,12 @@ golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= +golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= +golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -124,10 +138,11 @@ golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= -golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= +golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -135,6 +150,7 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= +golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= @@ -156,6 +172,7 @@ google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQ gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1 h1:iiHuQZCNgYPmFQxd3BBN/Nc5+dAwzZuq5y40s20oQw0= +gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/simulators/smoke/network/go.mod b/simulators/smoke/network/go.mod index 00fc5dca21..0b1d082338 100644 --- a/simulators/smoke/network/go.mod +++ b/simulators/smoke/network/go.mod @@ -1,8 +1,10 @@ module github.com/ethereum/hive/simulators/smoke/network -go 1.18 +go 1.21 -require github.com/ethereum/hive v0.0.0-20231031133732-dcd7ddb75960 +toolchain go1.22.1 + +require github.com/ethereum/hive v0.0.0-20240319152821-ae224371b4e5 require ( github.com/Microsoft/go-winio v0.6.1 // indirect @@ -12,9 +14,13 @@ require ( github.com/ethereum/go-ethereum v1.13.5-0.20231031113925-bc42e88415d3 // indirect github.com/go-ole/go-ole v1.2.6 // indirect github.com/go-stack/stack v1.8.1 // indirect + github.com/golang-jwt/jwt/v4 v4.5.0 // indirect github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect github.com/gorilla/websocket v1.5.0 // indirect github.com/holiman/uint256 v1.2.3 // indirect + github.com/lithammer/dedent v1.1.0 // indirect + github.com/mattn/go-colorable v0.1.13 // indirect + github.com/mattn/go-isatty v0.0.17 // indirect github.com/shirou/gopsutil v3.21.11+incompatible // indirect github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a // indirect github.com/tklauser/go-sysconf v0.3.12 // indirect @@ -23,6 +29,7 @@ require ( golang.org/x/crypto v0.14.0 // indirect golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect golang.org/x/mod v0.12.0 // indirect - golang.org/x/sys v0.13.0 // indirect + golang.org/x/sys v0.18.0 // indirect golang.org/x/tools v0.13.0 // indirect + gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1 // indirect ) diff --git a/simulators/smoke/network/go.sum b/simulators/smoke/network/go.sum index ad328b19d0..f1a59624ea 100644 --- a/simulators/smoke/network/go.sum +++ b/simulators/smoke/network/go.sum @@ -3,6 +3,7 @@ github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5 github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U= github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= +github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= @@ -12,21 +13,25 @@ github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs github.com/deckarep/golang-set/v2 v2.1.0 h1:g47V4Or+DUdzbs8FxCCmgb6VYd+ptPAngjM6dtGktsI= github.com/deckarep/golang-set/v2 v2.1.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0= +github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 h1:HbphB4TFFXpv7MNrT52FGrrgVXF1owhMVTHFZIlnvd4= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0/go.mod h1:DZGJHZMqrU4JJqFAWUS2UO1+lbSKsdiOoYi9Zzey7Fc= github.com/ethereum/go-ethereum v1.13.5-0.20231031113925-bc42e88415d3 h1:i4TE0DmzMYcr2IiCdlTGGk+7Q/EzXvBKbbG4uRxMjJ0= github.com/ethereum/go-ethereum v1.13.5-0.20231031113925-bc42e88415d3/go.mod h1:yMTu38GSuyxaYzQMViqNmQ1s3cE84abZexQmTgenWk0= -github.com/ethereum/hive v0.0.0-20231031133732-dcd7ddb75960 h1:7H9z2o/KImWQ/1PACU3ewsSFNxT/lzwYRnwit2YFqMg= -github.com/ethereum/hive v0.0.0-20231031133732-dcd7ddb75960/go.mod h1:sV7LrFBlEii71kI9udVbUVj7SXIifZ2VzFjQ8S6rZns= +github.com/ethereum/hive v0.0.0-20240319152821-ae224371b4e5 h1:2Rc3v1mqWgUl8gSHFh7+FmVcyB1AI/9THxhEDjNK+PI= +github.com/ethereum/hive v0.0.0-20240319152821-ae224371b4e5/go.mod h1:MGwUXPGco6YS3brOf5WEILfUnnUL/XuX1224ab3D7XA= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= +github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-stack/stack v1.8.1 h1:ntEHSVwIt7PNXNpgPmVfMrNhLtgjlmnZha2kOpuRiDw= github.com/go-stack/stack v1.8.1/go.mod h1:dcoOX6HbPZSZptuspn9bctJ+N/CnF5gGygcUP3XYfe4= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= +github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= +github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= @@ -44,15 +49,21 @@ github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMyw github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= +github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= +github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/holiman/uint256 v1.2.3 h1:K8UWO1HUJpRMXBxbmaY1Y8IAMZC/RsKB+ArEnnK4l5o= github.com/holiman/uint256 v1.2.3/go.mod h1:SC8Ryt4n+UBbPbIBKaG9zbbDlp4jOru9xFZmPzLUTxw= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/lithammer/dedent v1.1.0 h1:VNzHMVCBNG1j0fh3OrsFRkVUwStdDArbgBWoPAffktY= +github.com/lithammer/dedent v1.1.0/go.mod h1:jrXYCQtgg0nJiN+StA2KgR7w6CiQNv9Fd/Z9BP0jIOc= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng= +github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= @@ -75,6 +86,7 @@ github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+ github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a h1:1ur3QoCqvE5fl+nylMaIr9PVV1w343YRDtsy+Rwu7XI= github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a/go.mod h1:RRCYJbIwD5jmqPI9XoAFR0OcDxqUctll6zUj/+B4S48= github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= @@ -103,10 +115,12 @@ golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= +golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= +golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -124,10 +138,11 @@ golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= -golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= +golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -135,6 +150,7 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= +golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= @@ -156,6 +172,7 @@ google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQ gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1 h1:iiHuQZCNgYPmFQxd3BBN/Nc5+dAwzZuq5y40s20oQw0= +gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= From 3640b0ffc0dd96f753d1e231f1fd23b87636e20f Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Tue, 19 Mar 2024 16:37:12 +0100 Subject: [PATCH 235/387] simulators/eth2/withdrawals: upgrade hivesim --- simulators/eth2/withdrawals/go.mod | 42 +++++---- simulators/eth2/withdrawals/go.sum | 134 ++++++++++++++--------------- 2 files changed, 89 insertions(+), 87 deletions(-) diff --git a/simulators/eth2/withdrawals/go.mod b/simulators/eth2/withdrawals/go.mod index a1de3a64a8..c34cefad2f 100644 --- a/simulators/eth2/withdrawals/go.mod +++ b/simulators/eth2/withdrawals/go.mod @@ -1,10 +1,12 @@ module github.com/ethereum/hive/simulators/eth2/withdrawals -go 1.18 +go 1.21 + +toolchain go1.22.1 require ( - github.com/ethereum/go-ethereum v1.13.1 - github.com/ethereum/hive v0.0.0-20230313141339-8e3200bfc09e + github.com/ethereum/go-ethereum v1.13.5-0.20231031113925-bc42e88415d3 + github.com/ethereum/hive v0.0.0-20240319152821-ae224371b4e5 github.com/ethereum/hive/simulators/eth2/common v0.0.0-20230316220410-1364352c32a6 github.com/marioevz/eth-clients v0.0.0-20230925201418-d5fbddd99b76 github.com/marioevz/mock-builder v0.0.0-20230501225822-df434a88e375 @@ -29,8 +31,8 @@ require ( github.com/shirou/gopsutil v3.21.11+incompatible // indirect github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a // indirect github.com/tklauser/go-sysconf v0.3.12 // indirect - golang.org/x/sys v0.11.0 // indirect - golang.org/x/text v0.12.0 // indirect + golang.org/x/sys v0.18.0 // indirect + golang.org/x/text v0.13.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) @@ -39,18 +41,19 @@ require ( github.com/DataDog/zstd v1.5.2 // indirect github.com/Microsoft/go-winio v0.6.1 // indirect github.com/beorn7/perks v1.0.1 // indirect - github.com/bits-and-blooms/bitset v1.5.0 // indirect + github.com/bits-and-blooms/bitset v1.7.0 // indirect github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect github.com/cockroachdb/errors v1.9.1 // indirect github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect - github.com/cockroachdb/pebble v0.0.0-20230906160148-46873a6a7a06 // indirect + github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593 // indirect github.com/cockroachdb/redact v1.1.3 // indirect + github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect github.com/consensys/bavard v0.1.13 // indirect - github.com/consensys/gnark-crypto v0.10.0 // indirect - github.com/crate-crypto/go-kzg-4844 v0.3.0 // indirect + github.com/consensys/gnark-crypto v0.12.1 // indirect + github.com/crate-crypto/go-kzg-4844 v0.7.0 // indirect github.com/deckarep/golang-set/v2 v2.3.0 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 // indirect - github.com/ethereum/c-kzg-4844 v0.3.1 // indirect + github.com/ethereum/c-kzg-4844 v0.4.0 // indirect github.com/fjl/memsize v0.0.1 // indirect github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08 // indirect github.com/getsentry/sentry-go v0.20.0 // indirect @@ -59,8 +62,9 @@ require ( github.com/golang-jwt/jwt/v4 v4.5.0 // indirect github.com/golang/protobuf v1.5.3 // indirect github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect + github.com/google/go-cmp v0.6.0 // indirect github.com/google/uuid v1.3.0 // indirect - github.com/gorilla/mux v1.8.0 // indirect + github.com/gorilla/mux v1.8.1 // indirect github.com/gorilla/websocket v1.5.0 // indirect github.com/hashicorp/go-bexpr v0.1.11 // indirect github.com/herumi/bls-eth-go-binary v1.28.1 // indirect @@ -71,6 +75,9 @@ require ( github.com/klauspost/cpuid/v2 v2.2.4 // indirect github.com/kr/pretty v0.3.1 // indirect github.com/kr/text v0.2.0 // indirect + github.com/lithammer/dedent v1.1.0 // indirect + github.com/mattn/go-colorable v0.1.13 // indirect + github.com/mattn/go-isatty v0.0.17 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect github.com/mmcloughlin/addchain v0.4.0 // indirect github.com/prometheus/client_golang v1.14.0 // indirect @@ -81,7 +88,7 @@ require ( github.com/rauljordan/engine-proxy v0.0.0-20230316220057-4c80c36c4c3a // indirect github.com/rivo/uniseg v0.4.4 // indirect github.com/rogpeppe/go-internal v1.10.0 // indirect - github.com/sirupsen/logrus v1.9.0 // indirect + github.com/sirupsen/logrus v1.9.3 // indirect github.com/supranational/blst v0.3.11 // indirect github.com/tklauser/numcpus v0.6.1 // indirect github.com/tyler-smith/go-bip39 v1.1.0 // indirect @@ -89,12 +96,13 @@ require ( github.com/wealdtech/go-eth2-types/v2 v2.8.0 // indirect github.com/wealdtech/go-eth2-util v1.8.0 // indirect github.com/yusufpapurcu/wmi v1.2.2 // indirect - golang.org/x/crypto v0.12.0 // indirect - golang.org/x/exp v0.0.0-20230810033253-352e893a4cad // indirect - golang.org/x/mod v0.11.0 // indirect + golang.org/x/crypto v0.14.0 // indirect + golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect + golang.org/x/mod v0.12.0 // indirect golang.org/x/sync v0.3.0 // indirect - golang.org/x/tools v0.9.1 // indirect - google.golang.org/protobuf v1.30.0 // indirect + golang.org/x/tools v0.13.0 // indirect + google.golang.org/protobuf v1.33.0 // indirect + gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1 // indirect rsc.io/tmplfunc v0.0.3 // indirect ) diff --git a/simulators/eth2/withdrawals/go.sum b/simulators/eth2/withdrawals/go.sum index 04549da703..7d9d44295a 100644 --- a/simulators/eth2/withdrawals/go.sum +++ b/simulators/eth2/withdrawals/go.sum @@ -1,8 +1,5 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= -github.com/Azure/azure-sdk-for-go/sdk/azcore v0.21.1/go.mod h1:fBF9PQNqB8scdgpZ3ufzaLntG0AG7C1WjPMsiFOmfHM= -github.com/Azure/azure-sdk-for-go/sdk/internal v0.8.3/go.mod h1:KLF4gFr6DcKFZwSuH8w8yEK6DpFl3LP5rhdvAb7Yz5I= -github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v0.3.0/go.mod h1:tPaiy8S5bQ+S5sOiDlINkp7+Ef339+Nz5L5XO+cnOHo= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/CloudyKit/fastprinter v0.0.0-20200109182630-33d98a066a53/go.mod h1:+3IMCy2vIlbG1XG/0ggNQv0SvxCAIpPM5b1nCz56Xno= github.com/CloudyKit/jet/v3 v3.0.0/go.mod h1:HKQPgSJmdK8hdoAbKUUWajkHyHo4RaU5rMdUywE7VMo= @@ -17,71 +14,63 @@ github.com/VictoriaMetrics/fastcache v1.12.1/go.mod h1:tX04vaqcNoQeGLD+ra5pU5sWk github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY= github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= github.com/allegro/bigcache v1.2.1 h1:hg1sY1raCwic3Vnsvje6TT7/pnZba83LeFck5NrFKSc= +github.com/allegro/bigcache v1.2.1/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= -github.com/aws/aws-sdk-go-v2 v1.2.0/go.mod h1:zEQs02YRBw1DjK0PoJv3ygDYOFTre1ejlJWl8FwAuQo= -github.com/aws/aws-sdk-go-v2/config v1.1.1/go.mod h1:0XsVy9lBI/BCXm+2Tuvt39YmdHwS5unDQmxZOYe8F5Y= -github.com/aws/aws-sdk-go-v2/credentials v1.1.1/go.mod h1:mM2iIjwl7LULWtS6JCACyInboHirisUUdkBPoTHMOUo= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.0.2/go.mod h1:3hGg3PpiEjHnrkrlasTfxFqUsZ2GCk/fMUn4CbKgSkM= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.0.2/go.mod h1:45MfaXZ0cNbeuT0KQ1XJylq8A6+OpVV2E5kvY/Kq+u8= -github.com/aws/aws-sdk-go-v2/service/route53 v1.1.1/go.mod h1:rLiOUrPLW/Er5kRcQ7NkwbjlijluLsrIbu/iyl35RO4= -github.com/aws/aws-sdk-go-v2/service/sso v1.1.1/go.mod h1:SuZJxklHxLAXgLTc1iFXbEWkXs7QRTQpCLGaKIprQW0= -github.com/aws/aws-sdk-go-v2/service/sts v1.1.1/go.mod h1:Wi0EBZwiz/K44YliU0EKxqTCJGUfYTWXrrBwkq736bM= -github.com/aws/smithy-go v1.1.0/go.mod h1:EzMw8dbp/YJL4A5/sbhGddag+NPT7q084agLbB9LgIw= github.com/aymerick/raymond v2.0.3-0.20180322193309-b565731e1464+incompatible/go.mod h1:osfaiScAUVup+UC9Nfq76eWqDhXlp+4UYaA8uhTBO6g= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bits-and-blooms/bitset v1.5.0 h1:NpE8frKRLGHIcEzkR+gZhiioW1+WbYV6fKwD6ZIpQT8= -github.com/bits-and-blooms/bitset v1.5.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= +github.com/bits-and-blooms/bitset v1.7.0 h1:YjAGVd3XmtK9ktAbX8Zg2g2PwLIMjGREZJHlV4j7NEo= +github.com/bits-and-blooms/bitset v1.7.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U= github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= +github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/cespare/cp v0.1.0/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s= github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cloudflare/cloudflare-go v0.14.0/go.mod h1:EnwdgGMaFOruiPZRFSgn+TsQ3hQ7C/YWzIGLeu5c304= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cockroachdb/datadriven v1.0.2/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= -github.com/cockroachdb/datadriven v1.0.3-0.20230801171734-e384cf455877 h1:1MLK4YpFtIEo3ZtMA5C795Wtv5VuUnrXX7mQG+aHg6o= +github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f h1:otljaYPt5hWxV3MUfO5dFPFiOXg9CyG5/kCfayTqsJ4= +github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= github.com/cockroachdb/errors v1.9.1 h1:yFVvsI0VxmRShfawbt/laCIDy/mtTqqnvoNgiy5bEV8= github.com/cockroachdb/errors v1.9.1/go.mod h1:2sxOtL2WIc096WSZqZ5h8fa17rdDq9HZOZLBCor4mBk= github.com/cockroachdb/logtags v0.0.0-20211118104740-dabe8e521a4f/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= -github.com/cockroachdb/pebble v0.0.0-20230906160148-46873a6a7a06 h1:T+Np/xtzIjYM/P5NAw0e2Rf1FGvzDau1h54MKvx8G7w= -github.com/cockroachdb/pebble v0.0.0-20230906160148-46873a6a7a06/go.mod h1:bynZ3gvVyhlvjLI7PT6dmZ7g76xzJ7HpxfjgkzCGz6s= +github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593 h1:aPEJyR4rPBvDmeyi+l/FS/VtA00IWvjeFvjen1m1l1A= +github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593/go.mod h1:6hk1eMY/u5t+Cf18q5lFMUA1Rc+Sm5I6Ra1QuPyxXCo= github.com/cockroachdb/redact v1.1.3 h1:AKZds10rFSIj7qADf0g46UixK8NNLwWTNdCIGS5wfSQ= github.com/cockroachdb/redact v1.1.3/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= -github.com/cockroachdb/sentry-go v0.6.1-cockroachdb.2/go.mod h1:8BT+cPK6xvFOcRlk0R8eg+OTkcqI6baNH4xAkpiYVvQ= +github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo= +github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ= github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0/go.mod h1:4Zcjuz89kmFXt9morQgcfYZAYZ5n8WHjt81YYWIwtTM= github.com/consensys/bavard v0.1.13 h1:oLhMLOFGTLdlda/kma4VOJazblc7IM5y5QPd2A/YjhQ= github.com/consensys/bavard v0.1.13/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI= -github.com/consensys/gnark-crypto v0.10.0 h1:zRh22SR7o4K35SoNqouS9J/TKHTyU2QWaj5ldehyXtA= -github.com/consensys/gnark-crypto v0.10.0/go.mod h1:Iq/P3HHl0ElSjsg2E1gsMwhAyxnxoKK5nVyZKd+/KhU= +github.com/consensys/gnark-crypto v0.12.1 h1:lHH39WuuFgVHONRl3J0LRBtuYdQTumFSDtJF7HpyG8M= +github.com/consensys/gnark-crypto v0.12.1/go.mod h1:v2Gy7L/4ZRosZ7Ivs+9SfUDr0f5UlG+EM5t7MPHiLuY= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/cpuguy83/go-md2man v1.0.10 h1:BSKMNlYxDvnunlTymqtgONjNnaRV1sTpcovwwjF22jk= github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= -github.com/crate-crypto/go-kzg-4844 v0.3.0 h1:UBlWE0CgyFqqzTI+IFyCzA7A3Zw4iip6uzRv5NIXG0A= -github.com/crate-crypto/go-kzg-4844 v0.3.0/go.mod h1:SBP7ikXEgDnUPONgm33HtuDZEDtWa3L4QtN1ocJSEQ4= +github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/crate-crypto/go-kzg-4844 v0.7.0 h1:C0vgZRk4q4EZ/JgPfzuSoxdCq3C3mOZMBShovmncxvA= +github.com/crate-crypto/go-kzg-4844 v0.7.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/deckarep/golang-set v1.8.0/go.mod h1:5nI87KwE7wgsBU1F4GKAw2Qod7p5kyS383rP6+o6qqo= github.com/deckarep/golang-set/v2 v2.3.0 h1:qs18EKUfHm2X9fA50Mr/M5hccg2tNnVqsiBImnyDs0g= github.com/deckarep/golang-set/v2 v2.3.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0= github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 h1:HbphB4TFFXpv7MNrT52FGrrgVXF1owhMVTHFZIlnvd4= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0/go.mod h1:DZGJHZMqrU4JJqFAWUS2UO1+lbSKsdiOoYi9Zzey7Fc= -github.com/deepmap/oapi-codegen v1.6.0/go.mod h1:ryDa9AgbELGeB+YEXE1dR53yAjHwFvE9iAUlWl9Al3M= github.com/dgraph-io/badger v1.6.0/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6psNgSztDR4= github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= @@ -91,16 +80,15 @@ github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.m github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/etcd-io/bbolt v1.3.3/go.mod h1:ZF2nL25h33cCyBtcyWeZ2/I3HQOfTP+0PIEvHjkjCrw= -github.com/ethereum/c-kzg-4844 v0.3.1 h1:sR65+68+WdnMKxseNWxSJuAv2tsUrihTpVBTfM/U5Zg= -github.com/ethereum/c-kzg-4844 v0.3.1/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= -github.com/ethereum/go-ethereum v1.13.1 h1:UF2FaUKPIy5jeZk3X06ait3y2Q4wI+vJ1l7+UARp+60= -github.com/ethereum/go-ethereum v1.13.1/go.mod h1:xHQKzwkHSl0gnSjZK1mWa06XEdm9685AHqhRknOzqGQ= -github.com/ethereum/hive v0.0.0-20230313141339-8e3200bfc09e h1:3g9cqRqpbZ92tSlGL4PfFoq435axKw6HiZ1Gz3fOkfk= -github.com/ethereum/hive v0.0.0-20230313141339-8e3200bfc09e/go.mod h1:PlpDuxHg6q1jU0K8Ouf+RXlHguignJ7k8Eyukc9RCPQ= +github.com/ethereum/c-kzg-4844 v0.4.0 h1:3MS1s4JtA868KpJxroZoepdV0ZKBp3u/O5HcZ7R3nlY= +github.com/ethereum/c-kzg-4844 v0.4.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= +github.com/ethereum/go-ethereum v1.13.5-0.20231031113925-bc42e88415d3 h1:i4TE0DmzMYcr2IiCdlTGGk+7Q/EzXvBKbbG4uRxMjJ0= +github.com/ethereum/go-ethereum v1.13.5-0.20231031113925-bc42e88415d3/go.mod h1:yMTu38GSuyxaYzQMViqNmQ1s3cE84abZexQmTgenWk0= +github.com/ethereum/hive v0.0.0-20240319152821-ae224371b4e5 h1:2Rc3v1mqWgUl8gSHFh7+FmVcyB1AI/9THxhEDjNK+PI= +github.com/ethereum/hive v0.0.0-20240319152821-ae224371b4e5/go.mod h1:MGwUXPGco6YS3brOf5WEILfUnnUL/XuX1224ab3D7XA= github.com/ethereum/hive/simulators/eth2/common v0.0.0-20230316220410-1364352c32a6 h1:LcSUNGwQuJyR/gdPcsif57yKX+3MyhpoAuChzR8k6Yk= github.com/ethereum/hive/simulators/eth2/common v0.0.0-20230316220410-1364352c32a6/go.mod h1:FX4oxNyTNw/P+TUWrb7vva7o/rFI0pHO7OYdtG6EtN4= github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072/go.mod h1:duJ4Jxv5lDcvg4QuQr0oowTf7dz4/CR8NtyCooz9HL8= -github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= github.com/ferranbt/fastssz v0.1.2 h1:Dky6dXlngF6Qjc+EfDipAkE83N5I5DE68bY6O0VLNPk= github.com/ferranbt/fastssz v0.1.2/go.mod h1:X5UPrE2u1UJjxHA8X54u04SBwdAQjG2sFtWs39YxyWs= @@ -110,6 +98,7 @@ github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMo github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= +github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= github.com/gavv/httpexpect v2.0.0+incompatible/go.mod h1:x+9tiU1YnrOvnB725RkpoLv1M62hOWzwo5OXotisrKc= github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08 h1:f6D9Hr8xV8uYKlyuj8XIruxlh9WjVjdh1gIicAS7ays= github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= @@ -121,11 +110,10 @@ github.com/gin-gonic/gin v1.4.0/go.mod h1:OW2EZn3DO8Ln9oIKOvM++LBO+5UPHJJDH72/q/ github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= -github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= +github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab/go.mod h1:/P9AEU963A2AYjv4d1V5eVL1CQbEJq6aCNHDDjibzu8= github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= -github.com/go-sourcemap/sourcemap v2.1.3+incompatible/go.mod h1:F8jJfvm2KbVjc5NqelyYJmf/v5J0dwNLS2mL4sNA1Jg= github.com/go-stack/stack v1.8.1 h1:ntEHSVwIt7PNXNpgPmVfMrNhLtgjlmnZha2kOpuRiDw= github.com/go-stack/stack v1.8.1/go.mod h1:dcoOX6HbPZSZptuspn9bctJ+N/CnF5gGygcUP3XYfe4= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= @@ -171,22 +159,21 @@ github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMyw github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/gofuzz v1.1.1-0.20200604201612-c04b05f3adfa/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= -github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= +github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= +github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/graph-gophers/graphql-go v1.3.0/go.mod h1:9CQHMSxwO4MprSdzoIEobiHpoLtHm77vfxsvsIN5Vuc= github.com/hashicorp/go-bexpr v0.1.11 h1:6DqdA/KBjurGby9yTY0bmkathya0lfwF2SeuubCI7dY= github.com/hashicorp/go-bexpr v0.1.11/go.mod h1:f03lAo0duBlDIUMGCuad8oLcgejw4m7U+N8T+6Kz1AE= github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= @@ -194,6 +181,7 @@ github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T github.com/herumi/bls-eth-go-binary v1.28.1 h1:fcIZ48y5EE9973k05XjE8+P3YiQgjZz4JI/YabAm8KA= github.com/herumi/bls-eth-go-binary v1.28.1/go.mod h1:luAnRm3OsMQeokhGzpYmc0ZKwawY7o87PUEP11Z7r7U= github.com/holiman/billy v0.0.0-20230718173358-1c7e68d277a7 h1:3JQNjnMRil1yD0IfZKHF9GxxWKDJGj8I0IqOUol//sw= +github.com/holiman/billy v0.0.0-20230718173358-1c7e68d277a7/go.mod h1:5GuXa7vkL8u9FkFuWdVvfR5ix8hRB7DbOAaYULamFpc= github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao= github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA= github.com/holiman/uint256 v1.2.0/go.mod h1:y4ga/t+u+Xwd7CpDgZESaRcWy0I7XMlTMA25ApIH5Jw= @@ -201,12 +189,11 @@ github.com/holiman/uint256 v1.2.3 h1:K8UWO1HUJpRMXBxbmaY1Y8IAMZC/RsKB+ArEnnK4l5o github.com/holiman/uint256 v1.2.3/go.mod h1:SC8Ryt4n+UBbPbIBKaG9zbbDlp4jOru9xFZmPzLUTxw= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/huin/goupnp v1.3.0 h1:UvLUlWDNpoUdYzb2TCn+MuTWtcjXKSza2n6CBdQ0xXc= +github.com/huin/goupnp v1.3.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8= github.com/hydrogen18/memlistener v0.0.0-20200120041712-dcc25e7acd91/go.mod h1:qEIFzExnS6016fRpRfxrExeVn2gbClQA99gQhnIcdhE= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/imkira/go-interpol v1.1.0/go.mod h1:z0h2/2T3XF8kyEPpRgJ3kmNv+C43p+I/CoI+jC3w2iA= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/influxdata/influxdb-client-go/v2 v2.4.0/go.mod h1:vLNHdxTJkIf2mSLvGrpj8TCcISApPoXkaxP8g9uRlW8= -github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo= github.com/iris-contrib/blackfriday v2.0.0+incompatible/go.mod h1:UzZ2bDEoaSGPbkg6SAB4att1aAwTmVIx/5gCVqeyUdI= github.com/iris-contrib/go.uuid v2.0.0+incompatible/go.mod h1:iz2lgM/1UnEf1kP0L/+fafWORmlnuysV2EMP8MW+qe0= github.com/iris-contrib/jade v1.1.3/go.mod h1:H/geBymxJhShH5kecoiOCSssPX7QWYH7UaeZTSWddIk= @@ -214,10 +201,8 @@ github.com/iris-contrib/pongo2 v0.0.1/go.mod h1:Ssh+00+3GAZqSQb30AvBRNxBx7rf0Gqw github.com/iris-contrib/schema v0.0.1/go.mod h1:urYA3uvUNG1TIIjOSCzHr9/LmbQo8LrOcOqfqxa4hXw= github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= -github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.3.0 h1:U0609e9tgbseu3rBINet9P48AI/D3oJs4dN7jwJOQ1U= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= @@ -253,9 +238,9 @@ github.com/labstack/echo/v4 v4.5.0/go.mod h1:czIriw4a0C1dFun+ObrXp7ok03xON0N1awS github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c= github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= +github.com/lithammer/dedent v1.1.0 h1:VNzHMVCBNG1j0fh3OrsFRkVUwStdDArbgBWoPAffktY= +github.com/lithammer/dedent v1.1.0/go.mod h1:jrXYCQtgg0nJiN+StA2KgR7w6CiQNv9Fd/Z9BP0jIOc= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/marioevz/eth-clients v0.0.0-20230925172743-e379ee1ecd6e h1:uBr6Gn5jBHnyoS34HV4GOiYjuua6J/F2FST0T6MO89E= -github.com/marioevz/eth-clients v0.0.0-20230925172743-e379ee1ecd6e/go.mod h1:YVrdn57Q3rAzm3wus4T9tg1vMPca4csVbzorPhkGCW0= github.com/marioevz/eth-clients v0.0.0-20230925201418-d5fbddd99b76 h1:fj+aeR3YLmSRUWjOGgTxNMdvzm72J5JbKGKosNO/jkE= github.com/marioevz/eth-clients v0.0.0-20230925201418-d5fbddd99b76/go.mod h1:YVrdn57Q3rAzm3wus4T9tg1vMPca4csVbzorPhkGCW0= github.com/marioevz/eth2api v0.0.0-20230922201437-72bd1301e033 h1:sn57n+lbJrLS8FKYs08W7TEzraTGOCQGrSC4hni6rYw= @@ -266,12 +251,15 @@ github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVc github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.11/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng= +github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.14 h1:+xnbZSEeDbOIg5/mE6JF0w6n9duR1l3/WmbinWVwUuU= github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= @@ -297,11 +285,7 @@ github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/moul/http2curl v1.0.0/go.mod h1:8UbvGypXm98wA/IqH45anm5Y2Z6ep6O31QGOAZ3H0fQ= -github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/naoina/go-stringutil v0.1.0/go.mod h1:XJ2SJL9jCtBh+P9q5btrd/Ylo8XwT/h1USek5+NqSA0= -github.com/naoina/toml v0.1.2-0.20170918210437-9fafd6967416/go.mod h1:NBIhNtsFMo3G2szEBne+bO4gS192HuIYRqfvOWb4i1E= github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= @@ -323,9 +307,7 @@ github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1y github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= github.com/onsi/gomega v1.19.0 h1:4ieX6qQjPP/BfC3mpsAtIGGlxTWPeA3Inl/7DtXw1tw= github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= -github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/peterh/liner v1.1.1-0.20190123174540-a2c9a5303de7/go.mod h1:CRroGNssyjTd/qIG2FyxByd2S8JEAZXBl4qUrZf8GS0= github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= @@ -354,6 +336,7 @@ github.com/protolambda/zrnt v0.30.0/go.mod h1:qcdX9CXFeVNCQK/q0nswpzhd+31RHMk2Ax github.com/protolambda/ztyp v0.2.2 h1:rVcL3vBu9W/aV646zF6caLS/dyn9BN8NYiuJzicLNyY= github.com/protolambda/ztyp v0.2.2/go.mod h1:9bYgKGqg3wJqT9ac1gI2hnVb0STQq7p/1lapqrqY1dU= github.com/prysmaticlabs/gohashtree v0.0.1-alpha.0.20220714111606-acbb2962fb48 h1:cSo6/vk8YpvkLbk9v3FO97cakNmUoxwi2KMP8hd5WIw= +github.com/prysmaticlabs/gohashtree v0.0.1-alpha.0.20220714111606-acbb2962fb48/go.mod h1:4pWaT30XoEx1j8KNJf3TV+E3mQkaufn7mf+jRNb/Fuk= github.com/rauljordan/engine-proxy v0.0.0-20230316220057-4c80c36c4c3a h1:ZIfMLprHVdo2vs3WcSqSDEyz2ZsSzDhGeOyxh8VQThA= github.com/rauljordan/engine-proxy v0.0.0-20230316220057-4c80c36c4c3a/go.mod h1:9OVXfWYnIV+wj1/SqfdREmE5mzN/OANAgdOJRtFtvpo= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= @@ -365,17 +348,19 @@ github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/f github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= github.com/rs/cors v1.8.3 h1:O+qNyWn7Z+F9M0ILBHgMVPuB1xTOucVd5gtaYyXBpRo= +github.com/rs/cors v1.8.3/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/russross/blackfriday v1.5.2 h1:HyvC0ARfnZBqnXwABFeSZHpKvJHJJfPz81GNueLj0oo= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/schollz/closestmatch v2.1.0+incompatible/go.mod h1:RtP1ddjLong6gTkbtmuhtR2uUrrJOpYzYRvbcPAid+g= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI= github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0= -github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= +github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= @@ -385,6 +370,7 @@ github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb6 github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= github.com/status-im/keycard-go v0.2.0 h1:QDLFswOQu1r5jsycloeQh3bVU8n/NatHHaZobtDnDzA= +github.com/status-im/keycard-go v0.2.0/go.mod h1:wlp8ZLbsmrF6g6WjugPAx+IzoLrkdf9+mHxBEeo3Hbg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= @@ -392,7 +378,8 @@ github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81P github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= -github.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/supranational/blst v0.3.11 h1:LyU6FolezeWAhvQk0k6O/d49jqgO52MSDDfYgbeoEm4= github.com/supranational/blst v0.3.11/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a h1:1ur3QoCqvE5fl+nylMaIr9PVV1w343YRDtsy+Rwu7XI= @@ -408,6 +395,7 @@ github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVM github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= github.com/urfave/cli/v2 v2.25.7 h1:VAzn5oq403l5pHjc4OhD54+XGO9cdKVL/7lDjF+iKUs= +github.com/urfave/cli/v2 v2.25.7/go.mod h1:8qnjx1vcq5s2/wpsqoZFndg2CE5tNFyrTvS6SinrnYQ= github.com/urfave/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/valyala/fasthttp v1.6.0/go.mod h1:FstJa9V+Pj9vQ7OJie2qMHdwemEDaDiSdBnvPM1Su9w= @@ -425,6 +413,7 @@ github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1: github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU= +github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8= github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0/go.mod h1:/LWChgwKmvncFJFHJ7Gvn9wZArjbV5/FppcK2fKk/tI= github.com/yudai/gojsondiff v1.0.0/go.mod h1:AY32+k2cwILAkW1fbgxQ5mUmMiZFgLIV+FBNExI05xg= github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82/go.mod h1:lgjkn3NuSvDfVJdfcVVdX+jpBxNmX4rDAzaS45IcYoM= @@ -443,11 +432,11 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.12.0 h1:tFM/ta59kqch6LlvYnPa0yx5a83cL2nHflFhYKvv9Yk= -golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= +golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= +golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20230810033253-352e893a4cad h1:g0bG7Z4uG+OgH2QDODnjp6ggkk1bJDsINcuWmJN1iJU= -golang.org/x/exp v0.0.0-20230810033253-352e893a4cad/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc= +golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g= +golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= @@ -456,8 +445,8 @@ golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzB golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.11.0 h1:bUO06HqtnRcc/7l71XBe4WcqTZ+3AH1J59zWDDwLKgU= -golang.org/x/mod v0.11.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc= +golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -479,7 +468,8 @@ golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT golang.org/x/net v0.0.0-20211008194852-3b03d305991f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M= +golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= +golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -525,10 +515,12 @@ golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= +golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -537,10 +529,11 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc= -golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= +golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= +golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181221001348-537d06c36207/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -555,8 +548,8 @@ golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roY golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.9.1 h1:8WMNJAz3zrtPmnYC7ISf5dEn3MT0gY7jBJfw27yrrLo= -golang.org/x/tools v0.9.1/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc= +golang.org/x/tools v0.13.0 h1:Iey4qkscZuv0VvIt8E0neZjtPVQFSc870HQ448QgEmQ= +golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -586,8 +579,8 @@ google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpAD google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng= -google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= +google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -598,10 +591,11 @@ gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMy gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= gopkg.in/go-playground/validator.v8 v8.18.2/go.mod h1:RX2a/7Ha8BgOhfk7j780h4/u/RRjR0eouCJSH80/M2Y= gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1 h1:iiHuQZCNgYPmFQxd3BBN/Nc5+dAwzZuq5y40s20oQw0= +gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= gopkg.in/ini.v1 v1.51.1/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8= -gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:5AcXVHNjg+BDxry382+8OKon8SEWiKktQR07RKPsv1c= +gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= From d185079dcfbbe5fc3b12a5b7c6fbb77ab531fc15 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Tue, 19 Mar 2024 16:37:36 +0100 Subject: [PATCH 236/387] simulators/eth2/common: upgrade hivesim --- simulators/eth2/common/go.mod | 16 +- simulators/eth2/common/go.sum | 278 +++++++++++++++++++++++++++++++--- 2 files changed, 266 insertions(+), 28 deletions(-) diff --git a/simulators/eth2/common/go.mod b/simulators/eth2/common/go.mod index a4118cfd68..b7f8571d19 100644 --- a/simulators/eth2/common/go.mod +++ b/simulators/eth2/common/go.mod @@ -6,7 +6,7 @@ toolchain go1.22.0 require ( github.com/ethereum/go-ethereum v1.13.14 - github.com/ethereum/hive v0.0.0-20231031133732-dcd7ddb75960 + github.com/ethereum/hive v0.0.0-20240319152821-ae224371b4e5 github.com/ethereum/hive/simulators/ethereum/engine v0.0.0-20240305231022-f69df863de20 github.com/google/uuid v1.6.0 github.com/herumi/bls-eth-go-binary v1.29.1 @@ -64,10 +64,11 @@ require ( github.com/gofrs/flock v0.8.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang-jwt/jwt/v4 v4.5.0 // indirect + github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect github.com/google/gopacket v1.1.19 // indirect github.com/google/pprof v0.0.0-20240207164012-fb44976bdcd5 // indirect - github.com/gorilla/mux v1.8.0 // indirect + github.com/gorilla/mux v1.8.1 // indirect github.com/gorilla/websocket v1.5.1 // indirect github.com/hashicorp/golang-lru/v2 v2.0.5 // indirect github.com/holiman/bloomfilter/v2 v2.0.3 // indirect @@ -96,6 +97,7 @@ require ( github.com/libp2p/go-reuseport v0.4.0 // indirect github.com/libp2p/go-yamux/v4 v4.0.1 // indirect github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd // indirect + github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.20 // indirect github.com/mattn/go-runewidth v0.0.14 // indirect github.com/miekg/dns v1.1.58 // indirect @@ -153,11 +155,17 @@ require ( golang.org/x/mod v0.15.0 // indirect golang.org/x/net v0.21.0 // indirect golang.org/x/sync v0.6.0 // indirect - golang.org/x/sys v0.17.0 // indirect + golang.org/x/sys v0.18.0 // indirect + golang.org/x/term v0.18.0 // indirect golang.org/x/text v0.14.0 // indirect golang.org/x/tools v0.18.0 // indirect - google.golang.org/protobuf v1.32.0 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20230711160842-782d3b101e98 // indirect + google.golang.org/grpc v1.58.3 // indirect + google.golang.org/protobuf v1.33.0 // indirect + gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect + k8s.io/client-go v0.22.5 // indirect + k8s.io/utils v0.0.0-20210930125809-cb0fa318a74b // indirect lukechampine.com/blake3 v1.2.1 // indirect rsc.io/tmplfunc v0.0.3 // indirect ) diff --git a/simulators/eth2/common/go.sum b/simulators/eth2/common/go.sum index efe35ac17b..232c82f0d4 100644 --- a/simulators/eth2/common/go.sum +++ b/simulators/eth2/common/go.sum @@ -2,17 +2,46 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMT cloud.google.com/go v0.31.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.37.0/go.mod h1:TS1dMSSfndXH133OKGwekG838Om/cQT0BUHV3HcBgoo= +cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= +cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= +cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= +cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= +cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= +cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= +cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= +cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= +cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= +cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= +cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= +cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= +cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= +cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= +cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= +cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= +cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= +cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= +cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= contrib.go.opencensus.io/exporter/jaeger v0.2.1 h1:yGBYzYMewVL0yO9qqJv3Z5+IRhPdU7e9o/2oKpX4YvI= contrib.go.opencensus.io/exporter/jaeger v0.2.1/go.mod h1:Y8IsLgdxqh1QxYxPC5IgXVmBaeLUeQFfBeBi9PbeZd0= dmitri.shuralyov.com/app/changes v0.0.0-20180602232624-0a106ad413e3/go.mod h1:Yl+fi1br7+Rr3LqpNJf1/uxUdtRUV+Tnj0o93V2B9MU= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= dmitri.shuralyov.com/html/belt v0.0.0-20180602232347-f7d459c86be0/go.mod h1:JLBrvjyP0v+ecvNYvCpyZgu5/xkfAUhi6wJj28eUfSU= dmitri.shuralyov.com/service/change v0.0.0-20181023043359-a85b471d5412/go.mod h1:a1inKt/atXimZ4Mv927x+r7UpyzRUf4emIoiiSC2TN4= dmitri.shuralyov.com/state v0.0.0-20180228185332-28bcc343414c/go.mod h1:0PRwlb0D6DFvNNtx+9ybjezNCa8XF0xaYcETyp6rHWU= git.apache.org/thrift.git v0.0.0-20180902110319-2566ecd5d999/go.mod h1:fPE2ZNJGynbRyZ4dJvy6G277gSllfV2HJqblrnkyeyg= github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= +github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= +github.com/Azure/go-autorest/autorest v0.11.18/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= +github.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= +github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= +github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= +github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= +github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/toml v1.3.2 h1:o7IhLm0Msx3BaB+n3Ag7L8EVlByGnpq14C4YWiu/gL8= github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/CloudyKit/fastprinter v0.0.0-20200109182630-33d98a066a53/go.mod h1:+3IMCy2vIlbG1XG/0ggNQv0SvxCAIpPM5b1nCz56Xno= github.com/CloudyKit/jet/v3 v3.0.0/go.mod h1:HKQPgSJmdK8hdoAbKUUWajkHyHo4RaU5rMdUywE7VMo= github.com/DataDog/zstd v1.5.2 h1:vUG4lAyuPCXO0TLbXvPv7EB7cNK1QV/luu55UHLrrn8= @@ -20,6 +49,9 @@ github.com/DataDog/zstd v1.5.2/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwS github.com/Joker/hpp v1.0.0/go.mod h1:8x5n+M1Hp5hC0g8okX3sR3vFQwynaX/UgSOM9MeBKzY= github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= +github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= +github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= +github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= github.com/Shopify/goreferrer v0.0.0-20181106222321-ec9c9a553398/go.mod h1:a1uqRtAwp2Xwc6WNPJEufxJ7fx3npB4UV/JOLmbu5I0= github.com/VictoriaMetrics/fastcache v1.12.1 h1:i0mICQuojGDL3KblA7wUNlY5lOK6a4bwt3uRKnkZU40= github.com/VictoriaMetrics/fastcache v1.12.1/go.mod h1:tX04vaqcNoQeGLD+ra5pU5sWkuxnzWhEzLwhP9w653o= @@ -29,6 +61,7 @@ github.com/allegro/bigcache v1.2.1 h1:hg1sY1raCwic3Vnsvje6TT7/pnZba83LeFck5NrFKS github.com/allegro/bigcache v1.2.1/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= +github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= github.com/aymerick/raymond v2.0.3-0.20180322193309-b565731e1464+incompatible/go.mod h1:osfaiScAUVup+UC9Nfq76eWqDhXlp+4UYaA8uhTBO6g= github.com/bazelbuild/rules_go v0.23.2 h1:Wxu7JjqnF78cKZbsBsARLSXx/jlGaSLCnUV3mTlyHvM= github.com/bazelbuild/rules_go v0.23.2/go.mod h1:MC23Dc/wkXEyk3Wpq6lCqz0ZAYOZDw2DR5y3N1q2i7M= @@ -112,11 +145,14 @@ github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUn github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385/go.mod h1:0vRUJqYpeSZifjYj7uP3BG/gKcuzL9xWVV/Y+cK33KM= github.com/elastic/gosigar v0.12.0/go.mod h1:iXRIGg2tLnu7LBdpqzyQfGDEidKCfWcCMS0WKyPWoMs= github.com/elastic/gosigar v0.14.2 h1:Dg80n8cr90OZ7x+bAax/QjoW/XqTI11RmA79ZwIm9/4= github.com/elastic/gosigar v0.14.2/go.mod h1:iXRIGg2tLnu7LBdpqzyQfGDEidKCfWcCMS0WKyPWoMs= +github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= +github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= @@ -124,10 +160,11 @@ github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7 github.com/etcd-io/bbolt v1.3.3/go.mod h1:ZF2nL25h33cCyBtcyWeZ2/I3HQOfTP+0PIEvHjkjCrw= github.com/ethereum/c-kzg-4844 v0.4.0 h1:3MS1s4JtA868KpJxroZoepdV0ZKBp3u/O5HcZ7R3nlY= github.com/ethereum/c-kzg-4844 v0.4.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= -github.com/ethereum/hive v0.0.0-20231031133732-dcd7ddb75960 h1:7H9z2o/KImWQ/1PACU3ewsSFNxT/lzwYRnwit2YFqMg= -github.com/ethereum/hive v0.0.0-20231031133732-dcd7ddb75960/go.mod h1:sV7LrFBlEii71kI9udVbUVj7SXIifZ2VzFjQ8S6rZns= +github.com/ethereum/hive v0.0.0-20240319152821-ae224371b4e5 h1:2Rc3v1mqWgUl8gSHFh7+FmVcyB1AI/9THxhEDjNK+PI= +github.com/ethereum/hive v0.0.0-20240319152821-ae224371b4e5/go.mod h1:MGwUXPGco6YS3brOf5WEILfUnnUL/XuX1224ab3D7XA= github.com/ethereum/hive/simulators/ethereum/engine v0.0.0-20240305231022-f69df863de20 h1:Bf9mev5lvesQIIpJtzO+vnGQ3Jv3NuLa2buY2+2pQzg= github.com/ethereum/hive/simulators/ethereum/engine v0.0.0-20240305231022-f69df863de20/go.mod h1:nag0wj4K1/0AEP1VAKwY08N4I9yymrwXsX4+n0YFfdw= +github.com/evanphx/json-patch v4.11.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072/go.mod h1:duJ4Jxv5lDcvg4QuQr0oowTf7dz4/CR8NtyCooz9HL8= github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= github.com/ferranbt/fastssz v0.1.3 h1:ZI+z3JH05h4kgmFXdHuR1aWYsgrg7o+Fw7/NCzM16Mo= @@ -137,6 +174,8 @@ github.com/fjl/memsize v0.0.1/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7 github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= github.com/flynn/noise v1.1.0 h1:KjPQoQCEFdZDiP03phOvGi11+SVVhBG2wOWAorLsstg= github.com/flynn/noise v1.1.0/go.mod h1:xbMo+0i6+IGbYdJhF31t2eR1BIU0CYc12+BNAKwUTag= +github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= +github.com/form3tech-oss/jwt-go v3.2.3+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= github.com/francoispqt/gojay v1.2.13 h1:d2m3sFjloqoIUQU3TsHBgj6qg/BVGlTBeHDUmyJnXKk= github.com/francoispqt/gojay v1.2.13/go.mod h1:ehT5mTG4ua4581f1++1WLG0vPdaA9HaiDsoyrBGkyDY= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= @@ -158,11 +197,19 @@ github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclK github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= +github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= +github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= github.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY= github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab/go.mod h1:/P9AEU963A2AYjv4d1V5eVL1CQbEJq6aCNHDDjibzu8= github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= +github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= +github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-stack/stack v1.8.1 h1:ntEHSVwIt7PNXNpgPmVfMrNhLtgjlmnZha2kOpuRiDw= github.com/go-stack/stack v1.8.1/go.mod h1:dcoOX6HbPZSZptuspn9bctJ+N/CnF5gGygcUP3XYfe4= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= @@ -189,14 +236,22 @@ github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzq github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e h1:1r7pUrabqp18hOBcwBwiTsbnFeTZHV9eER/QT5JVZxY= +github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:tluoj9z5200jBnyusfRPU2LqT6J+DAorxEvtC7LHB+E= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= +github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= @@ -213,6 +268,8 @@ github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXi github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/gomodule/redigo v1.7.1-0.20190724094224-574c33c3df38/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= @@ -225,25 +282,37 @@ github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeN github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ= github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gopacket v1.1.19 h1:ves8RnFZPGiFnTS0uPQStjwru6uO6h+nlr9j6fL7kF8= github.com/google/gopacket v1.1.19/go.mod h1:iJ8V8n6KS+z2U1A8pUwu8bW5SyEMkXJB8Yo/Vo+TKTo= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20240207164012-fb44976bdcd5 h1:E/LAvt58di64hlYjx7AsNS6C/ysHWYo+2qPCZKTQhRo= github.com/google/pprof v0.0.0-20240207164012-fb44976bdcd5/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= +github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go v2.0.0+incompatible/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY= github.com/googleapis/gax-go/v2 v2.0.3/go.mod h1:LLvjysVCY1JZeum8Z6l8qUty8fiNwE08qbEPm1M08qg= +github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= +github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= +github.com/googleapis/gnostic v0.5.1/go.mod h1:6U4PtQXGIEt/Z3h5MAT7FNofLnw9vXk2cUuW7uA/OeU= +github.com/googleapis/gnostic v0.5.5/go.mod h1:7+EbHbldMins07ALC74bsA81Ovc97DwqyJO1AENw9kA= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= -github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= +github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= +github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.5.1 h1:gmztn0JnHVt9JZquRuzLw3g4wouNVzKL15iLr/zn/QY= github.com/gorilla/websocket v1.5.1/go.mod h1:x3kM2JMyaluk02fnUJpQuwD2dCS5NDG2ZHL0uE0tcaY= github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= @@ -254,6 +323,8 @@ github.com/grpc-ecosystem/grpc-gateway/v2 v2.0.1/go.mod h1:oVMjMN64nzEcepv1kdZKg github.com/hashicorp/go-bexpr v0.1.11 h1:6DqdA/KBjurGby9yTY0bmkathya0lfwF2SeuubCI7dY= github.com/hashicorp/go-bexpr v0.1.11/go.mod h1:f03lAo0duBlDIUMGCuad8oLcgejw4m7U+N8T+6Kz1AE= github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d h1:dg1dEPuWpEqDnvIw251EVy4zlP8gWbsGj4BsUKCRpYs= github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/golang-lru/v2 v2.0.5 h1:wW7h1TG88eUIJ2i69gaE3uNVtEPIagzhGvHgwfx2Vm4= @@ -272,7 +343,9 @@ github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpO github.com/huin/goupnp v1.3.0 h1:UvLUlWDNpoUdYzb2TCn+MuTWtcjXKSza2n6CBdQ0xXc= github.com/huin/goupnp v1.3.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8= github.com/hydrogen18/memlistener v0.0.0-20200120041712-dcc25e7acd91/go.mod h1:qEIFzExnS6016fRpRfxrExeVn2gbClQA99gQhnIcdhE= +github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imkira/go-interpol v1.1.0/go.mod h1:z0h2/2T3XF8kyEPpRgJ3kmNv+C43p+I/CoI+jC3w2iA= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/ipfs/go-cid v0.4.1 h1:A/T3qGvxi4kpKWWcPC/PgbvDA2bjVLO7n4UeVwnbs/s= @@ -291,9 +364,11 @@ github.com/jbenet/go-temp-err-catcher v0.1.0/go.mod h1:0kJRvmDZXNMIiJirNPEYfhpPw github.com/jellevandenhooff/dkim v0.0.0-20150330215556-f50fe3d243e1/go.mod h1:E0B/fFc00Y+Rasa88328GlI/XbtyysCtTHZS8h7IrBU= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= +github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.3.0 h1:U0609e9tgbseu3rBINet9P48AI/D3oJs4dN7jwJOQ1U= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= @@ -318,6 +393,7 @@ github.com/klauspost/cpuid/v2 v2.2.7/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZY github.com/koron/go-ssdp v0.0.4 h1:1IDwrghSKYM7yLf7XCzbByg2sJ/JcNOZRXS2jczTwz0= github.com/koron/go-ssdp v0.0.4/go.mod h1:oDXq+E5IL5q0U8uSBcoAXzTzInwy5lEgC91HoKtbmZk= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= @@ -366,14 +442,14 @@ github.com/lithammer/dedent v1.1.0/go.mod h1:jrXYCQtgg0nJiN+StA2KgR7w6CiQNv9Fd/Z github.com/lunixbochs/vtclean v1.0.0/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/marioevz/blobber v1.1.1-0.20240306221924-a7e22e59ea34 h1:8Dq4RK6bFDm6GJTU3iEaUCSt2+85GReA7wxfeAfYD0w= github.com/marioevz/blobber v1.1.1-0.20240306221924-a7e22e59ea34/go.mod h1:7wGWXnUInWpcluqhusompgjT18fujAK/ibNxsuH4sgM= github.com/marioevz/eth-clients v0.0.0-20231123180401-b4230c802498 h1:FHzV7rVAhib6tRhR/e4UTWupqWw3ikIme06O1x96Ynk= github.com/marioevz/eth-clients v0.0.0-20231123180401-b4230c802498/go.mod h1:bhR5rKHekIvdWmsWUqRP6X6dLl05ohnH3X/+ZvKs3xg= github.com/marioevz/eth2api v0.0.0-20230922201437-72bd1301e033 h1:sn57n+lbJrLS8FKYs08W7TEzraTGOCQGrSC4hni6rYw= github.com/marioevz/eth2api v0.0.0-20230922201437-72bd1301e033/go.mod h1:hcwWCT4sF1X7KsMZ535MvDZVk5M20Uyj+x2LARZjQsM= -github.com/marioevz/mock-builder v1.1.1-0.20231123171249-08b59e943190 h1:vBXJeLFGRKZid18H4JQ+vhR+AQKU6fkx0Uc8JVMc3OI= -github.com/marioevz/mock-builder v1.1.1-0.20231123171249-08b59e943190/go.mod h1:17VX12ir8TOY2Ln2vy3jhjeVIGfrwmcsxY9VI0ZP1Zk= github.com/marioevz/mock-builder v1.2.1-0.20240312201838-ad9ba388e88b h1:tQ+fxfY5YHxOimJN1/NJ/ofPGMZA1ZX0OsU2Rm/xfE0= github.com/marioevz/mock-builder v1.2.1-0.20240312201838-ad9ba388e88b/go.mod h1:17VX12ir8TOY2Ln2vy3jhjeVIGfrwmcsxY9VI0ZP1Zk= github.com/marioevz/zrnt v0.26.2-0.20231109183115-d2098ec1f42c h1:ZwKLkGVKnAq1JZql6SBrQici0la1X7APcbBLwmrSsd4= @@ -392,6 +468,7 @@ github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hd github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= @@ -426,6 +503,7 @@ github.com/mitchellh/pointerstructure v1.2.1/go.mod h1:BRAsLI5zgXmw97Lf6s25bs8oh github.com/mmcloughlin/addchain v0.4.0 h1:SobOdjm2xLj1KkXN5/n0xTIWyZA2+s99UCY1iPfkHRY= github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqkyU72HC5wJ4RlU= github.com/mmcloughlin/profile v0.1.1/go.mod h1:IhHD7q1ooxgwTgjxQYkACGA77oFTDdFVejUS1/tS/qU= +github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -463,26 +541,32 @@ github.com/multiformats/go-multistream v0.5.0/go.mod h1:n6tMZiwiP2wUsR8DgfDWw1dy github.com/multiformats/go-varint v0.0.1/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= github.com/multiformats/go-varint v0.0.7 h1:sWSGR+f/eu5ABZA2ZpYKBILXTTs9JWpdEM/nEGOHFS8= github.com/multiformats/go-varint v0.0.7/go.mod h1:r8PUYw/fD/SjBCiKOoDlGF6QawOELpZAu9eioSos/OU= +github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= +github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= github.com/neelance/astrewrite v0.0.0-20160511093645-99348263ae86/go.mod h1:kHJEU3ofeGjhHklVoIGuVj85JJwZ6kWPaJwCIxgnFmo= github.com/neelance/sourcemap v0.0.0-20151028013722-8c68805598ab/go.mod h1:Qr6/a/Q4r9LP1IltGz7tA7iOK1WonHEYhu1HRBA7ZiM= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= +github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= +github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= github.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= github.com/onsi/ginkgo/v2 v2.15.0 h1:79HwNRBAZHOEwrczrgSOPy+eFTTlIGELKy5as+ClttY= github.com/onsi/ginkgo/v2 v2.15.0/go.mod h1:HlxMHtYF57y6Dpf+mc5529KKmSq9h2FpCF+/ZkwUxKM= +github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= @@ -498,6 +582,7 @@ github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTK github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 h1:onHthvaw9LFnH4t2DcNVpwGmV9E1BkGknEliJkfwQj0= github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58/go.mod h1:DXv8WO4yhMYhSNPKjeNKa5WY9YCIEBRbNzFFPJbWO6Y= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= +github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= @@ -544,6 +629,7 @@ github.com/raulk/go-watchdog v1.3.0/go.mod h1:fIvOnLbF0b0ZwkB9YU4mOW9Did//4vPZtD github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis= github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rogpeppe/go-internal v1.8.1/go.mod h1:JeRgkft04UBgHMgCIwADu4Pn6Mtm5d4nPKWu0nJ5d+o= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= @@ -594,13 +680,17 @@ github.com/sourcegraph/syntaxhighlight v0.0.0-20170531221838-bd320f5d308e/go.mod github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= +github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= +github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= github.com/status-im/keycard-go v0.2.0 h1:QDLFswOQu1r5jsycloeQh3bVU8n/NatHHaZobtDnDzA= github.com/status-im/keycard-go v0.2.0/go.mod h1:wlp8ZLbsmrF6g6WjugPAx+IzoLrkdf9+mHxBEeo3Hbg= +github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= @@ -666,6 +756,10 @@ github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1 github.com/yusufpapurcu/wmi v1.2.2 h1:KBNDSne4vP5mbSWnJbO+51IMOXJB67QiYCSBrubbPRg= github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= go.opencensus.io v0.18.0/go.mod h1:vKdFvxhtzZ9onBp9VKHK8z/sRpBMnKAsufL7wlDrCOA= +go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= +go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= +go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= @@ -692,27 +786,52 @@ golang.org/x/crypto v0.0.0-20181030102418-4d3f4d9ffa16/go.mod h1:6SG95UA2DQfeDnf golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190313024323-a1f597ede03a/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191227163750-53104e6ec876/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200602180216-279210d13fed/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.19.0 h1:ENy+Az/9Y1vSrlrvBSyna3PITt4tiZLf7sgCjZBX7Wo= golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= +golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= +golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= +golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= golang.org/x/exp v0.0.0-20240213143201-ec583247a57a h1:HinSgX1tJRX3KsL//Gxynpw5CTOAIPhgL4W8PNiIpVE= golang.org/x/exp v0.0.0-20240213143201-ec583247a57a/go.mod h1:CxmFvTBINI24O/j8iY7H1xHzx2i4OsyguNBmN/uPtqc= +golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= +golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= +golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= +golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= +golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= @@ -730,11 +849,19 @@ golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190313220215-9f648a60d977/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190327091125-710a502c58a2/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= @@ -742,6 +869,7 @@ golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= golang.org/x/net v0.0.0-20211008194852-3b03d305991f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211209124913-491a49abca63/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4= @@ -750,6 +878,9 @@ golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAG golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.16.0 h1:aDkGMBSYxElaoP81NpoUoz2oo2R2wHdZpGToUxfyQrQ= golang.org/x/oauth2 v0.16.0/go.mod h1:hqZ+0LWXsiVoZpeld6jVt06P3adbS2Uu911W1SsJv2o= golang.org/x/perf v0.0.0-20180704124530-6e6d33e29852/go.mod h1:JLpeXjPJfIyPr5TlbXLkXWLhP8nz10XfvxElABhCtcw= @@ -770,20 +901,34 @@ golang.org/x/sys v0.0.0-20181029174526-d69651ed3497/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190316082340-a2f829d7f35f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200602225109-6fdc65e7d980/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201101102859-da207088b7d1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -795,6 +940,7 @@ golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -803,16 +949,20 @@ golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.17.0 h1:25cE3gD+tdBA7lp7QfhuV+rJiE9YXTcS3VG1SqssI/Y= -golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= +golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.17.0 h1:mkTF7LCd6WGJNL3K1Ad7kwxNfYAW6a8a8QqtMblp/4U= -golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= +golang.org/x/term v0.18.0 h1:FcHjZXDMxI8mM3nwhX9HlKop4C0YQvCVCdwYl2wOtE8= +golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= +golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= @@ -824,7 +974,10 @@ golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -835,11 +988,34 @@ golang.org/x/tools v0.0.0-20181221001348-537d06c36207/go.mod h1:n7NCudcB/nEzxVGm golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190327201419-c70d86f8b7cf/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= @@ -855,12 +1031,25 @@ golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNq google.golang.org/api v0.0.0-20180910000450-7ca32eb868bf/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= google.golang.org/api v0.0.0-20181030000543-1d582fd0359e/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= google.golang.org/api v0.1.0/go.mod h1:UGEZY7KEX120AnNLIHFMKIo4obdJhkp2tPbaPlQx13Y= +google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= +google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= +google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= google.golang.org/api v0.44.0 h1:URs6qR1lAxDsqWITsQXI4ZkGiYJ5dHtRNiCpfs2OeKA= google.golang.org/api v0.44.0/go.mod h1:EBOGZqzyhtvMDoxwS97ctnh0zUmYY6CxqXsc1AvkYD8= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.3.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= +google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/genproto v0.0.0-20180518175338-11a468237815/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= @@ -869,22 +1058,47 @@ google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoA google.golang.org/genproto v0.0.0-20181029155118-b69ba1387ce2/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20181202183823-bd91e49a0898/go.mod h1:7Ep/1NZk928CDR8SjdVbjWNpdIf6nzjE3BTgJDr2Atg= google.golang.org/genproto v0.0.0-20190306203927-b5d61aea6440/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= +google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= +google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= -google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 h1:KpwkzHKEF7B9Zxg18WzOa7djJ+Ha5DzthMyZYQfEn2A= -google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1/go.mod h1:nKE/iIaLqn2bQwXBg8f1g2Ylh6r5MN5CmZvuzZCgsCU= +google.golang.org/genproto v0.0.0-20230711160842-782d3b101e98 h1:Z0hjGZePRE0ZBWotvtrwxFNrNE9CUAGtplaDK5NNI/g= +google.golang.org/genproto v0.0.0-20230711160842-782d3b101e98/go.mod h1:S7mY02OqCJTD0E1OiQy1F72PWFB4bZJ87cAtLPYgDR0= +google.golang.org/genproto/googleapis/api v0.0.0-20230711160842-782d3b101e98 h1:FmF5cCW94Ij59cfpoLiwTgodWmm60eEV0CjlsVg2fuw= +google.golang.org/genproto/googleapis/api v0.0.0-20230711160842-782d3b101e98/go.mod h1:rsr7RhLuwsDKL7RmgDDCUc6yaGr1iqceVb5Wv6f6YvQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230711160842-782d3b101e98 h1:bVf09lpb+OJbByTj913DRJioFFAjf/ZGxEz7MajTp2U= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230711160842-782d3b101e98/go.mod h1:TUfxEVdsvPg18p6AslUXFoLdpED4oBnGwyqk3dV1XzM= google.golang.org/grpc v1.12.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.16.0/go.mod h1:0JHn/cJsOMiMfNA9+DeHDlAU7KAAB5GDlYFpa9MZMio= google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= +google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.56.3 h1:8I4C0Yq1EjstUzUJzpcRVbuYA2mODtEmpWiQoN/b2nc= -google.golang.org/grpc v1.56.3/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s= +google.golang.org/grpc v1.58.3 h1:BjnpXut1btbtgN/6sp+brB2Kbm2LjNXnidYujAVbSoQ= +google.golang.org/grpc v1.58.3/go.mod h1:tgX3ZQDlNJGU96V6yHh1T/JeoBQ2TXdr43YbYSsCJk0= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -893,14 +1107,16 @@ google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzi google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I= -google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= +google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= @@ -926,6 +1142,7 @@ gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20191120175047-4206685974f2/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= @@ -933,21 +1150,34 @@ grpc.go4.org v0.0.0-20170609214715-11d0a25b4919/go.mod h1:77eQGdRu53HpSqPFJFmuJd honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -k8s.io/apimachinery v0.20.0 h1:jjzbTJRXk0unNS71L7h3lxGDH/2HPxMPaQY+MjECKL8= -k8s.io/apimachinery v0.20.0/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= -k8s.io/client-go v0.20.0 h1:Xlax8PKbZsjX4gFvNtt4F5MoJ1V5prDvCuoq9B7iax0= -k8s.io/client-go v0.20.0/go.mod h1:4KWh/g+Ocd8KkCwKF8vUNnmqgv+EVnQDK4MBF4oB5tY= +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +k8s.io/api v0.22.5/go.mod h1:mEhXyLaSD1qTOf40rRiKXkc+2iCem09rWLlFwhCEiAs= +k8s.io/apimachinery v0.22.5 h1:cIPwldOYm1Slq9VLBRPtEYpyhjIm1C6aAMAoENuvN9s= +k8s.io/apimachinery v0.22.5/go.mod h1:xziclGKwuuJ2RM5/rSFQSYAj0zdbci3DH8kj+WvyN0U= +k8s.io/client-go v0.22.5 h1:I8Zn/UqIdi2r02aZmhaJ1hqMxcpfJ3t5VqvHtctHYFo= +k8s.io/client-go v0.22.5/go.mod h1:cs6yf/61q2T1SdQL5Rdcjg9J1ElXSwbjSrW2vFImM4Y= +k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= +k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= +k8s.io/klog/v2 v2.9.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec= k8s.io/klog/v2 v2.80.0 h1:lyJt0TWMPaGoODa8B8bUuxgHS3W/m/bNr2cca3brA/g= k8s.io/klog/v2 v2.80.0/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= -k8s.io/utils v0.0.0-20201110183641-67b214c5f920 h1:CbnUZsM497iRC5QMVkHwyl8s2tB3g7yaSHkYPkpgelw= -k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +k8s.io/kube-openapi v0.0.0-20211109043538-20434351676c/go.mod h1:vHXdDvt9+2spS2Rx9ql3I8tycm3H9FDfdUoIuKCefvw= +k8s.io/utils v0.0.0-20210819203725-bdf08cb9a70a/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +k8s.io/utils v0.0.0-20210930125809-cb0fa318a74b h1:wxEMGetGMur3J1xuGLQY7GEQYg9bZxKn3tKo5k/eYcs= +k8s.io/utils v0.0.0-20210930125809-cb0fa318a74b/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= lukechampine.com/blake3 v1.2.1 h1:YuqqRuaqsGV71BV/nm9xlI0MKUv4QC54jQnBChWbGnI= lukechampine.com/blake3 v1.2.1/go.mod h1:0OFRp7fBtAylGVCO40o87sbupkyIGgbpv1+M1k1LM6k= +rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= +rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= rsc.io/tmplfunc v0.0.3 h1:53XFQh69AfOa8Tw0Jm7t+GV7KZhOi6jzsCzTtKbMvzU= rsc.io/tmplfunc v0.0.3/go.mod h1:AG3sTPzElb1Io3Yg4voV9AGZJuleGAwaVRxL9M49PhA= -sigs.k8s.io/structured-merge-diff/v4 v4.0.2 h1:YHQV7Dajm86OuqnIR6zAelnDWBRjo+YhYV9PmGrh1s8= sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= +sigs.k8s.io/structured-merge-diff/v4 v4.1.2 h1:Hr/htKFmJEbtMgS/UD0N+gtgctAqz81t3nu+sPzynno= +sigs.k8s.io/structured-merge-diff/v4 v4.1.2/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4= sigs.k8s.io/yaml v1.2.0 h1:kr/MCeFWJWTwyaHoR9c8EjH9OumOmoF9YGiZd7lFm/Q= sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= sourcegraph.com/sourcegraph/go-diff v0.5.0/go.mod h1:kuch7UrkMzY0X+p9CRK03kfuPQ2zzQcaEFbx8wA8rck= From e8ae4fac33f0c5173d4174e35300431bfd7a6a5b Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Tue, 19 Mar 2024 16:37:47 +0100 Subject: [PATCH 237/387] simulators/eth2/testnet: upgrade hivesim --- simulators/eth2/testnet/go.mod | 57 ++++++++---- simulators/eth2/testnet/go.sum | 156 +++++++++++++++++++++++---------- 2 files changed, 148 insertions(+), 65 deletions(-) diff --git a/simulators/eth2/testnet/go.mod b/simulators/eth2/testnet/go.mod index f209d4567e..49c3c6ca82 100644 --- a/simulators/eth2/testnet/go.mod +++ b/simulators/eth2/testnet/go.mod @@ -1,9 +1,11 @@ module github.com/ethereum/hive/simulators/eth2/testnet -go 1.18 +go 1.21 + +toolchain go1.22.1 require ( - github.com/ethereum/hive v0.0.0-20230313141339-8e3200bfc09e + github.com/ethereum/hive v0.0.0-20240319152821-ae224371b4e5 github.com/ethereum/hive/simulators/eth2/common v0.0.0-20230316220410-1364352c32a6 ) @@ -12,46 +14,58 @@ require ( github.com/go-stack/stack v1.8.1 // indirect github.com/shirou/gopsutil v3.21.11+incompatible // indirect github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a // indirect - github.com/tklauser/go-sysconf v0.3.11 // indirect - golang.org/x/sys v0.5.0 // indirect + github.com/tklauser/go-sysconf v0.3.12 // indirect + golang.org/x/sys v0.18.0 // indirect ) require ( github.com/DataDog/zstd v1.5.2 // indirect - github.com/VictoriaMetrics/fastcache v1.12.0 // indirect + github.com/Microsoft/go-winio v0.6.1 // indirect + github.com/VictoriaMetrics/fastcache v1.12.1 // indirect github.com/beorn7/perks v1.0.1 // indirect + github.com/bits-and-blooms/bitset v1.7.0 // indirect github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/cockroachdb/errors v1.9.1 // indirect github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect - github.com/cockroachdb/pebble v0.0.0-20230209160836-829675f94811 // indirect + github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593 // indirect github.com/cockroachdb/redact v1.1.3 // indirect + github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect + github.com/consensys/bavard v0.1.13 // indirect + github.com/consensys/gnark-crypto v0.12.1 // indirect + github.com/crate-crypto/go-kzg-4844 v0.7.0 // indirect github.com/deckarep/golang-set/v2 v2.1.0 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 // indirect - github.com/ethereum/go-ethereum v1.11.4 // indirect + github.com/ethereum/c-kzg-4844 v0.4.0 // indirect + github.com/ethereum/go-ethereum v1.13.5-0.20231031113925-bc42e88415d3 // indirect github.com/ferranbt/fastssz v0.1.2 // indirect github.com/getsentry/sentry-go v0.18.0 // indirect github.com/gofrs/flock v0.8.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang-jwt/jwt/v4 v4.3.0 // indirect - github.com/golang/protobuf v1.5.2 // indirect - github.com/golang/snappy v0.0.4 // indirect + github.com/golang-jwt/jwt/v4 v4.5.0 // indirect + github.com/golang/protobuf v1.5.3 // indirect + github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect + github.com/google/go-cmp v0.6.0 // indirect github.com/google/uuid v1.3.0 // indirect - github.com/gorilla/mux v1.8.0 // indirect + github.com/gorilla/mux v1.8.1 // indirect github.com/gorilla/websocket v1.5.0 // indirect github.com/herumi/bls-eth-go-binary v1.28.1 // indirect github.com/holiman/bloomfilter/v2 v2.0.3 // indirect - github.com/holiman/uint256 v1.2.1 // indirect + github.com/holiman/uint256 v1.2.3 // indirect github.com/julienschmidt/httprouter v1.3.0 // indirect github.com/kilic/bls12-381 v0.1.0 // indirect github.com/klauspost/compress v1.15.15 // indirect github.com/klauspost/cpuid/v2 v2.2.2 // indirect github.com/kr/pretty v0.3.1 // indirect github.com/kr/text v0.2.0 // indirect + github.com/lithammer/dedent v1.1.0 // indirect + github.com/mattn/go-colorable v0.1.13 // indirect + github.com/mattn/go-isatty v0.0.17 // indirect github.com/mattn/go-runewidth v0.0.14 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect github.com/minio/sha256-simd v1.0.0 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect + github.com/mmcloughlin/addchain v0.4.0 // indirect github.com/olekukonko/tablewriter v0.0.5 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/prometheus/client_golang v1.14.0 // indirect @@ -66,18 +80,23 @@ require ( github.com/rauljordan/engine-proxy v0.0.0-20230316220057-4c80c36c4c3a // indirect github.com/rivo/uniseg v0.4.3 // indirect github.com/rogpeppe/go-internal v1.9.0 // indirect - github.com/sirupsen/logrus v1.9.0 // indirect - github.com/tklauser/numcpus v0.6.0 // indirect + github.com/sirupsen/logrus v1.9.3 // indirect + github.com/supranational/blst v0.3.11 // indirect + github.com/tklauser/numcpus v0.6.1 // indirect github.com/tyler-smith/go-bip39 v1.1.0 // indirect github.com/wealdtech/go-bytesutil v1.2.0 // indirect github.com/wealdtech/go-eth2-types/v2 v2.8.0 // indirect github.com/wealdtech/go-eth2-util v1.8.0 // indirect github.com/yusufpapurcu/wmi v1.2.2 // indirect - golang.org/x/crypto v0.4.0 // indirect - golang.org/x/exp v0.0.0-20230206171751-46f607a40771 // indirect - golang.org/x/text v0.7.0 // indirect - google.golang.org/protobuf v1.28.1 // indirect - gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce // indirect + golang.org/x/crypto v0.14.0 // indirect + golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect + golang.org/x/mod v0.12.0 // indirect + golang.org/x/sync v0.3.0 // indirect + golang.org/x/text v0.13.0 // indirect + golang.org/x/tools v0.13.0 // indirect + google.golang.org/protobuf v1.33.0 // indirect + gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect + rsc.io/tmplfunc v0.0.3 // indirect ) diff --git a/simulators/eth2/testnet/go.sum b/simulators/eth2/testnet/go.sum index 9027946201..229221d6a4 100644 --- a/simulators/eth2/testnet/go.sum +++ b/simulators/eth2/testnet/go.sum @@ -6,21 +6,26 @@ github.com/CloudyKit/jet/v3 v3.0.0/go.mod h1:HKQPgSJmdK8hdoAbKUUWajkHyHo4RaU5rMd github.com/DataDog/zstd v1.5.2 h1:vUG4lAyuPCXO0TLbXvPv7EB7cNK1QV/luu55UHLrrn8= github.com/DataDog/zstd v1.5.2/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= github.com/Joker/hpp v1.0.0/go.mod h1:8x5n+M1Hp5hC0g8okX3sR3vFQwynaX/UgSOM9MeBKzY= +github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= +github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= github.com/Shopify/goreferrer v0.0.0-20181106222321-ec9c9a553398/go.mod h1:a1uqRtAwp2Xwc6WNPJEufxJ7fx3npB4UV/JOLmbu5I0= -github.com/VictoriaMetrics/fastcache v1.12.0 h1:vnVi/y9yKDcD9akmc4NqAoqgQhJrOwUF+j9LTgn4QDE= -github.com/VictoriaMetrics/fastcache v1.12.0/go.mod h1:tjiYeEfYXCqacuvYw/7UoDIeJaNxq6132xHICNP77w8= +github.com/VictoriaMetrics/fastcache v1.12.1 h1:i0mICQuojGDL3KblA7wUNlY5lOK6a4bwt3uRKnkZU40= +github.com/VictoriaMetrics/fastcache v1.12.1/go.mod h1:tX04vaqcNoQeGLD+ra5pU5sWkuxnzWhEzLwhP9w653o= github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY= github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= github.com/allegro/bigcache v1.2.1 h1:hg1sY1raCwic3Vnsvje6TT7/pnZba83LeFck5NrFKSc= +github.com/allegro/bigcache v1.2.1/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/aymerick/raymond v2.0.3-0.20180322193309-b565731e1464+incompatible/go.mod h1:osfaiScAUVup+UC9Nfq76eWqDhXlp+4UYaA8uhTBO6g= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/bits-and-blooms/bitset v1.7.0 h1:YjAGVd3XmtK9ktAbX8Zg2g2PwLIMjGREZJHlV4j7NEo= +github.com/bits-and-blooms/bitset v1.7.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U= github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= +github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= @@ -28,24 +33,34 @@ github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5P github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cockroachdb/datadriven v1.0.2 h1:H9MtNqVoVhvd9nCBwOyDjUEdZCREqbIdCJD93PBm/jA= github.com/cockroachdb/datadriven v1.0.2/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= +github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f h1:otljaYPt5hWxV3MUfO5dFPFiOXg9CyG5/kCfayTqsJ4= +github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= github.com/cockroachdb/errors v1.9.1 h1:yFVvsI0VxmRShfawbt/laCIDy/mtTqqnvoNgiy5bEV8= github.com/cockroachdb/errors v1.9.1/go.mod h1:2sxOtL2WIc096WSZqZ5h8fa17rdDq9HZOZLBCor4mBk= github.com/cockroachdb/logtags v0.0.0-20211118104740-dabe8e521a4f/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= -github.com/cockroachdb/pebble v0.0.0-20230209160836-829675f94811 h1:ytcWPaNPhNoGMWEhDvS3zToKcDpRsLuRolQJBVGdozk= -github.com/cockroachdb/pebble v0.0.0-20230209160836-829675f94811/go.mod h1:Nb5lgvnQ2+oGlE/EyZy4+2/CxRh9KfvCXnag1vtpxVM= +github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593 h1:aPEJyR4rPBvDmeyi+l/FS/VtA00IWvjeFvjen1m1l1A= +github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593/go.mod h1:6hk1eMY/u5t+Cf18q5lFMUA1Rc+Sm5I6Ra1QuPyxXCo= github.com/cockroachdb/redact v1.1.3 h1:AKZds10rFSIj7qADf0g46UixK8NNLwWTNdCIGS5wfSQ= github.com/cockroachdb/redact v1.1.3/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= +github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo= +github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ= github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0/go.mod h1:4Zcjuz89kmFXt9morQgcfYZAYZ5n8WHjt81YYWIwtTM= +github.com/consensys/bavard v0.1.13 h1:oLhMLOFGTLdlda/kma4VOJazblc7IM5y5QPd2A/YjhQ= +github.com/consensys/bavard v0.1.13/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI= +github.com/consensys/gnark-crypto v0.12.1 h1:lHH39WuuFgVHONRl3J0LRBtuYdQTumFSDtJF7HpyG8M= +github.com/consensys/gnark-crypto v0.12.1/go.mod h1:v2Gy7L/4ZRosZ7Ivs+9SfUDr0f5UlG+EM5t7MPHiLuY= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/cpuguy83/go-md2man v1.0.10 h1:BSKMNlYxDvnunlTymqtgONjNnaRV1sTpcovwwjF22jk= github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= +github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/crate-crypto/go-kzg-4844 v0.7.0 h1:C0vgZRk4q4EZ/JgPfzuSoxdCq3C3mOZMBShovmncxvA= +github.com/crate-crypto/go-kzg-4844 v0.7.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= @@ -53,22 +68,24 @@ github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs github.com/deckarep/golang-set/v2 v2.1.0 h1:g47V4Or+DUdzbs8FxCCmgb6VYd+ptPAngjM6dtGktsI= github.com/deckarep/golang-set/v2 v2.1.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0= +github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 h1:HbphB4TFFXpv7MNrT52FGrrgVXF1owhMVTHFZIlnvd4= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0/go.mod h1:DZGJHZMqrU4JJqFAWUS2UO1+lbSKsdiOoYi9Zzey7Fc= github.com/dgraph-io/badger v1.6.0/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6psNgSztDR4= github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/edsrzf/mmap-go v1.1.0 h1:6EUwBLQ/Mcr1EYLE4Tn1VdW1A4ckqCQWZBw8Hr0kjpQ= github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385/go.mod h1:0vRUJqYpeSZifjYj7uP3BG/gKcuzL9xWVV/Y+cK33KM= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/etcd-io/bbolt v1.3.3/go.mod h1:ZF2nL25h33cCyBtcyWeZ2/I3HQOfTP+0PIEvHjkjCrw= -github.com/ethereum/go-ethereum v1.11.4 h1:KG81SnUHXWk8LJB3mBcHg/E2yLvXoiPmRMCIRxgx3cE= -github.com/ethereum/go-ethereum v1.11.4/go.mod h1:it7x0DWnTDMfVFdXcU6Ti4KEFQynLHVRarcSlPr0HBo= -github.com/ethereum/hive v0.0.0-20230313141339-8e3200bfc09e h1:3g9cqRqpbZ92tSlGL4PfFoq435axKw6HiZ1Gz3fOkfk= -github.com/ethereum/hive v0.0.0-20230313141339-8e3200bfc09e/go.mod h1:PlpDuxHg6q1jU0K8Ouf+RXlHguignJ7k8Eyukc9RCPQ= +github.com/ethereum/c-kzg-4844 v0.4.0 h1:3MS1s4JtA868KpJxroZoepdV0ZKBp3u/O5HcZ7R3nlY= +github.com/ethereum/c-kzg-4844 v0.4.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= +github.com/ethereum/go-ethereum v1.13.5-0.20231031113925-bc42e88415d3 h1:i4TE0DmzMYcr2IiCdlTGGk+7Q/EzXvBKbbG4uRxMjJ0= +github.com/ethereum/go-ethereum v1.13.5-0.20231031113925-bc42e88415d3/go.mod h1:yMTu38GSuyxaYzQMViqNmQ1s3cE84abZexQmTgenWk0= +github.com/ethereum/hive v0.0.0-20240319152821-ae224371b4e5 h1:2Rc3v1mqWgUl8gSHFh7+FmVcyB1AI/9THxhEDjNK+PI= +github.com/ethereum/hive v0.0.0-20240319152821-ae224371b4e5/go.mod h1:MGwUXPGco6YS3brOf5WEILfUnnUL/XuX1224ab3D7XA= github.com/ethereum/hive/simulators/eth2/common v0.0.0-20230316220410-1364352c32a6 h1:LcSUNGwQuJyR/gdPcsif57yKX+3MyhpoAuChzR8k6Yk= github.com/ethereum/hive/simulators/eth2/common v0.0.0-20230316220410-1364352c32a6/go.mod h1:FX4oxNyTNw/P+TUWrb7vva7o/rFI0pHO7OYdtG6EtN4= github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072/go.mod h1:duJ4Jxv5lDcvg4QuQr0oowTf7dz4/CR8NtyCooz9HL8= @@ -76,12 +93,15 @@ github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga github.com/ferranbt/fastssz v0.1.2 h1:Dky6dXlngF6Qjc+EfDipAkE83N5I5DE68bY6O0VLNPk= github.com/ferranbt/fastssz v0.1.2/go.mod h1:X5UPrE2u1UJjxHA8X54u04SBwdAQjG2sFtWs39YxyWs= github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5 h1:FtmdgXiUlNeRsoNMFlKLDt+S+6hbjVMEW6RGQ7aUf7c= +github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= +github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= github.com/gavv/httpexpect v2.0.0+incompatible/go.mod h1:x+9tiU1YnrOvnB725RkpoLv1M62hOWzwo5OXotisrKc= github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff h1:tY80oXqGNY4FhTFhk+o9oFHGINQ/+vhlm8HFzi6znCI= +github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= github.com/getsentry/sentry-go v0.12.0/go.mod h1:NSap0JBYWzHND8oMbyi0+XZhUalc1TBdRL1M71JZW2c= github.com/getsentry/sentry-go v0.18.0 h1:MtBW5H9QgdcJabtZcuJG80BMOwaBpkRDZkxRkNC1sN0= github.com/getsentry/sentry-go v0.18.0/go.mod h1:Kgon4Mby+FJ7ZWHFUAZgVaIa8sxHtnRJRLTXZr51aKQ= @@ -90,6 +110,7 @@ github.com/gin-gonic/gin v1.4.0/go.mod h1:OW2EZn3DO8Ln9oIKOvM++LBO+5UPHJJDH72/q/ github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= +github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab/go.mod h1:/P9AEU963A2AYjv4d1V5eVL1CQbEJq6aCNHDDjibzu8= github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= @@ -108,8 +129,8 @@ github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/gogo/status v1.1.0/go.mod h1:BFv9nrluPLmrS0EmGVvLaPNmRosr9KapBYd5/hpY1WM= github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= -github.com/golang-jwt/jwt/v4 v4.3.0 h1:kHL1vqdqWNfATmA0FNMdmZNMyZI1U6O31X4rlIPoBog= -github.com/golang-jwt/jwt/v4 v4.3.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= +github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= +github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -124,11 +145,13 @@ github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvq github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= +github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXiurYmW7fx4GZkL8feAMVq7nEjURHk= +github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/gomodule/redigo v1.7.1-0.20190724094224-574c33c3df38/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= @@ -136,31 +159,37 @@ github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMyw github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= -github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= +github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= +github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/hashicorp/go-bexpr v0.1.10 h1:9kuI5PFotCboP3dkDYFr/wi0gg0QVbSNz5oFRpxn4uE= +github.com/hashicorp/go-bexpr v0.1.10/go.mod h1:oxlubA2vC/gFVfX1A6JGp7ls7uCDlfJn732ehYYg+g0= github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/herumi/bls-eth-go-binary v1.28.1 h1:fcIZ48y5EE9973k05XjE8+P3YiQgjZz4JI/YabAm8KA= github.com/herumi/bls-eth-go-binary v1.28.1/go.mod h1:luAnRm3OsMQeokhGzpYmc0ZKwawY7o87PUEP11Z7r7U= +github.com/holiman/billy v0.0.0-20230718173358-1c7e68d277a7 h1:3JQNjnMRil1yD0IfZKHF9GxxWKDJGj8I0IqOUol//sw= +github.com/holiman/billy v0.0.0-20230718173358-1c7e68d277a7/go.mod h1:5GuXa7vkL8u9FkFuWdVvfR5ix8hRB7DbOAaYULamFpc= github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao= github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA= github.com/holiman/uint256 v1.2.0/go.mod h1:y4ga/t+u+Xwd7CpDgZESaRcWy0I7XMlTMA25ApIH5Jw= -github.com/holiman/uint256 v1.2.1 h1:XRtyuda/zw2l+Bq/38n5XUoEF72aSOu/77Thd9pPp2o= -github.com/holiman/uint256 v1.2.1/go.mod h1:y4ga/t+u+Xwd7CpDgZESaRcWy0I7XMlTMA25ApIH5Jw= +github.com/holiman/uint256 v1.2.3 h1:K8UWO1HUJpRMXBxbmaY1Y8IAMZC/RsKB+ArEnnK4l5o= +github.com/holiman/uint256 v1.2.3/go.mod h1:SC8Ryt4n+UBbPbIBKaG9zbbDlp4jOru9xFZmPzLUTxw= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/huin/goupnp v1.0.3 h1:N8No57ls+MnjlB+JPiCVSOyy/ot7MJTqlo7rn+NYSqQ= +github.com/huin/goupnp v1.3.0 h1:UvLUlWDNpoUdYzb2TCn+MuTWtcjXKSza2n6CBdQ0xXc= +github.com/huin/goupnp v1.3.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8= github.com/hydrogen18/memlistener v0.0.0-20200120041712-dcc25e7acd91/go.mod h1:qEIFzExnS6016fRpRfxrExeVn2gbClQA99gQhnIcdhE= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/imkira/go-interpol v1.1.0/go.mod h1:z0h2/2T3XF8kyEPpRgJ3kmNv+C43p+I/CoI+jC3w2iA= @@ -171,6 +200,7 @@ github.com/iris-contrib/jade v1.1.3/go.mod h1:H/geBymxJhShH5kecoiOCSssPX7QWYH7Ua github.com/iris-contrib/pongo2 v0.0.1/go.mod h1:Ssh+00+3GAZqSQb30AvBRNxBx7rf0GqwkjqxNd0u65g= github.com/iris-contrib/schema v0.0.1/go.mod h1:urYA3uvUNG1TIIjOSCzHr9/LmbQo8LrOcOqfqxa4hXw= github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= +github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= @@ -203,19 +233,27 @@ github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= +github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/labstack/echo/v4 v4.5.0/go.mod h1:czIriw4a0C1dFun+ObrXp7ok03xON0N1awStJ6ArI7Y= github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= +github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c= +github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= +github.com/lithammer/dedent v1.1.0 h1:VNzHMVCBNG1j0fh3OrsFRkVUwStdDArbgBWoPAffktY= +github.com/lithammer/dedent v1.1.0/go.mod h1:jrXYCQtgg0nJiN+StA2KgR7w6CiQNv9Fd/Z9BP0jIOc= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.11/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= -github.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peKQ= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng= +github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.14 h1:+xnbZSEeDbOIg5/mE6JF0w6n9duR1l3/WmbinWVwUuU= github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= @@ -232,6 +270,10 @@ github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/pointerstructure v1.2.0 h1:O+i9nHnXS3l/9Wu7r4NrEdwA2VFTicjUEN1uBnDo34A= +github.com/mitchellh/pointerstructure v1.2.0/go.mod h1:BRAsLI5zgXmw97Lf6s25bs8ohIXc3tViBH44KcwB2g4= +github.com/mmcloughlin/addchain v0.4.0 h1:SobOdjm2xLj1KkXN5/n0xTIWyZA2+s99UCY1iPfkHRY= +github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqkyU72HC5wJ4RlU= +github.com/mmcloughlin/profile v0.1.1/go.mod h1:IhHD7q1ooxgwTgjxQYkACGA77oFTDdFVejUS1/tS/qU= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= @@ -289,6 +331,7 @@ github.com/protolambda/zrnt v0.30.0/go.mod h1:qcdX9CXFeVNCQK/q0nswpzhd+31RHMk2Ax github.com/protolambda/ztyp v0.2.2 h1:rVcL3vBu9W/aV646zF6caLS/dyn9BN8NYiuJzicLNyY= github.com/protolambda/ztyp v0.2.2/go.mod h1:9bYgKGqg3wJqT9ac1gI2hnVb0STQq7p/1lapqrqY1dU= github.com/prysmaticlabs/gohashtree v0.0.1-alpha.0.20220714111606-acbb2962fb48 h1:cSo6/vk8YpvkLbk9v3FO97cakNmUoxwi2KMP8hd5WIw= +github.com/prysmaticlabs/gohashtree v0.0.1-alpha.0.20220714111606-acbb2962fb48/go.mod h1:4pWaT30XoEx1j8KNJf3TV+E3mQkaufn7mf+jRNb/Fuk= github.com/rauljordan/engine-proxy v0.0.0-20230316220057-4c80c36c4c3a h1:ZIfMLprHVdo2vs3WcSqSDEyz2ZsSzDhGeOyxh8VQThA= github.com/rauljordan/engine-proxy v0.0.0-20230316220057-4c80c36c4c3a/go.mod h1:9OVXfWYnIV+wj1/SqfdREmE5mzN/OANAgdOJRtFtvpo= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= @@ -299,17 +342,19 @@ github.com/rogpeppe/go-internal v1.8.1/go.mod h1:JeRgkft04UBgHMgCIwADu4Pn6Mtm5d4 github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/rs/cors v1.8.2 h1:KCooALfAYGs415Cwu5ABvv9n9509fSiG5SQJn/AQo4U= +github.com/rs/cors v1.8.2/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/russross/blackfriday v1.5.2 h1:HyvC0ARfnZBqnXwABFeSZHpKvJHJJfPz81GNueLj0oo= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/schollz/closestmatch v2.1.0+incompatible/go.mod h1:RtP1ddjLong6gTkbtmuhtR2uUrrJOpYzYRvbcPAid+g= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI= github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0= -github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= +github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= @@ -319,6 +364,7 @@ github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb6 github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= github.com/status-im/keycard-go v0.2.0 h1:QDLFswOQu1r5jsycloeQh3bVU8n/NatHHaZobtDnDzA= +github.com/status-im/keycard-go v0.2.0/go.mod h1:wlp8ZLbsmrF6g6WjugPAx+IzoLrkdf9+mHxBEeo3Hbg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= @@ -326,20 +372,24 @@ github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81P github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= -github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/supranational/blst v0.3.11 h1:LyU6FolezeWAhvQk0k6O/d49jqgO52MSDDfYgbeoEm4= +github.com/supranational/blst v0.3.11/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a h1:1ur3QoCqvE5fl+nylMaIr9PVV1w343YRDtsy+Rwu7XI= github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a/go.mod h1:RRCYJbIwD5jmqPI9XoAFR0OcDxqUctll6zUj/+B4S48= -github.com/tklauser/go-sysconf v0.3.11 h1:89WgdJhk5SNwJfu+GKyYveZ4IaJ7xAkecBo+KdJV0CM= -github.com/tklauser/go-sysconf v0.3.11/go.mod h1:GqXfhXY3kiPa0nAXPDIQIWzJbMCB7AmcWpGR8lSZfqI= -github.com/tklauser/numcpus v0.6.0 h1:kebhY2Qt+3U6RNK7UqpYNA+tJ23IBEGKkB7JQBfDYms= -github.com/tklauser/numcpus v0.6.0/go.mod h1:FEZLMke0lhOUG6w2JadTzp0a+Nl8PF/GFkQ5UVIcaL4= +github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= +github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= +github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= +github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= github.com/tyler-smith/go-bip39 v1.1.0 h1:5eUemwrMargf3BSLRRCalXT93Ns6pQJIjYQN2nyfOP8= github.com/tyler-smith/go-bip39 v1.1.0/go.mod h1:gUYDtqQw1JS3ZJ8UWVcGTGqqr6YIN3CWg+kkNaLt55U= github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= -github.com/urfave/cli/v2 v2.17.2-0.20221006022127-8f469abc00aa h1:5SqCsI/2Qya2bCzK15ozrqo2sZxkh0FHynJZOTVoV6Q= +github.com/urfave/cli/v2 v2.25.7 h1:VAzn5oq403l5pHjc4OhD54+XGO9cdKVL/7lDjF+iKUs= +github.com/urfave/cli/v2 v2.25.7/go.mod h1:8qnjx1vcq5s2/wpsqoZFndg2CE5tNFyrTvS6SinrnYQ= github.com/urfave/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/valyala/fasthttp v1.6.0/go.mod h1:FstJa9V+Pj9vQ7OJie2qMHdwemEDaDiSdBnvPM1Su9w= @@ -357,6 +407,7 @@ github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1: github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU= +github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8= github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0/go.mod h1:/LWChgwKmvncFJFHJ7Gvn9wZArjbV5/FppcK2fKk/tI= github.com/yudai/gojsondiff v1.0.0/go.mod h1:AY32+k2cwILAkW1fbgxQ5mUmMiZFgLIV+FBNExI05xg= github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82/go.mod h1:lgjkn3NuSvDfVJdfcVVdX+jpBxNmX4rDAzaS45IcYoM= @@ -375,11 +426,11 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.4.0 h1:UVQgzMY87xqpKNgb+kDsll2Igd33HszWHFLmpaRMq/8= -golang.org/x/crypto v0.4.0/go.mod h1:3quD/ATkf6oY+rnes5c3ExXTbLc8mueNue5/DoinL80= +golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= +golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20230206171751-46f607a40771 h1:xP7rWLUr1e1n2xkK5YB4LI0hPEy3LJC6Wk+D4pGlOJg= -golang.org/x/exp v0.0.0-20230206171751-46f607a40771/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc= +golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g= +golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= @@ -388,6 +439,8 @@ golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzB golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc= +golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -409,7 +462,8 @@ golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT golang.org/x/net v0.0.0-20211008194852-3b03d305991f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.7.0 h1:rJrUqqhjsgNp7KqAIc25s9pZnjU7TUcSY7HcVZjdn1g= +golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= +golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -419,7 +473,8 @@ golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= +golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= +golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -450,14 +505,16 @@ golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220405052023-b1e9470b6e64/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= +golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -466,10 +523,11 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.7.0 h1:4BRB4x83lYWy72KwLD/qYDuTu7q9PjSagHvijDw7cLo= -golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= +golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20220922220347-f3bd1da661af h1:Yx9k8YCG3dvF87UAn2tu2HQLf2dt/eR1bXxpLMWeH+Y= +golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= +golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181221001348-537d06c36207/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -484,6 +542,8 @@ golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roY golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.13.0 h1:Iey4qkscZuv0VvIt8E0neZjtPVQFSc870HQ448QgEmQ= +golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -513,21 +573,23 @@ google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpAD google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= -google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= +google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= gopkg.in/go-playground/validator.v8 v8.18.2/go.mod h1:RX2a/7Ha8BgOhfk7j780h4/u/RRjR0eouCJSH80/M2Y= gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1 h1:iiHuQZCNgYPmFQxd3BBN/Nc5+dAwzZuq5y40s20oQw0= +gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= gopkg.in/ini.v1 v1.51.1/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= -gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce h1:+JknDZhAj8YMt7GC73Ei8pv4MzjDUNPHgQWJdtMAaDU= -gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:5AcXVHNjg+BDxry382+8OKon8SEWiKktQR07RKPsv1c= +gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8= +gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= @@ -542,3 +604,5 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +rsc.io/tmplfunc v0.0.3 h1:53XFQh69AfOa8Tw0Jm7t+GV7KZhOi6jzsCzTtKbMvzU= +rsc.io/tmplfunc v0.0.3/go.mod h1:AG3sTPzElb1Io3Yg4voV9AGZJuleGAwaVRxL9M49PhA= From 8c53df880c193cf2eff6e7aeb5aa63635ada4129 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Tue, 19 Mar 2024 16:37:56 +0100 Subject: [PATCH 238/387] simulators/eth2/dencun: upgrade hivesim --- simulators/eth2/dencun/go.mod | 11 +++++++---- simulators/eth2/dencun/go.sum | 34 ++++++++++++++++++---------------- 2 files changed, 25 insertions(+), 20 deletions(-) diff --git a/simulators/eth2/dencun/go.mod b/simulators/eth2/dencun/go.mod index 62d23e23f1..d2bc3d07e3 100644 --- a/simulators/eth2/dencun/go.mod +++ b/simulators/eth2/dencun/go.mod @@ -6,7 +6,7 @@ toolchain go1.22.0 require ( github.com/ethereum/go-ethereum v1.13.14 - github.com/ethereum/hive v0.0.0-20231128202301-f931b46287a8 + github.com/ethereum/hive v0.0.0-20240319152821-ae224371b4e5 github.com/ethereum/hive/simulators/eth2/common v0.0.0-20230316220410-1364352c32a6 github.com/ethereum/hive/simulators/ethereum/engine v0.0.0-20240305231022-f69df863de20 github.com/lithammer/dedent v1.1.0 @@ -31,7 +31,7 @@ require ( github.com/shirou/gopsutil v3.21.11+incompatible // indirect github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d // indirect github.com/tklauser/go-sysconf v0.3.12 // indirect - golang.org/x/sys v0.17.0 // indirect + golang.org/x/sys v0.18.0 // indirect golang.org/x/text v0.14.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect @@ -73,7 +73,7 @@ require ( github.com/google/gopacket v1.1.19 // indirect github.com/google/pprof v0.0.0-20240207164012-fb44976bdcd5 // indirect github.com/google/uuid v1.6.0 // indirect - github.com/gorilla/mux v1.8.0 // indirect + github.com/gorilla/mux v1.8.1 // indirect github.com/gorilla/websocket v1.5.1 // indirect github.com/hashicorp/golang-lru/v2 v2.0.5 // indirect github.com/herumi/bls-eth-go-binary v1.28.1 // indirect @@ -162,8 +162,11 @@ require ( golang.org/x/mod v0.15.0 // indirect golang.org/x/net v0.21.0 // indirect golang.org/x/sync v0.6.0 // indirect + golang.org/x/term v0.18.0 // indirect golang.org/x/tools v0.18.0 // indirect - google.golang.org/protobuf v1.32.0 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20230711160842-782d3b101e98 // indirect + google.golang.org/grpc v1.58.3 // indirect + google.golang.org/protobuf v1.33.0 // indirect gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1 // indirect k8s.io/client-go v0.22.5 // indirect k8s.io/utils v0.0.0-20210930125809-cb0fa318a74b // indirect diff --git a/simulators/eth2/dencun/go.sum b/simulators/eth2/dencun/go.sum index 9af310a1bc..449d6acd49 100644 --- a/simulators/eth2/dencun/go.sum +++ b/simulators/eth2/dencun/go.sum @@ -160,8 +160,8 @@ github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7 github.com/etcd-io/bbolt v1.3.3/go.mod h1:ZF2nL25h33cCyBtcyWeZ2/I3HQOfTP+0PIEvHjkjCrw= github.com/ethereum/c-kzg-4844 v0.4.0 h1:3MS1s4JtA868KpJxroZoepdV0ZKBp3u/O5HcZ7R3nlY= github.com/ethereum/c-kzg-4844 v0.4.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= -github.com/ethereum/hive v0.0.0-20231128202301-f931b46287a8 h1:vpOgMOOh8lQHGL8lSl9Lhqk3TcwuaNBObBilP5iK4RQ= -github.com/ethereum/hive v0.0.0-20231128202301-f931b46287a8/go.mod h1:lT6CsiAFb+HTThYzu3veK2x2/BlazxNQD6KWPDlvjfo= +github.com/ethereum/hive v0.0.0-20240319152821-ae224371b4e5 h1:2Rc3v1mqWgUl8gSHFh7+FmVcyB1AI/9THxhEDjNK+PI= +github.com/ethereum/hive v0.0.0-20240319152821-ae224371b4e5/go.mod h1:MGwUXPGco6YS3brOf5WEILfUnnUL/XuX1224ab3D7XA= github.com/ethereum/hive/simulators/eth2/common v0.0.0-20230316220410-1364352c32a6 h1:LcSUNGwQuJyR/gdPcsif57yKX+3MyhpoAuChzR8k6Yk= github.com/ethereum/hive/simulators/eth2/common v0.0.0-20230316220410-1364352c32a6/go.mod h1:FX4oxNyTNw/P+TUWrb7vva7o/rFI0pHO7OYdtG6EtN4= github.com/ethereum/hive/simulators/ethereum/engine v0.0.0-20240305231022-f69df863de20 h1:Bf9mev5lvesQIIpJtzO+vnGQ3Jv3NuLa2buY2+2pQzg= @@ -311,8 +311,8 @@ github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5m github.com/googleapis/gnostic v0.5.1/go.mod h1:6U4PtQXGIEt/Z3h5MAT7FNofLnw9vXk2cUuW7uA/OeU= github.com/googleapis/gnostic v0.5.5/go.mod h1:7+EbHbldMins07ALC74bsA81Ovc97DwqyJO1AENw9kA= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= -github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= +github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= +github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.5.1 h1:gmztn0JnHVt9JZquRuzLw3g4wouNVzKL15iLr/zn/QY= @@ -452,8 +452,6 @@ github.com/marioevz/eth-clients v0.0.0-20231123180401-b4230c802498 h1:FHzV7rVAhi github.com/marioevz/eth-clients v0.0.0-20231123180401-b4230c802498/go.mod h1:bhR5rKHekIvdWmsWUqRP6X6dLl05ohnH3X/+ZvKs3xg= github.com/marioevz/eth2api v0.0.0-20230922201437-72bd1301e033 h1:sn57n+lbJrLS8FKYs08W7TEzraTGOCQGrSC4hni6rYw= github.com/marioevz/eth2api v0.0.0-20230922201437-72bd1301e033/go.mod h1:hcwWCT4sF1X7KsMZ535MvDZVk5M20Uyj+x2LARZjQsM= -github.com/marioevz/mock-builder v1.1.1-0.20231123171249-08b59e943190 h1:vBXJeLFGRKZid18H4JQ+vhR+AQKU6fkx0Uc8JVMc3OI= -github.com/marioevz/mock-builder v1.1.1-0.20231123171249-08b59e943190/go.mod h1:17VX12ir8TOY2Ln2vy3jhjeVIGfrwmcsxY9VI0ZP1Zk= github.com/marioevz/mock-builder v1.2.1-0.20240312201838-ad9ba388e88b h1:tQ+fxfY5YHxOimJN1/NJ/ofPGMZA1ZX0OsU2Rm/xfE0= github.com/marioevz/mock-builder v1.2.1-0.20240312201838-ad9ba388e88b/go.mod h1:17VX12ir8TOY2Ln2vy3jhjeVIGfrwmcsxY9VI0ZP1Zk= github.com/marioevz/zrnt v0.26.2-0.20231109183115-d2098ec1f42c h1:ZwKLkGVKnAq1JZql6SBrQici0la1X7APcbBLwmrSsd4= @@ -956,14 +954,14 @@ golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.17.0 h1:25cE3gD+tdBA7lp7QfhuV+rJiE9YXTcS3VG1SqssI/Y= -golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= +golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.17.0 h1:mkTF7LCd6WGJNL3K1Ad7kwxNfYAW6a8a8QqtMblp/4U= -golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= +golang.org/x/term v0.18.0 h1:FcHjZXDMxI8mM3nwhX9HlKop4C0YQvCVCdwYl2wOtE8= +golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1080,8 +1078,12 @@ google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfG google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= google.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= -google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 h1:KpwkzHKEF7B9Zxg18WzOa7djJ+Ha5DzthMyZYQfEn2A= -google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1/go.mod h1:nKE/iIaLqn2bQwXBg8f1g2Ylh6r5MN5CmZvuzZCgsCU= +google.golang.org/genproto v0.0.0-20230711160842-782d3b101e98 h1:Z0hjGZePRE0ZBWotvtrwxFNrNE9CUAGtplaDK5NNI/g= +google.golang.org/genproto v0.0.0-20230711160842-782d3b101e98/go.mod h1:S7mY02OqCJTD0E1OiQy1F72PWFB4bZJ87cAtLPYgDR0= +google.golang.org/genproto/googleapis/api v0.0.0-20230711160842-782d3b101e98 h1:FmF5cCW94Ij59cfpoLiwTgodWmm60eEV0CjlsVg2fuw= +google.golang.org/genproto/googleapis/api v0.0.0-20230711160842-782d3b101e98/go.mod h1:rsr7RhLuwsDKL7RmgDDCUc6yaGr1iqceVb5Wv6f6YvQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230711160842-782d3b101e98 h1:bVf09lpb+OJbByTj913DRJioFFAjf/ZGxEz7MajTp2U= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230711160842-782d3b101e98/go.mod h1:TUfxEVdsvPg18p6AslUXFoLdpED4oBnGwyqk3dV1XzM= google.golang.org/grpc v1.12.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.16.0/go.mod h1:0JHn/cJsOMiMfNA9+DeHDlAU7KAAB5GDlYFpa9MZMio= @@ -1095,8 +1097,8 @@ google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8 google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.56.3 h1:8I4C0Yq1EjstUzUJzpcRVbuYA2mODtEmpWiQoN/b2nc= -google.golang.org/grpc v1.56.3/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s= +google.golang.org/grpc v1.58.3 h1:BjnpXut1btbtgN/6sp+brB2Kbm2LjNXnidYujAVbSoQ= +google.golang.org/grpc v1.58.3/go.mod h1:tgX3ZQDlNJGU96V6yHh1T/JeoBQ2TXdr43YbYSsCJk0= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -1109,8 +1111,8 @@ google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGj google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I= -google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= +google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= From a52cd6debec145a1355dd81346fc760b3427b514 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Tue, 19 Mar 2024 16:38:06 +0100 Subject: [PATCH 239/387] simulators/eth2/engine: upgrade hivesim --- simulators/eth2/engine/go.mod | 46 ++++++----- simulators/eth2/engine/go.sum | 149 ++++++++++++++++------------------ 2 files changed, 97 insertions(+), 98 deletions(-) diff --git a/simulators/eth2/engine/go.mod b/simulators/eth2/engine/go.mod index 03a91617f8..e1419817e1 100644 --- a/simulators/eth2/engine/go.mod +++ b/simulators/eth2/engine/go.mod @@ -1,10 +1,12 @@ module github.com/ethereum/hive/simulators/eth2/engine -go 1.18 +go 1.21 + +toolchain go1.22.1 require ( - github.com/ethereum/go-ethereum v1.13.1 - github.com/ethereum/hive v0.0.0-20230313141339-8e3200bfc09e + github.com/ethereum/go-ethereum v1.13.5-0.20231031113925-bc42e88415d3 + github.com/ethereum/hive v0.0.0-20240319152821-ae224371b4e5 github.com/ethereum/hive/simulators/eth2/common v0.0.0-20230316220410-1364352c32a6 github.com/marioevz/eth-clients v0.0.0-20230925201418-d5fbddd99b76 github.com/protolambda/eth2api v0.0.0-20230316214135-5f8afbd6d05d @@ -13,7 +15,7 @@ require ( ) require ( - github.com/VictoriaMetrics/fastcache v1.12.0 // indirect + github.com/VictoriaMetrics/fastcache v1.12.1 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/ferranbt/fastssz v0.1.2 // indirect github.com/go-ole/go-ole v1.2.6 // indirect @@ -27,8 +29,8 @@ require ( github.com/shirou/gopsutil v3.21.11+incompatible // indirect github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a // indirect github.com/tklauser/go-sysconf v0.3.12 // indirect - golang.org/x/sys v0.11.0 // indirect - golang.org/x/text v0.12.0 // indirect + golang.org/x/sys v0.18.0 // indirect + golang.org/x/text v0.13.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) @@ -37,28 +39,30 @@ require ( github.com/DataDog/zstd v1.5.2 // indirect github.com/Microsoft/go-winio v0.6.1 // indirect github.com/beorn7/perks v1.0.1 // indirect - github.com/bits-and-blooms/bitset v1.5.0 // indirect + github.com/bits-and-blooms/bitset v1.7.0 // indirect github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect github.com/cockroachdb/errors v1.9.1 // indirect github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect - github.com/cockroachdb/pebble v0.0.0-20230906160148-46873a6a7a06 // indirect + github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593 // indirect github.com/cockroachdb/redact v1.1.3 // indirect + github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect github.com/consensys/bavard v0.1.13 // indirect - github.com/consensys/gnark-crypto v0.10.0 // indirect - github.com/crate-crypto/go-kzg-4844 v0.3.0 // indirect + github.com/consensys/gnark-crypto v0.12.1 // indirect + github.com/crate-crypto/go-kzg-4844 v0.7.0 // indirect github.com/deckarep/golang-set/v2 v2.1.0 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 // indirect - github.com/ethereum/c-kzg-4844 v0.3.1 // indirect + github.com/ethereum/c-kzg-4844 v0.4.0 // indirect github.com/fjl/memsize v0.0.1 // indirect github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08 // indirect github.com/getsentry/sentry-go v0.18.0 // indirect github.com/gofrs/flock v0.8.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang-jwt/jwt/v4 v4.5.0 // indirect - github.com/golang/protobuf v1.5.2 // indirect + github.com/golang/protobuf v1.5.3 // indirect github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect + github.com/google/go-cmp v0.6.0 // indirect github.com/google/uuid v1.3.0 // indirect - github.com/gorilla/mux v1.8.0 // indirect + github.com/gorilla/mux v1.8.1 // indirect github.com/gorilla/websocket v1.5.0 // indirect github.com/hashicorp/go-bexpr v0.1.11 // indirect github.com/herumi/bls-eth-go-binary v1.28.1 // indirect @@ -69,6 +73,9 @@ require ( github.com/klauspost/cpuid/v2 v2.2.2 // indirect github.com/kr/pretty v0.3.1 // indirect github.com/kr/text v0.2.0 // indirect + github.com/lithammer/dedent v1.1.0 // indirect + github.com/mattn/go-colorable v0.1.13 // indirect + github.com/mattn/go-isatty v0.0.17 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect github.com/mmcloughlin/addchain v0.4.0 // indirect github.com/pkg/errors v0.9.1 // indirect @@ -80,7 +87,7 @@ require ( github.com/protolambda/ztyp v0.2.2 // indirect github.com/rivo/uniseg v0.4.3 // indirect github.com/rogpeppe/go-internal v1.9.0 // indirect - github.com/sirupsen/logrus v1.9.0 // indirect + github.com/sirupsen/logrus v1.9.3 // indirect github.com/supranational/blst v0.3.11 // indirect github.com/tklauser/numcpus v0.6.1 // indirect github.com/tyler-smith/go-bip39 v1.1.0 // indirect @@ -88,12 +95,13 @@ require ( github.com/wealdtech/go-eth2-types/v2 v2.8.0 // indirect github.com/wealdtech/go-eth2-util v1.8.0 // indirect github.com/yusufpapurcu/wmi v1.2.2 // indirect - golang.org/x/crypto v0.12.0 // indirect - golang.org/x/exp v0.0.0-20230810033253-352e893a4cad // indirect - golang.org/x/mod v0.11.0 // indirect + golang.org/x/crypto v0.14.0 // indirect + golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect + golang.org/x/mod v0.12.0 // indirect golang.org/x/sync v0.3.0 // indirect - golang.org/x/tools v0.9.1 // indirect - google.golang.org/protobuf v1.28.1 // indirect + golang.org/x/tools v0.13.0 // indirect + google.golang.org/protobuf v1.33.0 // indirect + gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1 // indirect rsc.io/tmplfunc v0.0.3 // indirect ) diff --git a/simulators/eth2/engine/go.sum b/simulators/eth2/engine/go.sum index 3cead53528..b7fcee8f7b 100644 --- a/simulators/eth2/engine/go.sum +++ b/simulators/eth2/engine/go.sum @@ -1,8 +1,5 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= -github.com/Azure/azure-sdk-for-go/sdk/azcore v0.21.1/go.mod h1:fBF9PQNqB8scdgpZ3ufzaLntG0AG7C1WjPMsiFOmfHM= -github.com/Azure/azure-sdk-for-go/sdk/internal v0.8.3/go.mod h1:KLF4gFr6DcKFZwSuH8w8yEK6DpFl3LP5rhdvAb7Yz5I= -github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v0.3.0/go.mod h1:tPaiy8S5bQ+S5sOiDlINkp7+Ef339+Nz5L5XO+cnOHo= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/CloudyKit/fastprinter v0.0.0-20200109182630-33d98a066a53/go.mod h1:+3IMCy2vIlbG1XG/0ggNQv0SvxCAIpPM5b1nCz56Xno= github.com/CloudyKit/jet/v3 v3.0.0/go.mod h1:HKQPgSJmdK8hdoAbKUUWajkHyHo4RaU5rMdUywE7VMo= @@ -12,79 +9,68 @@ github.com/Joker/hpp v1.0.0/go.mod h1:8x5n+M1Hp5hC0g8okX3sR3vFQwynaX/UgSOM9MeBKz github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= github.com/Shopify/goreferrer v0.0.0-20181106222321-ec9c9a553398/go.mod h1:a1uqRtAwp2Xwc6WNPJEufxJ7fx3npB4UV/JOLmbu5I0= -github.com/VictoriaMetrics/fastcache v1.12.0 h1:vnVi/y9yKDcD9akmc4NqAoqgQhJrOwUF+j9LTgn4QDE= -github.com/VictoriaMetrics/fastcache v1.12.0/go.mod h1:tjiYeEfYXCqacuvYw/7UoDIeJaNxq6132xHICNP77w8= +github.com/VictoriaMetrics/fastcache v1.12.1 h1:i0mICQuojGDL3KblA7wUNlY5lOK6a4bwt3uRKnkZU40= +github.com/VictoriaMetrics/fastcache v1.12.1/go.mod h1:tX04vaqcNoQeGLD+ra5pU5sWkuxnzWhEzLwhP9w653o= github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY= -github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= github.com/allegro/bigcache v1.2.1 h1:hg1sY1raCwic3Vnsvje6TT7/pnZba83LeFck5NrFKSc= +github.com/allegro/bigcache v1.2.1/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= -github.com/aws/aws-sdk-go-v2 v1.2.0/go.mod h1:zEQs02YRBw1DjK0PoJv3ygDYOFTre1ejlJWl8FwAuQo= -github.com/aws/aws-sdk-go-v2/config v1.1.1/go.mod h1:0XsVy9lBI/BCXm+2Tuvt39YmdHwS5unDQmxZOYe8F5Y= -github.com/aws/aws-sdk-go-v2/credentials v1.1.1/go.mod h1:mM2iIjwl7LULWtS6JCACyInboHirisUUdkBPoTHMOUo= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.0.2/go.mod h1:3hGg3PpiEjHnrkrlasTfxFqUsZ2GCk/fMUn4CbKgSkM= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.0.2/go.mod h1:45MfaXZ0cNbeuT0KQ1XJylq8A6+OpVV2E5kvY/Kq+u8= -github.com/aws/aws-sdk-go-v2/service/route53 v1.1.1/go.mod h1:rLiOUrPLW/Er5kRcQ7NkwbjlijluLsrIbu/iyl35RO4= -github.com/aws/aws-sdk-go-v2/service/sso v1.1.1/go.mod h1:SuZJxklHxLAXgLTc1iFXbEWkXs7QRTQpCLGaKIprQW0= -github.com/aws/aws-sdk-go-v2/service/sts v1.1.1/go.mod h1:Wi0EBZwiz/K44YliU0EKxqTCJGUfYTWXrrBwkq736bM= -github.com/aws/smithy-go v1.1.0/go.mod h1:EzMw8dbp/YJL4A5/sbhGddag+NPT7q084agLbB9LgIw= github.com/aymerick/raymond v2.0.3-0.20180322193309-b565731e1464+incompatible/go.mod h1:osfaiScAUVup+UC9Nfq76eWqDhXlp+4UYaA8uhTBO6g= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bits-and-blooms/bitset v1.5.0 h1:NpE8frKRLGHIcEzkR+gZhiioW1+WbYV6fKwD6ZIpQT8= -github.com/bits-and-blooms/bitset v1.5.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= +github.com/bits-and-blooms/bitset v1.7.0 h1:YjAGVd3XmtK9ktAbX8Zg2g2PwLIMjGREZJHlV4j7NEo= +github.com/bits-and-blooms/bitset v1.7.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U= github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= +github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/cespare/cp v0.1.0/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s= -github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cloudflare/cloudflare-go v0.14.0/go.mod h1:EnwdgGMaFOruiPZRFSgn+TsQ3hQ7C/YWzIGLeu5c304= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cockroachdb/datadriven v1.0.2/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= -github.com/cockroachdb/datadriven v1.0.3-0.20230801171734-e384cf455877 h1:1MLK4YpFtIEo3ZtMA5C795Wtv5VuUnrXX7mQG+aHg6o= +github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f h1:otljaYPt5hWxV3MUfO5dFPFiOXg9CyG5/kCfayTqsJ4= +github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= github.com/cockroachdb/errors v1.9.1 h1:yFVvsI0VxmRShfawbt/laCIDy/mtTqqnvoNgiy5bEV8= github.com/cockroachdb/errors v1.9.1/go.mod h1:2sxOtL2WIc096WSZqZ5h8fa17rdDq9HZOZLBCor4mBk= github.com/cockroachdb/logtags v0.0.0-20211118104740-dabe8e521a4f/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= -github.com/cockroachdb/pebble v0.0.0-20230906160148-46873a6a7a06 h1:T+Np/xtzIjYM/P5NAw0e2Rf1FGvzDau1h54MKvx8G7w= -github.com/cockroachdb/pebble v0.0.0-20230906160148-46873a6a7a06/go.mod h1:bynZ3gvVyhlvjLI7PT6dmZ7g76xzJ7HpxfjgkzCGz6s= +github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593 h1:aPEJyR4rPBvDmeyi+l/FS/VtA00IWvjeFvjen1m1l1A= +github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593/go.mod h1:6hk1eMY/u5t+Cf18q5lFMUA1Rc+Sm5I6Ra1QuPyxXCo= github.com/cockroachdb/redact v1.1.3 h1:AKZds10rFSIj7qADf0g46UixK8NNLwWTNdCIGS5wfSQ= github.com/cockroachdb/redact v1.1.3/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= -github.com/cockroachdb/sentry-go v0.6.1-cockroachdb.2/go.mod h1:8BT+cPK6xvFOcRlk0R8eg+OTkcqI6baNH4xAkpiYVvQ= +github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo= +github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ= github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0/go.mod h1:4Zcjuz89kmFXt9morQgcfYZAYZ5n8WHjt81YYWIwtTM= github.com/consensys/bavard v0.1.13 h1:oLhMLOFGTLdlda/kma4VOJazblc7IM5y5QPd2A/YjhQ= github.com/consensys/bavard v0.1.13/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI= -github.com/consensys/gnark-crypto v0.10.0 h1:zRh22SR7o4K35SoNqouS9J/TKHTyU2QWaj5ldehyXtA= -github.com/consensys/gnark-crypto v0.10.0/go.mod h1:Iq/P3HHl0ElSjsg2E1gsMwhAyxnxoKK5nVyZKd+/KhU= +github.com/consensys/gnark-crypto v0.12.1 h1:lHH39WuuFgVHONRl3J0LRBtuYdQTumFSDtJF7HpyG8M= +github.com/consensys/gnark-crypto v0.12.1/go.mod h1:v2Gy7L/4ZRosZ7Ivs+9SfUDr0f5UlG+EM5t7MPHiLuY= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/cpuguy83/go-md2man v1.0.10 h1:BSKMNlYxDvnunlTymqtgONjNnaRV1sTpcovwwjF22jk= github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= -github.com/crate-crypto/go-kzg-4844 v0.3.0 h1:UBlWE0CgyFqqzTI+IFyCzA7A3Zw4iip6uzRv5NIXG0A= -github.com/crate-crypto/go-kzg-4844 v0.3.0/go.mod h1:SBP7ikXEgDnUPONgm33HtuDZEDtWa3L4QtN1ocJSEQ4= +github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/crate-crypto/go-kzg-4844 v0.7.0 h1:C0vgZRk4q4EZ/JgPfzuSoxdCq3C3mOZMBShovmncxvA= +github.com/crate-crypto/go-kzg-4844 v0.7.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/deckarep/golang-set v1.8.0/go.mod h1:5nI87KwE7wgsBU1F4GKAw2Qod7p5kyS383rP6+o6qqo= github.com/deckarep/golang-set/v2 v2.1.0 h1:g47V4Or+DUdzbs8FxCCmgb6VYd+ptPAngjM6dtGktsI= github.com/deckarep/golang-set/v2 v2.1.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0= github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 h1:HbphB4TFFXpv7MNrT52FGrrgVXF1owhMVTHFZIlnvd4= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0/go.mod h1:DZGJHZMqrU4JJqFAWUS2UO1+lbSKsdiOoYi9Zzey7Fc= -github.com/deepmap/oapi-codegen v1.6.0/go.mod h1:ryDa9AgbELGeB+YEXE1dR53yAjHwFvE9iAUlWl9Al3M= github.com/dgraph-io/badger v1.6.0/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6psNgSztDR4= github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= @@ -94,16 +80,15 @@ github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.m github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/etcd-io/bbolt v1.3.3/go.mod h1:ZF2nL25h33cCyBtcyWeZ2/I3HQOfTP+0PIEvHjkjCrw= -github.com/ethereum/c-kzg-4844 v0.3.1 h1:sR65+68+WdnMKxseNWxSJuAv2tsUrihTpVBTfM/U5Zg= -github.com/ethereum/c-kzg-4844 v0.3.1/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= -github.com/ethereum/go-ethereum v1.13.1 h1:UF2FaUKPIy5jeZk3X06ait3y2Q4wI+vJ1l7+UARp+60= -github.com/ethereum/go-ethereum v1.13.1/go.mod h1:xHQKzwkHSl0gnSjZK1mWa06XEdm9685AHqhRknOzqGQ= -github.com/ethereum/hive v0.0.0-20230313141339-8e3200bfc09e h1:3g9cqRqpbZ92tSlGL4PfFoq435axKw6HiZ1Gz3fOkfk= -github.com/ethereum/hive v0.0.0-20230313141339-8e3200bfc09e/go.mod h1:PlpDuxHg6q1jU0K8Ouf+RXlHguignJ7k8Eyukc9RCPQ= +github.com/ethereum/c-kzg-4844 v0.4.0 h1:3MS1s4JtA868KpJxroZoepdV0ZKBp3u/O5HcZ7R3nlY= +github.com/ethereum/c-kzg-4844 v0.4.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= +github.com/ethereum/go-ethereum v1.13.5-0.20231031113925-bc42e88415d3 h1:i4TE0DmzMYcr2IiCdlTGGk+7Q/EzXvBKbbG4uRxMjJ0= +github.com/ethereum/go-ethereum v1.13.5-0.20231031113925-bc42e88415d3/go.mod h1:yMTu38GSuyxaYzQMViqNmQ1s3cE84abZexQmTgenWk0= +github.com/ethereum/hive v0.0.0-20240319152821-ae224371b4e5 h1:2Rc3v1mqWgUl8gSHFh7+FmVcyB1AI/9THxhEDjNK+PI= +github.com/ethereum/hive v0.0.0-20240319152821-ae224371b4e5/go.mod h1:MGwUXPGco6YS3brOf5WEILfUnnUL/XuX1224ab3D7XA= github.com/ethereum/hive/simulators/eth2/common v0.0.0-20230316220410-1364352c32a6 h1:LcSUNGwQuJyR/gdPcsif57yKX+3MyhpoAuChzR8k6Yk= github.com/ethereum/hive/simulators/eth2/common v0.0.0-20230316220410-1364352c32a6/go.mod h1:FX4oxNyTNw/P+TUWrb7vva7o/rFI0pHO7OYdtG6EtN4= github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072/go.mod h1:duJ4Jxv5lDcvg4QuQr0oowTf7dz4/CR8NtyCooz9HL8= -github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= github.com/ferranbt/fastssz v0.1.2 h1:Dky6dXlngF6Qjc+EfDipAkE83N5I5DE68bY6O0VLNPk= github.com/ferranbt/fastssz v0.1.2/go.mod h1:X5UPrE2u1UJjxHA8X54u04SBwdAQjG2sFtWs39YxyWs= @@ -113,6 +98,7 @@ github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMo github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= +github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= github.com/gavv/httpexpect v2.0.0+incompatible/go.mod h1:x+9tiU1YnrOvnB725RkpoLv1M62hOWzwo5OXotisrKc= github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08 h1:f6D9Hr8xV8uYKlyuj8XIruxlh9WjVjdh1gIicAS7ays= github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= @@ -124,11 +110,10 @@ github.com/gin-gonic/gin v1.4.0/go.mod h1:OW2EZn3DO8Ln9oIKOvM++LBO+5UPHJJDH72/q/ github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= -github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= +github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab/go.mod h1:/P9AEU963A2AYjv4d1V5eVL1CQbEJq6aCNHDDjibzu8= github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= -github.com/go-sourcemap/sourcemap v2.1.3+incompatible/go.mod h1:F8jJfvm2KbVjc5NqelyYJmf/v5J0dwNLS2mL4sNA1Jg= github.com/go-stack/stack v1.8.1 h1:ntEHSVwIt7PNXNpgPmVfMrNhLtgjlmnZha2kOpuRiDw= github.com/go-stack/stack v1.8.1/go.mod h1:dcoOX6HbPZSZptuspn9bctJ+N/CnF5gGygcUP3XYfe4= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= @@ -160,8 +145,9 @@ github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvq github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= +github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXiurYmW7fx4GZkL8feAMVq7nEjURHk= @@ -173,22 +159,21 @@ github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMyw github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/gofuzz v1.1.1-0.20200604201612-c04b05f3adfa/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= -github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= +github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= +github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/graph-gophers/graphql-go v1.3.0/go.mod h1:9CQHMSxwO4MprSdzoIEobiHpoLtHm77vfxsvsIN5Vuc= github.com/hashicorp/go-bexpr v0.1.11 h1:6DqdA/KBjurGby9yTY0bmkathya0lfwF2SeuubCI7dY= github.com/hashicorp/go-bexpr v0.1.11/go.mod h1:f03lAo0duBlDIUMGCuad8oLcgejw4m7U+N8T+6Kz1AE= github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= @@ -196,6 +181,7 @@ github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T github.com/herumi/bls-eth-go-binary v1.28.1 h1:fcIZ48y5EE9973k05XjE8+P3YiQgjZz4JI/YabAm8KA= github.com/herumi/bls-eth-go-binary v1.28.1/go.mod h1:luAnRm3OsMQeokhGzpYmc0ZKwawY7o87PUEP11Z7r7U= github.com/holiman/billy v0.0.0-20230718173358-1c7e68d277a7 h1:3JQNjnMRil1yD0IfZKHF9GxxWKDJGj8I0IqOUol//sw= +github.com/holiman/billy v0.0.0-20230718173358-1c7e68d277a7/go.mod h1:5GuXa7vkL8u9FkFuWdVvfR5ix8hRB7DbOAaYULamFpc= github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao= github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA= github.com/holiman/uint256 v1.2.0/go.mod h1:y4ga/t+u+Xwd7CpDgZESaRcWy0I7XMlTMA25ApIH5Jw= @@ -203,12 +189,11 @@ github.com/holiman/uint256 v1.2.3 h1:K8UWO1HUJpRMXBxbmaY1Y8IAMZC/RsKB+ArEnnK4l5o github.com/holiman/uint256 v1.2.3/go.mod h1:SC8Ryt4n+UBbPbIBKaG9zbbDlp4jOru9xFZmPzLUTxw= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/huin/goupnp v1.3.0 h1:UvLUlWDNpoUdYzb2TCn+MuTWtcjXKSza2n6CBdQ0xXc= +github.com/huin/goupnp v1.3.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8= github.com/hydrogen18/memlistener v0.0.0-20200120041712-dcc25e7acd91/go.mod h1:qEIFzExnS6016fRpRfxrExeVn2gbClQA99gQhnIcdhE= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/imkira/go-interpol v1.1.0/go.mod h1:z0h2/2T3XF8kyEPpRgJ3kmNv+C43p+I/CoI+jC3w2iA= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/influxdata/influxdb-client-go/v2 v2.4.0/go.mod h1:vLNHdxTJkIf2mSLvGrpj8TCcISApPoXkaxP8g9uRlW8= -github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo= github.com/iris-contrib/blackfriday v2.0.0+incompatible/go.mod h1:UzZ2bDEoaSGPbkg6SAB4att1aAwTmVIx/5gCVqeyUdI= github.com/iris-contrib/go.uuid v2.0.0+incompatible/go.mod h1:iz2lgM/1UnEf1kP0L/+fafWORmlnuysV2EMP8MW+qe0= github.com/iris-contrib/jade v1.1.3/go.mod h1:H/geBymxJhShH5kecoiOCSssPX7QWYH7UaeZTSWddIk= @@ -216,10 +201,8 @@ github.com/iris-contrib/pongo2 v0.0.1/go.mod h1:Ssh+00+3GAZqSQb30AvBRNxBx7rf0Gqw github.com/iris-contrib/schema v0.0.1/go.mod h1:urYA3uvUNG1TIIjOSCzHr9/LmbQo8LrOcOqfqxa4hXw= github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= -github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.3.0 h1:U0609e9tgbseu3rBINet9P48AI/D3oJs4dN7jwJOQ1U= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= @@ -255,9 +238,9 @@ github.com/labstack/echo/v4 v4.5.0/go.mod h1:czIriw4a0C1dFun+ObrXp7ok03xON0N1awS github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c= github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= +github.com/lithammer/dedent v1.1.0 h1:VNzHMVCBNG1j0fh3OrsFRkVUwStdDArbgBWoPAffktY= +github.com/lithammer/dedent v1.1.0/go.mod h1:jrXYCQtgg0nJiN+StA2KgR7w6CiQNv9Fd/Z9BP0jIOc= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/marioevz/eth-clients v0.0.0-20230925172743-e379ee1ecd6e h1:uBr6Gn5jBHnyoS34HV4GOiYjuua6J/F2FST0T6MO89E= -github.com/marioevz/eth-clients v0.0.0-20230925172743-e379ee1ecd6e/go.mod h1:YVrdn57Q3rAzm3wus4T9tg1vMPca4csVbzorPhkGCW0= github.com/marioevz/eth-clients v0.0.0-20230925201418-d5fbddd99b76 h1:fj+aeR3YLmSRUWjOGgTxNMdvzm72J5JbKGKosNO/jkE= github.com/marioevz/eth-clients v0.0.0-20230925201418-d5fbddd99b76/go.mod h1:YVrdn57Q3rAzm3wus4T9tg1vMPca4csVbzorPhkGCW0= github.com/marioevz/eth2api v0.0.0-20230922201437-72bd1301e033 h1:sn57n+lbJrLS8FKYs08W7TEzraTGOCQGrSC4hni6rYw= @@ -266,12 +249,15 @@ github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVc github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.11/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= -github.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peKQ= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng= +github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.14 h1:+xnbZSEeDbOIg5/mE6JF0w6n9duR1l3/WmbinWVwUuU= github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= @@ -297,11 +283,7 @@ github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/moul/http2curl v1.0.0/go.mod h1:8UbvGypXm98wA/IqH45anm5Y2Z6ep6O31QGOAZ3H0fQ= -github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/naoina/go-stringutil v0.1.0/go.mod h1:XJ2SJL9jCtBh+P9q5btrd/Ylo8XwT/h1USek5+NqSA0= -github.com/naoina/toml v0.1.2-0.20170918210437-9fafd6967416/go.mod h1:NBIhNtsFMo3G2szEBne+bO4gS192HuIYRqfvOWb4i1E= github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= @@ -323,9 +305,7 @@ github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1y github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= github.com/onsi/gomega v1.19.0 h1:4ieX6qQjPP/BfC3mpsAtIGGlxTWPeA3Inl/7DtXw1tw= github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= -github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/peterh/liner v1.1.1-0.20190123174540-a2c9a5303de7/go.mod h1:CRroGNssyjTd/qIG2FyxByd2S8JEAZXBl4qUrZf8GS0= github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= @@ -354,6 +334,7 @@ github.com/protolambda/zrnt v0.30.0/go.mod h1:qcdX9CXFeVNCQK/q0nswpzhd+31RHMk2Ax github.com/protolambda/ztyp v0.2.2 h1:rVcL3vBu9W/aV646zF6caLS/dyn9BN8NYiuJzicLNyY= github.com/protolambda/ztyp v0.2.2/go.mod h1:9bYgKGqg3wJqT9ac1gI2hnVb0STQq7p/1lapqrqY1dU= github.com/prysmaticlabs/gohashtree v0.0.1-alpha.0.20220714111606-acbb2962fb48 h1:cSo6/vk8YpvkLbk9v3FO97cakNmUoxwi2KMP8hd5WIw= +github.com/prysmaticlabs/gohashtree v0.0.1-alpha.0.20220714111606-acbb2962fb48/go.mod h1:4pWaT30XoEx1j8KNJf3TV+E3mQkaufn7mf+jRNb/Fuk= github.com/rauljordan/engine-proxy v0.0.0-20230316220057-4c80c36c4c3a h1:ZIfMLprHVdo2vs3WcSqSDEyz2ZsSzDhGeOyxh8VQThA= github.com/rauljordan/engine-proxy v0.0.0-20230316220057-4c80c36c4c3a/go.mod h1:9OVXfWYnIV+wj1/SqfdREmE5mzN/OANAgdOJRtFtvpo= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= @@ -364,17 +345,19 @@ github.com/rogpeppe/go-internal v1.8.1/go.mod h1:JeRgkft04UBgHMgCIwADu4Pn6Mtm5d4 github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/rs/cors v1.8.2 h1:KCooALfAYGs415Cwu5ABvv9n9509fSiG5SQJn/AQo4U= +github.com/rs/cors v1.8.2/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/russross/blackfriday v1.5.2 h1:HyvC0ARfnZBqnXwABFeSZHpKvJHJJfPz81GNueLj0oo= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/schollz/closestmatch v2.1.0+incompatible/go.mod h1:RtP1ddjLong6gTkbtmuhtR2uUrrJOpYzYRvbcPAid+g= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI= github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0= -github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= +github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= @@ -384,6 +367,7 @@ github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb6 github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= github.com/status-im/keycard-go v0.2.0 h1:QDLFswOQu1r5jsycloeQh3bVU8n/NatHHaZobtDnDzA= +github.com/status-im/keycard-go v0.2.0/go.mod h1:wlp8ZLbsmrF6g6WjugPAx+IzoLrkdf9+mHxBEeo3Hbg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= @@ -391,7 +375,8 @@ github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81P github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= -github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/supranational/blst v0.3.11 h1:LyU6FolezeWAhvQk0k6O/d49jqgO52MSDDfYgbeoEm4= github.com/supranational/blst v0.3.11/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a h1:1ur3QoCqvE5fl+nylMaIr9PVV1w343YRDtsy+Rwu7XI= @@ -407,6 +392,7 @@ github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVM github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= github.com/urfave/cli/v2 v2.25.7 h1:VAzn5oq403l5pHjc4OhD54+XGO9cdKVL/7lDjF+iKUs= +github.com/urfave/cli/v2 v2.25.7/go.mod h1:8qnjx1vcq5s2/wpsqoZFndg2CE5tNFyrTvS6SinrnYQ= github.com/urfave/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/valyala/fasthttp v1.6.0/go.mod h1:FstJa9V+Pj9vQ7OJie2qMHdwemEDaDiSdBnvPM1Su9w= @@ -424,6 +410,7 @@ github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1: github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU= +github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8= github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0/go.mod h1:/LWChgwKmvncFJFHJ7Gvn9wZArjbV5/FppcK2fKk/tI= github.com/yudai/gojsondiff v1.0.0/go.mod h1:AY32+k2cwILAkW1fbgxQ5mUmMiZFgLIV+FBNExI05xg= github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82/go.mod h1:lgjkn3NuSvDfVJdfcVVdX+jpBxNmX4rDAzaS45IcYoM= @@ -442,11 +429,11 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.12.0 h1:tFM/ta59kqch6LlvYnPa0yx5a83cL2nHflFhYKvv9Yk= -golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= +golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= +golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20230810033253-352e893a4cad h1:g0bG7Z4uG+OgH2QDODnjp6ggkk1bJDsINcuWmJN1iJU= -golang.org/x/exp v0.0.0-20230810033253-352e893a4cad/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc= +golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g= +golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= @@ -455,8 +442,8 @@ golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzB golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.11.0 h1:bUO06HqtnRcc/7l71XBe4WcqTZ+3AH1J59zWDDwLKgU= -golang.org/x/mod v0.11.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc= +golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -478,7 +465,8 @@ golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT golang.org/x/net v0.0.0-20211008194852-3b03d305991f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M= +golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= +golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -520,14 +508,16 @@ golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220405052023-b1e9470b6e64/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= +golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -536,10 +526,11 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc= -golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= +golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= +golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181221001348-537d06c36207/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -554,8 +545,8 @@ golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roY golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.9.1 h1:8WMNJAz3zrtPmnYC7ISf5dEn3MT0gY7jBJfw27yrrLo= -golang.org/x/tools v0.9.1/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc= +golang.org/x/tools v0.13.0 h1:Iey4qkscZuv0VvIt8E0neZjtPVQFSc870HQ448QgEmQ= +golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -585,9 +576,8 @@ google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpAD google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= -google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= +google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= +google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -598,10 +588,11 @@ gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMy gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= gopkg.in/go-playground/validator.v8 v8.18.2/go.mod h1:RX2a/7Ha8BgOhfk7j780h4/u/RRjR0eouCJSH80/M2Y= gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1 h1:iiHuQZCNgYPmFQxd3BBN/Nc5+dAwzZuq5y40s20oQw0= +gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= gopkg.in/ini.v1 v1.51.1/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8= -gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:5AcXVHNjg+BDxry382+8OKon8SEWiKktQR07RKPsv1c= +gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= From daf50f584c706843db7c1cd10086e0a222ed3a82 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Tue, 19 Mar 2024 16:38:15 +0100 Subject: [PATCH 240/387] simulators/eth2: update go.work.sum --- simulators/eth2/go.work.sum | 170 +++++++++++++++++++++++++++++++++--- 1 file changed, 156 insertions(+), 14 deletions(-) diff --git a/simulators/eth2/go.work.sum b/simulators/eth2/go.work.sum index 60e14391d6..f5147feb09 100644 --- a/simulators/eth2/go.work.sum +++ b/simulators/eth2/go.work.sum @@ -29,58 +29,81 @@ cloud.google.com/go v0.105.0/go.mod h1:PrLgOJNe5nfE9UMxKxgXj4mD3voiP+YQ6gdt6KMFO cloud.google.com/go v0.107.0/go.mod h1:wpc2eNrD7hXUTy8EKS10jkxpZBjASrORK7goS+3YX2I= cloud.google.com/go v0.110.0/go.mod h1:SJnCLqQ0FCFGSZMUNUf84MV3Aia54kn7pi8st7tMzaY= cloud.google.com/go v0.110.2/go.mod h1:k04UEeEtb6ZBRTv3dZz4CeJC3jKGxyhl0sAiVVquxiw= +cloud.google.com/go v0.110.4/go.mod h1:+EYjdK8e5RME/VY/qLCAtuyALQ9q67dvuum8i+H5xsI= cloud.google.com/go/accessapproval v1.5.0/go.mod h1:HFy3tuiGvMdcd/u+Cu5b9NkO1pEICJ46IR82PoUdplw= cloud.google.com/go/accessapproval v1.6.0/go.mod h1:R0EiYnwV5fsRFiKZkPHr6mwyk2wxUJ30nL4j2pcFY2E= +cloud.google.com/go/accessapproval v1.7.1/go.mod h1:JYczztsHRMK7NTXb6Xw+dwbs/WnOJxbo/2mTI+Kgg68= cloud.google.com/go/accesscontextmanager v1.4.0/go.mod h1:/Kjh7BBu/Gh83sv+K60vN9QE5NJcd80sU33vIe2IFPE= cloud.google.com/go/accesscontextmanager v1.7.0/go.mod h1:CEGLewx8dwa33aDAZQujl7Dx+uYhS0eay198wB/VumQ= +cloud.google.com/go/accesscontextmanager v1.8.1/go.mod h1:JFJHfvuaTC+++1iL1coPiG1eu5D24db2wXCDWDjIrxo= cloud.google.com/go/aiplatform v1.27.0/go.mod h1:Bvxqtl40l0WImSb04d0hXFU7gDOiq9jQmorivIiWcKg= cloud.google.com/go/aiplatform v1.37.0/go.mod h1:IU2Cv29Lv9oCn/9LkFiiuKfwrRTq+QQMbW+hPCxJGZw= +cloud.google.com/go/aiplatform v1.45.0/go.mod h1:Iu2Q7sC7QGhXUeOhAj/oCK9a+ULz1O4AotZiqjQ8MYA= cloud.google.com/go/analytics v0.12.0/go.mod h1:gkfj9h6XRf9+TS4bmuhPEShsh3hH8PAZzm/41OOhQd4= cloud.google.com/go/analytics v0.19.0/go.mod h1:k8liqf5/HCnOUkbawNtrWWc+UAzyDlW89doe8TtoDsE= +cloud.google.com/go/analytics v0.21.2/go.mod h1:U8dcUtmDmjrmUTnnnRnI4m6zKn/yaA5N9RlEkYFHpQo= cloud.google.com/go/apigateway v1.4.0/go.mod h1:pHVY9MKGaH9PQ3pJ4YLzoj6U5FUDeDFBllIz7WmzJoc= cloud.google.com/go/apigateway v1.5.0/go.mod h1:GpnZR3Q4rR7LVu5951qfXPJCHquZt02jf7xQx7kpqN8= +cloud.google.com/go/apigateway v1.6.1/go.mod h1:ufAS3wpbRjqfZrzpvLC2oh0MFlpRJm2E/ts25yyqmXA= cloud.google.com/go/apigeeconnect v1.4.0/go.mod h1:kV4NwOKqjvt2JYR0AoIWo2QGfoRtn/pkS3QlHp0Ni04= cloud.google.com/go/apigeeconnect v1.5.0/go.mod h1:KFaCqvBRU6idyhSNyn3vlHXc8VMDJdRmwDF6JyFRqZ8= +cloud.google.com/go/apigeeconnect v1.6.1/go.mod h1:C4awq7x0JpLtrlQCr8AzVIzAaYgngRqWf9S5Uhg+wWs= cloud.google.com/go/apigeeregistry v0.6.0/go.mod h1:BFNzW7yQVLZ3yj0TKcwzb8n25CFBri51GVGOEUcgQsc= +cloud.google.com/go/apigeeregistry v0.7.1/go.mod h1:1XgyjZye4Mqtw7T9TsY4NW10U7BojBvG4RMD+vRDrIw= cloud.google.com/go/apikeys v0.6.0/go.mod h1:kbpXu5upyiAlGkKrJgQl8A0rKNNJ7dQ377pdroRSSi8= cloud.google.com/go/appengine v1.5.0/go.mod h1:TfasSozdkFI0zeoxW3PTBLiNqRmzraodCWatWI9Dmak= cloud.google.com/go/appengine v1.7.1/go.mod h1:IHLToyb/3fKutRysUlFO0BPt5j7RiQ45nrzEJmKTo6E= +cloud.google.com/go/appengine v1.8.1/go.mod h1:6NJXGLVhZCN9aQ/AEDvmfzKEfoYBlfB80/BHiKVputY= cloud.google.com/go/area120 v0.6.0/go.mod h1:39yFJqWVgm0UZqWTOdqkLhjoC7uFfgXRC8g/ZegeAh0= cloud.google.com/go/area120 v0.7.1/go.mod h1:j84i4E1RboTWjKtZVWXPqvK5VHQFJRF2c1Nm69pWm9k= +cloud.google.com/go/area120 v0.8.1/go.mod h1:BVfZpGpB7KFVNxPiQBuHkX6Ed0rS51xIgmGyjrAfzsg= cloud.google.com/go/artifactregistry v1.9.0/go.mod h1:2K2RqvA2CYvAeARHRkLDhMDJ3OXy26h3XW+3/Jh2uYc= cloud.google.com/go/artifactregistry v1.13.0/go.mod h1:uy/LNfoOIivepGhooAUpL1i30Hgee3Cu0l4VTWHUC08= +cloud.google.com/go/artifactregistry v1.14.1/go.mod h1:nxVdG19jTaSTu7yA7+VbWL346r3rIdkZ142BSQqhn5E= cloud.google.com/go/asset v1.10.0/go.mod h1:pLz7uokL80qKhzKr4xXGvBQXnzHn5evJAEAtZiIb0wY= cloud.google.com/go/asset v1.13.0/go.mod h1:WQAMyYek/b7NBpYq/K4KJWcRqzoalEsxz/t/dTk4THw= +cloud.google.com/go/asset v1.14.1/go.mod h1:4bEJ3dnHCqWCDbWJ/6Vn7GVI9LerSi7Rfdi03hd+WTQ= cloud.google.com/go/assuredworkloads v1.9.0/go.mod h1:kFuI1P78bplYtT77Tb1hi0FMxM0vVpRC7VVoJC3ZoT0= cloud.google.com/go/assuredworkloads v1.10.0/go.mod h1:kwdUQuXcedVdsIaKgKTp9t0UJkE5+PAVNhdQm4ZVq2E= +cloud.google.com/go/assuredworkloads v1.11.1/go.mod h1:+F04I52Pgn5nmPG36CWFtxmav6+7Q+c5QyJoL18Lry0= cloud.google.com/go/automl v1.8.0/go.mod h1:xWx7G/aPEe/NP+qzYXktoBSDfjO+vnKMGgsApGJJquM= cloud.google.com/go/automl v1.12.0/go.mod h1:tWDcHDp86aMIuHmyvjuKeeHEGq76lD7ZqfGLN6B0NuU= +cloud.google.com/go/automl v1.13.1/go.mod h1:1aowgAHWYZU27MybSCFiukPO7xnyawv7pt3zK4bheQE= cloud.google.com/go/baremetalsolution v0.4.0/go.mod h1:BymplhAadOO/eBa7KewQ0Ppg4A4Wplbn+PsFKRLo0uI= cloud.google.com/go/baremetalsolution v0.5.0/go.mod h1:dXGxEkmR9BMwxhzBhV0AioD0ULBmuLZI8CdwalUxuss= cloud.google.com/go/batch v0.4.0/go.mod h1:WZkHnP43R/QCGQsZ+0JyG4i79ranE2u8xvjq/9+STPE= cloud.google.com/go/batch v0.7.0/go.mod h1:vLZN95s6teRUqRQ4s3RLDsH8PvboqBK+rn1oevL159g= cloud.google.com/go/beyondcorp v0.3.0/go.mod h1:E5U5lcrcXMsCuoDNyGrpyTm/hn7ne941Jz2vmksAxW8= cloud.google.com/go/beyondcorp v0.5.0/go.mod h1:uFqj9X+dSfrheVp7ssLTaRHd2EHqSL4QZmH4e8WXGGU= +cloud.google.com/go/beyondcorp v0.6.1/go.mod h1:YhxDWw946SCbmcWo3fAhw3V4XZMSpQ/VYfcKGAEU8/4= cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= cloud.google.com/go/bigquery v1.44.0/go.mod h1:0Y33VqXTEsbamHJvJHdFmtqHvMIY28aK1+dFsvaChGc= cloud.google.com/go/bigquery v1.50.0/go.mod h1:YrleYEh2pSEbgTBZYMJ5SuSr0ML3ypjRB1zgf7pvQLU= +cloud.google.com/go/bigquery v1.52.0/go.mod h1:3b/iXjRQGU4nKa87cXeg6/gogLjO8C6PmuM8i5Bi/u4= cloud.google.com/go/bigtable v1.2.0/go.mod h1:JcVAOl45lrTmQfLj7T6TxyMzIN/3FGGcFm+2xVAli2o= cloud.google.com/go/billing v1.7.0/go.mod h1:q457N3Hbj9lYwwRbnlD7vUpyjq6u5U1RAOArInEiD5Y= cloud.google.com/go/billing v1.13.0/go.mod h1:7kB2W9Xf98hP9Sr12KfECgfGclsH3CQR0R08tnRlRbc= +cloud.google.com/go/billing v1.16.0/go.mod h1:y8vx09JSSJG02k5QxbycNRrN7FGZB6F3CAcgum7jvGA= cloud.google.com/go/binaryauthorization v1.4.0/go.mod h1:tsSPQrBd77VLplV70GUhBf/Zm3FsKmgSqgm4UmiDItk= cloud.google.com/go/binaryauthorization v1.5.0/go.mod h1:OSe4OU1nN/VswXKRBmciKpo9LulY41gch5c68htf3/Q= +cloud.google.com/go/binaryauthorization v1.6.1/go.mod h1:TKt4pa8xhowwffiBmbrbcxijJRZED4zrqnwZ1lKH51U= cloud.google.com/go/certificatemanager v1.4.0/go.mod h1:vowpercVFyqs8ABSmrdV+GiFf2H/ch3KyudYQEMM590= cloud.google.com/go/certificatemanager v1.6.0/go.mod h1:3Hh64rCKjRAX8dXgRAyOcY5vQ/fE1sh8o+Mdd6KPgY8= +cloud.google.com/go/certificatemanager v1.7.1/go.mod h1:iW8J3nG6SaRYImIa+wXQ0g8IgoofDFRp5UMzaNk1UqI= cloud.google.com/go/channel v1.9.0/go.mod h1:jcu05W0my9Vx4mt3/rEHpfxc9eKi9XwsdDL8yBMbKUk= cloud.google.com/go/channel v1.12.0/go.mod h1:VkxCGKASi4Cq7TbXxlaBezonAYpp1GCnKMY6tnMQnLU= +cloud.google.com/go/channel v1.16.0/go.mod h1:eN/q1PFSl5gyu0dYdmxNXscY/4Fi7ABmeHCJNf/oHmc= cloud.google.com/go/cloudbuild v1.4.0/go.mod h1:5Qwa40LHiOXmz3386FrjrYM93rM/hdRr7b53sySrTqA= cloud.google.com/go/cloudbuild v1.9.0/go.mod h1:qK1d7s4QlO0VwfYn5YuClDGg2hfmLZEb4wQGAbIgL1s= +cloud.google.com/go/cloudbuild v1.10.1/go.mod h1:lyJg7v97SUIPq4RC2sGsz/9tNczhyv2AjML/ci4ulzU= cloud.google.com/go/clouddms v1.4.0/go.mod h1:Eh7sUGCC+aKry14O1NRljhjyrr0NFC0G2cjwX0cByRk= cloud.google.com/go/clouddms v1.5.0/go.mod h1:QSxQnhikCLUw13iAbffF2CZxAER3xDGNHjsTAkQJcQA= +cloud.google.com/go/clouddms v1.6.1/go.mod h1:Ygo1vL52Ov4TBZQquhz5fiw2CQ58gvu+PlS6PVXCpZI= cloud.google.com/go/cloudtasks v1.8.0/go.mod h1:gQXUIwCSOI4yPVK7DgTVFiiP0ZW/eQkydWzwVMdHxrI= cloud.google.com/go/cloudtasks v1.10.0/go.mod h1:NDSoTLkZ3+vExFEWu2UJV1arUyzVDAiZtdWcsUyNwBs= +cloud.google.com/go/cloudtasks v1.11.1/go.mod h1:a9udmnou9KO2iulGscKR0qBYjreuX8oHwpmFsKspEvM= cloud.google.com/go/compute v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M= @@ -97,207 +120,294 @@ cloud.google.com/go/compute v1.19.0/go.mod h1:rikpw2y+UMidAe9tISo04EHNOIf42RLYF/ cloud.google.com/go/compute v1.19.1/go.mod h1:6ylj3a05WF8leseCdIf77NK0g1ey+nj5IKd5/kvShxE= cloud.google.com/go/compute v1.19.3/go.mod h1:qxvISKp/gYnXkSAD1ppcSOveRAmzxicEv/JlizULFrI= cloud.google.com/go/compute v1.20.1/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM= +cloud.google.com/go/compute v1.21.0/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM= cloud.google.com/go/compute/metadata v0.2.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= cloud.google.com/go/compute/metadata v0.2.1/go.mod h1:jgHgmJd2RKBGzXqF5LR2EZMGxBkeanZ9wwa75XHJgOM= cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= cloud.google.com/go/contactcenterinsights v1.4.0/go.mod h1:L2YzkGbPsv+vMQMCADxJoT9YiTTnSEd6fEvCeHTYVck= cloud.google.com/go/contactcenterinsights v1.6.0/go.mod h1:IIDlT6CLcDoyv79kDv8iWxMSTZhLxSCofVV5W6YFM/w= +cloud.google.com/go/contactcenterinsights v1.9.1/go.mod h1:bsg/R7zGLYMVxFFzfh9ooLTruLRCG9fnzhH9KznHhbM= cloud.google.com/go/container v1.7.0/go.mod h1:Dp5AHtmothHGX3DwwIHPgq45Y8KmNsgN3amoYfxVkLo= cloud.google.com/go/container v1.15.0/go.mod h1:ft+9S0WGjAyjDggg5S06DXj+fHJICWg8L7isCQe9pQA= +cloud.google.com/go/container v1.22.1/go.mod h1:lTNExE2R7f+DLbAN+rJiKTisauFCaoDq6NURZ83eVH4= cloud.google.com/go/containeranalysis v0.6.0/go.mod h1:HEJoiEIu+lEXM+k7+qLCci0h33lX3ZqoYFdmPcoO7s4= cloud.google.com/go/containeranalysis v0.9.0/go.mod h1:orbOANbwk5Ejoom+s+DUCTTJ7IBdBQJDcSylAx/on9s= +cloud.google.com/go/containeranalysis v0.10.1/go.mod h1:Ya2jiILITMY68ZLPaogjmOMNkwsDrWBSTyBubGXO7j0= cloud.google.com/go/datacatalog v1.8.0/go.mod h1:KYuoVOv9BM8EYz/4eMFxrr4DUKhGIOXxZoKYF5wdISM= cloud.google.com/go/datacatalog v1.13.0/go.mod h1:E4Rj9a5ZtAxcQJlEBTLgMTphfP11/lNaAshpoBgemX8= +cloud.google.com/go/datacatalog v1.14.1/go.mod h1:d2CevwTG4yedZilwe+v3E3ZBDRMobQfSG/a6cCCN5R4= cloud.google.com/go/dataflow v0.7.0/go.mod h1:PX526vb4ijFMesO1o202EaUmouZKBpjHsTlCtB4parQ= cloud.google.com/go/dataflow v0.8.0/go.mod h1:Rcf5YgTKPtQyYz8bLYhFoIV/vP39eL7fWNcSOyFfLJE= +cloud.google.com/go/dataflow v0.9.1/go.mod h1:Wp7s32QjYuQDWqJPFFlnBKhkAtiFpMTdg00qGbnIHVw= cloud.google.com/go/dataform v0.5.0/go.mod h1:GFUYRe8IBa2hcomWplodVmUx/iTL0FrsauObOM3Ipr0= cloud.google.com/go/dataform v0.7.0/go.mod h1:7NulqnVozfHvWUBpMDfKMUESr+85aJsC/2O0o3jWPDE= +cloud.google.com/go/dataform v0.8.1/go.mod h1:3BhPSiw8xmppbgzeBbmDvmSWlwouuJkXsXsb8UBih9M= cloud.google.com/go/datafusion v1.5.0/go.mod h1:Kz+l1FGHB0J+4XF2fud96WMmRiq/wj8N9u007vyXZ2w= cloud.google.com/go/datafusion v1.6.0/go.mod h1:WBsMF8F1RhSXvVM8rCV3AeyWVxcC2xY6vith3iw3S+8= +cloud.google.com/go/datafusion v1.7.1/go.mod h1:KpoTBbFmoToDExJUso/fcCiguGDk7MEzOWXUsJo0wsI= cloud.google.com/go/datalabeling v0.6.0/go.mod h1:WqdISuk/+WIGeMkpw/1q7bK/tFEZxsrFJOJdY2bXvTQ= cloud.google.com/go/datalabeling v0.7.0/go.mod h1:WPQb1y08RJbmpM3ww0CSUAGweL0SxByuW2E+FU+wXcM= +cloud.google.com/go/datalabeling v0.8.1/go.mod h1:XS62LBSVPbYR54GfYQsPXZjTW8UxCK2fkDciSrpRFdY= cloud.google.com/go/dataplex v1.4.0/go.mod h1:X51GfLXEMVJ6UN47ESVqvlsRplbLhcsAt0kZCCKsU0A= cloud.google.com/go/dataplex v1.6.0/go.mod h1:bMsomC/aEJOSpHXdFKFGQ1b0TDPIeL28nJObeO1ppRs= +cloud.google.com/go/dataplex v1.8.1/go.mod h1:7TyrDT6BCdI8/38Uvp0/ZxBslOslP2X2MPDucliyvSE= cloud.google.com/go/dataproc v1.8.0/go.mod h1:5OW+zNAH0pMpw14JVrPONsxMQYMBqJuzORhIBfBn9uI= cloud.google.com/go/dataproc v1.12.0/go.mod h1:zrF3aX0uV3ikkMz6z4uBbIKyhRITnxvr4i3IjKsKrw4= cloud.google.com/go/dataqna v0.6.0/go.mod h1:1lqNpM7rqNLVgWBJyk5NF6Uen2PHym0jtVJonplVsDA= cloud.google.com/go/dataqna v0.7.0/go.mod h1:Lx9OcIIeqCrw1a6KdO3/5KMP1wAmTc0slZWwP12Qq3c= +cloud.google.com/go/dataqna v0.8.1/go.mod h1:zxZM0Bl6liMePWsHA8RMGAfmTG34vJMapbHAxQ5+WA8= cloud.google.com/go/datastore v1.10.0/go.mod h1:PC5UzAmDEkAmkfaknstTYbNpgE49HAgW2J1gcgUfmdM= cloud.google.com/go/datastore v1.11.0/go.mod h1:TvGxBIHCS50u8jzG+AW/ppf87v1of8nwzFNgEZU1D3c= +cloud.google.com/go/datastore v1.12.1/go.mod h1:KjdB88W897MRITkvWWJrg2OUtrR5XVj1EoLgSp6/N70= cloud.google.com/go/datastream v1.5.0/go.mod h1:6TZMMNPwjUqZHBKPQ1wwXpb0d5VDVPl2/XoS5yi88q4= cloud.google.com/go/datastream v1.7.0/go.mod h1:uxVRMm2elUSPuh65IbZpzJNMbuzkcvu5CjMqVIUHrww= +cloud.google.com/go/datastream v1.9.1/go.mod h1:hqnmr8kdUBmrnk65k5wNRoHSCYksvpdZIcZIEl8h43Q= cloud.google.com/go/deploy v1.5.0/go.mod h1:ffgdD0B89tToyW/U/D2eL0jN2+IEV/3EMuXHA0l4r+s= cloud.google.com/go/deploy v1.8.0/go.mod h1:z3myEJnA/2wnB4sgjqdMfgxCA0EqC3RBTNcVPs93mtQ= +cloud.google.com/go/deploy v1.11.0/go.mod h1:tKuSUV5pXbn67KiubiUNUejqLs4f5cxxiCNCeyl0F2g= cloud.google.com/go/dialogflow v1.19.0/go.mod h1:JVmlG1TwykZDtxtTXujec4tQ+D8SBFMoosgy+6Gn0s0= cloud.google.com/go/dialogflow v1.32.0/go.mod h1:jG9TRJl8CKrDhMEcvfcfFkkpp8ZhgPz3sBGmAUYJ2qE= +cloud.google.com/go/dialogflow v1.38.0/go.mod h1:L7jnH+JL2mtmdChzAIcXQHXMvQkE3U4hTaNltEuxXn4= cloud.google.com/go/dlp v1.7.0/go.mod h1:68ak9vCiMBjbasxeVD17hVPxDEck+ExiHavX8kiHG+Q= cloud.google.com/go/dlp v1.9.0/go.mod h1:qdgmqgTyReTz5/YNSSuueR8pl7hO0o9bQ39ZhtgkWp4= +cloud.google.com/go/dlp v1.10.1/go.mod h1:IM8BWz1iJd8njcNcG0+Kyd9OPnqnRNkDV8j42VT5KOI= cloud.google.com/go/documentai v1.10.0/go.mod h1:vod47hKQIPeCfN2QS/jULIvQTugbmdc0ZvxxfQY1bg4= cloud.google.com/go/documentai v1.18.0/go.mod h1:F6CK6iUH8J81FehpskRmhLq/3VlwQvb7TvwOceQ2tbs= +cloud.google.com/go/documentai v1.20.0/go.mod h1:yJkInoMcK0qNAEdRnqY/D5asy73tnPe88I1YTZT+a8E= cloud.google.com/go/domains v0.7.0/go.mod h1:PtZeqS1xjnXuRPKE/88Iru/LdfoRyEHYA9nFQf4UKpg= cloud.google.com/go/domains v0.8.0/go.mod h1:M9i3MMDzGFXsydri9/vW+EWz9sWb4I6WyHqdlAk0idE= +cloud.google.com/go/domains v0.9.1/go.mod h1:aOp1c0MbejQQ2Pjf1iJvnVyT+z6R6s8pX66KaCSDYfE= cloud.google.com/go/edgecontainer v0.2.0/go.mod h1:RTmLijy+lGpQ7BXuTDa4C4ssxyXT34NIuHIgKuP4s5w= cloud.google.com/go/edgecontainer v1.0.0/go.mod h1:cttArqZpBB2q58W/upSG++ooo6EsblxDIolxa3jSjbY= +cloud.google.com/go/edgecontainer v1.1.1/go.mod h1:O5bYcS//7MELQZs3+7mabRqoWQhXCzenBu0R8bz2rwk= cloud.google.com/go/errorreporting v0.3.0/go.mod h1:xsP2yaAp+OAW4OIm60An2bbLpqIhKXdWR/tawvl7QzU= cloud.google.com/go/essentialcontacts v1.4.0/go.mod h1:8tRldvHYsmnBCHdFpvU+GL75oWiBKl80BiqlFh9tp+8= cloud.google.com/go/essentialcontacts v1.5.0/go.mod h1:ay29Z4zODTuwliK7SnX8E86aUF2CTzdNtvv42niCX0M= +cloud.google.com/go/essentialcontacts v1.6.2/go.mod h1:T2tB6tX+TRak7i88Fb2N9Ok3PvY3UNbUsMag9/BARh4= cloud.google.com/go/eventarc v1.8.0/go.mod h1:imbzxkyAU4ubfsaKYdQg04WS1NvncblHEup4kvF+4gw= cloud.google.com/go/eventarc v1.11.0/go.mod h1:PyUjsUKPWoRBCHeOxZd/lbOOjahV41icXyUY5kSTvVY= +cloud.google.com/go/eventarc v1.12.1/go.mod h1:mAFCW6lukH5+IZjkvrEss+jmt2kOdYlN8aMx3sRJiAI= cloud.google.com/go/filestore v1.4.0/go.mod h1:PaG5oDfo9r224f8OYXURtAsY+Fbyq/bLYoINEK8XQAI= cloud.google.com/go/filestore v1.6.0/go.mod h1:di5unNuss/qfZTw2U9nhFqo8/ZDSc466dre85Kydllg= +cloud.google.com/go/filestore v1.7.1/go.mod h1:y10jsorq40JJnjR/lQ8AfFbbcGlw3g+Dp8oN7i7FjV4= cloud.google.com/go/firestore v1.9.0/go.mod h1:HMkjKHNTtRyZNiMzu7YAsLr9K3X2udY2AMwDaMEQiiE= +cloud.google.com/go/firestore v1.11.0/go.mod h1:b38dKhgzlmNNGTNZZwe7ZRFEuRab1Hay3/DBsIGKKy4= cloud.google.com/go/functions v1.9.0/go.mod h1:Y+Dz8yGguzO3PpIjhLTbnqV1CWmgQ5UwtlpzoyquQ08= cloud.google.com/go/functions v1.13.0/go.mod h1:EU4O007sQm6Ef/PwRsI8N2umygGqPBS/IZQKBQBcJ3c= +cloud.google.com/go/functions v1.15.1/go.mod h1:P5yNWUTkyU+LvW/S9O6V+V423VZooALQlqoXdoPz5AE= cloud.google.com/go/gaming v1.8.0/go.mod h1:xAqjS8b7jAVW0KFYeRUxngo9My3f33kFmua++Pi+ggM= cloud.google.com/go/gaming v1.9.0/go.mod h1:Fc7kEmCObylSWLO334NcO+O9QMDyz+TKC4v1D7X+Bc0= cloud.google.com/go/gkebackup v0.3.0/go.mod h1:n/E671i1aOQvUxT541aTkCwExO/bTer2HDlj4TsBRAo= cloud.google.com/go/gkebackup v0.4.0/go.mod h1:byAyBGUwYGEEww7xsbnUTBHIYcOPy/PgUWUtOeRm9Vg= cloud.google.com/go/gkeconnect v0.6.0/go.mod h1:Mln67KyU/sHJEBY8kFZ0xTeyPtzbq9StAVvEULYK16A= cloud.google.com/go/gkeconnect v0.7.0/go.mod h1:SNfmVqPkaEi3bF/B3CNZOAYPYdg7sU+obZ+QTky2Myw= +cloud.google.com/go/gkeconnect v0.8.1/go.mod h1:KWiK1g9sDLZqhxB2xEuPV8V9NYzrqTUmQR9shJHpOZw= cloud.google.com/go/gkehub v0.10.0/go.mod h1:UIPwxI0DsrpsVoWpLB0stwKCP+WFVG9+y977wO+hBH0= cloud.google.com/go/gkehub v0.12.0/go.mod h1:djiIwwzTTBrF5NaXCGv3mf7klpEMcST17VBTVVDcuaw= +cloud.google.com/go/gkehub v0.14.1/go.mod h1:VEXKIJZ2avzrbd7u+zeMtW00Y8ddk/4V9511C9CQGTY= cloud.google.com/go/gkemulticloud v0.4.0/go.mod h1:E9gxVBnseLWCk24ch+P9+B2CoDFJZTyIgLKSalC7tuI= cloud.google.com/go/gkemulticloud v0.5.0/go.mod h1:W0JDkiyi3Tqh0TJr//y19wyb1yf8llHVto2Htf2Ja3Y= +cloud.google.com/go/gkemulticloud v0.6.1/go.mod h1:kbZ3HKyTsiwqKX7Yw56+wUGwwNZViRnxWK2DVknXWfw= cloud.google.com/go/grafeas v0.2.0/go.mod h1:KhxgtF2hb0P191HlY5besjYm6MqTSTj3LSI+M+ByZHc= cloud.google.com/go/gsuiteaddons v1.4.0/go.mod h1:rZK5I8hht7u7HxFQcFei0+AtfS9uSushomRlg+3ua1o= cloud.google.com/go/gsuiteaddons v1.5.0/go.mod h1:TFCClYLd64Eaa12sFVmUyG62tk4mdIsI7pAnSXRkcFo= +cloud.google.com/go/gsuiteaddons v1.6.1/go.mod h1:CodrdOqRZcLp5WOwejHWYBjZvfY0kOphkAKpF/3qdZY= cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= cloud.google.com/go/iam v0.6.0/go.mod h1:+1AH33ueBne5MzYccyMHtEKqLE4/kJOibtffMHDMFMc= cloud.google.com/go/iam v0.8.0/go.mod h1:lga0/y3iH6CX7sYqypWJ33hf7kkfXJag67naqGESjkE= cloud.google.com/go/iam v0.13.0/go.mod h1:ljOg+rcNfzZ5d6f1nAUJ8ZIxOaZUVoS14bKCtaLZ/D0= +cloud.google.com/go/iam v1.1.1/go.mod h1:A5avdyVL2tCppe4unb0951eI9jreack+RJ0/d+KUZOU= cloud.google.com/go/iap v1.5.0/go.mod h1:UH/CGgKd4KyohZL5Pt0jSKE4m3FR51qg6FKQ/z/Ix9A= cloud.google.com/go/iap v1.7.1/go.mod h1:WapEwPc7ZxGt2jFGB/C/bm+hP0Y6NXzOYGjpPnmMS74= +cloud.google.com/go/iap v1.8.1/go.mod h1:sJCbeqg3mvWLqjZNsI6dfAtbbV1DL2Rl7e1mTyXYREQ= cloud.google.com/go/ids v1.2.0/go.mod h1:5WXvp4n25S0rA/mQWAg1YEEBBq6/s+7ml1RDCW1IrcY= cloud.google.com/go/ids v1.3.0/go.mod h1:JBdTYwANikFKaDP6LtW5JAi4gubs57SVNQjemdt6xV4= +cloud.google.com/go/ids v1.4.1/go.mod h1:np41ed8YMU8zOgv53MMMoCntLTn2lF+SUzlM+O3u/jw= cloud.google.com/go/iot v1.4.0/go.mod h1:dIDxPOn0UvNDUMD8Ger7FIaTuvMkj+aGk94RPP0iV+g= cloud.google.com/go/iot v1.6.0/go.mod h1:IqdAsmE2cTYYNO1Fvjfzo9po179rAtJeVGUvkLN3rLE= +cloud.google.com/go/iot v1.7.1/go.mod h1:46Mgw7ev1k9KqK1ao0ayW9h0lI+3hxeanz+L1zmbbbk= cloud.google.com/go/kms v1.6.0/go.mod h1:Jjy850yySiasBUDi6KFUwUv2n1+o7QZFyuUJg6OgjA0= cloud.google.com/go/kms v1.10.1/go.mod h1:rIWk/TryCkR59GMC3YtHtXeLzd634lBbKenvyySAyYI= +cloud.google.com/go/kms v1.12.1/go.mod h1:c9J991h5DTl+kg7gi3MYomh12YEENGrf48ee/N/2CDM= cloud.google.com/go/language v1.8.0/go.mod h1:qYPVHf7SPoNNiCL2Dr0FfEFNil1qi3pQEyygwpgVKB8= cloud.google.com/go/language v1.9.0/go.mod h1:Ns15WooPM5Ad/5no/0n81yUetis74g3zrbeJBE+ptUY= +cloud.google.com/go/language v1.10.1/go.mod h1:CPp94nsdVNiQEt1CNjF5WkTcisLiHPyIbMhvR8H2AW0= cloud.google.com/go/lifesciences v0.6.0/go.mod h1:ddj6tSX/7BOnhxCSd3ZcETvtNr8NZ6t/iPhY2Tyfu08= cloud.google.com/go/lifesciences v0.8.0/go.mod h1:lFxiEOMqII6XggGbOnKiyZ7IBwoIqA84ClvoezaA/bo= +cloud.google.com/go/lifesciences v0.9.1/go.mod h1:hACAOd1fFbCGLr/+weUKRAJas82Y4vrL3O5326N//Wc= cloud.google.com/go/logging v1.6.1/go.mod h1:5ZO0mHHbvm8gEmeEUHrmDlTDSu5imF6MUP9OfilNXBw= cloud.google.com/go/logging v1.7.0/go.mod h1:3xjP2CjkM3ZkO73aj4ASA5wRPGGCRrPIAeNqVNkzY8M= cloud.google.com/go/longrunning v0.3.0/go.mod h1:qth9Y41RRSUE69rDcOn6DdK3HfQfsUI0YSmW3iIlLJc= cloud.google.com/go/longrunning v0.4.1/go.mod h1:4iWDqhBZ70CvZ6BfETbvam3T8FMvLK+eFj0E6AaRQTo= +cloud.google.com/go/longrunning v0.5.0/go.mod h1:0JNuqRShmscVAhIACGtskSAWtqtOoPkwP0YF1oVEchc= +cloud.google.com/go/longrunning v0.5.1/go.mod h1:spvimkwdz6SPWKEt/XBij79E9fiTkHSQl/fRUUQJYJc= cloud.google.com/go/managedidentities v1.4.0/go.mod h1:NWSBYbEMgqmbZsLIyKvxrYbtqOsxY1ZrGM+9RgDqInM= cloud.google.com/go/managedidentities v1.5.0/go.mod h1:+dWcZ0JlUmpuxpIDfyP5pP5y0bLdRwOS4Lp7gMni/LA= +cloud.google.com/go/managedidentities v1.6.1/go.mod h1:h/irGhTN2SkZ64F43tfGPMbHnypMbu4RB3yl8YcuEak= cloud.google.com/go/maps v0.1.0/go.mod h1:BQM97WGyfw9FWEmQMpZ5T6cpovXXSd1cGmFma94eubI= cloud.google.com/go/maps v0.7.0/go.mod h1:3GnvVl3cqeSvgMcpRlQidXsPYuDGQ8naBis7MVzpXsY= cloud.google.com/go/mediatranslation v0.6.0/go.mod h1:hHdBCTYNigsBxshbznuIMFNe5QXEowAuNmmC7h8pu5w= cloud.google.com/go/mediatranslation v0.7.0/go.mod h1:LCnB/gZr90ONOIQLgSXagp8XUW1ODs2UmUMvcgMfI2I= +cloud.google.com/go/mediatranslation v0.8.1/go.mod h1:L/7hBdEYbYHQJhX2sldtTO5SZZ1C1vkapubj0T2aGig= cloud.google.com/go/memcache v1.7.0/go.mod h1:ywMKfjWhNtkQTxrWxCkCFkoPjLHPW6A7WOTVI8xy3LY= cloud.google.com/go/memcache v1.9.0/go.mod h1:8oEyzXCu+zo9RzlEaEjHl4KkgjlNDaXbCQeQWlzNFJM= +cloud.google.com/go/memcache v1.10.1/go.mod h1:47YRQIarv4I3QS5+hoETgKO40InqzLP6kpNLvyXuyaA= cloud.google.com/go/metastore v1.8.0/go.mod h1:zHiMc4ZUpBiM7twCIFQmJ9JMEkDSyZS9U12uf7wHqSI= cloud.google.com/go/metastore v1.10.0/go.mod h1:fPEnH3g4JJAk+gMRnrAnoqyv2lpUCqJPWOodSaf45Eo= +cloud.google.com/go/metastore v1.11.1/go.mod h1:uZuSo80U3Wd4zi6C22ZZliOUJ3XeM/MlYi/z5OAOWRA= cloud.google.com/go/monitoring v1.8.0/go.mod h1:E7PtoMJ1kQXWxPjB6mv2fhC5/15jInuulFdYYtlcvT4= cloud.google.com/go/monitoring v1.13.0/go.mod h1:k2yMBAB1H9JT/QETjNkgdCGD9bPF712XiLTVr+cBrpw= +cloud.google.com/go/monitoring v1.15.1/go.mod h1:lADlSAlFdbqQuwwpaImhsJXu1QSdd3ojypXrFSMr2rM= cloud.google.com/go/networkconnectivity v1.7.0/go.mod h1:RMuSbkdbPwNMQjB5HBWD5MpTBnNm39iAVpC3TmsExt8= cloud.google.com/go/networkconnectivity v1.11.0/go.mod h1:iWmDD4QF16VCDLXUqvyspJjIEtBR/4zq5hwnY2X3scM= +cloud.google.com/go/networkconnectivity v1.12.1/go.mod h1:PelxSWYM7Sh9/guf8CFhi6vIqf19Ir/sbfZRUwXh92E= cloud.google.com/go/networkmanagement v1.5.0/go.mod h1:ZnOeZ/evzUdUsnvRt792H0uYEnHQEMaz+REhhzJRcf4= cloud.google.com/go/networkmanagement v1.6.0/go.mod h1:5pKPqyXjB/sgtvB5xqOemumoQNB7y95Q7S+4rjSOPYY= +cloud.google.com/go/networkmanagement v1.8.0/go.mod h1:Ho/BUGmtyEqrttTgWEe7m+8vDdK74ibQc+Be0q7Fof0= cloud.google.com/go/networksecurity v0.6.0/go.mod h1:Q5fjhTr9WMI5mbpRYEbiexTzROf7ZbDzvzCrNl14nyU= cloud.google.com/go/networksecurity v0.8.0/go.mod h1:B78DkqsxFG5zRSVuwYFRZ9Xz8IcQ5iECsNrPn74hKHU= +cloud.google.com/go/networksecurity v0.9.1/go.mod h1:MCMdxOKQ30wsBI1eI659f9kEp4wuuAueoC9AJKSPWZQ= cloud.google.com/go/notebooks v1.5.0/go.mod h1:q8mwhnP9aR8Hpfnrc5iN5IBhrXUy8S2vuYs+kBJ/gu0= cloud.google.com/go/notebooks v1.8.0/go.mod h1:Lq6dYKOYOWUCTvw5t2q1gp1lAp0zxAxRycayS0iJcqQ= +cloud.google.com/go/notebooks v1.9.1/go.mod h1:zqG9/gk05JrzgBt4ghLzEepPHNwE5jgPcHZRKhlC1A8= cloud.google.com/go/optimization v1.2.0/go.mod h1:Lr7SOHdRDENsh+WXVmQhQTrzdu9ybg0NecjHidBq6xs= cloud.google.com/go/optimization v1.3.1/go.mod h1:IvUSefKiwd1a5p0RgHDbWCIbDFgKuEdB+fPPuP0IDLI= +cloud.google.com/go/optimization v1.4.1/go.mod h1:j64vZQP7h9bO49m2rVaTVoNM0vEBEN5eKPUPbZyXOrk= cloud.google.com/go/orchestration v1.4.0/go.mod h1:6W5NLFWs2TlniBphAViZEVhrXRSMgUGDfW7vrWKvsBk= cloud.google.com/go/orchestration v1.6.0/go.mod h1:M62Bevp7pkxStDfFfTuCOaXgaaqRAga1yKyoMtEoWPQ= +cloud.google.com/go/orchestration v1.8.1/go.mod h1:4sluRF3wgbYVRqz7zJ1/EUNc90TTprliq9477fGobD8= cloud.google.com/go/orgpolicy v1.5.0/go.mod h1:hZEc5q3wzwXJaKrsx5+Ewg0u1LxJ51nNFlext7Tanwc= cloud.google.com/go/orgpolicy v1.10.0/go.mod h1:w1fo8b7rRqlXlIJbVhOMPrwVljyuW5mqssvBtU18ONc= +cloud.google.com/go/orgpolicy v1.11.1/go.mod h1:8+E3jQcpZJQliP+zaFfayC2Pg5bmhuLK755wKhIIUCE= cloud.google.com/go/osconfig v1.10.0/go.mod h1:uMhCzqC5I8zfD9zDEAfvgVhDS8oIjySWh+l4WK6GnWw= cloud.google.com/go/osconfig v1.11.0/go.mod h1:aDICxrur2ogRd9zY5ytBLV89KEgT2MKB2L/n6x1ooPw= +cloud.google.com/go/osconfig v1.12.1/go.mod h1:4CjBxND0gswz2gfYRCUoUzCm9zCABp91EeTtWXyz0tE= cloud.google.com/go/oslogin v1.7.0/go.mod h1:e04SN0xO1UNJ1M5GP0vzVBFicIe4O53FOfcixIqTyXo= cloud.google.com/go/oslogin v1.9.0/go.mod h1:HNavntnH8nzrn8JCTT5fj18FuJLFJc4NaZJtBnQtKFs= +cloud.google.com/go/oslogin v1.10.1/go.mod h1:x692z7yAue5nE7CsSnoG0aaMbNoRJRXO4sn73R+ZqAs= cloud.google.com/go/phishingprotection v0.6.0/go.mod h1:9Y3LBLgy0kDTcYET8ZH3bq/7qni15yVUoAxiFxnlSUA= cloud.google.com/go/phishingprotection v0.7.0/go.mod h1:8qJI4QKHoda/sb/7/YmMQ2omRLSLYSu9bU0EKCNI+Lk= +cloud.google.com/go/phishingprotection v0.8.1/go.mod h1:AxonW7GovcA8qdEk13NfHq9hNx5KPtfxXNeUxTDxB6I= cloud.google.com/go/policytroubleshooter v1.4.0/go.mod h1:DZT4BcRw3QoO8ota9xw/LKtPa8lKeCByYeKTIf/vxdE= cloud.google.com/go/policytroubleshooter v1.6.0/go.mod h1:zYqaPTsmfvpjm5ULxAyD/lINQxJ0DDsnWOP/GZ7xzBc= +cloud.google.com/go/policytroubleshooter v1.7.1/go.mod h1:0NaT5v3Ag1M7U5r0GfDCpUFkWd9YqpubBWsQlhanRv0= cloud.google.com/go/privatecatalog v0.6.0/go.mod h1:i/fbkZR0hLN29eEWiiwue8Pb+GforiEIBnV9yrRUOKI= cloud.google.com/go/privatecatalog v0.8.0/go.mod h1:nQ6pfaegeDAq/Q5lrfCQzQLhubPiZhSaNhIgfJlnIXs= +cloud.google.com/go/privatecatalog v0.9.1/go.mod h1:0XlDXW2unJXdf9zFz968Hp35gl/bhF4twwpXZAW50JA= cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= cloud.google.com/go/pubsub v1.27.1/go.mod h1:hQN39ymbV9geqBnfQq6Xf63yNhUAhv9CZhzp5O6qsW0= cloud.google.com/go/pubsub v1.30.0/go.mod h1:qWi1OPS0B+b5L+Sg6Gmc9zD1Y+HaM0MdUr7LsupY1P4= +cloud.google.com/go/pubsub v1.32.0/go.mod h1:f+w71I33OMyxf9VpMVcZbnG5KSUkCOUHYpFd5U1GdRc= cloud.google.com/go/pubsublite v1.5.0/go.mod h1:xapqNQ1CuLfGi23Yda/9l4bBCKz/wC3KIJ5gKcxveZg= cloud.google.com/go/pubsublite v1.7.0/go.mod h1:8hVMwRXfDfvGm3fahVbtDbiLePT3gpoiJYJY+vxWxVM= +cloud.google.com/go/pubsublite v1.8.1/go.mod h1:fOLdU4f5xldK4RGJrBMm+J7zMWNj/k4PxwEZXy39QS0= cloud.google.com/go/recaptchaenterprise v1.3.1/go.mod h1:OdD+q+y4XGeAlxRaMn1Y7/GveP6zmq76byL6tjPE7d4= cloud.google.com/go/recaptchaenterprise/v2 v2.5.0/go.mod h1:O8LzcHXN3rz0j+LBC91jrwI3R+1ZSZEWrfL7XHgNo9U= cloud.google.com/go/recaptchaenterprise/v2 v2.7.0/go.mod h1:19wVj/fs5RtYtynAPJdDTb69oW0vNHYDBTbB4NvMD9c= +cloud.google.com/go/recaptchaenterprise/v2 v2.7.2/go.mod h1:kR0KjsJS7Jt1YSyWFkseQ756D45kaYNTlDPPaRAvDBU= cloud.google.com/go/recommendationengine v0.6.0/go.mod h1:08mq2umu9oIqc7tDy8sx+MNJdLG0fUi3vaSVbztHgJ4= cloud.google.com/go/recommendationengine v0.7.0/go.mod h1:1reUcE3GIu6MeBz/h5xZJqNLuuVjNg1lmWMPyjatzac= +cloud.google.com/go/recommendationengine v0.8.1/go.mod h1:MrZihWwtFYWDzE6Hz5nKcNz3gLizXVIDI/o3G1DLcrE= cloud.google.com/go/recommender v1.8.0/go.mod h1:PkjXrTT05BFKwxaUxQmtIlrtj0kph108r02ZZQ5FE70= cloud.google.com/go/recommender v1.9.0/go.mod h1:PnSsnZY7q+VL1uax2JWkt/UegHssxjUVVCrX52CuEmQ= +cloud.google.com/go/recommender v1.10.1/go.mod h1:XFvrE4Suqn5Cq0Lf+mCP6oBHD/yRMA8XxP5sb7Q7gpA= cloud.google.com/go/redis v1.10.0/go.mod h1:ThJf3mMBQtW18JzGgh41/Wld6vnDDc/F/F35UolRZPM= cloud.google.com/go/redis v1.11.0/go.mod h1:/X6eicana+BWcUda5PpwZC48o37SiFVTFSs0fWAJ7uQ= +cloud.google.com/go/redis v1.13.1/go.mod h1:VP7DGLpE91M6bcsDdMuyCm2hIpB6Vp2hI090Mfd1tcg= cloud.google.com/go/resourcemanager v1.4.0/go.mod h1:MwxuzkumyTX7/a3n37gmsT3py7LIXwrShilPh3P1tR0= cloud.google.com/go/resourcemanager v1.7.0/go.mod h1:HlD3m6+bwhzj9XCouqmeiGuni95NTrExfhoSrkC/3EI= +cloud.google.com/go/resourcemanager v1.9.1/go.mod h1:dVCuosgrh1tINZ/RwBufr8lULmWGOkPS8gL5gqyjdT8= cloud.google.com/go/resourcesettings v1.4.0/go.mod h1:ldiH9IJpcrlC3VSuCGvjR5of/ezRrOxFtpJoJo5SmXg= cloud.google.com/go/resourcesettings v1.5.0/go.mod h1:+xJF7QSG6undsQDfsCJyqWXyBwUoJLhetkRMDRnIoXA= +cloud.google.com/go/resourcesettings v1.6.1/go.mod h1:M7mk9PIZrC5Fgsu1kZJci6mpgN8o0IUzVx3eJU3y4Jw= cloud.google.com/go/retail v1.11.0/go.mod h1:MBLk1NaWPmh6iVFSz9MeKG/Psyd7TAgm6y/9L2B4x9Y= cloud.google.com/go/retail v1.12.0/go.mod h1:UMkelN/0Z8XvKymXFbD4EhFJlYKRx1FGhQkVPU5kF14= +cloud.google.com/go/retail v1.14.1/go.mod h1:y3Wv3Vr2k54dLNIrCzenyKG8g8dhvhncT2NcNjb/6gE= cloud.google.com/go/run v0.3.0/go.mod h1:TuyY1+taHxTjrD0ZFk2iAR+xyOXEA0ztb7U3UNA0zBo= cloud.google.com/go/run v0.9.0/go.mod h1:Wwu+/vvg8Y+JUApMwEDfVfhetv30hCG4ZwDR/IXl2Qg= cloud.google.com/go/scheduler v1.7.0/go.mod h1:jyCiBqWW956uBjjPMMuX09n3x37mtyPJegEWKxRsn44= cloud.google.com/go/scheduler v1.9.0/go.mod h1:yexg5t+KSmqu+njTIh3b7oYPheFtBWGcbVUYF1GGMIc= +cloud.google.com/go/scheduler v1.10.1/go.mod h1:R63Ldltd47Bs4gnhQkmNDse5w8gBRrhObZ54PxgR2Oo= cloud.google.com/go/secretmanager v1.9.0/go.mod h1:b71qH2l1yHmWQHt9LC80akm86mX8AL6X1MA01dW8ht4= cloud.google.com/go/secretmanager v1.10.0/go.mod h1:MfnrdvKMPNra9aZtQFvBcvRU54hbPD8/HayQdlUgJpU= +cloud.google.com/go/secretmanager v1.11.1/go.mod h1:znq9JlXgTNdBeQk9TBW/FnR/W4uChEKGeqQWAJ8SXFw= cloud.google.com/go/security v1.10.0/go.mod h1:QtOMZByJVlibUT2h9afNDWRZ1G96gVywH8T5GUSb9IA= cloud.google.com/go/security v1.13.0/go.mod h1:Q1Nvxl1PAgmeW0y3HTt54JYIvUdtcpYKVfIB8AOMZ+0= +cloud.google.com/go/security v1.15.1/go.mod h1:MvTnnbsWnehoizHi09zoiZob0iCHVcL4AUBj76h9fXA= cloud.google.com/go/securitycenter v1.16.0/go.mod h1:Q9GMaLQFUD+5ZTabrbujNWLtSLZIZF7SAR0wWECrjdk= cloud.google.com/go/securitycenter v1.19.0/go.mod h1:LVLmSg8ZkkyaNy4u7HCIshAngSQ8EcIRREP3xBnyfag= +cloud.google.com/go/securitycenter v1.23.0/go.mod h1:8pwQ4n+Y9WCWM278R8W3nF65QtY172h4S8aXyI9/hsQ= cloud.google.com/go/servicecontrol v1.5.0/go.mod h1:qM0CnXHhyqKVuiZnGKrIurvVImCs8gmqWsDoqe9sU1s= cloud.google.com/go/servicecontrol v1.11.1/go.mod h1:aSnNNlwEFBY+PWGQ2DoM0JJ/QUXqV5/ZD9DOLB7SnUk= cloud.google.com/go/servicedirectory v1.7.0/go.mod h1:5p/U5oyvgYGYejufvxhgwjL8UVXjkuw7q5XcG10wx1U= cloud.google.com/go/servicedirectory v1.9.0/go.mod h1:29je5JjiygNYlmsGz8k6o+OZ8vd4f//bQLtvzkPPT/s= +cloud.google.com/go/servicedirectory v1.10.1/go.mod h1:Xv0YVH8s4pVOwfM/1eMTl0XJ6bzIOSLDt8f8eLaGOxQ= cloud.google.com/go/servicemanagement v1.5.0/go.mod h1:XGaCRe57kfqu4+lRxaFEAuqmjzF0r+gWHjWqKqBvKFo= cloud.google.com/go/servicemanagement v1.8.0/go.mod h1:MSS2TDlIEQD/fzsSGfCdJItQveu9NXnUniTrq/L8LK4= cloud.google.com/go/serviceusage v1.4.0/go.mod h1:SB4yxXSaYVuUBYUml6qklyONXNLt83U0Rb+CXyhjEeU= cloud.google.com/go/serviceusage v1.6.0/go.mod h1:R5wwQcbOWsyuOfbP9tGdAnCAc6B9DRwPG1xtWMDeuPA= cloud.google.com/go/shell v1.4.0/go.mod h1:HDxPzZf3GkDdhExzD/gs8Grqk+dmYcEjGShZgYa9URw= cloud.google.com/go/shell v1.6.0/go.mod h1:oHO8QACS90luWgxP3N9iZVuEiSF84zNyLytb+qE2f9A= +cloud.google.com/go/shell v1.7.1/go.mod h1:u1RaM+huXFaTojTbW4g9P5emOrrmLE69KrxqQahKn4g= cloud.google.com/go/spanner v1.41.0/go.mod h1:MLYDBJR/dY4Wt7ZaMIQ7rXOTLjYrmxLE/5ve9vFfWos= cloud.google.com/go/spanner v1.45.0/go.mod h1:FIws5LowYz8YAE1J8fOS7DJup8ff7xJeetWEo5REA2M= +cloud.google.com/go/spanner v1.47.0/go.mod h1:IXsJwVW2j4UKs0eYDqodab6HgGuA1bViSqW4uH9lfUI= cloud.google.com/go/speech v1.9.0/go.mod h1:xQ0jTcmnRFFM2RfX/U+rk6FQNUF6DQlydUSyoooSpco= cloud.google.com/go/speech v1.15.0/go.mod h1:y6oH7GhqCaZANH7+Oe0BhgIogsNInLlz542tg3VqeYI= +cloud.google.com/go/speech v1.17.1/go.mod h1:8rVNzU43tQvxDaGvqOhpDqgkJTFowBpDvCJ14kGlJYo= cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= cloud.google.com/go/storage v1.22.1/go.mod h1:S8N1cAStu7BOeFfE8KAQzmyyLkK8p/vmRq6kuBTW58Y= cloud.google.com/go/storage v1.27.0/go.mod h1:x9DOL8TK/ygDUMieqwfhdpQryTeEkhGKMi80i/iqR2s= cloud.google.com/go/storage v1.29.0/go.mod h1:4puEjyTKnku6gfKoTfNOU/W+a9JyuVNxjpS5GBrB8h4= +cloud.google.com/go/storage v1.30.1/go.mod h1:NfxhC0UJE1aXSx7CIIbCf7y9HKT7BiccwkR7+P7gN8E= cloud.google.com/go/storagetransfer v1.6.0/go.mod h1:y77xm4CQV/ZhFZH75PLEXY0ROiS7Gh6pSKrM8dJyg6I= cloud.google.com/go/storagetransfer v1.8.0/go.mod h1:JpegsHHU1eXg7lMHkvf+KE5XDJ7EQu0GwNJbbVGanEw= +cloud.google.com/go/storagetransfer v1.10.0/go.mod h1:DM4sTlSmGiNczmV6iZyceIh2dbs+7z2Ayg6YAiQlYfA= cloud.google.com/go/talent v1.4.0/go.mod h1:ezFtAgVuRf8jRsvyE6EwmbTK5LKciD4KVnHuDEFmOOA= cloud.google.com/go/talent v1.5.0/go.mod h1:G+ODMj9bsasAEJkQSzO2uHQWXHHXUomArjWQQYkqK6c= +cloud.google.com/go/talent v1.6.2/go.mod h1:CbGvmKCG61mkdjcqTcLOkb2ZN1SrQI8MDyma2l7VD24= cloud.google.com/go/texttospeech v1.5.0/go.mod h1:oKPLhR4n4ZdQqWKURdwxMy0uiTS1xU161C8W57Wkea4= cloud.google.com/go/texttospeech v1.6.0/go.mod h1:YmwmFT8pj1aBblQOI3TfKmwibnsfvhIBzPXcW4EBovc= +cloud.google.com/go/texttospeech v1.7.1/go.mod h1:m7QfG5IXxeneGqTapXNxv2ItxP/FS0hCZBwXYqucgSk= cloud.google.com/go/tpu v1.4.0/go.mod h1:mjZaX8p0VBgllCzF6wcU2ovUXN9TONFLd7iz227X2Xg= cloud.google.com/go/tpu v1.5.0/go.mod h1:8zVo1rYDFuW2l4yZVY0R0fb/v44xLh3llq7RuV61fPM= +cloud.google.com/go/tpu v1.6.1/go.mod h1:sOdcHVIgDEEOKuqUoi6Fq53MKHJAtOwtz0GuKsWSH3E= cloud.google.com/go/trace v1.4.0/go.mod h1:UG0v8UBqzusp+z63o7FK74SdFE+AXpCLdFb1rshXG+Y= cloud.google.com/go/trace v1.9.0/go.mod h1:lOQqpE5IaWY0Ixg7/r2SjixMuc6lfTFeO4QGM4dQWOk= +cloud.google.com/go/trace v1.10.1/go.mod h1:gbtL94KE5AJLH3y+WVpfWILmqgc6dXcqgNXdOPAQTYk= cloud.google.com/go/translate v1.4.0/go.mod h1:06Dn/ppvLD6WvA5Rhdp029IX2Mi3Mn7fpMRLPvXT5Wg= cloud.google.com/go/translate v1.7.0/go.mod h1:lMGRudH1pu7I3n3PETiOB2507gf3HnfLV8qlkHZEyos= +cloud.google.com/go/translate v1.8.1/go.mod h1:d1ZH5aaOA0CNhWeXeC8ujd4tdCFw8XoNWRljklu5RHs= cloud.google.com/go/video v1.9.0/go.mod h1:0RhNKFRF5v92f8dQt0yhaHrEuH95m068JYOvLZYnJSw= cloud.google.com/go/video v1.15.0/go.mod h1:SkgaXwT+lIIAKqWAJfktHT/RbgjSuY6DobxEp0C5yTQ= +cloud.google.com/go/video v1.17.1/go.mod h1:9qmqPqw/Ib2tLqaeHgtakU+l5TcJxCJbhFXM7UJjVzU= cloud.google.com/go/videointelligence v1.9.0/go.mod h1:29lVRMPDYHikk3v8EdPSaL8Ku+eMzDljjuvRs105XoU= cloud.google.com/go/videointelligence v1.10.0/go.mod h1:LHZngX1liVtUhZvi2uNS0VQuOzNi2TkY1OakiuoUOjU= +cloud.google.com/go/videointelligence v1.11.1/go.mod h1:76xn/8InyQHarjTWsBR058SmlPCwQjgcvoW0aZykOvo= cloud.google.com/go/vision v1.2.0/go.mod h1:SmNwgObm5DpFBme2xpyOyasvBc1aPdjvMk2bBk0tKD0= cloud.google.com/go/vision/v2 v2.5.0/go.mod h1:MmaezXOOE+IWa+cS7OhRRLK2cNv1ZL98zhqFFZaaH2E= cloud.google.com/go/vision/v2 v2.7.0/go.mod h1:H89VysHy21avemp6xcf9b9JvZHVehWbET0uT/bcuY/0= +cloud.google.com/go/vision/v2 v2.7.2/go.mod h1:jKa8oSYBWhYiXarHPvP4USxYANYUEdEsQrloLjrSwJU= cloud.google.com/go/vmmigration v1.3.0/go.mod h1:oGJ6ZgGPQOFdjHuocGcLqX4lc98YQ7Ygq8YQwHh9A7g= cloud.google.com/go/vmmigration v1.6.0/go.mod h1:bopQ/g4z+8qXzichC7GW1w2MjbErL54rk3/C843CjfY= +cloud.google.com/go/vmmigration v1.7.1/go.mod h1:WD+5z7a/IpZ5bKK//YmT9E047AD+rjycCAvyMxGJbro= cloud.google.com/go/vmwareengine v0.1.0/go.mod h1:RsdNEf/8UDvKllXhMz5J40XxDrNJNN4sagiox+OI208= cloud.google.com/go/vmwareengine v0.3.0/go.mod h1:wvoyMvNWdIzxMYSpH/R7y2h5h3WFkx6d+1TIsP39WGY= +cloud.google.com/go/vmwareengine v0.4.1/go.mod h1:Px64x+BvjPZwWuc4HdmVhoygcXqEkGHXoa7uyfTgSI0= cloud.google.com/go/vpcaccess v1.5.0/go.mod h1:drmg4HLk9NkZpGfCmZ3Tz0Bwnm2+DKqViEpeEpOq0m8= cloud.google.com/go/vpcaccess v1.6.0/go.mod h1:wX2ILaNhe7TlVa4vC5xce1bCnqE3AeH27RV31lnmZes= +cloud.google.com/go/vpcaccess v1.7.1/go.mod h1:FogoD46/ZU+JUBX9D606X21EnxiszYi2tArQwLY4SXs= cloud.google.com/go/webrisk v1.7.0/go.mod h1:mVMHgEYH0r337nmt1JyLthzMr6YxwN1aAIEc2fTcq7A= cloud.google.com/go/webrisk v1.8.0/go.mod h1:oJPDuamzHXgUc+b8SiHRcVInZQuybnvEW72PqTc7sSg= +cloud.google.com/go/webrisk v1.9.1/go.mod h1:4GCmXKcOa2BZcZPn6DCEvE7HypmEJcJkr4mtM+sqYPc= cloud.google.com/go/websecurityscanner v1.4.0/go.mod h1:ebit/Fp0a+FWu5j4JOmJEV8S8CzdTkAS77oDsiSqYWQ= cloud.google.com/go/websecurityscanner v1.5.0/go.mod h1:Y6xdCPy81yi0SQnDY1xdNTNpfY1oAgXUlcfN3B3eSng= +cloud.google.com/go/websecurityscanner v1.6.1/go.mod h1:Njgaw3rttgRHXzwCB8kgCYqv5/rGpFCsBOvPbYgszpg= cloud.google.com/go/workflows v1.9.0/go.mod h1:ZGkj1aFIOd9c8Gerkjjq7OW7I5+l6cSvT3ujaO/WwSA= cloud.google.com/go/workflows v1.10.0/go.mod h1:fZ8LmRmZQWacon9UCX1r/g/DfAXx5VcPALq2CxzdePw= +cloud.google.com/go/workflows v1.11.1/go.mod h1:Z+t10G1wF7h8LgdY/EmRcQY8ptBD/nvofaL6FqlET6g= collectd.org v0.3.0/go.mod h1:A/8DzQBkF6abtvrT2j/AU/4tiBgJWYyh0y/oB/4MlWE= gioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8= github.com/AdaLogics/go-fuzz-headers v0.0.0-20210715213245-6c3934b029d8/go.mod h1:CzsSbkDixRphAF5hS6wbMKq0eI6ccJRb7/A0M6JBnwg= @@ -379,8 +489,10 @@ github.com/ajstarks/svgo v0.0.0-20210923152817-c3b6e2f0c527/go.mod h1:K08gAheRH3 github.com/alecthomas/kingpin/v2 v2.3.1/go.mod h1:oYL5vtsvEHZGHxU7DMp32Dvx+qL+ptGn6lWaot2vCNE= github.com/alecthomas/kingpin/v2 v2.4.0/go.mod h1:0gyi0zQnjuFk8xrkNKamJoyUo382HRL7ATRpFZCw6tE= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE= github.com/alexflint/go-filemutex v0.0.0-20171022225611-72bdc8eae2ae/go.mod h1:CgnQgUtFrFz9mxFNtED3jI5tLDjKlOM+oUF/sTk6ps0= github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= @@ -425,7 +537,7 @@ github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+Ce github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/bitly/go-simplejson v0.5.0/go.mod h1:cXHtHw4XUPsvGaxgjIAn8PhEWG9NfngEKAMDJEczWVA= github.com/bits-and-blooms/bitset v1.2.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= -github.com/bits-and-blooms/bitset v1.7.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= +github.com/bits-and-blooms/bitset v1.5.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= github.com/blang/semver v3.1.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= @@ -449,11 +561,13 @@ github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInq github.com/cenkalti/backoff/v4 v4.1.2/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw= +github.com/cespare/cp v0.1.0/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s= github.com/cespare/cp v1.1.1 h1:nCb6ZLdB7NRaqsm91JtQTAme2SKJzXVsdPIPkyJr1MU= github.com/cespare/cp v1.1.1/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s= github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/checkpoint-restore/go-criu/v4 v4.1.0/go.mod h1:xUQBLp4RLc5zJtWY++yjOoMoB5lihDt7fai+75m+rGw= github.com/checkpoint-restore/go-criu/v5 v5.0.0/go.mod h1:cfwC0EG7HMUenopBsUf9d89JlCLQIfgVcNsNN0t6T2M= github.com/checkpoint-restore/go-criu/v5 v5.3.0/go.mod h1:E/eQpaFtUKGOOSEBZgmKAcn+zUUwWxqcaKZlF54wK8E= @@ -494,9 +608,12 @@ github.com/cockroachdb/errors v1.6.1/go.mod h1:tm6FTP5G81vwJ5lC0SizQo374JNCOPrHy github.com/cockroachdb/errors v1.8.1/go.mod h1:qGwQn6JmZ+oMjuLwjWzUNqblqk0xl4CVV3SQbGwK7Ac= github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI= github.com/cockroachdb/pebble v0.0.0-20230821143352-55b44ac08de8/go.mod h1:bynZ3gvVyhlvjLI7PT6dmZ7g76xzJ7HpxfjgkzCGz6s= +github.com/cockroachdb/pebble v0.0.0-20230906160148-46873a6a7a06/go.mod h1:bynZ3gvVyhlvjLI7PT6dmZ7g76xzJ7HpxfjgkzCGz6s= github.com/cockroachdb/redact v1.0.8/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= +github.com/cockroachdb/sentry-go v0.6.1-cockroachdb.2/go.mod h1:8BT+cPK6xvFOcRlk0R8eg+OTkcqI6baNH4xAkpiYVvQ= github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= github.com/consensys/gnark-crypto v0.9.1-0.20230105202408-1a7a29904a7c/go.mod h1:CkbdF9hbRidRJYMRzmfX8TMOr95I2pYXRHF18MzRrvA= +github.com/consensys/gnark-crypto v0.10.0/go.mod h1:Iq/P3HHl0ElSjsg2E1gsMwhAyxnxoKK5nVyZKd+/KhU= github.com/containerd/aufs v0.0.0-20200908144142-dab0cbea06f4/go.mod h1:nukgQABAEopAHvB6j7cnP5zJ+/3aVcE7hCYqvIwAHyE= github.com/containerd/aufs v0.0.0-20201003224125-76a6863f2989/go.mod h1:AkGGQs9NM2vtYHaUen+NljV0/baGCAPELGm2q9ZXpWU= github.com/containerd/aufs v0.0.0-20210316121734-20793ff83c97/go.mod h1:kL5kd6KM5TzQjR79jljyi4olc1Vrx6XBlcyj3gNv2PU= @@ -607,6 +724,7 @@ github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfc github.com/crate-crypto/go-ipa v0.0.0-20220523130400-f11357ae11c7/go.mod h1:gFnFS95y8HstDP6P9pPwzrxOOC5TRDkwbM+ao15ChAI= github.com/crate-crypto/go-ipa v0.0.0-20230601170251-1830d0757c80/go.mod h1:gzbVz57IDJgQ9rLQwfSk696JGWof8ftznEL9GoAv3NI= github.com/crate-crypto/go-ipa v0.0.0-20231025140028-3c0104f4b233/go.mod h1:geZJZH3SzKCqnz5VT0q/DyIG/tvu/dZk+VIfXicupJs= +github.com/crate-crypto/go-kzg-4844 v0.3.0/go.mod h1:SBP7ikXEgDnUPONgm33HtuDZEDtWa3L4QtN1ocJSEQ4= github.com/crate-crypto/go-kzg-4844 v0.6.1-0.20231019121413-3621cc59f0c7/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= @@ -621,6 +739,7 @@ github.com/dave/jennifer v1.2.0/go.mod h1:fIb+770HOpJ2fmN9EPPKOqm1vMGhB+TwXKMZhr github.com/deckarep/golang-set v1.8.0 h1:sk9/l/KqpunDwP7pSjUg0keiOOLEnOBHzykLrsPppp4= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.0-20210816181553-5444fa50b93d/go.mod h1:tmAIfUFEirG/Y8jhZ9M+h36obRZAk/1fcSpXwAVlfqE= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs= +github.com/deepmap/oapi-codegen v1.6.0/go.mod h1:ryDa9AgbELGeB+YEXE1dR53yAjHwFvE9iAUlWl9Al3M= github.com/deepmap/oapi-codegen v1.8.2/go.mod h1:YLgSKSDv/bZQB7N4ws6luhozi3cEdRktEqrX88CvjIw= github.com/deepmap/oapi-codegen v1.12.4/go.mod h1:3lgHGMu6myQ2vqbbTXH2H1o4eXFTGnFiDaOaKKl5yas= github.com/denverdino/aliyungo v0.0.0-20190125010748-a747050bb1ba/go.mod h1:dV8lFg6daOBZbT6/BDGIz6Y3WFGn8juu6G+CQ6LHtl0= @@ -652,6 +771,7 @@ github.com/docker/docker v20.10.17+incompatible h1:JYCuMrWaVNophQTOrMMoSwudOVEfc github.com/docker/docker v20.10.17+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/docker v24.0.5+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/docker v24.0.7+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v25.0.4+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/docker-credential-helpers v0.6.3/go.mod h1:WRaJzqw3CTB9bk10avuGsjVBZsD05qeibJ1/TYlvc0Y= github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= github.com/docker/go-events v0.0.0-20170721190031-9461782956ad/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA= @@ -688,10 +808,13 @@ github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go. github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= github.com/envoyproxy/go-control-plane v0.10.3/go.mod h1:fJJn/j26vwOu972OllsvAgJJM//w9BV6Fxbg2LuVd34= github.com/envoyproxy/go-control-plane v0.11.1-0.20230524094728-9239064ad72f/go.mod h1:sfYdkwUW4BA3PbKjySwjJy+O4Pu0h62rlqCMHNk+K+Q= +github.com/envoyproxy/go-control-plane v0.11.1/go.mod h1:uhMcXKCQMEJHiAb0w+YGefQLaTEw+YhGluxZkrTmD0g= github.com/envoyproxy/protoc-gen-validate v0.6.7/go.mod h1:dyJXwwfPK2VSqiB9Klm1J6romD608Ba7Hij42vrOBCo= github.com/envoyproxy/protoc-gen-validate v0.9.1/go.mod h1:OKNgG7TCp5pF4d6XftA0++PMirau2/yoOwVac3AbF2w= github.com/envoyproxy/protoc-gen-validate v0.10.1/go.mod h1:DRjgyB0I43LtJapqN6NiRwroiAU2PaFuvk/vjgh61ss= +github.com/envoyproxy/protoc-gen-validate v1.0.2/go.mod h1:GpiZQP3dDbg4JouG/NNS7QWXpgx6x8QiMKdmN72jogE= github.com/ethereum/c-kzg-4844 v0.3.0/go.mod h1:WI2Nd82DMZAAZI1wV2neKGost9EKjvbpQR9OqE5Qqa8= +github.com/ethereum/c-kzg-4844 v0.3.1/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= github.com/ethereum/c-kzg-4844 v0.3.2-0.20231019020040-748283cced54/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= github.com/ethereum/go-ethereum v1.12.2-0.20230815181937-e0b119884c6a/go.mod h1:1JU/x0JQLBndZb2727eswdCzyF2rFd8SZUj7HDQuVqc= github.com/ethereum/hive v0.0.0-20230401205547-71595beab31d/go.mod h1:zKL2DscVzRusnGVpseAvLrXGJ3qrGHuSfOIrv4JfnRk= @@ -705,7 +828,6 @@ github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYF github.com/ferranbt/fastssz v0.0.0-20210120143747-11b9eff30ea9/go.mod h1:DyEu2iuLBnb/T51BlsiO3yLYdJC6UbGMrIkqK1KmQxM= github.com/fjl/gencodec v0.0.0-20220412091415-8bb9e558978c/go.mod h1:AzA8Lj6YtixmJWL+wkKoBGsLWy9gFrAzi4g+5bCKwpY= github.com/fjl/gencodec v0.0.0-20230517082657-f9840df7b83e/go.mod h1:AzA8Lj6YtixmJWL+wkKoBGsLWy9gFrAzi4g+5bCKwpY= -github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= github.com/flosch/pongo2 v0.0.0-20190707114632-bbf5a6c351f4/go.mod h1:T9YF2M40nIgbVgp3rreNmTged+9HrbNTIQf1PsaIiTA= github.com/flosch/pongo2/v4 v4.0.2/go.mod h1:B5ObFANs/36VwxxlgKpdchIJHMvHB562PW+BWPhwZD8= github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= @@ -724,7 +846,6 @@ github.com/garslo/gogen v0.0.0-20170306192744-1d203ffc1f61/go.mod h1:Q0X6pkwTILD github.com/garyburd/redigo v0.0.0-20150301180006-535138d7bcd7/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY= github.com/garyburd/redigo v1.1.1-0.20170914051019-70e1b1943d4f/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY= github.com/garyburd/redigo v1.6.0/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY= -github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= github.com/gballet/go-verkle v0.0.0-20220902153445-097bd83b7732/go.mod h1:o/XfIXWi4/GqbQirfRm5uTbXMG5NpqxkxblnbZ+QM9I= github.com/gballet/go-verkle v0.0.0-20230607174250-df487255f46b/go.mod h1:CDncRYVRSDqwakm282WEkjfaAj1hxU/v5RXxk5nXOiI= github.com/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46/go.mod h1:QNpY22eby74jVhqH4WhDLDwxc/vqsern6pW+u2kbkpc= @@ -762,6 +883,7 @@ github.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpx github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= +github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= @@ -796,6 +918,7 @@ github.com/go-playground/validator/v10 v10.11.1/go.mod h1:i+3WkQ1FvaUjjxh1kSvIA4 github.com/go-playground/validator/v10 v10.13.0 h1:cFRQdfaSMCOSfGCCLB20MHvuoHb/s5G8L5pu2ppK5AQ= github.com/go-playground/validator/v10 v10.13.0/go.mod h1:dwu7+CG8/CtBiJFZDz4e+5Upb6OLw04gtBYw0mcG/z4= github.com/go-redis/redis/v8 v8.11.5/go.mod h1:gREzHqY1hg6oD9ngVRbLStwAWKhA0FEgq8Jd4h5lpwo= +github.com/go-sourcemap/sourcemap v2.1.3+incompatible/go.mod h1:F8jJfvm2KbVjc5NqelyYJmf/v5J0dwNLS2mL4sNA1Jg= github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-stack/stack v1.6.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= @@ -864,6 +987,7 @@ github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeN github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-containerregistry v0.5.1/go.mod h1:Ct15B4yir3PLOP5jsy0GNeYVaIZs/MK/Jz5any1wFW0= github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= +github.com/google/gofuzz v1.1.1-0.20200604201612-c04b05f3adfa/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= @@ -914,11 +1038,13 @@ github.com/gorilla/handlers v0.0.0-20150720190736-60c7bfde3e33/go.mod h1:Qkdc/uu github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.7.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gostaticanalysis/comment v1.4.2/go.mod h1:KLUTGDv6HOCotCH8h2erHKmpci2ZoR8VPu34YA2uzdM= github.com/gostaticanalysis/testutil v0.3.1-0.20210208050101-bfb5c8eec0e4/go.mod h1:D+FIZ+7OahH3ePw/izIEeH5I06eKs1IKI4Xr64/Am3M= +github.com/graph-gophers/graphql-go v1.3.0/go.mod h1:9CQHMSxwO4MprSdzoIEobiHpoLtHm77vfxsvsIN5Vuc= github.com/graph-gophers/graphql-go v1.4.0/go.mod h1:YtmJZDLbF1YYNrlNAuiO5zAStUWc3XZT07iGsVqe1Os= github.com/gregjones/httpcache v0.0.0-20170920190843-316c5e0ff04e/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= @@ -939,7 +1065,6 @@ github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyN github.com/hashicorp/errwrap v0.0.0-20141028054710-7554cd9344ce/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-bexpr v0.1.10/go.mod h1:oxlubA2vC/gFVfX1A6JGp7ls7uCDlfJn732ehYYg+g0= github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= github.com/hashicorp/go-hclog v0.9.2/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= @@ -986,11 +1111,13 @@ github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH github.com/inconshreveable/log15 v0.0.0-20170622235902-74a0988b5f80/go.mod h1:cOaXtrgN4ScfRrD9Bre7U1thNq5RtJ8ZoP4iXVGRj6o= github.com/influxdata/flux v0.65.1/go.mod h1:J754/zds0vvpfwuq7Gc2wRdVwEodfpCFM7mYlOw2LqY= github.com/influxdata/influxdb v1.8.3/go.mod h1:JugdFhsvvI8gadxOI6noqNeeBHvWNTbfYGtiAn+2jhI= +github.com/influxdata/influxdb-client-go/v2 v2.4.0/go.mod h1:vLNHdxTJkIf2mSLvGrpj8TCcISApPoXkaxP8g9uRlW8= github.com/influxdata/influxdb-client-go/v2 v2.12.1/go.mod h1:YteV91FiQxRdccyJ2cHvj2f/5sq4y4Njqu1fQzsQCOU= github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= github.com/influxdata/influxdb1-client v0.0.0-20220302092344-a9ab5670611c/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= github.com/influxdata/influxql v1.1.1-0.20200828144457-65d3ef77d385/go.mod h1:gHp9y86a/pxhjJ+zMjNXiQAA197Xk9wLxaz+fGG+kWk= github.com/influxdata/line-protocol v0.0.0-20180522152040-32c6aa80de5e/go.mod h1:4kt73NQhadE3daL3WhR5EJ/J2ocX0PZzwxQ0gXJ7oFE= +github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo= github.com/influxdata/line-protocol v0.0.0-20210311194329-9aa0e372d097/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo= github.com/influxdata/line-protocol v0.0.0-20210922203350-b1ad95c89adf/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo= github.com/influxdata/promql/v2 v2.12.0/go.mod h1:fxOPu+DY0bqCTCECchSRtWfc+0X19ybifQhZoQNF5D8= @@ -1026,6 +1153,7 @@ github.com/joefitzgerald/rainbow-reporter v0.1.0/go.mod h1:481CNgqmVHQZzdIbN52Cu github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= github.com/joonix/log v0.0.0-20200409080653-9c1d2ceb5f1d/go.mod h1:fS54ONkjDV71zS9CDx3V9K21gJg7byKSvI4ajuWFNJw= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= +github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= @@ -1145,7 +1273,6 @@ github.com/mattn/go-isatty v0.0.2/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNx github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= -github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= @@ -1183,7 +1310,6 @@ github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:F github.com/mitchellh/mapstructure v0.0.0-20170523030023-d0303fe80992/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.3.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/osext v0.0.0-20151018003038-5e2d6d41470f/go.mod h1:OkQIRizQZAeMln+1tSwduZz7+Af5oFlKirV/MSYes2A= -github.com/mitchellh/pointerstructure v1.2.0/go.mod h1:BRAsLI5zgXmw97Lf6s25bs8ohIXc3tViBH44KcwB2g4= github.com/moby/locker v1.0.1/go.mod h1:S7SDdo5zpBK84bzzVlKr2V0hz+7x9hWbYC/kq7oQppc= github.com/moby/patternmatcher v0.6.0/go.mod h1:hDPoyOpDY7OrrMDLaYoY3hf52gNCR/YOUYxkhApJIxc= github.com/moby/sys/mount v0.3.3 h1:fX1SVkXFJ47XWDoeFW4Sq7PdQJnV2QIDZAqjNqgEjUs= @@ -1218,6 +1344,9 @@ github.com/multiformats/go-varint v0.0.5/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXS github.com/multiformats/go-varint v0.0.6/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/naoina/go-stringutil v0.1.0/go.mod h1:XJ2SJL9jCtBh+P9q5btrd/Ylo8XwT/h1USek5+NqSA0= +github.com/naoina/toml v0.1.2-0.20170918210437-9fafd6967416/go.mod h1:NBIhNtsFMo3G2szEBne+bO4gS192HuIYRqfvOWb4i1E= github.com/nats-io/jwt v0.3.2/go.mod h1:/euKqTS1ZD+zzjYrY7pseZrTtWQSjujC7xjPc8wL6eU= github.com/nats-io/jwt/v2 v2.3.0/go.mod h1:0tqz9Hlu6bCBFLWAASKhE5vUA4c24L9KPUUgvwumE/k= github.com/nats-io/nats-server/v2 v2.1.2/go.mod h1:Afk+wRZqkMQs/p45uXdrVLuab3gwv3Z8C4HTBu8GD/k= @@ -1287,6 +1416,7 @@ github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74= github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/opentracing/opentracing-go v1.0.3-0.20180606204148-bd9c31933947/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.5/go.mod h1:/wsWhb9smxSfWAKL3wpBW7V8scJMt8N8gnaMCS9E/cA= github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= @@ -1311,6 +1441,7 @@ github.com/pelletier/go-toml/v2 v2.0.5 h1:ipoSadvV8oGUjnUbMub59IDPPwfxF694nG/jwb github.com/pelletier/go-toml/v2 v2.0.5/go.mod h1:OMHamSCAODeSsVrwwvcJOaoN0LIUIaFVNZzmWyNfXas= github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= github.com/peterh/liner v1.0.1-0.20180619022028-8c1271fcf47f/go.mod h1:xIteQHvHuaLYG9IFj6mSxM0fCKrs34IrEQUhOYuGPHc= +github.com/peterh/liner v1.1.1-0.20190123174540-a2c9a5303de7/go.mod h1:CRroGNssyjTd/qIG2FyxByd2S8JEAZXBl4qUrZf8GS0= github.com/peterh/liner v1.2.0/go.mod h1:CRroGNssyjTd/qIG2FyxByd2S8JEAZXBl4qUrZf8GS0= github.com/peterh/liner v1.2.2/go.mod h1:xFwJyiKIXJZUKItq5dGHZSTBRAuG/CpeNpWLyiNRNwI= github.com/philhofer/fwd v1.0.0/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU= @@ -1418,7 +1549,6 @@ github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40T github.com/prometheus/tsdb v0.10.0/go.mod h1:oi49uRhEe9dPUTlS3JRZOwJuVi6tmh10QSgwXEyGCt4= github.com/protolambda/messagediff v1.4.0 h1:fk6gxK7WybJCaeOFK1yuh2Ldplx7qYMLibiMwWFcSZY= github.com/prysmaticlabs/go-bitfield v0.0.0-20210108222456-8e92c3709aa0/go.mod h1:hCwmef+4qXWjv0jLDbQdWnL0Ol7cS7/lCSS26WR+u6s= -github.com/prysmaticlabs/gohashtree v0.0.1-alpha.0.20220714111606-acbb2962fb48/go.mod h1:4pWaT30XoEx1j8KNJf3TV+E3mQkaufn7mf+jRNb/Fuk= github.com/prysmaticlabs/prombbolt v0.0.0-20210126082820-9b7adba6db7c h1:9PHRCuO/VN0s9k+RmLykho7AjDxblNYI5bYKed16NPU= github.com/prysmaticlabs/prombbolt v0.0.0-20210126082820-9b7adba6db7c/go.mod h1:ZRws458tYHS/Zs936OQ6oCrL+Ict5O4Xpwve1UQ6C9M= github.com/prysmaticlabs/protoc-gen-go-cast v0.0.0-20230228205207-28762a7b9294/go.mod h1:ZVEbRdnMkGhp/pu35zq4SXxtvUwWK0J1MATtekZpH2Y= @@ -1440,7 +1570,6 @@ github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6So github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= -github.com/rs/cors v1.8.3/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w= github.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= @@ -1467,6 +1596,7 @@ github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMB github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= @@ -1663,8 +1793,8 @@ golang.org/x/crypto v0.8.0/go.mod h1:mRqEX+O9/h5TFCrQhkgjo2yKi0yYA+9ecGkdQoHrywE golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= golang.org/x/crypto v0.10.0/go.mod h1:o4eNf7Ede1fv+hwOwZsTHl9EsPFO6q6ZvYR8vYfY45I= golang.org/x/crypto v0.11.0/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio= +golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= -golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -1677,8 +1807,8 @@ golang.org/x/exp v0.0.0-20220426173459-3bcf042a4bf5/go.mod h1:lgLbSvA5ygNOMpwM/9 golang.org/x/exp v0.0.0-20221205204356-47842c84f3db/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc= golang.org/x/exp v0.0.0-20230626212559-97b1e661b5df/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc= golang.org/x/exp v0.0.0-20230725012225-302865e7556b/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc= +golang.org/x/exp v0.0.0-20230810033253-352e893a4cad/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc= golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63/go.mod h1:0v4NqG35kSWCMzLaMeX+IQrlSnVE/bqGSyC2cz/9Le8= -golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k= golang.org/x/exp v0.0.0-20231006140011-7918f672742d/go.mod h1:ldy0pHrwJyGW56pPQzzkH36rKxoZW1tw7ZJpeKx+hdo= golang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611/go.mod h1:iRJReGqOEeBhDZGkGbynYwcHlctCvnjTYIamk7uXpHI= golang.org/x/exp/typeparams v0.0.0-20231108232855-2478ac86f678/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= @@ -1703,7 +1833,7 @@ golang.org/x/mod v0.6.0/go.mod h1:4mET923SAdbXp2ki8ey+zGs1SLqsuM2Y0uvdZR/fUNI= golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.10.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.11.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.13.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1760,10 +1890,10 @@ golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.11.0/go.mod h1:2L/ixqYpgIVXmeoSA/4Lu7BzTG4KIyPIryS4IsOd1oQ= +golang.org/x/net v0.12.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA= golang.org/x/net v0.13.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA= golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= -golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U= golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= golang.org/x/oauth2 v0.0.0-20170207211851-4464e7848382/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -1791,6 +1921,7 @@ golang.org/x/oauth2 v0.4.0/go.mod h1:RznEsdpjGAINPTOF0UH/t+xJ75L18YO3Ho6Pyn+uRec golang.org/x/oauth2 v0.5.0/go.mod h1:9/XBHVqLaWO3/BRHs5jbpYCnOZVjj5V0ndyaAM7KB4I= golang.org/x/oauth2 v0.7.0/go.mod h1:hPLQkd9LyjfXTiRohC/41GhcFqxisoUQ99sCUOHO9x4= golang.org/x/oauth2 v0.8.0/go.mod h1:yr7u4HXZRm1R1kBWqr/xKNqewf0plRYoB7sla+BCIXE= +golang.org/x/oauth2 v0.10.0/go.mod h1:kTpgurOux7LqtuxjuyZa4Gj2gdezIt/jQtGnNFfypQI= golang.org/x/oauth2 v0.12.0/go.mod h1:A74bZ3aGXgCY0qaIC9Ahg6Lglin4AMAco8cIv9baba4= golang.org/x/perf v0.0.0-20230113213139-801c7ef9e5c5/go.mod h1:UBKtEnL8aqnd+0JHqZ+2qoMDwtuy6cYhhKNoHLBiTQc= golang.org/x/sync v0.0.0-20170517211232-f52d1811a629/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1901,6 +2032,7 @@ golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220919091848-fb04ddd9f9c8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -1910,6 +2042,7 @@ golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/telemetry v0.0.0-20240208230135-b75ee8823808/go.mod h1:KG1lNk5ZFNssSZLrpVb4sMXKMpGwGXOxSG3rnu2gZQQ= golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= @@ -1924,6 +2057,7 @@ golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0= +golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= @@ -1933,7 +2067,7 @@ golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.10.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= -golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/time v0.0.0-20170424234030-8be79e1e0910/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -1987,9 +2121,9 @@ golang.org/x/tools v0.2.0/go.mod h1:y4OqIKeOV/fWJetJ8bXPU1sEVniLMIyDAZWeHdV+NTA= golang.org/x/tools v0.3.0/go.mod h1:/rWhSS2+zyEVwoJf8YAX6L2f0ntZ7Kn/mGgAWcipA5k= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= +golang.org/x/tools v0.9.1/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc= golang.org/x/tools v0.12.0/go.mod h1:Sc0INKfu04TlqNoRA1hgpFZbhYXHPr4V5DzpSBTPqQM= golang.org/x/tools v0.12.1-0.20230815132531-74c255bcf846/go.mod h1:Sc0INKfu04TlqNoRA1hgpFZbhYXHPr4V5DzpSBTPqQM= -golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= golang.org/x/tools v0.14.0/go.mod h1:uYBEerGOWcJyEORxN+Ek8+TT266gXkNlHdJBwexUsBg= golang.org/x/tools v0.16.0/go.mod h1:kYVVN6I1mBNoB1OX+noeBjbRk4IUEPa7JJ+TJMEooJ0= golang.org/x/tools v0.16.1/go.mod h1:kYVVN6I1mBNoB1OX+noeBjbRk4IUEPa7JJ+TJMEooJ0= @@ -2135,12 +2269,15 @@ google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f/go.mod h1:RGgjbofJ google.golang.org/genproto v0.0.0-20230222225845-10f96fb3dbec/go.mod h1:3Dl5ZL0q0isWJt+FVcfpQyirqemEuLAK/iFvg1UP1Hw= google.golang.org/genproto v0.0.0-20230525234025-438c736192d0/go.mod h1:9ExIQyXL5hZrHzQceCwuSYwZZ5QZBazOcprJ5rgs3lY= google.golang.org/genproto v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:xZnkP7mREFX5MORlOPEzLMr+90PPZQ2QWzrVTWfAq64= +google.golang.org/genproto v0.0.0-20230706204954-ccb25ca9f130/go.mod h1:O9kGHb51iE/nOGvQaDUuadVYqovW56s5emA88lQnj6Y= google.golang.org/genproto/googleapis/api v0.0.0-20230526203410-71b5a4ffd15e/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= google.golang.org/genproto/googleapis/api v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= +google.golang.org/genproto/googleapis/api v0.0.0-20230706204954-ccb25ca9f130/go.mod h1:mPBs5jNgx2GuQGvFwUvVKqtn6HsUw9nP64BedgvqEsQ= google.golang.org/genproto/googleapis/bytestream v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:ylj+BE99M198VPbBh6A8d9n3w8fChvyLK3wwBOjXBFA= google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234030-28d5490b6b19/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= google.golang.org/genproto/googleapis/rpc v0.0.0-20230526203410-71b5a4ffd15e/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= google.golang.org/genproto/googleapis/rpc v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230706204954-ccb25ca9f130/go.mod h1:8mL13HKkDa+IuJ8yruA3ci0q+0vsUz4m//+ottjwS5o= google.golang.org/grpc v0.0.0-20160317175043-d3ddb4469d5a/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v0.0.0-20170208002647-2a6bf6142e96/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.2.1-0.20170921194603-d4b75ebd4f9f/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= @@ -2179,13 +2316,18 @@ google.golang.org/grpc v1.51.0/go.mod h1:wgNDFcnuBGmxLKI/qn4T+m5BtEBYXJPvibbUPsA google.golang.org/grpc v1.53.0/go.mod h1:OnIrk0ipVdj4N5d9IUoFUx72/VlD7+jUsHwZgwSMQpw= google.golang.org/grpc v1.54.0/go.mod h1:PUSEXI6iWghWaB6lXM4knEgpJNu2qUcKfDtNci3EC2g= google.golang.org/grpc v1.55.0/go.mod h1:iYEXKGkEBhg1PjZQvoYEVPTDkHo1/bjTnfwTeGONTY8= +google.golang.org/grpc v1.56.2/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.0.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.29.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U= +gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/bsm/ratelimit.v1 v1.0.0-20160220154919-db14e161995a/go.mod h1:KF9sEfUPAXdG8Oev9e99iLGnl2uJMjc5B+4y3O7x610= gopkg.in/cenkalti/backoff.v1 v1.1.0/go.mod h1:J6Vskwqd+OMVJl8C33mmtxTBs2gyzfv7UDAkHu8BrjI= gopkg.in/check.v1 v1.0.0-20141024133853-64131543e789/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= From f6bcbc6e1b1adfebc9b8acb7105671d433abef92 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Tue, 19 Mar 2024 16:43:14 +0100 Subject: [PATCH 241/387] simulators/eth2/common: remove go-ethereum module replacement --- simulators/eth2/common/go.mod | 6 +++--- simulators/eth2/common/go.sum | 20 +++++++++++++------- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/simulators/eth2/common/go.mod b/simulators/eth2/common/go.mod index b7f8571d19..9e765e40fd 100644 --- a/simulators/eth2/common/go.mod +++ b/simulators/eth2/common/go.mod @@ -46,6 +46,7 @@ require ( github.com/consensys/gnark-crypto v0.12.1 // indirect github.com/containerd/cgroups v1.1.0 // indirect github.com/coreos/go-systemd/v22 v22.5.0 // indirect + github.com/crate-crypto/go-ipa v0.0.0-20231025140028-3c0104f4b233 // indirect github.com/crate-crypto/go-kzg-4844 v0.7.0 // indirect github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c // indirect github.com/deckarep/golang-set/v2 v2.3.0 // indirect @@ -56,8 +57,9 @@ require ( github.com/ferranbt/fastssz v0.1.3 // indirect github.com/flynn/noise v1.1.0 // indirect github.com/francoispqt/gojay v1.2.13 // indirect + github.com/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46 // indirect github.com/getsentry/sentry-go v0.20.0 // indirect - github.com/go-ole/go-ole v1.2.6 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect github.com/go-stack/stack v1.8.1 // indirect github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect github.com/godbus/dbus/v5 v5.1.0 // indirect @@ -174,6 +176,4 @@ replace github.com/protolambda/zrnt => github.com/marioevz/zrnt v0.26.2-0.202311 replace github.com/protolambda/eth2api => github.com/marioevz/eth2api v0.0.0-20230922201437-72bd1301e033 -replace github.com/ethereum/go-ethereum => github.com/lightclient/go-ethereum v1.10.10-0.20231019143932-4d161dee0c4c - replace github.com/protolambda/ztyp => github.com/marioevz/ztyp v0.0.0-20231106221254-dd6f24f13fd9 diff --git a/simulators/eth2/common/go.sum b/simulators/eth2/common/go.sum index 232c82f0d4..5c84cb1282 100644 --- a/simulators/eth2/common/go.sum +++ b/simulators/eth2/common/go.sum @@ -124,6 +124,8 @@ github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:ma github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/crate-crypto/go-ipa v0.0.0-20231025140028-3c0104f4b233 h1:d28BXYi+wUpz1KBmiF9bWrjEMacUEREV6MBi2ODnrfQ= +github.com/crate-crypto/go-ipa v0.0.0-20231025140028-3c0104f4b233/go.mod h1:geZJZH3SzKCqnz5VT0q/DyIG/tvu/dZk+VIfXicupJs= github.com/crate-crypto/go-kzg-4844 v0.7.0 h1:C0vgZRk4q4EZ/JgPfzuSoxdCq3C3mOZMBShovmncxvA= github.com/crate-crypto/go-kzg-4844 v0.7.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= @@ -160,6 +162,8 @@ github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7 github.com/etcd-io/bbolt v1.3.3/go.mod h1:ZF2nL25h33cCyBtcyWeZ2/I3HQOfTP+0PIEvHjkjCrw= github.com/ethereum/c-kzg-4844 v0.4.0 h1:3MS1s4JtA868KpJxroZoepdV0ZKBp3u/O5HcZ7R3nlY= github.com/ethereum/c-kzg-4844 v0.4.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= +github.com/ethereum/go-ethereum v1.13.14 h1:EwiY3FZP94derMCIam1iW4HFVrSgIcpsu0HwTQtm6CQ= +github.com/ethereum/go-ethereum v1.13.14/go.mod h1:TN8ZiHrdJwSe8Cb6x+p0hs5CxhJZPbqB7hHkaUXcmIU= github.com/ethereum/hive v0.0.0-20240319152821-ae224371b4e5 h1:2Rc3v1mqWgUl8gSHFh7+FmVcyB1AI/9THxhEDjNK+PI= github.com/ethereum/hive v0.0.0-20240319152821-ae224371b4e5/go.mod h1:MGwUXPGco6YS3brOf5WEILfUnnUL/XuX1224ab3D7XA= github.com/ethereum/hive/simulators/ethereum/engine v0.0.0-20240305231022-f69df863de20 h1:Bf9mev5lvesQIIpJtzO+vnGQ3Jv3NuLa2buY2+2pQzg= @@ -169,8 +173,8 @@ github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072/go.mod github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= github.com/ferranbt/fastssz v0.1.3 h1:ZI+z3JH05h4kgmFXdHuR1aWYsgrg7o+Fw7/NCzM16Mo= github.com/ferranbt/fastssz v0.1.3/go.mod h1:0Y9TEd/9XuFlh7mskMPfXiI2Dkw4Ddg9EyXt1W7MRvE= -github.com/fjl/memsize v0.0.1 h1:+zhkb+dhUgx0/e+M8sF0QqiouvMQUiKR+QYvdxIOKcQ= -github.com/fjl/memsize v0.0.1/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= +github.com/fjl/memsize v0.0.2 h1:27txuSD9or+NZlnOWdKUxeBzTAUkWCVh+4Gf2dWFOzA= +github.com/fjl/memsize v0.0.2/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= github.com/flynn/noise v1.1.0 h1:KjPQoQCEFdZDiP03phOvGi11+SVVhBG2wOWAorLsstg= github.com/flynn/noise v1.1.0/go.mod h1:xbMo+0i6+IGbYdJhF31t2eR1BIU0CYc12+BNAKwUTag= @@ -186,6 +190,8 @@ github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbS github.com/gavv/httpexpect v2.0.0+incompatible/go.mod h1:x+9tiU1YnrOvnB725RkpoLv1M62hOWzwo5OXotisrKc= github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08 h1:f6D9Hr8xV8uYKlyuj8XIruxlh9WjVjdh1gIicAS7ays= github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= +github.com/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46 h1:BAIP2GihuqhwdILrV+7GJel5lyPV3u1+PgzrWLc0TkE= +github.com/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46/go.mod h1:QNpY22eby74jVhqH4WhDLDwxc/vqsern6pW+u2kbkpc= github.com/getsentry/sentry-go v0.12.0/go.mod h1:NSap0JBYWzHND8oMbyi0+XZhUalc1TBdRL1M71JZW2c= github.com/getsentry/sentry-go v0.20.0 h1:bwXW98iMRIWxn+4FgPW7vMrjmbym6HblXALmhjHmQaQ= github.com/getsentry/sentry-go v0.20.0/go.mod h1:lc76E2QywIyW8WuBnwl8Lc4bkmQH4+w1gwTf25trprY= @@ -205,8 +211,9 @@ github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTg github.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY= github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab/go.mod h1:/P9AEU963A2AYjv4d1V5eVL1CQbEJq6aCNHDDjibzu8= -github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= @@ -332,8 +339,8 @@ github.com/hashicorp/golang-lru/v2 v2.0.5/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyf github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/herumi/bls-eth-go-binary v1.29.1 h1:XcNSHYTyNjEUVfWDCE2gtG5r95biTwd7MJUJF09LtSE= github.com/herumi/bls-eth-go-binary v1.29.1/go.mod h1:luAnRm3OsMQeokhGzpYmc0ZKwawY7o87PUEP11Z7r7U= -github.com/holiman/billy v0.0.0-20230718173358-1c7e68d277a7 h1:3JQNjnMRil1yD0IfZKHF9GxxWKDJGj8I0IqOUol//sw= -github.com/holiman/billy v0.0.0-20230718173358-1c7e68d277a7/go.mod h1:5GuXa7vkL8u9FkFuWdVvfR5ix8hRB7DbOAaYULamFpc= +github.com/holiman/billy v0.0.0-20240216141850-2abb0c79d3c4 h1:X4egAf/gcS1zATw6wn4Ej8vjuVGxeHdan+bRb2ebyv4= +github.com/holiman/billy v0.0.0-20240216141850-2abb0c79d3c4/go.mod h1:5GuXa7vkL8u9FkFuWdVvfR5ix8hRB7DbOAaYULamFpc= github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao= github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA= github.com/holiman/uint256 v1.2.0/go.mod h1:y4ga/t+u+Xwd7CpDgZESaRcWy0I7XMlTMA25ApIH5Jw= @@ -435,8 +442,6 @@ github.com/libp2p/go-reuseport v0.4.0 h1:nR5KU7hD0WxXCJbmw7r2rhRYruNRl2koHw8fQsc github.com/libp2p/go-reuseport v0.4.0/go.mod h1:ZtI03j/wO5hZVDFo2jKywN6bYKWLOy8Se6DrI2E1cLU= github.com/libp2p/go-yamux/v4 v4.0.1 h1:FfDR4S1wj6Bw2Pqbc8Uz7pCxeRBPbwsBbEdfwiCypkQ= github.com/libp2p/go-yamux/v4 v4.0.1/go.mod h1:NWjl8ZTLOGlozrXSOZ/HlfG++39iKNnM5wwmtQP1YB4= -github.com/lightclient/go-ethereum v1.10.10-0.20231019143932-4d161dee0c4c h1:UsDsJSV7/j0C4aGqECXoPvdL6a6y7myXMptcnQjflEY= -github.com/lightclient/go-ethereum v1.10.10-0.20231019143932-4d161dee0c4c/go.mod h1:CLSRGaP4Ev4DJOP+JSk3NHyJIillQLJc/ZAyCLI8NOs= github.com/lithammer/dedent v1.1.0 h1:VNzHMVCBNG1j0fh3OrsFRkVUwStdDArbgBWoPAffktY= github.com/lithammer/dedent v1.1.0/go.mod h1:jrXYCQtgg0nJiN+StA2KgR7w6CiQNv9Fd/Z9BP0jIOc= github.com/lunixbochs/vtclean v1.0.0/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI= @@ -950,6 +955,7 @@ golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= From 67e8858a3a58fd3247701037411687de3f94da64 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Tue, 19 Mar 2024 16:43:26 +0100 Subject: [PATCH 242/387] simulators/eth2/dencun: remove go-ethereum module replacement --- simulators/eth2/dencun/go.mod | 6 +++--- simulators/eth2/dencun/go.sum | 20 +++++++++++++------- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/simulators/eth2/dencun/go.mod b/simulators/eth2/dencun/go.mod index d2bc3d07e3..ef287598b7 100644 --- a/simulators/eth2/dencun/go.mod +++ b/simulators/eth2/dencun/go.mod @@ -20,7 +20,7 @@ require ( github.com/VictoriaMetrics/fastcache v1.12.1 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/ferranbt/fastssz v0.1.2 // indirect - github.com/go-ole/go-ole v1.2.6 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect github.com/go-stack/stack v1.8.1 // indirect github.com/holiman/uint256 v1.2.4 // indirect github.com/mattn/go-runewidth v0.0.14 // indirect @@ -53,6 +53,7 @@ require ( github.com/consensys/gnark-crypto v0.12.1 // indirect github.com/containerd/cgroups v1.1.0 // indirect github.com/coreos/go-systemd/v22 v22.5.0 // indirect + github.com/crate-crypto/go-ipa v0.0.0-20231025140028-3c0104f4b233 // indirect github.com/crate-crypto/go-kzg-4844 v0.7.0 // indirect github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c // indirect github.com/deckarep/golang-set/v2 v2.3.0 // indirect @@ -62,6 +63,7 @@ require ( github.com/ethereum/c-kzg-4844 v0.4.0 // indirect github.com/flynn/noise v1.1.0 // indirect github.com/francoispqt/gojay v1.2.13 // indirect + github.com/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46 // indirect github.com/getsentry/sentry-go v0.20.0 // indirect github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect github.com/godbus/dbus/v5 v5.1.0 // indirect @@ -178,6 +180,4 @@ replace github.com/protolambda/eth2api => github.com/marioevz/eth2api v0.0.0-202 replace github.com/protolambda/zrnt => github.com/marioevz/zrnt v0.26.2-0.20231109183115-d2098ec1f42c -replace github.com/ethereum/go-ethereum => github.com/lightclient/go-ethereum v1.10.10-0.20231019143932-4d161dee0c4c - replace github.com/protolambda/ztyp => github.com/marioevz/ztyp v0.0.0-20231106221254-dd6f24f13fd9 diff --git a/simulators/eth2/dencun/go.sum b/simulators/eth2/dencun/go.sum index 449d6acd49..3bd6b36439 100644 --- a/simulators/eth2/dencun/go.sum +++ b/simulators/eth2/dencun/go.sum @@ -124,6 +124,8 @@ github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:ma github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/crate-crypto/go-ipa v0.0.0-20231025140028-3c0104f4b233 h1:d28BXYi+wUpz1KBmiF9bWrjEMacUEREV6MBi2ODnrfQ= +github.com/crate-crypto/go-ipa v0.0.0-20231025140028-3c0104f4b233/go.mod h1:geZJZH3SzKCqnz5VT0q/DyIG/tvu/dZk+VIfXicupJs= github.com/crate-crypto/go-kzg-4844 v0.7.0 h1:C0vgZRk4q4EZ/JgPfzuSoxdCq3C3mOZMBShovmncxvA= github.com/crate-crypto/go-kzg-4844 v0.7.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= @@ -160,6 +162,8 @@ github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7 github.com/etcd-io/bbolt v1.3.3/go.mod h1:ZF2nL25h33cCyBtcyWeZ2/I3HQOfTP+0PIEvHjkjCrw= github.com/ethereum/c-kzg-4844 v0.4.0 h1:3MS1s4JtA868KpJxroZoepdV0ZKBp3u/O5HcZ7R3nlY= github.com/ethereum/c-kzg-4844 v0.4.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= +github.com/ethereum/go-ethereum v1.13.14 h1:EwiY3FZP94derMCIam1iW4HFVrSgIcpsu0HwTQtm6CQ= +github.com/ethereum/go-ethereum v1.13.14/go.mod h1:TN8ZiHrdJwSe8Cb6x+p0hs5CxhJZPbqB7hHkaUXcmIU= github.com/ethereum/hive v0.0.0-20240319152821-ae224371b4e5 h1:2Rc3v1mqWgUl8gSHFh7+FmVcyB1AI/9THxhEDjNK+PI= github.com/ethereum/hive v0.0.0-20240319152821-ae224371b4e5/go.mod h1:MGwUXPGco6YS3brOf5WEILfUnnUL/XuX1224ab3D7XA= github.com/ethereum/hive/simulators/eth2/common v0.0.0-20230316220410-1364352c32a6 h1:LcSUNGwQuJyR/gdPcsif57yKX+3MyhpoAuChzR8k6Yk= @@ -171,8 +175,8 @@ github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072/go.mod github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= github.com/ferranbt/fastssz v0.1.2 h1:Dky6dXlngF6Qjc+EfDipAkE83N5I5DE68bY6O0VLNPk= github.com/ferranbt/fastssz v0.1.2/go.mod h1:X5UPrE2u1UJjxHA8X54u04SBwdAQjG2sFtWs39YxyWs= -github.com/fjl/memsize v0.0.1 h1:+zhkb+dhUgx0/e+M8sF0QqiouvMQUiKR+QYvdxIOKcQ= -github.com/fjl/memsize v0.0.1/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= +github.com/fjl/memsize v0.0.2 h1:27txuSD9or+NZlnOWdKUxeBzTAUkWCVh+4Gf2dWFOzA= +github.com/fjl/memsize v0.0.2/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= github.com/flynn/noise v1.1.0 h1:KjPQoQCEFdZDiP03phOvGi11+SVVhBG2wOWAorLsstg= github.com/flynn/noise v1.1.0/go.mod h1:xbMo+0i6+IGbYdJhF31t2eR1BIU0CYc12+BNAKwUTag= @@ -188,6 +192,8 @@ github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbS github.com/gavv/httpexpect v2.0.0+incompatible/go.mod h1:x+9tiU1YnrOvnB725RkpoLv1M62hOWzwo5OXotisrKc= github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08 h1:f6D9Hr8xV8uYKlyuj8XIruxlh9WjVjdh1gIicAS7ays= github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= +github.com/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46 h1:BAIP2GihuqhwdILrV+7GJel5lyPV3u1+PgzrWLc0TkE= +github.com/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46/go.mod h1:QNpY22eby74jVhqH4WhDLDwxc/vqsern6pW+u2kbkpc= github.com/getsentry/sentry-go v0.12.0/go.mod h1:NSap0JBYWzHND8oMbyi0+XZhUalc1TBdRL1M71JZW2c= github.com/getsentry/sentry-go v0.20.0 h1:bwXW98iMRIWxn+4FgPW7vMrjmbym6HblXALmhjHmQaQ= github.com/getsentry/sentry-go v0.20.0/go.mod h1:lc76E2QywIyW8WuBnwl8Lc4bkmQH4+w1gwTf25trprY= @@ -207,8 +213,9 @@ github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTg github.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY= github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab/go.mod h1:/P9AEU963A2AYjv4d1V5eVL1CQbEJq6aCNHDDjibzu8= -github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= @@ -334,8 +341,8 @@ github.com/hashicorp/golang-lru/v2 v2.0.5/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyf github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/herumi/bls-eth-go-binary v1.28.1 h1:fcIZ48y5EE9973k05XjE8+P3YiQgjZz4JI/YabAm8KA= github.com/herumi/bls-eth-go-binary v1.28.1/go.mod h1:luAnRm3OsMQeokhGzpYmc0ZKwawY7o87PUEP11Z7r7U= -github.com/holiman/billy v0.0.0-20230718173358-1c7e68d277a7 h1:3JQNjnMRil1yD0IfZKHF9GxxWKDJGj8I0IqOUol//sw= -github.com/holiman/billy v0.0.0-20230718173358-1c7e68d277a7/go.mod h1:5GuXa7vkL8u9FkFuWdVvfR5ix8hRB7DbOAaYULamFpc= +github.com/holiman/billy v0.0.0-20240216141850-2abb0c79d3c4 h1:X4egAf/gcS1zATw6wn4Ej8vjuVGxeHdan+bRb2ebyv4= +github.com/holiman/billy v0.0.0-20240216141850-2abb0c79d3c4/go.mod h1:5GuXa7vkL8u9FkFuWdVvfR5ix8hRB7DbOAaYULamFpc= github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao= github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA= github.com/holiman/uint256 v1.2.0/go.mod h1:y4ga/t+u+Xwd7CpDgZESaRcWy0I7XMlTMA25ApIH5Jw= @@ -437,8 +444,6 @@ github.com/libp2p/go-reuseport v0.4.0 h1:nR5KU7hD0WxXCJbmw7r2rhRYruNRl2koHw8fQsc github.com/libp2p/go-reuseport v0.4.0/go.mod h1:ZtI03j/wO5hZVDFo2jKywN6bYKWLOy8Se6DrI2E1cLU= github.com/libp2p/go-yamux/v4 v4.0.1 h1:FfDR4S1wj6Bw2Pqbc8Uz7pCxeRBPbwsBbEdfwiCypkQ= github.com/libp2p/go-yamux/v4 v4.0.1/go.mod h1:NWjl8ZTLOGlozrXSOZ/HlfG++39iKNnM5wwmtQP1YB4= -github.com/lightclient/go-ethereum v1.10.10-0.20231019143932-4d161dee0c4c h1:UsDsJSV7/j0C4aGqECXoPvdL6a6y7myXMptcnQjflEY= -github.com/lightclient/go-ethereum v1.10.10-0.20231019143932-4d161dee0c4c/go.mod h1:CLSRGaP4Ev4DJOP+JSk3NHyJIillQLJc/ZAyCLI8NOs= github.com/lithammer/dedent v1.1.0 h1:VNzHMVCBNG1j0fh3OrsFRkVUwStdDArbgBWoPAffktY= github.com/lithammer/dedent v1.1.0/go.mod h1:jrXYCQtgg0nJiN+StA2KgR7w6CiQNv9Fd/Z9BP0jIOc= github.com/lunixbochs/vtclean v1.0.0/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI= @@ -950,6 +955,7 @@ golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= From c548e031f77fd201545739d726c8fc2de73ee3ec Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Tue, 19 Mar 2024 16:43:36 +0100 Subject: [PATCH 243/387] simulators/eth2: update go.work.sum --- simulators/eth2/go.work.sum | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/simulators/eth2/go.work.sum b/simulators/eth2/go.work.sum index f5147feb09..e14a000ac6 100644 --- a/simulators/eth2/go.work.sum +++ b/simulators/eth2/go.work.sum @@ -723,6 +723,7 @@ github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfc github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/crate-crypto/go-ipa v0.0.0-20220523130400-f11357ae11c7/go.mod h1:gFnFS95y8HstDP6P9pPwzrxOOC5TRDkwbM+ao15ChAI= github.com/crate-crypto/go-ipa v0.0.0-20230601170251-1830d0757c80/go.mod h1:gzbVz57IDJgQ9rLQwfSk696JGWof8ftznEL9GoAv3NI= +github.com/crate-crypto/go-ipa v0.0.0-20231025140028-3c0104f4b233 h1:d28BXYi+wUpz1KBmiF9bWrjEMacUEREV6MBi2ODnrfQ= github.com/crate-crypto/go-ipa v0.0.0-20231025140028-3c0104f4b233/go.mod h1:geZJZH3SzKCqnz5VT0q/DyIG/tvu/dZk+VIfXicupJs= github.com/crate-crypto/go-kzg-4844 v0.3.0/go.mod h1:SBP7ikXEgDnUPONgm33HtuDZEDtWa3L4QtN1ocJSEQ4= github.com/crate-crypto/go-kzg-4844 v0.6.1-0.20231019121413-3621cc59f0c7/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= @@ -817,6 +818,9 @@ github.com/ethereum/c-kzg-4844 v0.3.0/go.mod h1:WI2Nd82DMZAAZI1wV2neKGost9EKjvbp github.com/ethereum/c-kzg-4844 v0.3.1/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= github.com/ethereum/c-kzg-4844 v0.3.2-0.20231019020040-748283cced54/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= github.com/ethereum/go-ethereum v1.12.2-0.20230815181937-e0b119884c6a/go.mod h1:1JU/x0JQLBndZb2727eswdCzyF2rFd8SZUj7HDQuVqc= +github.com/ethereum/go-ethereum v1.13.1/go.mod h1:xHQKzwkHSl0gnSjZK1mWa06XEdm9685AHqhRknOzqGQ= +github.com/ethereum/go-ethereum v1.13.14 h1:EwiY3FZP94derMCIam1iW4HFVrSgIcpsu0HwTQtm6CQ= +github.com/ethereum/go-ethereum v1.13.14/go.mod h1:TN8ZiHrdJwSe8Cb6x+p0hs5CxhJZPbqB7hHkaUXcmIU= github.com/ethereum/hive v0.0.0-20230401205547-71595beab31d/go.mod h1:zKL2DscVzRusnGVpseAvLrXGJ3qrGHuSfOIrv4JfnRk= github.com/ethereum/hive/hiveproxy v0.0.0-20230313101845-c7dfe88c8138 h1:Y74Ksk90DLCMWnpOfOEWRLxVjsf/67vY+hX5kWu9UY0= github.com/ethereum/hive/hiveproxy v0.0.0-20230313101845-c7dfe88c8138/go.mod h1:1LWNU6/EYsIOXZGa2KdklD1ET77gLTeEyhq+WTZ+37o= @@ -828,6 +832,7 @@ github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYF github.com/ferranbt/fastssz v0.0.0-20210120143747-11b9eff30ea9/go.mod h1:DyEu2iuLBnb/T51BlsiO3yLYdJC6UbGMrIkqK1KmQxM= github.com/fjl/gencodec v0.0.0-20220412091415-8bb9e558978c/go.mod h1:AzA8Lj6YtixmJWL+wkKoBGsLWy9gFrAzi4g+5bCKwpY= github.com/fjl/gencodec v0.0.0-20230517082657-f9840df7b83e/go.mod h1:AzA8Lj6YtixmJWL+wkKoBGsLWy9gFrAzi4g+5bCKwpY= +github.com/fjl/memsize v0.0.2/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= github.com/flosch/pongo2 v0.0.0-20190707114632-bbf5a6c351f4/go.mod h1:T9YF2M40nIgbVgp3rreNmTged+9HrbNTIQf1PsaIiTA= github.com/flosch/pongo2/v4 v4.0.2/go.mod h1:B5ObFANs/36VwxxlgKpdchIJHMvHB562PW+BWPhwZD8= github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= @@ -848,6 +853,7 @@ github.com/garyburd/redigo v1.1.1-0.20170914051019-70e1b1943d4f/go.mod h1:NR3MbY github.com/garyburd/redigo v1.6.0/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY= github.com/gballet/go-verkle v0.0.0-20220902153445-097bd83b7732/go.mod h1:o/XfIXWi4/GqbQirfRm5uTbXMG5NpqxkxblnbZ+QM9I= github.com/gballet/go-verkle v0.0.0-20230607174250-df487255f46b/go.mod h1:CDncRYVRSDqwakm282WEkjfaAj1hxU/v5RXxk5nXOiI= +github.com/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46 h1:BAIP2GihuqhwdILrV+7GJel5lyPV3u1+PgzrWLc0TkE= github.com/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46/go.mod h1:QNpY22eby74jVhqH4WhDLDwxc/vqsern6pW+u2kbkpc= github.com/gdamore/encoding v1.0.0/go.mod h1:alR0ol34c49FCSBLjhosxzcPHQbf2trDkoo5dl+VrEg= github.com/gdamore/tcell/v2 v2.4.1-0.20210905002822-f057f0a857a1/go.mod h1:Az6Jt+M5idSED2YPGtwnfJV0kXohgdCBPmHGSYc1r04= @@ -892,6 +898,7 @@ github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbV github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8= github.com/go-ole/go-ole v1.2.5/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0= github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= @@ -1092,6 +1099,7 @@ github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/J github.com/hashicorp/yamux v0.1.1/go.mod h1:CtWFDAQgb7dxtzFs4tWbplKIe2jSi3+5vKbgIO0SLnQ= github.com/herumi/bls-eth-go-binary v0.0.0-20210130185500-57372fb27371/go.mod h1:luAnRm3OsMQeokhGzpYmc0ZKwawY7o87PUEP11Z7r7U= github.com/herumi/bls-eth-go-binary v0.0.0-20210917013441-d37c07cfda4e/go.mod h1:luAnRm3OsMQeokhGzpYmc0ZKwawY7o87PUEP11Z7r7U= +github.com/holiman/billy v0.0.0-20240216141850-2abb0c79d3c4/go.mod h1:5GuXa7vkL8u9FkFuWdVvfR5ix8hRB7DbOAaYULamFpc= github.com/holiman/goevmlab v0.0.0-20221201133036-b31966a5267d/go.mod h1:tQJ4EfAokPShVDyEwKslIWKyt0qA/z8u+iK3kAwO424= github.com/holiman/goevmlab v0.0.0-20221207202144-89074274e1b7/go.mod h1:t5n9hEKnVqrEclta+MoEDjI2D9X7bi8OiWGmyYuNhMk= github.com/holiman/goevmlab v0.0.0-20230917164918-f3777d0b880b/go.mod h1:Xf54jEqUJ0PwTEF9Z6e8FSLpnLpyB0QUfdHA3you/sw= @@ -1810,6 +1818,7 @@ golang.org/x/exp v0.0.0-20230725012225-302865e7556b/go.mod h1:FXUEEKJgO7OQYeo8N0 golang.org/x/exp v0.0.0-20230810033253-352e893a4cad/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc= golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63/go.mod h1:0v4NqG35kSWCMzLaMeX+IQrlSnVE/bqGSyC2cz/9Le8= golang.org/x/exp v0.0.0-20231006140011-7918f672742d/go.mod h1:ldy0pHrwJyGW56pPQzzkH36rKxoZW1tw7ZJpeKx+hdo= +golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa/go.mod h1:zk2irFbV9DP96SEBUUAy67IdHUaZuSnrz1n472HUCLE= golang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611/go.mod h1:iRJReGqOEeBhDZGkGbynYwcHlctCvnjTYIamk7uXpHI= golang.org/x/exp/typeparams v0.0.0-20231108232855-2478ac86f678/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= @@ -1894,6 +1903,7 @@ golang.org/x/net v0.12.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA= golang.org/x/net v0.13.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA= golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= +golang.org/x/net v0.18.0/go.mod h1:/czyP5RqHAH4odGYxBJ1qz0+CE5WZ+2j1YgoEo8F2jQ= golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U= golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= golang.org/x/oauth2 v0.0.0-20170207211851-4464e7848382/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -2125,6 +2135,7 @@ golang.org/x/tools v0.9.1/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc= golang.org/x/tools v0.12.0/go.mod h1:Sc0INKfu04TlqNoRA1hgpFZbhYXHPr4V5DzpSBTPqQM= golang.org/x/tools v0.12.1-0.20230815132531-74c255bcf846/go.mod h1:Sc0INKfu04TlqNoRA1hgpFZbhYXHPr4V5DzpSBTPqQM= golang.org/x/tools v0.14.0/go.mod h1:uYBEerGOWcJyEORxN+Ek8+TT266gXkNlHdJBwexUsBg= +golang.org/x/tools v0.15.0/go.mod h1:hpksKq4dtpQWS1uQ61JkdqWM3LscIS6Slf+VVkm+wQk= golang.org/x/tools v0.16.0/go.mod h1:kYVVN6I1mBNoB1OX+noeBjbRk4IUEPa7JJ+TJMEooJ0= golang.org/x/tools v0.16.1/go.mod h1:kYVVN6I1mBNoB1OX+noeBjbRk4IUEPa7JJ+TJMEooJ0= golang.org/x/tools v0.17.0/go.mod h1:xsh6VxdV005rRVaS6SSAf9oiAqljS7UZUacMZ8Bnsps= From 3e375964c701a4939c66e4f441d2c2bd365f6e53 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Tue, 19 Mar 2024 16:44:45 +0100 Subject: [PATCH 244/387] go.mod: upgrade golang.org/x/crypto --- go.mod | 6 +++--- go.sum | 4 ++++ 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index c28617285e..6fd2de0a49 100644 --- a/go.mod +++ b/go.mod @@ -15,7 +15,7 @@ require ( github.com/holiman/uint256 v1.2.3 github.com/lithammer/dedent v1.1.0 golang.org/x/exp v0.0.0-20230905200255-921286631fa9 - golang.org/x/net v0.17.0 + golang.org/x/net v0.21.0 gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1 gopkg.in/yaml.v3 v3.0.1 ) @@ -86,11 +86,11 @@ require ( github.com/tklauser/go-sysconf v0.3.12 // indirect github.com/tklauser/numcpus v0.6.1 // indirect github.com/yusufpapurcu/wmi v1.2.2 // indirect - golang.org/x/crypto v0.14.0 // indirect + golang.org/x/crypto v0.21.0 // indirect golang.org/x/mod v0.12.0 // indirect golang.org/x/sync v0.3.0 // indirect golang.org/x/sys v0.18.0 // indirect - golang.org/x/text v0.13.0 // indirect + golang.org/x/text v0.14.0 // indirect golang.org/x/tools v0.13.0 // indirect google.golang.org/protobuf v1.33.0 // indirect rsc.io/tmplfunc v0.0.3 // indirect diff --git a/go.sum b/go.sum index dab917d47a..08e0ac9fff 100644 --- a/go.sum +++ b/go.sum @@ -389,6 +389,8 @@ golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= +golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= +golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g= golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k= @@ -425,6 +427,7 @@ golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= +golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -487,6 +490,7 @@ golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181221001348-537d06c36207/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= From 52c0b2e967e3379f4277c2b7d6b4fc0116016a98 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Tue, 19 Mar 2024 16:44:57 +0100 Subject: [PATCH 245/387] simulators/devp2p: upgrade golang.org/x/crypto --- simulators/devp2p/go.mod | 2 +- simulators/devp2p/go.sum | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/simulators/devp2p/go.mod b/simulators/devp2p/go.mod index 06604e08b4..d4a3e1d6d8 100644 --- a/simulators/devp2p/go.mod +++ b/simulators/devp2p/go.mod @@ -29,7 +29,7 @@ require ( github.com/tklauser/go-sysconf v0.3.12 // indirect github.com/tklauser/numcpus v0.6.1 // indirect github.com/yusufpapurcu/wmi v1.2.2 // indirect - golang.org/x/crypto v0.14.0 // indirect + golang.org/x/crypto v0.21.0 // indirect golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect golang.org/x/mod v0.12.0 // indirect golang.org/x/sys v0.18.0 // indirect diff --git a/simulators/devp2p/go.sum b/simulators/devp2p/go.sum index 3477a1e176..0e500034d5 100644 --- a/simulators/devp2p/go.sum +++ b/simulators/devp2p/go.sum @@ -101,8 +101,8 @@ github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQ golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= -golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= +golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= +golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g= golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= @@ -116,8 +116,8 @@ golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwY golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= -golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= +golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4= +golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -151,8 +151,8 @@ golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= -golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= From 30e9192c53187b4c0e1e229385a419d7b1ef78cd Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Tue, 19 Mar 2024 16:45:09 +0100 Subject: [PATCH 246/387] simulators/eth2/common: upgrade golang.org/x/crypto --- simulators/eth2/common/go.mod | 3 +-- simulators/eth2/common/go.sum | 4 ++-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/simulators/eth2/common/go.mod b/simulators/eth2/common/go.mod index 9e765e40fd..09e2cf5d91 100644 --- a/simulators/eth2/common/go.mod +++ b/simulators/eth2/common/go.mod @@ -153,12 +153,11 @@ require ( go.uber.org/mock v0.4.0 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.27.0 // indirect - golang.org/x/crypto v0.19.0 // indirect + golang.org/x/crypto v0.21.0 // indirect golang.org/x/mod v0.15.0 // indirect golang.org/x/net v0.21.0 // indirect golang.org/x/sync v0.6.0 // indirect golang.org/x/sys v0.18.0 // indirect - golang.org/x/term v0.18.0 // indirect golang.org/x/text v0.14.0 // indirect golang.org/x/tools v0.18.0 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20230711160842-782d3b101e98 // indirect diff --git a/simulators/eth2/common/go.sum b/simulators/eth2/common/go.sum index 5c84cb1282..1ebcf42711 100644 --- a/simulators/eth2/common/go.sum +++ b/simulators/eth2/common/go.sum @@ -803,8 +803,8 @@ golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.19.0 h1:ENy+Az/9Y1vSrlrvBSyna3PITt4tiZLf7sgCjZBX7Wo= -golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= +golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= +golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= From c2f260dda002fbce94a729178c7ba571665174f3 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Tue, 19 Mar 2024 16:45:20 +0100 Subject: [PATCH 247/387] simulators/eth2/dencun: upgrade golang.org/x/crypto --- simulators/eth2/dencun/go.mod | 3 +-- simulators/eth2/dencun/go.sum | 4 ++-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/simulators/eth2/dencun/go.mod b/simulators/eth2/dencun/go.mod index ef287598b7..227071e9cc 100644 --- a/simulators/eth2/dencun/go.mod +++ b/simulators/eth2/dencun/go.mod @@ -159,12 +159,11 @@ require ( go.uber.org/mock v0.4.0 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.27.0 // indirect - golang.org/x/crypto v0.19.0 // indirect + golang.org/x/crypto v0.21.0 // indirect golang.org/x/exp v0.0.0-20240213143201-ec583247a57a // indirect golang.org/x/mod v0.15.0 // indirect golang.org/x/net v0.21.0 // indirect golang.org/x/sync v0.6.0 // indirect - golang.org/x/term v0.18.0 // indirect golang.org/x/tools v0.18.0 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20230711160842-782d3b101e98 // indirect google.golang.org/grpc v1.58.3 // indirect diff --git a/simulators/eth2/dencun/go.sum b/simulators/eth2/dencun/go.sum index 3bd6b36439..3fb69f914b 100644 --- a/simulators/eth2/dencun/go.sum +++ b/simulators/eth2/dencun/go.sum @@ -803,8 +803,8 @@ golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.19.0 h1:ENy+Az/9Y1vSrlrvBSyna3PITt4tiZLf7sgCjZBX7Wo= -golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= +golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= +golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= From f8fabe2f043380409052e4e41807203c0ee1148b Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Tue, 19 Mar 2024 16:45:46 +0100 Subject: [PATCH 248/387] simulators/eth2/engine: upgrade golang.org/x/crypto --- simulators/eth2/engine/go.mod | 4 ++-- simulators/eth2/engine/go.sum | 12 ++++++------ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/simulators/eth2/engine/go.mod b/simulators/eth2/engine/go.mod index e1419817e1..bc0cd351c5 100644 --- a/simulators/eth2/engine/go.mod +++ b/simulators/eth2/engine/go.mod @@ -30,7 +30,7 @@ require ( github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a // indirect github.com/tklauser/go-sysconf v0.3.12 // indirect golang.org/x/sys v0.18.0 // indirect - golang.org/x/text v0.13.0 // indirect + golang.org/x/text v0.14.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) @@ -95,7 +95,7 @@ require ( github.com/wealdtech/go-eth2-types/v2 v2.8.0 // indirect github.com/wealdtech/go-eth2-util v1.8.0 // indirect github.com/yusufpapurcu/wmi v1.2.2 // indirect - golang.org/x/crypto v0.14.0 // indirect + golang.org/x/crypto v0.21.0 // indirect golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect golang.org/x/mod v0.12.0 // indirect golang.org/x/sync v0.3.0 // indirect diff --git a/simulators/eth2/engine/go.sum b/simulators/eth2/engine/go.sum index b7fcee8f7b..a7065565d3 100644 --- a/simulators/eth2/engine/go.sum +++ b/simulators/eth2/engine/go.sum @@ -429,8 +429,8 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= -golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= +golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= +golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g= golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k= @@ -465,8 +465,8 @@ golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT golang.org/x/net v0.0.0-20211008194852-3b03d305991f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= -golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= +golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4= +golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -526,8 +526,8 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= -golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= From 45b2ec119dbf02030d6d859fd8dedda6fde20c0a Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Tue, 19 Mar 2024 16:45:59 +0100 Subject: [PATCH 249/387] simulators/eth2/testnet: upgrade golang.org/x/crypto --- simulators/eth2/testnet/go.mod | 4 ++-- simulators/eth2/testnet/go.sum | 12 ++++++------ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/simulators/eth2/testnet/go.mod b/simulators/eth2/testnet/go.mod index 49c3c6ca82..f044ca8e34 100644 --- a/simulators/eth2/testnet/go.mod +++ b/simulators/eth2/testnet/go.mod @@ -88,11 +88,11 @@ require ( github.com/wealdtech/go-eth2-types/v2 v2.8.0 // indirect github.com/wealdtech/go-eth2-util v1.8.0 // indirect github.com/yusufpapurcu/wmi v1.2.2 // indirect - golang.org/x/crypto v0.14.0 // indirect + golang.org/x/crypto v0.21.0 // indirect golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect golang.org/x/mod v0.12.0 // indirect golang.org/x/sync v0.3.0 // indirect - golang.org/x/text v0.13.0 // indirect + golang.org/x/text v0.14.0 // indirect golang.org/x/tools v0.13.0 // indirect google.golang.org/protobuf v1.33.0 // indirect gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1 // indirect diff --git a/simulators/eth2/testnet/go.sum b/simulators/eth2/testnet/go.sum index 229221d6a4..61dc52285c 100644 --- a/simulators/eth2/testnet/go.sum +++ b/simulators/eth2/testnet/go.sum @@ -426,8 +426,8 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= -golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= +golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= +golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g= golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k= @@ -462,8 +462,8 @@ golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT golang.org/x/net v0.0.0-20211008194852-3b03d305991f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= -golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= +golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4= +golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -523,8 +523,8 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= -golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= From 74d3247252cf06395b5f1ef14c75133b0571bf0f Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Tue, 19 Mar 2024 16:46:11 +0100 Subject: [PATCH 250/387] simulators/eth2/withdrawals: upgrade golang.org/x/crypto --- simulators/eth2/withdrawals/go.mod | 4 ++-- simulators/eth2/withdrawals/go.sum | 12 ++++++------ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/simulators/eth2/withdrawals/go.mod b/simulators/eth2/withdrawals/go.mod index c34cefad2f..7cffc6ddef 100644 --- a/simulators/eth2/withdrawals/go.mod +++ b/simulators/eth2/withdrawals/go.mod @@ -32,7 +32,7 @@ require ( github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a // indirect github.com/tklauser/go-sysconf v0.3.12 // indirect golang.org/x/sys v0.18.0 // indirect - golang.org/x/text v0.13.0 // indirect + golang.org/x/text v0.14.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) @@ -96,7 +96,7 @@ require ( github.com/wealdtech/go-eth2-types/v2 v2.8.0 // indirect github.com/wealdtech/go-eth2-util v1.8.0 // indirect github.com/yusufpapurcu/wmi v1.2.2 // indirect - golang.org/x/crypto v0.14.0 // indirect + golang.org/x/crypto v0.21.0 // indirect golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect golang.org/x/mod v0.12.0 // indirect golang.org/x/sync v0.3.0 // indirect diff --git a/simulators/eth2/withdrawals/go.sum b/simulators/eth2/withdrawals/go.sum index 7d9d44295a..9fcb985f96 100644 --- a/simulators/eth2/withdrawals/go.sum +++ b/simulators/eth2/withdrawals/go.sum @@ -432,8 +432,8 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= -golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= +golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= +golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g= golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k= @@ -468,8 +468,8 @@ golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT golang.org/x/net v0.0.0-20211008194852-3b03d305991f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= -golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= +golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4= +golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -529,8 +529,8 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= -golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= From 1e9c1ece14d88317c819583059f833114cf8ec70 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Tue, 19 Mar 2024 16:46:23 +0100 Subject: [PATCH 251/387] simulators/ethereum/consensus: upgrade golang.org/x/crypto --- simulators/ethereum/consensus/go.mod | 4 ++-- simulators/ethereum/consensus/go.sum | 12 ++++++------ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/simulators/ethereum/consensus/go.mod b/simulators/ethereum/consensus/go.mod index b6cae6f8e5..910343a481 100644 --- a/simulators/ethereum/consensus/go.mod +++ b/simulators/ethereum/consensus/go.mod @@ -63,12 +63,12 @@ require ( github.com/tklauser/go-sysconf v0.3.12 // indirect github.com/tklauser/numcpus v0.6.1 // indirect github.com/yusufpapurcu/wmi v1.2.2 // indirect - golang.org/x/crypto v0.14.0 // indirect + golang.org/x/crypto v0.21.0 // indirect golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect golang.org/x/mod v0.12.0 // indirect golang.org/x/sync v0.3.0 // indirect golang.org/x/sys v0.18.0 // indirect - golang.org/x/text v0.13.0 // indirect + golang.org/x/text v0.14.0 // indirect golang.org/x/tools v0.13.0 // indirect google.golang.org/protobuf v1.33.0 // indirect gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1 // indirect diff --git a/simulators/ethereum/consensus/go.sum b/simulators/ethereum/consensus/go.sum index 5ff9564d48..c9579bb4c9 100644 --- a/simulators/ethereum/consensus/go.sum +++ b/simulators/ethereum/consensus/go.sum @@ -349,8 +349,8 @@ golang.org/x/crypto v0.0.0-20191227163750-53104e6ec876/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= -golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= +golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= +golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g= golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k= @@ -385,8 +385,8 @@ golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT golang.org/x/net v0.0.0-20211008194852-3b03d305991f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= -golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= +golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4= +golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -443,8 +443,8 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= -golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181221001348-537d06c36207/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= From 071d94fb63c6f0af48effe483b0a32a7971f4fe0 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Tue, 19 Mar 2024 16:46:37 +0100 Subject: [PATCH 252/387] simulators/ethereum/engine: upgrade golang.org/x/crypto --- simulators/ethereum/engine/go.mod | 6 +++--- simulators/ethereum/engine/go.sum | 12 ++++++------ 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/simulators/ethereum/engine/go.mod b/simulators/ethereum/engine/go.mod index 5013b18df8..cda314d159 100644 --- a/simulators/ethereum/engine/go.mod +++ b/simulators/ethereum/engine/go.mod @@ -92,12 +92,12 @@ require ( github.com/urfave/cli/v2 v2.25.7 // indirect github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 // indirect github.com/yusufpapurcu/wmi v1.2.2 // indirect - golang.org/x/crypto v0.14.0 // indirect + golang.org/x/crypto v0.21.0 // indirect golang.org/x/mod v0.12.0 // indirect - golang.org/x/net v0.17.0 // indirect + golang.org/x/net v0.21.0 // indirect golang.org/x/sync v0.4.0 // indirect golang.org/x/sys v0.18.0 // indirect - golang.org/x/text v0.13.0 // indirect + golang.org/x/text v0.14.0 // indirect golang.org/x/time v0.3.0 // indirect golang.org/x/tools v0.13.0 // indirect google.golang.org/protobuf v1.33.0 // indirect diff --git a/simulators/ethereum/engine/go.sum b/simulators/ethereum/engine/go.sum index e1805b432e..e833d4e8d7 100644 --- a/simulators/ethereum/engine/go.sum +++ b/simulators/ethereum/engine/go.sum @@ -419,8 +419,8 @@ golang.org/x/crypto v0.0.0-20191227163750-53104e6ec876/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= -golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= +golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= +golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g= golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k= @@ -455,8 +455,8 @@ golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT golang.org/x/net v0.0.0-20211008194852-3b03d305991f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= -golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= +golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4= +golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -515,8 +515,8 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= -golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= From 440edcef62e104d8b19562107e89fd3ac6209e67 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Tue, 19 Mar 2024 16:46:47 +0100 Subject: [PATCH 253/387] simulators/ethereum/graphql: upgrade golang.org/x/crypto --- simulators/ethereum/graphql/go.mod | 4 ++-- simulators/ethereum/graphql/go.sum | 12 ++++++------ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/simulators/ethereum/graphql/go.mod b/simulators/ethereum/graphql/go.mod index f3166d86bb..a3134364fd 100644 --- a/simulators/ethereum/graphql/go.mod +++ b/simulators/ethereum/graphql/go.mod @@ -63,12 +63,12 @@ require ( github.com/tklauser/go-sysconf v0.3.12 // indirect github.com/tklauser/numcpus v0.6.1 // indirect github.com/yusufpapurcu/wmi v1.2.2 // indirect - golang.org/x/crypto v0.14.0 // indirect + golang.org/x/crypto v0.21.0 // indirect golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect golang.org/x/mod v0.12.0 // indirect golang.org/x/sync v0.3.0 // indirect golang.org/x/sys v0.18.0 // indirect - golang.org/x/text v0.13.0 // indirect + golang.org/x/text v0.14.0 // indirect golang.org/x/tools v0.13.0 // indirect google.golang.org/protobuf v1.33.0 // indirect gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1 // indirect diff --git a/simulators/ethereum/graphql/go.sum b/simulators/ethereum/graphql/go.sum index 5ff9564d48..c9579bb4c9 100644 --- a/simulators/ethereum/graphql/go.sum +++ b/simulators/ethereum/graphql/go.sum @@ -349,8 +349,8 @@ golang.org/x/crypto v0.0.0-20191227163750-53104e6ec876/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= -golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= +golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= +golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g= golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k= @@ -385,8 +385,8 @@ golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT golang.org/x/net v0.0.0-20211008194852-3b03d305991f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= -golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= +golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4= +golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -443,8 +443,8 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= -golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181221001348-537d06c36207/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= From 11e34d921770c31f7d9d5ad103e4fecf7c3c6d05 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Tue, 19 Mar 2024 16:46:58 +0100 Subject: [PATCH 254/387] simulators/ethereum/pyspec: upgrade golang.org/x/crypto --- simulators/ethereum/pyspec/go.mod | 4 ++-- simulators/ethereum/pyspec/go.sum | 12 ++++++------ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/simulators/ethereum/pyspec/go.mod b/simulators/ethereum/pyspec/go.mod index 08ddfd8bd8..65e2f7bd98 100644 --- a/simulators/ethereum/pyspec/go.mod +++ b/simulators/ethereum/pyspec/go.mod @@ -65,12 +65,12 @@ require ( github.com/tklauser/go-sysconf v0.3.12 // indirect github.com/tklauser/numcpus v0.6.1 // indirect github.com/yusufpapurcu/wmi v1.2.2 // indirect - golang.org/x/crypto v0.14.0 // indirect + golang.org/x/crypto v0.21.0 // indirect golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect golang.org/x/mod v0.12.0 // indirect golang.org/x/sync v0.4.0 // indirect golang.org/x/sys v0.18.0 // indirect - golang.org/x/text v0.13.0 // indirect + golang.org/x/text v0.14.0 // indirect golang.org/x/tools v0.13.0 // indirect google.golang.org/protobuf v1.33.0 // indirect gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1 // indirect diff --git a/simulators/ethereum/pyspec/go.sum b/simulators/ethereum/pyspec/go.sum index 076a17dc43..4de09a3add 100644 --- a/simulators/ethereum/pyspec/go.sum +++ b/simulators/ethereum/pyspec/go.sum @@ -387,8 +387,8 @@ golang.org/x/crypto v0.0.0-20191227163750-53104e6ec876/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= -golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= +golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= +golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g= golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k= @@ -423,8 +423,8 @@ golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT golang.org/x/net v0.0.0-20211008194852-3b03d305991f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= -golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= +golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4= +golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -481,8 +481,8 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= -golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= From 853c38a29c31a9b91f3065d78511f7a793606d53 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Tue, 19 Mar 2024 16:47:09 +0100 Subject: [PATCH 255/387] simulators/ethereum/rpc-compat: upgrade golang.org/x/crypto --- simulators/ethereum/rpc-compat/go.mod | 2 +- simulators/ethereum/rpc-compat/go.sum | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/simulators/ethereum/rpc-compat/go.mod b/simulators/ethereum/rpc-compat/go.mod index c3ed7ab548..ff32cce993 100644 --- a/simulators/ethereum/rpc-compat/go.mod +++ b/simulators/ethereum/rpc-compat/go.mod @@ -36,7 +36,7 @@ require ( github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82 // indirect github.com/yudai/pp v2.0.1+incompatible // indirect github.com/yusufpapurcu/wmi v1.2.2 // indirect - golang.org/x/crypto v0.14.0 // indirect + golang.org/x/crypto v0.21.0 // indirect golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect golang.org/x/mod v0.12.0 // indirect golang.org/x/sys v0.18.0 // indirect diff --git a/simulators/ethereum/rpc-compat/go.sum b/simulators/ethereum/rpc-compat/go.sum index bb521b77c0..6eeb008e85 100644 --- a/simulators/ethereum/rpc-compat/go.sum +++ b/simulators/ethereum/rpc-compat/go.sum @@ -120,8 +120,8 @@ github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQ golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= -golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= +golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= +golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g= golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= @@ -135,8 +135,8 @@ golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwY golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= -golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= +golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4= +golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -170,8 +170,8 @@ golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= -golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= From 68c6b64a99dd81e228b3bfa24910a2cd08c45cd7 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Tue, 19 Mar 2024 16:47:23 +0100 Subject: [PATCH 256/387] simulators/ethereum/rpc: upgrade golang.org/x/crypto --- simulators/ethereum/rpc/go.mod | 4 ++-- simulators/ethereum/rpc/go.sum | 12 ++++++------ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/simulators/ethereum/rpc/go.mod b/simulators/ethereum/rpc/go.mod index 0f924b751c..4bdae9ab23 100644 --- a/simulators/ethereum/rpc/go.mod +++ b/simulators/ethereum/rpc/go.mod @@ -71,12 +71,12 @@ require ( github.com/tklauser/go-sysconf v0.3.12 // indirect github.com/tklauser/numcpus v0.6.1 // indirect github.com/yusufpapurcu/wmi v1.2.2 // indirect - golang.org/x/crypto v0.14.0 // indirect + golang.org/x/crypto v0.21.0 // indirect golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect golang.org/x/mod v0.12.0 // indirect golang.org/x/sync v0.3.0 // indirect golang.org/x/sys v0.18.0 // indirect - golang.org/x/text v0.13.0 // indirect + golang.org/x/text v0.14.0 // indirect golang.org/x/tools v0.13.0 // indirect google.golang.org/protobuf v1.33.0 // indirect gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1 // indirect diff --git a/simulators/ethereum/rpc/go.sum b/simulators/ethereum/rpc/go.sum index b203a982a5..ccc727cfb5 100644 --- a/simulators/ethereum/rpc/go.sum +++ b/simulators/ethereum/rpc/go.sum @@ -386,8 +386,8 @@ golang.org/x/crypto v0.0.0-20191227163750-53104e6ec876/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= -golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= +golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= +golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g= golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k= @@ -422,8 +422,8 @@ golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT golang.org/x/net v0.0.0-20211008194852-3b03d305991f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= -golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= +golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4= +golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -481,8 +481,8 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= -golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= From 53e60b032395083303dc158c979fe9f29cb88c83 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Tue, 19 Mar 2024 16:47:37 +0100 Subject: [PATCH 257/387] simulators/ethereum/sync: upgrade golang.org/x/crypto --- simulators/ethereum/sync/go.mod | 4 ++-- simulators/ethereum/sync/go.sum | 12 ++++++------ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/simulators/ethereum/sync/go.mod b/simulators/ethereum/sync/go.mod index 8f1b00ea1b..db85a6f772 100644 --- a/simulators/ethereum/sync/go.mod +++ b/simulators/ethereum/sync/go.mod @@ -62,12 +62,12 @@ require ( github.com/tklauser/go-sysconf v0.3.12 // indirect github.com/tklauser/numcpus v0.6.1 // indirect github.com/yusufpapurcu/wmi v1.2.2 // indirect - golang.org/x/crypto v0.14.0 // indirect + golang.org/x/crypto v0.21.0 // indirect golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect golang.org/x/mod v0.12.0 // indirect golang.org/x/sync v0.3.0 // indirect golang.org/x/sys v0.18.0 // indirect - golang.org/x/text v0.13.0 // indirect + golang.org/x/text v0.14.0 // indirect golang.org/x/tools v0.13.0 // indirect google.golang.org/protobuf v1.33.0 // indirect gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1 // indirect diff --git a/simulators/ethereum/sync/go.sum b/simulators/ethereum/sync/go.sum index d643fcd748..fa7c31f001 100644 --- a/simulators/ethereum/sync/go.sum +++ b/simulators/ethereum/sync/go.sum @@ -383,8 +383,8 @@ golang.org/x/crypto v0.0.0-20191227163750-53104e6ec876/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= -golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= +golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= +golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g= golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k= @@ -419,8 +419,8 @@ golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT golang.org/x/net v0.0.0-20211008194852-3b03d305991f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= -golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= +golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4= +golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -477,8 +477,8 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= -golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= From c613118a1959397c8bd47824b9064382e32e14a3 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Tue, 19 Mar 2024 16:47:47 +0100 Subject: [PATCH 258/387] simulators/smoke: upgrade golang.org/x/crypto --- simulators/smoke/clique/go.mod | 2 +- simulators/smoke/clique/go.sum | 12 ++++++------ simulators/smoke/genesis/go.mod | 2 +- simulators/smoke/genesis/go.sum | 12 ++++++------ simulators/smoke/network/go.mod | 2 +- simulators/smoke/network/go.sum | 12 ++++++------ 6 files changed, 21 insertions(+), 21 deletions(-) diff --git a/simulators/smoke/clique/go.mod b/simulators/smoke/clique/go.mod index 2cfab2e44f..e46f5ff291 100644 --- a/simulators/smoke/clique/go.mod +++ b/simulators/smoke/clique/go.mod @@ -26,7 +26,7 @@ require ( github.com/tklauser/go-sysconf v0.3.12 // indirect github.com/tklauser/numcpus v0.6.1 // indirect github.com/yusufpapurcu/wmi v1.2.2 // indirect - golang.org/x/crypto v0.14.0 // indirect + golang.org/x/crypto v0.21.0 // indirect golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect golang.org/x/mod v0.12.0 // indirect golang.org/x/sys v0.18.0 // indirect diff --git a/simulators/smoke/clique/go.sum b/simulators/smoke/clique/go.sum index f1a59624ea..4fff58f235 100644 --- a/simulators/smoke/clique/go.sum +++ b/simulators/smoke/clique/go.sum @@ -99,8 +99,8 @@ github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQ golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= -golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= +golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= +golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g= golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= @@ -114,8 +114,8 @@ golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwY golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= -golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= +golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4= +golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -149,8 +149,8 @@ golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= -golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= diff --git a/simulators/smoke/genesis/go.mod b/simulators/smoke/genesis/go.mod index c5e5ecd82a..e81ab43038 100644 --- a/simulators/smoke/genesis/go.mod +++ b/simulators/smoke/genesis/go.mod @@ -26,7 +26,7 @@ require ( github.com/tklauser/go-sysconf v0.3.12 // indirect github.com/tklauser/numcpus v0.6.1 // indirect github.com/yusufpapurcu/wmi v1.2.2 // indirect - golang.org/x/crypto v0.14.0 // indirect + golang.org/x/crypto v0.21.0 // indirect golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect golang.org/x/mod v0.12.0 // indirect golang.org/x/sys v0.18.0 // indirect diff --git a/simulators/smoke/genesis/go.sum b/simulators/smoke/genesis/go.sum index f1a59624ea..4fff58f235 100644 --- a/simulators/smoke/genesis/go.sum +++ b/simulators/smoke/genesis/go.sum @@ -99,8 +99,8 @@ github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQ golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= -golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= +golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= +golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g= golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= @@ -114,8 +114,8 @@ golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwY golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= -golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= +golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4= +golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -149,8 +149,8 @@ golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= -golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= diff --git a/simulators/smoke/network/go.mod b/simulators/smoke/network/go.mod index 0b1d082338..19ee5f1592 100644 --- a/simulators/smoke/network/go.mod +++ b/simulators/smoke/network/go.mod @@ -26,7 +26,7 @@ require ( github.com/tklauser/go-sysconf v0.3.12 // indirect github.com/tklauser/numcpus v0.6.1 // indirect github.com/yusufpapurcu/wmi v1.2.2 // indirect - golang.org/x/crypto v0.14.0 // indirect + golang.org/x/crypto v0.21.0 // indirect golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect golang.org/x/mod v0.12.0 // indirect golang.org/x/sys v0.18.0 // indirect diff --git a/simulators/smoke/network/go.sum b/simulators/smoke/network/go.sum index f1a59624ea..4fff58f235 100644 --- a/simulators/smoke/network/go.sum +++ b/simulators/smoke/network/go.sum @@ -99,8 +99,8 @@ github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQ golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= -golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= +golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= +golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g= golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= @@ -114,8 +114,8 @@ golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwY golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= -golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= +golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4= +golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -149,8 +149,8 @@ golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= -golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= From 988c05b3fc23dcd9263638963cce65e5348b39a1 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Tue, 19 Mar 2024 16:49:44 +0100 Subject: [PATCH 259/387] simulators/eth2: update go.work.sum --- simulators/eth2/go.work.sum | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/simulators/eth2/go.work.sum b/simulators/eth2/go.work.sum index e14a000ac6..384d28024d 100644 --- a/simulators/eth2/go.work.sum +++ b/simulators/eth2/go.work.sum @@ -723,8 +723,6 @@ github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfc github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/crate-crypto/go-ipa v0.0.0-20220523130400-f11357ae11c7/go.mod h1:gFnFS95y8HstDP6P9pPwzrxOOC5TRDkwbM+ao15ChAI= github.com/crate-crypto/go-ipa v0.0.0-20230601170251-1830d0757c80/go.mod h1:gzbVz57IDJgQ9rLQwfSk696JGWof8ftznEL9GoAv3NI= -github.com/crate-crypto/go-ipa v0.0.0-20231025140028-3c0104f4b233 h1:d28BXYi+wUpz1KBmiF9bWrjEMacUEREV6MBi2ODnrfQ= -github.com/crate-crypto/go-ipa v0.0.0-20231025140028-3c0104f4b233/go.mod h1:geZJZH3SzKCqnz5VT0q/DyIG/tvu/dZk+VIfXicupJs= github.com/crate-crypto/go-kzg-4844 v0.3.0/go.mod h1:SBP7ikXEgDnUPONgm33HtuDZEDtWa3L4QtN1ocJSEQ4= github.com/crate-crypto/go-kzg-4844 v0.6.1-0.20231019121413-3621cc59f0c7/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= @@ -819,8 +817,6 @@ github.com/ethereum/c-kzg-4844 v0.3.1/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1 github.com/ethereum/c-kzg-4844 v0.3.2-0.20231019020040-748283cced54/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= github.com/ethereum/go-ethereum v1.12.2-0.20230815181937-e0b119884c6a/go.mod h1:1JU/x0JQLBndZb2727eswdCzyF2rFd8SZUj7HDQuVqc= github.com/ethereum/go-ethereum v1.13.1/go.mod h1:xHQKzwkHSl0gnSjZK1mWa06XEdm9685AHqhRknOzqGQ= -github.com/ethereum/go-ethereum v1.13.14 h1:EwiY3FZP94derMCIam1iW4HFVrSgIcpsu0HwTQtm6CQ= -github.com/ethereum/go-ethereum v1.13.14/go.mod h1:TN8ZiHrdJwSe8Cb6x+p0hs5CxhJZPbqB7hHkaUXcmIU= github.com/ethereum/hive v0.0.0-20230401205547-71595beab31d/go.mod h1:zKL2DscVzRusnGVpseAvLrXGJ3qrGHuSfOIrv4JfnRk= github.com/ethereum/hive/hiveproxy v0.0.0-20230313101845-c7dfe88c8138 h1:Y74Ksk90DLCMWnpOfOEWRLxVjsf/67vY+hX5kWu9UY0= github.com/ethereum/hive/hiveproxy v0.0.0-20230313101845-c7dfe88c8138/go.mod h1:1LWNU6/EYsIOXZGa2KdklD1ET77gLTeEyhq+WTZ+37o= @@ -832,7 +828,6 @@ github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYF github.com/ferranbt/fastssz v0.0.0-20210120143747-11b9eff30ea9/go.mod h1:DyEu2iuLBnb/T51BlsiO3yLYdJC6UbGMrIkqK1KmQxM= github.com/fjl/gencodec v0.0.0-20220412091415-8bb9e558978c/go.mod h1:AzA8Lj6YtixmJWL+wkKoBGsLWy9gFrAzi4g+5bCKwpY= github.com/fjl/gencodec v0.0.0-20230517082657-f9840df7b83e/go.mod h1:AzA8Lj6YtixmJWL+wkKoBGsLWy9gFrAzi4g+5bCKwpY= -github.com/fjl/memsize v0.0.2/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= github.com/flosch/pongo2 v0.0.0-20190707114632-bbf5a6c351f4/go.mod h1:T9YF2M40nIgbVgp3rreNmTged+9HrbNTIQf1PsaIiTA= github.com/flosch/pongo2/v4 v4.0.2/go.mod h1:B5ObFANs/36VwxxlgKpdchIJHMvHB562PW+BWPhwZD8= github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= @@ -853,8 +848,6 @@ github.com/garyburd/redigo v1.1.1-0.20170914051019-70e1b1943d4f/go.mod h1:NR3MbY github.com/garyburd/redigo v1.6.0/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY= github.com/gballet/go-verkle v0.0.0-20220902153445-097bd83b7732/go.mod h1:o/XfIXWi4/GqbQirfRm5uTbXMG5NpqxkxblnbZ+QM9I= github.com/gballet/go-verkle v0.0.0-20230607174250-df487255f46b/go.mod h1:CDncRYVRSDqwakm282WEkjfaAj1hxU/v5RXxk5nXOiI= -github.com/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46 h1:BAIP2GihuqhwdILrV+7GJel5lyPV3u1+PgzrWLc0TkE= -github.com/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46/go.mod h1:QNpY22eby74jVhqH4WhDLDwxc/vqsern6pW+u2kbkpc= github.com/gdamore/encoding v1.0.0/go.mod h1:alR0ol34c49FCSBLjhosxzcPHQbf2trDkoo5dl+VrEg= github.com/gdamore/tcell/v2 v2.4.1-0.20210905002822-f057f0a857a1/go.mod h1:Az6Jt+M5idSED2YPGtwnfJV0kXohgdCBPmHGSYc1r04= github.com/gdamore/tcell/v2 v2.5.3/go.mod h1:wSkrPaXoiIWZqW/g7Px4xc79di6FTcpB8tvaKJ6uGBo= @@ -898,7 +891,6 @@ github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbV github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8= github.com/go-ole/go-ole v1.2.5/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= -github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0= github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= @@ -1099,7 +1091,6 @@ github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/J github.com/hashicorp/yamux v0.1.1/go.mod h1:CtWFDAQgb7dxtzFs4tWbplKIe2jSi3+5vKbgIO0SLnQ= github.com/herumi/bls-eth-go-binary v0.0.0-20210130185500-57372fb27371/go.mod h1:luAnRm3OsMQeokhGzpYmc0ZKwawY7o87PUEP11Z7r7U= github.com/herumi/bls-eth-go-binary v0.0.0-20210917013441-d37c07cfda4e/go.mod h1:luAnRm3OsMQeokhGzpYmc0ZKwawY7o87PUEP11Z7r7U= -github.com/holiman/billy v0.0.0-20240216141850-2abb0c79d3c4/go.mod h1:5GuXa7vkL8u9FkFuWdVvfR5ix8hRB7DbOAaYULamFpc= github.com/holiman/goevmlab v0.0.0-20221201133036-b31966a5267d/go.mod h1:tQJ4EfAokPShVDyEwKslIWKyt0qA/z8u+iK3kAwO424= github.com/holiman/goevmlab v0.0.0-20221207202144-89074274e1b7/go.mod h1:t5n9hEKnVqrEclta+MoEDjI2D9X7bi8OiWGmyYuNhMk= github.com/holiman/goevmlab v0.0.0-20230917164918-f3777d0b880b/go.mod h1:Xf54jEqUJ0PwTEF9Z6e8FSLpnLpyB0QUfdHA3you/sw= @@ -1805,6 +1796,7 @@ golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98y golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= +golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -1903,6 +1895,7 @@ golang.org/x/net v0.12.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA= golang.org/x/net v0.13.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA= golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= +golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= golang.org/x/net v0.18.0/go.mod h1:/czyP5RqHAH4odGYxBJ1qz0+CE5WZ+2j1YgoEo8F2jQ= golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U= golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= @@ -2041,7 +2034,6 @@ golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220919091848-fb04ddd9f9c8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -2078,6 +2070,7 @@ golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.10.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/time v0.0.0-20170424234030-8be79e1e0910/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= From bbcddcea9f7f7cd341ba61cc8bccfdc2caa82fc2 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Tue, 19 Mar 2024 16:51:46 +0100 Subject: [PATCH 260/387] hiveproxy: upgrade dependencies --- hiveproxy/go.mod | 23 ++++++++++-------- hiveproxy/go.sum | 62 ++++++++++++++++++++++++++++++++++-------------- 2 files changed, 57 insertions(+), 28 deletions(-) diff --git a/hiveproxy/go.mod b/hiveproxy/go.mod index 45b1b78198..0fe43be60e 100644 --- a/hiveproxy/go.mod +++ b/hiveproxy/go.mod @@ -1,26 +1,29 @@ module github.com/ethereum/hive/hiveproxy -go 1.18 +go 1.21 + +toolchain go1.22.1 require ( - github.com/ethereum/go-ethereum v1.13.1 + github.com/ethereum/go-ethereum v1.13.14 github.com/hashicorp/yamux v0.1.1 ) require ( github.com/Microsoft/go-winio v0.6.1 // indirect + github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect github.com/deckarep/golang-set/v2 v2.1.0 // indirect - github.com/go-ole/go-ole v1.2.6 // indirect - github.com/go-stack/stack v1.8.1 // indirect + github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect github.com/gorilla/websocket v1.5.0 // indirect - github.com/holiman/uint256 v1.2.3 // indirect + github.com/holiman/uint256 v1.2.4 // indirect github.com/shirou/gopsutil v3.21.11+incompatible // indirect github.com/tklauser/go-sysconf v0.3.12 // indirect github.com/tklauser/numcpus v0.6.1 // indirect github.com/yusufpapurcu/wmi v1.2.2 // indirect - golang.org/x/crypto v0.12.0 // indirect - golang.org/x/exp v0.0.0-20230810033253-352e893a4cad // indirect - golang.org/x/mod v0.11.0 // indirect - golang.org/x/sys v0.11.0 // indirect - golang.org/x/tools v0.9.1 // indirect + golang.org/x/crypto v0.21.0 // indirect + golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa // indirect + golang.org/x/mod v0.14.0 // indirect + golang.org/x/sys v0.18.0 // indirect + golang.org/x/tools v0.15.0 // indirect ) diff --git a/hiveproxy/go.sum b/hiveproxy/go.sum index 0a3ec116b9..c181daa364 100644 --- a/hiveproxy/go.sum +++ b/hiveproxy/go.sum @@ -1,41 +1,67 @@ github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= +github.com/bits-and-blooms/bitset v1.10.0 h1:ePXTeiPEazB5+opbv5fr8umg2R/1NlzgDsyepwsSr88= +github.com/bits-and-blooms/bitset v1.10.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= +github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U= +github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= +github.com/consensys/bavard v0.1.13 h1:oLhMLOFGTLdlda/kma4VOJazblc7IM5y5QPd2A/YjhQ= +github.com/consensys/bavard v0.1.13/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI= +github.com/consensys/gnark-crypto v0.12.1 h1:lHH39WuuFgVHONRl3J0LRBtuYdQTumFSDtJF7HpyG8M= +github.com/consensys/gnark-crypto v0.12.1/go.mod h1:v2Gy7L/4ZRosZ7Ivs+9SfUDr0f5UlG+EM5t7MPHiLuY= +github.com/crate-crypto/go-kzg-4844 v0.7.0 h1:C0vgZRk4q4EZ/JgPfzuSoxdCq3C3mOZMBShovmncxvA= +github.com/crate-crypto/go-kzg-4844 v0.7.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/deckarep/golang-set/v2 v2.1.0 h1:g47V4Or+DUdzbs8FxCCmgb6VYd+ptPAngjM6dtGktsI= github.com/deckarep/golang-set/v2 v2.1.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= -github.com/ethereum/go-ethereum v1.13.1 h1:UF2FaUKPIy5jeZk3X06ait3y2Q4wI+vJ1l7+UARp+60= -github.com/ethereum/go-ethereum v1.13.1/go.mod h1:xHQKzwkHSl0gnSjZK1mWa06XEdm9685AHqhRknOzqGQ= -github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 h1:HbphB4TFFXpv7MNrT52FGrrgVXF1owhMVTHFZIlnvd4= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0/go.mod h1:DZGJHZMqrU4JJqFAWUS2UO1+lbSKsdiOoYi9Zzey7Fc= +github.com/ethereum/c-kzg-4844 v0.4.0 h1:3MS1s4JtA868KpJxroZoepdV0ZKBp3u/O5HcZ7R3nlY= +github.com/ethereum/c-kzg-4844 v0.4.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= +github.com/ethereum/go-ethereum v1.13.14 h1:EwiY3FZP94derMCIam1iW4HFVrSgIcpsu0HwTQtm6CQ= +github.com/ethereum/go-ethereum v1.13.14/go.mod h1:TN8ZiHrdJwSe8Cb6x+p0hs5CxhJZPbqB7hHkaUXcmIU= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= -github.com/go-stack/stack v1.8.1 h1:ntEHSVwIt7PNXNpgPmVfMrNhLtgjlmnZha2kOpuRiDw= -github.com/go-stack/stack v1.8.1/go.mod h1:dcoOX6HbPZSZptuspn9bctJ+N/CnF5gGygcUP3XYfe4= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/hashicorp/yamux v0.1.1 h1:yrQxtgseBDrq9Y652vSRDvsKCJKOUD+GzTS4Y0Y8pvE= github.com/hashicorp/yamux v0.1.1/go.mod h1:CtWFDAQgb7dxtzFs4tWbplKIe2jSi3+5vKbgIO0SLnQ= -github.com/holiman/uint256 v1.2.3 h1:K8UWO1HUJpRMXBxbmaY1Y8IAMZC/RsKB+ArEnnK4l5o= -github.com/holiman/uint256 v1.2.3/go.mod h1:SC8Ryt4n+UBbPbIBKaG9zbbDlp4jOru9xFZmPzLUTxw= +github.com/holiman/uint256 v1.2.4 h1:jUc4Nk8fm9jZabQuqr2JzednajVmBpC+oiTiXZJEApU= +github.com/holiman/uint256 v1.2.4/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXeiRV4ng7E= +github.com/mmcloughlin/addchain v0.4.0 h1:SobOdjm2xLj1KkXN5/n0xTIWyZA2+s99UCY1iPfkHRY= +github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqkyU72HC5wJ4RlU= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI= github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= -github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/supranational/blst v0.3.11 h1:LyU6FolezeWAhvQk0k6O/d49jqgO52MSDDfYgbeoEm4= +github.com/supranational/blst v0.3.11/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= github.com/yusufpapurcu/wmi v1.2.2 h1:KBNDSne4vP5mbSWnJbO+51IMOXJB67QiYCSBrubbPRg= github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= -golang.org/x/crypto v0.12.0 h1:tFM/ta59kqch6LlvYnPa0yx5a83cL2nHflFhYKvv9Yk= -golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= -golang.org/x/exp v0.0.0-20230810033253-352e893a4cad h1:g0bG7Z4uG+OgH2QDODnjp6ggkk1bJDsINcuWmJN1iJU= -golang.org/x/exp v0.0.0-20230810033253-352e893a4cad/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc= -golang.org/x/mod v0.11.0 h1:bUO06HqtnRcc/7l71XBe4WcqTZ+3AH1J59zWDDwLKgU= -golang.org/x/mod v0.11.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= +golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= +golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= +golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa h1:FRnLl4eNAQl8hwxVVC17teOw8kdjVDVAiFMtgUdTSRQ= +golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa/go.mod h1:zk2irFbV9DP96SEBUUAy67IdHUaZuSnrz1n472HUCLE= +golang.org/x/mod v0.14.0 h1:dGoOF9QVLYng8IHTm7BAyWqCqSheQ5pYWGhzW00YJr0= +golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/sync v0.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE= +golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/tools v0.9.1 h1:8WMNJAz3zrtPmnYC7ISf5dEn3MT0gY7jBJfw27yrrLo= -golang.org/x/tools v0.9.1/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc= +golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= +golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/tools v0.15.0 h1:zdAyfUGbYmuVokhzVmghFl2ZJh5QhcfebBgmVPFYA+8= +golang.org/x/tools v0.15.0/go.mod h1:hpksKq4dtpQWS1uQ61JkdqWM3LscIS6Slf+VVkm+wQk= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +rsc.io/tmplfunc v0.0.3 h1:53XFQh69AfOa8Tw0Jm7t+GV7KZhOi6jzsCzTtKbMvzU= +rsc.io/tmplfunc v0.0.3/go.mod h1:AG3sTPzElb1Io3Yg4voV9AGZJuleGAwaVRxL9M49PhA= From ea9be081a1f6476261a7efb6de5a4226f956fa20 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Tue, 19 Mar 2024 16:52:16 +0100 Subject: [PATCH 261/387] go.mod: upgrade dependencies --- go.mod | 18 ++++++++++-------- go.sum | 46 +++++++++++++++++++++++----------------------- 2 files changed, 33 insertions(+), 31 deletions(-) diff --git a/go.mod b/go.mod index 6fd2de0a49..13c5882b79 100644 --- a/go.mod +++ b/go.mod @@ -6,15 +6,15 @@ toolchain go1.22.1 require ( github.com/davecgh/go-spew v1.1.1 - github.com/ethereum/go-ethereum v1.13.5-0.20231031113925-bc42e88415d3 + github.com/ethereum/go-ethereum v1.13.14 github.com/ethereum/hive/hiveproxy v0.0.0-20230919105823-37cbbe1ef86d github.com/evanw/esbuild v0.18.11 github.com/fsouza/go-dockerclient v1.11.0 github.com/golang-jwt/jwt/v4 v4.5.0 github.com/gorilla/mux v1.8.1 - github.com/holiman/uint256 v1.2.3 + github.com/holiman/uint256 v1.2.4 github.com/lithammer/dedent v1.1.0 - golang.org/x/exp v0.0.0-20230905200255-921286631fa9 + golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa golang.org/x/net v0.21.0 gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1 gopkg.in/yaml.v3 v3.0.1 @@ -27,7 +27,7 @@ require ( github.com/VictoriaMetrics/fastcache v1.12.1 // indirect github.com/allegro/bigcache v1.2.1 // indirect github.com/beorn7/perks v1.0.1 // indirect - github.com/bits-and-blooms/bitset v1.7.0 // indirect + github.com/bits-and-blooms/bitset v1.10.0 // indirect github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/cockroachdb/errors v1.9.1 // indirect @@ -39,6 +39,7 @@ require ( github.com/consensys/gnark-crypto v0.12.1 // indirect github.com/containerd/containerd v1.6.26 // indirect github.com/containerd/log v0.1.0 // indirect + github.com/crate-crypto/go-ipa v0.0.0-20231025140028-3c0104f4b233 // indirect github.com/crate-crypto/go-kzg-4844 v0.7.0 // indirect github.com/deckarep/golang-set/v2 v2.1.0 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 // indirect @@ -46,8 +47,9 @@ require ( github.com/docker/go-connections v0.4.0 // indirect github.com/docker/go-units v0.5.0 // indirect github.com/ethereum/c-kzg-4844 v0.4.0 // indirect + github.com/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46 // indirect github.com/getsentry/sentry-go v0.18.0 // indirect - github.com/go-ole/go-ole v1.2.6 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect github.com/go-stack/stack v1.8.1 // indirect github.com/gofrs/flock v0.8.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect @@ -87,11 +89,11 @@ require ( github.com/tklauser/numcpus v0.6.1 // indirect github.com/yusufpapurcu/wmi v1.2.2 // indirect golang.org/x/crypto v0.21.0 // indirect - golang.org/x/mod v0.12.0 // indirect - golang.org/x/sync v0.3.0 // indirect + golang.org/x/mod v0.14.0 // indirect + golang.org/x/sync v0.5.0 // indirect golang.org/x/sys v0.18.0 // indirect golang.org/x/text v0.14.0 // indirect - golang.org/x/tools v0.13.0 // indirect + golang.org/x/tools v0.15.0 // indirect google.golang.org/protobuf v1.33.0 // indirect rsc.io/tmplfunc v0.0.3 // indirect ) diff --git a/go.sum b/go.sum index 08e0ac9fff..77c333496d 100644 --- a/go.sum +++ b/go.sum @@ -25,8 +25,8 @@ github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5 github.com/aymerick/raymond v2.0.3-0.20180322193309-b565731e1464+incompatible/go.mod h1:osfaiScAUVup+UC9Nfq76eWqDhXlp+4UYaA8uhTBO6g= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bits-and-blooms/bitset v1.7.0 h1:YjAGVd3XmtK9ktAbX8Zg2g2PwLIMjGREZJHlV4j7NEo= -github.com/bits-and-blooms/bitset v1.7.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= +github.com/bits-and-blooms/bitset v1.10.0 h1:ePXTeiPEazB5+opbv5fr8umg2R/1NlzgDsyepwsSr88= +github.com/bits-and-blooms/bitset v1.10.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U= github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= @@ -66,6 +66,8 @@ github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= +github.com/crate-crypto/go-ipa v0.0.0-20231025140028-3c0104f4b233 h1:d28BXYi+wUpz1KBmiF9bWrjEMacUEREV6MBi2ODnrfQ= +github.com/crate-crypto/go-ipa v0.0.0-20231025140028-3c0104f4b233/go.mod h1:geZJZH3SzKCqnz5VT0q/DyIG/tvu/dZk+VIfXicupJs= github.com/crate-crypto/go-kzg-4844 v0.7.0 h1:C0vgZRk4q4EZ/JgPfzuSoxdCq3C3mOZMBShovmncxvA= github.com/crate-crypto/go-kzg-4844 v0.7.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= @@ -97,8 +99,8 @@ github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7 github.com/etcd-io/bbolt v1.3.3/go.mod h1:ZF2nL25h33cCyBtcyWeZ2/I3HQOfTP+0PIEvHjkjCrw= github.com/ethereum/c-kzg-4844 v0.4.0 h1:3MS1s4JtA868KpJxroZoepdV0ZKBp3u/O5HcZ7R3nlY= github.com/ethereum/c-kzg-4844 v0.4.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= -github.com/ethereum/go-ethereum v1.13.5-0.20231031113925-bc42e88415d3 h1:i4TE0DmzMYcr2IiCdlTGGk+7Q/EzXvBKbbG4uRxMjJ0= -github.com/ethereum/go-ethereum v1.13.5-0.20231031113925-bc42e88415d3/go.mod h1:yMTu38GSuyxaYzQMViqNmQ1s3cE84abZexQmTgenWk0= +github.com/ethereum/go-ethereum v1.13.14 h1:EwiY3FZP94derMCIam1iW4HFVrSgIcpsu0HwTQtm6CQ= +github.com/ethereum/go-ethereum v1.13.14/go.mod h1:TN8ZiHrdJwSe8Cb6x+p0hs5CxhJZPbqB7hHkaUXcmIU= github.com/evanw/esbuild v0.18.11 h1:Mb0qb9KyJQraob0Y7LA0DOdD8ijJs2TxhqgqrDeGq4w= github.com/evanw/esbuild v0.18.11/go.mod h1:iINY06rn799hi48UqEnaQvVfZWe6W9bET78LbvN8VWk= github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072/go.mod h1:duJ4Jxv5lDcvg4QuQr0oowTf7dz4/CR8NtyCooz9HL8= @@ -111,6 +113,8 @@ github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbS github.com/fsouza/go-dockerclient v1.11.0 h1:4ZAk6W7rPAtPXm7198EFqA5S68rwnNQORxlOA5OurCA= github.com/fsouza/go-dockerclient v1.11.0/go.mod h1:0I3TQCRseuPTzqlY4Y3ajfsg2VAdMQoazrkxJTiJg8s= github.com/gavv/httpexpect v2.0.0+incompatible/go.mod h1:x+9tiU1YnrOvnB725RkpoLv1M62hOWzwo5OXotisrKc= +github.com/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46 h1:BAIP2GihuqhwdILrV+7GJel5lyPV3u1+PgzrWLc0TkE= +github.com/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46/go.mod h1:QNpY22eby74jVhqH4WhDLDwxc/vqsern6pW+u2kbkpc= github.com/getsentry/sentry-go v0.12.0/go.mod h1:NSap0JBYWzHND8oMbyi0+XZhUalc1TBdRL1M71JZW2c= github.com/getsentry/sentry-go v0.18.0 h1:MtBW5H9QgdcJabtZcuJG80BMOwaBpkRDZkxRkNC1sN0= github.com/getsentry/sentry-go v0.18.0/go.mod h1:Kgon4Mby+FJ7ZWHFUAZgVaIa8sxHtnRJRLTXZr51aKQ= @@ -121,8 +125,9 @@ github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab/go.mod h1:/P9AEU963A2AYjv4d1V5eVL1CQbEJq6aCNHDDjibzu8= -github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= github.com/go-stack/stack v1.8.1 h1:ntEHSVwIt7PNXNpgPmVfMrNhLtgjlmnZha2kOpuRiDw= github.com/go-stack/stack v1.8.1/go.mod h1:dcoOX6HbPZSZptuspn9bctJ+N/CnF5gGygcUP3XYfe4= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= @@ -186,8 +191,8 @@ github.com/hashicorp/yamux v0.1.1 h1:yrQxtgseBDrq9Y652vSRDvsKCJKOUD+GzTS4Y0Y8pvE github.com/hashicorp/yamux v0.1.1/go.mod h1:CtWFDAQgb7dxtzFs4tWbplKIe2jSi3+5vKbgIO0SLnQ= github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao= github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA= -github.com/holiman/uint256 v1.2.3 h1:K8UWO1HUJpRMXBxbmaY1Y8IAMZC/RsKB+ArEnnK4l5o= -github.com/holiman/uint256 v1.2.3/go.mod h1:SC8Ryt4n+UBbPbIBKaG9zbbDlp4jOru9xFZmPzLUTxw= +github.com/holiman/uint256 v1.2.4 h1:jUc4Nk8fm9jZabQuqr2JzednajVmBpC+oiTiXZJEApU= +github.com/holiman/uint256 v1.2.4/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXeiRV4ng7E= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/hydrogen18/memlistener v0.0.0-20200120041712-dcc25e7acd91/go.mod h1:qEIFzExnS6016fRpRfxrExeVn2gbClQA99gQhnIcdhE= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= @@ -387,13 +392,11 @@ golang.org/x/crypto v0.0.0-20191227163750-53104e6ec876/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= -golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g= -golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k= +golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa h1:FRnLl4eNAQl8hwxVVC17teOw8kdjVDVAiFMtgUdTSRQ= +golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa/go.mod h1:zk2irFbV9DP96SEBUUAy67IdHUaZuSnrz1n472HUCLE= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= @@ -402,8 +405,8 @@ golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzB golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc= -golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.14.0 h1:dGoOF9QVLYng8IHTm7BAyWqCqSheQ5pYWGhzW00YJr0= +golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -425,8 +428,7 @@ golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT golang.org/x/net v0.0.0-20211008194852-3b03d305991f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= -golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= +golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4= golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -437,8 +439,8 @@ golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= -golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= +golang.org/x/sync v0.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE= +golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -473,6 +475,7 @@ golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -488,8 +491,7 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= -golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -507,8 +509,8 @@ golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roY golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.13.0 h1:Iey4qkscZuv0VvIt8E0neZjtPVQFSc870HQ448QgEmQ= -golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= +golang.org/x/tools v0.15.0 h1:zdAyfUGbYmuVokhzVmghFl2ZJh5QhcfebBgmVPFYA+8= +golang.org/x/tools v0.15.0/go.mod h1:hpksKq4dtpQWS1uQ61JkdqWM3LscIS6Slf+VVkm+wQk= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -538,8 +540,6 @@ google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpAD google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= -google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= From 9fb211d7cc8abfbf94a5467e97b79c122e6ad5f5 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Tue, 19 Mar 2024 16:58:11 +0100 Subject: [PATCH 262/387] cmd/hivechain: fix build with latest go-ethereum --- cmd/hivechain/generate.go | 6 +++--- cmd/hivechain/main.go | 5 +++-- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/cmd/hivechain/generate.go b/cmd/hivechain/generate.go index 3c9b25df6a..3396b811f1 100644 --- a/cmd/hivechain/generate.go +++ b/cmd/hivechain/generate.go @@ -21,7 +21,7 @@ import ( "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/ethdb" - "github.com/ethereum/go-ethereum/trie" + "github.com/ethereum/go-ethereum/triedb" "golang.org/x/exp/slices" ) @@ -114,9 +114,9 @@ func (g *generator) run() error { engine := g.createConsensusEngine(db) // Init genesis block. - trieconfig := *trie.HashDefaults + trieconfig := *triedb.HashDefaults trieconfig.Preimages = true - triedb := trie.NewDatabase(db, &trieconfig) + triedb := triedb.NewDatabase(db, &trieconfig) genesis := g.genesis.MustCommit(db, triedb) // Create the blocks. diff --git a/cmd/hivechain/main.go b/cmd/hivechain/main.go index e742871859..e7890c1f83 100644 --- a/cmd/hivechain/main.go +++ b/cmd/hivechain/main.go @@ -34,8 +34,9 @@ import ( func main() { // Initialize go-ethereum logging. // This is mostly for displaying the DAG generator progress. - handler := ethlog.StreamHandler(os.Stderr, ethlog.TerminalFormat(false)) - ethlog.Root().SetHandler(ethlog.LvlFilterHandler(ethlog.LvlWarn, handler)) + logh := ethlog.NewTerminalHandlerWithLevel(os.Stderr, ethlog.LevelWarn, false) + logger := ethlog.NewLogger(logh) + ethlog.SetDefault(logger) flag.Usage = usage From 17f70550c9633b70e651fbcdee218f12e96ff1c8 Mon Sep 17 00:00:00 2001 From: Dan Cline <6798349+Rjected@users.noreply.github.com> Date: Wed, 20 Mar 2024 06:28:34 -0400 Subject: [PATCH 263/387] all: use golang 1.22 in Dockerfiles (#1061) fix: use golang 1.22 images for toolchain support --- clients/erigon/Dockerfile.git | 2 +- clients/go-ethereum/Dockerfile.git | 2 +- simulators/eth2/engine/Dockerfile | 2 +- simulators/eth2/testnet/Dockerfile | 2 +- simulators/eth2/withdrawals/Dockerfile | 2 +- simulators/ethereum/engine/Dockerfile | 2 +- simulators/ethereum/pyspec/Dockerfile | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/clients/erigon/Dockerfile.git b/clients/erigon/Dockerfile.git index a21616ca09..fe147bec8b 100644 --- a/clients/erigon/Dockerfile.git +++ b/clients/erigon/Dockerfile.git @@ -1,7 +1,7 @@ ### Build Erigon From Git: ## Builder stage: Compiles erigon from a git repository -FROM golang:1.20-alpine as builder +FROM golang:1.22-alpine as builder ARG github=ledgerwatch/erigon ARG tag=devel diff --git a/clients/go-ethereum/Dockerfile.git b/clients/go-ethereum/Dockerfile.git index a578f917c4..ab73f4c55a 100644 --- a/clients/go-ethereum/Dockerfile.git +++ b/clients/go-ethereum/Dockerfile.git @@ -1,6 +1,6 @@ ## Pulls geth from a git repository and builds it from source. -FROM golang:1.20-alpine as builder +FROM golang:1.22-alpine as builder ARG github=ethereum/go-ethereum ARG tag=master diff --git a/simulators/eth2/engine/Dockerfile b/simulators/eth2/engine/Dockerfile index e3f4121b6c..540105e8c1 100644 --- a/simulators/eth2/engine/Dockerfile +++ b/simulators/eth2/engine/Dockerfile @@ -1,5 +1,5 @@ # Build the simulator binary -FROM golang:1.20-alpine AS builder +FROM golang:1.22-alpine AS builder RUN apk --no-cache add gcc musl-dev linux-headers cmake make clang build-base clang-static clang-dev # Prepare workspace. diff --git a/simulators/eth2/testnet/Dockerfile b/simulators/eth2/testnet/Dockerfile index d525ce5231..9628c47d69 100644 --- a/simulators/eth2/testnet/Dockerfile +++ b/simulators/eth2/testnet/Dockerfile @@ -1,4 +1,4 @@ -FROM golang:1.20-alpine AS builder +FROM golang:1.22-alpine AS builder RUN apk --no-cache add gcc musl-dev linux-headers cmake make clang build-base clang-static clang-dev # Prepare workspace. diff --git a/simulators/eth2/withdrawals/Dockerfile b/simulators/eth2/withdrawals/Dockerfile index ec075d26cc..c3f1b21a0b 100644 --- a/simulators/eth2/withdrawals/Dockerfile +++ b/simulators/eth2/withdrawals/Dockerfile @@ -1,5 +1,5 @@ # Build the simulator binary -FROM golang:1.20-alpine AS builder +FROM golang:1.22-alpine AS builder RUN apk --no-cache add gcc musl-dev linux-headers cmake make clang build-base clang-static clang-dev # Prepare workspace. diff --git a/simulators/ethereum/engine/Dockerfile b/simulators/ethereum/engine/Dockerfile index 7353bbd9f3..fe03d0fb94 100644 --- a/simulators/ethereum/engine/Dockerfile +++ b/simulators/ethereum/engine/Dockerfile @@ -1,5 +1,5 @@ # This simulation runs Engine API tests. -FROM golang:1.20-alpine as builder +FROM golang:1.22-alpine as builder RUN apk add --update gcc musl-dev linux-headers # Build the simulator executable. diff --git a/simulators/ethereum/pyspec/Dockerfile b/simulators/ethereum/pyspec/Dockerfile index f407236d8c..6fa0053c47 100644 --- a/simulators/ethereum/pyspec/Dockerfile +++ b/simulators/ethereum/pyspec/Dockerfile @@ -3,7 +3,7 @@ # ---------------------------------------------------------------# # 1) Create pyspec builder container. -FROM golang:1.20-alpine as builder +FROM golang:1.22-alpine as builder RUN apk add --update git ca-certificates gcc musl-dev linux-headers # Build the pyspec simulator executable. From b3ceb6ed11e086fc80403f6a7a066ddd8c08ccc4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 20 Mar 2024 19:10:16 +0100 Subject: [PATCH 264/387] build(deps): bump github.com/docker/docker from 25.0.4+incompatible to 25.0.5+incompatible (#1063) build(deps): bump github.com/docker/docker Bumps [github.com/docker/docker](https://github.com/docker/docker) from 25.0.4+incompatible to 25.0.5+incompatible. - [Release notes](https://github.com/docker/docker/releases) - [Commits](https://github.com/docker/docker/compare/v25.0.4...v25.0.5) --- updated-dependencies: - dependency-name: github.com/docker/docker dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 13c5882b79..3368701bc7 100644 --- a/go.mod +++ b/go.mod @@ -43,7 +43,7 @@ require ( github.com/crate-crypto/go-kzg-4844 v0.7.0 // indirect github.com/deckarep/golang-set/v2 v2.1.0 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 // indirect - github.com/docker/docker v25.0.4+incompatible // indirect + github.com/docker/docker v25.0.5+incompatible // indirect github.com/docker/go-connections v0.4.0 // indirect github.com/docker/go-units v0.5.0 // indirect github.com/ethereum/c-kzg-4844 v0.4.0 // indirect diff --git a/go.sum b/go.sum index 77c333496d..ecc1538fb3 100644 --- a/go.sum +++ b/go.sum @@ -84,8 +84,8 @@ github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 h1:HbphB4TFFXpv7MNrT52FGrrgVXF1 github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0/go.mod h1:DZGJHZMqrU4JJqFAWUS2UO1+lbSKsdiOoYi9Zzey7Fc= github.com/dgraph-io/badger v1.6.0/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6psNgSztDR4= github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= -github.com/docker/docker v25.0.4+incompatible h1:XITZTrq+52tZyZxUOtFIahUf3aH367FLxJzt9vZeAF8= -github.com/docker/docker v25.0.4+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v25.0.5+incompatible h1:UmQydMduGkrD5nQde1mecF/YnSbTOaPeFIeP5C4W+DE= +github.com/docker/docker v25.0.5+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= From aae7628d2f11fbd7a60e9b67a58ed0407123cab4 Mon Sep 17 00:00:00 2001 From: Kolby Moroz Liebl <31669092+KolbyML@users.noreply.github.com> Date: Sat, 30 Mar 2024 04:58:29 -0600 Subject: [PATCH 265/387] simulators/portal: fix zstd version (#1069) --- simulators/portal/beacon/Cargo.toml | 3 +++ simulators/portal/history/Cargo.toml | 3 +++ simulators/portal/state/Cargo.toml | 3 +++ 3 files changed, 9 insertions(+) diff --git a/simulators/portal/beacon/Cargo.toml b/simulators/portal/beacon/Cargo.toml index e349247665..c6e5f9b628 100755 --- a/simulators/portal/beacon/Cargo.toml +++ b/simulators/portal/beacon/Cargo.toml @@ -17,3 +17,6 @@ tokio = { version = "1", features = ["full"] } # todo: remove this when we update discv5. Added this because enr 10.1 is a breaking change enr = { version = "=0.10.0", features = ["k256", "ed25519"] } +zstd = "=0.13.0" +zstd-safe = "=7.0.0" +zstd-sys = "=2.0.9+zstd.1.5.5" diff --git a/simulators/portal/history/Cargo.toml b/simulators/portal/history/Cargo.toml index 24103d2bf3..766b690659 100755 --- a/simulators/portal/history/Cargo.toml +++ b/simulators/portal/history/Cargo.toml @@ -18,3 +18,6 @@ tokio = { version = "1", features = ["full"] } # todo: remove this when we update discv5. Added this because enr 10.1 is a breaking change enr = { version = "=0.10.0", features = ["k256", "ed25519"] } +zstd = "=0.13.0" +zstd-safe = "=7.0.0" +zstd-sys = "=2.0.9+zstd.1.5.5" diff --git a/simulators/portal/state/Cargo.toml b/simulators/portal/state/Cargo.toml index 6228512708..745dab2ee6 100755 --- a/simulators/portal/state/Cargo.toml +++ b/simulators/portal/state/Cargo.toml @@ -17,3 +17,6 @@ tokio = { version = "1", features = ["full"] } # todo: remove this when we update discv5. Added this because enr 10.1 is a breaking change enr = { version = "=0.10.0", features = ["k256", "ed25519"] } +zstd = "=0.13.0" +zstd-safe = "=7.0.0" +zstd-sys = "=2.0.9+zstd.1.5.5" From e4c0682b55a5f31e5f8c0ef3297600b7899c2429 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BD=AD=E6=8C=AF?= <505380967@qq.com> Date: Mon, 1 Apr 2024 23:22:33 +0800 Subject: [PATCH 266/387] clients/shisui: update startup script (#1065) --- clients/shisui/Dockerfile | 6 +++++- clients/shisui/hive.yaml | 2 +- clients/shisui/shisui.sh | 27 +++++++++++++++++++++++++++ 3 files changed, 33 insertions(+), 2 deletions(-) create mode 100644 clients/shisui/shisui.sh diff --git a/clients/shisui/Dockerfile b/clients/shisui/Dockerfile index 09030bea8e..b97d5d8194 100644 --- a/clients/shisui/Dockerfile +++ b/clients/shisui/Dockerfile @@ -5,7 +5,11 @@ FROM $baseimage:$tag RUN echo "latest" > /version.txt +ADD shisui.sh /shisui.sh +RUN chmod +x /shisui.sh + # Export the usual networking ports to allow outside access to the node EXPOSE 8545 9009/udp -ENTRYPOINT ["app"] +ENTRYPOINT ["/shisui.sh"] + diff --git a/clients/shisui/hive.yaml b/clients/shisui/hive.yaml index b1fda1c9fe..5aa0c9c93b 100644 --- a/clients/shisui/hive.yaml +++ b/clients/shisui/hive.yaml @@ -1,3 +1,3 @@ roles: - portal - + diff --git a/clients/shisui/shisui.sh b/clients/shisui/shisui.sh new file mode 100644 index 0000000000..cece7f2657 --- /dev/null +++ b/clients/shisui/shisui.sh @@ -0,0 +1,27 @@ +#!/bin/bash + +# Immediately abort the script on any error encountered +set -e + +FLAGS="" + +if [ "$HIVE_LOGLEVEL" != "" ]; then + FLAGS="$FLAGS --loglevel $HIVE_LOGLEVEL" +fi + +if [ "$HIVE_CLIENT_PRIVATE_KEY" != "" ]; then + FLAGS="$FLAGS --private.key 0x$HIVE_CLIENT_PRIVATE_KEY" +fi + +if [ "$HIVE_PORTAL_NETWORKS_SELECTED" != "" ]; then + FLAGS="$FLAGS --networks $HIVE_PORTAL_NETWORKS_SELECTED" +else + FLAGS="$FLAGS --networks history" +fi + +if [ "$HIVE_BOOTNODE" != "" ]; then + FLAGS="$FLAGS --bootnodes=$HIVE_BOOTNODE" +fi + +app $FLAGS + From b1ecdc213ee41efc69087ab3c6aef0efd825ed21 Mon Sep 17 00:00:00 2001 From: Snoppy Date: Wed, 3 Apr 2024 03:16:50 +0800 Subject: [PATCH 267/387] chore: fix typos (#1070) --- cmd/hivechain/README.md | 2 +- test.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/cmd/hivechain/README.md b/cmd/hivechain/README.md index 39456d6f7f..15973d8be6 100644 --- a/cmd/hivechain/README.md +++ b/cmd/hivechain/README.md @@ -1,7 +1,7 @@ # hivechain Hivechain creates a non-empty blockchain for testing purposes. To facilitate good tests, -the created chain excercises many protocol features, including: +the created chain exercises many protocol features, including: - different types of transactions - diverse set of contracts with interesting storage, code, etc. diff --git a/test.sh b/test.sh index 4364d10210..4811f3ea42 100644 --- a/test.sh +++ b/test.sh @@ -22,7 +22,7 @@ echo "" echo " cd $HIVEHOME/hiveviewer && ln -s /tmp/TestResults/ Results && python -m SimpleHTTPServer" echo "" echo "And then visit http://localhost:8000/ with your browser. " -echo "Log-files and stuff is availalbe in $RESULTS." +echo "Log-files and stuff is available in $RESULTS." echo "" echo "" From 2c4ec91c29cabd7005ed73a1915bd11dedc79796 Mon Sep 17 00:00:00 2001 From: Saulius Grigaitis Date: Tue, 2 Apr 2024 22:17:10 +0300 Subject: [PATCH 268/387] clients/grandine-bn: Grandine client support (#1067) Add clients/grandine-bn All our custom changes should be squashed into a single commit for easier rebasing from ethereum/hive: - include validator nodes in combinations - fix SyncingWithInvalidChain node definitions - Add Grandine to MINIMAL_SLOT_CLIENTS --- clients/grandine-bn/.gitignore | 1 + clients/grandine-bn/Dockerfile | 10 ++ clients/grandine-bn/grandine.sh | 114 +++++++++++++++++++++++ clients/grandine-bn/hive.yaml | 2 + simulators/eth2/common/clients/roles.go | 21 +++-- simulators/eth2/common/testnet/config.go | 1 + simulators/eth2/engine/scenarios.go | 19 ++++ simulators/eth2/withdrawals/specs.go | 8 ++ 8 files changed, 167 insertions(+), 9 deletions(-) create mode 100644 clients/grandine-bn/.gitignore create mode 100644 clients/grandine-bn/Dockerfile create mode 100755 clients/grandine-bn/grandine.sh create mode 100644 clients/grandine-bn/hive.yaml diff --git a/clients/grandine-bn/.gitignore b/clients/grandine-bn/.gitignore new file mode 100644 index 0000000000..82842ad864 --- /dev/null +++ b/clients/grandine-bn/.gitignore @@ -0,0 +1 @@ +grandine diff --git a/clients/grandine-bn/Dockerfile b/clients/grandine-bn/Dockerfile new file mode 100644 index 0000000000..8f5a848d54 --- /dev/null +++ b/clients/grandine-bn/Dockerfile @@ -0,0 +1,10 @@ +ARG tag=unstable +ARG baseimage=sifrai/grandine + +FROM $baseimage:$tag + +ADD grandine.sh /grandine.sh +RUN chmod +x /grandine.sh +RUN grandine --version > /version.txt + +ENTRYPOINT ["/grandine.sh"] diff --git a/clients/grandine-bn/grandine.sh b/clients/grandine-bn/grandine.sh new file mode 100755 index 0000000000..027bd3dd93 --- /dev/null +++ b/clients/grandine-bn/grandine.sh @@ -0,0 +1,114 @@ +#!/bin/bash + +# Immediately abort the script on any error encountered +set -e + +if [ ! -f "/hive/input/genesis.ssz" ]; then + if [ -z "$HIVE_ETH2_ETH1_RPC_ADDRS" ]; then + echo "genesis.ssz file is missing, and no Eth1 RPC addr was provided for building genesis from scratch." + # TODO: alternative to start from weak-subjectivity-state + exit 1 + fi +fi + +mkdir -p /data/testnet_setup + +cp /hive/input/genesis.ssz /data/testnet_setup/genesis.ssz +cp /hive/input/config.yaml /data/testnet_setup + +if [ "$HIVE_TERMINAL_TOTAL_DIFFICULTY" != "" ]; then + sed -i '/TERMINAL_TOTAL_DIFFICULTY/d' /data/testnet_setup/config.yaml + echo "TERMINAL_TOTAL_DIFFICULTY: $HIVE_TERMINAL_TOTAL_DIFFICULTY" >> /data/testnet_setup/config.yaml +fi +if [[ "$HIVE_ETH2_SAFE_SLOTS_TO_IMPORT_OPTIMISTICALLY" != "" ]]; then + echo "SAFE_SLOTS_TO_IMPORT_OPTIMISTICALLY: $HIVE_ETH2_SAFE_SLOTS_TO_IMPORT_OPTIMISTICALLY" >> /data/testnet_setup/config.yaml +fi + +echo config.yaml: +cat /data/testnet_setup/config.yaml + +# empty bootnodes file, required for custom testnet setup, use CLI arg instead to configure it. +echo "[]" > /data/testnet_setup/boot_enr.yaml + +echo "${HIVE_ETH2_CONFIG_DEPOSIT_CONTRACT_ADDRESS:-0x1111111111111111111111111111111111111111}" > /data/testnet_setup/deposit_contract.txt +echo "${HIVE_ETH2_DEPOSIT_DEPLOY_BLOCK_NUMBER:-0}" > /data/testnet_setup/deploy_block.txt + +mkdir -p /data/beacon +mkdir -p /data/network + +# Set static private keys to be able to always set nodes as trusted peers +trustedpeers="--trusted-peers \"16Uiu2HAmKJJED6835NsYwwT3MZVVi4idg2jiULBYb1kPzqw9jzAM\" + --trusted-peers \"16Uiu2HAm9XVoQGJGQJ9SAbMuGcCFG81Ch2EGCukmAix8g5yw9mcp\" + --trusted-peers \"16Uiu2HAm3CnjeveoribYTQiWjkxUq2R6QrQwvZsyAzm75UXTL8aL\" + --trusted-peers \"16Uiu2HAm96eiZf7YktvxfJ3AeXyrRNq4Cqf2Ypda6Y4nL17xwsXX\" + --trusted-peers \"16Uiu2HAmNWiGjii9thAP6dzMcRxwQF317NraEri6qnYswvFVP1Mg\"" + +pks=( + "fd5fd778baa59f457bd671d61839f6dbf8f4ef4d4df67d621598a60ff212f07c" + "b97bb33696dfb44e9bf3376b4247753ae4e55ba7b90b26153e0f40a00e63fc2f" + "822c4f5856e7a5a7f7c1d4ca4d262df368f7d1323225bbe2c7c015401e422be5" + "b09f940d452b33069aba7d3b7fc21725b5a0f6a0c2b2bb7eb6954c6c3295dfdb" + "f87b71646c9850e5f7e4976c388d183832d6408491788afb5edba467617a9bd6" +) + +echo "beacon index: $HIVE_ETH2_BEACON_NODE_INDEX" +if [[ "$HIVE_ETH2_BEACON_NODE_INDEX" != "" ]]; then + pk="${pks[HIVE_ETH2_BEACON_NODE_INDEX]}" + if [[ "$pk" != "" ]]; then + key="$(echo $pk | xxd -r -p)" + echo "networking pk: $pk" + echo -n $key > /data/network/key + fi +fi + +LOG=info +case "$HIVE_LOGLEVEL" in + 0|1) LOG=error ;; + 2) LOG=warn ;; + 3) LOG=info ;; + 4) LOG=debug ;; + 5) LOG=trace ;; +esac + +echo "bootnodes: ${HIVE_ETH2_BOOTNODE_ENRS}" + +CONTAINER_IP=`hostname -i | awk '{print $1;}'` + +if [ "$HIVE_ETH2_MERGE_ENABLED" != "" ]; then + echo -n "0x7365637265747365637265747365637265747365637265747365637265747365" > /jwtsecret + merge_option="--eth1-rpc-urls=$HIVE_ETH2_ETH1_ENGINE_RPC_ADDRS --jwt-secret=/jwtsecret" +fi + +builder_option=$([[ "$HIVE_ETH2_BUILDER_ENDPOINT" == "" ]] && echo "" || echo "--builder-api-url=$HIVE_ETH2_BUILDER_ENDPOINT") +echo BUILDER=$builder_option + +RUST_LOG=$LOG RUST_BACKTRACE=1 grandine \ + --data-dir /data/beacon \ + --disable-upnp \ + --disable-quic \ + --enr-tcp-port "${HIVE_ETH2_P2P_TCP_PORT:-9000}" \ + --enr-udp-port "${HIVE_ETH2_P2P_UDP_PORT:-9000}" \ + --enr-address "${CONTAINER_IP}" \ + --libp2p-port "${HIVE_ETH2_P2P_TCP_PORT:-9000}" \ + --discovery-port "${HIVE_ETH2_P2P_UDP_PORT:-9000}" \ + --disable-enr-auto-update \ + --http-address 0.0.0.0 \ + --http-port ${HIVE_ETH2_BN_API_PORT:-4000} \ + --features LogHttpRequests \ + --features LogHttpBodies \ + --features LogHttpHeaders \ + --features LogBlockProcessingTime \ + --features PatchHttpContentType \ + --features ServeCostlyEndpoints \ + --features ServeEffectfulEndpoints \ + --features ServeLeakyEndpoints \ + --features DebugEth1 \ + --features DebugP2p \ + --track-liveness \ + --subscribe-all-subnets \ + ${HIVE_ETH2_BOOTNODE_ENRS:+--boot-nodes ${HIVE_ETH2_BOOTNODE_ENRS//,/ --boot-nodes }} \ + --configuration-file /data/testnet_setup/config.yaml \ + --deposit-contract-starting-block "${HIVE_ETH2_DEPOSIT_DEPLOY_BLOCK_NUMBER:-0}" \ + --genesis-state-file /data/testnet_setup/genesis.ssz \ + ${trusted_peers} \ + ${builder_option} ${merge_option} diff --git a/clients/grandine-bn/hive.yaml b/clients/grandine-bn/hive.yaml new file mode 100644 index 0000000000..3b6c636f72 --- /dev/null +++ b/clients/grandine-bn/hive.yaml @@ -0,0 +1,2 @@ +roles: + - beacon diff --git a/simulators/eth2/common/clients/roles.go b/simulators/eth2/common/clients/roles.go index 8b26d4c0c0..138b07268d 100644 --- a/simulators/eth2/common/clients/roles.go +++ b/simulators/eth2/common/clients/roles.go @@ -55,15 +55,18 @@ func byName( func (c *ClientDefinitionsByRole) Combinations() NodeDefinitions { var nodes NodeDefinitions - for _, beacon := range c.Beacon { - for _, eth1 := range c.Eth1 { - nodes = append( - nodes, - NodeDefinition{ - ExecutionClient: eth1.Name, - ConsensusClient: beacon.Name, - }, - ) + for _, validator := range c.Validator { + for _, beacon := range c.Beacon { + for _, eth1 := range c.Eth1 { + nodes = append( + nodes, + NodeDefinition{ + ExecutionClient: eth1.Name, + ConsensusClient: beacon.Name, + ValidatorClient: validator.Name, + }, + ) + } } } return nodes diff --git a/simulators/eth2/common/testnet/config.go b/simulators/eth2/common/testnet/config.go index 555d6e7cf5..9b914e843d 100644 --- a/simulators/eth2/common/testnet/config.go +++ b/simulators/eth2/common/testnet/config.go @@ -27,6 +27,7 @@ var ( "teku", "prysm", "lodestar", + "grandine", } ) diff --git a/simulators/eth2/engine/scenarios.go b/simulators/eth2/engine/scenarios.go index 25fbea8c81..df689550b9 100644 --- a/simulators/eth2/engine/scenarios.go +++ b/simulators/eth2/engine/scenarios.go @@ -49,10 +49,26 @@ var ( } SAFE_SLOTS_TO_IMPORT_OPTIMISTICALLY_CLIENT_OVERRIDE = map[string]*big.Int{} + + MINIMAL_SLOT_TIME_CLIENTS = map[string]bool{ + "lighthouse": true, + "teku": true, + "prysm": true, + "lodestar": true, + "grandine": true, + } ) func getClientConfig(n clients.NodeDefinition) *tn.Config { config := *DEFAULT_CONFIG + // Use unoptimized + if !MINIMAL_SLOT_TIME_CLIENTS[n.ConsensusClient] || !MINIMAL_SLOT_TIME_CLIENTS[n.ValidatorClient] { + // if some client does not support miminial slotTime -> don't use + config.SlotTime = big.NewInt(12) + } + + fmt.Printf("INFO: using %d second slot time\n", config.SlotTime) + return &config } @@ -1052,6 +1068,7 @@ func SyncingWithInvalidChain( clients.NodeDefinition{ ExecutionClient: n.ExecutionClient, ConsensusClient: n.ConsensusClient, + ValidatorClient: n.ValidatorClient, ValidatorShares: 1, TestVerificationNode: false, }, @@ -1059,6 +1076,7 @@ func SyncingWithInvalidChain( clients.NodeDefinition{ ExecutionClient: n.ExecutionClient, ConsensusClient: n.ConsensusClient, + ValidatorClient: n.ValidatorClient, ValidatorShares: 1, TestVerificationNode: false, }, @@ -1066,6 +1084,7 @@ func SyncingWithInvalidChain( clients.NodeDefinition{ ExecutionClient: n.ExecutionClient, ConsensusClient: n.ConsensusClient, + ValidatorClient: n.ValidatorClient, ValidatorShares: 0, TestVerificationNode: true, }, diff --git a/simulators/eth2/withdrawals/specs.go b/simulators/eth2/withdrawals/specs.go index 8d36033a14..29caa98ba9 100644 --- a/simulators/eth2/withdrawals/specs.go +++ b/simulators/eth2/withdrawals/specs.go @@ -65,6 +65,14 @@ var ( Eth1Consensus: &el.ExecutionPostMergeGenesis{}, } + MINIMAL_SLOT_TIME_CLIENTS = []string{ + "lighthouse", + "teku", + "prysm", + "lodestar", + "grandine", + } + // This is the account that sends vault funding transactions. VaultAccountAddress = common.HexToAddress( "0xcf49fda3be353c69b41ed96333cd24302da4556f", From 3876be2c41d37471fa3e095a09eb5d8ce07b3927 Mon Sep 17 00:00:00 2001 From: Kolby Moroz Liebl <31669092+KolbyML@users.noreply.github.com> Date: Wed, 17 Apr 2024 14:40:51 -0700 Subject: [PATCH 269/387] clients/trin: update networks flag to portal-subnetworks (#1077) --- clients/trin/trin.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/clients/trin/trin.sh b/clients/trin/trin.sh index a3469b1f67..fb61f6568f 100644 --- a/clients/trin/trin.sh +++ b/clients/trin/trin.sh @@ -11,9 +11,9 @@ if [ "$HIVE_CLIENT_PRIVATE_KEY" != "" ]; then fi if [ "$HIVE_PORTAL_NETWORKS_SELECTED" != "" ]; then - FLAGS="$FLAGS --networks $HIVE_PORTAL_NETWORKS_SELECTED" + FLAGS="$FLAGS --portal-subnetworks $HIVE_PORTAL_NETWORKS_SELECTED" else - FLAGS="$FLAGS --networks history" + FLAGS="$FLAGS --portal-subnetworks history" fi RUST_LOG=trace trin --web3-transport http --web3-http-address http://0.0.0.0:8545 --external-address "$IP_ADDR":9009 --bootnodes none $FLAGS From c0bb14301f71d7e423e5be212c5ab8d2813093b0 Mon Sep 17 00:00:00 2001 From: Kolby Moroz Liebl <31669092+KolbyML@users.noreply.github.com> Date: Sun, 28 Apr 2024 08:50:02 -0700 Subject: [PATCH 270/387] clients/trin-bridge: updated bridge params for the latest version (#1084) clients/trin-bridge: updated bridge so latest version works --- clients/trin-bridge/trin_bridge.sh | 2 +- clients/trin/trin.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/clients/trin-bridge/trin_bridge.sh b/clients/trin-bridge/trin_bridge.sh index 43418e9145..273de3b622 100644 --- a/clients/trin-bridge/trin_bridge.sh +++ b/clients/trin-bridge/trin_bridge.sh @@ -13,4 +13,4 @@ else exit 1 fi -RUST_LOG=trace portal-bridge --node-count 1 $FLAGS --executable-path ./usr/bin/trin --mode test:/test_data_collection_of_forks_blocks.yaml --el-provider test --external-ip $IP_ADDR --epoch-accumulator-path . trin +RUST_LOG="error,portal_bridge=debug,portalnet=debug" portal-bridge --node-count 1 $FLAGS --executable-path /usr/bin/trin --mode test:/test_data_collection_of_forks_blocks.yaml --external-ip $IP_ADDR --epoch-accumulator-path . trin diff --git a/clients/trin/trin.sh b/clients/trin/trin.sh index fb61f6568f..1d9ef6ebf6 100644 --- a/clients/trin/trin.sh +++ b/clients/trin/trin.sh @@ -16,4 +16,4 @@ else FLAGS="$FLAGS --portal-subnetworks history" fi -RUST_LOG=trace trin --web3-transport http --web3-http-address http://0.0.0.0:8545 --external-address "$IP_ADDR":9009 --bootnodes none $FLAGS +RUST_LOG="trace,neli=error" trin --web3-transport http --web3-http-address http://0.0.0.0:8545 --external-address "$IP_ADDR":9009 --bootnodes none $FLAGS From d3b05137f28d8c04599561f3dc49a758a0b16e1c Mon Sep 17 00:00:00 2001 From: acolytec3 <17355484+acolytec3@users.noreply.github.com> Date: Wed, 1 May 2024 15:18:43 -0400 Subject: [PATCH 271/387] simulators/portal: add docker caching step for building rust simulator dependencies (#1083) --- simulators/portal/beacon/Dockerfile | 9 +++++++++ simulators/portal/history/Dockerfile | 10 +++++++++- simulators/portal/state/Dockerfile | 11 ++++++++++- 3 files changed, 28 insertions(+), 2 deletions(-) diff --git a/simulators/portal/beacon/Dockerfile b/simulators/portal/beacon/Dockerfile index e5822e4e28..9ab0c761ee 100644 --- a/simulators/portal/beacon/Dockerfile +++ b/simulators/portal/beacon/Dockerfile @@ -8,9 +8,18 @@ RUN apt-get update && apt-get install clang -y # copy over manifests and source to build image COPY Cargo.toml ./Cargo.toml + +# create fake main.rs and build dependencies +RUN echo "fn main() {}" > ./src/main.rs + +RUN cargo build --release + +# copy real src over and make newest modified file COPY src ./src RUN apt-get update && apt-get install clang -y +RUN touch -a -m ./src/main.rs + # build for release RUN cargo build --release diff --git a/simulators/portal/history/Dockerfile b/simulators/portal/history/Dockerfile index 5b6e84aa09..9280d7b0e3 100644 --- a/simulators/portal/history/Dockerfile +++ b/simulators/portal/history/Dockerfile @@ -6,8 +6,16 @@ WORKDIR /history # copy over manifests and source to build image COPY Cargo.toml ./Cargo.toml -COPY src ./src + +# create fake main.rs and build dependencies +RUN echo "fn main() {}" > ./src/main.rs RUN apt-get update && apt-get install clang -y +RUN cargo build --release + +# copy real src over and make newest modified file +COPY src ./src + +RUN touch -a -m ./src/main.rs # build for release RUN cargo build --release diff --git a/simulators/portal/state/Dockerfile b/simulators/portal/state/Dockerfile index 66ee5f2ba7..b1add44731 100644 --- a/simulators/portal/state/Dockerfile +++ b/simulators/portal/state/Dockerfile @@ -8,8 +8,17 @@ RUN apt-get update && apt-get install clang -y # copy over manifests and source to build image COPY Cargo.toml ./Cargo.toml -COPY src ./src + +# create fake main.rs and build dependencies +RUN echo "fn main() {}" > ./src/main.rs + RUN apt-get update && apt-get install clang -y +RUN cargo build --release + +# copy real src over and make newest modified file +COPY src ./src + +RUN touch -a -m ./src/main.rs # build for release RUN cargo build --release From 77a39de33f82480d1c8dabba4324c5716858b421 Mon Sep 17 00:00:00 2001 From: acolytec3 <17355484+acolytec3@users.noreply.github.com> Date: Wed, 8 May 2024 18:44:41 -0400 Subject: [PATCH 272/387] Fix ethereumjs docker build steps (#1104) * Fix ethjs app location * Add client directory reference to dockerfile --- clients/ethereumjs/ethereumjs-local.sh | 2 +- clients/ethereumjs/ethereumjs.sh | 13 ++++++++----- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/clients/ethereumjs/ethereumjs-local.sh b/clients/ethereumjs/ethereumjs-local.sh index ed66a2d54c..8102e096b0 100644 --- a/clients/ethereumjs/ethereumjs-local.sh +++ b/clients/ethereumjs/ethereumjs-local.sh @@ -48,7 +48,7 @@ set -e cd /ethereumjs-monorepo/packages/client/ -ethereumjs="ts-node /ethereumjs-monorepo/packages/client/bin/cli.ts" +ethereumjs="node /ethereumjs-monorepo/packages/client/dist/esm/bin/cli.js" FLAGS="--gethGenesis /genesis.json --rpc --rpcEngine --saveReceipts --rpcAddr 0.0.0.0 --rpcEngineAddr 0.0.0.0 --rpcEnginePort 8551 --ws false --logLevel debug --rpcDebug all --rpcDebugVerbose all --isSingleNode" # Configure the chain. diff --git a/clients/ethereumjs/ethereumjs.sh b/clients/ethereumjs/ethereumjs.sh index 9309c9b847..b578e51929 100644 --- a/clients/ethereumjs/ethereumjs.sh +++ b/clients/ethereumjs/ethereumjs.sh @@ -46,20 +46,21 @@ # Immediately abort the script on any error encountered set -e -ethereumjs="node /ethereumjs-monorepo/packages/client/dist/bin/cli.js" +ethereumjs="node ./dist/esm/bin/cli.js" +CLIENT_DIRECTORY=/ethereumjs-monorepo/packages/client FLAGS="--gethGenesis ./genesis.json --rpc --rpcEngine --saveReceipts --rpcAddr 0.0.0.0 --rpcEngineAddr 0.0.0.0 --rpcEnginePort 8551 --ws false --logLevel debug --rpcDebug all --rpcDebugVerbose all --isSingleNode" # Configure the chain. mv /genesis.json /genesis-input.json -jq -f /mapper.jq /genesis-input.json > /genesis.json +jq -f /mapper.jq /genesis-input.json > $CLIENT_DIRECTORY/genesis.json # Dump genesis. if [ "$HIVE_LOGLEVEL" -lt 4 ]; then echo "Supplied genesis state (trimmed, use --sim.loglevel 4 or 5 for full output):" - jq 'del(.alloc[] | select(.balance == "0x123450000000000000000"))' /genesis.json + jq 'del(.alloc[] | select(.balance == "0x123450000000000000000"))' $CLIENT_DIRECTORY/genesis.json else echo "Supplied genesis state:" - cat /genesis.json + cat $CLIENT_DIRECTORY/genesis.json fi # Import clique signing key. @@ -89,4 +90,6 @@ if [ "$HIVE_BOOTNODE" != "" ]; then FLAGS="$FLAGS --bootnodes=$HIVE_BOOTNODE" fi echo "Running ethereumjs with flags $FLAGS" -$ethereumjs $FLAGS + + +cd $CLIENT_DIRECTORY && $ethereumjs $FLAGS From 78843f900a9a3b9a5cbc8d2fea679484a7fad722 Mon Sep 17 00:00:00 2001 From: acolytec3 <17355484+acolytec3@users.noreply.github.com> Date: Fri, 10 May 2024 08:01:22 -0400 Subject: [PATCH 273/387] clients/ethereumjs: more script fixes (#1105) --- clients/ethereumjs/ethereumjs-local.sh | 6 ++---- clients/ethereumjs/ethereumjs.sh | 15 ++++++++------- 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/clients/ethereumjs/ethereumjs-local.sh b/clients/ethereumjs/ethereumjs-local.sh index 8102e096b0..d26476aa89 100644 --- a/clients/ethereumjs/ethereumjs-local.sh +++ b/clients/ethereumjs/ethereumjs-local.sh @@ -46,8 +46,6 @@ # Immediately abort the script on any error encountered set -e -cd /ethereumjs-monorepo/packages/client/ - ethereumjs="node /ethereumjs-monorepo/packages/client/dist/esm/bin/cli.js" FLAGS="--gethGenesis /genesis.json --rpc --rpcEngine --saveReceipts --rpcAddr 0.0.0.0 --rpcEngineAddr 0.0.0.0 --rpcEnginePort 8551 --ws false --logLevel debug --rpcDebug all --rpcDebugVerbose all --isSingleNode" @@ -71,12 +69,12 @@ if [ "$HIVE_CLIQUE_PRIVATEKEY" != "" ]; then echo -n "$HIVE_CLIQUE_PRIVATEKEY" > /private_key.txt # Ensure password file is used when running ethereumjs in mining mode. if [ "$HIVE_MINER" != "" ]; then - FLAGS="$FLAGS --mine --unlock /private_key.txt --minerCoinbase $HIVE_MINER" + FLAGS="$FLAGS --mine --unlock /private_key.txt --minerCoinbase 0x$HIVE_MINER" fi fi if [ "$HIVE_TERMINAL_TOTAL_DIFFICULTY" != "" ]; then - FLAGS="$FLAGS --jwt-secret /jwtsecret" + FLAGS="$FLAGS --jwtSecret /jwtsecret" fi # Load the test chain if present diff --git a/clients/ethereumjs/ethereumjs.sh b/clients/ethereumjs/ethereumjs.sh index b578e51929..087c1f6189 100644 --- a/clients/ethereumjs/ethereumjs.sh +++ b/clients/ethereumjs/ethereumjs.sh @@ -46,21 +46,22 @@ # Immediately abort the script on any error encountered set -e -ethereumjs="node ./dist/esm/bin/cli.js" CLIENT_DIRECTORY=/ethereumjs-monorepo/packages/client + +ethereumjs="node $CLIENT_DIRECTORY/dist/esm/bin/cli.js" FLAGS="--gethGenesis ./genesis.json --rpc --rpcEngine --saveReceipts --rpcAddr 0.0.0.0 --rpcEngineAddr 0.0.0.0 --rpcEnginePort 8551 --ws false --logLevel debug --rpcDebug all --rpcDebugVerbose all --isSingleNode" # Configure the chain. mv /genesis.json /genesis-input.json -jq -f /mapper.jq /genesis-input.json > $CLIENT_DIRECTORY/genesis.json +jq -f /mapper.jq /genesis-input.json > ./genesis.json # Dump genesis. if [ "$HIVE_LOGLEVEL" -lt 4 ]; then echo "Supplied genesis state (trimmed, use --sim.loglevel 4 or 5 for full output):" - jq 'del(.alloc[] | select(.balance == "0x123450000000000000000"))' $CLIENT_DIRECTORY/genesis.json + jq 'del(.alloc[] | select(.balance == "0x123450000000000000000"))' ./genesis.json else echo "Supplied genesis state:" - cat $CLIENT_DIRECTORY/genesis.json + cat ./genesis.json fi # Import clique signing key. @@ -70,12 +71,12 @@ if [ "$HIVE_CLIQUE_PRIVATEKEY" != "" ]; then echo -n "$HIVE_CLIQUE_PRIVATEKEY" > ./private_key.txt # Ensure password file is used when running ethereumjs in mining mode. if [ "$HIVE_MINER" != "" ]; then - FLAGS="$FLAGS --mine --unlock ./private_key.txt --minerCoinbase $HIVE_MINER" + FLAGS="$FLAGS --mine --unlock ./private_key.txt --minerCoinbase 0x$HIVE_MINER" fi fi if [ "$HIVE_TERMINAL_TOTAL_DIFFICULTY" != "" ]; then - FLAGS="$FLAGS --jwt-secret ./jwtsecret" + FLAGS="$FLAGS --jwtSecret ./jwtsecret" fi # Load the test chain if present @@ -92,4 +93,4 @@ fi echo "Running ethereumjs with flags $FLAGS" -cd $CLIENT_DIRECTORY && $ethereumjs $FLAGS +$ethereumjs $FLAGS From 120586e02e91027ef2499148332f000effc18a9d Mon Sep 17 00:00:00 2001 From: Nick Gheorghita Date: Fri, 10 May 2024 19:09:23 -0400 Subject: [PATCH 274/387] clients/trin-bridge: update outdated bridge args (#1103) --- clients/trin-bridge/trin_bridge.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clients/trin-bridge/trin_bridge.sh b/clients/trin-bridge/trin_bridge.sh index 273de3b622..adf163e147 100644 --- a/clients/trin-bridge/trin_bridge.sh +++ b/clients/trin-bridge/trin_bridge.sh @@ -13,4 +13,4 @@ else exit 1 fi -RUST_LOG="error,portal_bridge=debug,portalnet=debug" portal-bridge --node-count 1 $FLAGS --executable-path /usr/bin/trin --mode test:/test_data_collection_of_forks_blocks.yaml --external-ip $IP_ADDR --epoch-accumulator-path . trin +RUST_LOG="error,portal_bridge=debug,portalnet=debug" portal-bridge $FLAGS --executable-path /usr/bin/trin --mode test:/test_data_collection_of_forks_blocks.yaml --external-ip $IP_ADDR --epoch-accumulator-path . trin From 2a652c7ab6990712610afb92ed6c8bc574c7378e Mon Sep 17 00:00:00 2001 From: Giulio rebuffo Date: Mon, 20 May 2024 14:43:41 +0200 Subject: [PATCH 275/387] Erigon3 on Hive tests (#1106) --- clients/erigon/Dockerfile | 2 +- clients/erigon/erigon.sh | 3 --- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/clients/erigon/Dockerfile b/clients/erigon/Dockerfile index 6d62970bc1..e178cf4aea 100644 --- a/clients/erigon/Dockerfile +++ b/clients/erigon/Dockerfile @@ -1,6 +1,6 @@ ## Build Erigon Via Pre-Built Image: ARG baseimage=thorax/erigon -ARG tag=devel +ARG tag=latest FROM $baseimage:$tag # The upstream erigon container uses a non-root user, but we need diff --git a/clients/erigon/erigon.sh b/clients/erigon/erigon.sh index 47812d07b5..9e9202a656 100644 --- a/clients/erigon/erigon.sh +++ b/clients/erigon/erigon.sh @@ -139,9 +139,6 @@ if [ "$HIVE_TERMINAL_TOTAL_DIFFICULTY" != "" ]; then FLAGS="$FLAGS --authrpc.addr=0.0.0.0 --authrpc.jwtsecret=/jwt.secret" fi -# Configure snapshots. -FLAGS="$FLAGS --snapshots=false" - # Launch the main client. FLAGS="$FLAGS --nat=none" echo "Running erigon with flags $FLAGS" From 2322e7636c706eb8809d849ef04db882ada362f2 Mon Sep 17 00:00:00 2001 From: Dan Cline <6798349+Rjected@users.noreply.github.com> Date: Tue, 4 Jun 2024 17:21:03 -0400 Subject: [PATCH 276/387] simulators/ethereum/sync: remove blob fields from newPayloadV2 (#1112) --- simulators/ethereum/sync/chain/headnewpayload.json | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/simulators/ethereum/sync/chain/headnewpayload.json b/simulators/ethereum/sync/chain/headnewpayload.json index 11b37ba909..a8f71d5629 100644 --- a/simulators/ethereum/sync/chain/headnewpayload.json +++ b/simulators/ethereum/sync/chain/headnewpayload.json @@ -18,9 +18,7 @@ "baseFeePerGas": "0x7", "blockHash": "0x07f7d3c5744ffddc5441cf31074c91a934afbf6ddb7e8234a081ee1f21140455", "transactions": [], - "withdrawals": [], - "blobGasUsed": null, - "excessBlobGas": null + "withdrawals": [] } ] } \ No newline at end of file From 2359b734dce7554a942373fbb2c750b9bf8f5160 Mon Sep 17 00:00:00 2001 From: acolytec3 <17355484+acolytec3@users.noreply.github.com> Date: Tue, 4 Jun 2024 17:22:06 -0400 Subject: [PATCH 277/387] clients/ethereumjs: update build to support RLP /blocks (#1109) --- clients/ethereumjs/Dockerfile | 2 +- clients/ethereumjs/Dockerfile.local | 2 +- clients/ethereumjs/ethereumjs-local.sh | 9 +++++++++ clients/ethereumjs/ethereumjs.sh | 8 ++++++++ 4 files changed, 19 insertions(+), 2 deletions(-) diff --git a/clients/ethereumjs/Dockerfile b/clients/ethereumjs/Dockerfile index 5ae9d151fc..a1cb9e138f 100644 --- a/clients/ethereumjs/Dockerfile +++ b/clients/ethereumjs/Dockerfile @@ -1,6 +1,6 @@ ### Build EthereumJS From Git: -FROM node:18-alpine as build +FROM node:20-alpine as build ARG github=ethereumjs/ethereumjs-monorepo ARG tag=master diff --git a/clients/ethereumjs/Dockerfile.local b/clients/ethereumjs/Dockerfile.local index b159c12ecd..c0db8440e3 100644 --- a/clients/ethereumjs/Dockerfile.local +++ b/clients/ethereumjs/Dockerfile.local @@ -1,7 +1,7 @@ ### Build Ethereumjs Locally: ### Requires a copy of ethereumjs-monorepo/ -> hive/clients/ethereumjs/ -FROM node:18-alpine +FROM node:20-alpine RUN apk update && apk add --no-cache bash git jq curl python3 gcc make g++ \ && rm -rf /var/cache/apk/* diff --git a/clients/ethereumjs/ethereumjs-local.sh b/clients/ethereumjs/ethereumjs-local.sh index d26476aa89..e812b50399 100644 --- a/clients/ethereumjs/ethereumjs-local.sh +++ b/clients/ethereumjs/ethereumjs-local.sh @@ -85,6 +85,15 @@ if [ -f /chain.rlp ]; then echo "Warning: chain.rlp not found." fi +if [[ -d blocks ]]; then + for file in blocks/*; do + FLAGS="$FLAGS --loadBlocksFromRlp=${file}" + echo $FLAGS + done + else + echo "Warning: blocks directory not found." +fi + if [ "$HIVE_BOOTNODE" != "" ]; then FLAGS="$FLAGS --bootnodes=$HIVE_BOOTNODE" fi diff --git a/clients/ethereumjs/ethereumjs.sh b/clients/ethereumjs/ethereumjs.sh index 087c1f6189..8cb4e10910 100644 --- a/clients/ethereumjs/ethereumjs.sh +++ b/clients/ethereumjs/ethereumjs.sh @@ -87,6 +87,14 @@ if [ -f /chain.rlp ]; then echo "Warning: chain.rlp not found." fi +if [[ -d blocks ]]; then + for file in blocks/*; do + FLAGS="$FLAGS --loadBlocksFromRlp=${file}" + done + else + echo "Warning: blocks directory not found." +fi + if [ "$HIVE_BOOTNODE" != "" ]; then FLAGS="$FLAGS --bootnodes=$HIVE_BOOTNODE" fi From 1f627b59a0eff8a960f76050ec7296a4f81f30e4 Mon Sep 17 00:00:00 2001 From: spencer Date: Wed, 5 Jun 2024 04:23:08 +0700 Subject: [PATCH 278/387] clients/ethereumjs: pad genesis storage keys in mapper (#1111) --- clients/ethereumjs/mapper.jq | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/clients/ethereumjs/mapper.jq b/clients/ethereumjs/mapper.jq index a45937029c..3fe8480c98 100644 --- a/clients/ethereumjs/mapper.jq +++ b/clients/ethereumjs/mapper.jq @@ -28,6 +28,21 @@ def to_bool: end ; +# Pads storage keys to 32 bytes. +def pad_storage_keys: + .alloc |= with_entries( + .value.storage |= with_entries( + .key |= (if . == null then . else + if startswith("0x") then + "0x" + (.[2:] | if length < 64 then ("0" * (64 - length)) + . else . end) + else + "0x" + (if length < 64 then ("0" * (64 - length)) + . else . end) + end + end) + ) + ) +; + # Replace config in input. . + { "config": { @@ -58,4 +73,4 @@ def to_bool: "shanghaiTime": env.HIVE_SHANGHAI_TIMESTAMP|to_int, "cancunTime": env.HIVE_CANCUN_TIMESTAMP|to_int, } -} | remove_empty +} | pad_storage_keys | remove_empty From 7a224015be8f50ac8d75d00d657f68f95dbe6d00 Mon Sep 17 00:00:00 2001 From: Kim De Mey Date: Thu, 6 Jun 2024 16:33:12 +0200 Subject: [PATCH 279/387] simulators/portal/beacon: Remove incomplete gossip/offer tests (#1113) simulators/portal/beacon Remove incomplete gossip/offer tests In order to test offer/gossip in the Portal beacon network, the node needs to first also do light client sync to be able to validate the offered content. This requires these test to be adjusted to provide the proper light client data first in order to be able to sync. Remove these incomplete tests for now to avoid false failures. --- .../portal/beacon/src/suites/interop.rs | 158 ------------------ 1 file changed, 158 deletions(-) diff --git a/simulators/portal/beacon/src/suites/interop.rs b/simulators/portal/beacon/src/suites/interop.rs index 206dbe381c..5251ac7009 100644 --- a/simulators/portal/beacon/src/suites/interop.rs +++ b/simulators/portal/beacon/src/suites/interop.rs @@ -15,7 +15,6 @@ use itertools::Itertools; use serde_json::json; use serde_yaml::Value; use std::collections::HashMap; -use tokio::time::Duration; // This is taken from Trin. It should be fairly standard const MAX_PORTAL_CONTENT_PAYLOAD_SIZE: usize = 1165; @@ -96,18 +95,6 @@ dyn_async! { // Iterate over all possible pairings of clients and run the tests (including self-pairings) for (client_a, client_b) in clients.iter().cartesian_product(clients.iter()) { for ProcessedContent { content_type, identifier, test_data } in process_content(content.clone()) { - test.run( - NClientTestSpec { - name: format!("OFFER {}: {} {} --> {}", content_type, identifier, client_a.name, client_b.name), - description: "".to_string(), - always_run: false, - run: test_offer, - environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), BEACON_STRING.to_string())])), Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), BEACON_STRING.to_string())]))]), - test_data: Some(TestData::ContentList(test_data.clone())), - clients: vec![client_a.clone(), client_b.clone()], - } - ).await; - test.run( NClientTestSpec { name: format!("RecursiveFindContent {}: {} {} --> {}", content_type, identifier, client_a.name, client_b.name), @@ -168,19 +155,6 @@ dyn_async! { clients: vec![client_a.clone(), client_b.clone()], } ).await; - - // Test gossiping a collection of blocks to node B (B will gossip back to A) - test.run( - NClientTestSpec { - name: format!("GOSSIP blocks from A:{} --> B:{}", client_a.name, client_b.name), - description: "".to_string(), - always_run: false, - run: test_gossip_two_nodes, - environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), BEACON_STRING.to_string())])), Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), BEACON_STRING.to_string())]))]), - test_data: Some(TestData::ContentList(content.clone().into_iter().map(content_pair_to_string_pair).collect())), - clients: vec![client_a.clone(), client_b.clone()], - } - ).await; } } } @@ -228,47 +202,6 @@ dyn_async! { } } -dyn_async! { - async fn test_offer<'a>(clients: Vec, test_data: Option) { - let (client_a, client_b) = match clients.iter().collect_tuple() { - Some((client_a, client_b)) => (client_a, client_b), - None => { - panic!("Unable to get expected amount of clients from NClientTestSpec"); - } - }; - let test_data = match test_data.map(|data| data.content_list()) { - Some(test_data) => test_data, - None => panic!("Expected test data non was provided"), - }; - let ContentKeyValue { key: target_key, value: target_value } = test_data.first().expect("Target content is required for this test"); - let target_key: BeaconContentKey = - serde_json::from_value(json!(target_key)).unwrap(); - let target_value: BeaconContentValue = - serde_json::from_value(json!(target_value)).unwrap(); - let target_enr = match client_b.rpc.node_info().await { - Ok(node_info) => node_info.enr, - Err(err) => { - panic!("Error getting node info: {err:?}"); - } - }; - - let _ = client_a.rpc.offer(target_enr, target_key.clone(), Some(target_value.clone())).await; - - tokio::time::sleep(Duration::from_secs(8)).await; - - match client_b.rpc.local_content(target_key).await { - Ok(possible_content) => { - if possible_content != target_value { - panic!("Error receiving content: Expected content: {target_value:?}, Received content: {possible_content:?}"); - } - } - Err(err) => { - panic!("Unable to get received content: {err:?}"); - } - } - } -} - dyn_async! { async fn test_ping<'a>(clients: Vec, _: Option) { let (client_a, client_b) = match clients.iter().collect_tuple() { @@ -477,94 +410,3 @@ dyn_async! { } } } - -dyn_async! { - async fn test_gossip_two_nodes<'a> (clients: Vec, test_data: Option) { - let (client_a, client_b) = match clients.iter().collect_tuple() { - Some((client_a, client_b)) => (client_a, client_b), - None => { - panic!("Unable to get expected amount of clients from NClientTestSpec"); - } - }; - let test_data = match test_data.map(|data| data.content_list()) { - Some(test_data) => test_data, - None => panic!("Expected test data non was provided"), - }; - // connect clients - let client_b_enr = match client_b.rpc.node_info().await { - Ok(node_info) => node_info.enr, - Err(err) => { - panic!("Error getting node info: {err:?}"); - } - }; - match BeaconNetworkApiClient::add_enr(&client_a.rpc, client_b_enr.clone()).await { - Ok(response) => match response { - true => (), - false => panic!("AddEnr expected to get true and instead got false") - }, - Err(err) => panic!("{}", &err.to_string()), - } - - // With default node settings nodes should be storing all content - for ContentKeyValue { key: content_key, value: content_value } in test_data.clone() { - let content_key: BeaconContentKey = - serde_json::from_value(json!(content_key)).unwrap(); - let content_value: BeaconContentValue = - serde_json::from_value(json!(content_value)).unwrap(); - - match client_a.rpc.gossip(content_key.clone(), content_value.clone()).await { - Ok(nodes_gossiped_to) => { - if nodes_gossiped_to != 1 { - panic!("We expected to gossip to 1 node instead we gossiped to: {nodes_gossiped_to}"); - } - } - Err(err) => { - panic!("Unable to get received content: {err:?}"); - } - } - - tokio::time::sleep(Duration::from_secs(1)).await; - } - - // wait test_data.len() seconds for data to propagate, giving more time if more items are propagating - tokio::time::sleep(Duration::from_secs(test_data.len() as u64)).await; - - // process raw test data to generate content details for error output - let mut result = vec![]; - for ContentKeyValue { key: content_key, value: content_value } in test_data.into_iter() { - let content_key: BeaconContentKey = - serde_json::from_value(json!(content_key)).unwrap(); - let content_value: BeaconContentValue = - serde_json::from_value(json!(content_value)).unwrap(); - - let content_details = { - let content_type = match &content_key { - BeaconContentKey::LightClientBootstrap(_) => "bootstrap".to_string(), - BeaconContentKey::LightClientUpdatesByRange(_) => "updates by range".to_string(), - BeaconContentKey::LightClientFinalityUpdate(_) => "finality update".to_string(), - BeaconContentKey::LightClientOptimisticUpdate(_) => "optimistic update".to_string(), - }; - format!( - "{:?} {}", - content_key, - content_type - ) - }; - - match client_b.rpc.local_content(content_key.clone()).await { - Ok(expected_value) => { - if expected_value != content_value { - result.push(format!("Error content received for block {content_details} was different then expected")); - } - } - Err(err) => { - result.push(format!("Error content for block {err} was absent")); - } - } - } - - if !result.is_empty() { - panic!("Client B: {:?}", result); - } - } -} From aac21801917928404a68247209ad491400c194e9 Mon Sep 17 00:00:00 2001 From: Dan Cline <6798349+Rjected@users.noreply.github.com> Date: Fri, 7 Jun 2024 04:46:03 -0400 Subject: [PATCH 280/387] clients/reth: remove --debug.continuous usage (#1115) --- clients/reth/reth.sh | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/clients/reth/reth.sh b/clients/reth/reth.sh index a2b2a5d6a1..a3539dce30 100644 --- a/clients/reth/reth.sh +++ b/clients/reth/reth.sh @@ -65,7 +65,7 @@ FLAGS="$FLAGS --datadir $DATADIR" mv /genesis.json /genesis-input.json jq -f /mapper.jq /genesis-input.json > /genesis.json -# Dump genesis. +# Dump genesis. if [ "$HIVE_LOGLEVEL" -lt 4 ]; then echo "Supplied genesis state (trimmed, use --sim.loglevel 4 or 5 for full output):" jq 'del(.alloc[] | select(.balance == "0x123450000000000000000"))' /genesis.json @@ -147,16 +147,6 @@ fi FLAGS="$FLAGS --http --http.addr=0.0.0.0 --http.api=admin,debug,eth,net,web3" FLAGS="$FLAGS --ws --ws.addr=0.0.0.0 --ws.api=admin,debug,eth,net,web3" -# Enable continuous sync if there is no CL (ttd == "") and mining is disabled -if [ -z "${HIVE_MINER}" ] && [ -z "${HIVE_CLIQUE_PRIVATEKEY}" ] && [ -z "${HIVE_TERMINAL_TOTAL_DIFFICULTY}" ]; then - # if there is no chain file then we need to sync with the continuous - # download mode - if [ ! -f /chain.rlp ]; then - FLAGS="$FLAGS --debug.continuous" - fi -fi - - if [ "$HIVE_TERMINAL_TOTAL_DIFFICULTY" != "" ]; then JWT_SECRET="7365637265747365637265747365637265747365637265747365637265747365" echo -n $JWT_SECRET > /jwt.secret From f09df20bd5fb03324cd0a55e342e7fb23ed55704 Mon Sep 17 00:00:00 2001 From: Dan Cline <6798349+Rjected@users.noreply.github.com> Date: Fri, 7 Jun 2024 04:46:22 -0400 Subject: [PATCH 281/387] clients/reth: pass HIVE_CLIQUE_PERIOD to reth script (#1116) --- clients/reth/reth.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/clients/reth/reth.sh b/clients/reth/reth.sh index a3539dce30..40db5e3750 100644 --- a/clients/reth/reth.sh +++ b/clients/reth/reth.sh @@ -141,6 +141,9 @@ fi # If clique is expected enable auto-mine if [ -n "${HIVE_CLIQUE_PRIVATEKEY}" ] || [ -n "${HIVE_CLIQUE_PERIOD}" ]; then FLAGS="$FLAGS --auto-mine" + if [ -n "${HIVE_CLIQUE_PERIOD}" ]; then + FLAGS="$FLAGS --dev.block-time ${HIVE_CLIQUE_PERIOD}s" + fi fi # Configure RPC. From 797d63924a51207da5b90c098913cc4e6f90d2e9 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Mon, 10 Jun 2024 19:21:18 +0200 Subject: [PATCH 282/387] go.mod, cmd/hivechain: upgrade to go-ethereum v1.14.5 --- cmd/hivechain/generate.go | 4 +- cmd/hivechain/genesis.go | 2 +- cmd/hivechain/mod_txinvoke.go | 4 +- cmd/hivechain/mod_uncles.go | 2 +- go.mod | 38 ++--- go.sum | 310 +++++----------------------------- 6 files changed, 64 insertions(+), 296 deletions(-) diff --git a/cmd/hivechain/generate.go b/cmd/hivechain/generate.go index 3396b811f1..6d68680b91 100644 --- a/cmd/hivechain/generate.go +++ b/cmd/hivechain/generate.go @@ -263,8 +263,8 @@ type instaSeal struct{ consensus.Engine } // FinalizeAndAssemble implements consensus.Engine, accumulating the block and uncle rewards, // setting the final state and assembling the block. -func (e instaSeal) FinalizeAndAssemble(chain consensus.ChainHeaderReader, header *types.Header, state *state.StateDB, txs []*types.Transaction, uncles []*types.Header, receipts []*types.Receipt, withdrawals []*types.Withdrawal) (*types.Block, error) { - block, err := e.Engine.FinalizeAndAssemble(chain, header, state, txs, uncles, receipts, withdrawals) +func (e instaSeal) FinalizeAndAssemble(chain consensus.ChainHeaderReader, header *types.Header, state *state.StateDB, body *types.Body, receipts []*types.Receipt) (*types.Block, error) { + block, err := e.Engine.FinalizeAndAssemble(chain, header, state, body, receipts) if err != nil { return nil, err } diff --git a/cmd/hivechain/genesis.go b/cmd/hivechain/genesis.go index 363ee1f52c..f96bbdefe9 100644 --- a/cmd/hivechain/genesis.go +++ b/cmd/hivechain/genesis.go @@ -166,7 +166,7 @@ func (cfg *generatorConfig) createGenesis() *core.Genesis { } func add4788Contract(ga core.GenesisAlloc) { - ga[params.BeaconRootsStorageAddress] = core.GenesisAccount{ + ga[params.BeaconRootsAddress] = core.GenesisAccount{ Balance: big.NewInt(42), Code: common.FromHex("0x3373fffffffffffffffffffffffffffffffffffffffe14604d57602036146024575f5ffd5b5f35801560495762001fff810690815414603c575f5ffd5b62001fff01545f5260205ff35b5f5ffd5b62001fff42064281555f359062001fff015500"), } diff --git a/cmd/hivechain/mod_txinvoke.go b/cmd/hivechain/mod_txinvoke.go index e313aa09bb..fa6c879908 100644 --- a/cmd/hivechain/mod_txinvoke.go +++ b/cmd/hivechain/mod_txinvoke.go @@ -125,8 +125,8 @@ func (m *modInvokeEmit) apply(ctx *genBlockContext) bool { } var ( blob1 = kzg4844.Blob{0x01} - blob1C, _ = kzg4844.BlobToCommitment(blob1) - blob1P, _ = kzg4844.ComputeBlobProof(blob1, blob1C) + blob1C, _ = kzg4844.BlobToCommitment(&blob1) + blob1P, _ = kzg4844.ComputeBlobProof(&blob1, blob1C) ) sidecar := &types.BlobTxSidecar{ Blobs: []kzg4844.Blob{blob1}, diff --git a/cmd/hivechain/mod_uncles.go b/cmd/hivechain/mod_uncles.go index 8f9a215795..5cc599786f 100644 --- a/cmd/hivechain/mod_uncles.go +++ b/cmd/hivechain/mod_uncles.go @@ -46,7 +46,7 @@ func (m *modUncles) apply(ctx *genBlockContext) bool { Extra: []byte(fmt.Sprintf("hivechain uncle %d", m.counter)), } // Initialize the remaining remaining header fields by converting to a full block. - ub := types.NewBlock(uncle, nil, nil, nil, trie.NewStackTrie(nil)) + ub := types.NewBlock(uncle, nil, nil, trie.NewStackTrie(nil)) uncle = ub.Header() // Add the uncle to the generated block. diff --git a/go.mod b/go.mod index 3368701bc7..508dbc5941 100644 --- a/go.mod +++ b/go.mod @@ -6,7 +6,7 @@ toolchain go1.22.1 require ( github.com/davecgh/go-spew v1.1.1 - github.com/ethereum/go-ethereum v1.13.14 + github.com/ethereum/go-ethereum v1.14.5 github.com/ethereum/hive/hiveproxy v0.0.0-20230919105823-37cbbe1ef86d github.com/evanw/esbuild v0.18.11 github.com/fsouza/go-dockerclient v1.11.0 @@ -15,7 +15,7 @@ require ( github.com/holiman/uint256 v1.2.4 github.com/lithammer/dedent v1.1.0 golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa - golang.org/x/net v0.21.0 + golang.org/x/net v0.24.0 gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1 gopkg.in/yaml.v3 v3.0.1 ) @@ -23,37 +23,37 @@ require ( require ( github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 // indirect github.com/DataDog/zstd v1.5.2 // indirect - github.com/Microsoft/go-winio v0.6.1 // indirect - github.com/VictoriaMetrics/fastcache v1.12.1 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect + github.com/VictoriaMetrics/fastcache v1.12.2 // indirect github.com/allegro/bigcache v1.2.1 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/bits-and-blooms/bitset v1.10.0 // indirect github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect - github.com/cespare/xxhash/v2 v2.2.0 // indirect - github.com/cockroachdb/errors v1.9.1 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/cockroachdb/errors v1.11.1 // indirect github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect - github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593 // indirect - github.com/cockroachdb/redact v1.1.3 // indirect + github.com/cockroachdb/pebble v1.1.0 // indirect + github.com/cockroachdb/redact v1.1.5 // indirect github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect github.com/consensys/bavard v0.1.13 // indirect github.com/consensys/gnark-crypto v0.12.1 // indirect github.com/containerd/containerd v1.6.26 // indirect github.com/containerd/log v0.1.0 // indirect - github.com/crate-crypto/go-ipa v0.0.0-20231025140028-3c0104f4b233 // indirect - github.com/crate-crypto/go-kzg-4844 v0.7.0 // indirect - github.com/deckarep/golang-set/v2 v2.1.0 // indirect + github.com/crate-crypto/go-ipa v0.0.0-20240223125850-b1e8a79f509c // indirect + github.com/crate-crypto/go-kzg-4844 v1.0.0 // indirect + github.com/deckarep/golang-set/v2 v2.6.0 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 // indirect github.com/docker/docker v25.0.5+incompatible // indirect github.com/docker/go-connections v0.4.0 // indirect github.com/docker/go-units v0.5.0 // indirect - github.com/ethereum/c-kzg-4844 v0.4.0 // indirect - github.com/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46 // indirect + github.com/ethereum/c-kzg-4844 v1.0.0 // indirect + github.com/ethereum/go-verkle v0.1.1-0.20240306133620-7d920df305f0 // indirect github.com/getsentry/sentry-go v0.18.0 // indirect github.com/go-ole/go-ole v1.3.0 // indirect github.com/go-stack/stack v1.8.1 // indirect github.com/gofrs/flock v0.8.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang/protobuf v1.5.3 // indirect + github.com/golang/protobuf v1.5.4 // indirect github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect github.com/gorilla/websocket v1.5.0 // indirect github.com/hashicorp/yamux v0.1.1 // indirect @@ -62,7 +62,7 @@ require ( github.com/kr/pretty v0.3.1 // indirect github.com/kr/text v0.2.0 // indirect github.com/mattn/go-colorable v0.1.13 // indirect - github.com/mattn/go-isatty v0.0.17 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect github.com/mattn/go-runewidth v0.0.14 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect github.com/mmcloughlin/addchain v0.4.0 // indirect @@ -88,12 +88,10 @@ require ( github.com/tklauser/go-sysconf v0.3.12 // indirect github.com/tklauser/numcpus v0.6.1 // indirect github.com/yusufpapurcu/wmi v1.2.2 // indirect - golang.org/x/crypto v0.21.0 // indirect - golang.org/x/mod v0.14.0 // indirect - golang.org/x/sync v0.5.0 // indirect - golang.org/x/sys v0.18.0 // indirect + golang.org/x/crypto v0.22.0 // indirect + golang.org/x/sync v0.7.0 // indirect + golang.org/x/sys v0.20.0 // indirect golang.org/x/text v0.14.0 // indirect - golang.org/x/tools v0.15.0 // indirect google.golang.org/protobuf v1.33.0 // indirect rsc.io/tmplfunc v0.0.3 // indirect ) diff --git a/go.sum b/go.sum index ecc1538fb3..c6c551c293 100644 --- a/go.sum +++ b/go.sum @@ -1,28 +1,18 @@ -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= github.com/AdaLogics/go-fuzz-headers v0.0.0-20210715213245-6c3934b029d8 h1:V8krnnfGj4pV65YLUm3C0/8bl7V5Nry2Pwvy3ru/wLc= github.com/AdaLogics/go-fuzz-headers v0.0.0-20210715213245-6c3934b029d8/go.mod h1:CzsSbkDixRphAF5hS6wbMKq0eI6ccJRb7/A0M6JBnwg= -github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8= github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/CloudyKit/fastprinter v0.0.0-20200109182630-33d98a066a53/go.mod h1:+3IMCy2vIlbG1XG/0ggNQv0SvxCAIpPM5b1nCz56Xno= -github.com/CloudyKit/jet/v3 v3.0.0/go.mod h1:HKQPgSJmdK8hdoAbKUUWajkHyHo4RaU5rMdUywE7VMo= github.com/DataDog/zstd v1.5.2 h1:vUG4lAyuPCXO0TLbXvPv7EB7cNK1QV/luu55UHLrrn8= github.com/DataDog/zstd v1.5.2/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= -github.com/Joker/hpp v1.0.0/go.mod h1:8x5n+M1Hp5hC0g8okX3sR3vFQwynaX/UgSOM9MeBKzY= -github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= -github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= github.com/Microsoft/hcsshim v0.9.10 h1:TxXGNmcbQxBKVWvjvTocNb6jrPyeHlk5EiDhhgHgggs= github.com/Microsoft/hcsshim v0.9.10/go.mod h1:7pLA8lDk46WKDWlVsENo92gC0XFa8rbKfyFRBqxEbCc= -github.com/Shopify/goreferrer v0.0.0-20181106222321-ec9c9a553398/go.mod h1:a1uqRtAwp2Xwc6WNPJEufxJ7fx3npB4UV/JOLmbu5I0= -github.com/VictoriaMetrics/fastcache v1.12.1 h1:i0mICQuojGDL3KblA7wUNlY5lOK6a4bwt3uRKnkZU40= -github.com/VictoriaMetrics/fastcache v1.12.1/go.mod h1:tX04vaqcNoQeGLD+ra5pU5sWkuxnzWhEzLwhP9w653o= -github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY= +github.com/VictoriaMetrics/fastcache v1.12.2 h1:N0y9ASrJ0F6h0QaC3o6uJb3NIZ9VKLjCM7NQbSmF7WI= +github.com/VictoriaMetrics/fastcache v1.12.2/go.mod h1:AmC+Nzz1+3G2eCPapF6UcsnkThDcMsQicp4xDukwJYI= github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= github.com/allegro/bigcache v1.2.1 h1:hg1sY1raCwic3Vnsvje6TT7/pnZba83LeFck5NrFKSc= github.com/allegro/bigcache v1.2.1/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= -github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= -github.com/aymerick/raymond v2.0.3-0.20180322193309-b565731e1464+incompatible/go.mod h1:osfaiScAUVup+UC9Nfq76eWqDhXlp+4UYaA8uhTBO6g= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bits-and-blooms/bitset v1.10.0 h1:ePXTeiPEazB5+opbv5fr8umg2R/1NlzgDsyepwsSr88= @@ -31,29 +21,24 @@ github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cockroachdb/datadriven v1.0.2/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f h1:otljaYPt5hWxV3MUfO5dFPFiOXg9CyG5/kCfayTqsJ4= github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= -github.com/cockroachdb/errors v1.9.1 h1:yFVvsI0VxmRShfawbt/laCIDy/mtTqqnvoNgiy5bEV8= -github.com/cockroachdb/errors v1.9.1/go.mod h1:2sxOtL2WIc096WSZqZ5h8fa17rdDq9HZOZLBCor4mBk= -github.com/cockroachdb/logtags v0.0.0-20211118104740-dabe8e521a4f/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= +github.com/cockroachdb/errors v1.11.1 h1:xSEW75zKaKCWzR3OfxXUxgrk/NtT4G1MiOv5lWZazG8= +github.com/cockroachdb/errors v1.11.1/go.mod h1:8MUxA3Gi6b25tYlFEBGLf+D8aISL+M4MIpiWMSNRfxw= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= -github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593 h1:aPEJyR4rPBvDmeyi+l/FS/VtA00IWvjeFvjen1m1l1A= -github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593/go.mod h1:6hk1eMY/u5t+Cf18q5lFMUA1Rc+Sm5I6Ra1QuPyxXCo= -github.com/cockroachdb/redact v1.1.3 h1:AKZds10rFSIj7qADf0g46UixK8NNLwWTNdCIGS5wfSQ= -github.com/cockroachdb/redact v1.1.3/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= +github.com/cockroachdb/pebble v1.1.0 h1:pcFh8CdCIt2kmEpK0OIatq67Ln9uGDYY3d5XnE0LJG4= +github.com/cockroachdb/pebble v1.1.0/go.mod h1:sEHm5NOXxyiAoKWhoFxT8xMgd/f3RA6qUqQ1BXKrh2E= +github.com/cockroachdb/redact v1.1.5 h1:u1PMllDkdFfPWaNGMyLD1+so+aq3uUItthCFqzwPJ30= +github.com/cockroachdb/redact v1.1.5/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo= github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ= -github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0/go.mod h1:4Zcjuz89kmFXt9morQgcfYZAYZ5n8WHjt81YYWIwtTM= github.com/consensys/bavard v0.1.13 h1:oLhMLOFGTLdlda/kma4VOJazblc7IM5y5QPd2A/YjhQ= github.com/consensys/bavard v0.1.13/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI= github.com/consensys/gnark-crypto v0.12.1 h1:lHH39WuuFgVHONRl3J0LRBtuYdQTumFSDtJF7HpyG8M= @@ -62,49 +47,36 @@ github.com/containerd/containerd v1.6.26 h1:VVfrE6ZpyisvB1fzoY8Vkiq4sy+i5oF4uk7z github.com/containerd/containerd v1.6.26/go.mod h1:I4TRdsdoo5MlKob5khDJS2EPT1l1oMNaE2MBm6FrwxM= github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I= github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo= -github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= -github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= -github.com/crate-crypto/go-ipa v0.0.0-20231025140028-3c0104f4b233 h1:d28BXYi+wUpz1KBmiF9bWrjEMacUEREV6MBi2ODnrfQ= -github.com/crate-crypto/go-ipa v0.0.0-20231025140028-3c0104f4b233/go.mod h1:geZJZH3SzKCqnz5VT0q/DyIG/tvu/dZk+VIfXicupJs= -github.com/crate-crypto/go-kzg-4844 v0.7.0 h1:C0vgZRk4q4EZ/JgPfzuSoxdCq3C3mOZMBShovmncxvA= -github.com/crate-crypto/go-kzg-4844 v0.7.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= +github.com/crate-crypto/go-ipa v0.0.0-20240223125850-b1e8a79f509c h1:uQYC5Z1mdLRPrZhHjHxufI8+2UG/i25QG92j0Er9p6I= +github.com/crate-crypto/go-ipa v0.0.0-20240223125850-b1e8a79f509c/go.mod h1:geZJZH3SzKCqnz5VT0q/DyIG/tvu/dZk+VIfXicupJs= +github.com/crate-crypto/go-kzg-4844 v1.0.0 h1:TsSgHwrkTKecKJ4kadtHi4b3xHW5dCFUDFnUp1TsawI= +github.com/crate-crypto/go-kzg-4844 v1.0.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/creack/pty v1.1.11 h1:07n33Z8lZxZ2qwegKbObQohDhXDQxiMMz1NOUGYlesw= github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/deckarep/golang-set/v2 v2.1.0 h1:g47V4Or+DUdzbs8FxCCmgb6VYd+ptPAngjM6dtGktsI= -github.com/deckarep/golang-set/v2 v2.1.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= +github.com/deckarep/golang-set/v2 v2.6.0 h1:XfcQbWM1LlMB8BsJ8N9vW5ehnnPVIw0je80NsVHagjM= +github.com/deckarep/golang-set/v2 v2.6.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0= github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 h1:HbphB4TFFXpv7MNrT52FGrrgVXF1owhMVTHFZIlnvd4= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0/go.mod h1:DZGJHZMqrU4JJqFAWUS2UO1+lbSKsdiOoYi9Zzey7Fc= -github.com/dgraph-io/badger v1.6.0/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6psNgSztDR4= -github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/docker/docker v25.0.5+incompatible h1:UmQydMduGkrD5nQde1mecF/YnSbTOaPeFIeP5C4W+DE= github.com/docker/docker v25.0.5+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385/go.mod h1:0vRUJqYpeSZifjYj7uP3BG/gKcuzL9xWVV/Y+cK33KM= -github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/etcd-io/bbolt v1.3.3/go.mod h1:ZF2nL25h33cCyBtcyWeZ2/I3HQOfTP+0PIEvHjkjCrw= -github.com/ethereum/c-kzg-4844 v0.4.0 h1:3MS1s4JtA868KpJxroZoepdV0ZKBp3u/O5HcZ7R3nlY= -github.com/ethereum/c-kzg-4844 v0.4.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= -github.com/ethereum/go-ethereum v1.13.14 h1:EwiY3FZP94derMCIam1iW4HFVrSgIcpsu0HwTQtm6CQ= -github.com/ethereum/go-ethereum v1.13.14/go.mod h1:TN8ZiHrdJwSe8Cb6x+p0hs5CxhJZPbqB7hHkaUXcmIU= +github.com/ethereum/c-kzg-4844 v1.0.0 h1:0X1LBXxaEtYD9xsyj9B9ctQEZIpnvVDeoBx8aHEwTNA= +github.com/ethereum/c-kzg-4844 v1.0.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= +github.com/ethereum/go-ethereum v1.14.5 h1:szuFzO1MhJmweXjoM5nSAeDvjNUH3vIQoMzzQnfvjpw= +github.com/ethereum/go-ethereum v1.14.5/go.mod h1:VEDGGhSxY7IEjn98hJRFXl/uFvpRgbIIf2PpXiyGGgc= +github.com/ethereum/go-verkle v0.1.1-0.20240306133620-7d920df305f0 h1:KrE8I4reeVvf7C1tm8elRjj4BdscTYzz/WAbYyf/JI4= +github.com/ethereum/go-verkle v0.1.1-0.20240306133620-7d920df305f0/go.mod h1:D9AJLVXSyZQXJQVk8oh1EwjISE+sJTn2duYIZC0dy3w= github.com/evanw/esbuild v0.18.11 h1:Mb0qb9KyJQraob0Y7LA0DOdD8ijJs2TxhqgqrDeGq4w= github.com/evanw/esbuild v0.18.11/go.mod h1:iINY06rn799hi48UqEnaQvVfZWe6W9bET78LbvN8VWk= -github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072/go.mod h1:duJ4Jxv5lDcvg4QuQr0oowTf7dz4/CR8NtyCooz9HL8= -github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= @@ -112,81 +84,49 @@ github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4 github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= github.com/fsouza/go-dockerclient v1.11.0 h1:4ZAk6W7rPAtPXm7198EFqA5S68rwnNQORxlOA5OurCA= github.com/fsouza/go-dockerclient v1.11.0/go.mod h1:0I3TQCRseuPTzqlY4Y3ajfsg2VAdMQoazrkxJTiJg8s= -github.com/gavv/httpexpect v2.0.0+incompatible/go.mod h1:x+9tiU1YnrOvnB725RkpoLv1M62hOWzwo5OXotisrKc= -github.com/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46 h1:BAIP2GihuqhwdILrV+7GJel5lyPV3u1+PgzrWLc0TkE= -github.com/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46/go.mod h1:QNpY22eby74jVhqH4WhDLDwxc/vqsern6pW+u2kbkpc= -github.com/getsentry/sentry-go v0.12.0/go.mod h1:NSap0JBYWzHND8oMbyi0+XZhUalc1TBdRL1M71JZW2c= github.com/getsentry/sentry-go v0.18.0 h1:MtBW5H9QgdcJabtZcuJG80BMOwaBpkRDZkxRkNC1sN0= github.com/getsentry/sentry-go v0.18.0/go.mod h1:Kgon4Mby+FJ7ZWHFUAZgVaIa8sxHtnRJRLTXZr51aKQ= -github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3/go.mod h1:VJ0WA2NBN22VlZ2dKZQPAPnyWw5XTlK1KymzLKsr59s= -github.com/gin-gonic/gin v1.4.0/go.mod h1:OW2EZn3DO8Ln9oIKOvM++LBO+5UPHJJDH72/q/3rZdM= -github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= -github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= -github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab/go.mod h1:/P9AEU963A2AYjv4d1V5eVL1CQbEJq6aCNHDDjibzu8= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= github.com/go-stack/stack v1.8.1 h1:ntEHSVwIt7PNXNpgPmVfMrNhLtgjlmnZha2kOpuRiDw= github.com/go-stack/stack v1.8.1/go.mod h1:dcoOX6HbPZSZptuspn9bctJ+N/CnF5gGygcUP3XYfe4= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= -github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= -github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= -github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= -github.com/gogo/googleapis v0.0.0-20180223154316-0cd9801be74a/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= -github.com/gogo/googleapis v1.4.1/go.mod h1:2lpHqI5OcWCtVElxXnPt+s8oJvMpySlOyM6xDCrzib4= -github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/gogo/status v1.1.0/go.mod h1:BFv9nrluPLmrS0EmGVvLaPNmRosr9KapBYd5/hpY1WM= -github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= -github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXiurYmW7fx4GZkL8feAMVq7nEjURHk= github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/gomodule/redigo v1.7.1-0.20190724094224-574c33c3df38/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= -github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hashicorp/yamux v0.1.1 h1:yrQxtgseBDrq9Y652vSRDvsKCJKOUD+GzTS4Y0Y8pvE= github.com/hashicorp/yamux v0.1.1/go.mod h1:CtWFDAQgb7dxtzFs4tWbplKIe2jSi3+5vKbgIO0SLnQ= github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao= @@ -194,71 +134,31 @@ github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iU github.com/holiman/uint256 v1.2.4 h1:jUc4Nk8fm9jZabQuqr2JzednajVmBpC+oiTiXZJEApU= github.com/holiman/uint256 v1.2.4/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXeiRV4ng7E= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/hydrogen18/memlistener v0.0.0-20200120041712-dcc25e7acd91/go.mod h1:qEIFzExnS6016fRpRfxrExeVn2gbClQA99gQhnIcdhE= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/imkira/go-interpol v1.1.0/go.mod h1:z0h2/2T3XF8kyEPpRgJ3kmNv+C43p+I/CoI+jC3w2iA= -github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/iris-contrib/blackfriday v2.0.0+incompatible/go.mod h1:UzZ2bDEoaSGPbkg6SAB4att1aAwTmVIx/5gCVqeyUdI= -github.com/iris-contrib/go.uuid v2.0.0+incompatible/go.mod h1:iz2lgM/1UnEf1kP0L/+fafWORmlnuysV2EMP8MW+qe0= -github.com/iris-contrib/jade v1.1.3/go.mod h1:H/geBymxJhShH5kecoiOCSssPX7QWYH7UaeZTSWddIk= -github.com/iris-contrib/pongo2 v0.0.1/go.mod h1:Ssh+00+3GAZqSQb30AvBRNxBx7rf0GqwkjqxNd0u65g= -github.com/iris-contrib/schema v0.0.1/go.mod h1:urYA3uvUNG1TIIjOSCzHr9/LmbQo8LrOcOqfqxa4hXw= -github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= -github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88/go.mod h1:3w7q1U84EfirKl04SVQ/s7nPm1ZPhiXd34z40TNz36k= -github.com/kataras/golog v0.0.10/go.mod h1:yJ8YKCmyL+nWjERB90Qwn+bdyBZsaQwU3bTVFgkFIp8= -github.com/kataras/iris/v12 v12.1.8/go.mod h1:LMYy4VlP67TQ3Zgriz8RE2h2kMZV2SgMYbq3UhfoFmE= -github.com/kataras/neffos v0.0.14/go.mod h1:8lqADm8PnbeFfL7CLXh1WHw53dG27MC3pgi2R1rmoTE= -github.com/kataras/pio v0.0.2/go.mod h1:hAoW0t9UmXi4R5Oyq5Z4irTbaTsOemSrDGUtaTl7Dro= -github.com/kataras/sitemap v0.0.5/go.mod h1:KY2eugMKiPwsJgx7+U103YZehfvNGOXURubcGyk0Bz8= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.8.2/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= -github.com/klauspost/compress v1.9.7/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= github.com/klauspost/compress v1.15.15 h1:EF27CXIuDsYJ6mmvtBRlEuB2UVOqHG1tAXgZ7yIO+lw= github.com/klauspost/compress v1.15.15/go.mod h1:ZcK2JAFqKOpnBlxcLsJzYfrS9X1akm9fHZNnD9+Vo/4= -github.com/klauspost/cpuid v1.2.1/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/labstack/echo/v4 v4.5.0/go.mod h1:czIriw4a0C1dFun+ObrXp7ok03xON0N1awStJ6ArI7Y= -github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c= github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= github.com/lithammer/dedent v1.1.0 h1:VNzHMVCBNG1j0fh3OrsFRkVUwStdDArbgBWoPAffktY= github.com/lithammer/dedent v1.1.0/go.mod h1:jrXYCQtgg0nJiN+StA2KgR7w6CiQNv9Fd/Z9BP0jIOc= -github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.11/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= -github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= -github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng= -github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.14 h1:+xnbZSEeDbOIg5/mE6JF0w6n9duR1l3/WmbinWVwUuU= github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= -github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw= github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= -github.com/mediocregopher/radix/v3 v3.4.2/go.mod h1:8FL3F6UQRXHXIBSPUs5h0RybMF8i4n7wVopoX3x7Bv8= -github.com/microcosm-cc/bluemonday v1.0.2/go.mod h1:iVP4YcDBq+n/5fb23BhYFvIMq/leAFZyRl6bYmGDlGc= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mmcloughlin/addchain v0.4.0 h1:SobOdjm2xLj1KkXN5/n0xTIWyZA2+s99UCY1iPfkHRY= github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqkyU72HC5wJ4RlU= github.com/mmcloughlin/profile v0.1.1/go.mod h1:IhHD7q1ooxgwTgjxQYkACGA77oFTDdFVejUS1/tS/qU= @@ -270,24 +170,14 @@ github.com/moby/sys/user v0.1.0 h1:WmZ93f5Ux6het5iituh9x2zAG7NFY9Aqi49jjE1PaQg= github.com/moby/sys/user v0.1.0/go.mod h1:fKJhFOnsCN6xZ5gSfbM6zaHGgDJMrqt9/reuj4T7MmU= github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6 h1:dcztxKSvZ4Id8iPpHERQBbIJfabdt4wUm5qy3wOL2Zc= github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6/go.mod h1:E2VnQOmVuvZB6UYnnDB0qG5Nq/1tD9acaOpo6xmt0Kw= -github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= -github.com/moul/http2curl v1.0.0/go.mod h1:8UbvGypXm98wA/IqH45anm5Y2Z6ep6O31QGOAZ3H0fQ= -github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= -github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= -github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= -github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= @@ -302,7 +192,6 @@ github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8 github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opencontainers/image-spec v1.1.0-rc2.0.20221005185240-3a7f492d3f1b h1:YWuSjZCQAPM8UUBLkYUk1e+rZcvWHJmFb6i6rM44Xs8= github.com/opencontainers/image-spec v1.1.0-rc2.0.20221005185240-3a7f492d3f1b/go.mod h1:3OVijpioIKYWTqjiG0zfF6wvoJ4fAXGbjdZuI2NgsRQ= -github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= @@ -313,7 +202,6 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_golang v1.14.0 h1:nJdhIvne2eSX/XRAFV9PcvFFRbrjbcTUj0VP62TMhnw= github.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4= github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= github.com/prometheus/common v0.39.0 h1:oOyhkDq05hPZKItWVBkJ6g6AtGxi+fy7F4JvUV8uhsI= @@ -323,31 +211,15 @@ github.com/prometheus/procfs v0.9.0/go.mod h1:+pB4zwohETzFnmlpe6yd2lSc+0/46IYZRB github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.3 h1:utMvzDsuh3suAEnhH0RdHmoPbU648o6CvXxTx4SBMOw= github.com/rivo/uniseg v0.4.3/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= -github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= -github.com/rogpeppe/go-internal v1.8.1/go.mod h1:JeRgkft04UBgHMgCIwADu4Pn6Mtm5d4nPKWu0nJ5d+o= github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= -github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= -github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/schollz/closestmatch v2.1.0+incompatible/go.mod h1:RtP1ddjLong6gTkbtmuhtR2uUrrJOpYzYRvbcPAid+g= -github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI= github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= -github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= -github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= @@ -361,200 +233,102 @@ github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFA github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= -github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= -github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= -github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= -github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= -github.com/urfave/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4= -github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= -github.com/valyala/fasthttp v1.6.0/go.mod h1:FstJa9V+Pj9vQ7OJie2qMHdwemEDaDiSdBnvPM1Su9w= -github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= -github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= -github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio= -github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= -github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= -github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= -github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= -github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0/go.mod h1:/LWChgwKmvncFJFHJ7Gvn9wZArjbV5/FppcK2fKk/tI= -github.com/yudai/gojsondiff v1.0.0/go.mod h1:AY32+k2cwILAkW1fbgxQ5mUmMiZFgLIV+FBNExI05xg= -github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82/go.mod h1:lgjkn3NuSvDfVJdfcVVdX+jpBxNmX4rDAzaS45IcYoM= -github.com/yudai/pp v2.0.1+incompatible/go.mod h1:PuxR/8QJ7cyCkFp/aUDS+JY727OFEZkTdatxwunjIkc= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yusufpapurcu/wmi v1.2.2 h1:KBNDSne4vP5mbSWnJbO+51IMOXJB67QiYCSBrubbPRg= github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= -golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191227163750-53104e6ec876/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= -golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30= +golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M= golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa h1:FRnLl4eNAQl8hwxVVC17teOw8kdjVDVAiFMtgUdTSRQ= golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa/go.mod h1:zk2irFbV9DP96SEBUUAy67IdHUaZuSnrz1n472HUCLE= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.14.0 h1:dGoOF9QVLYng8IHTm7BAyWqCqSheQ5pYWGhzW00YJr0= -golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190327091125-710a502c58a2/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= -golang.org/x/net v0.0.0-20211008194852-3b03d305991f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4= -golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/net v0.24.0 h1:1PcaxkF854Fu3+lvBIx5SYn9wRlBzzcnHZSiaFFAb0w= +golang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE= -golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= +golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= -golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= +golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.18.0 h1:FcHjZXDMxI8mM3nwhX9HlKop4C0YQvCVCdwYl2wOtE8= -golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= +golang.org/x/term v0.19.0 h1:+ThwsDv+tYfnJFhF4L8jITxu1tdTWRTZpdsWgEgjL6Q= +golang.org/x/term v0.19.0/go.mod h1:2CuTdWZ7KHSQwUzKva0cbMg6q2DMI3Mmxp+gKJbskEk= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181221001348-537d06c36207/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190327201419-c70d86f8b7cf/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.15.0 h1:zdAyfUGbYmuVokhzVmghFl2ZJh5QhcfebBgmVPFYA+8= -golang.org/x/tools v0.15.0/go.mod h1:hpksKq4dtpQWS1uQ61JkdqWM3LscIS6Slf+VVkm+wQk= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/genproto v0.0.0-20180518175338-11a468237815/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= -google.golang.org/grpc v1.12.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= -gopkg.in/go-playground/validator.v8 v8.18.2/go.mod h1:RX2a/7Ha8BgOhfk7j780h4/u/RRjR0eouCJSH80/M2Y= gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1 h1:iiHuQZCNgYPmFQxd3BBN/Nc5+dAwzZuq5y40s20oQw0= gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= -gopkg.in/ini.v1 v1.51.1/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= @@ -562,15 +336,11 @@ gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= -gopkg.in/yaml.v3 v3.0.0-20191120175047-4206685974f2/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= gotest.tools/v3 v3.5.0 h1:Ljk6PdHdOhAb5aDMWXjDLMMhph+BpztA4v1QdqEW2eY= gotest.tools/v3 v3.5.0/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= rsc.io/tmplfunc v0.0.3 h1:53XFQh69AfOa8Tw0Jm7t+GV7KZhOi6jzsCzTtKbMvzU= rsc.io/tmplfunc v0.0.3/go.mod h1:AG3sTPzElb1Io3Yg4voV9AGZJuleGAwaVRxL9M49PhA= From 786a798a0cfed96b5bc02637aec2ea8d5e51df75 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Mon, 10 Jun 2024 19:26:18 +0200 Subject: [PATCH 283/387] hiveproxy: upgrade to go-ethereum v1.14.5 --- hiveproxy/go.mod | 12 +++++------- hiveproxy/go.sum | 36 ++++++++++++++++-------------------- 2 files changed, 21 insertions(+), 27 deletions(-) diff --git a/hiveproxy/go.mod b/hiveproxy/go.mod index 0fe43be60e..d4611aa750 100644 --- a/hiveproxy/go.mod +++ b/hiveproxy/go.mod @@ -5,14 +5,14 @@ go 1.21 toolchain go1.22.1 require ( - github.com/ethereum/go-ethereum v1.13.14 + github.com/ethereum/go-ethereum v1.14.5 github.com/hashicorp/yamux v0.1.1 ) require ( - github.com/Microsoft/go-winio v0.6.1 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect - github.com/deckarep/golang-set/v2 v2.1.0 // indirect + github.com/deckarep/golang-set/v2 v2.6.0 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 // indirect github.com/go-ole/go-ole v1.3.0 // indirect github.com/gorilla/websocket v1.5.0 // indirect @@ -21,9 +21,7 @@ require ( github.com/tklauser/go-sysconf v0.3.12 // indirect github.com/tklauser/numcpus v0.6.1 // indirect github.com/yusufpapurcu/wmi v1.2.2 // indirect - golang.org/x/crypto v0.21.0 // indirect + golang.org/x/crypto v0.22.0 // indirect golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa // indirect - golang.org/x/mod v0.14.0 // indirect - golang.org/x/sys v0.18.0 // indirect - golang.org/x/tools v0.15.0 // indirect + golang.org/x/sys v0.20.0 // indirect ) diff --git a/hiveproxy/go.sum b/hiveproxy/go.sum index c181daa364..8cea008ab9 100644 --- a/hiveproxy/go.sum +++ b/hiveproxy/go.sum @@ -1,5 +1,5 @@ -github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= -github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= github.com/bits-and-blooms/bitset v1.10.0 h1:ePXTeiPEazB5+opbv5fr8umg2R/1NlzgDsyepwsSr88= github.com/bits-and-blooms/bitset v1.10.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U= @@ -8,18 +8,18 @@ github.com/consensys/bavard v0.1.13 h1:oLhMLOFGTLdlda/kma4VOJazblc7IM5y5QPd2A/Yj github.com/consensys/bavard v0.1.13/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI= github.com/consensys/gnark-crypto v0.12.1 h1:lHH39WuuFgVHONRl3J0LRBtuYdQTumFSDtJF7HpyG8M= github.com/consensys/gnark-crypto v0.12.1/go.mod h1:v2Gy7L/4ZRosZ7Ivs+9SfUDr0f5UlG+EM5t7MPHiLuY= -github.com/crate-crypto/go-kzg-4844 v0.7.0 h1:C0vgZRk4q4EZ/JgPfzuSoxdCq3C3mOZMBShovmncxvA= -github.com/crate-crypto/go-kzg-4844 v0.7.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= +github.com/crate-crypto/go-kzg-4844 v1.0.0 h1:TsSgHwrkTKecKJ4kadtHi4b3xHW5dCFUDFnUp1TsawI= +github.com/crate-crypto/go-kzg-4844 v1.0.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/deckarep/golang-set/v2 v2.1.0 h1:g47V4Or+DUdzbs8FxCCmgb6VYd+ptPAngjM6dtGktsI= -github.com/deckarep/golang-set/v2 v2.1.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= +github.com/deckarep/golang-set/v2 v2.6.0 h1:XfcQbWM1LlMB8BsJ8N9vW5ehnnPVIw0je80NsVHagjM= +github.com/deckarep/golang-set/v2 v2.6.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 h1:HbphB4TFFXpv7MNrT52FGrrgVXF1owhMVTHFZIlnvd4= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0/go.mod h1:DZGJHZMqrU4JJqFAWUS2UO1+lbSKsdiOoYi9Zzey7Fc= -github.com/ethereum/c-kzg-4844 v0.4.0 h1:3MS1s4JtA868KpJxroZoepdV0ZKBp3u/O5HcZ7R3nlY= -github.com/ethereum/c-kzg-4844 v0.4.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= -github.com/ethereum/go-ethereum v1.13.14 h1:EwiY3FZP94derMCIam1iW4HFVrSgIcpsu0HwTQtm6CQ= -github.com/ethereum/go-ethereum v1.13.14/go.mod h1:TN8ZiHrdJwSe8Cb6x+p0hs5CxhJZPbqB7hHkaUXcmIU= +github.com/ethereum/c-kzg-4844 v1.0.0 h1:0X1LBXxaEtYD9xsyj9B9ctQEZIpnvVDeoBx8aHEwTNA= +github.com/ethereum/c-kzg-4844 v1.0.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= +github.com/ethereum/go-ethereum v1.14.5 h1:szuFzO1MhJmweXjoM5nSAeDvjNUH3vIQoMzzQnfvjpw= +github.com/ethereum/go-ethereum v1.14.5/go.mod h1:VEDGGhSxY7IEjn98hJRFXl/uFvpRgbIIf2PpXiyGGgc= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= @@ -45,22 +45,18 @@ github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+F github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= github.com/yusufpapurcu/wmi v1.2.2 h1:KBNDSne4vP5mbSWnJbO+51IMOXJB67QiYCSBrubbPRg= github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= -golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= -golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= +golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30= +golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M= golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa h1:FRnLl4eNAQl8hwxVVC17teOw8kdjVDVAiFMtgUdTSRQ= golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa/go.mod h1:zk2irFbV9DP96SEBUUAy67IdHUaZuSnrz1n472HUCLE= -golang.org/x/mod v0.14.0 h1:dGoOF9QVLYng8IHTm7BAyWqCqSheQ5pYWGhzW00YJr0= -golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= -golang.org/x/sync v0.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE= -golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= +golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= -golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/tools v0.15.0 h1:zdAyfUGbYmuVokhzVmghFl2ZJh5QhcfebBgmVPFYA+8= -golang.org/x/tools v0.15.0/go.mod h1:hpksKq4dtpQWS1uQ61JkdqWM3LscIS6Slf+VVkm+wQk= +golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= +golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= rsc.io/tmplfunc v0.0.3 h1:53XFQh69AfOa8Tw0Jm7t+GV7KZhOi6jzsCzTtKbMvzU= From 2430a68c753a5a5c08b0a615f942a4fd0346bcb9 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Mon, 10 Jun 2024 19:28:25 +0200 Subject: [PATCH 284/387] go.mod: upgrade hiveproxy --- go.mod | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go.mod b/go.mod index 508dbc5941..98d02749dd 100644 --- a/go.mod +++ b/go.mod @@ -7,7 +7,7 @@ toolchain go1.22.1 require ( github.com/davecgh/go-spew v1.1.1 github.com/ethereum/go-ethereum v1.14.5 - github.com/ethereum/hive/hiveproxy v0.0.0-20230919105823-37cbbe1ef86d + github.com/ethereum/hive/hiveproxy v0.0.0-20240610172618-786a798a0cfe github.com/evanw/esbuild v0.18.11 github.com/fsouza/go-dockerclient v1.11.0 github.com/golang-jwt/jwt/v4 v4.5.0 From b4281b154bf7a28ceac5648628f96c17efddaeae Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Mon, 10 Jun 2024 20:00:49 +0200 Subject: [PATCH 285/387] simulators/devp2p: upgrade hivesim --- simulators/devp2p/go.mod | 22 ++++++------- simulators/devp2p/go.sum | 69 ++++++++++++++++++++++++---------------- 2 files changed, 52 insertions(+), 39 deletions(-) diff --git a/simulators/devp2p/go.mod b/simulators/devp2p/go.mod index d4a3e1d6d8..c3470cbefc 100644 --- a/simulators/devp2p/go.mod +++ b/simulators/devp2p/go.mod @@ -5,34 +5,32 @@ go 1.21 toolchain go1.22.1 require ( - github.com/ethereum/hive v0.0.0-20240319152821-ae224371b4e5 + github.com/ethereum/hive v0.0.0-20240610172825-2430a68c753a github.com/shogo82148/go-tap v0.0.3 ) require ( - github.com/Microsoft/go-winio v0.6.1 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect - github.com/deckarep/golang-set/v2 v2.1.0 // indirect + github.com/deckarep/golang-set/v2 v2.6.0 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 // indirect - github.com/ethereum/go-ethereum v1.13.5-0.20231031113925-bc42e88415d3 // indirect - github.com/go-ole/go-ole v1.2.6 // indirect + github.com/ethereum/go-ethereum v1.14.5 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect github.com/go-stack/stack v1.8.1 // indirect github.com/golang-jwt/jwt/v4 v4.5.0 // indirect github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect github.com/gorilla/websocket v1.5.0 // indirect - github.com/holiman/uint256 v1.2.3 // indirect + github.com/holiman/uint256 v1.2.4 // indirect github.com/lithammer/dedent v1.1.0 // indirect github.com/mattn/go-colorable v0.1.13 // indirect - github.com/mattn/go-isatty v0.0.17 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect github.com/shirou/gopsutil v3.21.11+incompatible // indirect github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a // indirect github.com/tklauser/go-sysconf v0.3.12 // indirect github.com/tklauser/numcpus v0.6.1 // indirect github.com/yusufpapurcu/wmi v1.2.2 // indirect - golang.org/x/crypto v0.21.0 // indirect - golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect - golang.org/x/mod v0.12.0 // indirect - golang.org/x/sys v0.18.0 // indirect - golang.org/x/tools v0.13.0 // indirect + golang.org/x/crypto v0.22.0 // indirect + golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa // indirect + golang.org/x/sys v0.20.0 // indirect gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1 // indirect ) diff --git a/simulators/devp2p/go.sum b/simulators/devp2p/go.sum index 0e500034d5..89c7d63b0a 100644 --- a/simulators/devp2p/go.sum +++ b/simulators/devp2p/go.sum @@ -1,5 +1,7 @@ -github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= -github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/bits-and-blooms/bitset v1.10.0 h1:ePXTeiPEazB5+opbv5fr8umg2R/1NlzgDsyepwsSr88= +github.com/bits-and-blooms/bitset v1.10.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U= github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= @@ -7,26 +9,35 @@ github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtyd github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/consensys/bavard v0.1.13 h1:oLhMLOFGTLdlda/kma4VOJazblc7IM5y5QPd2A/YjhQ= +github.com/consensys/bavard v0.1.13/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI= +github.com/consensys/gnark-crypto v0.12.1 h1:lHH39WuuFgVHONRl3J0LRBtuYdQTumFSDtJF7HpyG8M= +github.com/consensys/gnark-crypto v0.12.1/go.mod h1:v2Gy7L/4ZRosZ7Ivs+9SfUDr0f5UlG+EM5t7MPHiLuY= +github.com/crate-crypto/go-kzg-4844 v1.0.0 h1:TsSgHwrkTKecKJ4kadtHi4b3xHW5dCFUDFnUp1TsawI= +github.com/crate-crypto/go-kzg-4844 v1.0.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/deckarep/golang-set/v2 v2.1.0 h1:g47V4Or+DUdzbs8FxCCmgb6VYd+ptPAngjM6dtGktsI= -github.com/deckarep/golang-set/v2 v2.1.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= +github.com/deckarep/golang-set/v2 v2.6.0 h1:XfcQbWM1LlMB8BsJ8N9vW5ehnnPVIw0je80NsVHagjM= +github.com/deckarep/golang-set/v2 v2.6.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0= github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 h1:HbphB4TFFXpv7MNrT52FGrrgVXF1owhMVTHFZIlnvd4= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0/go.mod h1:DZGJHZMqrU4JJqFAWUS2UO1+lbSKsdiOoYi9Zzey7Fc= -github.com/ethereum/go-ethereum v1.13.5-0.20231031113925-bc42e88415d3 h1:i4TE0DmzMYcr2IiCdlTGGk+7Q/EzXvBKbbG4uRxMjJ0= -github.com/ethereum/go-ethereum v1.13.5-0.20231031113925-bc42e88415d3/go.mod h1:yMTu38GSuyxaYzQMViqNmQ1s3cE84abZexQmTgenWk0= -github.com/ethereum/hive v0.0.0-20240319152821-ae224371b4e5 h1:2Rc3v1mqWgUl8gSHFh7+FmVcyB1AI/9THxhEDjNK+PI= -github.com/ethereum/hive v0.0.0-20240319152821-ae224371b4e5/go.mod h1:MGwUXPGco6YS3brOf5WEILfUnnUL/XuX1224ab3D7XA= +github.com/ethereum/c-kzg-4844 v1.0.0 h1:0X1LBXxaEtYD9xsyj9B9ctQEZIpnvVDeoBx8aHEwTNA= +github.com/ethereum/c-kzg-4844 v1.0.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= +github.com/ethereum/go-ethereum v1.14.5 h1:szuFzO1MhJmweXjoM5nSAeDvjNUH3vIQoMzzQnfvjpw= +github.com/ethereum/go-ethereum v1.14.5/go.mod h1:VEDGGhSxY7IEjn98hJRFXl/uFvpRgbIIf2PpXiyGGgc= +github.com/ethereum/hive v0.0.0-20240610172825-2430a68c753a h1:iyHHRPXaxHtEvyFxc4A+is/JRt88o0gQhHrNx+khEqQ= +github.com/ethereum/hive v0.0.0-20240610172825-2430a68c753a/go.mod h1:ghNXZW+/WQClcyiwZpbTzUCyxwql7YeMacYd44v+BJE= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= -github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= github.com/go-stack/stack v1.8.1 h1:ntEHSVwIt7PNXNpgPmVfMrNhLtgjlmnZha2kOpuRiDw= github.com/go-stack/stack v1.8.1/go.mod h1:dcoOX6HbPZSZptuspn9bctJ+N/CnF5gGygcUP3XYfe4= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= @@ -53,8 +64,8 @@ github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/holiman/uint256 v1.2.3 h1:K8UWO1HUJpRMXBxbmaY1Y8IAMZC/RsKB+ArEnnK4l5o= -github.com/holiman/uint256 v1.2.3/go.mod h1:SC8Ryt4n+UBbPbIBKaG9zbbDlp4jOru9xFZmPzLUTxw= +github.com/holiman/uint256 v1.2.4 h1:jUc4Nk8fm9jZabQuqr2JzednajVmBpC+oiTiXZJEApU= +github.com/holiman/uint256 v1.2.4/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXeiRV4ng7E= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/lithammer/dedent v1.1.0 h1:VNzHMVCBNG1j0fh3OrsFRkVUwStdDArbgBWoPAffktY= @@ -62,8 +73,10 @@ github.com/lithammer/dedent v1.1.0/go.mod h1:jrXYCQtgg0nJiN+StA2KgR7w6CiQNv9Fd/Z github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng= -github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mmcloughlin/addchain v0.4.0 h1:SobOdjm2xLj1KkXN5/n0xTIWyZA2+s99UCY1iPfkHRY= +github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqkyU72HC5wJ4RlU= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= @@ -89,6 +102,8 @@ github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5 github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/supranational/blst v0.3.11 h1:LyU6FolezeWAhvQk0k6O/d49jqgO52MSDDfYgbeoEm4= +github.com/supranational/blst v0.3.11/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a h1:1ur3QoCqvE5fl+nylMaIr9PVV1w343YRDtsy+Rwu7XI= github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a/go.mod h1:RRCYJbIwD5jmqPI9XoAFR0OcDxqUctll6zUj/+B4S48= github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= @@ -101,13 +116,11 @@ github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQ golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= -golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= -golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g= -golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k= +golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30= +golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M= +golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa h1:FRnLl4eNAQl8hwxVVC17teOw8kdjVDVAiFMtgUdTSRQ= +golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa/go.mod h1:zk2irFbV9DP96SEBUUAy67IdHUaZuSnrz1n472HUCLE= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc= -golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -116,13 +129,13 @@ golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwY golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4= -golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= +golang.org/x/net v0.24.0 h1:1PcaxkF854Fu3+lvBIx5SYn9wRlBzzcnHZSiaFFAb0w= +golang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= -golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= +golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= +golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -141,10 +154,12 @@ golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= -golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= +golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -156,8 +171,6 @@ golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.13.0 h1:Iey4qkscZuv0VvIt8E0neZjtPVQFSc870HQ448QgEmQ= -golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -184,3 +197,5 @@ gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +rsc.io/tmplfunc v0.0.3 h1:53XFQh69AfOa8Tw0Jm7t+GV7KZhOi6jzsCzTtKbMvzU= +rsc.io/tmplfunc v0.0.3/go.mod h1:AG3sTPzElb1Io3Yg4voV9AGZJuleGAwaVRxL9M49PhA= From 6c5c54764acfbedc186ee826bbeaff9a0bbdef87 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Mon, 10 Jun 2024 20:06:58 +0200 Subject: [PATCH 286/387] simulators/ethereum/consensus: upgrade hivesim --- simulators/ethereum/consensus/go.mod | 44 ++-- simulators/ethereum/consensus/go.sum | 327 ++++----------------------- 2 files changed, 71 insertions(+), 300 deletions(-) diff --git a/simulators/ethereum/consensus/go.mod b/simulators/ethereum/consensus/go.mod index 910343a481..116e1dbd80 100644 --- a/simulators/ethereum/consensus/go.mod +++ b/simulators/ethereum/consensus/go.mod @@ -5,47 +5,49 @@ go 1.21 toolchain go1.22.1 require ( - github.com/ethereum/go-ethereum v1.13.5-0.20231031113925-bc42e88415d3 - github.com/ethereum/hive v0.0.0-20240319152821-ae224371b4e5 + github.com/ethereum/go-ethereum v1.14.5 + github.com/ethereum/hive v0.0.0-20240610172825-2430a68c753a ) require ( github.com/DataDog/zstd v1.5.2 // indirect - github.com/Microsoft/go-winio v0.6.1 // indirect - github.com/VictoriaMetrics/fastcache v1.12.1 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect + github.com/VictoriaMetrics/fastcache v1.12.2 // indirect github.com/beorn7/perks v1.0.1 // indirect - github.com/bits-and-blooms/bitset v1.7.0 // indirect + github.com/bits-and-blooms/bitset v1.10.0 // indirect github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect - github.com/cespare/xxhash/v2 v2.2.0 // indirect - github.com/cockroachdb/errors v1.9.1 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/cockroachdb/errors v1.11.1 // indirect github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect - github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593 // indirect - github.com/cockroachdb/redact v1.1.3 // indirect + github.com/cockroachdb/pebble v1.1.0 // indirect + github.com/cockroachdb/redact v1.1.5 // indirect github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect github.com/consensys/bavard v0.1.13 // indirect github.com/consensys/gnark-crypto v0.12.1 // indirect - github.com/crate-crypto/go-kzg-4844 v0.7.0 // indirect - github.com/deckarep/golang-set/v2 v2.1.0 // indirect + github.com/crate-crypto/go-ipa v0.0.0-20240223125850-b1e8a79f509c // indirect + github.com/crate-crypto/go-kzg-4844 v1.0.0 // indirect + github.com/deckarep/golang-set/v2 v2.6.0 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 // indirect - github.com/ethereum/c-kzg-4844 v0.4.0 // indirect + github.com/ethereum/c-kzg-4844 v1.0.0 // indirect + github.com/ethereum/go-verkle v0.1.1-0.20240306133620-7d920df305f0 // indirect github.com/getsentry/sentry-go v0.18.0 // indirect - github.com/go-ole/go-ole v1.2.6 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect github.com/go-stack/stack v1.8.1 // indirect github.com/gofrs/flock v0.8.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang-jwt/jwt/v4 v4.5.0 // indirect - github.com/golang/protobuf v1.5.3 // indirect + github.com/golang/protobuf v1.5.4 // indirect github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect github.com/google/go-cmp v0.6.0 // indirect github.com/gorilla/websocket v1.5.0 // indirect github.com/holiman/bloomfilter/v2 v2.0.3 // indirect - github.com/holiman/uint256 v1.2.3 // indirect + github.com/holiman/uint256 v1.2.4 // indirect github.com/klauspost/compress v1.15.15 // indirect github.com/kr/pretty v0.3.1 // indirect github.com/kr/text v0.2.0 // indirect github.com/lithammer/dedent v1.1.0 // indirect github.com/mattn/go-colorable v0.1.13 // indirect - github.com/mattn/go-isatty v0.0.17 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect github.com/mattn/go-runewidth v0.0.14 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect github.com/mmcloughlin/addchain v0.4.0 // indirect @@ -63,13 +65,11 @@ require ( github.com/tklauser/go-sysconf v0.3.12 // indirect github.com/tklauser/numcpus v0.6.1 // indirect github.com/yusufpapurcu/wmi v1.2.2 // indirect - golang.org/x/crypto v0.21.0 // indirect - golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect - golang.org/x/mod v0.12.0 // indirect - golang.org/x/sync v0.3.0 // indirect - golang.org/x/sys v0.18.0 // indirect + golang.org/x/crypto v0.22.0 // indirect + golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa // indirect + golang.org/x/sync v0.7.0 // indirect + golang.org/x/sys v0.20.0 // indirect golang.org/x/text v0.14.0 // indirect - golang.org/x/tools v0.13.0 // indirect google.golang.org/protobuf v1.33.0 // indirect gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1 // indirect rsc.io/tmplfunc v0.0.3 // indirect diff --git a/simulators/ethereum/consensus/go.sum b/simulators/ethereum/consensus/go.sum index c9579bb4c9..5bcd30a86d 100644 --- a/simulators/ethereum/consensus/go.sum +++ b/simulators/ethereum/consensus/go.sum @@ -1,256 +1,151 @@ -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/CloudyKit/fastprinter v0.0.0-20200109182630-33d98a066a53/go.mod h1:+3IMCy2vIlbG1XG/0ggNQv0SvxCAIpPM5b1nCz56Xno= -github.com/CloudyKit/jet/v3 v3.0.0/go.mod h1:HKQPgSJmdK8hdoAbKUUWajkHyHo4RaU5rMdUywE7VMo= github.com/DataDog/zstd v1.5.2 h1:vUG4lAyuPCXO0TLbXvPv7EB7cNK1QV/luu55UHLrrn8= github.com/DataDog/zstd v1.5.2/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= -github.com/Joker/hpp v1.0.0/go.mod h1:8x5n+M1Hp5hC0g8okX3sR3vFQwynaX/UgSOM9MeBKzY= -github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= -github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= -github.com/Shopify/goreferrer v0.0.0-20181106222321-ec9c9a553398/go.mod h1:a1uqRtAwp2Xwc6WNPJEufxJ7fx3npB4UV/JOLmbu5I0= -github.com/VictoriaMetrics/fastcache v1.12.1 h1:i0mICQuojGDL3KblA7wUNlY5lOK6a4bwt3uRKnkZU40= -github.com/VictoriaMetrics/fastcache v1.12.1/go.mod h1:tX04vaqcNoQeGLD+ra5pU5sWkuxnzWhEzLwhP9w653o= -github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/VictoriaMetrics/fastcache v1.12.2 h1:N0y9ASrJ0F6h0QaC3o6uJb3NIZ9VKLjCM7NQbSmF7WI= +github.com/VictoriaMetrics/fastcache v1.12.2/go.mod h1:AmC+Nzz1+3G2eCPapF6UcsnkThDcMsQicp4xDukwJYI= github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= github.com/allegro/bigcache v1.2.1 h1:hg1sY1raCwic3Vnsvje6TT7/pnZba83LeFck5NrFKSc= github.com/allegro/bigcache v1.2.1/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= -github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= -github.com/aymerick/raymond v2.0.3-0.20180322193309-b565731e1464+incompatible/go.mod h1:osfaiScAUVup+UC9Nfq76eWqDhXlp+4UYaA8uhTBO6g= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bits-and-blooms/bitset v1.7.0 h1:YjAGVd3XmtK9ktAbX8Zg2g2PwLIMjGREZJHlV4j7NEo= -github.com/bits-and-blooms/bitset v1.7.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= +github.com/bits-and-blooms/bitset v1.10.0 h1:ePXTeiPEazB5+opbv5fr8umg2R/1NlzgDsyepwsSr88= +github.com/bits-and-blooms/bitset v1.10.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U= github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cockroachdb/datadriven v1.0.2/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f h1:otljaYPt5hWxV3MUfO5dFPFiOXg9CyG5/kCfayTqsJ4= github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= -github.com/cockroachdb/errors v1.9.1 h1:yFVvsI0VxmRShfawbt/laCIDy/mtTqqnvoNgiy5bEV8= -github.com/cockroachdb/errors v1.9.1/go.mod h1:2sxOtL2WIc096WSZqZ5h8fa17rdDq9HZOZLBCor4mBk= -github.com/cockroachdb/logtags v0.0.0-20211118104740-dabe8e521a4f/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= +github.com/cockroachdb/errors v1.11.1 h1:xSEW75zKaKCWzR3OfxXUxgrk/NtT4G1MiOv5lWZazG8= +github.com/cockroachdb/errors v1.11.1/go.mod h1:8MUxA3Gi6b25tYlFEBGLf+D8aISL+M4MIpiWMSNRfxw= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= -github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593 h1:aPEJyR4rPBvDmeyi+l/FS/VtA00IWvjeFvjen1m1l1A= -github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593/go.mod h1:6hk1eMY/u5t+Cf18q5lFMUA1Rc+Sm5I6Ra1QuPyxXCo= -github.com/cockroachdb/redact v1.1.3 h1:AKZds10rFSIj7qADf0g46UixK8NNLwWTNdCIGS5wfSQ= -github.com/cockroachdb/redact v1.1.3/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= +github.com/cockroachdb/pebble v1.1.0 h1:pcFh8CdCIt2kmEpK0OIatq67Ln9uGDYY3d5XnE0LJG4= +github.com/cockroachdb/pebble v1.1.0/go.mod h1:sEHm5NOXxyiAoKWhoFxT8xMgd/f3RA6qUqQ1BXKrh2E= +github.com/cockroachdb/redact v1.1.5 h1:u1PMllDkdFfPWaNGMyLD1+so+aq3uUItthCFqzwPJ30= +github.com/cockroachdb/redact v1.1.5/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo= github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ= -github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0/go.mod h1:4Zcjuz89kmFXt9morQgcfYZAYZ5n8WHjt81YYWIwtTM= github.com/consensys/bavard v0.1.13 h1:oLhMLOFGTLdlda/kma4VOJazblc7IM5y5QPd2A/YjhQ= github.com/consensys/bavard v0.1.13/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI= github.com/consensys/gnark-crypto v0.12.1 h1:lHH39WuuFgVHONRl3J0LRBtuYdQTumFSDtJF7HpyG8M= github.com/consensys/gnark-crypto v0.12.1/go.mod h1:v2Gy7L/4ZRosZ7Ivs+9SfUDr0f5UlG+EM5t7MPHiLuY= -github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= -github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= -github.com/crate-crypto/go-kzg-4844 v0.7.0 h1:C0vgZRk4q4EZ/JgPfzuSoxdCq3C3mOZMBShovmncxvA= -github.com/crate-crypto/go-kzg-4844 v0.7.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= +github.com/crate-crypto/go-ipa v0.0.0-20240223125850-b1e8a79f509c h1:uQYC5Z1mdLRPrZhHjHxufI8+2UG/i25QG92j0Er9p6I= +github.com/crate-crypto/go-ipa v0.0.0-20240223125850-b1e8a79f509c/go.mod h1:geZJZH3SzKCqnz5VT0q/DyIG/tvu/dZk+VIfXicupJs= +github.com/crate-crypto/go-kzg-4844 v1.0.0 h1:TsSgHwrkTKecKJ4kadtHi4b3xHW5dCFUDFnUp1TsawI= +github.com/crate-crypto/go-kzg-4844 v1.0.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/deckarep/golang-set/v2 v2.1.0 h1:g47V4Or+DUdzbs8FxCCmgb6VYd+ptPAngjM6dtGktsI= -github.com/deckarep/golang-set/v2 v2.1.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= +github.com/deckarep/golang-set/v2 v2.6.0 h1:XfcQbWM1LlMB8BsJ8N9vW5ehnnPVIw0je80NsVHagjM= +github.com/deckarep/golang-set/v2 v2.6.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0= github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 h1:HbphB4TFFXpv7MNrT52FGrrgVXF1owhMVTHFZIlnvd4= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0/go.mod h1:DZGJHZMqrU4JJqFAWUS2UO1+lbSKsdiOoYi9Zzey7Fc= -github.com/dgraph-io/badger v1.6.0/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6psNgSztDR4= -github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385/go.mod h1:0vRUJqYpeSZifjYj7uP3BG/gKcuzL9xWVV/Y+cK33KM= -github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/etcd-io/bbolt v1.3.3/go.mod h1:ZF2nL25h33cCyBtcyWeZ2/I3HQOfTP+0PIEvHjkjCrw= -github.com/ethereum/c-kzg-4844 v0.4.0 h1:3MS1s4JtA868KpJxroZoepdV0ZKBp3u/O5HcZ7R3nlY= -github.com/ethereum/c-kzg-4844 v0.4.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= -github.com/ethereum/go-ethereum v1.13.5-0.20231031113925-bc42e88415d3 h1:i4TE0DmzMYcr2IiCdlTGGk+7Q/EzXvBKbbG4uRxMjJ0= -github.com/ethereum/go-ethereum v1.13.5-0.20231031113925-bc42e88415d3/go.mod h1:yMTu38GSuyxaYzQMViqNmQ1s3cE84abZexQmTgenWk0= -github.com/ethereum/hive v0.0.0-20240319152821-ae224371b4e5 h1:2Rc3v1mqWgUl8gSHFh7+FmVcyB1AI/9THxhEDjNK+PI= -github.com/ethereum/hive v0.0.0-20240319152821-ae224371b4e5/go.mod h1:MGwUXPGco6YS3brOf5WEILfUnnUL/XuX1224ab3D7XA= -github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072/go.mod h1:duJ4Jxv5lDcvg4QuQr0oowTf7dz4/CR8NtyCooz9HL8= -github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= +github.com/ethereum/c-kzg-4844 v1.0.0 h1:0X1LBXxaEtYD9xsyj9B9ctQEZIpnvVDeoBx8aHEwTNA= +github.com/ethereum/c-kzg-4844 v1.0.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= +github.com/ethereum/go-ethereum v1.14.5 h1:szuFzO1MhJmweXjoM5nSAeDvjNUH3vIQoMzzQnfvjpw= +github.com/ethereum/go-ethereum v1.14.5/go.mod h1:VEDGGhSxY7IEjn98hJRFXl/uFvpRgbIIf2PpXiyGGgc= +github.com/ethereum/go-verkle v0.1.1-0.20240306133620-7d920df305f0 h1:KrE8I4reeVvf7C1tm8elRjj4BdscTYzz/WAbYyf/JI4= +github.com/ethereum/go-verkle v0.1.1-0.20240306133620-7d920df305f0/go.mod h1:D9AJLVXSyZQXJQVk8oh1EwjISE+sJTn2duYIZC0dy3w= +github.com/ethereum/hive v0.0.0-20240610172825-2430a68c753a h1:iyHHRPXaxHtEvyFxc4A+is/JRt88o0gQhHrNx+khEqQ= +github.com/ethereum/hive v0.0.0-20240610172825-2430a68c753a/go.mod h1:ghNXZW+/WQClcyiwZpbTzUCyxwql7YeMacYd44v+BJE= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= -github.com/gavv/httpexpect v2.0.0+incompatible/go.mod h1:x+9tiU1YnrOvnB725RkpoLv1M62hOWzwo5OXotisrKc= -github.com/getsentry/sentry-go v0.12.0/go.mod h1:NSap0JBYWzHND8oMbyi0+XZhUalc1TBdRL1M71JZW2c= github.com/getsentry/sentry-go v0.18.0 h1:MtBW5H9QgdcJabtZcuJG80BMOwaBpkRDZkxRkNC1sN0= github.com/getsentry/sentry-go v0.18.0/go.mod h1:Kgon4Mby+FJ7ZWHFUAZgVaIa8sxHtnRJRLTXZr51aKQ= -github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3/go.mod h1:VJ0WA2NBN22VlZ2dKZQPAPnyWw5XTlK1KymzLKsr59s= -github.com/gin-gonic/gin v1.4.0/go.mod h1:OW2EZn3DO8Ln9oIKOvM++LBO+5UPHJJDH72/q/3rZdM= -github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= -github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= -github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab/go.mod h1:/P9AEU963A2AYjv4d1V5eVL1CQbEJq6aCNHDDjibzu8= -github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= github.com/go-stack/stack v1.8.1 h1:ntEHSVwIt7PNXNpgPmVfMrNhLtgjlmnZha2kOpuRiDw= github.com/go-stack/stack v1.8.1/go.mod h1:dcoOX6HbPZSZptuspn9bctJ+N/CnF5gGygcUP3XYfe4= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= -github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= -github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= -github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= -github.com/gogo/googleapis v0.0.0-20180223154316-0cd9801be74a/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= -github.com/gogo/googleapis v1.4.1/go.mod h1:2lpHqI5OcWCtVElxXnPt+s8oJvMpySlOyM6xDCrzib4= -github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/gogo/status v1.1.0/go.mod h1:BFv9nrluPLmrS0EmGVvLaPNmRosr9KapBYd5/hpY1WM= -github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= -github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXiurYmW7fx4GZkL8feAMVq7nEjURHk= github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/gomodule/redigo v1.7.1-0.20190724094224-574c33c3df38/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= -github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao= github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA= -github.com/holiman/uint256 v1.2.3 h1:K8UWO1HUJpRMXBxbmaY1Y8IAMZC/RsKB+ArEnnK4l5o= -github.com/holiman/uint256 v1.2.3/go.mod h1:SC8Ryt4n+UBbPbIBKaG9zbbDlp4jOru9xFZmPzLUTxw= +github.com/holiman/uint256 v1.2.4 h1:jUc4Nk8fm9jZabQuqr2JzednajVmBpC+oiTiXZJEApU= +github.com/holiman/uint256 v1.2.4/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXeiRV4ng7E= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/hydrogen18/memlistener v0.0.0-20200120041712-dcc25e7acd91/go.mod h1:qEIFzExnS6016fRpRfxrExeVn2gbClQA99gQhnIcdhE= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/imkira/go-interpol v1.1.0/go.mod h1:z0h2/2T3XF8kyEPpRgJ3kmNv+C43p+I/CoI+jC3w2iA= -github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/iris-contrib/blackfriday v2.0.0+incompatible/go.mod h1:UzZ2bDEoaSGPbkg6SAB4att1aAwTmVIx/5gCVqeyUdI= -github.com/iris-contrib/go.uuid v2.0.0+incompatible/go.mod h1:iz2lgM/1UnEf1kP0L/+fafWORmlnuysV2EMP8MW+qe0= -github.com/iris-contrib/jade v1.1.3/go.mod h1:H/geBymxJhShH5kecoiOCSssPX7QWYH7UaeZTSWddIk= -github.com/iris-contrib/pongo2 v0.0.1/go.mod h1:Ssh+00+3GAZqSQb30AvBRNxBx7rf0GqwkjqxNd0u65g= -github.com/iris-contrib/schema v0.0.1/go.mod h1:urYA3uvUNG1TIIjOSCzHr9/LmbQo8LrOcOqfqxa4hXw= -github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= -github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88/go.mod h1:3w7q1U84EfirKl04SVQ/s7nPm1ZPhiXd34z40TNz36k= -github.com/kataras/golog v0.0.10/go.mod h1:yJ8YKCmyL+nWjERB90Qwn+bdyBZsaQwU3bTVFgkFIp8= -github.com/kataras/iris/v12 v12.1.8/go.mod h1:LMYy4VlP67TQ3Zgriz8RE2h2kMZV2SgMYbq3UhfoFmE= -github.com/kataras/neffos v0.0.14/go.mod h1:8lqADm8PnbeFfL7CLXh1WHw53dG27MC3pgi2R1rmoTE= -github.com/kataras/pio v0.0.2/go.mod h1:hAoW0t9UmXi4R5Oyq5Z4irTbaTsOemSrDGUtaTl7Dro= -github.com/kataras/sitemap v0.0.5/go.mod h1:KY2eugMKiPwsJgx7+U103YZehfvNGOXURubcGyk0Bz8= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.8.2/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= -github.com/klauspost/compress v1.9.7/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= github.com/klauspost/compress v1.15.15 h1:EF27CXIuDsYJ6mmvtBRlEuB2UVOqHG1tAXgZ7yIO+lw= github.com/klauspost/compress v1.15.15/go.mod h1:ZcK2JAFqKOpnBlxcLsJzYfrS9X1akm9fHZNnD9+Vo/4= -github.com/klauspost/cpuid v1.2.1/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/labstack/echo/v4 v4.5.0/go.mod h1:czIriw4a0C1dFun+ObrXp7ok03xON0N1awStJ6ArI7Y= -github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c= github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= github.com/lithammer/dedent v1.1.0 h1:VNzHMVCBNG1j0fh3OrsFRkVUwStdDArbgBWoPAffktY= github.com/lithammer/dedent v1.1.0/go.mod h1:jrXYCQtgg0nJiN+StA2KgR7w6CiQNv9Fd/Z9BP0jIOc= -github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.11/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= -github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= -github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng= -github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.14 h1:+xnbZSEeDbOIg5/mE6JF0w6n9duR1l3/WmbinWVwUuU= github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= -github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw= github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= -github.com/mediocregopher/radix/v3 v3.4.2/go.mod h1:8FL3F6UQRXHXIBSPUs5h0RybMF8i4n7wVopoX3x7Bv8= -github.com/microcosm-cc/bluemonday v1.0.2/go.mod h1:iVP4YcDBq+n/5fb23BhYFvIMq/leAFZyRl6bYmGDlGc= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mmcloughlin/addchain v0.4.0 h1:SobOdjm2xLj1KkXN5/n0xTIWyZA2+s99UCY1iPfkHRY= github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqkyU72HC5wJ4RlU= github.com/mmcloughlin/profile v0.1.1/go.mod h1:IhHD7q1ooxgwTgjxQYkACGA77oFTDdFVejUS1/tS/qU= -github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/moul/http2curl v1.0.0/go.mod h1:8UbvGypXm98wA/IqH45anm5Y2Z6ep6O31QGOAZ3H0fQ= -github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= -github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= -github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= -github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= @@ -261,18 +156,15 @@ github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1y github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= github.com/onsi/gomega v1.19.0 h1:4ieX6qQjPP/BfC3mpsAtIGGlxTWPeA3Inl/7DtXw1tw= github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= -github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_golang v1.14.0 h1:nJdhIvne2eSX/XRAFV9PcvFFRbrjbcTUj0VP62TMhnw= github.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4= github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= github.com/prometheus/common v0.39.0 h1:oOyhkDq05hPZKItWVBkJ6g6AtGxi+fy7F4JvUV8uhsI= @@ -282,31 +174,13 @@ github.com/prometheus/procfs v0.9.0/go.mod h1:+pB4zwohETzFnmlpe6yd2lSc+0/46IYZRB github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.3 h1:utMvzDsuh3suAEnhH0RdHmoPbU648o6CvXxTx4SBMOw= github.com/rivo/uniseg v0.4.3/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= -github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= -github.com/rogpeppe/go-internal v1.8.1/go.mod h1:JeRgkft04UBgHMgCIwADu4Pn6Mtm5d4nPKWu0nJ5d+o= github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= -github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= -github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/schollz/closestmatch v2.1.0+incompatible/go.mod h1:RtP1ddjLong6gTkbtmuhtR2uUrrJOpYzYRvbcPAid+g= -github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI= github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= -github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= -github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= -github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= @@ -318,194 +192,96 @@ github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFA github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= -github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= -github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= -github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= -github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= -github.com/urfave/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4= -github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= -github.com/valyala/fasthttp v1.6.0/go.mod h1:FstJa9V+Pj9vQ7OJie2qMHdwemEDaDiSdBnvPM1Su9w= -github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= -github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= -github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio= -github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= -github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= -github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= -github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= -github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0/go.mod h1:/LWChgwKmvncFJFHJ7Gvn9wZArjbV5/FppcK2fKk/tI= -github.com/yudai/gojsondiff v1.0.0/go.mod h1:AY32+k2cwILAkW1fbgxQ5mUmMiZFgLIV+FBNExI05xg= -github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82/go.mod h1:lgjkn3NuSvDfVJdfcVVdX+jpBxNmX4rDAzaS45IcYoM= -github.com/yudai/pp v2.0.1+incompatible/go.mod h1:PuxR/8QJ7cyCkFp/aUDS+JY727OFEZkTdatxwunjIkc= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yusufpapurcu/wmi v1.2.2 h1:KBNDSne4vP5mbSWnJbO+51IMOXJB67QiYCSBrubbPRg= github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= -golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191227163750-53104e6ec876/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= -golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g= -golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30= +golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M= +golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa h1:FRnLl4eNAQl8hwxVVC17teOw8kdjVDVAiFMtgUdTSRQ= +golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa/go.mod h1:zk2irFbV9DP96SEBUUAy67IdHUaZuSnrz1n472HUCLE= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc= -golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190327091125-710a502c58a2/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= -golang.org/x/net v0.0.0-20211008194852-3b03d305991f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4= -golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/net v0.24.0 h1:1PcaxkF854Fu3+lvBIx5SYn9wRlBzzcnHZSiaFFAb0w= +golang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= -golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= +golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= -golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= +golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181221001348-537d06c36207/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190327201419-c70d86f8b7cf/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.13.0 h1:Iey4qkscZuv0VvIt8E0neZjtPVQFSc870HQ448QgEmQ= -golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/genproto v0.0.0-20180518175338-11a468237815/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= -google.golang.org/grpc v1.12.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= -gopkg.in/go-playground/validator.v8 v8.18.2/go.mod h1:RX2a/7Ha8BgOhfk7j780h4/u/RRjR0eouCJSH80/M2Y= gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1 h1:iiHuQZCNgYPmFQxd3BBN/Nc5+dAwzZuq5y40s20oQw0= gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= -gopkg.in/ini.v1 v1.51.1/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= @@ -513,12 +289,7 @@ gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= -gopkg.in/yaml.v3 v3.0.0-20191120175047-4206685974f2/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= rsc.io/tmplfunc v0.0.3 h1:53XFQh69AfOa8Tw0Jm7t+GV7KZhOi6jzsCzTtKbMvzU= rsc.io/tmplfunc v0.0.3/go.mod h1:AG3sTPzElb1Io3Yg4voV9AGZJuleGAwaVRxL9M49PhA= From 4533b079ea50cf8a0f9d373d84a33dc712d77f8a Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Mon, 10 Jun 2024 20:07:20 +0200 Subject: [PATCH 287/387] simulators/smoke: upgrade hivesim --- simulators/smoke/clique/go.mod | 22 +++++------ simulators/smoke/clique/go.sum | 69 ++++++++++++++++++++------------- simulators/smoke/genesis/go.mod | 22 +++++------ simulators/smoke/genesis/go.sum | 69 ++++++++++++++++++++------------- simulators/smoke/network/go.mod | 22 +++++------ simulators/smoke/network/go.sum | 69 ++++++++++++++++++++------------- 6 files changed, 156 insertions(+), 117 deletions(-) diff --git a/simulators/smoke/clique/go.mod b/simulators/smoke/clique/go.mod index e46f5ff291..1219996f73 100644 --- a/simulators/smoke/clique/go.mod +++ b/simulators/smoke/clique/go.mod @@ -4,32 +4,30 @@ go 1.21 toolchain go1.22.1 -require github.com/ethereum/hive v0.0.0-20240319152821-ae224371b4e5 +require github.com/ethereum/hive v0.0.0-20240610172825-2430a68c753a require ( - github.com/Microsoft/go-winio v0.6.1 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect - github.com/deckarep/golang-set/v2 v2.1.0 // indirect + github.com/deckarep/golang-set/v2 v2.6.0 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 // indirect - github.com/ethereum/go-ethereum v1.13.5-0.20231031113925-bc42e88415d3 // indirect - github.com/go-ole/go-ole v1.2.6 // indirect + github.com/ethereum/go-ethereum v1.14.5 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect github.com/go-stack/stack v1.8.1 // indirect github.com/golang-jwt/jwt/v4 v4.5.0 // indirect github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect github.com/gorilla/websocket v1.5.0 // indirect - github.com/holiman/uint256 v1.2.3 // indirect + github.com/holiman/uint256 v1.2.4 // indirect github.com/lithammer/dedent v1.1.0 // indirect github.com/mattn/go-colorable v0.1.13 // indirect - github.com/mattn/go-isatty v0.0.17 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect github.com/shirou/gopsutil v3.21.11+incompatible // indirect github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a // indirect github.com/tklauser/go-sysconf v0.3.12 // indirect github.com/tklauser/numcpus v0.6.1 // indirect github.com/yusufpapurcu/wmi v1.2.2 // indirect - golang.org/x/crypto v0.21.0 // indirect - golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect - golang.org/x/mod v0.12.0 // indirect - golang.org/x/sys v0.18.0 // indirect - golang.org/x/tools v0.13.0 // indirect + golang.org/x/crypto v0.22.0 // indirect + golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa // indirect + golang.org/x/sys v0.20.0 // indirect gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1 // indirect ) diff --git a/simulators/smoke/clique/go.sum b/simulators/smoke/clique/go.sum index 4fff58f235..b23d4fbb71 100644 --- a/simulators/smoke/clique/go.sum +++ b/simulators/smoke/clique/go.sum @@ -1,5 +1,7 @@ -github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= -github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/bits-and-blooms/bitset v1.10.0 h1:ePXTeiPEazB5+opbv5fr8umg2R/1NlzgDsyepwsSr88= +github.com/bits-and-blooms/bitset v1.10.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U= github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= @@ -7,26 +9,35 @@ github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtyd github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/consensys/bavard v0.1.13 h1:oLhMLOFGTLdlda/kma4VOJazblc7IM5y5QPd2A/YjhQ= +github.com/consensys/bavard v0.1.13/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI= +github.com/consensys/gnark-crypto v0.12.1 h1:lHH39WuuFgVHONRl3J0LRBtuYdQTumFSDtJF7HpyG8M= +github.com/consensys/gnark-crypto v0.12.1/go.mod h1:v2Gy7L/4ZRosZ7Ivs+9SfUDr0f5UlG+EM5t7MPHiLuY= +github.com/crate-crypto/go-kzg-4844 v1.0.0 h1:TsSgHwrkTKecKJ4kadtHi4b3xHW5dCFUDFnUp1TsawI= +github.com/crate-crypto/go-kzg-4844 v1.0.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/deckarep/golang-set/v2 v2.1.0 h1:g47V4Or+DUdzbs8FxCCmgb6VYd+ptPAngjM6dtGktsI= -github.com/deckarep/golang-set/v2 v2.1.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= +github.com/deckarep/golang-set/v2 v2.6.0 h1:XfcQbWM1LlMB8BsJ8N9vW5ehnnPVIw0je80NsVHagjM= +github.com/deckarep/golang-set/v2 v2.6.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0= github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 h1:HbphB4TFFXpv7MNrT52FGrrgVXF1owhMVTHFZIlnvd4= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0/go.mod h1:DZGJHZMqrU4JJqFAWUS2UO1+lbSKsdiOoYi9Zzey7Fc= -github.com/ethereum/go-ethereum v1.13.5-0.20231031113925-bc42e88415d3 h1:i4TE0DmzMYcr2IiCdlTGGk+7Q/EzXvBKbbG4uRxMjJ0= -github.com/ethereum/go-ethereum v1.13.5-0.20231031113925-bc42e88415d3/go.mod h1:yMTu38GSuyxaYzQMViqNmQ1s3cE84abZexQmTgenWk0= -github.com/ethereum/hive v0.0.0-20240319152821-ae224371b4e5 h1:2Rc3v1mqWgUl8gSHFh7+FmVcyB1AI/9THxhEDjNK+PI= -github.com/ethereum/hive v0.0.0-20240319152821-ae224371b4e5/go.mod h1:MGwUXPGco6YS3brOf5WEILfUnnUL/XuX1224ab3D7XA= +github.com/ethereum/c-kzg-4844 v1.0.0 h1:0X1LBXxaEtYD9xsyj9B9ctQEZIpnvVDeoBx8aHEwTNA= +github.com/ethereum/c-kzg-4844 v1.0.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= +github.com/ethereum/go-ethereum v1.14.5 h1:szuFzO1MhJmweXjoM5nSAeDvjNUH3vIQoMzzQnfvjpw= +github.com/ethereum/go-ethereum v1.14.5/go.mod h1:VEDGGhSxY7IEjn98hJRFXl/uFvpRgbIIf2PpXiyGGgc= +github.com/ethereum/hive v0.0.0-20240610172825-2430a68c753a h1:iyHHRPXaxHtEvyFxc4A+is/JRt88o0gQhHrNx+khEqQ= +github.com/ethereum/hive v0.0.0-20240610172825-2430a68c753a/go.mod h1:ghNXZW+/WQClcyiwZpbTzUCyxwql7YeMacYd44v+BJE= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= -github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= github.com/go-stack/stack v1.8.1 h1:ntEHSVwIt7PNXNpgPmVfMrNhLtgjlmnZha2kOpuRiDw= github.com/go-stack/stack v1.8.1/go.mod h1:dcoOX6HbPZSZptuspn9bctJ+N/CnF5gGygcUP3XYfe4= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= @@ -53,8 +64,8 @@ github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/holiman/uint256 v1.2.3 h1:K8UWO1HUJpRMXBxbmaY1Y8IAMZC/RsKB+ArEnnK4l5o= -github.com/holiman/uint256 v1.2.3/go.mod h1:SC8Ryt4n+UBbPbIBKaG9zbbDlp4jOru9xFZmPzLUTxw= +github.com/holiman/uint256 v1.2.4 h1:jUc4Nk8fm9jZabQuqr2JzednajVmBpC+oiTiXZJEApU= +github.com/holiman/uint256 v1.2.4/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXeiRV4ng7E= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/lithammer/dedent v1.1.0 h1:VNzHMVCBNG1j0fh3OrsFRkVUwStdDArbgBWoPAffktY= @@ -62,8 +73,10 @@ github.com/lithammer/dedent v1.1.0/go.mod h1:jrXYCQtgg0nJiN+StA2KgR7w6CiQNv9Fd/Z github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng= -github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mmcloughlin/addchain v0.4.0 h1:SobOdjm2xLj1KkXN5/n0xTIWyZA2+s99UCY1iPfkHRY= +github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqkyU72HC5wJ4RlU= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= @@ -87,6 +100,8 @@ github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5 github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/supranational/blst v0.3.11 h1:LyU6FolezeWAhvQk0k6O/d49jqgO52MSDDfYgbeoEm4= +github.com/supranational/blst v0.3.11/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a h1:1ur3QoCqvE5fl+nylMaIr9PVV1w343YRDtsy+Rwu7XI= github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a/go.mod h1:RRCYJbIwD5jmqPI9XoAFR0OcDxqUctll6zUj/+B4S48= github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= @@ -99,13 +114,11 @@ github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQ golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= -golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= -golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g= -golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k= +golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30= +golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M= +golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa h1:FRnLl4eNAQl8hwxVVC17teOw8kdjVDVAiFMtgUdTSRQ= +golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa/go.mod h1:zk2irFbV9DP96SEBUUAy67IdHUaZuSnrz1n472HUCLE= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc= -golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -114,13 +127,13 @@ golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwY golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4= -golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= +golang.org/x/net v0.24.0 h1:1PcaxkF854Fu3+lvBIx5SYn9wRlBzzcnHZSiaFFAb0w= +golang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= -golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= +golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= +golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -139,10 +152,12 @@ golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= -golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= +golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -154,8 +169,6 @@ golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.13.0 h1:Iey4qkscZuv0VvIt8E0neZjtPVQFSc870HQ448QgEmQ= -golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -182,3 +195,5 @@ gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +rsc.io/tmplfunc v0.0.3 h1:53XFQh69AfOa8Tw0Jm7t+GV7KZhOi6jzsCzTtKbMvzU= +rsc.io/tmplfunc v0.0.3/go.mod h1:AG3sTPzElb1Io3Yg4voV9AGZJuleGAwaVRxL9M49PhA= diff --git a/simulators/smoke/genesis/go.mod b/simulators/smoke/genesis/go.mod index e81ab43038..3964a38e66 100644 --- a/simulators/smoke/genesis/go.mod +++ b/simulators/smoke/genesis/go.mod @@ -4,32 +4,30 @@ go 1.21 toolchain go1.22.1 -require github.com/ethereum/hive v0.0.0-20240319152821-ae224371b4e5 +require github.com/ethereum/hive v0.0.0-20240610172825-2430a68c753a require ( - github.com/Microsoft/go-winio v0.6.1 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect - github.com/deckarep/golang-set/v2 v2.1.0 // indirect + github.com/deckarep/golang-set/v2 v2.6.0 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 // indirect - github.com/ethereum/go-ethereum v1.13.5-0.20231031113925-bc42e88415d3 // indirect - github.com/go-ole/go-ole v1.2.6 // indirect + github.com/ethereum/go-ethereum v1.14.5 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect github.com/go-stack/stack v1.8.1 // indirect github.com/golang-jwt/jwt/v4 v4.5.0 // indirect github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect github.com/gorilla/websocket v1.5.0 // indirect - github.com/holiman/uint256 v1.2.3 // indirect + github.com/holiman/uint256 v1.2.4 // indirect github.com/lithammer/dedent v1.1.0 // indirect github.com/mattn/go-colorable v0.1.13 // indirect - github.com/mattn/go-isatty v0.0.17 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect github.com/shirou/gopsutil v3.21.11+incompatible // indirect github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a // indirect github.com/tklauser/go-sysconf v0.3.12 // indirect github.com/tklauser/numcpus v0.6.1 // indirect github.com/yusufpapurcu/wmi v1.2.2 // indirect - golang.org/x/crypto v0.21.0 // indirect - golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect - golang.org/x/mod v0.12.0 // indirect - golang.org/x/sys v0.18.0 // indirect - golang.org/x/tools v0.13.0 // indirect + golang.org/x/crypto v0.22.0 // indirect + golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa // indirect + golang.org/x/sys v0.20.0 // indirect gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1 // indirect ) diff --git a/simulators/smoke/genesis/go.sum b/simulators/smoke/genesis/go.sum index 4fff58f235..b23d4fbb71 100644 --- a/simulators/smoke/genesis/go.sum +++ b/simulators/smoke/genesis/go.sum @@ -1,5 +1,7 @@ -github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= -github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/bits-and-blooms/bitset v1.10.0 h1:ePXTeiPEazB5+opbv5fr8umg2R/1NlzgDsyepwsSr88= +github.com/bits-and-blooms/bitset v1.10.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U= github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= @@ -7,26 +9,35 @@ github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtyd github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/consensys/bavard v0.1.13 h1:oLhMLOFGTLdlda/kma4VOJazblc7IM5y5QPd2A/YjhQ= +github.com/consensys/bavard v0.1.13/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI= +github.com/consensys/gnark-crypto v0.12.1 h1:lHH39WuuFgVHONRl3J0LRBtuYdQTumFSDtJF7HpyG8M= +github.com/consensys/gnark-crypto v0.12.1/go.mod h1:v2Gy7L/4ZRosZ7Ivs+9SfUDr0f5UlG+EM5t7MPHiLuY= +github.com/crate-crypto/go-kzg-4844 v1.0.0 h1:TsSgHwrkTKecKJ4kadtHi4b3xHW5dCFUDFnUp1TsawI= +github.com/crate-crypto/go-kzg-4844 v1.0.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/deckarep/golang-set/v2 v2.1.0 h1:g47V4Or+DUdzbs8FxCCmgb6VYd+ptPAngjM6dtGktsI= -github.com/deckarep/golang-set/v2 v2.1.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= +github.com/deckarep/golang-set/v2 v2.6.0 h1:XfcQbWM1LlMB8BsJ8N9vW5ehnnPVIw0je80NsVHagjM= +github.com/deckarep/golang-set/v2 v2.6.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0= github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 h1:HbphB4TFFXpv7MNrT52FGrrgVXF1owhMVTHFZIlnvd4= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0/go.mod h1:DZGJHZMqrU4JJqFAWUS2UO1+lbSKsdiOoYi9Zzey7Fc= -github.com/ethereum/go-ethereum v1.13.5-0.20231031113925-bc42e88415d3 h1:i4TE0DmzMYcr2IiCdlTGGk+7Q/EzXvBKbbG4uRxMjJ0= -github.com/ethereum/go-ethereum v1.13.5-0.20231031113925-bc42e88415d3/go.mod h1:yMTu38GSuyxaYzQMViqNmQ1s3cE84abZexQmTgenWk0= -github.com/ethereum/hive v0.0.0-20240319152821-ae224371b4e5 h1:2Rc3v1mqWgUl8gSHFh7+FmVcyB1AI/9THxhEDjNK+PI= -github.com/ethereum/hive v0.0.0-20240319152821-ae224371b4e5/go.mod h1:MGwUXPGco6YS3brOf5WEILfUnnUL/XuX1224ab3D7XA= +github.com/ethereum/c-kzg-4844 v1.0.0 h1:0X1LBXxaEtYD9xsyj9B9ctQEZIpnvVDeoBx8aHEwTNA= +github.com/ethereum/c-kzg-4844 v1.0.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= +github.com/ethereum/go-ethereum v1.14.5 h1:szuFzO1MhJmweXjoM5nSAeDvjNUH3vIQoMzzQnfvjpw= +github.com/ethereum/go-ethereum v1.14.5/go.mod h1:VEDGGhSxY7IEjn98hJRFXl/uFvpRgbIIf2PpXiyGGgc= +github.com/ethereum/hive v0.0.0-20240610172825-2430a68c753a h1:iyHHRPXaxHtEvyFxc4A+is/JRt88o0gQhHrNx+khEqQ= +github.com/ethereum/hive v0.0.0-20240610172825-2430a68c753a/go.mod h1:ghNXZW+/WQClcyiwZpbTzUCyxwql7YeMacYd44v+BJE= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= -github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= github.com/go-stack/stack v1.8.1 h1:ntEHSVwIt7PNXNpgPmVfMrNhLtgjlmnZha2kOpuRiDw= github.com/go-stack/stack v1.8.1/go.mod h1:dcoOX6HbPZSZptuspn9bctJ+N/CnF5gGygcUP3XYfe4= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= @@ -53,8 +64,8 @@ github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/holiman/uint256 v1.2.3 h1:K8UWO1HUJpRMXBxbmaY1Y8IAMZC/RsKB+ArEnnK4l5o= -github.com/holiman/uint256 v1.2.3/go.mod h1:SC8Ryt4n+UBbPbIBKaG9zbbDlp4jOru9xFZmPzLUTxw= +github.com/holiman/uint256 v1.2.4 h1:jUc4Nk8fm9jZabQuqr2JzednajVmBpC+oiTiXZJEApU= +github.com/holiman/uint256 v1.2.4/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXeiRV4ng7E= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/lithammer/dedent v1.1.0 h1:VNzHMVCBNG1j0fh3OrsFRkVUwStdDArbgBWoPAffktY= @@ -62,8 +73,10 @@ github.com/lithammer/dedent v1.1.0/go.mod h1:jrXYCQtgg0nJiN+StA2KgR7w6CiQNv9Fd/Z github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng= -github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mmcloughlin/addchain v0.4.0 h1:SobOdjm2xLj1KkXN5/n0xTIWyZA2+s99UCY1iPfkHRY= +github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqkyU72HC5wJ4RlU= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= @@ -87,6 +100,8 @@ github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5 github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/supranational/blst v0.3.11 h1:LyU6FolezeWAhvQk0k6O/d49jqgO52MSDDfYgbeoEm4= +github.com/supranational/blst v0.3.11/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a h1:1ur3QoCqvE5fl+nylMaIr9PVV1w343YRDtsy+Rwu7XI= github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a/go.mod h1:RRCYJbIwD5jmqPI9XoAFR0OcDxqUctll6zUj/+B4S48= github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= @@ -99,13 +114,11 @@ github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQ golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= -golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= -golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g= -golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k= +golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30= +golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M= +golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa h1:FRnLl4eNAQl8hwxVVC17teOw8kdjVDVAiFMtgUdTSRQ= +golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa/go.mod h1:zk2irFbV9DP96SEBUUAy67IdHUaZuSnrz1n472HUCLE= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc= -golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -114,13 +127,13 @@ golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwY golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4= -golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= +golang.org/x/net v0.24.0 h1:1PcaxkF854Fu3+lvBIx5SYn9wRlBzzcnHZSiaFFAb0w= +golang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= -golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= +golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= +golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -139,10 +152,12 @@ golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= -golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= +golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -154,8 +169,6 @@ golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.13.0 h1:Iey4qkscZuv0VvIt8E0neZjtPVQFSc870HQ448QgEmQ= -golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -182,3 +195,5 @@ gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +rsc.io/tmplfunc v0.0.3 h1:53XFQh69AfOa8Tw0Jm7t+GV7KZhOi6jzsCzTtKbMvzU= +rsc.io/tmplfunc v0.0.3/go.mod h1:AG3sTPzElb1Io3Yg4voV9AGZJuleGAwaVRxL9M49PhA= diff --git a/simulators/smoke/network/go.mod b/simulators/smoke/network/go.mod index 19ee5f1592..e61dd770a3 100644 --- a/simulators/smoke/network/go.mod +++ b/simulators/smoke/network/go.mod @@ -4,32 +4,30 @@ go 1.21 toolchain go1.22.1 -require github.com/ethereum/hive v0.0.0-20240319152821-ae224371b4e5 +require github.com/ethereum/hive v0.0.0-20240610172825-2430a68c753a require ( - github.com/Microsoft/go-winio v0.6.1 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect - github.com/deckarep/golang-set/v2 v2.1.0 // indirect + github.com/deckarep/golang-set/v2 v2.6.0 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 // indirect - github.com/ethereum/go-ethereum v1.13.5-0.20231031113925-bc42e88415d3 // indirect - github.com/go-ole/go-ole v1.2.6 // indirect + github.com/ethereum/go-ethereum v1.14.5 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect github.com/go-stack/stack v1.8.1 // indirect github.com/golang-jwt/jwt/v4 v4.5.0 // indirect github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect github.com/gorilla/websocket v1.5.0 // indirect - github.com/holiman/uint256 v1.2.3 // indirect + github.com/holiman/uint256 v1.2.4 // indirect github.com/lithammer/dedent v1.1.0 // indirect github.com/mattn/go-colorable v0.1.13 // indirect - github.com/mattn/go-isatty v0.0.17 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect github.com/shirou/gopsutil v3.21.11+incompatible // indirect github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a // indirect github.com/tklauser/go-sysconf v0.3.12 // indirect github.com/tklauser/numcpus v0.6.1 // indirect github.com/yusufpapurcu/wmi v1.2.2 // indirect - golang.org/x/crypto v0.21.0 // indirect - golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect - golang.org/x/mod v0.12.0 // indirect - golang.org/x/sys v0.18.0 // indirect - golang.org/x/tools v0.13.0 // indirect + golang.org/x/crypto v0.22.0 // indirect + golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa // indirect + golang.org/x/sys v0.20.0 // indirect gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1 // indirect ) diff --git a/simulators/smoke/network/go.sum b/simulators/smoke/network/go.sum index 4fff58f235..b23d4fbb71 100644 --- a/simulators/smoke/network/go.sum +++ b/simulators/smoke/network/go.sum @@ -1,5 +1,7 @@ -github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= -github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/bits-and-blooms/bitset v1.10.0 h1:ePXTeiPEazB5+opbv5fr8umg2R/1NlzgDsyepwsSr88= +github.com/bits-and-blooms/bitset v1.10.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U= github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= @@ -7,26 +9,35 @@ github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtyd github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/consensys/bavard v0.1.13 h1:oLhMLOFGTLdlda/kma4VOJazblc7IM5y5QPd2A/YjhQ= +github.com/consensys/bavard v0.1.13/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI= +github.com/consensys/gnark-crypto v0.12.1 h1:lHH39WuuFgVHONRl3J0LRBtuYdQTumFSDtJF7HpyG8M= +github.com/consensys/gnark-crypto v0.12.1/go.mod h1:v2Gy7L/4ZRosZ7Ivs+9SfUDr0f5UlG+EM5t7MPHiLuY= +github.com/crate-crypto/go-kzg-4844 v1.0.0 h1:TsSgHwrkTKecKJ4kadtHi4b3xHW5dCFUDFnUp1TsawI= +github.com/crate-crypto/go-kzg-4844 v1.0.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/deckarep/golang-set/v2 v2.1.0 h1:g47V4Or+DUdzbs8FxCCmgb6VYd+ptPAngjM6dtGktsI= -github.com/deckarep/golang-set/v2 v2.1.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= +github.com/deckarep/golang-set/v2 v2.6.0 h1:XfcQbWM1LlMB8BsJ8N9vW5ehnnPVIw0je80NsVHagjM= +github.com/deckarep/golang-set/v2 v2.6.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0= github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 h1:HbphB4TFFXpv7MNrT52FGrrgVXF1owhMVTHFZIlnvd4= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0/go.mod h1:DZGJHZMqrU4JJqFAWUS2UO1+lbSKsdiOoYi9Zzey7Fc= -github.com/ethereum/go-ethereum v1.13.5-0.20231031113925-bc42e88415d3 h1:i4TE0DmzMYcr2IiCdlTGGk+7Q/EzXvBKbbG4uRxMjJ0= -github.com/ethereum/go-ethereum v1.13.5-0.20231031113925-bc42e88415d3/go.mod h1:yMTu38GSuyxaYzQMViqNmQ1s3cE84abZexQmTgenWk0= -github.com/ethereum/hive v0.0.0-20240319152821-ae224371b4e5 h1:2Rc3v1mqWgUl8gSHFh7+FmVcyB1AI/9THxhEDjNK+PI= -github.com/ethereum/hive v0.0.0-20240319152821-ae224371b4e5/go.mod h1:MGwUXPGco6YS3brOf5WEILfUnnUL/XuX1224ab3D7XA= +github.com/ethereum/c-kzg-4844 v1.0.0 h1:0X1LBXxaEtYD9xsyj9B9ctQEZIpnvVDeoBx8aHEwTNA= +github.com/ethereum/c-kzg-4844 v1.0.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= +github.com/ethereum/go-ethereum v1.14.5 h1:szuFzO1MhJmweXjoM5nSAeDvjNUH3vIQoMzzQnfvjpw= +github.com/ethereum/go-ethereum v1.14.5/go.mod h1:VEDGGhSxY7IEjn98hJRFXl/uFvpRgbIIf2PpXiyGGgc= +github.com/ethereum/hive v0.0.0-20240610172825-2430a68c753a h1:iyHHRPXaxHtEvyFxc4A+is/JRt88o0gQhHrNx+khEqQ= +github.com/ethereum/hive v0.0.0-20240610172825-2430a68c753a/go.mod h1:ghNXZW+/WQClcyiwZpbTzUCyxwql7YeMacYd44v+BJE= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= -github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= github.com/go-stack/stack v1.8.1 h1:ntEHSVwIt7PNXNpgPmVfMrNhLtgjlmnZha2kOpuRiDw= github.com/go-stack/stack v1.8.1/go.mod h1:dcoOX6HbPZSZptuspn9bctJ+N/CnF5gGygcUP3XYfe4= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= @@ -53,8 +64,8 @@ github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/holiman/uint256 v1.2.3 h1:K8UWO1HUJpRMXBxbmaY1Y8IAMZC/RsKB+ArEnnK4l5o= -github.com/holiman/uint256 v1.2.3/go.mod h1:SC8Ryt4n+UBbPbIBKaG9zbbDlp4jOru9xFZmPzLUTxw= +github.com/holiman/uint256 v1.2.4 h1:jUc4Nk8fm9jZabQuqr2JzednajVmBpC+oiTiXZJEApU= +github.com/holiman/uint256 v1.2.4/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXeiRV4ng7E= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/lithammer/dedent v1.1.0 h1:VNzHMVCBNG1j0fh3OrsFRkVUwStdDArbgBWoPAffktY= @@ -62,8 +73,10 @@ github.com/lithammer/dedent v1.1.0/go.mod h1:jrXYCQtgg0nJiN+StA2KgR7w6CiQNv9Fd/Z github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng= -github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mmcloughlin/addchain v0.4.0 h1:SobOdjm2xLj1KkXN5/n0xTIWyZA2+s99UCY1iPfkHRY= +github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqkyU72HC5wJ4RlU= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= @@ -87,6 +100,8 @@ github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5 github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/supranational/blst v0.3.11 h1:LyU6FolezeWAhvQk0k6O/d49jqgO52MSDDfYgbeoEm4= +github.com/supranational/blst v0.3.11/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a h1:1ur3QoCqvE5fl+nylMaIr9PVV1w343YRDtsy+Rwu7XI= github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a/go.mod h1:RRCYJbIwD5jmqPI9XoAFR0OcDxqUctll6zUj/+B4S48= github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= @@ -99,13 +114,11 @@ github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQ golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= -golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= -golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g= -golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k= +golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30= +golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M= +golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa h1:FRnLl4eNAQl8hwxVVC17teOw8kdjVDVAiFMtgUdTSRQ= +golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa/go.mod h1:zk2irFbV9DP96SEBUUAy67IdHUaZuSnrz1n472HUCLE= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc= -golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -114,13 +127,13 @@ golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwY golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4= -golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= +golang.org/x/net v0.24.0 h1:1PcaxkF854Fu3+lvBIx5SYn9wRlBzzcnHZSiaFFAb0w= +golang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= -golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= +golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= +golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -139,10 +152,12 @@ golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= -golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= +golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -154,8 +169,6 @@ golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.13.0 h1:Iey4qkscZuv0VvIt8E0neZjtPVQFSc870HQ448QgEmQ= -golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -182,3 +195,5 @@ gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +rsc.io/tmplfunc v0.0.3 h1:53XFQh69AfOa8Tw0Jm7t+GV7KZhOi6jzsCzTtKbMvzU= +rsc.io/tmplfunc v0.0.3/go.mod h1:AG3sTPzElb1Io3Yg4voV9AGZJuleGAwaVRxL9M49PhA= From c741e58c51e2f2bbb2009407b96cb487d4fca5e7 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Mon, 10 Jun 2024 20:16:03 +0200 Subject: [PATCH 288/387] simulators/ethereum/engine: upgrade to go-ethereum v1.14.5 --- .../ethereum/engine/client/node/node.go | 2 +- simulators/ethereum/engine/devp2p/conn.go | 4 +- simulators/ethereum/engine/go.mod | 56 +-- simulators/ethereum/engine/go.sum | 347 ++++-------------- simulators/ethereum/engine/helper/blobs.go | 8 +- simulators/ethereum/engine/helper/block.go | 12 +- 6 files changed, 103 insertions(+), 326 deletions(-) diff --git a/simulators/ethereum/engine/client/node/node.go b/simulators/ethereum/engine/client/node/node.go index 0896da2d16..12b3e66e5e 100644 --- a/simulators/ethereum/engine/client/node/node.go +++ b/simulators/ethereum/engine/client/node/node.go @@ -677,7 +677,7 @@ func (n *GethNode) BalanceAt(ctx context.Context, account common.Address, blockN if err != nil { return nil, err } - return stateDB.GetBalance(account), nil + return stateDB.GetBalance(account).ToBig(), nil } func (n *GethNode) StorageAt(ctx context.Context, account common.Address, key common.Hash, blockNumber *big.Int) ([]byte, error) { diff --git a/simulators/ethereum/engine/devp2p/conn.go b/simulators/ethereum/engine/devp2p/conn.go index 2786499329..b5d1aa6d18 100644 --- a/simulators/ethereum/engine/devp2p/conn.go +++ b/simulators/ethereum/engine/devp2p/conn.go @@ -132,13 +132,13 @@ func (msg NewBlock) Code() int { return 23 } func (msg NewBlock) ReqID() uint64 { return 0 } // NewPooledTransactionHashes66 is the network packet for the tx hash propagation message. -type NewPooledTransactionHashes66 eth.NewPooledTransactionHashesPacket67 +type NewPooledTransactionHashes66 eth.NewPooledTransactionHashesPacket func (msg NewPooledTransactionHashes66) Code() int { return 24 } func (msg NewPooledTransactionHashes66) ReqID() uint64 { return 0 } // NewPooledTransactionHashes is the network packet for the tx hash propagation message. -type NewPooledTransactionHashes eth.NewPooledTransactionHashesPacket68 +type NewPooledTransactionHashes eth.NewPooledTransactionHashesPacket func (msg NewPooledTransactionHashes) Code() int { return 24 } func (msg NewPooledTransactionHashes) ReqID() uint64 { return 0 } diff --git a/simulators/ethereum/engine/go.mod b/simulators/ethereum/engine/go.mod index cda314d159..b18d548113 100644 --- a/simulators/ethereum/engine/go.mod +++ b/simulators/ethereum/engine/go.mod @@ -5,56 +5,57 @@ go 1.21 toolchain go1.22.1 require ( - github.com/crate-crypto/go-kzg-4844 v0.7.0 + github.com/crate-crypto/go-kzg-4844 v1.0.0 github.com/davecgh/go-spew v1.1.1 - github.com/ethereum/go-ethereum v1.13.5-0.20231127143928-5b57727d6de2 - github.com/ethereum/hive v0.0.0-20240319152821-ae224371b4e5 + github.com/ethereum/go-ethereum v1.14.5 + github.com/ethereum/hive v0.0.0-20240610172825-2430a68c753a github.com/golang-jwt/jwt/v4 v4.5.0 github.com/holiman/uint256 v1.2.4 github.com/pkg/errors v0.9.1 - golang.org/x/exp v0.0.0-20230905200255-921286631fa9 + golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa ) require ( github.com/DataDog/zstd v1.5.2 // indirect - github.com/Microsoft/go-winio v0.6.1 // indirect - github.com/VictoriaMetrics/fastcache v1.12.1 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect + github.com/VictoriaMetrics/fastcache v1.12.2 // indirect github.com/apapsch/go-jsonmerge/v2 v2.0.0 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/bits-and-blooms/bitset v1.10.0 // indirect github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect github.com/cespare/cp v1.1.1 // indirect - github.com/cespare/xxhash/v2 v2.2.0 // indirect - github.com/cockroachdb/errors v1.9.1 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/cockroachdb/errors v1.11.1 // indirect github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect - github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593 // indirect - github.com/cockroachdb/redact v1.1.3 // indirect + github.com/cockroachdb/pebble v1.1.0 // indirect + github.com/cockroachdb/redact v1.1.5 // indirect github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect github.com/consensys/bavard v0.1.13 // indirect github.com/consensys/gnark-crypto v0.12.1 // indirect github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect - github.com/crate-crypto/go-ipa v0.0.0-20231025140028-3c0104f4b233 // indirect - github.com/deckarep/golang-set/v2 v2.1.0 // indirect + github.com/crate-crypto/go-ipa v0.0.0-20240223125850-b1e8a79f509c // indirect + github.com/deckarep/golang-set/v2 v2.6.0 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 // indirect github.com/deepmap/oapi-codegen v1.12.4 // indirect - github.com/ethereum/c-kzg-4844 v0.4.0 // indirect - github.com/fjl/memsize v0.0.1 // indirect + github.com/ethereum/c-kzg-4844 v1.0.0 // indirect + github.com/ethereum/go-verkle v0.1.1-0.20240306133620-7d920df305f0 // indirect + github.com/ferranbt/fastssz v0.1.2 // indirect + github.com/fjl/memsize v0.0.2 // indirect github.com/fsnotify/fsnotify v1.6.0 // indirect github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08 // indirect - github.com/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46 // indirect github.com/getsentry/sentry-go v0.18.0 // indirect - github.com/go-ole/go-ole v1.2.6 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect github.com/go-stack/stack v1.8.1 // indirect github.com/gofrs/flock v0.8.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang/protobuf v1.5.3 // indirect + github.com/golang/protobuf v1.5.4 // indirect github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect github.com/google/go-cmp v0.6.0 // indirect github.com/google/uuid v1.3.0 // indirect github.com/gorilla/websocket v1.5.0 // indirect github.com/graph-gophers/graphql-go v1.4.0 // indirect github.com/hashicorp/go-bexpr v0.1.11 // indirect - github.com/holiman/billy v0.0.0-20230718173358-1c7e68d277a7 // indirect + github.com/holiman/billy v0.0.0-20240216141850-2abb0c79d3c4 // indirect github.com/holiman/bloomfilter/v2 v2.0.3 // indirect github.com/huin/goupnp v1.3.0 // indirect github.com/influxdata/influxdb-client-go/v2 v2.12.1 // indirect @@ -62,13 +63,15 @@ require ( github.com/influxdata/line-protocol v0.0.0-20210922203350-b1ad95c89adf // indirect github.com/jackpal/go-nat-pmp v1.0.2 // indirect github.com/klauspost/compress v1.15.15 // indirect + github.com/klauspost/cpuid/v2 v2.0.9 // indirect github.com/kr/pretty v0.3.1 // indirect github.com/kr/text v0.2.0 // indirect github.com/lithammer/dedent v1.1.0 // indirect github.com/mattn/go-colorable v0.1.13 // indirect - github.com/mattn/go-isatty v0.0.17 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect github.com/mattn/go-runewidth v0.0.14 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect + github.com/minio/sha256-simd v1.0.0 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/mitchellh/pointerstructure v1.2.1 // indirect github.com/mmcloughlin/addchain v0.4.0 // indirect @@ -92,16 +95,15 @@ require ( github.com/urfave/cli/v2 v2.25.7 // indirect github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 // indirect github.com/yusufpapurcu/wmi v1.2.2 // indirect - golang.org/x/crypto v0.21.0 // indirect - golang.org/x/mod v0.12.0 // indirect - golang.org/x/net v0.21.0 // indirect - golang.org/x/sync v0.4.0 // indirect - golang.org/x/sys v0.18.0 // indirect + golang.org/x/crypto v0.22.0 // indirect + golang.org/x/net v0.24.0 // indirect + golang.org/x/sync v0.7.0 // indirect + golang.org/x/sys v0.20.0 // indirect golang.org/x/text v0.14.0 // indirect - golang.org/x/time v0.3.0 // indirect - golang.org/x/tools v0.13.0 // indirect + golang.org/x/time v0.5.0 // indirect google.golang.org/protobuf v1.33.0 // indirect gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1 // indirect - gopkg.in/natefinch/lumberjack.v2 v2.0.0 // indirect + gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect rsc.io/tmplfunc v0.0.3 // indirect ) diff --git a/simulators/ethereum/engine/go.sum b/simulators/ethereum/engine/go.sum index e833d4e8d7..d8063823bd 100644 --- a/simulators/ethereum/engine/go.sum +++ b/simulators/ethereum/engine/go.sum @@ -1,27 +1,15 @@ -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/toml v1.3.2 h1:o7IhLm0Msx3BaB+n3Ag7L8EVlByGnpq14C4YWiu/gL8= -github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= -github.com/CloudyKit/fastprinter v0.0.0-20200109182630-33d98a066a53/go.mod h1:+3IMCy2vIlbG1XG/0ggNQv0SvxCAIpPM5b1nCz56Xno= -github.com/CloudyKit/jet/v3 v3.0.0/go.mod h1:HKQPgSJmdK8hdoAbKUUWajkHyHo4RaU5rMdUywE7VMo= github.com/DataDog/zstd v1.5.2 h1:vUG4lAyuPCXO0TLbXvPv7EB7cNK1QV/luu55UHLrrn8= github.com/DataDog/zstd v1.5.2/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= -github.com/Joker/hpp v1.0.0/go.mod h1:8x5n+M1Hp5hC0g8okX3sR3vFQwynaX/UgSOM9MeBKzY= -github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= -github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= github.com/RaveNoX/go-jsoncommentstrip v1.0.0/go.mod h1:78ihd09MekBnJnxpICcwzCMzGrKSKYe4AqU6PDYYpjk= -github.com/Shopify/goreferrer v0.0.0-20181106222321-ec9c9a553398/go.mod h1:a1uqRtAwp2Xwc6WNPJEufxJ7fx3npB4UV/JOLmbu5I0= -github.com/VictoriaMetrics/fastcache v1.12.1 h1:i0mICQuojGDL3KblA7wUNlY5lOK6a4bwt3uRKnkZU40= -github.com/VictoriaMetrics/fastcache v1.12.1/go.mod h1:tX04vaqcNoQeGLD+ra5pU5sWkuxnzWhEzLwhP9w653o= -github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY= +github.com/VictoriaMetrics/fastcache v1.12.2 h1:N0y9ASrJ0F6h0QaC3o6uJb3NIZ9VKLjCM7NQbSmF7WI= +github.com/VictoriaMetrics/fastcache v1.12.2/go.mod h1:AmC+Nzz1+3G2eCPapF6UcsnkThDcMsQicp4xDukwJYI= github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= github.com/allegro/bigcache v1.2.1 h1:hg1sY1raCwic3Vnsvje6TT7/pnZba83LeFck5NrFKSc= github.com/allegro/bigcache v1.2.1/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= github.com/apapsch/go-jsonmerge/v2 v2.0.0 h1:axGnT1gRIfimI7gJifB699GoE/oq+F2MU7Dml6nw9rQ= github.com/apapsch/go-jsonmerge/v2 v2.0.0/go.mod h1:lvDnEdqiQrp0O42VQGgmlKpxL1AP2+08jFMw88y4klk= -github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= -github.com/aymerick/raymond v2.0.3-0.20180322193309-b565731e1464+incompatible/go.mod h1:osfaiScAUVup+UC9Nfq76eWqDhXlp+4UYaA8uhTBO6g= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bits-and-blooms/bitset v1.10.0 h1:ePXTeiPEazB5+opbv5fr8umg2R/1NlzgDsyepwsSr88= @@ -31,171 +19,124 @@ github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/cp v1.1.1 h1:nCb6ZLdB7NRaqsm91JtQTAme2SKJzXVsdPIPkyJr1MU= github.com/cespare/cp v1.1.1/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s= -github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cockroachdb/datadriven v1.0.2/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f h1:otljaYPt5hWxV3MUfO5dFPFiOXg9CyG5/kCfayTqsJ4= github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= -github.com/cockroachdb/errors v1.9.1 h1:yFVvsI0VxmRShfawbt/laCIDy/mtTqqnvoNgiy5bEV8= -github.com/cockroachdb/errors v1.9.1/go.mod h1:2sxOtL2WIc096WSZqZ5h8fa17rdDq9HZOZLBCor4mBk= -github.com/cockroachdb/logtags v0.0.0-20211118104740-dabe8e521a4f/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= +github.com/cockroachdb/errors v1.11.1 h1:xSEW75zKaKCWzR3OfxXUxgrk/NtT4G1MiOv5lWZazG8= +github.com/cockroachdb/errors v1.11.1/go.mod h1:8MUxA3Gi6b25tYlFEBGLf+D8aISL+M4MIpiWMSNRfxw= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= -github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593 h1:aPEJyR4rPBvDmeyi+l/FS/VtA00IWvjeFvjen1m1l1A= -github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593/go.mod h1:6hk1eMY/u5t+Cf18q5lFMUA1Rc+Sm5I6Ra1QuPyxXCo= -github.com/cockroachdb/redact v1.1.3 h1:AKZds10rFSIj7qADf0g46UixK8NNLwWTNdCIGS5wfSQ= -github.com/cockroachdb/redact v1.1.3/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= +github.com/cockroachdb/pebble v1.1.0 h1:pcFh8CdCIt2kmEpK0OIatq67Ln9uGDYY3d5XnE0LJG4= +github.com/cockroachdb/pebble v1.1.0/go.mod h1:sEHm5NOXxyiAoKWhoFxT8xMgd/f3RA6qUqQ1BXKrh2E= +github.com/cockroachdb/redact v1.1.5 h1:u1PMllDkdFfPWaNGMyLD1+so+aq3uUItthCFqzwPJ30= +github.com/cockroachdb/redact v1.1.5/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo= github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ= -github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0/go.mod h1:4Zcjuz89kmFXt9morQgcfYZAYZ5n8WHjt81YYWIwtTM= github.com/consensys/bavard v0.1.13 h1:oLhMLOFGTLdlda/kma4VOJazblc7IM5y5QPd2A/YjhQ= github.com/consensys/bavard v0.1.13/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI= github.com/consensys/gnark-crypto v0.12.1 h1:lHH39WuuFgVHONRl3J0LRBtuYdQTumFSDtJF7HpyG8M= github.com/consensys/gnark-crypto v0.12.1/go.mod h1:v2Gy7L/4ZRosZ7Ivs+9SfUDr0f5UlG+EM5t7MPHiLuY= -github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= -github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/crate-crypto/go-ipa v0.0.0-20231025140028-3c0104f4b233 h1:d28BXYi+wUpz1KBmiF9bWrjEMacUEREV6MBi2ODnrfQ= -github.com/crate-crypto/go-ipa v0.0.0-20231025140028-3c0104f4b233/go.mod h1:geZJZH3SzKCqnz5VT0q/DyIG/tvu/dZk+VIfXicupJs= -github.com/crate-crypto/go-kzg-4844 v0.7.0 h1:C0vgZRk4q4EZ/JgPfzuSoxdCq3C3mOZMBShovmncxvA= -github.com/crate-crypto/go-kzg-4844 v0.7.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= +github.com/crate-crypto/go-ipa v0.0.0-20240223125850-b1e8a79f509c h1:uQYC5Z1mdLRPrZhHjHxufI8+2UG/i25QG92j0Er9p6I= +github.com/crate-crypto/go-ipa v0.0.0-20240223125850-b1e8a79f509c/go.mod h1:geZJZH3SzKCqnz5VT0q/DyIG/tvu/dZk+VIfXicupJs= +github.com/crate-crypto/go-kzg-4844 v1.0.0 h1:TsSgHwrkTKecKJ4kadtHi4b3xHW5dCFUDFnUp1TsawI= +github.com/crate-crypto/go-kzg-4844 v1.0.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/deckarep/golang-set/v2 v2.1.0 h1:g47V4Or+DUdzbs8FxCCmgb6VYd+ptPAngjM6dtGktsI= -github.com/deckarep/golang-set/v2 v2.1.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= +github.com/deckarep/golang-set/v2 v2.6.0 h1:XfcQbWM1LlMB8BsJ8N9vW5ehnnPVIw0je80NsVHagjM= +github.com/deckarep/golang-set/v2 v2.6.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0= github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 h1:HbphB4TFFXpv7MNrT52FGrrgVXF1owhMVTHFZIlnvd4= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0/go.mod h1:DZGJHZMqrU4JJqFAWUS2UO1+lbSKsdiOoYi9Zzey7Fc= github.com/deepmap/oapi-codegen v1.12.4 h1:pPmn6qI9MuOtCz82WY2Xaw46EQjgvxednXXrP7g5Q2s= github.com/deepmap/oapi-codegen v1.12.4/go.mod h1:3lgHGMu6myQ2vqbbTXH2H1o4eXFTGnFiDaOaKKl5yas= -github.com/dgraph-io/badger v1.6.0/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6psNgSztDR4= -github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385/go.mod h1:0vRUJqYpeSZifjYj7uP3BG/gKcuzL9xWVV/Y+cK33KM= -github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/etcd-io/bbolt v1.3.3/go.mod h1:ZF2nL25h33cCyBtcyWeZ2/I3HQOfTP+0PIEvHjkjCrw= -github.com/ethereum/c-kzg-4844 v0.4.0 h1:3MS1s4JtA868KpJxroZoepdV0ZKBp3u/O5HcZ7R3nlY= -github.com/ethereum/c-kzg-4844 v0.4.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= -github.com/ethereum/go-ethereum v1.13.5-0.20231127143928-5b57727d6de2 h1:aQz+Zhve06dQU6qqnCQ3TuZ7nFWxFvnNt+PY+LA8ZjM= -github.com/ethereum/go-ethereum v1.13.5-0.20231127143928-5b57727d6de2/go.mod h1:iogCB+O7R3eFmlyiEKRDqjmJbSgOsDHTjxE0PU6CYC8= -github.com/ethereum/hive v0.0.0-20240319152821-ae224371b4e5 h1:2Rc3v1mqWgUl8gSHFh7+FmVcyB1AI/9THxhEDjNK+PI= -github.com/ethereum/hive v0.0.0-20240319152821-ae224371b4e5/go.mod h1:MGwUXPGco6YS3brOf5WEILfUnnUL/XuX1224ab3D7XA= -github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072/go.mod h1:duJ4Jxv5lDcvg4QuQr0oowTf7dz4/CR8NtyCooz9HL8= -github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= -github.com/fjl/memsize v0.0.1 h1:+zhkb+dhUgx0/e+M8sF0QqiouvMQUiKR+QYvdxIOKcQ= -github.com/fjl/memsize v0.0.1/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= +github.com/ethereum/c-kzg-4844 v1.0.0 h1:0X1LBXxaEtYD9xsyj9B9ctQEZIpnvVDeoBx8aHEwTNA= +github.com/ethereum/c-kzg-4844 v1.0.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= +github.com/ethereum/go-ethereum v1.14.5 h1:szuFzO1MhJmweXjoM5nSAeDvjNUH3vIQoMzzQnfvjpw= +github.com/ethereum/go-ethereum v1.14.5/go.mod h1:VEDGGhSxY7IEjn98hJRFXl/uFvpRgbIIf2PpXiyGGgc= +github.com/ethereum/go-verkle v0.1.1-0.20240306133620-7d920df305f0 h1:KrE8I4reeVvf7C1tm8elRjj4BdscTYzz/WAbYyf/JI4= +github.com/ethereum/go-verkle v0.1.1-0.20240306133620-7d920df305f0/go.mod h1:D9AJLVXSyZQXJQVk8oh1EwjISE+sJTn2duYIZC0dy3w= +github.com/ethereum/hive v0.0.0-20240610172825-2430a68c753a h1:iyHHRPXaxHtEvyFxc4A+is/JRt88o0gQhHrNx+khEqQ= +github.com/ethereum/hive v0.0.0-20240610172825-2430a68c753a/go.mod h1:ghNXZW+/WQClcyiwZpbTzUCyxwql7YeMacYd44v+BJE= +github.com/ferranbt/fastssz v0.1.2 h1:Dky6dXlngF6Qjc+EfDipAkE83N5I5DE68bY6O0VLNPk= +github.com/ferranbt/fastssz v0.1.2/go.mod h1:X5UPrE2u1UJjxHA8X54u04SBwdAQjG2sFtWs39YxyWs= +github.com/fjl/memsize v0.0.2 h1:27txuSD9or+NZlnOWdKUxeBzTAUkWCVh+4Gf2dWFOzA= +github.com/fjl/memsize v0.0.2/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= -github.com/gavv/httpexpect v2.0.0+incompatible/go.mod h1:x+9tiU1YnrOvnB725RkpoLv1M62hOWzwo5OXotisrKc= github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08 h1:f6D9Hr8xV8uYKlyuj8XIruxlh9WjVjdh1gIicAS7ays= github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= -github.com/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46 h1:BAIP2GihuqhwdILrV+7GJel5lyPV3u1+PgzrWLc0TkE= -github.com/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46/go.mod h1:QNpY22eby74jVhqH4WhDLDwxc/vqsern6pW+u2kbkpc= -github.com/getsentry/sentry-go v0.12.0/go.mod h1:NSap0JBYWzHND8oMbyi0+XZhUalc1TBdRL1M71JZW2c= github.com/getsentry/sentry-go v0.18.0 h1:MtBW5H9QgdcJabtZcuJG80BMOwaBpkRDZkxRkNC1sN0= github.com/getsentry/sentry-go v0.18.0/go.mod h1:Kgon4Mby+FJ7ZWHFUAZgVaIa8sxHtnRJRLTXZr51aKQ= -github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3/go.mod h1:VJ0WA2NBN22VlZ2dKZQPAPnyWw5XTlK1KymzLKsr59s= -github.com/gin-gonic/gin v1.4.0/go.mod h1:OW2EZn3DO8Ln9oIKOvM++LBO+5UPHJJDH72/q/3rZdM= -github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= -github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab/go.mod h1:/P9AEU963A2AYjv4d1V5eVL1CQbEJq6aCNHDDjibzu8= -github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= github.com/go-stack/stack v1.8.1 h1:ntEHSVwIt7PNXNpgPmVfMrNhLtgjlmnZha2kOpuRiDw= github.com/go-stack/stack v1.8.1/go.mod h1:dcoOX6HbPZSZptuspn9bctJ+N/CnF5gGygcUP3XYfe4= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= -github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= -github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= -github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= -github.com/gogo/googleapis v0.0.0-20180223154316-0cd9801be74a/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= -github.com/gogo/googleapis v1.4.1/go.mod h1:2lpHqI5OcWCtVElxXnPt+s8oJvMpySlOyM6xDCrzib4= -github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/gogo/status v1.1.0/go.mod h1:BFv9nrluPLmrS0EmGVvLaPNmRosr9KapBYd5/hpY1WM= -github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= -github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXiurYmW7fx4GZkL8feAMVq7nEjURHk= github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/gomodule/redigo v1.7.1-0.20190724094224-574c33c3df38/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= -github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/graph-gophers/graphql-go v1.4.0 h1:JE9wveRTSXwJyjdRd6bOQ7Ob5bewTUQ58Jv4OiVdpdE= github.com/graph-gophers/graphql-go v1.4.0/go.mod h1:YtmJZDLbF1YYNrlNAuiO5zAStUWc3XZT07iGsVqe1Os= github.com/hashicorp/go-bexpr v0.1.11 h1:6DqdA/KBjurGby9yTY0bmkathya0lfwF2SeuubCI7dY= github.com/hashicorp/go-bexpr v0.1.11/go.mod h1:f03lAo0duBlDIUMGCuad8oLcgejw4m7U+N8T+6Kz1AE= -github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/holiman/billy v0.0.0-20230718173358-1c7e68d277a7 h1:3JQNjnMRil1yD0IfZKHF9GxxWKDJGj8I0IqOUol//sw= -github.com/holiman/billy v0.0.0-20230718173358-1c7e68d277a7/go.mod h1:5GuXa7vkL8u9FkFuWdVvfR5ix8hRB7DbOAaYULamFpc= +github.com/holiman/billy v0.0.0-20240216141850-2abb0c79d3c4 h1:X4egAf/gcS1zATw6wn4Ej8vjuVGxeHdan+bRb2ebyv4= +github.com/holiman/billy v0.0.0-20240216141850-2abb0c79d3c4/go.mod h1:5GuXa7vkL8u9FkFuWdVvfR5ix8hRB7DbOAaYULamFpc= github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao= github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA= github.com/holiman/uint256 v1.2.4 h1:jUc4Nk8fm9jZabQuqr2JzednajVmBpC+oiTiXZJEApU= @@ -203,81 +144,46 @@ github.com/holiman/uint256 v1.2.4/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXei github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/huin/goupnp v1.3.0 h1:UvLUlWDNpoUdYzb2TCn+MuTWtcjXKSza2n6CBdQ0xXc= github.com/huin/goupnp v1.3.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8= -github.com/hydrogen18/memlistener v0.0.0-20200120041712-dcc25e7acd91/go.mod h1:qEIFzExnS6016fRpRfxrExeVn2gbClQA99gQhnIcdhE= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/imkira/go-interpol v1.1.0/go.mod h1:z0h2/2T3XF8kyEPpRgJ3kmNv+C43p+I/CoI+jC3w2iA= -github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/influxdata/influxdb-client-go/v2 v2.12.1 h1:RrjoDNyBGFYvjKfjmtIyYAn6GY/SrtocSo4RPlt+Lng= github.com/influxdata/influxdb-client-go/v2 v2.12.1/go.mod h1:YteV91FiQxRdccyJ2cHvj2f/5sq4y4Njqu1fQzsQCOU= github.com/influxdata/influxdb1-client v0.0.0-20220302092344-a9ab5670611c h1:qSHzRbhzK8RdXOsAdfDgO49TtqC1oZ+acxPrkfTxcCs= github.com/influxdata/influxdb1-client v0.0.0-20220302092344-a9ab5670611c/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= github.com/influxdata/line-protocol v0.0.0-20210922203350-b1ad95c89adf h1:7JTmneyiNEwVBOHSjoMxiWAqB992atOeepeFYegn5RU= github.com/influxdata/line-protocol v0.0.0-20210922203350-b1ad95c89adf/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo= -github.com/iris-contrib/blackfriday v2.0.0+incompatible/go.mod h1:UzZ2bDEoaSGPbkg6SAB4att1aAwTmVIx/5gCVqeyUdI= -github.com/iris-contrib/go.uuid v2.0.0+incompatible/go.mod h1:iz2lgM/1UnEf1kP0L/+fafWORmlnuysV2EMP8MW+qe0= -github.com/iris-contrib/jade v1.1.3/go.mod h1:H/geBymxJhShH5kecoiOCSssPX7QWYH7UaeZTSWddIk= -github.com/iris-contrib/pongo2 v0.0.1/go.mod h1:Ssh+00+3GAZqSQb30AvBRNxBx7rf0GqwkjqxNd0u65g= -github.com/iris-contrib/schema v0.0.1/go.mod h1:urYA3uvUNG1TIIjOSCzHr9/LmbQo8LrOcOqfqxa4hXw= github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= -github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/juju/gnuflag v0.0.0-20171113085948-2ce1bb71843d/go.mod h1:2PavIy+JPciBPrBUjwbNvtwB6RQlve+hkpll6QSNmOE= -github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88/go.mod h1:3w7q1U84EfirKl04SVQ/s7nPm1ZPhiXd34z40TNz36k= -github.com/kataras/golog v0.0.10/go.mod h1:yJ8YKCmyL+nWjERB90Qwn+bdyBZsaQwU3bTVFgkFIp8= -github.com/kataras/iris/v12 v12.1.8/go.mod h1:LMYy4VlP67TQ3Zgriz8RE2h2kMZV2SgMYbq3UhfoFmE= -github.com/kataras/neffos v0.0.14/go.mod h1:8lqADm8PnbeFfL7CLXh1WHw53dG27MC3pgi2R1rmoTE= -github.com/kataras/pio v0.0.2/go.mod h1:hAoW0t9UmXi4R5Oyq5Z4irTbaTsOemSrDGUtaTl7Dro= -github.com/kataras/sitemap v0.0.5/go.mod h1:KY2eugMKiPwsJgx7+U103YZehfvNGOXURubcGyk0Bz8= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.8.2/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= -github.com/klauspost/compress v1.9.7/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= github.com/klauspost/compress v1.15.15 h1:EF27CXIuDsYJ6mmvtBRlEuB2UVOqHG1tAXgZ7yIO+lw= github.com/klauspost/compress v1.15.15/go.mod h1:ZcK2JAFqKOpnBlxcLsJzYfrS9X1akm9fHZNnD9+Vo/4= -github.com/klauspost/cpuid v1.2.1/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= +github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/klauspost/cpuid/v2 v2.0.9 h1:lgaqFMSdTdQYdZ04uHyN2d/eKdOMyi2YLSvlQIBFYa4= +github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/labstack/echo/v4 v4.5.0/go.mod h1:czIriw4a0C1dFun+ObrXp7ok03xON0N1awStJ6ArI7Y= -github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c= github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= github.com/lithammer/dedent v1.1.0 h1:VNzHMVCBNG1j0fh3OrsFRkVUwStdDArbgBWoPAffktY= github.com/lithammer/dedent v1.1.0/go.mod h1:jrXYCQtgg0nJiN+StA2KgR7w6CiQNv9Fd/Z9BP0jIOc= -github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.11/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= -github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= -github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng= -github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.14 h1:+xnbZSEeDbOIg5/mE6JF0w6n9duR1l3/WmbinWVwUuU= github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= -github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw= github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= -github.com/mediocregopher/radix/v3 v3.4.2/go.mod h1:8FL3F6UQRXHXIBSPUs5h0RybMF8i4n7wVopoX3x7Bv8= -github.com/microcosm-cc/bluemonday v1.0.2/go.mod h1:iVP4YcDBq+n/5fb23BhYFvIMq/leAFZyRl6bYmGDlGc= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/minio/sha256-simd v1.0.0 h1:v1ta+49hkWZyvaKwrQB8elexRqm6Y0aMLjCNsrYxo6g= +github.com/minio/sha256-simd v1.0.0/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy5RFepssQM= github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= @@ -286,22 +192,12 @@ github.com/mitchellh/pointerstructure v1.2.1/go.mod h1:BRAsLI5zgXmw97Lf6s25bs8oh github.com/mmcloughlin/addchain v0.4.0 h1:SobOdjm2xLj1KkXN5/n0xTIWyZA2+s99UCY1iPfkHRY= github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqkyU72HC5wJ4RlU= github.com/mmcloughlin/profile v0.1.1/go.mod h1:IhHD7q1ooxgwTgjxQYkACGA77oFTDdFVejUS1/tS/qU= -github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/moul/http2curl v1.0.0/go.mod h1:8UbvGypXm98wA/IqH45anm5Y2Z6ep6O31QGOAZ3H0fQ= -github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= -github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= -github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= -github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= @@ -313,59 +209,41 @@ github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAl github.com/onsi/gomega v1.19.0 h1:4ieX6qQjPP/BfC3mpsAtIGGlxTWPeA3Inl/7DtXw1tw= github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= -github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/peterh/liner v1.2.2 h1:aJ4AOodmL+JxOZZEL2u9iJf8omNRpqHc/EbrK+3mAXw= github.com/peterh/liner v1.2.2/go.mod h1:xFwJyiKIXJZUKItq5dGHZSTBRAuG/CpeNpWLyiNRNwI= github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_golang v1.14.0 h1:nJdhIvne2eSX/XRAFV9PcvFFRbrjbcTUj0VP62TMhnw= github.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4= github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= github.com/prometheus/common v0.39.0 h1:oOyhkDq05hPZKItWVBkJ6g6AtGxi+fy7F4JvUV8uhsI= github.com/prometheus/common v0.39.0/go.mod h1:6XBZ7lYdLCbkAVhwRsWTZn+IN5AB9F/NXd5w0BbEX0Y= github.com/prometheus/procfs v0.9.0 h1:wzCHvIvM5SxWqYvwgVL7yJY8Lz3PKn49KQtpgMYJfhI= github.com/prometheus/procfs v0.9.0/go.mod h1:+pB4zwohETzFnmlpe6yd2lSc+0/46IYZRB/chUwxUZY= +github.com/prysmaticlabs/gohashtree v0.0.1-alpha.0.20220714111606-acbb2962fb48 h1:cSo6/vk8YpvkLbk9v3FO97cakNmUoxwi2KMP8hd5WIw= +github.com/prysmaticlabs/gohashtree v0.0.1-alpha.0.20220714111606-acbb2962fb48/go.mod h1:4pWaT30XoEx1j8KNJf3TV+E3mQkaufn7mf+jRNb/Fuk= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.3 h1:utMvzDsuh3suAEnhH0RdHmoPbU648o6CvXxTx4SBMOw= github.com/rivo/uniseg v0.4.3/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= -github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= -github.com/rogpeppe/go-internal v1.8.1/go.mod h1:JeRgkft04UBgHMgCIwADu4Pn6Mtm5d4nPKWu0nJ5d+o= github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/rs/cors v1.8.2 h1:KCooALfAYGs415Cwu5ABvv9n9509fSiG5SQJn/AQo4U= github.com/rs/cors v1.8.2/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= -github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/schollz/closestmatch v2.1.0+incompatible/go.mod h1:RtP1ddjLong6gTkbtmuhtR2uUrrJOpYzYRvbcPAid+g= -github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI= github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= -github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= -github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= -github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= github.com/spkg/bom v0.0.0-20160624110644-59b7046e48ad/go.mod h1:qLr4V1qq6nMqFKkMo8ZTx3f+BZEkzsRUY10Xsm2mwU0= github.com/status-im/keycard-go v0.2.0 h1:QDLFswOQu1r5jsycloeQh3bVU8n/NatHHaZobtDnDzA= github.com/status-im/keycard-go v0.2.0/go.mod h1:wlp8ZLbsmrF6g6WjugPAx+IzoLrkdf9+mHxBEeo3Hbg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= @@ -382,206 +260,109 @@ github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+F github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= github.com/tyler-smith/go-bip39 v1.1.0 h1:5eUemwrMargf3BSLRRCalXT93Ns6pQJIjYQN2nyfOP8= github.com/tyler-smith/go-bip39 v1.1.0/go.mod h1:gUYDtqQw1JS3ZJ8UWVcGTGqqr6YIN3CWg+kkNaLt55U= -github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= -github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= -github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= -github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= github.com/urfave/cli/v2 v2.25.7 h1:VAzn5oq403l5pHjc4OhD54+XGO9cdKVL/7lDjF+iKUs= github.com/urfave/cli/v2 v2.25.7/go.mod h1:8qnjx1vcq5s2/wpsqoZFndg2CE5tNFyrTvS6SinrnYQ= -github.com/urfave/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4= -github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= -github.com/valyala/fasthttp v1.6.0/go.mod h1:FstJa9V+Pj9vQ7OJie2qMHdwemEDaDiSdBnvPM1Su9w= -github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= -github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= -github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio= -github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= -github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= -github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= -github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU= github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8= -github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0/go.mod h1:/LWChgwKmvncFJFHJ7Gvn9wZArjbV5/FppcK2fKk/tI= -github.com/yudai/gojsondiff v1.0.0/go.mod h1:AY32+k2cwILAkW1fbgxQ5mUmMiZFgLIV+FBNExI05xg= -github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82/go.mod h1:lgjkn3NuSvDfVJdfcVVdX+jpBxNmX4rDAzaS45IcYoM= -github.com/yudai/pp v2.0.1+incompatible/go.mod h1:PuxR/8QJ7cyCkFp/aUDS+JY727OFEZkTdatxwunjIkc= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yusufpapurcu/wmi v1.2.2 h1:KBNDSne4vP5mbSWnJbO+51IMOXJB67QiYCSBrubbPRg= github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= go.opentelemetry.io/otel v1.6.3/go.mod h1:7BgNga5fNlF/iZjG06hM3yofffp0ofKCDwSXx1GC4dI= go.opentelemetry.io/otel/trace v1.6.3/go.mod h1:GNJQusJlUgZl9/TQBPKU/Y/ty+0iVB5fjhKeJGZPGFs= -golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191227163750-53104e6ec876/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= -golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g= -golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30= +golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M= +golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa h1:FRnLl4eNAQl8hwxVVC17teOw8kdjVDVAiFMtgUdTSRQ= +golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa/go.mod h1:zk2irFbV9DP96SEBUUAy67IdHUaZuSnrz1n472HUCLE= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc= -golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190327091125-710a502c58a2/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= -golang.org/x/net v0.0.0-20211008194852-3b03d305991f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4= -golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/net v0.24.0 h1:1PcaxkF854Fu3+lvBIx5SYn9wRlBzzcnHZSiaFFAb0w= +golang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.4.0 h1:zxkM55ReGkDlKSM+Fu41A+zmbZuaPVbGMzvvdUPznYQ= -golang.org/x/sync v0.4.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= +golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211117180635-dee7805ff2e1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= -golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= +golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= -golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= +golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181221001348-537d06c36207/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190327201419-c70d86f8b7cf/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.13.0 h1:Iey4qkscZuv0VvIt8E0neZjtPVQFSc870HQ448QgEmQ= -golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/genproto v0.0.0-20180518175338-11a468237815/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= -google.golang.org/grpc v1.12.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= -gopkg.in/go-playground/validator.v8 v8.18.2/go.mod h1:RX2a/7Ha8BgOhfk7j780h4/u/RRjR0eouCJSH80/M2Y= gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1 h1:iiHuQZCNgYPmFQxd3BBN/Nc5+dAwzZuq5y40s20oQw0= gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= -gopkg.in/ini.v1 v1.51.1/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= -gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8= -gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= +gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc= +gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= @@ -589,12 +370,8 @@ gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= -gopkg.in/yaml.v3 v3.0.0-20191120175047-4206685974f2/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= rsc.io/tmplfunc v0.0.3 h1:53XFQh69AfOa8Tw0Jm7t+GV7KZhOi6jzsCzTtKbMvzU= rsc.io/tmplfunc v0.0.3/go.mod h1:AG3sTPzElb1Io3Yg4voV9AGZJuleGAwaVRxL9M49PhA= diff --git a/simulators/ethereum/engine/helper/blobs.go b/simulators/ethereum/engine/helper/blobs.go index 3227d7ce47..61b4fa1cce 100644 --- a/simulators/ethereum/engine/helper/blobs.go +++ b/simulators/ethereum/engine/helper/blobs.go @@ -180,13 +180,13 @@ func (blobId BlobID) GenerateBlobNoKZGCache() (*typ.Blob, *typ.KZGCommitment, *t } ctx_4844 := CryptoCtx() - kzgCommitment, err := ctx_4844.BlobToKZGCommitment(gokzg4844.Blob(blob), 0) + kzgCommitment, err := ctx_4844.BlobToKZGCommitment((*gokzg4844.Blob)(&blob), 0) if err != nil { return nil, nil, nil, errors.Wrap(err, "GenerateBlob: Generating commitment") } typesKzgCommitment := typ.KZGCommitment(kzgCommitment) - proof, err := ctx_4844.ComputeBlobKZGProof(gokzg4844.Blob(blob), kzgCommitment, 1) + proof, err := ctx_4844.ComputeBlobKZGProof((*gokzg4844.Blob)(&blob), kzgCommitment, 1) if err != nil { return nil, nil, nil, errors.Wrap(err, "GenerateBlob: Generating proof") } @@ -229,13 +229,13 @@ func (blobId BlobID) GenerateBlob() (*typ.Blob, *typ.KZGCommitment, *typ.KZGProo } ctx_4844 := CryptoCtx() - kzgCommitment, err := ctx_4844.BlobToKZGCommitment(gokzg4844.Blob(blob), 0) + kzgCommitment, err := ctx_4844.BlobToKZGCommitment((*gokzg4844.Blob)(&blob), 0) if err != nil { return nil, nil, nil, errors.Wrap(err, "GenerateBlob: Generating commitment") } typesKzgCommitment := typ.KZGCommitment(kzgCommitment) - proof, err := ctx_4844.ComputeBlobKZGProof(gokzg4844.Blob(blob), kzgCommitment, 1) + proof, err := ctx_4844.ComputeBlobKZGProof((*gokzg4844.Blob)(&blob), kzgCommitment, 1) if err != nil { return nil, nil, nil, errors.Wrap(err, "GenerateBlob: Generating proof") } diff --git a/simulators/ethereum/engine/helper/block.go b/simulators/ethereum/engine/helper/block.go index 7873e032a6..abecfe1b1a 100644 --- a/simulators/ethereum/engine/helper/block.go +++ b/simulators/ethereum/engine/helper/block.go @@ -11,13 +11,11 @@ func GenerateInvalidPayloadBlock(baseBlock *types.Block, uncle *types.Block, pay if uncle == nil { return nil, fmt.Errorf("No ommer provided") } - uncles := []*types.Header{ - uncle.Header(), - } - newHeader := types.CopyHeader(baseBlock.Header()) - newHeader.UncleHash = types.CalcUncleHash(uncles) - - modifiedBlock := types.NewBlockWithHeader(newHeader).WithBody(baseBlock.Transactions(), uncles) + body := baseBlock.Body() + body.Uncles = []*types.Header{uncle.Header()} + header := baseBlock.Header() + header.UncleHash = types.CalcUncleHash(body.Uncles) + modifiedBlock := types.NewBlockWithHeader(header).WithBody(*body) fmt.Printf("DEBUG: hash=%s, ommerLen=%d, ommersHash=%v\n", modifiedBlock.Hash(), len(modifiedBlock.Uncles()), modifiedBlock.UncleHash()) return modifiedBlock, nil } From a83e95728b40f1600c6bd5180163cf456fed9343 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Mon, 10 Jun 2024 20:20:59 +0200 Subject: [PATCH 289/387] simulators/eth2: upgrade hivesim --- simulators/eth2/common/go.mod | 64 ++++-- simulators/eth2/common/go.sum | 283 +++++++---------------- simulators/eth2/dencun/go.mod | 40 ++-- simulators/eth2/dencun/go.sum | 245 ++++---------------- simulators/eth2/engine/go.mod | 49 ++-- simulators/eth2/engine/go.sum | 354 +++++------------------------ simulators/eth2/go.work.sum | 200 +++++++++++++++- simulators/eth2/testnet/go.mod | 48 ++-- simulators/eth2/testnet/go.sum | 354 +++++------------------------ simulators/eth2/withdrawals/go.mod | 49 ++-- simulators/eth2/withdrawals/go.sum | 354 +++++------------------------ 11 files changed, 651 insertions(+), 1389 deletions(-) diff --git a/simulators/eth2/common/go.mod b/simulators/eth2/common/go.mod index 09e2cf5d91..b2fe65efe1 100644 --- a/simulators/eth2/common/go.mod +++ b/simulators/eth2/common/go.mod @@ -5,9 +5,9 @@ go 1.21 toolchain go1.22.0 require ( - github.com/ethereum/go-ethereum v1.13.14 - github.com/ethereum/hive v0.0.0-20240319152821-ae224371b4e5 - github.com/ethereum/hive/simulators/ethereum/engine v0.0.0-20240305231022-f69df863de20 + github.com/ethereum/go-ethereum v1.14.5 + github.com/ethereum/hive v0.0.0-20240610172825-2430a68c753a + github.com/ethereum/hive/simulators/ethereum/engine v0.0.0-20240610181627-c741e58c51e2 github.com/google/uuid v1.6.0 github.com/herumi/bls-eth-go-binary v1.29.1 github.com/holiman/uint256 v1.2.4 @@ -16,7 +16,7 @@ require ( github.com/marioevz/eth-clients v0.0.0-20231123180401-b4230c802498 github.com/marioevz/mock-builder v1.2.1-0.20240312201838-ad9ba388e88b github.com/pkg/errors v0.9.1 - github.com/protolambda/bls12-381-util v0.0.0-20220416220906-d8552aa452c7 + github.com/protolambda/bls12-381-util v0.1.0 github.com/protolambda/eth2api v0.0.0-20230316214135-5f8afbd6d05d github.com/protolambda/go-keystorev4 v0.1.0 github.com/protolambda/zrnt v0.32.3 @@ -30,34 +30,41 @@ require ( require ( github.com/DataDog/zstd v1.5.2 // indirect - github.com/Microsoft/go-winio v0.6.1 // indirect - github.com/VictoriaMetrics/fastcache v1.12.1 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect + github.com/VictoriaMetrics/fastcache v1.12.2 // indirect + github.com/apapsch/go-jsonmerge/v2 v2.0.0 // indirect github.com/benbjohnson/clock v1.3.5 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/bits-and-blooms/bitset v1.10.0 // indirect github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect - github.com/cespare/xxhash/v2 v2.2.0 // indirect - github.com/cockroachdb/errors v1.9.1 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/cockroachdb/errors v1.11.1 // indirect github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect - github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593 // indirect - github.com/cockroachdb/redact v1.1.3 // indirect + github.com/cockroachdb/pebble v1.1.0 // indirect + github.com/cockroachdb/redact v1.1.5 // indirect github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect github.com/consensys/bavard v0.1.13 // indirect github.com/consensys/gnark-crypto v0.12.1 // indirect github.com/containerd/cgroups v1.1.0 // indirect github.com/coreos/go-systemd/v22 v22.5.0 // indirect - github.com/crate-crypto/go-ipa v0.0.0-20231025140028-3c0104f4b233 // indirect - github.com/crate-crypto/go-kzg-4844 v0.7.0 // indirect + github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect + github.com/crate-crypto/go-ipa v0.0.0-20240223125850-b1e8a79f509c // indirect + github.com/crate-crypto/go-kzg-4844 v1.0.0 // indirect + github.com/davecgh/go-spew v1.1.1 // indirect github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c // indirect - github.com/deckarep/golang-set/v2 v2.3.0 // indirect + github.com/deckarep/golang-set/v2 v2.6.0 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 // indirect + github.com/deepmap/oapi-codegen v1.12.4 // indirect github.com/docker/go-units v0.5.0 // indirect github.com/elastic/gosigar v0.14.2 // indirect - github.com/ethereum/c-kzg-4844 v0.4.0 // indirect + github.com/ethereum/c-kzg-4844 v1.0.0 // indirect + github.com/ethereum/go-verkle v0.1.1-0.20240306133620-7d920df305f0 // indirect github.com/ferranbt/fastssz v0.1.3 // indirect + github.com/fjl/memsize v0.0.2 // indirect github.com/flynn/noise v1.1.0 // indirect github.com/francoispqt/gojay v1.2.13 // indirect - github.com/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46 // indirect + github.com/fsnotify/fsnotify v1.6.0 // indirect + github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08 // indirect github.com/getsentry/sentry-go v0.20.0 // indirect github.com/go-ole/go-ole v1.3.0 // indirect github.com/go-stack/stack v1.8.1 // indirect @@ -72,9 +79,15 @@ require ( github.com/google/pprof v0.0.0-20240207164012-fb44976bdcd5 // indirect github.com/gorilla/mux v1.8.1 // indirect github.com/gorilla/websocket v1.5.1 // indirect + github.com/graph-gophers/graphql-go v1.4.0 // indirect + github.com/hashicorp/go-bexpr v0.1.11 // indirect github.com/hashicorp/golang-lru/v2 v2.0.5 // indirect + github.com/holiman/billy v0.0.0-20240216141850-2abb0c79d3c4 // indirect github.com/holiman/bloomfilter/v2 v2.0.3 // indirect github.com/huin/goupnp v1.3.0 // indirect + github.com/influxdata/influxdb-client-go/v2 v2.12.1 // indirect + github.com/influxdata/influxdb1-client v0.0.0-20220302092344-a9ab5670611c // indirect + github.com/influxdata/line-protocol v0.0.0-20210922203350-b1ad95c89adf // indirect github.com/ipfs/go-cid v0.4.1 // indirect github.com/ipfs/go-log/v2 v2.5.1 // indirect github.com/jackpal/go-nat-pmp v1.0.2 // indirect @@ -107,6 +120,7 @@ require ( github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc // indirect github.com/minio/sha256-simd v1.0.1 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect + github.com/mitchellh/pointerstructure v1.2.1 // indirect github.com/mmcloughlin/addchain v0.4.0 // indirect github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 // indirect github.com/mr-tron/base58 v1.2.0 // indirect @@ -124,6 +138,7 @@ require ( github.com/onsi/ginkgo/v2 v2.15.0 // indirect github.com/opencontainers/runtime-spec v1.2.0 // indirect github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 // indirect + github.com/peterh/liner v1.2.2 // indirect github.com/prometheus/client_golang v1.18.0 // indirect github.com/prometheus/client_model v0.6.0 // indirect github.com/prometheus/common v0.47.0 // indirect @@ -137,33 +152,40 @@ require ( github.com/raulk/go-watchdog v1.3.0 // indirect github.com/rivo/uniseg v0.4.4 // indirect github.com/rogpeppe/go-internal v1.10.0 // indirect + github.com/rs/cors v1.8.2 // indirect + github.com/russross/blackfriday/v2 v2.1.0 // indirect github.com/shirou/gopsutil v3.21.11+incompatible // indirect github.com/sirupsen/logrus v1.9.3 // indirect github.com/spaolacci/murmur3 v1.1.0 // indirect + github.com/status-im/keycard-go v0.2.0 // indirect github.com/supranational/blst v0.3.11 // indirect github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d // indirect github.com/thomaso-mirodin/intmath v0.0.0-20160323211736-5dc6d854e46e // indirect github.com/tklauser/go-sysconf v0.3.12 // indirect github.com/tklauser/numcpus v0.6.1 // indirect + github.com/urfave/cli/v2 v2.25.7 // indirect github.com/wealdtech/go-bytesutil v1.2.1 // indirect github.com/wealdtech/go-eth2-types/v2 v2.8.1 // indirect + github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 // indirect github.com/yusufpapurcu/wmi v1.2.2 // indirect go.uber.org/dig v1.17.1 // indirect go.uber.org/fx v1.20.1 // indirect go.uber.org/mock v0.4.0 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.27.0 // indirect - golang.org/x/crypto v0.21.0 // indirect - golang.org/x/mod v0.15.0 // indirect - golang.org/x/net v0.21.0 // indirect - golang.org/x/sync v0.6.0 // indirect - golang.org/x/sys v0.18.0 // indirect + golang.org/x/crypto v0.22.0 // indirect + golang.org/x/mod v0.17.0 // indirect + golang.org/x/net v0.24.0 // indirect + golang.org/x/sync v0.7.0 // indirect + golang.org/x/sys v0.20.0 // indirect golang.org/x/text v0.14.0 // indirect - golang.org/x/tools v0.18.0 // indirect + golang.org/x/time v0.5.0 // indirect + golang.org/x/tools v0.20.0 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20230711160842-782d3b101e98 // indirect google.golang.org/grpc v1.58.3 // indirect google.golang.org/protobuf v1.33.0 // indirect gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1 // indirect + gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect k8s.io/client-go v0.22.5 // indirect k8s.io/utils v0.0.0-20210930125809-cb0fa318a74b // indirect diff --git a/simulators/eth2/common/go.sum b/simulators/eth2/common/go.sum index 1ebcf42711..94d07344e2 100644 --- a/simulators/eth2/common/go.sum +++ b/simulators/eth2/common/go.sum @@ -30,7 +30,6 @@ dmitri.shuralyov.com/html/belt v0.0.0-20180602232347-f7d459c86be0/go.mod h1:JLBr dmitri.shuralyov.com/service/change v0.0.0-20181023043359-a85b471d5412/go.mod h1:a1inKt/atXimZ4Mv927x+r7UpyzRUf4emIoiiSC2TN4= dmitri.shuralyov.com/state v0.0.0-20180228185332-28bcc343414c/go.mod h1:0PRwlb0D6DFvNNtx+9ybjezNCa8XF0xaYcETyp6rHWU= git.apache.org/thrift.git v0.0.0-20180902110319-2566ecd5d999/go.mod h1:fPE2ZNJGynbRyZ4dJvy6G277gSllfV2HJqblrnkyeyg= -github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= github.com/Azure/go-autorest/autorest v0.11.18/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= github.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= @@ -42,27 +41,23 @@ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03 github.com/BurntSushi/toml v1.3.2 h1:o7IhLm0Msx3BaB+n3Ag7L8EVlByGnpq14C4YWiu/gL8= github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/CloudyKit/fastprinter v0.0.0-20200109182630-33d98a066a53/go.mod h1:+3IMCy2vIlbG1XG/0ggNQv0SvxCAIpPM5b1nCz56Xno= -github.com/CloudyKit/jet/v3 v3.0.0/go.mod h1:HKQPgSJmdK8hdoAbKUUWajkHyHo4RaU5rMdUywE7VMo= github.com/DataDog/zstd v1.5.2 h1:vUG4lAyuPCXO0TLbXvPv7EB7cNK1QV/luu55UHLrrn8= github.com/DataDog/zstd v1.5.2/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= -github.com/Joker/hpp v1.0.0/go.mod h1:8x5n+M1Hp5hC0g8okX3sR3vFQwynaX/UgSOM9MeBKzY= -github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= -github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/Shopify/goreferrer v0.0.0-20181106222321-ec9c9a553398/go.mod h1:a1uqRtAwp2Xwc6WNPJEufxJ7fx3npB4UV/JOLmbu5I0= -github.com/VictoriaMetrics/fastcache v1.12.1 h1:i0mICQuojGDL3KblA7wUNlY5lOK6a4bwt3uRKnkZU40= -github.com/VictoriaMetrics/fastcache v1.12.1/go.mod h1:tX04vaqcNoQeGLD+ra5pU5sWkuxnzWhEzLwhP9w653o= -github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY= +github.com/RaveNoX/go-jsoncommentstrip v1.0.0/go.mod h1:78ihd09MekBnJnxpICcwzCMzGrKSKYe4AqU6PDYYpjk= +github.com/VictoriaMetrics/fastcache v1.12.2 h1:N0y9ASrJ0F6h0QaC3o6uJb3NIZ9VKLjCM7NQbSmF7WI= +github.com/VictoriaMetrics/fastcache v1.12.2/go.mod h1:AmC+Nzz1+3G2eCPapF6UcsnkThDcMsQicp4xDukwJYI= github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= github.com/allegro/bigcache v1.2.1 h1:hg1sY1raCwic3Vnsvje6TT7/pnZba83LeFck5NrFKSc= github.com/allegro/bigcache v1.2.1/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= -github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= +github.com/apapsch/go-jsonmerge/v2 v2.0.0 h1:axGnT1gRIfimI7gJifB699GoE/oq+F2MU7Dml6nw9rQ= +github.com/apapsch/go-jsonmerge/v2 v2.0.0/go.mod h1:lvDnEdqiQrp0O42VQGgmlKpxL1AP2+08jFMw88y4klk= github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= -github.com/aymerick/raymond v2.0.3-0.20180322193309-b565731e1464+incompatible/go.mod h1:osfaiScAUVup+UC9Nfq76eWqDhXlp+4UYaA8uhTBO6g= github.com/bazelbuild/rules_go v0.23.2 h1:Wxu7JjqnF78cKZbsBsARLSXx/jlGaSLCnUV3mTlyHvM= github.com/bazelbuild/rules_go v0.23.2/go.mod h1:MC23Dc/wkXEyk3Wpq6lCqz0ZAYOZDw2DR5y3N1q2i7M= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= @@ -74,6 +69,7 @@ github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bits-and-blooms/bitset v1.10.0 h1:ePXTeiPEazB5+opbv5fr8umg2R/1NlzgDsyepwsSr88= github.com/bits-and-blooms/bitset v1.10.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= +github.com/bmatcuk/doublestar v1.1.1/go.mod h1:UD6OnuiIn0yFxxA2le/rnRU1G4RaI4UvFv1sNto9p6w= github.com/bradfitz/go-smtpd v0.0.0-20170404230938-deb6d6237625/go.mod h1:HYsPBTaaSFSlLx/70C2HPIMNZpVV8+vt/A+FMnYP11g= github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U= github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= @@ -81,29 +77,26 @@ github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOF github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= github.com/buger/jsonparser v0.0.0-20181115193947-bf1c66bbce23/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/cilium/ebpf v0.2.0/go.mod h1:To2CFviqOWL/M0gIMsvSMlqe7em/l1ALkX1PyjrX2Qs= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cockroachdb/datadriven v1.0.2/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f h1:otljaYPt5hWxV3MUfO5dFPFiOXg9CyG5/kCfayTqsJ4= github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= -github.com/cockroachdb/errors v1.9.1 h1:yFVvsI0VxmRShfawbt/laCIDy/mtTqqnvoNgiy5bEV8= -github.com/cockroachdb/errors v1.9.1/go.mod h1:2sxOtL2WIc096WSZqZ5h8fa17rdDq9HZOZLBCor4mBk= -github.com/cockroachdb/logtags v0.0.0-20211118104740-dabe8e521a4f/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= +github.com/cockroachdb/errors v1.11.1 h1:xSEW75zKaKCWzR3OfxXUxgrk/NtT4G1MiOv5lWZazG8= +github.com/cockroachdb/errors v1.11.1/go.mod h1:8MUxA3Gi6b25tYlFEBGLf+D8aISL+M4MIpiWMSNRfxw= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= -github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593 h1:aPEJyR4rPBvDmeyi+l/FS/VtA00IWvjeFvjen1m1l1A= -github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593/go.mod h1:6hk1eMY/u5t+Cf18q5lFMUA1Rc+Sm5I6Ra1QuPyxXCo= -github.com/cockroachdb/redact v1.1.3 h1:AKZds10rFSIj7qADf0g46UixK8NNLwWTNdCIGS5wfSQ= -github.com/cockroachdb/redact v1.1.3/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= +github.com/cockroachdb/pebble v1.1.0 h1:pcFh8CdCIt2kmEpK0OIatq67Ln9uGDYY3d5XnE0LJG4= +github.com/cockroachdb/pebble v1.1.0/go.mod h1:sEHm5NOXxyiAoKWhoFxT8xMgd/f3RA6qUqQ1BXKrh2E= +github.com/cockroachdb/redact v1.1.5 h1:u1PMllDkdFfPWaNGMyLD1+so+aq3uUItthCFqzwPJ30= +github.com/cockroachdb/redact v1.1.5/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo= github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ= -github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0/go.mod h1:4Zcjuz89kmFXt9morQgcfYZAYZ5n8WHjt81YYWIwtTM= github.com/consensys/bavard v0.1.13 h1:oLhMLOFGTLdlda/kma4VOJazblc7IM5y5QPd2A/YjhQ= github.com/consensys/bavard v0.1.13/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI= github.com/consensys/gnark-crypto v0.12.1 h1:lHH39WuuFgVHONRl3J0LRBtuYdQTumFSDtJF7HpyG8M= @@ -111,23 +104,18 @@ github.com/consensys/gnark-crypto v0.12.1/go.mod h1:v2Gy7L/4ZRosZ7Ivs+9SfUDr0f5U github.com/containerd/cgroups v0.0.0-20201119153540-4cbc285b3327/go.mod h1:ZJeTFisyysqgcCdecO57Dj79RfL0LNeGiFUqLYQRYLE= github.com/containerd/cgroups v1.1.0 h1:v8rEWFl6EoqHB+swVNjVoCJE8o3jX7e8nqBGPLaDFBM= github.com/containerd/cgroups v1.1.0/go.mod h1:6ppBcbh/NOOUU+dMKrykgaBnK9lCIBxHqJDGwsa1mIw= -github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= -github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-systemd v0.0.0-20181012123002-c6f51f82210d/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd/v22 v22.1.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs= github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/cpuguy83/go-md2man v1.0.10 h1:BSKMNlYxDvnunlTymqtgONjNnaRV1sTpcovwwjF22jk= -github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/crate-crypto/go-ipa v0.0.0-20231025140028-3c0104f4b233 h1:d28BXYi+wUpz1KBmiF9bWrjEMacUEREV6MBi2ODnrfQ= -github.com/crate-crypto/go-ipa v0.0.0-20231025140028-3c0104f4b233/go.mod h1:geZJZH3SzKCqnz5VT0q/DyIG/tvu/dZk+VIfXicupJs= -github.com/crate-crypto/go-kzg-4844 v0.7.0 h1:C0vgZRk4q4EZ/JgPfzuSoxdCq3C3mOZMBShovmncxvA= -github.com/crate-crypto/go-kzg-4844 v0.7.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= +github.com/crate-crypto/go-ipa v0.0.0-20240223125850-b1e8a79f509c h1:uQYC5Z1mdLRPrZhHjHxufI8+2UG/i25QG92j0Er9p6I= +github.com/crate-crypto/go-ipa v0.0.0-20240223125850-b1e8a79f509c/go.mod h1:geZJZH3SzKCqnz5VT0q/DyIG/tvu/dZk+VIfXicupJs= +github.com/crate-crypto/go-kzg-4844 v1.0.0 h1:TsSgHwrkTKecKJ4kadtHi4b3xHW5dCFUDFnUp1TsawI= +github.com/crate-crypto/go-kzg-4844 v1.0.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/d4l3k/messagediff v1.2.1 h1:ZcAIMYsUg0EAp9X+tt8/enBE/Q8Yd5kzPynLyKptt9U= github.com/d4l3k/messagediff v1.2.1/go.mod h1:Oozbb1TVXFac9FtSIxHBMnBCq2qeH/2KkEQxENCrlLo= @@ -136,41 +124,41 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c h1:pFUpOrbxDR6AkioZ1ySsx5yxlDQZ8stG2b88gTPxgJU= github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c/go.mod h1:6UhI8N9EjYm1c2odKpFpAYeR8dsBeM7PtzQhRgxRr9U= -github.com/deckarep/golang-set/v2 v2.3.0 h1:qs18EKUfHm2X9fA50Mr/M5hccg2tNnVqsiBImnyDs0g= -github.com/deckarep/golang-set/v2 v2.3.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= +github.com/deckarep/golang-set/v2 v2.6.0 h1:XfcQbWM1LlMB8BsJ8N9vW5ehnnPVIw0je80NsVHagjM= +github.com/deckarep/golang-set/v2 v2.6.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= github.com/decred/dcrd/crypto/blake256 v1.0.1 h1:7PltbUIQB7u/FfZ39+DGa/ShuMyJ5ilcvdfma9wOH6Y= github.com/decred/dcrd/crypto/blake256 v1.0.1/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 h1:8UrgZ3GkP4i/CLijOJx79Yu+etlyjdBU4sfcs2WYQMs= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0= -github.com/dgraph-io/badger v1.6.0/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6psNgSztDR4= -github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/deepmap/oapi-codegen v1.12.4 h1:pPmn6qI9MuOtCz82WY2Xaw46EQjgvxednXXrP7g5Q2s= +github.com/deepmap/oapi-codegen v1.12.4/go.mod h1:3lgHGMu6myQ2vqbbTXH2H1o4eXFTGnFiDaOaKKl5yas= github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385/go.mod h1:0vRUJqYpeSZifjYj7uP3BG/gKcuzL9xWVV/Y+cK33KM= github.com/elastic/gosigar v0.12.0/go.mod h1:iXRIGg2tLnu7LBdpqzyQfGDEidKCfWcCMS0WKyPWoMs= github.com/elastic/gosigar v0.14.2 h1:Dg80n8cr90OZ7x+bAax/QjoW/XqTI11RmA79ZwIm9/4= github.com/elastic/gosigar v0.14.2/go.mod h1:iXRIGg2tLnu7LBdpqzyQfGDEidKCfWcCMS0WKyPWoMs= github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/etcd-io/bbolt v1.3.3/go.mod h1:ZF2nL25h33cCyBtcyWeZ2/I3HQOfTP+0PIEvHjkjCrw= -github.com/ethereum/c-kzg-4844 v0.4.0 h1:3MS1s4JtA868KpJxroZoepdV0ZKBp3u/O5HcZ7R3nlY= -github.com/ethereum/c-kzg-4844 v0.4.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= -github.com/ethereum/go-ethereum v1.13.14 h1:EwiY3FZP94derMCIam1iW4HFVrSgIcpsu0HwTQtm6CQ= -github.com/ethereum/go-ethereum v1.13.14/go.mod h1:TN8ZiHrdJwSe8Cb6x+p0hs5CxhJZPbqB7hHkaUXcmIU= -github.com/ethereum/hive v0.0.0-20240319152821-ae224371b4e5 h1:2Rc3v1mqWgUl8gSHFh7+FmVcyB1AI/9THxhEDjNK+PI= -github.com/ethereum/hive v0.0.0-20240319152821-ae224371b4e5/go.mod h1:MGwUXPGco6YS3brOf5WEILfUnnUL/XuX1224ab3D7XA= -github.com/ethereum/hive/simulators/ethereum/engine v0.0.0-20240305231022-f69df863de20 h1:Bf9mev5lvesQIIpJtzO+vnGQ3Jv3NuLa2buY2+2pQzg= -github.com/ethereum/hive/simulators/ethereum/engine v0.0.0-20240305231022-f69df863de20/go.mod h1:nag0wj4K1/0AEP1VAKwY08N4I9yymrwXsX4+n0YFfdw= +github.com/ethereum/c-kzg-4844 v1.0.0 h1:0X1LBXxaEtYD9xsyj9B9ctQEZIpnvVDeoBx8aHEwTNA= +github.com/ethereum/c-kzg-4844 v1.0.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= +github.com/ethereum/go-ethereum v1.14.5 h1:szuFzO1MhJmweXjoM5nSAeDvjNUH3vIQoMzzQnfvjpw= +github.com/ethereum/go-ethereum v1.14.5/go.mod h1:VEDGGhSxY7IEjn98hJRFXl/uFvpRgbIIf2PpXiyGGgc= +github.com/ethereum/go-verkle v0.1.1-0.20240306133620-7d920df305f0 h1:KrE8I4reeVvf7C1tm8elRjj4BdscTYzz/WAbYyf/JI4= +github.com/ethereum/go-verkle v0.1.1-0.20240306133620-7d920df305f0/go.mod h1:D9AJLVXSyZQXJQVk8oh1EwjISE+sJTn2duYIZC0dy3w= +github.com/ethereum/hive v0.0.0-20240610172825-2430a68c753a h1:iyHHRPXaxHtEvyFxc4A+is/JRt88o0gQhHrNx+khEqQ= +github.com/ethereum/hive v0.0.0-20240610172825-2430a68c753a/go.mod h1:ghNXZW+/WQClcyiwZpbTzUCyxwql7YeMacYd44v+BJE= +github.com/ethereum/hive/simulators/ethereum/engine v0.0.0-20240610172825-2430a68c753a h1:Fosk1Ej17ClzSkcaSvELyIGrLmAWc9xIQFEu6w40q9w= +github.com/ethereum/hive/simulators/ethereum/engine v0.0.0-20240610172825-2430a68c753a/go.mod h1:TWdGG7ioTHIkdnyiFZcaVAcxDdWfefW2tMiTcZpWA7o= +github.com/ethereum/hive/simulators/ethereum/engine v0.0.0-20240610180720-4533b079ea50 h1:8DjdLc/y7Pd1La3sE9zPMKsraG8b/p4b0lpHou5zupc= +github.com/ethereum/hive/simulators/ethereum/engine v0.0.0-20240610180720-4533b079ea50/go.mod h1:TWdGG7ioTHIkdnyiFZcaVAcxDdWfefW2tMiTcZpWA7o= +github.com/ethereum/hive/simulators/ethereum/engine v0.0.0-20240610181627-c741e58c51e2 h1:PZ+xW+ywyn+6/GzRqTMLAG7N2xHFhae8lXVt/2MPfAI= +github.com/ethereum/hive/simulators/ethereum/engine v0.0.0-20240610181627-c741e58c51e2/go.mod h1:CTrtqj/pRDjVU5SteEngxH68vsCEg3wOgeUdn0I6iGY= github.com/evanphx/json-patch v4.11.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072/go.mod h1:duJ4Jxv5lDcvg4QuQr0oowTf7dz4/CR8NtyCooz9HL8= -github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= github.com/ferranbt/fastssz v0.1.3 h1:ZI+z3JH05h4kgmFXdHuR1aWYsgrg7o+Fw7/NCzM16Mo= github.com/ferranbt/fastssz v0.1.3/go.mod h1:0Y9TEd/9XuFlh7mskMPfXiI2Dkw4Ddg9EyXt1W7MRvE= github.com/fjl/memsize v0.0.2 h1:27txuSD9or+NZlnOWdKUxeBzTAUkWCVh+4Gf2dWFOzA= @@ -187,19 +175,12 @@ github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4 github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= -github.com/gavv/httpexpect v2.0.0+incompatible/go.mod h1:x+9tiU1YnrOvnB725RkpoLv1M62hOWzwo5OXotisrKc= github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08 h1:f6D9Hr8xV8uYKlyuj8XIruxlh9WjVjdh1gIicAS7ays= github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= -github.com/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46 h1:BAIP2GihuqhwdILrV+7GJel5lyPV3u1+PgzrWLc0TkE= -github.com/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46/go.mod h1:QNpY22eby74jVhqH4WhDLDwxc/vqsern6pW+u2kbkpc= -github.com/getsentry/sentry-go v0.12.0/go.mod h1:NSap0JBYWzHND8oMbyi0+XZhUalc1TBdRL1M71JZW2c= github.com/getsentry/sentry-go v0.20.0 h1:bwXW98iMRIWxn+4FgPW7vMrjmbym6HblXALmhjHmQaQ= github.com/getsentry/sentry-go v0.20.0/go.mod h1:lc76E2QywIyW8WuBnwl8Lc4bkmQH4+w1gwTf25trprY= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3/go.mod h1:VJ0WA2NBN22VlZ2dKZQPAPnyWw5XTlK1KymzLKsr59s= -github.com/gin-gonic/gin v1.4.0/go.mod h1:OW2EZn3DO8Ln9oIKOvM++LBO+5UPHJJDH72/q/3rZdM= github.com/gliderlabs/ssh v0.1.1/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= -github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= @@ -208,9 +189,11 @@ github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2 github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY= github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= -github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab/go.mod h1:/P9AEU963A2AYjv4d1V5eVL1CQbEJq6aCNHDDjibzu8= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= @@ -222,24 +205,16 @@ github.com/go-stack/stack v1.8.1/go.mod h1:dcoOX6HbPZSZptuspn9bctJ+N/CnF5gGygcUP github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= -github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= -github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= -github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk= github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= -github.com/gogo/googleapis v0.0.0-20180223154316-0cd9801be74a/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= -github.com/gogo/googleapis v1.4.1/go.mod h1:2lpHqI5OcWCtVElxXnPt+s8oJvMpySlOyM6xDCrzib4= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/gogo/status v1.1.0/go.mod h1:BFv9nrluPLmrS0EmGVvLaPNmRosr9KapBYd5/hpY1WM= -github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= @@ -268,12 +243,11 @@ github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QD github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= -github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXiurYmW7fx4GZkL8feAMVq7nEjURHk= github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/gomodule/redigo v1.7.1-0.20190724094224-574c33c3df38/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= @@ -281,9 +255,9 @@ github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5a github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ= @@ -318,10 +292,11 @@ github.com/googleapis/gnostic v0.5.5/go.mod h1:7+EbHbldMins07ALC74bsA81Ovc97Dwqy github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= -github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.5.1 h1:gmztn0JnHVt9JZquRuzLw3g4wouNVzKL15iLr/zn/QY= github.com/gorilla/websocket v1.5.1/go.mod h1:x3kM2JMyaluk02fnUJpQuwD2dCS5NDG2ZHL0uE0tcaY= +github.com/graph-gophers/graphql-go v1.4.0 h1:JE9wveRTSXwJyjdRd6bOQ7Ob5bewTUQ58Jv4OiVdpdE= +github.com/graph-gophers/graphql-go v1.4.0/go.mod h1:YtmJZDLbF1YYNrlNAuiO5zAStUWc3XZT07iGsVqe1Os= github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= github.com/grpc-ecosystem/grpc-gateway v1.5.0 h1:WcmKMm43DR7RdtlkEXQJyo5ws8iTp98CyhCCbOHMvNI= github.com/grpc-ecosystem/grpc-gateway v1.5.0/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw= @@ -329,14 +304,12 @@ github.com/grpc-ecosystem/grpc-gateway/v2 v2.0.1 h1:X2vfSnm1WC8HEo0MBHZg2TcuDUHJ github.com/grpc-ecosystem/grpc-gateway/v2 v2.0.1/go.mod h1:oVMjMN64nzEcepv1kdZKgx1qNYt4Ro0Gqefiq2JWdis= github.com/hashicorp/go-bexpr v0.1.11 h1:6DqdA/KBjurGby9yTY0bmkathya0lfwF2SeuubCI7dY= github.com/hashicorp/go-bexpr v0.1.11/go.mod h1:f03lAo0duBlDIUMGCuad8oLcgejw4m7U+N8T+6Kz1AE= -github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d h1:dg1dEPuWpEqDnvIw251EVy4zlP8gWbsGj4BsUKCRpYs= github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/golang-lru/v2 v2.0.5 h1:wW7h1TG88eUIJ2i69gaE3uNVtEPIagzhGvHgwfx2Vm4= github.com/hashicorp/golang-lru/v2 v2.0.5/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= -github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/herumi/bls-eth-go-binary v1.29.1 h1:XcNSHYTyNjEUVfWDCE2gtG5r95biTwd7MJUJF09LtSE= github.com/herumi/bls-eth-go-binary v1.29.1/go.mod h1:luAnRm3OsMQeokhGzpYmc0ZKwawY7o87PUEP11Z7r7U= github.com/holiman/billy v0.0.0-20240216141850-2abb0c79d3c4 h1:X4egAf/gcS1zATw6wn4Ej8vjuVGxeHdan+bRb2ebyv4= @@ -349,52 +322,40 @@ github.com/holiman/uint256 v1.2.4/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXei github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/huin/goupnp v1.3.0 h1:UvLUlWDNpoUdYzb2TCn+MuTWtcjXKSza2n6CBdQ0xXc= github.com/huin/goupnp v1.3.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8= -github.com/hydrogen18/memlistener v0.0.0-20200120041712-dcc25e7acd91/go.mod h1:qEIFzExnS6016fRpRfxrExeVn2gbClQA99gQhnIcdhE= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/imkira/go-interpol v1.1.0/go.mod h1:z0h2/2T3XF8kyEPpRgJ3kmNv+C43p+I/CoI+jC3w2iA= -github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/influxdata/influxdb-client-go/v2 v2.12.1 h1:RrjoDNyBGFYvjKfjmtIyYAn6GY/SrtocSo4RPlt+Lng= +github.com/influxdata/influxdb-client-go/v2 v2.12.1/go.mod h1:YteV91FiQxRdccyJ2cHvj2f/5sq4y4Njqu1fQzsQCOU= +github.com/influxdata/influxdb1-client v0.0.0-20220302092344-a9ab5670611c h1:qSHzRbhzK8RdXOsAdfDgO49TtqC1oZ+acxPrkfTxcCs= +github.com/influxdata/influxdb1-client v0.0.0-20220302092344-a9ab5670611c/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= +github.com/influxdata/line-protocol v0.0.0-20210922203350-b1ad95c89adf h1:7JTmneyiNEwVBOHSjoMxiWAqB992atOeepeFYegn5RU= +github.com/influxdata/line-protocol v0.0.0-20210922203350-b1ad95c89adf/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo= github.com/ipfs/go-cid v0.4.1 h1:A/T3qGvxi4kpKWWcPC/PgbvDA2bjVLO7n4UeVwnbs/s= github.com/ipfs/go-cid v0.4.1/go.mod h1:uQHwDeX4c6CtyrFwdqyhpNcxVewur1M7l7fNU7LKwZk= github.com/ipfs/go-log/v2 v2.5.1 h1:1XdUzF7048prq4aBjDQQ4SL5RxftpRGdXhNRwKSAlcY= github.com/ipfs/go-log/v2 v2.5.1/go.mod h1:prSpmC1Gpllc9UYWxDiZDreBYw7zp4Iqp1kOLU9U5UI= -github.com/iris-contrib/blackfriday v2.0.0+incompatible/go.mod h1:UzZ2bDEoaSGPbkg6SAB4att1aAwTmVIx/5gCVqeyUdI= -github.com/iris-contrib/go.uuid v2.0.0+incompatible/go.mod h1:iz2lgM/1UnEf1kP0L/+fafWORmlnuysV2EMP8MW+qe0= -github.com/iris-contrib/jade v1.1.3/go.mod h1:H/geBymxJhShH5kecoiOCSssPX7QWYH7UaeZTSWddIk= -github.com/iris-contrib/pongo2 v0.0.1/go.mod h1:Ssh+00+3GAZqSQb30AvBRNxBx7rf0GqwkjqxNd0u65g= -github.com/iris-contrib/schema v0.0.1/go.mod h1:urYA3uvUNG1TIIjOSCzHr9/LmbQo8LrOcOqfqxa4hXw= github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= github.com/jbenet/go-temp-err-catcher v0.1.0 h1:zpb3ZH6wIE8Shj2sKS+khgRvf7T7RABoLk/+KKHggpk= github.com/jbenet/go-temp-err-catcher v0.1.0/go.mod h1:0kJRvmDZXNMIiJirNPEYfhpPwbGVtZVWC34vc5WLsDk= github.com/jellevandenhooff/dkim v0.0.0-20150330215556-f50fe3d243e1/go.mod h1:E0B/fFc00Y+Rasa88328GlI/XbtyysCtTHZS8h7IrBU= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= -github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= +github.com/juju/gnuflag v0.0.0-20171113085948-2ce1bb71843d/go.mod h1:2PavIy+JPciBPrBUjwbNvtwB6RQlve+hkpll6QSNmOE= github.com/julienschmidt/httprouter v1.3.0 h1:U0609e9tgbseu3rBINet9P48AI/D3oJs4dN7jwJOQ1U= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= -github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88/go.mod h1:3w7q1U84EfirKl04SVQ/s7nPm1ZPhiXd34z40TNz36k= -github.com/kataras/golog v0.0.10/go.mod h1:yJ8YKCmyL+nWjERB90Qwn+bdyBZsaQwU3bTVFgkFIp8= -github.com/kataras/iris/v12 v12.1.8/go.mod h1:LMYy4VlP67TQ3Zgriz8RE2h2kMZV2SgMYbq3UhfoFmE= -github.com/kataras/neffos v0.0.14/go.mod h1:8lqADm8PnbeFfL7CLXh1WHw53dG27MC3pgi2R1rmoTE= -github.com/kataras/pio v0.0.2/go.mod h1:hAoW0t9UmXi4R5Oyq5Z4irTbaTsOemSrDGUtaTl7Dro= -github.com/kataras/sitemap v0.0.5/go.mod h1:KY2eugMKiPwsJgx7+U103YZehfvNGOXURubcGyk0Bz8= github.com/kilic/bls12-381 v0.1.0 h1:encrdjqKMEvabVQ7qYOKu1OvhqpK4s47wDYtNiPtlp4= github.com/kilic/bls12-381 v0.1.0/go.mod h1:vDTTHJONJ6G+P2R74EhnyotQDTliQDnFEwhdmfzw1ig= github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.8.2/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= -github.com/klauspost/compress v1.9.7/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= github.com/klauspost/compress v1.17.6 h1:60eq2E/jlfwQXtvZEeBUYADs+BwKBWURIY+Gj2eRGjI= github.com/klauspost/compress v1.17.6/go.mod h1:/dCuZOvVtNoHsyb+cuJD3itjs3NbnF6KH9zAO4BDxPM= -github.com/klauspost/cpuid v1.2.1/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= github.com/klauspost/cpuid/v2 v2.2.7 h1:ZWSB3igEs+d0qvnxR/ZBzXVmxkgt8DdzP6m9pfuVLDM= github.com/klauspost/cpuid/v2 v2.2.7/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= github.com/koron/go-ssdp v0.0.4 h1:1IDwrghSKYM7yLf7XCzbByg2sJ/JcNOZRXS2jczTwz0= @@ -402,7 +363,6 @@ github.com/koron/go-ssdp v0.0.4/go.mod h1:oDXq+E5IL5q0U8uSBcoAXzTzInwy5lEgC91HoK github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= @@ -412,8 +372,6 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/labstack/echo/v4 v4.5.0/go.mod h1:czIriw4a0C1dFun+ObrXp7ok03xON0N1awStJ6ArI7Y= -github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c= github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= github.com/libp2p/go-buffer-pool v0.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6cdF0Y8= @@ -445,7 +403,6 @@ github.com/libp2p/go-yamux/v4 v4.0.1/go.mod h1:NWjl8ZTLOGlozrXSOZ/HlfG++39iKNnM5 github.com/lithammer/dedent v1.1.0 h1:VNzHMVCBNG1j0fh3OrsFRkVUwStdDArbgBWoPAffktY= github.com/lithammer/dedent v1.1.0/go.mod h1:jrXYCQtgg0nJiN+StA2KgR7w6CiQNv9Fd/Z9BP0jIOc= github.com/lunixbochs/vtclean v1.0.0/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI= -github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= @@ -463,27 +420,18 @@ github.com/marioevz/ztyp v0.0.0-20231106221254-dd6f24f13fd9 h1:e40k7kQLw2jyDg4+M github.com/marioevz/ztyp v0.0.0-20231106221254-dd6f24f13fd9/go.mod h1:9bYgKGqg3wJqT9ac1gI2hnVb0STQq7p/1lapqrqY1dU= github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd h1:br0buuQ854V8u83wA0rVZ8ttrq5CpaPZdvrK0LP2lOk= github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd/go.mod h1:QuCEs1Nt24+FYQEqAAncTDPJIuGs+LxK1MCiFL25pMU= -github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.11/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= -github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= -github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.14 h1:+xnbZSEeDbOIg5/mE6JF0w6n9duR1l3/WmbinWVwUuU= github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= -github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/mediocregopher/radix/v3 v3.4.2/go.mod h1:8FL3F6UQRXHXIBSPUs5h0RybMF8i4n7wVopoX3x7Bv8= github.com/microcosm-cc/bluemonday v1.0.1/go.mod h1:hsXNsILzKxV+sX77C5b8FSuKF00vh2OMYv+xgHpAMF4= -github.com/microcosm-cc/bluemonday v1.0.2/go.mod h1:iVP4YcDBq+n/5fb23BhYFvIMq/leAFZyRl6bYmGDlGc= github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= github.com/miekg/dns v1.1.58 h1:ca2Hdkz+cDg/7eNF6V56jjzuZ4aCAE+DbVkILdQWG/4= github.com/miekg/dns v1.1.58/go.mod h1:Ypv+3b/KadlvW9vJfXOTf300O4UqaHFzFCuHz+rPkBY= @@ -499,8 +447,8 @@ github.com/minio/highwayhash v1.0.2/go.mod h1:BQskDq+xkJ12lmlUUi7U0M5Swg3EWR+dLT github.com/minio/sha256-simd v0.1.1-0.20190913151208-6de447530771/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM= github.com/minio/sha256-simd v1.0.1 h1:6kaan5IFmwTNynnKKpDHe6FWHohJOHhCPchzK49dzMM= github.com/minio/sha256-simd v1.0.1/go.mod h1:Pz6AKMiUdngCLpeTL/RJY1M9rUuPMYujV5xJjtbRSN8= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/pointerstructure v1.2.1 h1:ZhBBeX8tSlRpu/FFhXH4RC4OJzFlqsQhoHZAz4x7TIw= @@ -518,7 +466,6 @@ github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9G github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 h1:RWengNIwukTxcDr9M+97sNutRR1RKhG96O6jWumTTnw= github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8= -github.com/moul/http2curl v1.0.0/go.mod h1:8UbvGypXm98wA/IqH45anm5Y2Z6ep6O31QGOAZ3H0fQ= github.com/mr-tron/base58 v1.1.2/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= github.com/mr-tron/base58 v1.2.0 h1:T/HDJBh4ZCPbU39/+c3rRvE0uKBQlU27+QI8LJ4t64o= github.com/mr-tron/base58 v1.2.0/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= @@ -548,10 +495,6 @@ github.com/multiformats/go-varint v0.0.7 h1:sWSGR+f/eu5ABZA2ZpYKBILXTTs9JWpdEM/n github.com/multiformats/go-varint v0.0.7/go.mod h1:r8PUYw/fD/SjBCiKOoDlGF6QawOELpZAu9eioSos/OU= github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= -github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= -github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= -github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= -github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= github.com/neelance/astrewrite v0.0.0-20160511093645-99348263ae86/go.mod h1:kHJEU3ofeGjhHklVoIGuVj85JJwZ6kWPaJwCIxgnFmo= github.com/neelance/sourcemap v0.0.0-20151028013722-8c68805598ab/go.mod h1:Qr6/a/Q4r9LP1IltGz7tA7iOK1WonHEYhu1HRBA7ZiM= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= @@ -562,7 +505,6 @@ github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= @@ -581,13 +523,15 @@ github.com/onsi/gomega v1.30.0/go.mod h1:9sxs+SwGrKI0+PWe4Fxa9tFQQBG5xSsSbMXOI8P github.com/opencontainers/runtime-spec v1.0.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opencontainers/runtime-spec v1.2.0 h1:z97+pHb3uELt/yiAWD691HNHQIF07bE7dzrbT927iTk= github.com/opencontainers/runtime-spec v1.2.0/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= github.com/openzipkin/zipkin-go v0.1.1/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTmOf0Erfk+hxe8= github.com/patrickmn/go-cache v2.1.0+incompatible h1:HRMgzkcYKYpi3C8ajMPV8OFXaaRUnok+kx1WdO15EQc= github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ= github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 h1:onHthvaw9LFnH4t2DcNVpwGmV9E1BkGknEliJkfwQj0= github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58/go.mod h1:DXv8WO4yhMYhSNPKjeNKa5WY9YCIEBRbNzFFPJbWO6Y= -github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= +github.com/peterh/liner v1.2.2 h1:aJ4AOodmL+JxOZZEL2u9iJf8omNRpqHc/EbrK+3mAXw= +github.com/peterh/liner v1.2.2/go.mod h1:xFwJyiKIXJZUKItq5dGHZSTBRAuG/CpeNpWLyiNRNwI= github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= @@ -609,8 +553,8 @@ github.com/prometheus/common v0.47.0/go.mod h1:0/KsvlIEfPQCQ5I2iNSAWKPZziNCvRs5E github.com/prometheus/procfs v0.0.0-20180725123919-05ee40e3a273/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo= github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo= -github.com/protolambda/bls12-381-util v0.0.0-20220416220906-d8552aa452c7 h1:cZC+usqsYgHtlBaGulVnZ1hfKAi8iWtujBnRLQE698c= -github.com/protolambda/bls12-381-util v0.0.0-20220416220906-d8552aa452c7/go.mod h1:IToEjHuttnUzwZI5KBSM/LOOW3qLbbrHOEfp3SbECGY= +github.com/protolambda/bls12-381-util v0.1.0 h1:05DU2wJN7DTU7z28+Q+zejXkIsA/MF8JZQGhtBZZiWk= +github.com/protolambda/bls12-381-util v0.1.0/go.mod h1:cdkysJTRpeFeuUVx/TXGDQNMTiRAalk1vQw3TYTHcE4= github.com/protolambda/go-keystorev4 v0.1.0 h1:mpuibfMTXPHhNIYNWFLimZ3xhpN/0YNh97jkA97Qe9Q= github.com/protolambda/go-keystorev4 v0.1.0/go.mod h1:hTa0ss9+xwKt4okVJcpZcMpO9WFur30SSFqVZIY56hk= github.com/prysmaticlabs/fastssz v0.0.0-20221107182844-78142813af44 h1:c3p3UzV4vFA7xaCDphnDWOjpxcadrQ26l5b+ypsvyxo= @@ -635,8 +579,6 @@ github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJ github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis= github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= -github.com/rogpeppe/go-internal v1.8.1/go.mod h1:JeRgkft04UBgHMgCIwADu4Pn6Mtm5d4nPKWu0nJ5d+o= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= @@ -647,8 +589,6 @@ github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/schollz/closestmatch v2.1.0+incompatible/go.mod h1:RtP1ddjLong6gTkbtmuhtR2uUrrJOpYzYRvbcPAid+g= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI= github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= @@ -678,21 +618,14 @@ github.com/shurcooL/webdavfs v0.0.0-20170829043945-18c3829fa133/go.mod h1:hKmq5k github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/sourcegraph/annotate v0.0.0-20160123013949-f4cad6c6324d/go.mod h1:UdhH50NIW0fCiwBSr0co2m7BnFLdv4fQTgdqdJTHFeE= github.com/sourcegraph/syntaxhighlight v0.0.0-20170531221838-bd320f5d308e/go.mod h1:HuIsMU8RRBOtsCgI77wP899iHVBQpCmg4ErYMZB+2IA= github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= -github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= -github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= +github.com/spkg/bom v0.0.0-20160624110644-59b7046e48ad/go.mod h1:qLr4V1qq6nMqFKkMo8ZTx3f+BZEkzsRUY10Xsm2mwU0= github.com/status-im/keycard-go v0.2.0 h1:QDLFswOQu1r5jsycloeQh3bVU8n/NatHHaZobtDnDzA= github.com/status-im/keycard-go v0.2.0/go.mod h1:wlp8ZLbsmrF6g6WjugPAx+IzoLrkdf9+mHxBEeo3Hbg= github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= @@ -703,6 +636,7 @@ github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81P github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= @@ -721,22 +655,12 @@ github.com/tyler-smith/go-bip39 v1.1.0 h1:5eUemwrMargf3BSLRRCalXT93Ns6pQJIjYQN2n github.com/tyler-smith/go-bip39 v1.1.0/go.mod h1:gUYDtqQw1JS3ZJ8UWVcGTGqqr6YIN3CWg+kkNaLt55U= github.com/uber/jaeger-client-go v2.25.0+incompatible h1:IxcNZ7WRY1Y3G4poYlx24szfsn/3LvK9QHCq9oQw8+U= github.com/uber/jaeger-client-go v2.25.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= -github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= -github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= -github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= -github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= github.com/umbracle/gohashtree v0.0.2-alpha.0.20230207094856-5b775a815c10 h1:CQh33pStIp/E30b7TxDlXfM0145bn2e8boI30IxAhTg= github.com/umbracle/gohashtree v0.0.2-alpha.0.20230207094856-5b775a815c10/go.mod h1:x/Pa0FF5Te9kdrlZKJK82YmAkvL8+f989USgz6Jiw7M= github.com/urfave/cli v1.22.2 h1:gsqYFH8bb9ekPA12kRo0hfjngWQjkJPlN9R0N78BoUo= github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/urfave/cli/v2 v2.25.7 h1:VAzn5oq403l5pHjc4OhD54+XGO9cdKVL/7lDjF+iKUs= github.com/urfave/cli/v2 v2.25.7/go.mod h1:8qnjx1vcq5s2/wpsqoZFndg2CE5tNFyrTvS6SinrnYQ= -github.com/urfave/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4= -github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= -github.com/valyala/fasthttp v1.6.0/go.mod h1:FstJa9V+Pj9vQ7OJie2qMHdwemEDaDiSdBnvPM1Su9w= -github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= -github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= -github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio= github.com/viant/assertly v0.4.8/go.mod h1:aGifi++jvCrUaklKEKT0BU95igDNaqkvz+49uaYMPRU= github.com/viant/toolbox v0.24.0/go.mod h1:OxMCG57V0PXuIP2HNQrtJf2CjqdmbrOx5EkMILuUhzM= github.com/wealdtech/go-bytesutil v1.2.1 h1:TjuRzcG5KaPwaR5JB7L/OgJqMQWvlrblA1n0GfcXFSY= @@ -745,16 +669,8 @@ github.com/wealdtech/go-eth2-types/v2 v2.8.1 h1:y2N3xSIZ3tVqsnvj4AgPkh48U5sM612v github.com/wealdtech/go-eth2-types/v2 v2.8.1/go.mod h1:3TJShI4oBzG8pCZsfe3NZAq8QAmXrC2rd45q7Vn/XB8= github.com/wealdtech/go-eth2-util v1.8.1 h1:nb50hygsNoql94akg7GN6im/weg8ZZgJWHgiyrj8qiU= github.com/wealdtech/go-eth2-util v1.8.1/go.mod h1:vv+8jVgYRXEGty/VLPNn1RYlbQNYmTht3VR6nfh0z4E= -github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= -github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= -github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= -github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU= github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8= -github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0/go.mod h1:/LWChgwKmvncFJFHJ7Gvn9wZArjbV5/FppcK2fKk/tI= -github.com/yudai/gojsondiff v1.0.0/go.mod h1:AY32+k2cwILAkW1fbgxQ5mUmMiZFgLIV+FBNExI05xg= -github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82/go.mod h1:lgjkn3NuSvDfVJdfcVVdX+jpBxNmX4rDAzaS45IcYoM= -github.com/yudai/pp v2.0.1+incompatible/go.mod h1:PuxR/8QJ7cyCkFp/aUDS+JY727OFEZkTdatxwunjIkc= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= @@ -767,6 +683,8 @@ go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= +go.opentelemetry.io/otel v1.6.3/go.mod h1:7BgNga5fNlF/iZjG06hM3yofffp0ofKCDwSXx1GC4dI= +go.opentelemetry.io/otel/trace v1.6.3/go.mod h1:GNJQusJlUgZl9/TQBPKU/Y/ty+0iVB5fjhKeJGZPGFs= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= @@ -788,23 +706,19 @@ go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= go4.org v0.0.0-20180809161055-417644f6feb5/go.mod h1:MkTOUMDaeVYJUOUsaDXIhWPZYa1yOyC1qaOBpL57BhE= golang.org/x/build v0.0.0-20190111050920-041ab4dc3f9d/go.mod h1:OWs+y06UdEOHN4y+MfF/py+xQ/tYqIWW03b70/CG9Rw= golang.org/x/crypto v0.0.0-20181030102418-4d3f4d9ffa16/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190313024323-a1f597ede03a/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191227163750-53104e6ec876/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200602180216-279210d13fed/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= -golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= +golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30= +golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -830,7 +744,6 @@ golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHl golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= @@ -840,19 +753,17 @@ golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzB golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.15.0 h1:SernR4v+D55NyBH2QiEQrlBAnj1ECL6AGrA5+dPaMY8= -golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA= +golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181029044818-c44066c5c816/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181106065722-10aee1819953/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190313220215-9f648a60d977/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190327091125-710a502c58a2/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= @@ -873,12 +784,11 @@ golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= -golang.org/x/net v0.0.0-20211008194852-3b03d305991f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211209124913-491a49abca63/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4= -golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= +golang.org/x/net v0.24.0 h1:1PcaxkF854Fu3+lvBIx5SYn9wRlBzzcnHZSiaFFAb0w= +golang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -897,15 +807,13 @@ golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= -golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= +golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180810173357-98c5dad5d1a0/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181029174526-d69651ed3497/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190316082340-a2f829d7f35f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -913,9 +821,7 @@ golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -925,7 +831,6 @@ golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -941,39 +846,37 @@ golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211117180635-dee7805ff2e1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= -golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= +golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.18.0 h1:FcHjZXDMxI8mM3nwhX9HlKop4C0YQvCVCdwYl2wOtE8= -golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= +golang.org/x/term v0.19.0 h1:+ThwsDv+tYfnJFhF4L8jITxu1tdTWRTZpdsWgEgjL6Q= +golang.org/x/term v0.19.0/go.mod h1:2CuTdWZ7KHSQwUzKva0cbMg6q2DMI3Mmxp+gKJbskEk= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= @@ -982,22 +885,18 @@ golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxb golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= -golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= +golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181030000716-a0a13e073c7b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181221001348-537d06c36207/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190327201419-c70d86f8b7cf/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= @@ -1025,10 +924,9 @@ golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjs golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.18.0 h1:k8NLag8AGHnn+PHbl7g43CtqZAwG60vZkLqgyZgIHgQ= -golang.org/x/tools v0.18.0/go.mod h1:GL7B4CwcLLeo59yx/9UWWuNOW1n3VZ4f5axWfML7Lcg= +golang.org/x/tools v0.20.0 h1:hz/CVckiOxybQvFw6h7b/q80NTr9IUQb4s1IIzW7KNY= +golang.org/x/tools v0.20.0/go.mod h1:WvitBU7JJf6A4jOdg4S1tviW9bhUxkgeCui/0JHctQg= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -1058,7 +956,6 @@ google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/genproto v0.0.0-20180518175338-11a468237815/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20181029155118-b69ba1387ce2/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= @@ -1083,14 +980,12 @@ google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfG google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= google.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= google.golang.org/genproto v0.0.0-20230711160842-782d3b101e98 h1:Z0hjGZePRE0ZBWotvtrwxFNrNE9CUAGtplaDK5NNI/g= google.golang.org/genproto v0.0.0-20230711160842-782d3b101e98/go.mod h1:S7mY02OqCJTD0E1OiQy1F72PWFB4bZJ87cAtLPYgDR0= google.golang.org/genproto/googleapis/api v0.0.0-20230711160842-782d3b101e98 h1:FmF5cCW94Ij59cfpoLiwTgodWmm60eEV0CjlsVg2fuw= google.golang.org/genproto/googleapis/api v0.0.0-20230711160842-782d3b101e98/go.mod h1:rsr7RhLuwsDKL7RmgDDCUc6yaGr1iqceVb5Wv6f6YvQ= google.golang.org/genproto/googleapis/rpc v0.0.0-20230711160842-782d3b101e98 h1:bVf09lpb+OJbByTj913DRJioFFAjf/ZGxEz7MajTp2U= google.golang.org/genproto/googleapis/rpc v0.0.0-20230711160842-782d3b101e98/go.mod h1:TUfxEVdsvPg18p6AslUXFoLdpED4oBnGwyqk3dV1XzM= -google.golang.org/grpc v1.12.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.16.0/go.mod h1:0JHn/cJsOMiMfNA9+DeHDlAU7KAAB5GDlYFpa9MZMio= google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= @@ -1098,11 +993,9 @@ google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZi google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= google.golang.org/grpc v1.58.3 h1:BjnpXut1btbtgN/6sp+brB2Kbm2LjNXnidYujAVbSoQ= google.golang.org/grpc v1.58.3/go.mod h1:tgX3ZQDlNJGU96V6yHh1T/JeoBQ2TXdr43YbYSsCJk0= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= @@ -1114,7 +1007,6 @@ google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2 google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= @@ -1127,16 +1019,12 @@ gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntN gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= -gopkg.in/go-playground/validator.v8 v8.18.2/go.mod h1:RX2a/7Ha8BgOhfk7j780h4/u/RRjR0eouCJSH80/M2Y= gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1 h1:iiHuQZCNgYPmFQxd3BBN/Nc5+dAwzZuq5y40s20oQw0= gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= -gopkg.in/ini.v1 v1.51.1/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= -gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8= -gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= +gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc= +gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= @@ -1146,7 +1034,6 @@ gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= -gopkg.in/yaml.v3 v3.0.0-20191120175047-4206685974f2/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/simulators/eth2/dencun/go.mod b/simulators/eth2/dencun/go.mod index 227071e9cc..5a348c430a 100644 --- a/simulators/eth2/dencun/go.mod +++ b/simulators/eth2/dencun/go.mod @@ -5,8 +5,8 @@ go 1.21 toolchain go1.22.0 require ( - github.com/ethereum/go-ethereum v1.13.14 - github.com/ethereum/hive v0.0.0-20240319152821-ae224371b4e5 + github.com/ethereum/go-ethereum v1.14.5 + github.com/ethereum/hive v0.0.0-20240610172825-2430a68c753a github.com/ethereum/hive/simulators/eth2/common v0.0.0-20230316220410-1364352c32a6 github.com/ethereum/hive/simulators/ethereum/engine v0.0.0-20240305231022-f69df863de20 github.com/lithammer/dedent v1.1.0 @@ -17,8 +17,8 @@ require ( ) require ( - github.com/VictoriaMetrics/fastcache v1.12.1 // indirect - github.com/cespare/xxhash/v2 v2.2.0 // indirect + github.com/VictoriaMetrics/fastcache v1.12.2 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/ferranbt/fastssz v0.1.2 // indirect github.com/go-ole/go-ole v1.3.0 // indirect github.com/go-stack/stack v1.8.1 // indirect @@ -27,11 +27,11 @@ require ( github.com/minio/sha256-simd v1.0.1 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/olekukonko/tablewriter v0.0.5 // indirect - github.com/protolambda/bls12-381-util v0.0.0-20220416220906-d8552aa452c7 // indirect + github.com/protolambda/bls12-381-util v0.1.0 // indirect github.com/shirou/gopsutil v3.21.11+incompatible // indirect github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d // indirect github.com/tklauser/go-sysconf v0.3.12 // indirect - golang.org/x/sys v0.18.0 // indirect + golang.org/x/sys v0.20.0 // indirect golang.org/x/text v0.14.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect @@ -39,31 +39,31 @@ require ( require ( github.com/DataDog/zstd v1.5.2 // indirect - github.com/Microsoft/go-winio v0.6.1 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect github.com/benbjohnson/clock v1.3.5 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/bits-and-blooms/bitset v1.10.0 // indirect github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect - github.com/cockroachdb/errors v1.9.1 // indirect + github.com/cockroachdb/errors v1.11.1 // indirect github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect - github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593 // indirect - github.com/cockroachdb/redact v1.1.3 // indirect + github.com/cockroachdb/pebble v1.1.0 // indirect + github.com/cockroachdb/redact v1.1.5 // indirect github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect github.com/consensys/bavard v0.1.13 // indirect github.com/consensys/gnark-crypto v0.12.1 // indirect github.com/containerd/cgroups v1.1.0 // indirect github.com/coreos/go-systemd/v22 v22.5.0 // indirect - github.com/crate-crypto/go-ipa v0.0.0-20231025140028-3c0104f4b233 // indirect - github.com/crate-crypto/go-kzg-4844 v0.7.0 // indirect + github.com/crate-crypto/go-ipa v0.0.0-20240223125850-b1e8a79f509c // indirect + github.com/crate-crypto/go-kzg-4844 v1.0.0 // indirect github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c // indirect - github.com/deckarep/golang-set/v2 v2.3.0 // indirect + github.com/deckarep/golang-set/v2 v2.6.0 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 // indirect github.com/docker/go-units v0.5.0 // indirect github.com/elastic/gosigar v0.14.2 // indirect - github.com/ethereum/c-kzg-4844 v0.4.0 // indirect + github.com/ethereum/c-kzg-4844 v1.0.0 // indirect + github.com/ethereum/go-verkle v0.1.1-0.20240306133620-7d920df305f0 // indirect github.com/flynn/noise v1.1.0 // indirect github.com/francoispqt/gojay v1.2.13 // indirect - github.com/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46 // indirect github.com/getsentry/sentry-go v0.20.0 // indirect github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect github.com/godbus/dbus/v5 v5.1.0 // indirect @@ -159,12 +159,12 @@ require ( go.uber.org/mock v0.4.0 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.27.0 // indirect - golang.org/x/crypto v0.21.0 // indirect + golang.org/x/crypto v0.22.0 // indirect golang.org/x/exp v0.0.0-20240213143201-ec583247a57a // indirect - golang.org/x/mod v0.15.0 // indirect - golang.org/x/net v0.21.0 // indirect - golang.org/x/sync v0.6.0 // indirect - golang.org/x/tools v0.18.0 // indirect + golang.org/x/mod v0.17.0 // indirect + golang.org/x/net v0.24.0 // indirect + golang.org/x/sync v0.7.0 // indirect + golang.org/x/tools v0.20.0 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20230711160842-782d3b101e98 // indirect google.golang.org/grpc v1.58.3 // indirect google.golang.org/protobuf v1.33.0 // indirect diff --git a/simulators/eth2/dencun/go.sum b/simulators/eth2/dencun/go.sum index 3fb69f914b..3b9db30b20 100644 --- a/simulators/eth2/dencun/go.sum +++ b/simulators/eth2/dencun/go.sum @@ -30,7 +30,6 @@ dmitri.shuralyov.com/html/belt v0.0.0-20180602232347-f7d459c86be0/go.mod h1:JLBr dmitri.shuralyov.com/service/change v0.0.0-20181023043359-a85b471d5412/go.mod h1:a1inKt/atXimZ4Mv927x+r7UpyzRUf4emIoiiSC2TN4= dmitri.shuralyov.com/state v0.0.0-20180228185332-28bcc343414c/go.mod h1:0PRwlb0D6DFvNNtx+9ybjezNCa8XF0xaYcETyp6rHWU= git.apache.org/thrift.git v0.0.0-20180902110319-2566ecd5d999/go.mod h1:fPE2ZNJGynbRyZ4dJvy6G277gSllfV2HJqblrnkyeyg= -github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= github.com/Azure/go-autorest/autorest v0.11.18/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= github.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= @@ -42,27 +41,20 @@ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03 github.com/BurntSushi/toml v1.3.2 h1:o7IhLm0Msx3BaB+n3Ag7L8EVlByGnpq14C4YWiu/gL8= github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/CloudyKit/fastprinter v0.0.0-20200109182630-33d98a066a53/go.mod h1:+3IMCy2vIlbG1XG/0ggNQv0SvxCAIpPM5b1nCz56Xno= -github.com/CloudyKit/jet/v3 v3.0.0/go.mod h1:HKQPgSJmdK8hdoAbKUUWajkHyHo4RaU5rMdUywE7VMo= github.com/DataDog/zstd v1.5.2 h1:vUG4lAyuPCXO0TLbXvPv7EB7cNK1QV/luu55UHLrrn8= github.com/DataDog/zstd v1.5.2/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= -github.com/Joker/hpp v1.0.0/go.mod h1:8x5n+M1Hp5hC0g8okX3sR3vFQwynaX/UgSOM9MeBKzY= -github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= -github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/Shopify/goreferrer v0.0.0-20181106222321-ec9c9a553398/go.mod h1:a1uqRtAwp2Xwc6WNPJEufxJ7fx3npB4UV/JOLmbu5I0= -github.com/VictoriaMetrics/fastcache v1.12.1 h1:i0mICQuojGDL3KblA7wUNlY5lOK6a4bwt3uRKnkZU40= -github.com/VictoriaMetrics/fastcache v1.12.1/go.mod h1:tX04vaqcNoQeGLD+ra5pU5sWkuxnzWhEzLwhP9w653o= -github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY= +github.com/VictoriaMetrics/fastcache v1.12.2 h1:N0y9ASrJ0F6h0QaC3o6uJb3NIZ9VKLjCM7NQbSmF7WI= +github.com/VictoriaMetrics/fastcache v1.12.2/go.mod h1:AmC+Nzz1+3G2eCPapF6UcsnkThDcMsQicp4xDukwJYI= github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= github.com/allegro/bigcache v1.2.1 h1:hg1sY1raCwic3Vnsvje6TT7/pnZba83LeFck5NrFKSc= github.com/allegro/bigcache v1.2.1/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= -github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= -github.com/aymerick/raymond v2.0.3-0.20180322193309-b565731e1464+incompatible/go.mod h1:osfaiScAUVup+UC9Nfq76eWqDhXlp+4UYaA8uhTBO6g= github.com/bazelbuild/rules_go v0.23.2 h1:Wxu7JjqnF78cKZbsBsARLSXx/jlGaSLCnUV3mTlyHvM= github.com/bazelbuild/rules_go v0.23.2/go.mod h1:MC23Dc/wkXEyk3Wpq6lCqz0ZAYOZDw2DR5y3N1q2i7M= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= @@ -81,29 +73,26 @@ github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOF github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= github.com/buger/jsonparser v0.0.0-20181115193947-bf1c66bbce23/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/cilium/ebpf v0.2.0/go.mod h1:To2CFviqOWL/M0gIMsvSMlqe7em/l1ALkX1PyjrX2Qs= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cockroachdb/datadriven v1.0.2/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f h1:otljaYPt5hWxV3MUfO5dFPFiOXg9CyG5/kCfayTqsJ4= github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= -github.com/cockroachdb/errors v1.9.1 h1:yFVvsI0VxmRShfawbt/laCIDy/mtTqqnvoNgiy5bEV8= -github.com/cockroachdb/errors v1.9.1/go.mod h1:2sxOtL2WIc096WSZqZ5h8fa17rdDq9HZOZLBCor4mBk= -github.com/cockroachdb/logtags v0.0.0-20211118104740-dabe8e521a4f/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= +github.com/cockroachdb/errors v1.11.1 h1:xSEW75zKaKCWzR3OfxXUxgrk/NtT4G1MiOv5lWZazG8= +github.com/cockroachdb/errors v1.11.1/go.mod h1:8MUxA3Gi6b25tYlFEBGLf+D8aISL+M4MIpiWMSNRfxw= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= -github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593 h1:aPEJyR4rPBvDmeyi+l/FS/VtA00IWvjeFvjen1m1l1A= -github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593/go.mod h1:6hk1eMY/u5t+Cf18q5lFMUA1Rc+Sm5I6Ra1QuPyxXCo= -github.com/cockroachdb/redact v1.1.3 h1:AKZds10rFSIj7qADf0g46UixK8NNLwWTNdCIGS5wfSQ= -github.com/cockroachdb/redact v1.1.3/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= +github.com/cockroachdb/pebble v1.1.0 h1:pcFh8CdCIt2kmEpK0OIatq67Ln9uGDYY3d5XnE0LJG4= +github.com/cockroachdb/pebble v1.1.0/go.mod h1:sEHm5NOXxyiAoKWhoFxT8xMgd/f3RA6qUqQ1BXKrh2E= +github.com/cockroachdb/redact v1.1.5 h1:u1PMllDkdFfPWaNGMyLD1+so+aq3uUItthCFqzwPJ30= +github.com/cockroachdb/redact v1.1.5/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo= github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ= -github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0/go.mod h1:4Zcjuz89kmFXt9morQgcfYZAYZ5n8WHjt81YYWIwtTM= github.com/consensys/bavard v0.1.13 h1:oLhMLOFGTLdlda/kma4VOJazblc7IM5y5QPd2A/YjhQ= github.com/consensys/bavard v0.1.13/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI= github.com/consensys/gnark-crypto v0.12.1 h1:lHH39WuuFgVHONRl3J0LRBtuYdQTumFSDtJF7HpyG8M= @@ -111,23 +100,18 @@ github.com/consensys/gnark-crypto v0.12.1/go.mod h1:v2Gy7L/4ZRosZ7Ivs+9SfUDr0f5U github.com/containerd/cgroups v0.0.0-20201119153540-4cbc285b3327/go.mod h1:ZJeTFisyysqgcCdecO57Dj79RfL0LNeGiFUqLYQRYLE= github.com/containerd/cgroups v1.1.0 h1:v8rEWFl6EoqHB+swVNjVoCJE8o3jX7e8nqBGPLaDFBM= github.com/containerd/cgroups v1.1.0/go.mod h1:6ppBcbh/NOOUU+dMKrykgaBnK9lCIBxHqJDGwsa1mIw= -github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= -github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-systemd v0.0.0-20181012123002-c6f51f82210d/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd/v22 v22.1.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs= github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/cpuguy83/go-md2man v1.0.10 h1:BSKMNlYxDvnunlTymqtgONjNnaRV1sTpcovwwjF22jk= -github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/crate-crypto/go-ipa v0.0.0-20231025140028-3c0104f4b233 h1:d28BXYi+wUpz1KBmiF9bWrjEMacUEREV6MBi2ODnrfQ= -github.com/crate-crypto/go-ipa v0.0.0-20231025140028-3c0104f4b233/go.mod h1:geZJZH3SzKCqnz5VT0q/DyIG/tvu/dZk+VIfXicupJs= -github.com/crate-crypto/go-kzg-4844 v0.7.0 h1:C0vgZRk4q4EZ/JgPfzuSoxdCq3C3mOZMBShovmncxvA= -github.com/crate-crypto/go-kzg-4844 v0.7.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= +github.com/crate-crypto/go-ipa v0.0.0-20240223125850-b1e8a79f509c h1:uQYC5Z1mdLRPrZhHjHxufI8+2UG/i25QG92j0Er9p6I= +github.com/crate-crypto/go-ipa v0.0.0-20240223125850-b1e8a79f509c/go.mod h1:geZJZH3SzKCqnz5VT0q/DyIG/tvu/dZk+VIfXicupJs= +github.com/crate-crypto/go-kzg-4844 v1.0.0 h1:TsSgHwrkTKecKJ4kadtHi4b3xHW5dCFUDFnUp1TsawI= +github.com/crate-crypto/go-kzg-4844 v1.0.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/d4l3k/messagediff v1.2.1 h1:ZcAIMYsUg0EAp9X+tt8/enBE/Q8Yd5kzPynLyKptt9U= github.com/d4l3k/messagediff v1.2.1/go.mod h1:Oozbb1TVXFac9FtSIxHBMnBCq2qeH/2KkEQxENCrlLo= @@ -136,43 +120,37 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c h1:pFUpOrbxDR6AkioZ1ySsx5yxlDQZ8stG2b88gTPxgJU= github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c/go.mod h1:6UhI8N9EjYm1c2odKpFpAYeR8dsBeM7PtzQhRgxRr9U= -github.com/deckarep/golang-set/v2 v2.3.0 h1:qs18EKUfHm2X9fA50Mr/M5hccg2tNnVqsiBImnyDs0g= -github.com/deckarep/golang-set/v2 v2.3.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= +github.com/deckarep/golang-set/v2 v2.6.0 h1:XfcQbWM1LlMB8BsJ8N9vW5ehnnPVIw0je80NsVHagjM= +github.com/deckarep/golang-set/v2 v2.6.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= github.com/decred/dcrd/crypto/blake256 v1.0.1 h1:7PltbUIQB7u/FfZ39+DGa/ShuMyJ5ilcvdfma9wOH6Y= github.com/decred/dcrd/crypto/blake256 v1.0.1/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 h1:8UrgZ3GkP4i/CLijOJx79Yu+etlyjdBU4sfcs2WYQMs= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0= -github.com/dgraph-io/badger v1.6.0/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6psNgSztDR4= -github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385/go.mod h1:0vRUJqYpeSZifjYj7uP3BG/gKcuzL9xWVV/Y+cK33KM= github.com/elastic/gosigar v0.12.0/go.mod h1:iXRIGg2tLnu7LBdpqzyQfGDEidKCfWcCMS0WKyPWoMs= github.com/elastic/gosigar v0.14.2 h1:Dg80n8cr90OZ7x+bAax/QjoW/XqTI11RmA79ZwIm9/4= github.com/elastic/gosigar v0.14.2/go.mod h1:iXRIGg2tLnu7LBdpqzyQfGDEidKCfWcCMS0WKyPWoMs= github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/etcd-io/bbolt v1.3.3/go.mod h1:ZF2nL25h33cCyBtcyWeZ2/I3HQOfTP+0PIEvHjkjCrw= -github.com/ethereum/c-kzg-4844 v0.4.0 h1:3MS1s4JtA868KpJxroZoepdV0ZKBp3u/O5HcZ7R3nlY= -github.com/ethereum/c-kzg-4844 v0.4.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= -github.com/ethereum/go-ethereum v1.13.14 h1:EwiY3FZP94derMCIam1iW4HFVrSgIcpsu0HwTQtm6CQ= -github.com/ethereum/go-ethereum v1.13.14/go.mod h1:TN8ZiHrdJwSe8Cb6x+p0hs5CxhJZPbqB7hHkaUXcmIU= -github.com/ethereum/hive v0.0.0-20240319152821-ae224371b4e5 h1:2Rc3v1mqWgUl8gSHFh7+FmVcyB1AI/9THxhEDjNK+PI= -github.com/ethereum/hive v0.0.0-20240319152821-ae224371b4e5/go.mod h1:MGwUXPGco6YS3brOf5WEILfUnnUL/XuX1224ab3D7XA= +github.com/ethereum/c-kzg-4844 v1.0.0 h1:0X1LBXxaEtYD9xsyj9B9ctQEZIpnvVDeoBx8aHEwTNA= +github.com/ethereum/c-kzg-4844 v1.0.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= +github.com/ethereum/go-ethereum v1.14.5 h1:szuFzO1MhJmweXjoM5nSAeDvjNUH3vIQoMzzQnfvjpw= +github.com/ethereum/go-ethereum v1.14.5/go.mod h1:VEDGGhSxY7IEjn98hJRFXl/uFvpRgbIIf2PpXiyGGgc= +github.com/ethereum/go-verkle v0.1.1-0.20240306133620-7d920df305f0 h1:KrE8I4reeVvf7C1tm8elRjj4BdscTYzz/WAbYyf/JI4= +github.com/ethereum/go-verkle v0.1.1-0.20240306133620-7d920df305f0/go.mod h1:D9AJLVXSyZQXJQVk8oh1EwjISE+sJTn2duYIZC0dy3w= +github.com/ethereum/hive v0.0.0-20240610172825-2430a68c753a h1:iyHHRPXaxHtEvyFxc4A+is/JRt88o0gQhHrNx+khEqQ= +github.com/ethereum/hive v0.0.0-20240610172825-2430a68c753a/go.mod h1:ghNXZW+/WQClcyiwZpbTzUCyxwql7YeMacYd44v+BJE= github.com/ethereum/hive/simulators/eth2/common v0.0.0-20230316220410-1364352c32a6 h1:LcSUNGwQuJyR/gdPcsif57yKX+3MyhpoAuChzR8k6Yk= github.com/ethereum/hive/simulators/eth2/common v0.0.0-20230316220410-1364352c32a6/go.mod h1:FX4oxNyTNw/P+TUWrb7vva7o/rFI0pHO7OYdtG6EtN4= github.com/ethereum/hive/simulators/ethereum/engine v0.0.0-20240305231022-f69df863de20 h1:Bf9mev5lvesQIIpJtzO+vnGQ3Jv3NuLa2buY2+2pQzg= github.com/ethereum/hive/simulators/ethereum/engine v0.0.0-20240305231022-f69df863de20/go.mod h1:nag0wj4K1/0AEP1VAKwY08N4I9yymrwXsX4+n0YFfdw= github.com/evanphx/json-patch v4.11.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072/go.mod h1:duJ4Jxv5lDcvg4QuQr0oowTf7dz4/CR8NtyCooz9HL8= -github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= github.com/ferranbt/fastssz v0.1.2 h1:Dky6dXlngF6Qjc+EfDipAkE83N5I5DE68bY6O0VLNPk= github.com/ferranbt/fastssz v0.1.2/go.mod h1:X5UPrE2u1UJjxHA8X54u04SBwdAQjG2sFtWs39YxyWs= github.com/fjl/memsize v0.0.2 h1:27txuSD9or+NZlnOWdKUxeBzTAUkWCVh+4Gf2dWFOzA= @@ -189,19 +167,12 @@ github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4 github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= -github.com/gavv/httpexpect v2.0.0+incompatible/go.mod h1:x+9tiU1YnrOvnB725RkpoLv1M62hOWzwo5OXotisrKc= github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08 h1:f6D9Hr8xV8uYKlyuj8XIruxlh9WjVjdh1gIicAS7ays= github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= -github.com/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46 h1:BAIP2GihuqhwdILrV+7GJel5lyPV3u1+PgzrWLc0TkE= -github.com/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46/go.mod h1:QNpY22eby74jVhqH4WhDLDwxc/vqsern6pW+u2kbkpc= -github.com/getsentry/sentry-go v0.12.0/go.mod h1:NSap0JBYWzHND8oMbyi0+XZhUalc1TBdRL1M71JZW2c= github.com/getsentry/sentry-go v0.20.0 h1:bwXW98iMRIWxn+4FgPW7vMrjmbym6HblXALmhjHmQaQ= github.com/getsentry/sentry-go v0.20.0/go.mod h1:lc76E2QywIyW8WuBnwl8Lc4bkmQH4+w1gwTf25trprY= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3/go.mod h1:VJ0WA2NBN22VlZ2dKZQPAPnyWw5XTlK1KymzLKsr59s= -github.com/gin-gonic/gin v1.4.0/go.mod h1:OW2EZn3DO8Ln9oIKOvM++LBO+5UPHJJDH72/q/3rZdM= github.com/gliderlabs/ssh v0.1.1/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= -github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= @@ -212,7 +183,6 @@ github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7 github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= github.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY= github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= -github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab/go.mod h1:/P9AEU963A2AYjv4d1V5eVL1CQbEJq6aCNHDDjibzu8= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= @@ -224,24 +194,16 @@ github.com/go-stack/stack v1.8.1/go.mod h1:dcoOX6HbPZSZptuspn9bctJ+N/CnF5gGygcUP github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= -github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= -github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= -github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk= github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= -github.com/gogo/googleapis v0.0.0-20180223154316-0cd9801be74a/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= -github.com/gogo/googleapis v1.4.1/go.mod h1:2lpHqI5OcWCtVElxXnPt+s8oJvMpySlOyM6xDCrzib4= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/gogo/status v1.1.0/go.mod h1:BFv9nrluPLmrS0EmGVvLaPNmRosr9KapBYd5/hpY1WM= -github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= @@ -270,12 +232,11 @@ github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QD github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= -github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXiurYmW7fx4GZkL8feAMVq7nEjURHk= github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/gomodule/redigo v1.7.1-0.20190724094224-574c33c3df38/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= @@ -283,7 +244,6 @@ github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5a github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= @@ -320,7 +280,6 @@ github.com/googleapis/gnostic v0.5.5/go.mod h1:7+EbHbldMins07ALC74bsA81Ovc97Dwqy github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= -github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.5.1 h1:gmztn0JnHVt9JZquRuzLw3g4wouNVzKL15iLr/zn/QY= github.com/gorilla/websocket v1.5.1/go.mod h1:x3kM2JMyaluk02fnUJpQuwD2dCS5NDG2ZHL0uE0tcaY= @@ -331,14 +290,12 @@ github.com/grpc-ecosystem/grpc-gateway/v2 v2.0.1 h1:X2vfSnm1WC8HEo0MBHZg2TcuDUHJ github.com/grpc-ecosystem/grpc-gateway/v2 v2.0.1/go.mod h1:oVMjMN64nzEcepv1kdZKgx1qNYt4Ro0Gqefiq2JWdis= github.com/hashicorp/go-bexpr v0.1.11 h1:6DqdA/KBjurGby9yTY0bmkathya0lfwF2SeuubCI7dY= github.com/hashicorp/go-bexpr v0.1.11/go.mod h1:f03lAo0duBlDIUMGCuad8oLcgejw4m7U+N8T+6Kz1AE= -github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d h1:dg1dEPuWpEqDnvIw251EVy4zlP8gWbsGj4BsUKCRpYs= github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/golang-lru/v2 v2.0.5 h1:wW7h1TG88eUIJ2i69gaE3uNVtEPIagzhGvHgwfx2Vm4= github.com/hashicorp/golang-lru/v2 v2.0.5/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= -github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/herumi/bls-eth-go-binary v1.28.1 h1:fcIZ48y5EE9973k05XjE8+P3YiQgjZz4JI/YabAm8KA= github.com/herumi/bls-eth-go-binary v1.28.1/go.mod h1:luAnRm3OsMQeokhGzpYmc0ZKwawY7o87PUEP11Z7r7U= github.com/holiman/billy v0.0.0-20240216141850-2abb0c79d3c4 h1:X4egAf/gcS1zATw6wn4Ej8vjuVGxeHdan+bRb2ebyv4= @@ -351,52 +308,33 @@ github.com/holiman/uint256 v1.2.4/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXei github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/huin/goupnp v1.3.0 h1:UvLUlWDNpoUdYzb2TCn+MuTWtcjXKSza2n6CBdQ0xXc= github.com/huin/goupnp v1.3.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8= -github.com/hydrogen18/memlistener v0.0.0-20200120041712-dcc25e7acd91/go.mod h1:qEIFzExnS6016fRpRfxrExeVn2gbClQA99gQhnIcdhE= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/imkira/go-interpol v1.1.0/go.mod h1:z0h2/2T3XF8kyEPpRgJ3kmNv+C43p+I/CoI+jC3w2iA= -github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/ipfs/go-cid v0.4.1 h1:A/T3qGvxi4kpKWWcPC/PgbvDA2bjVLO7n4UeVwnbs/s= github.com/ipfs/go-cid v0.4.1/go.mod h1:uQHwDeX4c6CtyrFwdqyhpNcxVewur1M7l7fNU7LKwZk= github.com/ipfs/go-log/v2 v2.5.1 h1:1XdUzF7048prq4aBjDQQ4SL5RxftpRGdXhNRwKSAlcY= github.com/ipfs/go-log/v2 v2.5.1/go.mod h1:prSpmC1Gpllc9UYWxDiZDreBYw7zp4Iqp1kOLU9U5UI= -github.com/iris-contrib/blackfriday v2.0.0+incompatible/go.mod h1:UzZ2bDEoaSGPbkg6SAB4att1aAwTmVIx/5gCVqeyUdI= -github.com/iris-contrib/go.uuid v2.0.0+incompatible/go.mod h1:iz2lgM/1UnEf1kP0L/+fafWORmlnuysV2EMP8MW+qe0= -github.com/iris-contrib/jade v1.1.3/go.mod h1:H/geBymxJhShH5kecoiOCSssPX7QWYH7UaeZTSWddIk= -github.com/iris-contrib/pongo2 v0.0.1/go.mod h1:Ssh+00+3GAZqSQb30AvBRNxBx7rf0GqwkjqxNd0u65g= -github.com/iris-contrib/schema v0.0.1/go.mod h1:urYA3uvUNG1TIIjOSCzHr9/LmbQo8LrOcOqfqxa4hXw= github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= github.com/jbenet/go-temp-err-catcher v0.1.0 h1:zpb3ZH6wIE8Shj2sKS+khgRvf7T7RABoLk/+KKHggpk= github.com/jbenet/go-temp-err-catcher v0.1.0/go.mod h1:0kJRvmDZXNMIiJirNPEYfhpPwbGVtZVWC34vc5WLsDk= github.com/jellevandenhooff/dkim v0.0.0-20150330215556-f50fe3d243e1/go.mod h1:E0B/fFc00Y+Rasa88328GlI/XbtyysCtTHZS8h7IrBU= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= -github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.3.0 h1:U0609e9tgbseu3rBINet9P48AI/D3oJs4dN7jwJOQ1U= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= -github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88/go.mod h1:3w7q1U84EfirKl04SVQ/s7nPm1ZPhiXd34z40TNz36k= -github.com/kataras/golog v0.0.10/go.mod h1:yJ8YKCmyL+nWjERB90Qwn+bdyBZsaQwU3bTVFgkFIp8= -github.com/kataras/iris/v12 v12.1.8/go.mod h1:LMYy4VlP67TQ3Zgriz8RE2h2kMZV2SgMYbq3UhfoFmE= -github.com/kataras/neffos v0.0.14/go.mod h1:8lqADm8PnbeFfL7CLXh1WHw53dG27MC3pgi2R1rmoTE= -github.com/kataras/pio v0.0.2/go.mod h1:hAoW0t9UmXi4R5Oyq5Z4irTbaTsOemSrDGUtaTl7Dro= -github.com/kataras/sitemap v0.0.5/go.mod h1:KY2eugMKiPwsJgx7+U103YZehfvNGOXURubcGyk0Bz8= github.com/kilic/bls12-381 v0.1.0 h1:encrdjqKMEvabVQ7qYOKu1OvhqpK4s47wDYtNiPtlp4= github.com/kilic/bls12-381 v0.1.0/go.mod h1:vDTTHJONJ6G+P2R74EhnyotQDTliQDnFEwhdmfzw1ig= github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.8.2/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= -github.com/klauspost/compress v1.9.7/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= github.com/klauspost/compress v1.17.6 h1:60eq2E/jlfwQXtvZEeBUYADs+BwKBWURIY+Gj2eRGjI= github.com/klauspost/compress v1.17.6/go.mod h1:/dCuZOvVtNoHsyb+cuJD3itjs3NbnF6KH9zAO4BDxPM= -github.com/klauspost/cpuid v1.2.1/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= github.com/klauspost/cpuid/v2 v2.2.7 h1:ZWSB3igEs+d0qvnxR/ZBzXVmxkgt8DdzP6m9pfuVLDM= github.com/klauspost/cpuid/v2 v2.2.7/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= github.com/koron/go-ssdp v0.0.4 h1:1IDwrghSKYM7yLf7XCzbByg2sJ/JcNOZRXS2jczTwz0= @@ -404,7 +342,6 @@ github.com/koron/go-ssdp v0.0.4/go.mod h1:oDXq+E5IL5q0U8uSBcoAXzTzInwy5lEgC91HoK github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= @@ -414,8 +351,6 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/labstack/echo/v4 v4.5.0/go.mod h1:czIriw4a0C1dFun+ObrXp7ok03xON0N1awStJ6ArI7Y= -github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c= github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= github.com/libp2p/go-buffer-pool v0.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6cdF0Y8= @@ -447,7 +382,6 @@ github.com/libp2p/go-yamux/v4 v4.0.1/go.mod h1:NWjl8ZTLOGlozrXSOZ/HlfG++39iKNnM5 github.com/lithammer/dedent v1.1.0 h1:VNzHMVCBNG1j0fh3OrsFRkVUwStdDArbgBWoPAffktY= github.com/lithammer/dedent v1.1.0/go.mod h1:jrXYCQtgg0nJiN+StA2KgR7w6CiQNv9Fd/Z9BP0jIOc= github.com/lunixbochs/vtclean v1.0.0/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI= -github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= @@ -465,15 +399,8 @@ github.com/marioevz/ztyp v0.0.0-20231106221254-dd6f24f13fd9 h1:e40k7kQLw2jyDg4+M github.com/marioevz/ztyp v0.0.0-20231106221254-dd6f24f13fd9/go.mod h1:9bYgKGqg3wJqT9ac1gI2hnVb0STQq7p/1lapqrqY1dU= github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd h1:br0buuQ854V8u83wA0rVZ8ttrq5CpaPZdvrK0LP2lOk= github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd/go.mod h1:QuCEs1Nt24+FYQEqAAncTDPJIuGs+LxK1MCiFL25pMU= -github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.11/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= -github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= -github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= @@ -481,11 +408,8 @@ github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.14 h1:+xnbZSEeDbOIg5/mE6JF0w6n9duR1l3/WmbinWVwUuU= github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= -github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/mediocregopher/radix/v3 v3.4.2/go.mod h1:8FL3F6UQRXHXIBSPUs5h0RybMF8i4n7wVopoX3x7Bv8= github.com/microcosm-cc/bluemonday v1.0.1/go.mod h1:hsXNsILzKxV+sX77C5b8FSuKF00vh2OMYv+xgHpAMF4= -github.com/microcosm-cc/bluemonday v1.0.2/go.mod h1:iVP4YcDBq+n/5fb23BhYFvIMq/leAFZyRl6bYmGDlGc= github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= github.com/miekg/dns v1.1.58 h1:ca2Hdkz+cDg/7eNF6V56jjzuZ4aCAE+DbVkILdQWG/4= github.com/miekg/dns v1.1.58/go.mod h1:Ypv+3b/KadlvW9vJfXOTf300O4UqaHFzFCuHz+rPkBY= @@ -501,7 +425,6 @@ github.com/minio/highwayhash v1.0.2/go.mod h1:BQskDq+xkJ12lmlUUi7U0M5Swg3EWR+dLT github.com/minio/sha256-simd v0.1.1-0.20190913151208-6de447530771/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM= github.com/minio/sha256-simd v1.0.1 h1:6kaan5IFmwTNynnKKpDHe6FWHohJOHhCPchzK49dzMM= github.com/minio/sha256-simd v1.0.1/go.mod h1:Pz6AKMiUdngCLpeTL/RJY1M9rUuPMYujV5xJjtbRSN8= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= @@ -520,7 +443,6 @@ github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9G github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 h1:RWengNIwukTxcDr9M+97sNutRR1RKhG96O6jWumTTnw= github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8= -github.com/moul/http2curl v1.0.0/go.mod h1:8UbvGypXm98wA/IqH45anm5Y2Z6ep6O31QGOAZ3H0fQ= github.com/mr-tron/base58 v1.1.2/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= github.com/mr-tron/base58 v1.2.0 h1:T/HDJBh4ZCPbU39/+c3rRvE0uKBQlU27+QI8LJ4t64o= github.com/mr-tron/base58 v1.2.0/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= @@ -550,10 +472,6 @@ github.com/multiformats/go-varint v0.0.7 h1:sWSGR+f/eu5ABZA2ZpYKBILXTTs9JWpdEM/n github.com/multiformats/go-varint v0.0.7/go.mod h1:r8PUYw/fD/SjBCiKOoDlGF6QawOELpZAu9eioSos/OU= github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= -github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= -github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= -github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= -github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= github.com/neelance/astrewrite v0.0.0-20160511093645-99348263ae86/go.mod h1:kHJEU3ofeGjhHklVoIGuVj85JJwZ6kWPaJwCIxgnFmo= github.com/neelance/sourcemap v0.0.0-20151028013722-8c68805598ab/go.mod h1:Qr6/a/Q4r9LP1IltGz7tA7iOK1WonHEYhu1HRBA7ZiM= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= @@ -564,7 +482,6 @@ github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= @@ -588,7 +505,6 @@ github.com/patrickmn/go-cache v2.1.0+incompatible h1:HRMgzkcYKYpi3C8ajMPV8OFXaaR github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ= github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 h1:onHthvaw9LFnH4t2DcNVpwGmV9E1BkGknEliJkfwQj0= github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58/go.mod h1:DXv8WO4yhMYhSNPKjeNKa5WY9YCIEBRbNzFFPJbWO6Y= -github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= @@ -611,8 +527,8 @@ github.com/prometheus/common v0.47.0/go.mod h1:0/KsvlIEfPQCQ5I2iNSAWKPZziNCvRs5E github.com/prometheus/procfs v0.0.0-20180725123919-05ee40e3a273/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo= github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo= -github.com/protolambda/bls12-381-util v0.0.0-20220416220906-d8552aa452c7 h1:cZC+usqsYgHtlBaGulVnZ1hfKAi8iWtujBnRLQE698c= -github.com/protolambda/bls12-381-util v0.0.0-20220416220906-d8552aa452c7/go.mod h1:IToEjHuttnUzwZI5KBSM/LOOW3qLbbrHOEfp3SbECGY= +github.com/protolambda/bls12-381-util v0.1.0 h1:05DU2wJN7DTU7z28+Q+zejXkIsA/MF8JZQGhtBZZiWk= +github.com/protolambda/bls12-381-util v0.1.0/go.mod h1:cdkysJTRpeFeuUVx/TXGDQNMTiRAalk1vQw3TYTHcE4= github.com/protolambda/go-keystorev4 v0.1.0 h1:mpuibfMTXPHhNIYNWFLimZ3xhpN/0YNh97jkA97Qe9Q= github.com/protolambda/go-keystorev4 v0.1.0/go.mod h1:hTa0ss9+xwKt4okVJcpZcMpO9WFur30SSFqVZIY56hk= github.com/prysmaticlabs/fastssz v0.0.0-20221107182844-78142813af44 h1:c3p3UzV4vFA7xaCDphnDWOjpxcadrQ26l5b+ypsvyxo= @@ -637,8 +553,6 @@ github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJ github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis= github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= -github.com/rogpeppe/go-internal v1.8.1/go.mod h1:JeRgkft04UBgHMgCIwADu4Pn6Mtm5d4nPKWu0nJ5d+o= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= @@ -649,8 +563,6 @@ github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/schollz/closestmatch v2.1.0+incompatible/go.mod h1:RtP1ddjLong6gTkbtmuhtR2uUrrJOpYzYRvbcPAid+g= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI= github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= @@ -680,21 +592,13 @@ github.com/shurcooL/webdavfs v0.0.0-20170829043945-18c3829fa133/go.mod h1:hKmq5k github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/sourcegraph/annotate v0.0.0-20160123013949-f4cad6c6324d/go.mod h1:UdhH50NIW0fCiwBSr0co2m7BnFLdv4fQTgdqdJTHFeE= github.com/sourcegraph/syntaxhighlight v0.0.0-20170531221838-bd320f5d308e/go.mod h1:HuIsMU8RRBOtsCgI77wP899iHVBQpCmg4ErYMZB+2IA= github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= -github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= -github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= github.com/status-im/keycard-go v0.2.0 h1:QDLFswOQu1r5jsycloeQh3bVU8n/NatHHaZobtDnDzA= github.com/status-im/keycard-go v0.2.0/go.mod h1:wlp8ZLbsmrF6g6WjugPAx+IzoLrkdf9+mHxBEeo3Hbg= github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= @@ -723,20 +627,10 @@ github.com/tyler-smith/go-bip39 v1.1.0 h1:5eUemwrMargf3BSLRRCalXT93Ns6pQJIjYQN2n github.com/tyler-smith/go-bip39 v1.1.0/go.mod h1:gUYDtqQw1JS3ZJ8UWVcGTGqqr6YIN3CWg+kkNaLt55U= github.com/uber/jaeger-client-go v2.25.0+incompatible h1:IxcNZ7WRY1Y3G4poYlx24szfsn/3LvK9QHCq9oQw8+U= github.com/uber/jaeger-client-go v2.25.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= -github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= -github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= -github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= -github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= github.com/urfave/cli v1.22.2 h1:gsqYFH8bb9ekPA12kRo0hfjngWQjkJPlN9R0N78BoUo= github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/urfave/cli/v2 v2.25.7 h1:VAzn5oq403l5pHjc4OhD54+XGO9cdKVL/7lDjF+iKUs= github.com/urfave/cli/v2 v2.25.7/go.mod h1:8qnjx1vcq5s2/wpsqoZFndg2CE5tNFyrTvS6SinrnYQ= -github.com/urfave/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4= -github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= -github.com/valyala/fasthttp v1.6.0/go.mod h1:FstJa9V+Pj9vQ7OJie2qMHdwemEDaDiSdBnvPM1Su9w= -github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= -github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= -github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio= github.com/viant/assertly v0.4.8/go.mod h1:aGifi++jvCrUaklKEKT0BU95igDNaqkvz+49uaYMPRU= github.com/viant/toolbox v0.24.0/go.mod h1:OxMCG57V0PXuIP2HNQrtJf2CjqdmbrOx5EkMILuUhzM= github.com/wealdtech/go-bytesutil v1.2.0 h1:GEIzvAZEIgqOoRfnEAaMRNL73gl8e+YlQzqxhFyR30Y= @@ -745,16 +639,8 @@ github.com/wealdtech/go-eth2-types/v2 v2.8.0 h1:Cts9J78ryXVp8jwotdSSVU75S+QWJrgV github.com/wealdtech/go-eth2-types/v2 v2.8.0/go.mod h1:tJazo9o28kdQs3V/U4VafQ4neG+/sL3OBozQ8J3CWmo= github.com/wealdtech/go-eth2-util v1.8.0 h1:hhs3h2y3Ldty18lppFdpe46nZpdDAMbY7QqiHO5BvE0= github.com/wealdtech/go-eth2-util v1.8.0/go.mod h1:rSuE0v5zX+uyZrqW/iUmXOxeDpB7lTvhcZvAVh0KlMU= -github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= -github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= -github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= -github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU= github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8= -github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0/go.mod h1:/LWChgwKmvncFJFHJ7Gvn9wZArjbV5/FppcK2fKk/tI= -github.com/yudai/gojsondiff v1.0.0/go.mod h1:AY32+k2cwILAkW1fbgxQ5mUmMiZFgLIV+FBNExI05xg= -github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82/go.mod h1:lgjkn3NuSvDfVJdfcVVdX+jpBxNmX4rDAzaS45IcYoM= -github.com/yudai/pp v2.0.1+incompatible/go.mod h1:PuxR/8QJ7cyCkFp/aUDS+JY727OFEZkTdatxwunjIkc= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= @@ -788,23 +674,19 @@ go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= go4.org v0.0.0-20180809161055-417644f6feb5/go.mod h1:MkTOUMDaeVYJUOUsaDXIhWPZYa1yOyC1qaOBpL57BhE= golang.org/x/build v0.0.0-20190111050920-041ab4dc3f9d/go.mod h1:OWs+y06UdEOHN4y+MfF/py+xQ/tYqIWW03b70/CG9Rw= golang.org/x/crypto v0.0.0-20181030102418-4d3f4d9ffa16/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190313024323-a1f597ede03a/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191227163750-53104e6ec876/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200602180216-279210d13fed/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= -golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= +golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30= +golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -830,7 +712,6 @@ golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHl golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= @@ -840,19 +721,17 @@ golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzB golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.15.0 h1:SernR4v+D55NyBH2QiEQrlBAnj1ECL6AGrA5+dPaMY8= -golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA= +golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181029044818-c44066c5c816/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181106065722-10aee1819953/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190313220215-9f648a60d977/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190327091125-710a502c58a2/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= @@ -873,12 +752,11 @@ golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= -golang.org/x/net v0.0.0-20211008194852-3b03d305991f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211209124913-491a49abca63/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4= -golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= +golang.org/x/net v0.24.0 h1:1PcaxkF854Fu3+lvBIx5SYn9wRlBzzcnHZSiaFFAb0w= +golang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -897,15 +775,13 @@ golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= -golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= +golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180810173357-98c5dad5d1a0/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181029174526-d69651ed3497/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190316082340-a2f829d7f35f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -913,9 +789,7 @@ golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -925,7 +799,6 @@ golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -941,16 +814,12 @@ golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -960,20 +829,20 @@ golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= -golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= +golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.18.0 h1:FcHjZXDMxI8mM3nwhX9HlKop4C0YQvCVCdwYl2wOtE8= -golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= +golang.org/x/term v0.19.0 h1:+ThwsDv+tYfnJFhF4L8jITxu1tdTWRTZpdsWgEgjL6Q= +golang.org/x/term v0.19.0/go.mod h1:2CuTdWZ7KHSQwUzKva0cbMg6q2DMI3Mmxp+gKJbskEk= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= @@ -982,22 +851,18 @@ golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxb golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= -golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= +golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181030000716-a0a13e073c7b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181221001348-537d06c36207/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190327201419-c70d86f8b7cf/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= @@ -1025,10 +890,9 @@ golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjs golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.18.0 h1:k8NLag8AGHnn+PHbl7g43CtqZAwG60vZkLqgyZgIHgQ= -golang.org/x/tools v0.18.0/go.mod h1:GL7B4CwcLLeo59yx/9UWWuNOW1n3VZ4f5axWfML7Lcg= +golang.org/x/tools v0.20.0 h1:hz/CVckiOxybQvFw6h7b/q80NTr9IUQb4s1IIzW7KNY= +golang.org/x/tools v0.20.0/go.mod h1:WvitBU7JJf6A4jOdg4S1tviW9bhUxkgeCui/0JHctQg= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -1058,7 +922,6 @@ google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/genproto v0.0.0-20180518175338-11a468237815/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20181029155118-b69ba1387ce2/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= @@ -1083,14 +946,12 @@ google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfG google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= google.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= google.golang.org/genproto v0.0.0-20230711160842-782d3b101e98 h1:Z0hjGZePRE0ZBWotvtrwxFNrNE9CUAGtplaDK5NNI/g= google.golang.org/genproto v0.0.0-20230711160842-782d3b101e98/go.mod h1:S7mY02OqCJTD0E1OiQy1F72PWFB4bZJ87cAtLPYgDR0= google.golang.org/genproto/googleapis/api v0.0.0-20230711160842-782d3b101e98 h1:FmF5cCW94Ij59cfpoLiwTgodWmm60eEV0CjlsVg2fuw= google.golang.org/genproto/googleapis/api v0.0.0-20230711160842-782d3b101e98/go.mod h1:rsr7RhLuwsDKL7RmgDDCUc6yaGr1iqceVb5Wv6f6YvQ= google.golang.org/genproto/googleapis/rpc v0.0.0-20230711160842-782d3b101e98 h1:bVf09lpb+OJbByTj913DRJioFFAjf/ZGxEz7MajTp2U= google.golang.org/genproto/googleapis/rpc v0.0.0-20230711160842-782d3b101e98/go.mod h1:TUfxEVdsvPg18p6AslUXFoLdpED4oBnGwyqk3dV1XzM= -google.golang.org/grpc v1.12.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.16.0/go.mod h1:0JHn/cJsOMiMfNA9+DeHDlAU7KAAB5GDlYFpa9MZMio= google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= @@ -1098,11 +959,9 @@ google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZi google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= google.golang.org/grpc v1.58.3 h1:BjnpXut1btbtgN/6sp+brB2Kbm2LjNXnidYujAVbSoQ= google.golang.org/grpc v1.58.3/go.mod h1:tgX3ZQDlNJGU96V6yHh1T/JeoBQ2TXdr43YbYSsCJk0= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= @@ -1114,7 +973,6 @@ google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2 google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= @@ -1127,16 +985,12 @@ gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntN gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= -gopkg.in/go-playground/validator.v8 v8.18.2/go.mod h1:RX2a/7Ha8BgOhfk7j780h4/u/RRjR0eouCJSH80/M2Y= gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1 h1:iiHuQZCNgYPmFQxd3BBN/Nc5+dAwzZuq5y40s20oQw0= gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= -gopkg.in/ini.v1 v1.51.1/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= -gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8= -gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= +gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc= +gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= @@ -1146,7 +1000,6 @@ gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= -gopkg.in/yaml.v3 v3.0.0-20191120175047-4206685974f2/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/simulators/eth2/engine/go.mod b/simulators/eth2/engine/go.mod index bc0cd351c5..a3441feca5 100644 --- a/simulators/eth2/engine/go.mod +++ b/simulators/eth2/engine/go.mod @@ -5,31 +5,31 @@ go 1.21 toolchain go1.22.1 require ( - github.com/ethereum/go-ethereum v1.13.5-0.20231031113925-bc42e88415d3 - github.com/ethereum/hive v0.0.0-20240319152821-ae224371b4e5 + github.com/ethereum/go-ethereum v1.14.5 + github.com/ethereum/hive v0.0.0-20240610172825-2430a68c753a github.com/ethereum/hive/simulators/eth2/common v0.0.0-20230316220410-1364352c32a6 github.com/marioevz/eth-clients v0.0.0-20230925201418-d5fbddd99b76 github.com/protolambda/eth2api v0.0.0-20230316214135-5f8afbd6d05d - github.com/protolambda/zrnt v0.30.0 + github.com/protolambda/zrnt v0.32.2 github.com/rauljordan/engine-proxy v0.0.0-20230316220057-4c80c36c4c3a ) require ( - github.com/VictoriaMetrics/fastcache v1.12.1 // indirect - github.com/cespare/xxhash/v2 v2.2.0 // indirect + github.com/VictoriaMetrics/fastcache v1.12.2 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/ferranbt/fastssz v0.1.2 // indirect - github.com/go-ole/go-ole v1.2.6 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect github.com/go-stack/stack v1.8.1 // indirect - github.com/holiman/uint256 v1.2.3 // indirect + github.com/holiman/uint256 v1.2.4 // indirect github.com/mattn/go-runewidth v0.0.14 // indirect github.com/minio/sha256-simd v1.0.0 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/olekukonko/tablewriter v0.0.5 // indirect - github.com/protolambda/bls12-381-util v0.0.0-20220416220906-d8552aa452c7 // indirect + github.com/protolambda/bls12-381-util v0.1.0 // indirect github.com/shirou/gopsutil v3.21.11+incompatible // indirect github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a // indirect github.com/tklauser/go-sysconf v0.3.12 // indirect - golang.org/x/sys v0.18.0 // indirect + golang.org/x/sys v0.20.0 // indirect golang.org/x/text v0.14.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect @@ -37,28 +37,29 @@ require ( require ( github.com/DataDog/zstd v1.5.2 // indirect - github.com/Microsoft/go-winio v0.6.1 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect github.com/beorn7/perks v1.0.1 // indirect - github.com/bits-and-blooms/bitset v1.7.0 // indirect + github.com/bits-and-blooms/bitset v1.10.0 // indirect github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect - github.com/cockroachdb/errors v1.9.1 // indirect + github.com/cockroachdb/errors v1.11.1 // indirect github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect - github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593 // indirect - github.com/cockroachdb/redact v1.1.3 // indirect + github.com/cockroachdb/pebble v1.1.0 // indirect + github.com/cockroachdb/redact v1.1.5 // indirect github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect github.com/consensys/bavard v0.1.13 // indirect github.com/consensys/gnark-crypto v0.12.1 // indirect - github.com/crate-crypto/go-kzg-4844 v0.7.0 // indirect - github.com/deckarep/golang-set/v2 v2.1.0 // indirect + github.com/crate-crypto/go-ipa v0.0.0-20240223125850-b1e8a79f509c // indirect + github.com/crate-crypto/go-kzg-4844 v1.0.0 // indirect + github.com/deckarep/golang-set/v2 v2.6.0 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 // indirect - github.com/ethereum/c-kzg-4844 v0.4.0 // indirect - github.com/fjl/memsize v0.0.1 // indirect + github.com/ethereum/c-kzg-4844 v1.0.0 // indirect + github.com/ethereum/go-verkle v0.1.1-0.20240306133620-7d920df305f0 // indirect github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08 // indirect github.com/getsentry/sentry-go v0.18.0 // indirect github.com/gofrs/flock v0.8.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang-jwt/jwt/v4 v4.5.0 // indirect - github.com/golang/protobuf v1.5.3 // indirect + github.com/golang/protobuf v1.5.4 // indirect github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect github.com/google/go-cmp v0.6.0 // indirect github.com/google/uuid v1.3.0 // indirect @@ -75,7 +76,7 @@ require ( github.com/kr/text v0.2.0 // indirect github.com/lithammer/dedent v1.1.0 // indirect github.com/mattn/go-colorable v0.1.13 // indirect - github.com/mattn/go-isatty v0.0.17 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect github.com/mmcloughlin/addchain v0.4.0 // indirect github.com/pkg/errors v0.9.1 // indirect @@ -95,11 +96,9 @@ require ( github.com/wealdtech/go-eth2-types/v2 v2.8.0 // indirect github.com/wealdtech/go-eth2-util v1.8.0 // indirect github.com/yusufpapurcu/wmi v1.2.2 // indirect - golang.org/x/crypto v0.21.0 // indirect - golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect - golang.org/x/mod v0.12.0 // indirect - golang.org/x/sync v0.3.0 // indirect - golang.org/x/tools v0.13.0 // indirect + golang.org/x/crypto v0.22.0 // indirect + golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa // indirect + golang.org/x/sync v0.7.0 // indirect google.golang.org/protobuf v1.33.0 // indirect gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1 // indirect rsc.io/tmplfunc v0.0.3 // indirect diff --git a/simulators/eth2/engine/go.sum b/simulators/eth2/engine/go.sum index a7065565d3..02a0672e0b 100644 --- a/simulators/eth2/engine/go.sum +++ b/simulators/eth2/engine/go.sum @@ -1,276 +1,178 @@ -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/CloudyKit/fastprinter v0.0.0-20200109182630-33d98a066a53/go.mod h1:+3IMCy2vIlbG1XG/0ggNQv0SvxCAIpPM5b1nCz56Xno= -github.com/CloudyKit/jet/v3 v3.0.0/go.mod h1:HKQPgSJmdK8hdoAbKUUWajkHyHo4RaU5rMdUywE7VMo= github.com/DataDog/zstd v1.5.2 h1:vUG4lAyuPCXO0TLbXvPv7EB7cNK1QV/luu55UHLrrn8= github.com/DataDog/zstd v1.5.2/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= -github.com/Joker/hpp v1.0.0/go.mod h1:8x5n+M1Hp5hC0g8okX3sR3vFQwynaX/UgSOM9MeBKzY= -github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= -github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= -github.com/Shopify/goreferrer v0.0.0-20181106222321-ec9c9a553398/go.mod h1:a1uqRtAwp2Xwc6WNPJEufxJ7fx3npB4UV/JOLmbu5I0= -github.com/VictoriaMetrics/fastcache v1.12.1 h1:i0mICQuojGDL3KblA7wUNlY5lOK6a4bwt3uRKnkZU40= -github.com/VictoriaMetrics/fastcache v1.12.1/go.mod h1:tX04vaqcNoQeGLD+ra5pU5sWkuxnzWhEzLwhP9w653o= -github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/VictoriaMetrics/fastcache v1.12.2 h1:N0y9ASrJ0F6h0QaC3o6uJb3NIZ9VKLjCM7NQbSmF7WI= +github.com/VictoriaMetrics/fastcache v1.12.2/go.mod h1:AmC+Nzz1+3G2eCPapF6UcsnkThDcMsQicp4xDukwJYI= github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= github.com/allegro/bigcache v1.2.1 h1:hg1sY1raCwic3Vnsvje6TT7/pnZba83LeFck5NrFKSc= github.com/allegro/bigcache v1.2.1/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= -github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= -github.com/aymerick/raymond v2.0.3-0.20180322193309-b565731e1464+incompatible/go.mod h1:osfaiScAUVup+UC9Nfq76eWqDhXlp+4UYaA8uhTBO6g= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bits-and-blooms/bitset v1.7.0 h1:YjAGVd3XmtK9ktAbX8Zg2g2PwLIMjGREZJHlV4j7NEo= -github.com/bits-and-blooms/bitset v1.7.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= +github.com/bits-and-blooms/bitset v1.10.0 h1:ePXTeiPEazB5+opbv5fr8umg2R/1NlzgDsyepwsSr88= +github.com/bits-and-blooms/bitset v1.10.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U= github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cockroachdb/datadriven v1.0.2/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f h1:otljaYPt5hWxV3MUfO5dFPFiOXg9CyG5/kCfayTqsJ4= github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= -github.com/cockroachdb/errors v1.9.1 h1:yFVvsI0VxmRShfawbt/laCIDy/mtTqqnvoNgiy5bEV8= -github.com/cockroachdb/errors v1.9.1/go.mod h1:2sxOtL2WIc096WSZqZ5h8fa17rdDq9HZOZLBCor4mBk= -github.com/cockroachdb/logtags v0.0.0-20211118104740-dabe8e521a4f/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= +github.com/cockroachdb/errors v1.11.1 h1:xSEW75zKaKCWzR3OfxXUxgrk/NtT4G1MiOv5lWZazG8= +github.com/cockroachdb/errors v1.11.1/go.mod h1:8MUxA3Gi6b25tYlFEBGLf+D8aISL+M4MIpiWMSNRfxw= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= -github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593 h1:aPEJyR4rPBvDmeyi+l/FS/VtA00IWvjeFvjen1m1l1A= -github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593/go.mod h1:6hk1eMY/u5t+Cf18q5lFMUA1Rc+Sm5I6Ra1QuPyxXCo= -github.com/cockroachdb/redact v1.1.3 h1:AKZds10rFSIj7qADf0g46UixK8NNLwWTNdCIGS5wfSQ= -github.com/cockroachdb/redact v1.1.3/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= +github.com/cockroachdb/pebble v1.1.0 h1:pcFh8CdCIt2kmEpK0OIatq67Ln9uGDYY3d5XnE0LJG4= +github.com/cockroachdb/pebble v1.1.0/go.mod h1:sEHm5NOXxyiAoKWhoFxT8xMgd/f3RA6qUqQ1BXKrh2E= +github.com/cockroachdb/redact v1.1.5 h1:u1PMllDkdFfPWaNGMyLD1+so+aq3uUItthCFqzwPJ30= +github.com/cockroachdb/redact v1.1.5/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo= github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ= -github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0/go.mod h1:4Zcjuz89kmFXt9morQgcfYZAYZ5n8WHjt81YYWIwtTM= github.com/consensys/bavard v0.1.13 h1:oLhMLOFGTLdlda/kma4VOJazblc7IM5y5QPd2A/YjhQ= github.com/consensys/bavard v0.1.13/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI= github.com/consensys/gnark-crypto v0.12.1 h1:lHH39WuuFgVHONRl3J0LRBtuYdQTumFSDtJF7HpyG8M= github.com/consensys/gnark-crypto v0.12.1/go.mod h1:v2Gy7L/4ZRosZ7Ivs+9SfUDr0f5UlG+EM5t7MPHiLuY= -github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= -github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/cpuguy83/go-md2man v1.0.10 h1:BSKMNlYxDvnunlTymqtgONjNnaRV1sTpcovwwjF22jk= -github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/crate-crypto/go-kzg-4844 v0.7.0 h1:C0vgZRk4q4EZ/JgPfzuSoxdCq3C3mOZMBShovmncxvA= -github.com/crate-crypto/go-kzg-4844 v0.7.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= +github.com/crate-crypto/go-ipa v0.0.0-20240223125850-b1e8a79f509c h1:uQYC5Z1mdLRPrZhHjHxufI8+2UG/i25QG92j0Er9p6I= +github.com/crate-crypto/go-ipa v0.0.0-20240223125850-b1e8a79f509c/go.mod h1:geZJZH3SzKCqnz5VT0q/DyIG/tvu/dZk+VIfXicupJs= +github.com/crate-crypto/go-kzg-4844 v1.0.0 h1:TsSgHwrkTKecKJ4kadtHi4b3xHW5dCFUDFnUp1TsawI= +github.com/crate-crypto/go-kzg-4844 v1.0.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/deckarep/golang-set/v2 v2.1.0 h1:g47V4Or+DUdzbs8FxCCmgb6VYd+ptPAngjM6dtGktsI= -github.com/deckarep/golang-set/v2 v2.1.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= +github.com/deckarep/golang-set/v2 v2.6.0 h1:XfcQbWM1LlMB8BsJ8N9vW5ehnnPVIw0je80NsVHagjM= +github.com/deckarep/golang-set/v2 v2.6.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0= github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 h1:HbphB4TFFXpv7MNrT52FGrrgVXF1owhMVTHFZIlnvd4= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0/go.mod h1:DZGJHZMqrU4JJqFAWUS2UO1+lbSKsdiOoYi9Zzey7Fc= -github.com/dgraph-io/badger v1.6.0/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6psNgSztDR4= -github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385/go.mod h1:0vRUJqYpeSZifjYj7uP3BG/gKcuzL9xWVV/Y+cK33KM= -github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/etcd-io/bbolt v1.3.3/go.mod h1:ZF2nL25h33cCyBtcyWeZ2/I3HQOfTP+0PIEvHjkjCrw= -github.com/ethereum/c-kzg-4844 v0.4.0 h1:3MS1s4JtA868KpJxroZoepdV0ZKBp3u/O5HcZ7R3nlY= -github.com/ethereum/c-kzg-4844 v0.4.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= -github.com/ethereum/go-ethereum v1.13.5-0.20231031113925-bc42e88415d3 h1:i4TE0DmzMYcr2IiCdlTGGk+7Q/EzXvBKbbG4uRxMjJ0= -github.com/ethereum/go-ethereum v1.13.5-0.20231031113925-bc42e88415d3/go.mod h1:yMTu38GSuyxaYzQMViqNmQ1s3cE84abZexQmTgenWk0= -github.com/ethereum/hive v0.0.0-20240319152821-ae224371b4e5 h1:2Rc3v1mqWgUl8gSHFh7+FmVcyB1AI/9THxhEDjNK+PI= -github.com/ethereum/hive v0.0.0-20240319152821-ae224371b4e5/go.mod h1:MGwUXPGco6YS3brOf5WEILfUnnUL/XuX1224ab3D7XA= +github.com/ethereum/c-kzg-4844 v1.0.0 h1:0X1LBXxaEtYD9xsyj9B9ctQEZIpnvVDeoBx8aHEwTNA= +github.com/ethereum/c-kzg-4844 v1.0.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= +github.com/ethereum/go-ethereum v1.14.5 h1:szuFzO1MhJmweXjoM5nSAeDvjNUH3vIQoMzzQnfvjpw= +github.com/ethereum/go-ethereum v1.14.5/go.mod h1:VEDGGhSxY7IEjn98hJRFXl/uFvpRgbIIf2PpXiyGGgc= +github.com/ethereum/go-verkle v0.1.1-0.20240306133620-7d920df305f0 h1:KrE8I4reeVvf7C1tm8elRjj4BdscTYzz/WAbYyf/JI4= +github.com/ethereum/go-verkle v0.1.1-0.20240306133620-7d920df305f0/go.mod h1:D9AJLVXSyZQXJQVk8oh1EwjISE+sJTn2duYIZC0dy3w= +github.com/ethereum/hive v0.0.0-20240610172825-2430a68c753a h1:iyHHRPXaxHtEvyFxc4A+is/JRt88o0gQhHrNx+khEqQ= +github.com/ethereum/hive v0.0.0-20240610172825-2430a68c753a/go.mod h1:ghNXZW+/WQClcyiwZpbTzUCyxwql7YeMacYd44v+BJE= github.com/ethereum/hive/simulators/eth2/common v0.0.0-20230316220410-1364352c32a6 h1:LcSUNGwQuJyR/gdPcsif57yKX+3MyhpoAuChzR8k6Yk= github.com/ethereum/hive/simulators/eth2/common v0.0.0-20230316220410-1364352c32a6/go.mod h1:FX4oxNyTNw/P+TUWrb7vva7o/rFI0pHO7OYdtG6EtN4= -github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072/go.mod h1:duJ4Jxv5lDcvg4QuQr0oowTf7dz4/CR8NtyCooz9HL8= -github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= github.com/ferranbt/fastssz v0.1.2 h1:Dky6dXlngF6Qjc+EfDipAkE83N5I5DE68bY6O0VLNPk= github.com/ferranbt/fastssz v0.1.2/go.mod h1:X5UPrE2u1UJjxHA8X54u04SBwdAQjG2sFtWs39YxyWs= -github.com/fjl/memsize v0.0.1 h1:+zhkb+dhUgx0/e+M8sF0QqiouvMQUiKR+QYvdxIOKcQ= -github.com/fjl/memsize v0.0.1/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= +github.com/fjl/memsize v0.0.2 h1:27txuSD9or+NZlnOWdKUxeBzTAUkWCVh+4Gf2dWFOzA= +github.com/fjl/memsize v0.0.2/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= -github.com/gavv/httpexpect v2.0.0+incompatible/go.mod h1:x+9tiU1YnrOvnB725RkpoLv1M62hOWzwo5OXotisrKc= github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08 h1:f6D9Hr8xV8uYKlyuj8XIruxlh9WjVjdh1gIicAS7ays= github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= -github.com/getsentry/sentry-go v0.12.0/go.mod h1:NSap0JBYWzHND8oMbyi0+XZhUalc1TBdRL1M71JZW2c= github.com/getsentry/sentry-go v0.18.0 h1:MtBW5H9QgdcJabtZcuJG80BMOwaBpkRDZkxRkNC1sN0= github.com/getsentry/sentry-go v0.18.0/go.mod h1:Kgon4Mby+FJ7ZWHFUAZgVaIa8sxHtnRJRLTXZr51aKQ= -github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3/go.mod h1:VJ0WA2NBN22VlZ2dKZQPAPnyWw5XTlK1KymzLKsr59s= -github.com/gin-gonic/gin v1.4.0/go.mod h1:OW2EZn3DO8Ln9oIKOvM++LBO+5UPHJJDH72/q/3rZdM= -github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= -github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= -github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab/go.mod h1:/P9AEU963A2AYjv4d1V5eVL1CQbEJq6aCNHDDjibzu8= -github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= github.com/go-stack/stack v1.8.1 h1:ntEHSVwIt7PNXNpgPmVfMrNhLtgjlmnZha2kOpuRiDw= github.com/go-stack/stack v1.8.1/go.mod h1:dcoOX6HbPZSZptuspn9bctJ+N/CnF5gGygcUP3XYfe4= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= -github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= -github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= -github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= -github.com/gogo/googleapis v0.0.0-20180223154316-0cd9801be74a/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= -github.com/gogo/googleapis v1.4.1/go.mod h1:2lpHqI5OcWCtVElxXnPt+s8oJvMpySlOyM6xDCrzib4= -github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/gogo/status v1.1.0/go.mod h1:BFv9nrluPLmrS0EmGVvLaPNmRosr9KapBYd5/hpY1WM= -github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= -github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXiurYmW7fx4GZkL8feAMVq7nEjURHk= github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/gomodule/redigo v1.7.1-0.20190724094224-574c33c3df38/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= -github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/hashicorp/go-bexpr v0.1.11 h1:6DqdA/KBjurGby9yTY0bmkathya0lfwF2SeuubCI7dY= github.com/hashicorp/go-bexpr v0.1.11/go.mod h1:f03lAo0duBlDIUMGCuad8oLcgejw4m7U+N8T+6Kz1AE= -github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/herumi/bls-eth-go-binary v1.28.1 h1:fcIZ48y5EE9973k05XjE8+P3YiQgjZz4JI/YabAm8KA= github.com/herumi/bls-eth-go-binary v1.28.1/go.mod h1:luAnRm3OsMQeokhGzpYmc0ZKwawY7o87PUEP11Z7r7U= -github.com/holiman/billy v0.0.0-20230718173358-1c7e68d277a7 h1:3JQNjnMRil1yD0IfZKHF9GxxWKDJGj8I0IqOUol//sw= -github.com/holiman/billy v0.0.0-20230718173358-1c7e68d277a7/go.mod h1:5GuXa7vkL8u9FkFuWdVvfR5ix8hRB7DbOAaYULamFpc= +github.com/holiman/billy v0.0.0-20240216141850-2abb0c79d3c4 h1:X4egAf/gcS1zATw6wn4Ej8vjuVGxeHdan+bRb2ebyv4= +github.com/holiman/billy v0.0.0-20240216141850-2abb0c79d3c4/go.mod h1:5GuXa7vkL8u9FkFuWdVvfR5ix8hRB7DbOAaYULamFpc= github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao= github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA= github.com/holiman/uint256 v1.2.0/go.mod h1:y4ga/t+u+Xwd7CpDgZESaRcWy0I7XMlTMA25ApIH5Jw= -github.com/holiman/uint256 v1.2.3 h1:K8UWO1HUJpRMXBxbmaY1Y8IAMZC/RsKB+ArEnnK4l5o= -github.com/holiman/uint256 v1.2.3/go.mod h1:SC8Ryt4n+UBbPbIBKaG9zbbDlp4jOru9xFZmPzLUTxw= +github.com/holiman/uint256 v1.2.4 h1:jUc4Nk8fm9jZabQuqr2JzednajVmBpC+oiTiXZJEApU= +github.com/holiman/uint256 v1.2.4/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXeiRV4ng7E= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/huin/goupnp v1.3.0 h1:UvLUlWDNpoUdYzb2TCn+MuTWtcjXKSza2n6CBdQ0xXc= github.com/huin/goupnp v1.3.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8= -github.com/hydrogen18/memlistener v0.0.0-20200120041712-dcc25e7acd91/go.mod h1:qEIFzExnS6016fRpRfxrExeVn2gbClQA99gQhnIcdhE= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/imkira/go-interpol v1.1.0/go.mod h1:z0h2/2T3XF8kyEPpRgJ3kmNv+C43p+I/CoI+jC3w2iA= -github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/iris-contrib/blackfriday v2.0.0+incompatible/go.mod h1:UzZ2bDEoaSGPbkg6SAB4att1aAwTmVIx/5gCVqeyUdI= -github.com/iris-contrib/go.uuid v2.0.0+incompatible/go.mod h1:iz2lgM/1UnEf1kP0L/+fafWORmlnuysV2EMP8MW+qe0= -github.com/iris-contrib/jade v1.1.3/go.mod h1:H/geBymxJhShH5kecoiOCSssPX7QWYH7UaeZTSWddIk= -github.com/iris-contrib/pongo2 v0.0.1/go.mod h1:Ssh+00+3GAZqSQb30AvBRNxBx7rf0GqwkjqxNd0u65g= -github.com/iris-contrib/schema v0.0.1/go.mod h1:urYA3uvUNG1TIIjOSCzHr9/LmbQo8LrOcOqfqxa4hXw= github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= -github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.3.0 h1:U0609e9tgbseu3rBINet9P48AI/D3oJs4dN7jwJOQ1U= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= -github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88/go.mod h1:3w7q1U84EfirKl04SVQ/s7nPm1ZPhiXd34z40TNz36k= -github.com/kataras/golog v0.0.10/go.mod h1:yJ8YKCmyL+nWjERB90Qwn+bdyBZsaQwU3bTVFgkFIp8= -github.com/kataras/iris/v12 v12.1.8/go.mod h1:LMYy4VlP67TQ3Zgriz8RE2h2kMZV2SgMYbq3UhfoFmE= -github.com/kataras/neffos v0.0.14/go.mod h1:8lqADm8PnbeFfL7CLXh1WHw53dG27MC3pgi2R1rmoTE= -github.com/kataras/pio v0.0.2/go.mod h1:hAoW0t9UmXi4R5Oyq5Z4irTbaTsOemSrDGUtaTl7Dro= -github.com/kataras/sitemap v0.0.5/go.mod h1:KY2eugMKiPwsJgx7+U103YZehfvNGOXURubcGyk0Bz8= github.com/kilic/bls12-381 v0.1.0 h1:encrdjqKMEvabVQ7qYOKu1OvhqpK4s47wDYtNiPtlp4= github.com/kilic/bls12-381 v0.1.0/go.mod h1:vDTTHJONJ6G+P2R74EhnyotQDTliQDnFEwhdmfzw1ig= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.8.2/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= -github.com/klauspost/compress v1.9.7/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= github.com/klauspost/compress v1.15.15 h1:EF27CXIuDsYJ6mmvtBRlEuB2UVOqHG1tAXgZ7yIO+lw= github.com/klauspost/compress v1.15.15/go.mod h1:ZcK2JAFqKOpnBlxcLsJzYfrS9X1akm9fHZNnD9+Vo/4= -github.com/klauspost/cpuid v1.2.1/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.2.2 h1:xPMwiykqNK9VK0NYC3+jTMYv9I6Vl3YdjZgPZKG3zO0= github.com/klauspost/cpuid/v2 v2.2.2/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/labstack/echo/v4 v4.5.0/go.mod h1:czIriw4a0C1dFun+ObrXp7ok03xON0N1awStJ6ArI7Y= -github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c= github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= github.com/lithammer/dedent v1.1.0 h1:VNzHMVCBNG1j0fh3OrsFRkVUwStdDArbgBWoPAffktY= github.com/lithammer/dedent v1.1.0/go.mod h1:jrXYCQtgg0nJiN+StA2KgR7w6CiQNv9Fd/Z9BP0jIOc= -github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/marioevz/eth-clients v0.0.0-20230925201418-d5fbddd99b76 h1:fj+aeR3YLmSRUWjOGgTxNMdvzm72J5JbKGKosNO/jkE= github.com/marioevz/eth-clients v0.0.0-20230925201418-d5fbddd99b76/go.mod h1:YVrdn57Q3rAzm3wus4T9tg1vMPca4csVbzorPhkGCW0= github.com/marioevz/eth2api v0.0.0-20230922201437-72bd1301e033 h1:sn57n+lbJrLS8FKYs08W7TEzraTGOCQGrSC4hni6rYw= github.com/marioevz/eth2api v0.0.0-20230922201437-72bd1301e033/go.mod h1:hcwWCT4sF1X7KsMZ535MvDZVk5M20Uyj+x2LARZjQsM= -github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.11/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= -github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= -github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng= -github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.14 h1:+xnbZSEeDbOIg5/mE6JF0w6n9duR1l3/WmbinWVwUuU= github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= -github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw= github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= -github.com/mediocregopher/radix/v3 v3.4.2/go.mod h1:8FL3F6UQRXHXIBSPUs5h0RybMF8i4n7wVopoX3x7Bv8= -github.com/microcosm-cc/bluemonday v1.0.2/go.mod h1:iVP4YcDBq+n/5fb23BhYFvIMq/leAFZyRl6bYmGDlGc= -github.com/minio/sha256-simd v0.1.0/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= github.com/minio/sha256-simd v1.0.0 h1:v1ta+49hkWZyvaKwrQB8elexRqm6Y0aMLjCNsrYxo6g= github.com/minio/sha256-simd v1.0.0/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy5RFepssQM= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= @@ -279,22 +181,12 @@ github.com/mitchellh/pointerstructure v1.2.1/go.mod h1:BRAsLI5zgXmw97Lf6s25bs8oh github.com/mmcloughlin/addchain v0.4.0 h1:SobOdjm2xLj1KkXN5/n0xTIWyZA2+s99UCY1iPfkHRY= github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqkyU72HC5wJ4RlU= github.com/mmcloughlin/profile v0.1.1/go.mod h1:IhHD7q1ooxgwTgjxQYkACGA77oFTDdFVejUS1/tS/qU= -github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/moul/http2curl v1.0.0/go.mod h1:8UbvGypXm98wA/IqH45anm5Y2Z6ep6O31QGOAZ3H0fQ= -github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= -github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= -github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= -github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= @@ -305,32 +197,27 @@ github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1y github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= github.com/onsi/gomega v1.19.0 h1:4ieX6qQjPP/BfC3mpsAtIGGlxTWPeA3Inl/7DtXw1tw= github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= -github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_golang v1.14.0 h1:nJdhIvne2eSX/XRAFV9PcvFFRbrjbcTUj0VP62TMhnw= github.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4= github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= github.com/prometheus/common v0.39.0 h1:oOyhkDq05hPZKItWVBkJ6g6AtGxi+fy7F4JvUV8uhsI= github.com/prometheus/common v0.39.0/go.mod h1:6XBZ7lYdLCbkAVhwRsWTZn+IN5AB9F/NXd5w0BbEX0Y= github.com/prometheus/procfs v0.9.0 h1:wzCHvIvM5SxWqYvwgVL7yJY8Lz3PKn49KQtpgMYJfhI= github.com/prometheus/procfs v0.9.0/go.mod h1:+pB4zwohETzFnmlpe6yd2lSc+0/46IYZRB/chUwxUZY= -github.com/protolambda/bls12-381-util v0.0.0-20210720105258-a772f2aac13e/go.mod h1:MPZvj2Pr0N8/dXyTPS5REeg2sdLG7t8DRzC1rLv925w= -github.com/protolambda/bls12-381-util v0.0.0-20220416220906-d8552aa452c7 h1:cZC+usqsYgHtlBaGulVnZ1hfKAi8iWtujBnRLQE698c= -github.com/protolambda/bls12-381-util v0.0.0-20220416220906-d8552aa452c7/go.mod h1:IToEjHuttnUzwZI5KBSM/LOOW3qLbbrHOEfp3SbECGY= +github.com/protolambda/bls12-381-util v0.1.0 h1:05DU2wJN7DTU7z28+Q+zejXkIsA/MF8JZQGhtBZZiWk= +github.com/protolambda/bls12-381-util v0.1.0/go.mod h1:cdkysJTRpeFeuUVx/TXGDQNMTiRAalk1vQw3TYTHcE4= github.com/protolambda/go-keystorev4 v0.0.0-20211007151826-f20444f6d564 h1:yCXGkFjrZ8EggxW+Y7ueRZesNcBk0avLU0mVU/I2KtU= github.com/protolambda/go-keystorev4 v0.0.0-20211007151826-f20444f6d564/go.mod h1:Xda3KO8+DMyWaTr+LwUUpVRTB5SdFzoKu0ivXNI6p1s= -github.com/protolambda/messagediff v1.4.0/go.mod h1:LboJp0EwIbJsePYpzh5Op/9G1/4mIztMRYzzwR0dR2M= -github.com/protolambda/zrnt v0.30.0 h1:pHEn69ZgaDFGpLGGYG1oD7DvYI7RDirbMBPfbC+8p4g= -github.com/protolambda/zrnt v0.30.0/go.mod h1:qcdX9CXFeVNCQK/q0nswpzhd+31RHMk2Ax/2lMsJ4Jw= +github.com/protolambda/zrnt v0.32.2 h1:KZ48T+3UhsPXNdtE/5QEvGc9DGjUaRI17nJaoznoIaM= +github.com/protolambda/zrnt v0.32.2/go.mod h1:A0fezkp9Tt3GBLATSPIbuY4ywYESyAuc/FFmPKg8Lqs= github.com/protolambda/ztyp v0.2.2 h1:rVcL3vBu9W/aV646zF6caLS/dyn9BN8NYiuJzicLNyY= github.com/protolambda/ztyp v0.2.2/go.mod h1:9bYgKGqg3wJqT9ac1gI2hnVb0STQq7p/1lapqrqY1dU= github.com/prysmaticlabs/gohashtree v0.0.1-alpha.0.20220714111606-acbb2962fb48 h1:cSo6/vk8YpvkLbk9v3FO97cakNmUoxwi2KMP8hd5WIw= @@ -340,38 +227,20 @@ github.com/rauljordan/engine-proxy v0.0.0-20230316220057-4c80c36c4c3a/go.mod h1: github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.3 h1:utMvzDsuh3suAEnhH0RdHmoPbU648o6CvXxTx4SBMOw= github.com/rivo/uniseg v0.4.3/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= -github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= -github.com/rogpeppe/go-internal v1.8.1/go.mod h1:JeRgkft04UBgHMgCIwADu4Pn6Mtm5d4nPKWu0nJ5d+o= github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/rs/cors v1.8.2 h1:KCooALfAYGs415Cwu5ABvv9n9509fSiG5SQJn/AQo4U= github.com/rs/cors v1.8.2/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= -github.com/russross/blackfriday v1.5.2 h1:HyvC0ARfnZBqnXwABFeSZHpKvJHJJfPz81GNueLj0oo= -github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/schollz/closestmatch v2.1.0+incompatible/go.mod h1:RtP1ddjLong6gTkbtmuhtR2uUrrJOpYzYRvbcPAid+g= -github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI= github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= -github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= -github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= -github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= github.com/status-im/keycard-go v0.2.0 h1:QDLFswOQu1r5jsycloeQh3bVU8n/NatHHaZobtDnDzA= github.com/status-im/keycard-go v0.2.0/go.mod h1:wlp8ZLbsmrF6g6WjugPAx+IzoLrkdf9+mHxBEeo3Hbg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= @@ -387,212 +256,115 @@ github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+F github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= github.com/tyler-smith/go-bip39 v1.1.0 h1:5eUemwrMargf3BSLRRCalXT93Ns6pQJIjYQN2nyfOP8= github.com/tyler-smith/go-bip39 v1.1.0/go.mod h1:gUYDtqQw1JS3ZJ8UWVcGTGqqr6YIN3CWg+kkNaLt55U= -github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= -github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= -github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= -github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= github.com/urfave/cli/v2 v2.25.7 h1:VAzn5oq403l5pHjc4OhD54+XGO9cdKVL/7lDjF+iKUs= github.com/urfave/cli/v2 v2.25.7/go.mod h1:8qnjx1vcq5s2/wpsqoZFndg2CE5tNFyrTvS6SinrnYQ= -github.com/urfave/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4= -github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= -github.com/valyala/fasthttp v1.6.0/go.mod h1:FstJa9V+Pj9vQ7OJie2qMHdwemEDaDiSdBnvPM1Su9w= -github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= -github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= -github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio= github.com/wealdtech/go-bytesutil v1.2.0 h1:GEIzvAZEIgqOoRfnEAaMRNL73gl8e+YlQzqxhFyR30Y= github.com/wealdtech/go-bytesutil v1.2.0/go.mod h1:FHQSlwhzfSZGffu1osaUGdnNtl5C8tBKwmqvPdB66pM= github.com/wealdtech/go-eth2-types/v2 v2.8.0 h1:Cts9J78ryXVp8jwotdSSVU75S+QWJrgVCArXreD2X8A= github.com/wealdtech/go-eth2-types/v2 v2.8.0/go.mod h1:tJazo9o28kdQs3V/U4VafQ4neG+/sL3OBozQ8J3CWmo= github.com/wealdtech/go-eth2-util v1.8.0 h1:hhs3h2y3Ldty18lppFdpe46nZpdDAMbY7QqiHO5BvE0= github.com/wealdtech/go-eth2-util v1.8.0/go.mod h1:rSuE0v5zX+uyZrqW/iUmXOxeDpB7lTvhcZvAVh0KlMU= -github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= -github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= -github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= -github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU= github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8= -github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0/go.mod h1:/LWChgwKmvncFJFHJ7Gvn9wZArjbV5/FppcK2fKk/tI= -github.com/yudai/gojsondiff v1.0.0/go.mod h1:AY32+k2cwILAkW1fbgxQ5mUmMiZFgLIV+FBNExI05xg= -github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82/go.mod h1:lgjkn3NuSvDfVJdfcVVdX+jpBxNmX4rDAzaS45IcYoM= -github.com/yudai/pp v2.0.1+incompatible/go.mod h1:PuxR/8QJ7cyCkFp/aUDS+JY727OFEZkTdatxwunjIkc= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yusufpapurcu/wmi v1.2.2 h1:KBNDSne4vP5mbSWnJbO+51IMOXJB67QiYCSBrubbPRg= github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= -golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191227163750-53104e6ec876/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= -golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g= -golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30= +golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M= +golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa h1:FRnLl4eNAQl8hwxVVC17teOw8kdjVDVAiFMtgUdTSRQ= +golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa/go.mod h1:zk2irFbV9DP96SEBUUAy67IdHUaZuSnrz1n472HUCLE= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc= -golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190327091125-710a502c58a2/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= -golang.org/x/net v0.0.0-20211008194852-3b03d305991f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4= -golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/net v0.24.0 h1:1PcaxkF854Fu3+lvBIx5SYn9wRlBzzcnHZSiaFFAb0w= +golang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= -golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= +golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201101102859-da207088b7d1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= -golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= +golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= -golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= +golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181221001348-537d06c36207/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190327201419-c70d86f8b7cf/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.13.0 h1:Iey4qkscZuv0VvIt8E0neZjtPVQFSc870HQ448QgEmQ= -golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/genproto v0.0.0-20180518175338-11a468237815/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= -google.golang.org/grpc v1.12.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= -gopkg.in/go-playground/validator.v8 v8.18.2/go.mod h1:RX2a/7Ha8BgOhfk7j780h4/u/RRjR0eouCJSH80/M2Y= gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1 h1:iiHuQZCNgYPmFQxd3BBN/Nc5+dAwzZuq5y40s20oQw0= gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= -gopkg.in/ini.v1 v1.51.1/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= -gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8= -gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= +gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc= +gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= @@ -600,12 +372,8 @@ gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= -gopkg.in/yaml.v3 v3.0.0-20191120175047-4206685974f2/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= rsc.io/tmplfunc v0.0.3 h1:53XFQh69AfOa8Tw0Jm7t+GV7KZhOi6jzsCzTtKbMvzU= rsc.io/tmplfunc v0.0.3/go.mod h1:AG3sTPzElb1Io3Yg4voV9AGZJuleGAwaVRxL9M49PhA= diff --git a/simulators/eth2/go.work.sum b/simulators/eth2/go.work.sum index 384d28024d..648795a475 100644 --- a/simulators/eth2/go.work.sum +++ b/simulators/eth2/go.work.sum @@ -411,6 +411,7 @@ cloud.google.com/go/workflows v1.11.1/go.mod h1:Z+t10G1wF7h8LgdY/EmRcQY8ptBD/nvo collectd.org v0.3.0/go.mod h1:A/8DzQBkF6abtvrT2j/AU/4tiBgJWYyh0y/oB/4MlWE= gioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8= github.com/AdaLogics/go-fuzz-headers v0.0.0-20210715213245-6c3934b029d8/go.mod h1:CzsSbkDixRphAF5hS6wbMKq0eI6ccJRb7/A0M6JBnwg= +github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= github.com/AndreasBriese/bbloom v0.0.0-20190825152654-46b345b51c96/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= github.com/Azure/azure-sdk-for-go v16.2.1+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= github.com/Azure/azure-sdk-for-go/sdk/azcore v1.0.0/go.mod h1:uGG2W01BaETf0Ozp+QxxKJdMBNRWPdstHG0Fmdwn1/U= @@ -436,12 +437,15 @@ github.com/AzureAD/microsoft-authentication-library-for-go v0.4.0/go.mod h1:Vt9s github.com/AzureAD/microsoft-authentication-library-for-go v1.0.0/go.mod h1:kgDmCTgBzIEPFElEF+FK0SdjAor06dRq2Go927dnQ6o= github.com/BurntSushi/toml v1.2.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= github.com/CloudyKit/fastprinter v0.0.0-20170127035650-74b38d55f37a/go.mod h1:EFZQ978U7x8IRnstaskI3IysnWY5Ao3QgZUKOXlsAdw= +github.com/CloudyKit/fastprinter v0.0.0-20200109182630-33d98a066a53/go.mod h1:+3IMCy2vIlbG1XG/0ggNQv0SvxCAIpPM5b1nCz56Xno= github.com/CloudyKit/jet v2.1.3-0.20180809161101-62edd43e4f88+incompatible/go.mod h1:HPYO+50pSWkPoj9Q/eq0aRGByCL6ScRlUmiEX5Zgm+w= +github.com/CloudyKit/jet/v3 v3.0.0/go.mod h1:HKQPgSJmdK8hdoAbKUUWajkHyHo4RaU5rMdUywE7VMo= github.com/CloudyKit/jet/v6 v6.2.0/go.mod h1:d3ypHeIRNo2+XyqnGA8s+aphtcVpjP5hPwP/Lzo7Ro4= github.com/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= github.com/DataDog/zstd v1.4.5/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo= github.com/GoogleCloudPlatform/cloudsql-proxy v0.0.0-20190129172621-c8b1d7a94ddf/go.mod h1:aJ4qN3TfrelA6NZ6AXsXRfmEVaYin3EDbSPJrKS8OXo= github.com/HdrHistogram/hdrhistogram-go v1.1.2/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo= +github.com/Joker/hpp v1.0.0/go.mod h1:8x5n+M1Hp5hC0g8okX3sR3vFQwynaX/UgSOM9MeBKzY= github.com/Joker/jade v1.0.1-0.20190614124447-d475f43051e7/go.mod h1:6E6s8o2AE4KhCrqr6GRJjdC/gNfTdxkIXvuGZZda2VM= github.com/Joker/jade v1.1.3/go.mod h1:T+2WLyt7VH6Lp0TRxQrUYEs64nRc83wkMQrfeIQKduM= github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= @@ -456,6 +460,7 @@ github.com/Microsoft/go-winio v0.4.17-0.20210211115548-6eac466e5fa3/go.mod h1:JP github.com/Microsoft/go-winio v0.4.17-0.20210324224401-5516f17a5958/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= github.com/Microsoft/go-winio v0.4.17/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY= +github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= github.com/Microsoft/hcsshim v0.8.6/go.mod h1:Op3hHsoHPAvb6lceZHDtd9OkTew38wNoXnJs8iY7rUg= github.com/Microsoft/hcsshim v0.8.7-0.20190325164909-8abdbb8205e4/go.mod h1:Op3hHsoHPAvb6lceZHDtd9OkTew38wNoXnJs8iY7rUg= github.com/Microsoft/hcsshim v0.8.7/go.mod h1:OHd7sQqRFrYd3RmSgbgji+ctCwkbq2wbEYNSzOYtcBQ= @@ -472,6 +477,7 @@ github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAE github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= github.com/RaveNoX/go-jsoncommentstrip v1.0.0/go.mod h1:78ihd09MekBnJnxpICcwzCMzGrKSKYe4AqU6PDYYpjk= +github.com/Shopify/goreferrer v0.0.0-20181106222321-ec9c9a553398/go.mod h1:a1uqRtAwp2Xwc6WNPJEufxJ7fx3npB4UV/JOLmbu5I0= github.com/Shopify/goreferrer v0.0.0-20220729165902-8cddb4f5de06/go.mod h1:7erjKLwalezA0k99cWs5L11HWOAPNjdUZ6RxH1BXbbM= github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d/go.mod h1:HI8ITrYtUY+O+ZhtlqUnD8+KwNPOyugEhfP9fdUIaEQ= github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= @@ -480,10 +486,12 @@ github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMx github.com/StackExchange/wmi v1.2.1/go.mod h1:rcmrprowKIVzvc+NUiLncP2uuArMWLCbu9SBzvHz7e8= github.com/VictoriaMetrics/fastcache v1.6.0/go.mod h1:0qHz5QP0GMX4pfmMA/zt5RgfNuXJrTP0zS7DqpHGGTw= github.com/VictoriaMetrics/fastcache v1.10.0/go.mod h1:tjiYeEfYXCqacuvYw/7UoDIeJaNxq6132xHICNP77w8= +github.com/VictoriaMetrics/fastcache v1.12.1/go.mod h1:tX04vaqcNoQeGLD+ra5pU5sWkuxnzWhEzLwhP9w653o= github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= github.com/aclements/go-gg v0.0.0-20170118225347-6dbb4e4fefb0/go.mod h1:55qNq4vcpkIuHowELi5C8e+1yUHtoLoOUR9QU5j7Tes= github.com/aclements/go-moremath v0.0.0-20210112150236-f10218a38794/go.mod h1:7e+I0LQFUI9AXWxOfsQROs9xPhoJtbsyWcjJqDd4KPY= github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= +github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY= github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= github.com/ajstarks/svgo v0.0.0-20210923152817-c3b6e2f0c527/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= github.com/alecthomas/kingpin/v2 v2.3.1/go.mod h1:oYL5vtsvEHZGHxU7DMp32Dvx+qL+ptGn6lWaot2vCNE= @@ -511,6 +519,7 @@ github.com/aristanetworks/goarista v0.0.0-20200805130819-fd197cf57d96 h1:XJH0YfV github.com/aristanetworks/goarista v0.0.0-20200805130819-fd197cf57d96/go.mod h1:QZe5Yh80Hp1b6JxQdpfSEEe8X7hTyTEZSosSrFf/oJE= github.com/aristanetworks/splunk-hec-go v0.3.3/go.mod h1:1VHO9r17b0K7WmOlLb9nTk/2YanvOEnLMUgsFrxBROc= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= +github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= @@ -532,12 +541,14 @@ github.com/aws/aws-sdk-go-v2/service/ssooidc v1.17.3/go.mod h1:a7bHA82fyUXOm+ZSW github.com/aws/aws-sdk-go-v2/service/sts v1.23.2/go.mod h1:Eows6e1uQEsc4ZaHANmsPRzAKcVDrcmjjWiih2+HUUQ= github.com/aws/smithy-go v1.15.0/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4= +github.com/aymerick/raymond v2.0.3-0.20180322193309-b565731e1464+incompatible/go.mod h1:osfaiScAUVup+UC9Nfq76eWqDhXlp+4UYaA8uhTBO6g= github.com/beorn7/perks v0.0.0-20160804104726-4c0e84591b9a/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/bitly/go-simplejson v0.5.0/go.mod h1:cXHtHw4XUPsvGaxgjIAn8PhEWG9NfngEKAMDJEczWVA= github.com/bits-and-blooms/bitset v1.2.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= github.com/bits-and-blooms/bitset v1.5.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= +github.com/bits-and-blooms/bitset v1.7.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= github.com/blang/semver v3.1.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= @@ -591,6 +602,7 @@ github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4 github.com/cloudflare/cloudflare-go v0.79.0/go.mod h1:gkHQf9xEubaQPEuerBuoinR9P8bf8a05Lq0X6WKy1Oc= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= @@ -603,15 +615,21 @@ github.com/cncf/xds/go v0.0.0-20230105202645-06c439db220b/go.mod h1:eXthEFrGJvWH github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= github.com/cockroachdb/datadriven v1.0.0/go.mod h1:5Ib8Meh+jk1RlHIXej6Pzevx/NLlNvQB9pmSBZErGA4= +github.com/cockroachdb/datadriven v1.0.2/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= github.com/cockroachdb/datadriven v1.0.3-0.20230801171734-e384cf455877/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= github.com/cockroachdb/errors v1.6.1/go.mod h1:tm6FTP5G81vwJ5lC0SizQo374JNCOPrHyXGitRJoDqM= github.com/cockroachdb/errors v1.8.1/go.mod h1:qGwQn6JmZ+oMjuLwjWzUNqblqk0xl4CVV3SQbGwK7Ac= +github.com/cockroachdb/errors v1.9.1/go.mod h1:2sxOtL2WIc096WSZqZ5h8fa17rdDq9HZOZLBCor4mBk= github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI= +github.com/cockroachdb/logtags v0.0.0-20211118104740-dabe8e521a4f/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= github.com/cockroachdb/pebble v0.0.0-20230821143352-55b44ac08de8/go.mod h1:bynZ3gvVyhlvjLI7PT6dmZ7g76xzJ7HpxfjgkzCGz6s= github.com/cockroachdb/pebble v0.0.0-20230906160148-46873a6a7a06/go.mod h1:bynZ3gvVyhlvjLI7PT6dmZ7g76xzJ7HpxfjgkzCGz6s= +github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593/go.mod h1:6hk1eMY/u5t+Cf18q5lFMUA1Rc+Sm5I6Ra1QuPyxXCo= github.com/cockroachdb/redact v1.0.8/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= +github.com/cockroachdb/redact v1.1.3/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= github.com/cockroachdb/sentry-go v0.6.1-cockroachdb.2/go.mod h1:8BT+cPK6xvFOcRlk0R8eg+OTkcqI6baNH4xAkpiYVvQ= github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= +github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0/go.mod h1:4Zcjuz89kmFXt9morQgcfYZAYZ5n8WHjt81YYWIwtTM= github.com/consensys/gnark-crypto v0.9.1-0.20230105202408-1a7a29904a7c/go.mod h1:CkbdF9hbRidRJYMRzmfX8TMOr95I2pYXRHF18MzRrvA= github.com/consensys/gnark-crypto v0.10.0/go.mod h1:Iq/P3HHl0ElSjsg2E1gsMwhAyxnxoKK5nVyZKd+/KhU= github.com/containerd/aufs v0.0.0-20200908144142-dab0cbea06f4/go.mod h1:nukgQABAEopAHvB6j7cnP5zJ+/3aVcE7hCYqvIwAHyE= @@ -650,6 +668,7 @@ github.com/containerd/containerd v1.5.0-rc.0/go.mod h1:V/IXoMqNGgBlabz3tHD2TWDoT github.com/containerd/containerd v1.5.1/go.mod h1:0DOxVqwDy2iZvrZp2JUx/E+hS0UNTVn7dJnIOwtYR4g= github.com/containerd/containerd v1.5.7/go.mod h1:gyvv6+ugqY25TiXxcZC3L5yOeYgEw0QMhscqVp1AR9c= github.com/containerd/containerd v1.6.18/go.mod h1:1RdCUu95+gc2v9t3IL+zIlpClSmew7/0YS8O5eQZrOw= +github.com/containerd/containerd v1.6.26/go.mod h1:I4TRdsdoo5MlKob5khDJS2EPT1l1oMNaE2MBm6FrwxM= github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= github.com/containerd/continuity v0.0.0-20190815185530-f2a389ac0a02/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= github.com/containerd/continuity v0.0.0-20191127005431-f65d91d395eb/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= @@ -677,6 +696,7 @@ github.com/containerd/imgcrypt v1.0.4-0.20210301171431-0ae5c75f59ba/go.mod h1:6T github.com/containerd/imgcrypt v1.1.1-0.20210312161619-7ed62a527887/go.mod h1:5AZJNI6sLHJljKuI9IHnw1pWqo/F0nGDOuR9zgTs7ow= github.com/containerd/imgcrypt v1.1.1/go.mod h1:xpLnwiQmEUJPvQoAapeb2SNCxz7Xr6PJrXQb0Dpc4ms= github.com/containerd/imgcrypt v1.1.4/go.mod h1:LorQnPtzL/T0IyCeftcsMEO7AqxUDbdO8j/tSUpgxvo= +github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo= github.com/containerd/nri v0.0.0-20201007170849-eb1350a75164/go.mod h1:+2wGSDGFYfE5+So4M5syatU0N0f0LbWpuqyMi4/BE8c= github.com/containerd/nri v0.0.0-20210316161719-dbaa18c31c14/go.mod h1:lmxnXF6oMkbqs39FiCt1s0R2HSMhcLel9vNL3m4AaeY= github.com/containerd/nri v0.1.0/go.mod h1:lmxnXF6oMkbqs39FiCt1s0R2HSMhcLel9vNL3m4AaeY= @@ -708,9 +728,12 @@ github.com/containers/ocicrypt v1.1.0/go.mod h1:b8AOe0YR67uU8OqfVNcznfFpAzu3rdgU github.com/containers/ocicrypt v1.1.1/go.mod h1:Dm55fwWm1YZAjYRaJ94z2mfZikIyIN4B0oB3dj3jFxY= github.com/containers/ocicrypt v1.1.3/go.mod h1:xpdkbVAuaH3WzbEabUd5yDsl9SwJA5pABH85425Es2g= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= +github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= github.com/coreos/go-iptables v0.4.5/go.mod h1:/mVI274lEDI2ns62jHCDnCyBF9Iwsmekav8Dbxlm1MU= github.com/coreos/go-iptables v0.5.0/go.mod h1:/mVI274lEDI2ns62jHCDnCyBF9Iwsmekav8Dbxlm1MU= github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= +github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-systemd v0.0.0-20161114122254-48702e0da86b/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= @@ -721,10 +744,13 @@ github.com/coreos/go-systemd/v22 v22.0.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+ github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= +github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= github.com/crate-crypto/go-ipa v0.0.0-20220523130400-f11357ae11c7/go.mod h1:gFnFS95y8HstDP6P9pPwzrxOOC5TRDkwbM+ao15ChAI= github.com/crate-crypto/go-ipa v0.0.0-20230601170251-1830d0757c80/go.mod h1:gzbVz57IDJgQ9rLQwfSk696JGWof8ftznEL9GoAv3NI= +github.com/crate-crypto/go-ipa v0.0.0-20231025140028-3c0104f4b233/go.mod h1:geZJZH3SzKCqnz5VT0q/DyIG/tvu/dZk+VIfXicupJs= github.com/crate-crypto/go-kzg-4844 v0.3.0/go.mod h1:SBP7ikXEgDnUPONgm33HtuDZEDtWa3L4QtN1ocJSEQ4= github.com/crate-crypto/go-kzg-4844 v0.6.1-0.20231019121413-3621cc59f0c7/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= +github.com/crate-crypto/go-kzg-4844 v0.7.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/cyberdelia/templates v0.0.0-20141128023046-ca7fffd4298c/go.mod h1:GyV+0YP4qX0UQ7r2MoYZ+AvYDp12OF5yg4q8rGnyNh4= @@ -736,12 +762,14 @@ github.com/d2g/dhcp4server v0.0.0-20181031114812-7d4a0a7f59a5/go.mod h1:Eo87+Kg/ github.com/d2g/hardwareaddr v0.0.0-20190221164911-e7d9fbe030e4/go.mod h1:bMl4RjIciD2oAxI7DmWRx6gbeqrkoLqv3MV0vzNad+I= github.com/dave/jennifer v1.2.0/go.mod h1:fIb+770HOpJ2fmN9EPPKOqm1vMGhB+TwXKMZhrIygKg= github.com/deckarep/golang-set v1.8.0 h1:sk9/l/KqpunDwP7pSjUg0keiOOLEnOBHzykLrsPppp4= +github.com/deckarep/golang-set/v2 v2.1.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.0-20210816181553-5444fa50b93d/go.mod h1:tmAIfUFEirG/Y8jhZ9M+h36obRZAk/1fcSpXwAVlfqE= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs= github.com/deepmap/oapi-codegen v1.6.0/go.mod h1:ryDa9AgbELGeB+YEXE1dR53yAjHwFvE9iAUlWl9Al3M= github.com/deepmap/oapi-codegen v1.8.2/go.mod h1:YLgSKSDv/bZQB7N4ws6luhozi3cEdRktEqrX88CvjIw= github.com/deepmap/oapi-codegen v1.12.4/go.mod h1:3lgHGMu6myQ2vqbbTXH2H1o4eXFTGnFiDaOaKKl5yas= github.com/denverdino/aliyungo v0.0.0-20190125010748-a747050bb1ba/go.mod h1:dV8lFg6daOBZbT6/BDGIz6Y3WFGn8juu6G+CQ6LHtl0= +github.com/dgraph-io/badger v1.6.0/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6psNgSztDR4= github.com/dgraph-io/badger v1.6.2/go.mod h1:JW2yswe3V058sS0kZ2h/AXeDSqFjxnZcRrVH//y2UQE= github.com/dgraph-io/badger/v2 v2.2007.4/go.mod h1:vSw/ax2qojzbN6eXHIx6KPKtCSHJN/Uz0X0VPruTIhk= github.com/dgraph-io/ristretto v0.0.2/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= @@ -752,6 +780,7 @@ github.com/dgrijalva/jwt-go v0.0.0-20170104182250-a601269ab70c/go.mod h1:E3ru+11 github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/go-bitstream v0.0.0-20180413035011-3522498ce2c8/go.mod h1:VMaSuZ+SZcx/wljOQKvp5srsbCiKDEb6K2wC4+PiBmQ= github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2 h1:tdlZCpZ/P9DhczCTSixgIKmwPv6+wP5DGjqLYw5SUiA= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= github.com/djherbis/atime v1.1.0/go.mod h1:28OF6Y8s3NQWwacXc5eZTsEsiMzp7LF8MbXE+XJPdBE= @@ -771,6 +800,7 @@ github.com/docker/docker v20.10.17+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05 github.com/docker/docker v24.0.5+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/docker v24.0.7+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/docker v25.0.4+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v25.0.5+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/docker-credential-helpers v0.6.3/go.mod h1:WRaJzqw3CTB9bk10avuGsjVBZsD05qeibJ1/TYlvc0Y= github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= github.com/docker/go-events v0.0.0-20170721190031-9461782956ad/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA= @@ -780,8 +810,10 @@ github.com/docker/go-metrics v0.0.1/go.mod h1:cG1hvH2utMXtqgqqYE9plW6lDxS3/5ayHz github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw= github.com/docker/libtrust v0.0.0-20150114040149-fa567046d9b1/go.mod h1:cyGadeNEkKy96OOhEzfZl+yxihPEzKnqJwvfuSUqbZE= github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= +github.com/donovanhide/eventsource v0.0.0-20210830082556-c59027999da0/go.mod h1:56wL82FO0bfMU5RvfXoIwSOP2ggqqxT+tAfNEIyxuHw= github.com/dop251/goja v0.0.0-20211022113120-dc8c55024d06/go.mod h1:R9ET47fwRVRPZnOGvHxxhuZcbrMCuiqOz3Rlrh4KSnk= github.com/dop251/goja v0.0.0-20230122112309-96b1610dd4f7/go.mod h1:yRkwfj0CBpOGre+TwBsqPV0IH0Pk73e4PXJOeNDboGs= +github.com/dop251/goja v0.0.0-20230605162241-28ee0ee714f3/go.mod h1:QMWlm50DNe14hD7t24KEqZuUdC9sOTy8W6XbCU1mlw4= github.com/dop251/goja v0.0.0-20230806174421-c933cf95e127/go.mod h1:QMWlm50DNe14hD7t24KEqZuUdC9sOTy8W6XbCU1mlw4= github.com/dop251/goja_nodejs v0.0.0-20210225215109-d91c329300e7/go.mod h1:hn7BA7c8pLvoGndExHudxTDKZ84Pyvv+90pbBjbTz0Y= github.com/dop251/goja_nodejs v0.0.0-20211022123610-8dd9abb0616d/go.mod h1:DngW8aVqWbuLRMHItjPUyqdj+HWPvnQe8V8y1nDpIbM= @@ -795,13 +827,16 @@ github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFP github.com/eclipse/paho.mqtt.golang v1.2.0/go.mod h1:H9keYFcgq3Qr5OUJm/JZI/i6U7joQ8SYLhZwfeOo6Ts= github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= github.com/edsrzf/mmap-go v1.1.0/go.mod h1:19H/e8pUPLicwkyNgOykDXkJ9F0MHE+Z52B8EIth78Q= +github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385/go.mod h1:0vRUJqYpeSZifjYj7uP3BG/gKcuzL9xWVV/Y+cK33KM= github.com/emicklei/dot v0.11.0/go.mod h1:DeV7GvQtIw4h2u73RKBkkFdvVAz0D9fzeJrgPW6gy/s= github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= @@ -812,22 +847,31 @@ github.com/envoyproxy/protoc-gen-validate v0.6.7/go.mod h1:dyJXwwfPK2VSqiB9Klm1J github.com/envoyproxy/protoc-gen-validate v0.9.1/go.mod h1:OKNgG7TCp5pF4d6XftA0++PMirau2/yoOwVac3AbF2w= github.com/envoyproxy/protoc-gen-validate v0.10.1/go.mod h1:DRjgyB0I43LtJapqN6NiRwroiAU2PaFuvk/vjgh61ss= github.com/envoyproxy/protoc-gen-validate v1.0.2/go.mod h1:GpiZQP3dDbg4JouG/NNS7QWXpgx6x8QiMKdmN72jogE= +github.com/etcd-io/bbolt v1.3.3/go.mod h1:ZF2nL25h33cCyBtcyWeZ2/I3HQOfTP+0PIEvHjkjCrw= github.com/ethereum/c-kzg-4844 v0.3.0/go.mod h1:WI2Nd82DMZAAZI1wV2neKGost9EKjvbpQR9OqE5Qqa8= github.com/ethereum/c-kzg-4844 v0.3.1/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= github.com/ethereum/c-kzg-4844 v0.3.2-0.20231019020040-748283cced54/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= +github.com/ethereum/c-kzg-4844 v0.4.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= github.com/ethereum/go-ethereum v1.12.2-0.20230815181937-e0b119884c6a/go.mod h1:1JU/x0JQLBndZb2727eswdCzyF2rFd8SZUj7HDQuVqc= github.com/ethereum/go-ethereum v1.13.1/go.mod h1:xHQKzwkHSl0gnSjZK1mWa06XEdm9685AHqhRknOzqGQ= +github.com/ethereum/go-ethereum v1.13.5-0.20231127143928-5b57727d6de2/go.mod h1:iogCB+O7R3eFmlyiEKRDqjmJbSgOsDHTjxE0PU6CYC8= github.com/ethereum/hive v0.0.0-20230401205547-71595beab31d/go.mod h1:zKL2DscVzRusnGVpseAvLrXGJ3qrGHuSfOIrv4JfnRk= +github.com/ethereum/hive v0.0.0-20240319152821-ae224371b4e5/go.mod h1:MGwUXPGco6YS3brOf5WEILfUnnUL/XuX1224ab3D7XA= github.com/ethereum/hive/hiveproxy v0.0.0-20230313101845-c7dfe88c8138 h1:Y74Ksk90DLCMWnpOfOEWRLxVjsf/67vY+hX5kWu9UY0= github.com/ethereum/hive/hiveproxy v0.0.0-20230313101845-c7dfe88c8138/go.mod h1:1LWNU6/EYsIOXZGa2KdklD1ET77gLTeEyhq+WTZ+37o= github.com/ethereum/hive/hiveproxy v0.0.0-20230919105823-37cbbe1ef86d/go.mod h1:0tWUtPhJgk9z3K41wqHV0IYY6/jJWOlfo4rI4v3Mr1E= +github.com/ethereum/hive/hiveproxy v0.0.0-20240610172618-786a798a0cfe/go.mod h1:H5dh/7x2Mf5SR7cKLXDZLWRMtolNhvb3uKR1Gy3aF60= github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanw/esbuild v0.17.6/go.mod h1:iINY06rn799hi48UqEnaQvVfZWe6W9bET78LbvN8VWk= github.com/evanw/esbuild v0.18.11/go.mod h1:iINY06rn799hi48UqEnaQvVfZWe6W9bET78LbvN8VWk= +github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072/go.mod h1:duJ4Jxv5lDcvg4QuQr0oowTf7dz4/CR8NtyCooz9HL8= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= +github.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE= +github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= github.com/ferranbt/fastssz v0.0.0-20210120143747-11b9eff30ea9/go.mod h1:DyEu2iuLBnb/T51BlsiO3yLYdJC6UbGMrIkqK1KmQxM= github.com/fjl/gencodec v0.0.0-20220412091415-8bb9e558978c/go.mod h1:AzA8Lj6YtixmJWL+wkKoBGsLWy9gFrAzi4g+5bCKwpY= github.com/fjl/gencodec v0.0.0-20230517082657-f9840df7b83e/go.mod h1:AzA8Lj6YtixmJWL+wkKoBGsLWy9gFrAzi4g+5bCKwpY= +github.com/fjl/memsize v0.0.1/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= github.com/flosch/pongo2 v0.0.0-20190707114632-bbf5a6c351f4/go.mod h1:T9YF2M40nIgbVgp3rreNmTged+9HrbNTIQf1PsaIiTA= github.com/flosch/pongo2/v4 v4.0.2/go.mod h1:B5ObFANs/36VwxxlgKpdchIJHMvHB562PW+BWPhwZD8= github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= @@ -841,28 +885,35 @@ github.com/fsnotify/fsnotify v1.4.3-0.20170329110642-4da3e2cfbabc/go.mod h1:jwhs github.com/fsouza/go-dockerclient v1.8.1 h1:a27vHYqNSZz88nUAurI1o6W5PgEt63nAWilOI+j63RE= github.com/fsouza/go-dockerclient v1.8.1/go.mod h1:zmA2ogSxRnXmbZcy0Aq7yhRoCdP/bDns/qghCK9SWtM= github.com/fsouza/go-dockerclient v1.9.8/go.mod h1:74lNReDQxrOaogajs51IvZgkDME4qe9yPJAUEUTJtHw= +github.com/fsouza/go-dockerclient v1.11.0/go.mod h1:0I3TQCRseuPTzqlY4Y3ajfsg2VAdMQoazrkxJTiJg8s= github.com/fullsailor/pkcs7 v0.0.0-20190404230743-d7302db945fa/go.mod h1:KnogPXtdwXqoenmZCw6S+25EAm2MkxbG0deNDu4cbSA= github.com/garslo/gogen v0.0.0-20170306192744-1d203ffc1f61/go.mod h1:Q0X6pkwTILDlzrGEckF6HKjXe48EgsY/l7K7vhY4MW8= github.com/garyburd/redigo v0.0.0-20150301180006-535138d7bcd7/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY= github.com/garyburd/redigo v1.1.1-0.20170914051019-70e1b1943d4f/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY= github.com/garyburd/redigo v1.6.0/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY= +github.com/gavv/httpexpect v2.0.0+incompatible/go.mod h1:x+9tiU1YnrOvnB725RkpoLv1M62hOWzwo5OXotisrKc= github.com/gballet/go-verkle v0.0.0-20220902153445-097bd83b7732/go.mod h1:o/XfIXWi4/GqbQirfRm5uTbXMG5NpqxkxblnbZ+QM9I= github.com/gballet/go-verkle v0.0.0-20230607174250-df487255f46b/go.mod h1:CDncRYVRSDqwakm282WEkjfaAj1hxU/v5RXxk5nXOiI= +github.com/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46/go.mod h1:QNpY22eby74jVhqH4WhDLDwxc/vqsern6pW+u2kbkpc= github.com/gdamore/encoding v1.0.0/go.mod h1:alR0ol34c49FCSBLjhosxzcPHQbf2trDkoo5dl+VrEg= github.com/gdamore/tcell/v2 v2.4.1-0.20210905002822-f057f0a857a1/go.mod h1:Az6Jt+M5idSED2YPGtwnfJV0kXohgdCBPmHGSYc1r04= github.com/gdamore/tcell/v2 v2.5.3/go.mod h1:wSkrPaXoiIWZqW/g7Px4xc79di6FTcpB8tvaKJ6uGBo= github.com/getkin/kin-openapi v0.53.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW6yheSwk8Yi4= github.com/getkin/kin-openapi v0.61.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW6yheSwk8Yi4= github.com/getkin/kin-openapi v0.107.0/go.mod h1:9Dhr+FasATJZjS4iOLvB0hkaxgYdulrNYm2e9epLWOo= +github.com/getsentry/sentry-go v0.12.0/go.mod h1:NSap0JBYWzHND8oMbyi0+XZhUalc1TBdRL1M71JZW2c= github.com/ghemawat/stream v0.0.0-20171120220530-696b145b53b9/go.mod h1:106OIgooyS7OzLDOpUGgm9fA3bQENb/cFSyyBmMoJDs= github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3/go.mod h1:VJ0WA2NBN22VlZ2dKZQPAPnyWw5XTlK1KymzLKsr59s= github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= +github.com/gin-gonic/gin v1.4.0/go.mod h1:OW2EZn3DO8Ln9oIKOvM++LBO+5UPHJJDH72/q/3rZdM= github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M= github.com/gin-gonic/gin v1.8.1 h1:4+fr/el88TOO3ewCmQr8cx/CtZ/umlIRIs5M4NTNjf8= github.com/gin-gonic/gin v1.8.1/go.mod h1:ji8BvRH1azfM+SYow9zQ6SZMvR8qOMZHmsCuWR9tTTk= github.com/glycerine/go-unsnap-stream v0.0.0-20180323001048-9f0cb55181dd/go.mod h1:/20jfyN9Y5QPEAprSgKAUr+glWDY39ZiUEAYOEv5dsE= github.com/glycerine/goconvey v0.0.0-20190410193231-58a59202ab31/go.mod h1:Ogl1Tioa0aV7gstGFO7KhffUsb9M4ydbEbbxpcEDc24= +github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= github.com/go-chi/chi/v5 v5.0.0/go.mod h1:BBug9lr0cqtdAhsu6R4AAdvufI0/XBzAQSsUqJpoZOs= github.com/go-chi/chi/v5 v5.0.7/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g= @@ -889,6 +940,7 @@ github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbV github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab/go.mod h1:/P9AEU963A2AYjv4d1V5eVL1CQbEJq6aCNHDDjibzu8= github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8= github.com/go-ole/go-ole v1.2.5/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0= @@ -924,10 +976,13 @@ github.com/go-stack/stack v1.6.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/me github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-yaml/yaml v2.1.0+incompatible h1:RYi2hDdss1u4YE7GwixGzWwVo47T8UQwnTLB6vQiq+o= github.com/go-yaml/yaml v2.1.0+incompatible/go.mod h1:w2MrLa16VYP0jy6N7M5kHaCkaLENm+P+Tv+MfurjSw0= +github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= github.com/gobwas/httphead v0.1.0 h1:exrUm0f4YX0L7EBwZHuCF4GDp8aJfVeBrlLQrs6NqWU= github.com/gobwas/httphead v0.1.0/go.mod h1:O/RXo79gxV8G+RqlR/otEwx4Q36zl9rqC5u12GKvMCM= +github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= github.com/gobwas/pool v0.2.1 h1:xfeeEhW7pwmX8nuLVlqbzVc7udMDrwetjEv+TZIz1og= github.com/gobwas/pool v0.2.1/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= +github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= github.com/gobwas/ws v1.1.0/go.mod h1:nzvNcVha5eUziGrbxFCo6qFIojQHjJV5cLYIbezhfL0= github.com/gobwas/ws v1.2.1 h1:F2aeBZrm2NDsc7vbovKrWSogd4wvfAxg0FQ89/iqOTk= github.com/gobwas/ws v1.2.1/go.mod h1:hRKAFb8wOxFROYNsT1bqfWnhX+b5MFeJM9r2ZSwg/KY= @@ -939,14 +994,19 @@ github.com/godbus/dbus v0.0.0-20180201030542-885f9cc04c9c/go.mod h1:/YcGZj5zSblf github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= github.com/godbus/dbus/v5 v5.0.6/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gofrs/uuid v3.3.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= +github.com/gogo/googleapis v0.0.0-20180223154316-0cd9801be74a/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= github.com/gogo/googleapis v1.2.0/go.mod h1:Njal3psf3qN6dwBtQfUmBZh2ybovJ0tlu3o/AC7HYjU= github.com/gogo/googleapis v1.4.0/go.mod h1:5YRNX2z1oM5gXdAkurHa942MDgEJyk02w4OecKY87+c= +github.com/gogo/googleapis v1.4.1/go.mod h1:2lpHqI5OcWCtVElxXnPt+s8oJvMpySlOyM6xDCrzib4= +github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.0/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= +github.com/gogo/status v1.1.0/go.mod h1:BFv9nrluPLmrS0EmGVvLaPNmRosr9KapBYd5/hpY1WM= github.com/golang-jwt/jwt v3.2.1+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY= +github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= github.com/golang-jwt/jwt/v4 v4.2.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= github.com/golang-jwt/jwt/v4 v4.4.3/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= @@ -964,10 +1024,13 @@ github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3K github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= +github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/snappy v0.0.0-20170215233205-553a64147049/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golangci/lint-1 v0.0.0-20181222135242-d2cdd8c08219/go.mod h1:/X8TswGSh1pIozq4ZwCfxS0WA5JGXguxk94ar/4c87Y= +github.com/gomodule/redigo v1.7.1-0.20190724094224-574c33c3df38/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4= github.com/gonum/blas v0.0.0-20181208220705-f22b278b28ac/go.mod h1:P32wAyui1PQ58Oce/KYkOqQv8cVw1zAapXOl+dRFGbc= github.com/gonum/floats v0.0.0-20181209220543-c233463c7e82/go.mod h1:PxC8OnwL11+aosOB5+iEPoV3picfs8tUpkVd0pDo+Kg= github.com/gonum/internal v0.0.0-20181124074243-f884aa714029/go.mod h1:Pu4dmpkhSyOzRwuXkOgAvijx4o+4YMUJJo9OvPYMkks= @@ -977,6 +1040,7 @@ github.com/google/flatbuffers v1.11.0/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv github.com/google/flatbuffers v2.0.8+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= github.com/google/go-cmp v0.1.1-0.20171103154506-982329095285/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= @@ -1041,6 +1105,7 @@ github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB7 github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gostaticanalysis/comment v1.4.2/go.mod h1:KLUTGDv6HOCotCH8h2erHKmpci2ZoR8VPu34YA2uzdM= github.com/gostaticanalysis/testutil v0.3.1-0.20210208050101-bfb5c8eec0e4/go.mod h1:D+FIZ+7OahH3ePw/izIEeH5I06eKs1IKI4Xr64/Am3M= github.com/graph-gophers/graphql-go v1.3.0/go.mod h1:9CQHMSxwO4MprSdzoIEobiHpoLtHm77vfxsvsIN5Vuc= @@ -1080,10 +1145,12 @@ github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdv github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= github.com/hashicorp/golang-lru/arc/v2 v2.0.5/go.mod h1:ny6zBSQZi2JxIeYcv7kt2sH2PXJtirBN7RDhRpxPkxU= github.com/hashicorp/hcl v0.0.0-20170914154624-68e816d1c783/go.mod h1:oZtUIOe8dh44I2q6ScRibXws4Ajl+d+nod3AaR9vL5w= +github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= @@ -1091,13 +1158,17 @@ github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/J github.com/hashicorp/yamux v0.1.1/go.mod h1:CtWFDAQgb7dxtzFs4tWbplKIe2jSi3+5vKbgIO0SLnQ= github.com/herumi/bls-eth-go-binary v0.0.0-20210130185500-57372fb27371/go.mod h1:luAnRm3OsMQeokhGzpYmc0ZKwawY7o87PUEP11Z7r7U= github.com/herumi/bls-eth-go-binary v0.0.0-20210917013441-d37c07cfda4e/go.mod h1:luAnRm3OsMQeokhGzpYmc0ZKwawY7o87PUEP11Z7r7U= +github.com/holiman/billy v0.0.0-20230718173358-1c7e68d277a7/go.mod h1:5GuXa7vkL8u9FkFuWdVvfR5ix8hRB7DbOAaYULamFpc= github.com/holiman/goevmlab v0.0.0-20221201133036-b31966a5267d/go.mod h1:tQJ4EfAokPShVDyEwKslIWKyt0qA/z8u+iK3kAwO424= github.com/holiman/goevmlab v0.0.0-20221207202144-89074274e1b7/go.mod h1:t5n9hEKnVqrEclta+MoEDjI2D9X7bi8OiWGmyYuNhMk= github.com/holiman/goevmlab v0.0.0-20230917164918-f3777d0b880b/go.mod h1:Xf54jEqUJ0PwTEF9Z6e8FSLpnLpyB0QUfdHA3you/sw= +github.com/holiman/uint256 v1.2.3/go.mod h1:SC8Ryt4n+UBbPbIBKaG9zbbDlp4jOru9xFZmPzLUTxw= github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= github.com/huin/goupnp v1.0.3/go.mod h1:ZxNlw5WqJj6wSsRK5+YfflQGXYfccj5VgQsMNixHM7Y= github.com/huin/goupnp v1.2.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8= github.com/hydrogen18/memlistener v0.0.0-20141126152155-54553eb933fb/go.mod h1:qEIFzExnS6016fRpRfxrExeVn2gbClQA99gQhnIcdhE= +github.com/hydrogen18/memlistener v0.0.0-20200120041712-dcc25e7acd91/go.mod h1:qEIFzExnS6016fRpRfxrExeVn2gbClQA99gQhnIcdhE= +github.com/hydrogen18/memlistener v1.0.0/go.mod h1:qEIFzExnS6016fRpRfxrExeVn2gbClQA99gQhnIcdhE= github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= github.com/ianlancetaylor/cgosymbolizer v0.0.0-20200424224625-be1b05b0b279/go.mod h1:a5aratAVTWyz+nJMmDsN8O4XTfaLfdAsB1ysCmZX5Bw= github.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w= @@ -1107,7 +1178,9 @@ github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJ github.com/imdario/mergo v0.3.10/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= +github.com/imkira/go-interpol v1.1.0/go.mod h1:z0h2/2T3XF8kyEPpRgJ3kmNv+C43p+I/CoI+jC3w2iA= github.com/inconshreveable/log15 v0.0.0-20170622235902-74a0988b5f80/go.mod h1:cOaXtrgN4ScfRrD9Bre7U1thNq5RtJ8ZoP4iXVGRj6o= +github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/influxdata/flux v0.65.1/go.mod h1:J754/zds0vvpfwuq7Gc2wRdVwEodfpCFM7mYlOw2LqY= github.com/influxdata/influxdb v1.8.3/go.mod h1:JugdFhsvvI8gadxOI6noqNeeBHvWNTbfYGtiAn+2jhI= github.com/influxdata/influxdb-client-go/v2 v2.4.0/go.mod h1:vLNHdxTJkIf2mSLvGrpj8TCcISApPoXkaxP8g9uRlW8= @@ -1134,9 +1207,14 @@ github.com/ipfs/go-ds-leveldb v0.5.0/go.mod h1:d3XG9RUDzQ6V4SHi8+Xgj9j1XuEk1z82l github.com/ipfs/go-ipfs-delay v0.0.0-20181109222059-70721b86a9a8/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG9QfXmbRPrw= github.com/ipfs/go-ipfs-util v0.0.2/go.mod h1:CbPtkWJzjLdEcezDns2XYaehFVNXG9zrdrtMecczcsQ= github.com/ipfs/go-log/v2 v2.0.5/go.mod h1:eZs4Xt4ZUJQFM3DlanGhy7TkwwawCZcSByscwkWG+dw= +github.com/iris-contrib/blackfriday v2.0.0+incompatible/go.mod h1:UzZ2bDEoaSGPbkg6SAB4att1aAwTmVIx/5gCVqeyUdI= +github.com/iris-contrib/go.uuid v2.0.0+incompatible/go.mod h1:iz2lgM/1UnEf1kP0L/+fafWORmlnuysV2EMP8MW+qe0= github.com/iris-contrib/httpexpect/v2 v2.12.1/go.mod h1:7+RB6W5oNClX7PTwJgJnsQP3ZuUUYB3u61KCqeSgZ88= github.com/iris-contrib/i18n v0.0.0-20171121225848-987a633949d0/go.mod h1:pMCz62A0xJL6I+umB2YTlFRwWXaDFA0jy+5HzGiJjqI= +github.com/iris-contrib/jade v1.1.3/go.mod h1:H/geBymxJhShH5kecoiOCSssPX7QWYH7UaeZTSWddIk= github.com/iris-contrib/jade v1.1.4/go.mod h1:EDqR+ur9piDl6DUgs6qRrlfzmlx/D5UybogqrXvJTBE= +github.com/iris-contrib/pongo2 v0.0.1/go.mod h1:Ssh+00+3GAZqSQb30AvBRNxBx7rf0GqwkjqxNd0u65g= +github.com/iris-contrib/schema v0.0.1/go.mod h1:urYA3uvUNG1TIIjOSCzHr9/LmbQo8LrOcOqfqxa4hXw= github.com/iris-contrib/schema v0.0.6/go.mod h1:iYszG0IOsuIsfzjymw1kMzTL8YQcCWlm65f3wX8J5iA= github.com/j-keck/arping v0.0.0-20160618110441-2cf9dc699c56/go.mod h1:ymszkNOg6tORTn+6F6j+Jc8TOr5osrynvN6ivFWZ2GA= github.com/jbenet/go-cienv v0.1.0/go.mod h1:TqNnHUmJgXau0nCzC7kXWeotg3J9W34CUv5Djy1+FlA= @@ -1155,8 +1233,10 @@ github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFF github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/jsternberg/zap-logfmt v1.0.0/go.mod h1:uvPs/4X51zdkcm5jXl5SYoN+4RK21K8mysFmDaM/h+o= +github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/juju/ansiterm v0.0.0-20180109212912-720a0952cc2a/go.mod h1:UJSiEoRfvx3hP73CvoARgeLjaIOjybY9vj8PUPPFGeU= github.com/juju/errors v0.0.0-20181118221551-089d3ea4e4d5/go.mod h1:W54LbzXuIE0boCoNJfwqpmkKJ1O4TCTZMetAt6jGk7Q= github.com/juju/gnuflag v0.0.0-20171113085948-2ce1bb71843d/go.mod h1:2PavIy+JPciBPrBUjwbNvtwB6RQlve+hkpll6QSNmOE= @@ -1166,26 +1246,35 @@ github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7V github.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= github.com/jwilder/encoding v0.0.0-20170811194829-b4e1701a28ef/go.mod h1:Ct9fl0F6iIOGgxJ5npU/IUOhOhqlVrGjyIZc8/MagT0= +github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88/go.mod h1:3w7q1U84EfirKl04SVQ/s7nPm1ZPhiXd34z40TNz36k= github.com/k0kubun/go-ansi v0.0.0-20180517002512-3bf9e2903213 h1:qGQQKEcAR99REcMpsXCp3lJ03zYT1PkRd3kQGPn9GVg= github.com/k0kubun/go-ansi v0.0.0-20180517002512-3bf9e2903213/go.mod h1:vNUNkEQ1e29fT/6vq2aBdFsgNPmy8qMdSay1npru+Sw= +github.com/karalabe/hid v1.0.1-0.20240306101548-573246063e52/go.mod h1:qk1sX/IBgppQNcGCRoj90u6EGC056EBoIc1oEjCWla8= github.com/karalabe/usb v0.0.2/go.mod h1:Od972xHfMJowv7NGVDiWVxk2zxnWgjLlJzE+F4F7AGU= github.com/karalabe/usb v0.0.3-0.20230711191512-61db3e06439c/go.mod h1:Od972xHfMJowv7NGVDiWVxk2zxnWgjLlJzE+F4F7AGU= github.com/kataras/blocks v0.0.7/go.mod h1:UJIU97CluDo0f+zEjbnbkeMRlvYORtmc1304EeyXf4I= github.com/kataras/golog v0.0.9/go.mod h1:12HJgwBIZFNGL0EJnMRhmvGA0PQGx8VFwrZtM4CqbAk= +github.com/kataras/golog v0.0.10/go.mod h1:yJ8YKCmyL+nWjERB90Qwn+bdyBZsaQwU3bTVFgkFIp8= github.com/kataras/golog v0.1.8/go.mod h1:rGPAin4hYROfk1qT9wZP6VY2rsb4zzc37QpdPjdkqVw= github.com/kataras/iris/v12 v12.0.1/go.mod h1:udK4vLQKkdDqMGJJVd/msuMtN6hpYJhg/lSzuxjhO+U= +github.com/kataras/iris/v12 v12.1.8/go.mod h1:LMYy4VlP67TQ3Zgriz8RE2h2kMZV2SgMYbq3UhfoFmE= github.com/kataras/iris/v12 v12.2.0/go.mod h1:BLzBpEunc41GbE68OUaQlqX4jzi791mx5HU04uPb90Y= github.com/kataras/jwt v0.1.8/go.mod h1:Q5j2IkcIHnfwy+oNY3TVWuEBJNw0ADgCcXK9CaZwV4o= github.com/kataras/neffos v0.0.10/go.mod h1:ZYmJC07hQPW67eKuzlfY7SO3bC0mw83A3j6im82hfqw= +github.com/kataras/neffos v0.0.14/go.mod h1:8lqADm8PnbeFfL7CLXh1WHw53dG27MC3pgi2R1rmoTE= github.com/kataras/neffos v0.0.21/go.mod h1:FeGka8lu8cjD2H+0OpBvW8c6xXawy3fj5VX6xcIJ1Fg= github.com/kataras/pio v0.0.0-20190103105442-ea782b38602d/go.mod h1:NV88laa9UiiDuX9AhMbDPkGYSPugBOV6yTZB1l2K9Z0= +github.com/kataras/pio v0.0.2/go.mod h1:hAoW0t9UmXi4R5Oyq5Z4irTbaTsOemSrDGUtaTl7Dro= github.com/kataras/pio v0.0.11/go.mod h1:38hH6SWH6m4DKSYmRhlrCJ5WItwWgCVrTNU62XZyUvI= +github.com/kataras/sitemap v0.0.5/go.mod h1:KY2eugMKiPwsJgx7+U103YZehfvNGOXURubcGyk0Bz8= github.com/kataras/sitemap v0.0.6/go.mod h1:dW4dOCNs896OR1HmG+dMLdT7JjDk7mYBzoIRwuj5jA4= github.com/kataras/tunnel v0.0.4/go.mod h1:9FkU4LaeifdMWqZu7o20ojmW4B7hdhv2CMLwfnHGpYw= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/klauspost/asmfmt v1.3.2/go.mod h1:AG8TuvYojzulgDAMCnYn50l/5QV3Bs/tp6j0HLHbNSE= github.com/klauspost/compress v1.4.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= +github.com/klauspost/compress v1.8.2/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= github.com/klauspost/compress v1.9.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= +github.com/klauspost/compress v1.9.7/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= github.com/klauspost/compress v1.9.8/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= github.com/klauspost/compress v1.10.1/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= @@ -1196,6 +1285,7 @@ github.com/klauspost/compress v1.16.0/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQs github.com/klauspost/compress v1.17.2/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= github.com/klauspost/cpuid v0.0.0-20170728055534-ae7887de9fa5/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= github.com/klauspost/cpuid v1.2.1 h1:vJi+O/nMdFt0vqm8NZBI6wzALWdA2X+egi0ogNyrC/w= +github.com/klauspost/cpuid v1.2.1/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= github.com/klauspost/cpuid v1.2.3 h1:CCtW0xUnWGVINKvE/WWOYKdsPV6mawAtvQuSl8guwQs= github.com/klauspost/cpuid v1.2.3/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= @@ -1211,12 +1301,15 @@ github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxv github.com/korovkin/limiter v0.0.0-20221015170604-22eb1ceceddc/go.mod h1:mM0lzivCxB6c8msz/LOP9lJgZxy92GXwGcNG1A7UZEE= github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= +github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= github.com/kylelemons/godebug v0.0.0-20170224010052-a616ab194758/go.mod h1:B69LEHPfb2qLo0BaaOLcbitczOKLWTsrBG9LczfCD4k= github.com/labstack/echo/v4 v4.1.11/go.mod h1:i541M3Fj6f76NZtHSj7TXnyM8n2gaodfvfxNnFqi74g= github.com/labstack/echo/v4 v4.2.1/go.mod h1:AA49e0DZ8kk5jTOOCKNuPR6oTnBS0dYiM4FW1e6jwpg= +github.com/labstack/echo/v4 v4.5.0/go.mod h1:czIriw4a0C1dFun+ObrXp7ok03xON0N1awStJ6ArI7Y= github.com/labstack/echo/v4 v4.9.1/go.mod h1:Pop5HLc+xoc4qhTZ1ip6C0RtP7Z+4VzRLWZZFKqbbjo= github.com/labstack/echo/v4 v4.10.0/go.mod h1:S/T/5fy/GigaXnHTkh0ZGe4LpkkQysvRjFMSUTkDRNQ= +github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= github.com/labstack/gommon v0.4.0/go.mod h1:uW6kP17uPlLJsD3ijUYn3/M5bAxtlZhMI6m3MFxTMTM= github.com/ledongthuc/pdf v0.0.0-20220302134840-0c2507a12d80/go.mod h1:imJHygn/1yfhB7XSJJKlFZKl/J+dCPAknuiaGOshXAs= github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= @@ -1248,6 +1341,7 @@ github.com/lyft/protoc-gen-star v0.6.1/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuz github.com/lyft/protoc-gen-star/v2 v2.0.1/go.mod h1:RcCdONR2ScXaYnQC5tUzxzlpA3WVYF7/opLeUgcQs/o= github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= github.com/magiconair/properties v1.7.4-0.20170902060319-8d7837e64d3c/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/mailgun/raymond/v2 v2.0.48/go.mod h1:lsgvL50kgt1ylcFJYZiULi5fjPBkkhNfj4KA0W54Z18= github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= @@ -1264,14 +1358,22 @@ github.com/matryer/moq v0.2.7/go.mod h1:kITsx543GOENm48TUAQyJ9+SAvFSr7iGQXPoth/V github.com/matryer/try v0.0.0-20161228173917-9ac251b645a2/go.mod h1:0KeJpeMD6o+O4hW7qJOT7vyQPKrWmj26uf5wMc/IiIs= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.0.10-0.20170816031813-ad5389df28cd/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= +github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.7/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.11/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= github.com/mattn/go-isatty v0.0.2/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= +github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= @@ -1280,13 +1382,16 @@ github.com/mattn/go-shellwords v1.0.6/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vq github.com/mattn/go-sqlite3 v1.11.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= github.com/mattn/go-sqlite3 v1.14.5/go.mod h1:WVKg1VTActs4Qso6iwGbiFih2UIHo0ENGwNd0Lj+XmI= github.com/mattn/go-tty v0.0.0-20180907095812-13ff1204f104/go.mod h1:XPvLUNfbS4fJH25nqRHfWLMa1ONC8Amw+mIA639KxkE= +github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw= github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0/go.mod h1:QUyp042oQthUoa9bqDv0ER0wrtXnBruoNd7aNjkbP+k= github.com/maxbrunsfeld/counterfeiter/v6 v6.2.2/go.mod h1:eD9eIE7cdwcMi9rYluz88Jz2VyhSmden33/aXg4oVIY= github.com/mediocregopher/mediocre-go-lib v0.0.0-20181029021733-cb65787f37ed/go.mod h1:dSsfyI2zABAdhcbvkXqgxOxrCsbYeHCPgrZkku60dSg= github.com/mediocregopher/radix/v3 v3.3.0/go.mod h1:EmfVyvspXz1uZEyPBMyGK+kjWiKQGvsUt6O3Pj+LDCQ= +github.com/mediocregopher/radix/v3 v3.4.2/go.mod h1:8FL3F6UQRXHXIBSPUs5h0RybMF8i4n7wVopoX3x7Bv8= github.com/mediocregopher/radix/v3 v3.8.1/go.mod h1:8FL3F6UQRXHXIBSPUs5h0RybMF8i4n7wVopoX3x7Bv8= github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= +github.com/microcosm-cc/bluemonday v1.0.2/go.mod h1:iVP4YcDBq+n/5fb23BhYFvIMq/leAFZyRl6bYmGDlGc= github.com/microcosm-cc/bluemonday v1.0.23/go.mod h1:mN70sk7UkkF8TUr2IGBpNN0jAgStuPzlK76QuruE/z4= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/miekg/dns v1.1.43/go.mod h1:+evo5L0630/F6ca/Z9+GAqzhjGyn8/c+TBaOyfEl0V4= @@ -1295,12 +1400,14 @@ github.com/miekg/pkcs11 v1.0.3/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WT github.com/miekg/pkcs11 v1.1.1/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8/go.mod h1:mC1jAcsrzbxHt8iiaC+zU4b1ylILSosueou12R++wfY= github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3/go.mod h1:RagcQ7I8IeTMnF8JTXieKnO4Z6JCsikNEzj0DwauVzE= +github.com/minio/sha256-simd v0.1.0/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= github.com/minio/sha256-simd v0.1.1/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM= github.com/mistifyio/go-zfs v2.1.2-0.20190413222219-f784269be439+incompatible/go.mod h1:8AuVvqP/mXw1px98n46wfvcGfQ4ci2FwoAjKYxuo3Z4= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db h1:62I3jR2EmQ4l5rM/4FEfDWcRD+abF5XlKShorW5LRoQ= github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db/go.mod h1:l0dey0ia/Uv7NcFFVbCLtqEBQbrT4OCwCSKTEv6enCw= github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= github.com/mitchellh/go-wordwrap v1.0.1/go.mod h1:R62XHJLzvMFRBbcrT7m7WgmE1eOyTSsCt+hzestvNj0= github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= @@ -1322,12 +1429,14 @@ github.com/moby/sys/sequential v0.5.0/go.mod h1:tH2cOOs5V9MlPiXcQzRC+eEyab644PWK github.com/moby/sys/signal v0.6.0/go.mod h1:GQ6ObYZfqacOwTtlXvcmh9A26dVRul/hbOZn88Kg8Tg= github.com/moby/sys/symlink v0.1.0/go.mod h1:GGDODQmbFOjFsXvfLVn3+ZRxkch54RkSiGqsZeMYowQ= github.com/moby/sys/symlink v0.2.0/go.mod h1:7uZVF2dqJjG/NsClqul95CqKOBRQyYSNnJ6BMgR/gFs= +github.com/moby/sys/user v0.1.0/go.mod h1:fKJhFOnsCN6xZ5gSfbM6zaHGgDJMrqt9/reuj4T7MmU= github.com/moby/term v0.0.0-20200312100748-672ec06f55cd/go.mod h1:DdlQx2hp0Ss5/fLikoLlEeIYiATotOjgB//nb973jeo= github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6/go.mod h1:E2VnQOmVuvZB6UYnnDB0qG5Nq/1tD9acaOpo6xmt0Kw= github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5/go.mod h1:caMODM3PzxT8aQXRPkAt8xlV/e7d7w8GM5g0fa5F0D8= github.com/montanaflynn/stats v0.6.6/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= github.com/montanaflynn/stats v0.7.0/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= +github.com/moul/http2curl v1.0.0/go.mod h1:8UbvGypXm98wA/IqH45anm5Y2Z6ep6O31QGOAZ3H0fQ= github.com/mr-tron/base58 v1.1.0/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= github.com/mr-tron/base58 v1.1.3/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= github.com/mrunalp/fileutils v0.5.0/go.mod h1:M1WthSahJixYnrXQl/DFQuteStB1weuxD2QJNHXfbSQ= @@ -1346,14 +1455,18 @@ github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRW github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/naoina/go-stringutil v0.1.0/go.mod h1:XJ2SJL9jCtBh+P9q5btrd/Ylo8XwT/h1USek5+NqSA0= github.com/naoina/toml v0.1.2-0.20170918210437-9fafd6967416/go.mod h1:NBIhNtsFMo3G2szEBne+bO4gS192HuIYRqfvOWb4i1E= +github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= github.com/nats-io/jwt v0.3.2/go.mod h1:/euKqTS1ZD+zzjYrY7pseZrTtWQSjujC7xjPc8wL6eU= github.com/nats-io/jwt/v2 v2.3.0/go.mod h1:0tqz9Hlu6bCBFLWAASKhE5vUA4c24L9KPUUgvwumE/k= github.com/nats-io/nats-server/v2 v2.1.2/go.mod h1:Afk+wRZqkMQs/p45uXdrVLuab3gwv3Z8C4HTBu8GD/k= github.com/nats-io/nats.go v1.8.1/go.mod h1:BrFz9vVn0fU3AcH9Vn4Kd7W0NpJ651tD5omQ3M8LwxM= +github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= github.com/nats-io/nats.go v1.23.0/go.mod h1:ki/Scsa23edbh8IRZbCuNXR9TDcbvfaSijKtaqQgw+Q= github.com/nats-io/nkeys v0.0.2/go.mod h1:dab7URMsZm6Z/jp9Z5UGa87Uutgc2mVpXLC4B7TDb/4= +github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= github.com/nats-io/nkeys v0.3.0/go.mod h1:gvUNGjVcM2IPr5rCsRsC6Wb3Hr2CQAm08dsxtV6A5y4= +github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= github.com/ncw/swift v1.0.47/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= @@ -1363,6 +1476,7 @@ github.com/onsi/ginkgo v0.0.0-20151202141238-7f8ab55aaf3b/go.mod h1:lLunBs/Ym6LB github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg= github.com/onsi/ginkgo v1.13.0/go.mod h1:+REjRxOmWfHCjfv9TTWB1jD1Frx4XydAD3zm1lskyM0= @@ -1392,6 +1506,7 @@ github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3I github.com/opencontainers/image-spec v1.0.0/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= github.com/opencontainers/image-spec v1.0.3-0.20211202183452-c5a74bcca799/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= +github.com/opencontainers/image-spec v1.1.0-rc2.0.20221005185240-3a7f492d3f1b/go.mod h1:3OVijpioIKYWTqjiG0zfF6wvoJ4fAXGbjdZuI2NgsRQ= github.com/opencontainers/runc v0.0.0-20190115041553-12f6a991201f/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= github.com/opencontainers/runc v0.1.1/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= github.com/opencontainers/runc v1.0.0-rc8.0.20190926000215-3e425f80a8c9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= @@ -1433,6 +1548,7 @@ github.com/paulbellamy/ratecounter v0.2.0/go.mod h1:Hfx1hDpSGoqxkVVpBi/IlYD7kChl github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= github.com/pborman/uuid v1.2.1/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= github.com/pelletier/go-toml v1.0.1-0.20170904195809-1d6b12b7cb29/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= +github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pelletier/go-toml v1.8.1/go.mod h1:T2/BmBdy8dvIRq1a/8aqjN41wvWlN4lrapLU/GW4pbc= github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= @@ -1546,7 +1662,10 @@ github.com/prometheus/prom2json v1.3.0 h1:BlqrtbT9lLH3ZsOVhXPsHzFrApCTKRifB7gjJu github.com/prometheus/prom2json v1.3.0/go.mod h1:rMN7m0ApCowcoDlypBHlkNbp5eJQf/+1isKykIP5ZnM= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= github.com/prometheus/tsdb v0.10.0/go.mod h1:oi49uRhEe9dPUTlS3JRZOwJuVi6tmh10QSgwXEyGCt4= +github.com/protolambda/bls12-381-util v0.0.0-20210720105258-a772f2aac13e/go.mod h1:MPZvj2Pr0N8/dXyTPS5REeg2sdLG7t8DRzC1rLv925w= +github.com/protolambda/bls12-381-util v0.0.0-20220416220906-d8552aa452c7/go.mod h1:IToEjHuttnUzwZI5KBSM/LOOW3qLbbrHOEfp3SbECGY= github.com/protolambda/messagediff v1.4.0 h1:fk6gxK7WybJCaeOFK1yuh2Ldplx7qYMLibiMwWFcSZY= +github.com/protolambda/messagediff v1.4.0/go.mod h1:LboJp0EwIbJsePYpzh5Op/9G1/4mIztMRYzzwR0dR2M= github.com/prysmaticlabs/go-bitfield v0.0.0-20210108222456-8e92c3709aa0/go.mod h1:hCwmef+4qXWjv0jLDbQdWnL0Ol7cS7/lCSS26WR+u6s= github.com/prysmaticlabs/prombbolt v0.0.0-20210126082820-9b7adba6db7c h1:9PHRCuO/VN0s9k+RmLykho7AjDxblNYI5bYKed16NPU= github.com/prysmaticlabs/prombbolt v0.0.0-20210126082820-9b7adba6db7c/go.mod h1:ZRws458tYHS/Zs936OQ6oCrL+Ict5O4Xpwve1UQ6C9M= @@ -1567,15 +1686,19 @@ github.com/rivo/uniseg v0.4.2/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUc github.com/rjeczalik/notify v0.9.1/go.mod h1:rKwnCoCGeuQnwBtTSPL9Dad03Vh2n40ePRrjvIXnJho= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= +github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= +github.com/rogpeppe/go-internal v1.8.1/go.mod h1:JeRgkft04UBgHMgCIwADu4Pn6Mtm5d4nPKWu0nJ5d+o= github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w= github.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/safchain/ethtool v0.0.0-20190326074333-42ed695e3de8/go.mod h1:Z0q5wiBQGYcxhMZ6gUqHn6pYNLypFAvaL3UvgZLR0U4= github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= github.com/sanity-io/litter v1.5.5/go.mod h1:9gzJgR2i4ZpjZHsKvUXIRQVk7P+yM3e+jAF7bU2UI5U= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= +github.com/schollz/closestmatch v2.1.0+incompatible/go.mod h1:RtP1ddjLong6gTkbtmuhtR2uUrrJOpYzYRvbcPAid+g= github.com/schollz/progressbar/v3 v3.3.4 h1:nMinx+JaEm/zJz4cEyClQeAw5rsYSB5th3xv+5lV6Vg= github.com/schollz/progressbar/v3 v3.3.4/go.mod h1:Rp5lZwpgtYmlvmGo1FyDwXMqagyRBQYSDwzlP9QDu84= github.com/sclevine/agouti v3.0.0+incompatible/go.mod h1:b4WX9W9L1sfQKXeJf1mUTLZKJ48R1S7H23Ji7oFO5Bw= @@ -1596,26 +1719,34 @@ github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6Mwd github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v0.0.0-20170901052352-ee1bd8ee15a1/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= +github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/afero v1.3.3/go.mod h1:5KUK8ByomD5Ti5Artl0RtHeI5pTF7MIDuXL3yY520V4= github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= github.com/spf13/afero v1.9.2/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y= github.com/spf13/afero v1.10.0/go.mod h1:UBogFpq8E9Hx+xc5CNTTEpTnuHVmXDwZcZcE1eb/UhQ= github.com/spf13/cast v1.1.0/go.mod h1:r2rcYCSwa1IExKTDiTfzaxqT2FNHs8hODu4LnUfgKEg= +github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cobra v0.0.2-0.20171109065643-2da4a54c5cee/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= +github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= github.com/spf13/cobra v1.5.0/go.mod h1:dWXEIy2H428czQCjInthrTRUg7yKbok+2Qi/yBIJoUM= github.com/spf13/jwalterweatherman v0.0.0-20170901151539-12bd96e66386/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= +github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/pflag v1.0.1-0.20170901120850-7aff26db30c1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.1-0.20171106142849-4c012f6dcd95/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/viper v1.0.0/go.mod h1:A8kyI5cUJhb8N+3pkfONlcEcZbueH6nhAm0Fq7SrnBM= +github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= github.com/spkg/bom v0.0.0-20160624110644-59b7046e48ad/go.mod h1:qLr4V1qq6nMqFKkMo8ZTx3f+BZEkzsRUY10Xsm2mwU0= github.com/status-im/keycard-go v0.0.0-20190316090335-8537d3370df4/go.mod h1:RZLeN1LMWmRsyYjvAu+I6Dm9QmlDaIIt+Y+4Kd7Tp+Q= @@ -1661,8 +1792,12 @@ github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1 github.com/trailofbits/go-mutexasserts v0.0.0-20230328101604-8cdbc5f3d279 h1:+LynomhWB+14Plp/bOONEAZCtvCZk4leRbTvNzNVkL0= github.com/trailofbits/go-mutexasserts v0.0.0-20230328101604-8cdbc5f3d279/go.mod h1:GA3+Mq3kt3tYAfM0WZCu7ofy+GW9PuGysHfhr+6JX7s= github.com/tyler-smith/go-bip39 v1.0.1-0.20181017060643-dbb3b84ba2ef/go.mod h1:sJ5fKU0s6JVwZjjcUEX2zFOnvq0ASQ2K9Zr6cf67kNs= +github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= +github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= github.com/ugorji/go v1.2.7 h1:qYhyWUUd6WbiM+C6JZAUkIJt/1WrjzNHY9+KCIjVqTo= github.com/ugorji/go v1.2.7/go.mod h1:nF9osbDWLy6bDVv/Rtoh6QgnvNDpmCalQV5urGCCS6M= +github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= +github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= github.com/ugorji/go/codec v1.2.7 h1:YPXUKf7fYbp/y8xloBqZOw2qaVggbfwMlI8WM3wZUJ0= github.com/ugorji/go/codec v1.2.7/go.mod h1:WGN1fab3R1fzQlVQTkfxVtIBhWDRqOviHU95kRgeqEY= github.com/urfave/cli v0.0.0-20171014202726-7bc6a0acffa5/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= @@ -1673,9 +1808,15 @@ github.com/urfave/cli/v2 v2.17.2-0.20221006022127-8f469abc00aa/go.mod h1:1CNUng3 github.com/urfave/cli/v2 v2.23.5/go.mod h1:GHupkWPMM0M/sj1a2b4wUrWBPzazNrIjouW6fmdJLxc= github.com/urfave/cli/v2 v2.23.7/go.mod h1:GHupkWPMM0M/sj1a2b4wUrWBPzazNrIjouW6fmdJLxc= github.com/urfave/cli/v2 v2.24.1/go.mod h1:GHupkWPMM0M/sj1a2b4wUrWBPzazNrIjouW6fmdJLxc= +github.com/urfave/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4= github.com/uudashr/gocognit v1.0.5/go.mod h1:wgYz0mitoKOTysqxTDMOUXg+Jb5SvtihkfmugIZYpEA= +github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= +github.com/valyala/fasthttp v1.6.0/go.mod h1:FstJa9V+Pj9vQ7OJie2qMHdwemEDaDiSdBnvPM1Su9w= github.com/valyala/fasthttp v1.40.0/go.mod h1:t/G+3rLek+CyY9bnIE+YlMRddxVAAGjhxndDB4i4C0I= +github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= +github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= github.com/valyala/fasttemplate v1.2.2/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= +github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio= github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc= github.com/vishvananda/netlink v0.0.0-20181108222139-023a6dafdcdf/go.mod h1:+SR5DhBJrl6ZM7CoCKvpw5BKroDKQ+PJqOg65H/2ktk= github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE= @@ -1697,14 +1838,22 @@ github.com/willf/bitset v1.1.11-0.20200630133818-d5bec3311243/go.mod h1:RjeCKbqT github.com/willf/bitset v1.1.11/go.mod h1:83CECat5yLh5zVOf4P1ErAgKA5UDvKtgyUABdr3+MjI= github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c/go.mod h1:lB8K/P019DLNhemzwFU4jHLhdvlE6uDZjXFejJXr49I= github.com/xdg/stringprep v1.0.0/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y= +github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= github.com/xeipuuv/gojsonschema v0.0.0-20180618132009-1d523034197f/go.mod h1:5yf86TLmAcydyeJq5YvxkGPE2fm/u4myDekKRoLuqhs= +github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= github.com/xhit/go-str2duration v1.2.0/go.mod h1:3cPSlfZlUHVlneIVfePFWcJZsuwf+P1v2SRTV4cUmp4= github.com/xhit/go-str2duration/v2 v2.1.0/go.mod h1:ohY8p+0f07DiV6Em5LKB0s2YpLtXVyJfNt1+BlmyAsU= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xlab/treeprint v0.0.0-20180616005107-d6fb6747feb6/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg= +github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= github.com/xtaci/kcp-go v5.4.20+incompatible/go.mod h1:bN6vIwHQbfHaHtFpEssmWsN45a+AZwO7eyRCmEIbtvE= github.com/xtaci/lossyconn v0.0.0-20190602105132-8df528c0c9ae/go.mod h1:gXtu8J62kEgmN++bm9BVICuT/e8yiLI2KFobd/TRFsE= +github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0/go.mod h1:/LWChgwKmvncFJFHJ7Gvn9wZArjbV5/FppcK2fKk/tI= github.com/yosssi/ace v0.0.5/go.mod h1:ALfIzm2vT7t5ZE7uoIZqF3TQ7SAOyupFZnkrF5id+K0= +github.com/yudai/gojsondiff v1.0.0/go.mod h1:AY32+k2cwILAkW1fbgxQ5mUmMiZFgLIV+FBNExI05xg= +github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82/go.mod h1:lgjkn3NuSvDfVJdfcVVdX+jpBxNmX4rDAzaS45IcYoM= +github.com/yudai/pp v2.0.1+incompatible/go.mod h1:PuxR/8QJ7cyCkFp/aUDS+JY727OFEZkTdatxwunjIkc= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= @@ -1764,9 +1913,12 @@ golang.org/x/crypto v0.0.0-20171113213409-9f005a07e0d3/go.mod h1:6SG95UA2DQfeDnf golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181009213950-7c1a557ab941/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190909091759-094676da4a83/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191219195013-becbf705a915/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20191227163750-53104e6ec876/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200204104054-c9f3fb736b72/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200221231518-2aa609cf4a9d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= @@ -1774,6 +1926,7 @@ golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210314154223-e6e6c4f2bb5b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= @@ -1797,6 +1950,7 @@ golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliY golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= +golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -1809,8 +1963,8 @@ golang.org/x/exp v0.0.0-20230626212559-97b1e661b5df/go.mod h1:FXUEEKJgO7OQYeo8N0 golang.org/x/exp v0.0.0-20230725012225-302865e7556b/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc= golang.org/x/exp v0.0.0-20230810033253-352e893a4cad/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc= golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63/go.mod h1:0v4NqG35kSWCMzLaMeX+IQrlSnVE/bqGSyC2cz/9Le8= +golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k= golang.org/x/exp v0.0.0-20231006140011-7918f672742d/go.mod h1:ldy0pHrwJyGW56pPQzzkH36rKxoZW1tw7ZJpeKx+hdo= -golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa/go.mod h1:zk2irFbV9DP96SEBUUAy67IdHUaZuSnrz1n472HUCLE= golang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611/go.mod h1:iRJReGqOEeBhDZGkGbynYwcHlctCvnjTYIamk7uXpHI= golang.org/x/exp/typeparams v0.0.0-20231108232855-2478ac86f678/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= @@ -1823,6 +1977,7 @@ golang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+o golang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= golang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= @@ -1835,12 +1990,16 @@ golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.10.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.11.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.13.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190327091125-710a502c58a2/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190619014844-b5b0513f8c1b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -1871,6 +2030,7 @@ golang.org/x/net v0.0.0-20210610132358-84b48f89b13b/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210825183410-e898025ed96a/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211008194852-3b03d305991f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= @@ -1899,6 +2059,7 @@ golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= golang.org/x/net v0.18.0/go.mod h1:/czyP5RqHAH4odGYxBJ1qz0+CE5WZ+2j1YgoEo8F2jQ= golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U= golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= +golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= golang.org/x/oauth2 v0.0.0-20170207211851-4464e7848382/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20170912212905-13449ad91cb2/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= @@ -1936,6 +2097,7 @@ golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.2.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sync v0.4.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1944,15 +2106,19 @@ golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190130150945-aca44879d564/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190514135907-3a4b5fb9f71f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190522044717-8097e1b27ff5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190602015325-4c4f7f33c9ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190606203320-7fc4e5ec1444/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190812073006-9eafafc0a87e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191022100944-742c48ecaeb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1961,6 +2127,7 @@ golang.org/x/sys v0.0.0-20191210023423-ac6580df4449/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200107162124-548cf772de50/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200120151820-655fe14d7479/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200217220822-9197077df867/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200219091948-cb0a6d8edb6c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -2000,6 +2167,7 @@ golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210316164454-77fc1eacc6aa/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210426080607-c94f62235c83/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210426230700-d19ff857e887/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -2012,6 +2180,8 @@ golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210906170528-6f6e22806c34/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211020174200-9d6173849985/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -2022,6 +2192,7 @@ golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220318055525-2edf467146b5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -2045,7 +2216,10 @@ golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/telemetry v0.0.0-20240208230135-b75ee8823808/go.mod h1:KG1lNk5ZFNssSZLrpVb4sMXKMpGwGXOxSG3rnu2gZQQ= +golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2/go.mod h1:TeRTkGYfJXctD9OcfyVLyj2J3IxLnKwHJR8f4D8a3YE= golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= @@ -2061,10 +2235,12 @@ golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0= golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.10.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= @@ -2074,14 +2250,19 @@ golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/time v0.0.0-20170424234030-8be79e1e0910/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20220411224347-583f2d630306/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20220922220347-f3bd1da661af/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.2.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181011042414-1f849cf54d09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181221001348-537d06c36207/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190327201419-c70d86f8b7cf/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190706070813-72ffa07ba3db/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI= @@ -2115,6 +2296,7 @@ golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.1-0.20210205202024-ef80cdb6ec6d/go.mod h1:9bzcO0MWcOuT0tm1iBGzDVPshzfwoVvREIui8C+MHqU= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.8-0.20211029000441-d6a9af8af023/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= golang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= @@ -2125,13 +2307,16 @@ golang.org/x/tools v0.3.0/go.mod h1:/rWhSS2+zyEVwoJf8YAX6L2f0ntZ7Kn/mGgAWcipA5k= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= golang.org/x/tools v0.9.1/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc= +golang.org/x/tools v0.11.0/go.mod h1:anzJrxPjNtfgiYQYirP2CPGzGLxrH2u2QBhn6Bf3qY8= golang.org/x/tools v0.12.0/go.mod h1:Sc0INKfu04TlqNoRA1hgpFZbhYXHPr4V5DzpSBTPqQM= golang.org/x/tools v0.12.1-0.20230815132531-74c255bcf846/go.mod h1:Sc0INKfu04TlqNoRA1hgpFZbhYXHPr4V5DzpSBTPqQM= +golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= golang.org/x/tools v0.14.0/go.mod h1:uYBEerGOWcJyEORxN+Ek8+TT266gXkNlHdJBwexUsBg= golang.org/x/tools v0.15.0/go.mod h1:hpksKq4dtpQWS1uQ61JkdqWM3LscIS6Slf+VVkm+wQk= golang.org/x/tools v0.16.0/go.mod h1:kYVVN6I1mBNoB1OX+noeBjbRk4IUEPa7JJ+TJMEooJ0= golang.org/x/tools v0.16.1/go.mod h1:kYVVN6I1mBNoB1OX+noeBjbRk4IUEPa7JJ+TJMEooJ0= golang.org/x/tools v0.17.0/go.mod h1:xsh6VxdV005rRVaS6SSAf9oiAqljS7UZUacMZ8Bnsps= +golang.org/x/tools v0.18.0/go.mod h1:GL7B4CwcLLeo59yx/9UWWuNOW1n3VZ4f5axWfML7Lcg= golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= @@ -2190,6 +2375,7 @@ google.golang.org/api v0.126.0/go.mod h1:mBwVAtz+87bEN6CbA1GtZPDOqY2R5ONPqJeIlvy google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/cloud v0.0.0-20151119220103-975617b05ea8/go.mod h1:0H1ncTHf11KCFhTc/+EFRbzSCOZx+VUbRMk55Yv5MYk= google.golang.org/genproto v0.0.0-20170918111702-1e559d0a00ee/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20180518175338-11a468237815/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190522204451-c2c4e71fbf69/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= google.golang.org/genproto v0.0.0-20190530194941-fb225487d101/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= google.golang.org/genproto v0.0.0-20190716160619-c506a9f90610/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= @@ -2227,6 +2413,7 @@ google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQ google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= @@ -2271,6 +2458,7 @@ google.golang.org/genproto v0.0.0-20221201164419-0e50fba7f41c/go.mod h1:rZS5c/ZV google.golang.org/genproto v0.0.0-20221202195650-67e5cbc046fd/go.mod h1:cTsE614GARnxrLsqKREzmNYJACSWWpAWdNMwnD7c2BE= google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= google.golang.org/genproto v0.0.0-20230222225845-10f96fb3dbec/go.mod h1:3Dl5ZL0q0isWJt+FVcfpQyirqemEuLAK/iFvg1UP1Hw= +google.golang.org/genproto v0.0.0-20230227214838-9b19f0bdc514/go.mod h1:TvhZT5f700eVlTNwND1xoEZQeWTB2RY/65kplwl/bFA= google.golang.org/genproto v0.0.0-20230525234025-438c736192d0/go.mod h1:9ExIQyXL5hZrHzQceCwuSYwZZ5QZBazOcprJ5rgs3lY= google.golang.org/genproto v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:xZnkP7mREFX5MORlOPEzLMr+90PPZQ2QWzrVTWfAq64= google.golang.org/genproto v0.0.0-20230706204954-ccb25ca9f130/go.mod h1:O9kGHb51iE/nOGvQaDUuadVYqovW56s5emA88lQnj6Y= @@ -2285,11 +2473,13 @@ google.golang.org/genproto/googleapis/rpc v0.0.0-20230706204954-ccb25ca9f130/go. google.golang.org/grpc v0.0.0-20160317175043-d3ddb4469d5a/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v0.0.0-20170208002647-2a6bf6142e96/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.2.1-0.20170921194603-d4b75ebd4f9f/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= +google.golang.org/grpc v1.12.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= google.golang.org/grpc v1.22.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= @@ -2303,6 +2493,7 @@ google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAG google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= @@ -2323,6 +2514,7 @@ google.golang.org/grpc v1.55.0/go.mod h1:iYEXKGkEBhg1PjZQvoYEVPTDkHo1/bjTnfwTeGO google.golang.org/grpc v1.56.2/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.0.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= +google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= @@ -2340,12 +2532,17 @@ gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qS gopkg.in/d4l3k/messagediff.v1 v1.2.1/go.mod h1:EUzikiKadqXWcD1AzJLagx0j/BeeWGtn++04Xniyg44= gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo= +gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= +gopkg.in/go-playground/validator.v8 v8.18.2/go.mod h1:RX2a/7Ha8BgOhfk7j780h4/u/RRjR0eouCJSH80/M2Y= +gopkg.in/ini.v1 v1.51.1/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/jcmturner/aescts.v1 v1.0.1/go.mod h1:nsR8qBOg+OucoIW+WMhB3GspUQXq9XorLnQb9XtvcOo= gopkg.in/jcmturner/dnsutils.v1 v1.0.1/go.mod h1:m3v+5svpVOhtFAP/wSz+yzh4Mc0Fg7eRhxkJMWSIz9Q= gopkg.in/jcmturner/goidentity.v3 v3.0.0/go.mod h1:oG2kH0IvSYNIu80dVAyu/yoefjq1mNfM5bm88whjWx4= gopkg.in/jcmturner/gokrb5.v7 v7.5.0/go.mod h1:l8VISx+WGYp+Fp7KRbsiUuXTTOnxIc3Tuvyavf11/WM= gopkg.in/jcmturner/rpc.v1 v1.1.0/go.mod h1:YIdkC4XfD6GXbzje11McwsDuOlZQSb9W4vfLvuNnlv8= +gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= +gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= gopkg.in/redis.v4 v4.2.4/go.mod h1:8KREHdypkCEojGKQcjMqAODMICIVwZAONWq8RowTITA= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= @@ -2355,6 +2552,7 @@ gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRN gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v3 v3.0.0-20191120175047-4206685974f2/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= diff --git a/simulators/eth2/testnet/go.mod b/simulators/eth2/testnet/go.mod index f044ca8e34..5eec84f7df 100644 --- a/simulators/eth2/testnet/go.mod +++ b/simulators/eth2/testnet/go.mod @@ -5,45 +5,47 @@ go 1.21 toolchain go1.22.1 require ( - github.com/ethereum/hive v0.0.0-20240319152821-ae224371b4e5 + github.com/ethereum/hive v0.0.0-20240610172825-2430a68c753a github.com/ethereum/hive/simulators/eth2/common v0.0.0-20230316220410-1364352c32a6 ) require ( - github.com/go-ole/go-ole v1.2.6 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect github.com/go-stack/stack v1.8.1 // indirect github.com/shirou/gopsutil v3.21.11+incompatible // indirect github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a // indirect github.com/tklauser/go-sysconf v0.3.12 // indirect - golang.org/x/sys v0.18.0 // indirect + golang.org/x/sys v0.20.0 // indirect ) require ( github.com/DataDog/zstd v1.5.2 // indirect - github.com/Microsoft/go-winio v0.6.1 // indirect - github.com/VictoriaMetrics/fastcache v1.12.1 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect + github.com/VictoriaMetrics/fastcache v1.12.2 // indirect github.com/beorn7/perks v1.0.1 // indirect - github.com/bits-and-blooms/bitset v1.7.0 // indirect + github.com/bits-and-blooms/bitset v1.10.0 // indirect github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect - github.com/cespare/xxhash/v2 v2.2.0 // indirect - github.com/cockroachdb/errors v1.9.1 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/cockroachdb/errors v1.11.1 // indirect github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect - github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593 // indirect - github.com/cockroachdb/redact v1.1.3 // indirect + github.com/cockroachdb/pebble v1.1.0 // indirect + github.com/cockroachdb/redact v1.1.5 // indirect github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect github.com/consensys/bavard v0.1.13 // indirect github.com/consensys/gnark-crypto v0.12.1 // indirect - github.com/crate-crypto/go-kzg-4844 v0.7.0 // indirect - github.com/deckarep/golang-set/v2 v2.1.0 // indirect + github.com/crate-crypto/go-ipa v0.0.0-20240223125850-b1e8a79f509c // indirect + github.com/crate-crypto/go-kzg-4844 v1.0.0 // indirect + github.com/deckarep/golang-set/v2 v2.6.0 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 // indirect - github.com/ethereum/c-kzg-4844 v0.4.0 // indirect - github.com/ethereum/go-ethereum v1.13.5-0.20231031113925-bc42e88415d3 // indirect + github.com/ethereum/c-kzg-4844 v1.0.0 // indirect + github.com/ethereum/go-ethereum v1.14.5 // indirect + github.com/ethereum/go-verkle v0.1.1-0.20240306133620-7d920df305f0 // indirect github.com/ferranbt/fastssz v0.1.2 // indirect github.com/getsentry/sentry-go v0.18.0 // indirect github.com/gofrs/flock v0.8.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang-jwt/jwt/v4 v4.5.0 // indirect - github.com/golang/protobuf v1.5.3 // indirect + github.com/golang/protobuf v1.5.4 // indirect github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect github.com/google/go-cmp v0.6.0 // indirect github.com/google/uuid v1.3.0 // indirect @@ -51,7 +53,7 @@ require ( github.com/gorilla/websocket v1.5.0 // indirect github.com/herumi/bls-eth-go-binary v1.28.1 // indirect github.com/holiman/bloomfilter/v2 v2.0.3 // indirect - github.com/holiman/uint256 v1.2.3 // indirect + github.com/holiman/uint256 v1.2.4 // indirect github.com/julienschmidt/httprouter v1.3.0 // indirect github.com/kilic/bls12-381 v0.1.0 // indirect github.com/klauspost/compress v1.15.15 // indirect @@ -60,7 +62,7 @@ require ( github.com/kr/text v0.2.0 // indirect github.com/lithammer/dedent v1.1.0 // indirect github.com/mattn/go-colorable v0.1.13 // indirect - github.com/mattn/go-isatty v0.0.17 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect github.com/mattn/go-runewidth v0.0.14 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect github.com/minio/sha256-simd v1.0.0 // indirect @@ -72,10 +74,10 @@ require ( github.com/prometheus/client_model v0.3.0 // indirect github.com/prometheus/common v0.39.0 // indirect github.com/prometheus/procfs v0.9.0 // indirect - github.com/protolambda/bls12-381-util v0.0.0-20220416220906-d8552aa452c7 // indirect + github.com/protolambda/bls12-381-util v0.1.0 // indirect github.com/protolambda/eth2api v0.0.0-20230316214135-5f8afbd6d05d // indirect github.com/protolambda/go-keystorev4 v0.0.0-20211007151826-f20444f6d564 // indirect - github.com/protolambda/zrnt v0.30.0 // indirect + github.com/protolambda/zrnt v0.32.2 // indirect github.com/protolambda/ztyp v0.2.2 // indirect github.com/rauljordan/engine-proxy v0.0.0-20230316220057-4c80c36c4c3a // indirect github.com/rivo/uniseg v0.4.3 // indirect @@ -88,12 +90,10 @@ require ( github.com/wealdtech/go-eth2-types/v2 v2.8.0 // indirect github.com/wealdtech/go-eth2-util v1.8.0 // indirect github.com/yusufpapurcu/wmi v1.2.2 // indirect - golang.org/x/crypto v0.21.0 // indirect - golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect - golang.org/x/mod v0.12.0 // indirect - golang.org/x/sync v0.3.0 // indirect + golang.org/x/crypto v0.22.0 // indirect + golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa // indirect + golang.org/x/sync v0.7.0 // indirect golang.org/x/text v0.14.0 // indirect - golang.org/x/tools v0.13.0 // indirect google.golang.org/protobuf v1.33.0 // indirect gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect diff --git a/simulators/eth2/testnet/go.sum b/simulators/eth2/testnet/go.sum index 61dc52285c..00f4e6eee8 100644 --- a/simulators/eth2/testnet/go.sum +++ b/simulators/eth2/testnet/go.sum @@ -1,272 +1,174 @@ -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/CloudyKit/fastprinter v0.0.0-20200109182630-33d98a066a53/go.mod h1:+3IMCy2vIlbG1XG/0ggNQv0SvxCAIpPM5b1nCz56Xno= -github.com/CloudyKit/jet/v3 v3.0.0/go.mod h1:HKQPgSJmdK8hdoAbKUUWajkHyHo4RaU5rMdUywE7VMo= github.com/DataDog/zstd v1.5.2 h1:vUG4lAyuPCXO0TLbXvPv7EB7cNK1QV/luu55UHLrrn8= github.com/DataDog/zstd v1.5.2/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= -github.com/Joker/hpp v1.0.0/go.mod h1:8x5n+M1Hp5hC0g8okX3sR3vFQwynaX/UgSOM9MeBKzY= -github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= -github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= -github.com/Shopify/goreferrer v0.0.0-20181106222321-ec9c9a553398/go.mod h1:a1uqRtAwp2Xwc6WNPJEufxJ7fx3npB4UV/JOLmbu5I0= -github.com/VictoriaMetrics/fastcache v1.12.1 h1:i0mICQuojGDL3KblA7wUNlY5lOK6a4bwt3uRKnkZU40= -github.com/VictoriaMetrics/fastcache v1.12.1/go.mod h1:tX04vaqcNoQeGLD+ra5pU5sWkuxnzWhEzLwhP9w653o= -github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/VictoriaMetrics/fastcache v1.12.2 h1:N0y9ASrJ0F6h0QaC3o6uJb3NIZ9VKLjCM7NQbSmF7WI= +github.com/VictoriaMetrics/fastcache v1.12.2/go.mod h1:AmC+Nzz1+3G2eCPapF6UcsnkThDcMsQicp4xDukwJYI= github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= github.com/allegro/bigcache v1.2.1 h1:hg1sY1raCwic3Vnsvje6TT7/pnZba83LeFck5NrFKSc= github.com/allegro/bigcache v1.2.1/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= -github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= -github.com/aymerick/raymond v2.0.3-0.20180322193309-b565731e1464+incompatible/go.mod h1:osfaiScAUVup+UC9Nfq76eWqDhXlp+4UYaA8uhTBO6g= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bits-and-blooms/bitset v1.7.0 h1:YjAGVd3XmtK9ktAbX8Zg2g2PwLIMjGREZJHlV4j7NEo= -github.com/bits-and-blooms/bitset v1.7.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= +github.com/bits-and-blooms/bitset v1.10.0 h1:ePXTeiPEazB5+opbv5fr8umg2R/1NlzgDsyepwsSr88= +github.com/bits-and-blooms/bitset v1.10.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U= github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cockroachdb/datadriven v1.0.2/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f h1:otljaYPt5hWxV3MUfO5dFPFiOXg9CyG5/kCfayTqsJ4= github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= -github.com/cockroachdb/errors v1.9.1 h1:yFVvsI0VxmRShfawbt/laCIDy/mtTqqnvoNgiy5bEV8= -github.com/cockroachdb/errors v1.9.1/go.mod h1:2sxOtL2WIc096WSZqZ5h8fa17rdDq9HZOZLBCor4mBk= -github.com/cockroachdb/logtags v0.0.0-20211118104740-dabe8e521a4f/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= +github.com/cockroachdb/errors v1.11.1 h1:xSEW75zKaKCWzR3OfxXUxgrk/NtT4G1MiOv5lWZazG8= +github.com/cockroachdb/errors v1.11.1/go.mod h1:8MUxA3Gi6b25tYlFEBGLf+D8aISL+M4MIpiWMSNRfxw= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= -github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593 h1:aPEJyR4rPBvDmeyi+l/FS/VtA00IWvjeFvjen1m1l1A= -github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593/go.mod h1:6hk1eMY/u5t+Cf18q5lFMUA1Rc+Sm5I6Ra1QuPyxXCo= -github.com/cockroachdb/redact v1.1.3 h1:AKZds10rFSIj7qADf0g46UixK8NNLwWTNdCIGS5wfSQ= -github.com/cockroachdb/redact v1.1.3/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= +github.com/cockroachdb/pebble v1.1.0 h1:pcFh8CdCIt2kmEpK0OIatq67Ln9uGDYY3d5XnE0LJG4= +github.com/cockroachdb/pebble v1.1.0/go.mod h1:sEHm5NOXxyiAoKWhoFxT8xMgd/f3RA6qUqQ1BXKrh2E= +github.com/cockroachdb/redact v1.1.5 h1:u1PMllDkdFfPWaNGMyLD1+so+aq3uUItthCFqzwPJ30= +github.com/cockroachdb/redact v1.1.5/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo= github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ= -github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0/go.mod h1:4Zcjuz89kmFXt9morQgcfYZAYZ5n8WHjt81YYWIwtTM= github.com/consensys/bavard v0.1.13 h1:oLhMLOFGTLdlda/kma4VOJazblc7IM5y5QPd2A/YjhQ= github.com/consensys/bavard v0.1.13/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI= github.com/consensys/gnark-crypto v0.12.1 h1:lHH39WuuFgVHONRl3J0LRBtuYdQTumFSDtJF7HpyG8M= github.com/consensys/gnark-crypto v0.12.1/go.mod h1:v2Gy7L/4ZRosZ7Ivs+9SfUDr0f5UlG+EM5t7MPHiLuY= -github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= -github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/cpuguy83/go-md2man v1.0.10 h1:BSKMNlYxDvnunlTymqtgONjNnaRV1sTpcovwwjF22jk= -github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/crate-crypto/go-kzg-4844 v0.7.0 h1:C0vgZRk4q4EZ/JgPfzuSoxdCq3C3mOZMBShovmncxvA= -github.com/crate-crypto/go-kzg-4844 v0.7.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= +github.com/crate-crypto/go-ipa v0.0.0-20240223125850-b1e8a79f509c h1:uQYC5Z1mdLRPrZhHjHxufI8+2UG/i25QG92j0Er9p6I= +github.com/crate-crypto/go-ipa v0.0.0-20240223125850-b1e8a79f509c/go.mod h1:geZJZH3SzKCqnz5VT0q/DyIG/tvu/dZk+VIfXicupJs= +github.com/crate-crypto/go-kzg-4844 v1.0.0 h1:TsSgHwrkTKecKJ4kadtHi4b3xHW5dCFUDFnUp1TsawI= +github.com/crate-crypto/go-kzg-4844 v1.0.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/deckarep/golang-set/v2 v2.1.0 h1:g47V4Or+DUdzbs8FxCCmgb6VYd+ptPAngjM6dtGktsI= -github.com/deckarep/golang-set/v2 v2.1.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= +github.com/deckarep/golang-set/v2 v2.6.0 h1:XfcQbWM1LlMB8BsJ8N9vW5ehnnPVIw0je80NsVHagjM= +github.com/deckarep/golang-set/v2 v2.6.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0= github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 h1:HbphB4TFFXpv7MNrT52FGrrgVXF1owhMVTHFZIlnvd4= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0/go.mod h1:DZGJHZMqrU4JJqFAWUS2UO1+lbSKsdiOoYi9Zzey7Fc= -github.com/dgraph-io/badger v1.6.0/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6psNgSztDR4= -github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385/go.mod h1:0vRUJqYpeSZifjYj7uP3BG/gKcuzL9xWVV/Y+cK33KM= -github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/etcd-io/bbolt v1.3.3/go.mod h1:ZF2nL25h33cCyBtcyWeZ2/I3HQOfTP+0PIEvHjkjCrw= -github.com/ethereum/c-kzg-4844 v0.4.0 h1:3MS1s4JtA868KpJxroZoepdV0ZKBp3u/O5HcZ7R3nlY= -github.com/ethereum/c-kzg-4844 v0.4.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= -github.com/ethereum/go-ethereum v1.13.5-0.20231031113925-bc42e88415d3 h1:i4TE0DmzMYcr2IiCdlTGGk+7Q/EzXvBKbbG4uRxMjJ0= -github.com/ethereum/go-ethereum v1.13.5-0.20231031113925-bc42e88415d3/go.mod h1:yMTu38GSuyxaYzQMViqNmQ1s3cE84abZexQmTgenWk0= -github.com/ethereum/hive v0.0.0-20240319152821-ae224371b4e5 h1:2Rc3v1mqWgUl8gSHFh7+FmVcyB1AI/9THxhEDjNK+PI= -github.com/ethereum/hive v0.0.0-20240319152821-ae224371b4e5/go.mod h1:MGwUXPGco6YS3brOf5WEILfUnnUL/XuX1224ab3D7XA= +github.com/ethereum/c-kzg-4844 v1.0.0 h1:0X1LBXxaEtYD9xsyj9B9ctQEZIpnvVDeoBx8aHEwTNA= +github.com/ethereum/c-kzg-4844 v1.0.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= +github.com/ethereum/go-ethereum v1.14.5 h1:szuFzO1MhJmweXjoM5nSAeDvjNUH3vIQoMzzQnfvjpw= +github.com/ethereum/go-ethereum v1.14.5/go.mod h1:VEDGGhSxY7IEjn98hJRFXl/uFvpRgbIIf2PpXiyGGgc= +github.com/ethereum/go-verkle v0.1.1-0.20240306133620-7d920df305f0 h1:KrE8I4reeVvf7C1tm8elRjj4BdscTYzz/WAbYyf/JI4= +github.com/ethereum/go-verkle v0.1.1-0.20240306133620-7d920df305f0/go.mod h1:D9AJLVXSyZQXJQVk8oh1EwjISE+sJTn2duYIZC0dy3w= +github.com/ethereum/hive v0.0.0-20240610172825-2430a68c753a h1:iyHHRPXaxHtEvyFxc4A+is/JRt88o0gQhHrNx+khEqQ= +github.com/ethereum/hive v0.0.0-20240610172825-2430a68c753a/go.mod h1:ghNXZW+/WQClcyiwZpbTzUCyxwql7YeMacYd44v+BJE= github.com/ethereum/hive/simulators/eth2/common v0.0.0-20230316220410-1364352c32a6 h1:LcSUNGwQuJyR/gdPcsif57yKX+3MyhpoAuChzR8k6Yk= github.com/ethereum/hive/simulators/eth2/common v0.0.0-20230316220410-1364352c32a6/go.mod h1:FX4oxNyTNw/P+TUWrb7vva7o/rFI0pHO7OYdtG6EtN4= -github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072/go.mod h1:duJ4Jxv5lDcvg4QuQr0oowTf7dz4/CR8NtyCooz9HL8= -github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= github.com/ferranbt/fastssz v0.1.2 h1:Dky6dXlngF6Qjc+EfDipAkE83N5I5DE68bY6O0VLNPk= github.com/ferranbt/fastssz v0.1.2/go.mod h1:X5UPrE2u1UJjxHA8X54u04SBwdAQjG2sFtWs39YxyWs= -github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5 h1:FtmdgXiUlNeRsoNMFlKLDt+S+6hbjVMEW6RGQ7aUf7c= -github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= +github.com/fjl/memsize v0.0.2 h1:27txuSD9or+NZlnOWdKUxeBzTAUkWCVh+4Gf2dWFOzA= +github.com/fjl/memsize v0.0.2/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= -github.com/gavv/httpexpect v2.0.0+incompatible/go.mod h1:x+9tiU1YnrOvnB725RkpoLv1M62hOWzwo5OXotisrKc= github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff h1:tY80oXqGNY4FhTFhk+o9oFHGINQ/+vhlm8HFzi6znCI= github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= -github.com/getsentry/sentry-go v0.12.0/go.mod h1:NSap0JBYWzHND8oMbyi0+XZhUalc1TBdRL1M71JZW2c= github.com/getsentry/sentry-go v0.18.0 h1:MtBW5H9QgdcJabtZcuJG80BMOwaBpkRDZkxRkNC1sN0= github.com/getsentry/sentry-go v0.18.0/go.mod h1:Kgon4Mby+FJ7ZWHFUAZgVaIa8sxHtnRJRLTXZr51aKQ= -github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3/go.mod h1:VJ0WA2NBN22VlZ2dKZQPAPnyWw5XTlK1KymzLKsr59s= -github.com/gin-gonic/gin v1.4.0/go.mod h1:OW2EZn3DO8Ln9oIKOvM++LBO+5UPHJJDH72/q/3rZdM= -github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= -github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= -github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab/go.mod h1:/P9AEU963A2AYjv4d1V5eVL1CQbEJq6aCNHDDjibzu8= -github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= github.com/go-stack/stack v1.8.1 h1:ntEHSVwIt7PNXNpgPmVfMrNhLtgjlmnZha2kOpuRiDw= github.com/go-stack/stack v1.8.1/go.mod h1:dcoOX6HbPZSZptuspn9bctJ+N/CnF5gGygcUP3XYfe4= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= -github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= -github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= -github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= -github.com/gogo/googleapis v0.0.0-20180223154316-0cd9801be74a/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= -github.com/gogo/googleapis v1.4.1/go.mod h1:2lpHqI5OcWCtVElxXnPt+s8oJvMpySlOyM6xDCrzib4= -github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/gogo/status v1.1.0/go.mod h1:BFv9nrluPLmrS0EmGVvLaPNmRosr9KapBYd5/hpY1WM= -github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= -github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXiurYmW7fx4GZkL8feAMVq7nEjURHk= github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/gomodule/redigo v1.7.1-0.20190724094224-574c33c3df38/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= -github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/hashicorp/go-bexpr v0.1.10 h1:9kuI5PFotCboP3dkDYFr/wi0gg0QVbSNz5oFRpxn4uE= github.com/hashicorp/go-bexpr v0.1.10/go.mod h1:oxlubA2vC/gFVfX1A6JGp7ls7uCDlfJn732ehYYg+g0= -github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/herumi/bls-eth-go-binary v1.28.1 h1:fcIZ48y5EE9973k05XjE8+P3YiQgjZz4JI/YabAm8KA= github.com/herumi/bls-eth-go-binary v1.28.1/go.mod h1:luAnRm3OsMQeokhGzpYmc0ZKwawY7o87PUEP11Z7r7U= -github.com/holiman/billy v0.0.0-20230718173358-1c7e68d277a7 h1:3JQNjnMRil1yD0IfZKHF9GxxWKDJGj8I0IqOUol//sw= -github.com/holiman/billy v0.0.0-20230718173358-1c7e68d277a7/go.mod h1:5GuXa7vkL8u9FkFuWdVvfR5ix8hRB7DbOAaYULamFpc= +github.com/holiman/billy v0.0.0-20240216141850-2abb0c79d3c4 h1:X4egAf/gcS1zATw6wn4Ej8vjuVGxeHdan+bRb2ebyv4= +github.com/holiman/billy v0.0.0-20240216141850-2abb0c79d3c4/go.mod h1:5GuXa7vkL8u9FkFuWdVvfR5ix8hRB7DbOAaYULamFpc= github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao= github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA= github.com/holiman/uint256 v1.2.0/go.mod h1:y4ga/t+u+Xwd7CpDgZESaRcWy0I7XMlTMA25ApIH5Jw= -github.com/holiman/uint256 v1.2.3 h1:K8UWO1HUJpRMXBxbmaY1Y8IAMZC/RsKB+ArEnnK4l5o= -github.com/holiman/uint256 v1.2.3/go.mod h1:SC8Ryt4n+UBbPbIBKaG9zbbDlp4jOru9xFZmPzLUTxw= +github.com/holiman/uint256 v1.2.4 h1:jUc4Nk8fm9jZabQuqr2JzednajVmBpC+oiTiXZJEApU= +github.com/holiman/uint256 v1.2.4/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXeiRV4ng7E= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/huin/goupnp v1.3.0 h1:UvLUlWDNpoUdYzb2TCn+MuTWtcjXKSza2n6CBdQ0xXc= github.com/huin/goupnp v1.3.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8= -github.com/hydrogen18/memlistener v0.0.0-20200120041712-dcc25e7acd91/go.mod h1:qEIFzExnS6016fRpRfxrExeVn2gbClQA99gQhnIcdhE= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/imkira/go-interpol v1.1.0/go.mod h1:z0h2/2T3XF8kyEPpRgJ3kmNv+C43p+I/CoI+jC3w2iA= -github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/iris-contrib/blackfriday v2.0.0+incompatible/go.mod h1:UzZ2bDEoaSGPbkg6SAB4att1aAwTmVIx/5gCVqeyUdI= -github.com/iris-contrib/go.uuid v2.0.0+incompatible/go.mod h1:iz2lgM/1UnEf1kP0L/+fafWORmlnuysV2EMP8MW+qe0= -github.com/iris-contrib/jade v1.1.3/go.mod h1:H/geBymxJhShH5kecoiOCSssPX7QWYH7UaeZTSWddIk= -github.com/iris-contrib/pongo2 v0.0.1/go.mod h1:Ssh+00+3GAZqSQb30AvBRNxBx7rf0GqwkjqxNd0u65g= -github.com/iris-contrib/schema v0.0.1/go.mod h1:urYA3uvUNG1TIIjOSCzHr9/LmbQo8LrOcOqfqxa4hXw= github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= -github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.3.0 h1:U0609e9tgbseu3rBINet9P48AI/D3oJs4dN7jwJOQ1U= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= -github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88/go.mod h1:3w7q1U84EfirKl04SVQ/s7nPm1ZPhiXd34z40TNz36k= -github.com/kataras/golog v0.0.10/go.mod h1:yJ8YKCmyL+nWjERB90Qwn+bdyBZsaQwU3bTVFgkFIp8= -github.com/kataras/iris/v12 v12.1.8/go.mod h1:LMYy4VlP67TQ3Zgriz8RE2h2kMZV2SgMYbq3UhfoFmE= -github.com/kataras/neffos v0.0.14/go.mod h1:8lqADm8PnbeFfL7CLXh1WHw53dG27MC3pgi2R1rmoTE= -github.com/kataras/pio v0.0.2/go.mod h1:hAoW0t9UmXi4R5Oyq5Z4irTbaTsOemSrDGUtaTl7Dro= -github.com/kataras/sitemap v0.0.5/go.mod h1:KY2eugMKiPwsJgx7+U103YZehfvNGOXURubcGyk0Bz8= github.com/kilic/bls12-381 v0.1.0 h1:encrdjqKMEvabVQ7qYOKu1OvhqpK4s47wDYtNiPtlp4= github.com/kilic/bls12-381 v0.1.0/go.mod h1:vDTTHJONJ6G+P2R74EhnyotQDTliQDnFEwhdmfzw1ig= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.8.2/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= -github.com/klauspost/compress v1.9.7/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= github.com/klauspost/compress v1.15.15 h1:EF27CXIuDsYJ6mmvtBRlEuB2UVOqHG1tAXgZ7yIO+lw= github.com/klauspost/compress v1.15.15/go.mod h1:ZcK2JAFqKOpnBlxcLsJzYfrS9X1akm9fHZNnD9+Vo/4= -github.com/klauspost/cpuid v1.2.1/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.2.2 h1:xPMwiykqNK9VK0NYC3+jTMYv9I6Vl3YdjZgPZKG3zO0= github.com/klauspost/cpuid/v2 v2.2.2/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/labstack/echo/v4 v4.5.0/go.mod h1:czIriw4a0C1dFun+ObrXp7ok03xON0N1awStJ6ArI7Y= -github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c= github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= github.com/lithammer/dedent v1.1.0 h1:VNzHMVCBNG1j0fh3OrsFRkVUwStdDArbgBWoPAffktY= github.com/lithammer/dedent v1.1.0/go.mod h1:jrXYCQtgg0nJiN+StA2KgR7w6CiQNv9Fd/Z9BP0jIOc= -github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.11/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= -github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= -github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng= -github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.14 h1:+xnbZSEeDbOIg5/mE6JF0w6n9duR1l3/WmbinWVwUuU= github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= -github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw= github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= -github.com/mediocregopher/radix/v3 v3.4.2/go.mod h1:8FL3F6UQRXHXIBSPUs5h0RybMF8i4n7wVopoX3x7Bv8= -github.com/microcosm-cc/bluemonday v1.0.2/go.mod h1:iVP4YcDBq+n/5fb23BhYFvIMq/leAFZyRl6bYmGDlGc= -github.com/minio/sha256-simd v0.1.0/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= github.com/minio/sha256-simd v1.0.0 h1:v1ta+49hkWZyvaKwrQB8elexRqm6Y0aMLjCNsrYxo6g= github.com/minio/sha256-simd v1.0.0/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy5RFepssQM= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/pointerstructure v1.2.0 h1:O+i9nHnXS3l/9Wu7r4NrEdwA2VFTicjUEN1uBnDo34A= @@ -274,22 +176,12 @@ github.com/mitchellh/pointerstructure v1.2.0/go.mod h1:BRAsLI5zgXmw97Lf6s25bs8oh github.com/mmcloughlin/addchain v0.4.0 h1:SobOdjm2xLj1KkXN5/n0xTIWyZA2+s99UCY1iPfkHRY= github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqkyU72HC5wJ4RlU= github.com/mmcloughlin/profile v0.1.1/go.mod h1:IhHD7q1ooxgwTgjxQYkACGA77oFTDdFVejUS1/tS/qU= -github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/moul/http2curl v1.0.0/go.mod h1:8UbvGypXm98wA/IqH45anm5Y2Z6ep6O31QGOAZ3H0fQ= -github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= -github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= -github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= -github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= @@ -300,34 +192,29 @@ github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1y github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= github.com/onsi/gomega v1.19.0 h1:4ieX6qQjPP/BfC3mpsAtIGGlxTWPeA3Inl/7DtXw1tw= github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= -github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_golang v1.14.0 h1:nJdhIvne2eSX/XRAFV9PcvFFRbrjbcTUj0VP62TMhnw= github.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4= github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= github.com/prometheus/common v0.39.0 h1:oOyhkDq05hPZKItWVBkJ6g6AtGxi+fy7F4JvUV8uhsI= github.com/prometheus/common v0.39.0/go.mod h1:6XBZ7lYdLCbkAVhwRsWTZn+IN5AB9F/NXd5w0BbEX0Y= github.com/prometheus/procfs v0.9.0 h1:wzCHvIvM5SxWqYvwgVL7yJY8Lz3PKn49KQtpgMYJfhI= github.com/prometheus/procfs v0.9.0/go.mod h1:+pB4zwohETzFnmlpe6yd2lSc+0/46IYZRB/chUwxUZY= -github.com/protolambda/bls12-381-util v0.0.0-20210720105258-a772f2aac13e/go.mod h1:MPZvj2Pr0N8/dXyTPS5REeg2sdLG7t8DRzC1rLv925w= -github.com/protolambda/bls12-381-util v0.0.0-20220416220906-d8552aa452c7 h1:cZC+usqsYgHtlBaGulVnZ1hfKAi8iWtujBnRLQE698c= -github.com/protolambda/bls12-381-util v0.0.0-20220416220906-d8552aa452c7/go.mod h1:IToEjHuttnUzwZI5KBSM/LOOW3qLbbrHOEfp3SbECGY= +github.com/protolambda/bls12-381-util v0.1.0 h1:05DU2wJN7DTU7z28+Q+zejXkIsA/MF8JZQGhtBZZiWk= +github.com/protolambda/bls12-381-util v0.1.0/go.mod h1:cdkysJTRpeFeuUVx/TXGDQNMTiRAalk1vQw3TYTHcE4= github.com/protolambda/eth2api v0.0.0-20230316214135-5f8afbd6d05d h1:35qD9zgP3ApfcHsETuJyX3G5kVOgFgAx6kaRGzPC+FY= github.com/protolambda/eth2api v0.0.0-20230316214135-5f8afbd6d05d/go.mod h1:4WbGGB4Bv17hKsiytlJY4IQDNpRS234DvFvIBNLnd60= github.com/protolambda/go-keystorev4 v0.0.0-20211007151826-f20444f6d564 h1:yCXGkFjrZ8EggxW+Y7ueRZesNcBk0avLU0mVU/I2KtU= github.com/protolambda/go-keystorev4 v0.0.0-20211007151826-f20444f6d564/go.mod h1:Xda3KO8+DMyWaTr+LwUUpVRTB5SdFzoKu0ivXNI6p1s= -github.com/protolambda/messagediff v1.4.0/go.mod h1:LboJp0EwIbJsePYpzh5Op/9G1/4mIztMRYzzwR0dR2M= -github.com/protolambda/zrnt v0.30.0 h1:pHEn69ZgaDFGpLGGYG1oD7DvYI7RDirbMBPfbC+8p4g= -github.com/protolambda/zrnt v0.30.0/go.mod h1:qcdX9CXFeVNCQK/q0nswpzhd+31RHMk2Ax/2lMsJ4Jw= +github.com/protolambda/zrnt v0.32.2 h1:KZ48T+3UhsPXNdtE/5QEvGc9DGjUaRI17nJaoznoIaM= +github.com/protolambda/zrnt v0.32.2/go.mod h1:A0fezkp9Tt3GBLATSPIbuY4ywYESyAuc/FFmPKg8Lqs= github.com/protolambda/ztyp v0.2.2 h1:rVcL3vBu9W/aV646zF6caLS/dyn9BN8NYiuJzicLNyY= github.com/protolambda/ztyp v0.2.2/go.mod h1:9bYgKGqg3wJqT9ac1gI2hnVb0STQq7p/1lapqrqY1dU= github.com/prysmaticlabs/gohashtree v0.0.1-alpha.0.20220714111606-acbb2962fb48 h1:cSo6/vk8YpvkLbk9v3FO97cakNmUoxwi2KMP8hd5WIw= @@ -337,38 +224,20 @@ github.com/rauljordan/engine-proxy v0.0.0-20230316220057-4c80c36c4c3a/go.mod h1: github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.3 h1:utMvzDsuh3suAEnhH0RdHmoPbU648o6CvXxTx4SBMOw= github.com/rivo/uniseg v0.4.3/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= -github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= -github.com/rogpeppe/go-internal v1.8.1/go.mod h1:JeRgkft04UBgHMgCIwADu4Pn6Mtm5d4nPKWu0nJ5d+o= github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/rs/cors v1.8.2 h1:KCooALfAYGs415Cwu5ABvv9n9509fSiG5SQJn/AQo4U= github.com/rs/cors v1.8.2/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= -github.com/russross/blackfriday v1.5.2 h1:HyvC0ARfnZBqnXwABFeSZHpKvJHJJfPz81GNueLj0oo= -github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/schollz/closestmatch v2.1.0+incompatible/go.mod h1:RtP1ddjLong6gTkbtmuhtR2uUrrJOpYzYRvbcPAid+g= -github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI= github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= -github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= -github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= -github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= github.com/status-im/keycard-go v0.2.0 h1:QDLFswOQu1r5jsycloeQh3bVU8n/NatHHaZobtDnDzA= github.com/status-im/keycard-go v0.2.0/go.mod h1:wlp8ZLbsmrF6g6WjugPAx+IzoLrkdf9+mHxBEeo3Hbg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= @@ -384,212 +253,115 @@ github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+F github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= github.com/tyler-smith/go-bip39 v1.1.0 h1:5eUemwrMargf3BSLRRCalXT93Ns6pQJIjYQN2nyfOP8= github.com/tyler-smith/go-bip39 v1.1.0/go.mod h1:gUYDtqQw1JS3ZJ8UWVcGTGqqr6YIN3CWg+kkNaLt55U= -github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= -github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= -github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= -github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= github.com/urfave/cli/v2 v2.25.7 h1:VAzn5oq403l5pHjc4OhD54+XGO9cdKVL/7lDjF+iKUs= github.com/urfave/cli/v2 v2.25.7/go.mod h1:8qnjx1vcq5s2/wpsqoZFndg2CE5tNFyrTvS6SinrnYQ= -github.com/urfave/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4= -github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= -github.com/valyala/fasthttp v1.6.0/go.mod h1:FstJa9V+Pj9vQ7OJie2qMHdwemEDaDiSdBnvPM1Su9w= -github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= -github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= -github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio= github.com/wealdtech/go-bytesutil v1.2.0 h1:GEIzvAZEIgqOoRfnEAaMRNL73gl8e+YlQzqxhFyR30Y= github.com/wealdtech/go-bytesutil v1.2.0/go.mod h1:FHQSlwhzfSZGffu1osaUGdnNtl5C8tBKwmqvPdB66pM= github.com/wealdtech/go-eth2-types/v2 v2.8.0 h1:Cts9J78ryXVp8jwotdSSVU75S+QWJrgVCArXreD2X8A= github.com/wealdtech/go-eth2-types/v2 v2.8.0/go.mod h1:tJazo9o28kdQs3V/U4VafQ4neG+/sL3OBozQ8J3CWmo= github.com/wealdtech/go-eth2-util v1.8.0 h1:hhs3h2y3Ldty18lppFdpe46nZpdDAMbY7QqiHO5BvE0= github.com/wealdtech/go-eth2-util v1.8.0/go.mod h1:rSuE0v5zX+uyZrqW/iUmXOxeDpB7lTvhcZvAVh0KlMU= -github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= -github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= -github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= -github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU= github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8= -github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0/go.mod h1:/LWChgwKmvncFJFHJ7Gvn9wZArjbV5/FppcK2fKk/tI= -github.com/yudai/gojsondiff v1.0.0/go.mod h1:AY32+k2cwILAkW1fbgxQ5mUmMiZFgLIV+FBNExI05xg= -github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82/go.mod h1:lgjkn3NuSvDfVJdfcVVdX+jpBxNmX4rDAzaS45IcYoM= -github.com/yudai/pp v2.0.1+incompatible/go.mod h1:PuxR/8QJ7cyCkFp/aUDS+JY727OFEZkTdatxwunjIkc= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yusufpapurcu/wmi v1.2.2 h1:KBNDSne4vP5mbSWnJbO+51IMOXJB67QiYCSBrubbPRg= github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= -golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191227163750-53104e6ec876/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= -golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g= -golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30= +golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M= +golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa h1:FRnLl4eNAQl8hwxVVC17teOw8kdjVDVAiFMtgUdTSRQ= +golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa/go.mod h1:zk2irFbV9DP96SEBUUAy67IdHUaZuSnrz1n472HUCLE= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc= -golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190327091125-710a502c58a2/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= -golang.org/x/net v0.0.0-20211008194852-3b03d305991f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4= -golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/net v0.24.0 h1:1PcaxkF854Fu3+lvBIx5SYn9wRlBzzcnHZSiaFFAb0w= +golang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= -golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= +golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201101102859-da207088b7d1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= -golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= +golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= -golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= +golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181221001348-537d06c36207/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190327201419-c70d86f8b7cf/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.13.0 h1:Iey4qkscZuv0VvIt8E0neZjtPVQFSc870HQ448QgEmQ= -golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/genproto v0.0.0-20180518175338-11a468237815/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= -google.golang.org/grpc v1.12.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= -gopkg.in/go-playground/validator.v8 v8.18.2/go.mod h1:RX2a/7Ha8BgOhfk7j780h4/u/RRjR0eouCJSH80/M2Y= gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1 h1:iiHuQZCNgYPmFQxd3BBN/Nc5+dAwzZuq5y40s20oQw0= gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= -gopkg.in/ini.v1 v1.51.1/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= -gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8= -gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= +gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc= +gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= @@ -597,12 +369,8 @@ gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= -gopkg.in/yaml.v3 v3.0.0-20191120175047-4206685974f2/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= rsc.io/tmplfunc v0.0.3 h1:53XFQh69AfOa8Tw0Jm7t+GV7KZhOi6jzsCzTtKbMvzU= rsc.io/tmplfunc v0.0.3/go.mod h1:AG3sTPzElb1Io3Yg4voV9AGZJuleGAwaVRxL9M49PhA= diff --git a/simulators/eth2/withdrawals/go.mod b/simulators/eth2/withdrawals/go.mod index 7cffc6ddef..8e35b284b6 100644 --- a/simulators/eth2/withdrawals/go.mod +++ b/simulators/eth2/withdrawals/go.mod @@ -5,33 +5,33 @@ go 1.21 toolchain go1.22.1 require ( - github.com/ethereum/go-ethereum v1.13.5-0.20231031113925-bc42e88415d3 - github.com/ethereum/hive v0.0.0-20240319152821-ae224371b4e5 + github.com/ethereum/go-ethereum v1.14.5 + github.com/ethereum/hive v0.0.0-20240610172825-2430a68c753a github.com/ethereum/hive/simulators/eth2/common v0.0.0-20230316220410-1364352c32a6 github.com/marioevz/eth-clients v0.0.0-20230925201418-d5fbddd99b76 github.com/marioevz/mock-builder v0.0.0-20230501225822-df434a88e375 github.com/pkg/errors v0.9.1 github.com/protolambda/eth2api v0.0.0-20230316214135-5f8afbd6d05d - github.com/protolambda/zrnt v0.30.0 + github.com/protolambda/zrnt v0.32.2 github.com/protolambda/ztyp v0.2.2 ) require ( - github.com/VictoriaMetrics/fastcache v1.12.1 // indirect - github.com/cespare/xxhash/v2 v2.2.0 // indirect + github.com/VictoriaMetrics/fastcache v1.12.2 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/ferranbt/fastssz v0.1.2 // indirect - github.com/go-ole/go-ole v1.2.6 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect github.com/go-stack/stack v1.8.1 // indirect - github.com/holiman/uint256 v1.2.3 // indirect + github.com/holiman/uint256 v1.2.4 // indirect github.com/mattn/go-runewidth v0.0.14 // indirect github.com/minio/sha256-simd v1.0.0 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/olekukonko/tablewriter v0.0.5 // indirect - github.com/protolambda/bls12-381-util v0.0.0-20220416220906-d8552aa452c7 + github.com/protolambda/bls12-381-util v0.1.0 github.com/shirou/gopsutil v3.21.11+incompatible // indirect github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a // indirect github.com/tklauser/go-sysconf v0.3.12 // indirect - golang.org/x/sys v0.18.0 // indirect + golang.org/x/sys v0.20.0 // indirect golang.org/x/text v0.14.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect @@ -39,28 +39,29 @@ require ( require ( github.com/DataDog/zstd v1.5.2 // indirect - github.com/Microsoft/go-winio v0.6.1 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect github.com/beorn7/perks v1.0.1 // indirect - github.com/bits-and-blooms/bitset v1.7.0 // indirect + github.com/bits-and-blooms/bitset v1.10.0 // indirect github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect - github.com/cockroachdb/errors v1.9.1 // indirect + github.com/cockroachdb/errors v1.11.1 // indirect github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect - github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593 // indirect - github.com/cockroachdb/redact v1.1.3 // indirect + github.com/cockroachdb/pebble v1.1.0 // indirect + github.com/cockroachdb/redact v1.1.5 // indirect github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect github.com/consensys/bavard v0.1.13 // indirect github.com/consensys/gnark-crypto v0.12.1 // indirect - github.com/crate-crypto/go-kzg-4844 v0.7.0 // indirect - github.com/deckarep/golang-set/v2 v2.3.0 // indirect + github.com/crate-crypto/go-ipa v0.0.0-20240223125850-b1e8a79f509c // indirect + github.com/crate-crypto/go-kzg-4844 v1.0.0 // indirect + github.com/deckarep/golang-set/v2 v2.6.0 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 // indirect - github.com/ethereum/c-kzg-4844 v0.4.0 // indirect - github.com/fjl/memsize v0.0.1 // indirect + github.com/ethereum/c-kzg-4844 v1.0.0 // indirect + github.com/ethereum/go-verkle v0.1.1-0.20240306133620-7d920df305f0 // indirect github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08 // indirect github.com/getsentry/sentry-go v0.20.0 // indirect github.com/gofrs/flock v0.8.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang-jwt/jwt/v4 v4.5.0 // indirect - github.com/golang/protobuf v1.5.3 // indirect + github.com/golang/protobuf v1.5.4 // indirect github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect github.com/google/go-cmp v0.6.0 // indirect github.com/google/uuid v1.3.0 // indirect @@ -77,7 +78,7 @@ require ( github.com/kr/text v0.2.0 // indirect github.com/lithammer/dedent v1.1.0 // indirect github.com/mattn/go-colorable v0.1.13 // indirect - github.com/mattn/go-isatty v0.0.17 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect github.com/mmcloughlin/addchain v0.4.0 // indirect github.com/prometheus/client_golang v1.14.0 // indirect @@ -96,11 +97,9 @@ require ( github.com/wealdtech/go-eth2-types/v2 v2.8.0 // indirect github.com/wealdtech/go-eth2-util v1.8.0 // indirect github.com/yusufpapurcu/wmi v1.2.2 // indirect - golang.org/x/crypto v0.21.0 // indirect - golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect - golang.org/x/mod v0.12.0 // indirect - golang.org/x/sync v0.3.0 // indirect - golang.org/x/tools v0.13.0 // indirect + golang.org/x/crypto v0.22.0 // indirect + golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa // indirect + golang.org/x/sync v0.7.0 // indirect google.golang.org/protobuf v1.33.0 // indirect gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1 // indirect rsc.io/tmplfunc v0.0.3 // indirect diff --git a/simulators/eth2/withdrawals/go.sum b/simulators/eth2/withdrawals/go.sum index 9fcb985f96..7777461e3a 100644 --- a/simulators/eth2/withdrawals/go.sum +++ b/simulators/eth2/withdrawals/go.sum @@ -1,278 +1,180 @@ -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/CloudyKit/fastprinter v0.0.0-20200109182630-33d98a066a53/go.mod h1:+3IMCy2vIlbG1XG/0ggNQv0SvxCAIpPM5b1nCz56Xno= -github.com/CloudyKit/jet/v3 v3.0.0/go.mod h1:HKQPgSJmdK8hdoAbKUUWajkHyHo4RaU5rMdUywE7VMo= github.com/DataDog/zstd v1.5.2 h1:vUG4lAyuPCXO0TLbXvPv7EB7cNK1QV/luu55UHLrrn8= github.com/DataDog/zstd v1.5.2/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= -github.com/Joker/hpp v1.0.0/go.mod h1:8x5n+M1Hp5hC0g8okX3sR3vFQwynaX/UgSOM9MeBKzY= -github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= -github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= -github.com/Shopify/goreferrer v0.0.0-20181106222321-ec9c9a553398/go.mod h1:a1uqRtAwp2Xwc6WNPJEufxJ7fx3npB4UV/JOLmbu5I0= -github.com/VictoriaMetrics/fastcache v1.12.1 h1:i0mICQuojGDL3KblA7wUNlY5lOK6a4bwt3uRKnkZU40= -github.com/VictoriaMetrics/fastcache v1.12.1/go.mod h1:tX04vaqcNoQeGLD+ra5pU5sWkuxnzWhEzLwhP9w653o= -github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/VictoriaMetrics/fastcache v1.12.2 h1:N0y9ASrJ0F6h0QaC3o6uJb3NIZ9VKLjCM7NQbSmF7WI= +github.com/VictoriaMetrics/fastcache v1.12.2/go.mod h1:AmC+Nzz1+3G2eCPapF6UcsnkThDcMsQicp4xDukwJYI= github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= github.com/allegro/bigcache v1.2.1 h1:hg1sY1raCwic3Vnsvje6TT7/pnZba83LeFck5NrFKSc= github.com/allegro/bigcache v1.2.1/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= -github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= -github.com/aymerick/raymond v2.0.3-0.20180322193309-b565731e1464+incompatible/go.mod h1:osfaiScAUVup+UC9Nfq76eWqDhXlp+4UYaA8uhTBO6g= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bits-and-blooms/bitset v1.7.0 h1:YjAGVd3XmtK9ktAbX8Zg2g2PwLIMjGREZJHlV4j7NEo= -github.com/bits-and-blooms/bitset v1.7.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= +github.com/bits-and-blooms/bitset v1.10.0 h1:ePXTeiPEazB5+opbv5fr8umg2R/1NlzgDsyepwsSr88= +github.com/bits-and-blooms/bitset v1.10.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U= github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cockroachdb/datadriven v1.0.2/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f h1:otljaYPt5hWxV3MUfO5dFPFiOXg9CyG5/kCfayTqsJ4= github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= -github.com/cockroachdb/errors v1.9.1 h1:yFVvsI0VxmRShfawbt/laCIDy/mtTqqnvoNgiy5bEV8= -github.com/cockroachdb/errors v1.9.1/go.mod h1:2sxOtL2WIc096WSZqZ5h8fa17rdDq9HZOZLBCor4mBk= -github.com/cockroachdb/logtags v0.0.0-20211118104740-dabe8e521a4f/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= +github.com/cockroachdb/errors v1.11.1 h1:xSEW75zKaKCWzR3OfxXUxgrk/NtT4G1MiOv5lWZazG8= +github.com/cockroachdb/errors v1.11.1/go.mod h1:8MUxA3Gi6b25tYlFEBGLf+D8aISL+M4MIpiWMSNRfxw= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= -github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593 h1:aPEJyR4rPBvDmeyi+l/FS/VtA00IWvjeFvjen1m1l1A= -github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593/go.mod h1:6hk1eMY/u5t+Cf18q5lFMUA1Rc+Sm5I6Ra1QuPyxXCo= -github.com/cockroachdb/redact v1.1.3 h1:AKZds10rFSIj7qADf0g46UixK8NNLwWTNdCIGS5wfSQ= -github.com/cockroachdb/redact v1.1.3/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= +github.com/cockroachdb/pebble v1.1.0 h1:pcFh8CdCIt2kmEpK0OIatq67Ln9uGDYY3d5XnE0LJG4= +github.com/cockroachdb/pebble v1.1.0/go.mod h1:sEHm5NOXxyiAoKWhoFxT8xMgd/f3RA6qUqQ1BXKrh2E= +github.com/cockroachdb/redact v1.1.5 h1:u1PMllDkdFfPWaNGMyLD1+so+aq3uUItthCFqzwPJ30= +github.com/cockroachdb/redact v1.1.5/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo= github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ= -github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0/go.mod h1:4Zcjuz89kmFXt9morQgcfYZAYZ5n8WHjt81YYWIwtTM= github.com/consensys/bavard v0.1.13 h1:oLhMLOFGTLdlda/kma4VOJazblc7IM5y5QPd2A/YjhQ= github.com/consensys/bavard v0.1.13/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI= github.com/consensys/gnark-crypto v0.12.1 h1:lHH39WuuFgVHONRl3J0LRBtuYdQTumFSDtJF7HpyG8M= github.com/consensys/gnark-crypto v0.12.1/go.mod h1:v2Gy7L/4ZRosZ7Ivs+9SfUDr0f5UlG+EM5t7MPHiLuY= -github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= -github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/cpuguy83/go-md2man v1.0.10 h1:BSKMNlYxDvnunlTymqtgONjNnaRV1sTpcovwwjF22jk= -github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/crate-crypto/go-kzg-4844 v0.7.0 h1:C0vgZRk4q4EZ/JgPfzuSoxdCq3C3mOZMBShovmncxvA= -github.com/crate-crypto/go-kzg-4844 v0.7.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= +github.com/crate-crypto/go-ipa v0.0.0-20240223125850-b1e8a79f509c h1:uQYC5Z1mdLRPrZhHjHxufI8+2UG/i25QG92j0Er9p6I= +github.com/crate-crypto/go-ipa v0.0.0-20240223125850-b1e8a79f509c/go.mod h1:geZJZH3SzKCqnz5VT0q/DyIG/tvu/dZk+VIfXicupJs= +github.com/crate-crypto/go-kzg-4844 v1.0.0 h1:TsSgHwrkTKecKJ4kadtHi4b3xHW5dCFUDFnUp1TsawI= +github.com/crate-crypto/go-kzg-4844 v1.0.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/deckarep/golang-set/v2 v2.3.0 h1:qs18EKUfHm2X9fA50Mr/M5hccg2tNnVqsiBImnyDs0g= -github.com/deckarep/golang-set/v2 v2.3.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= +github.com/deckarep/golang-set/v2 v2.6.0 h1:XfcQbWM1LlMB8BsJ8N9vW5ehnnPVIw0je80NsVHagjM= +github.com/deckarep/golang-set/v2 v2.6.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0= github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 h1:HbphB4TFFXpv7MNrT52FGrrgVXF1owhMVTHFZIlnvd4= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0/go.mod h1:DZGJHZMqrU4JJqFAWUS2UO1+lbSKsdiOoYi9Zzey7Fc= -github.com/dgraph-io/badger v1.6.0/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6psNgSztDR4= -github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385/go.mod h1:0vRUJqYpeSZifjYj7uP3BG/gKcuzL9xWVV/Y+cK33KM= -github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/etcd-io/bbolt v1.3.3/go.mod h1:ZF2nL25h33cCyBtcyWeZ2/I3HQOfTP+0PIEvHjkjCrw= -github.com/ethereum/c-kzg-4844 v0.4.0 h1:3MS1s4JtA868KpJxroZoepdV0ZKBp3u/O5HcZ7R3nlY= -github.com/ethereum/c-kzg-4844 v0.4.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= -github.com/ethereum/go-ethereum v1.13.5-0.20231031113925-bc42e88415d3 h1:i4TE0DmzMYcr2IiCdlTGGk+7Q/EzXvBKbbG4uRxMjJ0= -github.com/ethereum/go-ethereum v1.13.5-0.20231031113925-bc42e88415d3/go.mod h1:yMTu38GSuyxaYzQMViqNmQ1s3cE84abZexQmTgenWk0= -github.com/ethereum/hive v0.0.0-20240319152821-ae224371b4e5 h1:2Rc3v1mqWgUl8gSHFh7+FmVcyB1AI/9THxhEDjNK+PI= -github.com/ethereum/hive v0.0.0-20240319152821-ae224371b4e5/go.mod h1:MGwUXPGco6YS3brOf5WEILfUnnUL/XuX1224ab3D7XA= +github.com/ethereum/c-kzg-4844 v1.0.0 h1:0X1LBXxaEtYD9xsyj9B9ctQEZIpnvVDeoBx8aHEwTNA= +github.com/ethereum/c-kzg-4844 v1.0.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= +github.com/ethereum/go-ethereum v1.14.5 h1:szuFzO1MhJmweXjoM5nSAeDvjNUH3vIQoMzzQnfvjpw= +github.com/ethereum/go-ethereum v1.14.5/go.mod h1:VEDGGhSxY7IEjn98hJRFXl/uFvpRgbIIf2PpXiyGGgc= +github.com/ethereum/go-verkle v0.1.1-0.20240306133620-7d920df305f0 h1:KrE8I4reeVvf7C1tm8elRjj4BdscTYzz/WAbYyf/JI4= +github.com/ethereum/go-verkle v0.1.1-0.20240306133620-7d920df305f0/go.mod h1:D9AJLVXSyZQXJQVk8oh1EwjISE+sJTn2duYIZC0dy3w= +github.com/ethereum/hive v0.0.0-20240610172825-2430a68c753a h1:iyHHRPXaxHtEvyFxc4A+is/JRt88o0gQhHrNx+khEqQ= +github.com/ethereum/hive v0.0.0-20240610172825-2430a68c753a/go.mod h1:ghNXZW+/WQClcyiwZpbTzUCyxwql7YeMacYd44v+BJE= github.com/ethereum/hive/simulators/eth2/common v0.0.0-20230316220410-1364352c32a6 h1:LcSUNGwQuJyR/gdPcsif57yKX+3MyhpoAuChzR8k6Yk= github.com/ethereum/hive/simulators/eth2/common v0.0.0-20230316220410-1364352c32a6/go.mod h1:FX4oxNyTNw/P+TUWrb7vva7o/rFI0pHO7OYdtG6EtN4= -github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072/go.mod h1:duJ4Jxv5lDcvg4QuQr0oowTf7dz4/CR8NtyCooz9HL8= -github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= github.com/ferranbt/fastssz v0.1.2 h1:Dky6dXlngF6Qjc+EfDipAkE83N5I5DE68bY6O0VLNPk= github.com/ferranbt/fastssz v0.1.2/go.mod h1:X5UPrE2u1UJjxHA8X54u04SBwdAQjG2sFtWs39YxyWs= -github.com/fjl/memsize v0.0.1 h1:+zhkb+dhUgx0/e+M8sF0QqiouvMQUiKR+QYvdxIOKcQ= -github.com/fjl/memsize v0.0.1/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= +github.com/fjl/memsize v0.0.2 h1:27txuSD9or+NZlnOWdKUxeBzTAUkWCVh+4Gf2dWFOzA= +github.com/fjl/memsize v0.0.2/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= -github.com/gavv/httpexpect v2.0.0+incompatible/go.mod h1:x+9tiU1YnrOvnB725RkpoLv1M62hOWzwo5OXotisrKc= github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08 h1:f6D9Hr8xV8uYKlyuj8XIruxlh9WjVjdh1gIicAS7ays= github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= -github.com/getsentry/sentry-go v0.12.0/go.mod h1:NSap0JBYWzHND8oMbyi0+XZhUalc1TBdRL1M71JZW2c= github.com/getsentry/sentry-go v0.20.0 h1:bwXW98iMRIWxn+4FgPW7vMrjmbym6HblXALmhjHmQaQ= github.com/getsentry/sentry-go v0.20.0/go.mod h1:lc76E2QywIyW8WuBnwl8Lc4bkmQH4+w1gwTf25trprY= -github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3/go.mod h1:VJ0WA2NBN22VlZ2dKZQPAPnyWw5XTlK1KymzLKsr59s= -github.com/gin-gonic/gin v1.4.0/go.mod h1:OW2EZn3DO8Ln9oIKOvM++LBO+5UPHJJDH72/q/3rZdM= -github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= -github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= -github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab/go.mod h1:/P9AEU963A2AYjv4d1V5eVL1CQbEJq6aCNHDDjibzu8= -github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= github.com/go-stack/stack v1.8.1 h1:ntEHSVwIt7PNXNpgPmVfMrNhLtgjlmnZha2kOpuRiDw= github.com/go-stack/stack v1.8.1/go.mod h1:dcoOX6HbPZSZptuspn9bctJ+N/CnF5gGygcUP3XYfe4= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= -github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= -github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= -github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= -github.com/gogo/googleapis v0.0.0-20180223154316-0cd9801be74a/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= -github.com/gogo/googleapis v1.4.1/go.mod h1:2lpHqI5OcWCtVElxXnPt+s8oJvMpySlOyM6xDCrzib4= -github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/gogo/status v1.1.0/go.mod h1:BFv9nrluPLmrS0EmGVvLaPNmRosr9KapBYd5/hpY1WM= -github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= -github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXiurYmW7fx4GZkL8feAMVq7nEjURHk= github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/gomodule/redigo v1.7.1-0.20190724094224-574c33c3df38/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= -github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/hashicorp/go-bexpr v0.1.11 h1:6DqdA/KBjurGby9yTY0bmkathya0lfwF2SeuubCI7dY= github.com/hashicorp/go-bexpr v0.1.11/go.mod h1:f03lAo0duBlDIUMGCuad8oLcgejw4m7U+N8T+6Kz1AE= -github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/herumi/bls-eth-go-binary v1.28.1 h1:fcIZ48y5EE9973k05XjE8+P3YiQgjZz4JI/YabAm8KA= github.com/herumi/bls-eth-go-binary v1.28.1/go.mod h1:luAnRm3OsMQeokhGzpYmc0ZKwawY7o87PUEP11Z7r7U= -github.com/holiman/billy v0.0.0-20230718173358-1c7e68d277a7 h1:3JQNjnMRil1yD0IfZKHF9GxxWKDJGj8I0IqOUol//sw= -github.com/holiman/billy v0.0.0-20230718173358-1c7e68d277a7/go.mod h1:5GuXa7vkL8u9FkFuWdVvfR5ix8hRB7DbOAaYULamFpc= +github.com/holiman/billy v0.0.0-20240216141850-2abb0c79d3c4 h1:X4egAf/gcS1zATw6wn4Ej8vjuVGxeHdan+bRb2ebyv4= +github.com/holiman/billy v0.0.0-20240216141850-2abb0c79d3c4/go.mod h1:5GuXa7vkL8u9FkFuWdVvfR5ix8hRB7DbOAaYULamFpc= github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao= github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA= github.com/holiman/uint256 v1.2.0/go.mod h1:y4ga/t+u+Xwd7CpDgZESaRcWy0I7XMlTMA25ApIH5Jw= -github.com/holiman/uint256 v1.2.3 h1:K8UWO1HUJpRMXBxbmaY1Y8IAMZC/RsKB+ArEnnK4l5o= -github.com/holiman/uint256 v1.2.3/go.mod h1:SC8Ryt4n+UBbPbIBKaG9zbbDlp4jOru9xFZmPzLUTxw= +github.com/holiman/uint256 v1.2.4 h1:jUc4Nk8fm9jZabQuqr2JzednajVmBpC+oiTiXZJEApU= +github.com/holiman/uint256 v1.2.4/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXeiRV4ng7E= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/huin/goupnp v1.3.0 h1:UvLUlWDNpoUdYzb2TCn+MuTWtcjXKSza2n6CBdQ0xXc= github.com/huin/goupnp v1.3.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8= -github.com/hydrogen18/memlistener v0.0.0-20200120041712-dcc25e7acd91/go.mod h1:qEIFzExnS6016fRpRfxrExeVn2gbClQA99gQhnIcdhE= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/imkira/go-interpol v1.1.0/go.mod h1:z0h2/2T3XF8kyEPpRgJ3kmNv+C43p+I/CoI+jC3w2iA= -github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/iris-contrib/blackfriday v2.0.0+incompatible/go.mod h1:UzZ2bDEoaSGPbkg6SAB4att1aAwTmVIx/5gCVqeyUdI= -github.com/iris-contrib/go.uuid v2.0.0+incompatible/go.mod h1:iz2lgM/1UnEf1kP0L/+fafWORmlnuysV2EMP8MW+qe0= -github.com/iris-contrib/jade v1.1.3/go.mod h1:H/geBymxJhShH5kecoiOCSssPX7QWYH7UaeZTSWddIk= -github.com/iris-contrib/pongo2 v0.0.1/go.mod h1:Ssh+00+3GAZqSQb30AvBRNxBx7rf0GqwkjqxNd0u65g= -github.com/iris-contrib/schema v0.0.1/go.mod h1:urYA3uvUNG1TIIjOSCzHr9/LmbQo8LrOcOqfqxa4hXw= github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= -github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.3.0 h1:U0609e9tgbseu3rBINet9P48AI/D3oJs4dN7jwJOQ1U= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= -github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88/go.mod h1:3w7q1U84EfirKl04SVQ/s7nPm1ZPhiXd34z40TNz36k= -github.com/kataras/golog v0.0.10/go.mod h1:yJ8YKCmyL+nWjERB90Qwn+bdyBZsaQwU3bTVFgkFIp8= -github.com/kataras/iris/v12 v12.1.8/go.mod h1:LMYy4VlP67TQ3Zgriz8RE2h2kMZV2SgMYbq3UhfoFmE= -github.com/kataras/neffos v0.0.14/go.mod h1:8lqADm8PnbeFfL7CLXh1WHw53dG27MC3pgi2R1rmoTE= -github.com/kataras/pio v0.0.2/go.mod h1:hAoW0t9UmXi4R5Oyq5Z4irTbaTsOemSrDGUtaTl7Dro= -github.com/kataras/sitemap v0.0.5/go.mod h1:KY2eugMKiPwsJgx7+U103YZehfvNGOXURubcGyk0Bz8= github.com/kilic/bls12-381 v0.1.0 h1:encrdjqKMEvabVQ7qYOKu1OvhqpK4s47wDYtNiPtlp4= github.com/kilic/bls12-381 v0.1.0/go.mod h1:vDTTHJONJ6G+P2R74EhnyotQDTliQDnFEwhdmfzw1ig= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.8.2/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= -github.com/klauspost/compress v1.9.7/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= github.com/klauspost/compress v1.16.3 h1:XuJt9zzcnaz6a16/OU53ZjWp/v7/42WcR5t2a0PcNQY= github.com/klauspost/compress v1.16.3/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= -github.com/klauspost/cpuid v1.2.1/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.2.4 h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk= github.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/labstack/echo/v4 v4.5.0/go.mod h1:czIriw4a0C1dFun+ObrXp7ok03xON0N1awStJ6ArI7Y= -github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c= github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= github.com/lithammer/dedent v1.1.0 h1:VNzHMVCBNG1j0fh3OrsFRkVUwStdDArbgBWoPAffktY= github.com/lithammer/dedent v1.1.0/go.mod h1:jrXYCQtgg0nJiN+StA2KgR7w6CiQNv9Fd/Z9BP0jIOc= -github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/marioevz/eth-clients v0.0.0-20230925201418-d5fbddd99b76 h1:fj+aeR3YLmSRUWjOGgTxNMdvzm72J5JbKGKosNO/jkE= github.com/marioevz/eth-clients v0.0.0-20230925201418-d5fbddd99b76/go.mod h1:YVrdn57Q3rAzm3wus4T9tg1vMPca4csVbzorPhkGCW0= github.com/marioevz/eth2api v0.0.0-20230922201437-72bd1301e033 h1:sn57n+lbJrLS8FKYs08W7TEzraTGOCQGrSC4hni6rYw= github.com/marioevz/eth2api v0.0.0-20230922201437-72bd1301e033/go.mod h1:hcwWCT4sF1X7KsMZ535MvDZVk5M20Uyj+x2LARZjQsM= github.com/marioevz/mock-builder v0.0.0-20230501225822-df434a88e375 h1:44F0CrAc81Nzsr/4BhkeKebbrHERHdCjO6jXS9VAE/0= github.com/marioevz/mock-builder v0.0.0-20230501225822-df434a88e375/go.mod h1:FQIXEFViaQkOqKrqLC91JgqG+6YEvqMVh9D7g6PmFUg= -github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.11/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= -github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= -github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng= -github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.14 h1:+xnbZSEeDbOIg5/mE6JF0w6n9duR1l3/WmbinWVwUuU= github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= -github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw= github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= -github.com/mediocregopher/radix/v3 v3.4.2/go.mod h1:8FL3F6UQRXHXIBSPUs5h0RybMF8i4n7wVopoX3x7Bv8= -github.com/microcosm-cc/bluemonday v1.0.2/go.mod h1:iVP4YcDBq+n/5fb23BhYFvIMq/leAFZyRl6bYmGDlGc= -github.com/minio/sha256-simd v0.1.0/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= github.com/minio/sha256-simd v1.0.0 h1:v1ta+49hkWZyvaKwrQB8elexRqm6Y0aMLjCNsrYxo6g= github.com/minio/sha256-simd v1.0.0/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy5RFepssQM= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= @@ -281,22 +183,12 @@ github.com/mitchellh/pointerstructure v1.2.1/go.mod h1:BRAsLI5zgXmw97Lf6s25bs8oh github.com/mmcloughlin/addchain v0.4.0 h1:SobOdjm2xLj1KkXN5/n0xTIWyZA2+s99UCY1iPfkHRY= github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqkyU72HC5wJ4RlU= github.com/mmcloughlin/profile v0.1.1/go.mod h1:IhHD7q1ooxgwTgjxQYkACGA77oFTDdFVejUS1/tS/qU= -github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/moul/http2curl v1.0.0/go.mod h1:8UbvGypXm98wA/IqH45anm5Y2Z6ep6O31QGOAZ3H0fQ= -github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= -github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= -github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= -github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= @@ -307,32 +199,27 @@ github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1y github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= github.com/onsi/gomega v1.19.0 h1:4ieX6qQjPP/BfC3mpsAtIGGlxTWPeA3Inl/7DtXw1tw= github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= -github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_golang v1.14.0 h1:nJdhIvne2eSX/XRAFV9PcvFFRbrjbcTUj0VP62TMhnw= github.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4= github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= github.com/prometheus/common v0.42.0 h1:EKsfXEYo4JpWMHH5cg+KOUWeuJSov1Id8zGR8eeI1YM= github.com/prometheus/common v0.42.0/go.mod h1:xBwqVerjNdUDjgODMpudtOMwlOwf2SaTr1yjz4b7Zbc= github.com/prometheus/procfs v0.9.0 h1:wzCHvIvM5SxWqYvwgVL7yJY8Lz3PKn49KQtpgMYJfhI= github.com/prometheus/procfs v0.9.0/go.mod h1:+pB4zwohETzFnmlpe6yd2lSc+0/46IYZRB/chUwxUZY= -github.com/protolambda/bls12-381-util v0.0.0-20210720105258-a772f2aac13e/go.mod h1:MPZvj2Pr0N8/dXyTPS5REeg2sdLG7t8DRzC1rLv925w= -github.com/protolambda/bls12-381-util v0.0.0-20220416220906-d8552aa452c7 h1:cZC+usqsYgHtlBaGulVnZ1hfKAi8iWtujBnRLQE698c= -github.com/protolambda/bls12-381-util v0.0.0-20220416220906-d8552aa452c7/go.mod h1:IToEjHuttnUzwZI5KBSM/LOOW3qLbbrHOEfp3SbECGY= +github.com/protolambda/bls12-381-util v0.1.0 h1:05DU2wJN7DTU7z28+Q+zejXkIsA/MF8JZQGhtBZZiWk= +github.com/protolambda/bls12-381-util v0.1.0/go.mod h1:cdkysJTRpeFeuUVx/TXGDQNMTiRAalk1vQw3TYTHcE4= github.com/protolambda/go-keystorev4 v0.0.0-20211007151826-f20444f6d564 h1:yCXGkFjrZ8EggxW+Y7ueRZesNcBk0avLU0mVU/I2KtU= github.com/protolambda/go-keystorev4 v0.0.0-20211007151826-f20444f6d564/go.mod h1:Xda3KO8+DMyWaTr+LwUUpVRTB5SdFzoKu0ivXNI6p1s= -github.com/protolambda/messagediff v1.4.0/go.mod h1:LboJp0EwIbJsePYpzh5Op/9G1/4mIztMRYzzwR0dR2M= -github.com/protolambda/zrnt v0.30.0 h1:pHEn69ZgaDFGpLGGYG1oD7DvYI7RDirbMBPfbC+8p4g= -github.com/protolambda/zrnt v0.30.0/go.mod h1:qcdX9CXFeVNCQK/q0nswpzhd+31RHMk2Ax/2lMsJ4Jw= +github.com/protolambda/zrnt v0.32.2 h1:KZ48T+3UhsPXNdtE/5QEvGc9DGjUaRI17nJaoznoIaM= +github.com/protolambda/zrnt v0.32.2/go.mod h1:A0fezkp9Tt3GBLATSPIbuY4ywYESyAuc/FFmPKg8Lqs= github.com/protolambda/ztyp v0.2.2 h1:rVcL3vBu9W/aV646zF6caLS/dyn9BN8NYiuJzicLNyY= github.com/protolambda/ztyp v0.2.2/go.mod h1:9bYgKGqg3wJqT9ac1gI2hnVb0STQq7p/1lapqrqY1dU= github.com/prysmaticlabs/gohashtree v0.0.1-alpha.0.20220714111606-acbb2962fb48 h1:cSo6/vk8YpvkLbk9v3FO97cakNmUoxwi2KMP8hd5WIw= @@ -342,39 +229,21 @@ github.com/rauljordan/engine-proxy v0.0.0-20230316220057-4c80c36c4c3a/go.mod h1: github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis= github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= -github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= -github.com/rogpeppe/go-internal v1.8.1/go.mod h1:JeRgkft04UBgHMgCIwADu4Pn6Mtm5d4nPKWu0nJ5d+o= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= github.com/rs/cors v1.8.3 h1:O+qNyWn7Z+F9M0ILBHgMVPuB1xTOucVd5gtaYyXBpRo= github.com/rs/cors v1.8.3/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= -github.com/russross/blackfriday v1.5.2 h1:HyvC0ARfnZBqnXwABFeSZHpKvJHJJfPz81GNueLj0oo= -github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/schollz/closestmatch v2.1.0+incompatible/go.mod h1:RtP1ddjLong6gTkbtmuhtR2uUrrJOpYzYRvbcPAid+g= -github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI= github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= -github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= -github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= -github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= github.com/status-im/keycard-go v0.2.0 h1:QDLFswOQu1r5jsycloeQh3bVU8n/NatHHaZobtDnDzA= github.com/status-im/keycard-go v0.2.0/go.mod h1:wlp8ZLbsmrF6g6WjugPAx+IzoLrkdf9+mHxBEeo3Hbg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= @@ -390,212 +259,115 @@ github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+F github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= github.com/tyler-smith/go-bip39 v1.1.0 h1:5eUemwrMargf3BSLRRCalXT93Ns6pQJIjYQN2nyfOP8= github.com/tyler-smith/go-bip39 v1.1.0/go.mod h1:gUYDtqQw1JS3ZJ8UWVcGTGqqr6YIN3CWg+kkNaLt55U= -github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= -github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= -github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= -github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= github.com/urfave/cli/v2 v2.25.7 h1:VAzn5oq403l5pHjc4OhD54+XGO9cdKVL/7lDjF+iKUs= github.com/urfave/cli/v2 v2.25.7/go.mod h1:8qnjx1vcq5s2/wpsqoZFndg2CE5tNFyrTvS6SinrnYQ= -github.com/urfave/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4= -github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= -github.com/valyala/fasthttp v1.6.0/go.mod h1:FstJa9V+Pj9vQ7OJie2qMHdwemEDaDiSdBnvPM1Su9w= -github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= -github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= -github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio= github.com/wealdtech/go-bytesutil v1.2.0 h1:GEIzvAZEIgqOoRfnEAaMRNL73gl8e+YlQzqxhFyR30Y= github.com/wealdtech/go-bytesutil v1.2.0/go.mod h1:FHQSlwhzfSZGffu1osaUGdnNtl5C8tBKwmqvPdB66pM= github.com/wealdtech/go-eth2-types/v2 v2.8.0 h1:Cts9J78ryXVp8jwotdSSVU75S+QWJrgVCArXreD2X8A= github.com/wealdtech/go-eth2-types/v2 v2.8.0/go.mod h1:tJazo9o28kdQs3V/U4VafQ4neG+/sL3OBozQ8J3CWmo= github.com/wealdtech/go-eth2-util v1.8.0 h1:hhs3h2y3Ldty18lppFdpe46nZpdDAMbY7QqiHO5BvE0= github.com/wealdtech/go-eth2-util v1.8.0/go.mod h1:rSuE0v5zX+uyZrqW/iUmXOxeDpB7lTvhcZvAVh0KlMU= -github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= -github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= -github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= -github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU= github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8= -github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0/go.mod h1:/LWChgwKmvncFJFHJ7Gvn9wZArjbV5/FppcK2fKk/tI= -github.com/yudai/gojsondiff v1.0.0/go.mod h1:AY32+k2cwILAkW1fbgxQ5mUmMiZFgLIV+FBNExI05xg= -github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82/go.mod h1:lgjkn3NuSvDfVJdfcVVdX+jpBxNmX4rDAzaS45IcYoM= -github.com/yudai/pp v2.0.1+incompatible/go.mod h1:PuxR/8QJ7cyCkFp/aUDS+JY727OFEZkTdatxwunjIkc= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yusufpapurcu/wmi v1.2.2 h1:KBNDSne4vP5mbSWnJbO+51IMOXJB67QiYCSBrubbPRg= github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= -golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191227163750-53104e6ec876/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= -golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g= -golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30= +golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M= +golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa h1:FRnLl4eNAQl8hwxVVC17teOw8kdjVDVAiFMtgUdTSRQ= +golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa/go.mod h1:zk2irFbV9DP96SEBUUAy67IdHUaZuSnrz1n472HUCLE= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc= -golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190327091125-710a502c58a2/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= -golang.org/x/net v0.0.0-20211008194852-3b03d305991f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4= -golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/net v0.24.0 h1:1PcaxkF854Fu3+lvBIx5SYn9wRlBzzcnHZSiaFFAb0w= +golang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= -golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= +golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201101102859-da207088b7d1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= -golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= +golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= -golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= +golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181221001348-537d06c36207/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190327201419-c70d86f8b7cf/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.13.0 h1:Iey4qkscZuv0VvIt8E0neZjtPVQFSc870HQ448QgEmQ= -golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/genproto v0.0.0-20180518175338-11a468237815/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= -google.golang.org/grpc v1.12.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= -gopkg.in/go-playground/validator.v8 v8.18.2/go.mod h1:RX2a/7Ha8BgOhfk7j780h4/u/RRjR0eouCJSH80/M2Y= gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1 h1:iiHuQZCNgYPmFQxd3BBN/Nc5+dAwzZuq5y40s20oQw0= gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= -gopkg.in/ini.v1 v1.51.1/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= -gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8= -gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= +gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc= +gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= @@ -603,12 +375,8 @@ gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= -gopkg.in/yaml.v3 v3.0.0-20191120175047-4206685974f2/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= rsc.io/tmplfunc v0.0.3 h1:53XFQh69AfOa8Tw0Jm7t+GV7KZhOi6jzsCzTtKbMvzU= rsc.io/tmplfunc v0.0.3/go.mod h1:AG3sTPzElb1Io3Yg4voV9AGZJuleGAwaVRxL9M49PhA= From 8f5e8346397a5d03cd83c258e89567488520459b Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Mon, 10 Jun 2024 20:22:05 +0200 Subject: [PATCH 290/387] simulators/ethereum/pyspec: upgrade hivesim --- simulators/ethereum/pyspec/go.mod | 42 ++-- simulators/ethereum/pyspec/go.sum | 341 +++++------------------------- 2 files changed, 73 insertions(+), 310 deletions(-) diff --git a/simulators/ethereum/pyspec/go.mod b/simulators/ethereum/pyspec/go.mod index 65e2f7bd98..c300c1af9b 100644 --- a/simulators/ethereum/pyspec/go.mod +++ b/simulators/ethereum/pyspec/go.mod @@ -5,39 +5,39 @@ go 1.21 toolchain go1.22.1 require ( - github.com/ethereum/go-ethereum v1.13.5-0.20231127143928-5b57727d6de2 - github.com/ethereum/hive v0.0.0-20240319152821-ae224371b4e5 + github.com/ethereum/go-ethereum v1.14.5 + github.com/ethereum/hive v0.0.0-20240610172825-2430a68c753a github.com/ethereum/hive/simulators/ethereum/engine v0.0.0-20230919054339-322945164a97 ) require ( github.com/DataDog/zstd v1.5.2 // indirect - github.com/Microsoft/go-winio v0.6.1 // indirect - github.com/VictoriaMetrics/fastcache v1.12.1 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect + github.com/VictoriaMetrics/fastcache v1.12.2 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/bits-and-blooms/bitset v1.10.0 // indirect github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect - github.com/cespare/xxhash/v2 v2.2.0 // indirect - github.com/cockroachdb/errors v1.9.1 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/cockroachdb/errors v1.11.1 // indirect github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect - github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593 // indirect - github.com/cockroachdb/redact v1.1.3 // indirect + github.com/cockroachdb/pebble v1.1.0 // indirect + github.com/cockroachdb/redact v1.1.5 // indirect github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect github.com/consensys/bavard v0.1.13 // indirect github.com/consensys/gnark-crypto v0.12.1 // indirect - github.com/crate-crypto/go-ipa v0.0.0-20231025140028-3c0104f4b233 // indirect - github.com/crate-crypto/go-kzg-4844 v0.7.0 // indirect - github.com/deckarep/golang-set/v2 v2.1.0 // indirect + github.com/crate-crypto/go-ipa v0.0.0-20240223125850-b1e8a79f509c // indirect + github.com/crate-crypto/go-kzg-4844 v1.0.0 // indirect + github.com/deckarep/golang-set/v2 v2.6.0 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 // indirect - github.com/ethereum/c-kzg-4844 v0.4.0 // indirect - github.com/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46 // indirect + github.com/ethereum/c-kzg-4844 v1.0.0 // indirect + github.com/ethereum/go-verkle v0.1.1-0.20240306133620-7d920df305f0 // indirect github.com/getsentry/sentry-go v0.18.0 // indirect - github.com/go-ole/go-ole v1.2.6 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect github.com/go-stack/stack v1.8.1 // indirect github.com/gofrs/flock v0.8.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang-jwt/jwt/v4 v4.5.0 // indirect - github.com/golang/protobuf v1.5.3 // indirect + github.com/golang/protobuf v1.5.4 // indirect github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect github.com/gorilla/websocket v1.5.0 // indirect github.com/holiman/bloomfilter/v2 v2.0.3 // indirect @@ -47,7 +47,7 @@ require ( github.com/kr/text v0.2.0 // indirect github.com/lithammer/dedent v1.1.0 // indirect github.com/mattn/go-colorable v0.1.13 // indirect - github.com/mattn/go-isatty v0.0.17 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect github.com/mattn/go-runewidth v0.0.14 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect github.com/mmcloughlin/addchain v0.4.0 // indirect @@ -65,13 +65,11 @@ require ( github.com/tklauser/go-sysconf v0.3.12 // indirect github.com/tklauser/numcpus v0.6.1 // indirect github.com/yusufpapurcu/wmi v1.2.2 // indirect - golang.org/x/crypto v0.21.0 // indirect - golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect - golang.org/x/mod v0.12.0 // indirect - golang.org/x/sync v0.4.0 // indirect - golang.org/x/sys v0.18.0 // indirect + golang.org/x/crypto v0.22.0 // indirect + golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa // indirect + golang.org/x/sync v0.7.0 // indirect + golang.org/x/sys v0.20.0 // indirect golang.org/x/text v0.14.0 // indirect - golang.org/x/tools v0.13.0 // indirect google.golang.org/protobuf v1.33.0 // indirect gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1 // indirect rsc.io/tmplfunc v0.0.3 // indirect diff --git a/simulators/ethereum/pyspec/go.sum b/simulators/ethereum/pyspec/go.sum index 4de09a3add..124cd15810 100644 --- a/simulators/ethereum/pyspec/go.sum +++ b/simulators/ethereum/pyspec/go.sum @@ -1,22 +1,12 @@ -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/CloudyKit/fastprinter v0.0.0-20200109182630-33d98a066a53/go.mod h1:+3IMCy2vIlbG1XG/0ggNQv0SvxCAIpPM5b1nCz56Xno= -github.com/CloudyKit/jet/v3 v3.0.0/go.mod h1:HKQPgSJmdK8hdoAbKUUWajkHyHo4RaU5rMdUywE7VMo= github.com/DataDog/zstd v1.5.2 h1:vUG4lAyuPCXO0TLbXvPv7EB7cNK1QV/luu55UHLrrn8= github.com/DataDog/zstd v1.5.2/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= -github.com/Joker/hpp v1.0.0/go.mod h1:8x5n+M1Hp5hC0g8okX3sR3vFQwynaX/UgSOM9MeBKzY= -github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= -github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= -github.com/Shopify/goreferrer v0.0.0-20181106222321-ec9c9a553398/go.mod h1:a1uqRtAwp2Xwc6WNPJEufxJ7fx3npB4UV/JOLmbu5I0= -github.com/VictoriaMetrics/fastcache v1.12.1 h1:i0mICQuojGDL3KblA7wUNlY5lOK6a4bwt3uRKnkZU40= -github.com/VictoriaMetrics/fastcache v1.12.1/go.mod h1:tX04vaqcNoQeGLD+ra5pU5sWkuxnzWhEzLwhP9w653o= -github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/VictoriaMetrics/fastcache v1.12.2 h1:N0y9ASrJ0F6h0QaC3o6uJb3NIZ9VKLjCM7NQbSmF7WI= +github.com/VictoriaMetrics/fastcache v1.12.2/go.mod h1:AmC+Nzz1+3G2eCPapF6UcsnkThDcMsQicp4xDukwJYI= github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= github.com/allegro/bigcache v1.2.1 h1:hg1sY1raCwic3Vnsvje6TT7/pnZba83LeFck5NrFKSc= github.com/allegro/bigcache v1.2.1/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= -github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= -github.com/aymerick/raymond v2.0.3-0.20180322193309-b565731e1464+incompatible/go.mod h1:osfaiScAUVup+UC9Nfq76eWqDhXlp+4UYaA8uhTBO6g= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bits-and-blooms/bitset v1.10.0 h1:ePXTeiPEazB5+opbv5fr8umg2R/1NlzgDsyepwsSr88= @@ -25,160 +15,110 @@ github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cockroachdb/datadriven v1.0.2/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f h1:otljaYPt5hWxV3MUfO5dFPFiOXg9CyG5/kCfayTqsJ4= github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= -github.com/cockroachdb/errors v1.9.1 h1:yFVvsI0VxmRShfawbt/laCIDy/mtTqqnvoNgiy5bEV8= -github.com/cockroachdb/errors v1.9.1/go.mod h1:2sxOtL2WIc096WSZqZ5h8fa17rdDq9HZOZLBCor4mBk= -github.com/cockroachdb/logtags v0.0.0-20211118104740-dabe8e521a4f/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= +github.com/cockroachdb/errors v1.11.1 h1:xSEW75zKaKCWzR3OfxXUxgrk/NtT4G1MiOv5lWZazG8= +github.com/cockroachdb/errors v1.11.1/go.mod h1:8MUxA3Gi6b25tYlFEBGLf+D8aISL+M4MIpiWMSNRfxw= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= -github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593 h1:aPEJyR4rPBvDmeyi+l/FS/VtA00IWvjeFvjen1m1l1A= -github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593/go.mod h1:6hk1eMY/u5t+Cf18q5lFMUA1Rc+Sm5I6Ra1QuPyxXCo= -github.com/cockroachdb/redact v1.1.3 h1:AKZds10rFSIj7qADf0g46UixK8NNLwWTNdCIGS5wfSQ= -github.com/cockroachdb/redact v1.1.3/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= +github.com/cockroachdb/pebble v1.1.0 h1:pcFh8CdCIt2kmEpK0OIatq67Ln9uGDYY3d5XnE0LJG4= +github.com/cockroachdb/pebble v1.1.0/go.mod h1:sEHm5NOXxyiAoKWhoFxT8xMgd/f3RA6qUqQ1BXKrh2E= +github.com/cockroachdb/redact v1.1.5 h1:u1PMllDkdFfPWaNGMyLD1+so+aq3uUItthCFqzwPJ30= +github.com/cockroachdb/redact v1.1.5/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo= github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ= -github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0/go.mod h1:4Zcjuz89kmFXt9morQgcfYZAYZ5n8WHjt81YYWIwtTM= github.com/consensys/bavard v0.1.13 h1:oLhMLOFGTLdlda/kma4VOJazblc7IM5y5QPd2A/YjhQ= github.com/consensys/bavard v0.1.13/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI= github.com/consensys/gnark-crypto v0.12.1 h1:lHH39WuuFgVHONRl3J0LRBtuYdQTumFSDtJF7HpyG8M= github.com/consensys/gnark-crypto v0.12.1/go.mod h1:v2Gy7L/4ZRosZ7Ivs+9SfUDr0f5UlG+EM5t7MPHiLuY= -github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= -github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/cpuguy83/go-md2man v1.0.10 h1:BSKMNlYxDvnunlTymqtgONjNnaRV1sTpcovwwjF22jk= -github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/crate-crypto/go-ipa v0.0.0-20231025140028-3c0104f4b233 h1:d28BXYi+wUpz1KBmiF9bWrjEMacUEREV6MBi2ODnrfQ= -github.com/crate-crypto/go-ipa v0.0.0-20231025140028-3c0104f4b233/go.mod h1:geZJZH3SzKCqnz5VT0q/DyIG/tvu/dZk+VIfXicupJs= -github.com/crate-crypto/go-kzg-4844 v0.7.0 h1:C0vgZRk4q4EZ/JgPfzuSoxdCq3C3mOZMBShovmncxvA= -github.com/crate-crypto/go-kzg-4844 v0.7.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= +github.com/crate-crypto/go-ipa v0.0.0-20240223125850-b1e8a79f509c h1:uQYC5Z1mdLRPrZhHjHxufI8+2UG/i25QG92j0Er9p6I= +github.com/crate-crypto/go-ipa v0.0.0-20240223125850-b1e8a79f509c/go.mod h1:geZJZH3SzKCqnz5VT0q/DyIG/tvu/dZk+VIfXicupJs= +github.com/crate-crypto/go-kzg-4844 v1.0.0 h1:TsSgHwrkTKecKJ4kadtHi4b3xHW5dCFUDFnUp1TsawI= +github.com/crate-crypto/go-kzg-4844 v1.0.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/deckarep/golang-set/v2 v2.1.0 h1:g47V4Or+DUdzbs8FxCCmgb6VYd+ptPAngjM6dtGktsI= -github.com/deckarep/golang-set/v2 v2.1.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= +github.com/deckarep/golang-set/v2 v2.6.0 h1:XfcQbWM1LlMB8BsJ8N9vW5ehnnPVIw0je80NsVHagjM= +github.com/deckarep/golang-set/v2 v2.6.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0= github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 h1:HbphB4TFFXpv7MNrT52FGrrgVXF1owhMVTHFZIlnvd4= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0/go.mod h1:DZGJHZMqrU4JJqFAWUS2UO1+lbSKsdiOoYi9Zzey7Fc= -github.com/dgraph-io/badger v1.6.0/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6psNgSztDR4= -github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385/go.mod h1:0vRUJqYpeSZifjYj7uP3BG/gKcuzL9xWVV/Y+cK33KM= -github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/etcd-io/bbolt v1.3.3/go.mod h1:ZF2nL25h33cCyBtcyWeZ2/I3HQOfTP+0PIEvHjkjCrw= -github.com/ethereum/c-kzg-4844 v0.4.0 h1:3MS1s4JtA868KpJxroZoepdV0ZKBp3u/O5HcZ7R3nlY= -github.com/ethereum/c-kzg-4844 v0.4.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= -github.com/ethereum/go-ethereum v1.13.5-0.20231127143928-5b57727d6de2 h1:aQz+Zhve06dQU6qqnCQ3TuZ7nFWxFvnNt+PY+LA8ZjM= -github.com/ethereum/go-ethereum v1.13.5-0.20231127143928-5b57727d6de2/go.mod h1:iogCB+O7R3eFmlyiEKRDqjmJbSgOsDHTjxE0PU6CYC8= -github.com/ethereum/hive v0.0.0-20240319152821-ae224371b4e5 h1:2Rc3v1mqWgUl8gSHFh7+FmVcyB1AI/9THxhEDjNK+PI= -github.com/ethereum/hive v0.0.0-20240319152821-ae224371b4e5/go.mod h1:MGwUXPGco6YS3brOf5WEILfUnnUL/XuX1224ab3D7XA= -github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072/go.mod h1:duJ4Jxv5lDcvg4QuQr0oowTf7dz4/CR8NtyCooz9HL8= -github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= -github.com/fjl/memsize v0.0.1 h1:+zhkb+dhUgx0/e+M8sF0QqiouvMQUiKR+QYvdxIOKcQ= -github.com/fjl/memsize v0.0.1/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= +github.com/ethereum/c-kzg-4844 v1.0.0 h1:0X1LBXxaEtYD9xsyj9B9ctQEZIpnvVDeoBx8aHEwTNA= +github.com/ethereum/c-kzg-4844 v1.0.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= +github.com/ethereum/go-ethereum v1.14.5 h1:szuFzO1MhJmweXjoM5nSAeDvjNUH3vIQoMzzQnfvjpw= +github.com/ethereum/go-ethereum v1.14.5/go.mod h1:VEDGGhSxY7IEjn98hJRFXl/uFvpRgbIIf2PpXiyGGgc= +github.com/ethereum/go-verkle v0.1.1-0.20240306133620-7d920df305f0 h1:KrE8I4reeVvf7C1tm8elRjj4BdscTYzz/WAbYyf/JI4= +github.com/ethereum/go-verkle v0.1.1-0.20240306133620-7d920df305f0/go.mod h1:D9AJLVXSyZQXJQVk8oh1EwjISE+sJTn2duYIZC0dy3w= +github.com/ethereum/hive v0.0.0-20240610172825-2430a68c753a h1:iyHHRPXaxHtEvyFxc4A+is/JRt88o0gQhHrNx+khEqQ= +github.com/ethereum/hive v0.0.0-20240610172825-2430a68c753a/go.mod h1:ghNXZW+/WQClcyiwZpbTzUCyxwql7YeMacYd44v+BJE= +github.com/fjl/memsize v0.0.2 h1:27txuSD9or+NZlnOWdKUxeBzTAUkWCVh+4Gf2dWFOzA= +github.com/fjl/memsize v0.0.2/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= -github.com/gavv/httpexpect v2.0.0+incompatible/go.mod h1:x+9tiU1YnrOvnB725RkpoLv1M62hOWzwo5OXotisrKc= github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08 h1:f6D9Hr8xV8uYKlyuj8XIruxlh9WjVjdh1gIicAS7ays= github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= -github.com/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46 h1:BAIP2GihuqhwdILrV+7GJel5lyPV3u1+PgzrWLc0TkE= -github.com/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46/go.mod h1:QNpY22eby74jVhqH4WhDLDwxc/vqsern6pW+u2kbkpc= -github.com/getsentry/sentry-go v0.12.0/go.mod h1:NSap0JBYWzHND8oMbyi0+XZhUalc1TBdRL1M71JZW2c= github.com/getsentry/sentry-go v0.18.0 h1:MtBW5H9QgdcJabtZcuJG80BMOwaBpkRDZkxRkNC1sN0= github.com/getsentry/sentry-go v0.18.0/go.mod h1:Kgon4Mby+FJ7ZWHFUAZgVaIa8sxHtnRJRLTXZr51aKQ= -github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3/go.mod h1:VJ0WA2NBN22VlZ2dKZQPAPnyWw5XTlK1KymzLKsr59s= -github.com/gin-gonic/gin v1.4.0/go.mod h1:OW2EZn3DO8Ln9oIKOvM++LBO+5UPHJJDH72/q/3rZdM= -github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= -github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= -github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab/go.mod h1:/P9AEU963A2AYjv4d1V5eVL1CQbEJq6aCNHDDjibzu8= -github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= github.com/go-stack/stack v1.8.1 h1:ntEHSVwIt7PNXNpgPmVfMrNhLtgjlmnZha2kOpuRiDw= github.com/go-stack/stack v1.8.1/go.mod h1:dcoOX6HbPZSZptuspn9bctJ+N/CnF5gGygcUP3XYfe4= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= -github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= -github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= -github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= -github.com/gogo/googleapis v0.0.0-20180223154316-0cd9801be74a/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= -github.com/gogo/googleapis v1.4.1/go.mod h1:2lpHqI5OcWCtVElxXnPt+s8oJvMpySlOyM6xDCrzib4= -github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/gogo/status v1.1.0/go.mod h1:BFv9nrluPLmrS0EmGVvLaPNmRosr9KapBYd5/hpY1WM= -github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= -github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXiurYmW7fx4GZkL8feAMVq7nEjURHk= github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/gomodule/redigo v1.7.1-0.20190724094224-574c33c3df38/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= -github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/hashicorp/go-bexpr v0.1.11 h1:6DqdA/KBjurGby9yTY0bmkathya0lfwF2SeuubCI7dY= github.com/hashicorp/go-bexpr v0.1.11/go.mod h1:f03lAo0duBlDIUMGCuad8oLcgejw4m7U+N8T+6Kz1AE= -github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/holiman/billy v0.0.0-20230718173358-1c7e68d277a7 h1:3JQNjnMRil1yD0IfZKHF9GxxWKDJGj8I0IqOUol//sw= -github.com/holiman/billy v0.0.0-20230718173358-1c7e68d277a7/go.mod h1:5GuXa7vkL8u9FkFuWdVvfR5ix8hRB7DbOAaYULamFpc= +github.com/holiman/billy v0.0.0-20240216141850-2abb0c79d3c4 h1:X4egAf/gcS1zATw6wn4Ej8vjuVGxeHdan+bRb2ebyv4= +github.com/holiman/billy v0.0.0-20240216141850-2abb0c79d3c4/go.mod h1:5GuXa7vkL8u9FkFuWdVvfR5ix8hRB7DbOAaYULamFpc= github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao= github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA= github.com/holiman/uint256 v1.2.4 h1:jUc4Nk8fm9jZabQuqr2JzednajVmBpC+oiTiXZJEApU= @@ -186,73 +126,33 @@ github.com/holiman/uint256 v1.2.4/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXei github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/huin/goupnp v1.3.0 h1:UvLUlWDNpoUdYzb2TCn+MuTWtcjXKSza2n6CBdQ0xXc= github.com/huin/goupnp v1.3.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8= -github.com/hydrogen18/memlistener v0.0.0-20200120041712-dcc25e7acd91/go.mod h1:qEIFzExnS6016fRpRfxrExeVn2gbClQA99gQhnIcdhE= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/imkira/go-interpol v1.1.0/go.mod h1:z0h2/2T3XF8kyEPpRgJ3kmNv+C43p+I/CoI+jC3w2iA= -github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/iris-contrib/blackfriday v2.0.0+incompatible/go.mod h1:UzZ2bDEoaSGPbkg6SAB4att1aAwTmVIx/5gCVqeyUdI= -github.com/iris-contrib/go.uuid v2.0.0+incompatible/go.mod h1:iz2lgM/1UnEf1kP0L/+fafWORmlnuysV2EMP8MW+qe0= -github.com/iris-contrib/jade v1.1.3/go.mod h1:H/geBymxJhShH5kecoiOCSssPX7QWYH7UaeZTSWddIk= -github.com/iris-contrib/pongo2 v0.0.1/go.mod h1:Ssh+00+3GAZqSQb30AvBRNxBx7rf0GqwkjqxNd0u65g= -github.com/iris-contrib/schema v0.0.1/go.mod h1:urYA3uvUNG1TIIjOSCzHr9/LmbQo8LrOcOqfqxa4hXw= github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= -github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= -github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88/go.mod h1:3w7q1U84EfirKl04SVQ/s7nPm1ZPhiXd34z40TNz36k= -github.com/kataras/golog v0.0.10/go.mod h1:yJ8YKCmyL+nWjERB90Qwn+bdyBZsaQwU3bTVFgkFIp8= -github.com/kataras/iris/v12 v12.1.8/go.mod h1:LMYy4VlP67TQ3Zgriz8RE2h2kMZV2SgMYbq3UhfoFmE= -github.com/kataras/neffos v0.0.14/go.mod h1:8lqADm8PnbeFfL7CLXh1WHw53dG27MC3pgi2R1rmoTE= -github.com/kataras/pio v0.0.2/go.mod h1:hAoW0t9UmXi4R5Oyq5Z4irTbaTsOemSrDGUtaTl7Dro= -github.com/kataras/sitemap v0.0.5/go.mod h1:KY2eugMKiPwsJgx7+U103YZehfvNGOXURubcGyk0Bz8= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.8.2/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= -github.com/klauspost/compress v1.9.7/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= github.com/klauspost/compress v1.15.15 h1:EF27CXIuDsYJ6mmvtBRlEuB2UVOqHG1tAXgZ7yIO+lw= github.com/klauspost/compress v1.15.15/go.mod h1:ZcK2JAFqKOpnBlxcLsJzYfrS9X1akm9fHZNnD9+Vo/4= -github.com/klauspost/cpuid v1.2.1/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/labstack/echo/v4 v4.5.0/go.mod h1:czIriw4a0C1dFun+ObrXp7ok03xON0N1awStJ6ArI7Y= -github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c= github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= github.com/lithammer/dedent v1.1.0 h1:VNzHMVCBNG1j0fh3OrsFRkVUwStdDArbgBWoPAffktY= github.com/lithammer/dedent v1.1.0/go.mod h1:jrXYCQtgg0nJiN+StA2KgR7w6CiQNv9Fd/Z9BP0jIOc= -github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.11/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= -github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= -github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng= -github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.14 h1:+xnbZSEeDbOIg5/mE6JF0w6n9duR1l3/WmbinWVwUuU= github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= -github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw= github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= -github.com/mediocregopher/radix/v3 v3.4.2/go.mod h1:8FL3F6UQRXHXIBSPUs5h0RybMF8i4n7wVopoX3x7Bv8= -github.com/microcosm-cc/bluemonday v1.0.2/go.mod h1:iVP4YcDBq+n/5fb23BhYFvIMq/leAFZyRl6bYmGDlGc= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/pointerstructure v1.2.1 h1:ZhBBeX8tSlRpu/FFhXH4RC4OJzFlqsQhoHZAz4x7TIw= @@ -260,22 +160,12 @@ github.com/mitchellh/pointerstructure v1.2.1/go.mod h1:BRAsLI5zgXmw97Lf6s25bs8oh github.com/mmcloughlin/addchain v0.4.0 h1:SobOdjm2xLj1KkXN5/n0xTIWyZA2+s99UCY1iPfkHRY= github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqkyU72HC5wJ4RlU= github.com/mmcloughlin/profile v0.1.1/go.mod h1:IhHD7q1ooxgwTgjxQYkACGA77oFTDdFVejUS1/tS/qU= -github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/moul/http2curl v1.0.0/go.mod h1:8UbvGypXm98wA/IqH45anm5Y2Z6ep6O31QGOAZ3H0fQ= -github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= -github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= -github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= -github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= @@ -286,18 +176,15 @@ github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1y github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= github.com/onsi/gomega v1.19.0 h1:4ieX6qQjPP/BfC3mpsAtIGGlxTWPeA3Inl/7DtXw1tw= github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= -github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_golang v1.14.0 h1:nJdhIvne2eSX/XRAFV9PcvFFRbrjbcTUj0VP62TMhnw= github.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4= github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= github.com/prometheus/common v0.39.0 h1:oOyhkDq05hPZKItWVBkJ6g6AtGxi+fy7F4JvUV8uhsI= @@ -307,38 +194,19 @@ github.com/prometheus/procfs v0.9.0/go.mod h1:+pB4zwohETzFnmlpe6yd2lSc+0/46IYZRB github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.3 h1:utMvzDsuh3suAEnhH0RdHmoPbU648o6CvXxTx4SBMOw= github.com/rivo/uniseg v0.4.3/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= -github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= -github.com/rogpeppe/go-internal v1.8.1/go.mod h1:JeRgkft04UBgHMgCIwADu4Pn6Mtm5d4nPKWu0nJ5d+o= github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/rs/cors v1.8.2 h1:KCooALfAYGs415Cwu5ABvv9n9509fSiG5SQJn/AQo4U= github.com/rs/cors v1.8.2/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= -github.com/russross/blackfriday v1.5.2 h1:HyvC0ARfnZBqnXwABFeSZHpKvJHJJfPz81GNueLj0oo= -github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/schollz/closestmatch v2.1.0+incompatible/go.mod h1:RtP1ddjLong6gTkbtmuhtR2uUrrJOpYzYRvbcPAid+g= -github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI= github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= -github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= -github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= -github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= github.com/status-im/keycard-go v0.2.0 h1:QDLFswOQu1r5jsycloeQh3bVU8n/NatHHaZobtDnDzA= github.com/status-im/keycard-go v0.2.0/go.mod h1:wlp8ZLbsmrF6g6WjugPAx+IzoLrkdf9+mHxBEeo3Hbg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= @@ -352,202 +220,104 @@ github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+F github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= github.com/tyler-smith/go-bip39 v1.1.0 h1:5eUemwrMargf3BSLRRCalXT93Ns6pQJIjYQN2nyfOP8= github.com/tyler-smith/go-bip39 v1.1.0/go.mod h1:gUYDtqQw1JS3ZJ8UWVcGTGqqr6YIN3CWg+kkNaLt55U= -github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= -github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= -github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= -github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= github.com/urfave/cli/v2 v2.25.7 h1:VAzn5oq403l5pHjc4OhD54+XGO9cdKVL/7lDjF+iKUs= github.com/urfave/cli/v2 v2.25.7/go.mod h1:8qnjx1vcq5s2/wpsqoZFndg2CE5tNFyrTvS6SinrnYQ= -github.com/urfave/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4= -github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= -github.com/valyala/fasthttp v1.6.0/go.mod h1:FstJa9V+Pj9vQ7OJie2qMHdwemEDaDiSdBnvPM1Su9w= -github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= -github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= -github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio= -github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= -github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= -github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= -github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU= github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8= -github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0/go.mod h1:/LWChgwKmvncFJFHJ7Gvn9wZArjbV5/FppcK2fKk/tI= -github.com/yudai/gojsondiff v1.0.0/go.mod h1:AY32+k2cwILAkW1fbgxQ5mUmMiZFgLIV+FBNExI05xg= -github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82/go.mod h1:lgjkn3NuSvDfVJdfcVVdX+jpBxNmX4rDAzaS45IcYoM= -github.com/yudai/pp v2.0.1+incompatible/go.mod h1:PuxR/8QJ7cyCkFp/aUDS+JY727OFEZkTdatxwunjIkc= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yusufpapurcu/wmi v1.2.2 h1:KBNDSne4vP5mbSWnJbO+51IMOXJB67QiYCSBrubbPRg= github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= -golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191227163750-53104e6ec876/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= -golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g= -golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30= +golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M= +golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa h1:FRnLl4eNAQl8hwxVVC17teOw8kdjVDVAiFMtgUdTSRQ= +golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa/go.mod h1:zk2irFbV9DP96SEBUUAy67IdHUaZuSnrz1n472HUCLE= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc= -golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190327091125-710a502c58a2/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= -golang.org/x/net v0.0.0-20211008194852-3b03d305991f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4= -golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/net v0.24.0 h1:1PcaxkF854Fu3+lvBIx5SYn9wRlBzzcnHZSiaFFAb0w= +golang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.4.0 h1:zxkM55ReGkDlKSM+Fu41A+zmbZuaPVbGMzvvdUPznYQ= -golang.org/x/sync v0.4.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= +golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= -golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= +golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= -golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= +golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181221001348-537d06c36207/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190327201419-c70d86f8b7cf/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.13.0 h1:Iey4qkscZuv0VvIt8E0neZjtPVQFSc870HQ448QgEmQ= -golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/genproto v0.0.0-20180518175338-11a468237815/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= -google.golang.org/grpc v1.12.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= -gopkg.in/go-playground/validator.v8 v8.18.2/go.mod h1:RX2a/7Ha8BgOhfk7j780h4/u/RRjR0eouCJSH80/M2Y= gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1 h1:iiHuQZCNgYPmFQxd3BBN/Nc5+dAwzZuq5y40s20oQw0= gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= -gopkg.in/ini.v1 v1.51.1/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= -gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8= -gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= +gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc= +gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= @@ -555,12 +325,7 @@ gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= -gopkg.in/yaml.v3 v3.0.0-20191120175047-4206685974f2/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= rsc.io/tmplfunc v0.0.3 h1:53XFQh69AfOa8Tw0Jm7t+GV7KZhOi6jzsCzTtKbMvzU= rsc.io/tmplfunc v0.0.3/go.mod h1:AG3sTPzElb1Io3Yg4voV9AGZJuleGAwaVRxL9M49PhA= From 2a745e77bb802938c16a023f3e902133e3ce645f Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Mon, 10 Jun 2024 20:22:32 +0200 Subject: [PATCH 291/387] simulators/ethereum/graphql: upgrade hivesim --- simulators/ethereum/graphql/go.mod | 44 ++-- simulators/ethereum/graphql/go.sum | 327 +++++------------------------ 2 files changed, 71 insertions(+), 300 deletions(-) diff --git a/simulators/ethereum/graphql/go.mod b/simulators/ethereum/graphql/go.mod index a3134364fd..c1b8b53759 100644 --- a/simulators/ethereum/graphql/go.mod +++ b/simulators/ethereum/graphql/go.mod @@ -5,47 +5,49 @@ go 1.21 toolchain go1.22.1 require ( - github.com/ethereum/go-ethereum v1.13.5-0.20231031113925-bc42e88415d3 - github.com/ethereum/hive v0.0.0-20240319152821-ae224371b4e5 + github.com/ethereum/go-ethereum v1.14.5 + github.com/ethereum/hive v0.0.0-20240610172825-2430a68c753a ) require ( github.com/DataDog/zstd v1.5.2 // indirect - github.com/Microsoft/go-winio v0.6.1 // indirect - github.com/VictoriaMetrics/fastcache v1.12.1 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect + github.com/VictoriaMetrics/fastcache v1.12.2 // indirect github.com/beorn7/perks v1.0.1 // indirect - github.com/bits-and-blooms/bitset v1.7.0 // indirect + github.com/bits-and-blooms/bitset v1.10.0 // indirect github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect - github.com/cespare/xxhash/v2 v2.2.0 // indirect - github.com/cockroachdb/errors v1.9.1 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/cockroachdb/errors v1.11.1 // indirect github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect - github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593 // indirect - github.com/cockroachdb/redact v1.1.3 // indirect + github.com/cockroachdb/pebble v1.1.0 // indirect + github.com/cockroachdb/redact v1.1.5 // indirect github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect github.com/consensys/bavard v0.1.13 // indirect github.com/consensys/gnark-crypto v0.12.1 // indirect - github.com/crate-crypto/go-kzg-4844 v0.7.0 // indirect - github.com/deckarep/golang-set/v2 v2.1.0 // indirect + github.com/crate-crypto/go-ipa v0.0.0-20240223125850-b1e8a79f509c // indirect + github.com/crate-crypto/go-kzg-4844 v1.0.0 // indirect + github.com/deckarep/golang-set/v2 v2.6.0 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 // indirect - github.com/ethereum/c-kzg-4844 v0.4.0 // indirect + github.com/ethereum/c-kzg-4844 v1.0.0 // indirect + github.com/ethereum/go-verkle v0.1.1-0.20240306133620-7d920df305f0 // indirect github.com/getsentry/sentry-go v0.18.0 // indirect - github.com/go-ole/go-ole v1.2.6 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect github.com/go-stack/stack v1.8.1 // indirect github.com/gofrs/flock v0.8.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang-jwt/jwt/v4 v4.5.0 // indirect - github.com/golang/protobuf v1.5.3 // indirect + github.com/golang/protobuf v1.5.4 // indirect github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect github.com/google/go-cmp v0.6.0 // indirect github.com/gorilla/websocket v1.5.0 // indirect github.com/holiman/bloomfilter/v2 v2.0.3 // indirect - github.com/holiman/uint256 v1.2.3 // indirect + github.com/holiman/uint256 v1.2.4 // indirect github.com/klauspost/compress v1.15.15 // indirect github.com/kr/pretty v0.3.1 // indirect github.com/kr/text v0.2.0 // indirect github.com/lithammer/dedent v1.1.0 // indirect github.com/mattn/go-colorable v0.1.13 // indirect - github.com/mattn/go-isatty v0.0.17 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect github.com/mattn/go-runewidth v0.0.14 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect github.com/mmcloughlin/addchain v0.4.0 // indirect @@ -63,13 +65,11 @@ require ( github.com/tklauser/go-sysconf v0.3.12 // indirect github.com/tklauser/numcpus v0.6.1 // indirect github.com/yusufpapurcu/wmi v1.2.2 // indirect - golang.org/x/crypto v0.21.0 // indirect - golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect - golang.org/x/mod v0.12.0 // indirect - golang.org/x/sync v0.3.0 // indirect - golang.org/x/sys v0.18.0 // indirect + golang.org/x/crypto v0.22.0 // indirect + golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa // indirect + golang.org/x/sync v0.7.0 // indirect + golang.org/x/sys v0.20.0 // indirect golang.org/x/text v0.14.0 // indirect - golang.org/x/tools v0.13.0 // indirect google.golang.org/protobuf v1.33.0 // indirect gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1 // indirect rsc.io/tmplfunc v0.0.3 // indirect diff --git a/simulators/ethereum/graphql/go.sum b/simulators/ethereum/graphql/go.sum index c9579bb4c9..5bcd30a86d 100644 --- a/simulators/ethereum/graphql/go.sum +++ b/simulators/ethereum/graphql/go.sum @@ -1,256 +1,151 @@ -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/CloudyKit/fastprinter v0.0.0-20200109182630-33d98a066a53/go.mod h1:+3IMCy2vIlbG1XG/0ggNQv0SvxCAIpPM5b1nCz56Xno= -github.com/CloudyKit/jet/v3 v3.0.0/go.mod h1:HKQPgSJmdK8hdoAbKUUWajkHyHo4RaU5rMdUywE7VMo= github.com/DataDog/zstd v1.5.2 h1:vUG4lAyuPCXO0TLbXvPv7EB7cNK1QV/luu55UHLrrn8= github.com/DataDog/zstd v1.5.2/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= -github.com/Joker/hpp v1.0.0/go.mod h1:8x5n+M1Hp5hC0g8okX3sR3vFQwynaX/UgSOM9MeBKzY= -github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= -github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= -github.com/Shopify/goreferrer v0.0.0-20181106222321-ec9c9a553398/go.mod h1:a1uqRtAwp2Xwc6WNPJEufxJ7fx3npB4UV/JOLmbu5I0= -github.com/VictoriaMetrics/fastcache v1.12.1 h1:i0mICQuojGDL3KblA7wUNlY5lOK6a4bwt3uRKnkZU40= -github.com/VictoriaMetrics/fastcache v1.12.1/go.mod h1:tX04vaqcNoQeGLD+ra5pU5sWkuxnzWhEzLwhP9w653o= -github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/VictoriaMetrics/fastcache v1.12.2 h1:N0y9ASrJ0F6h0QaC3o6uJb3NIZ9VKLjCM7NQbSmF7WI= +github.com/VictoriaMetrics/fastcache v1.12.2/go.mod h1:AmC+Nzz1+3G2eCPapF6UcsnkThDcMsQicp4xDukwJYI= github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= github.com/allegro/bigcache v1.2.1 h1:hg1sY1raCwic3Vnsvje6TT7/pnZba83LeFck5NrFKSc= github.com/allegro/bigcache v1.2.1/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= -github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= -github.com/aymerick/raymond v2.0.3-0.20180322193309-b565731e1464+incompatible/go.mod h1:osfaiScAUVup+UC9Nfq76eWqDhXlp+4UYaA8uhTBO6g= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bits-and-blooms/bitset v1.7.0 h1:YjAGVd3XmtK9ktAbX8Zg2g2PwLIMjGREZJHlV4j7NEo= -github.com/bits-and-blooms/bitset v1.7.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= +github.com/bits-and-blooms/bitset v1.10.0 h1:ePXTeiPEazB5+opbv5fr8umg2R/1NlzgDsyepwsSr88= +github.com/bits-and-blooms/bitset v1.10.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U= github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cockroachdb/datadriven v1.0.2/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f h1:otljaYPt5hWxV3MUfO5dFPFiOXg9CyG5/kCfayTqsJ4= github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= -github.com/cockroachdb/errors v1.9.1 h1:yFVvsI0VxmRShfawbt/laCIDy/mtTqqnvoNgiy5bEV8= -github.com/cockroachdb/errors v1.9.1/go.mod h1:2sxOtL2WIc096WSZqZ5h8fa17rdDq9HZOZLBCor4mBk= -github.com/cockroachdb/logtags v0.0.0-20211118104740-dabe8e521a4f/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= +github.com/cockroachdb/errors v1.11.1 h1:xSEW75zKaKCWzR3OfxXUxgrk/NtT4G1MiOv5lWZazG8= +github.com/cockroachdb/errors v1.11.1/go.mod h1:8MUxA3Gi6b25tYlFEBGLf+D8aISL+M4MIpiWMSNRfxw= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= -github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593 h1:aPEJyR4rPBvDmeyi+l/FS/VtA00IWvjeFvjen1m1l1A= -github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593/go.mod h1:6hk1eMY/u5t+Cf18q5lFMUA1Rc+Sm5I6Ra1QuPyxXCo= -github.com/cockroachdb/redact v1.1.3 h1:AKZds10rFSIj7qADf0g46UixK8NNLwWTNdCIGS5wfSQ= -github.com/cockroachdb/redact v1.1.3/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= +github.com/cockroachdb/pebble v1.1.0 h1:pcFh8CdCIt2kmEpK0OIatq67Ln9uGDYY3d5XnE0LJG4= +github.com/cockroachdb/pebble v1.1.0/go.mod h1:sEHm5NOXxyiAoKWhoFxT8xMgd/f3RA6qUqQ1BXKrh2E= +github.com/cockroachdb/redact v1.1.5 h1:u1PMllDkdFfPWaNGMyLD1+so+aq3uUItthCFqzwPJ30= +github.com/cockroachdb/redact v1.1.5/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo= github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ= -github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0/go.mod h1:4Zcjuz89kmFXt9morQgcfYZAYZ5n8WHjt81YYWIwtTM= github.com/consensys/bavard v0.1.13 h1:oLhMLOFGTLdlda/kma4VOJazblc7IM5y5QPd2A/YjhQ= github.com/consensys/bavard v0.1.13/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI= github.com/consensys/gnark-crypto v0.12.1 h1:lHH39WuuFgVHONRl3J0LRBtuYdQTumFSDtJF7HpyG8M= github.com/consensys/gnark-crypto v0.12.1/go.mod h1:v2Gy7L/4ZRosZ7Ivs+9SfUDr0f5UlG+EM5t7MPHiLuY= -github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= -github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= -github.com/crate-crypto/go-kzg-4844 v0.7.0 h1:C0vgZRk4q4EZ/JgPfzuSoxdCq3C3mOZMBShovmncxvA= -github.com/crate-crypto/go-kzg-4844 v0.7.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= +github.com/crate-crypto/go-ipa v0.0.0-20240223125850-b1e8a79f509c h1:uQYC5Z1mdLRPrZhHjHxufI8+2UG/i25QG92j0Er9p6I= +github.com/crate-crypto/go-ipa v0.0.0-20240223125850-b1e8a79f509c/go.mod h1:geZJZH3SzKCqnz5VT0q/DyIG/tvu/dZk+VIfXicupJs= +github.com/crate-crypto/go-kzg-4844 v1.0.0 h1:TsSgHwrkTKecKJ4kadtHi4b3xHW5dCFUDFnUp1TsawI= +github.com/crate-crypto/go-kzg-4844 v1.0.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/deckarep/golang-set/v2 v2.1.0 h1:g47V4Or+DUdzbs8FxCCmgb6VYd+ptPAngjM6dtGktsI= -github.com/deckarep/golang-set/v2 v2.1.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= +github.com/deckarep/golang-set/v2 v2.6.0 h1:XfcQbWM1LlMB8BsJ8N9vW5ehnnPVIw0je80NsVHagjM= +github.com/deckarep/golang-set/v2 v2.6.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0= github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 h1:HbphB4TFFXpv7MNrT52FGrrgVXF1owhMVTHFZIlnvd4= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0/go.mod h1:DZGJHZMqrU4JJqFAWUS2UO1+lbSKsdiOoYi9Zzey7Fc= -github.com/dgraph-io/badger v1.6.0/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6psNgSztDR4= -github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385/go.mod h1:0vRUJqYpeSZifjYj7uP3BG/gKcuzL9xWVV/Y+cK33KM= -github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/etcd-io/bbolt v1.3.3/go.mod h1:ZF2nL25h33cCyBtcyWeZ2/I3HQOfTP+0PIEvHjkjCrw= -github.com/ethereum/c-kzg-4844 v0.4.0 h1:3MS1s4JtA868KpJxroZoepdV0ZKBp3u/O5HcZ7R3nlY= -github.com/ethereum/c-kzg-4844 v0.4.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= -github.com/ethereum/go-ethereum v1.13.5-0.20231031113925-bc42e88415d3 h1:i4TE0DmzMYcr2IiCdlTGGk+7Q/EzXvBKbbG4uRxMjJ0= -github.com/ethereum/go-ethereum v1.13.5-0.20231031113925-bc42e88415d3/go.mod h1:yMTu38GSuyxaYzQMViqNmQ1s3cE84abZexQmTgenWk0= -github.com/ethereum/hive v0.0.0-20240319152821-ae224371b4e5 h1:2Rc3v1mqWgUl8gSHFh7+FmVcyB1AI/9THxhEDjNK+PI= -github.com/ethereum/hive v0.0.0-20240319152821-ae224371b4e5/go.mod h1:MGwUXPGco6YS3brOf5WEILfUnnUL/XuX1224ab3D7XA= -github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072/go.mod h1:duJ4Jxv5lDcvg4QuQr0oowTf7dz4/CR8NtyCooz9HL8= -github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= +github.com/ethereum/c-kzg-4844 v1.0.0 h1:0X1LBXxaEtYD9xsyj9B9ctQEZIpnvVDeoBx8aHEwTNA= +github.com/ethereum/c-kzg-4844 v1.0.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= +github.com/ethereum/go-ethereum v1.14.5 h1:szuFzO1MhJmweXjoM5nSAeDvjNUH3vIQoMzzQnfvjpw= +github.com/ethereum/go-ethereum v1.14.5/go.mod h1:VEDGGhSxY7IEjn98hJRFXl/uFvpRgbIIf2PpXiyGGgc= +github.com/ethereum/go-verkle v0.1.1-0.20240306133620-7d920df305f0 h1:KrE8I4reeVvf7C1tm8elRjj4BdscTYzz/WAbYyf/JI4= +github.com/ethereum/go-verkle v0.1.1-0.20240306133620-7d920df305f0/go.mod h1:D9AJLVXSyZQXJQVk8oh1EwjISE+sJTn2duYIZC0dy3w= +github.com/ethereum/hive v0.0.0-20240610172825-2430a68c753a h1:iyHHRPXaxHtEvyFxc4A+is/JRt88o0gQhHrNx+khEqQ= +github.com/ethereum/hive v0.0.0-20240610172825-2430a68c753a/go.mod h1:ghNXZW+/WQClcyiwZpbTzUCyxwql7YeMacYd44v+BJE= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= -github.com/gavv/httpexpect v2.0.0+incompatible/go.mod h1:x+9tiU1YnrOvnB725RkpoLv1M62hOWzwo5OXotisrKc= -github.com/getsentry/sentry-go v0.12.0/go.mod h1:NSap0JBYWzHND8oMbyi0+XZhUalc1TBdRL1M71JZW2c= github.com/getsentry/sentry-go v0.18.0 h1:MtBW5H9QgdcJabtZcuJG80BMOwaBpkRDZkxRkNC1sN0= github.com/getsentry/sentry-go v0.18.0/go.mod h1:Kgon4Mby+FJ7ZWHFUAZgVaIa8sxHtnRJRLTXZr51aKQ= -github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3/go.mod h1:VJ0WA2NBN22VlZ2dKZQPAPnyWw5XTlK1KymzLKsr59s= -github.com/gin-gonic/gin v1.4.0/go.mod h1:OW2EZn3DO8Ln9oIKOvM++LBO+5UPHJJDH72/q/3rZdM= -github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= -github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= -github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab/go.mod h1:/P9AEU963A2AYjv4d1V5eVL1CQbEJq6aCNHDDjibzu8= -github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= github.com/go-stack/stack v1.8.1 h1:ntEHSVwIt7PNXNpgPmVfMrNhLtgjlmnZha2kOpuRiDw= github.com/go-stack/stack v1.8.1/go.mod h1:dcoOX6HbPZSZptuspn9bctJ+N/CnF5gGygcUP3XYfe4= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= -github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= -github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= -github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= -github.com/gogo/googleapis v0.0.0-20180223154316-0cd9801be74a/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= -github.com/gogo/googleapis v1.4.1/go.mod h1:2lpHqI5OcWCtVElxXnPt+s8oJvMpySlOyM6xDCrzib4= -github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/gogo/status v1.1.0/go.mod h1:BFv9nrluPLmrS0EmGVvLaPNmRosr9KapBYd5/hpY1WM= -github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= -github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXiurYmW7fx4GZkL8feAMVq7nEjURHk= github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/gomodule/redigo v1.7.1-0.20190724094224-574c33c3df38/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= -github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao= github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA= -github.com/holiman/uint256 v1.2.3 h1:K8UWO1HUJpRMXBxbmaY1Y8IAMZC/RsKB+ArEnnK4l5o= -github.com/holiman/uint256 v1.2.3/go.mod h1:SC8Ryt4n+UBbPbIBKaG9zbbDlp4jOru9xFZmPzLUTxw= +github.com/holiman/uint256 v1.2.4 h1:jUc4Nk8fm9jZabQuqr2JzednajVmBpC+oiTiXZJEApU= +github.com/holiman/uint256 v1.2.4/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXeiRV4ng7E= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/hydrogen18/memlistener v0.0.0-20200120041712-dcc25e7acd91/go.mod h1:qEIFzExnS6016fRpRfxrExeVn2gbClQA99gQhnIcdhE= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/imkira/go-interpol v1.1.0/go.mod h1:z0h2/2T3XF8kyEPpRgJ3kmNv+C43p+I/CoI+jC3w2iA= -github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/iris-contrib/blackfriday v2.0.0+incompatible/go.mod h1:UzZ2bDEoaSGPbkg6SAB4att1aAwTmVIx/5gCVqeyUdI= -github.com/iris-contrib/go.uuid v2.0.0+incompatible/go.mod h1:iz2lgM/1UnEf1kP0L/+fafWORmlnuysV2EMP8MW+qe0= -github.com/iris-contrib/jade v1.1.3/go.mod h1:H/geBymxJhShH5kecoiOCSssPX7QWYH7UaeZTSWddIk= -github.com/iris-contrib/pongo2 v0.0.1/go.mod h1:Ssh+00+3GAZqSQb30AvBRNxBx7rf0GqwkjqxNd0u65g= -github.com/iris-contrib/schema v0.0.1/go.mod h1:urYA3uvUNG1TIIjOSCzHr9/LmbQo8LrOcOqfqxa4hXw= -github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= -github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88/go.mod h1:3w7q1U84EfirKl04SVQ/s7nPm1ZPhiXd34z40TNz36k= -github.com/kataras/golog v0.0.10/go.mod h1:yJ8YKCmyL+nWjERB90Qwn+bdyBZsaQwU3bTVFgkFIp8= -github.com/kataras/iris/v12 v12.1.8/go.mod h1:LMYy4VlP67TQ3Zgriz8RE2h2kMZV2SgMYbq3UhfoFmE= -github.com/kataras/neffos v0.0.14/go.mod h1:8lqADm8PnbeFfL7CLXh1WHw53dG27MC3pgi2R1rmoTE= -github.com/kataras/pio v0.0.2/go.mod h1:hAoW0t9UmXi4R5Oyq5Z4irTbaTsOemSrDGUtaTl7Dro= -github.com/kataras/sitemap v0.0.5/go.mod h1:KY2eugMKiPwsJgx7+U103YZehfvNGOXURubcGyk0Bz8= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.8.2/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= -github.com/klauspost/compress v1.9.7/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= github.com/klauspost/compress v1.15.15 h1:EF27CXIuDsYJ6mmvtBRlEuB2UVOqHG1tAXgZ7yIO+lw= github.com/klauspost/compress v1.15.15/go.mod h1:ZcK2JAFqKOpnBlxcLsJzYfrS9X1akm9fHZNnD9+Vo/4= -github.com/klauspost/cpuid v1.2.1/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/labstack/echo/v4 v4.5.0/go.mod h1:czIriw4a0C1dFun+ObrXp7ok03xON0N1awStJ6ArI7Y= -github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c= github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= github.com/lithammer/dedent v1.1.0 h1:VNzHMVCBNG1j0fh3OrsFRkVUwStdDArbgBWoPAffktY= github.com/lithammer/dedent v1.1.0/go.mod h1:jrXYCQtgg0nJiN+StA2KgR7w6CiQNv9Fd/Z9BP0jIOc= -github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.11/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= -github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= -github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng= -github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.14 h1:+xnbZSEeDbOIg5/mE6JF0w6n9duR1l3/WmbinWVwUuU= github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= -github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw= github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= -github.com/mediocregopher/radix/v3 v3.4.2/go.mod h1:8FL3F6UQRXHXIBSPUs5h0RybMF8i4n7wVopoX3x7Bv8= -github.com/microcosm-cc/bluemonday v1.0.2/go.mod h1:iVP4YcDBq+n/5fb23BhYFvIMq/leAFZyRl6bYmGDlGc= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mmcloughlin/addchain v0.4.0 h1:SobOdjm2xLj1KkXN5/n0xTIWyZA2+s99UCY1iPfkHRY= github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqkyU72HC5wJ4RlU= github.com/mmcloughlin/profile v0.1.1/go.mod h1:IhHD7q1ooxgwTgjxQYkACGA77oFTDdFVejUS1/tS/qU= -github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/moul/http2curl v1.0.0/go.mod h1:8UbvGypXm98wA/IqH45anm5Y2Z6ep6O31QGOAZ3H0fQ= -github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= -github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= -github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= -github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= @@ -261,18 +156,15 @@ github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1y github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= github.com/onsi/gomega v1.19.0 h1:4ieX6qQjPP/BfC3mpsAtIGGlxTWPeA3Inl/7DtXw1tw= github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= -github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_golang v1.14.0 h1:nJdhIvne2eSX/XRAFV9PcvFFRbrjbcTUj0VP62TMhnw= github.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4= github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= github.com/prometheus/common v0.39.0 h1:oOyhkDq05hPZKItWVBkJ6g6AtGxi+fy7F4JvUV8uhsI= @@ -282,31 +174,13 @@ github.com/prometheus/procfs v0.9.0/go.mod h1:+pB4zwohETzFnmlpe6yd2lSc+0/46IYZRB github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.3 h1:utMvzDsuh3suAEnhH0RdHmoPbU648o6CvXxTx4SBMOw= github.com/rivo/uniseg v0.4.3/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= -github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= -github.com/rogpeppe/go-internal v1.8.1/go.mod h1:JeRgkft04UBgHMgCIwADu4Pn6Mtm5d4nPKWu0nJ5d+o= github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= -github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= -github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/schollz/closestmatch v2.1.0+incompatible/go.mod h1:RtP1ddjLong6gTkbtmuhtR2uUrrJOpYzYRvbcPAid+g= -github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI= github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= -github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= -github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= -github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= @@ -318,194 +192,96 @@ github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFA github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= -github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= -github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= -github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= -github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= -github.com/urfave/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4= -github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= -github.com/valyala/fasthttp v1.6.0/go.mod h1:FstJa9V+Pj9vQ7OJie2qMHdwemEDaDiSdBnvPM1Su9w= -github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= -github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= -github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio= -github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= -github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= -github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= -github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= -github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0/go.mod h1:/LWChgwKmvncFJFHJ7Gvn9wZArjbV5/FppcK2fKk/tI= -github.com/yudai/gojsondiff v1.0.0/go.mod h1:AY32+k2cwILAkW1fbgxQ5mUmMiZFgLIV+FBNExI05xg= -github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82/go.mod h1:lgjkn3NuSvDfVJdfcVVdX+jpBxNmX4rDAzaS45IcYoM= -github.com/yudai/pp v2.0.1+incompatible/go.mod h1:PuxR/8QJ7cyCkFp/aUDS+JY727OFEZkTdatxwunjIkc= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yusufpapurcu/wmi v1.2.2 h1:KBNDSne4vP5mbSWnJbO+51IMOXJB67QiYCSBrubbPRg= github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= -golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191227163750-53104e6ec876/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= -golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g= -golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30= +golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M= +golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa h1:FRnLl4eNAQl8hwxVVC17teOw8kdjVDVAiFMtgUdTSRQ= +golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa/go.mod h1:zk2irFbV9DP96SEBUUAy67IdHUaZuSnrz1n472HUCLE= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc= -golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190327091125-710a502c58a2/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= -golang.org/x/net v0.0.0-20211008194852-3b03d305991f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4= -golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/net v0.24.0 h1:1PcaxkF854Fu3+lvBIx5SYn9wRlBzzcnHZSiaFFAb0w= +golang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= -golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= +golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= -golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= +golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181221001348-537d06c36207/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190327201419-c70d86f8b7cf/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.13.0 h1:Iey4qkscZuv0VvIt8E0neZjtPVQFSc870HQ448QgEmQ= -golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/genproto v0.0.0-20180518175338-11a468237815/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= -google.golang.org/grpc v1.12.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= -gopkg.in/go-playground/validator.v8 v8.18.2/go.mod h1:RX2a/7Ha8BgOhfk7j780h4/u/RRjR0eouCJSH80/M2Y= gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1 h1:iiHuQZCNgYPmFQxd3BBN/Nc5+dAwzZuq5y40s20oQw0= gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= -gopkg.in/ini.v1 v1.51.1/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= @@ -513,12 +289,7 @@ gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= -gopkg.in/yaml.v3 v3.0.0-20191120175047-4206685974f2/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= rsc.io/tmplfunc v0.0.3 h1:53XFQh69AfOa8Tw0Jm7t+GV7KZhOi6jzsCzTtKbMvzU= rsc.io/tmplfunc v0.0.3/go.mod h1:AG3sTPzElb1Io3Yg4voV9AGZJuleGAwaVRxL9M49PhA= From eb5853ad57fc249f589635ba8384ef3808994aa8 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Mon, 10 Jun 2024 20:23:10 +0200 Subject: [PATCH 292/387] simulators/ethereum/sync: upgrade hivesim --- simulators/ethereum/sync/go.mod | 43 ++-- simulators/ethereum/sync/go.sum | 349 +++++--------------------------- 2 files changed, 77 insertions(+), 315 deletions(-) diff --git a/simulators/ethereum/sync/go.mod b/simulators/ethereum/sync/go.mod index db85a6f772..3aca3de882 100644 --- a/simulators/ethereum/sync/go.mod +++ b/simulators/ethereum/sync/go.mod @@ -5,46 +5,47 @@ go 1.21 toolchain go1.22.1 require ( - github.com/ethereum/go-ethereum v1.13.5-0.20231031113925-bc42e88415d3 - github.com/ethereum/hive v0.0.0-20240319152821-ae224371b4e5 + github.com/ethereum/go-ethereum v1.14.5 + github.com/ethereum/hive v0.0.0-20240610172825-2430a68c753a ) require ( github.com/DataDog/zstd v1.5.2 // indirect - github.com/Microsoft/go-winio v0.6.1 // indirect - github.com/VictoriaMetrics/fastcache v1.12.1 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect github.com/beorn7/perks v1.0.1 // indirect - github.com/bits-and-blooms/bitset v1.7.0 // indirect + github.com/bits-and-blooms/bitset v1.10.0 // indirect github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect - github.com/cespare/xxhash/v2 v2.2.0 // indirect - github.com/cockroachdb/errors v1.9.1 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/cockroachdb/errors v1.11.1 // indirect github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect - github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593 // indirect - github.com/cockroachdb/redact v1.1.3 // indirect + github.com/cockroachdb/pebble v1.1.0 // indirect + github.com/cockroachdb/redact v1.1.5 // indirect github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect github.com/consensys/bavard v0.1.13 // indirect github.com/consensys/gnark-crypto v0.12.1 // indirect - github.com/crate-crypto/go-kzg-4844 v0.7.0 // indirect - github.com/deckarep/golang-set/v2 v2.1.0 // indirect + github.com/crate-crypto/go-ipa v0.0.0-20240223125850-b1e8a79f509c // indirect + github.com/crate-crypto/go-kzg-4844 v1.0.0 // indirect + github.com/deckarep/golang-set/v2 v2.6.0 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 // indirect - github.com/ethereum/c-kzg-4844 v0.4.0 // indirect + github.com/ethereum/c-kzg-4844 v1.0.0 // indirect + github.com/ethereum/go-verkle v0.1.1-0.20240306133620-7d920df305f0 // indirect github.com/getsentry/sentry-go v0.18.0 // indirect - github.com/go-ole/go-ole v1.2.6 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect github.com/go-stack/stack v1.8.1 // indirect github.com/gofrs/flock v0.8.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang-jwt/jwt/v4 v4.5.0 // indirect - github.com/golang/protobuf v1.5.3 // indirect + github.com/golang/protobuf v1.5.4 // indirect github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect github.com/google/go-cmp v0.6.0 // indirect github.com/gorilla/websocket v1.5.0 // indirect - github.com/holiman/uint256 v1.2.3 // indirect + github.com/holiman/uint256 v1.2.4 // indirect github.com/klauspost/compress v1.15.15 // indirect github.com/kr/pretty v0.3.1 // indirect github.com/kr/text v0.2.0 // indirect github.com/lithammer/dedent v1.1.0 // indirect github.com/mattn/go-colorable v0.1.13 // indirect - github.com/mattn/go-isatty v0.0.17 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect github.com/mattn/go-runewidth v0.0.14 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect github.com/mmcloughlin/addchain v0.4.0 // indirect @@ -62,13 +63,11 @@ require ( github.com/tklauser/go-sysconf v0.3.12 // indirect github.com/tklauser/numcpus v0.6.1 // indirect github.com/yusufpapurcu/wmi v1.2.2 // indirect - golang.org/x/crypto v0.21.0 // indirect - golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect - golang.org/x/mod v0.12.0 // indirect - golang.org/x/sync v0.3.0 // indirect - golang.org/x/sys v0.18.0 // indirect + golang.org/x/crypto v0.22.0 // indirect + golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa // indirect + golang.org/x/sync v0.7.0 // indirect + golang.org/x/sys v0.20.0 // indirect golang.org/x/text v0.14.0 // indirect - golang.org/x/tools v0.13.0 // indirect google.golang.org/protobuf v1.33.0 // indirect gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1 // indirect rsc.io/tmplfunc v0.0.3 // indirect diff --git a/simulators/ethereum/sync/go.sum b/simulators/ethereum/sync/go.sum index fa7c31f001..11d6911a21 100644 --- a/simulators/ethereum/sync/go.sum +++ b/simulators/ethereum/sync/go.sum @@ -1,254 +1,154 @@ -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/CloudyKit/fastprinter v0.0.0-20200109182630-33d98a066a53/go.mod h1:+3IMCy2vIlbG1XG/0ggNQv0SvxCAIpPM5b1nCz56Xno= -github.com/CloudyKit/jet/v3 v3.0.0/go.mod h1:HKQPgSJmdK8hdoAbKUUWajkHyHo4RaU5rMdUywE7VMo= github.com/DataDog/zstd v1.5.2 h1:vUG4lAyuPCXO0TLbXvPv7EB7cNK1QV/luu55UHLrrn8= github.com/DataDog/zstd v1.5.2/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= -github.com/Joker/hpp v1.0.0/go.mod h1:8x5n+M1Hp5hC0g8okX3sR3vFQwynaX/UgSOM9MeBKzY= -github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= -github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= -github.com/Shopify/goreferrer v0.0.0-20181106222321-ec9c9a553398/go.mod h1:a1uqRtAwp2Xwc6WNPJEufxJ7fx3npB4UV/JOLmbu5I0= -github.com/VictoriaMetrics/fastcache v1.12.1 h1:i0mICQuojGDL3KblA7wUNlY5lOK6a4bwt3uRKnkZU40= -github.com/VictoriaMetrics/fastcache v1.12.1/go.mod h1:tX04vaqcNoQeGLD+ra5pU5sWkuxnzWhEzLwhP9w653o= -github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY= -github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= -github.com/allegro/bigcache v1.2.1 h1:hg1sY1raCwic3Vnsvje6TT7/pnZba83LeFck5NrFKSc= -github.com/allegro/bigcache v1.2.1/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= -github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= -github.com/aymerick/raymond v2.0.3-0.20180322193309-b565731e1464+incompatible/go.mod h1:osfaiScAUVup+UC9Nfq76eWqDhXlp+4UYaA8uhTBO6g= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/VictoriaMetrics/fastcache v1.12.2 h1:N0y9ASrJ0F6h0QaC3o6uJb3NIZ9VKLjCM7NQbSmF7WI= +github.com/VictoriaMetrics/fastcache v1.12.2/go.mod h1:AmC+Nzz1+3G2eCPapF6UcsnkThDcMsQicp4xDukwJYI= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bits-and-blooms/bitset v1.7.0 h1:YjAGVd3XmtK9ktAbX8Zg2g2PwLIMjGREZJHlV4j7NEo= -github.com/bits-and-blooms/bitset v1.7.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= +github.com/bits-and-blooms/bitset v1.10.0 h1:ePXTeiPEazB5+opbv5fr8umg2R/1NlzgDsyepwsSr88= +github.com/bits-and-blooms/bitset v1.10.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U= github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= -github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cockroachdb/datadriven v1.0.2/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f h1:otljaYPt5hWxV3MUfO5dFPFiOXg9CyG5/kCfayTqsJ4= github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= -github.com/cockroachdb/errors v1.9.1 h1:yFVvsI0VxmRShfawbt/laCIDy/mtTqqnvoNgiy5bEV8= -github.com/cockroachdb/errors v1.9.1/go.mod h1:2sxOtL2WIc096WSZqZ5h8fa17rdDq9HZOZLBCor4mBk= -github.com/cockroachdb/logtags v0.0.0-20211118104740-dabe8e521a4f/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= +github.com/cockroachdb/errors v1.11.1 h1:xSEW75zKaKCWzR3OfxXUxgrk/NtT4G1MiOv5lWZazG8= +github.com/cockroachdb/errors v1.11.1/go.mod h1:8MUxA3Gi6b25tYlFEBGLf+D8aISL+M4MIpiWMSNRfxw= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= -github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593 h1:aPEJyR4rPBvDmeyi+l/FS/VtA00IWvjeFvjen1m1l1A= -github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593/go.mod h1:6hk1eMY/u5t+Cf18q5lFMUA1Rc+Sm5I6Ra1QuPyxXCo= -github.com/cockroachdb/redact v1.1.3 h1:AKZds10rFSIj7qADf0g46UixK8NNLwWTNdCIGS5wfSQ= -github.com/cockroachdb/redact v1.1.3/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= +github.com/cockroachdb/pebble v1.1.0 h1:pcFh8CdCIt2kmEpK0OIatq67Ln9uGDYY3d5XnE0LJG4= +github.com/cockroachdb/pebble v1.1.0/go.mod h1:sEHm5NOXxyiAoKWhoFxT8xMgd/f3RA6qUqQ1BXKrh2E= +github.com/cockroachdb/redact v1.1.5 h1:u1PMllDkdFfPWaNGMyLD1+so+aq3uUItthCFqzwPJ30= +github.com/cockroachdb/redact v1.1.5/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo= github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ= -github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0/go.mod h1:4Zcjuz89kmFXt9morQgcfYZAYZ5n8WHjt81YYWIwtTM= github.com/consensys/bavard v0.1.13 h1:oLhMLOFGTLdlda/kma4VOJazblc7IM5y5QPd2A/YjhQ= github.com/consensys/bavard v0.1.13/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI= github.com/consensys/gnark-crypto v0.12.1 h1:lHH39WuuFgVHONRl3J0LRBtuYdQTumFSDtJF7HpyG8M= github.com/consensys/gnark-crypto v0.12.1/go.mod h1:v2Gy7L/4ZRosZ7Ivs+9SfUDr0f5UlG+EM5t7MPHiLuY= -github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= -github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/cpuguy83/go-md2man v1.0.10 h1:BSKMNlYxDvnunlTymqtgONjNnaRV1sTpcovwwjF22jk= -github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/crate-crypto/go-kzg-4844 v0.7.0 h1:C0vgZRk4q4EZ/JgPfzuSoxdCq3C3mOZMBShovmncxvA= -github.com/crate-crypto/go-kzg-4844 v0.7.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= +github.com/crate-crypto/go-ipa v0.0.0-20240223125850-b1e8a79f509c h1:uQYC5Z1mdLRPrZhHjHxufI8+2UG/i25QG92j0Er9p6I= +github.com/crate-crypto/go-ipa v0.0.0-20240223125850-b1e8a79f509c/go.mod h1:geZJZH3SzKCqnz5VT0q/DyIG/tvu/dZk+VIfXicupJs= +github.com/crate-crypto/go-kzg-4844 v1.0.0 h1:TsSgHwrkTKecKJ4kadtHi4b3xHW5dCFUDFnUp1TsawI= +github.com/crate-crypto/go-kzg-4844 v1.0.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/deckarep/golang-set/v2 v2.1.0 h1:g47V4Or+DUdzbs8FxCCmgb6VYd+ptPAngjM6dtGktsI= -github.com/deckarep/golang-set/v2 v2.1.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= +github.com/deckarep/golang-set/v2 v2.6.0 h1:XfcQbWM1LlMB8BsJ8N9vW5ehnnPVIw0je80NsVHagjM= +github.com/deckarep/golang-set/v2 v2.6.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0= github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 h1:HbphB4TFFXpv7MNrT52FGrrgVXF1owhMVTHFZIlnvd4= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0/go.mod h1:DZGJHZMqrU4JJqFAWUS2UO1+lbSKsdiOoYi9Zzey7Fc= -github.com/dgraph-io/badger v1.6.0/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6psNgSztDR4= -github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385/go.mod h1:0vRUJqYpeSZifjYj7uP3BG/gKcuzL9xWVV/Y+cK33KM= -github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/etcd-io/bbolt v1.3.3/go.mod h1:ZF2nL25h33cCyBtcyWeZ2/I3HQOfTP+0PIEvHjkjCrw= -github.com/ethereum/c-kzg-4844 v0.4.0 h1:3MS1s4JtA868KpJxroZoepdV0ZKBp3u/O5HcZ7R3nlY= -github.com/ethereum/c-kzg-4844 v0.4.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= -github.com/ethereum/go-ethereum v1.13.5-0.20231031113925-bc42e88415d3 h1:i4TE0DmzMYcr2IiCdlTGGk+7Q/EzXvBKbbG4uRxMjJ0= -github.com/ethereum/go-ethereum v1.13.5-0.20231031113925-bc42e88415d3/go.mod h1:yMTu38GSuyxaYzQMViqNmQ1s3cE84abZexQmTgenWk0= -github.com/ethereum/hive v0.0.0-20240319152821-ae224371b4e5 h1:2Rc3v1mqWgUl8gSHFh7+FmVcyB1AI/9THxhEDjNK+PI= -github.com/ethereum/hive v0.0.0-20240319152821-ae224371b4e5/go.mod h1:MGwUXPGco6YS3brOf5WEILfUnnUL/XuX1224ab3D7XA= -github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072/go.mod h1:duJ4Jxv5lDcvg4QuQr0oowTf7dz4/CR8NtyCooz9HL8= -github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= -github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5 h1:FtmdgXiUlNeRsoNMFlKLDt+S+6hbjVMEW6RGQ7aUf7c= -github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= +github.com/ethereum/c-kzg-4844 v1.0.0 h1:0X1LBXxaEtYD9xsyj9B9ctQEZIpnvVDeoBx8aHEwTNA= +github.com/ethereum/c-kzg-4844 v1.0.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= +github.com/ethereum/go-ethereum v1.14.5 h1:szuFzO1MhJmweXjoM5nSAeDvjNUH3vIQoMzzQnfvjpw= +github.com/ethereum/go-ethereum v1.14.5/go.mod h1:VEDGGhSxY7IEjn98hJRFXl/uFvpRgbIIf2PpXiyGGgc= +github.com/ethereum/go-verkle v0.1.1-0.20240306133620-7d920df305f0 h1:KrE8I4reeVvf7C1tm8elRjj4BdscTYzz/WAbYyf/JI4= +github.com/ethereum/go-verkle v0.1.1-0.20240306133620-7d920df305f0/go.mod h1:D9AJLVXSyZQXJQVk8oh1EwjISE+sJTn2duYIZC0dy3w= +github.com/ethereum/hive v0.0.0-20240610172825-2430a68c753a h1:iyHHRPXaxHtEvyFxc4A+is/JRt88o0gQhHrNx+khEqQ= +github.com/ethereum/hive v0.0.0-20240610172825-2430a68c753a/go.mod h1:ghNXZW+/WQClcyiwZpbTzUCyxwql7YeMacYd44v+BJE= +github.com/fjl/memsize v0.0.2 h1:27txuSD9or+NZlnOWdKUxeBzTAUkWCVh+4Gf2dWFOzA= +github.com/fjl/memsize v0.0.2/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= -github.com/gavv/httpexpect v2.0.0+incompatible/go.mod h1:x+9tiU1YnrOvnB725RkpoLv1M62hOWzwo5OXotisrKc= github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff h1:tY80oXqGNY4FhTFhk+o9oFHGINQ/+vhlm8HFzi6znCI= github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= -github.com/getsentry/sentry-go v0.12.0/go.mod h1:NSap0JBYWzHND8oMbyi0+XZhUalc1TBdRL1M71JZW2c= github.com/getsentry/sentry-go v0.18.0 h1:MtBW5H9QgdcJabtZcuJG80BMOwaBpkRDZkxRkNC1sN0= github.com/getsentry/sentry-go v0.18.0/go.mod h1:Kgon4Mby+FJ7ZWHFUAZgVaIa8sxHtnRJRLTXZr51aKQ= -github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3/go.mod h1:VJ0WA2NBN22VlZ2dKZQPAPnyWw5XTlK1KymzLKsr59s= -github.com/gin-gonic/gin v1.4.0/go.mod h1:OW2EZn3DO8Ln9oIKOvM++LBO+5UPHJJDH72/q/3rZdM= -github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= -github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= -github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab/go.mod h1:/P9AEU963A2AYjv4d1V5eVL1CQbEJq6aCNHDDjibzu8= -github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= github.com/go-stack/stack v1.8.1 h1:ntEHSVwIt7PNXNpgPmVfMrNhLtgjlmnZha2kOpuRiDw= github.com/go-stack/stack v1.8.1/go.mod h1:dcoOX6HbPZSZptuspn9bctJ+N/CnF5gGygcUP3XYfe4= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= -github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= -github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= -github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= -github.com/gogo/googleapis v0.0.0-20180223154316-0cd9801be74a/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= -github.com/gogo/googleapis v1.4.1/go.mod h1:2lpHqI5OcWCtVElxXnPt+s8oJvMpySlOyM6xDCrzib4= -github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/gogo/status v1.1.0/go.mod h1:BFv9nrluPLmrS0EmGVvLaPNmRosr9KapBYd5/hpY1WM= -github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= -github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXiurYmW7fx4GZkL8feAMVq7nEjURHk= github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/gomodule/redigo v1.7.1-0.20190724094224-574c33c3df38/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= -github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/hashicorp/go-bexpr v0.1.10 h1:9kuI5PFotCboP3dkDYFr/wi0gg0QVbSNz5oFRpxn4uE= github.com/hashicorp/go-bexpr v0.1.10/go.mod h1:oxlubA2vC/gFVfX1A6JGp7ls7uCDlfJn732ehYYg+g0= -github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/holiman/billy v0.0.0-20230718173358-1c7e68d277a7 h1:3JQNjnMRil1yD0IfZKHF9GxxWKDJGj8I0IqOUol//sw= -github.com/holiman/billy v0.0.0-20230718173358-1c7e68d277a7/go.mod h1:5GuXa7vkL8u9FkFuWdVvfR5ix8hRB7DbOAaYULamFpc= +github.com/holiman/billy v0.0.0-20240216141850-2abb0c79d3c4 h1:X4egAf/gcS1zATw6wn4Ej8vjuVGxeHdan+bRb2ebyv4= +github.com/holiman/billy v0.0.0-20240216141850-2abb0c79d3c4/go.mod h1:5GuXa7vkL8u9FkFuWdVvfR5ix8hRB7DbOAaYULamFpc= github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao= github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA= -github.com/holiman/uint256 v1.2.3 h1:K8UWO1HUJpRMXBxbmaY1Y8IAMZC/RsKB+ArEnnK4l5o= -github.com/holiman/uint256 v1.2.3/go.mod h1:SC8Ryt4n+UBbPbIBKaG9zbbDlp4jOru9xFZmPzLUTxw= +github.com/holiman/uint256 v1.2.4 h1:jUc4Nk8fm9jZabQuqr2JzednajVmBpC+oiTiXZJEApU= +github.com/holiman/uint256 v1.2.4/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXeiRV4ng7E= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/huin/goupnp v1.3.0 h1:UvLUlWDNpoUdYzb2TCn+MuTWtcjXKSza2n6CBdQ0xXc= github.com/huin/goupnp v1.3.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8= -github.com/hydrogen18/memlistener v0.0.0-20200120041712-dcc25e7acd91/go.mod h1:qEIFzExnS6016fRpRfxrExeVn2gbClQA99gQhnIcdhE= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/imkira/go-interpol v1.1.0/go.mod h1:z0h2/2T3XF8kyEPpRgJ3kmNv+C43p+I/CoI+jC3w2iA= -github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/iris-contrib/blackfriday v2.0.0+incompatible/go.mod h1:UzZ2bDEoaSGPbkg6SAB4att1aAwTmVIx/5gCVqeyUdI= -github.com/iris-contrib/go.uuid v2.0.0+incompatible/go.mod h1:iz2lgM/1UnEf1kP0L/+fafWORmlnuysV2EMP8MW+qe0= -github.com/iris-contrib/jade v1.1.3/go.mod h1:H/geBymxJhShH5kecoiOCSssPX7QWYH7UaeZTSWddIk= -github.com/iris-contrib/pongo2 v0.0.1/go.mod h1:Ssh+00+3GAZqSQb30AvBRNxBx7rf0GqwkjqxNd0u65g= -github.com/iris-contrib/schema v0.0.1/go.mod h1:urYA3uvUNG1TIIjOSCzHr9/LmbQo8LrOcOqfqxa4hXw= github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= -github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= -github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88/go.mod h1:3w7q1U84EfirKl04SVQ/s7nPm1ZPhiXd34z40TNz36k= -github.com/kataras/golog v0.0.10/go.mod h1:yJ8YKCmyL+nWjERB90Qwn+bdyBZsaQwU3bTVFgkFIp8= -github.com/kataras/iris/v12 v12.1.8/go.mod h1:LMYy4VlP67TQ3Zgriz8RE2h2kMZV2SgMYbq3UhfoFmE= -github.com/kataras/neffos v0.0.14/go.mod h1:8lqADm8PnbeFfL7CLXh1WHw53dG27MC3pgi2R1rmoTE= -github.com/kataras/pio v0.0.2/go.mod h1:hAoW0t9UmXi4R5Oyq5Z4irTbaTsOemSrDGUtaTl7Dro= -github.com/kataras/sitemap v0.0.5/go.mod h1:KY2eugMKiPwsJgx7+U103YZehfvNGOXURubcGyk0Bz8= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.8.2/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= -github.com/klauspost/compress v1.9.7/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= github.com/klauspost/compress v1.15.15 h1:EF27CXIuDsYJ6mmvtBRlEuB2UVOqHG1tAXgZ7yIO+lw= github.com/klauspost/compress v1.15.15/go.mod h1:ZcK2JAFqKOpnBlxcLsJzYfrS9X1akm9fHZNnD9+Vo/4= -github.com/klauspost/cpuid v1.2.1/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/labstack/echo/v4 v4.5.0/go.mod h1:czIriw4a0C1dFun+ObrXp7ok03xON0N1awStJ6ArI7Y= -github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c= github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= github.com/lithammer/dedent v1.1.0 h1:VNzHMVCBNG1j0fh3OrsFRkVUwStdDArbgBWoPAffktY= github.com/lithammer/dedent v1.1.0/go.mod h1:jrXYCQtgg0nJiN+StA2KgR7w6CiQNv9Fd/Z9BP0jIOc= -github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.11/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= -github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= -github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng= -github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.14 h1:+xnbZSEeDbOIg5/mE6JF0w6n9duR1l3/WmbinWVwUuU= github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= -github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw= github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= -github.com/mediocregopher/radix/v3 v3.4.2/go.mod h1:8FL3F6UQRXHXIBSPUs5h0RybMF8i4n7wVopoX3x7Bv8= -github.com/microcosm-cc/bluemonday v1.0.2/go.mod h1:iVP4YcDBq+n/5fb23BhYFvIMq/leAFZyRl6bYmGDlGc= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.4.1 h1:CpVNEelQCZBooIPDn+AR3NpivK/TIKU8bDxdASFVQag= github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/pointerstructure v1.2.0 h1:O+i9nHnXS3l/9Wu7r4NrEdwA2VFTicjUEN1uBnDo34A= @@ -256,22 +156,12 @@ github.com/mitchellh/pointerstructure v1.2.0/go.mod h1:BRAsLI5zgXmw97Lf6s25bs8oh github.com/mmcloughlin/addchain v0.4.0 h1:SobOdjm2xLj1KkXN5/n0xTIWyZA2+s99UCY1iPfkHRY= github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqkyU72HC5wJ4RlU= github.com/mmcloughlin/profile v0.1.1/go.mod h1:IhHD7q1ooxgwTgjxQYkACGA77oFTDdFVejUS1/tS/qU= -github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/moul/http2curl v1.0.0/go.mod h1:8UbvGypXm98wA/IqH45anm5Y2Z6ep6O31QGOAZ3H0fQ= -github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= -github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= -github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= -github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= @@ -282,18 +172,15 @@ github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1y github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= github.com/onsi/gomega v1.19.0 h1:4ieX6qQjPP/BfC3mpsAtIGGlxTWPeA3Inl/7DtXw1tw= github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= -github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_golang v1.14.0 h1:nJdhIvne2eSX/XRAFV9PcvFFRbrjbcTUj0VP62TMhnw= github.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4= github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= github.com/prometheus/common v0.39.0 h1:oOyhkDq05hPZKItWVBkJ6g6AtGxi+fy7F4JvUV8uhsI= @@ -303,38 +190,18 @@ github.com/prometheus/procfs v0.9.0/go.mod h1:+pB4zwohETzFnmlpe6yd2lSc+0/46IYZRB github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.3 h1:utMvzDsuh3suAEnhH0RdHmoPbU648o6CvXxTx4SBMOw= github.com/rivo/uniseg v0.4.3/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= -github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= -github.com/rogpeppe/go-internal v1.8.1/go.mod h1:JeRgkft04UBgHMgCIwADu4Pn6Mtm5d4nPKWu0nJ5d+o= github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/rs/cors v1.7.0 h1:+88SsELBHx5r+hZ8TCkggzSstaWNbDvThkVK8H6f9ik= github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= -github.com/russross/blackfriday v1.5.2 h1:HyvC0ARfnZBqnXwABFeSZHpKvJHJJfPz81GNueLj0oo= -github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/schollz/closestmatch v2.1.0+incompatible/go.mod h1:RtP1ddjLong6gTkbtmuhtR2uUrrJOpYzYRvbcPAid+g= -github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI= github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= -github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= -github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= -github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= github.com/status-im/keycard-go v0.2.0 h1:QDLFswOQu1r5jsycloeQh3bVU8n/NatHHaZobtDnDzA= github.com/status-im/keycard-go v0.2.0/go.mod h1:wlp8ZLbsmrF6g6WjugPAx+IzoLrkdf9+mHxBEeo3Hbg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= @@ -348,202 +215,103 @@ github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+F github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= github.com/tyler-smith/go-bip39 v1.1.0 h1:5eUemwrMargf3BSLRRCalXT93Ns6pQJIjYQN2nyfOP8= github.com/tyler-smith/go-bip39 v1.1.0/go.mod h1:gUYDtqQw1JS3ZJ8UWVcGTGqqr6YIN3CWg+kkNaLt55U= -github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= -github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= -github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= -github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= github.com/urfave/cli/v2 v2.25.7 h1:VAzn5oq403l5pHjc4OhD54+XGO9cdKVL/7lDjF+iKUs= github.com/urfave/cli/v2 v2.25.7/go.mod h1:8qnjx1vcq5s2/wpsqoZFndg2CE5tNFyrTvS6SinrnYQ= -github.com/urfave/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4= -github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= -github.com/valyala/fasthttp v1.6.0/go.mod h1:FstJa9V+Pj9vQ7OJie2qMHdwemEDaDiSdBnvPM1Su9w= -github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= -github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= -github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio= -github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= -github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= -github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= -github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU= github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8= -github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0/go.mod h1:/LWChgwKmvncFJFHJ7Gvn9wZArjbV5/FppcK2fKk/tI= -github.com/yudai/gojsondiff v1.0.0/go.mod h1:AY32+k2cwILAkW1fbgxQ5mUmMiZFgLIV+FBNExI05xg= -github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82/go.mod h1:lgjkn3NuSvDfVJdfcVVdX+jpBxNmX4rDAzaS45IcYoM= -github.com/yudai/pp v2.0.1+incompatible/go.mod h1:PuxR/8QJ7cyCkFp/aUDS+JY727OFEZkTdatxwunjIkc= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yusufpapurcu/wmi v1.2.2 h1:KBNDSne4vP5mbSWnJbO+51IMOXJB67QiYCSBrubbPRg= github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= -golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191227163750-53104e6ec876/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= -golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g= -golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30= +golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M= +golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa h1:FRnLl4eNAQl8hwxVVC17teOw8kdjVDVAiFMtgUdTSRQ= +golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa/go.mod h1:zk2irFbV9DP96SEBUUAy67IdHUaZuSnrz1n472HUCLE= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc= -golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190327091125-710a502c58a2/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= -golang.org/x/net v0.0.0-20211008194852-3b03d305991f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4= -golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/net v0.24.0 h1:1PcaxkF854Fu3+lvBIx5SYn9wRlBzzcnHZSiaFFAb0w= +golang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= -golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= +golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= -golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= +golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= -golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= +golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181221001348-537d06c36207/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190327201419-c70d86f8b7cf/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.13.0 h1:Iey4qkscZuv0VvIt8E0neZjtPVQFSc870HQ448QgEmQ= -golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/genproto v0.0.0-20180518175338-11a468237815/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= -google.golang.org/grpc v1.12.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= -gopkg.in/go-playground/validator.v8 v8.18.2/go.mod h1:RX2a/7Ha8BgOhfk7j780h4/u/RRjR0eouCJSH80/M2Y= gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1 h1:iiHuQZCNgYPmFQxd3BBN/Nc5+dAwzZuq5y40s20oQw0= gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= -gopkg.in/ini.v1 v1.51.1/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= -gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8= -gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= +gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc= +gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= @@ -551,12 +319,7 @@ gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= -gopkg.in/yaml.v3 v3.0.0-20191120175047-4206685974f2/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= rsc.io/tmplfunc v0.0.3 h1:53XFQh69AfOa8Tw0Jm7t+GV7KZhOi6jzsCzTtKbMvzU= rsc.io/tmplfunc v0.0.3/go.mod h1:AG3sTPzElb1Io3Yg4voV9AGZJuleGAwaVRxL9M49PhA= From 57ebbab3e46475d4c7b090952cf5f0118c995d6f Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Mon, 10 Jun 2024 20:23:36 +0200 Subject: [PATCH 293/387] simulators/ethereum/rpc: upgrade hivesim --- simulators/ethereum/rpc/go.mod | 45 +++-- simulators/ethereum/rpc/go.sum | 345 ++++++--------------------------- 2 files changed, 81 insertions(+), 309 deletions(-) diff --git a/simulators/ethereum/rpc/go.mod b/simulators/ethereum/rpc/go.mod index 4bdae9ab23..e88208a196 100644 --- a/simulators/ethereum/rpc/go.mod +++ b/simulators/ethereum/rpc/go.mod @@ -5,53 +5,54 @@ go 1.21 toolchain go1.22.1 require ( - github.com/ethereum/go-ethereum v1.13.5-0.20231031113925-bc42e88415d3 - github.com/ethereum/hive v0.0.0-20240319152821-ae224371b4e5 + github.com/ethereum/go-ethereum v1.14.5 + github.com/ethereum/hive v0.0.0-20240610172825-2430a68c753a github.com/kr/pretty v0.3.1 ) require ( github.com/DataDog/zstd v1.5.2 // indirect - github.com/Microsoft/go-winio v0.6.1 // indirect - github.com/VictoriaMetrics/fastcache v1.12.1 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect + github.com/VictoriaMetrics/fastcache v1.12.2 // indirect github.com/beorn7/perks v1.0.1 // indirect - github.com/bits-and-blooms/bitset v1.7.0 // indirect + github.com/bits-and-blooms/bitset v1.10.0 // indirect github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect github.com/cespare/cp v1.1.1 // indirect - github.com/cespare/xxhash/v2 v2.2.0 // indirect - github.com/cockroachdb/errors v1.9.1 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/cockroachdb/errors v1.11.1 // indirect github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect - github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593 // indirect - github.com/cockroachdb/redact v1.1.3 // indirect + github.com/cockroachdb/pebble v1.1.0 // indirect + github.com/cockroachdb/redact v1.1.5 // indirect github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect github.com/consensys/bavard v0.1.13 // indirect github.com/consensys/gnark-crypto v0.12.1 // indirect - github.com/crate-crypto/go-kzg-4844 v0.7.0 // indirect - github.com/deckarep/golang-set/v2 v2.1.0 // indirect + github.com/crate-crypto/go-ipa v0.0.0-20240223125850-b1e8a79f509c // indirect + github.com/crate-crypto/go-kzg-4844 v1.0.0 // indirect + github.com/deckarep/golang-set/v2 v2.6.0 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 // indirect - github.com/ethereum/c-kzg-4844 v0.4.0 // indirect - github.com/fjl/memsize v0.0.1 // indirect + github.com/ethereum/c-kzg-4844 v1.0.0 // indirect + github.com/ethereum/go-verkle v0.1.1-0.20240306133620-7d920df305f0 // indirect github.com/fsnotify/fsnotify v1.6.0 // indirect github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08 // indirect github.com/getsentry/sentry-go v0.18.0 // indirect - github.com/go-ole/go-ole v1.2.6 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect github.com/go-stack/stack v1.8.1 // indirect github.com/gofrs/flock v0.8.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang-jwt/jwt/v4 v4.5.0 // indirect - github.com/golang/protobuf v1.5.3 // indirect + github.com/golang/protobuf v1.5.4 // indirect github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect github.com/google/go-cmp v0.6.0 // indirect github.com/google/uuid v1.3.0 // indirect github.com/gorilla/websocket v1.5.0 // indirect github.com/hashicorp/go-bexpr v0.1.11 // indirect github.com/holiman/bloomfilter/v2 v2.0.3 // indirect - github.com/holiman/uint256 v1.2.3 // indirect + github.com/holiman/uint256 v1.2.4 // indirect github.com/klauspost/compress v1.15.15 // indirect github.com/kr/text v0.2.0 // indirect github.com/lithammer/dedent v1.1.0 // indirect github.com/mattn/go-colorable v0.1.13 // indirect - github.com/mattn/go-isatty v0.0.17 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect github.com/mattn/go-runewidth v0.0.14 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect @@ -71,13 +72,11 @@ require ( github.com/tklauser/go-sysconf v0.3.12 // indirect github.com/tklauser/numcpus v0.6.1 // indirect github.com/yusufpapurcu/wmi v1.2.2 // indirect - golang.org/x/crypto v0.21.0 // indirect - golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect - golang.org/x/mod v0.12.0 // indirect - golang.org/x/sync v0.3.0 // indirect - golang.org/x/sys v0.18.0 // indirect + golang.org/x/crypto v0.22.0 // indirect + golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa // indirect + golang.org/x/sync v0.7.0 // indirect + golang.org/x/sys v0.20.0 // indirect golang.org/x/text v0.14.0 // indirect - golang.org/x/tools v0.13.0 // indirect google.golang.org/protobuf v1.33.0 // indirect gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1 // indirect rsc.io/tmplfunc v0.0.3 // indirect diff --git a/simulators/ethereum/rpc/go.sum b/simulators/ethereum/rpc/go.sum index ccc727cfb5..ad36ef69ee 100644 --- a/simulators/ethereum/rpc/go.sum +++ b/simulators/ethereum/rpc/go.sum @@ -1,256 +1,162 @@ -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/CloudyKit/fastprinter v0.0.0-20200109182630-33d98a066a53/go.mod h1:+3IMCy2vIlbG1XG/0ggNQv0SvxCAIpPM5b1nCz56Xno= -github.com/CloudyKit/jet/v3 v3.0.0/go.mod h1:HKQPgSJmdK8hdoAbKUUWajkHyHo4RaU5rMdUywE7VMo= github.com/DataDog/zstd v1.5.2 h1:vUG4lAyuPCXO0TLbXvPv7EB7cNK1QV/luu55UHLrrn8= github.com/DataDog/zstd v1.5.2/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= -github.com/Joker/hpp v1.0.0/go.mod h1:8x5n+M1Hp5hC0g8okX3sR3vFQwynaX/UgSOM9MeBKzY= -github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= -github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= -github.com/Shopify/goreferrer v0.0.0-20181106222321-ec9c9a553398/go.mod h1:a1uqRtAwp2Xwc6WNPJEufxJ7fx3npB4UV/JOLmbu5I0= -github.com/VictoriaMetrics/fastcache v1.12.1 h1:i0mICQuojGDL3KblA7wUNlY5lOK6a4bwt3uRKnkZU40= -github.com/VictoriaMetrics/fastcache v1.12.1/go.mod h1:tX04vaqcNoQeGLD+ra5pU5sWkuxnzWhEzLwhP9w653o= -github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/VictoriaMetrics/fastcache v1.12.2 h1:N0y9ASrJ0F6h0QaC3o6uJb3NIZ9VKLjCM7NQbSmF7WI= +github.com/VictoriaMetrics/fastcache v1.12.2/go.mod h1:AmC+Nzz1+3G2eCPapF6UcsnkThDcMsQicp4xDukwJYI= github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= github.com/allegro/bigcache v1.2.1 h1:hg1sY1raCwic3Vnsvje6TT7/pnZba83LeFck5NrFKSc= github.com/allegro/bigcache v1.2.1/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= -github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= -github.com/aymerick/raymond v2.0.3-0.20180322193309-b565731e1464+incompatible/go.mod h1:osfaiScAUVup+UC9Nfq76eWqDhXlp+4UYaA8uhTBO6g= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bits-and-blooms/bitset v1.7.0 h1:YjAGVd3XmtK9ktAbX8Zg2g2PwLIMjGREZJHlV4j7NEo= -github.com/bits-and-blooms/bitset v1.7.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= +github.com/bits-and-blooms/bitset v1.10.0 h1:ePXTeiPEazB5+opbv5fr8umg2R/1NlzgDsyepwsSr88= +github.com/bits-and-blooms/bitset v1.10.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U= github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/cp v1.1.1 h1:nCb6ZLdB7NRaqsm91JtQTAme2SKJzXVsdPIPkyJr1MU= github.com/cespare/cp v1.1.1/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s= -github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cockroachdb/datadriven v1.0.2/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f h1:otljaYPt5hWxV3MUfO5dFPFiOXg9CyG5/kCfayTqsJ4= github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= -github.com/cockroachdb/errors v1.9.1 h1:yFVvsI0VxmRShfawbt/laCIDy/mtTqqnvoNgiy5bEV8= -github.com/cockroachdb/errors v1.9.1/go.mod h1:2sxOtL2WIc096WSZqZ5h8fa17rdDq9HZOZLBCor4mBk= -github.com/cockroachdb/logtags v0.0.0-20211118104740-dabe8e521a4f/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= +github.com/cockroachdb/errors v1.11.1 h1:xSEW75zKaKCWzR3OfxXUxgrk/NtT4G1MiOv5lWZazG8= +github.com/cockroachdb/errors v1.11.1/go.mod h1:8MUxA3Gi6b25tYlFEBGLf+D8aISL+M4MIpiWMSNRfxw= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= -github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593 h1:aPEJyR4rPBvDmeyi+l/FS/VtA00IWvjeFvjen1m1l1A= -github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593/go.mod h1:6hk1eMY/u5t+Cf18q5lFMUA1Rc+Sm5I6Ra1QuPyxXCo= -github.com/cockroachdb/redact v1.1.3 h1:AKZds10rFSIj7qADf0g46UixK8NNLwWTNdCIGS5wfSQ= -github.com/cockroachdb/redact v1.1.3/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= +github.com/cockroachdb/pebble v1.1.0 h1:pcFh8CdCIt2kmEpK0OIatq67Ln9uGDYY3d5XnE0LJG4= +github.com/cockroachdb/pebble v1.1.0/go.mod h1:sEHm5NOXxyiAoKWhoFxT8xMgd/f3RA6qUqQ1BXKrh2E= +github.com/cockroachdb/redact v1.1.5 h1:u1PMllDkdFfPWaNGMyLD1+so+aq3uUItthCFqzwPJ30= +github.com/cockroachdb/redact v1.1.5/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo= github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ= -github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0/go.mod h1:4Zcjuz89kmFXt9morQgcfYZAYZ5n8WHjt81YYWIwtTM= github.com/consensys/bavard v0.1.13 h1:oLhMLOFGTLdlda/kma4VOJazblc7IM5y5QPd2A/YjhQ= github.com/consensys/bavard v0.1.13/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI= github.com/consensys/gnark-crypto v0.12.1 h1:lHH39WuuFgVHONRl3J0LRBtuYdQTumFSDtJF7HpyG8M= github.com/consensys/gnark-crypto v0.12.1/go.mod h1:v2Gy7L/4ZRosZ7Ivs+9SfUDr0f5UlG+EM5t7MPHiLuY= -github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= -github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/cpuguy83/go-md2man v1.0.10 h1:BSKMNlYxDvnunlTymqtgONjNnaRV1sTpcovwwjF22jk= -github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/crate-crypto/go-kzg-4844 v0.7.0 h1:C0vgZRk4q4EZ/JgPfzuSoxdCq3C3mOZMBShovmncxvA= -github.com/crate-crypto/go-kzg-4844 v0.7.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= +github.com/crate-crypto/go-ipa v0.0.0-20240223125850-b1e8a79f509c h1:uQYC5Z1mdLRPrZhHjHxufI8+2UG/i25QG92j0Er9p6I= +github.com/crate-crypto/go-ipa v0.0.0-20240223125850-b1e8a79f509c/go.mod h1:geZJZH3SzKCqnz5VT0q/DyIG/tvu/dZk+VIfXicupJs= +github.com/crate-crypto/go-kzg-4844 v1.0.0 h1:TsSgHwrkTKecKJ4kadtHi4b3xHW5dCFUDFnUp1TsawI= +github.com/crate-crypto/go-kzg-4844 v1.0.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/deckarep/golang-set/v2 v2.1.0 h1:g47V4Or+DUdzbs8FxCCmgb6VYd+ptPAngjM6dtGktsI= -github.com/deckarep/golang-set/v2 v2.1.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= +github.com/deckarep/golang-set/v2 v2.6.0 h1:XfcQbWM1LlMB8BsJ8N9vW5ehnnPVIw0je80NsVHagjM= +github.com/deckarep/golang-set/v2 v2.6.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0= github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 h1:HbphB4TFFXpv7MNrT52FGrrgVXF1owhMVTHFZIlnvd4= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0/go.mod h1:DZGJHZMqrU4JJqFAWUS2UO1+lbSKsdiOoYi9Zzey7Fc= -github.com/dgraph-io/badger v1.6.0/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6psNgSztDR4= -github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385/go.mod h1:0vRUJqYpeSZifjYj7uP3BG/gKcuzL9xWVV/Y+cK33KM= -github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/etcd-io/bbolt v1.3.3/go.mod h1:ZF2nL25h33cCyBtcyWeZ2/I3HQOfTP+0PIEvHjkjCrw= -github.com/ethereum/c-kzg-4844 v0.4.0 h1:3MS1s4JtA868KpJxroZoepdV0ZKBp3u/O5HcZ7R3nlY= -github.com/ethereum/c-kzg-4844 v0.4.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= -github.com/ethereum/go-ethereum v1.13.5-0.20231031113925-bc42e88415d3 h1:i4TE0DmzMYcr2IiCdlTGGk+7Q/EzXvBKbbG4uRxMjJ0= -github.com/ethereum/go-ethereum v1.13.5-0.20231031113925-bc42e88415d3/go.mod h1:yMTu38GSuyxaYzQMViqNmQ1s3cE84abZexQmTgenWk0= -github.com/ethereum/hive v0.0.0-20240319152821-ae224371b4e5 h1:2Rc3v1mqWgUl8gSHFh7+FmVcyB1AI/9THxhEDjNK+PI= -github.com/ethereum/hive v0.0.0-20240319152821-ae224371b4e5/go.mod h1:MGwUXPGco6YS3brOf5WEILfUnnUL/XuX1224ab3D7XA= -github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072/go.mod h1:duJ4Jxv5lDcvg4QuQr0oowTf7dz4/CR8NtyCooz9HL8= -github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= -github.com/fjl/memsize v0.0.1 h1:+zhkb+dhUgx0/e+M8sF0QqiouvMQUiKR+QYvdxIOKcQ= -github.com/fjl/memsize v0.0.1/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= +github.com/ethereum/c-kzg-4844 v1.0.0 h1:0X1LBXxaEtYD9xsyj9B9ctQEZIpnvVDeoBx8aHEwTNA= +github.com/ethereum/c-kzg-4844 v1.0.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= +github.com/ethereum/go-ethereum v1.14.5 h1:szuFzO1MhJmweXjoM5nSAeDvjNUH3vIQoMzzQnfvjpw= +github.com/ethereum/go-ethereum v1.14.5/go.mod h1:VEDGGhSxY7IEjn98hJRFXl/uFvpRgbIIf2PpXiyGGgc= +github.com/ethereum/go-verkle v0.1.1-0.20240306133620-7d920df305f0 h1:KrE8I4reeVvf7C1tm8elRjj4BdscTYzz/WAbYyf/JI4= +github.com/ethereum/go-verkle v0.1.1-0.20240306133620-7d920df305f0/go.mod h1:D9AJLVXSyZQXJQVk8oh1EwjISE+sJTn2duYIZC0dy3w= +github.com/ethereum/hive v0.0.0-20240610172825-2430a68c753a h1:iyHHRPXaxHtEvyFxc4A+is/JRt88o0gQhHrNx+khEqQ= +github.com/ethereum/hive v0.0.0-20240610172825-2430a68c753a/go.mod h1:ghNXZW+/WQClcyiwZpbTzUCyxwql7YeMacYd44v+BJE= +github.com/fjl/memsize v0.0.2 h1:27txuSD9or+NZlnOWdKUxeBzTAUkWCVh+4Gf2dWFOzA= +github.com/fjl/memsize v0.0.2/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= -github.com/gavv/httpexpect v2.0.0+incompatible/go.mod h1:x+9tiU1YnrOvnB725RkpoLv1M62hOWzwo5OXotisrKc= github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08 h1:f6D9Hr8xV8uYKlyuj8XIruxlh9WjVjdh1gIicAS7ays= github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= -github.com/getsentry/sentry-go v0.12.0/go.mod h1:NSap0JBYWzHND8oMbyi0+XZhUalc1TBdRL1M71JZW2c= github.com/getsentry/sentry-go v0.18.0 h1:MtBW5H9QgdcJabtZcuJG80BMOwaBpkRDZkxRkNC1sN0= github.com/getsentry/sentry-go v0.18.0/go.mod h1:Kgon4Mby+FJ7ZWHFUAZgVaIa8sxHtnRJRLTXZr51aKQ= -github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3/go.mod h1:VJ0WA2NBN22VlZ2dKZQPAPnyWw5XTlK1KymzLKsr59s= -github.com/gin-gonic/gin v1.4.0/go.mod h1:OW2EZn3DO8Ln9oIKOvM++LBO+5UPHJJDH72/q/3rZdM= -github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= -github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= -github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab/go.mod h1:/P9AEU963A2AYjv4d1V5eVL1CQbEJq6aCNHDDjibzu8= -github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= github.com/go-stack/stack v1.8.1 h1:ntEHSVwIt7PNXNpgPmVfMrNhLtgjlmnZha2kOpuRiDw= github.com/go-stack/stack v1.8.1/go.mod h1:dcoOX6HbPZSZptuspn9bctJ+N/CnF5gGygcUP3XYfe4= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= -github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= -github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= -github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= -github.com/gogo/googleapis v0.0.0-20180223154316-0cd9801be74a/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= -github.com/gogo/googleapis v1.4.1/go.mod h1:2lpHqI5OcWCtVElxXnPt+s8oJvMpySlOyM6xDCrzib4= -github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/gogo/status v1.1.0/go.mod h1:BFv9nrluPLmrS0EmGVvLaPNmRosr9KapBYd5/hpY1WM= -github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= -github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXiurYmW7fx4GZkL8feAMVq7nEjURHk= github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/gomodule/redigo v1.7.1-0.20190724094224-574c33c3df38/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= -github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/hashicorp/go-bexpr v0.1.11 h1:6DqdA/KBjurGby9yTY0bmkathya0lfwF2SeuubCI7dY= github.com/hashicorp/go-bexpr v0.1.11/go.mod h1:f03lAo0duBlDIUMGCuad8oLcgejw4m7U+N8T+6Kz1AE= -github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/holiman/billy v0.0.0-20230718173358-1c7e68d277a7 h1:3JQNjnMRil1yD0IfZKHF9GxxWKDJGj8I0IqOUol//sw= -github.com/holiman/billy v0.0.0-20230718173358-1c7e68d277a7/go.mod h1:5GuXa7vkL8u9FkFuWdVvfR5ix8hRB7DbOAaYULamFpc= +github.com/holiman/billy v0.0.0-20240216141850-2abb0c79d3c4 h1:X4egAf/gcS1zATw6wn4Ej8vjuVGxeHdan+bRb2ebyv4= +github.com/holiman/billy v0.0.0-20240216141850-2abb0c79d3c4/go.mod h1:5GuXa7vkL8u9FkFuWdVvfR5ix8hRB7DbOAaYULamFpc= github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao= github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA= -github.com/holiman/uint256 v1.2.3 h1:K8UWO1HUJpRMXBxbmaY1Y8IAMZC/RsKB+ArEnnK4l5o= -github.com/holiman/uint256 v1.2.3/go.mod h1:SC8Ryt4n+UBbPbIBKaG9zbbDlp4jOru9xFZmPzLUTxw= +github.com/holiman/uint256 v1.2.4 h1:jUc4Nk8fm9jZabQuqr2JzednajVmBpC+oiTiXZJEApU= +github.com/holiman/uint256 v1.2.4/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXeiRV4ng7E= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/huin/goupnp v1.3.0 h1:UvLUlWDNpoUdYzb2TCn+MuTWtcjXKSza2n6CBdQ0xXc= github.com/huin/goupnp v1.3.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8= -github.com/hydrogen18/memlistener v0.0.0-20200120041712-dcc25e7acd91/go.mod h1:qEIFzExnS6016fRpRfxrExeVn2gbClQA99gQhnIcdhE= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/imkira/go-interpol v1.1.0/go.mod h1:z0h2/2T3XF8kyEPpRgJ3kmNv+C43p+I/CoI+jC3w2iA= -github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/iris-contrib/blackfriday v2.0.0+incompatible/go.mod h1:UzZ2bDEoaSGPbkg6SAB4att1aAwTmVIx/5gCVqeyUdI= -github.com/iris-contrib/go.uuid v2.0.0+incompatible/go.mod h1:iz2lgM/1UnEf1kP0L/+fafWORmlnuysV2EMP8MW+qe0= -github.com/iris-contrib/jade v1.1.3/go.mod h1:H/geBymxJhShH5kecoiOCSssPX7QWYH7UaeZTSWddIk= -github.com/iris-contrib/pongo2 v0.0.1/go.mod h1:Ssh+00+3GAZqSQb30AvBRNxBx7rf0GqwkjqxNd0u65g= -github.com/iris-contrib/schema v0.0.1/go.mod h1:urYA3uvUNG1TIIjOSCzHr9/LmbQo8LrOcOqfqxa4hXw= github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= -github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= -github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88/go.mod h1:3w7q1U84EfirKl04SVQ/s7nPm1ZPhiXd34z40TNz36k= -github.com/kataras/golog v0.0.10/go.mod h1:yJ8YKCmyL+nWjERB90Qwn+bdyBZsaQwU3bTVFgkFIp8= -github.com/kataras/iris/v12 v12.1.8/go.mod h1:LMYy4VlP67TQ3Zgriz8RE2h2kMZV2SgMYbq3UhfoFmE= -github.com/kataras/neffos v0.0.14/go.mod h1:8lqADm8PnbeFfL7CLXh1WHw53dG27MC3pgi2R1rmoTE= -github.com/kataras/pio v0.0.2/go.mod h1:hAoW0t9UmXi4R5Oyq5Z4irTbaTsOemSrDGUtaTl7Dro= -github.com/kataras/sitemap v0.0.5/go.mod h1:KY2eugMKiPwsJgx7+U103YZehfvNGOXURubcGyk0Bz8= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.8.2/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= -github.com/klauspost/compress v1.9.7/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= github.com/klauspost/compress v1.15.15 h1:EF27CXIuDsYJ6mmvtBRlEuB2UVOqHG1tAXgZ7yIO+lw= github.com/klauspost/compress v1.15.15/go.mod h1:ZcK2JAFqKOpnBlxcLsJzYfrS9X1akm9fHZNnD9+Vo/4= -github.com/klauspost/cpuid v1.2.1/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/labstack/echo/v4 v4.5.0/go.mod h1:czIriw4a0C1dFun+ObrXp7ok03xON0N1awStJ6ArI7Y= -github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c= github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= github.com/lithammer/dedent v1.1.0 h1:VNzHMVCBNG1j0fh3OrsFRkVUwStdDArbgBWoPAffktY= github.com/lithammer/dedent v1.1.0/go.mod h1:jrXYCQtgg0nJiN+StA2KgR7w6CiQNv9Fd/Z9BP0jIOc= -github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.11/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= -github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= -github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng= -github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.14 h1:+xnbZSEeDbOIg5/mE6JF0w6n9duR1l3/WmbinWVwUuU= github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= -github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw= github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= -github.com/mediocregopher/radix/v3 v3.4.2/go.mod h1:8FL3F6UQRXHXIBSPUs5h0RybMF8i4n7wVopoX3x7Bv8= -github.com/microcosm-cc/bluemonday v1.0.2/go.mod h1:iVP4YcDBq+n/5fb23BhYFvIMq/leAFZyRl6bYmGDlGc= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= @@ -259,22 +165,12 @@ github.com/mitchellh/pointerstructure v1.2.1/go.mod h1:BRAsLI5zgXmw97Lf6s25bs8oh github.com/mmcloughlin/addchain v0.4.0 h1:SobOdjm2xLj1KkXN5/n0xTIWyZA2+s99UCY1iPfkHRY= github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqkyU72HC5wJ4RlU= github.com/mmcloughlin/profile v0.1.1/go.mod h1:IhHD7q1ooxgwTgjxQYkACGA77oFTDdFVejUS1/tS/qU= -github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/moul/http2curl v1.0.0/go.mod h1:8UbvGypXm98wA/IqH45anm5Y2Z6ep6O31QGOAZ3H0fQ= -github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= -github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= -github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= -github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= @@ -285,18 +181,15 @@ github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1y github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= github.com/onsi/gomega v1.19.0 h1:4ieX6qQjPP/BfC3mpsAtIGGlxTWPeA3Inl/7DtXw1tw= github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= -github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_golang v1.14.0 h1:nJdhIvne2eSX/XRAFV9PcvFFRbrjbcTUj0VP62TMhnw= github.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4= github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= github.com/prometheus/common v0.39.0 h1:oOyhkDq05hPZKItWVBkJ6g6AtGxi+fy7F4JvUV8uhsI= @@ -306,36 +199,18 @@ github.com/prometheus/procfs v0.9.0/go.mod h1:+pB4zwohETzFnmlpe6yd2lSc+0/46IYZRB github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.3 h1:utMvzDsuh3suAEnhH0RdHmoPbU648o6CvXxTx4SBMOw= github.com/rivo/uniseg v0.4.3/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= -github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= -github.com/rogpeppe/go-internal v1.8.1/go.mod h1:JeRgkft04UBgHMgCIwADu4Pn6Mtm5d4nPKWu0nJ5d+o= github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/rs/cors v1.8.2 h1:KCooALfAYGs415Cwu5ABvv9n9509fSiG5SQJn/AQo4U= github.com/rs/cors v1.8.2/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= -github.com/russross/blackfriday v1.5.2 h1:HyvC0ARfnZBqnXwABFeSZHpKvJHJJfPz81GNueLj0oo= -github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/schollz/closestmatch v2.1.0+incompatible/go.mod h1:RtP1ddjLong6gTkbtmuhtR2uUrrJOpYzYRvbcPAid+g= -github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI= github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= -github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= -github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= -github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= github.com/status-im/keycard-go v0.2.0 h1:QDLFswOQu1r5jsycloeQh3bVU8n/NatHHaZobtDnDzA= github.com/status-im/keycard-go v0.2.0/go.mod h1:wlp8ZLbsmrF6g6WjugPAx+IzoLrkdf9+mHxBEeo3Hbg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= @@ -351,203 +226,105 @@ github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+F github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= github.com/tyler-smith/go-bip39 v1.1.0 h1:5eUemwrMargf3BSLRRCalXT93Ns6pQJIjYQN2nyfOP8= github.com/tyler-smith/go-bip39 v1.1.0/go.mod h1:gUYDtqQw1JS3ZJ8UWVcGTGqqr6YIN3CWg+kkNaLt55U= -github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= -github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= -github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= -github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= github.com/urfave/cli/v2 v2.25.7 h1:VAzn5oq403l5pHjc4OhD54+XGO9cdKVL/7lDjF+iKUs= github.com/urfave/cli/v2 v2.25.7/go.mod h1:8qnjx1vcq5s2/wpsqoZFndg2CE5tNFyrTvS6SinrnYQ= -github.com/urfave/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4= -github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= -github.com/valyala/fasthttp v1.6.0/go.mod h1:FstJa9V+Pj9vQ7OJie2qMHdwemEDaDiSdBnvPM1Su9w= -github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= -github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= -github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio= -github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= -github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= -github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= -github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU= github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8= -github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0/go.mod h1:/LWChgwKmvncFJFHJ7Gvn9wZArjbV5/FppcK2fKk/tI= -github.com/yudai/gojsondiff v1.0.0/go.mod h1:AY32+k2cwILAkW1fbgxQ5mUmMiZFgLIV+FBNExI05xg= -github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82/go.mod h1:lgjkn3NuSvDfVJdfcVVdX+jpBxNmX4rDAzaS45IcYoM= -github.com/yudai/pp v2.0.1+incompatible/go.mod h1:PuxR/8QJ7cyCkFp/aUDS+JY727OFEZkTdatxwunjIkc= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yusufpapurcu/wmi v1.2.2 h1:KBNDSne4vP5mbSWnJbO+51IMOXJB67QiYCSBrubbPRg= github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= -golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191227163750-53104e6ec876/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= -golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g= -golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30= +golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M= +golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa h1:FRnLl4eNAQl8hwxVVC17teOw8kdjVDVAiFMtgUdTSRQ= +golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa/go.mod h1:zk2irFbV9DP96SEBUUAy67IdHUaZuSnrz1n472HUCLE= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc= -golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190327091125-710a502c58a2/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= -golang.org/x/net v0.0.0-20211008194852-3b03d305991f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4= -golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/net v0.24.0 h1:1PcaxkF854Fu3+lvBIx5SYn9wRlBzzcnHZSiaFFAb0w= +golang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= -golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= +golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= -golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= +golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= -golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= +golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181221001348-537d06c36207/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190327201419-c70d86f8b7cf/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.13.0 h1:Iey4qkscZuv0VvIt8E0neZjtPVQFSc870HQ448QgEmQ= -golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/genproto v0.0.0-20180518175338-11a468237815/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= -google.golang.org/grpc v1.12.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= -gopkg.in/go-playground/validator.v8 v8.18.2/go.mod h1:RX2a/7Ha8BgOhfk7j780h4/u/RRjR0eouCJSH80/M2Y= gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1 h1:iiHuQZCNgYPmFQxd3BBN/Nc5+dAwzZuq5y40s20oQw0= gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= -gopkg.in/ini.v1 v1.51.1/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= -gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8= -gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= +gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc= +gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= @@ -555,12 +332,8 @@ gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= -gopkg.in/yaml.v3 v3.0.0-20191120175047-4206685974f2/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= rsc.io/tmplfunc v0.0.3 h1:53XFQh69AfOa8Tw0Jm7t+GV7KZhOi6jzsCzTtKbMvzU= rsc.io/tmplfunc v0.0.3/go.mod h1:AG3sTPzElb1Io3Yg4voV9AGZJuleGAwaVRxL9M49PhA= From 46f6efa4487720643a4dd3a2bdeb7db264793e8e Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Mon, 10 Jun 2024 20:23:48 +0200 Subject: [PATCH 294/387] simulators/ethereum/rpc-compat: upgrade hivesim --- simulators/ethereum/rpc-compat/go.mod | 22 ++++----- simulators/ethereum/rpc-compat/go.sum | 69 ++++++++++++++++----------- 2 files changed, 52 insertions(+), 39 deletions(-) diff --git a/simulators/ethereum/rpc-compat/go.mod b/simulators/ethereum/rpc-compat/go.mod index ff32cce993..da41d096d9 100644 --- a/simulators/ethereum/rpc-compat/go.mod +++ b/simulators/ethereum/rpc-compat/go.mod @@ -5,27 +5,27 @@ go 1.21 toolchain go1.22.1 require ( - github.com/ethereum/go-ethereum v1.13.5-0.20231031113925-bc42e88415d3 - github.com/ethereum/hive v0.0.0-20240319152821-ae224371b4e5 + github.com/ethereum/go-ethereum v1.14.5 + github.com/ethereum/hive v0.0.0-20240610172825-2430a68c753a github.com/tidwall/gjson v1.17.0 github.com/tidwall/sjson v1.2.5 github.com/yudai/gojsondiff v1.0.0 ) require ( - github.com/Microsoft/go-winio v0.6.1 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect - github.com/deckarep/golang-set/v2 v2.1.0 // indirect + github.com/deckarep/golang-set/v2 v2.6.0 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 // indirect - github.com/go-ole/go-ole v1.2.6 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect github.com/go-stack/stack v1.8.1 // indirect github.com/golang-jwt/jwt/v4 v4.5.0 // indirect github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect github.com/gorilla/websocket v1.5.0 // indirect - github.com/holiman/uint256 v1.2.3 // indirect + github.com/holiman/uint256 v1.2.4 // indirect github.com/lithammer/dedent v1.1.0 // indirect github.com/mattn/go-colorable v0.1.13 // indirect - github.com/mattn/go-isatty v0.0.17 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect github.com/sergi/go-diff v1.2.0 // indirect github.com/shirou/gopsutil v3.21.11+incompatible // indirect github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a // indirect @@ -36,10 +36,8 @@ require ( github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82 // indirect github.com/yudai/pp v2.0.1+incompatible // indirect github.com/yusufpapurcu/wmi v1.2.2 // indirect - golang.org/x/crypto v0.21.0 // indirect - golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect - golang.org/x/mod v0.12.0 // indirect - golang.org/x/sys v0.18.0 // indirect - golang.org/x/tools v0.13.0 // indirect + golang.org/x/crypto v0.22.0 // indirect + golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa // indirect + golang.org/x/sys v0.20.0 // indirect gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1 // indirect ) diff --git a/simulators/ethereum/rpc-compat/go.sum b/simulators/ethereum/rpc-compat/go.sum index 6eeb008e85..78a9127377 100644 --- a/simulators/ethereum/rpc-compat/go.sum +++ b/simulators/ethereum/rpc-compat/go.sum @@ -1,5 +1,7 @@ -github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= -github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/bits-and-blooms/bitset v1.10.0 h1:ePXTeiPEazB5+opbv5fr8umg2R/1NlzgDsyepwsSr88= +github.com/bits-and-blooms/bitset v1.10.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U= github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= @@ -7,26 +9,35 @@ github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtyd github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/consensys/bavard v0.1.13 h1:oLhMLOFGTLdlda/kma4VOJazblc7IM5y5QPd2A/YjhQ= +github.com/consensys/bavard v0.1.13/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI= +github.com/consensys/gnark-crypto v0.12.1 h1:lHH39WuuFgVHONRl3J0LRBtuYdQTumFSDtJF7HpyG8M= +github.com/consensys/gnark-crypto v0.12.1/go.mod h1:v2Gy7L/4ZRosZ7Ivs+9SfUDr0f5UlG+EM5t7MPHiLuY= +github.com/crate-crypto/go-kzg-4844 v1.0.0 h1:TsSgHwrkTKecKJ4kadtHi4b3xHW5dCFUDFnUp1TsawI= +github.com/crate-crypto/go-kzg-4844 v1.0.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/deckarep/golang-set/v2 v2.1.0 h1:g47V4Or+DUdzbs8FxCCmgb6VYd+ptPAngjM6dtGktsI= -github.com/deckarep/golang-set/v2 v2.1.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= +github.com/deckarep/golang-set/v2 v2.6.0 h1:XfcQbWM1LlMB8BsJ8N9vW5ehnnPVIw0je80NsVHagjM= +github.com/deckarep/golang-set/v2 v2.6.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0= github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 h1:HbphB4TFFXpv7MNrT52FGrrgVXF1owhMVTHFZIlnvd4= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0/go.mod h1:DZGJHZMqrU4JJqFAWUS2UO1+lbSKsdiOoYi9Zzey7Fc= -github.com/ethereum/go-ethereum v1.13.5-0.20231031113925-bc42e88415d3 h1:i4TE0DmzMYcr2IiCdlTGGk+7Q/EzXvBKbbG4uRxMjJ0= -github.com/ethereum/go-ethereum v1.13.5-0.20231031113925-bc42e88415d3/go.mod h1:yMTu38GSuyxaYzQMViqNmQ1s3cE84abZexQmTgenWk0= -github.com/ethereum/hive v0.0.0-20240319152821-ae224371b4e5 h1:2Rc3v1mqWgUl8gSHFh7+FmVcyB1AI/9THxhEDjNK+PI= -github.com/ethereum/hive v0.0.0-20240319152821-ae224371b4e5/go.mod h1:MGwUXPGco6YS3brOf5WEILfUnnUL/XuX1224ab3D7XA= +github.com/ethereum/c-kzg-4844 v1.0.0 h1:0X1LBXxaEtYD9xsyj9B9ctQEZIpnvVDeoBx8aHEwTNA= +github.com/ethereum/c-kzg-4844 v1.0.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= +github.com/ethereum/go-ethereum v1.14.5 h1:szuFzO1MhJmweXjoM5nSAeDvjNUH3vIQoMzzQnfvjpw= +github.com/ethereum/go-ethereum v1.14.5/go.mod h1:VEDGGhSxY7IEjn98hJRFXl/uFvpRgbIIf2PpXiyGGgc= +github.com/ethereum/hive v0.0.0-20240610172825-2430a68c753a h1:iyHHRPXaxHtEvyFxc4A+is/JRt88o0gQhHrNx+khEqQ= +github.com/ethereum/hive v0.0.0-20240610172825-2430a68c753a/go.mod h1:ghNXZW+/WQClcyiwZpbTzUCyxwql7YeMacYd44v+BJE= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= -github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= github.com/go-stack/stack v1.8.1 h1:ntEHSVwIt7PNXNpgPmVfMrNhLtgjlmnZha2kOpuRiDw= github.com/go-stack/stack v1.8.1/go.mod h1:dcoOX6HbPZSZptuspn9bctJ+N/CnF5gGygcUP3XYfe4= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= @@ -53,8 +64,8 @@ github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/holiman/uint256 v1.2.3 h1:K8UWO1HUJpRMXBxbmaY1Y8IAMZC/RsKB+ArEnnK4l5o= -github.com/holiman/uint256 v1.2.3/go.mod h1:SC8Ryt4n+UBbPbIBKaG9zbbDlp4jOru9xFZmPzLUTxw= +github.com/holiman/uint256 v1.2.4 h1:jUc4Nk8fm9jZabQuqr2JzednajVmBpC+oiTiXZJEApU= +github.com/holiman/uint256 v1.2.4/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXeiRV4ng7E= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= @@ -65,8 +76,10 @@ github.com/lithammer/dedent v1.1.0/go.mod h1:jrXYCQtgg0nJiN+StA2KgR7w6CiQNv9Fd/Z github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng= -github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mmcloughlin/addchain v0.4.0 h1:SobOdjm2xLj1KkXN5/n0xTIWyZA2+s99UCY1iPfkHRY= +github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqkyU72HC5wJ4RlU= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= @@ -93,6 +106,8 @@ github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5 github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/supranational/blst v0.3.11 h1:LyU6FolezeWAhvQk0k6O/d49jqgO52MSDDfYgbeoEm4= +github.com/supranational/blst v0.3.11/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a h1:1ur3QoCqvE5fl+nylMaIr9PVV1w343YRDtsy+Rwu7XI= github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a/go.mod h1:RRCYJbIwD5jmqPI9XoAFR0OcDxqUctll6zUj/+B4S48= github.com/tidwall/gjson v1.14.2/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= @@ -120,13 +135,11 @@ github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQ golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= -golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= -golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g= -golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k= +golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30= +golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M= +golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa h1:FRnLl4eNAQl8hwxVVC17teOw8kdjVDVAiFMtgUdTSRQ= +golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa/go.mod h1:zk2irFbV9DP96SEBUUAy67IdHUaZuSnrz1n472HUCLE= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc= -golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -135,13 +148,13 @@ golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwY golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4= -golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= +golang.org/x/net v0.24.0 h1:1PcaxkF854Fu3+lvBIx5SYn9wRlBzzcnHZSiaFFAb0w= +golang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= -golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= +golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= +golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -160,10 +173,12 @@ golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= -golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= +golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -175,8 +190,6 @@ golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.13.0 h1:Iey4qkscZuv0VvIt8E0neZjtPVQFSc870HQ448QgEmQ= -golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -204,3 +217,5 @@ gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +rsc.io/tmplfunc v0.0.3 h1:53XFQh69AfOa8Tw0Jm7t+GV7KZhOi6jzsCzTtKbMvzU= +rsc.io/tmplfunc v0.0.3/go.mod h1:AG3sTPzElb1Io3Yg4voV9AGZJuleGAwaVRxL9M49PhA= From ff181eaba3f76559e984bab2eac48d99a07cb941 Mon Sep 17 00:00:00 2001 From: STEVEN ADAMS <166521727+hugehope@users.noreply.github.com> Date: Tue, 11 Jun 2024 02:33:54 +0800 Subject: [PATCH 295/387] all: fix typos in comments (#1076) --- cmd/hiveview/main.go | 2 +- hivesim/testapi_test.go | 2 +- simulators/portal/beacon/src/suites/rpc_compat.rs | 2 +- simulators/portal/history/src/suites/rpc_compat.rs | 2 +- simulators/portal/state/src/suites/interop.rs | 2 +- simulators/portal/state/src/suites/rpc_compat.rs | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/cmd/hiveview/main.go b/cmd/hiveview/main.go index 48529e6c62..df9585a8d9 100644 --- a/cmd/hiveview/main.go +++ b/cmd/hiveview/main.go @@ -24,7 +24,7 @@ func main() { deploy = flag.Bool("deploy", false, "Compiles the frontend to a static directory") gc = flag.Bool("gc", false, "Deletes old log files") gcKeepInterval = flag.Duration("keep", 5*durationMonth, "Time interval of past log files to keep (for -gc)") - gcKeepMin = flag.Int("keep-min", 10, "Minmum number of suite outputs to keep (for -gc)") + gcKeepMin = flag.Int("keep-min", 10, "Minimum number of suite outputs to keep (for -gc)") config serverConfig ) flag.StringVar(&config.listenAddr, "addr", "0.0.0.0:8080", "HTTP server listen address") diff --git a/hivesim/testapi_test.go b/hivesim/testapi_test.go index f6ab5a3ba1..7feb70631e 100644 --- a/hivesim/testapi_test.go +++ b/hivesim/testapi_test.go @@ -148,7 +148,7 @@ func TestSkipping(t *testing.T) { sort.Strings(cases) if !reflect.DeepEqual(cases, test.WantRun) { - t.Errorf("pattern %q wrong exected test cases: %v", test.Pattern, cases) + t.Errorf("pattern %q wrong executed test cases: %v", test.Pattern, cases) } } } diff --git a/simulators/portal/beacon/src/suites/rpc_compat.rs b/simulators/portal/beacon/src/suites/rpc_compat.rs index c1a78503d7..fdb3847206 100644 --- a/simulators/portal/beacon/src/suites/rpc_compat.rs +++ b/simulators/portal/beacon/src/suites/rpc_compat.rs @@ -219,7 +219,7 @@ dyn_async! { let content_key: BeaconContentKey = serde_json::from_value(json!(CONSTANT_CONTENT_KEY)).unwrap(); if let Ok(response) = BeaconNetworkApiClient::local_content(&client.rpc, content_key).await { - panic!("Expected to recieve an error because content wasn't found {response:?}"); + panic!("Expected to receive an error because content wasn't found {response:?}"); } } } diff --git a/simulators/portal/history/src/suites/rpc_compat.rs b/simulators/portal/history/src/suites/rpc_compat.rs index d3a588f81f..c957ac7d99 100644 --- a/simulators/portal/history/src/suites/rpc_compat.rs +++ b/simulators/portal/history/src/suites/rpc_compat.rs @@ -217,7 +217,7 @@ dyn_async! { let content_key: HistoryContentKey = serde_json::from_value(json!(CONTENT_KEY)).unwrap(); if let Ok(response) = HistoryNetworkApiClient::local_content(&client.rpc, content_key).await { - panic!("Expected to recieve an error because content wasn't found {response:?}"); + panic!("Expected to receive an error because content wasn't found {response:?}"); } } } diff --git a/simulators/portal/state/src/suites/interop.rs b/simulators/portal/state/src/suites/interop.rs index 177681e6fa..d2fca23131 100644 --- a/simulators/portal/state/src/suites/interop.rs +++ b/simulators/portal/state/src/suites/interop.rs @@ -558,7 +558,7 @@ dyn_async! { let content_details = { let content_type = match &content_key { StateContentKey::AccountTrieNode(_) => "account trie node".to_string(), - StateContentKey::ContractStorageTrieNode(_) => "contract stroage trie node".to_string(), + StateContentKey::ContractStorageTrieNode(_) => "contract storage trie node".to_string(), StateContentKey::ContractBytecode(_) => "contract bytecode".to_string(), }; format!( diff --git a/simulators/portal/state/src/suites/rpc_compat.rs b/simulators/portal/state/src/suites/rpc_compat.rs index ce716a7834..ad719e0b8f 100644 --- a/simulators/portal/state/src/suites/rpc_compat.rs +++ b/simulators/portal/state/src/suites/rpc_compat.rs @@ -219,7 +219,7 @@ dyn_async! { let content_key: StateContentKey = serde_json::from_value(json!(CONTENT_KEY)).unwrap(); if let Ok(response) = StateNetworkApiClient::local_content(&client.rpc, content_key).await { - panic!("Expected to recieve an error because content wasn't found {response:?}"); + panic!("Expected to receive an error because content wasn't found {response:?}"); } } } From 5530c73b5b1bd4778f557f086d167485e1ac4677 Mon Sep 17 00:00:00 2001 From: andri lim Date: Tue, 11 Jun 2024 01:36:48 +0700 Subject: [PATCH 296/387] clients/nimbus-el: change command line option --prune-mode to --chaindb (#1078) --- clients/nimbus-el/nimbus.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clients/nimbus-el/nimbus.sh b/clients/nimbus-el/nimbus.sh index 2a29a1e818..38ac233c11 100644 --- a/clients/nimbus-el/nimbus.sh +++ b/clients/nimbus-el/nimbus.sh @@ -48,7 +48,7 @@ set -e nimbus=/usr/bin/nimbus -FLAGS="--prune-mode:archive --nat:extip:0.0.0.0" +FLAGS="--chaindb:archive --nat:extip:0.0.0.0" loglevel=DEBUG case "$HIVE_LOGLEVEL" in From 6ba6f423dd483bfc8b609507198b572dcb0e17c3 Mon Sep 17 00:00:00 2001 From: spencer Date: Tue, 11 Jun 2024 01:39:40 +0700 Subject: [PATCH 297/387] simulators/ethereum/engine/cancun: Maintain devp2p client peering (#1052) * simulators/eth/engine/cancun: Maintain devp2p client peering during test steps. * simulators/eth/engine/cancun: Add TestContext init and clean up functions. --- .../ethereum/engine/suites/cancun/config.go | 6 +- .../ethereum/engine/suites/cancun/steps.go | 69 ++++++++++++++----- .../ethereum/engine/suites/cancun/tests.go | 41 ++++++++++- 3 files changed, 93 insertions(+), 23 deletions(-) diff --git a/simulators/ethereum/engine/suites/cancun/config.go b/simulators/ethereum/engine/suites/cancun/config.go index 688671e5d9..c29fcdf67f 100644 --- a/simulators/ethereum/engine/suites/cancun/config.go +++ b/simulators/ethereum/engine/suites/cancun/config.go @@ -19,10 +19,8 @@ func (cs *CancunBaseSpec) Execute(t *test.Env) { t.CLMock.WaitForTTD() - blobTestCtx := &CancunTestContext{ - Env: t, - TestBlobTxPool: new(TestBlobTxPool), - } + blobTestCtx := NewTestContext(t) + defer blobTestCtx.Close() blobTestCtx.TestBlobTxPool.HashesByIndex = make(map[uint64]common.Hash) diff --git a/simulators/ethereum/engine/suites/cancun/steps.go b/simulators/ethereum/engine/suites/cancun/steps.go index aa2df45baf..0745f9d0ff 100644 --- a/simulators/ethereum/engine/suites/cancun/steps.go +++ b/simulators/ethereum/engine/suites/cancun/steps.go @@ -24,15 +24,37 @@ import ( "github.com/pkg/errors" ) -type CancunTestContext struct { +type TestContext struct { *test.Env *TestBlobTxPool + DevP2PConnections map[uint64]*devp2p.Conn +} + +// Initializes a TestContext +func NewTestContext(env *test.Env) *TestContext { + return &TestContext{ + Env: env, + TestBlobTxPool: new(TestBlobTxPool), + DevP2PConnections: make(map[uint64]*devp2p.Conn), + } +} + +// Performs TestContext clean up +func (t *TestContext) Close() error { + for _, conn := range t.DevP2PConnections { + if conn != nil { + if err := conn.Close(); err != nil { + return err + } + } + } + return nil } // Interface to represent a single step in a test vector type TestStep interface { // Executes the step - Execute(testCtx *CancunTestContext) error + Execute(testCtx *TestContext) error Description() string } @@ -43,7 +65,7 @@ type ParallelSteps struct { Steps []TestStep } -func (step ParallelSteps) Execute(t *CancunTestContext) error { +func (step ParallelSteps) Execute(t *TestContext) error { // Run the steps in parallel wg := sync.WaitGroup{} errs := make(chan error, len(step.Steps)) @@ -89,7 +111,7 @@ func (step LaunchClients) GetClientCount() uint64 { return clientCount } -func (step LaunchClients) Execute(t *CancunTestContext) error { +func (step LaunchClients) Execute(t *TestContext) error { // Launch a new client var ( client client.EngineClient @@ -392,7 +414,7 @@ func (step NewPayloads) VerifyBlobBundle(blobDataInPayload []*BlobWrapData, payl return nil } -func (step NewPayloads) Execute(t *CancunTestContext) error { +func (step NewPayloads) Execute(t *TestContext) error { // Create a new payload // Produce the payload payloadCount := step.GetPayloadCount() @@ -634,7 +656,7 @@ func (step SendBlobTransactions) GetBlobsPerTransaction() uint64 { return blobCountPerTx } -func (step SendBlobTransactions) Execute(t *CancunTestContext) error { +func (step SendBlobTransactions) Execute(t *TestContext) error { // Send a blob transaction addr := common.BigToAddress(cancun.DATAHASH_START_ADDRESS) blobCountPerTx := step.GetBlobsPerTransaction() @@ -695,7 +717,7 @@ type SendModifiedLatestPayload struct { NewPayloadCustomizer helper.NewPayloadCustomizer } -func (step SendModifiedLatestPayload) Execute(t *CancunTestContext) error { +func (step SendModifiedLatestPayload) Execute(t *TestContext) error { // Get the latest payload var ( payload = &t.CLMock.LatestPayloadBuilt @@ -759,7 +781,7 @@ type DevP2PClientPeering struct { ClientIndex uint64 } -func (step DevP2PClientPeering) Execute(t *CancunTestContext) error { +func (step DevP2PClientPeering) Execute(t *TestContext) error { // Get client index's enode if step.ClientIndex >= uint64(len(t.TestEngines)) { return fmt.Errorf("invalid client index %d", step.ClientIndex) @@ -769,8 +791,8 @@ func (step DevP2PClientPeering) Execute(t *CancunTestContext) error { if err != nil { return fmt.Errorf("error peering engine client: %v", err) } - defer conn.Close() t.Logf("INFO: Connected to client %d, remote public key: %s", step.ClientIndex, conn.RemoteKey()) + t.DevP2PConnections[step.ClientIndex] = conn // Sleep time.Sleep(1 * time.Second) @@ -809,24 +831,39 @@ func (step DevP2PClientPeering) Description() string { type DevP2PRequestPooledTransactionHash struct { // Client index to request the transaction hash from ClientIndex uint64 + // Use existing connection from previous step + UseExistingConnection bool // Transaction Index to request TransactionIndexes []uint64 // Wait for a new pooled transaction message before actually requesting the transaction WaitForNewPooledTransaction bool } -func (step DevP2PRequestPooledTransactionHash) Execute(t *CancunTestContext) error { +func (step DevP2PRequestPooledTransactionHash) Execute(t *TestContext) error { // Get client index's enode if step.ClientIndex >= uint64(len(t.TestEngines)) { return fmt.Errorf("invalid client index %d", step.ClientIndex) } - engine := t.Engines[step.ClientIndex] - conn, err := devp2p.PeerEngineClient(engine, t.CLMock) - if err != nil { - return fmt.Errorf("error peering engine client: %v", err) + + var conn *devp2p.Conn + var err error + if !step.UseExistingConnection { + // Establish a new connection if not using an existing one + engine := t.Engines[step.ClientIndex] + conn, err = devp2p.PeerEngineClient(engine, t.CLMock) + if err != nil { + return fmt.Errorf("error peering engine client: %v", err) + } + t.Logf("INFO: Connected to client %d, remote public key: %s", step.ClientIndex, conn.RemoteKey()) + t.DevP2PConnections[step.ClientIndex] = conn + } else { + var exists bool + conn, exists = t.DevP2PConnections[step.ClientIndex] + if !exists { + return fmt.Errorf("no existing connection found for client index %d", step.ClientIndex) + } + t.Logf("INFO: Using existing connection to client %d, remote public key: %s", step.ClientIndex, conn.RemoteKey()) } - defer conn.Close() - t.Logf("INFO: Connected to client %d, remote public key: %s", step.ClientIndex, conn.RemoteKey()) var ( txHashes = make([]common.Hash, len(step.TransactionIndexes)) diff --git a/simulators/ethereum/engine/suites/cancun/tests.go b/simulators/ethereum/engine/suites/cancun/tests.go index 689843d894..fb944df660 100644 --- a/simulators/ethereum/engine/suites/cancun/tests.go +++ b/simulators/ethereum/engine/suites/cancun/tests.go @@ -1763,9 +1763,9 @@ var Tests = []test.Spec{ // DevP2P tests &CancunBaseSpec{ BaseSpec: test.BaseSpec{ - Name: "Request Blob Pooled Transactions", + Name: "Request Blob Pooled Transactions Single", About: ` - Requests blob pooled transactions and verify correct encoding. + Requests a single blob pooled transactions and verifies the correct encoding. `, MainFork: config.Cancun, }, @@ -1774,13 +1774,48 @@ var Tests = []test.Spec{ NewPayloads{ PayloadCount: 1, }, - // Send multiple transactions with multiple blobs each + // Peer with the client before sending txs + DevP2PClientPeering{ + ClientIndex: 0, + }, + // Send a single blob transaction SendBlobTransactions{ TransactionCount: 1, BlobTransactionMaxBlobGasCost: big.NewInt(1), }, DevP2PRequestPooledTransactionHash{ ClientIndex: 0, + UseExistingConnection: true, + TransactionIndexes: []uint64{0}, + WaitForNewPooledTransaction: true, + }, + }, + }, + &CancunBaseSpec{ + BaseSpec: test.BaseSpec{ + Name: "Request Blob Pooled Transactions Multiple", + About: ` + Requests multiple blob pooled transactions and verifies the correct encoding. + `, + MainFork: config.Cancun, + }, + TestSequence: TestSequence{ + // Get past the genesis + NewPayloads{ + PayloadCount: 1, + }, + // Peer with the client before sending txs + DevP2PClientPeering{ + ClientIndex: 0, + }, + // Send multiple blob transaction + SendBlobTransactions{ + TransactionCount: cancun.MAX_BLOBS_PER_BLOCK - 1, + BlobTransactionMaxBlobGasCost: big.NewInt(1), + }, + DevP2PRequestPooledTransactionHash{ + ClientIndex: 0, + UseExistingConnection: true, TransactionIndexes: []uint64{0}, WaitForNewPooledTransaction: true, }, From c4dedf555700070e88ec25f08bf4193f2b15d012 Mon Sep 17 00:00:00 2001 From: spencer Date: Tue, 11 Jun 2024 01:44:43 +0700 Subject: [PATCH 298/387] simulators/ethereum/engine: Increase engine timeouts (#1075) --- simulators/ethereum/engine/client/hive_rpc/hive_rpc.go | 2 +- simulators/ethereum/engine/globals/globals.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/simulators/ethereum/engine/client/hive_rpc/hive_rpc.go b/simulators/ethereum/engine/client/hive_rpc/hive_rpc.go index d055d1d346..7d1c79a630 100644 --- a/simulators/ethereum/engine/client/hive_rpc/hive_rpc.go +++ b/simulators/ethereum/engine/client/hive_rpc/hive_rpc.go @@ -117,7 +117,7 @@ func (s HiveRPCEngineStarter) StartClient(T *hivesim.T, testContext context.Cont } func CheckEthEngineLive(c *hivesim.Client) error { - ctx, cancel := context.WithTimeout(context.Background(), time.Second*5) + ctx, cancel := context.WithTimeout(context.Background(), time.Second*10) defer cancel() var ( ticker = time.NewTicker(100 * time.Millisecond) diff --git a/simulators/ethereum/engine/globals/globals.go b/simulators/ethereum/engine/globals/globals.go index 2fa21b9eec..43aca349ad 100644 --- a/simulators/ethereum/engine/globals/globals.go +++ b/simulators/ethereum/engine/globals/globals.go @@ -47,7 +47,7 @@ var ( GenesisTimestamp = uint64(0x1234) // RPC Timeout for every call - RPCTimeout = 10 * time.Second + RPCTimeout = 20 * time.Second // Engine, Eth ports EthPortHTTP = 8545 From 5703ad216bd99c2b86d54a63923fbfb2a8f1b2da Mon Sep 17 00:00:00 2001 From: web3-developer <51288821+web3-developer@users.noreply.github.com> Date: Tue, 11 Jun 2024 18:48:56 +0800 Subject: [PATCH 299/387] clients/fluffy: Add --disable-state-root-validation to Fluffy startup options (#1118) --- clients/fluffy/fluffy.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/clients/fluffy/fluffy.sh b/clients/fluffy/fluffy.sh index 50c826c222..5e8c3afdeb 100755 --- a/clients/fluffy/fluffy.sh +++ b/clients/fluffy/fluffy.sh @@ -23,4 +23,5 @@ if [ "$HIVE_CLIENT_PRIVATE_KEY" != "" ]; then FLAGS="$FLAGS --netkey-unsafe=0x$HIVE_CLIENT_PRIVATE_KEY" fi -fluffy --rpc --rpc-address="0.0.0.0" --nat:extip:"$IP_ADDR" --portal-network=none --log-level="debug" $FLAGS +fluffy --log-level=INFO --rpc --rpc-address="0.0.0.0" --nat:extip:"$IP_ADDR" --portal-network=none \ + --log-level="debug" --disable-state-root-validation $FLAGS From 38b172052bb75450f7dc844c92db03a6a2743e59 Mon Sep 17 00:00:00 2001 From: Sina M <1591639+s1na@users.noreply.github.com> Date: Tue, 11 Jun 2024 17:28:58 +0200 Subject: [PATCH 300/387] simulators/ethereum/rpc-compat: bump buffer size for loading test (#1119) --- simulators/ethereum/rpc-compat/testload.go | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/simulators/ethereum/rpc-compat/testload.go b/simulators/ethereum/rpc-compat/testload.go index 57cd620a0c..207fb618a8 100644 --- a/simulators/ethereum/rpc-compat/testload.go +++ b/simulators/ethereum/rpc-compat/testload.go @@ -30,9 +30,11 @@ func loadTestFile(name string, r io.Reader) (rpcTest, error) { var ( rdr = bufio.NewReader(r) scan = bufio.NewScanner(rdr) + buf = make([]byte, 0, 64*1024) inHeader = true test = rpcTest{name: name} ) + scan.Buffer(buf, 1024*1024) for scan.Scan() { line := strings.TrimSpace(scan.Text()) switch { @@ -70,7 +72,7 @@ func loadTestFile(name string, r io.Reader) (rpcTest, error) { // loadTests walks the given directory looking for *.io files to load. func loadTests(t *hivesim.T, root string, re *regexp.Regexp) []rpcTest { var tests []rpcTest - filepath.Walk(root, func(path string, info os.FileInfo, err error) error { + err := filepath.Walk(root, func(path string, info os.FileInfo, err error) error { if err != nil { t.Logf("unable to walk path: %s", err) return err @@ -98,5 +100,8 @@ func loadTests(t *hivesim.T, root string, re *regexp.Regexp) []rpcTest { tests = append(tests, test) return nil }) + if err != nil { + t.Fatalf("failed to load tests: %s", err) + } return tests } From d61b11e51815a82937f7683dd7f1d25132673983 Mon Sep 17 00:00:00 2001 From: Chen Kai <281165273grape@gmail.com> Date: Fri, 14 Jun 2024 08:19:20 +0800 Subject: [PATCH 301/387] clients/shisui: enable nat in hive test (#1121) * feat:enable nat in hive test Signed-off-by: Chen Kai <281165273grape@gmail.com> * Update clients/shisui/shisui.sh Co-authored-by: Kolby Moroz Liebl <31669092+KolbyML@users.noreply.github.com> --------- Signed-off-by: Chen Kai <281165273grape@gmail.com> Co-authored-by: Kolby Moroz Liebl <31669092+KolbyML@users.noreply.github.com> --- clients/shisui/shisui.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/clients/shisui/shisui.sh b/clients/shisui/shisui.sh index cece7f2657..51cb1d8335 100644 --- a/clients/shisui/shisui.sh +++ b/clients/shisui/shisui.sh @@ -4,6 +4,7 @@ set -e FLAGS="" +IP_ADDR=$(hostname -i | awk '{print $1}') if [ "$HIVE_LOGLEVEL" != "" ]; then FLAGS="$FLAGS --loglevel $HIVE_LOGLEVEL" @@ -23,5 +24,7 @@ if [ "$HIVE_BOOTNODE" != "" ]; then FLAGS="$FLAGS --bootnodes=$HIVE_BOOTNODE" fi +FLAGS="$FLAGS --nat extip:$IP_ADDR" + app $FLAGS From 2abbb16808953b127e65e3530017e8a9c863ee41 Mon Sep 17 00:00:00 2001 From: Chen Kai <281165273grape@gmail.com> Date: Tue, 18 Jun 2024 22:34:11 +0800 Subject: [PATCH 302/387] clients/shisui: enable `none` bootnodes for portal hive test (#1124) feat:enable default bootnodes Signed-off-by: Chen Kai <281165273grape@gmail.com> --- clients/shisui/shisui.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/clients/shisui/shisui.sh b/clients/shisui/shisui.sh index 51cb1d8335..acc7f12cf5 100644 --- a/clients/shisui/shisui.sh +++ b/clients/shisui/shisui.sh @@ -22,6 +22,8 @@ fi if [ "$HIVE_BOOTNODE" != "" ]; then FLAGS="$FLAGS --bootnodes=$HIVE_BOOTNODE" +else + FLAGS="$FLAGS --bootnodes=none" fi FLAGS="$FLAGS --nat extip:$IP_ADDR" From 7ffba988d65328d786643759a15c3affcd527df4 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Thu, 20 Jun 2024 14:21:23 +0200 Subject: [PATCH 303/387] internal/libdocker: specify API version (#1125) Fixes #1006 --- internal/libdocker/builder.go | 9 +-------- internal/libdocker/docker.go | 6 ++++-- 2 files changed, 5 insertions(+), 10 deletions(-) diff --git a/internal/libdocker/builder.go b/internal/libdocker/builder.go index f0bbebb5eb..4731c9d415 100644 --- a/internal/libdocker/builder.go +++ b/internal/libdocker/builder.go @@ -11,10 +11,9 @@ import ( "path/filepath" "strings" + "github.com/ethereum/hive/internal/libhive" docker "github.com/fsouza/go-dockerclient" "gopkg.in/inconshreveable/log15.v2" - - "github.com/ethereum/hive/internal/libhive" ) // Builder takes care of building docker images. @@ -46,12 +45,6 @@ func (b *Builder) BuildClientImage(ctx context.Context, client libhive.ClientDes buildArgs := make([]docker.BuildArg, 0) for key, value := range client.BuildArgs { buildArgs = append(buildArgs, docker.BuildArg{Name: key, Value: value}) - - // Backwards-compatibility for non-updated client Dockerfiles. - // TODO(fjl): remove this when all clients have been updated to "tag". - if key == "tag" { - buildArgs = append(buildArgs, docker.BuildArg{Name: "branch", Value: value}) - } } err := b.buildImage(ctx, dir, dockerFile, tag, buildArgs) diff --git a/internal/libdocker/docker.go b/internal/libdocker/docker.go index c176038c42..bce064c1de 100644 --- a/internal/libdocker/docker.go +++ b/internal/libdocker/docker.go @@ -10,6 +10,8 @@ import ( "gopkg.in/inconshreveable/log15.v2" ) +const apiVersion = "1.25" + // Config is the configuration of the docker backend. type Config struct { Inventory libhive.Inventory @@ -39,9 +41,9 @@ func Connect(dockerEndpoint string, cfg *Config) (*Builder, *ContainerBackend, e var client *docker.Client var err error if dockerEndpoint == "" { - client, err = docker.NewClientFromEnv() + client, err = docker.NewVersionedClientFromEnv(apiVersion) } else { - client, err = docker.NewClient(dockerEndpoint) + client, err = docker.NewVersionedClient(apiVersion, dockerEndpoint) } if err != nil { return nil, nil, fmt.Errorf("can't connect to docker: %v", err) From 62b3362bae655754b5f624c36720ba8c44a2f375 Mon Sep 17 00:00:00 2001 From: Kolby Moroz Liebl <31669092+KolbyML@users.noreply.github.com> Date: Fri, 21 Jun 2024 21:12:12 +0900 Subject: [PATCH 304/387] hivesim-rs: add hivesim-rs a rust implementation of hivesim (#1126) --- .circleci/config.yml | 1 + .circleci/continue_config.yml | 32 +++- .gitignore | 4 +- hivesim-rs/Cargo.toml | 16 ++ hivesim-rs/src/lib.rs | 12 ++ hivesim-rs/src/macros.rs | 20 +++ hivesim-rs/src/simulation.rs | 178 +++++++++++++++++++ hivesim-rs/src/testapi.rs | 312 ++++++++++++++++++++++++++++++++++ hivesim-rs/src/testmatch.rs | 163 ++++++++++++++++++ hivesim-rs/src/types.rs | 77 +++++++++ hivesim-rs/src/utils.rs | 37 ++++ 11 files changed, 850 insertions(+), 2 deletions(-) create mode 100644 hivesim-rs/Cargo.toml create mode 100644 hivesim-rs/src/lib.rs create mode 100644 hivesim-rs/src/macros.rs create mode 100644 hivesim-rs/src/simulation.rs create mode 100644 hivesim-rs/src/testapi.rs create mode 100644 hivesim-rs/src/testmatch.rs create mode 100644 hivesim-rs/src/types.rs create mode 100644 hivesim-rs/src/utils.rs diff --git a/.circleci/config.yml b/.circleci/config.yml index 398b83fed2..5e5517d98d 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -10,5 +10,6 @@ workflows: jobs: - path-filtering/filter: mapping: | + hivesim-rs/.* hivesim-rs-ci true simulators/portal/.* rust-ci true base-revision: origin/master diff --git a/.circleci/continue_config.yml b/.circleci/continue_config.yml index d7c185cb9c..c284de4e20 100644 --- a/.circleci/continue_config.yml +++ b/.circleci/continue_config.yml @@ -6,6 +6,9 @@ parameters: rust-ci: type: boolean default: false + hivesim-rs-ci: + type: boolean + default: false jobs: # This job builds the hive executable and stores it in the workspace. @@ -73,6 +76,29 @@ jobs: name: "Compile Go simulators" command: ".circleci/compile-simulators.sh" # this makes sure the rust code is good + hivesim-rs: + docker: + - image: cimg/rust:1.75.0 + steps: + - checkout + - run: + name: Install rustfmt + command: rustup component add rustfmt + - run: + name: Install Clippy + command: rustup component add clippy + - run: + name: Install Clang + command: sudo apt update && sudo apt-get install clang -y + - run: + name: "Lint" + command: "cd hivesim-rs && cargo fmt --all -- --check" + - run: + name: "Build" + command: "cd hivesim-rs && cargo clippy --all --all-targets --all-features --no-deps -- --deny warnings" + - run: + name: "Test hivesim-rs" + command: "cd hivesim-rs && cargo test --workspace -- --nocapture" rust-simulators: docker: - image: cimg/rust:1.75.0 @@ -100,7 +126,11 @@ workflows: requires: ["build"] - smoke-tests-remote-docker: requires: ["build"] - rust-jobs: + rust-simulator-jobs: when: << pipeline.parameters.rust-ci >> jobs: - rust-simulators + hivesim-rs-jobs: + when: << pipeline.parameters.hivesim-rs-ci >> + jobs: + - hivesim-rs diff --git a/.gitignore b/.gitignore index eead5cce5d..9335372ced 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,8 @@ workspace # build output /hive -# build output for rust simulators files +# build output for rust simulators and hivesim-rs files simulators/**/Cargo.lock simulators/**/target +hivesim-rs/Cargo.lock +hivesim-rs/target diff --git a/hivesim-rs/Cargo.toml b/hivesim-rs/Cargo.toml new file mode 100644 index 0000000000..0e1f1e7622 --- /dev/null +++ b/hivesim-rs/Cargo.toml @@ -0,0 +1,16 @@ +[package] +name = "hivesim" +version = "0.1.0-alpha.1" +authors = ["Kolby ML (Moroz Liebl) ", "Ognyan Genev "] +edition = "2021" + + +[dependencies] +async-trait = "0.1.59" +dyn-clone = "1.0.11" +jsonrpsee = {version="0.20.0", features = ["client"]} +regex = "1.10.5" +reqwest = { version = "0.11.12", default-features = false, features = ["json", "multipart"] } +serde = { version = "1.0.147", features = ["derive"] } +serde_json = "1.0.87" +tokio = { version = "1", features = ["full"] } diff --git a/hivesim-rs/src/lib.rs b/hivesim-rs/src/lib.rs new file mode 100644 index 0000000000..bc842a9fb3 --- /dev/null +++ b/hivesim-rs/src/lib.rs @@ -0,0 +1,12 @@ +#![allow(dead_code)] +#![warn(clippy::unwrap_used)] +mod macros; +mod simulation; +mod testapi; +mod testmatch; +pub mod types; +pub mod utils; + +pub use simulation::Simulation; +pub use testapi::{run_suite, Client, NClientTestSpec, Suite, Test, TestSpec}; +pub use testmatch::TestMatcher; diff --git a/hivesim-rs/src/macros.rs b/hivesim-rs/src/macros.rs new file mode 100644 index 0000000000..397998e968 --- /dev/null +++ b/hivesim-rs/src/macros.rs @@ -0,0 +1,20 @@ +#[macro_export] +macro_rules! dyn_async {( + $( #[$attr:meta] )* // includes doc strings + $pub:vis + async + fn $fname:ident<$lt:lifetime> ( $($args:tt)* ) $(-> $Ret:ty)? + { + $($body:tt)* + } +) => ( + $( #[$attr] )* + #[allow(unused_parens)] + $pub + fn $fname<$lt> ( $($args)* ) -> ::std::pin::Pin<::std::boxed::Box< + dyn $lt + Send + ::std::future::Future + >> + { + Box::pin(async move { $($body)* }) + } +)} diff --git a/hivesim-rs/src/simulation.rs b/hivesim-rs/src/simulation.rs new file mode 100644 index 0000000000..d934880280 --- /dev/null +++ b/hivesim-rs/src/simulation.rs @@ -0,0 +1,178 @@ +use crate::types::{ClientDefinition, StartNodeResponse, SuiteID, TestID, TestRequest, TestResult}; +use crate::TestMatcher; +use std::collections::HashMap; +use std::env; +use std::net::IpAddr; +use std::str::FromStr; + +/// Wraps the simulation HTTP API provided by hive. +#[derive(Clone, Debug)] +pub struct Simulation { + pub url: String, + pub test_matcher: Option, +} + +impl Default for Simulation { + fn default() -> Self { + Self::new() + } +} + +// A struct in the structure of the JSON config shown in simulators.md +// it is used to pass information to the Hive Simulators +#[derive(serde::Serialize, serde::Deserialize)] +struct SimulatorConfig { + client: String, + environment: HashMap, +} + +impl SimulatorConfig { + pub fn new() -> Self { + Self { + client: "".to_string(), + environment: Default::default(), + } + } +} + +impl Simulation { + /// New looks up the hive host URI using the HIVE_SIMULATOR environment variable + /// and connects to it. It will panic if HIVE_SIMULATOR is not set. + pub fn new() -> Self { + let url = env::var("HIVE_SIMULATOR").expect("HIVE_SIMULATOR environment variable not set"); + let test_matcher = match env::var("HIVE_TEST_PATTERN") { + Ok(pattern) => { + if pattern.is_empty() { + None + } else { + Some(TestMatcher::new(&pattern)) + } + } + Err(_) => None, + }; + + if url.is_empty() { + panic!("HIVE_SIMULATOR environment variable is empty") + } + + Self { url, test_matcher } + } + + pub async fn start_suite( + &self, + name: String, + description: String, + _sim_log: String, + ) -> SuiteID { + let url = format!("{}/testsuite", self.url); + let client = reqwest::Client::new(); + let body = TestRequest { name, description }; + + client + .post(url) + .json(&body) + .send() + .await + .expect("Failed to send start suite request") + .json::() + .await + .expect("Failed to convert start suite response to json") + } + + pub async fn end_suite(&self, test_suite: SuiteID) { + let url = format!("{}/testsuite/{}", self.url, test_suite); + let client = reqwest::Client::new(); + client + .delete(url) + .send() + .await + .expect("Failed to send an end suite request"); + } + + /// Starts a new test case, returning the testcase id as a context identifier + pub async fn start_test( + &self, + test_suite: SuiteID, + name: String, + description: String, + ) -> TestID { + let url = format!("{}/testsuite/{}/test", self.url, test_suite); + let client = reqwest::Client::new(); + let body = TestRequest { name, description }; + + client + .post(url) + .json(&body) + .send() + .await + .expect("Failed to send start test request") + .json::() + .await + .expect("Failed to convert start test response to json") + } + + /// Finishes the test case, cleaning up everything, logging results, and returning + /// an error if the process could not be completed. + pub async fn end_test(&self, test_suite: SuiteID, test: TestID, test_result: TestResult) { + let url = format!("{}/testsuite/{}/test/{}", self.url, test_suite, test); + let client = reqwest::Client::new(); + + client + .post(url) + .json(&test_result) + .send() + .await + .expect("Failed to send end test request"); + } + + /// Starts a new node (or other container). + /// Returns container id and ip. + pub async fn start_client( + &self, + test_suite: SuiteID, + test: TestID, + client_type: String, + environment: Option>, + ) -> (String, IpAddr) { + let url = format!("{}/testsuite/{}/test/{}/node", self.url, test_suite, test); + let client = reqwest::Client::new(); + + let mut config = SimulatorConfig::new(); + config.client = client_type; + if let Some(environment) = environment { + config.environment = environment; + } + + let config = serde_json::to_string(&config).expect("Failed to parse config to serde_json"); + let form = reqwest::multipart::Form::new().text("config", config); + + let resp = client + .post(url) + .multipart(form) + .send() + .await + .expect("Failed to send start client request") + .json::() + .await + .expect("Failed to convert start node response to json"); + + let ip = IpAddr::from_str(&resp.ip).expect("Failed to decode IpAddr from string"); + + (resp.id, ip) + } + + /// Returns all client types available to this simulator run. This depends on + /// both the available client set and the command line filters. + pub async fn client_types(&self) -> Vec { + let url = format!("{}/clients", self.url); + let client = reqwest::Client::new(); + client + .get(&url) + .send() + .await + .expect("Failed to send get client types request") + .json::>() + .await + .expect("Failed to convert client types response to json") + } +} diff --git a/hivesim-rs/src/testapi.rs b/hivesim-rs/src/testapi.rs new file mode 100644 index 0000000000..985632abb5 --- /dev/null +++ b/hivesim-rs/src/testapi.rs @@ -0,0 +1,312 @@ +use crate::types::{ClientDefinition, SuiteID, TestData, TestID, TestResult}; +use crate::Simulation; +use ::std::{boxed::Box, future::Future, pin::Pin}; +use async_trait::async_trait; +use core::fmt::Debug; +use dyn_clone::DynClone; +use jsonrpsee::http_client::{HttpClient, HttpClientBuilder}; +use std::collections::HashMap; +use std::net::IpAddr; + +use crate::utils::extract_test_results; + +pub type AsyncTestFunc = fn( + &mut Test, + Option, +) -> Pin< + Box< + dyn Future // future API / pollable + + Send // required by non-single-threaded executors + + '_, + >, +>; + +pub type AsyncNClientsTestFunc = fn( + Vec, + Option, +) -> Pin< + Box< + dyn Future // future API / pollable + + Send // required by non-single-threaded executors + + 'static, + >, +>; + +#[async_trait] +pub trait Testable: DynClone + Send + Sync { + async fn run_test(&self, simulation: Simulation, suite_id: SuiteID, suite: Suite); +} + +impl Debug for dyn Testable { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + write!(f, "Testable") + } +} + +dyn_clone::clone_trait_object!(Testable); +/// Description of a test suite +#[derive(Clone, Debug)] +pub struct Suite { + pub name: String, + pub description: String, + pub tests: Vec>, +} + +impl Suite { + pub fn add(&mut self, test: T) { + self.tests.push(Box::new(test)) + } +} + +/// Represents a running client. +#[derive(Debug, Clone)] +pub struct Client { + pub kind: String, + pub container: String, + pub ip: IpAddr, + pub rpc: HttpClient, + pub test: Test, +} + +#[derive(Clone, Debug)] +pub struct TestRun { + pub suite_id: SuiteID, + pub suite: Suite, + pub name: String, + pub desc: String, + pub always_run: bool, +} + +/// A running test +#[derive(Clone, Debug)] +pub struct Test { + pub sim: Simulation, + pub test_id: TestID, + pub suite: Suite, + pub suite_id: SuiteID, + pub result: TestResult, +} + +impl Test { + pub async fn start_client( + &self, + client_type: String, + environment: Option>, + ) -> Client { + let (container, ip) = self + .sim + .start_client( + self.suite_id, + self.test_id, + client_type.clone(), + environment, + ) + .await; + + let rpc_url = format!("http://{}:8545", ip); + + let rpc_client = HttpClientBuilder::default() + .build(rpc_url) + .expect("Failed to build rpc_client"); + + Client { + kind: client_type, + container, + ip, + rpc: rpc_client, + test: Test { + sim: self.sim.clone(), + test_id: self.test_id, + suite: self.suite.clone(), + suite_id: self.suite_id, + result: self.result.clone(), + }, + } + } + + /// Runs a subtest of this test. + pub async fn run(&self, spec: impl Testable) { + spec.run_test(self.sim.clone(), self.suite_id, self.suite.clone()) + .await + } +} + +#[derive(Clone)] +pub struct TestSpec { + // These fields are displayed in the UI. Be sure to add + // a meaningful description here. + pub name: String, + pub description: String, + // If AlwaysRun is true, the test will run even if Name does not match the test + // pattern. This option is useful for tests that launch a client instance and + // then perform further tests against it. + pub always_run: bool, + // The Run function is invoked when the test executes. + pub run: AsyncTestFunc, + pub client: Option, +} + +#[async_trait] +impl Testable for TestSpec { + async fn run_test(&self, simulation: Simulation, suite_id: SuiteID, suite: Suite) { + if let Some(test_match) = simulation.test_matcher.clone() { + if !self.always_run && !test_match.match_test(&suite.name, &self.name) { + return; + } + } + + let test_run = TestRun { + suite_id, + suite, + name: self.name.to_owned(), + desc: self.description.to_owned(), + always_run: self.always_run, + }; + + run_test(simulation, test_run, self.client.clone(), self.run).await; + } +} + +pub async fn run_test( + host: Simulation, + test: TestRun, + client: Option, + func: AsyncTestFunc, +) { + // Register test on simulation server and initialize the T. + let test_id = host.start_test(test.suite_id, test.name, test.desc).await; + let suite_id = test.suite_id; + + // run test function + let cloned_host = host.clone(); + + let test_result = extract_test_results( + tokio::spawn(async move { + let test = &mut Test { + sim: cloned_host, + test_id, + suite: test.suite, + suite_id, + result: Default::default(), + }; + + test.result.pass = true; + + // run test function + (func)(test, client).await; + }) + .await, + ); + + host.end_test(suite_id, test_id, test_result).await; +} + +#[derive(Clone)] +pub struct NClientTestSpec { + /// These fields are displayed in the UI. Be sure to add + /// a meaningful description here. + pub name: String, + pub description: String, + /// If AlwaysRun is true, the test will run even if Name does not match the test + /// pattern. This option is useful for tests that launch a client instance and + /// then perform further tests against it. + pub always_run: bool, + /// The Run function is invoked when the test executes. + pub run: AsyncNClientsTestFunc, + /// For each client, there is a distinct map of Hive Environment Variable names to values. + /// The environments must be in the same order as the `clients` + pub environments: Option>>>, + /// test data which can be passed to the test + pub test_data: Option, + pub clients: Vec, +} + +#[async_trait] +impl Testable for NClientTestSpec { + async fn run_test(&self, simulation: Simulation, suite_id: SuiteID, suite: Suite) { + if let Some(test_match) = simulation.test_matcher.clone() { + if !self.always_run && !test_match.match_test(&suite.name, &self.name) { + return; + } + } + + let test_run = TestRun { + suite_id, + suite, + name: self.name.to_owned(), + desc: self.description.to_owned(), + always_run: self.always_run, + }; + + run_n_client_test( + simulation, + test_run, + self.environments.to_owned(), + self.test_data.to_owned(), + self.clients.to_owned(), + self.run, + ) + .await; + } +} + +// Write a test that runs against N clients. +async fn run_n_client_test( + host: Simulation, + test: TestRun, + environments: Option>>>, + test_data: Option, + clients: Vec, + func: AsyncNClientsTestFunc, +) { + // Register test on simulation server and initialize the T. + let test_id = host.start_test(test.suite_id, test.name, test.desc).await; + let suite_id = test.suite_id; + + // run test function + let cloned_host = host.clone(); + let test_result = extract_test_results( + tokio::spawn(async move { + let test = &mut Test { + sim: cloned_host, + test_id, + suite: test.suite, + suite_id, + result: Default::default(), + }; + + test.result.pass = true; + + let mut client_vec: Vec = Vec::new(); + let env_iter = environments.unwrap_or(vec![None; clients.len()]); + for (client, environment) in clients.into_iter().zip(env_iter) { + client_vec.push(test.start_client(client.name.to_owned(), environment).await); + } + (func)(client_vec, test_data).await; + }) + .await, + ); + + host.end_test(suite_id, test_id, test_result).await; +} + +pub async fn run_suite(host: Simulation, suites: Vec) { + for suite in suites { + if let Some(test_match) = host.test_matcher.clone() { + if !test_match.match_test(&suite.name, "") { + continue; + } + } + + let name = suite.clone().name; + let description = suite.clone().description; + + let suite_id = host.start_suite(name, description, "".to_string()).await; + + for test in &suite.tests { + test.run_test(host.clone(), suite_id, suite.clone()).await; + } + + host.end_suite(suite_id).await; + } +} diff --git a/hivesim-rs/src/testmatch.rs b/hivesim-rs/src/testmatch.rs new file mode 100644 index 0000000000..fbf5f8199a --- /dev/null +++ b/hivesim-rs/src/testmatch.rs @@ -0,0 +1,163 @@ +use regex::Regex; + +#[derive(Clone, Debug)] +pub struct TestMatcher { + pub suite: Regex, + pub test: Regex, + pub pattern: String, +} + +impl TestMatcher { + pub fn new(pattern: &str) -> Self { + let parts = Self::split_regexp(pattern); + let suite = + Regex::new(&format!("(?i:{})", parts[0])).expect("Failed to compile suite regex"); + let test = if parts.len() > 1 { + Regex::new(&format!("(?i:{})", parts[1..].join("/"))) + .expect("Failed to compile test regex") + } else { + Regex::new("").expect("Failed to compile empty regex") + }; + Self { + suite, + test, + pattern: pattern.to_string(), + } + } + + pub fn match_test(&self, suite: &str, test: &str) -> bool { + if !self.suite.is_match(suite) { + return false; + } + + if !test.is_empty() && !self.test.is_match(test) { + return false; + } + + true + } + + /// split_regexp splits the pattern into /-separated parts. + /// This is based off the golang implementation of testmatch.rs + fn split_regexp(pattern: &str) -> Vec<&str> { + let mut pattern = pattern; + let mut parts = Vec::with_capacity(pattern.matches('/').count()); + let mut square_bracket_counter = 0; + let mut parenthesis_counter = 0; + let mut index = 0; + while index < pattern.len() { + match pattern + .chars() + .nth(index) + .expect("While loop shouldn't allow out of bounds access") + { + '[' => square_bracket_counter += 1, + ']' => { + if square_bracket_counter > 0 { + square_bracket_counter -= 1; + } + } + '(' => { + if square_bracket_counter == 0 { + parenthesis_counter += 1; + } + } + ')' => { + if square_bracket_counter == 0 { + parenthesis_counter -= 1; + } + } + '\\' => { + index += 1; + } + '/' => { + if square_bracket_counter == 0 && parenthesis_counter == 0 { + parts.push(&pattern[..index]); + pattern = &pattern[index + 1..]; + index = 0; + continue; + } + } + _ => {} + } + index += 1; + } + parts.push(pattern); + parts + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_split_regexp() { + let pattern = "suite/test"; + let parts = TestMatcher::split_regexp(pattern); + assert_eq!(parts, vec!["suite", "test"]); + + let pattern = "suite/test/1"; + let parts = TestMatcher::split_regexp(pattern); + assert_eq!(parts, vec!["suite", "test", "1"]); + + let pattern = "suite/test/1/2"; + let parts = TestMatcher::split_regexp(pattern); + assert_eq!(parts, vec!["suite", "test", "1", "2"]); + + let pattern = "suite/test/1/2/3"; + let parts = TestMatcher::split_regexp(pattern); + assert_eq!(parts, vec!["suite", "test", "1", "2", "3"]); + + let pattern = "suite/test/1/2/3/4"; + let parts = TestMatcher::split_regexp(pattern); + assert_eq!(parts, vec!["suite", "test", "1", "2", "3", "4"]); + + let pattern = "suite/test/1/2/3/4/5"; + let parts = TestMatcher::split_regexp(pattern); + assert_eq!(parts, vec!["suite", "test", "1", "2", "3", "4", "5"]); + + let pattern = "suite/test/1/2/3/4/5/6"; + let parts = TestMatcher::split_regexp(pattern); + assert_eq!(parts, vec!["suite", "test", "1", "2", "3", "4", "5", "6"]); + + let pattern = "suite/test/1/2/3/4/5/6/7"; + let parts = TestMatcher::split_regexp(pattern); + assert_eq!( + parts, + vec!["suite", "test", "1", "2", "3", "4", "5", "6", "7"] + ); + } + + #[test] + fn test_match_test() { + let matcher = TestMatcher::new("sim/test"); + + assert!(matcher.match_test("sim", "test")); + assert!(matcher.match_test("Sim", "Test")); + assert!(matcher.match_test("Sim", "TestTest")); + assert!(!matcher.match_test("Sim", "Tst")); + + let matcher = TestMatcher::new("/test"); + + assert!(matcher.match_test("sim", "test")); + assert!(matcher.match_test("", "Test")); + assert!(matcher.match_test("", "aTesta")); + assert!(matcher.match_test("bob", "test")); + + let matcher = TestMatcher::new("/GetEnr"); + assert!(matcher.match_test("history-rpc-compat", "portal_historyGetEnr Local Enr"),); + } + + #[test] + fn test_match_suite() { + let matcher = TestMatcher::new("sim"); + + assert!(matcher.match_test("sim", "")); + assert!(matcher.match_test("Sim", "")); + assert!(matcher.match_test("Sim", "Test")); + assert!(matcher.match_test("Sim", "Tst")); + assert!(matcher.match_test("Sim", "Tst")); + assert!(matcher.match_test("Sim", "Tst")); + } +} diff --git a/hivesim-rs/src/types.rs b/hivesim-rs/src/types.rs new file mode 100644 index 0000000000..66cf36e74b --- /dev/null +++ b/hivesim-rs/src/types.rs @@ -0,0 +1,77 @@ +use serde::{Deserialize, Serialize}; + +pub type SuiteID = u32; +pub type TestID = u32; + +/// StartNodeReponse is returned by the client startup endpoint. +#[derive(Clone, Debug, Default, Serialize, Deserialize)] +pub struct StartNodeResponse { + pub id: String, // Container ID. + pub ip: String, // IP address in bridge network +} + +// ClientMetadata is part of the ClientDefinition and lists metadata +#[derive(Clone, Debug, Serialize, Deserialize)] +pub struct ClientMetadata { + pub roles: Vec, +} + +// ClientDefinition is served by the /clients API endpoint to list the available clients +#[derive(Clone, Debug, Serialize, Deserialize)] +pub struct ClientDefinition { + pub name: String, + pub version: String, + pub meta: ClientMetadata, +} + +#[derive(Clone, Debug, Serialize, Deserialize)] +pub struct TestRequest { + pub name: String, + pub description: String, +} + +/// Describes the outcome of a test. +#[derive(Clone, Debug, Default, Serialize, Deserialize)] +pub struct TestResult { + pub pass: bool, + pub details: String, +} + +#[derive(Clone, Debug)] +pub struct ContentKeyValue { + pub key: String, + pub value: String, +} + +#[derive(Clone, Debug)] +pub struct ContentKeyOfferLookupValues { + pub key: String, + pub offer_value: String, + pub lookup_value: String, +} + +#[derive(Clone, Debug)] +pub enum TestData { + /// A list of tuples containing content key/value pairs + ContentList(Vec), + /// A list of tuples containing a content key, offer value, and lookup value + StateContentList(Vec), +} + +impl TestData { + pub fn content_list(self) -> Vec { + if let TestData::ContentList(content_list) = self { + content_list + } else { + panic!("TestData didn't contain ContentList: enum was likely filled with the wrong data {self:?}") + } + } + + pub fn state_content_list(self) -> Vec { + if let TestData::StateContentList(state_content_list) = self { + state_content_list + } else { + panic!("TestData didn't contain StateContentList: enum was likely filled with the wrong data {self:?}") + } + } +} diff --git a/hivesim-rs/src/utils.rs b/hivesim-rs/src/utils.rs new file mode 100644 index 0000000000..3e1eabc903 --- /dev/null +++ b/hivesim-rs/src/utils.rs @@ -0,0 +1,37 @@ +use crate::types::TestResult; +use tokio::task::JoinError; + +/// Ensures that 'name' contains the client type. +pub fn client_test_name(name: String, client_type: String) -> String { + if name.is_empty() { + return client_type; + } + if name.contains("CLIENT") { + return name.replace("CLIENT", &client_type); + } + format!("{} ({})", name, client_type) +} + +pub fn extract_test_results(join_handle: Result<(), JoinError>) -> TestResult { + match join_handle { + Ok(()) => TestResult { + pass: true, + details: "".to_string(), + }, + Err(err) => { + let err = err.into_panic(); + let err = if let Some(err) = err.downcast_ref::<&'static str>() { + err.to_string() + } else if let Some(err) = err.downcast_ref::() { + err.clone() + } else { + format!("?{:?}", err) + }; + + TestResult { + pass: false, + details: err, + } + } + } +} From 7b407a5e0d1ccc73af327ff78c65c8da807036b8 Mon Sep 17 00:00:00 2001 From: Kolby Moroz Liebl <31669092+KolbyML@users.noreply.github.com> Date: Fri, 21 Jun 2024 22:27:21 +0900 Subject: [PATCH 305/387] simulators/portal: update simulators to use updated hivesim-rs with sim.limit support (#1127) --- simulators/portal/beacon/Cargo.toml | 2 +- simulators/portal/beacon/src/main.rs | 17 +---------------- simulators/portal/history/Cargo.toml | 2 +- simulators/portal/history/src/main.rs | 17 +---------------- simulators/portal/state/Cargo.toml | 2 +- simulators/portal/state/src/main.rs | 17 +---------------- 6 files changed, 6 insertions(+), 51 deletions(-) diff --git a/simulators/portal/beacon/Cargo.toml b/simulators/portal/beacon/Cargo.toml index c6e5f9b628..e3c9acc14e 100755 --- a/simulators/portal/beacon/Cargo.toml +++ b/simulators/portal/beacon/Cargo.toml @@ -6,7 +6,7 @@ edition = "2021" [dependencies] ethportal-api = { git = "https://github.com/ethereum/trin", rev = "33ea99da64216899f7ab2778d117a18506d963dd" } -hivesim = { git = "https://github.com/ethereum/portal-hive", rev = "0f830ea8999f2878eb78ef67efc9f80cc888413e" } +hivesim = { git = "https://github.com/ethereum/hive", rev = "62b3362bae655754b5f624c36720ba8c44a2f375" } futures = "0.3.25" itertools = "0.10.5" serde_yaml = "0.9" diff --git a/simulators/portal/beacon/src/main.rs b/simulators/portal/beacon/src/main.rs index 9b80ba675c..9f5ad2aea2 100644 --- a/simulators/portal/beacon/src/main.rs +++ b/simulators/portal/beacon/src/main.rs @@ -1,6 +1,6 @@ mod suites; -use hivesim::{Simulation, Suite, TestSpec}; +use hivesim::{run_suite, Simulation, Suite, TestSpec}; use suites::interop::test_portal_interop; use suites::mesh::test_portal_scenarios; use suites::rpc_compat::run_rpc_compat_test_suite; @@ -60,18 +60,3 @@ async fn main() { let sim = Simulation::new(); run_suite(sim, vec![beacon_rpc_compat, interop, mesh]).await; } - -async fn run_suite(host: Simulation, suites: Vec) { - for suite in suites { - let name = suite.clone().name; - let description = suite.clone().description; - - let suite_id = host.start_suite(name, description, "".to_string()).await; - - for test in &suite.tests { - test.run_test(host.clone(), suite_id, suite.clone()).await; - } - - host.end_suite(suite_id).await; - } -} diff --git a/simulators/portal/history/Cargo.toml b/simulators/portal/history/Cargo.toml index 766b690659..d0ceda4cb8 100755 --- a/simulators/portal/history/Cargo.toml +++ b/simulators/portal/history/Cargo.toml @@ -7,7 +7,7 @@ edition = "2021" [dependencies] ethportal-api = { git = "https://github.com/ethereum/trin", rev = "33ea99da64216899f7ab2778d117a18506d963dd" } portal-spec-test-utils-rs = { git = "https://github.com/ethereum/portal-spec-tests", rev = "954f7d0eb2950a2131048404a1a4ce476bb64657" } -hivesim = { git = "https://github.com/ethereum/portal-hive", rev = "0f830ea8999f2878eb78ef67efc9f80cc888413e" } +hivesim = { git = "https://github.com/ethereum/hive", rev = "62b3362bae655754b5f624c36720ba8c44a2f375" } futures = "0.3.25" serde_json = "1.0.87" tracing = "0.1.37" diff --git a/simulators/portal/history/src/main.rs b/simulators/portal/history/src/main.rs index 39216444fa..188b9339b3 100644 --- a/simulators/portal/history/src/main.rs +++ b/simulators/portal/history/src/main.rs @@ -1,6 +1,6 @@ pub mod suites; -use hivesim::{Simulation, Suite, TestSpec}; +use hivesim::{run_suite, Simulation, Suite, TestSpec}; use suites::interop::test_portal_interop; use suites::mesh::test_portal_scenarios; use suites::rpc_compat::run_rpc_compat_test_suite; @@ -75,18 +75,3 @@ async fn main() { let sim = Simulation::new(); run_suite(sim, vec![rpc_compat, interop, mesh, trin_bridge]).await; } - -async fn run_suite(host: Simulation, suites: Vec) { - for suite in suites { - let name = suite.clone().name; - let description = suite.clone().description; - - let suite_id = host.start_suite(name, description, "".to_string()).await; - - for test in &suite.tests { - test.run_test(host.clone(), suite_id, suite.clone()).await; - } - - host.end_suite(suite_id).await; - } -} diff --git a/simulators/portal/state/Cargo.toml b/simulators/portal/state/Cargo.toml index 745dab2ee6..a6c53d8a6c 100755 --- a/simulators/portal/state/Cargo.toml +++ b/simulators/portal/state/Cargo.toml @@ -6,7 +6,7 @@ edition = "2021" [dependencies] ethportal-api = { git = "https://github.com/ethereum/trin", rev = "33ea99da64216899f7ab2778d117a18506d963dd" } -hivesim = { git = "https://github.com/ethereum/portal-hive", rev = "0f830ea8999f2878eb78ef67efc9f80cc888413e" } +hivesim = { git = "https://github.com/ethereum/hive", rev = "62b3362bae655754b5f624c36720ba8c44a2f375" } futures = "0.3.25" itertools = "0.10.5" serde_json = "1.0.87" diff --git a/simulators/portal/state/src/main.rs b/simulators/portal/state/src/main.rs index ef286b1623..14a0bb2ce1 100644 --- a/simulators/portal/state/src/main.rs +++ b/simulators/portal/state/src/main.rs @@ -1,6 +1,6 @@ mod suites; -use hivesim::{Simulation, Suite, TestSpec}; +use hivesim::{run_suite, Simulation, Suite, TestSpec}; use suites::interop::test_portal_interop; use suites::rpc_compat::run_rpc_compat_test_suite; @@ -44,18 +44,3 @@ async fn main() { let sim = Simulation::new(); run_suite(sim, vec![state_rpc_compat, interop]).await; } - -async fn run_suite(host: Simulation, suites: Vec) { - for suite in suites { - let name = suite.clone().name; - let description = suite.clone().description; - - let suite_id = host.start_suite(name, description, "".to_string()).await; - - for test in &suite.tests { - test.run_test(host.clone(), suite_id, suite.clone()).await; - } - - host.end_suite(suite_id).await; - } -} From c247cec369d344583179665cce4f6181480d6b47 Mon Sep 17 00:00:00 2001 From: Emilia Hane Date: Tue, 25 Jun 2024 13:04:59 +0200 Subject: [PATCH 306/387] clients/reth: enable discv5 (#1128) --- clients/reth/reth.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/clients/reth/reth.sh b/clients/reth/reth.sh index 40db5e3750..9f6aa1337e 100644 --- a/clients/reth/reth.sh +++ b/clients/reth/reth.sh @@ -159,6 +159,9 @@ fi # Configure NAT FLAGS="$FLAGS --nat none" +# Configure discv5. +FLAGS="$FLAGS --enable.discv5.discovery --discovery.v5.port=30303" + # Launch the main client. echo "Running reth with flags: $FLAGS" RUST_LOG=info $reth node $FLAGS From d9020d2ddd4a85f5ea5e3b26e7778ed9ba01acc6 Mon Sep 17 00:00:00 2001 From: Emilia Hane Date: Tue, 25 Jun 2024 15:09:59 +0200 Subject: [PATCH 307/387] clients/reth: revert pull/1128 (#1129) --- clients/reth/reth.sh | 3 --- 1 file changed, 3 deletions(-) diff --git a/clients/reth/reth.sh b/clients/reth/reth.sh index 9f6aa1337e..40db5e3750 100644 --- a/clients/reth/reth.sh +++ b/clients/reth/reth.sh @@ -159,9 +159,6 @@ fi # Configure NAT FLAGS="$FLAGS --nat none" -# Configure discv5. -FLAGS="$FLAGS --enable.discv5.discovery --discovery.v5.port=30303" - # Launch the main client. echo "Running reth with flags: $FLAGS" RUST_LOG=info $reth node $FLAGS From 85ee1faae6e1509655fc0bea3a8cf49bbc5a11f1 Mon Sep 17 00:00:00 2001 From: Jochem Brouwer Date: Wed, 3 Jul 2024 22:23:13 +0200 Subject: [PATCH 308/387] clients/ethereumjs: fix for null storage in mapper (#1134) --- clients/ethereumjs/mapper.jq | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/clients/ethereumjs/mapper.jq b/clients/ethereumjs/mapper.jq index 3fe8480c98..db790c9cf0 100644 --- a/clients/ethereumjs/mapper.jq +++ b/clients/ethereumjs/mapper.jq @@ -30,8 +30,8 @@ def to_bool: # Pads storage keys to 32 bytes. def pad_storage_keys: - .alloc |= with_entries( - .value.storage |= with_entries( + .alloc |= (if . == null then . else with_entries( + .value.storage |= (if . == null then . else with_entries( .key |= (if . == null then . else if startswith("0x") then "0x" + (.[2:] | if length < 64 then ("0" * (64 - length)) + . else . end) @@ -39,8 +39,8 @@ def pad_storage_keys: "0x" + (if length < 64 then ("0" * (64 - length)) + . else . end) end end) - ) - ) + ) end) + ) end) ; # Replace config in input. From 7ea610c96f4c8f2ec74c6471b5bf8e58d741233e Mon Sep 17 00:00:00 2001 From: joshieDo <93316087+joshieDo@users.noreply.github.com> Date: Wed, 3 Jul 2024 22:39:25 +0200 Subject: [PATCH 309/387] simulators/ethereum/engine: lower withdrawals test timeout to 240s (#1133) lower timeout from 6000s to 240s --- simulators/ethereum/engine/suites/withdrawals/tests.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/simulators/ethereum/engine/suites/withdrawals/tests.go b/simulators/ethereum/engine/suites/withdrawals/tests.go index b2a405933a..db9cd35197 100644 --- a/simulators/ethereum/engine/suites/withdrawals/tests.go +++ b/simulators/ethereum/engine/suites/withdrawals/tests.go @@ -215,7 +215,7 @@ var Tests = []test.Spec{ - Spawn a secondary client and send FCUV2(head) - Wait for sync and verify withdrawn account's balance `, - TimeoutSeconds: 6000, + TimeoutSeconds: 240, }, WithdrawalsForkHeight: 1, WithdrawalsBlockCount: 2, From d67080aefcfd1a8da30e6ae358fbc157338f5ac9 Mon Sep 17 00:00:00 2001 From: Kim De Mey Date: Wed, 10 Jul 2024 15:05:46 +0200 Subject: [PATCH 310/387] clients/fluffy: Update to the new subnetworks and network cli flags (#1136) --- clients/fluffy/fluffy.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/clients/fluffy/fluffy.sh b/clients/fluffy/fluffy.sh index 5e8c3afdeb..91b0c53b87 100755 --- a/clients/fluffy/fluffy.sh +++ b/clients/fluffy/fluffy.sh @@ -7,7 +7,7 @@ IP_ADDR=$(hostname -i | awk '{print $1}') FLAGS="" if [ "$HIVE_PORTAL_NETWORKS_SELECTED" != "" ]; then - FLAGS="$FLAGS --networks=$HIVE_PORTAL_NETWORKS_SELECTED" + FLAGS="$FLAGS --portal-subnetworks=$HIVE_PORTAL_NETWORKS_SELECTED" if [[ $HIVE_PORTAL_NETWORKS_SELECTED =~ "beacon" ]]; then # Providing a trusted block root is required currently to fully enable the beacon network. @@ -15,7 +15,7 @@ if [ "$HIVE_PORTAL_NETWORKS_SELECTED" != "" ]; then FLAGS="$FLAGS --trusted-block-root:0x0000000000000000000000000000000000000000000000000000000000000000" fi else - FLAGS="$FLAGS --networks=history" + FLAGS="$FLAGS --portal-subnetworks=history" fi @@ -23,5 +23,5 @@ if [ "$HIVE_CLIENT_PRIVATE_KEY" != "" ]; then FLAGS="$FLAGS --netkey-unsafe=0x$HIVE_CLIENT_PRIVATE_KEY" fi -fluffy --log-level=INFO --rpc --rpc-address="0.0.0.0" --nat:extip:"$IP_ADDR" --portal-network=none \ +fluffy --log-level=INFO --rpc --rpc-address="0.0.0.0" --nat:extip:"$IP_ADDR" --network=none \ --log-level="debug" --disable-state-root-validation $FLAGS From 6f37e792a69775dc4faf2a5a57779042daf58546 Mon Sep 17 00:00:00 2001 From: winsvega Date: Mon, 15 Jul 2024 15:25:19 +0300 Subject: [PATCH 311/387] simulators/ethereum/consensus: split test suites (#1130) Split the test suites to allow running only current consensus tests. There are now three suites which can be selected via --sim.limit: # run develop bc tests ./hive --sim consensus --sim.limit "consensus/add11" # run legacy tests from frontier to constantinople ./hive --sim consensus --sim.limit "legacy/add11" # run legacy tests from constantinople fix to cancun ./hive --sim consensus --sim.limit "legacy-cancun/add11" --- Co-authored-by: Felix Lange --- simulators/ethereum/consensus/Dockerfile | 4 +-- simulators/ethereum/consensus/main.go | 33 +++++++++++++++++------- 2 files changed, 26 insertions(+), 11 deletions(-) diff --git a/simulators/ethereum/consensus/Dockerfile b/simulators/ethereum/consensus/Dockerfile index 400387e3b6..642d4c9e00 100644 --- a/simulators/ethereum/consensus/Dockerfile +++ b/simulators/ethereum/consensus/Dockerfile @@ -3,7 +3,7 @@ FROM golang:1-alpine as builder RUN apk add --update git ca-certificates gcc musl-dev linux-headers # Clone the tests repo. -RUN git clone --depth 1 https://github.com/ethereum/tests.git /tests +RUN git clone --depth 1 --recurse-submodules https://github.com/ethereum/tests.git /tests # Build the simulator executable. ADD . /source @@ -18,4 +18,4 @@ COPY --from=builder /source/consensus . COPY --from=builder /tests /tests ENV TESTPATH /tests -ENTRYPOINT ["./consensus"] \ No newline at end of file +ENTRYPOINT ["./consensus"] diff --git a/simulators/ethereum/consensus/main.go b/simulators/ethereum/consensus/main.go index ba854dde64..946e4af233 100644 --- a/simulators/ethereum/consensus/main.go +++ b/simulators/ethereum/consensus/main.go @@ -20,9 +20,21 @@ import ( ) func main() { + suites := []hivesim.Suite{ + makeSuite("consensus", "BlockchainTests"), + makeSuite("legacy", "LegacyTests/Constantinople/BlockchainTests"), + makeSuite("legacy-cancun", "LegacyTests/Cancun/BlockchainTests"), + } + client := hivesim.New() + for _, suite := range suites { + hivesim.MustRunSuite(client, suite) + } +} + +func makeSuite(name string, testsDirectory string) hivesim.Suite { suite := hivesim.Suite{ - Name: "consensus", - Description: "The 'consensus' test suite executes BlockchainTests from the " + + Name: name, + Description: "The '" + name + "' test suite executes BlockchainTests from the " + "official test repository (https://github.com/ethereum/tests). For every test, it starts an instance of the client, " + "and makes it import the RLP blocks. After import phase, the node is queried about it's latest blocks, which is matched " + "to the expected last blockhash according to the test.", @@ -32,14 +44,16 @@ func main() { Description: "This is a meta-test. It loads the blockchain test files and " + "launches the actual client tests. Any errors in test files will be reported " + "through this test.", - Run: loaderTest, + Run: func(t *hivesim.T) { + runTestsLoader(t, testsDirectory) + }, AlwaysRun: true, }) - hivesim.MustRunSuite(hivesim.New(), suite) + return suite } -// loaderTest loads the blockchain test files and spawns the client tests. -func loaderTest(t *hivesim.T) { +// runTestsLoader loads the blockchain test files and spawns the client tests. +func runTestsLoader(t *hivesim.T, testsDirectory string) { clientTypes, err := t.Sim.ClientTypes() if err != nil { t.Fatal("can't get client types:", err) @@ -56,11 +70,12 @@ func loaderTest(t *hivesim.T) { t.Log("parallelism:", parallelism) // Find the tests directory. - testPath, isset := os.LookupEnv("TESTPATH") + basePath, isset := os.LookupEnv("TESTPATH") if !isset { t.Fatal("$TESTPATH not set") } - fileRoot := fmt.Sprintf("%s/BlockchainTests/", testPath) + t.Log("testsDirectory:", testsDirectory) + fileRoot := filepath.Join(basePath, testsDirectory) // Spawn workers. var wg sync.WaitGroup @@ -119,7 +134,7 @@ func testLink(filepath string) string { func loadTests(t *hivesim.T, root string, re *regexp.Regexp, fn func(testcase)) { filepath.Walk(root, func(path string, info os.FileInfo, err error) error { if err != nil { - t.Logf("unable to walk path: %s", err) + t.Errorf("unable to walk path: %s", err) return err } if info.IsDir() { From c87a99dccfceac12c931ed77419e82f1d76d4fb5 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Mon, 15 Jul 2024 17:01:47 +0200 Subject: [PATCH 312/387] hivesim: add workaround for null client def responses --- hivesim/hive.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/hivesim/hive.go b/hivesim/hive.go index 6cf3b64b2b..f7a36005fc 100644 --- a/hivesim/hive.go +++ b/hivesim/hive.go @@ -12,6 +12,7 @@ import ( "net/http" "os" "path/filepath" + "slices" "strconv" "strings" @@ -153,6 +154,8 @@ func (sim *Simulation) ClientTypes() ([]*ClientDefinition, error) { resp []*ClientDefinition ) err := get(url, &resp) + // remove null items + resp = slices.DeleteFunc(resp, func(cd *ClientDefinition) bool { return cd == nil }) return resp, err } From 600e094bce474baf8c718590b678ec6d7f346f04 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Mon, 15 Jul 2024 17:08:05 +0200 Subject: [PATCH 313/387] simulators: upgrade hivesim --- simulators/devp2p/go.mod | 2 +- simulators/devp2p/go.sum | 4 +-- simulators/eth2/common/go.mod | 24 +---------------- simulators/eth2/common/go.sum | 38 ++------------------------- simulators/eth2/dencun/go.mod | 2 +- simulators/eth2/dencun/go.sum | 4 +-- simulators/eth2/engine/go.mod | 2 +- simulators/eth2/engine/go.sum | 4 +-- simulators/eth2/testnet/go.mod | 2 +- simulators/eth2/testnet/go.sum | 4 +-- simulators/eth2/withdrawals/go.mod | 2 +- simulators/eth2/withdrawals/go.sum | 4 +-- simulators/ethereum/consensus/go.mod | 2 +- simulators/ethereum/consensus/go.sum | 4 +-- simulators/ethereum/engine/go.mod | 2 +- simulators/ethereum/engine/go.sum | 4 +-- simulators/ethereum/graphql/go.mod | 2 +- simulators/ethereum/graphql/go.sum | 4 +-- simulators/ethereum/pyspec/go.mod | 2 +- simulators/ethereum/pyspec/go.sum | 4 +-- simulators/ethereum/rpc-compat/go.mod | 2 +- simulators/ethereum/rpc-compat/go.sum | 4 +-- simulators/ethereum/rpc/go.mod | 2 +- simulators/ethereum/rpc/go.sum | 4 +-- simulators/ethereum/sync/go.mod | 2 +- simulators/ethereum/sync/go.sum | 4 +-- simulators/smoke/clique/go.mod | 2 +- simulators/smoke/clique/go.sum | 4 +-- simulators/smoke/genesis/go.mod | 2 +- simulators/smoke/genesis/go.sum | 4 +-- simulators/smoke/network/go.mod | 2 +- simulators/smoke/network/go.sum | 4 +-- 32 files changed, 48 insertions(+), 104 deletions(-) diff --git a/simulators/devp2p/go.mod b/simulators/devp2p/go.mod index c3470cbefc..d0c5385243 100644 --- a/simulators/devp2p/go.mod +++ b/simulators/devp2p/go.mod @@ -5,7 +5,7 @@ go 1.21 toolchain go1.22.1 require ( - github.com/ethereum/hive v0.0.0-20240610172825-2430a68c753a + github.com/ethereum/hive v0.0.0-20240715150147-c87a99dccfce github.com/shogo82148/go-tap v0.0.3 ) diff --git a/simulators/devp2p/go.sum b/simulators/devp2p/go.sum index 89c7d63b0a..09d58e3009 100644 --- a/simulators/devp2p/go.sum +++ b/simulators/devp2p/go.sum @@ -28,8 +28,8 @@ github.com/ethereum/c-kzg-4844 v1.0.0 h1:0X1LBXxaEtYD9xsyj9B9ctQEZIpnvVDeoBx8aHE github.com/ethereum/c-kzg-4844 v1.0.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= github.com/ethereum/go-ethereum v1.14.5 h1:szuFzO1MhJmweXjoM5nSAeDvjNUH3vIQoMzzQnfvjpw= github.com/ethereum/go-ethereum v1.14.5/go.mod h1:VEDGGhSxY7IEjn98hJRFXl/uFvpRgbIIf2PpXiyGGgc= -github.com/ethereum/hive v0.0.0-20240610172825-2430a68c753a h1:iyHHRPXaxHtEvyFxc4A+is/JRt88o0gQhHrNx+khEqQ= -github.com/ethereum/hive v0.0.0-20240610172825-2430a68c753a/go.mod h1:ghNXZW+/WQClcyiwZpbTzUCyxwql7YeMacYd44v+BJE= +github.com/ethereum/hive v0.0.0-20240715150147-c87a99dccfce h1:wgH9mh3TFSd+LFSsXO6RdTEO3niapJRywO1Xl3/IoIE= +github.com/ethereum/hive v0.0.0-20240715150147-c87a99dccfce/go.mod h1:ghNXZW+/WQClcyiwZpbTzUCyxwql7YeMacYd44v+BJE= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= diff --git a/simulators/eth2/common/go.mod b/simulators/eth2/common/go.mod index b2fe65efe1..3f8e3cab22 100644 --- a/simulators/eth2/common/go.mod +++ b/simulators/eth2/common/go.mod @@ -6,7 +6,7 @@ toolchain go1.22.0 require ( github.com/ethereum/go-ethereum v1.14.5 - github.com/ethereum/hive v0.0.0-20240610172825-2430a68c753a + github.com/ethereum/hive v0.0.0-20240715150147-c87a99dccfce github.com/ethereum/hive/simulators/ethereum/engine v0.0.0-20240610181627-c741e58c51e2 github.com/google/uuid v1.6.0 github.com/herumi/bls-eth-go-binary v1.29.1 @@ -32,7 +32,6 @@ require ( github.com/DataDog/zstd v1.5.2 // indirect github.com/Microsoft/go-winio v0.6.2 // indirect github.com/VictoriaMetrics/fastcache v1.12.2 // indirect - github.com/apapsch/go-jsonmerge/v2 v2.0.0 // indirect github.com/benbjohnson/clock v1.3.5 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/bits-and-blooms/bitset v1.10.0 // indirect @@ -47,24 +46,18 @@ require ( github.com/consensys/gnark-crypto v0.12.1 // indirect github.com/containerd/cgroups v1.1.0 // indirect github.com/coreos/go-systemd/v22 v22.5.0 // indirect - github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect github.com/crate-crypto/go-ipa v0.0.0-20240223125850-b1e8a79f509c // indirect github.com/crate-crypto/go-kzg-4844 v1.0.0 // indirect - github.com/davecgh/go-spew v1.1.1 // indirect github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c // indirect github.com/deckarep/golang-set/v2 v2.6.0 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 // indirect - github.com/deepmap/oapi-codegen v1.12.4 // indirect github.com/docker/go-units v0.5.0 // indirect github.com/elastic/gosigar v0.14.2 // indirect github.com/ethereum/c-kzg-4844 v1.0.0 // indirect github.com/ethereum/go-verkle v0.1.1-0.20240306133620-7d920df305f0 // indirect github.com/ferranbt/fastssz v0.1.3 // indirect - github.com/fjl/memsize v0.0.2 // indirect github.com/flynn/noise v1.1.0 // indirect github.com/francoispqt/gojay v1.2.13 // indirect - github.com/fsnotify/fsnotify v1.6.0 // indirect - github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08 // indirect github.com/getsentry/sentry-go v0.20.0 // indirect github.com/go-ole/go-ole v1.3.0 // indirect github.com/go-stack/stack v1.8.1 // indirect @@ -79,15 +72,9 @@ require ( github.com/google/pprof v0.0.0-20240207164012-fb44976bdcd5 // indirect github.com/gorilla/mux v1.8.1 // indirect github.com/gorilla/websocket v1.5.1 // indirect - github.com/graph-gophers/graphql-go v1.4.0 // indirect - github.com/hashicorp/go-bexpr v0.1.11 // indirect github.com/hashicorp/golang-lru/v2 v2.0.5 // indirect - github.com/holiman/billy v0.0.0-20240216141850-2abb0c79d3c4 // indirect github.com/holiman/bloomfilter/v2 v2.0.3 // indirect github.com/huin/goupnp v1.3.0 // indirect - github.com/influxdata/influxdb-client-go/v2 v2.12.1 // indirect - github.com/influxdata/influxdb1-client v0.0.0-20220302092344-a9ab5670611c // indirect - github.com/influxdata/line-protocol v0.0.0-20210922203350-b1ad95c89adf // indirect github.com/ipfs/go-cid v0.4.1 // indirect github.com/ipfs/go-log/v2 v2.5.1 // indirect github.com/jackpal/go-nat-pmp v1.0.2 // indirect @@ -120,7 +107,6 @@ require ( github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc // indirect github.com/minio/sha256-simd v1.0.1 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect - github.com/mitchellh/pointerstructure v1.2.1 // indirect github.com/mmcloughlin/addchain v0.4.0 // indirect github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 // indirect github.com/mr-tron/base58 v1.2.0 // indirect @@ -138,7 +124,6 @@ require ( github.com/onsi/ginkgo/v2 v2.15.0 // indirect github.com/opencontainers/runtime-spec v1.2.0 // indirect github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 // indirect - github.com/peterh/liner v1.2.2 // indirect github.com/prometheus/client_golang v1.18.0 // indirect github.com/prometheus/client_model v0.6.0 // indirect github.com/prometheus/common v0.47.0 // indirect @@ -152,21 +137,16 @@ require ( github.com/raulk/go-watchdog v1.3.0 // indirect github.com/rivo/uniseg v0.4.4 // indirect github.com/rogpeppe/go-internal v1.10.0 // indirect - github.com/rs/cors v1.8.2 // indirect - github.com/russross/blackfriday/v2 v2.1.0 // indirect github.com/shirou/gopsutil v3.21.11+incompatible // indirect github.com/sirupsen/logrus v1.9.3 // indirect github.com/spaolacci/murmur3 v1.1.0 // indirect - github.com/status-im/keycard-go v0.2.0 // indirect github.com/supranational/blst v0.3.11 // indirect github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d // indirect github.com/thomaso-mirodin/intmath v0.0.0-20160323211736-5dc6d854e46e // indirect github.com/tklauser/go-sysconf v0.3.12 // indirect github.com/tklauser/numcpus v0.6.1 // indirect - github.com/urfave/cli/v2 v2.25.7 // indirect github.com/wealdtech/go-bytesutil v1.2.1 // indirect github.com/wealdtech/go-eth2-types/v2 v2.8.1 // indirect - github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 // indirect github.com/yusufpapurcu/wmi v1.2.2 // indirect go.uber.org/dig v1.17.1 // indirect go.uber.org/fx v1.20.1 // indirect @@ -179,13 +159,11 @@ require ( golang.org/x/sync v0.7.0 // indirect golang.org/x/sys v0.20.0 // indirect golang.org/x/text v0.14.0 // indirect - golang.org/x/time v0.5.0 // indirect golang.org/x/tools v0.20.0 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20230711160842-782d3b101e98 // indirect google.golang.org/grpc v1.58.3 // indirect google.golang.org/protobuf v1.33.0 // indirect gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1 // indirect - gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect k8s.io/client-go v0.22.5 // indirect k8s.io/utils v0.0.0-20210930125809-cb0fa318a74b // indirect diff --git a/simulators/eth2/common/go.sum b/simulators/eth2/common/go.sum index 94d07344e2..a9cf3eeee2 100644 --- a/simulators/eth2/common/go.sum +++ b/simulators/eth2/common/go.sum @@ -48,15 +48,12 @@ github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/RaveNoX/go-jsoncommentstrip v1.0.0/go.mod h1:78ihd09MekBnJnxpICcwzCMzGrKSKYe4AqU6PDYYpjk= github.com/VictoriaMetrics/fastcache v1.12.2 h1:N0y9ASrJ0F6h0QaC3o6uJb3NIZ9VKLjCM7NQbSmF7WI= github.com/VictoriaMetrics/fastcache v1.12.2/go.mod h1:AmC+Nzz1+3G2eCPapF6UcsnkThDcMsQicp4xDukwJYI= github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= github.com/allegro/bigcache v1.2.1 h1:hg1sY1raCwic3Vnsvje6TT7/pnZba83LeFck5NrFKSc= github.com/allegro/bigcache v1.2.1/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= -github.com/apapsch/go-jsonmerge/v2 v2.0.0 h1:axGnT1gRIfimI7gJifB699GoE/oq+F2MU7Dml6nw9rQ= -github.com/apapsch/go-jsonmerge/v2 v2.0.0/go.mod h1:lvDnEdqiQrp0O42VQGgmlKpxL1AP2+08jFMw88y4klk= github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= github.com/bazelbuild/rules_go v0.23.2 h1:Wxu7JjqnF78cKZbsBsARLSXx/jlGaSLCnUV3mTlyHvM= github.com/bazelbuild/rules_go v0.23.2/go.mod h1:MC23Dc/wkXEyk3Wpq6lCqz0ZAYOZDw2DR5y3N1q2i7M= @@ -69,7 +66,6 @@ github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bits-and-blooms/bitset v1.10.0 h1:ePXTeiPEazB5+opbv5fr8umg2R/1NlzgDsyepwsSr88= github.com/bits-and-blooms/bitset v1.10.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= -github.com/bmatcuk/doublestar v1.1.1/go.mod h1:UD6OnuiIn0yFxxA2le/rnRU1G4RaI4UvFv1sNto9p6w= github.com/bradfitz/go-smtpd v0.0.0-20170404230938-deb6d6237625/go.mod h1:HYsPBTaaSFSlLx/70C2HPIMNZpVV8+vt/A+FMnYP11g= github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U= github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= @@ -130,8 +126,6 @@ github.com/decred/dcrd/crypto/blake256 v1.0.1 h1:7PltbUIQB7u/FfZ39+DGa/ShuMyJ5il github.com/decred/dcrd/crypto/blake256 v1.0.1/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 h1:8UrgZ3GkP4i/CLijOJx79Yu+etlyjdBU4sfcs2WYQMs= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0= -github.com/deepmap/oapi-codegen v1.12.4 h1:pPmn6qI9MuOtCz82WY2Xaw46EQjgvxednXXrP7g5Q2s= -github.com/deepmap/oapi-codegen v1.12.4/go.mod h1:3lgHGMu6myQ2vqbbTXH2H1o4eXFTGnFiDaOaKKl5yas= github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= @@ -150,12 +144,8 @@ github.com/ethereum/go-ethereum v1.14.5 h1:szuFzO1MhJmweXjoM5nSAeDvjNUH3vIQoMzzQ github.com/ethereum/go-ethereum v1.14.5/go.mod h1:VEDGGhSxY7IEjn98hJRFXl/uFvpRgbIIf2PpXiyGGgc= github.com/ethereum/go-verkle v0.1.1-0.20240306133620-7d920df305f0 h1:KrE8I4reeVvf7C1tm8elRjj4BdscTYzz/WAbYyf/JI4= github.com/ethereum/go-verkle v0.1.1-0.20240306133620-7d920df305f0/go.mod h1:D9AJLVXSyZQXJQVk8oh1EwjISE+sJTn2duYIZC0dy3w= -github.com/ethereum/hive v0.0.0-20240610172825-2430a68c753a h1:iyHHRPXaxHtEvyFxc4A+is/JRt88o0gQhHrNx+khEqQ= -github.com/ethereum/hive v0.0.0-20240610172825-2430a68c753a/go.mod h1:ghNXZW+/WQClcyiwZpbTzUCyxwql7YeMacYd44v+BJE= -github.com/ethereum/hive/simulators/ethereum/engine v0.0.0-20240610172825-2430a68c753a h1:Fosk1Ej17ClzSkcaSvELyIGrLmAWc9xIQFEu6w40q9w= -github.com/ethereum/hive/simulators/ethereum/engine v0.0.0-20240610172825-2430a68c753a/go.mod h1:TWdGG7ioTHIkdnyiFZcaVAcxDdWfefW2tMiTcZpWA7o= -github.com/ethereum/hive/simulators/ethereum/engine v0.0.0-20240610180720-4533b079ea50 h1:8DjdLc/y7Pd1La3sE9zPMKsraG8b/p4b0lpHou5zupc= -github.com/ethereum/hive/simulators/ethereum/engine v0.0.0-20240610180720-4533b079ea50/go.mod h1:TWdGG7ioTHIkdnyiFZcaVAcxDdWfefW2tMiTcZpWA7o= +github.com/ethereum/hive v0.0.0-20240715150147-c87a99dccfce h1:wgH9mh3TFSd+LFSsXO6RdTEO3niapJRywO1Xl3/IoIE= +github.com/ethereum/hive v0.0.0-20240715150147-c87a99dccfce/go.mod h1:ghNXZW+/WQClcyiwZpbTzUCyxwql7YeMacYd44v+BJE= github.com/ethereum/hive/simulators/ethereum/engine v0.0.0-20240610181627-c741e58c51e2 h1:PZ+xW+ywyn+6/GzRqTMLAG7N2xHFhae8lXVt/2MPfAI= github.com/ethereum/hive/simulators/ethereum/engine v0.0.0-20240610181627-c741e58c51e2/go.mod h1:CTrtqj/pRDjVU5SteEngxH68vsCEg3wOgeUdn0I6iGY= github.com/evanphx/json-patch v4.11.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= @@ -189,11 +179,8 @@ github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2 github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= -github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY= github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= -github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= @@ -257,7 +244,6 @@ github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMyw github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ= @@ -295,8 +281,6 @@ github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWS github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.5.1 h1:gmztn0JnHVt9JZquRuzLw3g4wouNVzKL15iLr/zn/QY= github.com/gorilla/websocket v1.5.1/go.mod h1:x3kM2JMyaluk02fnUJpQuwD2dCS5NDG2ZHL0uE0tcaY= -github.com/graph-gophers/graphql-go v1.4.0 h1:JE9wveRTSXwJyjdRd6bOQ7Ob5bewTUQ58Jv4OiVdpdE= -github.com/graph-gophers/graphql-go v1.4.0/go.mod h1:YtmJZDLbF1YYNrlNAuiO5zAStUWc3XZT07iGsVqe1Os= github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= github.com/grpc-ecosystem/grpc-gateway v1.5.0 h1:WcmKMm43DR7RdtlkEXQJyo5ws8iTp98CyhCCbOHMvNI= github.com/grpc-ecosystem/grpc-gateway v1.5.0/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw= @@ -325,12 +309,6 @@ github.com/huin/goupnp v1.3.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFck github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/influxdata/influxdb-client-go/v2 v2.12.1 h1:RrjoDNyBGFYvjKfjmtIyYAn6GY/SrtocSo4RPlt+Lng= -github.com/influxdata/influxdb-client-go/v2 v2.12.1/go.mod h1:YteV91FiQxRdccyJ2cHvj2f/5sq4y4Njqu1fQzsQCOU= -github.com/influxdata/influxdb1-client v0.0.0-20220302092344-a9ab5670611c h1:qSHzRbhzK8RdXOsAdfDgO49TtqC1oZ+acxPrkfTxcCs= -github.com/influxdata/influxdb1-client v0.0.0-20220302092344-a9ab5670611c/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= -github.com/influxdata/line-protocol v0.0.0-20210922203350-b1ad95c89adf h1:7JTmneyiNEwVBOHSjoMxiWAqB992atOeepeFYegn5RU= -github.com/influxdata/line-protocol v0.0.0-20210922203350-b1ad95c89adf/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo= github.com/ipfs/go-cid v0.4.1 h1:A/T3qGvxi4kpKWWcPC/PgbvDA2bjVLO7n4UeVwnbs/s= github.com/ipfs/go-cid v0.4.1/go.mod h1:uQHwDeX4c6CtyrFwdqyhpNcxVewur1M7l7fNU7LKwZk= github.com/ipfs/go-log/v2 v2.5.1 h1:1XdUzF7048prq4aBjDQQ4SL5RxftpRGdXhNRwKSAlcY= @@ -346,7 +324,6 @@ github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnr github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= -github.com/juju/gnuflag v0.0.0-20171113085948-2ce1bb71843d/go.mod h1:2PavIy+JPciBPrBUjwbNvtwB6RQlve+hkpll6QSNmOE= github.com/julienschmidt/httprouter v1.3.0 h1:U0609e9tgbseu3rBINet9P48AI/D3oJs4dN7jwJOQ1U= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= github.com/kilic/bls12-381 v0.1.0 h1:encrdjqKMEvabVQ7qYOKu1OvhqpK4s47wDYtNiPtlp4= @@ -426,7 +403,6 @@ github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27k github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= -github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.14 h1:+xnbZSEeDbOIg5/mE6JF0w6n9duR1l3/WmbinWVwUuU= github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= @@ -448,7 +424,6 @@ github.com/minio/sha256-simd v0.1.1-0.20190913151208-6de447530771/go.mod h1:B5e1 github.com/minio/sha256-simd v1.0.1 h1:6kaan5IFmwTNynnKKpDHe6FWHohJOHhCPchzK49dzMM= github.com/minio/sha256-simd v1.0.1/go.mod h1:Pz6AKMiUdngCLpeTL/RJY1M9rUuPMYujV5xJjtbRSN8= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/pointerstructure v1.2.1 h1:ZhBBeX8tSlRpu/FFhXH4RC4OJzFlqsQhoHZAz4x7TIw= @@ -523,15 +498,12 @@ github.com/onsi/gomega v1.30.0/go.mod h1:9sxs+SwGrKI0+PWe4Fxa9tFQQBG5xSsSbMXOI8P github.com/opencontainers/runtime-spec v1.0.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opencontainers/runtime-spec v1.2.0 h1:z97+pHb3uELt/yiAWD691HNHQIF07bE7dzrbT927iTk= github.com/opencontainers/runtime-spec v1.2.0/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= github.com/openzipkin/zipkin-go v0.1.1/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTmOf0Erfk+hxe8= github.com/patrickmn/go-cache v2.1.0+incompatible h1:HRMgzkcYKYpi3C8ajMPV8OFXaaRUnok+kx1WdO15EQc= github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ= github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 h1:onHthvaw9LFnH4t2DcNVpwGmV9E1BkGknEliJkfwQj0= github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58/go.mod h1:DXv8WO4yhMYhSNPKjeNKa5WY9YCIEBRbNzFFPJbWO6Y= github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= -github.com/peterh/liner v1.2.2 h1:aJ4AOodmL+JxOZZEL2u9iJf8omNRpqHc/EbrK+3mAXw= -github.com/peterh/liner v1.2.2/go.mod h1:xFwJyiKIXJZUKItq5dGHZSTBRAuG/CpeNpWLyiNRNwI= github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= @@ -625,7 +597,6 @@ github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2 github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spkg/bom v0.0.0-20160624110644-59b7046e48ad/go.mod h1:qLr4V1qq6nMqFKkMo8ZTx3f+BZEkzsRUY10Xsm2mwU0= github.com/status-im/keycard-go v0.2.0 h1:QDLFswOQu1r5jsycloeQh3bVU8n/NatHHaZobtDnDzA= github.com/status-im/keycard-go v0.2.0/go.mod h1:wlp8ZLbsmrF6g6WjugPAx+IzoLrkdf9+mHxBEeo3Hbg= github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= @@ -636,7 +607,6 @@ github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81P github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= @@ -683,8 +653,6 @@ go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/otel v1.6.3/go.mod h1:7BgNga5fNlF/iZjG06hM3yofffp0ofKCDwSXx1GC4dI= -go.opentelemetry.io/otel/trace v1.6.3/go.mod h1:GNJQusJlUgZl9/TQBPKU/Y/ty+0iVB5fjhKeJGZPGFs= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= @@ -851,13 +819,11 @@ golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211117180635-dee7805ff2e1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= diff --git a/simulators/eth2/dencun/go.mod b/simulators/eth2/dencun/go.mod index 5a348c430a..bca529a8d3 100644 --- a/simulators/eth2/dencun/go.mod +++ b/simulators/eth2/dencun/go.mod @@ -6,7 +6,7 @@ toolchain go1.22.0 require ( github.com/ethereum/go-ethereum v1.14.5 - github.com/ethereum/hive v0.0.0-20240610172825-2430a68c753a + github.com/ethereum/hive v0.0.0-20240715150147-c87a99dccfce github.com/ethereum/hive/simulators/eth2/common v0.0.0-20230316220410-1364352c32a6 github.com/ethereum/hive/simulators/ethereum/engine v0.0.0-20240305231022-f69df863de20 github.com/lithammer/dedent v1.1.0 diff --git a/simulators/eth2/dencun/go.sum b/simulators/eth2/dencun/go.sum index 3b9db30b20..f6832e74ee 100644 --- a/simulators/eth2/dencun/go.sum +++ b/simulators/eth2/dencun/go.sum @@ -144,8 +144,8 @@ github.com/ethereum/go-ethereum v1.14.5 h1:szuFzO1MhJmweXjoM5nSAeDvjNUH3vIQoMzzQ github.com/ethereum/go-ethereum v1.14.5/go.mod h1:VEDGGhSxY7IEjn98hJRFXl/uFvpRgbIIf2PpXiyGGgc= github.com/ethereum/go-verkle v0.1.1-0.20240306133620-7d920df305f0 h1:KrE8I4reeVvf7C1tm8elRjj4BdscTYzz/WAbYyf/JI4= github.com/ethereum/go-verkle v0.1.1-0.20240306133620-7d920df305f0/go.mod h1:D9AJLVXSyZQXJQVk8oh1EwjISE+sJTn2duYIZC0dy3w= -github.com/ethereum/hive v0.0.0-20240610172825-2430a68c753a h1:iyHHRPXaxHtEvyFxc4A+is/JRt88o0gQhHrNx+khEqQ= -github.com/ethereum/hive v0.0.0-20240610172825-2430a68c753a/go.mod h1:ghNXZW+/WQClcyiwZpbTzUCyxwql7YeMacYd44v+BJE= +github.com/ethereum/hive v0.0.0-20240715150147-c87a99dccfce h1:wgH9mh3TFSd+LFSsXO6RdTEO3niapJRywO1Xl3/IoIE= +github.com/ethereum/hive v0.0.0-20240715150147-c87a99dccfce/go.mod h1:ghNXZW+/WQClcyiwZpbTzUCyxwql7YeMacYd44v+BJE= github.com/ethereum/hive/simulators/eth2/common v0.0.0-20230316220410-1364352c32a6 h1:LcSUNGwQuJyR/gdPcsif57yKX+3MyhpoAuChzR8k6Yk= github.com/ethereum/hive/simulators/eth2/common v0.0.0-20230316220410-1364352c32a6/go.mod h1:FX4oxNyTNw/P+TUWrb7vva7o/rFI0pHO7OYdtG6EtN4= github.com/ethereum/hive/simulators/ethereum/engine v0.0.0-20240305231022-f69df863de20 h1:Bf9mev5lvesQIIpJtzO+vnGQ3Jv3NuLa2buY2+2pQzg= diff --git a/simulators/eth2/engine/go.mod b/simulators/eth2/engine/go.mod index a3441feca5..4a3a4d7619 100644 --- a/simulators/eth2/engine/go.mod +++ b/simulators/eth2/engine/go.mod @@ -6,7 +6,7 @@ toolchain go1.22.1 require ( github.com/ethereum/go-ethereum v1.14.5 - github.com/ethereum/hive v0.0.0-20240610172825-2430a68c753a + github.com/ethereum/hive v0.0.0-20240715150147-c87a99dccfce github.com/ethereum/hive/simulators/eth2/common v0.0.0-20230316220410-1364352c32a6 github.com/marioevz/eth-clients v0.0.0-20230925201418-d5fbddd99b76 github.com/protolambda/eth2api v0.0.0-20230316214135-5f8afbd6d05d diff --git a/simulators/eth2/engine/go.sum b/simulators/eth2/engine/go.sum index 02a0672e0b..d07ad27b3a 100644 --- a/simulators/eth2/engine/go.sum +++ b/simulators/eth2/engine/go.sum @@ -59,8 +59,8 @@ github.com/ethereum/go-ethereum v1.14.5 h1:szuFzO1MhJmweXjoM5nSAeDvjNUH3vIQoMzzQ github.com/ethereum/go-ethereum v1.14.5/go.mod h1:VEDGGhSxY7IEjn98hJRFXl/uFvpRgbIIf2PpXiyGGgc= github.com/ethereum/go-verkle v0.1.1-0.20240306133620-7d920df305f0 h1:KrE8I4reeVvf7C1tm8elRjj4BdscTYzz/WAbYyf/JI4= github.com/ethereum/go-verkle v0.1.1-0.20240306133620-7d920df305f0/go.mod h1:D9AJLVXSyZQXJQVk8oh1EwjISE+sJTn2duYIZC0dy3w= -github.com/ethereum/hive v0.0.0-20240610172825-2430a68c753a h1:iyHHRPXaxHtEvyFxc4A+is/JRt88o0gQhHrNx+khEqQ= -github.com/ethereum/hive v0.0.0-20240610172825-2430a68c753a/go.mod h1:ghNXZW+/WQClcyiwZpbTzUCyxwql7YeMacYd44v+BJE= +github.com/ethereum/hive v0.0.0-20240715150147-c87a99dccfce h1:wgH9mh3TFSd+LFSsXO6RdTEO3niapJRywO1Xl3/IoIE= +github.com/ethereum/hive v0.0.0-20240715150147-c87a99dccfce/go.mod h1:ghNXZW+/WQClcyiwZpbTzUCyxwql7YeMacYd44v+BJE= github.com/ethereum/hive/simulators/eth2/common v0.0.0-20230316220410-1364352c32a6 h1:LcSUNGwQuJyR/gdPcsif57yKX+3MyhpoAuChzR8k6Yk= github.com/ethereum/hive/simulators/eth2/common v0.0.0-20230316220410-1364352c32a6/go.mod h1:FX4oxNyTNw/P+TUWrb7vva7o/rFI0pHO7OYdtG6EtN4= github.com/ferranbt/fastssz v0.1.2 h1:Dky6dXlngF6Qjc+EfDipAkE83N5I5DE68bY6O0VLNPk= diff --git a/simulators/eth2/testnet/go.mod b/simulators/eth2/testnet/go.mod index 5eec84f7df..23c27f8bd8 100644 --- a/simulators/eth2/testnet/go.mod +++ b/simulators/eth2/testnet/go.mod @@ -5,7 +5,7 @@ go 1.21 toolchain go1.22.1 require ( - github.com/ethereum/hive v0.0.0-20240610172825-2430a68c753a + github.com/ethereum/hive v0.0.0-20240715150147-c87a99dccfce github.com/ethereum/hive/simulators/eth2/common v0.0.0-20230316220410-1364352c32a6 ) diff --git a/simulators/eth2/testnet/go.sum b/simulators/eth2/testnet/go.sum index 00f4e6eee8..77038ea6e0 100644 --- a/simulators/eth2/testnet/go.sum +++ b/simulators/eth2/testnet/go.sum @@ -59,8 +59,8 @@ github.com/ethereum/go-ethereum v1.14.5 h1:szuFzO1MhJmweXjoM5nSAeDvjNUH3vIQoMzzQ github.com/ethereum/go-ethereum v1.14.5/go.mod h1:VEDGGhSxY7IEjn98hJRFXl/uFvpRgbIIf2PpXiyGGgc= github.com/ethereum/go-verkle v0.1.1-0.20240306133620-7d920df305f0 h1:KrE8I4reeVvf7C1tm8elRjj4BdscTYzz/WAbYyf/JI4= github.com/ethereum/go-verkle v0.1.1-0.20240306133620-7d920df305f0/go.mod h1:D9AJLVXSyZQXJQVk8oh1EwjISE+sJTn2duYIZC0dy3w= -github.com/ethereum/hive v0.0.0-20240610172825-2430a68c753a h1:iyHHRPXaxHtEvyFxc4A+is/JRt88o0gQhHrNx+khEqQ= -github.com/ethereum/hive v0.0.0-20240610172825-2430a68c753a/go.mod h1:ghNXZW+/WQClcyiwZpbTzUCyxwql7YeMacYd44v+BJE= +github.com/ethereum/hive v0.0.0-20240715150147-c87a99dccfce h1:wgH9mh3TFSd+LFSsXO6RdTEO3niapJRywO1Xl3/IoIE= +github.com/ethereum/hive v0.0.0-20240715150147-c87a99dccfce/go.mod h1:ghNXZW+/WQClcyiwZpbTzUCyxwql7YeMacYd44v+BJE= github.com/ethereum/hive/simulators/eth2/common v0.0.0-20230316220410-1364352c32a6 h1:LcSUNGwQuJyR/gdPcsif57yKX+3MyhpoAuChzR8k6Yk= github.com/ethereum/hive/simulators/eth2/common v0.0.0-20230316220410-1364352c32a6/go.mod h1:FX4oxNyTNw/P+TUWrb7vva7o/rFI0pHO7OYdtG6EtN4= github.com/ferranbt/fastssz v0.1.2 h1:Dky6dXlngF6Qjc+EfDipAkE83N5I5DE68bY6O0VLNPk= diff --git a/simulators/eth2/withdrawals/go.mod b/simulators/eth2/withdrawals/go.mod index 8e35b284b6..e34637959a 100644 --- a/simulators/eth2/withdrawals/go.mod +++ b/simulators/eth2/withdrawals/go.mod @@ -6,7 +6,7 @@ toolchain go1.22.1 require ( github.com/ethereum/go-ethereum v1.14.5 - github.com/ethereum/hive v0.0.0-20240610172825-2430a68c753a + github.com/ethereum/hive v0.0.0-20240715150147-c87a99dccfce github.com/ethereum/hive/simulators/eth2/common v0.0.0-20230316220410-1364352c32a6 github.com/marioevz/eth-clients v0.0.0-20230925201418-d5fbddd99b76 github.com/marioevz/mock-builder v0.0.0-20230501225822-df434a88e375 diff --git a/simulators/eth2/withdrawals/go.sum b/simulators/eth2/withdrawals/go.sum index 7777461e3a..307cfc13ca 100644 --- a/simulators/eth2/withdrawals/go.sum +++ b/simulators/eth2/withdrawals/go.sum @@ -59,8 +59,8 @@ github.com/ethereum/go-ethereum v1.14.5 h1:szuFzO1MhJmweXjoM5nSAeDvjNUH3vIQoMzzQ github.com/ethereum/go-ethereum v1.14.5/go.mod h1:VEDGGhSxY7IEjn98hJRFXl/uFvpRgbIIf2PpXiyGGgc= github.com/ethereum/go-verkle v0.1.1-0.20240306133620-7d920df305f0 h1:KrE8I4reeVvf7C1tm8elRjj4BdscTYzz/WAbYyf/JI4= github.com/ethereum/go-verkle v0.1.1-0.20240306133620-7d920df305f0/go.mod h1:D9AJLVXSyZQXJQVk8oh1EwjISE+sJTn2duYIZC0dy3w= -github.com/ethereum/hive v0.0.0-20240610172825-2430a68c753a h1:iyHHRPXaxHtEvyFxc4A+is/JRt88o0gQhHrNx+khEqQ= -github.com/ethereum/hive v0.0.0-20240610172825-2430a68c753a/go.mod h1:ghNXZW+/WQClcyiwZpbTzUCyxwql7YeMacYd44v+BJE= +github.com/ethereum/hive v0.0.0-20240715150147-c87a99dccfce h1:wgH9mh3TFSd+LFSsXO6RdTEO3niapJRywO1Xl3/IoIE= +github.com/ethereum/hive v0.0.0-20240715150147-c87a99dccfce/go.mod h1:ghNXZW+/WQClcyiwZpbTzUCyxwql7YeMacYd44v+BJE= github.com/ethereum/hive/simulators/eth2/common v0.0.0-20230316220410-1364352c32a6 h1:LcSUNGwQuJyR/gdPcsif57yKX+3MyhpoAuChzR8k6Yk= github.com/ethereum/hive/simulators/eth2/common v0.0.0-20230316220410-1364352c32a6/go.mod h1:FX4oxNyTNw/P+TUWrb7vva7o/rFI0pHO7OYdtG6EtN4= github.com/ferranbt/fastssz v0.1.2 h1:Dky6dXlngF6Qjc+EfDipAkE83N5I5DE68bY6O0VLNPk= diff --git a/simulators/ethereum/consensus/go.mod b/simulators/ethereum/consensus/go.mod index 116e1dbd80..5823d17785 100644 --- a/simulators/ethereum/consensus/go.mod +++ b/simulators/ethereum/consensus/go.mod @@ -6,7 +6,7 @@ toolchain go1.22.1 require ( github.com/ethereum/go-ethereum v1.14.5 - github.com/ethereum/hive v0.0.0-20240610172825-2430a68c753a + github.com/ethereum/hive v0.0.0-20240715150147-c87a99dccfce ) require ( diff --git a/simulators/ethereum/consensus/go.sum b/simulators/ethereum/consensus/go.sum index 5bcd30a86d..a8dbafb7b9 100644 --- a/simulators/ethereum/consensus/go.sum +++ b/simulators/ethereum/consensus/go.sum @@ -57,8 +57,8 @@ github.com/ethereum/go-ethereum v1.14.5 h1:szuFzO1MhJmweXjoM5nSAeDvjNUH3vIQoMzzQ github.com/ethereum/go-ethereum v1.14.5/go.mod h1:VEDGGhSxY7IEjn98hJRFXl/uFvpRgbIIf2PpXiyGGgc= github.com/ethereum/go-verkle v0.1.1-0.20240306133620-7d920df305f0 h1:KrE8I4reeVvf7C1tm8elRjj4BdscTYzz/WAbYyf/JI4= github.com/ethereum/go-verkle v0.1.1-0.20240306133620-7d920df305f0/go.mod h1:D9AJLVXSyZQXJQVk8oh1EwjISE+sJTn2duYIZC0dy3w= -github.com/ethereum/hive v0.0.0-20240610172825-2430a68c753a h1:iyHHRPXaxHtEvyFxc4A+is/JRt88o0gQhHrNx+khEqQ= -github.com/ethereum/hive v0.0.0-20240610172825-2430a68c753a/go.mod h1:ghNXZW+/WQClcyiwZpbTzUCyxwql7YeMacYd44v+BJE= +github.com/ethereum/hive v0.0.0-20240715150147-c87a99dccfce h1:wgH9mh3TFSd+LFSsXO6RdTEO3niapJRywO1Xl3/IoIE= +github.com/ethereum/hive v0.0.0-20240715150147-c87a99dccfce/go.mod h1:ghNXZW+/WQClcyiwZpbTzUCyxwql7YeMacYd44v+BJE= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= diff --git a/simulators/ethereum/engine/go.mod b/simulators/ethereum/engine/go.mod index b18d548113..5a027584b6 100644 --- a/simulators/ethereum/engine/go.mod +++ b/simulators/ethereum/engine/go.mod @@ -8,7 +8,7 @@ require ( github.com/crate-crypto/go-kzg-4844 v1.0.0 github.com/davecgh/go-spew v1.1.1 github.com/ethereum/go-ethereum v1.14.5 - github.com/ethereum/hive v0.0.0-20240610172825-2430a68c753a + github.com/ethereum/hive v0.0.0-20240715150147-c87a99dccfce github.com/golang-jwt/jwt/v4 v4.5.0 github.com/holiman/uint256 v1.2.4 github.com/pkg/errors v0.9.1 diff --git a/simulators/ethereum/engine/go.sum b/simulators/ethereum/engine/go.sum index d8063823bd..c2fb8f25b6 100644 --- a/simulators/ethereum/engine/go.sum +++ b/simulators/ethereum/engine/go.sum @@ -67,8 +67,8 @@ github.com/ethereum/go-ethereum v1.14.5 h1:szuFzO1MhJmweXjoM5nSAeDvjNUH3vIQoMzzQ github.com/ethereum/go-ethereum v1.14.5/go.mod h1:VEDGGhSxY7IEjn98hJRFXl/uFvpRgbIIf2PpXiyGGgc= github.com/ethereum/go-verkle v0.1.1-0.20240306133620-7d920df305f0 h1:KrE8I4reeVvf7C1tm8elRjj4BdscTYzz/WAbYyf/JI4= github.com/ethereum/go-verkle v0.1.1-0.20240306133620-7d920df305f0/go.mod h1:D9AJLVXSyZQXJQVk8oh1EwjISE+sJTn2duYIZC0dy3w= -github.com/ethereum/hive v0.0.0-20240610172825-2430a68c753a h1:iyHHRPXaxHtEvyFxc4A+is/JRt88o0gQhHrNx+khEqQ= -github.com/ethereum/hive v0.0.0-20240610172825-2430a68c753a/go.mod h1:ghNXZW+/WQClcyiwZpbTzUCyxwql7YeMacYd44v+BJE= +github.com/ethereum/hive v0.0.0-20240715150147-c87a99dccfce h1:wgH9mh3TFSd+LFSsXO6RdTEO3niapJRywO1Xl3/IoIE= +github.com/ethereum/hive v0.0.0-20240715150147-c87a99dccfce/go.mod h1:ghNXZW+/WQClcyiwZpbTzUCyxwql7YeMacYd44v+BJE= github.com/ferranbt/fastssz v0.1.2 h1:Dky6dXlngF6Qjc+EfDipAkE83N5I5DE68bY6O0VLNPk= github.com/ferranbt/fastssz v0.1.2/go.mod h1:X5UPrE2u1UJjxHA8X54u04SBwdAQjG2sFtWs39YxyWs= github.com/fjl/memsize v0.0.2 h1:27txuSD9or+NZlnOWdKUxeBzTAUkWCVh+4Gf2dWFOzA= diff --git a/simulators/ethereum/graphql/go.mod b/simulators/ethereum/graphql/go.mod index c1b8b53759..e391840268 100644 --- a/simulators/ethereum/graphql/go.mod +++ b/simulators/ethereum/graphql/go.mod @@ -6,7 +6,7 @@ toolchain go1.22.1 require ( github.com/ethereum/go-ethereum v1.14.5 - github.com/ethereum/hive v0.0.0-20240610172825-2430a68c753a + github.com/ethereum/hive v0.0.0-20240715150147-c87a99dccfce ) require ( diff --git a/simulators/ethereum/graphql/go.sum b/simulators/ethereum/graphql/go.sum index 5bcd30a86d..a8dbafb7b9 100644 --- a/simulators/ethereum/graphql/go.sum +++ b/simulators/ethereum/graphql/go.sum @@ -57,8 +57,8 @@ github.com/ethereum/go-ethereum v1.14.5 h1:szuFzO1MhJmweXjoM5nSAeDvjNUH3vIQoMzzQ github.com/ethereum/go-ethereum v1.14.5/go.mod h1:VEDGGhSxY7IEjn98hJRFXl/uFvpRgbIIf2PpXiyGGgc= github.com/ethereum/go-verkle v0.1.1-0.20240306133620-7d920df305f0 h1:KrE8I4reeVvf7C1tm8elRjj4BdscTYzz/WAbYyf/JI4= github.com/ethereum/go-verkle v0.1.1-0.20240306133620-7d920df305f0/go.mod h1:D9AJLVXSyZQXJQVk8oh1EwjISE+sJTn2duYIZC0dy3w= -github.com/ethereum/hive v0.0.0-20240610172825-2430a68c753a h1:iyHHRPXaxHtEvyFxc4A+is/JRt88o0gQhHrNx+khEqQ= -github.com/ethereum/hive v0.0.0-20240610172825-2430a68c753a/go.mod h1:ghNXZW+/WQClcyiwZpbTzUCyxwql7YeMacYd44v+BJE= +github.com/ethereum/hive v0.0.0-20240715150147-c87a99dccfce h1:wgH9mh3TFSd+LFSsXO6RdTEO3niapJRywO1Xl3/IoIE= +github.com/ethereum/hive v0.0.0-20240715150147-c87a99dccfce/go.mod h1:ghNXZW+/WQClcyiwZpbTzUCyxwql7YeMacYd44v+BJE= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= diff --git a/simulators/ethereum/pyspec/go.mod b/simulators/ethereum/pyspec/go.mod index c300c1af9b..326f9c094d 100644 --- a/simulators/ethereum/pyspec/go.mod +++ b/simulators/ethereum/pyspec/go.mod @@ -6,7 +6,7 @@ toolchain go1.22.1 require ( github.com/ethereum/go-ethereum v1.14.5 - github.com/ethereum/hive v0.0.0-20240610172825-2430a68c753a + github.com/ethereum/hive v0.0.0-20240715150147-c87a99dccfce github.com/ethereum/hive/simulators/ethereum/engine v0.0.0-20230919054339-322945164a97 ) diff --git a/simulators/ethereum/pyspec/go.sum b/simulators/ethereum/pyspec/go.sum index 124cd15810..66a62bf810 100644 --- a/simulators/ethereum/pyspec/go.sum +++ b/simulators/ethereum/pyspec/go.sum @@ -59,8 +59,8 @@ github.com/ethereum/go-ethereum v1.14.5 h1:szuFzO1MhJmweXjoM5nSAeDvjNUH3vIQoMzzQ github.com/ethereum/go-ethereum v1.14.5/go.mod h1:VEDGGhSxY7IEjn98hJRFXl/uFvpRgbIIf2PpXiyGGgc= github.com/ethereum/go-verkle v0.1.1-0.20240306133620-7d920df305f0 h1:KrE8I4reeVvf7C1tm8elRjj4BdscTYzz/WAbYyf/JI4= github.com/ethereum/go-verkle v0.1.1-0.20240306133620-7d920df305f0/go.mod h1:D9AJLVXSyZQXJQVk8oh1EwjISE+sJTn2duYIZC0dy3w= -github.com/ethereum/hive v0.0.0-20240610172825-2430a68c753a h1:iyHHRPXaxHtEvyFxc4A+is/JRt88o0gQhHrNx+khEqQ= -github.com/ethereum/hive v0.0.0-20240610172825-2430a68c753a/go.mod h1:ghNXZW+/WQClcyiwZpbTzUCyxwql7YeMacYd44v+BJE= +github.com/ethereum/hive v0.0.0-20240715150147-c87a99dccfce h1:wgH9mh3TFSd+LFSsXO6RdTEO3niapJRywO1Xl3/IoIE= +github.com/ethereum/hive v0.0.0-20240715150147-c87a99dccfce/go.mod h1:ghNXZW+/WQClcyiwZpbTzUCyxwql7YeMacYd44v+BJE= github.com/fjl/memsize v0.0.2 h1:27txuSD9or+NZlnOWdKUxeBzTAUkWCVh+4Gf2dWFOzA= github.com/fjl/memsize v0.0.2/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= diff --git a/simulators/ethereum/rpc-compat/go.mod b/simulators/ethereum/rpc-compat/go.mod index da41d096d9..b3525cae64 100644 --- a/simulators/ethereum/rpc-compat/go.mod +++ b/simulators/ethereum/rpc-compat/go.mod @@ -6,7 +6,7 @@ toolchain go1.22.1 require ( github.com/ethereum/go-ethereum v1.14.5 - github.com/ethereum/hive v0.0.0-20240610172825-2430a68c753a + github.com/ethereum/hive v0.0.0-20240715150147-c87a99dccfce github.com/tidwall/gjson v1.17.0 github.com/tidwall/sjson v1.2.5 github.com/yudai/gojsondiff v1.0.0 diff --git a/simulators/ethereum/rpc-compat/go.sum b/simulators/ethereum/rpc-compat/go.sum index 78a9127377..6f2fb4a3b7 100644 --- a/simulators/ethereum/rpc-compat/go.sum +++ b/simulators/ethereum/rpc-compat/go.sum @@ -28,8 +28,8 @@ github.com/ethereum/c-kzg-4844 v1.0.0 h1:0X1LBXxaEtYD9xsyj9B9ctQEZIpnvVDeoBx8aHE github.com/ethereum/c-kzg-4844 v1.0.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= github.com/ethereum/go-ethereum v1.14.5 h1:szuFzO1MhJmweXjoM5nSAeDvjNUH3vIQoMzzQnfvjpw= github.com/ethereum/go-ethereum v1.14.5/go.mod h1:VEDGGhSxY7IEjn98hJRFXl/uFvpRgbIIf2PpXiyGGgc= -github.com/ethereum/hive v0.0.0-20240610172825-2430a68c753a h1:iyHHRPXaxHtEvyFxc4A+is/JRt88o0gQhHrNx+khEqQ= -github.com/ethereum/hive v0.0.0-20240610172825-2430a68c753a/go.mod h1:ghNXZW+/WQClcyiwZpbTzUCyxwql7YeMacYd44v+BJE= +github.com/ethereum/hive v0.0.0-20240715150147-c87a99dccfce h1:wgH9mh3TFSd+LFSsXO6RdTEO3niapJRywO1Xl3/IoIE= +github.com/ethereum/hive v0.0.0-20240715150147-c87a99dccfce/go.mod h1:ghNXZW+/WQClcyiwZpbTzUCyxwql7YeMacYd44v+BJE= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= diff --git a/simulators/ethereum/rpc/go.mod b/simulators/ethereum/rpc/go.mod index e88208a196..5837bc65e7 100644 --- a/simulators/ethereum/rpc/go.mod +++ b/simulators/ethereum/rpc/go.mod @@ -6,7 +6,7 @@ toolchain go1.22.1 require ( github.com/ethereum/go-ethereum v1.14.5 - github.com/ethereum/hive v0.0.0-20240610172825-2430a68c753a + github.com/ethereum/hive v0.0.0-20240715150147-c87a99dccfce github.com/kr/pretty v0.3.1 ) diff --git a/simulators/ethereum/rpc/go.sum b/simulators/ethereum/rpc/go.sum index ad36ef69ee..8d87b8bd7c 100644 --- a/simulators/ethereum/rpc/go.sum +++ b/simulators/ethereum/rpc/go.sum @@ -61,8 +61,8 @@ github.com/ethereum/go-ethereum v1.14.5 h1:szuFzO1MhJmweXjoM5nSAeDvjNUH3vIQoMzzQ github.com/ethereum/go-ethereum v1.14.5/go.mod h1:VEDGGhSxY7IEjn98hJRFXl/uFvpRgbIIf2PpXiyGGgc= github.com/ethereum/go-verkle v0.1.1-0.20240306133620-7d920df305f0 h1:KrE8I4reeVvf7C1tm8elRjj4BdscTYzz/WAbYyf/JI4= github.com/ethereum/go-verkle v0.1.1-0.20240306133620-7d920df305f0/go.mod h1:D9AJLVXSyZQXJQVk8oh1EwjISE+sJTn2duYIZC0dy3w= -github.com/ethereum/hive v0.0.0-20240610172825-2430a68c753a h1:iyHHRPXaxHtEvyFxc4A+is/JRt88o0gQhHrNx+khEqQ= -github.com/ethereum/hive v0.0.0-20240610172825-2430a68c753a/go.mod h1:ghNXZW+/WQClcyiwZpbTzUCyxwql7YeMacYd44v+BJE= +github.com/ethereum/hive v0.0.0-20240715150147-c87a99dccfce h1:wgH9mh3TFSd+LFSsXO6RdTEO3niapJRywO1Xl3/IoIE= +github.com/ethereum/hive v0.0.0-20240715150147-c87a99dccfce/go.mod h1:ghNXZW+/WQClcyiwZpbTzUCyxwql7YeMacYd44v+BJE= github.com/fjl/memsize v0.0.2 h1:27txuSD9or+NZlnOWdKUxeBzTAUkWCVh+4Gf2dWFOzA= github.com/fjl/memsize v0.0.2/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= diff --git a/simulators/ethereum/sync/go.mod b/simulators/ethereum/sync/go.mod index 3aca3de882..9a0197d9f9 100644 --- a/simulators/ethereum/sync/go.mod +++ b/simulators/ethereum/sync/go.mod @@ -6,7 +6,7 @@ toolchain go1.22.1 require ( github.com/ethereum/go-ethereum v1.14.5 - github.com/ethereum/hive v0.0.0-20240610172825-2430a68c753a + github.com/ethereum/hive v0.0.0-20240715150147-c87a99dccfce ) require ( diff --git a/simulators/ethereum/sync/go.sum b/simulators/ethereum/sync/go.sum index 11d6911a21..a928f712f5 100644 --- a/simulators/ethereum/sync/go.sum +++ b/simulators/ethereum/sync/go.sum @@ -55,8 +55,8 @@ github.com/ethereum/go-ethereum v1.14.5 h1:szuFzO1MhJmweXjoM5nSAeDvjNUH3vIQoMzzQ github.com/ethereum/go-ethereum v1.14.5/go.mod h1:VEDGGhSxY7IEjn98hJRFXl/uFvpRgbIIf2PpXiyGGgc= github.com/ethereum/go-verkle v0.1.1-0.20240306133620-7d920df305f0 h1:KrE8I4reeVvf7C1tm8elRjj4BdscTYzz/WAbYyf/JI4= github.com/ethereum/go-verkle v0.1.1-0.20240306133620-7d920df305f0/go.mod h1:D9AJLVXSyZQXJQVk8oh1EwjISE+sJTn2duYIZC0dy3w= -github.com/ethereum/hive v0.0.0-20240610172825-2430a68c753a h1:iyHHRPXaxHtEvyFxc4A+is/JRt88o0gQhHrNx+khEqQ= -github.com/ethereum/hive v0.0.0-20240610172825-2430a68c753a/go.mod h1:ghNXZW+/WQClcyiwZpbTzUCyxwql7YeMacYd44v+BJE= +github.com/ethereum/hive v0.0.0-20240715150147-c87a99dccfce h1:wgH9mh3TFSd+LFSsXO6RdTEO3niapJRywO1Xl3/IoIE= +github.com/ethereum/hive v0.0.0-20240715150147-c87a99dccfce/go.mod h1:ghNXZW+/WQClcyiwZpbTzUCyxwql7YeMacYd44v+BJE= github.com/fjl/memsize v0.0.2 h1:27txuSD9or+NZlnOWdKUxeBzTAUkWCVh+4Gf2dWFOzA= github.com/fjl/memsize v0.0.2/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= diff --git a/simulators/smoke/clique/go.mod b/simulators/smoke/clique/go.mod index 1219996f73..741c5d9a56 100644 --- a/simulators/smoke/clique/go.mod +++ b/simulators/smoke/clique/go.mod @@ -4,7 +4,7 @@ go 1.21 toolchain go1.22.1 -require github.com/ethereum/hive v0.0.0-20240610172825-2430a68c753a +require github.com/ethereum/hive v0.0.0-20240715150147-c87a99dccfce require ( github.com/Microsoft/go-winio v0.6.2 // indirect diff --git a/simulators/smoke/clique/go.sum b/simulators/smoke/clique/go.sum index b23d4fbb71..c93e8a1223 100644 --- a/simulators/smoke/clique/go.sum +++ b/simulators/smoke/clique/go.sum @@ -28,8 +28,8 @@ github.com/ethereum/c-kzg-4844 v1.0.0 h1:0X1LBXxaEtYD9xsyj9B9ctQEZIpnvVDeoBx8aHE github.com/ethereum/c-kzg-4844 v1.0.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= github.com/ethereum/go-ethereum v1.14.5 h1:szuFzO1MhJmweXjoM5nSAeDvjNUH3vIQoMzzQnfvjpw= github.com/ethereum/go-ethereum v1.14.5/go.mod h1:VEDGGhSxY7IEjn98hJRFXl/uFvpRgbIIf2PpXiyGGgc= -github.com/ethereum/hive v0.0.0-20240610172825-2430a68c753a h1:iyHHRPXaxHtEvyFxc4A+is/JRt88o0gQhHrNx+khEqQ= -github.com/ethereum/hive v0.0.0-20240610172825-2430a68c753a/go.mod h1:ghNXZW+/WQClcyiwZpbTzUCyxwql7YeMacYd44v+BJE= +github.com/ethereum/hive v0.0.0-20240715150147-c87a99dccfce h1:wgH9mh3TFSd+LFSsXO6RdTEO3niapJRywO1Xl3/IoIE= +github.com/ethereum/hive v0.0.0-20240715150147-c87a99dccfce/go.mod h1:ghNXZW+/WQClcyiwZpbTzUCyxwql7YeMacYd44v+BJE= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= diff --git a/simulators/smoke/genesis/go.mod b/simulators/smoke/genesis/go.mod index 3964a38e66..1cee024fc5 100644 --- a/simulators/smoke/genesis/go.mod +++ b/simulators/smoke/genesis/go.mod @@ -4,7 +4,7 @@ go 1.21 toolchain go1.22.1 -require github.com/ethereum/hive v0.0.0-20240610172825-2430a68c753a +require github.com/ethereum/hive v0.0.0-20240715150147-c87a99dccfce require ( github.com/Microsoft/go-winio v0.6.2 // indirect diff --git a/simulators/smoke/genesis/go.sum b/simulators/smoke/genesis/go.sum index b23d4fbb71..c93e8a1223 100644 --- a/simulators/smoke/genesis/go.sum +++ b/simulators/smoke/genesis/go.sum @@ -28,8 +28,8 @@ github.com/ethereum/c-kzg-4844 v1.0.0 h1:0X1LBXxaEtYD9xsyj9B9ctQEZIpnvVDeoBx8aHE github.com/ethereum/c-kzg-4844 v1.0.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= github.com/ethereum/go-ethereum v1.14.5 h1:szuFzO1MhJmweXjoM5nSAeDvjNUH3vIQoMzzQnfvjpw= github.com/ethereum/go-ethereum v1.14.5/go.mod h1:VEDGGhSxY7IEjn98hJRFXl/uFvpRgbIIf2PpXiyGGgc= -github.com/ethereum/hive v0.0.0-20240610172825-2430a68c753a h1:iyHHRPXaxHtEvyFxc4A+is/JRt88o0gQhHrNx+khEqQ= -github.com/ethereum/hive v0.0.0-20240610172825-2430a68c753a/go.mod h1:ghNXZW+/WQClcyiwZpbTzUCyxwql7YeMacYd44v+BJE= +github.com/ethereum/hive v0.0.0-20240715150147-c87a99dccfce h1:wgH9mh3TFSd+LFSsXO6RdTEO3niapJRywO1Xl3/IoIE= +github.com/ethereum/hive v0.0.0-20240715150147-c87a99dccfce/go.mod h1:ghNXZW+/WQClcyiwZpbTzUCyxwql7YeMacYd44v+BJE= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= diff --git a/simulators/smoke/network/go.mod b/simulators/smoke/network/go.mod index e61dd770a3..bdc7918e4d 100644 --- a/simulators/smoke/network/go.mod +++ b/simulators/smoke/network/go.mod @@ -4,7 +4,7 @@ go 1.21 toolchain go1.22.1 -require github.com/ethereum/hive v0.0.0-20240610172825-2430a68c753a +require github.com/ethereum/hive v0.0.0-20240715150147-c87a99dccfce require ( github.com/Microsoft/go-winio v0.6.2 // indirect diff --git a/simulators/smoke/network/go.sum b/simulators/smoke/network/go.sum index b23d4fbb71..c93e8a1223 100644 --- a/simulators/smoke/network/go.sum +++ b/simulators/smoke/network/go.sum @@ -28,8 +28,8 @@ github.com/ethereum/c-kzg-4844 v1.0.0 h1:0X1LBXxaEtYD9xsyj9B9ctQEZIpnvVDeoBx8aHE github.com/ethereum/c-kzg-4844 v1.0.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= github.com/ethereum/go-ethereum v1.14.5 h1:szuFzO1MhJmweXjoM5nSAeDvjNUH3vIQoMzzQnfvjpw= github.com/ethereum/go-ethereum v1.14.5/go.mod h1:VEDGGhSxY7IEjn98hJRFXl/uFvpRgbIIf2PpXiyGGgc= -github.com/ethereum/hive v0.0.0-20240610172825-2430a68c753a h1:iyHHRPXaxHtEvyFxc4A+is/JRt88o0gQhHrNx+khEqQ= -github.com/ethereum/hive v0.0.0-20240610172825-2430a68c753a/go.mod h1:ghNXZW+/WQClcyiwZpbTzUCyxwql7YeMacYd44v+BJE= +github.com/ethereum/hive v0.0.0-20240715150147-c87a99dccfce h1:wgH9mh3TFSd+LFSsXO6RdTEO3niapJRywO1Xl3/IoIE= +github.com/ethereum/hive v0.0.0-20240715150147-c87a99dccfce/go.mod h1:ghNXZW+/WQClcyiwZpbTzUCyxwql7YeMacYd44v+BJE= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= From dfc5aa7bfc0444272f08f498f63115ae445a7f47 Mon Sep 17 00:00:00 2001 From: Kolby Moroz Liebl <31669092+KolbyML@users.noreply.github.com> Date: Mon, 22 Jul 2024 17:37:56 -0600 Subject: [PATCH 314/387] simulators/portal: consolidate portal simulators (#1107) * simulators/portal/history: process epoch accumulators to be tested * simulators/portal: consolidate portal simulators --- .gitignore | 1 - simulators/portal/Cargo.lock | 4688 +++++++++++++++++ simulators/portal/{history => }/Cargo.toml | 8 +- simulators/portal/{beacon => }/Dockerfile | 15 +- simulators/portal/beacon/Cargo.toml | 22 - simulators/portal/beacon/src/main.rs | 62 - simulators/portal/history/Dockerfile | 34 - simulators/portal/history/src/main.rs | 77 - simulators/portal/src/main.rs | 182 + .../suites => src/suites/beacon}/constants.rs | 2 +- .../suites => src/suites/beacon}/interop.rs | 4 +- .../src/suites => src/suites/beacon}/mesh.rs | 12 +- .../src/suites => src/suites/beacon}/mod.rs | 0 .../suites/beacon}/rpc_compat.rs | 11 +- .../suites/history}/constants.rs | 0 .../suites => src/suites/history}/interop.rs | 27 +- .../src/suites => src/suites/history}/mesh.rs | 4 +- .../src/suites => src/suites/history}/mod.rs | 0 .../suites/history}/rpc_compat.rs | 4 +- .../suites/history}/trin_bridge.rs | 0 simulators/portal/src/suites/mod.rs | 3 + .../suites => src/suites/state}/constants.rs | 2 +- .../suites => src/suites/state}/interop.rs | 4 +- .../src/suites => src/suites/state}/mod.rs | 0 .../suites => src/suites/state}/rpc_compat.rs | 12 +- simulators/portal/state/Cargo.toml | 22 - simulators/portal/state/Dockerfile | 37 - simulators/portal/state/src/main.rs | 46 - 28 files changed, 4928 insertions(+), 351 deletions(-) create mode 100644 simulators/portal/Cargo.lock rename simulators/portal/{history => }/Cargo.toml (87%) rename simulators/portal/{beacon => }/Dockerfile (59%) delete mode 100755 simulators/portal/beacon/Cargo.toml delete mode 100644 simulators/portal/beacon/src/main.rs delete mode 100644 simulators/portal/history/Dockerfile delete mode 100644 simulators/portal/history/src/main.rs create mode 100644 simulators/portal/src/main.rs rename simulators/portal/{beacon/src/suites => src/suites/beacon}/constants.rs (99%) rename simulators/portal/{beacon/src/suites => src/suites/beacon}/interop.rs (99%) rename simulators/portal/{beacon/src/suites => src/suites/beacon}/mesh.rs (96%) rename simulators/portal/{beacon/src/suites => src/suites/beacon}/mod.rs (100%) rename simulators/portal/{beacon/src/suites => src/suites/beacon}/rpc_compat.rs (98%) rename simulators/portal/{history/src/suites => src/suites/history}/constants.rs (100%) rename simulators/portal/{history/src/suites => src/suites/history}/interop.rs (96%) rename simulators/portal/{history/src/suites => src/suites/history}/mesh.rs (98%) rename simulators/portal/{history/src/suites => src/suites/history}/mod.rs (100%) rename simulators/portal/{history/src/suites => src/suites/history}/rpc_compat.rs (99%) rename simulators/portal/{history/src/suites => src/suites/history}/trin_bridge.rs (100%) create mode 100644 simulators/portal/src/suites/mod.rs rename simulators/portal/{state/src/suites => src/suites/state}/constants.rs (98%) rename simulators/portal/{state/src/suites => src/suites/state}/interop.rs (99%) rename simulators/portal/{state/src/suites => src/suites/state}/mod.rs (100%) rename simulators/portal/{state/src/suites => src/suites/state}/rpc_compat.rs (98%) delete mode 100755 simulators/portal/state/Cargo.toml delete mode 100644 simulators/portal/state/Dockerfile delete mode 100644 simulators/portal/state/src/main.rs diff --git a/.gitignore b/.gitignore index 9335372ced..f8bbbfda7a 100644 --- a/.gitignore +++ b/.gitignore @@ -5,7 +5,6 @@ workspace /hive # build output for rust simulators and hivesim-rs files -simulators/**/Cargo.lock simulators/**/target hivesim-rs/Cargo.lock hivesim-rs/target diff --git a/simulators/portal/Cargo.lock b/simulators/portal/Cargo.lock new file mode 100644 index 0000000000..857676306b --- /dev/null +++ b/simulators/portal/Cargo.lock @@ -0,0 +1,4688 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "addr2line" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e4503c46a5c0c7844e948c9a4d6acd9f50cccb4de1c48eb9e291ea17470c678" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + +[[package]] +name = "aead" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b613b8e1e3cf911a086f53f03bf286f52fd7a7258e4fa606f0ef220d39d8877" +dependencies = [ + "generic-array", +] + +[[package]] +name = "aes" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e8b47f52ea9bae42228d07ec09eb676433d7c4ed1ebdf0f1d1c29ed446f1ab8" +dependencies = [ + "cfg-if", + "cipher", + "cpufeatures", + "ctr", + "opaque-debug", +] + +[[package]] +name = "aes-gcm" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df5f85a83a7d8b0442b6aa7b504b8212c1733da07b98aae43d4bc21b2cb3cdf6" +dependencies = [ + "aead", + "aes", + "cipher", + "ctr", + "ghash", + "subtle", +] + +[[package]] +name = "ahash" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" +dependencies = [ + "cfg-if", + "once_cell", + "version_check", + "zerocopy", +] + +[[package]] +name = "aho-corasick" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +dependencies = [ + "memchr", +] + +[[package]] +name = "allocator-api2" +version = "0.2.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" + +[[package]] +name = "alloy-rlp" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b155716bab55763c95ba212806cf43d05bcc70e5f35b02bad20cf5ec7fe11fed" +dependencies = [ + "arrayvec", + "bytes", +] + +[[package]] +name = "android-tzdata" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + +[[package]] +name = "anstream" +version = "0.6.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "418c75fa768af9c03be99d17643f93f79bbba589895012a80e3452a19ddda15b" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is_terminal_polyfill", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "038dfcf04a5feb68e9c60b21c9625a54c2c0616e79b72b0fd87075a056ae1d1b" + +[[package]] +name = "anstyle-parse" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c03a11a9034d92058ceb6ee011ce58af4a9bf61491aa7e1e59ecd24bd40d22d4" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad186efb764318d35165f1758e7dcef3b10628e26d41a44bc5550652e6804391" +dependencies = [ + "windows-sys 0.52.0", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61a38449feb7068f52bb06c12759005cf459ee52bb4adc1d5a7c4322d716fb19" +dependencies = [ + "anstyle", + "windows-sys 0.52.0", +] + +[[package]] +name = "anyhow" +version = "1.0.86" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da" + +[[package]] +name = "ark-ff" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b3235cc41ee7a12aaaf2c575a2ad7b46713a8a50bda2fc3b003a04845c05dd6" +dependencies = [ + "ark-ff-asm 0.3.0", + "ark-ff-macros 0.3.0", + "ark-serialize 0.3.0", + "ark-std 0.3.0", + "derivative", + "num-bigint", + "num-traits", + "paste", + "rustc_version 0.3.3", + "zeroize", +] + +[[package]] +name = "ark-ff" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec847af850f44ad29048935519032c33da8aa03340876d351dfab5660d2966ba" +dependencies = [ + "ark-ff-asm 0.4.2", + "ark-ff-macros 0.4.2", + "ark-serialize 0.4.2", + "ark-std 0.4.0", + "derivative", + "digest 0.10.7", + "itertools 0.10.5", + "num-bigint", + "num-traits", + "paste", + "rustc_version 0.4.0", + "zeroize", +] + +[[package]] +name = "ark-ff-asm" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db02d390bf6643fb404d3d22d31aee1c4bc4459600aef9113833d17e786c6e44" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-ff-asm" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ed4aa4fe255d0bc6d79373f7e31d2ea147bcf486cba1be5ba7ea85abdb92348" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-ff-macros" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db2fd794a08ccb318058009eefdf15bcaaaaf6f8161eb3345f907222bac38b20" +dependencies = [ + "num-bigint", + "num-traits", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-ff-macros" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7abe79b0e4288889c4574159ab790824d0033b9fdcb2a112a3182fac2e514565" +dependencies = [ + "num-bigint", + "num-traits", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-serialize" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d6c2b318ee6e10f8c2853e73a83adc0ccb88995aa978d8a3408d492ab2ee671" +dependencies = [ + "ark-std 0.3.0", + "digest 0.9.0", +] + +[[package]] +name = "ark-serialize" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adb7b85a02b83d2f22f89bd5cac66c9c89474240cb6207cb1efc16d098e822a5" +dependencies = [ + "ark-std 0.4.0", + "digest 0.10.7", + "num-bigint", +] + +[[package]] +name = "ark-std" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1df2c09229cbc5a028b1d70e00fdb2acee28b1055dfb5ca73eea49c5a25c4e7c" +dependencies = [ + "num-traits", + "rand", +] + +[[package]] +name = "ark-std" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185" +dependencies = [ + "num-traits", + "rand", +] + +[[package]] +name = "arrayvec" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" + +[[package]] +name = "async-lock" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "287272293e9d8c41773cec55e365490fe034813a2f172f502d6ddcf75b2f582b" +dependencies = [ + "event-listener", +] + +[[package]] +name = "async-trait" +version = "0.1.80" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6fa2087f2753a7da8cc1c0dbfcf89579dd57458e36769de5ac750b4671737ca" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.66", +] + +[[package]] +name = "auto_impl" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c87f3f15e7794432337fc718554eaa4dc8f04c9677a950ffe366f20a162ae42" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.66", +] + +[[package]] +name = "autocfg" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" + +[[package]] +name = "backtrace" +version = "0.3.73" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cc23269a4f8976d0a4d2e7109211a419fe30e8d88d677cd60b6bc79c5732e0a" +dependencies = [ + "addr2line", + "cc", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", +] + +[[package]] +name = "base16ct" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" + +[[package]] +name = "base64" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" + +[[package]] +name = "base64" +version = "0.21.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "base64ct" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" + +[[package]] +name = "beef" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a8241f3ebb85c056b509d4327ad0358fbbba6ffb340bf388f26350aeda225b1" +dependencies = [ + "serde", +] + +[[package]] +name = "bindgen" +version = "0.66.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2b84e06fc203107bfbad243f4aba2af864eb7db3b1cf46ea0a023b0b433d2a7" +dependencies = [ + "bitflags 2.5.0", + "cexpr", + "clang-sys", + "lazy_static", + "lazycell", + "log", + "peeking_take_while", + "prettyplease", + "proc-macro2", + "quote", + "regex", + "rustc-hash", + "shlex", + "syn 2.0.66", + "which", +] + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" +dependencies = [ + "serde", +] + +[[package]] +name = "bitvec" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" +dependencies = [ + "funty", + "radium", + "serde", + "tap", + "wyz", +] + +[[package]] +name = "block-buffer" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" +dependencies = [ + "block-padding", + "generic-array", +] + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "block-padding" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d696c370c750c948ada61c69a0ee2cbbb9c50b1019ddb86d9317157a99c2cae" + +[[package]] +name = "blst" +version = "0.3.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62dc83a094a71d43eeadd254b1ec2d24cb6a0bb6cadce00df51f0db594711a32" +dependencies = [ + "cc", + "glob", + "threadpool", + "zeroize", +] + +[[package]] +name = "bumpalo" +version = "3.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" + +[[package]] +name = "byte-slice-cast" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3ac9f8b63eca6fd385229b3675f6cc0dc5c8a5c8a54a59d4f52ffd670d87b0c" + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9" +dependencies = [ + "serde", +] + +[[package]] +name = "c-kzg" +version = "0.1.0" +source = "git+https://github.com/ethereum/c-kzg-4844?rev=f5f6f863d475847876a2bd5ee252058d37c3a15d#f5f6f863d475847876a2bd5ee252058d37c3a15d" +dependencies = [ + "bindgen", + "blst", + "cc", + "glob", + "hex", + "libc", + "serde", +] + +[[package]] +name = "c-kzg" +version = "1.0.2" +source = "git+https://github.com/ethereum/c-kzg-4844#b175a271df7f2fa4d324d4c11479ac1800c05e80" +dependencies = [ + "blst", + "cc", + "glob", + "hex", + "libc", +] + +[[package]] +name = "cc" +version = "1.0.99" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96c51067fd44124faa7f870b4b1c969379ad32b2ba805aa959430ceaa384f695" +dependencies = [ + "jobserver", + "libc", + "once_cell", +] + +[[package]] +name = "cexpr" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" +dependencies = [ + "nom", +] + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "chrono" +version = "0.4.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" +dependencies = [ + "android-tzdata", + "iana-time-zone", + "num-traits", + "serde", + "windows-targets 0.52.5", +] + +[[package]] +name = "cipher" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ee52072ec15386f770805afd189a01c8841be8696bed250fa2f13c4c0d6dfb7" +dependencies = [ + "generic-array", +] + +[[package]] +name = "clang-sys" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4" +dependencies = [ + "glob", + "libc", + "libloading", +] + +[[package]] +name = "clap" +version = "4.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5db83dced34638ad474f39f250d7fea9598bdd239eaced1bdf45d597da0f433f" +dependencies = [ + "clap_builder", + "clap_derive", +] + +[[package]] +name = "clap_builder" +version = "4.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7e204572485eb3fbf28f871612191521df159bc3e15a9f5064c66dba3a8c05f" +dependencies = [ + "anstream", + "anstyle", + "clap_lex", + "strsim 0.11.1", +] + +[[package]] +name = "clap_derive" +version = "4.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c780290ccf4fb26629baa7a1081e68ced113f1d3ec302fa5948f1c381ebf06c6" +dependencies = [ + "heck 0.5.0", + "proc-macro2", + "quote", + "syn 2.0.66", +] + +[[package]] +name = "clap_lex" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b82cf0babdbd58558212896d1a4272303a57bdb245c2bf1147185fb45640e70" + +[[package]] +name = "codecs-derive" +version = "0.1.0-alpha.10" +source = "git+https://github.com/paradigmxyz/reth.git?tag=v0.1.0-alpha.10#1b16d804ef01f4ec3c25e7986381c22739c105b9" +dependencies = [ + "convert_case 0.6.0", + "parity-scale-codec", + "proc-macro2", + "quote", + "serde", + "syn 2.0.66", +] + +[[package]] +name = "colorchoice" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b6a852b24ab71dffc585bcb46eaf7959d175cb865a7152e35b348d1b2960422" + +[[package]] +name = "const-hex" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94fb8a24a26d37e1ffd45343323dc9fe6654ceea44c12f2fcb3d7ac29e610bc6" +dependencies = [ + "cfg-if", + "cpufeatures", + "hex", + "proptest", + "serde", +] + +[[package]] +name = "const-oid" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" + +[[package]] +name = "convert_case" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" + +[[package]] +name = "convert_case" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec182b0ca2f35d8fc196cf3404988fd8b8c739a4d270ff118a398feb0cbec1ca" +dependencies = [ + "unicode-segmentation", +] + +[[package]] +name = "core-foundation" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" + +[[package]] +name = "cpufeatures" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" +dependencies = [ + "libc", +] + +[[package]] +name = "crc" +version = "3.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69e6e4d7b33a94f0991c26729976b10ebde1d34c3ee82408fb536164fa10d636" +dependencies = [ + "crc-catalog", +] + +[[package]] +name = "crc-catalog" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" + +[[package]] +name = "crc32fast" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" + +[[package]] +name = "crunchy" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" + +[[package]] +name = "crypto-bigint" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" +dependencies = [ + "generic-array", + "rand_core", + "subtle", + "zeroize", +] + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "ctr" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "049bb91fb4aaf0e3c7efa6cd5ef877dbbbd15b39dad06d9948de4ec8a75761ea" +dependencies = [ + "cipher", +] + +[[package]] +name = "curve25519-dalek" +version = "4.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be" +dependencies = [ + "cfg-if", + "cpufeatures", + "curve25519-dalek-derive", + "digest 0.10.7", + "fiat-crypto", + "rustc_version 0.4.0", + "subtle", + "zeroize", +] + +[[package]] +name = "curve25519-dalek-derive" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.66", +] + +[[package]] +name = "darling" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a01d95850c592940db9b8194bc39f4bc0e89dee5c4265e4b1807c34a9aba453c" +dependencies = [ + "darling_core 0.13.4", + "darling_macro 0.13.4", +] + +[[package]] +name = "darling" +version = "0.20.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83b2eb4d90d12bdda5ed17de686c2acb4c57914f8f921b8da7e112b5a36f3fe1" +dependencies = [ + "darling_core 0.20.9", + "darling_macro 0.20.9", +] + +[[package]] +name = "darling_core" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "859d65a907b6852c9361e3185c862aae7fafd2887876799fa55f5f99dc40d610" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim 0.10.0", + "syn 1.0.109", +] + +[[package]] +name = "darling_core" +version = "0.20.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "622687fe0bac72a04e5599029151f5796111b90f1baaa9b544d807a5e31cd120" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim 0.11.1", + "syn 2.0.66", +] + +[[package]] +name = "darling_macro" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c972679f83bdf9c42bd905396b6c3588a843a17f0f16dfcfa3e2c5d57441835" +dependencies = [ + "darling_core 0.13.4", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "darling_macro" +version = "0.20.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "733cabb43482b1a1b53eee8583c2b9e8684d592215ea83efd305dd31bc2f0178" +dependencies = [ + "darling_core 0.20.9", + "quote", + "syn 2.0.66", +] + +[[package]] +name = "delay_map" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4355c25cbf99edcb6b4a0e906f6bdc6956eda149e84455bea49696429b2f8e8" +dependencies = [ + "futures", + "tokio-util", +] + +[[package]] +name = "der" +version = "0.7.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f55bf8e7b65898637379c1b74eb1551107c8294ed26d855ceb9fd1a09cfc9bc0" +dependencies = [ + "const-oid", + "zeroize", +] + +[[package]] +name = "deranged" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" +dependencies = [ + "powerfmt", + "serde", +] + +[[package]] +name = "derivative" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "derive_more" +version = "0.99.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f33878137e4dafd7fa914ad4e259e18a4e8e532b9617a2d0150262bf53abfce" +dependencies = [ + "convert_case 0.4.0", + "proc-macro2", + "quote", + "rustc_version 0.4.0", + "syn 2.0.66", +] + +[[package]] +name = "digest" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" +dependencies = [ + "generic-array", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer 0.10.4", + "const-oid", + "crypto-common", + "subtle", +] + +[[package]] +name = "discv5" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bac33cb3f99889a57e56a8c6ccb77aaf0cfc7787602b7af09783f736d77314e1" +dependencies = [ + "aes", + "aes-gcm", + "arrayvec", + "delay_map", + "enr", + "fnv", + "futures", + "hashlink", + "hex", + "hkdf", + "lazy_static", + "lru", + "more-asserts", + "parking_lot 0.11.2", + "rand", + "rlp", + "smallvec", + "socket2 0.4.10", + "tokio", + "tracing", + "uint", + "zeroize", +] + +[[package]] +name = "dyn-clone" +version = "1.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d6ef0072f8a535281e4876be788938b528e9a1d43900b82c2569af7da799125" + +[[package]] +name = "ecdsa" +version = "0.16.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" +dependencies = [ + "der", + "digest 0.10.7", + "elliptic-curve", + "rfc6979", + "signature", + "spki", +] + +[[package]] +name = "ed25519" +version = "2.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53" +dependencies = [ + "pkcs8", + "signature", +] + +[[package]] +name = "ed25519-dalek" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a3daa8e81a3963a60642bcc1f90a670680bd4a77535faa384e9d1c79d620871" +dependencies = [ + "curve25519-dalek", + "ed25519", + "rand_core", + "serde", + "sha2", + "subtle", + "zeroize", +] + +[[package]] +name = "either" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3dca9240753cf90908d7e4aac30f630662b02aebaa1b58a3cadabdb23385b58b" + +[[package]] +name = "elliptic-curve" +version = "0.13.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" +dependencies = [ + "base16ct", + "crypto-bigint", + "digest 0.10.7", + "ff", + "generic-array", + "group", + "pkcs8", + "rand_core", + "sec1", + "subtle", + "zeroize", +] + +[[package]] +name = "encoding_rs" +version = "0.8.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b45de904aa0b010bce2ab45264d0631681847fa7b6f2eaa7dab7619943bc4f59" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "enr" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a3d8dc56e02f954cac8eb489772c552c473346fc34f67412bb6244fd647f7e4" +dependencies = [ + "base64 0.21.7", + "bytes", + "ed25519-dalek", + "hex", + "k256", + "log", + "rand", + "rlp", + "serde", + "sha3 0.10.8", + "zeroize", +] + +[[package]] +name = "enumn" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fd000fd6988e73bbe993ea3db9b1aa64906ab88766d654973924340c8cddb42" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.66", +] + +[[package]] +name = "env_logger" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a19187fea3ac7e84da7dacf48de0c45d63c6a76f9490dae389aead16c243fce3" +dependencies = [ + "log", + "regex", +] + +[[package]] +name = "equivalent" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" + +[[package]] +name = "errno" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "eth_trie" +version = "0.4.0" +source = "git+https://github.com/morph-dev/eth-trie.rs.git?branch=trin#83bf198df680cde7abea9de049f4b78ab9c81309" +dependencies = [ + "ethereum-types", + "hashbrown 0.14.5", + "keccak-hash", + "log", + "parking_lot 0.12.3", + "rlp", +] + +[[package]] +name = "ethabi" +version = "18.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7413c5f74cc903ea37386a8965a936cbeb334bd270862fdece542c1b2dcbc898" +dependencies = [ + "ethereum-types", + "hex", + "once_cell", + "regex", + "serde", + "serde_json", + "sha3 0.10.8", + "thiserror", + "uint", +] + +[[package]] +name = "ethbloom" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c22d4b5885b6aa2fe5e8b9329fb8d232bf739e434e6b87347c63bdd00c120f60" +dependencies = [ + "crunchy", + "fixed-hash", + "impl-codec", + "impl-rlp", + "impl-serde", + "scale-info", + "tiny-keccak", +] + +[[package]] +name = "ethereum-types" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02d215cbf040552efcbe99a38372fe80ab9d00268e20012b79fcd0f073edd8ee" +dependencies = [ + "ethbloom", + "fixed-hash", + "impl-codec", + "impl-rlp", + "impl-serde", + "primitive-types", + "scale-info", + "uint", +] + +[[package]] +name = "ethereum_hashing" +version = "1.0.0-beta.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "233dc6f434ce680dbabf4451ee3380cec46cb3c45d66660445a435619710dd35" +dependencies = [ + "cpufeatures", + "lazy_static", + "ring 0.16.20", + "sha2", +] + +[[package]] +name = "ethereum_serde_utils" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de4d5951468846963c24e8744c133d44f39dff2cd3a233f6be22b370d08a524f" +dependencies = [ + "ethereum-types", + "hex", + "serde", + "serde_derive", + "serde_json", +] + +[[package]] +name = "ethereum_ssz" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d3627f83d8b87b432a5fad9934b4565260722a141a2c40f371f8080adec9425" +dependencies = [ + "ethereum-types", + "itertools 0.10.5", + "smallvec", +] + +[[package]] +name = "ethereum_ssz_derive" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eccd5378ec34a07edd3d9b48088cbc63309d0367d14ba10b0cdb1d1791080ea" +dependencies = [ + "darling 0.13.4", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ethers-core" +version = "2.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82d80cc6ad30b14a48ab786523af33b37f28a8623fc06afd55324816ef18fb1f" +dependencies = [ + "arrayvec", + "bytes", + "chrono", + "const-hex", + "elliptic-curve", + "ethabi", + "generic-array", + "k256", + "num_enum", + "open-fastrlp", + "rand", + "rlp", + "serde", + "serde_json", + "strum 0.26.2", + "tempfile", + "thiserror", + "tiny-keccak", + "unicode-xid", +] + +[[package]] +name = "ethnum" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b90ca2580b73ab6a1f724b76ca11ab632df820fd6040c336200d2c1df7b3c82c" + +[[package]] +name = "ethportal-api" +version = "0.2.2" +source = "git+https://github.com/ethereum/trin?rev=33ea99da64216899f7ab2778d117a18506d963dd#33ea99da64216899f7ab2778d117a18506d963dd" +dependencies = [ + "anyhow", + "base64 0.13.1", + "bytes", + "clap", + "discv5", + "eth_trie", + "ethereum-types", + "ethereum_serde_utils", + "ethereum_ssz", + "ethereum_ssz_derive", + "ethnum", + "hex", + "jsonrpsee", + "keccak-hash", + "lazy_static", + "nanotemplate", + "quickcheck", + "rand", + "reth-rpc-types", + "rlp", + "rlp-derive", + "rs_merkle", + "ruint", + "serde", + "serde-this-or-that", + "serde_json", + "serde_yaml", + "sha2", + "sha3 0.9.1", + "snap", + "ssz_types", + "superstruct", + "thiserror", + "tokio", + "tree_hash", + "tree_hash_derive", + "ureq", + "url", + "validator", +] + +[[package]] +name = "event-listener" +version = "2.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" + +[[package]] +name = "fastrand" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a" + +[[package]] +name = "fastrlp" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "139834ddba373bbdd213dffe02c8d110508dcf1726c2be27e8d1f7d7e1856418" +dependencies = [ + "arrayvec", + "auto_impl", + "bytes", +] + +[[package]] +name = "ff" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" +dependencies = [ + "rand_core", + "subtle", +] + +[[package]] +name = "fiat-crypto" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" + +[[package]] +name = "fixed-hash" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "835c052cb0c08c1acf6ffd71c022172e18723949c8282f2b9f27efbc51e64534" +dependencies = [ + "byteorder", + "rand", + "rustc-hex", + "static_assertions", +] + +[[package]] +name = "flate2" +version = "1.0.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f54427cfd1c7829e2a139fcefea601bf088ebca651d2bf53ebc600eac295dae" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "form_urlencoded" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + +[[package]] +name = "futures" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" + +[[package]] +name = "futures-executor" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" + +[[package]] +name = "futures-macro" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.66", +] + +[[package]] +name = "futures-sink" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" + +[[package]] +name = "futures-task" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" + +[[package]] +name = "futures-timer" +version = "3.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f288b0a4f20f9a56b5d1da57e2227c661b7b16168e2f72365f57b63326e29b24" +dependencies = [ + "gloo-timers", + "send_wrapper", +] + +[[package]] +name = "futures-util" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", + "zeroize", +] + +[[package]] +name = "getrandom" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "ghash" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1583cc1656d7839fd3732b80cf4f38850336cdb9b8ded1cd399ca62958de3c99" +dependencies = [ + "opaque-debug", + "polyval", +] + +[[package]] +name = "gimli" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40ecd4077b5ae9fd2e9e169b102c6c330d0605168eb0e8bf79952b256dbefffd" + +[[package]] +name = "glob" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" + +[[package]] +name = "gloo-net" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ac9e8288ae2c632fa9f8657ac70bfe38a1530f345282d7ba66a1f70b72b7dc4" +dependencies = [ + "futures-channel", + "futures-core", + "futures-sink", + "gloo-utils", + "http", + "js-sys", + "pin-project", + "serde", + "serde_json", + "thiserror", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "gloo-timers" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b995a66bb87bebce9a0f4a95aed01daca4872c050bfcb21653361c03bc35e5c" +dependencies = [ + "futures-channel", + "futures-core", + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "gloo-utils" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b5555354113b18c547c1d3a98fbf7fb32a9ff4f6fa112ce823a21641a0ba3aa" +dependencies = [ + "js-sys", + "serde", + "serde_json", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "group" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" +dependencies = [ + "ff", + "rand_core", + "subtle", +] + +[[package]] +name = "h2" +version = "0.3.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" +dependencies = [ + "bytes", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http", + "indexmap 2.2.6", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" +dependencies = [ + "ahash", + "allocator-api2", + "serde", +] + +[[package]] +name = "hashlink" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8094feaf31ff591f651a2664fb9cfd92bba7a60ce3197265e9482ebe753c8f7" +dependencies = [ + "hashbrown 0.14.5", +] + +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "hermit-abi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" +dependencies = [ + "serde", +] + +[[package]] +name = "hex-literal" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fe2267d4ed49bc07b63801559be28c718ea06c4738b7a03c94df7386d2cde46" + +[[package]] +name = "hivesim" +version = "0.1.0-alpha.1" +source = "git+https://github.com/ethereum/hive?rev=62b3362bae655754b5f624c36720ba8c44a2f375#62b3362bae655754b5f624c36720ba8c44a2f375" +dependencies = [ + "async-trait", + "dyn-clone", + "jsonrpsee", + "regex", + "reqwest", + "serde", + "serde_json", + "tokio", +] + +[[package]] +name = "hkdf" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" +dependencies = [ + "hmac", +] + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest 0.10.7", +] + +[[package]] +name = "home" +version = "0.5.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5" +dependencies = [ + "windows-sys 0.52.0", +] + +[[package]] +name = "http" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http-body" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" +dependencies = [ + "bytes", + "http", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fcc0b4a115bf80b728eb8ea024ad5bd707b615bfed49e0665b6e0f86fd082d9" + +[[package]] +name = "httpdate" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" + +[[package]] +name = "hyper" +version = "0.14.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f361cde2f109281a220d4307746cdfd5ee3f410da58a70377762396775634b33" +dependencies = [ + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "socket2 0.5.7", + "tokio", + "tower-service", + "tracing", + "want", +] + +[[package]] +name = "hyper-rustls" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" +dependencies = [ + "futures-util", + "http", + "hyper", + "log", + "rustls", + "rustls-native-certs", + "tokio", + "tokio-rustls", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.60" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "wasm-bindgen", + "windows-core", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "idna" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "418a0a6fab821475f634efe3ccc45c013f742efe03d853e8d3355d5cb850ecf8" +dependencies = [ + "matches", + "unicode-bidi", + "unicode-normalization", +] + +[[package]] +name = "idna" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" +dependencies = [ + "unicode-bidi", + "unicode-normalization", +] + +[[package]] +name = "if_chain" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb56e1aa765b4b4f3aadfab769793b7087bb03a4ea4920644a6d238e2df5b9ed" + +[[package]] +name = "impl-codec" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba6a270039626615617f3f36d15fc827041df3b78c439da2cadfa47455a77f2f" +dependencies = [ + "parity-scale-codec", +] + +[[package]] +name = "impl-rlp" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f28220f89297a075ddc7245cd538076ee98b01f2a9c23a53a4f1105d5a322808" +dependencies = [ + "rlp", +] + +[[package]] +name = "impl-serde" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc88fc67028ae3db0c853baa36269d398d5f45b6982f95549ff5def78c935cd" +dependencies = [ + "serde", +] + +[[package]] +name = "impl-trait-for-tuples" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11d7a9f6330b71fea57921c9b61c47ee6e84f72d394754eff6163ae67e7395eb" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown 0.12.3", + "serde", +] + +[[package]] +name = "indexmap" +version = "2.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" +dependencies = [ + "equivalent", + "hashbrown 0.14.5", + "serde", +] + +[[package]] +name = "instant" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "ipnet" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" + +[[package]] +name = "is_terminal_polyfill" +version = "1.70.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8478577c03552c21db0e2724ffb8986a5ce7af88107e6be5d2ee6e158c12800" + +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" + +[[package]] +name = "jobserver" +version = "0.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2b099aaa34a9751c5bf0878add70444e1ed2dd73f347be99003d4577277de6e" +dependencies = [ + "libc", +] + +[[package]] +name = "js-sys" +version = "0.3.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "jsonrpsee" +version = "0.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "affdc52f7596ccb2d7645231fc6163bb314630c989b64998f3699a28b4d5d4dc" +dependencies = [ + "jsonrpsee-client-transport", + "jsonrpsee-core", + "jsonrpsee-http-client", + "jsonrpsee-proc-macros", + "jsonrpsee-server", + "jsonrpsee-types", + "jsonrpsee-wasm-client", + "jsonrpsee-ws-client", + "tokio", + "tracing", +] + +[[package]] +name = "jsonrpsee-client-transport" +version = "0.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5b005c793122d03217da09af68ba9383363caa950b90d3436106df8cabce935" +dependencies = [ + "futures-channel", + "futures-util", + "gloo-net", + "http", + "jsonrpsee-core", + "pin-project", + "rustls-native-certs", + "soketto", + "thiserror", + "tokio", + "tokio-rustls", + "tokio-util", + "tracing", + "url", + "webpki-roots", +] + +[[package]] +name = "jsonrpsee-core" +version = "0.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da2327ba8df2fdbd5e897e2b5ed25ce7f299d345b9736b6828814c3dbd1fd47b" +dependencies = [ + "anyhow", + "async-lock", + "async-trait", + "beef", + "futures-timer", + "futures-util", + "hyper", + "jsonrpsee-types", + "parking_lot 0.12.3", + "rand", + "rustc-hash", + "serde", + "serde_json", + "soketto", + "thiserror", + "tokio", + "tracing", + "wasm-bindgen-futures", +] + +[[package]] +name = "jsonrpsee-http-client" +version = "0.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f80c17f62c7653ce767e3d7288b793dfec920f97067ceb189ebdd3570f2bc20" +dependencies = [ + "async-trait", + "hyper", + "hyper-rustls", + "jsonrpsee-core", + "jsonrpsee-types", + "serde", + "serde_json", + "thiserror", + "tokio", + "tower", + "tracing", + "url", +] + +[[package]] +name = "jsonrpsee-proc-macros" +version = "0.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29110019693a4fa2dbda04876499d098fa16d70eba06b1e6e2b3f1b251419515" +dependencies = [ + "heck 0.4.1", + "proc-macro-crate 1.3.1", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "jsonrpsee-server" +version = "0.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82c39a00449c9ef3f50b84fc00fc4acba20ef8f559f07902244abf4c15c5ab9c" +dependencies = [ + "futures-util", + "http", + "hyper", + "jsonrpsee-core", + "jsonrpsee-types", + "route-recognizer", + "serde", + "serde_json", + "soketto", + "thiserror", + "tokio", + "tokio-stream", + "tokio-util", + "tower", + "tracing", +] + +[[package]] +name = "jsonrpsee-types" +version = "0.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5be0be325642e850ed0bdff426674d2e66b2b7117c9be23a7caef68a2902b7d9" +dependencies = [ + "anyhow", + "beef", + "serde", + "serde_json", + "thiserror", + "tracing", +] + +[[package]] +name = "jsonrpsee-wasm-client" +version = "0.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c7cbb3447cf14fd4d2f407c3cc96e6c9634d5440aa1fbed868a31f3c02b27f0" +dependencies = [ + "jsonrpsee-client-transport", + "jsonrpsee-core", + "jsonrpsee-types", +] + +[[package]] +name = "jsonrpsee-ws-client" +version = "0.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bca9cb3933ccae417eb6b08c3448eb1cb46e39834e5b503e395e5e5bd08546c0" +dependencies = [ + "http", + "jsonrpsee-client-transport", + "jsonrpsee-core", + "jsonrpsee-types", + "url", +] + +[[package]] +name = "k256" +version = "0.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "956ff9b67e26e1a6a866cb758f12c6f8746208489e3e4a4b5580802f2f0a587b" +dependencies = [ + "cfg-if", + "ecdsa", + "elliptic-curve", + "once_cell", + "sha2", + "signature", +] + +[[package]] +name = "keccak" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecc2af9a1119c51f12a14607e783cb977bde58bc069ff0c3da1095e635d70654" +dependencies = [ + "cpufeatures", +] + +[[package]] +name = "keccak-hash" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b286e6b663fb926e1eeb68528e69cb70ed46c6d65871a21b2215ae8154c6d3c" +dependencies = [ + "primitive-types", + "tiny-keccak", +] + +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + +[[package]] +name = "lazycell" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" + +[[package]] +name = "libc" +version = "0.2.155" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" + +[[package]] +name = "libloading" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c2a198fb6b0eada2a8df47933734e6d35d350665a33a3593d7164fa52c75c19" +dependencies = [ + "cfg-if", + "windows-targets 0.52.5", +] + +[[package]] +name = "libm" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" + +[[package]] +name = "linux-raw-sys" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" + +[[package]] +name = "lock_api" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" + +[[package]] +name = "lru" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3262e75e648fce39813cb56ac41f3c3e3f65217ebf3844d818d1f9398cfb0dc" +dependencies = [ + "hashbrown 0.14.5", +] + +[[package]] +name = "matches" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" + +[[package]] +name = "memchr" +version = "2.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "mime_guess" +version = "2.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4192263c238a5f0d0c6bfd21f336a313a4ce1c450542449ca191bb657b4642ef" +dependencies = [ + "mime", + "unicase", +] + +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + +[[package]] +name = "miniz_oxide" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8a240ddb74feaf34a79a7add65a741f3167852fba007066dcac1ca548d89c08" +dependencies = [ + "adler", +] + +[[package]] +name = "mio" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" +dependencies = [ + "libc", + "wasi", + "windows-sys 0.48.0", +] + +[[package]] +name = "modular-bitfield" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a53d79ba8304ac1c4f9eb3b9d281f21f7be9d4626f72ce7df4ad8fbde4f38a74" +dependencies = [ + "modular-bitfield-impl", + "static_assertions", +] + +[[package]] +name = "modular-bitfield-impl" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a7d5f7076603ebc68de2dc6a650ec331a062a13abaa346975be747bbfa4b789" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "more-asserts" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fafa6961cabd9c63bcd77a45d7e3b7f3b552b70417831fb0f56db717e72407e" + +[[package]] +name = "nanotemplate" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f247bfe894f8a04e0d8b1eb5eed9dfb7424f6dda47cf83e3f03670e87cb2831b" + +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + +[[package]] +name = "nu-ansi-term" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" +dependencies = [ + "overload", + "winapi", +] + +[[package]] +name = "num-bigint" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c165a9ab64cf766f73521c0dd2cfdff64f488b8f0b3e621face3462d3db536d7" +dependencies = [ + "num-integer", + "num-traits", +] + +[[package]] +name = "num-conv" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" + +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", + "libm", +] + +[[package]] +name = "num_cpus" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" +dependencies = [ + "hermit-abi", + "libc", +] + +[[package]] +name = "num_enum" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02339744ee7253741199f897151b38e72257d13802d4ee837285cc2990a90845" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "681030a937600a36906c185595136d26abfebb4aa9c65701cefcaf8578bb982b" +dependencies = [ + "proc-macro-crate 3.1.0", + "proc-macro2", + "quote", + "syn 2.0.66", +] + +[[package]] +name = "object" +version = "0.36.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "576dfe1fc8f9df304abb159d767a29d0476f7750fbf8aa7ad07816004a207434" +dependencies = [ + "memchr", +] + +[[package]] +name = "once_cell" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" + +[[package]] +name = "opaque-debug" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" + +[[package]] +name = "open-fastrlp" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "786393f80485445794f6043fd3138854dd109cc6c4bd1a6383db304c9ce9b9ce" +dependencies = [ + "arrayvec", + "auto_impl", + "bytes", + "ethereum-types", + "open-fastrlp-derive", +] + +[[package]] +name = "open-fastrlp-derive" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "003b2be5c6c53c1cfeb0a238b8a1c3915cd410feb684457a36c10038f764bb1c" +dependencies = [ + "bytes", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "openssl-probe" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" + +[[package]] +name = "overload" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" + +[[package]] +name = "parity-scale-codec" +version = "3.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "306800abfa29c7f16596b5970a588435e3d5b3149683d00c12b699cc19f895ee" +dependencies = [ + "arrayvec", + "bitvec", + "byte-slice-cast", + "bytes", + "impl-trait-for-tuples", + "parity-scale-codec-derive", + "serde", +] + +[[package]] +name = "parity-scale-codec-derive" +version = "3.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d830939c76d294956402033aee57a6da7b438f2294eb94864c37b0569053a42c" +dependencies = [ + "proc-macro-crate 3.1.0", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "parking_lot" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99" +dependencies = [ + "instant", + "lock_api", + "parking_lot_core 0.8.6", +] + +[[package]] +name = "parking_lot" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" +dependencies = [ + "lock_api", + "parking_lot_core 0.9.10", +] + +[[package]] +name = "parking_lot_core" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60a2cfe6f0ad2bfc16aefa463b497d5c7a5ecd44a23efa72aa342d90177356dc" +dependencies = [ + "cfg-if", + "instant", + "libc", + "redox_syscall 0.2.16", + "smallvec", + "winapi", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall 0.5.2", + "smallvec", + "windows-targets 0.52.5", +] + +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[package]] +name = "peeking_take_while" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099" + +[[package]] +name = "percent-encoding" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" + +[[package]] +name = "pest" +version = "2.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "560131c633294438da9f7c4b08189194b20946c8274c6b9e38881a7874dc8ee8" +dependencies = [ + "memchr", + "thiserror", + "ucd-trie", +] + +[[package]] +name = "pin-project" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.66", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "pkcs8" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" +dependencies = [ + "der", + "spki", +] + +[[package]] +name = "pkg-config" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" + +[[package]] +name = "polyval" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8419d2b623c7c0896ff2d5d96e2cb4ede590fed28fcc34934f4c33c036e620a1" +dependencies = [ + "cfg-if", + "cpufeatures", + "opaque-debug", + "universal-hash", +] + +[[package]] +name = "portal" +version = "0.1.0" +dependencies = [ + "enr", + "ethportal-api", + "futures", + "hivesim", + "itertools 0.10.5", + "portal-spec-test-utils-rs", + "serde_json", + "serde_yaml", + "tokio", + "tracing", + "tracing-subscriber", + "zstd 0.13.0", + "zstd-safe 7.0.0", + "zstd-sys", +] + +[[package]] +name = "portal-spec-test-utils-rs" +version = "0.1.0" +source = "git+https://github.com/ethereum/portal-spec-tests?rev=954f7d0eb2950a2131048404a1a4ce476bb64657#954f7d0eb2950a2131048404a1a4ce476bb64657" + +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + +[[package]] +name = "ppv-lite86" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" + +[[package]] +name = "prettyplease" +version = "0.2.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f12335488a2f3b0a83b14edad48dca9879ce89b2edd10e80237e4e852dd645e" +dependencies = [ + "proc-macro2", + "syn 2.0.66", +] + +[[package]] +name = "primitive-types" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b34d9fd68ae0b74a41b21c03c2f62847aa0ffea044eee893b4c140b37e244e2" +dependencies = [ + "fixed-hash", + "impl-codec", + "impl-rlp", + "impl-serde", + "scale-info", + "uint", +] + +[[package]] +name = "proc-macro-crate" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" +dependencies = [ + "once_cell", + "toml_edit 0.19.15", +] + +[[package]] +name = "proc-macro-crate" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d37c51ca738a55da99dc0c4a34860fd675453b8b36209178c2249bb13651284" +dependencies = [ + "toml_edit 0.21.1", +] + +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2", + "quote", + "syn 1.0.109", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2", + "quote", + "version_check", +] + +[[package]] +name = "proc-macro2" +version = "1.0.85" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22244ce15aa966053a896d1accb3a6e68469b97c7f33f284b99f0d576879fc23" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "proptest" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31b476131c3c86cb68032fdc5cb6d5a1045e3e42d96b69fa599fd77701e1f5bf" +dependencies = [ + "bitflags 2.5.0", + "lazy_static", + "num-traits", + "rand", + "rand_chacha", + "rand_xorshift", + "regex-syntax", + "unarray", +] + +[[package]] +name = "quickcheck" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "588f6378e4dd99458b60ec275b4477add41ce4fa9f64dcba6f15adccb19b50d6" +dependencies = [ + "env_logger", + "log", + "rand", +] + +[[package]] +name = "quote" +version = "1.0.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom", +] + +[[package]] +name = "rand_xorshift" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d25bf25ec5ae4a3f1b92f929810509a2f53d7dca2f50b794ff57e3face536c8f" +dependencies = [ + "rand_core", +] + +[[package]] +name = "rayon" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + +[[package]] +name = "redox_syscall" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" +dependencies = [ + "bitflags 1.3.2", +] + +[[package]] +name = "redox_syscall" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c82cf8cff14456045f55ec4241383baeff27af886adb72ffb2162f99911de0fd" +dependencies = [ + "bitflags 2.5.0", +] + +[[package]] +name = "regex" +version = "1.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b91213439dad192326a0d7c6ee3955910425f441d7038e0d6933b0aec5c4517f" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" + +[[package]] +name = "reqwest" +version = "0.11.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" +dependencies = [ + "base64 0.21.7", + "bytes", + "encoding_rs", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "hyper", + "ipnet", + "js-sys", + "log", + "mime", + "mime_guess", + "once_cell", + "percent-encoding", + "pin-project-lite", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper", + "system-configuration", + "tokio", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "winreg", +] + +[[package]] +name = "reth-codecs" +version = "0.1.0-alpha.10" +source = "git+https://github.com/paradigmxyz/reth.git?tag=v0.1.0-alpha.10#1b16d804ef01f4ec3c25e7986381c22739c105b9" +dependencies = [ + "bytes", + "codecs-derive", + "revm-primitives", +] + +[[package]] +name = "reth-primitives" +version = "0.1.0-alpha.10" +source = "git+https://github.com/paradigmxyz/reth.git?tag=v0.1.0-alpha.10#1b16d804ef01f4ec3c25e7986381c22739c105b9" +dependencies = [ + "bytes", + "c-kzg 0.1.0", + "crc", + "crunchy", + "derive_more", + "ethers-core", + "fixed-hash", + "hex", + "hex-literal", + "impl-serde", + "itertools 0.11.0", + "modular-bitfield", + "once_cell", + "paste", + "rayon", + "reth-codecs", + "reth-rlp", + "reth-rlp-derive", + "revm-primitives", + "ruint", + "secp256k1", + "serde", + "serde_json", + "serde_with", + "sha2", + "strum 0.25.0", + "sucds", + "tempfile", + "thiserror", + "tiny-keccak", + "tokio", + "tokio-stream", + "tracing", + "url", + "zstd 0.12.4", +] + +[[package]] +name = "reth-rlp" +version = "0.1.0-alpha.10" +source = "git+https://github.com/paradigmxyz/reth.git?tag=v0.1.0-alpha.10#1b16d804ef01f4ec3c25e7986381c22739c105b9" +dependencies = [ + "arrayvec", + "auto_impl", + "bytes", + "c-kzg 0.1.0", + "ethereum-types", + "reth-rlp-derive", + "revm-primitives", +] + +[[package]] +name = "reth-rlp-derive" +version = "0.1.0-alpha.10" +source = "git+https://github.com/paradigmxyz/reth.git?tag=v0.1.0-alpha.10#1b16d804ef01f4ec3c25e7986381c22739c105b9" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.66", +] + +[[package]] +name = "reth-rpc-types" +version = "0.1.0-alpha.10" +source = "git+https://github.com/paradigmxyz/reth.git?tag=v0.1.0-alpha.10#1b16d804ef01f4ec3c25e7986381c22739c105b9" +dependencies = [ + "itertools 0.11.0", + "jsonrpsee-types", + "reth-primitives", + "reth-rlp", + "serde", + "serde_json", + "thiserror", +] + +[[package]] +name = "revm-primitives" +version = "1.1.2" +source = "git+https://github.com/bluealloy/revm?rev=516f62cc#516f62ccc1c5f2a62e5fc58115213fe04c7f7a8c" +dependencies = [ + "auto_impl", + "bitflags 2.5.0", + "bitvec", + "bytes", + "c-kzg 1.0.2", + "derive_more", + "enumn", + "fixed-hash", + "hashbrown 0.14.5", + "hex", + "hex-literal", + "once_cell", + "primitive-types", + "rlp", + "ruint", + "serde", + "sha3 0.10.8", +] + +[[package]] +name = "rfc6979" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" +dependencies = [ + "hmac", + "subtle", +] + +[[package]] +name = "ring" +version = "0.16.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc" +dependencies = [ + "cc", + "libc", + "once_cell", + "spin 0.5.2", + "untrusted 0.7.1", + "web-sys", + "winapi", +] + +[[package]] +name = "ring" +version = "0.17.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" +dependencies = [ + "cc", + "cfg-if", + "getrandom", + "libc", + "spin 0.9.8", + "untrusted 0.9.0", + "windows-sys 0.52.0", +] + +[[package]] +name = "rlp" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb919243f34364b6bd2fc10ef797edbfa75f33c252e7998527479c6d6b47e1ec" +dependencies = [ + "bytes", + "rlp-derive", + "rustc-hex", +] + +[[package]] +name = "rlp-derive" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e33d7b2abe0c340d8797fe2907d3f20d3b5ea5908683618bfe80df7f621f672a" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "route-recognizer" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "afab94fb28594581f62d981211a9a4d53cc8130bbcbbb89a0440d9b8e81a7746" + +[[package]] +name = "rs_merkle" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b241d2e59b74ef9e98d94c78c47623d04c8392abaf82014dfd372a16041128f" +dependencies = [ + "sha2", +] + +[[package]] +name = "ruint" +version = "1.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c3cc4c2511671f327125da14133d0c5c5d137f006a1017a16f557bc85b16286" +dependencies = [ + "alloy-rlp", + "ark-ff 0.3.0", + "ark-ff 0.4.2", + "bytes", + "fastrlp", + "num-bigint", + "num-traits", + "parity-scale-codec", + "primitive-types", + "proptest", + "rand", + "rlp", + "ruint-macro", + "serde", + "valuable", + "zeroize", +] + +[[package]] +name = "ruint-macro" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48fd7bd8a6377e15ad9d42a8ec25371b94ddc67abe7c8b9127bec79bebaaae18" + +[[package]] +name = "rustc-demangle" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" + +[[package]] +name = "rustc-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" + +[[package]] +name = "rustc-hex" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e75f6a532d0fd9f7f13144f392b6ad56a32696bfcd9c78f797f16bbb6f072d6" + +[[package]] +name = "rustc_version" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0dfe2087c51c460008730de8b57e6a320782fbfb312e1f4d520e6c6fae155ee" +dependencies = [ + "semver 0.11.0", +] + +[[package]] +name = "rustc_version" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +dependencies = [ + "semver 1.0.23", +] + +[[package]] +name = "rustix" +version = "0.38.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" +dependencies = [ + "bitflags 2.5.0", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.52.0", +] + +[[package]] +name = "rustls" +version = "0.21.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" +dependencies = [ + "log", + "ring 0.17.8", + "rustls-webpki", + "sct", +] + +[[package]] +name = "rustls-native-certs" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9aace74cb666635c918e9c12bc0d348266037aa8eb599b5cba565709a8dff00" +dependencies = [ + "openssl-probe", + "rustls-pemfile", + "schannel", + "security-framework", +] + +[[package]] +name = "rustls-pemfile" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" +dependencies = [ + "base64 0.21.7", +] + +[[package]] +name = "rustls-webpki" +version = "0.101.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" +dependencies = [ + "ring 0.17.8", + "untrusted 0.9.0", +] + +[[package]] +name = "rustversion" +version = "1.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "955d28af4278de8121b7ebeb796b6a45735dc01436d898801014aced2773a3d6" + +[[package]] +name = "ryu" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" + +[[package]] +name = "scale-info" +version = "2.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eca070c12893629e2cc820a9761bedf6ce1dcddc9852984d1dc734b8bd9bd024" +dependencies = [ + "cfg-if", + "derive_more", + "parity-scale-codec", + "scale-info-derive", +] + +[[package]] +name = "scale-info-derive" +version = "2.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d35494501194174bda522a32605929eefc9ecf7e0a326c26db1fdd85881eb62" +dependencies = [ + "proc-macro-crate 3.1.0", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "schannel" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534" +dependencies = [ + "windows-sys 0.52.0", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "sct" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" +dependencies = [ + "ring 0.17.8", + "untrusted 0.9.0", +] + +[[package]] +name = "sec1" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" +dependencies = [ + "base16ct", + "der", + "generic-array", + "pkcs8", + "subtle", + "zeroize", +] + +[[package]] +name = "secp256k1" +version = "0.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25996b82292a7a57ed3508f052cfff8640d38d32018784acd714758b43da9c8f" +dependencies = [ + "rand", + "secp256k1-sys", +] + +[[package]] +name = "secp256k1-sys" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70a129b9e9efbfb223753b9163c4ab3b13cff7fd9c7f010fbac25ab4099fa07e" +dependencies = [ + "cc", +] + +[[package]] +name = "security-framework" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c627723fd09706bacdb5cf41499e95098555af3c3c29d014dc3c458ef6be11c0" +dependencies = [ + "bitflags 2.5.0", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "317936bbbd05227752583946b9e66d7ce3b489f84e11a94a510b4437fef407d7" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "semver" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f301af10236f6df4160f7c3f04eec6dbc70ace82d23326abad5edee88801c6b6" +dependencies = [ + "semver-parser", +] + +[[package]] +name = "semver" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" + +[[package]] +name = "semver-parser" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0bef5b7f9e0df16536d3961cfb6e84331c065b4066afb39768d0e319411f7" +dependencies = [ + "pest", +] + +[[package]] +name = "send_wrapper" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f638d531eccd6e23b980caf34876660d38e265409d8e99b397ab71eb3612fad0" + +[[package]] +name = "serde" +version = "1.0.203" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7253ab4de971e72fb7be983802300c30b5a7f0c2e56fab8abfc6a214307c0094" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde-this-or-that" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "634c5a3cb041e56cc2964386151c67d520f845445789da3bd46bfb1c94f5e3bb" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_derive" +version = "1.0.203" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "500cbc0ebeb6f46627f50f3f5811ccf6bf00643be300b4c3eabc0ef55dc5b5ba" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.66", +] + +[[package]] +name = "serde_json" +version = "1.0.117" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "455182ea6142b14f93f4bc5320a2b31c1f266b66a4a5c858b013302a5d8cbfc3" +dependencies = [ + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "serde_with" +version = "3.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ad483d2ab0149d5a5ebcd9972a3852711e0153d863bf5a5d0391d28883c4a20" +dependencies = [ + "base64 0.22.1", + "chrono", + "hex", + "indexmap 1.9.3", + "indexmap 2.2.6", + "serde", + "serde_derive", + "serde_json", + "serde_with_macros", + "time", +] + +[[package]] +name = "serde_with_macros" +version = "3.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65569b702f41443e8bc8bbb1c5779bd0450bbe723b56198980e80ec45780bce2" +dependencies = [ + "darling 0.20.9", + "proc-macro2", + "quote", + "syn 2.0.66", +] + +[[package]] +name = "serde_yaml" +version = "0.9.34+deprecated" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" +dependencies = [ + "indexmap 2.2.6", + "itoa", + "ryu", + "serde", + "unsafe-libyaml", +] + +[[package]] +name = "sha-1" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99cd6713db3cf16b6c84e06321e049a9b9f699826e16096d23bbcc44d15d51a6" +dependencies = [ + "block-buffer 0.9.0", + "cfg-if", + "cpufeatures", + "digest 0.9.0", + "opaque-debug", +] + +[[package]] +name = "sha2" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest 0.10.7", +] + +[[package]] +name = "sha3" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f81199417d4e5de3f04b1e871023acea7389672c4135918f05aa9cbf2f2fa809" +dependencies = [ + "block-buffer 0.9.0", + "digest 0.9.0", + "keccak", + "opaque-debug", +] + +[[package]] +name = "sha3" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" +dependencies = [ + "digest 0.10.7", + "keccak", +] + +[[package]] +name = "sharded-slab" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "signal-hook-registry" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" +dependencies = [ + "libc", +] + +[[package]] +name = "signature" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" +dependencies = [ + "digest 0.10.7", + "rand_core", +] + +[[package]] +name = "slab" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +dependencies = [ + "autocfg", +] + +[[package]] +name = "smallvec" +version = "1.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" + +[[package]] +name = "snap" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b6b67fb9a61334225b5b790716f609cd58395f895b3fe8b328786812a40bc3b" + +[[package]] +name = "socket2" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f7916fc008ca5542385b89a3d3ce689953c143e9304a9bf8beec1de48994c0d" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "socket2" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "soketto" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d1c5305e39e09653383c2c7244f2f78b3bcae37cf50c64cb4789c9f5096ec2" +dependencies = [ + "base64 0.13.1", + "bytes", + "futures", + "http", + "httparse", + "log", + "rand", + "sha-1", +] + +[[package]] +name = "spin" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" + +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" + +[[package]] +name = "spki" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" +dependencies = [ + "base64ct", + "der", +] + +[[package]] +name = "ssz_types" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "382939886cb24ee8ac885d09116a60f6262d827c7a9e36012b4f6d3d0116d0b3" +dependencies = [ + "derivative", + "ethereum_serde_utils", + "ethereum_ssz", + "itertools 0.10.5", + "serde", + "serde_derive", + "smallvec", + "tree_hash", + "typenum", +] + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "strsim" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "strum" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "290d54ea6f91c969195bdbcd7442c8c2a2ba87da8bf60a7ee86a235d4bc1e125" +dependencies = [ + "strum_macros 0.25.3", +] + +[[package]] +name = "strum" +version = "0.26.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d8cec3501a5194c432b2b7976db6b7d10ec95c253208b45f83f7136aa985e29" +dependencies = [ + "strum_macros 0.26.4", +] + +[[package]] +name = "strum_macros" +version = "0.25.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23dc1fa9ac9c169a78ba62f0b841814b7abae11bdd047b9c58f893439e309ea0" +dependencies = [ + "heck 0.4.1", + "proc-macro2", + "quote", + "rustversion", + "syn 2.0.66", +] + +[[package]] +name = "strum_macros" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" +dependencies = [ + "heck 0.5.0", + "proc-macro2", + "quote", + "rustversion", + "syn 2.0.66", +] + +[[package]] +name = "subtle" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" + +[[package]] +name = "sucds" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64accd20141dfbef67ad83c51d588146cff7810616e1bda35a975be369059533" +dependencies = [ + "anyhow", +] + +[[package]] +name = "superstruct" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f4e1f478a7728f8855d7e620e9a152cf8932c6614f86564c886f9b8141f3201" +dependencies = [ + "darling 0.13.4", + "itertools 0.10.5", + "proc-macro2", + "quote", + "smallvec", + "syn 1.0.109", +] + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.66" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c42f3f41a2de00b01c0aaad383c5a45241efc8b2d1eda5661812fda5f3cdcff5" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "sync_wrapper" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" + +[[package]] +name = "system-configuration" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "system-configuration-sys", +] + +[[package]] +name = "system-configuration-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + +[[package]] +name = "tempfile" +version = "3.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1" +dependencies = [ + "cfg-if", + "fastrand", + "rustix", + "windows-sys 0.52.0", +] + +[[package]] +name = "thiserror" +version = "1.0.61" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c546c80d6be4bc6a00c0f01730c08df82eaa7a7a61f11d656526506112cc1709" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.61" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46c3384250002a6d5af4d114f2845d37b57521033f30d5c3f46c4d70e1197533" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.66", +] + +[[package]] +name = "thread_local" +version = "1.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" +dependencies = [ + "cfg-if", + "once_cell", +] + +[[package]] +name = "threadpool" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d050e60b33d41c19108b32cea32164033a9013fe3b46cbd4457559bfbf77afaa" +dependencies = [ + "num_cpus", +] + +[[package]] +name = "time" +version = "0.3.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" +dependencies = [ + "deranged", + "itoa", + "num-conv", + "powerfmt", + "serde", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" + +[[package]] +name = "time-macros" +version = "0.2.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" +dependencies = [ + "num-conv", + "time-core", +] + +[[package]] +name = "tiny-keccak" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237" +dependencies = [ + "crunchy", +] + +[[package]] +name = "tinyvec" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "tokio" +version = "1.38.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba4f4a02a7a80d6f274636f0aa95c7e383b912d41fe721a31f29e29698585a4a" +dependencies = [ + "backtrace", + "bytes", + "libc", + "mio", + "num_cpus", + "parking_lot 0.12.3", + "pin-project-lite", + "signal-hook-registry", + "socket2 0.5.7", + "tokio-macros", + "windows-sys 0.48.0", +] + +[[package]] +name = "tokio-macros" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f5ae998a069d4b5aba8ee9dad856af7d520c3699e6159b185c2acd48155d39a" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.66", +] + +[[package]] +name = "tokio-rustls" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" +dependencies = [ + "rustls", + "tokio", +] + +[[package]] +name = "tokio-stream" +version = "0.1.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "267ac89e0bec6e691e5813911606935d77c476ff49024f98abcea3e7b15e37af" +dependencies = [ + "futures-core", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "tokio-util" +version = "0.7.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9cf6b47b3771c49ac75ad09a6162f53ad4b8088b76ac60e8ec1455b31a189fe1" +dependencies = [ + "bytes", + "futures-core", + "futures-io", + "futures-sink", + "pin-project-lite", + "slab", + "tokio", +] + +[[package]] +name = "toml_datetime" +version = "0.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4badfd56924ae69bcc9039335b2e017639ce3f9b001c393c1b2d1ef846ce2cbf" + +[[package]] +name = "toml_edit" +version = "0.19.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" +dependencies = [ + "indexmap 2.2.6", + "toml_datetime", + "winnow", +] + +[[package]] +name = "toml_edit" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a8534fd7f78b5405e860340ad6575217ce99f38d4d5c8f2442cb5ecb50090e1" +dependencies = [ + "indexmap 2.2.6", + "toml_datetime", + "winnow", +] + +[[package]] +name = "tower" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" +dependencies = [ + "futures-core", + "futures-util", + "pin-project", + "pin-project-lite", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower-layer" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" + +[[package]] +name = "tower-service" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" + +[[package]] +name = "tracing" +version = "0.1.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" +dependencies = [ + "log", + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.66", +] + +[[package]] +name = "tracing-core" +version = "0.1.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" +dependencies = [ + "once_cell", + "valuable", +] + +[[package]] +name = "tracing-log" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" +dependencies = [ + "log", + "once_cell", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" +dependencies = [ + "nu-ansi-term", + "sharded-slab", + "smallvec", + "thread_local", + "tracing-core", + "tracing-log", +] + +[[package]] +name = "tree_hash" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c998ac5fe2b07c025444bdd522e6258110b63861c6698eedc610c071980238d" +dependencies = [ + "ethereum-types", + "ethereum_hashing", + "smallvec", +] + +[[package]] +name = "tree_hash_derive" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84303a9c7cda5f085a3ed9cd241d1e95e04d88aab1d679b02f212e653537ba86" +dependencies = [ + "darling 0.13.4", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + +[[package]] +name = "typenum" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" + +[[package]] +name = "ucd-trie" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed646292ffc8188ef8ea4d1e0e0150fb15a5c2e12ad9b8fc191ae7a8a7f3c4b9" + +[[package]] +name = "uint" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76f64bba2c53b04fcab63c01a7d7427eadc821e3bc48c34dc9ba29c501164b52" +dependencies = [ + "byteorder", + "crunchy", + "hex", + "static_assertions", +] + +[[package]] +name = "unarray" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" + +[[package]] +name = "unicase" +version = "2.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7d2d4dafb69621809a81864c9c1b864479e1235c0dd4e199924b9742439ed89" +dependencies = [ + "version_check", +] + +[[package]] +name = "unicode-bidi" +version = "0.3.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" + +[[package]] +name = "unicode-ident" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" + +[[package]] +name = "unicode-normalization" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "unicode-segmentation" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202" + +[[package]] +name = "unicode-xid" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" + +[[package]] +name = "universal-hash" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f214e8f697e925001e66ec2c6e37a4ef93f0f78c2eed7814394e10c62025b05" +dependencies = [ + "generic-array", + "subtle", +] + +[[package]] +name = "unsafe-libyaml" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "673aac59facbab8a9007c7f6108d11f63b603f7cabff99fabf650fea5c32b861" + +[[package]] +name = "untrusted" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" + +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + +[[package]] +name = "ureq" +version = "2.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8cdd25c339e200129fe4de81451814e5228c9b771d57378817d6117cc2b3f97" +dependencies = [ + "base64 0.21.7", + "flate2", + "log", + "once_cell", + "rustls", + "rustls-webpki", + "serde", + "serde_json", + "url", + "webpki-roots", +] + +[[package]] +name = "url" +version = "2.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c" +dependencies = [ + "form_urlencoded", + "idna 0.5.0", + "percent-encoding", +] + +[[package]] +name = "utf8parse" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" + +[[package]] +name = "validator" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be110dc66fa015b8b1d2c4eae40c495a27fae55f82b9cae3efb8178241ed20eb" +dependencies = [ + "idna 0.2.3", + "lazy_static", + "regex", + "serde", + "serde_derive", + "serde_json", + "url", + "validator_derive", + "validator_types", +] + +[[package]] +name = "validator_derive" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68f14fe757e2894ce4271991901567be07fbc3eac6b24246122214e1d5a16554" +dependencies = [ + "if_chain", + "lazy_static", + "proc-macro-error", + "proc-macro2", + "quote", + "regex", + "syn 1.0.109", + "validator_types", +] + +[[package]] +name = "validator_types" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad9680608df133af2c1ddd5eaf1ddce91d60d61b6bc51494ef326458365a470a" + +[[package]] +name = "valuable" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" + +[[package]] +name = "version_check" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" + +[[package]] +name = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wasm-bindgen" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" +dependencies = [ + "cfg-if", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2", + "quote", + "syn 2.0.66", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76bc14366121efc8dbb487ab05bcc9d346b3b5ec0eaa76e46594cabbe51762c0" +dependencies = [ + "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.66", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" + +[[package]] +name = "web-sys" +version = "0.3.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "webpki-roots" +version = "0.25.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" + +[[package]] +name = "which" +version = "4.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7" +dependencies = [ + "either", + "home", + "once_cell", + "rustix", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows-core" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" +dependencies = [ + "windows-targets 0.52.5", +] + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.5", +] + +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + +[[package]] +name = "windows-targets" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb" +dependencies = [ + "windows_aarch64_gnullvm 0.52.5", + "windows_aarch64_msvc 0.52.5", + "windows_i686_gnu 0.52.5", + "windows_i686_gnullvm", + "windows_i686_msvc 0.52.5", + "windows_x86_64_gnu 0.52.5", + "windows_x86_64_gnullvm 0.52.5", + "windows_x86_64_msvc 0.52.5", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0" + +[[package]] +name = "winnow" +version = "0.5.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" +dependencies = [ + "memchr", +] + +[[package]] +name = "winreg" +version = "0.50.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" +dependencies = [ + "cfg-if", + "windows-sys 0.48.0", +] + +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] + +[[package]] +name = "zerocopy" +version = "0.7.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae87e3fcd617500e5d106f0380cf7b77f3c6092aae37191433159dda23cfb087" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15e934569e47891f7d9411f1a451d947a60e000ab3bd24fbb970f000387d1b3b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.66", +] + +[[package]] +name = "zeroize" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" +dependencies = [ + "zeroize_derive", +] + +[[package]] +name = "zeroize_derive" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.66", +] + +[[package]] +name = "zstd" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a27595e173641171fc74a1232b7b1c7a7cb6e18222c11e9dfb9888fa424c53c" +dependencies = [ + "zstd-safe 6.0.6", +] + +[[package]] +name = "zstd" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bffb3309596d527cfcba7dfc6ed6052f1d39dfbd7c867aa2e865e4a449c10110" +dependencies = [ + "zstd-safe 7.0.0", +] + +[[package]] +name = "zstd-safe" +version = "6.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee98ffd0b48ee95e6c5168188e44a54550b1564d9d530ee21d5f0eaed1069581" +dependencies = [ + "libc", + "zstd-sys", +] + +[[package]] +name = "zstd-safe" +version = "7.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43747c7422e2924c11144d5229878b98180ef8b06cca4ab5af37afc8a8d8ea3e" +dependencies = [ + "zstd-sys", +] + +[[package]] +name = "zstd-sys" +version = "2.0.9+zstd.1.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e16efa8a874a0481a574084d34cc26fdb3b99627480f785888deb6386506656" +dependencies = [ + "cc", + "pkg-config", +] diff --git a/simulators/portal/history/Cargo.toml b/simulators/portal/Cargo.toml similarity index 87% rename from simulators/portal/history/Cargo.toml rename to simulators/portal/Cargo.toml index d0ceda4cb8..128a3d2bdd 100755 --- a/simulators/portal/history/Cargo.toml +++ b/simulators/portal/Cargo.toml @@ -1,7 +1,7 @@ [package] -name = "history" +name = "portal" version = "0.1.0" -authors = ["Ognyan Genev ", "Kolby ML (Moroz Liebl) "] +authors = ["Kolby ML (Moroz Liebl) "] edition = "2021" [dependencies] @@ -9,11 +9,11 @@ ethportal-api = { git = "https://github.com/ethereum/trin", rev = "33ea99da64216 portal-spec-test-utils-rs = { git = "https://github.com/ethereum/portal-spec-tests", rev = "954f7d0eb2950a2131048404a1a4ce476bb64657" } hivesim = { git = "https://github.com/ethereum/hive", rev = "62b3362bae655754b5f624c36720ba8c44a2f375" } futures = "0.3.25" +itertools = "0.10.5" serde_json = "1.0.87" +serde_yaml = "0.9" tracing = "0.1.37" tracing-subscriber = "0.3.16" -itertools = "0.10.5" -serde_yaml = "0.9" tokio = { version = "1", features = ["full"] } # todo: remove this when we update discv5. Added this because enr 10.1 is a breaking change diff --git a/simulators/portal/beacon/Dockerfile b/simulators/portal/Dockerfile similarity index 59% rename from simulators/portal/beacon/Dockerfile rename to simulators/portal/Dockerfile index 9ab0c761ee..ffe6020d5b 100644 --- a/simulators/portal/beacon/Dockerfile +++ b/simulators/portal/Dockerfile @@ -1,22 +1,23 @@ FROM rust:1.75.0 AS builder # create a new empty shell project -RUN USER=root cargo new --bin beacon -WORKDIR /beacon +RUN USER=root cargo new --bin portal +WORKDIR /portal RUN apt-get update && apt-get install clang -y # copy over manifests and source to build image COPY Cargo.toml ./Cargo.toml +COPY Cargo.lock ./Cargo.lock # create fake main.rs and build dependencies RUN echo "fn main() {}" > ./src/main.rs +RUN apt-get update && apt-get install clang -y RUN cargo build --release # copy real src over and make newest modified file COPY src ./src -RUN apt-get update && apt-get install clang -y RUN touch -a -m ./src/main.rs @@ -29,9 +30,11 @@ FROM ubuntu:22.04 RUN apt update && apt install wget -y # copy build artifacts from build stage -COPY --from=builder /beacon/target/release/beacon . -ADD https://raw.githubusercontent.com/ethereum/portal-spec-tests/master/tests/mainnet/beacon_chain/hive/test_data.yaml ./test-data/test_data.yaml +COPY --from=builder /portal/target/release/portal . +ADD https://raw.githubusercontent.com/KolbyML/portal-spec-tests/epoch/tests/mainnet/history/hive/test_data_collection_of_forks_blocks.yaml ./test-data/test_data_collection_of_forks_blocks.yaml +ADD https://raw.githubusercontent.com/ethereum/portal-spec-tests/master/tests/mainnet/state/hive/test_data.yaml ./test-data/state_test_data.yaml +ADD https://raw.githubusercontent.com/ethereum/portal-spec-tests/master/tests/mainnet/beacon_chain/hive/test_data.yaml ./test-data/beacon_test_data.yaml ENV RUST_LOG=debug -ENTRYPOINT ["./beacon"] +ENTRYPOINT ["./portal"] diff --git a/simulators/portal/beacon/Cargo.toml b/simulators/portal/beacon/Cargo.toml deleted file mode 100755 index e3c9acc14e..0000000000 --- a/simulators/portal/beacon/Cargo.toml +++ /dev/null @@ -1,22 +0,0 @@ -[package] -name = "beacon" -version = "0.1.0" -authors = ["Kolby ML (Moroz Liebl) "] -edition = "2021" - -[dependencies] -ethportal-api = { git = "https://github.com/ethereum/trin", rev = "33ea99da64216899f7ab2778d117a18506d963dd" } -hivesim = { git = "https://github.com/ethereum/hive", rev = "62b3362bae655754b5f624c36720ba8c44a2f375" } -futures = "0.3.25" -itertools = "0.10.5" -serde_yaml = "0.9" -serde_json = "1.0.87" -tracing = "0.1.37" -tracing-subscriber = "0.3.16" -tokio = { version = "1", features = ["full"] } - -# todo: remove this when we update discv5. Added this because enr 10.1 is a breaking change -enr = { version = "=0.10.0", features = ["k256", "ed25519"] } -zstd = "=0.13.0" -zstd-safe = "=7.0.0" -zstd-sys = "=2.0.9+zstd.1.5.5" diff --git a/simulators/portal/beacon/src/main.rs b/simulators/portal/beacon/src/main.rs deleted file mode 100644 index 9f5ad2aea2..0000000000 --- a/simulators/portal/beacon/src/main.rs +++ /dev/null @@ -1,62 +0,0 @@ -mod suites; - -use hivesim::{run_suite, Simulation, Suite, TestSpec}; -use suites::interop::test_portal_interop; -use suites::mesh::test_portal_scenarios; -use suites::rpc_compat::run_rpc_compat_test_suite; - -#[tokio::main] -async fn main() { - tracing_subscriber::fmt::init(); - let mut beacon_rpc_compat = Suite { - name: "beacon-rpc-compat".to_string(), - description: "The RPC-compatibility test suite runs a set of RPC related tests against a - running node. It tests client implementations of the JSON-RPC API for - conformance with the portal network API specification." - .to_string(), - tests: vec![], - }; - - beacon_rpc_compat.add(TestSpec { - name: "client launch".to_string(), - description: "This test launches the client and collects its logs.".to_string(), - always_run: false, - run: run_rpc_compat_test_suite, - client: None, - }); - - let mut interop = Suite { - name: "beacon-interop".to_string(), - description: - "The interop test suite runs a set of scenarios to test interoperability between - portal network clients" - .to_string(), - tests: vec![], - }; - - interop.add(TestSpec { - name: "client launch".to_string(), - description: "This test launches the client and collects its logs.".to_string(), - always_run: false, - run: test_portal_interop, - client: None, - }); - - let mut mesh = Suite { - name: "beacon-mesh".to_string(), - description: "The portal mesh test suite runs a set of scenarios to test 3 clients" - .to_string(), - tests: vec![], - }; - - mesh.add(TestSpec { - name: "client launch".to_string(), - description: "This test launches the client and collects its logs.".to_string(), - always_run: false, - run: test_portal_scenarios, - client: None, - }); - - let sim = Simulation::new(); - run_suite(sim, vec![beacon_rpc_compat, interop, mesh]).await; -} diff --git a/simulators/portal/history/Dockerfile b/simulators/portal/history/Dockerfile deleted file mode 100644 index 9280d7b0e3..0000000000 --- a/simulators/portal/history/Dockerfile +++ /dev/null @@ -1,34 +0,0 @@ -FROM rust:1.75.0 AS builder - -# create a new empty shell project -RUN USER=root cargo new --bin history -WORKDIR /history - -# copy over manifests and source to build image -COPY Cargo.toml ./Cargo.toml - -# create fake main.rs and build dependencies -RUN echo "fn main() {}" > ./src/main.rs -RUN apt-get update && apt-get install clang -y -RUN cargo build --release - -# copy real src over and make newest modified file -COPY src ./src - -RUN touch -a -m ./src/main.rs - -# build for release -RUN cargo build --release - -# final base -FROM ubuntu:22.04 - -RUN apt update && apt install wget -y - -# copy build artifacts from build stage -COPY --from=builder /history/target/release/history . -ADD https://raw.githubusercontent.com/ethereum/portal-spec-tests/master/tests/mainnet/history/hive/test_data_collection_of_forks_blocks.yaml ./test-data/test_data_collection_of_forks_blocks.yaml - -ENV RUST_LOG=debug - -ENTRYPOINT ["./history"] diff --git a/simulators/portal/history/src/main.rs b/simulators/portal/history/src/main.rs deleted file mode 100644 index 188b9339b3..0000000000 --- a/simulators/portal/history/src/main.rs +++ /dev/null @@ -1,77 +0,0 @@ -pub mod suites; - -use hivesim::{run_suite, Simulation, Suite, TestSpec}; -use suites::interop::test_portal_interop; -use suites::mesh::test_portal_scenarios; -use suites::rpc_compat::run_rpc_compat_test_suite; -use suites::trin_bridge::test_portal_bridge; - -#[tokio::main] -async fn main() { - tracing_subscriber::fmt::init(); - let mut rpc_compat = Suite { - name: "history-rpc-compat".to_string(), - description: "The RPC-compatibility test suite runs a set of RPC related tests against a - running node. It tests client implementations of the JSON-RPC API for - conformance with the portal network API specification." - .to_string(), - tests: vec![], - }; - - rpc_compat.add(TestSpec { - name: "client launch".to_string(), - description: "This test launches the client and collects its logs.".to_string(), - always_run: false, - run: run_rpc_compat_test_suite, - client: None, - }); - - let mut interop = Suite { - name: "history-interop".to_string(), - description: - "The interop test suite runs a set of scenarios to test interoperability between - portal network clients" - .to_string(), - tests: vec![], - }; - - interop.add(TestSpec { - name: "client launch".to_string(), - description: "This test launches the client and collects its logs.".to_string(), - always_run: false, - run: test_portal_interop, - client: None, - }); - - let mut mesh = Suite { - name: "history-mesh".to_string(), - description: "The portal mesh test suite runs a set of scenarios to test 3 clients" - .to_string(), - tests: vec![], - }; - - mesh.add(TestSpec { - name: "client launch".to_string(), - description: "This test launches the client and collects its logs.".to_string(), - always_run: false, - run: test_portal_scenarios, - client: None, - }); - - let mut trin_bridge = Suite { - name: "history-trin-bridge".to_string(), - description: "The portal bridge test suite".to_string(), - tests: vec![], - }; - - trin_bridge.add(TestSpec { - name: "client launch".to_string(), - description: "This test launches the client and collects its logs.".to_string(), - always_run: false, - run: test_portal_bridge, - client: None, - }); - - let sim = Simulation::new(); - run_suite(sim, vec![rpc_compat, interop, mesh, trin_bridge]).await; -} diff --git a/simulators/portal/src/main.rs b/simulators/portal/src/main.rs new file mode 100644 index 0000000000..ced1dd7a91 --- /dev/null +++ b/simulators/portal/src/main.rs @@ -0,0 +1,182 @@ +mod suites; + +use hivesim::{run_suite, Simulation, Suite, TestSpec}; + +use crate::suites::beacon::{ + interop::test_portal_beacon_interop, mesh::test_portal_beacon_mesh, + rpc_compat::run_rpc_compat_beacon_test_suite, +}; +use crate::suites::history::{ + interop::test_portal_history_interop, mesh::test_portal_history_mesh, + rpc_compat::run_rpc_compat_history_test_suite, trin_bridge::test_portal_bridge, +}; +use crate::suites::state::{ + interop::test_portal_state_interop, rpc_compat::run_rpc_compat_state_test_suite, +}; + +#[tokio::main] +async fn main() { + tracing_subscriber::fmt::init(); + let mut history_rpc_compat = Suite { + name: "history-rpc-compat".to_string(), + description: "The RPC-compatibility test suite runs a set of RPC related tests against a + running node. It tests client implementations of the JSON-RPC API for + conformance with the portal network API specification." + .to_string(), + tests: vec![], + }; + + history_rpc_compat.add(TestSpec { + name: "client launch".to_string(), + description: "This test launches the client and collects its logs.".to_string(), + always_run: false, + run: run_rpc_compat_history_test_suite, + client: None, + }); + + let mut history_interop = Suite { + name: "history-interop".to_string(), + description: + "The interop test suite runs a set of scenarios to test interoperability between + portal network clients" + .to_string(), + tests: vec![], + }; + + history_interop.add(TestSpec { + name: "client launch".to_string(), + description: "This test launches the client and collects its logs.".to_string(), + always_run: false, + run: test_portal_history_interop, + client: None, + }); + + let mut history_mesh = Suite { + name: "history-mesh".to_string(), + description: "The portal mesh test suite runs a set of scenarios to test 3 clients" + .to_string(), + tests: vec![], + }; + + history_mesh.add(TestSpec { + name: "client launch".to_string(), + description: "This test launches the client and collects its logs.".to_string(), + always_run: false, + run: test_portal_history_mesh, + client: None, + }); + + let mut history_trin_bridge = Suite { + name: "history-trin-bridge".to_string(), + description: "The portal bridge test suite".to_string(), + tests: vec![], + }; + + history_trin_bridge.add(TestSpec { + name: "client launch".to_string(), + description: "This test launches the client and collects its logs.".to_string(), + always_run: false, + run: test_portal_bridge, + client: None, + }); + + let mut state_rpc_compat = Suite { + name: "state-rpc-compat".to_string(), + description: "The RPC-compatibility test suite runs a set of RPC related tests against a + running node. It tests client implementations of the JSON-RPC API for + conformance with the portal network API specification." + .to_string(), + tests: vec![], + }; + + state_rpc_compat.add(TestSpec { + name: "client launch".to_string(), + description: "This test launches the client and collects its logs.".to_string(), + always_run: false, + run: run_rpc_compat_state_test_suite, + client: None, + }); + + let mut state_interop = Suite { + name: "state-interop".to_string(), + description: + "The interop test suite runs a set of scenarios to test interoperability between + portal network clients" + .to_string(), + tests: vec![], + }; + + state_interop.add(TestSpec { + name: "client launch".to_string(), + description: "This test launches the client and collects its logs.".to_string(), + always_run: false, + run: test_portal_state_interop, + client: None, + }); + + let mut beacon_rpc_compat = Suite { + name: "beacon-rpc-compat".to_string(), + description: "The RPC-compatibility test suite runs a set of RPC related tests against a + running node. It tests client implementations of the JSON-RPC API for + conformance with the portal network API specification." + .to_string(), + tests: vec![], + }; + + beacon_rpc_compat.add(TestSpec { + name: "client launch".to_string(), + description: "This test launches the client and collects its logs.".to_string(), + always_run: false, + run: run_rpc_compat_beacon_test_suite, + client: None, + }); + + let mut beacon_interop = Suite { + name: "beacon-interop".to_string(), + description: + "The interop test suite runs a set of scenarios to test interoperability between + portal network clients" + .to_string(), + tests: vec![], + }; + + beacon_interop.add(TestSpec { + name: "client launch".to_string(), + description: "This test launches the client and collects its logs.".to_string(), + always_run: false, + run: test_portal_beacon_interop, + client: None, + }); + + let mut beacon_mesh = Suite { + name: "beacon-mesh".to_string(), + description: "The portal mesh test suite runs a set of scenarios to test 3 clients" + .to_string(), + tests: vec![], + }; + + beacon_mesh.add(TestSpec { + name: "client launch".to_string(), + description: "This test launches the client and collects its logs.".to_string(), + always_run: false, + run: test_portal_beacon_mesh, + client: None, + }); + + let sim = Simulation::new(); + run_suite( + sim, + vec![ + history_rpc_compat, + history_interop, + history_mesh, + history_trin_bridge, + state_rpc_compat, + state_interop, + beacon_rpc_compat, + beacon_interop, + beacon_mesh, + ], + ) + .await; +} diff --git a/simulators/portal/beacon/src/suites/constants.rs b/simulators/portal/src/suites/beacon/constants.rs similarity index 99% rename from simulators/portal/beacon/src/suites/constants.rs rename to simulators/portal/src/suites/beacon/constants.rs index f1a06efc14..dee12e9838 100644 --- a/simulators/portal/beacon/src/suites/constants.rs +++ b/simulators/portal/src/suites/beacon/constants.rs @@ -1,4 +1,4 @@ -pub const TEST_DATA_FILE_PATH: &str = "./test-data/test_data.yaml"; +pub const TEST_DATA_FILE_PATH: &str = "./test-data/beacon_test_data.yaml"; pub const HIVE_PORTAL_NETWORKS_SELECTED: &str = "HIVE_PORTAL_NETWORKS_SELECTED"; pub const BEACON_STRING: &str = "beacon"; diff --git a/simulators/portal/beacon/src/suites/interop.rs b/simulators/portal/src/suites/beacon/interop.rs similarity index 99% rename from simulators/portal/beacon/src/suites/interop.rs rename to simulators/portal/src/suites/beacon/interop.rs index 5251ac7009..197c172ef6 100644 --- a/simulators/portal/beacon/src/suites/interop.rs +++ b/simulators/portal/src/suites/beacon/interop.rs @@ -1,4 +1,4 @@ -use crate::suites::constants::{ +use crate::suites::beacon::constants::{ BEACON_STRING, HIVE_PORTAL_NETWORKS_SELECTED, TEST_DATA_FILE_PATH, TRIN_BRIDGE_CLIENT_TYPE, }; use ethportal_api::types::beacon::ContentInfo; @@ -75,7 +75,7 @@ fn process_content(content: Vec<(BeaconContentKey, BeaconContentValue)>) -> Vec< } dyn_async! { - pub async fn test_portal_interop<'a> (test: &'a mut Test, _client: Option) { + pub async fn test_portal_beacon_interop<'a> (test: &'a mut Test, _client: Option) { // Get all available portal clients let clients = test.sim.client_types().await; // todo: remove this once we implement role in hivesim-rs diff --git a/simulators/portal/beacon/src/suites/mesh.rs b/simulators/portal/src/suites/beacon/mesh.rs similarity index 96% rename from simulators/portal/beacon/src/suites/mesh.rs rename to simulators/portal/src/suites/beacon/mesh.rs index 84d6d858c7..61f7849127 100644 --- a/simulators/portal/beacon/src/suites/mesh.rs +++ b/simulators/portal/src/suites/beacon/mesh.rs @@ -1,9 +1,7 @@ -use crate::suites::constants::BEACON_STRING; -use crate::suites::constants::CONSTANT_CONTENT_KEY; -use crate::suites::constants::CONSTANT_CONTENT_VALUE; -use crate::suites::constants::HIVE_PORTAL_NETWORKS_SELECTED; -use crate::suites::constants::PRIVATE_KEY_ENVIRONMENT_VARIABLE; -use crate::suites::constants::TRIN_BRIDGE_CLIENT_TYPE; +use crate::suites::beacon::constants::{ + BEACON_STRING, CONSTANT_CONTENT_KEY, CONSTANT_CONTENT_VALUE, HIVE_PORTAL_NETWORKS_SELECTED, + PRIVATE_KEY_ENVIRONMENT_VARIABLE, TRIN_BRIDGE_CLIENT_TYPE, +}; use ethportal_api::jsonrpsee::core::__reexports::serde_json; use ethportal_api::types::beacon::ContentInfo; use ethportal_api::types::distance::{Metric, XorMetric}; @@ -18,7 +16,7 @@ use serde_json::json; use std::collections::HashMap; dyn_async! { - pub async fn test_portal_scenarios<'a> (test: &'a mut Test, _client: Option) { + pub async fn test_portal_beacon_mesh<'a> (test: &'a mut Test, _client: Option) { // Get all available portal clients let clients = test.sim.client_types().await; // todo: remove this once we implement role in hivesim-rs diff --git a/simulators/portal/beacon/src/suites/mod.rs b/simulators/portal/src/suites/beacon/mod.rs similarity index 100% rename from simulators/portal/beacon/src/suites/mod.rs rename to simulators/portal/src/suites/beacon/mod.rs diff --git a/simulators/portal/beacon/src/suites/rpc_compat.rs b/simulators/portal/src/suites/beacon/rpc_compat.rs similarity index 98% rename from simulators/portal/beacon/src/suites/rpc_compat.rs rename to simulators/portal/src/suites/beacon/rpc_compat.rs index fdb3847206..ded7e4186a 100644 --- a/simulators/portal/beacon/src/suites/rpc_compat.rs +++ b/simulators/portal/src/suites/beacon/rpc_compat.rs @@ -1,8 +1,7 @@ -use crate::suites::constants::BEACON_STRING; -use crate::suites::constants::CONSTANT_CONTENT_KEY; -use crate::suites::constants::CONSTANT_CONTENT_VALUE; -use crate::suites::constants::HIVE_PORTAL_NETWORKS_SELECTED; -use crate::suites::constants::TRIN_BRIDGE_CLIENT_TYPE; +use crate::suites::beacon::constants::{ + BEACON_STRING, CONSTANT_CONTENT_KEY, CONSTANT_CONTENT_VALUE, HIVE_PORTAL_NETWORKS_SELECTED, + TRIN_BRIDGE_CLIENT_TYPE, +}; use ethportal_api::types::enr::generate_random_remote_enr; use ethportal_api::BeaconContentValue; use ethportal_api::Discv5ApiClient; @@ -14,7 +13,7 @@ use serde_json::json; use std::collections::HashMap; dyn_async! { - pub async fn run_rpc_compat_test_suite<'a> (test: &'a mut Test, _client: Option) { + pub async fn run_rpc_compat_beacon_test_suite<'a> (test: &'a mut Test, _client: Option) { // Get all available portal clients let clients = test.sim.client_types().await; // todo: remove this once we implement role in hivesim-rs diff --git a/simulators/portal/history/src/suites/constants.rs b/simulators/portal/src/suites/history/constants.rs similarity index 100% rename from simulators/portal/history/src/suites/constants.rs rename to simulators/portal/src/suites/history/constants.rs diff --git a/simulators/portal/history/src/suites/interop.rs b/simulators/portal/src/suites/history/interop.rs similarity index 96% rename from simulators/portal/history/src/suites/interop.rs rename to simulators/portal/src/suites/history/interop.rs index a6153d5af6..1007c58a0b 100644 --- a/simulators/portal/history/src/suites/interop.rs +++ b/simulators/portal/src/suites/history/interop.rs @@ -1,4 +1,4 @@ -use crate::suites::constants::{TEST_DATA_FILE_PATH, TRIN_BRIDGE_CLIENT_TYPE}; +use crate::suites::history::constants::{TEST_DATA_FILE_PATH, TRIN_BRIDGE_CLIENT_TYPE}; use ethportal_api::types::history::ContentInfo; use ethportal_api::utils::bytes::hex_encode; use ethportal_api::{ @@ -75,8 +75,8 @@ fn process_content( ), HistoryContentKey::EpochAccumulator(_) => ( "Epoch Accumulator".to_string(), - header_with_proof.header.number, - vec![], + u64::MAX, + vec![content_pair_to_string_pair(history_content)], ), } } else { @@ -91,8 +91,16 @@ fn process_content( result } +pub fn get_test_message(block_number: u64) -> String { + if block_number == u64::MAX { + " ".to_string() + } else { + format!(" block number {}{}", block_number, get_flair(block_number)) + } +} + dyn_async! { - pub async fn test_portal_interop<'a> (test: &'a mut Test, _client: Option) { + pub async fn test_portal_history_interop<'a> (test: &'a mut Test, _client: Option) { // Get all available portal clients let clients = test.sim.client_types().await; // todo: remove this once we implement role in hivesim-rs @@ -114,7 +122,7 @@ dyn_async! { for ProcessedContent { content_type, block_number, test_data } in process_content(content.clone()) { test.run( NClientTestSpec { - name: format!("OFFER {}: block number {}{} {} --> {}", content_type, block_number, get_flair(block_number), client_a.name, client_b.name), + name: format!("OFFER {}:{} {} --> {}", content_type, get_test_message(block_number), client_a.name, client_b.name), description: "".to_string(), always_run: false, run: test_offer, @@ -126,7 +134,7 @@ dyn_async! { test.run( NClientTestSpec { - name: format!("RecursiveFindContent {}: block number {}{} {} --> {}", content_type, block_number, get_flair(block_number), client_a.name, client_b.name), + name: format!("RecursiveFindContent {}:{} {} --> {}", content_type, get_test_message(block_number), client_a.name, client_b.name), description: "".to_string(), always_run: false, run: test_recursive_find_content, @@ -138,7 +146,7 @@ dyn_async! { test.run( NClientTestSpec { - name: format!("FindContent {}: block number {}{} {} --> {}", content_type, block_number, get_flair(block_number), client_a.name, client_b.name), + name: format!("FindContent {}:{} {} --> {}", content_type, get_test_message(block_number), client_a.name, client_b.name), description: "".to_string(), always_run: false, run: test_find_content, @@ -617,9 +625,8 @@ dyn_async! { HistoryContentKey::EpochAccumulator(_) => "epoch accumulator".to_string(), }; format!( - "{}{} {}", - header_with_proof.header.number, - get_flair(header_with_proof.header.number), + "{} {}", + get_test_message(header_with_proof.header.number), content_type ) } else { diff --git a/simulators/portal/history/src/suites/mesh.rs b/simulators/portal/src/suites/history/mesh.rs similarity index 98% rename from simulators/portal/history/src/suites/mesh.rs rename to simulators/portal/src/suites/history/mesh.rs index 7686c19afb..107c209d06 100644 --- a/simulators/portal/history/src/suites/mesh.rs +++ b/simulators/portal/src/suites/history/mesh.rs @@ -1,4 +1,4 @@ -use crate::suites::constants::TRIN_BRIDGE_CLIENT_TYPE; +use crate::suites::history::constants::TRIN_BRIDGE_CLIENT_TYPE; use ethportal_api::jsonrpsee::core::__reexports::serde_json; use ethportal_api::types::distance::{Metric, XorMetric}; use ethportal_api::types::history::ContentInfo; @@ -21,7 +21,7 @@ const HEADER_WITH_PROOF_VALUE: &str = "0x080000002d020000f90222a02c58e3212c08517 const PRIVATE_KEY_ENVIRONMENT_VARIABLE: &str = "HIVE_CLIENT_PRIVATE_KEY"; dyn_async! { - pub async fn test_portal_scenarios<'a> (test: &'a mut Test, _client: Option) { + pub async fn test_portal_history_mesh<'a> (test: &'a mut Test, _client: Option) { // Get all available portal clients let clients = test.sim.client_types().await; // todo: remove this once we implement role in hivesim-rs diff --git a/simulators/portal/history/src/suites/mod.rs b/simulators/portal/src/suites/history/mod.rs similarity index 100% rename from simulators/portal/history/src/suites/mod.rs rename to simulators/portal/src/suites/history/mod.rs diff --git a/simulators/portal/history/src/suites/rpc_compat.rs b/simulators/portal/src/suites/history/rpc_compat.rs similarity index 99% rename from simulators/portal/history/src/suites/rpc_compat.rs rename to simulators/portal/src/suites/history/rpc_compat.rs index c957ac7d99..ac910e9eb6 100644 --- a/simulators/portal/history/src/suites/rpc_compat.rs +++ b/simulators/portal/src/suites/history/rpc_compat.rs @@ -1,4 +1,4 @@ -use crate::suites::constants::TRIN_BRIDGE_CLIENT_TYPE; +use crate::suites::history::constants::TRIN_BRIDGE_CLIENT_TYPE; use ethportal_api::types::enr::generate_random_remote_enr; use ethportal_api::Discv5ApiClient; use ethportal_api::{HistoryContentKey, HistoryContentValue, HistoryNetworkApiClient}; @@ -12,7 +12,7 @@ const CONTENT_KEY: &str = "0x00720704f3aa11c53cf344ea069db95cecb81ad7453c8f276b2 const CONTENT_VALUE: &str = "0x080000002d020000f90222a02c58e3212c085178dbb1277e2f3c24b3f451267a75a234945c1581af639f4a7aa058a694212e0416353a4d3865ccf475496b55af3a3d3b002057000741af9731919400192fb10df37c9fb26829eb2cc623cd1bf599e8a067a9fb631f4579f9015ef3c6f1f3830dfa2dc08afe156f750e90022134b9ebf6a018a2978fc62cd1a23e90de920af68c0c3af3330327927cda4c005faccefb5ce7a0168a3827607627e781941dc777737fc4b6beb69a8b139240b881992b35b854eab9010000200000400000001000400080080000000000010004010001000008000000002000110000000000000090020001110402008000080208040010000000a8000000000000000000210822000900205020000000000160020020000400800040000000000042080000000400004008084020001000001004004000001000000000000001000000110000040000010200844040048101000008002000404810082002800000108020000200408008000100000000000000002020000b00010080600902000200000050000400000000000000400000002002101000000a00002000003420000800400000020100002000000000000000c00040000001000000100187327bd7ad3116ce83e147ed8401c9c36483140db184627d9afa9a457468657265756d50504c4e532f326d696e6572735f55534133a0f1a32e24eb62f01ec3f2b3b5893f7be9062fbf5482bc0d490a54352240350e26882087fbb243327696851aae1651b6010cc53ffa2df1bae1550a0000000000000000000000000000000000000000000063d45d0a2242d35484f289108b3c80cccf943005db0db6c67ffea4c4a47fd529f64d74fa6068a3fd89a2c0d9938c3a751c4706d0b0e8f99dec6b517cf12809cb413795c8c678b3171303ddce2fa1a91af6a0961b9db72750d4d5ea7d5103d8d25f23f522d9af4c13fe8ac7a7d9d64bb08d980281eea5298b93cb1085fedc19d4c60afdd52d116cfad030cf4223e50afa8031154a2263c76eb08b96b5b8fdf5e5c30825d5c918eefb89daaf0e8573f20643614d9843a1817b6186074e4e53b22cf49046d977c901ec00aef1555fa89468adc2a51a081f186c995153d1cba0f2887d585212d68be4b958d309fbe611abe98a9bfc3f4b7a7b72bb881b888d89a04ecfe08b1c1a48554a48328646e4f864fe722f12d850f0be29e3829d1f94b34083032a9b6f43abd559785c996229f8e022d4cd6dcde4aafcce6445fe8743e1fcbe8672a99f9d9e3a5ca10c01f3751d69fbd22197f0680bc1529151130b22759bf185f4dbce357f46eb9cc8e21ea78f49b298eea2756d761fe23de8bea0d2e15aed136d689f6d252c54ebadc3e46b84a397b681edf7ec63522b9a298301084d019d0020000000000000000000000000000000000000000000000000000000000000"; dyn_async! { - pub async fn run_rpc_compat_test_suite<'a> (test: &'a mut Test, _client: Option) { + pub async fn run_rpc_compat_history_test_suite<'a> (test: &'a mut Test, _client: Option) { // Get all available portal clients let clients = test.sim.client_types().await; // todo: remove this once we implement role in hivesim-rs diff --git a/simulators/portal/history/src/suites/trin_bridge.rs b/simulators/portal/src/suites/history/trin_bridge.rs similarity index 100% rename from simulators/portal/history/src/suites/trin_bridge.rs rename to simulators/portal/src/suites/history/trin_bridge.rs diff --git a/simulators/portal/src/suites/mod.rs b/simulators/portal/src/suites/mod.rs new file mode 100644 index 0000000000..ac349031d1 --- /dev/null +++ b/simulators/portal/src/suites/mod.rs @@ -0,0 +1,3 @@ +pub mod beacon; +pub mod history; +pub mod state; diff --git a/simulators/portal/state/src/suites/constants.rs b/simulators/portal/src/suites/state/constants.rs similarity index 98% rename from simulators/portal/state/src/suites/constants.rs rename to simulators/portal/src/suites/state/constants.rs index a7375647d4..dfab39e731 100644 --- a/simulators/portal/state/src/suites/constants.rs +++ b/simulators/portal/src/suites/state/constants.rs @@ -1,4 +1,4 @@ -pub const TEST_DATA_FILE_PATH: &str = "./test-data/test_data.yaml"; +pub const TEST_DATA_FILE_PATH: &str = "./test-data/state_test_data.yaml"; pub const HIVE_PORTAL_NETWORKS_SELECTED: &str = "HIVE_PORTAL_NETWORKS_SELECTED"; pub const STATE_STRING: &str = "state"; diff --git a/simulators/portal/state/src/suites/interop.rs b/simulators/portal/src/suites/state/interop.rs similarity index 99% rename from simulators/portal/state/src/suites/interop.rs rename to simulators/portal/src/suites/state/interop.rs index d2fca23131..5b1bf2d4ea 100644 --- a/simulators/portal/state/src/suites/interop.rs +++ b/simulators/portal/src/suites/state/interop.rs @@ -1,4 +1,4 @@ -use crate::suites::constants::{ +use crate::suites::state::constants::{ CONTENT_KEY, HIVE_PORTAL_NETWORKS_SELECTED, STATE_STRING, TEST_DATA_FILE_PATH, TRIN_BRIDGE_CLIENT_TYPE, }; @@ -84,7 +84,7 @@ fn process_content( } dyn_async! { - pub async fn test_portal_interop<'a> (test: &'a mut Test, _client: Option) { + pub async fn test_portal_state_interop<'a> (test: &'a mut Test, _client: Option) { // Get all available portal clients let clients = test.sim.client_types().await; // todo: remove this once we implement role in hivesim-rs diff --git a/simulators/portal/state/src/suites/mod.rs b/simulators/portal/src/suites/state/mod.rs similarity index 100% rename from simulators/portal/state/src/suites/mod.rs rename to simulators/portal/src/suites/state/mod.rs diff --git a/simulators/portal/state/src/suites/rpc_compat.rs b/simulators/portal/src/suites/state/rpc_compat.rs similarity index 98% rename from simulators/portal/state/src/suites/rpc_compat.rs rename to simulators/portal/src/suites/state/rpc_compat.rs index ad719e0b8f..398456378b 100644 --- a/simulators/portal/state/src/suites/rpc_compat.rs +++ b/simulators/portal/src/suites/state/rpc_compat.rs @@ -1,9 +1,7 @@ -use crate::suites::constants::CONTENT_KEY; -use crate::suites::constants::CONTENT_LOOKUP_VALUE; -use crate::suites::constants::CONTENT_OFFER_VALUE; -use crate::suites::constants::HIVE_PORTAL_NETWORKS_SELECTED; -use crate::suites::constants::STATE_STRING; -use crate::suites::constants::TRIN_BRIDGE_CLIENT_TYPE; +use crate::suites::state::constants::{ + CONTENT_KEY, CONTENT_LOOKUP_VALUE, CONTENT_OFFER_VALUE, HIVE_PORTAL_NETWORKS_SELECTED, + STATE_STRING, TRIN_BRIDGE_CLIENT_TYPE, +}; use ethportal_api::types::enr::generate_random_remote_enr; use ethportal_api::Discv5ApiClient; use ethportal_api::{StateContentKey, StateContentValue, StateNetworkApiClient}; @@ -14,7 +12,7 @@ use serde_json::json; use std::collections::HashMap; dyn_async! { - pub async fn run_rpc_compat_test_suite<'a> (test: &'a mut Test, _client: Option) { + pub async fn run_rpc_compat_state_test_suite<'a> (test: &'a mut Test, _client: Option) { // Get all available portal clients let clients = test.sim.client_types().await; // todo: remove this once we implement role in hivesim-rs diff --git a/simulators/portal/state/Cargo.toml b/simulators/portal/state/Cargo.toml deleted file mode 100755 index a6c53d8a6c..0000000000 --- a/simulators/portal/state/Cargo.toml +++ /dev/null @@ -1,22 +0,0 @@ -[package] -name = "state" -version = "0.1.0" -authors = ["Kolby ML (Moroz Liebl) "] -edition = "2021" - -[dependencies] -ethportal-api = { git = "https://github.com/ethereum/trin", rev = "33ea99da64216899f7ab2778d117a18506d963dd" } -hivesim = { git = "https://github.com/ethereum/hive", rev = "62b3362bae655754b5f624c36720ba8c44a2f375" } -futures = "0.3.25" -itertools = "0.10.5" -serde_json = "1.0.87" -serde_yaml = "0.9" -tracing = "0.1.37" -tracing-subscriber = "0.3.16" -tokio = { version = "1", features = ["full"] } - -# todo: remove this when we update discv5. Added this because enr 10.1 is a breaking change -enr = { version = "=0.10.0", features = ["k256", "ed25519"] } -zstd = "=0.13.0" -zstd-safe = "=7.0.0" -zstd-sys = "=2.0.9+zstd.1.5.5" diff --git a/simulators/portal/state/Dockerfile b/simulators/portal/state/Dockerfile deleted file mode 100644 index b1add44731..0000000000 --- a/simulators/portal/state/Dockerfile +++ /dev/null @@ -1,37 +0,0 @@ -FROM rust:1.75.0 AS builder - -# create a new empty shell project -RUN USER=root cargo new --bin state -WORKDIR /state - -RUN apt-get update && apt-get install clang -y - -# copy over manifests and source to build image -COPY Cargo.toml ./Cargo.toml - -# create fake main.rs and build dependencies -RUN echo "fn main() {}" > ./src/main.rs - -RUN apt-get update && apt-get install clang -y -RUN cargo build --release - -# copy real src over and make newest modified file -COPY src ./src - -RUN touch -a -m ./src/main.rs - -# build for release -RUN cargo build --release - -# final base -FROM ubuntu:22.04 - -RUN apt update && apt install wget -y - -# copy build artifacts from build stage -COPY --from=builder /state/target/release/state . -ADD https://raw.githubusercontent.com/ethereum/portal-spec-tests/master/tests/mainnet/state/hive/test_data.yaml ./test-data/test_data.yaml - -ENV RUST_LOG=debug - -ENTRYPOINT ["./state"] diff --git a/simulators/portal/state/src/main.rs b/simulators/portal/state/src/main.rs deleted file mode 100644 index 14a0bb2ce1..0000000000 --- a/simulators/portal/state/src/main.rs +++ /dev/null @@ -1,46 +0,0 @@ -mod suites; - -use hivesim::{run_suite, Simulation, Suite, TestSpec}; -use suites::interop::test_portal_interop; -use suites::rpc_compat::run_rpc_compat_test_suite; - -#[tokio::main] -async fn main() { - tracing_subscriber::fmt::init(); - let mut state_rpc_compat = Suite { - name: "state-rpc-compat".to_string(), - description: "The RPC-compatibility test suite runs a set of RPC related tests against a - running node. It tests client implementations of the JSON-RPC API for - conformance with the portal network API specification." - .to_string(), - tests: vec![], - }; - - state_rpc_compat.add(TestSpec { - name: "client launch".to_string(), - description: "This test launches the client and collects its logs.".to_string(), - always_run: false, - run: run_rpc_compat_test_suite, - client: None, - }); - - let mut interop = Suite { - name: "state-interop".to_string(), - description: - "The interop test suite runs a set of scenarios to test interoperability between - portal network clients" - .to_string(), - tests: vec![], - }; - - interop.add(TestSpec { - name: "client launch".to_string(), - description: "This test launches the client and collects its logs.".to_string(), - always_run: false, - run: test_portal_interop, - client: None, - }); - - let sim = Simulation::new(); - run_suite(sim, vec![state_rpc_compat, interop]).await; -} From 491cad42f26b2bda5ddf48175fd02043998e6bc3 Mon Sep 17 00:00:00 2001 From: Kolby Moroz Liebl <31669092+KolbyML@users.noreply.github.com> Date: Wed, 24 Jul 2024 22:45:06 -0600 Subject: [PATCH 315/387] simulators/portal: update test data file link (#1137) --- simulators/portal/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/simulators/portal/Dockerfile b/simulators/portal/Dockerfile index ffe6020d5b..5ed3a5b35d 100644 --- a/simulators/portal/Dockerfile +++ b/simulators/portal/Dockerfile @@ -31,7 +31,7 @@ RUN apt update && apt install wget -y # copy build artifacts from build stage COPY --from=builder /portal/target/release/portal . -ADD https://raw.githubusercontent.com/KolbyML/portal-spec-tests/epoch/tests/mainnet/history/hive/test_data_collection_of_forks_blocks.yaml ./test-data/test_data_collection_of_forks_blocks.yaml +ADD https://raw.githubusercontent.com/ethereum/portal-spec-tests/master/tests/mainnet/history/hive/test_data_collection_of_forks_blocks.yaml ./test-data/test_data_collection_of_forks_blocks.yaml ADD https://raw.githubusercontent.com/ethereum/portal-spec-tests/master/tests/mainnet/state/hive/test_data.yaml ./test-data/state_test_data.yaml ADD https://raw.githubusercontent.com/ethereum/portal-spec-tests/master/tests/mainnet/beacon_chain/hive/test_data.yaml ./test-data/beacon_test_data.yaml From c91c0f77ab2a88124d51adf54910b24fb4318d6a Mon Sep 17 00:00:00 2001 From: Scotty <66335769+ScottyPoi@users.noreply.github.com> Date: Mon, 29 Jul 2024 02:32:49 -0600 Subject: [PATCH 316/387] clients/ethereumjs: enable WS in startup script (#1141) --- clients/ethereumjs/ethereumjs-local.sh | 2 +- clients/ethereumjs/ethereumjs.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/clients/ethereumjs/ethereumjs-local.sh b/clients/ethereumjs/ethereumjs-local.sh index e812b50399..2e33aa0278 100644 --- a/clients/ethereumjs/ethereumjs-local.sh +++ b/clients/ethereumjs/ethereumjs-local.sh @@ -47,7 +47,7 @@ set -e ethereumjs="node /ethereumjs-monorepo/packages/client/dist/esm/bin/cli.js" -FLAGS="--gethGenesis /genesis.json --rpc --rpcEngine --saveReceipts --rpcAddr 0.0.0.0 --rpcEngineAddr 0.0.0.0 --rpcEnginePort 8551 --ws false --logLevel debug --rpcDebug all --rpcDebugVerbose all --isSingleNode" +FLAGS="--gethGenesis /genesis.json --rpc --rpcEngine --saveReceipts --rpcAddr 0.0.0.0 --rpcEngineAddr 0.0.0.0 --rpcEnginePort 8551 --ws --logLevel debug --rpcDebug all --rpcDebugVerbose all --isSingleNode" # Configure the chain. mv /genesis.json /genesis-input.json diff --git a/clients/ethereumjs/ethereumjs.sh b/clients/ethereumjs/ethereumjs.sh index 8cb4e10910..37082bd147 100644 --- a/clients/ethereumjs/ethereumjs.sh +++ b/clients/ethereumjs/ethereumjs.sh @@ -49,7 +49,7 @@ set -e CLIENT_DIRECTORY=/ethereumjs-monorepo/packages/client ethereumjs="node $CLIENT_DIRECTORY/dist/esm/bin/cli.js" -FLAGS="--gethGenesis ./genesis.json --rpc --rpcEngine --saveReceipts --rpcAddr 0.0.0.0 --rpcEngineAddr 0.0.0.0 --rpcEnginePort 8551 --ws false --logLevel debug --rpcDebug all --rpcDebugVerbose all --isSingleNode" +FLAGS="--gethGenesis ./genesis.json --rpc --rpcEngine --saveReceipts --rpcAddr 0.0.0.0 --rpcEngineAddr 0.0.0.0 --rpcEnginePort 8551 --ws --logLevel debug --rpcDebug all --rpcDebugVerbose all --isSingleNode" # Configure the chain. mv /genesis.json /genesis-input.json From 8fd042df2589702118bea85e793ed1e5d461dec5 Mon Sep 17 00:00:00 2001 From: Gabriel-Trintinalia Date: Mon, 29 Jul 2024 18:33:34 +1000 Subject: [PATCH 317/387] clients/besu: bump java distribution to v21 (#1139) --- clients/besu/Dockerfile.git | 4 ++-- clients/besu/Dockerfile.local | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/clients/besu/Dockerfile.git b/clients/besu/Dockerfile.git index 7c9223c22c..1a8fd26c29 100644 --- a/clients/besu/Dockerfile.git +++ b/clients/besu/Dockerfile.git @@ -9,7 +9,7 @@ ARG github=hyperledger/besu RUN echo "installing java on ubuntu base image" \ && apt-get update && apt-get install -y git libsodium-dev libnss3-dev \ && apt-get install --no-install-recommends -q --assume-yes ca-certificates-java=20190909* \ - && apt-get install --no-install-recommends -q --assume-yes openjdk-17-jre-headless=17* libjemalloc-dev=5.* \ + && apt-get install --no-install-recommends -q --assume-yes openjdk-21-jre-headless=21* libjemalloc-dev=5.* \ && echo "Cloning: $github - $tag" \ && git clone --depth 1 --branch $tag https://github.com/$github \ && cd besu && ./gradlew installDist @@ -21,7 +21,7 @@ FROM ubuntu:22.04 COPY --from=builder /besu/build/install/besu /opt/besu RUN apt-get update && apt-get install -y curl jq libsodium23 libnss3-dev \ - && apt-get install --no-install-recommends -q --assume-yes openjdk-17-jre-headless=17* libjemalloc-dev=5.* \ + && apt-get install --no-install-recommends -q --assume-yes openjdk-21-jre-headless=21* libjemalloc-dev=5.* \ && apt-get clean && rm -rf /var/lib/apt/lists/* # Create version.txt diff --git a/clients/besu/Dockerfile.local b/clients/besu/Dockerfile.local index e5fd8d41e7..2ea061966a 100644 --- a/clients/besu/Dockerfile.local +++ b/clients/besu/Dockerfile.local @@ -9,7 +9,7 @@ COPY $local_path besu RUN apt-get update && apt-get install -y git libsodium-dev libnss3-dev \ && apt-get install --no-install-recommends -q --assume-yes ca-certificates-java=20190909 \ - && apt-get install --no-install-recommends -q --assume-yes openjdk-17-jre-headless=17* libjemalloc-dev=5.* \ + && apt-get install --no-install-recommends -q --assume-yes openjdk-21-jre-headless=21* libjemalloc-dev=5.* \ && cd besu && ./gradlew installDist ## Final stage: Sets up the environment for running besu @@ -20,7 +20,7 @@ COPY --from=builder /besu/build/install/besu /opt/besu RUN apt-get update && apt-get install -y curl jq libsodium23 libnss3-dev \ && apt-get install --no-install-recommends -q --assume-yes ca-certificates-java=20190909 \ - && apt-get install --no-install-recommends -q --assume-yes openjdk-17-jre-headless=17* libjemalloc-dev=5.* \ + && apt-get install --no-install-recommends -q --assume-yes openjdk-21-jre-headless=21* libjemalloc-dev=5.* \ && apt-get clean && rm -rf /var/lib/apt/lists/* # Create version.txt From 763352f9be8913ad3ffbae946debf1cf5d7f1b3e Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Wed, 7 Aug 2024 17:10:46 +0200 Subject: [PATCH 318/387] clients/besu: change syncmode X_SNAP to SNAP --- clients/besu/besu.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clients/besu/besu.sh b/clients/besu/besu.sh index 54a6c7329e..4324801e50 100644 --- a/clients/besu/besu.sh +++ b/clients/besu/besu.sh @@ -139,7 +139,7 @@ fi if [ "$HIVE_NODETYPE" == "light" ]; then echo "Ignoring HIVE_NODETYPE == light: besu does not support light client" elif [ "$HIVE_NODETYPE" == "" ] && [ "$HIVE_TERMINAL_TOTAL_DIFFICULTY" == "" ]; then - FLAGS="$FLAGS --sync-mode=X_SNAP" + FLAGS="$FLAGS --sync-mode=SNAP" fi # Configure RPC. From fcd7f22cb6acbc43aacabdefe5e2cd019a1e404d Mon Sep 17 00:00:00 2001 From: joshieDo <93316087+joshieDo@users.noreply.github.com> Date: Wed, 7 Aug 2024 16:23:46 +0100 Subject: [PATCH 319/387] simulators/ethereum/pyspec: fix fixture directory name (#1140) --- simulators/ethereum/pyspec/Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/simulators/ethereum/pyspec/Dockerfile b/simulators/ethereum/pyspec/Dockerfile index 6fa0053c47..d42e0070b2 100644 --- a/simulators/ethereum/pyspec/Dockerfile +++ b/simulators/ethereum/pyspec/Dockerfile @@ -23,10 +23,10 @@ COPY --from=builder /source/pyspec/pyspec . # Download the latest fixture release. RUN wget https://github.com/ethereum/execution-spec-tests/releases/latest/download/fixtures_develop.tar.gz RUN tar -xzvf fixtures_develop.tar.gz -RUN mv fixtures/blockchain_tests_hive /fixtures +RUN mv fixtures/blockchain_tests_engine /fixtures # ADD ./pyspec/fixtures /fixtures # Point to executable and test fixtures. ENV TESTPATH /fixtures -ENTRYPOINT ["./pyspec"] \ No newline at end of file +ENTRYPOINT ["./pyspec"] From e829a685410e5d91b463b1f3d9e77e47fb2048c9 Mon Sep 17 00:00:00 2001 From: web3-developer <51288821+web3-developer@users.noreply.github.com> Date: Wed, 7 Aug 2024 23:24:49 +0800 Subject: [PATCH 320/387] internal/libdocker: fix param order for docker.NewVersionedClient (#1145) --- internal/libdocker/docker.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/libdocker/docker.go b/internal/libdocker/docker.go index bce064c1de..64becf39a5 100644 --- a/internal/libdocker/docker.go +++ b/internal/libdocker/docker.go @@ -43,7 +43,7 @@ func Connect(dockerEndpoint string, cfg *Config) (*Builder, *ContainerBackend, e if dockerEndpoint == "" { client, err = docker.NewVersionedClientFromEnv(apiVersion) } else { - client, err = docker.NewVersionedClient(apiVersion, dockerEndpoint) + client, err = docker.NewVersionedClient(dockerEndpoint, apiVersion) } if err != nil { return nil, nil, fmt.Errorf("can't connect to docker: %v", err) From cf284d2cafef2d00e8237c68bf3f3f2b9f38dedf Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Wed, 7 Aug 2024 17:38:20 +0200 Subject: [PATCH 321/387] go.mod: upgrade docker dependencies --- go.mod | 7 ++++--- go.sum | 13 +++++++++---- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/go.mod b/go.mod index 98d02749dd..9e97b090c5 100644 --- a/go.mod +++ b/go.mod @@ -9,7 +9,7 @@ require ( github.com/ethereum/go-ethereum v1.14.5 github.com/ethereum/hive/hiveproxy v0.0.0-20240610172618-786a798a0cfe github.com/evanw/esbuild v0.18.11 - github.com/fsouza/go-dockerclient v1.11.0 + github.com/fsouza/go-dockerclient v1.11.2 github.com/golang-jwt/jwt/v4 v4.5.0 github.com/gorilla/mux v1.8.1 github.com/holiman/uint256 v1.2.4 @@ -43,7 +43,7 @@ require ( github.com/crate-crypto/go-kzg-4844 v1.0.0 // indirect github.com/deckarep/golang-set/v2 v2.6.0 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 // indirect - github.com/docker/docker v25.0.5+incompatible // indirect + github.com/docker/docker v27.1.1+incompatible // indirect github.com/docker/go-connections v0.4.0 // indirect github.com/docker/go-units v0.5.0 // indirect github.com/ethereum/c-kzg-4844 v1.0.0 // indirect @@ -66,6 +66,7 @@ require ( github.com/mattn/go-runewidth v0.0.14 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect github.com/mmcloughlin/addchain v0.4.0 // indirect + github.com/moby/docker-image-spec v1.3.1 // indirect github.com/moby/patternmatcher v0.6.0 // indirect github.com/moby/sys/sequential v0.5.0 // indirect github.com/moby/sys/user v0.1.0 // indirect @@ -90,7 +91,7 @@ require ( github.com/yusufpapurcu/wmi v1.2.2 // indirect golang.org/x/crypto v0.22.0 // indirect golang.org/x/sync v0.7.0 // indirect - golang.org/x/sys v0.20.0 // indirect + golang.org/x/sys v0.22.0 // indirect golang.org/x/text v0.14.0 // indirect google.golang.org/protobuf v1.33.0 // indirect rsc.io/tmplfunc v0.0.3 // indirect diff --git a/go.sum b/go.sum index c6c551c293..ee3fc834dc 100644 --- a/go.sum +++ b/go.sum @@ -6,8 +6,6 @@ github.com/DataDog/zstd v1.5.2 h1:vUG4lAyuPCXO0TLbXvPv7EB7cNK1QV/luu55UHLrrn8= github.com/DataDog/zstd v1.5.2/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= -github.com/Microsoft/hcsshim v0.9.10 h1:TxXGNmcbQxBKVWvjvTocNb6jrPyeHlk5EiDhhgHgggs= -github.com/Microsoft/hcsshim v0.9.10/go.mod h1:7pLA8lDk46WKDWlVsENo92gC0XFa8rbKfyFRBqxEbCc= github.com/VictoriaMetrics/fastcache v1.12.2 h1:N0y9ASrJ0F6h0QaC3o6uJb3NIZ9VKLjCM7NQbSmF7WI= github.com/VictoriaMetrics/fastcache v1.12.2/go.mod h1:AmC+Nzz1+3G2eCPapF6UcsnkThDcMsQicp4xDukwJYI= github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= @@ -63,8 +61,8 @@ github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 h1:HbphB4TFFXpv7MNrT52FGrrgVXF1owhMVTHFZIlnvd4= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0/go.mod h1:DZGJHZMqrU4JJqFAWUS2UO1+lbSKsdiOoYi9Zzey7Fc= -github.com/docker/docker v25.0.5+incompatible h1:UmQydMduGkrD5nQde1mecF/YnSbTOaPeFIeP5C4W+DE= -github.com/docker/docker v25.0.5+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v27.1.1+incompatible h1:hO/M4MtV36kzKldqnA37IWhebRA+LnqqcqDja6kVaKY= +github.com/docker/docker v27.1.1+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= @@ -84,6 +82,8 @@ github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4 github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= github.com/fsouza/go-dockerclient v1.11.0 h1:4ZAk6W7rPAtPXm7198EFqA5S68rwnNQORxlOA5OurCA= github.com/fsouza/go-dockerclient v1.11.0/go.mod h1:0I3TQCRseuPTzqlY4Y3ajfsg2VAdMQoazrkxJTiJg8s= +github.com/fsouza/go-dockerclient v1.11.2 h1:Wos4OMUwIjOW2rt8Z10TZSJHxgQH0KcYyf3O86dqFII= +github.com/fsouza/go-dockerclient v1.11.2/go.mod h1:HZN6ky2Mg5mfZO/WZBFDe6XCricqTnDJntfXHZTYnQQ= github.com/getsentry/sentry-go v0.18.0 h1:MtBW5H9QgdcJabtZcuJG80BMOwaBpkRDZkxRkNC1sN0= github.com/getsentry/sentry-go v0.18.0/go.mod h1:Kgon4Mby+FJ7ZWHFUAZgVaIa8sxHtnRJRLTXZr51aKQ= github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= @@ -162,6 +162,8 @@ github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfr github.com/mmcloughlin/addchain v0.4.0 h1:SobOdjm2xLj1KkXN5/n0xTIWyZA2+s99UCY1iPfkHRY= github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqkyU72HC5wJ4RlU= github.com/mmcloughlin/profile v0.1.1/go.mod h1:IhHD7q1ooxgwTgjxQYkACGA77oFTDdFVejUS1/tS/qU= +github.com/moby/docker-image-spec v1.3.1 h1:jMKff3w6PgbfSa69GfNg+zN/XLhfXJGnEx3Nl2EsFP0= +github.com/moby/docker-image-spec v1.3.1/go.mod h1:eKmb5VW8vQEh/BAr2yvVNvuiJuY6UIocYsFu/DxxRpo= github.com/moby/patternmatcher v0.6.0 h1:GmP9lR19aU5GqSSFko+5pRqHi+Ohk1O69aFiKkVGiPk= github.com/moby/patternmatcher v0.6.0/go.mod h1:hDPoyOpDY7OrrMDLaYoY3hf52gNCR/YOUYxkhApJIxc= github.com/moby/sys/sequential v0.5.0 h1:OPvI35Lzn9K04PBbCLW0g4LcFAJgHsvXsRyewg5lXtc= @@ -292,10 +294,13 @@ golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.22.0 h1:RI27ohtqKCnwULzJLqkv897zojh5/DwS/ENaMzUOaWI= +golang.org/x/sys v0.22.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.19.0 h1:+ThwsDv+tYfnJFhF4L8jITxu1tdTWRTZpdsWgEgjL6Q= golang.org/x/term v0.19.0/go.mod h1:2CuTdWZ7KHSQwUzKva0cbMg6q2DMI3Mmxp+gKJbskEk= +golang.org/x/term v0.22.0 h1:BbsgPEJULsl2fV/AT3v15Mjva5yXKQDyKf+TbDz7QJk= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= From fe628fd764f4bb3b7435d50f0b03958c3daaecf8 Mon Sep 17 00:00:00 2001 From: Mario Vega Date: Wed, 7 Aug 2024 12:14:37 -0600 Subject: [PATCH 322/387] simulators/ethereum/engine: Fix state scheme issue in Geth node (#1148) * simulators/ethereum/engine: use legacy Hash state scheme * simulators/ethereum/engine: use new Path state scheme * simulators/ethereum/engine: add comment * simulators/ethereum/pyspec: go mod tidy --- .../ethereum/engine/client/node/node.go | 52 ++++++++++++------- simulators/ethereum/engine/go.mod | 13 ++--- simulators/ethereum/engine/go.sum | 30 ++++++----- simulators/ethereum/pyspec/go.mod | 13 ++--- simulators/ethereum/pyspec/go.sum | 30 ++++++----- 5 files changed, 78 insertions(+), 60 deletions(-) diff --git a/simulators/ethereum/engine/client/node/node.go b/simulators/ethereum/engine/client/node/node.go index 12b3e66e5e..75f88952af 100644 --- a/simulators/ethereum/engine/client/node/node.go +++ b/simulators/ethereum/engine/client/node/node.go @@ -15,6 +15,7 @@ import ( "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/core/rawdb" "github.com/ethereum/go-ethereum/core/state" + "github.com/ethereum/go-ethereum/core/stateless" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/eth" @@ -33,6 +34,7 @@ import ( "github.com/ethereum/hive/simulators/ethereum/engine/client" "github.com/ethereum/hive/simulators/ethereum/engine/helper" typ "github.com/ethereum/hive/simulators/ethereum/engine/types" + "github.com/pkg/errors" ) type GethNodeTestConfiguration struct { @@ -207,6 +209,7 @@ func restart(startConfig GethNodeTestConfiguration, bootnodes []string, datadir SyncMode: downloader.FullSync, DatabaseCache: 256, DatabaseHandles: 256, + StateScheme: rawdb.PathScheme, TxPool: ethconfig.Defaults.TxPool, GPO: ethconfig.Defaults.GPO, Miner: ethconfig.Defaults.Miner, @@ -342,12 +345,17 @@ func (n *GethNode) Close() error { return nil } +// Dummy validator that always returns success, used to set invalid blocks at the head of the chain, which then can be +// served to other clients. type validator struct{} func (v *validator) ValidateBody(block *types.Block) error { return nil } -func (v *validator) ValidateState(block *types.Block, state *state.StateDB, receipts types.Receipts, usedGas uint64) error { +func (v *validator) ValidateState(block *types.Block, state *state.StateDB, receipts types.Receipts, usedGas uint64, stateless bool) error { + return nil +} +func (v *validator) ValidateWitness(witness *stateless.Witness, receiptRoot common.Hash, stateRoot common.Hash) error { return nil } @@ -370,8 +378,9 @@ func encodeBlockNumber(number uint64) []byte { func (n *GethNode) SetBlock(block *types.Block, parentNumber uint64, parentRoot common.Hash) error { parentTd := n.eth.BlockChain().GetTd(block.ParentHash(), block.NumberU64()-1) - rawdb.WriteTd(n.eth.ChainDb(), block.Hash(), block.NumberU64(), parentTd.Add(parentTd, block.Difficulty())) - rawdb.WriteBlock(n.eth.ChainDb(), block) + db := n.eth.ChainDb() + rawdb.WriteTd(db, block.Hash(), block.NumberU64(), parentTd.Add(parentTd, block.Difficulty())) + rawdb.WriteBlock(db, block) // write real info (fixes fake number test) data, err := rlp.EncodeToBytes(block.Header()) @@ -379,43 +388,46 @@ func (n *GethNode) SetBlock(block *types.Block, parentNumber uint64, parentRoot log.Crit("Failed to RLP encode header", "err", err) } key := headerKey(parentNumber+1, block.Hash()) - if err := n.eth.ChainDb().Put(key, data); err != nil { + if err := db.Put(key, data); err != nil { log.Crit("Failed to store header", "err", err) } - rawdb.WriteHeaderNumber(n.eth.ChainDb(), block.Hash(), block.NumberU64()) + rawdb.WriteHeaderNumber(db, block.Hash(), block.NumberU64()) bc := n.eth.BlockChain() bc.SetBlockValidatorAndProcessorForTesting(new(validator), n.eth.BlockChain().Processor()) statedb, err := state.New(parentRoot, bc.StateCache(), bc.Snapshots()) if err != nil { - return err + return errors.Wrap(err, "failed to create state db") } - statedb.StartPrefetcher("chain") + statedb.StartPrefetcher("chain", nil) var failedProcessing bool receipts, _, _, err := n.eth.BlockChain().Processor().Process(block, statedb, *n.eth.BlockChain().GetVMConfig()) if err != nil { failedProcessing = true } - rawdb.WriteReceipts(n.eth.ChainDb(), block.Hash(), block.NumberU64(), receipts) + rawdb.WriteReceipts(db, block.Hash(), block.NumberU64(), receipts) root, err := statedb.Commit(block.NumberU64(), false) if err != nil { - return err + return errors.Wrap(err, "failed to commit state") } - triedb := bc.StateCache().TrieDB() - if err := triedb.Commit(block.Root(), true); err != nil { - return err - } - if err := triedb.Commit(root, true); err != nil { - return err + // If node is running in path mode, skip explicit gc operation + // which is unnecessary in this mode. + if triedb := bc.StateCache().TrieDB(); triedb.Scheme() != rawdb.PathScheme { + if err := triedb.Commit(block.Root(), true); err != nil { + return errors.Wrapf(err, "failed to commit block trie, pathScheme=%v", triedb.Scheme()) + } + if err := triedb.Commit(root, true); err != nil { + return errors.Wrapf(err, "failed to commit root trie, pathScheme=%v", triedb.Scheme()) + } } - rawdb.WriteHeadHeaderHash(n.eth.ChainDb(), block.Hash()) - rawdb.WriteHeadFastBlockHash(n.eth.ChainDb(), block.Hash()) - rawdb.WriteCanonicalHash(n.eth.ChainDb(), block.Hash(), block.NumberU64()) - rawdb.WriteTxLookupEntriesByBlock(n.eth.ChainDb(), block) - rawdb.WriteHeadBlockHash(n.eth.ChainDb(), block.Hash()) + rawdb.WriteHeadHeaderHash(db, block.Hash()) + rawdb.WriteHeadFastBlockHash(db, block.Hash()) + rawdb.WriteCanonicalHash(db, block.Hash(), block.NumberU64()) + rawdb.WriteTxLookupEntriesByBlock(db, block) + rawdb.WriteHeadBlockHash(db, block.Hash()) oldProcessor := bc.Processor() if failedProcessing { bc.SetBlockValidatorAndProcessorForTesting(new(validator), new(processor)) diff --git a/simulators/ethereum/engine/go.mod b/simulators/ethereum/engine/go.mod index 5a027584b6..424e90d3e0 100644 --- a/simulators/ethereum/engine/go.mod +++ b/simulators/ethereum/engine/go.mod @@ -7,10 +7,10 @@ toolchain go1.22.1 require ( github.com/crate-crypto/go-kzg-4844 v1.0.0 github.com/davecgh/go-spew v1.1.1 - github.com/ethereum/go-ethereum v1.14.5 + github.com/ethereum/go-ethereum v1.14.7 github.com/ethereum/hive v0.0.0-20240715150147-c87a99dccfce github.com/golang-jwt/jwt/v4 v4.5.0 - github.com/holiman/uint256 v1.2.4 + github.com/holiman/uint256 v1.3.0 github.com/pkg/errors v0.9.1 golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa ) @@ -25,9 +25,10 @@ require ( github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect github.com/cespare/cp v1.1.1 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect - github.com/cockroachdb/errors v1.11.1 // indirect + github.com/cockroachdb/errors v1.11.3 // indirect + github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce // indirect github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect - github.com/cockroachdb/pebble v1.1.0 // indirect + github.com/cockroachdb/pebble v1.1.1 // indirect github.com/cockroachdb/redact v1.1.5 // indirect github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect github.com/consensys/bavard v0.1.13 // indirect @@ -43,7 +44,7 @@ require ( github.com/fjl/memsize v0.0.2 // indirect github.com/fsnotify/fsnotify v1.6.0 // indirect github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08 // indirect - github.com/getsentry/sentry-go v0.18.0 // indirect + github.com/getsentry/sentry-go v0.27.0 // indirect github.com/go-ole/go-ole v1.3.0 // indirect github.com/go-stack/stack v1.8.1 // indirect github.com/gofrs/flock v0.8.1 // indirect @@ -62,7 +63,7 @@ require ( github.com/influxdata/influxdb1-client v0.0.0-20220302092344-a9ab5670611c // indirect github.com/influxdata/line-protocol v0.0.0-20210922203350-b1ad95c89adf // indirect github.com/jackpal/go-nat-pmp v1.0.2 // indirect - github.com/klauspost/compress v1.15.15 // indirect + github.com/klauspost/compress v1.16.0 // indirect github.com/klauspost/cpuid/v2 v2.0.9 // indirect github.com/kr/pretty v0.3.1 // indirect github.com/kr/text v0.2.0 // indirect diff --git a/simulators/ethereum/engine/go.sum b/simulators/ethereum/engine/go.sum index c2fb8f25b6..26c9231dbc 100644 --- a/simulators/ethereum/engine/go.sum +++ b/simulators/ethereum/engine/go.sum @@ -29,12 +29,14 @@ github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5P github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f h1:otljaYPt5hWxV3MUfO5dFPFiOXg9CyG5/kCfayTqsJ4= github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= -github.com/cockroachdb/errors v1.11.1 h1:xSEW75zKaKCWzR3OfxXUxgrk/NtT4G1MiOv5lWZazG8= -github.com/cockroachdb/errors v1.11.1/go.mod h1:8MUxA3Gi6b25tYlFEBGLf+D8aISL+M4MIpiWMSNRfxw= +github.com/cockroachdb/errors v1.11.3 h1:5bA+k2Y6r+oz/6Z/RFlNeVCesGARKuC6YymtcDrbC/I= +github.com/cockroachdb/errors v1.11.3/go.mod h1:m4UIW4CDjx+R5cybPsNrRbreomiFqt8o1h1wUVazSd8= +github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce h1:giXvy4KSc/6g/esnpM7Geqxka4WSqI1SZc7sMJFd3y4= +github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce/go.mod h1:9/y3cnZ5GKakj/H4y9r9GTjCvAFta7KLgSHPJJYc52M= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= -github.com/cockroachdb/pebble v1.1.0 h1:pcFh8CdCIt2kmEpK0OIatq67Ln9uGDYY3d5XnE0LJG4= -github.com/cockroachdb/pebble v1.1.0/go.mod h1:sEHm5NOXxyiAoKWhoFxT8xMgd/f3RA6qUqQ1BXKrh2E= +github.com/cockroachdb/pebble v1.1.1 h1:XnKU22oiCLy2Xn8vp1re67cXg4SAasg/WDt1NtcRFaw= +github.com/cockroachdb/pebble v1.1.1/go.mod h1:4exszw1r40423ZsmkG/09AFEG83I0uDgfujJdbL6kYU= github.com/cockroachdb/redact v1.1.5 h1:u1PMllDkdFfPWaNGMyLD1+so+aq3uUItthCFqzwPJ30= github.com/cockroachdb/redact v1.1.5/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo= @@ -63,8 +65,8 @@ github.com/deepmap/oapi-codegen v1.12.4 h1:pPmn6qI9MuOtCz82WY2Xaw46EQjgvxednXXrP github.com/deepmap/oapi-codegen v1.12.4/go.mod h1:3lgHGMu6myQ2vqbbTXH2H1o4eXFTGnFiDaOaKKl5yas= github.com/ethereum/c-kzg-4844 v1.0.0 h1:0X1LBXxaEtYD9xsyj9B9ctQEZIpnvVDeoBx8aHEwTNA= github.com/ethereum/c-kzg-4844 v1.0.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= -github.com/ethereum/go-ethereum v1.14.5 h1:szuFzO1MhJmweXjoM5nSAeDvjNUH3vIQoMzzQnfvjpw= -github.com/ethereum/go-ethereum v1.14.5/go.mod h1:VEDGGhSxY7IEjn98hJRFXl/uFvpRgbIIf2PpXiyGGgc= +github.com/ethereum/go-ethereum v1.14.7 h1:EHpv3dE8evQmpVEQ/Ne2ahB06n2mQptdwqaMNhAT29g= +github.com/ethereum/go-ethereum v1.14.7/go.mod h1:Mq0biU2jbdmKSZoqOj29017ygFrMnB5/Rifwp980W4o= github.com/ethereum/go-verkle v0.1.1-0.20240306133620-7d920df305f0 h1:KrE8I4reeVvf7C1tm8elRjj4BdscTYzz/WAbYyf/JI4= github.com/ethereum/go-verkle v0.1.1-0.20240306133620-7d920df305f0/go.mod h1:D9AJLVXSyZQXJQVk8oh1EwjISE+sJTn2duYIZC0dy3w= github.com/ethereum/hive v0.0.0-20240715150147-c87a99dccfce h1:wgH9mh3TFSd+LFSsXO6RdTEO3niapJRywO1Xl3/IoIE= @@ -80,8 +82,8 @@ github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4 github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08 h1:f6D9Hr8xV8uYKlyuj8XIruxlh9WjVjdh1gIicAS7ays= github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= -github.com/getsentry/sentry-go v0.18.0 h1:MtBW5H9QgdcJabtZcuJG80BMOwaBpkRDZkxRkNC1sN0= -github.com/getsentry/sentry-go v0.18.0/go.mod h1:Kgon4Mby+FJ7ZWHFUAZgVaIa8sxHtnRJRLTXZr51aKQ= +github.com/getsentry/sentry-go v0.27.0 h1:Pv98CIbtB3LkMWmXi4Joa5OOcwbmnX88sF5qbK3r3Ps= +github.com/getsentry/sentry-go v0.27.0/go.mod h1:lc76E2QywIyW8WuBnwl8Lc4bkmQH4+w1gwTf25trprY= github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= @@ -139,8 +141,8 @@ github.com/holiman/billy v0.0.0-20240216141850-2abb0c79d3c4 h1:X4egAf/gcS1zATw6w github.com/holiman/billy v0.0.0-20240216141850-2abb0c79d3c4/go.mod h1:5GuXa7vkL8u9FkFuWdVvfR5ix8hRB7DbOAaYULamFpc= github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao= github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA= -github.com/holiman/uint256 v1.2.4 h1:jUc4Nk8fm9jZabQuqr2JzednajVmBpC+oiTiXZJEApU= -github.com/holiman/uint256 v1.2.4/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXeiRV4ng7E= +github.com/holiman/uint256 v1.3.0 h1:4wdcm/tnd0xXdu7iS3ruNvxkWwrb4aeBQv19ayYn8F4= +github.com/holiman/uint256 v1.3.0/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXeiRV4ng7E= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/huin/goupnp v1.3.0 h1:UvLUlWDNpoUdYzb2TCn+MuTWtcjXKSza2n6CBdQ0xXc= github.com/huin/goupnp v1.3.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8= @@ -156,8 +158,8 @@ github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+ github.com/juju/gnuflag v0.0.0-20171113085948-2ce1bb71843d/go.mod h1:2PavIy+JPciBPrBUjwbNvtwB6RQlve+hkpll6QSNmOE= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.15.15 h1:EF27CXIuDsYJ6mmvtBRlEuB2UVOqHG1tAXgZ7yIO+lw= -github.com/klauspost/compress v1.15.15/go.mod h1:ZcK2JAFqKOpnBlxcLsJzYfrS9X1akm9fHZNnD9+Vo/4= +github.com/klauspost/compress v1.16.0 h1:iULayQNOReoYUe+1qtKOqw9CwJv3aNQu8ivo7lw1HU4= +github.com/klauspost/compress v1.16.0/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.0.9 h1:lgaqFMSdTdQYdZ04uHyN2d/eKdOMyi2YLSvlQIBFYa4= github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= @@ -248,8 +250,8 @@ github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5 github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= -github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= -github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/supranational/blst v0.3.11 h1:LyU6FolezeWAhvQk0k6O/d49jqgO52MSDDfYgbeoEm4= github.com/supranational/blst v0.3.11/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a h1:1ur3QoCqvE5fl+nylMaIr9PVV1w343YRDtsy+Rwu7XI= diff --git a/simulators/ethereum/pyspec/go.mod b/simulators/ethereum/pyspec/go.mod index 326f9c094d..8351fe3885 100644 --- a/simulators/ethereum/pyspec/go.mod +++ b/simulators/ethereum/pyspec/go.mod @@ -5,7 +5,7 @@ go 1.21 toolchain go1.22.1 require ( - github.com/ethereum/go-ethereum v1.14.5 + github.com/ethereum/go-ethereum v1.14.7 github.com/ethereum/hive v0.0.0-20240715150147-c87a99dccfce github.com/ethereum/hive/simulators/ethereum/engine v0.0.0-20230919054339-322945164a97 ) @@ -18,9 +18,10 @@ require ( github.com/bits-and-blooms/bitset v1.10.0 // indirect github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect - github.com/cockroachdb/errors v1.11.1 // indirect + github.com/cockroachdb/errors v1.11.3 // indirect + github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce // indirect github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect - github.com/cockroachdb/pebble v1.1.0 // indirect + github.com/cockroachdb/pebble v1.1.1 // indirect github.com/cockroachdb/redact v1.1.5 // indirect github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect github.com/consensys/bavard v0.1.13 // indirect @@ -31,7 +32,7 @@ require ( github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 // indirect github.com/ethereum/c-kzg-4844 v1.0.0 // indirect github.com/ethereum/go-verkle v0.1.1-0.20240306133620-7d920df305f0 // indirect - github.com/getsentry/sentry-go v0.18.0 // indirect + github.com/getsentry/sentry-go v0.27.0 // indirect github.com/go-ole/go-ole v1.3.0 // indirect github.com/go-stack/stack v1.8.1 // indirect github.com/gofrs/flock v0.8.1 // indirect @@ -41,8 +42,8 @@ require ( github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect github.com/gorilla/websocket v1.5.0 // indirect github.com/holiman/bloomfilter/v2 v2.0.3 // indirect - github.com/holiman/uint256 v1.2.4 // indirect - github.com/klauspost/compress v1.15.15 // indirect + github.com/holiman/uint256 v1.3.0 // indirect + github.com/klauspost/compress v1.16.0 // indirect github.com/kr/pretty v0.3.1 // indirect github.com/kr/text v0.2.0 // indirect github.com/lithammer/dedent v1.1.0 // indirect diff --git a/simulators/ethereum/pyspec/go.sum b/simulators/ethereum/pyspec/go.sum index 66a62bf810..36604a1877 100644 --- a/simulators/ethereum/pyspec/go.sum +++ b/simulators/ethereum/pyspec/go.sum @@ -23,12 +23,14 @@ github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5P github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f h1:otljaYPt5hWxV3MUfO5dFPFiOXg9CyG5/kCfayTqsJ4= github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= -github.com/cockroachdb/errors v1.11.1 h1:xSEW75zKaKCWzR3OfxXUxgrk/NtT4G1MiOv5lWZazG8= -github.com/cockroachdb/errors v1.11.1/go.mod h1:8MUxA3Gi6b25tYlFEBGLf+D8aISL+M4MIpiWMSNRfxw= +github.com/cockroachdb/errors v1.11.3 h1:5bA+k2Y6r+oz/6Z/RFlNeVCesGARKuC6YymtcDrbC/I= +github.com/cockroachdb/errors v1.11.3/go.mod h1:m4UIW4CDjx+R5cybPsNrRbreomiFqt8o1h1wUVazSd8= +github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce h1:giXvy4KSc/6g/esnpM7Geqxka4WSqI1SZc7sMJFd3y4= +github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce/go.mod h1:9/y3cnZ5GKakj/H4y9r9GTjCvAFta7KLgSHPJJYc52M= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= -github.com/cockroachdb/pebble v1.1.0 h1:pcFh8CdCIt2kmEpK0OIatq67Ln9uGDYY3d5XnE0LJG4= -github.com/cockroachdb/pebble v1.1.0/go.mod h1:sEHm5NOXxyiAoKWhoFxT8xMgd/f3RA6qUqQ1BXKrh2E= +github.com/cockroachdb/pebble v1.1.1 h1:XnKU22oiCLy2Xn8vp1re67cXg4SAasg/WDt1NtcRFaw= +github.com/cockroachdb/pebble v1.1.1/go.mod h1:4exszw1r40423ZsmkG/09AFEG83I0uDgfujJdbL6kYU= github.com/cockroachdb/redact v1.1.5 h1:u1PMllDkdFfPWaNGMyLD1+so+aq3uUItthCFqzwPJ30= github.com/cockroachdb/redact v1.1.5/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo= @@ -55,8 +57,8 @@ github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 h1:HbphB4TFFXpv7MNrT52FGrrgVXF1 github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0/go.mod h1:DZGJHZMqrU4JJqFAWUS2UO1+lbSKsdiOoYi9Zzey7Fc= github.com/ethereum/c-kzg-4844 v1.0.0 h1:0X1LBXxaEtYD9xsyj9B9ctQEZIpnvVDeoBx8aHEwTNA= github.com/ethereum/c-kzg-4844 v1.0.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= -github.com/ethereum/go-ethereum v1.14.5 h1:szuFzO1MhJmweXjoM5nSAeDvjNUH3vIQoMzzQnfvjpw= -github.com/ethereum/go-ethereum v1.14.5/go.mod h1:VEDGGhSxY7IEjn98hJRFXl/uFvpRgbIIf2PpXiyGGgc= +github.com/ethereum/go-ethereum v1.14.7 h1:EHpv3dE8evQmpVEQ/Ne2ahB06n2mQptdwqaMNhAT29g= +github.com/ethereum/go-ethereum v1.14.7/go.mod h1:Mq0biU2jbdmKSZoqOj29017ygFrMnB5/Rifwp980W4o= github.com/ethereum/go-verkle v0.1.1-0.20240306133620-7d920df305f0 h1:KrE8I4reeVvf7C1tm8elRjj4BdscTYzz/WAbYyf/JI4= github.com/ethereum/go-verkle v0.1.1-0.20240306133620-7d920df305f0/go.mod h1:D9AJLVXSyZQXJQVk8oh1EwjISE+sJTn2duYIZC0dy3w= github.com/ethereum/hive v0.0.0-20240715150147-c87a99dccfce h1:wgH9mh3TFSd+LFSsXO6RdTEO3niapJRywO1Xl3/IoIE= @@ -70,8 +72,8 @@ github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4 github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08 h1:f6D9Hr8xV8uYKlyuj8XIruxlh9WjVjdh1gIicAS7ays= github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= -github.com/getsentry/sentry-go v0.18.0 h1:MtBW5H9QgdcJabtZcuJG80BMOwaBpkRDZkxRkNC1sN0= -github.com/getsentry/sentry-go v0.18.0/go.mod h1:Kgon4Mby+FJ7ZWHFUAZgVaIa8sxHtnRJRLTXZr51aKQ= +github.com/getsentry/sentry-go v0.27.0 h1:Pv98CIbtB3LkMWmXi4Joa5OOcwbmnX88sF5qbK3r3Ps= +github.com/getsentry/sentry-go v0.27.0/go.mod h1:lc76E2QywIyW8WuBnwl8Lc4bkmQH4+w1gwTf25trprY= github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= @@ -121,8 +123,8 @@ github.com/holiman/billy v0.0.0-20240216141850-2abb0c79d3c4 h1:X4egAf/gcS1zATw6w github.com/holiman/billy v0.0.0-20240216141850-2abb0c79d3c4/go.mod h1:5GuXa7vkL8u9FkFuWdVvfR5ix8hRB7DbOAaYULamFpc= github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao= github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA= -github.com/holiman/uint256 v1.2.4 h1:jUc4Nk8fm9jZabQuqr2JzednajVmBpC+oiTiXZJEApU= -github.com/holiman/uint256 v1.2.4/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXeiRV4ng7E= +github.com/holiman/uint256 v1.3.0 h1:4wdcm/tnd0xXdu7iS3ruNvxkWwrb4aeBQv19ayYn8F4= +github.com/holiman/uint256 v1.3.0/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXeiRV4ng7E= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/huin/goupnp v1.3.0 h1:UvLUlWDNpoUdYzb2TCn+MuTWtcjXKSza2n6CBdQ0xXc= github.com/huin/goupnp v1.3.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8= @@ -131,8 +133,8 @@ github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7Bd github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.15.15 h1:EF27CXIuDsYJ6mmvtBRlEuB2UVOqHG1tAXgZ7yIO+lw= -github.com/klauspost/compress v1.15.15/go.mod h1:ZcK2JAFqKOpnBlxcLsJzYfrS9X1akm9fHZNnD9+Vo/4= +github.com/klauspost/compress v1.16.0 h1:iULayQNOReoYUe+1qtKOqw9CwJv3aNQu8ivo7lw1HU4= +github.com/klauspost/compress v1.16.0/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= @@ -208,8 +210,8 @@ github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+ github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= -github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= -github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/supranational/blst v0.3.11 h1:LyU6FolezeWAhvQk0k6O/d49jqgO52MSDDfYgbeoEm4= github.com/supranational/blst v0.3.11/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a h1:1ur3QoCqvE5fl+nylMaIr9PVV1w343YRDtsy+Rwu7XI= From 625b82294b46ebf5c11300e4ad4d912fe91ff6ce Mon Sep 17 00:00:00 2001 From: Kolby Moroz Liebl <31669092+KolbyML@users.noreply.github.com> Date: Wed, 7 Aug 2024 19:43:30 -0600 Subject: [PATCH 323/387] simulators/portal: update ethportal-api version (#1146) --- .circleci/continue_config.yml | 4 +- simulators/portal/Cargo.lock | 1197 ++++++++--------- simulators/portal/Cargo.toml | 2 +- simulators/portal/Dockerfile | 2 +- .../portal/src/suites/beacon/interop.rs | 7 +- .../portal/src/suites/history/interop.rs | 2 +- simulators/portal/src/suites/state/interop.rs | 12 +- 7 files changed, 571 insertions(+), 655 deletions(-) diff --git a/.circleci/continue_config.yml b/.circleci/continue_config.yml index c284de4e20..a53d39a13a 100644 --- a/.circleci/continue_config.yml +++ b/.circleci/continue_config.yml @@ -78,7 +78,7 @@ jobs: # this makes sure the rust code is good hivesim-rs: docker: - - image: cimg/rust:1.75.0 + - image: cimg/rust:1.79.0 steps: - checkout - run: @@ -101,7 +101,7 @@ jobs: command: "cd hivesim-rs && cargo test --workspace -- --nocapture" rust-simulators: docker: - - image: cimg/rust:1.75.0 + - image: cimg/rust:1.79.0 steps: - checkout - run: diff --git a/simulators/portal/Cargo.lock b/simulators/portal/Cargo.lock index 857676306b..b6fe1d06cf 100644 --- a/simulators/portal/Cargo.lock +++ b/simulators/portal/Cargo.lock @@ -80,16 +80,202 @@ version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" +[[package]] +name = "alloy-consensus" +version = "0.1.0" +source = "git+https://github.com/alloy-rs/alloy?rev=8c9dd0a#8c9dd0ae0a0f12eb81b5afe75a9b55ea4ad3abf4" +dependencies = [ + "alloy-eips", + "alloy-primitives", + "alloy-rlp", + "alloy-serde", + "serde", + "sha2", +] + +[[package]] +name = "alloy-eips" +version = "0.1.0" +source = "git+https://github.com/alloy-rs/alloy?rev=8c9dd0a#8c9dd0ae0a0f12eb81b5afe75a9b55ea4ad3abf4" +dependencies = [ + "alloy-primitives", + "alloy-rlp", + "alloy-serde", + "c-kzg", + "once_cell", + "serde", +] + +[[package]] +name = "alloy-genesis" +version = "0.1.0" +source = "git+https://github.com/alloy-rs/alloy?rev=8c9dd0a#8c9dd0ae0a0f12eb81b5afe75a9b55ea4ad3abf4" +dependencies = [ + "alloy-primitives", + "alloy-serde", + "serde", +] + +[[package]] +name = "alloy-primitives" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccb3ead547f4532bc8af961649942f0b9c16ee9226e26caa3f38420651cc0bf4" +dependencies = [ + "alloy-rlp", + "bytes", + "cfg-if", + "const-hex", + "derive_more", + "ethereum_ssz", + "getrandom", + "hex-literal", + "itoa", + "k256", + "keccak-asm", + "proptest", + "rand", + "ruint", + "serde", + "tiny-keccak", +] + [[package]] name = "alloy-rlp" version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b155716bab55763c95ba212806cf43d05bcc70e5f35b02bad20cf5ec7fe11fed" dependencies = [ + "alloy-rlp-derive", "arrayvec", "bytes", ] +[[package]] +name = "alloy-rlp-derive" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d0f2d905ebd295e7effec65e5f6868d153936130ae718352771de3e7d03c75c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.66", +] + +[[package]] +name = "alloy-rpc-types" +version = "0.1.0" +source = "git+https://github.com/alloy-rs/alloy?rev=8c9dd0a#8c9dd0ae0a0f12eb81b5afe75a9b55ea4ad3abf4" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-genesis", + "alloy-primitives", + "alloy-rlp", + "alloy-serde", + "alloy-sol-types", + "itertools 0.12.1", + "jsonrpsee-types", + "serde", + "serde_json", + "thiserror", +] + +[[package]] +name = "alloy-rpc-types-engine" +version = "0.1.0" +source = "git+https://github.com/alloy-rs/alloy?rev=8c9dd0a#8c9dd0ae0a0f12eb81b5afe75a9b55ea4ad3abf4" +dependencies = [ + "alloy-consensus", + "alloy-primitives", + "alloy-rlp", + "alloy-rpc-types", + "alloy-serde", + "jsonrpsee-types", + "serde", + "thiserror", +] + +[[package]] +name = "alloy-rpc-types-trace" +version = "0.1.0" +source = "git+https://github.com/alloy-rs/alloy?rev=8c9dd0a#8c9dd0ae0a0f12eb81b5afe75a9b55ea4ad3abf4" +dependencies = [ + "alloy-primitives", + "alloy-rpc-types", + "alloy-serde", + "serde", + "serde_json", +] + +[[package]] +name = "alloy-serde" +version = "0.1.0" +source = "git+https://github.com/alloy-rs/alloy?rev=8c9dd0a#8c9dd0ae0a0f12eb81b5afe75a9b55ea4ad3abf4" +dependencies = [ + "alloy-primitives", + "serde", + "serde_json", +] + +[[package]] +name = "alloy-sol-macro" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b40397ddcdcc266f59f959770f601ce1280e699a91fc1862f29cef91707cd09" +dependencies = [ + "alloy-sol-macro-expander", + "alloy-sol-macro-input", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 2.0.66", +] + +[[package]] +name = "alloy-sol-macro-expander" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "867a5469d61480fea08c7333ffeca52d5b621f5ca2e44f271b117ec1fc9a0525" +dependencies = [ + "alloy-sol-macro-input", + "const-hex", + "heck 0.5.0", + "indexmap 2.2.6", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 2.0.66", + "syn-solidity", + "tiny-keccak", +] + +[[package]] +name = "alloy-sol-macro-input" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e482dc33a32b6fadbc0f599adea520bd3aaa585c141a80b404d0a3e3fa72528" +dependencies = [ + "const-hex", + "dunce", + "heck 0.5.0", + "proc-macro2", + "quote", + "syn 2.0.66", + "syn-solidity", +] + +[[package]] +name = "alloy-sol-types" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a91ca40fa20793ae9c3841b83e74569d1cc9af29a2f5237314fd3452d51e38c7" +dependencies = [ + "alloy-primitives", + "alloy-sol-macro", + "const-hex", +] + [[package]] name = "android-tzdata" version = "0.1.1" @@ -105,6 +291,15 @@ dependencies = [ "libc", ] +[[package]] +name = "ansi_term" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2" +dependencies = [ + "winapi", +] + [[package]] name = "anstream" version = "0.6.14" @@ -310,6 +505,17 @@ dependencies = [ "syn 2.0.66", ] +[[package]] +name = "atty" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" +dependencies = [ + "hermit-abi 0.1.19", + "libc", + "winapi", +] + [[package]] name = "auto_impl" version = "1.2.0" @@ -382,28 +588,26 @@ dependencies = [ ] [[package]] -name = "bindgen" -version = "0.66.1" +name = "bimap" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "230c5f1ca6a325a32553f8640d31ac9b49f2411e901e427570154868b46da4f7" + +[[package]] +name = "bit-set" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2b84e06fc203107bfbad243f4aba2af864eb7db3b1cf46ea0a023b0b433d2a7" +checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" dependencies = [ - "bitflags 2.5.0", - "cexpr", - "clang-sys", - "lazy_static", - "lazycell", - "log", - "peeking_take_while", - "prettyplease", - "proc-macro2", - "quote", - "regex", - "rustc-hash", - "shlex", - "syn 2.0.66", - "which", + "bit-vec", ] +[[package]] +name = "bit-vec" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" + [[package]] name = "bitflags" version = "1.3.2" @@ -415,9 +619,6 @@ name = "bitflags" version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" -dependencies = [ - "serde", -] [[package]] name = "bitvec" @@ -427,7 +628,6 @@ checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" dependencies = [ "funty", "radium", - "serde", "tap", "wyz", ] @@ -496,30 +696,18 @@ dependencies = [ "serde", ] -[[package]] -name = "c-kzg" -version = "0.1.0" -source = "git+https://github.com/ethereum/c-kzg-4844?rev=f5f6f863d475847876a2bd5ee252058d37c3a15d#f5f6f863d475847876a2bd5ee252058d37c3a15d" -dependencies = [ - "bindgen", - "blst", - "cc", - "glob", - "hex", - "libc", - "serde", -] - [[package]] name = "c-kzg" version = "1.0.2" -source = "git+https://github.com/ethereum/c-kzg-4844#b175a271df7f2fa4d324d4c11479ac1800c05e80" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdf100c4cea8f207e883ff91ca886d621d8a166cb04971dfaa9bb8fd99ed95df" dependencies = [ "blst", "cc", "glob", "hex", "libc", + "serde", ] [[package]] @@ -533,15 +721,6 @@ dependencies = [ "once_cell", ] -[[package]] -name = "cexpr" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" -dependencies = [ - "nom", -] - [[package]] name = "cfg-if" version = "1.0.0" @@ -570,17 +749,6 @@ dependencies = [ "generic-array", ] -[[package]] -name = "clang-sys" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4" -dependencies = [ - "glob", - "libc", - "libloading", -] - [[package]] name = "clap" version = "4.5.7" @@ -621,19 +789,6 @@ version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4b82cf0babdbd58558212896d1a4272303a57bdb245c2bf1147185fb45640e70" -[[package]] -name = "codecs-derive" -version = "0.1.0-alpha.10" -source = "git+https://github.com/paradigmxyz/reth.git?tag=v0.1.0-alpha.10#1b16d804ef01f4ec3c25e7986381c22739c105b9" -dependencies = [ - "convert_case 0.6.0", - "parity-scale-codec", - "proc-macro2", - "quote", - "serde", - "syn 2.0.66", -] - [[package]] name = "colorchoice" version = "1.0.1" @@ -660,20 +815,38 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" [[package]] -name = "convert_case" -version = "0.4.0" +name = "const_fn" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" +checksum = "373e9fafaa20882876db20562275ff58d50e0caa2590077fe7ce7bef90211d0d" [[package]] -name = "convert_case" -version = "0.6.0" +name = "const_format" +version = "0.2.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec182b0ca2f35d8fc196cf3404988fd8b8c739a4d270ff118a398feb0cbec1ca" +checksum = "e3a214c7af3d04997541b18d432afaff4c455e79e2029079647e72fc2bd27673" dependencies = [ - "unicode-segmentation", + "const_format_proc_macros", + "konst", ] +[[package]] +name = "const_format_proc_macros" +version = "0.2.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7f6ff08fd20f4f299298a28e2dfa8a8ba1036e6cd2460ac1de7b425d76f2500" +dependencies = [ + "proc-macro2", + "quote", + "unicode-xid", +] + +[[package]] +name = "convert_case" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" + [[package]] name = "core-foundation" version = "0.9.4" @@ -699,21 +872,6 @@ dependencies = [ "libc", ] -[[package]] -name = "crc" -version = "3.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69e6e4d7b33a94f0991c26729976b10ebde1d34c3ee82408fb536164fa10d636" -dependencies = [ - "crc-catalog", -] - -[[package]] -name = "crc-catalog" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" - [[package]] name = "crc32fast" version = "1.4.2" @@ -723,31 +881,6 @@ dependencies = [ "cfg-if", ] -[[package]] -name = "crossbeam-deque" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" -dependencies = [ - "crossbeam-epoch", - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-epoch" -version = "0.9.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-utils" -version = "0.8.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" - [[package]] name = "crunchy" version = "0.2.2" @@ -929,7 +1062,7 @@ version = "0.99.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f33878137e4dafd7fa914ad4e259e18a4e8e532b9617a2d0150262bf53abfce" dependencies = [ - "convert_case 0.4.0", + "convert_case", "proc-macro2", "quote", "rustc_version 0.4.0", @@ -987,6 +1120,12 @@ dependencies = [ "zeroize", ] +[[package]] +name = "dunce" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" + [[package]] name = "dyn-clone" version = "1.0.17" @@ -1080,22 +1219,12 @@ dependencies = [ "log", "rand", "rlp", + "secp256k1 0.27.0", "serde", "sha3 0.10.8", "zeroize", ] -[[package]] -name = "enumn" -version = "0.1.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fd000fd6988e73bbe993ea3db9b1aa64906ab88766d654973924340c8cddb42" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.66", -] - [[package]] name = "env_logger" version = "0.8.4" @@ -1125,31 +1254,14 @@ dependencies = [ [[package]] name = "eth_trie" version = "0.4.0" -source = "git+https://github.com/morph-dev/eth-trie.rs.git?branch=trin#83bf198df680cde7abea9de049f4b78ab9c81309" +source = "git+https://github.com/kolbyml/eth-trie.rs.git?rev=7e57d3dfadee126cc9fda2696fb039bf7b6ed688#7e57d3dfadee126cc9fda2696fb039bf7b6ed688" dependencies = [ - "ethereum-types", + "alloy-primitives", + "alloy-rlp", "hashbrown 0.14.5", "keccak-hash", "log", "parking_lot 0.12.3", - "rlp", -] - -[[package]] -name = "ethabi" -version = "18.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7413c5f74cc903ea37386a8965a936cbeb334bd270862fdece542c1b2dcbc898" -dependencies = [ - "ethereum-types", - "hex", - "once_cell", - "regex", - "serde", - "serde_json", - "sha3 0.10.8", - "thiserror", - "uint", ] [[package]] @@ -1160,10 +1272,8 @@ checksum = "c22d4b5885b6aa2fe5e8b9329fb8d232bf739e434e6b87347c63bdd00c120f60" dependencies = [ "crunchy", "fixed-hash", - "impl-codec", "impl-rlp", "impl-serde", - "scale-info", "tiny-keccak", ] @@ -1175,23 +1285,21 @@ checksum = "02d215cbf040552efcbe99a38372fe80ab9d00268e20012b79fcd0f073edd8ee" dependencies = [ "ethbloom", "fixed-hash", - "impl-codec", "impl-rlp", "impl-serde", "primitive-types", - "scale-info", "uint", ] [[package]] name = "ethereum_hashing" -version = "1.0.0-beta.2" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "233dc6f434ce680dbabf4451ee3380cec46cb3c45d66660445a435619710dd35" +checksum = "6ea7b408432c13f71af01197b1d3d0069c48a27bfcfbe72a81fc346e47f6defb" dependencies = [ "cpufeatures", "lazy_static", - "ring 0.16.20", + "ring", "sha2", ] @@ -1231,80 +1339,50 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "ethers-core" -version = "2.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82d80cc6ad30b14a48ab786523af33b37f28a8623fc06afd55324816ef18fb1f" -dependencies = [ - "arrayvec", - "bytes", - "chrono", - "const-hex", - "elliptic-curve", - "ethabi", - "generic-array", - "k256", - "num_enum", - "open-fastrlp", - "rand", - "rlp", - "serde", - "serde_json", - "strum 0.26.2", - "tempfile", - "thiserror", - "tiny-keccak", - "unicode-xid", -] - -[[package]] -name = "ethnum" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b90ca2580b73ab6a1f724b76ca11ab632df820fd6040c336200d2c1df7b3c82c" - [[package]] name = "ethportal-api" version = "0.2.2" -source = "git+https://github.com/ethereum/trin?rev=33ea99da64216899f7ab2778d117a18506d963dd#33ea99da64216899f7ab2778d117a18506d963dd" +source = "git+https://github.com/ethereum/trin?rev=688847c64c1ef15df20828aa44ef871d3345fc98#688847c64c1ef15df20828aa44ef871d3345fc98" dependencies = [ + "alloy-primitives", + "alloy-rlp", "anyhow", "base64 0.13.1", + "bimap", "bytes", + "c-kzg", "clap", + "const_format", "discv5", "eth_trie", - "ethereum-types", + "ethereum_hashing", "ethereum_serde_utils", "ethereum_ssz", "ethereum_ssz_derive", - "ethnum", "hex", "jsonrpsee", "keccak-hash", "lazy_static", "nanotemplate", + "once_cell", "quickcheck", "rand", "reth-rpc-types", "rlp", - "rlp-derive", "rs_merkle", - "ruint", + "secp256k1 0.29.0", "serde", "serde-this-or-that", "serde_json", - "serde_yaml", "sha2", "sha3 0.9.1", - "snap", "ssz_types", "superstruct", "thiserror", "tokio", "tree_hash", "tree_hash_derive", + "trin-utils", "ureq", "url", "validator", @@ -1529,6 +1607,19 @@ version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "40ecd4077b5ae9fd2e9e169b102c6c330d0605168eb0e8bf79952b256dbefffd" +[[package]] +name = "git2" +version = "0.18.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "232e6a7bfe35766bf715e55a88b39a700596c0ccfd88cd3680b4cdb40d66ef70" +dependencies = [ + "bitflags 2.5.0", + "libc", + "libgit2-sys", + "log", + "url", +] + [[package]] name = "glob" version = "0.3.1" @@ -1625,7 +1716,6 @@ checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" dependencies = [ "ahash", "allocator-api2", - "serde", ] [[package]] @@ -1649,6 +1739,15 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" +[[package]] +name = "hermit-abi" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" +dependencies = [ + "libc", +] + [[package]] name = "hermit-abi" version = "0.3.9" @@ -1703,15 +1802,6 @@ dependencies = [ "digest 0.10.7", ] -[[package]] -name = "home" -version = "0.5.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5" -dependencies = [ - "windows-sys 0.52.0", -] - [[package]] name = "http" version = "0.2.12" @@ -1917,6 +2007,12 @@ version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" +[[package]] +name = "is_debug" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06d198e9919d9822d5f7083ba8530e04de87841eaf21ead9af8f2304efd57c89" + [[package]] name = "is_terminal_polyfill" version = "1.70.0" @@ -1934,9 +2030,9 @@ dependencies = [ [[package]] name = "itertools" -version = "0.11.0" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" dependencies = [ "either", ] @@ -2149,6 +2245,16 @@ dependencies = [ "cpufeatures", ] +[[package]] +name = "keccak-asm" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "422fbc7ff2f2f5bdffeb07718e5a5324dca72b0c9293d50df4026652385e3314" +dependencies = [ + "digest 0.10.7", + "sha3-asm", +] + [[package]] name = "keccak-hash" version = "0.10.0" @@ -2160,16 +2266,25 @@ dependencies = [ ] [[package]] -name = "lazy_static" -version = "1.4.0" +name = "konst" +version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" +checksum = "330f0e13e6483b8c34885f7e6c9f19b1a7bd449c673fbb948a51c99d66ef74f4" +dependencies = [ + "konst_macro_rules", +] [[package]] -name = "lazycell" -version = "1.3.0" +name = "konst_macro_rules" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4933f3f57a8e9d9da04db23fb153356ecaf00cbd14aee46279c33dc80925c37" + +[[package]] +name = "lazy_static" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" @@ -2178,13 +2293,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" [[package]] -name = "libloading" -version = "0.8.3" +name = "libgit2-sys" +version = "0.16.2+1.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c2a198fb6b0eada2a8df47933734e6d35d350665a33a3593d7164fa52c75c19" +checksum = "ee4126d8b4ee5c9d9ea891dd875cfdc1e9d0950437179104b183d7d8a74d24e8" dependencies = [ - "cfg-if", - "windows-targets 0.52.5", + "cc", + "libc", + "libz-sys", + "pkg-config", ] [[package]] @@ -2193,6 +2310,18 @@ version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" +[[package]] +name = "libz-sys" +version = "1.1.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c15da26e5af7e25c90b37a2d75cdbf940cf4a55316de9d84c679c9b8bfabf82e" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + [[package]] name = "linux-raw-sys" version = "0.4.14" @@ -2224,6 +2353,15 @@ dependencies = [ "hashbrown 0.14.5", ] +[[package]] +name = "matchers" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" +dependencies = [ + "regex-automata 0.1.10", +] + [[package]] name = "matches" version = "0.1.10" @@ -2252,12 +2390,6 @@ dependencies = [ "unicase", ] -[[package]] -name = "minimal-lexical" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" - [[package]] name = "miniz_oxide" version = "0.7.4" @@ -2278,27 +2410,6 @@ dependencies = [ "windows-sys 0.48.0", ] -[[package]] -name = "modular-bitfield" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a53d79ba8304ac1c4f9eb3b9d281f21f7be9d4626f72ce7df4ad8fbde4f38a74" -dependencies = [ - "modular-bitfield-impl", - "static_assertions", -] - -[[package]] -name = "modular-bitfield-impl" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a7d5f7076603ebc68de2dc6a650ec331a062a13abaa346975be747bbfa4b789" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "more-asserts" version = "0.3.1" @@ -2311,16 +2422,6 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f247bfe894f8a04e0d8b1eb5eed9dfb7424f6dda47cf83e3f03670e87cb2831b" -[[package]] -name = "nom" -version = "7.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" -dependencies = [ - "memchr", - "minimal-lexical", -] - [[package]] name = "nu-ansi-term" version = "0.46.0" @@ -2372,29 +2473,17 @@ version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" dependencies = [ - "hermit-abi", + "hermit-abi 0.3.9", "libc", ] [[package]] -name = "num_enum" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02339744ee7253741199f897151b38e72257d13802d4ee837285cc2990a90845" -dependencies = [ - "num_enum_derive", -] - -[[package]] -name = "num_enum_derive" -version = "0.7.2" +name = "num_threads" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "681030a937600a36906c185595136d26abfebb4aa9c65701cefcaf8578bb982b" +checksum = "5c7398b9c8b70908f6371f47ed36737907c87c52af34c268fed0bf0ceb92ead9" dependencies = [ - "proc-macro-crate 3.1.0", - "proc-macro2", - "quote", - "syn 2.0.66", + "libc", ] [[package]] @@ -2418,31 +2507,6 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" -[[package]] -name = "open-fastrlp" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "786393f80485445794f6043fd3138854dd109cc6c4bd1a6383db304c9ce9b9ce" -dependencies = [ - "arrayvec", - "auto_impl", - "bytes", - "ethereum-types", - "open-fastrlp-derive", -] - -[[package]] -name = "open-fastrlp-derive" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "003b2be5c6c53c1cfeb0a238b8a1c3915cd410feb684457a36c10038f764bb1c" -dependencies = [ - "bytes", - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "openssl-probe" version = "0.1.5" @@ -2464,7 +2528,6 @@ dependencies = [ "arrayvec", "bitvec", "byte-slice-cast", - "bytes", "impl-trait-for-tuples", "parity-scale-codec-derive", "serde", @@ -2536,12 +2599,6 @@ version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" -[[package]] -name = "peeking_take_while" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099" - [[package]] name = "percent-encoding" version = "2.3.1" @@ -2634,8 +2691,8 @@ dependencies = [ "tokio", "tracing", "tracing-subscriber", - "zstd 0.13.0", - "zstd-safe 7.0.0", + "zstd", + "zstd-safe", "zstd-sys", ] @@ -2656,16 +2713,6 @@ version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" -[[package]] -name = "prettyplease" -version = "0.2.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f12335488a2f3b0a83b14edad48dca9879ce89b2edd10e80237e4e852dd645e" -dependencies = [ - "proc-macro2", - "syn 2.0.66", -] - [[package]] name = "primitive-types" version = "0.12.2" @@ -2676,7 +2723,6 @@ dependencies = [ "impl-codec", "impl-rlp", "impl-serde", - "scale-info", "uint", ] @@ -2738,16 +2784,26 @@ version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "31b476131c3c86cb68032fdc5cb6d5a1045e3e42d96b69fa599fd77701e1f5bf" dependencies = [ + "bit-set", + "bit-vec", "bitflags 2.5.0", "lazy_static", "num-traits", "rand", "rand_chacha", "rand_xorshift", - "regex-syntax", + "regex-syntax 0.8.4", + "rusty-fork", + "tempfile", "unarray", ] +[[package]] +name = "quick-error" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" + [[package]] name = "quickcheck" version = "1.0.3" @@ -2813,26 +2869,6 @@ dependencies = [ "rand_core", ] -[[package]] -name = "rayon" -version = "1.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" -dependencies = [ - "either", - "rayon-core", -] - -[[package]] -name = "rayon-core" -version = "1.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" -dependencies = [ - "crossbeam-deque", - "crossbeam-utils", -] - [[package]] name = "redox_syscall" version = "0.2.16" @@ -2859,8 +2895,17 @@ checksum = "b91213439dad192326a0d7c6ee3955910425f441d7038e0d6933b0aec5c4517f" dependencies = [ "aho-corasick", "memchr", - "regex-automata", - "regex-syntax", + "regex-automata 0.4.7", + "regex-syntax 0.8.4", +] + +[[package]] +name = "regex-automata" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" +dependencies = [ + "regex-syntax 0.6.29", ] [[package]] @@ -2871,9 +2916,15 @@ checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" dependencies = [ "aho-corasick", "memchr", - "regex-syntax", + "regex-syntax 0.8.4", ] +[[package]] +name = "regex-syntax" +version = "0.6.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" + [[package]] name = "regex-syntax" version = "0.8.4" @@ -2904,131 +2955,38 @@ dependencies = [ "percent-encoding", "pin-project-lite", "serde", - "serde_json", - "serde_urlencoded", - "sync_wrapper", - "system-configuration", - "tokio", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", - "winreg", -] - -[[package]] -name = "reth-codecs" -version = "0.1.0-alpha.10" -source = "git+https://github.com/paradigmxyz/reth.git?tag=v0.1.0-alpha.10#1b16d804ef01f4ec3c25e7986381c22739c105b9" -dependencies = [ - "bytes", - "codecs-derive", - "revm-primitives", -] - -[[package]] -name = "reth-primitives" -version = "0.1.0-alpha.10" -source = "git+https://github.com/paradigmxyz/reth.git?tag=v0.1.0-alpha.10#1b16d804ef01f4ec3c25e7986381c22739c105b9" -dependencies = [ - "bytes", - "c-kzg 0.1.0", - "crc", - "crunchy", - "derive_more", - "ethers-core", - "fixed-hash", - "hex", - "hex-literal", - "impl-serde", - "itertools 0.11.0", - "modular-bitfield", - "once_cell", - "paste", - "rayon", - "reth-codecs", - "reth-rlp", - "reth-rlp-derive", - "revm-primitives", - "ruint", - "secp256k1", - "serde", - "serde_json", - "serde_with", - "sha2", - "strum 0.25.0", - "sucds", - "tempfile", - "thiserror", - "tiny-keccak", + "serde_json", + "serde_urlencoded", + "sync_wrapper", + "system-configuration", "tokio", - "tokio-stream", - "tracing", + "tower-service", "url", - "zstd 0.12.4", -] - -[[package]] -name = "reth-rlp" -version = "0.1.0-alpha.10" -source = "git+https://github.com/paradigmxyz/reth.git?tag=v0.1.0-alpha.10#1b16d804ef01f4ec3c25e7986381c22739c105b9" -dependencies = [ - "arrayvec", - "auto_impl", - "bytes", - "c-kzg 0.1.0", - "ethereum-types", - "reth-rlp-derive", - "revm-primitives", -] - -[[package]] -name = "reth-rlp-derive" -version = "0.1.0-alpha.10" -source = "git+https://github.com/paradigmxyz/reth.git?tag=v0.1.0-alpha.10#1b16d804ef01f4ec3c25e7986381c22739c105b9" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.66", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "winreg", ] [[package]] name = "reth-rpc-types" -version = "0.1.0-alpha.10" -source = "git+https://github.com/paradigmxyz/reth.git?tag=v0.1.0-alpha.10#1b16d804ef01f4ec3c25e7986381c22739c105b9" +version = "0.2.0-beta.5" +source = "git+https://github.com/paradigmxyz/reth.git?rev=8d1d13ef89cf19459adc37ba0c45e7aac6270dc1#8d1d13ef89cf19459adc37ba0c45e7aac6270dc1" dependencies = [ - "itertools 0.11.0", + "alloy-genesis", + "alloy-primitives", + "alloy-rlp", + "alloy-rpc-types", + "alloy-rpc-types-engine", + "alloy-rpc-types-trace", + "enr", "jsonrpsee-types", - "reth-primitives", - "reth-rlp", + "secp256k1 0.27.0", "serde", "serde_json", + "serde_with", "thiserror", -] - -[[package]] -name = "revm-primitives" -version = "1.1.2" -source = "git+https://github.com/bluealloy/revm?rev=516f62cc#516f62ccc1c5f2a62e5fc58115213fe04c7f7a8c" -dependencies = [ - "auto_impl", - "bitflags 2.5.0", - "bitvec", - "bytes", - "c-kzg 1.0.2", - "derive_more", - "enumn", - "fixed-hash", - "hashbrown 0.14.5", - "hex", - "hex-literal", - "once_cell", - "primitive-types", - "rlp", - "ruint", - "serde", - "sha3 0.10.8", + "url", ] [[package]] @@ -3041,21 +2999,6 @@ dependencies = [ "subtle", ] -[[package]] -name = "ring" -version = "0.16.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc" -dependencies = [ - "cc", - "libc", - "once_cell", - "spin 0.5.2", - "untrusted 0.7.1", - "web-sys", - "winapi", -] - [[package]] name = "ring" version = "0.17.8" @@ -3066,8 +3009,8 @@ dependencies = [ "cfg-if", "getrandom", "libc", - "spin 0.9.8", - "untrusted 0.9.0", + "spin", + "untrusted", "windows-sys 0.52.0", ] @@ -3078,21 +3021,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bb919243f34364b6bd2fc10ef797edbfa75f33c252e7998527479c6d6b47e1ec" dependencies = [ "bytes", - "rlp-derive", "rustc-hex", ] -[[package]] -name = "rlp-derive" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e33d7b2abe0c340d8797fe2907d3f20d3b5ea5908683618bfe80df7f621f672a" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "route-recognizer" version = "0.3.1" @@ -3118,6 +3049,7 @@ dependencies = [ "ark-ff 0.3.0", "ark-ff 0.4.2", "bytes", + "ethereum_ssz", "fastrlp", "num-bigint", "num-traits", @@ -3194,7 +3126,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" dependencies = [ "log", - "ring 0.17.8", + "ring", "rustls-webpki", "sct", ] @@ -3226,15 +3158,21 @@ version = "0.101.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" dependencies = [ - "ring 0.17.8", - "untrusted 0.9.0", + "ring", + "untrusted", ] [[package]] -name = "rustversion" -version = "1.0.17" +name = "rusty-fork" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "955d28af4278de8121b7ebeb796b6a45735dc01436d898801014aced2773a3d6" +checksum = "cb3dcc6e454c328bb824492db107ab7c0ae8fcffe4ad210136ef014458c1bc4f" +dependencies = [ + "fnv", + "quick-error", + "tempfile", + "wait-timeout", +] [[package]] name = "ryu" @@ -3242,30 +3180,6 @@ version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" -[[package]] -name = "scale-info" -version = "2.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eca070c12893629e2cc820a9761bedf6ce1dcddc9852984d1dc734b8bd9bd024" -dependencies = [ - "cfg-if", - "derive_more", - "parity-scale-codec", - "scale-info-derive", -] - -[[package]] -name = "scale-info-derive" -version = "2.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d35494501194174bda522a32605929eefc9ecf7e0a326c26db1fdd85881eb62" -dependencies = [ - "proc-macro-crate 3.1.0", - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "schannel" version = "0.1.23" @@ -3287,8 +3201,8 @@ version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" dependencies = [ - "ring 0.17.8", - "untrusted 0.9.0", + "ring", + "untrusted", ] [[package]] @@ -3310,9 +3224,18 @@ name = "secp256k1" version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "25996b82292a7a57ed3508f052cfff8640d38d32018784acd714758b43da9c8f" +dependencies = [ + "secp256k1-sys 0.8.1", +] + +[[package]] +name = "secp256k1" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e0cc0f1cf93f4969faf3ea1c7d8a9faed25918d96affa959720823dfe86d4f3" dependencies = [ "rand", - "secp256k1-sys", + "secp256k1-sys 0.10.0", ] [[package]] @@ -3324,6 +3247,15 @@ dependencies = [ "cc", ] +[[package]] +name = "secp256k1-sys" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1433bd67156263443f14d603720b082dd3121779323fce20cba2aa07b874bc1b" +dependencies = [ + "cc", +] + [[package]] name = "security-framework" version = "2.11.0" @@ -3518,6 +3450,29 @@ dependencies = [ "keccak", ] +[[package]] +name = "sha3-asm" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57d79b758b7cb2085612b11a235055e485605a5103faccdd633f35bd7aee69dd" +dependencies = [ + "cc", + "cfg-if", +] + +[[package]] +name = "shadow-rs" +version = "0.27.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7960cbd6ba74691bb15e7ebf97f7136bd02d1115f5695a58c1f31d5645750128" +dependencies = [ + "const_format", + "git2", + "is_debug", + "time", + "tzdb", +] + [[package]] name = "sharded-slab" version = "0.1.7" @@ -3527,12 +3482,6 @@ dependencies = [ "lazy_static", ] -[[package]] -name = "shlex" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" - [[package]] name = "signal-hook-registry" version = "1.4.2" @@ -3567,12 +3516,6 @@ version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" -[[package]] -name = "snap" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b6b67fb9a61334225b5b790716f609cd58395f895b3fe8b328786812a40bc3b" - [[package]] name = "socket2" version = "0.4.10" @@ -3609,12 +3552,6 @@ dependencies = [ "sha-1", ] -[[package]] -name = "spin" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" - [[package]] name = "spin" version = "0.9.8" @@ -3633,9 +3570,8 @@ dependencies = [ [[package]] name = "ssz_types" -version = "0.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "382939886cb24ee8ac885d09116a60f6262d827c7a9e36012b4f6d3d0116d0b3" +version = "0.6.0" +source = "git+https://github.com/KolbyML/ssz_types.git?rev=2a5922de75f00746890bf4ea9ad663c9d5d58efe#2a5922de75f00746890bf4ea9ad663c9d5d58efe" dependencies = [ "derivative", "ethereum_serde_utils", @@ -3666,65 +3602,12 @@ version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" -[[package]] -name = "strum" -version = "0.25.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "290d54ea6f91c969195bdbcd7442c8c2a2ba87da8bf60a7ee86a235d4bc1e125" -dependencies = [ - "strum_macros 0.25.3", -] - -[[package]] -name = "strum" -version = "0.26.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d8cec3501a5194c432b2b7976db6b7d10ec95c253208b45f83f7136aa985e29" -dependencies = [ - "strum_macros 0.26.4", -] - -[[package]] -name = "strum_macros" -version = "0.25.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23dc1fa9ac9c169a78ba62f0b841814b7abae11bdd047b9c58f893439e309ea0" -dependencies = [ - "heck 0.4.1", - "proc-macro2", - "quote", - "rustversion", - "syn 2.0.66", -] - -[[package]] -name = "strum_macros" -version = "0.26.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" -dependencies = [ - "heck 0.5.0", - "proc-macro2", - "quote", - "rustversion", - "syn 2.0.66", -] - [[package]] name = "subtle" version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" -[[package]] -name = "sucds" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64accd20141dfbef67ad83c51d588146cff7810616e1bda35a975be369059533" -dependencies = [ - "anyhow", -] - [[package]] name = "superstruct" version = "0.7.0" @@ -3761,6 +3644,18 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "syn-solidity" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c837dc8852cb7074e46b444afb81783140dab12c58867b49fb3898fbafedf7ea" +dependencies = [ + "paste", + "proc-macro2", + "quote", + "syn 2.0.66", +] + [[package]] name = "sync_wrapper" version = "0.1.2" @@ -3853,7 +3748,9 @@ checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" dependencies = [ "deranged", "itoa", + "libc", "num-conv", + "num_threads", "powerfmt", "serde", "time-core", @@ -4071,36 +3968,49 @@ version = "0.3.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" dependencies = [ + "matchers", "nu-ansi-term", + "once_cell", + "regex", "sharded-slab", "smallvec", "thread_local", + "tracing", "tracing-core", "tracing-log", ] [[package]] name = "tree_hash" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c998ac5fe2b07c025444bdd522e6258110b63861c6698eedc610c071980238d" +version = "0.6.0" +source = "git+https://github.com/KolbyML/tree_hash.git?rev=8aaf8bb4184148768d48e2cfbbdd0b95d1da8730#8aaf8bb4184148768d48e2cfbbdd0b95d1da8730" dependencies = [ - "ethereum-types", + "alloy-primitives", "ethereum_hashing", "smallvec", ] [[package]] name = "tree_hash_derive" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84303a9c7cda5f085a3ed9cd241d1e95e04d88aab1d679b02f212e653537ba86" +version = "0.6.0" +source = "git+https://github.com/KolbyML/tree_hash.git?rev=8aaf8bb4184148768d48e2cfbbdd0b95d1da8730#8aaf8bb4184148768d48e2cfbbdd0b95d1da8730" dependencies = [ "darling 0.13.4", "quote", "syn 1.0.109", ] +[[package]] +name = "trin-utils" +version = "0.1.1-alpha.1" +source = "git+https://github.com/ethereum/trin?rev=688847c64c1ef15df20828aa44ef871d3345fc98#688847c64c1ef15df20828aa44ef871d3345fc98" +dependencies = [ + "ansi_term", + "atty", + "shadow-rs", + "tracing-subscriber", +] + [[package]] name = "try-lock" version = "0.2.5" @@ -4113,6 +4023,35 @@ version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" +[[package]] +name = "tz-rs" +version = "0.6.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33851b15c848fad2cf4b105c6bb66eb9512b6f6c44a4b13f57c53c73c707e2b4" +dependencies = [ + "const_fn", +] + +[[package]] +name = "tzdb" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b580f6b365fa89f5767cdb619a55d534d04a4e14c2d7e5b9a31e94598687fb1" +dependencies = [ + "iana-time-zone", + "tz-rs", + "tzdb_data", +] + +[[package]] +name = "tzdb_data" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1889fdffac09d65c1d95c42d5202e9b21ad8c758f426e9fe09088817ea998d6" +dependencies = [ + "tz-rs", +] + [[package]] name = "ucd-trie" version = "0.1.6" @@ -4167,12 +4106,6 @@ dependencies = [ "tinyvec", ] -[[package]] -name = "unicode-segmentation" -version = "1.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202" - [[package]] name = "unicode-xid" version = "0.2.4" @@ -4195,12 +4128,6 @@ version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "673aac59facbab8a9007c7f6108d11f63b603f7cabff99fabf650fea5c32b861" -[[package]] -name = "untrusted" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" - [[package]] name = "untrusted" version = "0.9.0" @@ -4287,12 +4214,27 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + [[package]] name = "version_check" version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" +[[package]] +name = "wait-timeout" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f200f5b12eb75f8c1ed65abd4b2db8a6e1b138a20de009dacee265a2498f3f6" +dependencies = [ + "libc", +] + [[package]] name = "want" version = "0.3.1" @@ -4390,18 +4332,6 @@ version = "0.25.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" -[[package]] -name = "which" -version = "4.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7" -dependencies = [ - "either", - "home", - "once_cell", - "rustix", -] - [[package]] name = "winapi" version = "0.3.9" @@ -4640,32 +4570,13 @@ dependencies = [ "syn 2.0.66", ] -[[package]] -name = "zstd" -version = "0.12.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a27595e173641171fc74a1232b7b1c7a7cb6e18222c11e9dfb9888fa424c53c" -dependencies = [ - "zstd-safe 6.0.6", -] - [[package]] name = "zstd" version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bffb3309596d527cfcba7dfc6ed6052f1d39dfbd7c867aa2e865e4a449c10110" dependencies = [ - "zstd-safe 7.0.0", -] - -[[package]] -name = "zstd-safe" -version = "6.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee98ffd0b48ee95e6c5168188e44a54550b1564d9d530ee21d5f0eaed1069581" -dependencies = [ - "libc", - "zstd-sys", + "zstd-safe", ] [[package]] diff --git a/simulators/portal/Cargo.toml b/simulators/portal/Cargo.toml index 128a3d2bdd..d08ecd257b 100755 --- a/simulators/portal/Cargo.toml +++ b/simulators/portal/Cargo.toml @@ -5,7 +5,7 @@ authors = ["Kolby ML (Moroz Liebl) "] edition = "2021" [dependencies] -ethportal-api = { git = "https://github.com/ethereum/trin", rev = "33ea99da64216899f7ab2778d117a18506d963dd" } +ethportal-api = { git = "https://github.com/ethereum/trin", rev = "688847c64c1ef15df20828aa44ef871d3345fc98" } portal-spec-test-utils-rs = { git = "https://github.com/ethereum/portal-spec-tests", rev = "954f7d0eb2950a2131048404a1a4ce476bb64657" } hivesim = { git = "https://github.com/ethereum/hive", rev = "62b3362bae655754b5f624c36720ba8c44a2f375" } futures = "0.3.25" diff --git a/simulators/portal/Dockerfile b/simulators/portal/Dockerfile index 5ed3a5b35d..73b9d0305b 100644 --- a/simulators/portal/Dockerfile +++ b/simulators/portal/Dockerfile @@ -1,4 +1,4 @@ -FROM rust:1.75.0 AS builder +FROM rust:1.79.0 AS builder # create a new empty shell project RUN USER=root cargo new --bin portal diff --git a/simulators/portal/src/suites/beacon/interop.rs b/simulators/portal/src/suites/beacon/interop.rs index 197c172ef6..b626411a2f 100644 --- a/simulators/portal/src/suites/beacon/interop.rs +++ b/simulators/portal/src/suites/beacon/interop.rs @@ -61,7 +61,12 @@ fn process_content(content: Vec<(BeaconContentKey, BeaconContentValue)>) -> Vec< ), BeaconContentKey::LightClientOptimisticUpdate(optimistic_update) => ( "Optimistic Update".to_string(), - format!("finalized slot: {}", optimistic_update.signature_slot), + format!("optimistic slot: {}", optimistic_update.signature_slot), + vec![content_pair_to_string_pair(beacon_content)], + ), + BeaconContentKey::HistoricalSummariesWithProof(historical_summaries) => ( + "Historical Summaries".to_string(), + format!("historical summaries epoch: {}", historical_summaries.epoch), vec![content_pair_to_string_pair(beacon_content)], ), }; diff --git a/simulators/portal/src/suites/history/interop.rs b/simulators/portal/src/suites/history/interop.rs index 1007c58a0b..e78c710f7f 100644 --- a/simulators/portal/src/suites/history/interop.rs +++ b/simulators/portal/src/suites/history/interop.rs @@ -291,7 +291,7 @@ dyn_async! { } }; - let _ = client_a.rpc.offer(target_enr, target_key.clone(), Some(target_value.clone())).await; + let _ = client_a.rpc.offer(target_enr, target_key.clone(), target_value.clone()).await; tokio::time::sleep(Duration::from_secs(8)).await; diff --git a/simulators/portal/src/suites/state/interop.rs b/simulators/portal/src/suites/state/interop.rs index 5b1bf2d4ea..ab254b4002 100644 --- a/simulators/portal/src/suites/state/interop.rs +++ b/simulators/portal/src/suites/state/interop.rs @@ -50,7 +50,7 @@ fn process_content( format!( "path: {} node hash: {}", hex_encode(account_trie_node.path.nibbles()), - hex_encode(account_trie_node.node_hash.as_bytes()) + hex_encode(account_trie_node.node_hash.as_slice()) ), vec![content_pair_to_string_pair(state_content)], ), @@ -58,9 +58,9 @@ fn process_content( "Contract Storage Trie Node".to_string(), format!( "address: {} path: {} node hash: {}", - hex_encode(contract_storage_trie_node.address.as_bytes()), + hex_encode(contract_storage_trie_node.address_hash.as_slice()), hex_encode(contract_storage_trie_node.path.nibbles()), - hex_encode(contract_storage_trie_node.node_hash.as_bytes()) + hex_encode(contract_storage_trie_node.node_hash.as_slice()) ), vec![content_pair_to_string_pair(state_content)], ), @@ -68,8 +68,8 @@ fn process_content( "Contract Bytecode".to_string(), format!( "address: {} code hash: {}", - hex_encode(contract_bytecode.address.as_bytes()), - hex_encode(contract_bytecode.code_hash.as_bytes()) + hex_encode(contract_bytecode.address_hash.as_slice()), + hex_encode(contract_bytecode.code_hash.as_slice()) ), vec![content_pair_to_string_pair(state_content)], ), @@ -265,7 +265,7 @@ dyn_async! { } }; - let _ = client_a.rpc.offer(target_enr, target_key.clone(), Some(target_offer_value.clone())).await; + let _ = client_a.rpc.offer(target_enr, target_key.clone(), target_offer_value.clone()).await; tokio::time::sleep(Duration::from_secs(8)).await; From 81fc9a350d7f7ca8bcbe5f54886483d405d4daa8 Mon Sep 17 00:00:00 2001 From: Milos Stankovic <82043364+morph-dev@users.noreply.github.com> Date: Thu, 15 Aug 2024 17:50:20 +0300 Subject: [PATCH 324/387] hivesim-rs: allow test data to be generic (#1150) --- hivesim-rs/src/testapi.rs | 22 +++++++++++----------- hivesim-rs/src/types.rs | 39 --------------------------------------- 2 files changed, 11 insertions(+), 50 deletions(-) diff --git a/hivesim-rs/src/testapi.rs b/hivesim-rs/src/testapi.rs index 985632abb5..6324182d15 100644 --- a/hivesim-rs/src/testapi.rs +++ b/hivesim-rs/src/testapi.rs @@ -1,4 +1,4 @@ -use crate::types::{ClientDefinition, SuiteID, TestData, TestID, TestResult}; +use crate::types::{ClientDefinition, SuiteID, TestID, TestResult}; use crate::Simulation; use ::std::{boxed::Box, future::Future, pin::Pin}; use async_trait::async_trait; @@ -21,9 +21,9 @@ pub type AsyncTestFunc = fn( >, >; -pub type AsyncNClientsTestFunc = fn( +pub type AsyncNClientsTestFunc = fn( Vec, - Option, + T, ) -> Pin< Box< dyn Future // future API / pollable @@ -202,7 +202,7 @@ pub async fn run_test( } #[derive(Clone)] -pub struct NClientTestSpec { +pub struct NClientTestSpec { /// These fields are displayed in the UI. Be sure to add /// a meaningful description here. pub name: String, @@ -212,17 +212,17 @@ pub struct NClientTestSpec { /// then perform further tests against it. pub always_run: bool, /// The Run function is invoked when the test executes. - pub run: AsyncNClientsTestFunc, + pub run: AsyncNClientsTestFunc, /// For each client, there is a distinct map of Hive Environment Variable names to values. /// The environments must be in the same order as the `clients` pub environments: Option>>>, /// test data which can be passed to the test - pub test_data: Option, + pub test_data: T, pub clients: Vec, } #[async_trait] -impl Testable for NClientTestSpec { +impl Testable for NClientTestSpec { async fn run_test(&self, simulation: Simulation, suite_id: SuiteID, suite: Suite) { if let Some(test_match) = simulation.test_matcher.clone() { if !self.always_run && !test_match.match_test(&suite.name, &self.name) { @@ -242,7 +242,7 @@ impl Testable for NClientTestSpec { simulation, test_run, self.environments.to_owned(), - self.test_data.to_owned(), + self.test_data.clone(), self.clients.to_owned(), self.run, ) @@ -251,13 +251,13 @@ impl Testable for NClientTestSpec { } // Write a test that runs against N clients. -async fn run_n_client_test( +async fn run_n_client_test( host: Simulation, test: TestRun, environments: Option>>>, - test_data: Option, + test_data: T, clients: Vec, - func: AsyncNClientsTestFunc, + func: AsyncNClientsTestFunc, ) { // Register test on simulation server and initialize the T. let test_id = host.start_test(test.suite_id, test.name, test.desc).await; diff --git a/hivesim-rs/src/types.rs b/hivesim-rs/src/types.rs index 66cf36e74b..c24e855084 100644 --- a/hivesim-rs/src/types.rs +++ b/hivesim-rs/src/types.rs @@ -36,42 +36,3 @@ pub struct TestResult { pub pass: bool, pub details: String, } - -#[derive(Clone, Debug)] -pub struct ContentKeyValue { - pub key: String, - pub value: String, -} - -#[derive(Clone, Debug)] -pub struct ContentKeyOfferLookupValues { - pub key: String, - pub offer_value: String, - pub lookup_value: String, -} - -#[derive(Clone, Debug)] -pub enum TestData { - /// A list of tuples containing content key/value pairs - ContentList(Vec), - /// A list of tuples containing a content key, offer value, and lookup value - StateContentList(Vec), -} - -impl TestData { - pub fn content_list(self) -> Vec { - if let TestData::ContentList(content_list) = self { - content_list - } else { - panic!("TestData didn't contain ContentList: enum was likely filled with the wrong data {self:?}") - } - } - - pub fn state_content_list(self) -> Vec { - if let TestData::StateContentList(state_content_list) = self { - state_content_list - } else { - panic!("TestData didn't contain StateContentList: enum was likely filled with the wrong data {self:?}") - } - } -} From 0a33f89ee8c5baa6ade3b86943e94824f1887ad8 Mon Sep 17 00:00:00 2001 From: Milos Stankovic <82043364+morph-dev@users.noreply.github.com> Date: Thu, 15 Aug 2024 23:37:27 +0300 Subject: [PATCH 325/387] simulators/portal: update portal simulators to newest version of hivesim (#1151) simulators/portal: update portal simulators to newest version of hivesim --- simulators/portal/Cargo.lock | 39 +---- simulators/portal/Cargo.toml | 15 +- .../portal/src/suites/beacon/interop.rs | 66 +++------ simulators/portal/src/suites/beacon/mesh.rs | 11 +- .../portal/src/suites/beacon/rpc_compat.rs | 57 ++++---- .../portal/src/suites/history/interop.rs | 130 ++++------------- simulators/portal/src/suites/history/mesh.rs | 11 +- .../portal/src/suites/history/rpc_compat.rs | 57 ++++---- .../portal/src/suites/history/trin_bridge.rs | 5 +- simulators/portal/src/suites/state/interop.rs | 133 ++++++------------ .../portal/src/suites/state/rpc_compat.rs | 57 ++++---- 11 files changed, 196 insertions(+), 385 deletions(-) diff --git a/simulators/portal/Cargo.lock b/simulators/portal/Cargo.lock index b6fe1d06cf..88d7c489a0 100644 --- a/simulators/portal/Cargo.lock +++ b/simulators/portal/Cargo.lock @@ -142,9 +142,9 @@ dependencies = [ [[package]] name = "alloy-rlp" -version = "0.3.5" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b155716bab55763c95ba212806cf43d05bcc70e5f35b02bad20cf5ec7fe11fed" +checksum = "26154390b1d205a4a7ac7352aa2eb4f81f391399d4e2f546fb81a2f8bb383f62" dependencies = [ "alloy-rlp-derive", "arrayvec", @@ -1772,7 +1772,7 @@ checksum = "6fe2267d4ed49bc07b63801559be28c718ea06c4738b7a03c94df7386d2cde46" [[package]] name = "hivesim" version = "0.1.0-alpha.1" -source = "git+https://github.com/ethereum/hive?rev=62b3362bae655754b5f624c36720ba8c44a2f375#62b3362bae655754b5f624c36720ba8c44a2f375" +source = "git+https://github.com/ethereum/hive?rev=81fc9a350d7f7ca8bcbe5f54886483d405d4daa8#81fc9a350d7f7ca8bcbe5f54886483d405d4daa8" dependencies = [ "async-trait", "dyn-clone", @@ -2680,6 +2680,8 @@ dependencies = [ name = "portal" version = "0.1.0" dependencies = [ + "alloy-primitives", + "alloy-rlp", "enr", "ethportal-api", "futures", @@ -2691,9 +2693,6 @@ dependencies = [ "tokio", "tracing", "tracing-subscriber", - "zstd", - "zstd-safe", - "zstd-sys", ] [[package]] @@ -4569,31 +4568,3 @@ dependencies = [ "quote", "syn 2.0.66", ] - -[[package]] -name = "zstd" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bffb3309596d527cfcba7dfc6ed6052f1d39dfbd7c867aa2e865e4a449c10110" -dependencies = [ - "zstd-safe", -] - -[[package]] -name = "zstd-safe" -version = "7.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43747c7422e2924c11144d5229878b98180ef8b06cca4ab5af37afc8a8d8ea3e" -dependencies = [ - "zstd-sys", -] - -[[package]] -name = "zstd-sys" -version = "2.0.9+zstd.1.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e16efa8a874a0481a574084d34cc26fdb3b99627480f785888deb6386506656" -dependencies = [ - "cc", - "pkg-config", -] diff --git a/simulators/portal/Cargo.toml b/simulators/portal/Cargo.toml index d08ecd257b..617532074e 100755 --- a/simulators/portal/Cargo.toml +++ b/simulators/portal/Cargo.toml @@ -5,19 +5,18 @@ authors = ["Kolby ML (Moroz Liebl) "] edition = "2021" [dependencies] +alloy-rlp = "0.3.8" +alloy-primitives = "0.7.7" +# todo: remove this when we update discv5. Added this because enr 10.1 is a breaking change +enr = { version = "=0.10.0", features = ["k256", "ed25519"] } ethportal-api = { git = "https://github.com/ethereum/trin", rev = "688847c64c1ef15df20828aa44ef871d3345fc98" } -portal-spec-test-utils-rs = { git = "https://github.com/ethereum/portal-spec-tests", rev = "954f7d0eb2950a2131048404a1a4ce476bb64657" } -hivesim = { git = "https://github.com/ethereum/hive", rev = "62b3362bae655754b5f624c36720ba8c44a2f375" } futures = "0.3.25" +hivesim = { git = "https://github.com/ethereum/hive", rev = "81fc9a350d7f7ca8bcbe5f54886483d405d4daa8" } itertools = "0.10.5" +portal-spec-test-utils-rs = { git = "https://github.com/ethereum/portal-spec-tests", rev = "954f7d0eb2950a2131048404a1a4ce476bb64657" } serde_json = "1.0.87" serde_yaml = "0.9" +tokio = { version = "1", features = ["full"] } tracing = "0.1.37" tracing-subscriber = "0.3.16" -tokio = { version = "1", features = ["full"] } -# todo: remove this when we update discv5. Added this because enr 10.1 is a breaking change -enr = { version = "=0.10.0", features = ["k256", "ed25519"] } -zstd = "=0.13.0" -zstd-safe = "=7.0.0" -zstd-sys = "=2.0.9+zstd.1.5.5" diff --git a/simulators/portal/src/suites/beacon/interop.rs b/simulators/portal/src/suites/beacon/interop.rs index b626411a2f..d48328b4a1 100644 --- a/simulators/portal/src/suites/beacon/interop.rs +++ b/simulators/portal/src/suites/beacon/interop.rs @@ -5,11 +5,8 @@ use ethportal_api::types::beacon::ContentInfo; use ethportal_api::utils::bytes::hex_encode; use ethportal_api::{ BeaconContentKey, BeaconContentValue, BeaconNetworkApiClient, ContentValue, Discv5ApiClient, - OverlayContentKey, }; use hivesim::types::ClientDefinition; -use hivesim::types::ContentKeyValue; -use hivesim::types::TestData; use hivesim::{dyn_async, Client, NClientTestSpec, Test}; use itertools::Itertools; use serde_json::json; @@ -20,21 +17,13 @@ use std::collections::HashMap; const MAX_PORTAL_CONTENT_PAYLOAD_SIZE: usize = 1165; const BOOTSTRAP_KEY: &str = "0x10bd9f42d9a42d972bdaf4dee84e5b419dd432b52867258acb7bcc7f567b6e3af1"; -fn content_pair_to_string_pair( - content_pair: (BeaconContentKey, BeaconContentValue), -) -> ContentKeyValue { - let (content_key, content_value) = content_pair; - ContentKeyValue { - key: content_key.to_hex(), - value: hex_encode(content_value.encode()), - } -} +type TestData = (BeaconContentKey, BeaconContentValue); /// Processed content data for beacon tests struct ProcessedContent { content_type: String, identifier: String, - test_data: Vec, + test_data: TestData, } fn process_content(content: Vec<(BeaconContentKey, BeaconContentValue)>) -> Vec { @@ -44,7 +33,7 @@ fn process_content(content: Vec<(BeaconContentKey, BeaconContentValue)>) -> Vec< BeaconContentKey::LightClientBootstrap(bootstrap) => ( "Bootstrap".to_string(), hex_encode(bootstrap.block_hash), - vec![content_pair_to_string_pair(beacon_content)], + beacon_content, ), BeaconContentKey::LightClientUpdatesByRange(updates_by_range) => ( "Updates by Range".to_string(), @@ -52,22 +41,22 @@ fn process_content(content: Vec<(BeaconContentKey, BeaconContentValue)>) -> Vec< "start period: {} count: {}", updates_by_range.start_period, updates_by_range.count ), - vec![content_pair_to_string_pair(beacon_content)], + beacon_content, ), BeaconContentKey::LightClientFinalityUpdate(finality_update) => ( "Finality Update".to_string(), format!("finalized slot: {}", finality_update.finalized_slot), - vec![content_pair_to_string_pair(beacon_content)], + beacon_content, ), BeaconContentKey::LightClientOptimisticUpdate(optimistic_update) => ( "Optimistic Update".to_string(), format!("optimistic slot: {}", optimistic_update.signature_slot), - vec![content_pair_to_string_pair(beacon_content)], + beacon_content, ), BeaconContentKey::HistoricalSummariesWithProof(historical_summaries) => ( "Historical Summaries".to_string(), format!("historical summaries epoch: {}", historical_summaries.epoch), - vec![content_pair_to_string_pair(beacon_content)], + beacon_content, ), }; result.push(ProcessedContent { @@ -107,7 +96,7 @@ dyn_async! { always_run: false, run: test_recursive_find_content, environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), BEACON_STRING.to_string())])), Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), BEACON_STRING.to_string())]))]), - test_data: Some(TestData::ContentList(test_data.clone())), + test_data: test_data.clone(), clients: vec![client_a.clone(), client_b.clone()], } ).await; @@ -119,7 +108,7 @@ dyn_async! { always_run: false, run: test_find_content, environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), BEACON_STRING.to_string())])), Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), BEACON_STRING.to_string())]))]), - test_data: Some(TestData::ContentList(test_data)), + test_data, clients: vec![client_a.clone(), client_b.clone()], } ).await; @@ -132,7 +121,7 @@ dyn_async! { always_run: false, run: test_ping, environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), BEACON_STRING.to_string())])), Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), BEACON_STRING.to_string())]))]), - test_data: None, + test_data: (), clients: vec![client_a.clone(), client_b.clone()], } ).await; @@ -144,7 +133,7 @@ dyn_async! { always_run: false, run: test_find_content_non_present, environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), BEACON_STRING.to_string())])), Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), BEACON_STRING.to_string())]))]), - test_data: None, + test_data: (), clients: vec![client_a.clone(), client_b.clone()], } ).await; @@ -156,7 +145,7 @@ dyn_async! { always_run: false, run: test_find_nodes_zero_distance, environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), BEACON_STRING.to_string())])), Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), BEACON_STRING.to_string())]))]), - test_data: None, + test_data: (), clients: vec![client_a.clone(), client_b.clone()], } ).await; @@ -166,7 +155,7 @@ dyn_async! { dyn_async! { // test that a node will not return content via FINDCONTENT. - async fn test_find_content_non_present<'a>(clients: Vec, _: Option) { + async fn test_find_content_non_present<'a>(clients: Vec, _: ()) { let (client_a, client_b) = match clients.iter().collect_tuple() { Some((client_a, client_b)) => (client_a, client_b), None => { @@ -208,7 +197,7 @@ dyn_async! { } dyn_async! { - async fn test_ping<'a>(clients: Vec, _: Option) { + async fn test_ping<'a>(clients: Vec, _: ()) { let (client_a, client_b) = match clients.iter().collect_tuple() { Some((client_a, client_b)) => (client_a, client_b), None => { @@ -249,7 +238,7 @@ dyn_async! { } dyn_async! { - async fn test_find_nodes_zero_distance<'a>(clients: Vec, _: Option) { + async fn test_find_nodes_zero_distance<'a>(clients: Vec, _: ()) { let (client_a, client_b) = match clients.iter().collect_tuple() { Some((client_a, client_b)) => (client_a, client_b), None => { @@ -285,23 +274,14 @@ dyn_async! { dyn_async! { // test that a node will return a content via RECURSIVEFINDCONTENT template that it has stored locally - async fn test_recursive_find_content<'a>(clients: Vec, test_data: Option) { + async fn test_recursive_find_content<'a>(clients: Vec, test_data: TestData) { let (client_a, client_b) = match clients.iter().collect_tuple() { Some((client_a, client_b)) => (client_a, client_b), None => { panic!("Unable to get expected amount of clients from NClientTestSpec"); } }; - let test_data = match test_data.map(|data| data.content_list()) { - Some(test_data) => test_data, - None => panic!("Expected test data non was provided"), - }; - - let ContentKeyValue { key: target_key, value: target_value } = test_data.first().expect("Target content is required for this test"); - let target_key: BeaconContentKey = - serde_json::from_value(json!(target_key)).unwrap(); - let target_value: BeaconContentValue = - serde_json::from_value(json!(target_value)).unwrap(); + let (target_key, target_value) = test_data; match client_b.rpc.store(target_key.clone(), target_value.clone()).await { Ok(result) => if !result { panic!("Error storing target content for recursive find content"); @@ -356,22 +336,14 @@ dyn_async! { dyn_async! { // test that a node will return a x content via FINDCONTENT that it has stored locally - async fn test_find_content<'a> (clients: Vec, test_data: Option) { + async fn test_find_content<'a> (clients: Vec, test_data: TestData) { let (client_a, client_b) = match clients.iter().collect_tuple() { Some((client_a, client_b)) => (client_a, client_b), None => { panic!("Unable to get expected amount of clients from NClientTestSpec"); } }; - let test_data = match test_data.map(|data| data.content_list()) { - Some(test_data) => test_data, - None => panic!("Expected test data none was provided"), - }; - let ContentKeyValue { key: target_key, value: target_value } = test_data.first().expect("Target content is required for this test"); - let target_key: BeaconContentKey = - serde_json::from_value(json!(target_key)).unwrap(); - let target_value: BeaconContentValue = - serde_json::from_value(json!(target_value)).unwrap(); + let (target_key, target_value) = test_data; match client_b.rpc.store(target_key.clone(), target_value.clone()).await { Ok(result) => if !result { panic!("Error storing target content for find content"); diff --git a/simulators/portal/src/suites/beacon/mesh.rs b/simulators/portal/src/suites/beacon/mesh.rs index 61f7849127..5e207708e8 100644 --- a/simulators/portal/src/suites/beacon/mesh.rs +++ b/simulators/portal/src/suites/beacon/mesh.rs @@ -9,7 +9,6 @@ use ethportal_api::{ BeaconContentKey, BeaconContentValue, BeaconNetworkApiClient, Discv5ApiClient, }; use hivesim::types::ClientDefinition; -use hivesim::types::TestData; use hivesim::{dyn_async, Client, NClientTestSpec, Test}; use itertools::Itertools; use serde_json::json; @@ -34,7 +33,7 @@ dyn_async! { always_run: false, run: test_find_content_two_jumps, environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), BEACON_STRING.to_string())])), Some(HashMap::from([(PRIVATE_KEY_ENVIRONMENT_VARIABLE.to_string(), private_key_2.clone()), (HIVE_PORTAL_NETWORKS_SELECTED.to_string(), BEACON_STRING.to_string())])), Some(HashMap::from([(PRIVATE_KEY_ENVIRONMENT_VARIABLE.to_string(), private_key_1.clone()), (HIVE_PORTAL_NETWORKS_SELECTED.to_string(), BEACON_STRING.to_string())]))]), - test_data: None, + test_data: (), clients: vec![client_a.clone(), client_b.clone(), client_c.clone()], } ).await; @@ -47,7 +46,7 @@ dyn_async! { always_run: false, run: test_find_content_two_jumps, environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), BEACON_STRING.to_string())])), Some(HashMap::from([(PRIVATE_KEY_ENVIRONMENT_VARIABLE.to_string(), private_key_1.clone()), (HIVE_PORTAL_NETWORKS_SELECTED.to_string(), BEACON_STRING.to_string())])), Some(HashMap::from([(PRIVATE_KEY_ENVIRONMENT_VARIABLE.to_string(), private_key_2.clone()), (HIVE_PORTAL_NETWORKS_SELECTED.to_string(), BEACON_STRING.to_string())]))]), - test_data: None, + test_data: (), clients: vec![client_a.clone(), client_b.clone(), client_c.clone()], } ).await; @@ -59,7 +58,7 @@ dyn_async! { always_run: false, run: test_find_nodes_distance_of_client_c, environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), BEACON_STRING.to_string())])), Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), BEACON_STRING.to_string())])), Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), BEACON_STRING.to_string())]))]), - test_data: None, + test_data: (), clients: vec![client_a.clone(), client_b.clone(), client_c.clone()], } ).await; @@ -68,7 +67,7 @@ dyn_async! { } dyn_async! { - async fn test_find_content_two_jumps<'a> (clients: Vec, _: Option) { + async fn test_find_content_two_jumps<'a> (clients: Vec, _: ()) { let (client_a, client_b, client_c) = match clients.iter().collect_tuple() { Some((client_a, client_b, client_c)) => (client_a, client_b, client_c), None => { @@ -163,7 +162,7 @@ dyn_async! { } dyn_async! { - async fn test_find_nodes_distance_of_client_c<'a>(clients: Vec, _: Option) { + async fn test_find_nodes_distance_of_client_c<'a>(clients: Vec, _: ()) { let (client_a, client_b, client_c) = match clients.iter().collect_tuple() { Some((client_a, client_b, client_c)) => (client_a, client_b, client_c), None => { diff --git a/simulators/portal/src/suites/beacon/rpc_compat.rs b/simulators/portal/src/suites/beacon/rpc_compat.rs index ded7e4186a..8dbe3b38fb 100644 --- a/simulators/portal/src/suites/beacon/rpc_compat.rs +++ b/simulators/portal/src/suites/beacon/rpc_compat.rs @@ -7,7 +7,6 @@ use ethportal_api::BeaconContentValue; use ethportal_api::Discv5ApiClient; use ethportal_api::{BeaconContentKey, BeaconNetworkApiClient}; use hivesim::types::ClientDefinition; -use hivesim::types::TestData; use hivesim::{dyn_async, Client, NClientTestSpec, Test}; use serde_json::json; use std::collections::HashMap; @@ -28,7 +27,7 @@ dyn_async! { always_run: false, run: test_node_info, environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), BEACON_STRING.to_string())]))]), - test_data: None, + test_data: (), clients: vec![client.clone()], } ).await; @@ -40,7 +39,7 @@ dyn_async! { always_run: false, run: test_local_content_expect_content_absent, environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), BEACON_STRING.to_string())]))]), - test_data: None, + test_data: (), clients: vec![client.clone()], } ).await; @@ -52,7 +51,7 @@ dyn_async! { always_run: false, run: test_store, environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), BEACON_STRING.to_string())]))]), - test_data: None, + test_data: (), clients: vec![client.clone()], } ).await; @@ -64,7 +63,7 @@ dyn_async! { always_run: false, run: test_local_content_expect_content_present, environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), BEACON_STRING.to_string())]))]), - test_data: None, + test_data: (), clients: vec![client.clone()], } ).await; @@ -76,7 +75,7 @@ dyn_async! { always_run: false, run: test_add_enr_expect_true, environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), BEACON_STRING.to_string())]))]), - test_data: None, + test_data: (), clients: vec![client.clone()], } ).await; @@ -88,7 +87,7 @@ dyn_async! { always_run: false, run: test_get_enr_non_present, environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), BEACON_STRING.to_string())]))]), - test_data: None, + test_data: (), clients: vec![client.clone()], } ).await; @@ -100,7 +99,7 @@ dyn_async! { always_run: false, run: test_get_enr_enr_present, environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), BEACON_STRING.to_string())]))]), - test_data: None, + test_data: (), clients: vec![client.clone()], } ).await; @@ -112,7 +111,7 @@ dyn_async! { always_run: false, run: test_get_enr_local_enr, environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), BEACON_STRING.to_string())]))]), - test_data: None, + test_data: (), clients: vec![client.clone()], } ).await; @@ -124,7 +123,7 @@ dyn_async! { always_run: false, run: test_delete_enr_non_present, environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), BEACON_STRING.to_string())]))]), - test_data: None, + test_data: (), clients: vec![client.clone()], } ).await; @@ -136,7 +135,7 @@ dyn_async! { always_run: false, run: test_delete_enr_enr_present, environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), BEACON_STRING.to_string())]))]), - test_data: None, + test_data: (), clients: vec![client.clone()], } ).await; @@ -148,7 +147,7 @@ dyn_async! { always_run: false, run: test_lookup_enr_non_present, environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), BEACON_STRING.to_string())]))]), - test_data: None, + test_data: (), clients: vec![client.clone()], } ).await; @@ -160,7 +159,7 @@ dyn_async! { always_run: false, run: test_lookup_enr_enr_present, environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), BEACON_STRING.to_string())]))]), - test_data: None, + test_data: (), clients: vec![client.clone()], } ).await; @@ -172,7 +171,7 @@ dyn_async! { always_run: false, run: test_lookup_enr_local_enr, environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), BEACON_STRING.to_string())]))]), - test_data: None, + test_data: (), clients: vec![client.clone()], } ).await; @@ -184,7 +183,7 @@ dyn_async! { always_run: false, run: test_recursive_find_content_content_absent, environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), BEACON_STRING.to_string())]))]), - test_data: None, + test_data: (), clients: vec![client.clone()], } ).await; @@ -193,7 +192,7 @@ dyn_async! { } dyn_async! { - async fn test_node_info<'a>(clients: Vec, _: Option) { + async fn test_node_info<'a>(clients: Vec, _: ()) { let client = match clients.into_iter().next() { Some((client)) => client, None => { @@ -208,7 +207,7 @@ dyn_async! { } dyn_async! { - async fn test_local_content_expect_content_absent<'a>(clients: Vec, _: Option) { + async fn test_local_content_expect_content_absent<'a>(clients: Vec, _: ()) { let client = match clients.into_iter().next() { Some((client)) => client, None => { @@ -224,7 +223,7 @@ dyn_async! { } dyn_async! { - async fn test_store<'a>(clients: Vec, _: Option) { + async fn test_store<'a>(clients: Vec, _: ()) { let client = match clients.into_iter().next() { Some((client)) => client, None => { @@ -241,7 +240,7 @@ dyn_async! { } dyn_async! { - async fn test_local_content_expect_content_present<'a>(clients: Vec, _: Option) { + async fn test_local_content_expect_content_present<'a>(clients: Vec, _: ()) { let client = match clients.into_iter().next() { Some((client)) => client, None => { @@ -271,7 +270,7 @@ dyn_async! { } dyn_async! { - async fn test_add_enr_expect_true<'a>(clients: Vec, _: Option) { + async fn test_add_enr_expect_true<'a>(clients: Vec, _: ()) { let client = match clients.into_iter().next() { Some((client)) => client, None => { @@ -290,7 +289,7 @@ dyn_async! { } dyn_async! { - async fn test_get_enr_non_present<'a>(clients: Vec, _: Option) { + async fn test_get_enr_non_present<'a>(clients: Vec, _: ()) { let client = match clients.into_iter().next() { Some((client)) => client, None => { @@ -306,7 +305,7 @@ dyn_async! { } dyn_async! { - async fn test_get_enr_local_enr<'a>(clients: Vec, _: Option) { + async fn test_get_enr_local_enr<'a>(clients: Vec, _: ()) { let client = match clients.into_iter().next() { Some((client)) => client, None => { @@ -334,7 +333,7 @@ dyn_async! { } dyn_async! { - async fn test_get_enr_enr_present<'a>(clients: Vec, _: Option) { + async fn test_get_enr_enr_present<'a>(clients: Vec, _: ()) { let client = match clients.into_iter().next() { Some((client)) => client, None => { @@ -365,7 +364,7 @@ dyn_async! { } dyn_async! { - async fn test_delete_enr_non_present<'a>(clients: Vec, _: Option) { + async fn test_delete_enr_non_present<'a>(clients: Vec, _: ()) { let client = match clients.into_iter().next() { Some((client)) => client, None => { @@ -384,7 +383,7 @@ dyn_async! { } dyn_async! { - async fn test_delete_enr_enr_present<'a>(clients: Vec, _: Option) { + async fn test_delete_enr_enr_present<'a>(clients: Vec, _: ()) { let client = match clients.into_iter().next() { Some((client)) => client, None => { @@ -429,7 +428,7 @@ dyn_async! { } dyn_async! { - async fn test_lookup_enr_non_present<'a>(clients: Vec, _: Option) { + async fn test_lookup_enr_non_present<'a>(clients: Vec, _: ()) { let client = match clients.into_iter().next() { Some((client)) => client, None => { @@ -445,7 +444,7 @@ dyn_async! { } dyn_async! { - async fn test_lookup_enr_enr_present<'a>(clients: Vec, _: Option) { + async fn test_lookup_enr_enr_present<'a>(clients: Vec, _: ()) { let client = match clients.into_iter().next() { Some((client)) => client, None => { @@ -476,7 +475,7 @@ dyn_async! { } dyn_async! { - async fn test_lookup_enr_local_enr<'a>(clients: Vec, _: Option) { + async fn test_lookup_enr_local_enr<'a>(clients: Vec, _: ()) { let client = match clients.into_iter().next() { Some((client)) => client, None => { @@ -505,7 +504,7 @@ dyn_async! { dyn_async! { // test that a node will return a AbsentContent via RecursiveFindContent when the data doesn't exist - async fn test_recursive_find_content_content_absent<'a>(clients: Vec, _: Option) { + async fn test_recursive_find_content_content_absent<'a>(clients: Vec, _: ()) { let client = match clients.into_iter().next() { Some((client)) => client, None => { diff --git a/simulators/portal/src/suites/history/interop.rs b/simulators/portal/src/suites/history/interop.rs index e78c710f7f..c545a3bd0c 100644 --- a/simulators/portal/src/suites/history/interop.rs +++ b/simulators/portal/src/suites/history/interop.rs @@ -1,13 +1,9 @@ use crate::suites::history::constants::{TEST_DATA_FILE_PATH, TRIN_BRIDGE_CLIENT_TYPE}; use ethportal_api::types::history::ContentInfo; -use ethportal_api::utils::bytes::hex_encode; use ethportal_api::{ ContentValue, Discv5ApiClient, HistoryContentKey, HistoryContentValue, HistoryNetworkApiClient, - OverlayContentKey, }; use hivesim::types::ClientDefinition; -use hivesim::types::ContentKeyValue; -use hivesim::types::TestData; use hivesim::{dyn_async, Client, NClientTestSpec, Test}; use itertools::Itertools; use portal_spec_test_utils_rs::get_flair; @@ -22,21 +18,13 @@ const MAX_PORTAL_CONTENT_PAYLOAD_SIZE: usize = 1165; const HEADER_WITH_PROOF_KEY: &str = "0x00720704f3aa11c53cf344ea069db95cecb81ad7453c8f276b2a1062979611f09c"; -fn content_pair_to_string_pair( - content_pair: (HistoryContentKey, HistoryContentValue), -) -> ContentKeyValue { - let (content_key, content_value) = content_pair; - ContentKeyValue { - key: content_key.to_hex(), - value: hex_encode(content_value.encode()), - } -} +type TestData = Vec<(HistoryContentKey, HistoryContentValue)>; /// Processed content data for history tests struct ProcessedContent { content_type: String, block_number: u64, - test_data: Vec, + test_data: TestData, } fn process_content( @@ -55,28 +43,22 @@ fn process_content( HistoryContentKey::BlockHeaderWithProof(_) => ( "Block Header".to_string(), header_with_proof.header.number, - vec![content_pair_to_string_pair(last_header.clone())], + vec![last_header.clone()], ), HistoryContentKey::BlockBody(_) => ( "Block Body".to_string(), header_with_proof.header.number, - vec![ - content_pair_to_string_pair(history_content), - content_pair_to_string_pair(last_header.clone()), - ], + vec![history_content, last_header.clone()], ), HistoryContentKey::BlockReceipts(_) => ( "Block Receipt".to_string(), header_with_proof.header.number, - vec![ - content_pair_to_string_pair(history_content), - content_pair_to_string_pair(last_header.clone()), - ], + vec![history_content, last_header.clone()], ), HistoryContentKey::EpochAccumulator(_) => ( "Epoch Accumulator".to_string(), u64::MAX, - vec![content_pair_to_string_pair(history_content)], + vec![history_content], ), } } else { @@ -127,7 +109,7 @@ dyn_async! { always_run: false, run: test_offer, environments: None, - test_data: Some(TestData::ContentList(test_data.clone())), + test_data: test_data.clone(), clients: vec![client_a.clone(), client_b.clone()], } ).await; @@ -139,7 +121,7 @@ dyn_async! { always_run: false, run: test_recursive_find_content, environments: None, - test_data: Some(TestData::ContentList(test_data.clone())), + test_data: test_data.clone(), clients: vec![client_a.clone(), client_b.clone()], } ).await; @@ -151,7 +133,7 @@ dyn_async! { always_run: false, run: test_find_content, environments: None, - test_data: Some(TestData::ContentList(test_data)), + test_data, clients: vec![client_a.clone(), client_b.clone()], } ).await; @@ -164,7 +146,7 @@ dyn_async! { always_run: false, run: test_ping, environments: None, - test_data: None, + test_data: (), clients: vec![client_a.clone(), client_b.clone()], } ).await; @@ -176,7 +158,7 @@ dyn_async! { always_run: false, run: test_find_content_non_present, environments: None, - test_data: None, + test_data: (), clients: vec![client_a.clone(), client_b.clone()], } ).await; @@ -188,7 +170,7 @@ dyn_async! { always_run: false, run: test_find_nodes_zero_distance, environments: None, - test_data: None, + test_data: (), clients: vec![client_a.clone(), client_b.clone()], } ).await; @@ -201,7 +183,7 @@ dyn_async! { always_run: false, run: test_gossip_two_nodes, environments: None, - test_data: Some(TestData::ContentList(content.clone().into_iter().map(content_pair_to_string_pair).collect())), + test_data: content.clone(), clients: vec![client_a.clone(), client_b.clone()], } ).await; @@ -211,7 +193,7 @@ dyn_async! { dyn_async! { // test that a node will not return content via FINDCONTENT. - async fn test_find_content_non_present<'a>(clients: Vec, _: Option) { + async fn test_find_content_non_present<'a>(clients: Vec, _: ()) { let (client_a, client_b) = match clients.iter().collect_tuple() { Some((client_a, client_b)) => (client_a, client_b), None => { @@ -253,22 +235,14 @@ dyn_async! { } dyn_async! { - async fn test_offer<'a>(clients: Vec, test_data: Option) { + async fn test_offer<'a>(clients: Vec, test_data: TestData) { let (client_a, client_b) = match clients.iter().collect_tuple() { Some((client_a, client_b)) => (client_a, client_b), None => { panic!("Unable to get expected amount of clients from NClientTestSpec"); } }; - let test_data = match test_data.map(|data| data.content_list()) { - Some(test_data) => test_data, - None => panic!("Expected test data non was provided"), - }; - if let Some(ContentKeyValue { key: optional_key, value: optional_value }) = test_data.get(1) { - let optional_key: HistoryContentKey = - serde_json::from_value(json!(optional_key)).unwrap(); - let optional_value: HistoryContentValue = - serde_json::from_value(json!(optional_value)).unwrap(); + if let Some((optional_key, optional_value)) = test_data.get(1).cloned() { match client_b.rpc.store(optional_key, optional_value).await { Ok(result) => if !result { panic!("Unable to store optional content for recursive find content"); @@ -278,11 +252,7 @@ dyn_async! { } } } - let ContentKeyValue { key: target_key, value: target_value } = test_data.first().expect("Target content is required for this test"); - let target_key: HistoryContentKey = - serde_json::from_value(json!(target_key)).unwrap(); - let target_value: HistoryContentValue = - serde_json::from_value(json!(target_value)).unwrap(); + let (target_key, target_value) = test_data.first().cloned().expect("Target content is required for this test"); let target_enr = match client_b.rpc.node_info().await { Ok(node_info) => node_info.enr, @@ -309,7 +279,7 @@ dyn_async! { } dyn_async! { - async fn test_ping<'a>(clients: Vec, _: Option) { + async fn test_ping<'a>(clients: Vec, _: ()) { let (client_a, client_b) = match clients.iter().collect_tuple() { Some((client_a, client_b)) => (client_a, client_b), None => { @@ -350,7 +320,7 @@ dyn_async! { } dyn_async! { - async fn test_find_nodes_zero_distance<'a>(clients: Vec, _: Option) { + async fn test_find_nodes_zero_distance<'a>(clients: Vec, _: ()) { let (client_a, client_b) = match clients.iter().collect_tuple() { Some((client_a, client_b)) => (client_a, client_b), None => { @@ -386,22 +356,14 @@ dyn_async! { dyn_async! { // test that a node will return a content via RECURSIVEFINDCONTENT template that it has stored locally - async fn test_recursive_find_content<'a>(clients: Vec, test_data: Option) { + async fn test_recursive_find_content<'a>(clients: Vec, test_data: TestData) { let (client_a, client_b) = match clients.iter().collect_tuple() { Some((client_a, client_b)) => (client_a, client_b), None => { panic!("Unable to get expected amount of clients from NClientTestSpec"); } }; - let test_data = match test_data.map(|data| data.content_list()) { - Some(test_data) => test_data, - None => panic!("Expected test data non was provided"), - }; - if let Some(ContentKeyValue { key: optional_key, value: optional_value }) = test_data.get(1) { - let optional_key: HistoryContentKey = - serde_json::from_value(json!(optional_key)).unwrap(); - let optional_value: HistoryContentValue = - serde_json::from_value(json!(optional_value)).unwrap(); + if let Some((optional_key, optional_value)) = test_data.get(1).cloned() { match client_b.rpc.store(optional_key, optional_value).await { Ok(result) => if !result { panic!("Unable to store optional content for recursive find content"); @@ -412,11 +374,7 @@ dyn_async! { } } - let ContentKeyValue { key: target_key, value: target_value } = test_data.first().expect("Target content is required for this test"); - let target_key: HistoryContentKey = - serde_json::from_value(json!(target_key)).unwrap(); - let target_value: HistoryContentValue = - serde_json::from_value(json!(target_value)).unwrap(); + let (target_key, target_value) = test_data.first().cloned().expect("Target content is required for this test"); match client_b.rpc.store(target_key.clone(), target_value.clone()).await { Ok(result) => if !result { panic!("Error storing target content for recursive find content"); @@ -471,22 +429,14 @@ dyn_async! { dyn_async! { // test that a node will return a x content via FINDCONTENT that it has stored locally - async fn test_find_content<'a> (clients: Vec, test_data: Option) { + async fn test_find_content<'a> (clients: Vec, test_data: TestData) { let (client_a, client_b) = match clients.iter().collect_tuple() { Some((client_a, client_b)) => (client_a, client_b), None => { panic!("Unable to get expected amount of clients from NClientTestSpec"); } }; - let test_data = match test_data.map(|data| data.content_list()) { - Some(test_data) => test_data, - None => panic!("Expected test data none was provided"), - }; - if let Some(ContentKeyValue { key: optional_key, value: optional_value }) = test_data.get(1) { - let optional_key: HistoryContentKey = - serde_json::from_value(json!(optional_key)).unwrap(); - let optional_value: HistoryContentValue = - serde_json::from_value(json!(optional_value)).unwrap(); + if let Some((optional_key, optional_value)) = test_data.get(1).cloned() { match client_b.rpc.store(optional_key, optional_value).await { Ok(result) => if !result { panic!("Unable to store optional content for find content"); @@ -497,11 +447,7 @@ dyn_async! { } } - let ContentKeyValue { key: target_key, value: target_value } = test_data.first().expect("Target content is required for this test"); - let target_key: HistoryContentKey = - serde_json::from_value(json!(target_key)).unwrap(); - let target_value: HistoryContentValue = - serde_json::from_value(json!(target_value)).unwrap(); + let (target_key, target_value) = test_data.first().cloned().expect("Target content is required for this test"); match client_b.rpc.store(target_key.clone(), target_value.clone()).await { Ok(result) => if !result { panic!("Error storing target content for find content"); @@ -547,17 +493,13 @@ dyn_async! { } dyn_async! { - async fn test_gossip_two_nodes<'a> (clients: Vec, test_data: Option) { + async fn test_gossip_two_nodes<'a> (clients: Vec, test_data: TestData) { let (client_a, client_b) = match clients.iter().collect_tuple() { Some((client_a, client_b)) => (client_a, client_b), None => { panic!("Unable to get expected amount of clients from NClientTestSpec"); } }; - let test_data = match test_data.map(|data| data.content_list()) { - Some(test_data) => test_data, - None => panic!("Expected test data non was provided"), - }; // connect clients let client_b_enr = match client_b.rpc.node_info().await { Ok(node_info) => node_info.enr, @@ -574,12 +516,7 @@ dyn_async! { } // With default node settings nodes should be storing all content - for ContentKeyValue { key: content_key, value: content_value } in test_data.clone() { - let content_key: HistoryContentKey = - serde_json::from_value(json!(content_key)).unwrap(); - let content_value: HistoryContentValue = - serde_json::from_value(json!(content_value)).unwrap(); - + for (content_key, content_value) in test_data.clone() { match client_a.rpc.gossip(content_key.clone(), content_value.clone()).await { Ok(nodes_gossiped_to) => { if nodes_gossiped_to != 1 { @@ -600,19 +537,10 @@ dyn_async! { tokio::time::sleep(Duration::from_secs(test_data.len() as u64)).await; // process raw test data to generate content details for error output - let ContentKeyValue { key: first_header_key, value: first_header_value } = test_data.first().unwrap(); - let first_header_key: HistoryContentKey = - serde_json::from_value(json!(first_header_key)).unwrap(); - let first_header_value: HistoryContentValue = - serde_json::from_value(json!(first_header_value)).unwrap(); + let (first_header_key, first_header_value) = test_data.first().cloned().unwrap(); let mut last_header_seen: (HistoryContentKey, HistoryContentValue) = (first_header_key, first_header_value); let mut result = vec![]; - for ContentKeyValue { key: content_key, value: content_value } in test_data.into_iter() { - let content_key: HistoryContentKey = - serde_json::from_value(json!(content_key)).unwrap(); - let content_value: HistoryContentValue = - serde_json::from_value(json!(content_value)).unwrap(); - + for (content_key, content_value) in test_data.into_iter() { if let HistoryContentKey::BlockHeaderWithProof(_) = &content_key { last_header_seen = (content_key.clone(), content_value.clone()); } diff --git a/simulators/portal/src/suites/history/mesh.rs b/simulators/portal/src/suites/history/mesh.rs index 107c209d06..03adb28123 100644 --- a/simulators/portal/src/suites/history/mesh.rs +++ b/simulators/portal/src/suites/history/mesh.rs @@ -6,7 +6,6 @@ use ethportal_api::{ Discv5ApiClient, HistoryContentKey, HistoryContentValue, HistoryNetworkApiClient, }; use hivesim::types::ClientDefinition; -use hivesim::types::TestData; use hivesim::{dyn_async, Client, NClientTestSpec, Test}; use itertools::Itertools; use serde_json::json; @@ -39,7 +38,7 @@ dyn_async! { always_run: false, run: test_find_content_two_jumps, environments: Some(vec![None, Some(HashMap::from([(PRIVATE_KEY_ENVIRONMENT_VARIABLE.to_string(), private_key_2.clone())])), Some(HashMap::from([(PRIVATE_KEY_ENVIRONMENT_VARIABLE.to_string(), private_key_1.clone())]))]), - test_data: None, + test_data: (), clients: vec![client_a.clone(), client_b.clone(), client_c.clone()], } ).await; @@ -52,7 +51,7 @@ dyn_async! { always_run: false, run: test_find_content_two_jumps, environments: Some(vec![None, Some(HashMap::from([(PRIVATE_KEY_ENVIRONMENT_VARIABLE.to_string(), private_key_1.clone())])), Some(HashMap::from([(PRIVATE_KEY_ENVIRONMENT_VARIABLE.to_string(), private_key_2.clone())]))]), - test_data: None, + test_data: (), clients: vec![client_a.clone(), client_b.clone(), client_c.clone()], } ).await; @@ -64,7 +63,7 @@ dyn_async! { always_run: false, run: test_find_nodes_distance_of_client_c, environments: None, - test_data: None, + test_data: (), clients: vec![client_a.clone(), client_b.clone(), client_c.clone()], } ).await; @@ -73,7 +72,7 @@ dyn_async! { } dyn_async! { - async fn test_find_content_two_jumps<'a> (clients: Vec, _: Option) { + async fn test_find_content_two_jumps<'a> (clients: Vec, _: ()) { let (client_a, client_b, client_c) = match clients.iter().collect_tuple() { Some((client_a, client_b, client_c)) => (client_a, client_b, client_c), None => { @@ -168,7 +167,7 @@ dyn_async! { } dyn_async! { - async fn test_find_nodes_distance_of_client_c<'a>(clients: Vec, _: Option) { + async fn test_find_nodes_distance_of_client_c<'a>(clients: Vec, _: ()) { let (client_a, client_b, client_c) = match clients.iter().collect_tuple() { Some((client_a, client_b, client_c)) => (client_a, client_b, client_c), None => { diff --git a/simulators/portal/src/suites/history/rpc_compat.rs b/simulators/portal/src/suites/history/rpc_compat.rs index ac910e9eb6..7d6961dd68 100644 --- a/simulators/portal/src/suites/history/rpc_compat.rs +++ b/simulators/portal/src/suites/history/rpc_compat.rs @@ -3,7 +3,6 @@ use ethportal_api::types::enr::generate_random_remote_enr; use ethportal_api::Discv5ApiClient; use ethportal_api::{HistoryContentKey, HistoryContentValue, HistoryNetworkApiClient}; use hivesim::types::ClientDefinition; -use hivesim::types::TestData; use hivesim::{dyn_async, Client, NClientTestSpec, Test}; use serde_json::json; @@ -27,7 +26,7 @@ dyn_async! { always_run: false, run: test_node_info, environments: None, - test_data: None, + test_data: (), clients: vec![client.clone()], } ).await; @@ -39,7 +38,7 @@ dyn_async! { always_run: false, run: test_local_content_expect_content_absent, environments: None, - test_data: None, + test_data: (), clients: vec![client.clone()], } ).await; @@ -51,7 +50,7 @@ dyn_async! { always_run: false, run: test_store, environments: None, - test_data: None, + test_data: (), clients: vec![client.clone()], } ).await; @@ -63,7 +62,7 @@ dyn_async! { always_run: false, run: test_local_content_expect_content_present, environments: None, - test_data: None, + test_data: (), clients: vec![client.clone()], } ).await; @@ -75,7 +74,7 @@ dyn_async! { always_run: false, run: test_add_enr_expect_true, environments: None, - test_data: None, + test_data: (), clients: vec![client.clone()], } ).await; @@ -87,7 +86,7 @@ dyn_async! { always_run: false, run: test_get_enr_non_present, environments: None, - test_data: None, + test_data: (), clients: vec![client.clone()], } ).await; @@ -99,7 +98,7 @@ dyn_async! { always_run: false, run: test_get_enr_enr_present, environments: None, - test_data: None, + test_data: (), clients: vec![client.clone()], } ).await; @@ -111,7 +110,7 @@ dyn_async! { always_run: false, run: test_get_enr_local_enr, environments: None, - test_data: None, + test_data: (), clients: vec![client.clone()], } ).await; @@ -123,7 +122,7 @@ dyn_async! { always_run: false, run: test_delete_enr_non_present, environments: None, - test_data: None, + test_data: (), clients: vec![client.clone()], } ).await; @@ -135,7 +134,7 @@ dyn_async! { always_run: false, run: test_delete_enr_enr_present, environments: None, - test_data: None, + test_data: (), clients: vec![client.clone()], } ).await; @@ -147,7 +146,7 @@ dyn_async! { always_run: false, run: test_lookup_enr_non_present, environments: None, - test_data: None, + test_data: (), clients: vec![client.clone()], } ).await; @@ -159,7 +158,7 @@ dyn_async! { always_run: false, run: test_lookup_enr_enr_present, environments: None, - test_data: None, + test_data: (), clients: vec![client.clone()], } ).await; @@ -171,7 +170,7 @@ dyn_async! { always_run: false, run: test_lookup_enr_local_enr, environments: None, - test_data: None, + test_data: (), clients: vec![client.clone()], } ).await; @@ -183,7 +182,7 @@ dyn_async! { always_run: false, run: test_recursive_find_content_content_absent, environments: None, - test_data: None, + test_data: (), clients: vec![client.clone()], } ).await; @@ -192,7 +191,7 @@ dyn_async! { } dyn_async! { - async fn test_node_info<'a>(clients: Vec, _: Option) { + async fn test_node_info<'a>(clients: Vec, _: ()) { let client = match clients.into_iter().next() { Some((client)) => client, None => { @@ -207,7 +206,7 @@ dyn_async! { } dyn_async! { - async fn test_local_content_expect_content_absent<'a>(clients: Vec, _: Option) { + async fn test_local_content_expect_content_absent<'a>(clients: Vec, _: ()) { let client = match clients.into_iter().next() { Some((client)) => client, None => { @@ -223,7 +222,7 @@ dyn_async! { } dyn_async! { - async fn test_store<'a>(clients: Vec, _: Option) { + async fn test_store<'a>(clients: Vec, _: ()) { let client = match clients.into_iter().next() { Some((client)) => client, None => { @@ -240,7 +239,7 @@ dyn_async! { } dyn_async! { - async fn test_local_content_expect_content_present<'a>(clients: Vec, _: Option) { + async fn test_local_content_expect_content_present<'a>(clients: Vec, _: ()) { let client = match clients.into_iter().next() { Some((client)) => client, None => { @@ -270,7 +269,7 @@ dyn_async! { } dyn_async! { - async fn test_add_enr_expect_true<'a>(clients: Vec, _: Option) { + async fn test_add_enr_expect_true<'a>(clients: Vec, _: ()) { let client = match clients.into_iter().next() { Some((client)) => client, None => { @@ -289,7 +288,7 @@ dyn_async! { } dyn_async! { - async fn test_get_enr_non_present<'a>(clients: Vec, _: Option) { + async fn test_get_enr_non_present<'a>(clients: Vec, _: ()) { let client = match clients.into_iter().next() { Some((client)) => client, None => { @@ -305,7 +304,7 @@ dyn_async! { } dyn_async! { - async fn test_get_enr_local_enr<'a>(clients: Vec, _: Option) { + async fn test_get_enr_local_enr<'a>(clients: Vec, _: ()) { let client = match clients.into_iter().next() { Some((client)) => client, None => { @@ -333,7 +332,7 @@ dyn_async! { } dyn_async! { - async fn test_get_enr_enr_present<'a>(clients: Vec, _: Option) { + async fn test_get_enr_enr_present<'a>(clients: Vec, _: ()) { let client = match clients.into_iter().next() { Some((client)) => client, None => { @@ -364,7 +363,7 @@ dyn_async! { } dyn_async! { - async fn test_delete_enr_non_present<'a>(clients: Vec, _: Option) { + async fn test_delete_enr_non_present<'a>(clients: Vec, _: ()) { let client = match clients.into_iter().next() { Some((client)) => client, None => { @@ -383,7 +382,7 @@ dyn_async! { } dyn_async! { - async fn test_delete_enr_enr_present<'a>(clients: Vec, _: Option) { + async fn test_delete_enr_enr_present<'a>(clients: Vec, _: ()) { let client = match clients.into_iter().next() { Some((client)) => client, None => { @@ -428,7 +427,7 @@ dyn_async! { } dyn_async! { - async fn test_lookup_enr_non_present<'a>(clients: Vec, _: Option) { + async fn test_lookup_enr_non_present<'a>(clients: Vec, _: ()) { let client = match clients.into_iter().next() { Some((client)) => client, None => { @@ -444,7 +443,7 @@ dyn_async! { } dyn_async! { - async fn test_lookup_enr_enr_present<'a>(clients: Vec, _: Option) { + async fn test_lookup_enr_enr_present<'a>(clients: Vec, _: ()) { let client = match clients.into_iter().next() { Some((client)) => client, None => { @@ -475,7 +474,7 @@ dyn_async! { } dyn_async! { - async fn test_lookup_enr_local_enr<'a>(clients: Vec, _: Option) { + async fn test_lookup_enr_local_enr<'a>(clients: Vec, _: ()) { let client = match clients.into_iter().next() { Some((client)) => client, None => { @@ -504,7 +503,7 @@ dyn_async! { dyn_async! { // test that a node will return a AbsentContent via RecursiveFindContent when the data doesn't exist - async fn test_recursive_find_content_content_absent<'a>(clients: Vec, _: Option) { + async fn test_recursive_find_content_content_absent<'a>(clients: Vec, _: ()) { let client = match clients.into_iter().next() { Some((client)) => client, None => { diff --git a/simulators/portal/src/suites/history/trin_bridge.rs b/simulators/portal/src/suites/history/trin_bridge.rs index fcd1ee4702..b5cbcbfdbd 100644 --- a/simulators/portal/src/suites/history/trin_bridge.rs +++ b/simulators/portal/src/suites/history/trin_bridge.rs @@ -6,7 +6,6 @@ use ethportal_api::HistoryContentKey; use ethportal_api::HistoryContentValue; use ethportal_api::{Discv5ApiClient, HistoryNetworkApiClient}; use hivesim::types::ClientDefinition; -use hivesim::types::TestData; use hivesim::{dyn_async, Client, NClientTestSpec, Test}; use portal_spec_test_utils_rs::get_flair; use serde_yaml::Value; @@ -61,7 +60,7 @@ dyn_async! { always_run: false, run: test_bridge, environments: None, - test_data: None, + test_data: (), clients: vec![client.clone()], } ).await; @@ -70,7 +69,7 @@ dyn_async! { } dyn_async! { - async fn test_bridge<'a>(clients: Vec, _: Option) { + async fn test_bridge<'a>(clients: Vec, _: ()) { let client = match clients.into_iter().next() { Some((client)) => client, None => { diff --git a/simulators/portal/src/suites/state/interop.rs b/simulators/portal/src/suites/state/interop.rs index ab254b4002..8990a65aaa 100644 --- a/simulators/portal/src/suites/state/interop.rs +++ b/simulators/portal/src/suites/state/interop.rs @@ -5,12 +5,9 @@ use crate::suites::state::constants::{ use ethportal_api::types::state::ContentInfo; use ethportal_api::utils::bytes::hex_encode; use ethportal_api::{ - ContentValue, Discv5ApiClient, OverlayContentKey, StateContentKey, StateContentValue, - StateNetworkApiClient, + ContentValue, Discv5ApiClient, StateContentKey, StateContentValue, StateNetworkApiClient, }; use hivesim::types::ClientDefinition; -use hivesim::types::ContentKeyOfferLookupValues; -use hivesim::types::TestData; use hivesim::{dyn_async, Client, NClientTestSpec, Test}; use itertools::Itertools; use serde_json::json; @@ -21,30 +18,24 @@ use tokio::time::Duration; // This is taken from Trin. It should be fairly standard const MAX_PORTAL_CONTENT_PAYLOAD_SIZE: usize = 1165; -fn content_pair_to_string_pair( - content_pair: (StateContentKey, StateContentValue, StateContentValue), -) -> ContentKeyOfferLookupValues { - let (content_key, content_offer_value, content_lookup_value) = content_pair; - ContentKeyOfferLookupValues { - key: content_key.to_hex(), - offer_value: hex_encode(content_offer_value.encode()), - lookup_value: hex_encode(content_lookup_value.encode()), - } +#[derive(Clone, Debug)] +struct TestData { + pub key: StateContentKey, + pub offer_value: StateContentValue, + pub lookup_value: StateContentValue, } /// Processed content data for state tests struct ProcessedContent { content_type: String, identifier: String, - test_data: Vec, + test_data: TestData, } -fn process_content( - content: Vec<(StateContentKey, StateContentValue, StateContentValue)>, -) -> Vec { +fn process_content(content: Vec) -> Vec { let mut result: Vec = vec![]; - for state_content in content.into_iter() { - let (content_type, identifier, test_data) = match &state_content.0 { + for test_data in content { + let (content_type, identifier) = match &test_data.key { StateContentKey::AccountTrieNode(account_trie_node) => ( "Account Trie Node".to_string(), format!( @@ -52,7 +43,6 @@ fn process_content( hex_encode(account_trie_node.path.nibbles()), hex_encode(account_trie_node.node_hash.as_slice()) ), - vec![content_pair_to_string_pair(state_content)], ), StateContentKey::ContractStorageTrieNode(contract_storage_trie_node) => ( "Contract Storage Trie Node".to_string(), @@ -62,7 +52,6 @@ fn process_content( hex_encode(contract_storage_trie_node.path.nibbles()), hex_encode(contract_storage_trie_node.node_hash.as_slice()) ), - vec![content_pair_to_string_pair(state_content)], ), StateContentKey::ContractBytecode(contract_bytecode) => ( "Contract Bytecode".to_string(), @@ -71,7 +60,6 @@ fn process_content( hex_encode(contract_bytecode.address_hash.as_slice()), hex_encode(contract_bytecode.code_hash.as_slice()) ), - vec![content_pair_to_string_pair(state_content)], ), }; result.push(ProcessedContent { @@ -93,14 +81,14 @@ dyn_async! { let values = std::fs::read_to_string(TEST_DATA_FILE_PATH) .expect("cannot find test asset"); let values: Value = serde_yaml::from_str(&values).unwrap(); - let content: Vec<(StateContentKey, StateContentValue, StateContentValue)> = values.as_sequence().unwrap().iter().map(|value| { - let content_key: StateContentKey = - serde_yaml::from_value(value.get("content_key").unwrap().clone()).unwrap(); - let content_offer_value: StateContentValue = - serde_yaml::from_value(value.get("content_value_offer").unwrap().clone()).unwrap(); - let content_lookup_value: StateContentValue = - serde_yaml::from_value(value.get("content_value_retrieval").unwrap().clone()).unwrap(); - (content_key, content_offer_value, content_lookup_value) + let content: Vec = values.as_sequence().unwrap().iter().map(|value| { + let key: StateContentKey = + serde_yaml::from_value(value["content_key"].clone()).unwrap(); + let offer_value: StateContentValue = + serde_yaml::from_value(value["content_value_offer"].clone()).unwrap(); + let lookup_value: StateContentValue = + serde_yaml::from_value(value["content_value_retrieval"].clone()).unwrap(); + TestData { key, offer_value, lookup_value } }).collect(); // Iterate over all possible pairings of clients and run the tests (including self-pairings) @@ -113,7 +101,7 @@ dyn_async! { always_run: false, run: test_offer, environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), STATE_STRING.to_string())])), Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), STATE_STRING.to_string())]))]), - test_data: Some(TestData::StateContentList(test_data.clone())), + test_data: test_data.clone(), clients: vec![client_a.clone(), client_b.clone()], } ).await; @@ -125,7 +113,7 @@ dyn_async! { always_run: false, run: test_recursive_find_content, environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), STATE_STRING.to_string())])), Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), STATE_STRING.to_string())]))]), - test_data: Some(TestData::StateContentList(test_data.clone())), + test_data: test_data.clone(), clients: vec![client_a.clone(), client_b.clone()], } ).await; @@ -137,7 +125,7 @@ dyn_async! { always_run: false, run: test_find_content, environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), STATE_STRING.to_string())])), Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), STATE_STRING.to_string())]))]), - test_data: Some(TestData::StateContentList(test_data)), + test_data, clients: vec![client_a.clone(), client_b.clone()], } ).await; @@ -150,7 +138,7 @@ dyn_async! { always_run: false, run: test_ping, environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), STATE_STRING.to_string())])), Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), STATE_STRING.to_string())]))]), - test_data: None, + test_data: (), clients: vec![client_a.clone(), client_b.clone()], } ).await; @@ -162,7 +150,7 @@ dyn_async! { always_run: false, run: test_find_content_non_present, environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), STATE_STRING.to_string())])), Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), STATE_STRING.to_string())]))]), - test_data: None, + test_data: (), clients: vec![client_a.clone(), client_b.clone()], } ).await; @@ -174,7 +162,7 @@ dyn_async! { always_run: false, run: test_find_nodes_zero_distance, environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), STATE_STRING.to_string())])), Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), STATE_STRING.to_string())]))]), - test_data: None, + test_data: (), clients: vec![client_a.clone(), client_b.clone()], } ).await; @@ -187,7 +175,7 @@ dyn_async! { always_run: false, run: test_gossip_two_nodes, environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), STATE_STRING.to_string())])), Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), STATE_STRING.to_string())]))]), - test_data: Some(TestData::StateContentList(content.clone().into_iter().map(content_pair_to_string_pair).collect())), + test_data: content.clone(), clients: vec![client_a.clone(), client_b.clone()], } ).await; @@ -197,7 +185,7 @@ dyn_async! { dyn_async! { // test that a node will not return content via FINDCONTENT. - async fn test_find_content_non_present<'a>(clients: Vec, _: Option) { + async fn test_find_content_non_present<'a>(clients: Vec, _: ()) { let (client_a, client_b) = match clients.iter().collect_tuple() { Some((client_a, client_b)) => (client_a, client_b), None => { @@ -239,24 +227,15 @@ dyn_async! { } dyn_async! { - async fn test_offer<'a>(clients: Vec, test_data: Option) { + async fn test_offer<'a>(clients: Vec, test_data: TestData) { let (client_a, client_b) = match clients.iter().collect_tuple() { Some((client_a, client_b)) => (client_a, client_b), None => { panic!("Unable to get expected amount of clients from NClientTestSpec"); } }; - let test_data = match test_data.map(|data| data.state_content_list()) { - Some(test_data) => test_data, - None => panic!("Expected test data non was provided"), - }; - let ContentKeyOfferLookupValues { key: target_key, offer_value: target_offer_value, lookup_value: target_lookup_value } = test_data.first().expect("Target content is required for this test"); - let target_key: StateContentKey = - serde_json::from_value(json!(target_key)).unwrap(); - let target_offer_value: StateContentValue = - serde_json::from_value(json!(target_offer_value)).unwrap(); - let target_lookup_value: StateContentValue = - serde_json::from_value(json!(target_lookup_value)).unwrap(); + + let TestData { key: target_key, offer_value: target_offer_value, lookup_value: target_lookup_value } = test_data; let target_enr = match client_b.rpc.node_info().await { Ok(node_info) => node_info.enr, @@ -283,7 +262,7 @@ dyn_async! { } dyn_async! { - async fn test_ping<'a>(clients: Vec, _: Option) { + async fn test_ping<'a>(clients: Vec, _: ()) { let (client_a, client_b) = match clients.iter().collect_tuple() { Some((client_a, client_b)) => (client_a, client_b), None => { @@ -324,7 +303,7 @@ dyn_async! { } dyn_async! { - async fn test_find_nodes_zero_distance<'a>(clients: Vec, _: Option) { + async fn test_find_nodes_zero_distance<'a>(clients: Vec, _: ()) { let (client_a, client_b) = match clients.iter().collect_tuple() { Some((client_a, client_b)) => (client_a, client_b), None => { @@ -360,25 +339,16 @@ dyn_async! { dyn_async! { // test that a node will return a content via RECURSIVEFINDCONTENT template that it has stored locally - async fn test_recursive_find_content<'a>(clients: Vec, test_data: Option) { + async fn test_recursive_find_content<'a>(clients: Vec, test_data: TestData) { let (client_a, client_b) = match clients.iter().collect_tuple() { Some((client_a, client_b)) => (client_a, client_b), None => { panic!("Unable to get expected amount of clients from NClientTestSpec"); } }; - let test_data = match test_data.map(|data| data.state_content_list()) { - Some(test_data) => test_data, - None => panic!("Expected test data non was provided"), - }; - let ContentKeyOfferLookupValues { key: target_key, offer_value: target_offer_value, lookup_value: target_lookup_value } = test_data.first().expect("Target content is required for this test"); - let target_key: StateContentKey = - serde_json::from_value(json!(target_key)).unwrap(); - let target_offer_value: StateContentValue = - serde_json::from_value(json!(target_offer_value)).unwrap(); - let target_lookup_value: StateContentValue = - serde_json::from_value(json!(target_lookup_value)).unwrap(); + let TestData { key: target_key, offer_value: target_offer_value, lookup_value: target_lookup_value } = test_data; + match client_b.rpc.store(target_key.clone(), target_offer_value.clone()).await { Ok(result) => if !result { panic!("Error storing target content for recursive find content"); @@ -433,25 +403,16 @@ dyn_async! { dyn_async! { // test that a node will return a x content via FINDCONTENT that it has stored locally - async fn test_find_content<'a> (clients: Vec, test_data: Option) { + async fn test_find_content<'a> (clients: Vec, test_data: TestData) { let (client_a, client_b) = match clients.iter().collect_tuple() { Some((client_a, client_b)) => (client_a, client_b), None => { panic!("Unable to get expected amount of clients from NClientTestSpec"); } }; - let test_data = match test_data.map(|data| data.state_content_list()) { - Some(test_data) => test_data, - None => panic!("Expected test data none was provided"), - }; - let ContentKeyOfferLookupValues { key: target_key, offer_value: target_offer_value, lookup_value: target_lookup_value } = test_data.first().expect("Target content is required for this test"); - let target_key: StateContentKey = - serde_json::from_value(json!(target_key)).unwrap(); - let target_offer_value: StateContentValue = - serde_json::from_value(json!(target_offer_value)).unwrap(); - let target_lookup_value: StateContentValue = - serde_json::from_value(json!(target_lookup_value)).unwrap(); + let TestData { key: target_key, offer_value: target_offer_value, lookup_value: target_lookup_value } = test_data; + match client_b.rpc.store(target_key.clone(), target_offer_value.clone()).await { Ok(result) => if !result { panic!("Error storing target content for find content"); @@ -497,17 +458,13 @@ dyn_async! { } dyn_async! { - async fn test_gossip_two_nodes<'a> (clients: Vec, test_data: Option) { + async fn test_gossip_two_nodes<'a> (clients: Vec, test_data: Vec) { let (client_a, client_b) = match clients.iter().collect_tuple() { Some((client_a, client_b)) => (client_a, client_b), None => { panic!("Unable to get expected amount of clients from NClientTestSpec"); } }; - let test_data = match test_data.map(|data| data.state_content_list()) { - Some(test_data) => test_data, - None => panic!("Expected test data non was provided"), - }; // connect clients let client_b_enr = match client_b.rpc.node_info().await { Ok(node_info) => node_info.enr, @@ -524,12 +481,7 @@ dyn_async! { } // With default node settings nodes should be storing all content - for ContentKeyOfferLookupValues { key: content_key, offer_value: content_offer_value, lookup_value: _ } in test_data.clone().into_iter() { - let content_key: StateContentKey = - serde_json::from_value(json!(content_key)).unwrap(); - let content_offer_value: StateContentValue = - serde_json::from_value(json!(content_offer_value)).unwrap(); - + for TestData { key: content_key, offer_value: content_offer_value, lookup_value: _ } in test_data.clone() { match client_a.rpc.gossip(content_key.clone(), content_offer_value.clone()).await { Ok(nodes_gossiped_to) => { if nodes_gossiped_to != 1 { @@ -549,12 +501,7 @@ dyn_async! { // process raw test data to generate content details for error output let mut result = vec![]; - for ContentKeyOfferLookupValues { key: content_key, offer_value: _, lookup_value: content_lookup_value } in test_data.into_iter() { - let content_key: StateContentKey = - serde_json::from_value(json!(content_key)).unwrap(); - let content_lookup_value: StateContentValue = - serde_json::from_value(json!(content_lookup_value)).unwrap(); - + for TestData { key: content_key, offer_value: _, lookup_value: content_lookup_value } in test_data { let content_details = { let content_type = match &content_key { StateContentKey::AccountTrieNode(_) => "account trie node".to_string(), diff --git a/simulators/portal/src/suites/state/rpc_compat.rs b/simulators/portal/src/suites/state/rpc_compat.rs index 398456378b..a088e2fad1 100644 --- a/simulators/portal/src/suites/state/rpc_compat.rs +++ b/simulators/portal/src/suites/state/rpc_compat.rs @@ -6,7 +6,6 @@ use ethportal_api::types::enr::generate_random_remote_enr; use ethportal_api::Discv5ApiClient; use ethportal_api::{StateContentKey, StateContentValue, StateNetworkApiClient}; use hivesim::types::ClientDefinition; -use hivesim::types::TestData; use hivesim::{dyn_async, Client, NClientTestSpec, Test}; use serde_json::json; use std::collections::HashMap; @@ -27,7 +26,7 @@ dyn_async! { always_run: false, run: test_node_info, environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), STATE_STRING.to_string())]))]), - test_data: None, + test_data: (), clients: vec![client.clone()], } ).await; @@ -39,7 +38,7 @@ dyn_async! { always_run: false, run: test_local_content_expect_content_absent, environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), STATE_STRING.to_string())]))]), - test_data: None, + test_data: (), clients: vec![client.clone()], } ).await; @@ -51,7 +50,7 @@ dyn_async! { always_run: false, run: test_store, environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), STATE_STRING.to_string())]))]), - test_data: None, + test_data: (), clients: vec![client.clone()], } ).await; @@ -63,7 +62,7 @@ dyn_async! { always_run: false, run: test_local_content_expect_content_present, environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), STATE_STRING.to_string())]))]), - test_data: None, + test_data: (), clients: vec![client.clone()], } ).await; @@ -75,7 +74,7 @@ dyn_async! { always_run: false, run: test_add_enr_expect_true, environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), STATE_STRING.to_string())]))]), - test_data: None, + test_data: (), clients: vec![client.clone()], } ).await; @@ -87,7 +86,7 @@ dyn_async! { always_run: false, run: test_get_enr_non_present, environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), STATE_STRING.to_string())]))]), - test_data: None, + test_data: (), clients: vec![client.clone()], } ).await; @@ -99,7 +98,7 @@ dyn_async! { always_run: false, run: test_get_enr_enr_present, environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), STATE_STRING.to_string())]))]), - test_data: None, + test_data: (), clients: vec![client.clone()], } ).await; @@ -111,7 +110,7 @@ dyn_async! { always_run: false, run: test_get_enr_local_enr, environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), STATE_STRING.to_string())]))]), - test_data: None, + test_data: (), clients: vec![client.clone()], } ).await; @@ -123,7 +122,7 @@ dyn_async! { always_run: false, run: test_delete_enr_non_present, environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), STATE_STRING.to_string())]))]), - test_data: None, + test_data: (), clients: vec![client.clone()], } ).await; @@ -135,7 +134,7 @@ dyn_async! { always_run: false, run: test_delete_enr_enr_present, environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), STATE_STRING.to_string())]))]), - test_data: None, + test_data: (), clients: vec![client.clone()], } ).await; @@ -147,7 +146,7 @@ dyn_async! { always_run: false, run: test_lookup_enr_non_present, environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), STATE_STRING.to_string())]))]), - test_data: None, + test_data: (), clients: vec![client.clone()], } ).await; @@ -159,7 +158,7 @@ dyn_async! { always_run: false, run: test_lookup_enr_enr_present, environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), STATE_STRING.to_string())]))]), - test_data: None, + test_data: (), clients: vec![client.clone()], } ).await; @@ -171,7 +170,7 @@ dyn_async! { always_run: false, run: test_lookup_enr_local_enr, environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), STATE_STRING.to_string())]))]), - test_data: None, + test_data: (), clients: vec![client.clone()], } ).await; @@ -183,7 +182,7 @@ dyn_async! { always_run: false, run: test_recursive_find_content_content_absent, environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), STATE_STRING.to_string())]))]), - test_data: None, + test_data: (), clients: vec![client.clone()], } ).await; @@ -192,7 +191,7 @@ dyn_async! { } dyn_async! { - async fn test_node_info<'a>(clients: Vec, _: Option) { + async fn test_node_info<'a>(clients: Vec, _: ()) { let client = match clients.into_iter().next() { Some((client)) => client, None => { @@ -207,7 +206,7 @@ dyn_async! { } dyn_async! { - async fn test_local_content_expect_content_absent<'a>(clients: Vec, _: Option) { + async fn test_local_content_expect_content_absent<'a>(clients: Vec, _: ()) { let client = match clients.into_iter().next() { Some((client)) => client, None => { @@ -223,7 +222,7 @@ dyn_async! { } dyn_async! { - async fn test_store<'a>(clients: Vec, _: Option) { + async fn test_store<'a>(clients: Vec, _: ()) { let client = match clients.into_iter().next() { Some((client)) => client, None => { @@ -240,7 +239,7 @@ dyn_async! { } dyn_async! { - async fn test_local_content_expect_content_present<'a>(clients: Vec, _: Option) { + async fn test_local_content_expect_content_present<'a>(clients: Vec, _: ()) { let client = match clients.into_iter().next() { Some((client)) => client, None => { @@ -270,7 +269,7 @@ dyn_async! { } dyn_async! { - async fn test_add_enr_expect_true<'a>(clients: Vec, _: Option) { + async fn test_add_enr_expect_true<'a>(clients: Vec, _: ()) { let client = match clients.into_iter().next() { Some((client)) => client, None => { @@ -289,7 +288,7 @@ dyn_async! { } dyn_async! { - async fn test_get_enr_non_present<'a>(clients: Vec, _: Option) { + async fn test_get_enr_non_present<'a>(clients: Vec, _: ()) { let client = match clients.into_iter().next() { Some((client)) => client, None => { @@ -305,7 +304,7 @@ dyn_async! { } dyn_async! { - async fn test_get_enr_local_enr<'a>(clients: Vec, _: Option) { + async fn test_get_enr_local_enr<'a>(clients: Vec, _: ()) { let client = match clients.into_iter().next() { Some((client)) => client, None => { @@ -333,7 +332,7 @@ dyn_async! { } dyn_async! { - async fn test_get_enr_enr_present<'a>(clients: Vec, _: Option) { + async fn test_get_enr_enr_present<'a>(clients: Vec, _: ()) { let client = match clients.into_iter().next() { Some((client)) => client, None => { @@ -364,7 +363,7 @@ dyn_async! { } dyn_async! { - async fn test_delete_enr_non_present<'a>(clients: Vec, _: Option) { + async fn test_delete_enr_non_present<'a>(clients: Vec, _: ()) { let client = match clients.into_iter().next() { Some((client)) => client, None => { @@ -383,7 +382,7 @@ dyn_async! { } dyn_async! { - async fn test_delete_enr_enr_present<'a>(clients: Vec, _: Option) { + async fn test_delete_enr_enr_present<'a>(clients: Vec, _: ()) { let client = match clients.into_iter().next() { Some((client)) => client, None => { @@ -428,7 +427,7 @@ dyn_async! { } dyn_async! { - async fn test_lookup_enr_non_present<'a>(clients: Vec, _: Option) { + async fn test_lookup_enr_non_present<'a>(clients: Vec, _: ()) { let client = match clients.into_iter().next() { Some((client)) => client, None => { @@ -444,7 +443,7 @@ dyn_async! { } dyn_async! { - async fn test_lookup_enr_enr_present<'a>(clients: Vec, _: Option) { + async fn test_lookup_enr_enr_present<'a>(clients: Vec, _: ()) { let client = match clients.into_iter().next() { Some((client)) => client, None => { @@ -475,7 +474,7 @@ dyn_async! { } dyn_async! { - async fn test_lookup_enr_local_enr<'a>(clients: Vec, _: Option) { + async fn test_lookup_enr_local_enr<'a>(clients: Vec, _: ()) { let client = match clients.into_iter().next() { Some((client)) => client, None => { @@ -504,7 +503,7 @@ dyn_async! { dyn_async! { // test that a node will return a AbsentContent via RecursiveFindContent when the data doesn't exist - async fn test_recursive_find_content_content_absent<'a>(clients: Vec, _: Option) { + async fn test_recursive_find_content_content_absent<'a>(clients: Vec, _: ()) { let client = match clients.into_iter().next() { Some((client)) => client, None => { From cf4f55c5d80cc2d60eb753b9c6c993d3047f261c Mon Sep 17 00:00:00 2001 From: Milos Stankovic <82043364+morph-dev@users.noreply.github.com> Date: Tue, 20 Aug 2024 00:16:57 +0300 Subject: [PATCH 326/387] simulators/portal: store block header before gossip and offer state requests (#1152) --- .../portal/src/suites/beacon/constants.rs | 2 - .../portal/src/suites/beacon/interop.rs | 21 ++--- simulators/portal/src/suites/beacon/mesh.rs | 25 ++++-- .../portal/src/suites/beacon/rpc_compat.rs | 38 +++++---- simulators/portal/src/suites/environment.rs | 34 ++++++++ simulators/portal/src/suites/mod.rs | 1 + .../portal/src/suites/state/constants.rs | 2 - simulators/portal/src/suites/state/interop.rs | 79 ++++++++++++++----- .../portal/src/suites/state/rpc_compat.rs | 38 +++++---- 9 files changed, 170 insertions(+), 70 deletions(-) create mode 100644 simulators/portal/src/suites/environment.rs diff --git a/simulators/portal/src/suites/beacon/constants.rs b/simulators/portal/src/suites/beacon/constants.rs index dee12e9838..45bb5b34e4 100644 --- a/simulators/portal/src/suites/beacon/constants.rs +++ b/simulators/portal/src/suites/beacon/constants.rs @@ -1,6 +1,4 @@ pub const TEST_DATA_FILE_PATH: &str = "./test-data/beacon_test_data.yaml"; -pub const HIVE_PORTAL_NETWORKS_SELECTED: &str = "HIVE_PORTAL_NETWORKS_SELECTED"; -pub const BEACON_STRING: &str = "beacon"; // private key hive environment variable pub const PRIVATE_KEY_ENVIRONMENT_VARIABLE: &str = "HIVE_CLIENT_PRIVATE_KEY"; diff --git a/simulators/portal/src/suites/beacon/interop.rs b/simulators/portal/src/suites/beacon/interop.rs index d48328b4a1..248703ed4a 100644 --- a/simulators/portal/src/suites/beacon/interop.rs +++ b/simulators/portal/src/suites/beacon/interop.rs @@ -1,6 +1,7 @@ -use crate::suites::beacon::constants::{ - BEACON_STRING, HIVE_PORTAL_NETWORKS_SELECTED, TEST_DATA_FILE_PATH, TRIN_BRIDGE_CLIENT_TYPE, -}; +use std::collections::HashMap; + +use crate::suites::beacon::constants::{TEST_DATA_FILE_PATH, TRIN_BRIDGE_CLIENT_TYPE}; +use crate::suites::environment::PortalNetwork; use ethportal_api::types::beacon::ContentInfo; use ethportal_api::utils::bytes::hex_encode; use ethportal_api::{ @@ -11,7 +12,6 @@ use hivesim::{dyn_async, Client, NClientTestSpec, Test}; use itertools::Itertools; use serde_json::json; use serde_yaml::Value; -use std::collections::HashMap; // This is taken from Trin. It should be fairly standard const MAX_PORTAL_CONTENT_PAYLOAD_SIZE: usize = 1165; @@ -75,6 +75,9 @@ dyn_async! { // todo: remove this once we implement role in hivesim-rs let clients: Vec = clients.into_iter().filter(|client| client.name != *TRIN_BRIDGE_CLIENT_TYPE).collect(); + let environment = Some(HashMap::from([PortalNetwork::as_environment_flag([PortalNetwork::Beacon])])); + let environments = Some(vec![environment.clone(), environment]); + let values = std::fs::read_to_string(TEST_DATA_FILE_PATH) .expect("cannot find test asset"); let values: Value = serde_yaml::from_str(&values).unwrap(); @@ -95,7 +98,7 @@ dyn_async! { description: "".to_string(), always_run: false, run: test_recursive_find_content, - environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), BEACON_STRING.to_string())])), Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), BEACON_STRING.to_string())]))]), + environments: environments.clone(), test_data: test_data.clone(), clients: vec![client_a.clone(), client_b.clone()], } @@ -107,7 +110,7 @@ dyn_async! { description: "".to_string(), always_run: false, run: test_find_content, - environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), BEACON_STRING.to_string())])), Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), BEACON_STRING.to_string())]))]), + environments: environments.clone(), test_data, clients: vec![client_a.clone(), client_b.clone()], } @@ -120,7 +123,7 @@ dyn_async! { description: "".to_string(), always_run: false, run: test_ping, - environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), BEACON_STRING.to_string())])), Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), BEACON_STRING.to_string())]))]), + environments: environments.clone(), test_data: (), clients: vec![client_a.clone(), client_b.clone()], } @@ -132,7 +135,7 @@ dyn_async! { description: "find content: calls find content that doesn't exist".to_string(), always_run: false, run: test_find_content_non_present, - environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), BEACON_STRING.to_string())])), Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), BEACON_STRING.to_string())]))]), + environments: environments.clone(), test_data: (), clients: vec![client_a.clone(), client_b.clone()], } @@ -144,7 +147,7 @@ dyn_async! { description: "find nodes: distance zero expect called nodes enr".to_string(), always_run: false, run: test_find_nodes_zero_distance, - environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), BEACON_STRING.to_string())])), Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), BEACON_STRING.to_string())]))]), + environments: environments.clone(), test_data: (), clients: vec![client_a.clone(), client_b.clone()], } diff --git a/simulators/portal/src/suites/beacon/mesh.rs b/simulators/portal/src/suites/beacon/mesh.rs index 5e207708e8..ee943b7830 100644 --- a/simulators/portal/src/suites/beacon/mesh.rs +++ b/simulators/portal/src/suites/beacon/mesh.rs @@ -1,7 +1,8 @@ use crate::suites::beacon::constants::{ - BEACON_STRING, CONSTANT_CONTENT_KEY, CONSTANT_CONTENT_VALUE, HIVE_PORTAL_NETWORKS_SELECTED, - PRIVATE_KEY_ENVIRONMENT_VARIABLE, TRIN_BRIDGE_CLIENT_TYPE, + CONSTANT_CONTENT_KEY, CONSTANT_CONTENT_VALUE, PRIVATE_KEY_ENVIRONMENT_VARIABLE, + TRIN_BRIDGE_CLIENT_TYPE, }; +use crate::suites::environment::PortalNetwork; use ethportal_api::jsonrpsee::core::__reexports::serde_json; use ethportal_api::types::beacon::ContentInfo; use ethportal_api::types::distance::{Metric, XorMetric}; @@ -21,6 +22,8 @@ dyn_async! { // todo: remove this once we implement role in hivesim-rs let clients: Vec = clients.into_iter().filter(|client| client.name != *TRIN_BRIDGE_CLIENT_TYPE).collect(); + let environment_flag = PortalNetwork::as_environment_flag([PortalNetwork::Beacon]); + let private_key_1 = "fc34e57cc83ed45aae140152fd84e2c21d1f4d46e19452e13acc7ee90daa5bac".to_string(); let private_key_2 = "e5add57dc4c9ef382509e61ce106ec86f60eb73bbfe326b00f54bf8e1819ba11".to_string(); @@ -32,7 +35,11 @@ dyn_async! { description: "".to_string(), always_run: false, run: test_find_content_two_jumps, - environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), BEACON_STRING.to_string())])), Some(HashMap::from([(PRIVATE_KEY_ENVIRONMENT_VARIABLE.to_string(), private_key_2.clone()), (HIVE_PORTAL_NETWORKS_SELECTED.to_string(), BEACON_STRING.to_string())])), Some(HashMap::from([(PRIVATE_KEY_ENVIRONMENT_VARIABLE.to_string(), private_key_1.clone()), (HIVE_PORTAL_NETWORKS_SELECTED.to_string(), BEACON_STRING.to_string())]))]), + environments: Some(vec![ + Some(HashMap::from([environment_flag.clone()])), + Some(HashMap::from([environment_flag.clone(), (PRIVATE_KEY_ENVIRONMENT_VARIABLE.to_string(), private_key_2.clone())])), + Some(HashMap::from([environment_flag.clone(), (PRIVATE_KEY_ENVIRONMENT_VARIABLE.to_string(), private_key_1.clone())])), + ]), test_data: (), clients: vec![client_a.clone(), client_b.clone(), client_c.clone()], } @@ -45,7 +52,11 @@ dyn_async! { description: "".to_string(), always_run: false, run: test_find_content_two_jumps, - environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), BEACON_STRING.to_string())])), Some(HashMap::from([(PRIVATE_KEY_ENVIRONMENT_VARIABLE.to_string(), private_key_1.clone()), (HIVE_PORTAL_NETWORKS_SELECTED.to_string(), BEACON_STRING.to_string())])), Some(HashMap::from([(PRIVATE_KEY_ENVIRONMENT_VARIABLE.to_string(), private_key_2.clone()), (HIVE_PORTAL_NETWORKS_SELECTED.to_string(), BEACON_STRING.to_string())]))]), + environments: Some(vec![ + Some(HashMap::from([environment_flag.clone()])), + Some(HashMap::from([environment_flag.clone(), (PRIVATE_KEY_ENVIRONMENT_VARIABLE.to_string(), private_key_1.clone())])), + Some(HashMap::from([environment_flag.clone(), (PRIVATE_KEY_ENVIRONMENT_VARIABLE.to_string(), private_key_2.clone())])), + ]), test_data: (), clients: vec![client_a.clone(), client_b.clone(), client_c.clone()], } @@ -57,7 +68,11 @@ dyn_async! { description: "find nodes: distance of client A expect seeded enr returned".to_string(), always_run: false, run: test_find_nodes_distance_of_client_c, - environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), BEACON_STRING.to_string())])), Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), BEACON_STRING.to_string())])), Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), BEACON_STRING.to_string())]))]), + environments: Some(vec![ + Some(HashMap::from([environment_flag.clone()])), + Some(HashMap::from([environment_flag.clone()])), + Some(HashMap::from([environment_flag.clone()])), + ]), test_data: (), clients: vec![client_a.clone(), client_b.clone(), client_c.clone()], } diff --git a/simulators/portal/src/suites/beacon/rpc_compat.rs b/simulators/portal/src/suites/beacon/rpc_compat.rs index 8dbe3b38fb..7fcdd5628e 100644 --- a/simulators/portal/src/suites/beacon/rpc_compat.rs +++ b/simulators/portal/src/suites/beacon/rpc_compat.rs @@ -1,7 +1,9 @@ +use std::collections::HashMap; + use crate::suites::beacon::constants::{ - BEACON_STRING, CONSTANT_CONTENT_KEY, CONSTANT_CONTENT_VALUE, HIVE_PORTAL_NETWORKS_SELECTED, - TRIN_BRIDGE_CLIENT_TYPE, + CONSTANT_CONTENT_KEY, CONSTANT_CONTENT_VALUE, TRIN_BRIDGE_CLIENT_TYPE, }; +use crate::suites::environment::PortalNetwork; use ethportal_api::types::enr::generate_random_remote_enr; use ethportal_api::BeaconContentValue; use ethportal_api::Discv5ApiClient; @@ -9,7 +11,6 @@ use ethportal_api::{BeaconContentKey, BeaconNetworkApiClient}; use hivesim::types::ClientDefinition; use hivesim::{dyn_async, Client, NClientTestSpec, Test}; use serde_json::json; -use std::collections::HashMap; dyn_async! { pub async fn run_rpc_compat_beacon_test_suite<'a> (test: &'a mut Test, _client: Option) { @@ -18,6 +19,9 @@ dyn_async! { // todo: remove this once we implement role in hivesim-rs let clients: Vec = clients.into_iter().filter(|client| client.name != *TRIN_BRIDGE_CLIENT_TYPE).collect(); + let environment_flag = PortalNetwork::as_environment_flag([PortalNetwork::Beacon]); + let environments = Some(vec![Some(HashMap::from([environment_flag]))]); + // Test single type of client for client in &clients { test.run( @@ -26,7 +30,7 @@ dyn_async! { description: "".to_string(), always_run: false, run: test_node_info, - environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), BEACON_STRING.to_string())]))]), + environments: environments.clone(), test_data: (), clients: vec![client.clone()], } @@ -38,7 +42,7 @@ dyn_async! { description: "".to_string(), always_run: false, run: test_local_content_expect_content_absent, - environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), BEACON_STRING.to_string())]))]), + environments: environments.clone(), test_data: (), clients: vec![client.clone()], } @@ -50,7 +54,7 @@ dyn_async! { description: "".to_string(), always_run: false, run: test_store, - environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), BEACON_STRING.to_string())]))]), + environments: environments.clone(), test_data: (), clients: vec![client.clone()], } @@ -62,7 +66,7 @@ dyn_async! { description: "".to_string(), always_run: false, run: test_local_content_expect_content_present, - environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), BEACON_STRING.to_string())]))]), + environments: environments.clone(), test_data: (), clients: vec![client.clone()], } @@ -74,7 +78,7 @@ dyn_async! { description: "".to_string(), always_run: false, run: test_add_enr_expect_true, - environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), BEACON_STRING.to_string())]))]), + environments: environments.clone(), test_data: (), clients: vec![client.clone()], } @@ -86,7 +90,7 @@ dyn_async! { description: "".to_string(), always_run: false, run: test_get_enr_non_present, - environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), BEACON_STRING.to_string())]))]), + environments: environments.clone(), test_data: (), clients: vec![client.clone()], } @@ -98,7 +102,7 @@ dyn_async! { description: "".to_string(), always_run: false, run: test_get_enr_enr_present, - environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), BEACON_STRING.to_string())]))]), + environments: environments.clone(), test_data: (), clients: vec![client.clone()], } @@ -110,7 +114,7 @@ dyn_async! { description: "".to_string(), always_run: false, run: test_get_enr_local_enr, - environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), BEACON_STRING.to_string())]))]), + environments: environments.clone(), test_data: (), clients: vec![client.clone()], } @@ -122,7 +126,7 @@ dyn_async! { description: "".to_string(), always_run: false, run: test_delete_enr_non_present, - environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), BEACON_STRING.to_string())]))]), + environments: environments.clone(), test_data: (), clients: vec![client.clone()], } @@ -134,7 +138,7 @@ dyn_async! { description: "".to_string(), always_run: false, run: test_delete_enr_enr_present, - environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), BEACON_STRING.to_string())]))]), + environments: environments.clone(), test_data: (), clients: vec![client.clone()], } @@ -146,7 +150,7 @@ dyn_async! { description: "".to_string(), always_run: false, run: test_lookup_enr_non_present, - environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), BEACON_STRING.to_string())]))]), + environments: environments.clone(), test_data: (), clients: vec![client.clone()], } @@ -158,7 +162,7 @@ dyn_async! { description: "".to_string(), always_run: false, run: test_lookup_enr_enr_present, - environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), BEACON_STRING.to_string())]))]), + environments: environments.clone(), test_data: (), clients: vec![client.clone()], } @@ -170,7 +174,7 @@ dyn_async! { description: "".to_string(), always_run: false, run: test_lookup_enr_local_enr, - environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), BEACON_STRING.to_string())]))]), + environments: environments.clone(), test_data: (), clients: vec![client.clone()], } @@ -182,7 +186,7 @@ dyn_async! { description: "".to_string(), always_run: false, run: test_recursive_find_content_content_absent, - environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), BEACON_STRING.to_string())]))]), + environments: environments.clone(), test_data: (), clients: vec![client.clone()], } diff --git a/simulators/portal/src/suites/environment.rs b/simulators/portal/src/suites/environment.rs new file mode 100644 index 0000000000..f7e23fb116 --- /dev/null +++ b/simulators/portal/src/suites/environment.rs @@ -0,0 +1,34 @@ +use std::fmt::Display; + +use itertools::Itertools; + +pub const HIVE_PORTAL_NETWORKS_SELECTED: &str = "HIVE_PORTAL_NETWORKS_SELECTED"; + +#[derive(Debug, Clone, Copy)] +pub enum PortalNetwork { + History, + Beacon, + State, +} + +impl PortalNetwork { + pub fn as_environment_flag( + networks: impl IntoIterator, + ) -> (String, String) { + let joined = networks + .into_iter() + .map(|network| network.to_string()) + .join(","); + (HIVE_PORTAL_NETWORKS_SELECTED.to_string(), joined) + } +} + +impl Display for PortalNetwork { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + PortalNetwork::History => f.write_str("history"), + PortalNetwork::Beacon => f.write_str("beacon"), + PortalNetwork::State => f.write_str("state"), + } + } +} diff --git a/simulators/portal/src/suites/mod.rs b/simulators/portal/src/suites/mod.rs index ac349031d1..bee81014d6 100644 --- a/simulators/portal/src/suites/mod.rs +++ b/simulators/portal/src/suites/mod.rs @@ -1,3 +1,4 @@ pub mod beacon; +pub mod environment; pub mod history; pub mod state; diff --git a/simulators/portal/src/suites/state/constants.rs b/simulators/portal/src/suites/state/constants.rs index dfab39e731..ed094dc4ad 100644 --- a/simulators/portal/src/suites/state/constants.rs +++ b/simulators/portal/src/suites/state/constants.rs @@ -1,6 +1,4 @@ pub const TEST_DATA_FILE_PATH: &str = "./test-data/state_test_data.yaml"; -pub const HIVE_PORTAL_NETWORKS_SELECTED: &str = "HIVE_PORTAL_NETWORKS_SELECTED"; -pub const STATE_STRING: &str = "state"; // trin-bridge constants pub const TRIN_BRIDGE_CLIENT_TYPE: &str = "trin-bridge"; diff --git a/simulators/portal/src/suites/state/interop.rs b/simulators/portal/src/suites/state/interop.rs index 8990a65aaa..b89266b2d9 100644 --- a/simulators/portal/src/suites/state/interop.rs +++ b/simulators/portal/src/suites/state/interop.rs @@ -1,18 +1,24 @@ -use crate::suites::state::constants::{ - CONTENT_KEY, HIVE_PORTAL_NETWORKS_SELECTED, STATE_STRING, TEST_DATA_FILE_PATH, - TRIN_BRIDGE_CLIENT_TYPE, +use std::collections::HashMap; + +use crate::suites::environment::PortalNetwork; +use crate::suites::state::constants::{CONTENT_KEY, TEST_DATA_FILE_PATH, TRIN_BRIDGE_CLIENT_TYPE}; +use alloy_primitives::Bytes; +use alloy_rlp::Decodable; +use ethportal_api::jsonrpsee::http_client::HttpClient; +use ethportal_api::types::execution::header_with_proof::{ + BlockHeaderProof, HeaderWithProof, SszNone, }; use ethportal_api::types::state::ContentInfo; use ethportal_api::utils::bytes::hex_encode; use ethportal_api::{ - ContentValue, Discv5ApiClient, StateContentKey, StateContentValue, StateNetworkApiClient, + ContentValue, Discv5ApiClient, Header, HistoryContentKey, HistoryContentValue, StateContentKey, + StateContentValue, StateNetworkApiClient, }; use hivesim::types::ClientDefinition; use hivesim::{dyn_async, Client, NClientTestSpec, Test}; use itertools::Itertools; use serde_json::json; use serde_yaml::Value; -use std::collections::HashMap; use tokio::time::Duration; // This is taken from Trin. It should be fairly standard @@ -20,11 +26,24 @@ const MAX_PORTAL_CONTENT_PAYLOAD_SIZE: usize = 1165; #[derive(Clone, Debug)] struct TestData { + pub header: Header, pub key: StateContentKey, pub offer_value: StateContentValue, pub lookup_value: StateContentValue, } +async fn store_header(header: Header, client: &HttpClient) -> bool { + let content_key = HistoryContentKey::BlockHeaderWithProof(header.hash().into()); + let content_value = HistoryContentValue::BlockHeaderWithProof(HeaderWithProof { + header, + proof: BlockHeaderProof::None(SszNone::default()), + }); + match ethportal_api::HistoryNetworkApiClient::store(client, content_key, content_value).await { + Ok(stored) => stored, + Err(err) => panic!("{}", &err.to_string()), + } +} + /// Processed content data for state tests struct ProcessedContent { content_type: String, @@ -78,17 +97,22 @@ dyn_async! { // todo: remove this once we implement role in hivesim-rs let clients: Vec = clients.into_iter().filter(|client| client.name != *TRIN_BRIDGE_CLIENT_TYPE).collect(); + let environment = Some(HashMap::from([PortalNetwork::as_environment_flag([PortalNetwork::State, PortalNetwork::History])])); + let environments = Some(vec![environment.clone(), environment]); + let values = std::fs::read_to_string(TEST_DATA_FILE_PATH) .expect("cannot find test asset"); let values: Value = serde_yaml::from_str(&values).unwrap(); let content: Vec = values.as_sequence().unwrap().iter().map(|value| { + let header_bytes: Bytes = serde_yaml::from_value(value["block_header"].clone()).unwrap(); + let header = Header::decode(&mut header_bytes.as_ref()).unwrap(); let key: StateContentKey = serde_yaml::from_value(value["content_key"].clone()).unwrap(); let offer_value: StateContentValue = serde_yaml::from_value(value["content_value_offer"].clone()).unwrap(); let lookup_value: StateContentValue = serde_yaml::from_value(value["content_value_retrieval"].clone()).unwrap(); - TestData { key, offer_value, lookup_value } + TestData { header, key, offer_value, lookup_value } }).collect(); // Iterate over all possible pairings of clients and run the tests (including self-pairings) @@ -100,7 +124,7 @@ dyn_async! { description: "".to_string(), always_run: false, run: test_offer, - environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), STATE_STRING.to_string())])), Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), STATE_STRING.to_string())]))]), + environments: environments.clone(), test_data: test_data.clone(), clients: vec![client_a.clone(), client_b.clone()], } @@ -112,7 +136,7 @@ dyn_async! { description: "".to_string(), always_run: false, run: test_recursive_find_content, - environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), STATE_STRING.to_string())])), Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), STATE_STRING.to_string())]))]), + environments: environments.clone(), test_data: test_data.clone(), clients: vec![client_a.clone(), client_b.clone()], } @@ -124,7 +148,7 @@ dyn_async! { description: "".to_string(), always_run: false, run: test_find_content, - environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), STATE_STRING.to_string())])), Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), STATE_STRING.to_string())]))]), + environments: environments.clone(), test_data, clients: vec![client_a.clone(), client_b.clone()], } @@ -137,7 +161,7 @@ dyn_async! { description: "".to_string(), always_run: false, run: test_ping, - environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), STATE_STRING.to_string())])), Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), STATE_STRING.to_string())]))]), + environments: environments.clone(), test_data: (), clients: vec![client_a.clone(), client_b.clone()], } @@ -149,7 +173,7 @@ dyn_async! { description: "find content: calls find content that doesn't exist".to_string(), always_run: false, run: test_find_content_non_present, - environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), STATE_STRING.to_string())])), Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), STATE_STRING.to_string())]))]), + environments: environments.clone(), test_data: (), clients: vec![client_a.clone(), client_b.clone()], } @@ -161,7 +185,7 @@ dyn_async! { description: "find nodes: distance zero expect called nodes enr".to_string(), always_run: false, run: test_find_nodes_zero_distance, - environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), STATE_STRING.to_string())])), Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), STATE_STRING.to_string())]))]), + environments: environments.clone(), test_data: (), clients: vec![client_a.clone(), client_b.clone()], } @@ -174,7 +198,7 @@ dyn_async! { description: "".to_string(), always_run: false, run: test_gossip_two_nodes, - environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), STATE_STRING.to_string())])), Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), STATE_STRING.to_string())]))]), + environments: environments.clone(), test_data: content.clone(), clients: vec![client_a.clone(), client_b.clone()], } @@ -235,7 +259,12 @@ dyn_async! { } }; - let TestData { key: target_key, offer_value: target_offer_value, lookup_value: target_lookup_value } = test_data; + let TestData { + header, + key: target_key, + offer_value: target_offer_value, + lookup_value: target_lookup_value + } = test_data; let target_enr = match client_b.rpc.node_info().await { Ok(node_info) => node_info.enr, @@ -244,6 +273,8 @@ dyn_async! { } }; + store_header(header, &client_b.rpc).await; + let _ = client_a.rpc.offer(target_enr, target_key.clone(), target_offer_value.clone()).await; tokio::time::sleep(Duration::from_secs(8)).await; @@ -347,7 +378,12 @@ dyn_async! { } }; - let TestData { key: target_key, offer_value: target_offer_value, lookup_value: target_lookup_value } = test_data; + let TestData { + key: target_key, + offer_value: target_offer_value, + lookup_value: target_lookup_value, + .. + } = test_data; match client_b.rpc.store(target_key.clone(), target_offer_value.clone()).await { Ok(result) => if !result { @@ -411,7 +447,12 @@ dyn_async! { } }; - let TestData { key: target_key, offer_value: target_offer_value, lookup_value: target_lookup_value } = test_data; + let TestData { + key: target_key, + offer_value: target_offer_value, + lookup_value: target_lookup_value, + .. + } = test_data; match client_b.rpc.store(target_key.clone(), target_offer_value.clone()).await { Ok(result) => if !result { @@ -481,7 +522,9 @@ dyn_async! { } // With default node settings nodes should be storing all content - for TestData { key: content_key, offer_value: content_offer_value, lookup_value: _ } in test_data.clone() { + for TestData { header, key: content_key, offer_value: content_offer_value, .. } in test_data.clone() { + store_header(header, &client_b.rpc).await; + match client_a.rpc.gossip(content_key.clone(), content_offer_value.clone()).await { Ok(nodes_gossiped_to) => { if nodes_gossiped_to != 1 { @@ -501,7 +544,7 @@ dyn_async! { // process raw test data to generate content details for error output let mut result = vec![]; - for TestData { key: content_key, offer_value: _, lookup_value: content_lookup_value } in test_data { + for TestData { key: content_key, lookup_value: content_lookup_value, .. } in test_data { let content_details = { let content_type = match &content_key { StateContentKey::AccountTrieNode(_) => "account trie node".to_string(), diff --git a/simulators/portal/src/suites/state/rpc_compat.rs b/simulators/portal/src/suites/state/rpc_compat.rs index a088e2fad1..8440bf42e2 100644 --- a/simulators/portal/src/suites/state/rpc_compat.rs +++ b/simulators/portal/src/suites/state/rpc_compat.rs @@ -1,6 +1,8 @@ +use std::collections::HashMap; + +use crate::suites::environment::PortalNetwork; use crate::suites::state::constants::{ - CONTENT_KEY, CONTENT_LOOKUP_VALUE, CONTENT_OFFER_VALUE, HIVE_PORTAL_NETWORKS_SELECTED, - STATE_STRING, TRIN_BRIDGE_CLIENT_TYPE, + CONTENT_KEY, CONTENT_LOOKUP_VALUE, CONTENT_OFFER_VALUE, TRIN_BRIDGE_CLIENT_TYPE, }; use ethportal_api::types::enr::generate_random_remote_enr; use ethportal_api::Discv5ApiClient; @@ -8,7 +10,6 @@ use ethportal_api::{StateContentKey, StateContentValue, StateNetworkApiClient}; use hivesim::types::ClientDefinition; use hivesim::{dyn_async, Client, NClientTestSpec, Test}; use serde_json::json; -use std::collections::HashMap; dyn_async! { pub async fn run_rpc_compat_state_test_suite<'a> (test: &'a mut Test, _client: Option) { @@ -17,6 +18,9 @@ dyn_async! { // todo: remove this once we implement role in hivesim-rs let clients: Vec = clients.into_iter().filter(|client| client.name != *TRIN_BRIDGE_CLIENT_TYPE).collect(); + let environment_flag = PortalNetwork::as_environment_flag([PortalNetwork::State, PortalNetwork::History]); + let environments = Some(vec![Some(HashMap::from([environment_flag]))]); + // Test single type of client for client in &clients { test.run( @@ -25,7 +29,7 @@ dyn_async! { description: "".to_string(), always_run: false, run: test_node_info, - environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), STATE_STRING.to_string())]))]), + environments: environments.clone(), test_data: (), clients: vec![client.clone()], } @@ -37,7 +41,7 @@ dyn_async! { description: "".to_string(), always_run: false, run: test_local_content_expect_content_absent, - environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), STATE_STRING.to_string())]))]), + environments: environments.clone(), test_data: (), clients: vec![client.clone()], } @@ -49,7 +53,7 @@ dyn_async! { description: "".to_string(), always_run: false, run: test_store, - environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), STATE_STRING.to_string())]))]), + environments: environments.clone(), test_data: (), clients: vec![client.clone()], } @@ -61,7 +65,7 @@ dyn_async! { description: "".to_string(), always_run: false, run: test_local_content_expect_content_present, - environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), STATE_STRING.to_string())]))]), + environments: environments.clone(), test_data: (), clients: vec![client.clone()], } @@ -73,7 +77,7 @@ dyn_async! { description: "".to_string(), always_run: false, run: test_add_enr_expect_true, - environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), STATE_STRING.to_string())]))]), + environments: environments.clone(), test_data: (), clients: vec![client.clone()], } @@ -85,7 +89,7 @@ dyn_async! { description: "".to_string(), always_run: false, run: test_get_enr_non_present, - environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), STATE_STRING.to_string())]))]), + environments: environments.clone(), test_data: (), clients: vec![client.clone()], } @@ -97,7 +101,7 @@ dyn_async! { description: "".to_string(), always_run: false, run: test_get_enr_enr_present, - environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), STATE_STRING.to_string())]))]), + environments: environments.clone(), test_data: (), clients: vec![client.clone()], } @@ -109,7 +113,7 @@ dyn_async! { description: "".to_string(), always_run: false, run: test_get_enr_local_enr, - environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), STATE_STRING.to_string())]))]), + environments: environments.clone(), test_data: (), clients: vec![client.clone()], } @@ -121,7 +125,7 @@ dyn_async! { description: "".to_string(), always_run: false, run: test_delete_enr_non_present, - environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), STATE_STRING.to_string())]))]), + environments: environments.clone(), test_data: (), clients: vec![client.clone()], } @@ -133,7 +137,7 @@ dyn_async! { description: "".to_string(), always_run: false, run: test_delete_enr_enr_present, - environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), STATE_STRING.to_string())]))]), + environments: environments.clone(), test_data: (), clients: vec![client.clone()], } @@ -145,7 +149,7 @@ dyn_async! { description: "".to_string(), always_run: false, run: test_lookup_enr_non_present, - environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), STATE_STRING.to_string())]))]), + environments: environments.clone(), test_data: (), clients: vec![client.clone()], } @@ -157,7 +161,7 @@ dyn_async! { description: "".to_string(), always_run: false, run: test_lookup_enr_enr_present, - environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), STATE_STRING.to_string())]))]), + environments: environments.clone(), test_data: (), clients: vec![client.clone()], } @@ -169,7 +173,7 @@ dyn_async! { description: "".to_string(), always_run: false, run: test_lookup_enr_local_enr, - environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), STATE_STRING.to_string())]))]), + environments: environments.clone(), test_data: (), clients: vec![client.clone()], } @@ -181,7 +185,7 @@ dyn_async! { description: "".to_string(), always_run: false, run: test_recursive_find_content_content_absent, - environments: Some(vec![Some(HashMap::from([(HIVE_PORTAL_NETWORKS_SELECTED.to_string(), STATE_STRING.to_string())]))]), + environments: environments.clone(), test_data: (), clients: vec![client.clone()], } From e8819f15fec725073f53ec8fa5bfdfd14a92e961 Mon Sep 17 00:00:00 2001 From: Sina M <1591639+s1na@users.noreply.github.com> Date: Tue, 20 Aug 2024 15:37:30 +0200 Subject: [PATCH 327/387] internal/libhive: skip unsuccessful build of client (#1154) --- internal/libhive/run.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/internal/libhive/run.go b/internal/libhive/run.go index b01229642d..c75a11c988 100644 --- a/internal/libhive/run.go +++ b/internal/libhive/run.go @@ -58,7 +58,7 @@ func (r *Runner) buildClients(ctx context.Context, clientList []ClientDesignator return errors.New("client list is empty, cannot simulate") } - r.clientDefs = make([]*ClientDefinition, len(clientList)) + r.clientDefs = make([]*ClientDefinition, 0, len(clientList)) var anyBuilt bool log15.Info(fmt.Sprintf("building %d clients...", len(clientList))) @@ -72,12 +72,12 @@ func (r *Runner) buildClients(ctx context.Context, clientList []ClientDesignator if err != nil { log15.Warn("can't read version info of "+client.Client, "image", image, "err", err) } - r.clientDefs[i] = &ClientDefinition{ + r.clientDefs = append(r.clientDefs, &ClientDefinition{ Name: client.Name(), Version: strings.TrimSpace(string(version)), Image: image, Meta: r.inv.Clients[client.Client].Meta, - } + }) } if !anyBuilt { return errors.New("all clients failed to build") From f47eebb89be85cee2c9d3fd2d0afbe209ad3e77e Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Tue, 20 Aug 2024 15:44:00 +0200 Subject: [PATCH 328/387] internal/libhive: fix build --- internal/libhive/run.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/libhive/run.go b/internal/libhive/run.go index c75a11c988..e3dec9a25b 100644 --- a/internal/libhive/run.go +++ b/internal/libhive/run.go @@ -62,7 +62,7 @@ func (r *Runner) buildClients(ctx context.Context, clientList []ClientDesignator var anyBuilt bool log15.Info(fmt.Sprintf("building %d clients...", len(clientList))) - for i, client := range clientList { + for _, client := range clientList { image, err := r.builder.BuildClientImage(ctx, client) if err != nil { continue From 91829ccfb2c55687d3f8b543203be4379cdde1be Mon Sep 17 00:00:00 2001 From: Andrew Ashikhmin <34320705+yperbasis@users.noreply.github.com> Date: Thu, 22 Aug 2024 15:59:54 +0200 Subject: [PATCH 329/387] clients/erigon: disable incompatible performance optimization (#1155) --- clients/erigon/erigon.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/clients/erigon/erigon.sh b/clients/erigon/erigon.sh index 9e9202a656..6e050dcd48 100644 --- a/clients/erigon/erigon.sh +++ b/clients/erigon/erigon.sh @@ -133,6 +133,9 @@ FLAGS="$FLAGS --ws --ws.port=8546" # Increase blob slots for tests FLAGS="$FLAGS --txpool.blobslots=1000 --txpool.totalblobpoollimit=10000" +# Disable performance optimization incompatible with the tests +FLAGS="$FLAGS --sync.parallel-state-flushing=false" + if [ "$HIVE_TERMINAL_TOTAL_DIFFICULTY" != "" ]; then JWT_SECRET="0x7365637265747365637265747365637265747365637265747365637265747365" echo -n $JWT_SECRET > /jwt.secret From 7f94d5755ec9ceb0647079b62a4cf8769889c548 Mon Sep 17 00:00:00 2001 From: Kolby Moroz Liebl <31669092+KolbyML@users.noreply.github.com> Date: Mon, 2 Sep 2024 03:45:04 -0600 Subject: [PATCH 330/387] clients/trin*: update log levels to be cleaner + informative (#1158) --- clients/trin-bridge/trin_bridge.sh | 2 +- clients/trin/trin.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/clients/trin-bridge/trin_bridge.sh b/clients/trin-bridge/trin_bridge.sh index adf163e147..3cd3e49ed9 100644 --- a/clients/trin-bridge/trin_bridge.sh +++ b/clients/trin-bridge/trin_bridge.sh @@ -13,4 +13,4 @@ else exit 1 fi -RUST_LOG="error,portal_bridge=debug,portalnet=debug" portal-bridge $FLAGS --executable-path /usr/bin/trin --mode test:/test_data_collection_of_forks_blocks.yaml --external-ip $IP_ADDR --epoch-accumulator-path . trin +RUST_LOG="trace,neli=error,rustls=error,polling=error,async_io=error,hyper=error,discv5=info,jsonrpsee_types::params=error,jsonrpsee_core::http_helpers=error" portal-bridge $FLAGS --executable-path /usr/bin/trin --mode test:/test_data_collection_of_forks_blocks.yaml --external-ip $IP_ADDR --epoch-accumulator-path . trin diff --git a/clients/trin/trin.sh b/clients/trin/trin.sh index 1d9ef6ebf6..019d4099a1 100644 --- a/clients/trin/trin.sh +++ b/clients/trin/trin.sh @@ -16,4 +16,4 @@ else FLAGS="$FLAGS --portal-subnetworks history" fi -RUST_LOG="trace,neli=error" trin --web3-transport http --web3-http-address http://0.0.0.0:8545 --external-address "$IP_ADDR":9009 --bootnodes none $FLAGS +RUST_LOG="trace,neli=error,hyper=error,discv5=info" trin --web3-transport http --web3-http-address http://0.0.0.0:8545 --external-address "$IP_ADDR":9009 --bootnodes none $FLAGS From d69583690a5e1502e217fd0989e432387bbfafd2 Mon Sep 17 00:00:00 2001 From: Mario Vega Date: Mon, 2 Sep 2024 09:43:01 -0600 Subject: [PATCH 331/387] simulators/ethereum/engine: Fix SYNCING FCU expectation (#1159) simulators/ethereum/engine: Fix SYNCING FCU expectation on invalid payloads --- .../ethereum/engine/suites/engine/invalid_payload.go | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/simulators/ethereum/engine/suites/engine/invalid_payload.go b/simulators/ethereum/engine/suites/engine/invalid_payload.go index f148dbe60f..7ea39e8ea5 100644 --- a/simulators/ethereum/engine/suites/engine/invalid_payload.go +++ b/simulators/ethereum/engine/suites/engine/invalid_payload.go @@ -201,7 +201,12 @@ func (tc InvalidPayloadTestCase) Execute(t *test.Env) { s.ExpectAnyPayloadStatus(test.Syncing, test.Accepted, test.Invalid) } else { // At this moment the response should be SYNCING - s.ExpectPayloadStatus(test.Syncing) + if invalidDetectedOnSync { + // except if the client can detect the invalid payload even when syncing + s.ExpectAnyPayloadStatus(test.Invalid, test.Accepted, test.Syncing) + } else { + s.ExpectPayloadStatus(test.Syncing) + } // When we send the previous payload, the client must now be capable of determining that the invalid payload is actually invalid p := t.TestEngine.TestEngineNewPayload(&t.CLMock.LatestExecutedPayload) From 7346e40802c1eb555ae64539f2bd4aecdae63ddf Mon Sep 17 00:00:00 2001 From: Gabriel-Trintinalia Date: Tue, 3 Sep 2024 23:21:08 +1000 Subject: [PATCH 332/387] clients/besu: Enable snap server (#1160) * Enable snap serve * Enable snap server --- clients/besu/besu.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/clients/besu/besu.sh b/clients/besu/besu.sh index 4324801e50..8b180089f1 100644 --- a/clients/besu/besu.sh +++ b/clients/besu/besu.sh @@ -142,6 +142,9 @@ elif [ "$HIVE_NODETYPE" == "" ] && [ "$HIVE_TERMINAL_TOTAL_DIFFICULTY" == "" ]; FLAGS="$FLAGS --sync-mode=SNAP" fi +# Enable Snap Server. +FLAGS="$FLAGS --Xsnapsync-server-enabled" + # Configure RPC. RPCFLAGS="--host-allowlist=*" if [ "$HIVE_GRAPHQL_ENABLED" == "" ]; then From d86b6ccbdb3dacf8d11a8adce247f9e89ac8a671 Mon Sep 17 00:00:00 2001 From: Mario Vega Date: Thu, 5 Sep 2024 08:44:29 -0600 Subject: [PATCH 333/387] clients/besu,erigon,ethereumjs,go-ethereum,nethermind,reth,nimbus-el: Add `pragueTime` (#1161) * clients/besu: Add `pragueTime` * clients/erigon: Add `pragueTime` * clients/ethereumjs: Add `pragueTime` * clients/go-ethereum: Add `pragueTime` * clients/nethermind: Add `pragueTime` * clients/reth: Add `pragueTime` * clients/nimbus-el: Add `pragueTime` --- clients/besu/mapper.jq | 1 + clients/erigon/mapper.jq | 1 + clients/ethereumjs/mapper.jq | 1 + clients/go-ethereum/mapper.jq | 1 + clients/nethermind/mapper.jq | 9 +++++++++ clients/nimbus-el/mapper.jq | 1 + clients/reth/mapper.jq | 1 + 7 files changed, 15 insertions(+) diff --git a/clients/besu/mapper.jq b/clients/besu/mapper.jq index ab6ee6913b..4e21e497cb 100644 --- a/clients/besu/mapper.jq +++ b/clients/besu/mapper.jq @@ -49,5 +49,6 @@ def to_int: "terminalTotalDifficulty": env.HIVE_TERMINAL_TOTAL_DIFFICULTY|to_int, "shanghaiTime": env.HIVE_SHANGHAI_TIMESTAMP|to_int, "cancunTime": env.HIVE_CANCUN_TIMESTAMP|to_int, + "pragueTime": env.HIVE_PRAGUE_TIMESTAMP|to_int, }|remove_empty } diff --git a/clients/erigon/mapper.jq b/clients/erigon/mapper.jq index 89eb423989..7576d83079 100644 --- a/clients/erigon/mapper.jq +++ b/clients/erigon/mapper.jq @@ -57,5 +57,6 @@ def to_bool: "terminalTotalDifficultyPassed": (if env.HIVE_TERMINAL_TOTAL_DIFFICULTY_PASSED == null then true else env.HIVE_TERMINAL_TOTAL_DIFFICULTY_PASSED|to_bool end), "shanghaiTime": env.HIVE_SHANGHAI_TIMESTAMP|to_int, "cancunTime": env.HIVE_CANCUN_TIMESTAMP|to_int, + "pragueTime": env.HIVE_PRAGUE_TIMESTAMP|to_int, }|remove_empty } diff --git a/clients/ethereumjs/mapper.jq b/clients/ethereumjs/mapper.jq index db790c9cf0..1eee477af1 100644 --- a/clients/ethereumjs/mapper.jq +++ b/clients/ethereumjs/mapper.jq @@ -72,5 +72,6 @@ def pad_storage_keys: "terminalTotalDifficulty": env.HIVE_TERMINAL_TOTAL_DIFFICULTY|to_int, "shanghaiTime": env.HIVE_SHANGHAI_TIMESTAMP|to_int, "cancunTime": env.HIVE_CANCUN_TIMESTAMP|to_int, + "pragueTime": env.HIVE_PRAGUE_TIMESTAMP|to_int, } } | pad_storage_keys | remove_empty diff --git a/clients/go-ethereum/mapper.jq b/clients/go-ethereum/mapper.jq index 7e466ce338..569b74ac0f 100644 --- a/clients/go-ethereum/mapper.jq +++ b/clients/go-ethereum/mapper.jq @@ -56,6 +56,7 @@ def to_bool: "terminalTotalDifficulty": env.HIVE_TERMINAL_TOTAL_DIFFICULTY|to_int, "shanghaiTime": env.HIVE_SHANGHAI_TIMESTAMP|to_int, "cancunTime": env.HIVE_CANCUN_TIMESTAMP|to_int, + "pragueTime": env.HIVE_PRAGUE_TIMESTAMP|to_int, "terminalTotalDifficultyPassed": true, }|remove_empty } diff --git a/clients/nethermind/mapper.jq b/clients/nethermind/mapper.jq index be2d1028da..142d365686 100644 --- a/clients/nethermind/mapper.jq +++ b/clients/nethermind/mapper.jq @@ -151,6 +151,15 @@ def clique_engine: "eip5656TransitionTimestamp": env.HIVE_CANCUN_TIMESTAMP|to_hex, "eip6780TransitionTimestamp": env.HIVE_CANCUN_TIMESTAMP|to_hex, + # Prague + "eip2537TransitionTimestamp": env.HIVE_PRAGUE_TIMESTAMP|to_hex, + "eip2935TransitionTimestamp": env.HIVE_PRAGUE_TIMESTAMP|to_hex, + "eip6110TransitionTimestamp": env.HIVE_PRAGUE_TIMESTAMP|to_hex, + "eip7002TransitionTimestamp": env.HIVE_PRAGUE_TIMESTAMP|to_hex, + "eip7251TransitionTimestamp": env.HIVE_PRAGUE_TIMESTAMP|to_hex, + "eip7685TransitionTimestamp": env.HIVE_PRAGUE_TIMESTAMP|to_hex, + "eip7702TransitionTimestamp": env.HIVE_PRAGUE_TIMESTAMP|to_hex, + # Other chain parameters "networkID": env.HIVE_NETWORK_ID|to_hex, "chainID": env.HIVE_CHAIN_ID|to_hex, diff --git a/clients/nimbus-el/mapper.jq b/clients/nimbus-el/mapper.jq index 2c763f65fb..11f4f607b5 100644 --- a/clients/nimbus-el/mapper.jq +++ b/clients/nimbus-el/mapper.jq @@ -77,6 +77,7 @@ def to_bool: "terminalTotalDifficulty": env.HIVE_TERMINAL_TOTAL_DIFFICULTY|to_int, "shanghaiTime": env.HIVE_SHANGHAI_TIMESTAMP|to_int, "cancunTime": env.HIVE_CANCUN_TIMESTAMP|to_int, + "pragueTime": env.HIVE_PRAGUE_TIMESTAMP|to_int, "terminalTotalDifficultyPassed": true, }|remove_empty } diff --git a/clients/reth/mapper.jq b/clients/reth/mapper.jq index d21b3355c8..3a9b2ead87 100644 --- a/clients/reth/mapper.jq +++ b/clients/reth/mapper.jq @@ -57,5 +57,6 @@ def to_bool: "terminalTotalDifficultyPassed": env.HIVE_TERMINAL_TOTAL_DIFFICULTY_PASSED|to_bool, "shanghaiTime": env.HIVE_SHANGHAI_TIMESTAMP|to_int, "cancunTime": env.HIVE_CANCUN_TIMESTAMP|to_int, + "pragueTime": env.HIVE_PRAGUE_TIMESTAMP|to_int, }|remove_empty } From d74ee942eb4720a8fcfef72c6e8f06d14ec7dbad Mon Sep 17 00:00:00 2001 From: Andrew Ashikhmin <34320705+yperbasis@users.noreply.github.com> Date: Thu, 12 Sep 2024 16:34:17 +0200 Subject: [PATCH 334/387] clients/erigon: update dockerhub (#1163) --- clients/erigon/Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/clients/erigon/Dockerfile b/clients/erigon/Dockerfile index e178cf4aea..ac415604fd 100644 --- a/clients/erigon/Dockerfile +++ b/clients/erigon/Dockerfile @@ -1,6 +1,6 @@ ## Build Erigon Via Pre-Built Image: -ARG baseimage=thorax/erigon -ARG tag=latest +ARG baseimage=erigontech/erigon +ARG tag=main-latest FROM $baseimage:$tag # The upstream erigon container uses a non-root user, but we need From 413515438ab46eab359a679a465699a098339327 Mon Sep 17 00:00:00 2001 From: Kolby Moroz Liebl <31669092+KolbyML@users.noreply.github.com> Date: Fri, 13 Sep 2024 11:11:06 -0600 Subject: [PATCH 335/387] simulators/portal: move test utils back to Portal simulator (#1164) --- simulators/portal/Cargo.lock | 6 ---- simulators/portal/Cargo.toml | 1 - .../portal/src/suites/history/interop.rs | 2 +- .../portal/src/suites/history/trin_bridge.rs | 2 +- simulators/portal/src/suites/mod.rs | 1 + simulators/portal/src/suites/utils.rs | 34 +++++++++++++++++++ 6 files changed, 37 insertions(+), 9 deletions(-) create mode 100644 simulators/portal/src/suites/utils.rs diff --git a/simulators/portal/Cargo.lock b/simulators/portal/Cargo.lock index 88d7c489a0..0b2a8f9781 100644 --- a/simulators/portal/Cargo.lock +++ b/simulators/portal/Cargo.lock @@ -2687,7 +2687,6 @@ dependencies = [ "futures", "hivesim", "itertools 0.10.5", - "portal-spec-test-utils-rs", "serde_json", "serde_yaml", "tokio", @@ -2695,11 +2694,6 @@ dependencies = [ "tracing-subscriber", ] -[[package]] -name = "portal-spec-test-utils-rs" -version = "0.1.0" -source = "git+https://github.com/ethereum/portal-spec-tests?rev=954f7d0eb2950a2131048404a1a4ce476bb64657#954f7d0eb2950a2131048404a1a4ce476bb64657" - [[package]] name = "powerfmt" version = "0.2.0" diff --git a/simulators/portal/Cargo.toml b/simulators/portal/Cargo.toml index 617532074e..a20b57cf97 100755 --- a/simulators/portal/Cargo.toml +++ b/simulators/portal/Cargo.toml @@ -13,7 +13,6 @@ ethportal-api = { git = "https://github.com/ethereum/trin", rev = "688847c64c1ef futures = "0.3.25" hivesim = { git = "https://github.com/ethereum/hive", rev = "81fc9a350d7f7ca8bcbe5f54886483d405d4daa8" } itertools = "0.10.5" -portal-spec-test-utils-rs = { git = "https://github.com/ethereum/portal-spec-tests", rev = "954f7d0eb2950a2131048404a1a4ce476bb64657" } serde_json = "1.0.87" serde_yaml = "0.9" tokio = { version = "1", features = ["full"] } diff --git a/simulators/portal/src/suites/history/interop.rs b/simulators/portal/src/suites/history/interop.rs index c545a3bd0c..6453ed7790 100644 --- a/simulators/portal/src/suites/history/interop.rs +++ b/simulators/portal/src/suites/history/interop.rs @@ -1,4 +1,5 @@ use crate::suites::history::constants::{TEST_DATA_FILE_PATH, TRIN_BRIDGE_CLIENT_TYPE}; +use crate::suites::utils::get_flair; use ethportal_api::types::history::ContentInfo; use ethportal_api::{ ContentValue, Discv5ApiClient, HistoryContentKey, HistoryContentValue, HistoryNetworkApiClient, @@ -6,7 +7,6 @@ use ethportal_api::{ use hivesim::types::ClientDefinition; use hivesim::{dyn_async, Client, NClientTestSpec, Test}; use itertools::Itertools; -use portal_spec_test_utils_rs::get_flair; use serde_json::json; use serde_yaml::Value; use tokio::time::Duration; diff --git a/simulators/portal/src/suites/history/trin_bridge.rs b/simulators/portal/src/suites/history/trin_bridge.rs index b5cbcbfdbd..2ce1ed3cb6 100644 --- a/simulators/portal/src/suites/history/trin_bridge.rs +++ b/simulators/portal/src/suites/history/trin_bridge.rs @@ -2,12 +2,12 @@ use super::constants::{ BOOTNODES_ENVIRONMENT_VARIABLE, HIVE_CHECK_LIVE_PORT, TEST_DATA_FILE_PATH, TRIN_BRIDGE_CLIENT_TYPE, }; +use crate::suites::utils::get_flair; use ethportal_api::HistoryContentKey; use ethportal_api::HistoryContentValue; use ethportal_api::{Discv5ApiClient, HistoryNetworkApiClient}; use hivesim::types::ClientDefinition; use hivesim::{dyn_async, Client, NClientTestSpec, Test}; -use portal_spec_test_utils_rs::get_flair; use serde_yaml::Value; use std::collections::HashMap; use tokio::time::Duration; diff --git a/simulators/portal/src/suites/mod.rs b/simulators/portal/src/suites/mod.rs index bee81014d6..835763259d 100644 --- a/simulators/portal/src/suites/mod.rs +++ b/simulators/portal/src/suites/mod.rs @@ -2,3 +2,4 @@ pub mod beacon; pub mod environment; pub mod history; pub mod state; +pub mod utils; diff --git a/simulators/portal/src/suites/utils.rs b/simulators/portal/src/suites/utils.rs new file mode 100644 index 0000000000..c641c5678a --- /dev/null +++ b/simulators/portal/src/suites/utils.rs @@ -0,0 +1,34 @@ +// Execution Layer hard forks https://ethereum.org/en/history/ +pub const CANCUN_BLOCK_NUMBER: u64 = 19426587; +pub const SHANGHAI_BLOCK_NUMBER: u64 = 17034870; +pub const MERGE_BLOCK_NUMBER: u64 = 15537394; +pub const LONDON_BLOCK_NUMBER: u64 = 12965000; +pub const BERLIN_BLOCK_NUMBER: u64 = 12244000; +pub const ISTANBUL_BLOCK_NUMBER: u64 = 9069000; +pub const CONSTANTINOPLE_BLOCK_NUMBER: u64 = 7280000; +pub const BYZANTIUM_BLOCK_NUMBER: u64 = 4370000; +pub const HOMESTEAD_BLOCK_NUMBER: u64 = 1150000; + +pub fn get_flair(block_number: u64) -> String { + if block_number > CANCUN_BLOCK_NUMBER { + " (post-cancun)".to_string() + } else if block_number > SHANGHAI_BLOCK_NUMBER { + " (post-shanghai)".to_string() + } else if block_number > MERGE_BLOCK_NUMBER { + " (post-merge)".to_string() + } else if block_number > LONDON_BLOCK_NUMBER { + " (post-london)".to_string() + } else if block_number > BERLIN_BLOCK_NUMBER { + " (post-berlin)".to_string() + } else if block_number > ISTANBUL_BLOCK_NUMBER { + " (post-istanbul)".to_string() + } else if block_number > CONSTANTINOPLE_BLOCK_NUMBER { + " (post-constantinople)".to_string() + } else if block_number > BYZANTIUM_BLOCK_NUMBER { + " (post-byzantium)".to_string() + } else if block_number > HOMESTEAD_BLOCK_NUMBER { + " (post-homestead)".to_string() + } else { + "".to_string() + } +} From 8e3ffff6ea74d20fc073f9a78baa574e7e688856 Mon Sep 17 00:00:00 2001 From: Nick Gheorghita Date: Wed, 18 Sep 2024 12:18:21 -0400 Subject: [PATCH 336/387] clients/trin-bridge: remove unnecessary trin bridge cli arg (#1165) remove unnecessary trin bridge cli arg --- clients/trin-bridge/trin_bridge.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clients/trin-bridge/trin_bridge.sh b/clients/trin-bridge/trin_bridge.sh index 3cd3e49ed9..68d14431ed 100644 --- a/clients/trin-bridge/trin_bridge.sh +++ b/clients/trin-bridge/trin_bridge.sh @@ -13,4 +13,4 @@ else exit 1 fi -RUST_LOG="trace,neli=error,rustls=error,polling=error,async_io=error,hyper=error,discv5=info,jsonrpsee_types::params=error,jsonrpsee_core::http_helpers=error" portal-bridge $FLAGS --executable-path /usr/bin/trin --mode test:/test_data_collection_of_forks_blocks.yaml --external-ip $IP_ADDR --epoch-accumulator-path . trin +RUST_LOG="trace,neli=error,rustls=error,polling=error,async_io=error,hyper=error,discv5=info,jsonrpsee_types::params=error,jsonrpsee_core::http_helpers=error" portal-bridge $FLAGS --executable-path /usr/bin/trin --mode test:/test_data_collection_of_forks_blocks.yaml --external-ip $IP_ADDR --epoch-accumulator-path . From 5c589295dae3eb896a5cb71ee639ab01add911a5 Mon Sep 17 00:00:00 2001 From: Kolby Moroz Liebl <31669092+KolbyML@users.noreply.github.com> Date: Thu, 19 Sep 2024 12:56:53 -0600 Subject: [PATCH 337/387] hivesim-rs: bump dependency versions (#1166) --- hivesim-rs/Cargo.toml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/hivesim-rs/Cargo.toml b/hivesim-rs/Cargo.toml index 0e1f1e7622..48f5f7aac3 100644 --- a/hivesim-rs/Cargo.toml +++ b/hivesim-rs/Cargo.toml @@ -6,11 +6,11 @@ edition = "2021" [dependencies] -async-trait = "0.1.59" +async-trait = "0.1.68" dyn-clone = "1.0.11" jsonrpsee = {version="0.20.0", features = ["client"]} regex = "1.10.5" -reqwest = { version = "0.11.12", default-features = false, features = ["json", "multipart"] } -serde = { version = "1.0.147", features = ["derive"] } -serde_json = "1.0.87" -tokio = { version = "1", features = ["full"] } +reqwest = { version = "0.12.7", default-features = false, features = ["json", "multipart"] } +serde = { version = "1.0.150", features = ["derive"] } +serde_json = "1.0.95" +tokio = { version = "1.14.0", features = ["full"] } From 81be591286ecd9229e836ac616b1af779c796d1b Mon Sep 17 00:00:00 2001 From: Kolby Moroz Liebl <31669092+KolbyML@users.noreply.github.com> Date: Thu, 19 Sep 2024 17:30:54 -0600 Subject: [PATCH 338/387] simulators/portal: update ethportal-api version (add support for header by number tests) (#1167) --- .circleci/continue_config.yml | 4 +- simulators/portal/Cargo.lock | 831 ++++++++++++------ simulators/portal/Cargo.toml | 14 +- simulators/portal/Dockerfile | 2 +- .../portal/src/suites/beacon/interop.rs | 21 +- simulators/portal/src/suites/beacon/mesh.rs | 14 +- .../portal/src/suites/beacon/rpc_compat.rs | 15 +- .../portal/src/suites/history/interop.rs | 63 +- simulators/portal/src/suites/history/mesh.rs | 14 +- .../portal/src/suites/history/rpc_compat.rs | 17 +- .../portal/src/suites/history/trin_bridge.rs | 19 +- simulators/portal/src/suites/state/interop.rs | 38 +- .../portal/src/suites/state/rpc_compat.rs | 19 +- 13 files changed, 669 insertions(+), 402 deletions(-) diff --git a/.circleci/continue_config.yml b/.circleci/continue_config.yml index a53d39a13a..d6ab043ac5 100644 --- a/.circleci/continue_config.yml +++ b/.circleci/continue_config.yml @@ -78,7 +78,7 @@ jobs: # this makes sure the rust code is good hivesim-rs: docker: - - image: cimg/rust:1.79.0 + - image: cimg/rust:1.81.0 steps: - checkout - run: @@ -101,7 +101,7 @@ jobs: command: "cd hivesim-rs && cargo test --workspace -- --nocapture" rust-simulators: docker: - - image: cimg/rust:1.79.0 + - image: cimg/rust:1.81.0 steps: - checkout - run: diff --git a/simulators/portal/Cargo.lock b/simulators/portal/Cargo.lock index 0b2a8f9781..fd571c8f59 100644 --- a/simulators/portal/Cargo.lock +++ b/simulators/portal/Cargo.lock @@ -82,35 +82,76 @@ checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" [[package]] name = "alloy-consensus" -version = "0.1.0" -source = "git+https://github.com/alloy-rs/alloy?rev=8c9dd0a#8c9dd0ae0a0f12eb81b5afe75a9b55ea4ad3abf4" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "629b62e38d471cc15fea534eb7283d2f8a4e8bdb1811bcc5d66dda6cfce6fae1" dependencies = [ "alloy-eips", "alloy-primitives", "alloy-rlp", "alloy-serde", + "c-kzg", "serde", - "sha2", ] [[package]] -name = "alloy-eips" +name = "alloy-eip2930" version = "0.1.0" -source = "git+https://github.com/alloy-rs/alloy?rev=8c9dd0a#8c9dd0ae0a0f12eb81b5afe75a9b55ea4ad3abf4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0069cf0642457f87a01a014f6dc29d5d893cd4fd8fddf0c3cdfad1bb3ebafc41" dependencies = [ + "alloy-primitives", + "alloy-rlp", + "serde", +] + +[[package]] +name = "alloy-eip7702" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37d319bb544ca6caeab58c39cea8921c55d924d4f68f2c60f24f914673f9a74a" +dependencies = [ + "alloy-primitives", + "alloy-rlp", + "serde", +] + +[[package]] +name = "alloy-eips" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f923dd5fca5f67a43d81ed3ebad0880bd41f6dd0ada930030353ac356c54cd0f" +dependencies = [ + "alloy-eip2930", + "alloy-eip7702", "alloy-primitives", "alloy-rlp", "alloy-serde", "c-kzg", + "derive_more", "once_cell", "serde", + "sha2", ] [[package]] name = "alloy-genesis" -version = "0.1.0" -source = "git+https://github.com/alloy-rs/alloy?rev=8c9dd0a#8c9dd0ae0a0f12eb81b5afe75a9b55ea4ad3abf4" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a7a18afb0b318616b6b2b0e2e7ac5529d32a966c673b48091c9919e284e6aca" +dependencies = [ + "alloy-primitives", + "alloy-serde", + "serde", +] + +[[package]] +name = "alloy-network-primitives" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94ad40869867ed2d9cd3842b1e800889e5b49e6b92da346e93862b4a741bedf3" dependencies = [ + "alloy-eips", "alloy-primitives", "alloy-serde", "serde", @@ -118,16 +159,15 @@ dependencies = [ [[package]] name = "alloy-primitives" -version = "0.7.7" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccb3ead547f4532bc8af961649942f0b9c16ee9226e26caa3f38420651cc0bf4" +checksum = "411aff151f2a73124ee473708e82ed51b2535f68928b6a1caa8bc1246ae6f7cd" dependencies = [ "alloy-rlp", "bytes", "cfg-if", "const-hex", "derive_more", - "ethereum_ssz", "getrandom", "hex-literal", "itoa", @@ -159,59 +199,140 @@ checksum = "4d0f2d905ebd295e7effec65e5f6868d153936130ae718352771de3e7d03c75c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.66", + "syn 2.0.77", ] [[package]] name = "alloy-rpc-types" -version = "0.1.0" -source = "git+https://github.com/alloy-rs/alloy?rev=8c9dd0a#8c9dd0ae0a0f12eb81b5afe75a9b55ea4ad3abf4" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64333d639f2a0cf73491813c629a405744e16343a4bc5640931be707c345ecc5" +dependencies = [ + "alloy-rpc-types-engine", + "alloy-rpc-types-eth", + "alloy-serde", + "serde", +] + +[[package]] +name = "alloy-rpc-types-admin" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fefd12e99dd6b7de387ed13ad047ce2c90d8950ca62fc48b8a457ebb8f936c61" dependencies = [ - "alloy-consensus", - "alloy-eips", "alloy-genesis", "alloy-primitives", - "alloy-rlp", - "alloy-serde", - "alloy-sol-types", - "itertools 0.12.1", - "jsonrpsee-types", "serde", "serde_json", +] + +[[package]] +name = "alloy-rpc-types-anvil" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d25cb45ad7c0930dd62eecf164d2afe4c3d2dd2c82af85680ad1f118e1e5cb83" +dependencies = [ + "alloy-primitives", + "alloy-serde", + "serde", +] + +[[package]] +name = "alloy-rpc-types-beacon" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e7081d2206dca51ce23a06338d78d9b536931cc3f15134fc1c6535eb2b77f18" +dependencies = [ + "alloy-eips", + "alloy-primitives", + "alloy-rpc-types-engine", + "serde", + "serde_with", "thiserror", ] [[package]] name = "alloy-rpc-types-engine" -version = "0.1.0" -source = "git+https://github.com/alloy-rs/alloy?rev=8c9dd0a#8c9dd0ae0a0f12eb81b5afe75a9b55ea4ad3abf4" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1464c4dd646e1bdfde86ae65ce5ba168dbb29180b478011fe87117ae46b1629b" dependencies = [ "alloy-consensus", + "alloy-eips", "alloy-primitives", "alloy-rlp", - "alloy-rpc-types", "alloy-serde", - "jsonrpsee-types", + "derive_more", + "jsonrpsee-types 0.24.4", "serde", - "thiserror", +] + +[[package]] +name = "alloy-rpc-types-eth" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83aa984386deda02482660aa31cb8ca1e63d533f1c31a52d7d181ac5ec68e9b8" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-network-primitives", + "alloy-primitives", + "alloy-rlp", + "alloy-serde", + "alloy-sol-types", + "cfg-if", + "derive_more", + "hashbrown 0.14.5", + "itertools 0.13.0", + "jsonrpsee-types 0.24.4", + "serde", + "serde_json", +] + +[[package]] +name = "alloy-rpc-types-mev" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "922d92389e5022650c4c60ffd2f9b2467c3f853764f0f74ff16a23106f9017d5" +dependencies = [ + "alloy-eips", + "alloy-primitives", + "alloy-serde", + "serde", + "serde_json", ] [[package]] name = "alloy-rpc-types-trace" -version = "0.1.0" -source = "git+https://github.com/alloy-rs/alloy?rev=8c9dd0a#8c9dd0ae0a0f12eb81b5afe75a9b55ea4ad3abf4" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98db35cd42c90b484377e6bc44d95377a7a38a5ebee996e67754ac0446d542ab" dependencies = [ "alloy-primitives", - "alloy-rpc-types", + "alloy-rpc-types-eth", "alloy-serde", "serde", "serde_json", + "thiserror", +] + +[[package]] +name = "alloy-rpc-types-txpool" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6bac37082c3b21283b3faf5cc0e08974272aee2f756ce1adeb26db56a5fce0d5" +dependencies = [ + "alloy-primitives", + "alloy-rpc-types-eth", + "alloy-serde", + "serde", ] [[package]] name = "alloy-serde" -version = "0.1.0" -source = "git+https://github.com/alloy-rs/alloy?rev=8c9dd0a#8c9dd0ae0a0f12eb81b5afe75a9b55ea4ad3abf4" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "731f75ec5d383107fd745d781619bd9cedf145836c51ecb991623d41278e71fa" dependencies = [ "alloy-primitives", "serde", @@ -220,56 +341,56 @@ dependencies = [ [[package]] name = "alloy-sol-macro" -version = "0.7.7" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b40397ddcdcc266f59f959770f601ce1280e699a91fc1862f29cef91707cd09" +checksum = "0458ccb02a564228fcd76efb8eb5a520521a8347becde37b402afec9a1b83859" dependencies = [ "alloy-sol-macro-expander", "alloy-sol-macro-input", - "proc-macro-error", + "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.66", + "syn 2.0.77", ] [[package]] name = "alloy-sol-macro-expander" -version = "0.7.7" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "867a5469d61480fea08c7333ffeca52d5b621f5ca2e44f271b117ec1fc9a0525" +checksum = "2bc65475025fc1e84bf86fc840f04f63fcccdcf3cf12053c99918e4054dfbc69" dependencies = [ "alloy-sol-macro-input", "const-hex", "heck 0.5.0", "indexmap 2.2.6", - "proc-macro-error", + "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.66", + "syn 2.0.77", "syn-solidity", "tiny-keccak", ] [[package]] name = "alloy-sol-macro-input" -version = "0.7.7" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e482dc33a32b6fadbc0f599adea520bd3aaa585c141a80b404d0a3e3fa72528" +checksum = "6ed10f0715a0b69fde3236ff3b9ae5f6f7c97db5a387747100070d3016b9266b" dependencies = [ "const-hex", "dunce", "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.66", + "syn 2.0.77", "syn-solidity", ] [[package]] name = "alloy-sol-types" -version = "0.7.7" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a91ca40fa20793ae9c3841b83e74569d1cc9af29a2f5237314fd3452d51e38c7" +checksum = "1eb88e4da0a1b697ed6a9f811fdba223cf4d5c21410804fd1707836af73a462b" dependencies = [ "alloy-primitives", "alloy-sol-macro", @@ -502,7 +623,7 @@ checksum = "c6fa2087f2753a7da8cc1c0dbfcf89579dd57458e36769de5ac750b4671737ca" dependencies = [ "proc-macro2", "quote", - "syn 2.0.66", + "syn 2.0.77", ] [[package]] @@ -524,7 +645,7 @@ checksum = "3c87f3f15e7794432337fc718554eaa4dc8f04c9677a950ffe366f20a162ae42" dependencies = [ "proc-macro2", "quote", - "syn 2.0.66", + "syn 2.0.77", ] [[package]] @@ -689,9 +810,9 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.6.0" +version = "1.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9" +checksum = "428d9aa8fbc0670b7b8d6030a7fadd0f86151cae55e4dbbece15f3780a3dfaf3" dependencies = [ "serde", ] @@ -737,7 +858,7 @@ dependencies = [ "iana-time-zone", "num-traits", "serde", - "windows-targets 0.52.5", + "windows-targets 0.52.6", ] [[package]] @@ -780,7 +901,7 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.66", + "syn 2.0.77", ] [[package]] @@ -841,12 +962,6 @@ dependencies = [ "unicode-xid", ] -[[package]] -name = "convert_case" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" - [[package]] name = "core-foundation" version = "0.9.4" @@ -942,7 +1057,7 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.66", + "syn 2.0.77", ] [[package]] @@ -990,7 +1105,7 @@ dependencies = [ "proc-macro2", "quote", "strsim 0.11.1", - "syn 2.0.66", + "syn 2.0.77", ] [[package]] @@ -1012,7 +1127,7 @@ checksum = "733cabb43482b1a1b53eee8583c2b9e8684d592215ea83efd305dd31bc2f0178" dependencies = [ "darling_core 0.20.9", "quote", - "syn 2.0.66", + "syn 2.0.77", ] [[package]] @@ -1058,15 +1173,23 @@ dependencies = [ [[package]] name = "derive_more" -version = "0.99.18" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f33878137e4dafd7fa914ad4e259e18a4e8e532b9617a2d0150262bf53abfce" +checksum = "4a9b99b9cbbe49445b21764dc0625032a89b145a2642e67603e1c936f5458d05" +dependencies = [ + "derive_more-impl", +] + +[[package]] +name = "derive_more-impl" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22" dependencies = [ - "convert_case", "proc-macro2", "quote", - "rustc_version 0.4.0", - "syn 2.0.66", + "syn 2.0.77", + "unicode-xid", ] [[package]] @@ -1196,15 +1319,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "encoding_rs" -version = "0.8.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b45de904aa0b010bce2ab45264d0631681847fa7b6f2eaa7dab7619943bc4f59" -dependencies = [ - "cfg-if", -] - [[package]] name = "enr" version = "0.10.0" @@ -1219,7 +1333,6 @@ dependencies = [ "log", "rand", "rlp", - "secp256k1 0.27.0", "serde", "sha3 0.10.8", "zeroize", @@ -1254,7 +1367,7 @@ dependencies = [ [[package]] name = "eth_trie" version = "0.4.0" -source = "git+https://github.com/kolbyml/eth-trie.rs.git?rev=7e57d3dfadee126cc9fda2696fb039bf7b6ed688#7e57d3dfadee126cc9fda2696fb039bf7b6ed688" +source = "git+https://github.com/ethereum/eth-trie.rs?tag=v0.1.0-alpha.2#46da867d8a7eace0a9e912271b236b2007e4cd41" dependencies = [ "alloy-primitives", "alloy-rlp", @@ -1264,52 +1377,24 @@ dependencies = [ "parking_lot 0.12.3", ] -[[package]] -name = "ethbloom" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c22d4b5885b6aa2fe5e8b9329fb8d232bf739e434e6b87347c63bdd00c120f60" -dependencies = [ - "crunchy", - "fixed-hash", - "impl-rlp", - "impl-serde", - "tiny-keccak", -] - -[[package]] -name = "ethereum-types" -version = "0.14.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02d215cbf040552efcbe99a38372fe80ab9d00268e20012b79fcd0f073edd8ee" -dependencies = [ - "ethbloom", - "fixed-hash", - "impl-rlp", - "impl-serde", - "primitive-types", - "uint", -] - [[package]] name = "ethereum_hashing" -version = "0.6.0" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ea7b408432c13f71af01197b1d3d0069c48a27bfcfbe72a81fc346e47f6defb" +checksum = "c853bd72c9e5787f8aafc3df2907c2ed03cff3150c3acd94e2e53a98ab70a8ab" dependencies = [ "cpufeatures", - "lazy_static", "ring", "sha2", ] [[package]] name = "ethereum_serde_utils" -version = "0.5.2" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de4d5951468846963c24e8744c133d44f39dff2cd3a233f6be22b370d08a524f" +checksum = "70cbccfccf81d67bff0ab36e591fa536c8a935b078a7b0e58c1d00d418332fc9" dependencies = [ - "ethereum-types", + "alloy-primitives", "hex", "serde", "serde_derive", @@ -1318,32 +1403,33 @@ dependencies = [ [[package]] name = "ethereum_ssz" -version = "0.5.4" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d3627f83d8b87b432a5fad9934b4565260722a141a2c40f371f8080adec9425" +checksum = "1e999563461faea0ab9bc0024e5e66adcee35881f3d5062f52f31a4070fe1522" dependencies = [ - "ethereum-types", - "itertools 0.10.5", + "alloy-primitives", + "itertools 0.13.0", "smallvec", ] [[package]] name = "ethereum_ssz_derive" -version = "0.5.4" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8eccd5378ec34a07edd3d9b48088cbc63309d0367d14ba10b0cdb1d1791080ea" +checksum = "f3deae99c8e74829a00ba7a92d49055732b3c1f093f2ccfa3cbc621679b6fa91" dependencies = [ - "darling 0.13.4", + "darling 0.20.9", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.77", ] [[package]] name = "ethportal-api" version = "0.2.2" -source = "git+https://github.com/ethereum/trin?rev=688847c64c1ef15df20828aa44ef871d3345fc98#688847c64c1ef15df20828aa44ef871d3345fc98" +source = "git+https://github.com/ethereum/trin?rev=c416cd9faf933f89b44a517ca7ada144bf2baee9#c416cd9faf933f89b44a517ca7ada144bf2baee9" dependencies = [ + "alloy-consensus", "alloy-primitives", "alloy-rlp", "anyhow", @@ -1370,7 +1456,7 @@ dependencies = [ "reth-rpc-types", "rlp", "rs_merkle", - "secp256k1 0.29.0", + "secp256k1", "serde", "serde-this-or-that", "serde_json", @@ -1526,7 +1612,7 @@ checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", - "syn 2.0.66", + "syn 2.0.77", ] [[package]] @@ -1636,7 +1722,7 @@ dependencies = [ "futures-core", "futures-sink", "gloo-utils", - "http", + "http 0.2.12", "js-sys", "pin-project", "serde", @@ -1694,7 +1780,7 @@ dependencies = [ "futures-core", "futures-sink", "futures-util", - "http", + "http 0.2.12", "indexmap 2.2.6", "slab", "tokio", @@ -1716,6 +1802,7 @@ checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" dependencies = [ "ahash", "allocator-api2", + "serde", ] [[package]] @@ -1772,7 +1859,7 @@ checksum = "6fe2267d4ed49bc07b63801559be28c718ea06c4738b7a03c94df7386d2cde46" [[package]] name = "hivesim" version = "0.1.0-alpha.1" -source = "git+https://github.com/ethereum/hive?rev=81fc9a350d7f7ca8bcbe5f54886483d405d4daa8#81fc9a350d7f7ca8bcbe5f54886483d405d4daa8" +source = "git+https://github.com/ethereum/hive?rev=5c589295dae3eb896a5cb71ee639ab01add911a5#5c589295dae3eb896a5cb71ee639ab01add911a5" dependencies = [ "async-trait", "dyn-clone", @@ -1813,6 +1900,17 @@ dependencies = [ "itoa", ] +[[package]] +name = "http" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + [[package]] name = "http-body" version = "0.4.6" @@ -1820,7 +1918,30 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" dependencies = [ "bytes", - "http", + "http 0.2.12", + "pin-project-lite", +] + +[[package]] +name = "http-body" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +dependencies = [ + "bytes", + "http 1.1.0", +] + +[[package]] +name = "http-body-util" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" +dependencies = [ + "bytes", + "futures-util", + "http 1.1.0", + "http-body 1.0.1", "pin-project-lite", ] @@ -1847,8 +1968,8 @@ dependencies = [ "futures-core", "futures-util", "h2", - "http", - "http-body", + "http 0.2.12", + "http-body 0.4.6", "httparse", "httpdate", "itoa", @@ -1860,6 +1981,25 @@ dependencies = [ "want", ] +[[package]] +name = "hyper" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50dfd22e0e76d0f662d429a5f80fcaf3855009297eab6a0a9f8543834744ba05" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "http 1.1.0", + "http-body 1.0.1", + "httparse", + "itoa", + "pin-project-lite", + "smallvec", + "tokio", + "want", +] + [[package]] name = "hyper-rustls" version = "0.24.2" @@ -1867,8 +2007,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" dependencies = [ "futures-util", - "http", - "hyper", + "http 0.2.12", + "hyper 0.14.29", "log", "rustls", "rustls-native-certs", @@ -1876,6 +2016,26 @@ dependencies = [ "tokio-rustls", ] +[[package]] +name = "hyper-util" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da62f120a8a37763efb0cf8fdf264b884c7b8b9ac8660b900c8661030c00e6ba" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "http 1.1.0", + "http-body 1.0.1", + "hyper 1.4.1", + "pin-project-lite", + "socket2 0.5.7", + "tokio", + "tower", + "tower-service", + "tracing", +] + [[package]] name = "iana-time-zone" version = "0.1.60" @@ -1941,24 +2101,6 @@ dependencies = [ "parity-scale-codec", ] -[[package]] -name = "impl-rlp" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f28220f89297a075ddc7245cd538076ee98b01f2a9c23a53a4f1105d5a322808" -dependencies = [ - "rlp", -] - -[[package]] -name = "impl-serde" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebc88fc67028ae3db0c853baa36269d398d5f45b6982f95549ff5def78c935cd" -dependencies = [ - "serde", -] - [[package]] name = "impl-trait-for-tuples" version = "0.2.2" @@ -2030,9 +2172,9 @@ dependencies = [ [[package]] name = "itertools" -version = "0.12.1" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" dependencies = [ "either", ] @@ -2072,7 +2214,7 @@ dependencies = [ "jsonrpsee-http-client", "jsonrpsee-proc-macros", "jsonrpsee-server", - "jsonrpsee-types", + "jsonrpsee-types 0.20.3", "jsonrpsee-wasm-client", "jsonrpsee-ws-client", "tokio", @@ -2088,7 +2230,7 @@ dependencies = [ "futures-channel", "futures-util", "gloo-net", - "http", + "http 0.2.12", "jsonrpsee-core", "pin-project", "rustls-native-certs", @@ -2114,8 +2256,8 @@ dependencies = [ "beef", "futures-timer", "futures-util", - "hyper", - "jsonrpsee-types", + "hyper 0.14.29", + "jsonrpsee-types 0.20.3", "parking_lot 0.12.3", "rand", "rustc-hash", @@ -2135,10 +2277,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f80c17f62c7653ce767e3d7288b793dfec920f97067ceb189ebdd3570f2bc20" dependencies = [ "async-trait", - "hyper", + "hyper 0.14.29", "hyper-rustls", "jsonrpsee-core", - "jsonrpsee-types", + "jsonrpsee-types 0.20.3", "serde", "serde_json", "thiserror", @@ -2168,10 +2310,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "82c39a00449c9ef3f50b84fc00fc4acba20ef8f559f07902244abf4c15c5ab9c" dependencies = [ "futures-util", - "http", - "hyper", + "http 0.2.12", + "hyper 0.14.29", "jsonrpsee-core", - "jsonrpsee-types", + "jsonrpsee-types 0.20.3", "route-recognizer", "serde", "serde_json", @@ -2198,6 +2340,18 @@ dependencies = [ "tracing", ] +[[package]] +name = "jsonrpsee-types" +version = "0.24.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "531e386460425e49679587871a056f2895a47dade21457324ad1262cd78ef6d9" +dependencies = [ + "http 1.1.0", + "serde", + "serde_json", + "thiserror", +] + [[package]] name = "jsonrpsee-wasm-client" version = "0.20.3" @@ -2206,7 +2360,7 @@ checksum = "7c7cbb3447cf14fd4d2f407c3cc96e6c9634d5440aa1fbed868a31f3c02b27f0" dependencies = [ "jsonrpsee-client-transport", "jsonrpsee-core", - "jsonrpsee-types", + "jsonrpsee-types 0.20.3", ] [[package]] @@ -2215,10 +2369,10 @@ version = "0.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bca9cb3933ccae417eb6b08c3448eb1cb46e39834e5b503e395e5e5bd08546c0" dependencies = [ - "http", + "http 0.2.12", "jsonrpsee-client-transport", "jsonrpsee-core", - "jsonrpsee-types", + "jsonrpsee-types 0.20.3", "url", ] @@ -2501,6 +2655,88 @@ version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" +[[package]] +name = "op-alloy-consensus" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21aad1fbf80d2bcd7406880efc7ba109365f44bbb72896758ddcbfa46bf1592c" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-primitives", + "alloy-rlp", + "alloy-serde", + "derive_more", + "serde", + "spin", +] + +[[package]] +name = "op-alloy-genesis" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e1b8a9b70da0e027242ec1762f0f3a386278b6291d00d12ff5a64929dc19f68" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-primitives", + "alloy-sol-types", + "serde", + "serde_repr", +] + +[[package]] +name = "op-alloy-protocol" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf300a82ae2d30e2255bfea87a2259da49f63a25a44db561ae64cc9e3084139f" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-primitives", + "alloy-rlp", + "alloy-serde", + "hashbrown 0.14.5", + "op-alloy-consensus", + "op-alloy-genesis", + "serde", +] + +[[package]] +name = "op-alloy-rpc-types" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e281fbfc2198b7c0c16457d6524f83d192662bc9f3df70f24c3038d4521616df" +dependencies = [ + "alloy-eips", + "alloy-network-primitives", + "alloy-primitives", + "alloy-rpc-types-eth", + "alloy-serde", + "cfg-if", + "hashbrown 0.14.5", + "op-alloy-consensus", + "serde", + "serde_json", +] + +[[package]] +name = "op-alloy-rpc-types-engine" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2947272a81ebf988f4804b6f0f6a7c0b2f6f89a908cb410e36f8f3828f81c778" +dependencies = [ + "alloy-eips", + "alloy-primitives", + "alloy-rpc-types-engine", + "alloy-serde", + "derive_more", + "op-alloy-consensus", + "op-alloy-genesis", + "op-alloy-protocol", + "serde", +] + [[package]] name = "opaque-debug" version = "0.3.1" @@ -2590,7 +2826,7 @@ dependencies = [ "libc", "redox_syscall 0.5.2", "smallvec", - "windows-targets 0.52.5", + "windows-targets 0.52.6", ] [[package]] @@ -2633,7 +2869,7 @@ checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" dependencies = [ "proc-macro2", "quote", - "syn 2.0.66", + "syn 2.0.77", ] [[package]] @@ -2682,7 +2918,6 @@ version = "0.1.0" dependencies = [ "alloy-primitives", "alloy-rlp", - "enr", "ethportal-api", "futures", "hivesim", @@ -2714,8 +2949,6 @@ checksum = "0b34d9fd68ae0b74a41b21c03c2f62847aa0ffea044eee893b4c140b37e244e2" dependencies = [ "fixed-hash", "impl-codec", - "impl-rlp", - "impl-serde", "uint", ] @@ -2762,6 +2995,28 @@ dependencies = [ "version_check", ] +[[package]] +name = "proc-macro-error-attr2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5" +dependencies = [ + "proc-macro2", + "quote", +] + +[[package]] +name = "proc-macro-error2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802" +dependencies = [ + "proc-macro-error-attr2", + "proc-macro2", + "quote", + "syn 2.0.77", +] + [[package]] name = "proc-macro2" version = "1.0.85" @@ -2926,19 +3181,19 @@ checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" [[package]] name = "reqwest" -version = "0.11.27" +version = "0.12.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" +checksum = "f8f4955649ef5c38cc7f9e8aa41761d48fb9677197daea9984dc54f56aad5e63" dependencies = [ - "base64 0.21.7", + "base64 0.22.1", "bytes", - "encoding_rs", "futures-core", "futures-util", - "h2", - "http", - "http-body", - "hyper", + "http 1.1.0", + "http-body 1.0.1", + "http-body-util", + "hyper 1.4.1", + "hyper-util", "ipnet", "js-sys", "log", @@ -2951,35 +3206,33 @@ dependencies = [ "serde_json", "serde_urlencoded", "sync_wrapper", - "system-configuration", "tokio", "tower-service", "url", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", - "winreg", + "windows-registry", ] [[package]] name = "reth-rpc-types" -version = "0.2.0-beta.5" -source = "git+https://github.com/paradigmxyz/reth.git?rev=8d1d13ef89cf19459adc37ba0c45e7aac6270dc1#8d1d13ef89cf19459adc37ba0c45e7aac6270dc1" +version = "1.0.6" +source = "git+https://github.com/paradigmxyz/reth.git?tag=v1.0.6#c228fe15808c3acbf18dc3af1a03ef5cbdcda07a" dependencies = [ - "alloy-genesis", "alloy-primitives", - "alloy-rlp", "alloy-rpc-types", + "alloy-rpc-types-admin", + "alloy-rpc-types-anvil", + "alloy-rpc-types-beacon", "alloy-rpc-types-engine", + "alloy-rpc-types-mev", "alloy-rpc-types-trace", - "enr", - "jsonrpsee-types", - "secp256k1 0.27.0", - "serde", - "serde_json", - "serde_with", - "thiserror", - "url", + "alloy-rpc-types-txpool", + "alloy-serde", + "jsonrpsee-types 0.24.4", + "op-alloy-rpc-types", + "op-alloy-rpc-types-engine", ] [[package]] @@ -3042,7 +3295,6 @@ dependencies = [ "ark-ff 0.3.0", "ark-ff 0.4.2", "bytes", - "ethereum_ssz", "fastrlp", "num-bigint", "num-traits", @@ -3212,15 +3464,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "secp256k1" -version = "0.27.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25996b82292a7a57ed3508f052cfff8640d38d32018784acd714758b43da9c8f" -dependencies = [ - "secp256k1-sys 0.8.1", -] - [[package]] name = "secp256k1" version = "0.29.0" @@ -3228,16 +3471,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0e0cc0f1cf93f4969faf3ea1c7d8a9faed25918d96affa959720823dfe86d4f3" dependencies = [ "rand", - "secp256k1-sys 0.10.0", -] - -[[package]] -name = "secp256k1-sys" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70a129b9e9efbfb223753b9163c4ab3b13cff7fd9c7f010fbac25ab4099fa07e" -dependencies = [ - "cc", + "secp256k1-sys", ] [[package]] @@ -3328,7 +3562,7 @@ checksum = "500cbc0ebeb6f46627f50f3f5811ccf6bf00643be300b4c3eabc0ef55dc5b5ba" dependencies = [ "proc-macro2", "quote", - "syn 2.0.66", + "syn 2.0.77", ] [[package]] @@ -3342,6 +3576,17 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_repr" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.77", +] + [[package]] name = "serde_urlencoded" version = "0.7.1" @@ -3381,7 +3626,7 @@ dependencies = [ "darling 0.20.9", "proc-macro2", "quote", - "syn 2.0.66", + "syn 2.0.77", ] [[package]] @@ -3538,7 +3783,7 @@ dependencies = [ "base64 0.13.1", "bytes", "futures", - "http", + "http 0.2.12", "httparse", "log", "rand", @@ -3550,6 +3795,9 @@ name = "spin" version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +dependencies = [ + "lock_api", +] [[package]] name = "spki" @@ -3563,13 +3811,14 @@ dependencies = [ [[package]] name = "ssz_types" -version = "0.6.0" -source = "git+https://github.com/KolbyML/ssz_types.git?rev=2a5922de75f00746890bf4ea9ad663c9d5d58efe#2a5922de75f00746890bf4ea9ad663c9d5d58efe" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35e0719d2b86ac738a55ae71a8429f52aa2741da988f1fd0975b4cc610fd1e08" dependencies = [ "derivative", "ethereum_serde_utils", "ethereum_ssz", - "itertools 0.10.5", + "itertools 0.13.0", "serde", "serde_derive", "smallvec", @@ -3628,9 +3877,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.66" +version = "2.0.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c42f3f41a2de00b01c0aaad383c5a45241efc8b2d1eda5661812fda5f3cdcff5" +checksum = "9f35bcdf61fd8e7be6caf75f429fdca8beb3ed76584befb503b1569faee373ed" dependencies = [ "proc-macro2", "quote", @@ -3639,41 +3888,23 @@ dependencies = [ [[package]] name = "syn-solidity" -version = "0.7.7" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c837dc8852cb7074e46b444afb81783140dab12c58867b49fb3898fbafedf7ea" +checksum = "4b95156f8b577cb59dc0b1df15c6f29a10afc5f8a7ac9786b0b5c68c19149278" dependencies = [ "paste", "proc-macro2", "quote", - "syn 2.0.66", + "syn 2.0.77", ] [[package]] name = "sync_wrapper" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" - -[[package]] -name = "system-configuration" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" -dependencies = [ - "bitflags 1.3.2", - "core-foundation", - "system-configuration-sys", -] - -[[package]] -name = "system-configuration-sys" -version = "0.5.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" +checksum = "a7065abeca94b6a8a577f9bd45aa0867a2238b74e8eb67cf10d492bc39351394" dependencies = [ - "core-foundation-sys", - "libc", + "futures-core", ] [[package]] @@ -3711,7 +3942,7 @@ checksum = "46c3384250002a6d5af4d114f2845d37b57521033f30d5c3f46c4d70e1197533" dependencies = [ "proc-macro2", "quote", - "syn 2.0.66", + "syn 2.0.77", ] [[package]] @@ -3817,7 +4048,7 @@ checksum = "5f5ae998a069d4b5aba8ee9dad856af7d520c3699e6159b185c2acd48155d39a" dependencies = [ "proc-macro2", "quote", - "syn 2.0.66", + "syn 2.0.77", ] [[package]] @@ -3894,6 +4125,7 @@ dependencies = [ "futures-util", "pin-project", "pin-project-lite", + "tokio", "tower-layer", "tower-service", "tracing", @@ -3931,7 +4163,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.66", + "syn 2.0.77", ] [[package]] @@ -3975,8 +4207,9 @@ dependencies = [ [[package]] name = "tree_hash" -version = "0.6.0" -source = "git+https://github.com/KolbyML/tree_hash.git?rev=8aaf8bb4184148768d48e2cfbbdd0b95d1da8730#8aaf8bb4184148768d48e2cfbbdd0b95d1da8730" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "373495c23db675a5192de8b610395e1bec324d596f9e6111192ce903dc11403a" dependencies = [ "alloy-primitives", "ethereum_hashing", @@ -3985,18 +4218,20 @@ dependencies = [ [[package]] name = "tree_hash_derive" -version = "0.6.0" -source = "git+https://github.com/KolbyML/tree_hash.git?rev=8aaf8bb4184148768d48e2cfbbdd0b95d1da8730#8aaf8bb4184148768d48e2cfbbdd0b95d1da8730" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0857056ca4eb5de8c417309be42bcff6017b47e86fbaddde609b4633f66061e" dependencies = [ - "darling 0.13.4", + "darling 0.20.9", + "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.77", ] [[package]] name = "trin-utils" version = "0.1.1-alpha.1" -source = "git+https://github.com/ethereum/trin?rev=688847c64c1ef15df20828aa44ef871d3345fc98#688847c64c1ef15df20828aa44ef871d3345fc98" +source = "git+https://github.com/ethereum/trin?rev=c416cd9faf933f89b44a517ca7ada144bf2baee9#c416cd9faf933f89b44a517ca7ada144bf2baee9" dependencies = [ "ansi_term", "atty", @@ -4264,7 +4499,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.66", + "syn 2.0.77", "wasm-bindgen-shared", ] @@ -4298,7 +4533,7 @@ checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.66", + "syn 2.0.77", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -4353,7 +4588,37 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" dependencies = [ - "windows-targets 0.52.5", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-registry" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e400001bb720a623c1c69032f8e3e4cf09984deec740f007dd2b03ec864804b0" +dependencies = [ + "windows-result", + "windows-strings", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-result" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-strings" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" +dependencies = [ + "windows-result", + "windows-targets 0.52.6", ] [[package]] @@ -4371,7 +4636,7 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets 0.52.5", + "windows-targets 0.52.6", ] [[package]] @@ -4391,18 +4656,18 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" dependencies = [ - "windows_aarch64_gnullvm 0.52.5", - "windows_aarch64_msvc 0.52.5", - "windows_i686_gnu 0.52.5", + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", "windows_i686_gnullvm", - "windows_i686_msvc 0.52.5", - "windows_x86_64_gnu 0.52.5", - "windows_x86_64_gnullvm 0.52.5", - "windows_x86_64_msvc 0.52.5", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", ] [[package]] @@ -4413,9 +4678,9 @@ checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" [[package]] name = "windows_aarch64_gnullvm" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" [[package]] name = "windows_aarch64_msvc" @@ -4425,9 +4690,9 @@ checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" [[package]] name = "windows_aarch64_msvc" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" [[package]] name = "windows_i686_gnu" @@ -4437,15 +4702,15 @@ checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" [[package]] name = "windows_i686_gnu" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" [[package]] name = "windows_i686_gnullvm" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" [[package]] name = "windows_i686_msvc" @@ -4455,9 +4720,9 @@ checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" [[package]] name = "windows_i686_msvc" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" [[package]] name = "windows_x86_64_gnu" @@ -4467,9 +4732,9 @@ checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" [[package]] name = "windows_x86_64_gnu" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" [[package]] name = "windows_x86_64_gnullvm" @@ -4479,9 +4744,9 @@ checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" [[package]] name = "windows_x86_64_gnullvm" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" [[package]] name = "windows_x86_64_msvc" @@ -4491,9 +4756,9 @@ checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" [[package]] name = "windows_x86_64_msvc" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "winnow" @@ -4504,16 +4769,6 @@ dependencies = [ "memchr", ] -[[package]] -name = "winreg" -version = "0.50.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" -dependencies = [ - "cfg-if", - "windows-sys 0.48.0", -] - [[package]] name = "wyz" version = "0.5.1" @@ -4540,7 +4795,7 @@ checksum = "15e934569e47891f7d9411f1a451d947a60e000ab3bd24fbb970f000387d1b3b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.66", + "syn 2.0.77", ] [[package]] @@ -4560,5 +4815,5 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.66", + "syn 2.0.77", ] diff --git a/simulators/portal/Cargo.toml b/simulators/portal/Cargo.toml index a20b57cf97..db51d49f20 100755 --- a/simulators/portal/Cargo.toml +++ b/simulators/portal/Cargo.toml @@ -6,16 +6,14 @@ edition = "2021" [dependencies] alloy-rlp = "0.3.8" -alloy-primitives = "0.7.7" -# todo: remove this when we update discv5. Added this because enr 10.1 is a breaking change -enr = { version = "=0.10.0", features = ["k256", "ed25519"] } -ethportal-api = { git = "https://github.com/ethereum/trin", rev = "688847c64c1ef15df20828aa44ef871d3345fc98" } +alloy-primitives = "0.8.0" +ethportal-api = { git = "https://github.com/ethereum/trin", rev = "c416cd9faf933f89b44a517ca7ada144bf2baee9" } futures = "0.3.25" -hivesim = { git = "https://github.com/ethereum/hive", rev = "81fc9a350d7f7ca8bcbe5f54886483d405d4daa8" } +hivesim = { git = "https://github.com/ethereum/hive", rev = "5c589295dae3eb896a5cb71ee639ab01add911a5" } itertools = "0.10.5" -serde_json = "1.0.87" -serde_yaml = "0.9" -tokio = { version = "1", features = ["full"] } +serde_json = "1.0.95" +serde_yaml = "0.9.33" +tokio = { version = "1.14.0", features = ["full"] } tracing = "0.1.37" tracing-subscriber = "0.3.16" diff --git a/simulators/portal/Dockerfile b/simulators/portal/Dockerfile index 73b9d0305b..f23ed7cd78 100644 --- a/simulators/portal/Dockerfile +++ b/simulators/portal/Dockerfile @@ -1,4 +1,4 @@ -FROM rust:1.79.0 AS builder +FROM rust:1.81.0 AS builder # create a new empty shell project RUN USER=root cargo new --bin portal diff --git a/simulators/portal/src/suites/beacon/interop.rs b/simulators/portal/src/suites/beacon/interop.rs index 248703ed4a..add82c01b8 100644 --- a/simulators/portal/src/suites/beacon/interop.rs +++ b/simulators/portal/src/suites/beacon/interop.rs @@ -1,8 +1,11 @@ use std::collections::HashMap; +use std::str::FromStr; use crate::suites::beacon::constants::{TEST_DATA_FILE_PATH, TRIN_BRIDGE_CLIENT_TYPE}; use crate::suites::environment::PortalNetwork; -use ethportal_api::types::beacon::ContentInfo; +use alloy_primitives::Bytes; +use ethportal_api::types::portal::ContentInfo; +use ethportal_api::types::portal_wire::MAX_PORTAL_CONTENT_PAYLOAD_SIZE; use ethportal_api::utils::bytes::hex_encode; use ethportal_api::{ BeaconContentKey, BeaconContentValue, BeaconNetworkApiClient, ContentValue, Discv5ApiClient, @@ -13,8 +16,6 @@ use itertools::Itertools; use serde_json::json; use serde_yaml::Value; -// This is taken from Trin. It should be fairly standard -const MAX_PORTAL_CONTENT_PAYLOAD_SIZE: usize = 1165; const BOOTSTRAP_KEY: &str = "0x10bd9f42d9a42d972bdaf4dee84e5b419dd432b52867258acb7bcc7f567b6e3af1"; type TestData = (BeaconContentKey, BeaconContentValue); @@ -83,9 +84,9 @@ dyn_async! { let values: Value = serde_yaml::from_str(&values).unwrap(); let content: Vec<(BeaconContentKey, BeaconContentValue)> = values.as_sequence().unwrap().iter().map(|value| { let content_key: BeaconContentKey = - serde_yaml::from_value(value.get("content_key").unwrap().clone()).unwrap(); - let content_value: BeaconContentValue = - serde_yaml::from_value(value.get("content_value").unwrap().clone()).unwrap(); + serde_yaml::from_value(value["content_key"].clone()).unwrap(); + let raw_content_value = Bytes::from_str(value["content_value"].as_str().unwrap()).unwrap(); + let content_value = BeaconContentValue::decode(&content_key, raw_content_value.as_ref()).expect("unable to decode content value"); (content_key, content_value) }).collect(); @@ -285,7 +286,7 @@ dyn_async! { } }; let (target_key, target_value) = test_data; - match client_b.rpc.store(target_key.clone(), target_value.clone()).await { + match client_b.rpc.store(target_key.clone(), target_value.encode()).await { Ok(result) => if !result { panic!("Error storing target content for recursive find content"); }, @@ -313,7 +314,7 @@ dyn_async! { Ok(result) => { match result { ContentInfo::Content{ content, utp_transfer } => { - if content != target_value { + if content != target_value.encode() { panic!("Error: Unexpected RECURSIVEFINDCONTENT response: didn't return expected target content"); } @@ -347,7 +348,7 @@ dyn_async! { } }; let (target_key, target_value) = test_data; - match client_b.rpc.store(target_key.clone(), target_value.clone()).await { + match client_b.rpc.store(target_key.clone(), target_value.encode()).await { Ok(result) => if !result { panic!("Error storing target content for find content"); }, @@ -367,7 +368,7 @@ dyn_async! { Ok(result) => { match result { ContentInfo::Content{ content, utp_transfer } => { - if content != target_value { + if content != target_value.encode() { panic!("Error: Unexpected FINDCONTENT response: didn't return expected block body"); } diff --git a/simulators/portal/src/suites/beacon/mesh.rs b/simulators/portal/src/suites/beacon/mesh.rs index ee943b7830..5da1dce1bf 100644 --- a/simulators/portal/src/suites/beacon/mesh.rs +++ b/simulators/portal/src/suites/beacon/mesh.rs @@ -3,17 +3,17 @@ use crate::suites::beacon::constants::{ TRIN_BRIDGE_CLIENT_TYPE, }; use crate::suites::environment::PortalNetwork; +use alloy_primitives::Bytes; use ethportal_api::jsonrpsee::core::__reexports::serde_json; -use ethportal_api::types::beacon::ContentInfo; use ethportal_api::types::distance::{Metric, XorMetric}; -use ethportal_api::{ - BeaconContentKey, BeaconContentValue, BeaconNetworkApiClient, Discv5ApiClient, -}; +use ethportal_api::types::portal::ContentInfo; +use ethportal_api::{BeaconContentKey, BeaconNetworkApiClient, Discv5ApiClient}; use hivesim::types::ClientDefinition; use hivesim::{dyn_async, Client, NClientTestSpec, Test}; use itertools::Itertools; use serde_json::json; use std::collections::HashMap; +use std::str::FromStr; dyn_async! { pub async fn test_portal_beacon_mesh<'a> (test: &'a mut Test, _client: Option) { @@ -91,7 +91,7 @@ dyn_async! { }; let content_key: BeaconContentKey = serde_json::from_value(json!(CONSTANT_CONTENT_KEY)).unwrap(); - let content_value: BeaconContentValue = serde_json::from_value(json!(CONSTANT_CONTENT_VALUE)).unwrap(); + let raw_content_value = Bytes::from_str(CONSTANT_CONTENT_VALUE).unwrap(); // get enr for b and c to seed for the jumps let client_b_enr = match client_b.rpc.node_info().await { @@ -123,7 +123,7 @@ dyn_async! { } // seed the data into client_c - match client_c.rpc.store(content_key.clone(), content_value.clone()).await { + match client_c.rpc.store(content_key.clone(), raw_content_value.clone()).await { Ok(result) => if !result { panic!("Unable to store header with proof for find content immediate return test"); }, @@ -156,7 +156,7 @@ dyn_async! { Ok(result) => { match result { ContentInfo::Content{ content, utp_transfer } => { - if content != content_value { + if content != raw_content_value { panic!("Error: Unexpected FINDCONTENT response: didn't return expected header with proof value"); } diff --git a/simulators/portal/src/suites/beacon/rpc_compat.rs b/simulators/portal/src/suites/beacon/rpc_compat.rs index 7fcdd5628e..46f740330d 100644 --- a/simulators/portal/src/suites/beacon/rpc_compat.rs +++ b/simulators/portal/src/suites/beacon/rpc_compat.rs @@ -1,11 +1,12 @@ use std::collections::HashMap; +use std::str::FromStr; use crate::suites::beacon::constants::{ CONSTANT_CONTENT_KEY, CONSTANT_CONTENT_VALUE, TRIN_BRIDGE_CLIENT_TYPE, }; use crate::suites::environment::PortalNetwork; +use alloy_primitives::Bytes; use ethportal_api::types::enr::generate_random_remote_enr; -use ethportal_api::BeaconContentValue; use ethportal_api::Discv5ApiClient; use ethportal_api::{BeaconContentKey, BeaconNetworkApiClient}; use hivesim::types::ClientDefinition; @@ -235,9 +236,9 @@ dyn_async! { } }; let content_key: BeaconContentKey = serde_json::from_value(json!(CONSTANT_CONTENT_KEY)).unwrap(); - let content_value: BeaconContentValue = serde_json::from_value(json!(CONSTANT_CONTENT_VALUE)).unwrap(); + let raw_content_value = Bytes::from_str(CONSTANT_CONTENT_VALUE).expect("unable to convert content value to bytes"); - if let Err(err) = BeaconNetworkApiClient::store(&client.rpc, content_key, content_value).await { + if let Err(err) = BeaconNetworkApiClient::store(&client.rpc, content_key, raw_content_value).await { panic!("{}", &err.to_string()); } } @@ -252,18 +253,18 @@ dyn_async! { } }; let content_key: BeaconContentKey = serde_json::from_value(json!(CONSTANT_CONTENT_KEY)).unwrap(); - let content_value: BeaconContentValue = serde_json::from_value(json!(CONSTANT_CONTENT_VALUE)).unwrap(); + let raw_content_value = Bytes::from_str(CONSTANT_CONTENT_VALUE).expect("unable to convert content value to bytes"); // seed CONTENT_KEY/content_value onto the local node to test local_content expect content present - if let Err(err) = BeaconNetworkApiClient::store(&client.rpc, content_key.clone(), content_value.clone()).await { + if let Err(err) = BeaconNetworkApiClient::store(&client.rpc, content_key.clone(), raw_content_value.clone()).await { panic!("{}", &err.to_string()); } // Here we are calling local_content RPC to test if the content is present match BeaconNetworkApiClient::local_content(&client.rpc, content_key).await { Ok(possible_content) => { - if possible_content != content_value { - panic!("Error receiving content: Expected content: {content_value:?}, Received content: {possible_content:?}"); + if possible_content != raw_content_value { + panic!("Error receiving content: Expected content: {raw_content_value:?}, Received content: {possible_content:?}"); } } Err(err) => { diff --git a/simulators/portal/src/suites/history/interop.rs b/simulators/portal/src/suites/history/interop.rs index 6453ed7790..006556d613 100644 --- a/simulators/portal/src/suites/history/interop.rs +++ b/simulators/portal/src/suites/history/interop.rs @@ -1,6 +1,10 @@ +use std::str::FromStr; + use crate::suites::history::constants::{TEST_DATA_FILE_PATH, TRIN_BRIDGE_CLIENT_TYPE}; use crate::suites::utils::get_flair; -use ethportal_api::types::history::ContentInfo; +use alloy_primitives::Bytes; +use ethportal_api::types::portal::ContentInfo; +use ethportal_api::types::portal_wire::MAX_PORTAL_CONTENT_PAYLOAD_SIZE; use ethportal_api::{ ContentValue, Discv5ApiClient, HistoryContentKey, HistoryContentValue, HistoryNetworkApiClient, }; @@ -11,9 +15,6 @@ use serde_json::json; use serde_yaml::Value; use tokio::time::Duration; -// This is taken from Trin. It should be fairly standard -const MAX_PORTAL_CONTENT_PAYLOAD_SIZE: usize = 1165; - // Header with proof for block number 14764013 const HEADER_WITH_PROOF_KEY: &str = "0x00720704f3aa11c53cf344ea069db95cecb81ad7453c8f276b2a1062979611f09c"; @@ -34,17 +35,22 @@ fn process_content( let mut result: Vec = vec![]; for history_content in content.into_iter() { - if let HistoryContentKey::BlockHeaderWithProof(_) = &history_content.0 { + if let HistoryContentKey::BlockHeaderByHash(_) = &history_content.0 { last_header = history_content.clone(); } let (content_type, block_number, test_data) = if let HistoryContentValue::BlockHeaderWithProof(header_with_proof) = &last_header.1 { match &history_content.0 { - HistoryContentKey::BlockHeaderWithProof(_) => ( - "Block Header".to_string(), + HistoryContentKey::BlockHeaderByHash(_) => ( + "Block Header by Hash".to_string(), header_with_proof.header.number, vec![last_header.clone()], ), + HistoryContentKey::BlockHeaderByNumber(_) => ( + "Block Header by Number".to_string(), + header_with_proof.header.number, + vec![history_content], + ), HistoryContentKey::BlockBody(_) => ( "Block Body".to_string(), header_with_proof.header.number, @@ -55,11 +61,6 @@ fn process_content( header_with_proof.header.number, vec![history_content, last_header.clone()], ), - HistoryContentKey::EpochAccumulator(_) => ( - "Epoch Accumulator".to_string(), - u64::MAX, - vec![history_content], - ), } } else { unreachable!("History test dated is formatted incorrectly") @@ -93,9 +94,9 @@ dyn_async! { let values: Value = serde_yaml::from_str(&values).unwrap(); let content: Vec<(HistoryContentKey, HistoryContentValue)> = values.as_sequence().unwrap().iter().map(|value| { let content_key: HistoryContentKey = - serde_yaml::from_value(value.get("content_key").unwrap().clone()).unwrap(); - let content_value: HistoryContentValue = - serde_yaml::from_value(value.get("content_value").unwrap().clone()).unwrap(); + serde_yaml::from_value(value["content_key"].clone()).unwrap(); + let raw_content_value = Bytes::from_str(value["content_value"].as_str().unwrap()).unwrap(); + let content_value = HistoryContentValue::decode(&content_key, raw_content_value.as_ref()).expect("unable to decode content value"); (content_key, content_value) }).collect(); @@ -243,7 +244,7 @@ dyn_async! { } }; if let Some((optional_key, optional_value)) = test_data.get(1).cloned() { - match client_b.rpc.store(optional_key, optional_value).await { + match client_b.rpc.store(optional_key, optional_value.encode()).await { Ok(result) => if !result { panic!("Unable to store optional content for recursive find content"); }, @@ -261,13 +262,13 @@ dyn_async! { } }; - let _ = client_a.rpc.offer(target_enr, target_key.clone(), target_value.clone()).await; + let _ = client_a.rpc.offer(target_enr, target_key.clone(), target_value.encode()).await; tokio::time::sleep(Duration::from_secs(8)).await; match client_b.rpc.local_content(target_key).await { Ok(possible_content) => { - if possible_content != target_value { + if possible_content != target_value.encode() { panic!("Error receiving content: Expected content: {target_value:?}, Received content: {possible_content:?}"); } } @@ -364,7 +365,7 @@ dyn_async! { } }; if let Some((optional_key, optional_value)) = test_data.get(1).cloned() { - match client_b.rpc.store(optional_key, optional_value).await { + match client_b.rpc.store(optional_key, optional_value.encode()).await { Ok(result) => if !result { panic!("Unable to store optional content for recursive find content"); }, @@ -375,7 +376,7 @@ dyn_async! { } let (target_key, target_value) = test_data.first().cloned().expect("Target content is required for this test"); - match client_b.rpc.store(target_key.clone(), target_value.clone()).await { + match client_b.rpc.store(target_key.clone(), target_value.encode()).await { Ok(result) => if !result { panic!("Error storing target content for recursive find content"); }, @@ -403,7 +404,7 @@ dyn_async! { Ok(result) => { match result { ContentInfo::Content{ content, utp_transfer } => { - if content != target_value { + if content != target_value.encode() { panic!("Error: Unexpected RECURSIVEFINDCONTENT response: didn't return expected target content"); } @@ -437,7 +438,7 @@ dyn_async! { } }; if let Some((optional_key, optional_value)) = test_data.get(1).cloned() { - match client_b.rpc.store(optional_key, optional_value).await { + match client_b.rpc.store(optional_key, optional_value.encode()).await { Ok(result) => if !result { panic!("Unable to store optional content for find content"); }, @@ -448,7 +449,7 @@ dyn_async! { } let (target_key, target_value) = test_data.first().cloned().expect("Target content is required for this test"); - match client_b.rpc.store(target_key.clone(), target_value.clone()).await { + match client_b.rpc.store(target_key.clone(), target_value.encode()).await { Ok(result) => if !result { panic!("Error storing target content for find content"); }, @@ -468,7 +469,7 @@ dyn_async! { Ok(result) => { match result { ContentInfo::Content{ content, utp_transfer } => { - if content != target_value { + if content != target_value.encode() { panic!("Error: Unexpected FINDCONTENT response: didn't return expected block body"); } @@ -517,7 +518,7 @@ dyn_async! { // With default node settings nodes should be storing all content for (content_key, content_value) in test_data.clone() { - match client_a.rpc.gossip(content_key.clone(), content_value.clone()).await { + match client_a.rpc.gossip(content_key.clone(), content_value.encode()).await { Ok(nodes_gossiped_to) => { if nodes_gossiped_to != 1 { panic!("We expected to gossip to 1 node instead we gossiped to: {nodes_gossiped_to}"); @@ -528,7 +529,7 @@ dyn_async! { } } - if let HistoryContentKey::BlockHeaderWithProof(_) = content_key { + if let HistoryContentKey::BlockHeaderByHash(_) = content_key { tokio::time::sleep(Duration::from_secs(1)).await; } } @@ -541,16 +542,16 @@ dyn_async! { let mut last_header_seen: (HistoryContentKey, HistoryContentValue) = (first_header_key, first_header_value); let mut result = vec![]; for (content_key, content_value) in test_data.into_iter() { - if let HistoryContentKey::BlockHeaderWithProof(_) = &content_key { + if let HistoryContentKey::BlockHeaderByHash(_) = &content_key { last_header_seen = (content_key.clone(), content_value.clone()); } let content_details = if let HistoryContentValue::BlockHeaderWithProof(header_with_proof) = &last_header_seen.1 { let content_type = match &content_key { - HistoryContentKey::BlockHeaderWithProof(_) => "header".to_string(), + HistoryContentKey::BlockHeaderByHash(_) => "header by hash".to_string(), + HistoryContentKey::BlockHeaderByNumber(_) => "header by number".to_string(), HistoryContentKey::BlockBody(_) => "body".to_string(), HistoryContentKey::BlockReceipts(_) => "receipt".to_string(), - HistoryContentKey::EpochAccumulator(_) => "epoch accumulator".to_string(), }; format!( "{} {}", @@ -558,12 +559,12 @@ dyn_async! { content_type ) } else { - unreachable!("History test data is formatted incorrectly. Header wasn't infront of data. Please refer to test data file for more information") + unreachable!("History test data is formatted incorrectly. Header wasn't in front of data. Please refer to test data file for more information") }; match client_b.rpc.local_content(content_key.clone()).await { Ok(expected_value) => { - if expected_value != content_value { + if expected_value != content_value.encode() { result.push(format!("Error content received for block {content_details} was different then expected")); } } diff --git a/simulators/portal/src/suites/history/mesh.rs b/simulators/portal/src/suites/history/mesh.rs index 03adb28123..00761c1891 100644 --- a/simulators/portal/src/suites/history/mesh.rs +++ b/simulators/portal/src/suites/history/mesh.rs @@ -1,15 +1,15 @@ use crate::suites::history::constants::TRIN_BRIDGE_CLIENT_TYPE; +use alloy_primitives::Bytes; use ethportal_api::jsonrpsee::core::__reexports::serde_json; use ethportal_api::types::distance::{Metric, XorMetric}; -use ethportal_api::types::history::ContentInfo; -use ethportal_api::{ - Discv5ApiClient, HistoryContentKey, HistoryContentValue, HistoryNetworkApiClient, -}; +use ethportal_api::types::portal::ContentInfo; +use ethportal_api::{Discv5ApiClient, HistoryContentKey, HistoryNetworkApiClient}; use hivesim::types::ClientDefinition; use hivesim::{dyn_async, Client, NClientTestSpec, Test}; use itertools::Itertools; use serde_json::json; use std::collections::HashMap; +use std::str::FromStr; // Header with proof for block number 14764013 const HEADER_WITH_PROOF_KEY: &str = @@ -81,7 +81,7 @@ dyn_async! { }; let header_with_proof_key: HistoryContentKey = serde_json::from_value(json!(HEADER_WITH_PROOF_KEY)).unwrap(); - let header_with_proof_value: HistoryContentValue = serde_json::from_value(json!(HEADER_WITH_PROOF_VALUE)).unwrap(); + let raw_header_with_proof_value = Bytes::from_str(HEADER_WITH_PROOF_VALUE).expect("unable to convert content value to bytes"); // get enr for b and c to seed for the jumps let client_b_enr = match client_b.rpc.node_info().await { @@ -113,7 +113,7 @@ dyn_async! { } // seed the data into client_c - match client_c.rpc.store(header_with_proof_key.clone(), header_with_proof_value.clone()).await { + match client_c.rpc.store(header_with_proof_key.clone(), raw_header_with_proof_value.clone()).await { Ok(result) => if !result { panic!("Unable to store header with proof for find content immediate return test"); }, @@ -146,7 +146,7 @@ dyn_async! { Ok(result) => { match result { ContentInfo::Content{ content, utp_transfer } => { - if content != header_with_proof_value { + if content != raw_header_with_proof_value { panic!("Error: Unexpected FINDCONTENT response: didn't return expected header with proof value"); } diff --git a/simulators/portal/src/suites/history/rpc_compat.rs b/simulators/portal/src/suites/history/rpc_compat.rs index 7d6961dd68..549f010006 100644 --- a/simulators/portal/src/suites/history/rpc_compat.rs +++ b/simulators/portal/src/suites/history/rpc_compat.rs @@ -1,7 +1,10 @@ +use std::str::FromStr; + use crate::suites::history::constants::TRIN_BRIDGE_CLIENT_TYPE; +use alloy_primitives::Bytes; use ethportal_api::types::enr::generate_random_remote_enr; use ethportal_api::Discv5ApiClient; -use ethportal_api::{HistoryContentKey, HistoryContentValue, HistoryNetworkApiClient}; +use ethportal_api::{HistoryContentKey, HistoryNetworkApiClient}; use hivesim::types::ClientDefinition; use hivesim::{dyn_async, Client, NClientTestSpec, Test}; use serde_json::json; @@ -230,9 +233,9 @@ dyn_async! { } }; let content_key: HistoryContentKey = serde_json::from_value(json!(CONTENT_KEY)).unwrap(); - let content_value: HistoryContentValue = serde_json::from_value(json!(CONTENT_VALUE)).unwrap(); + let raw_content_value = Bytes::from_str(CONTENT_VALUE).expect("unable to convert content value to bytes"); - if let Err(err) = HistoryNetworkApiClient::store(&client.rpc, content_key, content_value).await { + if let Err(err) = HistoryNetworkApiClient::store(&client.rpc, content_key, raw_content_value).await { panic!("{}", &err.to_string()); } } @@ -247,18 +250,18 @@ dyn_async! { } }; let content_key: HistoryContentKey = serde_json::from_value(json!(CONTENT_KEY)).unwrap(); - let content_value: HistoryContentValue = serde_json::from_value(json!(CONTENT_VALUE)).unwrap(); + let raw_content_value = Bytes::from_str(CONTENT_VALUE).expect("unable to convert content value to bytes"); // seed content_key/content_value onto the local node to test local_content expect content present - if let Err(err) = HistoryNetworkApiClient::store(&client.rpc, content_key.clone(), content_value.clone()).await { + if let Err(err) = HistoryNetworkApiClient::store(&client.rpc, content_key.clone(), raw_content_value.clone()).await { panic!("{}", &err.to_string()); } // Here we are calling local_content RPC to test if the content is present match HistoryNetworkApiClient::local_content(&client.rpc, content_key).await { Ok(possible_content) => { - if possible_content != content_value { - panic!("Error receiving content: Expected content: {content_value:?}, Received content: {possible_content:?}"); + if possible_content != raw_content_value { + panic!("Error receiving content: Expected content: {raw_content_value:?}, Received content: {possible_content:?}"); } } Err(err) => { diff --git a/simulators/portal/src/suites/history/trin_bridge.rs b/simulators/portal/src/suites/history/trin_bridge.rs index 2ce1ed3cb6..a9ca53b777 100644 --- a/simulators/portal/src/suites/history/trin_bridge.rs +++ b/simulators/portal/src/suites/history/trin_bridge.rs @@ -3,6 +3,8 @@ use super::constants::{ TRIN_BRIDGE_CLIENT_TYPE, }; use crate::suites::utils::get_flair; +use alloy_primitives::Bytes; +use ethportal_api::ContentValue; use ethportal_api::HistoryContentKey; use ethportal_api::HistoryContentValue; use ethportal_api::{Discv5ApiClient, HistoryNetworkApiClient}; @@ -10,6 +12,7 @@ use hivesim::types::ClientDefinition; use hivesim::{dyn_async, Client, NClientTestSpec, Test}; use serde_yaml::Value; use std::collections::HashMap; +use std::str::FromStr; use tokio::time::Duration; fn process_content(content: Vec<(HistoryContentKey, HistoryContentValue)>) -> Vec { @@ -17,16 +20,16 @@ fn process_content(content: Vec<(HistoryContentKey, HistoryContentValue)>) -> Ve let mut result: Vec = vec![]; for history_content in content.into_iter() { - if let HistoryContentKey::BlockHeaderWithProof(_) = &history_content.0 { + if let HistoryContentKey::BlockHeaderByHash(_) = &history_content.0 { last_header = history_content.clone(); } let comment = if let HistoryContentValue::BlockHeaderWithProof(header_with_proof) = &last_header.1 { let content_type = match &history_content.0 { - HistoryContentKey::BlockHeaderWithProof(_) => "header".to_string(), + HistoryContentKey::BlockHeaderByHash(_) => "header by hash".to_string(), + HistoryContentKey::BlockHeaderByNumber(_) => "header by number".to_string(), HistoryContentKey::BlockBody(_) => "body".to_string(), HistoryContentKey::BlockReceipts(_) => "receipt".to_string(), - HistoryContentKey::EpochAccumulator(_) => "epoch accumulator".to_string(), }; format!( "{}{} {}", @@ -91,10 +94,10 @@ dyn_async! { let values: Value = serde_yaml::from_str(&values).unwrap(); let content_vec: Vec<(HistoryContentKey, HistoryContentValue)> = values.as_sequence().unwrap().iter().map(|value| { let content_key: HistoryContentKey = - serde_yaml::from_value(value.get("content_key").unwrap().clone()).unwrap(); - let content_value: HistoryContentValue = - serde_yaml::from_value(value.get("content_value").unwrap().clone()).unwrap(); - (content_key, content_value) + serde_yaml::from_value(value["content_key"].clone()).unwrap(); + let raw_content_value = Bytes::from_str(value["content_value"].as_str().unwrap()).unwrap(); + let content_value = HistoryContentValue::decode(&content_key, raw_content_value.as_ref()).expect("unable to decode content value"); + (content_key, content_value) }).collect(); let comments = process_content(content_vec.clone()); @@ -105,7 +108,7 @@ dyn_async! { for (index, (content_key, content_value)) in content_vec.into_iter().enumerate() { match client.rpc.local_content(content_key.clone()).await { Ok(content) => { - if content != content_value { + if content != content_value.encode() { result.push(format!("Error content received for block {} was different then expected: Provided: {content:?} Expected: {content_value:?}", comments[index])); } } diff --git a/simulators/portal/src/suites/state/interop.rs b/simulators/portal/src/suites/state/interop.rs index b89266b2d9..ed1979f416 100644 --- a/simulators/portal/src/suites/state/interop.rs +++ b/simulators/portal/src/suites/state/interop.rs @@ -1,4 +1,5 @@ use std::collections::HashMap; +use std::str::FromStr; use crate::suites::environment::PortalNetwork; use crate::suites::state::constants::{CONTENT_KEY, TEST_DATA_FILE_PATH, TRIN_BRIDGE_CLIENT_TYPE}; @@ -8,7 +9,8 @@ use ethportal_api::jsonrpsee::http_client::HttpClient; use ethportal_api::types::execution::header_with_proof::{ BlockHeaderProof, HeaderWithProof, SszNone, }; -use ethportal_api::types::state::ContentInfo; +use ethportal_api::types::portal::ContentInfo; +use ethportal_api::types::portal_wire::MAX_PORTAL_CONTENT_PAYLOAD_SIZE; use ethportal_api::utils::bytes::hex_encode; use ethportal_api::{ ContentValue, Discv5ApiClient, Header, HistoryContentKey, HistoryContentValue, StateContentKey, @@ -21,9 +23,6 @@ use serde_json::json; use serde_yaml::Value; use tokio::time::Duration; -// This is taken from Trin. It should be fairly standard -const MAX_PORTAL_CONTENT_PAYLOAD_SIZE: usize = 1165; - #[derive(Clone, Debug)] struct TestData { pub header: Header, @@ -33,12 +32,14 @@ struct TestData { } async fn store_header(header: Header, client: &HttpClient) -> bool { - let content_key = HistoryContentKey::BlockHeaderWithProof(header.hash().into()); + let content_key = HistoryContentKey::new_block_header_by_hash(header.hash()); let content_value = HistoryContentValue::BlockHeaderWithProof(HeaderWithProof { header, proof: BlockHeaderProof::None(SszNone::default()), }); - match ethportal_api::HistoryNetworkApiClient::store(client, content_key, content_value).await { + match ethportal_api::HistoryNetworkApiClient::store(client, content_key, content_value.encode()) + .await + { Ok(stored) => stored, Err(err) => panic!("{}", &err.to_string()), } @@ -108,10 +109,11 @@ dyn_async! { let header = Header::decode(&mut header_bytes.as_ref()).unwrap(); let key: StateContentKey = serde_yaml::from_value(value["content_key"].clone()).unwrap(); - let offer_value: StateContentValue = - serde_yaml::from_value(value["content_value_offer"].clone()).unwrap(); - let lookup_value: StateContentValue = - serde_yaml::from_value(value["content_value_retrieval"].clone()).unwrap(); + let raw_offer_value = Bytes::from_str(value["content_value_offer"].as_str().unwrap()).unwrap(); + let offer_value = StateContentValue::decode(&key, raw_offer_value.as_ref()).expect("unable to decode content value"); + let raw_lookup_value = Bytes::from_str(value["content_value_retrieval"].as_str().unwrap()).unwrap(); + let lookup_value = StateContentValue::decode(&key, raw_lookup_value.as_ref()).expect("unable to decode content value"); + TestData { header, key, offer_value, lookup_value } }).collect(); @@ -275,13 +277,13 @@ dyn_async! { store_header(header, &client_b.rpc).await; - let _ = client_a.rpc.offer(target_enr, target_key.clone(), target_offer_value.clone()).await; + let _ = client_a.rpc.offer(target_enr, target_key.clone(), target_offer_value.encode()).await; tokio::time::sleep(Duration::from_secs(8)).await; match client_b.rpc.local_content(target_key).await { Ok(possible_content) => { - if possible_content != target_lookup_value { + if possible_content != target_lookup_value.encode() { panic!("Error receiving content: Expected content: {target_lookup_value:?}, Received content: {possible_content:?}"); } } @@ -385,7 +387,7 @@ dyn_async! { .. } = test_data; - match client_b.rpc.store(target_key.clone(), target_offer_value.clone()).await { + match client_b.rpc.store(target_key.clone(), target_offer_value.encode()).await { Ok(result) => if !result { panic!("Error storing target content for recursive find content"); }, @@ -413,7 +415,7 @@ dyn_async! { Ok(result) => { match result { ContentInfo::Content{ content, utp_transfer } => { - if content != target_lookup_value { + if content != target_lookup_value.encode() { panic!("Error: Unexpected RECURSIVEFINDCONTENT response: didn't return expected target content"); } @@ -454,7 +456,7 @@ dyn_async! { .. } = test_data; - match client_b.rpc.store(target_key.clone(), target_offer_value.clone()).await { + match client_b.rpc.store(target_key.clone(), target_offer_value.encode()).await { Ok(result) => if !result { panic!("Error storing target content for find content"); }, @@ -474,7 +476,7 @@ dyn_async! { Ok(result) => { match result { ContentInfo::Content{ content, utp_transfer } => { - if content != target_lookup_value { + if content != target_lookup_value.encode() { panic!("Error: Unexpected FINDCONTENT response: didn't return expected block body"); } @@ -525,7 +527,7 @@ dyn_async! { for TestData { header, key: content_key, offer_value: content_offer_value, .. } in test_data.clone() { store_header(header, &client_b.rpc).await; - match client_a.rpc.gossip(content_key.clone(), content_offer_value.clone()).await { + match client_a.rpc.gossip(content_key.clone(), content_offer_value.encode()).await { Ok(nodes_gossiped_to) => { if nodes_gossiped_to != 1 { panic!("We expected to gossip to 1 node instead we gossiped to: {nodes_gossiped_to}"); @@ -560,7 +562,7 @@ dyn_async! { match client_b.rpc.local_content(content_key.clone()).await { Ok(expected_value) => { - if expected_value != content_lookup_value { + if expected_value != content_lookup_value.encode() { result.push(format!("Error content received for block {content_details} was different then expected")); } } diff --git a/simulators/portal/src/suites/state/rpc_compat.rs b/simulators/portal/src/suites/state/rpc_compat.rs index 8440bf42e2..a4d7ca92fe 100644 --- a/simulators/portal/src/suites/state/rpc_compat.rs +++ b/simulators/portal/src/suites/state/rpc_compat.rs @@ -1,12 +1,14 @@ use std::collections::HashMap; +use std::str::FromStr; use crate::suites::environment::PortalNetwork; use crate::suites::state::constants::{ CONTENT_KEY, CONTENT_LOOKUP_VALUE, CONTENT_OFFER_VALUE, TRIN_BRIDGE_CLIENT_TYPE, }; +use alloy_primitives::Bytes; use ethportal_api::types::enr::generate_random_remote_enr; use ethportal_api::Discv5ApiClient; -use ethportal_api::{StateContentKey, StateContentValue, StateNetworkApiClient}; +use ethportal_api::{StateContentKey, StateNetworkApiClient}; use hivesim::types::ClientDefinition; use hivesim::{dyn_async, Client, NClientTestSpec, Test}; use serde_json::json; @@ -234,9 +236,9 @@ dyn_async! { } }; let content_key: StateContentKey = serde_json::from_value(json!(CONTENT_KEY)).unwrap(); - let content_value: StateContentValue = serde_json::from_value(json!(CONTENT_OFFER_VALUE)).unwrap(); + let raw_content_offer_value = Bytes::from_str(CONTENT_OFFER_VALUE).unwrap(); - if let Err(err) = StateNetworkApiClient::store(&client.rpc, content_key, content_value).await { + if let Err(err) = StateNetworkApiClient::store(&client.rpc, content_key, raw_content_offer_value).await { panic!("{}", &err.to_string()); } } @@ -251,18 +253,19 @@ dyn_async! { } }; let content_key: StateContentKey = serde_json::from_value(json!(CONTENT_KEY)).unwrap(); - let content_offer_value: StateContentValue = serde_json::from_value(json!(CONTENT_OFFER_VALUE)).unwrap(); - let content_lookup_value: StateContentValue = serde_json::from_value(json!(CONTENT_LOOKUP_VALUE)).unwrap(); + let raw_content_offer_value = Bytes::from_str(CONTENT_OFFER_VALUE).unwrap(); + let raw_content_lookup_value = Bytes::from_str(CONTENT_LOOKUP_VALUE).unwrap(); - if let Err(err) = StateNetworkApiClient::store(&client.rpc, content_key.clone(), content_offer_value).await { + + if let Err(err) = StateNetworkApiClient::store(&client.rpc, content_key.clone(), raw_content_offer_value).await { panic!("{}", &err.to_string()); } // Here we are calling local_content RPC to test if the content is present match StateNetworkApiClient::local_content(&client.rpc, content_key).await { Ok(possible_content) => { - if possible_content != content_lookup_value { - panic!("Error receiving content: Expected content: {content_lookup_value:?}, Received content: {possible_content:?}"); + if possible_content != raw_content_lookup_value { + panic!("Error receiving content: Expected content: {raw_content_lookup_value:?}, Received content: {possible_content:?}"); } } Err(err) => { From e526a07d69d8727780538b3b35699f528df32b04 Mon Sep 17 00:00:00 2001 From: web3-developer <51288821+web3-developer@users.noreply.github.com> Date: Thu, 26 Sep 2024 01:41:49 +0800 Subject: [PATCH 339/387] clients/fluffy: add --rpc-api flag to Fluffy startup script (#1168) --- clients/fluffy/fluffy.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clients/fluffy/fluffy.sh b/clients/fluffy/fluffy.sh index 91b0c53b87..1e8d9b8eb3 100755 --- a/clients/fluffy/fluffy.sh +++ b/clients/fluffy/fluffy.sh @@ -23,5 +23,5 @@ if [ "$HIVE_CLIENT_PRIVATE_KEY" != "" ]; then FLAGS="$FLAGS --netkey-unsafe=0x$HIVE_CLIENT_PRIVATE_KEY" fi -fluffy --log-level=INFO --rpc --rpc-address="0.0.0.0" --nat:extip:"$IP_ADDR" --network=none \ +fluffy --log-level=INFO --rpc --rpc-address="0.0.0.0" --rpc-api="eth,portal,discovery" --nat:extip:"$IP_ADDR" --network=none \ --log-level="debug" --disable-state-root-validation $FLAGS From c044bf041d884381a7a39a8ba72367273a60f1d9 Mon Sep 17 00:00:00 2001 From: Somnath Date: Tue, 8 Oct 2024 16:09:05 +0400 Subject: [PATCH 340/387] clients/erigon: update erigon tag (#1171) --- clients/erigon/Dockerfile.git | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clients/erigon/Dockerfile.git b/clients/erigon/Dockerfile.git index fe147bec8b..2ef82ed2e1 100644 --- a/clients/erigon/Dockerfile.git +++ b/clients/erigon/Dockerfile.git @@ -4,7 +4,7 @@ FROM golang:1.22-alpine as builder ARG github=ledgerwatch/erigon -ARG tag=devel +ARG tag=main RUN echo "Cloning: $github - $tag" \ && apk add bash build-base ca-certificates git jq \ From 4408fc1de3fee3ac23acd25a812c117756af2f39 Mon Sep 17 00:00:00 2001 From: Kolby Moroz Liebl <31669092+KolbyML@users.noreply.github.com> Date: Tue, 8 Oct 2024 18:42:45 -0700 Subject: [PATCH 341/387] hivesim-rs: bump jsonrpsee version (#1172) --- hivesim-rs/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hivesim-rs/Cargo.toml b/hivesim-rs/Cargo.toml index 48f5f7aac3..f45c14d2dc 100644 --- a/hivesim-rs/Cargo.toml +++ b/hivesim-rs/Cargo.toml @@ -8,7 +8,7 @@ edition = "2021" [dependencies] async-trait = "0.1.68" dyn-clone = "1.0.11" -jsonrpsee = {version="0.20.0", features = ["client"]} +jsonrpsee = {version="0.24.4", features = ["client"]} regex = "1.10.5" reqwest = { version = "0.12.7", default-features = false, features = ["json", "multipart"] } serde = { version = "1.0.150", features = ["derive"] } From e2079ed584d96a92706079f3fb77157fbb495c4e Mon Sep 17 00:00:00 2001 From: Kolby Moroz Liebl <31669092+KolbyML@users.noreply.github.com> Date: Tue, 8 Oct 2024 23:54:36 -0700 Subject: [PATCH 342/387] simulators/portal: update ethportal-api for offer update (#1173) --- simulators/portal/Cargo.lock | 1597 ++++++++--------- simulators/portal/Cargo.toml | 6 +- .../portal/src/suites/history/interop.rs | 2 +- simulators/portal/src/suites/state/interop.rs | 2 +- 4 files changed, 708 insertions(+), 899 deletions(-) diff --git a/simulators/portal/Cargo.lock b/simulators/portal/Cargo.lock index fd571c8f59..edacb813cc 100644 --- a/simulators/portal/Cargo.lock +++ b/simulators/portal/Cargo.lock @@ -4,18 +4,18 @@ version = 3 [[package]] name = "addr2line" -version = "0.22.0" +version = "0.24.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e4503c46a5c0c7844e948c9a4d6acd9f50cccb4de1c48eb9e291ea17470c678" +checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" dependencies = [ "gimli", ] [[package]] -name = "adler" -version = "1.0.2" +name = "adler2" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" +checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" [[package]] name = "aead" @@ -35,20 +35,20 @@ dependencies = [ "cfg-if", "cipher", "cpufeatures", - "ctr", + "ctr 0.8.0", "opaque-debug", ] [[package]] name = "aes-gcm" -version = "0.9.4" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df5f85a83a7d8b0442b6aa7b504b8212c1733da07b98aae43d4bc21b2cb3cdf6" +checksum = "bc3be92e19a7ef47457b8e6f90707e12b6ac5d20c6f3866584fa3be0787d839f" dependencies = [ "aead", "aes", "cipher", - "ctr", + "ctr 0.7.0", "ghash", "subtle", ] @@ -107,9 +107,9 @@ dependencies = [ [[package]] name = "alloy-eip7702" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37d319bb544ca6caeab58c39cea8921c55d924d4f68f2c60f24f914673f9a74a" +checksum = "ea59dc42102bc9a1905dc57901edc6dd48b9f38115df86c7d252acba70d71d04" dependencies = [ "alloy-primitives", "alloy-rlp", @@ -134,17 +134,6 @@ dependencies = [ "sha2", ] -[[package]] -name = "alloy-genesis" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a7a18afb0b318616b6b2b0e2e7ac5529d32a966c673b48091c9919e284e6aca" -dependencies = [ - "alloy-primitives", - "alloy-serde", - "serde", -] - [[package]] name = "alloy-network-primitives" version = "0.3.6" @@ -159,24 +148,30 @@ dependencies = [ [[package]] name = "alloy-primitives" -version = "0.8.3" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "411aff151f2a73124ee473708e82ed51b2535f68928b6a1caa8bc1246ae6f7cd" +checksum = "8ecb848c43f6b06ae3de2e4a67496cbbabd78ae87db0f1248934f15d76192c6a" dependencies = [ "alloy-rlp", "bytes", "cfg-if", "const-hex", "derive_more", + "foldhash", "getrandom", + "hashbrown 0.15.0", "hex-literal", + "indexmap", "itoa", "k256", "keccak-asm", + "paste", "proptest", "rand", "ruint", + "rustc-hash", "serde", + "sha3 0.10.8", "tiny-keccak", ] @@ -199,7 +194,7 @@ checksum = "4d0f2d905ebd295e7effec65e5f6868d153936130ae718352771de3e7d03c75c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -214,43 +209,6 @@ dependencies = [ "serde", ] -[[package]] -name = "alloy-rpc-types-admin" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fefd12e99dd6b7de387ed13ad047ce2c90d8950ca62fc48b8a457ebb8f936c61" -dependencies = [ - "alloy-genesis", - "alloy-primitives", - "serde", - "serde_json", -] - -[[package]] -name = "alloy-rpc-types-anvil" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d25cb45ad7c0930dd62eecf164d2afe4c3d2dd2c82af85680ad1f118e1e5cb83" -dependencies = [ - "alloy-primitives", - "alloy-serde", - "serde", -] - -[[package]] -name = "alloy-rpc-types-beacon" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e7081d2206dca51ce23a06338d78d9b536931cc3f15134fc1c6535eb2b77f18" -dependencies = [ - "alloy-eips", - "alloy-primitives", - "alloy-rpc-types-engine", - "serde", - "serde_with", - "thiserror", -] - [[package]] name = "alloy-rpc-types-engine" version = "0.3.6" @@ -263,7 +221,8 @@ dependencies = [ "alloy-rlp", "alloy-serde", "derive_more", - "jsonrpsee-types 0.24.4", + "jsonwebtoken", + "rand", "serde", ] @@ -284,48 +243,8 @@ dependencies = [ "derive_more", "hashbrown 0.14.5", "itertools 0.13.0", - "jsonrpsee-types 0.24.4", - "serde", - "serde_json", -] - -[[package]] -name = "alloy-rpc-types-mev" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "922d92389e5022650c4c60ffd2f9b2467c3f853764f0f74ff16a23106f9017d5" -dependencies = [ - "alloy-eips", - "alloy-primitives", - "alloy-serde", - "serde", - "serde_json", -] - -[[package]] -name = "alloy-rpc-types-trace" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98db35cd42c90b484377e6bc44d95377a7a38a5ebee996e67754ac0446d542ab" -dependencies = [ - "alloy-primitives", - "alloy-rpc-types-eth", - "alloy-serde", "serde", "serde_json", - "thiserror", -] - -[[package]] -name = "alloy-rpc-types-txpool" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bac37082c3b21283b3faf5cc0e08974272aee2f756ce1adeb26db56a5fce0d5" -dependencies = [ - "alloy-primitives", - "alloy-rpc-types-eth", - "alloy-serde", - "serde", ] [[package]] @@ -341,68 +260,62 @@ dependencies = [ [[package]] name = "alloy-sol-macro" -version = "0.8.3" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0458ccb02a564228fcd76efb8eb5a520521a8347becde37b402afec9a1b83859" +checksum = "661c516eb1fa3294cc7f2fb8955b3b609d639c282ac81a4eedb14d3046db503a" dependencies = [ "alloy-sol-macro-expander", "alloy-sol-macro-input", "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] name = "alloy-sol-macro-expander" -version = "0.8.3" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bc65475025fc1e84bf86fc840f04f63fcccdcf3cf12053c99918e4054dfbc69" +checksum = "ecbabb8fc3d75a0c2cea5215be22e7a267e3efde835b0f2a8922f5e3f5d47683" dependencies = [ "alloy-sol-macro-input", "const-hex", - "heck 0.5.0", - "indexmap 2.2.6", + "heck", + "indexmap", "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", "syn-solidity", "tiny-keccak", ] [[package]] name = "alloy-sol-macro-input" -version = "0.8.3" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ed10f0715a0b69fde3236ff3b9ae5f6f7c97db5a387747100070d3016b9266b" +checksum = "16517f2af03064485150d89746b8ffdcdbc9b6eeb3d536fb66efd7c2846fbc75" dependencies = [ "const-hex", "dunce", - "heck 0.5.0", + "heck", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", "syn-solidity", ] [[package]] name = "alloy-sol-types" -version = "0.8.3" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1eb88e4da0a1b697ed6a9f811fdba223cf4d5c21410804fd1707836af73a462b" +checksum = "8e448d879903624863f608c552d10efb0e0905ddbee98b0049412799911eb062" dependencies = [ "alloy-primitives", "alloy-sol-macro", "const-hex", ] -[[package]] -name = "android-tzdata" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" - [[package]] name = "android_system_properties" version = "0.1.5" @@ -423,9 +336,9 @@ dependencies = [ [[package]] name = "anstream" -version = "0.6.14" +version = "0.6.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "418c75fa768af9c03be99d17643f93f79bbba589895012a80e3452a19ddda15b" +checksum = "64e15c1ab1f89faffbf04a634d5e1962e9074f2741eef6d97f3c4e322426d526" dependencies = [ "anstyle", "anstyle-parse", @@ -438,33 +351,33 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.7" +version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "038dfcf04a5feb68e9c60b21c9625a54c2c0616e79b72b0fd87075a056ae1d1b" +checksum = "1bec1de6f59aedf83baf9ff929c98f2ad654b97c9510f4e70cf6f661d49fd5b1" [[package]] name = "anstyle-parse" -version = "0.2.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c03a11a9034d92058ceb6ee011ce58af4a9bf61491aa7e1e59ecd24bd40d22d4" +checksum = "eb47de1e80c2b463c735db5b217a0ddc39d612e7ac9e2e96a5aed1f57616c1cb" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" -version = "1.1.0" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad186efb764318d35165f1758e7dcef3b10628e26d41a44bc5550652e6804391" +checksum = "6d36fc52c7f6c869915e99412912f22093507da8d9e942ceaf66fe4b7c14422a" dependencies = [ "windows-sys 0.52.0", ] [[package]] name = "anstyle-wincon" -version = "3.0.3" +version = "3.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61a38449feb7068f52bb06c12759005cf459ee52bb4adc1d5a7c4322d716fb19" +checksum = "5bf74e1b6e971609db8ca7a9ce79fd5768ab6ae46441c572e46cf596f59e57f8" dependencies = [ "anstyle", "windows-sys 0.52.0", @@ -472,9 +385,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.86" +version = "1.0.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da" +checksum = "86fdf8605db99b54d3cd748a44c6d04df638eb5dafb219b135d0149bd0db01f6" [[package]] name = "ark-ff" @@ -510,7 +423,7 @@ dependencies = [ "num-bigint", "num-traits", "paste", - "rustc_version 0.4.0", + "rustc_version 0.4.1", "zeroize", ] @@ -602,30 +515,27 @@ dependencies = [ [[package]] name = "arrayvec" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" - -[[package]] -name = "async-lock" -version = "2.8.0" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "287272293e9d8c41773cec55e365490fe034813a2f172f502d6ddcf75b2f582b" -dependencies = [ - "event-listener", -] +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" [[package]] name = "async-trait" -version = "0.1.80" +version = "0.1.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6fa2087f2753a7da8cc1c0dbfcf89579dd57458e36769de5ac750b4671737ca" +checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + [[package]] name = "atty" version = "0.2.14" @@ -645,28 +555,28 @@ checksum = "3c87f3f15e7794432337fc718554eaa4dc8f04c9677a950ffe366f20a162ae42" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] name = "autocfg" -version = "1.3.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" [[package]] name = "backtrace" -version = "0.3.73" +version = "0.3.74" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cc23269a4f8976d0a4d2e7109211a419fe30e8d88d677cd60b6bc79c5732e0a" +checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" dependencies = [ "addr2line", - "cc", "cfg-if", "libc", "miniz_oxide", "object", "rustc-demangle", + "windows-targets", ] [[package]] @@ -699,15 +609,6 @@ version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" -[[package]] -name = "beef" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a8241f3ebb85c056b509d4327ad0358fbbba6ffb340bf388f26350aeda225b1" -dependencies = [ - "serde", -] - [[package]] name = "bimap" version = "0.6.3" @@ -737,9 +638,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.5.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" +checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" [[package]] name = "bitvec" @@ -780,9 +681,9 @@ checksum = "8d696c370c750c948ada61c69a0ee2cbbb9c50b1019ddb86d9317157a99c2cae" [[package]] name = "blst" -version = "0.3.12" +version = "0.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62dc83a094a71d43eeadd254b1ec2d24cb6a0bb6cadce00df51f0db594711a32" +checksum = "4378725facc195f1a538864863f6de233b500a8862747e7f165078a419d5e874" dependencies = [ "cc", "glob", @@ -819,47 +720,41 @@ dependencies = [ [[package]] name = "c-kzg" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdf100c4cea8f207e883ff91ca886d621d8a166cb04971dfaa9bb8fd99ed95df" +checksum = "f0307f72feab3300336fb803a57134159f6e20139af1357f36c54cb90d8e8928" dependencies = [ "blst", "cc", "glob", "hex", "libc", + "once_cell", "serde", ] [[package]] name = "cc" -version = "1.0.99" +version = "1.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96c51067fd44124faa7f870b4b1c969379ad32b2ba805aa959430ceaa384f695" +checksum = "2e80e3b6a3ab07840e1cae9b0666a63970dc28e8ed5ffbcdacbfc760c281bfc1" dependencies = [ "jobserver", "libc", - "once_cell", + "shlex", ] [[package]] -name = "cfg-if" -version = "1.0.0" +name = "cesu8" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" [[package]] -name = "chrono" -version = "0.4.38" +name = "cfg-if" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" -dependencies = [ - "android-tzdata", - "iana-time-zone", - "num-traits", - "serde", - "windows-targets 0.52.6", -] +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "cipher" @@ -872,9 +767,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.7" +version = "4.5.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5db83dced34638ad474f39f250d7fea9598bdd239eaced1bdf45d597da0f433f" +checksum = "b97f376d85a664d5837dbae44bf546e6477a679ff6610010f17276f686d867e8" dependencies = [ "clap_builder", "clap_derive", @@ -882,9 +777,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.7" +version = "4.5.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7e204572485eb3fbf28f871612191521df159bc3e15a9f5064c66dba3a8c05f" +checksum = "19bc80abd44e4bed93ca373a0704ccbd1b710dc5749406201bb018272808dc54" dependencies = [ "anstream", "anstyle", @@ -894,33 +789,43 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.5.5" +version = "4.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c780290ccf4fb26629baa7a1081e68ced113f1d3ec302fa5948f1c381ebf06c6" +checksum = "4ac6a0c7b1a9e9a5186361f67dfa1b88213572f427fb9ab038efb2bd8c582dab" dependencies = [ - "heck 0.5.0", + "heck", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] name = "clap_lex" -version = "0.7.1" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b82cf0babdbd58558212896d1a4272303a57bdb245c2bf1147185fb45640e70" +checksum = "1462739cb27611015575c0c11df5df7601141071f07518d56fcc1be504cbec97" [[package]] name = "colorchoice" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b6a852b24ab71dffc585bcb46eaf7959d175cb865a7152e35b348d1b2960422" +checksum = "d3fd119d74b830634cea2a0f58bbd0d54540518a14397557951e79340abc28c0" + +[[package]] +name = "combine" +version = "4.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" +dependencies = [ + "bytes", + "memchr", +] [[package]] name = "const-hex" -version = "1.12.0" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94fb8a24a26d37e1ffd45343323dc9fe6654ceea44c12f2fcb3d7ac29e610bc6" +checksum = "0121754e84117e65f9d90648ee6aa4882a6e63110307ab73967a4c5e7e69e586" dependencies = [ "cfg-if", "cpufeatures", @@ -943,9 +848,9 @@ checksum = "373e9fafaa20882876db20562275ff58d50e0caa2590077fe7ce7bef90211d0d" [[package]] name = "const_format" -version = "0.2.32" +version = "0.2.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3a214c7af3d04997541b18d432afaff4c455e79e2029079647e72fc2bd27673" +checksum = "50c655d81ff1114fb0dcdea9225ea9f0cc712a6f8d189378e82bdf62a473a64b" dependencies = [ "const_format_proc_macros", "konst", @@ -953,9 +858,9 @@ dependencies = [ [[package]] name = "const_format_proc_macros" -version = "0.2.32" +version = "0.2.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7f6ff08fd20f4f299298a28e2dfa8a8ba1036e6cd2460ac1de7b425d76f2500" +checksum = "eff1a44b93f47b1bac19a27932f5c591e43d1ba357ee4f61526c8a25603f0eb1" dependencies = [ "proc-macro2", "quote", @@ -974,15 +879,15 @@ dependencies = [ [[package]] name = "core-foundation-sys" -version = "0.8.6" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" [[package]] name = "cpufeatures" -version = "0.2.12" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" +checksum = "608697df725056feaccfa42cffdaeeec3fccc4ffc38358ecd19b243e716a78e0" dependencies = [ "libc", ] @@ -1024,6 +929,15 @@ dependencies = [ "typenum", ] +[[package]] +name = "ctr" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a232f92a03f37dd7d7dd2adc67166c77e9cd88de5b019b9a9eecfaeaf7bfd481" +dependencies = [ + "cipher", +] + [[package]] name = "ctr" version = "0.8.0" @@ -1044,7 +958,7 @@ dependencies = [ "curve25519-dalek-derive", "digest 0.10.7", "fiat-crypto", - "rustc_version 0.4.0", + "rustc_version 0.4.1", "subtle", "zeroize", ] @@ -1057,7 +971,7 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -1072,12 +986,12 @@ dependencies = [ [[package]] name = "darling" -version = "0.20.9" +version = "0.20.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83b2eb4d90d12bdda5ed17de686c2acb4c57914f8f921b8da7e112b5a36f3fe1" +checksum = "6f63b86c8a8826a49b8c21f08a2d07338eec8d900540f8630dc76284be802989" dependencies = [ - "darling_core 0.20.9", - "darling_macro 0.20.9", + "darling_core 0.20.10", + "darling_macro 0.20.10", ] [[package]] @@ -1096,16 +1010,16 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.20.9" +version = "0.20.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "622687fe0bac72a04e5599029151f5796111b90f1baaa9b544d807a5e31cd120" +checksum = "95133861a8032aaea082871032f5815eb9e98cef03fa916ab4500513994df9e5" dependencies = [ "fnv", "ident_case", "proc-macro2", "quote", "strsim 0.11.1", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -1121,13 +1035,13 @@ dependencies = [ [[package]] name = "darling_macro" -version = "0.20.9" +version = "0.20.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "733cabb43482b1a1b53eee8583c2b9e8684d592215ea83efd305dd31bc2f0178" +checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ - "darling_core 0.20.9", + "darling_core 0.20.10", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -1157,7 +1071,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" dependencies = [ "powerfmt", - "serde", ] [[package]] @@ -1188,7 +1101,7 @@ checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", "unicode-xid", ] @@ -1213,6 +1126,26 @@ dependencies = [ "subtle", ] +[[package]] +name = "directories" +version = "3.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e69600ff1703123957937708eb27f7a564e48885c537782722ed0ba3189ce1d7" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "dirs-sys" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b1d1d91c932ef41c0f2663aa8b0ca0342d444d842c06914aa0a7e352d0bada6" +dependencies = [ + "libc", + "redox_users", + "winapi", +] + [[package]] name = "discv5" version = "0.4.1" @@ -1296,9 +1229,9 @@ dependencies = [ [[package]] name = "either" -version = "1.12.0" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3dca9240753cf90908d7e4aac30f630662b02aebaa1b58a3cadabdb23385b58b" +checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" [[package]] name = "elliptic-curve" @@ -1418,20 +1351,21 @@ version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f3deae99c8e74829a00ba7a92d49055732b3c1f093f2ccfa3cbc621679b6fa91" dependencies = [ - "darling 0.20.9", + "darling 0.20.10", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] name = "ethportal-api" version = "0.2.2" -source = "git+https://github.com/ethereum/trin?rev=c416cd9faf933f89b44a517ca7ada144bf2baee9#c416cd9faf933f89b44a517ca7ada144bf2baee9" +source = "git+https://github.com/ethereum/trin?rev=627189e570d5750cc0e9b009df13921b2973f99b#627189e570d5750cc0e9b009df13921b2973f99b" dependencies = [ "alloy-consensus", "alloy-primitives", "alloy-rlp", + "alloy-rpc-types", "anyhow", "base64 0.13.1", "bimap", @@ -1453,7 +1387,6 @@ dependencies = [ "once_cell", "quickcheck", "rand", - "reth-rpc-types", "rlp", "rs_merkle", "secp256k1", @@ -1474,17 +1407,11 @@ dependencies = [ "validator", ] -[[package]] -name = "event-listener" -version = "2.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" - [[package]] name = "fastrand" -version = "2.1.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a" +checksum = "e8c02a5121d4ea3eb16a80748c74f5549a5665e4c21333c6098f283870fbdea6" [[package]] name = "fastrlp" @@ -1527,9 +1454,9 @@ dependencies = [ [[package]] name = "flate2" -version = "1.0.30" +version = "1.0.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f54427cfd1c7829e2a139fcefea601bf088ebca651d2bf53ebc600eac295dae" +checksum = "a1b589b4dc103969ad3cf85c950899926ec64300a1a46d76c03a6072957036f0" dependencies = [ "crc32fast", "miniz_oxide", @@ -1541,6 +1468,12 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +[[package]] +name = "foldhash" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f81ec6369c545a7d40e4589b5597581fa1c441fe1cce96dd1de43159910a36a2" + [[package]] name = "form_urlencoded" version = "1.2.1" @@ -1558,9 +1491,9 @@ checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" [[package]] name = "futures" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" dependencies = [ "futures-channel", "futures-core", @@ -1573,9 +1506,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" dependencies = [ "futures-core", "futures-sink", @@ -1583,15 +1516,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" [[package]] name = "futures-executor" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" +checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" dependencies = [ "futures-core", "futures-task", @@ -1600,32 +1533,32 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" [[package]] name = "futures-macro" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] name = "futures-sink" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" [[package]] name = "futures-task" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" [[package]] name = "futures-timer" @@ -1639,9 +1572,9 @@ dependencies = [ [[package]] name = "futures-util" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" dependencies = [ "futures-channel", "futures-core", @@ -1673,8 +1606,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" dependencies = [ "cfg-if", + "js-sys", "libc", "wasi", + "wasm-bindgen", ] [[package]] @@ -1689,9 +1624,9 @@ dependencies = [ [[package]] name = "gimli" -version = "0.29.0" +version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40ecd4077b5ae9fd2e9e169b102c6c330d0605168eb0e8bf79952b256dbefffd" +checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" [[package]] name = "git2" @@ -1699,7 +1634,7 @@ version = "0.18.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "232e6a7bfe35766bf715e55a88b39a700596c0ccfd88cd3680b4cdb40d66ef70" dependencies = [ - "bitflags 2.5.0", + "bitflags 2.6.0", "libc", "libgit2-sys", "log", @@ -1714,15 +1649,15 @@ checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" [[package]] name = "gloo-net" -version = "0.4.0" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ac9e8288ae2c632fa9f8657ac70bfe38a1530f345282d7ba66a1f70b72b7dc4" +checksum = "c06f627b1a58ca3d42b45d6104bf1e1a03799df472df00988b6ba21accc10580" dependencies = [ "futures-channel", "futures-core", "futures-sink", "gloo-utils", - "http 0.2.12", + "http", "js-sys", "pin-project", "serde", @@ -1771,17 +1706,17 @@ dependencies = [ [[package]] name = "h2" -version = "0.3.26" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" +checksum = "524e8ac6999421f49a846c2d4411f337e53497d8ec55d67753beffa43c5d9205" dependencies = [ + "atomic-waker", "bytes", "fnv", "futures-core", "futures-sink", - "futures-util", - "http 0.2.12", - "indexmap 2.2.6", + "http", + "indexmap", "slab", "tokio", "tokio-util", @@ -1790,18 +1725,24 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.12.3" +version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" +dependencies = [ + "ahash", + "allocator-api2", + "serde", +] [[package]] name = "hashbrown" -version = "0.14.5" +version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" +checksum = "1e087f84d4f86bf4b218b927129862374b72199ae7d8657835f1e89000eea4fb" dependencies = [ - "ahash", "allocator-api2", + "equivalent", + "foldhash", "serde", ] @@ -1814,12 +1755,6 @@ dependencies = [ "hashbrown 0.14.5", ] -[[package]] -name = "heck" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" - [[package]] name = "heck" version = "0.5.0" @@ -1859,7 +1794,7 @@ checksum = "6fe2267d4ed49bc07b63801559be28c718ea06c4738b7a03c94df7386d2cde46" [[package]] name = "hivesim" version = "0.1.0-alpha.1" -source = "git+https://github.com/ethereum/hive?rev=5c589295dae3eb896a5cb71ee639ab01add911a5#5c589295dae3eb896a5cb71ee639ab01add911a5" +source = "git+https://github.com/ethereum/hive?rev=4408fc1de3fee3ac23acd25a812c117756af2f39#4408fc1de3fee3ac23acd25a812c117756af2f39" dependencies = [ "async-trait", "dyn-clone", @@ -1889,17 +1824,6 @@ dependencies = [ "digest 0.10.7", ] -[[package]] -name = "http" -version = "0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" -dependencies = [ - "bytes", - "fnv", - "itoa", -] - [[package]] name = "http" version = "1.1.0" @@ -1911,17 +1835,6 @@ dependencies = [ "itoa", ] -[[package]] -name = "http-body" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" -dependencies = [ - "bytes", - "http 0.2.12", - "pin-project-lite", -] - [[package]] name = "http-body" version = "1.0.1" @@ -1929,7 +1842,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" dependencies = [ "bytes", - "http 1.1.0", + "http", ] [[package]] @@ -1940,16 +1853,16 @@ checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" dependencies = [ "bytes", "futures-util", - "http 1.1.0", - "http-body 1.0.1", + "http", + "http-body", "pin-project-lite", ] [[package]] name = "httparse" -version = "1.9.4" +version = "1.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fcc0b4a115bf80b728eb8ea024ad5bd707b615bfed49e0665b6e0f86fd082d9" +checksum = "7d71d3574edd2771538b901e6549113b4006ece66150fb69c0fb6d9a2adae946" [[package]] name = "httpdate" @@ -1957,30 +1870,6 @@ version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" -[[package]] -name = "hyper" -version = "0.14.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f361cde2f109281a220d4307746cdfd5ee3f410da58a70377762396775634b33" -dependencies = [ - "bytes", - "futures-channel", - "futures-core", - "futures-util", - "h2", - "http 0.2.12", - "http-body 0.4.6", - "httparse", - "httpdate", - "itoa", - "pin-project-lite", - "socket2 0.5.7", - "tokio", - "tower-service", - "tracing", - "want", -] - [[package]] name = "hyper" version = "1.4.1" @@ -1990,9 +1879,11 @@ dependencies = [ "bytes", "futures-channel", "futures-util", - "http 1.1.0", - "http-body 1.0.1", + "h2", + "http", + "http-body", "httparse", + "httpdate", "itoa", "pin-project-lite", "smallvec", @@ -2002,45 +1893,46 @@ dependencies = [ [[package]] name = "hyper-rustls" -version = "0.24.2" +version = "0.27.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" +checksum = "08afdbb5c31130e3034af566421053ab03787c640246a446327f550d11bcb333" dependencies = [ "futures-util", - "http 0.2.12", - "hyper 0.14.29", + "http", + "hyper", + "hyper-util", "log", "rustls", - "rustls-native-certs", + "rustls-pki-types", "tokio", "tokio-rustls", + "tower-service", ] [[package]] name = "hyper-util" -version = "0.1.8" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da62f120a8a37763efb0cf8fdf264b884c7b8b9ac8660b900c8661030c00e6ba" +checksum = "41296eb09f183ac68eec06e03cdbea2e759633d4067b2f6552fc2e009bcad08b" dependencies = [ "bytes", "futures-channel", "futures-util", - "http 1.1.0", - "http-body 1.0.1", - "hyper 1.4.1", + "http", + "http-body", + "hyper", "pin-project-lite", "socket2 0.5.7", "tokio", - "tower", "tower-service", "tracing", ] [[package]] name = "iana-time-zone" -version = "0.1.60" +version = "0.1.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141" +checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220" dependencies = [ "android_system_properties", "core-foundation-sys", @@ -2114,23 +2006,12 @@ dependencies = [ [[package]] name = "indexmap" -version = "1.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" -dependencies = [ - "autocfg", - "hashbrown 0.12.3", - "serde", -] - -[[package]] -name = "indexmap" -version = "2.2.6" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" +checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" dependencies = [ "equivalent", - "hashbrown 0.14.5", + "hashbrown 0.15.0", "serde", ] @@ -2145,9 +2026,9 @@ dependencies = [ [[package]] name = "ipnet" -version = "2.9.0" +version = "2.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" +checksum = "ddc24109865250148c2e0f3d25d4f0f479571723792d3802153c60922a4fb708" [[package]] name = "is_debug" @@ -2157,9 +2038,9 @@ checksum = "06d198e9919d9822d5f7083ba8530e04de87841eaf21ead9af8f2304efd57c89" [[package]] name = "is_terminal_polyfill" -version = "1.70.0" +version = "1.70.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8478577c03552c21db0e2724ffb8986a5ce7af88107e6be5d2ee6e158c12800" +checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" [[package]] name = "itertools" @@ -2186,35 +2067,55 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" [[package]] -name = "jobserver" -version = "0.1.31" +name = "jni" +version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2b099aaa34a9751c5bf0878add70444e1ed2dd73f347be99003d4577277de6e" +checksum = "c6df18c2e3db7e453d3c6ac5b3e9d5182664d28788126d39b91f2d1e22b017ec" dependencies = [ - "libc", + "cesu8", + "combine", + "jni-sys", + "log", + "thiserror", + "walkdir", ] [[package]] -name = "js-sys" -version = "0.3.69" +name = "jni-sys" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" -dependencies = [ - "wasm-bindgen", -] +checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" [[package]] -name = "jsonrpsee" -version = "0.20.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "affdc52f7596ccb2d7645231fc6163bb314630c989b64998f3699a28b4d5d4dc" +name = "jobserver" +version = "0.1.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0" +dependencies = [ + "libc", +] + +[[package]] +name = "js-sys" +version = "0.3.70" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1868808506b929d7b0cfa8f75951347aa71bb21144b7791bae35d9bccfcfe37a" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "jsonrpsee" +version = "0.24.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02f01f48e04e0d7da72280ab787c9943695699c9b32b99158ece105e8ad0afea" dependencies = [ "jsonrpsee-client-transport", "jsonrpsee-core", "jsonrpsee-http-client", "jsonrpsee-proc-macros", "jsonrpsee-server", - "jsonrpsee-types 0.20.3", + "jsonrpsee-types", "jsonrpsee-wasm-client", "jsonrpsee-ws-client", "tokio", @@ -2223,17 +2124,20 @@ dependencies = [ [[package]] name = "jsonrpsee-client-transport" -version = "0.20.3" +version = "0.24.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5b005c793122d03217da09af68ba9383363caa950b90d3436106df8cabce935" +checksum = "d80eccbd47a7b9f1e67663fd846928e941cb49c65236e297dd11c9ea3c5e3387" dependencies = [ + "base64 0.22.1", "futures-channel", "futures-util", "gloo-net", - "http 0.2.12", + "http", "jsonrpsee-core", "pin-project", - "rustls-native-certs", + "rustls", + "rustls-pki-types", + "rustls-platform-verifier", "soketto", "thiserror", "tokio", @@ -2241,46 +2145,51 @@ dependencies = [ "tokio-util", "tracing", "url", - "webpki-roots", ] [[package]] name = "jsonrpsee-core" -version = "0.20.3" +version = "0.24.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da2327ba8df2fdbd5e897e2b5ed25ce7f299d345b9736b6828814c3dbd1fd47b" +checksum = "3c2709a32915d816a6e8f625bf72cf74523ebe5d8829f895d6b041b1d3137818" dependencies = [ - "anyhow", - "async-lock", "async-trait", - "beef", + "bytes", "futures-timer", "futures-util", - "hyper 0.14.29", - "jsonrpsee-types 0.20.3", + "http", + "http-body", + "http-body-util", + "jsonrpsee-types", "parking_lot 0.12.3", + "pin-project", "rand", "rustc-hash", "serde", "serde_json", - "soketto", "thiserror", "tokio", + "tokio-stream", "tracing", "wasm-bindgen-futures", ] [[package]] name = "jsonrpsee-http-client" -version = "0.20.3" +version = "0.24.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f80c17f62c7653ce767e3d7288b793dfec920f97067ceb189ebdd3570f2bc20" +checksum = "cc54db939002b030e794fbfc9d5a925aa2854889c5a2f0352b0bffa54681707e" dependencies = [ "async-trait", - "hyper 0.14.29", + "base64 0.22.1", + "http-body", + "hyper", "hyper-rustls", + "hyper-util", "jsonrpsee-core", - "jsonrpsee-types 0.20.3", + "jsonrpsee-types", + "rustls", + "rustls-platform-verifier", "serde", "serde_json", "thiserror", @@ -2292,28 +2201,32 @@ dependencies = [ [[package]] name = "jsonrpsee-proc-macros" -version = "0.20.3" +version = "0.24.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29110019693a4fa2dbda04876499d098fa16d70eba06b1e6e2b3f1b251419515" +checksum = "3a9a4b2eaba8cc928f49c4ccf4fcfa65b690a73997682da99ed08f3393b51f07" dependencies = [ - "heck 0.4.1", - "proc-macro-crate 1.3.1", + "heck", + "proc-macro-crate", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.79", ] [[package]] name = "jsonrpsee-server" -version = "0.20.3" +version = "0.24.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82c39a00449c9ef3f50b84fc00fc4acba20ef8f559f07902244abf4c15c5ab9c" +checksum = "e30110d0f2d7866c8cc6c86483bdab2eb9f4d2f0e20db55518b2bca84651ba8e" dependencies = [ "futures-util", - "http 0.2.12", - "hyper 0.14.29", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-util", "jsonrpsee-core", - "jsonrpsee-types 0.20.3", + "jsonrpsee-types", + "pin-project", "route-recognizer", "serde", "serde_json", @@ -2328,25 +2241,11 @@ dependencies = [ [[package]] name = "jsonrpsee-types" -version = "0.20.3" +version = "0.24.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5be0be325642e850ed0bdff426674d2e66b2b7117c9be23a7caef68a2902b7d9" +checksum = "1ca331cd7b3fe95b33432825c2d4c9f5a43963e207fdc01ae67f9fd80ab0930f" dependencies = [ - "anyhow", - "beef", - "serde", - "serde_json", - "thiserror", - "tracing", -] - -[[package]] -name = "jsonrpsee-types" -version = "0.24.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "531e386460425e49679587871a056f2895a47dade21457324ad1262cd78ef6d9" -dependencies = [ - "http 1.1.0", + "http", "serde", "serde_json", "thiserror", @@ -2354,33 +2253,48 @@ dependencies = [ [[package]] name = "jsonrpsee-wasm-client" -version = "0.20.3" +version = "0.24.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c7cbb3447cf14fd4d2f407c3cc96e6c9634d5440aa1fbed868a31f3c02b27f0" +checksum = "5c603d97578071dc44d79d3cfaf0775437638fd5adc33c6b622dfe4fa2ec812d" dependencies = [ "jsonrpsee-client-transport", "jsonrpsee-core", - "jsonrpsee-types 0.20.3", + "jsonrpsee-types", ] [[package]] name = "jsonrpsee-ws-client" -version = "0.20.3" +version = "0.24.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bca9cb3933ccae417eb6b08c3448eb1cb46e39834e5b503e395e5e5bd08546c0" +checksum = "755ca3da1c67671f1fae01cd1a47f41dfb2233a8f19a643e587ab0a663942044" dependencies = [ - "http 0.2.12", + "http", "jsonrpsee-client-transport", "jsonrpsee-core", - "jsonrpsee-types 0.20.3", + "jsonrpsee-types", "url", ] +[[package]] +name = "jsonwebtoken" +version = "9.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9ae10193d25051e74945f1ea2d0b42e03cc3b890f7e4cc5faa44997d808193f" +dependencies = [ + "base64 0.21.7", + "js-sys", + "pem", + "ring", + "serde", + "serde_json", + "simple_asn1", +] + [[package]] name = "k256" -version = "0.13.3" +version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "956ff9b67e26e1a6a866cb758f12c6f8746208489e3e4a4b5580802f2f0a587b" +checksum = "f6e3919bbaa2945715f0bb6d3934a173d1e9a59ac23767fbaaef277265a7411b" dependencies = [ "cfg-if", "ecdsa", @@ -2401,9 +2315,9 @@ dependencies = [ [[package]] name = "keccak-asm" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "422fbc7ff2f2f5bdffeb07718e5a5324dca72b0c9293d50df4026652385e3314" +checksum = "505d1856a39b200489082f90d897c3f07c455563880bc5952e38eabf731c83b6" dependencies = [ "digest 0.10.7", "sha3-asm", @@ -2436,15 +2350,15 @@ checksum = "a4933f3f57a8e9d9da04db23fb153356ecaf00cbd14aee46279c33dc80925c37" [[package]] name = "lazy_static" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "libc" -version = "0.2.155" +version = "0.2.159" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" +checksum = "561d97a539a36e26a9a5fad1ea11a3039a67714694aaa379433e580854bc3dc5" [[package]] name = "libgit2-sys" @@ -2464,11 +2378,21 @@ version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" +[[package]] +name = "libredox" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" +dependencies = [ + "bitflags 2.6.0", + "libc", +] + [[package]] name = "libz-sys" -version = "1.1.18" +version = "1.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c15da26e5af7e25c90b37a2d75cdbf940cf4a55316de9d84c679c9b8bfabf82e" +checksum = "d2d16453e800a8cf6dd2fc3eb4bc99b786a9b90c663b8559a5b1a041bf89e472" dependencies = [ "cc", "libc", @@ -2494,17 +2418,17 @@ dependencies = [ [[package]] name = "log" -version = "0.4.21" +version = "0.4.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" +checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" [[package]] name = "lru" -version = "0.12.3" +version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3262e75e648fce39813cb56ac41f3c3e3f65217ebf3844d818d1f9398cfb0dc" +checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" dependencies = [ - "hashbrown 0.14.5", + "hashbrown 0.15.0", ] [[package]] @@ -2536,9 +2460,9 @@ checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" [[package]] name = "mime_guess" -version = "2.0.4" +version = "2.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4192263c238a5f0d0c6bfd21f336a313a4ce1c450542449ca191bb657b4642ef" +checksum = "f7c44f8e672c00fe5308fa235f821cb4198414e1c77935c1ab6948d3fd78550e" dependencies = [ "mime", "unicase", @@ -2546,22 +2470,23 @@ dependencies = [ [[package]] name = "miniz_oxide" -version = "0.7.4" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8a240ddb74feaf34a79a7add65a741f3167852fba007066dcac1ca548d89c08" +checksum = "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1" dependencies = [ - "adler", + "adler2", ] [[package]] name = "mio" -version = "0.8.11" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" +checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec" dependencies = [ + "hermit-abi 0.3.9", "libc", "wasi", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] @@ -2588,9 +2513,9 @@ dependencies = [ [[package]] name = "num-bigint" -version = "0.4.5" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c165a9ab64cf766f73521c0dd2cfdff64f488b8f0b3e621face3462d3db536d7" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" dependencies = [ "num-integer", "num-traits", @@ -2642,100 +2567,18 @@ dependencies = [ [[package]] name = "object" -version = "0.36.0" +version = "0.36.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "576dfe1fc8f9df304abb159d767a29d0476f7750fbf8aa7ad07816004a207434" +checksum = "aedf0a2d09c573ed1d8d85b30c119153926a2b36dce0ab28322c09a117a4683e" dependencies = [ "memchr", ] [[package]] name = "once_cell" -version = "1.19.0" +version = "1.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" - -[[package]] -name = "op-alloy-consensus" -version = "0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21aad1fbf80d2bcd7406880efc7ba109365f44bbb72896758ddcbfa46bf1592c" -dependencies = [ - "alloy-consensus", - "alloy-eips", - "alloy-primitives", - "alloy-rlp", - "alloy-serde", - "derive_more", - "serde", - "spin", -] - -[[package]] -name = "op-alloy-genesis" -version = "0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e1b8a9b70da0e027242ec1762f0f3a386278b6291d00d12ff5a64929dc19f68" -dependencies = [ - "alloy-consensus", - "alloy-eips", - "alloy-primitives", - "alloy-sol-types", - "serde", - "serde_repr", -] - -[[package]] -name = "op-alloy-protocol" -version = "0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf300a82ae2d30e2255bfea87a2259da49f63a25a44db561ae64cc9e3084139f" -dependencies = [ - "alloy-consensus", - "alloy-eips", - "alloy-primitives", - "alloy-rlp", - "alloy-serde", - "hashbrown 0.14.5", - "op-alloy-consensus", - "op-alloy-genesis", - "serde", -] - -[[package]] -name = "op-alloy-rpc-types" -version = "0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e281fbfc2198b7c0c16457d6524f83d192662bc9f3df70f24c3038d4521616df" -dependencies = [ - "alloy-eips", - "alloy-network-primitives", - "alloy-primitives", - "alloy-rpc-types-eth", - "alloy-serde", - "cfg-if", - "hashbrown 0.14.5", - "op-alloy-consensus", - "serde", - "serde_json", -] - -[[package]] -name = "op-alloy-rpc-types-engine" -version = "0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2947272a81ebf988f4804b6f0f6a7c0b2f6f89a908cb410e36f8f3828f81c778" -dependencies = [ - "alloy-eips", - "alloy-primitives", - "alloy-rpc-types-engine", - "alloy-serde", - "derive_more", - "op-alloy-consensus", - "op-alloy-genesis", - "op-alloy-protocol", - "serde", -] +checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" [[package]] name = "opaque-debug" @@ -2775,7 +2618,7 @@ version = "3.6.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d830939c76d294956402033aee57a6da7b438f2294eb94864c37b0569053a42c" dependencies = [ - "proc-macro-crate 3.1.0", + "proc-macro-crate", "proc-macro2", "quote", "syn 1.0.109", @@ -2824,9 +2667,9 @@ checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.5.2", + "redox_syscall 0.5.7", "smallvec", - "windows-targets 0.52.6", + "windows-targets", ] [[package]] @@ -2835,6 +2678,16 @@ version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" +[[package]] +name = "pem" +version = "3.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e459365e590736a54c3fa561947c84837534b8e9af6fc5bf781307e82658fae" +dependencies = [ + "base64 0.22.1", + "serde", +] + [[package]] name = "percent-encoding" version = "2.3.1" @@ -2843,9 +2696,9 @@ checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "pest" -version = "2.7.10" +version = "2.7.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "560131c633294438da9f7c4b08189194b20946c8274c6b9e38881a7874dc8ee8" +checksum = "fdbef9d1d47087a895abd220ed25eb4ad973a5e26f6a4367b038c25e28dfc2d9" dependencies = [ "memchr", "thiserror", @@ -2854,22 +2707,22 @@ dependencies = [ [[package]] name = "pin-project" -version = "1.1.5" +version = "1.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" +checksum = "baf123a161dde1e524adf36f90bc5d8d3462824a9c43553ad07a8183161189ec" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.5" +version = "1.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" +checksum = "a4502d8515ca9f32f1fb543d987f63d95a14934883db45bdb48060b6b69257f8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -2896,9 +2749,9 @@ dependencies = [ [[package]] name = "pkg-config" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" +checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" [[package]] name = "polyval" @@ -2937,9 +2790,12 @@ checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" [[package]] name = "ppv-lite86" -version = "0.2.17" +version = "0.2.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" +checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" +dependencies = [ + "zerocopy", +] [[package]] name = "primitive-types" @@ -2954,21 +2810,11 @@ dependencies = [ [[package]] name = "proc-macro-crate" -version = "1.3.1" +version = "3.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" +checksum = "8ecf48c7ca261d60b74ab1a7b20da18bede46776b2e55535cb958eb595c5fa7b" dependencies = [ - "once_cell", - "toml_edit 0.19.15", -] - -[[package]] -name = "proc-macro-crate" -version = "3.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d37c51ca738a55da99dc0c4a34860fd675453b8b36209178c2249bb13651284" -dependencies = [ - "toml_edit 0.21.1", + "toml_edit", ] [[package]] @@ -3014,33 +2860,33 @@ dependencies = [ "proc-macro-error-attr2", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] name = "proc-macro2" -version = "1.0.85" +version = "1.0.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22244ce15aa966053a896d1accb3a6e68469b97c7f33f284b99f0d576879fc23" +checksum = "b3e4daa0dcf6feba26f985457cdf104d4b4256fc5a09547140f3631bb076b19a" dependencies = [ "unicode-ident", ] [[package]] name = "proptest" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31b476131c3c86cb68032fdc5cb6d5a1045e3e42d96b69fa599fd77701e1f5bf" +checksum = "b4c2511913b88df1637da85cc8d96ec8e43a3f8bb8ccb71ee1ac240d6f3df58d" dependencies = [ "bit-set", "bit-vec", - "bitflags 2.5.0", + "bitflags 2.6.0", "lazy_static", "num-traits", "rand", "rand_chacha", "rand_xorshift", - "regex-syntax 0.8.4", + "regex-syntax 0.8.5", "rusty-fork", "tempfile", "unarray", @@ -3065,9 +2911,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.36" +version = "1.0.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" +checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" dependencies = [ "proc-macro2", ] @@ -3087,6 +2933,7 @@ dependencies = [ "libc", "rand_chacha", "rand_core", + "serde", ] [[package]] @@ -3128,23 +2975,34 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.2" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c82cf8cff14456045f55ec4241383baeff27af886adb72ffb2162f99911de0fd" +checksum = "9b6dfecf2c74bce2466cabf93f6664d6998a69eb21e39f4207930065b27b771f" dependencies = [ - "bitflags 2.5.0", + "bitflags 2.6.0", +] + +[[package]] +name = "redox_users" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" +dependencies = [ + "getrandom", + "libredox", + "thiserror", ] [[package]] name = "regex" -version = "1.10.5" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b91213439dad192326a0d7c6ee3955910425f441d7038e0d6933b0aec5c4517f" +checksum = "38200e5ee88914975b69f657f0801b6f6dccafd44fd9326302a4aaeecfacb1d8" dependencies = [ "aho-corasick", "memchr", - "regex-automata 0.4.7", - "regex-syntax 0.8.4", + "regex-automata 0.4.8", + "regex-syntax 0.8.5", ] [[package]] @@ -3158,13 +3016,13 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.7" +version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" +checksum = "368758f23274712b504848e9d5a6f010445cc8b87a7cdb4d7cbee666c1288da3" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.8.4", + "regex-syntax 0.8.5", ] [[package]] @@ -3175,24 +3033,24 @@ checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" [[package]] name = "regex-syntax" -version = "0.8.4" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" [[package]] name = "reqwest" -version = "0.12.7" +version = "0.12.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8f4955649ef5c38cc7f9e8aa41761d48fb9677197daea9984dc54f56aad5e63" +checksum = "f713147fbe92361e52392c73b8c9e48c04c6625bce969ef54dc901e58e042a7b" dependencies = [ "base64 0.22.1", "bytes", "futures-core", "futures-util", - "http 1.1.0", - "http-body 1.0.1", + "http", + "http-body", "http-body-util", - "hyper 1.4.1", + "hyper", "hyper-util", "ipnet", "js-sys", @@ -3215,26 +3073,6 @@ dependencies = [ "windows-registry", ] -[[package]] -name = "reth-rpc-types" -version = "1.0.6" -source = "git+https://github.com/paradigmxyz/reth.git?tag=v1.0.6#c228fe15808c3acbf18dc3af1a03ef5cbdcda07a" -dependencies = [ - "alloy-primitives", - "alloy-rpc-types", - "alloy-rpc-types-admin", - "alloy-rpc-types-anvil", - "alloy-rpc-types-beacon", - "alloy-rpc-types-engine", - "alloy-rpc-types-mev", - "alloy-rpc-types-trace", - "alloy-rpc-types-txpool", - "alloy-serde", - "jsonrpsee-types 0.24.4", - "op-alloy-rpc-types", - "op-alloy-rpc-types-engine", -] - [[package]] name = "rfc6979" version = "0.4.0" @@ -3323,9 +3161,9 @@ checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" [[package]] name = "rustc-hash" -version = "1.1.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" +checksum = "583034fd73374156e66797ed8e5b0d5690409c9226b22d87cb7f19821c05d152" [[package]] name = "rustc-hex" @@ -3344,20 +3182,20 @@ dependencies = [ [[package]] name = "rustc_version" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" dependencies = [ "semver 1.0.23", ] [[package]] name = "rustix" -version = "0.38.34" +version = "0.38.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" +checksum = "8acb788b847c24f28525660c4d7758620a7210875711f79e7f663cc152726811" dependencies = [ - "bitflags 2.5.0", + "bitflags 2.6.0", "errno", "libc", "linux-raw-sys", @@ -3366,44 +3204,82 @@ dependencies = [ [[package]] name = "rustls" -version = "0.21.12" +version = "0.23.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" +checksum = "415d9944693cb90382053259f89fbb077ea730ad7273047ec63b19bc9b160ba8" dependencies = [ "log", + "once_cell", "ring", + "rustls-pki-types", "rustls-webpki", - "sct", + "subtle", + "zeroize", ] [[package]] name = "rustls-native-certs" -version = "0.6.3" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9aace74cb666635c918e9c12bc0d348266037aa8eb599b5cba565709a8dff00" +checksum = "e5bfb394eeed242e909609f56089eecfe5fda225042e8b171791b9c95f5931e5" dependencies = [ "openssl-probe", "rustls-pemfile", + "rustls-pki-types", "schannel", "security-framework", ] [[package]] name = "rustls-pemfile" -version = "1.0.4" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" +checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" dependencies = [ - "base64 0.21.7", + "rustls-pki-types", +] + +[[package]] +name = "rustls-pki-types" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e696e35370c65c9c541198af4543ccd580cf17fc25d8e05c5a242b202488c55" + +[[package]] +name = "rustls-platform-verifier" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "afbb878bdfdf63a336a5e63561b1835e7a8c91524f51621db870169eac84b490" +dependencies = [ + "core-foundation", + "core-foundation-sys", + "jni", + "log", + "once_cell", + "rustls", + "rustls-native-certs", + "rustls-platform-verifier-android", + "rustls-webpki", + "security-framework", + "security-framework-sys", + "webpki-roots", + "winapi", ] +[[package]] +name = "rustls-platform-verifier-android" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f87165f0995f63a9fbeea62b64d10b4d9d8e78ec6d7d51fb2125fda7bb36788f" + [[package]] name = "rustls-webpki" -version = "0.101.7" +version = "0.102.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" +checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9" dependencies = [ "ring", + "rustls-pki-types", "untrusted", ] @@ -3425,13 +3301,22 @@ version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + [[package]] name = "schannel" -version = "0.1.23" +version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534" +checksum = "01227be5826fa0690321a2ba6c5cd57a19cf3f6a09e76973b58e61de6ab9d1c1" dependencies = [ - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -3440,16 +3325,6 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" -[[package]] -name = "sct" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" -dependencies = [ - "ring", - "untrusted", -] - [[package]] name = "sec1" version = "0.7.3" @@ -3466,9 +3341,9 @@ dependencies = [ [[package]] name = "secp256k1" -version = "0.29.0" +version = "0.29.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e0cc0f1cf93f4969faf3ea1c7d8a9faed25918d96affa959720823dfe86d4f3" +checksum = "9465315bc9d4566e1724f0fffcbcc446268cb522e60f9a27bcded6b19c108113" dependencies = [ "rand", "secp256k1-sys", @@ -3476,31 +3351,32 @@ dependencies = [ [[package]] name = "secp256k1-sys" -version = "0.10.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1433bd67156263443f14d603720b082dd3121779323fce20cba2aa07b874bc1b" +checksum = "d4387882333d3aa8cb20530a17c69a3752e97837832f34f6dccc760e715001d9" dependencies = [ "cc", ] [[package]] name = "security-framework" -version = "2.11.0" +version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c627723fd09706bacdb5cf41499e95098555af3c3c29d014dc3c458ef6be11c0" +checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ - "bitflags 2.5.0", + "bitflags 2.6.0", "core-foundation", "core-foundation-sys", "libc", + "num-bigint", "security-framework-sys", ] [[package]] name = "security-framework-sys" -version = "2.11.0" +version = "2.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "317936bbbd05227752583946b9e66d7ce3b489f84e11a94a510b4437fef407d7" +checksum = "ea4a292869320c0272d7bc55a5a6aafaff59b4f63404a003887b679a2e05b4b6" dependencies = [ "core-foundation-sys", "libc", @@ -3538,9 +3414,9 @@ checksum = "f638d531eccd6e23b980caf34876660d38e265409d8e99b397ab71eb3612fad0" [[package]] name = "serde" -version = "1.0.203" +version = "1.0.210" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7253ab4de971e72fb7be983802300c30b5a7f0c2e56fab8abfc6a214307c0094" +checksum = "c8e3592472072e6e22e0a54d5904d9febf8508f65fb8552499a1abc7d1078c3a" dependencies = [ "serde_derive", ] @@ -3556,37 +3432,27 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.203" +version = "1.0.210" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "500cbc0ebeb6f46627f50f3f5811ccf6bf00643be300b4c3eabc0ef55dc5b5ba" +checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] name = "serde_json" -version = "1.0.117" +version = "1.0.128" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "455182ea6142b14f93f4bc5320a2b31c1f266b66a4a5c858b013302a5d8cbfc3" +checksum = "6ff5456707a1de34e7e37f2a6fd3d3f808c318259cbd01ab6377795054b483d8" dependencies = [ "itoa", + "memchr", "ryu", "serde", ] -[[package]] -name = "serde_repr" -version = "0.1.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.77", -] - [[package]] name = "serde_urlencoded" version = "0.7.1" @@ -3599,43 +3465,13 @@ dependencies = [ "serde", ] -[[package]] -name = "serde_with" -version = "3.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ad483d2ab0149d5a5ebcd9972a3852711e0153d863bf5a5d0391d28883c4a20" -dependencies = [ - "base64 0.22.1", - "chrono", - "hex", - "indexmap 1.9.3", - "indexmap 2.2.6", - "serde", - "serde_derive", - "serde_json", - "serde_with_macros", - "time", -] - -[[package]] -name = "serde_with_macros" -version = "3.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65569b702f41443e8bc8bbb1c5779bd0450bbe723b56198980e80ec45780bce2" -dependencies = [ - "darling 0.20.9", - "proc-macro2", - "quote", - "syn 2.0.77", -] - [[package]] name = "serde_yaml" version = "0.9.34+deprecated" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" dependencies = [ - "indexmap 2.2.6", + "indexmap", "itoa", "ryu", "serde", @@ -3643,16 +3479,14 @@ dependencies = [ ] [[package]] -name = "sha-1" -version = "0.9.8" +name = "sha1" +version = "0.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99cd6713db3cf16b6c84e06321e049a9b9f699826e16096d23bbcc44d15d51a6" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" dependencies = [ - "block-buffer 0.9.0", "cfg-if", "cpufeatures", - "digest 0.9.0", - "opaque-debug", + "digest 0.10.7", ] [[package]] @@ -3690,9 +3524,9 @@ dependencies = [ [[package]] name = "sha3-asm" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57d79b758b7cb2085612b11a235055e485605a5103faccdd633f35bd7aee69dd" +checksum = "c28efc5e327c837aa837c59eae585fc250715ef939ac32881bcc11677cd02d46" dependencies = [ "cc", "cfg-if", @@ -3720,6 +3554,12 @@ dependencies = [ "lazy_static", ] +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + [[package]] name = "signal-hook-registry" version = "1.4.2" @@ -3739,6 +3579,18 @@ dependencies = [ "rand_core", ] +[[package]] +name = "simple_asn1" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adc4e5204eb1910f40f9cfa375f6f05b68c3abac4b6fd879c8ff5e7ae8a0a085" +dependencies = [ + "num-bigint", + "num-traits", + "thiserror", + "time", +] + [[package]] name = "slab" version = "0.4.9" @@ -3776,18 +3628,18 @@ dependencies = [ [[package]] name = "soketto" -version = "0.7.1" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41d1c5305e39e09653383c2c7244f2f78b3bcae37cf50c64cb4789c9f5096ec2" +checksum = "37468c595637c10857701c990f93a40ce0e357cedb0953d1c26c8d8027f9bb53" dependencies = [ - "base64 0.13.1", + "base64 0.22.1", "bytes", "futures", - "http 0.2.12", + "http", "httparse", "log", "rand", - "sha-1", + "sha1", ] [[package]] @@ -3795,9 +3647,6 @@ name = "spin" version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" -dependencies = [ - "lock_api", -] [[package]] name = "spki" @@ -3846,9 +3695,9 @@ checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] name = "subtle" -version = "2.4.1" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "superstruct" @@ -3877,9 +3726,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.77" +version = "2.0.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f35bcdf61fd8e7be6caf75f429fdca8beb3ed76584befb503b1569faee373ed" +checksum = "89132cd0bf050864e1d38dc3bbc07a0eb8e7530af26344d3d2bbbef83499f590" dependencies = [ "proc-macro2", "quote", @@ -3888,14 +3737,14 @@ dependencies = [ [[package]] name = "syn-solidity" -version = "0.8.3" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b95156f8b577cb59dc0b1df15c6f29a10afc5f8a7ac9786b0b5c68c19149278" +checksum = "20e7b52ad118b2153644eea95c6fc740b6c1555b2344fdab763fc9de4075f665" dependencies = [ "paste", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -3915,34 +3764,35 @@ checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" [[package]] name = "tempfile" -version = "3.10.1" +version = "3.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1" +checksum = "f0f2c9fc62d0beef6951ccffd757e241266a2c833136efbe35af6cd2567dca5b" dependencies = [ "cfg-if", "fastrand", + "once_cell", "rustix", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] name = "thiserror" -version = "1.0.61" +version = "1.0.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c546c80d6be4bc6a00c0f01730c08df82eaa7a7a61f11d656526506112cc1709" +checksum = "d50af8abc119fb8bb6dbabcfa89656f46f84aa0ac7688088608076ad2b459a84" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.61" +version = "1.0.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46c3384250002a6d5af4d114f2845d37b57521033f30d5c3f46c4d70e1197533" +checksum = "08904e7672f5eb876eaaf87e0ce17857500934f4981c4a0ab2b4aa98baac7fc3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -4008,9 +3858,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.6.0" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" dependencies = [ "tinyvec_macros", ] @@ -4023,60 +3873,61 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.38.0" +version = "1.40.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba4f4a02a7a80d6f274636f0aa95c7e383b912d41fe721a31f29e29698585a4a" +checksum = "e2b070231665d27ad9ec9b8df639893f46727666c6767db40317fbe920a5d998" dependencies = [ "backtrace", "bytes", "libc", "mio", - "num_cpus", "parking_lot 0.12.3", "pin-project-lite", "signal-hook-registry", "socket2 0.5.7", "tokio-macros", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] name = "tokio-macros" -version = "2.3.0" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f5ae998a069d4b5aba8ee9dad856af7d520c3699e6159b185c2acd48155d39a" +checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] name = "tokio-rustls" -version = "0.24.1" +version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" +checksum = "0c7bc40d0e5a97695bb96e27995cd3a08538541b0a846f65bba7a359f36700d4" dependencies = [ "rustls", + "rustls-pki-types", "tokio", ] [[package]] name = "tokio-stream" -version = "0.1.15" +version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "267ac89e0bec6e691e5813911606935d77c476ff49024f98abcea3e7b15e37af" +checksum = "4f4e6ce100d0eb49a2734f8c0812bcd324cf357d21810932c5df6b96ef2b86f1" dependencies = [ "futures-core", "pin-project-lite", "tokio", + "tokio-util", ] [[package]] name = "tokio-util" -version = "0.7.11" +version = "0.7.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cf6b47b3771c49ac75ad09a6162f53ad4b8088b76ac60e8ec1455b31a189fe1" +checksum = "61e7c3654c13bcd040d4a03abee2c75b1d14a37b423cf5a813ceae1cc903ec6a" dependencies = [ "bytes", "futures-core", @@ -4089,28 +3940,17 @@ dependencies = [ [[package]] name = "toml_datetime" -version = "0.6.6" +version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4badfd56924ae69bcc9039335b2e017639ce3f9b001c393c1b2d1ef846ce2cbf" +checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" [[package]] name = "toml_edit" -version = "0.19.15" +version = "0.22.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" +checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" dependencies = [ - "indexmap 2.2.6", - "toml_datetime", - "winnow", -] - -[[package]] -name = "toml_edit" -version = "0.21.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a8534fd7f78b5405e860340ad6575217ce99f38d4d5c8f2442cb5ecb50090e1" -dependencies = [ - "indexmap 2.2.6", + "indexmap", "toml_datetime", "winnow", ] @@ -4125,7 +3965,6 @@ dependencies = [ "futures-util", "pin-project", "pin-project-lite", - "tokio", "tower-layer", "tower-service", "tracing", @@ -4133,15 +3972,15 @@ dependencies = [ [[package]] name = "tower-layer" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" [[package]] name = "tower-service" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" [[package]] name = "tracing" @@ -4163,7 +4002,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -4222,20 +4061,23 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b0857056ca4eb5de8c417309be42bcff6017b47e86fbaddde609b4633f66061e" dependencies = [ - "darling 0.20.9", + "darling 0.20.10", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] name = "trin-utils" version = "0.1.1-alpha.1" -source = "git+https://github.com/ethereum/trin?rev=c416cd9faf933f89b44a517ca7ada144bf2baee9#c416cd9faf933f89b44a517ca7ada144bf2baee9" +source = "git+https://github.com/ethereum/trin?rev=627189e570d5750cc0e9b009df13921b2973f99b#627189e570d5750cc0e9b009df13921b2973f99b" dependencies = [ "ansi_term", "atty", + "directories", "shadow-rs", + "tempfile", + "tracing", "tracing-subscriber", ] @@ -4273,18 +4115,18 @@ dependencies = [ [[package]] name = "tzdb_data" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1889fdffac09d65c1d95c42d5202e9b21ad8c758f426e9fe09088817ea998d6" +checksum = "654c1ec546942ce0594e8d220e6b8e3899e0a0a8fe70ddd54d32a376dfefe3f8" dependencies = [ "tz-rs", ] [[package]] name = "ucd-trie" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed646292ffc8188ef8ea4d1e0e0150fb15a5c2e12ad9b8fc191ae7a8a7f3c4b9" +checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971" [[package]] name = "uint" @@ -4315,36 +4157,36 @@ dependencies = [ [[package]] name = "unicode-bidi" -version = "0.3.15" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" +checksum = "5ab17db44d7388991a428b2ee655ce0c212e862eff1768a455c58f9aad6e7893" [[package]] name = "unicode-ident" -version = "1.0.12" +version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" +checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" [[package]] name = "unicode-normalization" -version = "0.1.23" +version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" +checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956" dependencies = [ "tinyvec", ] [[package]] name = "unicode-xid" -version = "0.2.4" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" [[package]] name = "universal-hash" -version = "0.4.1" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f214e8f697e925001e66ec2c6e37a4ef93f0f78c2eed7814394e10c62025b05" +checksum = "8326b2c654932e3e4f9196e69d08fdf7cfd718e1dc6f66b347e6024a0c961402" dependencies = [ "generic-array", "subtle", @@ -4364,16 +4206,16 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "ureq" -version = "2.9.1" +version = "2.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8cdd25c339e200129fe4de81451814e5228c9b771d57378817d6117cc2b3f97" +checksum = "b74fc6b57825be3373f7054754755f03ac3a8f5d70015ccad699ba2029956f4a" dependencies = [ - "base64 0.21.7", + "base64 0.22.1", "flate2", "log", "once_cell", "rustls", - "rustls-webpki", + "rustls-pki-types", "serde", "serde_json", "url", @@ -4450,9 +4292,9 @@ checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" [[package]] name = "version_check" -version = "0.9.4" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" [[package]] name = "wait-timeout" @@ -4463,6 +4305,16 @@ dependencies = [ "libc", ] +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + [[package]] name = "want" version = "0.3.1" @@ -4480,34 +4332,35 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.92" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" +checksum = "a82edfc16a6c469f5f44dc7b571814045d60404b55a0ee849f9bcfa2e63dd9b5" dependencies = [ "cfg-if", + "once_cell", "wasm-bindgen-macro", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.92" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" +checksum = "9de396da306523044d3302746f1208fa71d7532227f15e347e2d93e4145dd77b" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.42" +version = "0.4.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76bc14366121efc8dbb487ab05bcc9d346b3b5ec0eaa76e46594cabbe51762c0" +checksum = "61e9300f63a621e96ed275155c108eb6f843b6a26d053f122ab69724559dc8ed" dependencies = [ "cfg-if", "js-sys", @@ -4517,9 +4370,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.92" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" +checksum = "585c4c91a46b072c92e908d99cb1dcdf95c5218eeb6f3bf1efa991ee7a68cccf" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -4527,28 +4380,28 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.92" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" +checksum = "afc340c74d9005395cf9dd098506f7f44e38f2b4a21c6aaacf9a105ea5e1e836" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.92" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" +checksum = "c62a0a307cb4a311d3a07867860911ca130c3494e8c2719593806c08bc5d0484" [[package]] name = "web-sys" -version = "0.3.69" +version = "0.3.70" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef" +checksum = "26fdeaafd9bd129f65e7c031593c24d62186301e0c72c8978fa1678be7d532c0" dependencies = [ "js-sys", "wasm-bindgen", @@ -4556,9 +4409,12 @@ dependencies = [ [[package]] name = "webpki-roots" -version = "0.25.4" +version = "0.26.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" +checksum = "841c67bff177718f1d4dfefde8d8f0e78f9b6589319ba88312f567fc5841a958" +dependencies = [ + "rustls-pki-types", +] [[package]] name = "winapi" @@ -4576,6 +4432,15 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" +[[package]] +name = "winapi-util" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" +dependencies = [ + "windows-sys 0.59.0", +] + [[package]] name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" @@ -4588,7 +4453,7 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" dependencies = [ - "windows-targets 0.52.6", + "windows-targets", ] [[package]] @@ -4599,7 +4464,7 @@ checksum = "e400001bb720a623c1c69032f8e3e4cf09984deec740f007dd2b03ec864804b0" dependencies = [ "windows-result", "windows-strings", - "windows-targets 0.52.6", + "windows-targets", ] [[package]] @@ -4608,7 +4473,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" dependencies = [ - "windows-targets 0.52.6", + "windows-targets", ] [[package]] @@ -4618,16 +4483,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" dependencies = [ "windows-result", - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-sys" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" -dependencies = [ - "windows-targets 0.48.5", + "windows-targets", ] [[package]] @@ -4636,22 +4492,16 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets 0.52.6", + "windows-targets", ] [[package]] -name = "windows-targets" -version = "0.48.5" +name = "windows-sys" +version = "0.59.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" dependencies = [ - "windows_aarch64_gnullvm 0.48.5", - "windows_aarch64_msvc 0.48.5", - "windows_i686_gnu 0.48.5", - "windows_i686_msvc 0.48.5", - "windows_x86_64_gnu 0.48.5", - "windows_x86_64_gnullvm 0.48.5", - "windows_x86_64_msvc 0.48.5", + "windows-targets", ] [[package]] @@ -4660,46 +4510,28 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" dependencies = [ - "windows_aarch64_gnullvm 0.52.6", - "windows_aarch64_msvc 0.52.6", - "windows_i686_gnu 0.52.6", + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", "windows_i686_gnullvm", - "windows_i686_msvc 0.52.6", - "windows_x86_64_gnu 0.52.6", - "windows_x86_64_gnullvm 0.52.6", - "windows_x86_64_msvc 0.52.6", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", ] -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" - [[package]] name = "windows_aarch64_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" -[[package]] -name = "windows_aarch64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" - [[package]] name = "windows_aarch64_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" -[[package]] -name = "windows_i686_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" - [[package]] name = "windows_i686_gnu" version = "0.52.6" @@ -4712,48 +4544,24 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" -[[package]] -name = "windows_i686_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" - [[package]] name = "windows_i686_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" -[[package]] -name = "windows_x86_64_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" - [[package]] name = "windows_x86_64_gnu" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" - [[package]] name = "windows_x86_64_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" -[[package]] -name = "windows_x86_64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" - [[package]] name = "windows_x86_64_msvc" version = "0.52.6" @@ -4762,9 +4570,9 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "winnow" -version = "0.5.40" +version = "0.6.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" +checksum = "36c1fec1a2bb5866f07c25f68c26e565c4c200aebb96d7e55710c19d3e8ac49b" dependencies = [ "memchr", ] @@ -4780,22 +4588,23 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.7.34" +version = "0.7.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae87e3fcd617500e5d106f0380cf7b77f3c6092aae37191433159dda23cfb087" +checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" dependencies = [ + "byteorder", "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.7.34" +version = "0.7.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15e934569e47891f7d9411f1a451d947a60e000ab3bd24fbb970f000387d1b3b" +checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -4815,5 +4624,5 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] diff --git a/simulators/portal/Cargo.toml b/simulators/portal/Cargo.toml index db51d49f20..01f674647a 100755 --- a/simulators/portal/Cargo.toml +++ b/simulators/portal/Cargo.toml @@ -6,10 +6,10 @@ edition = "2021" [dependencies] alloy-rlp = "0.3.8" -alloy-primitives = "0.8.0" -ethportal-api = { git = "https://github.com/ethereum/trin", rev = "c416cd9faf933f89b44a517ca7ada144bf2baee9" } +alloy-primitives = "0.8.3" +ethportal-api = { git = "https://github.com/ethereum/trin", rev = "627189e570d5750cc0e9b009df13921b2973f99b" } futures = "0.3.25" -hivesim = { git = "https://github.com/ethereum/hive", rev = "5c589295dae3eb896a5cb71ee639ab01add911a5" } +hivesim = { git = "https://github.com/ethereum/hive", rev = "4408fc1de3fee3ac23acd25a812c117756af2f39" } itertools = "0.10.5" serde_json = "1.0.95" serde_yaml = "0.9.33" diff --git a/simulators/portal/src/suites/history/interop.rs b/simulators/portal/src/suites/history/interop.rs index 006556d613..57072de500 100644 --- a/simulators/portal/src/suites/history/interop.rs +++ b/simulators/portal/src/suites/history/interop.rs @@ -262,7 +262,7 @@ dyn_async! { } }; - let _ = client_a.rpc.offer(target_enr, target_key.clone(), target_value.encode()).await; + let _ = client_a.rpc.offer(target_enr, vec![(target_key.clone(), target_value.encode())]).await; tokio::time::sleep(Duration::from_secs(8)).await; diff --git a/simulators/portal/src/suites/state/interop.rs b/simulators/portal/src/suites/state/interop.rs index ed1979f416..1416770061 100644 --- a/simulators/portal/src/suites/state/interop.rs +++ b/simulators/portal/src/suites/state/interop.rs @@ -277,7 +277,7 @@ dyn_async! { store_header(header, &client_b.rpc).await; - let _ = client_a.rpc.offer(target_enr, target_key.clone(), target_offer_value.encode()).await; + let _ = client_a.rpc.offer(target_enr, vec![(target_key.clone(), target_offer_value.encode())]).await; tokio::time::sleep(Duration::from_secs(8)).await; From 606429be7d43a13b35baded697bd41b3e1d1437e Mon Sep 17 00:00:00 2001 From: Kolby Moroz Liebl <31669092+KolbyML@users.noreply.github.com> Date: Thu, 17 Oct 2024 17:38:30 -0700 Subject: [PATCH 343/387] simulators/portal: update recursive_find_content to get_content (#1175) --- simulators/portal/Cargo.lock | 176 ++++++++++-------- simulators/portal/Cargo.toml | 2 +- .../portal/src/suites/beacon/interop.rs | 22 +-- .../portal/src/suites/beacon/rpc_compat.rs | 12 +- .../portal/src/suites/history/interop.rs | 30 +-- .../portal/src/suites/history/rpc_compat.rs | 12 +- simulators/portal/src/suites/state/interop.rs | 22 +-- .../portal/src/suites/state/rpc_compat.rs | 12 +- 8 files changed, 155 insertions(+), 133 deletions(-) diff --git a/simulators/portal/Cargo.lock b/simulators/portal/Cargo.lock index edacb813cc..818743e395 100644 --- a/simulators/portal/Cargo.lock +++ b/simulators/portal/Cargo.lock @@ -80,20 +80,66 @@ version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" +[[package]] +name = "alloy" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "056f2c01b2aed86e15b43c47d109bfc8b82553dc34e66452875e51247ec31ab2" +dependencies = [ + "alloy-consensus", + "alloy-core", + "alloy-eips", + "alloy-genesis", + "alloy-rpc-types", + "alloy-serde", +] + [[package]] name = "alloy-consensus" -version = "0.3.6" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "629b62e38d471cc15fea534eb7283d2f8a4e8bdb1811bcc5d66dda6cfce6fae1" +checksum = "705687d5bfd019fee57cf9e206b27b30a9a9617535d5590a02b171e813208f8e" dependencies = [ "alloy-eips", "alloy-primitives", "alloy-rlp", "alloy-serde", + "auto_impl", "c-kzg", + "derive_more", "serde", ] +[[package]] +name = "alloy-core" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eeb750349efda145ca6aada68d0336067f7f364d7d44ef09e2cf000b040c5e99" +dependencies = [ + "alloy-dyn-abi", + "alloy-json-abi", + "alloy-primitives", + "alloy-rlp", + "alloy-sol-types", +] + +[[package]] +name = "alloy-dyn-abi" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f95d76a38cae906fd394a5afb0736aaceee5432efe76addfd71048e623e208af" +dependencies = [ + "alloy-json-abi", + "alloy-primitives", + "alloy-sol-type-parser", + "alloy-sol-types", + "const-hex", + "itoa", + "serde", + "serde_json", + "winnow", +] + [[package]] name = "alloy-eip2930" version = "0.1.0" @@ -118,9 +164,9 @@ dependencies = [ [[package]] name = "alloy-eips" -version = "0.3.6" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f923dd5fca5f67a43d81ed3ebad0880bd41f6dd0ada930030353ac356c54cd0f" +checksum = "6ffb906284a1e1f63c4607da2068c8197458a352d0b3e9796e67353d72a9be85" dependencies = [ "alloy-eip2930", "alloy-eip7702", @@ -134,12 +180,36 @@ dependencies = [ "sha2", ] +[[package]] +name = "alloy-genesis" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8429cf4554eed9b40feec7f4451113e76596086447550275e3def933faf47ce3" +dependencies = [ + "alloy-primitives", + "alloy-serde", + "serde", +] + +[[package]] +name = "alloy-json-abi" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03c66eec1acdd96b39b995b8f5ee5239bc0c871d62c527ae1ac9fd1d7fecd455" +dependencies = [ + "alloy-primitives", + "alloy-sol-type-parser", + "serde", + "serde_json", +] + [[package]] name = "alloy-network-primitives" -version = "0.3.6" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94ad40869867ed2d9cd3842b1e800889e5b49e6b92da346e93862b4a741bedf3" +checksum = "801492711d4392b2ccf5fc0bc69e299fa1aab15167d74dcaa9aab96a54f684bd" dependencies = [ + "alloy-consensus", "alloy-eips", "alloy-primitives", "alloy-serde", @@ -199,38 +269,21 @@ dependencies = [ [[package]] name = "alloy-rpc-types" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64333d639f2a0cf73491813c629a405744e16343a4bc5640931be707c345ecc5" -dependencies = [ - "alloy-rpc-types-engine", - "alloy-rpc-types-eth", - "alloy-serde", - "serde", -] - -[[package]] -name = "alloy-rpc-types-engine" -version = "0.3.6" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1464c4dd646e1bdfde86ae65ce5ba168dbb29180b478011fe87117ae46b1629b" +checksum = "9ffc534b7919e18f35e3aa1f507b6f3d9d92ec298463a9f6beaac112809d8d06" dependencies = [ - "alloy-consensus", - "alloy-eips", "alloy-primitives", - "alloy-rlp", + "alloy-rpc-types-eth", "alloy-serde", - "derive_more", - "jsonwebtoken", - "rand", "serde", ] [[package]] name = "alloy-rpc-types-eth" -version = "0.3.6" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83aa984386deda02482660aa31cb8ca1e63d533f1c31a52d7d181ac5ec68e9b8" +checksum = "413f4aa3ccf2c3e4234a047c5fa4727916d7daf25a89f9b765df0ba09784fd87" dependencies = [ "alloy-consensus", "alloy-eips", @@ -239,9 +292,7 @@ dependencies = [ "alloy-rlp", "alloy-serde", "alloy-sol-types", - "cfg-if", "derive_more", - "hashbrown 0.14.5", "itertools 0.13.0", "serde", "serde_json", @@ -249,9 +300,9 @@ dependencies = [ [[package]] name = "alloy-serde" -version = "0.3.6" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "731f75ec5d383107fd745d781619bd9cedf145836c51ecb991623d41278e71fa" +checksum = "9dff0ab1cdd43ca001e324dc27ee0e8606bd2161d6623c63e0e0b8c4dfc13600" dependencies = [ "alloy-primitives", "serde", @@ -305,15 +356,27 @@ dependencies = [ "syn-solidity", ] +[[package]] +name = "alloy-sol-type-parser" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f631f0bd9a9d79619b27c91b6b1ab2c4ef4e606a65192369a1ee05d40dcf81cc" +dependencies = [ + "serde", + "winnow", +] + [[package]] name = "alloy-sol-types" version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e448d879903624863f608c552d10efb0e0905ddbee98b0049412799911eb062" dependencies = [ + "alloy-json-abi", "alloy-primitives", "alloy-sol-macro", "const-hex", + "serde", ] [[package]] @@ -1360,12 +1423,11 @@ dependencies = [ [[package]] name = "ethportal-api" version = "0.2.2" -source = "git+https://github.com/ethereum/trin?rev=627189e570d5750cc0e9b009df13921b2973f99b#627189e570d5750cc0e9b009df13921b2973f99b" +source = "git+https://github.com/ethereum/trin?rev=72f144e8e63751eac5c667753b47a4eda9cb9fea#72f144e8e63751eac5c667753b47a4eda9cb9fea" dependencies = [ - "alloy-consensus", - "alloy-primitives", + "alloy", "alloy-rlp", - "alloy-rpc-types", + "alloy-rpc-types-eth", "anyhow", "base64 0.13.1", "bimap", @@ -1606,10 +1668,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" dependencies = [ "cfg-if", - "js-sys", "libc", "wasi", - "wasm-bindgen", ] [[package]] @@ -1731,7 +1791,6 @@ checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" dependencies = [ "ahash", "allocator-api2", - "serde", ] [[package]] @@ -2275,21 +2334,6 @@ dependencies = [ "url", ] -[[package]] -name = "jsonwebtoken" -version = "9.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9ae10193d25051e74945f1ea2d0b42e03cc3b890f7e4cc5faa44997d808193f" -dependencies = [ - "base64 0.21.7", - "js-sys", - "pem", - "ring", - "serde", - "serde_json", - "simple_asn1", -] - [[package]] name = "k256" version = "0.13.4" @@ -2678,16 +2722,6 @@ version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" -[[package]] -name = "pem" -version = "3.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e459365e590736a54c3fa561947c84837534b8e9af6fc5bf781307e82658fae" -dependencies = [ - "base64 0.22.1", - "serde", -] - [[package]] name = "percent-encoding" version = "2.3.1" @@ -3579,18 +3613,6 @@ dependencies = [ "rand_core", ] -[[package]] -name = "simple_asn1" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adc4e5204eb1910f40f9cfa375f6f05b68c3abac4b6fd879c8ff5e7ae8a0a085" -dependencies = [ - "num-bigint", - "num-traits", - "thiserror", - "time", -] - [[package]] name = "slab" version = "0.4.9" @@ -4070,7 +4092,7 @@ dependencies = [ [[package]] name = "trin-utils" version = "0.1.1-alpha.1" -source = "git+https://github.com/ethereum/trin?rev=627189e570d5750cc0e9b009df13921b2973f99b#627189e570d5750cc0e9b009df13921b2973f99b" +source = "git+https://github.com/ethereum/trin?rev=72f144e8e63751eac5c667753b47a4eda9cb9fea#72f144e8e63751eac5c667753b47a4eda9cb9fea" dependencies = [ "ansi_term", "atty", diff --git a/simulators/portal/Cargo.toml b/simulators/portal/Cargo.toml index 01f674647a..72851565e6 100755 --- a/simulators/portal/Cargo.toml +++ b/simulators/portal/Cargo.toml @@ -7,7 +7,7 @@ edition = "2021" [dependencies] alloy-rlp = "0.3.8" alloy-primitives = "0.8.3" -ethportal-api = { git = "https://github.com/ethereum/trin", rev = "627189e570d5750cc0e9b009df13921b2973f99b" } +ethportal-api = { git = "https://github.com/ethereum/trin", rev = "72f144e8e63751eac5c667753b47a4eda9cb9fea" } futures = "0.3.25" hivesim = { git = "https://github.com/ethereum/hive", rev = "4408fc1de3fee3ac23acd25a812c117756af2f39" } itertools = "0.10.5" diff --git a/simulators/portal/src/suites/beacon/interop.rs b/simulators/portal/src/suites/beacon/interop.rs index add82c01b8..da481e974a 100644 --- a/simulators/portal/src/suites/beacon/interop.rs +++ b/simulators/portal/src/suites/beacon/interop.rs @@ -95,10 +95,10 @@ dyn_async! { for ProcessedContent { content_type, identifier, test_data } in process_content(content.clone()) { test.run( NClientTestSpec { - name: format!("RecursiveFindContent {}: {} {} --> {}", content_type, identifier, client_a.name, client_b.name), + name: format!("GetContent {}: {} {} --> {}", content_type, identifier, client_a.name, client_b.name), description: "".to_string(), always_run: false, - run: test_recursive_find_content, + run: test_get_content, environments: environments.clone(), test_data: test_data.clone(), clients: vec![client_a.clone(), client_b.clone()], @@ -277,8 +277,8 @@ dyn_async! { } dyn_async! { - // test that a node will return a content via RECURSIVEFINDCONTENT template that it has stored locally - async fn test_recursive_find_content<'a>(clients: Vec, test_data: TestData) { + // test that a node will return a content via GETCONTENT template that it has stored locally + async fn test_get_content<'a>(clients: Vec, test_data: TestData) { let (client_a, client_b) = match clients.iter().collect_tuple() { Some((client_a, client_b)) => (client_a, client_b), None => { @@ -288,7 +288,7 @@ dyn_async! { let (target_key, target_value) = test_data; match client_b.rpc.store(target_key.clone(), target_value.encode()).await { Ok(result) => if !result { - panic!("Error storing target content for recursive find content"); + panic!("Error storing target content for get content"); }, Err(err) => { panic!("Error storing target content: {err:?}"); @@ -310,29 +310,29 @@ dyn_async! { Err(err) => panic!("{}", &err.to_string()), } - match client_a.rpc.recursive_find_content(target_key.clone()).await { + match client_a.rpc.get_content(target_key.clone()).await { Ok(result) => { match result { ContentInfo::Content{ content, utp_transfer } => { if content != target_value.encode() { - panic!("Error: Unexpected RECURSIVEFINDCONTENT response: didn't return expected target content"); + panic!("Error: Unexpected GETCONTENT response: didn't return expected target content"); } if target_value.encode().len() < MAX_PORTAL_CONTENT_PAYLOAD_SIZE { if utp_transfer { - panic!("Error: Unexpected RECURSIVEFINDCONTENT response: utp_transfer was supposed to be false"); + panic!("Error: Unexpected GETCONTENT response: utp_transfer was supposed to be false"); } } else if !utp_transfer { - panic!("Error: Unexpected RECURSIVEFINDCONTENT response: utp_transfer was supposed to be true"); + panic!("Error: Unexpected GETCONTENT response: utp_transfer was supposed to be true"); } }, other => { - panic!("Error: Unexpected RECURSIVEFINDCONTENT response: {other:?}"); + panic!("Error: Unexpected GETCONTENT response: {other:?}"); } } }, Err(err) => { - panic!("Error: Unable to get response from RECURSIVEFINDCONTENT request: {err:?}"); + panic!("Error: Unable to get response from GETCONTENT request: {err:?}"); } } } diff --git a/simulators/portal/src/suites/beacon/rpc_compat.rs b/simulators/portal/src/suites/beacon/rpc_compat.rs index 46f740330d..f6df0096d2 100644 --- a/simulators/portal/src/suites/beacon/rpc_compat.rs +++ b/simulators/portal/src/suites/beacon/rpc_compat.rs @@ -183,10 +183,10 @@ dyn_async! { test.run( NClientTestSpec { - name: "portal_beaconRecursiveFindContent Content Absent".to_string(), + name: "portal_beaconGetContent Content Absent".to_string(), description: "".to_string(), always_run: false, - run: test_recursive_find_content_content_absent, + run: test_get_content_content_absent, environments: environments.clone(), test_data: (), clients: vec![client.clone()], @@ -508,8 +508,8 @@ dyn_async! { } dyn_async! { - // test that a node will return a AbsentContent via RecursiveFindContent when the data doesn't exist - async fn test_recursive_find_content_content_absent<'a>(clients: Vec, _: ()) { + // test that a node will return a AbsentContent via GetContent when the data doesn't exist + async fn test_get_content_content_absent<'a>(clients: Vec, _: ()) { let client = match clients.into_iter().next() { Some((client)) => client, None => { @@ -518,8 +518,8 @@ dyn_async! { }; let header_with_proof_key: BeaconContentKey = serde_json::from_value(json!(CONSTANT_CONTENT_KEY)).unwrap(); - if let Ok(content) = BeaconNetworkApiClient::recursive_find_content(&client.rpc, header_with_proof_key).await { - panic!("Error: Unexpected RecursiveFindContent expected to not get the content and instead get an error: {content:?}"); + if let Ok(content) = BeaconNetworkApiClient::get_content(&client.rpc, header_with_proof_key).await { + panic!("Error: Unexpected GetContent expected to not get the content and instead get an error: {content:?}"); } } } diff --git a/simulators/portal/src/suites/history/interop.rs b/simulators/portal/src/suites/history/interop.rs index 57072de500..ea73dde858 100644 --- a/simulators/portal/src/suites/history/interop.rs +++ b/simulators/portal/src/suites/history/interop.rs @@ -117,10 +117,10 @@ dyn_async! { test.run( NClientTestSpec { - name: format!("RecursiveFindContent {}:{} {} --> {}", content_type, get_test_message(block_number), client_a.name, client_b.name), + name: format!("GetContent {}:{} {} --> {}", content_type, get_test_message(block_number), client_a.name, client_b.name), description: "".to_string(), always_run: false, - run: test_recursive_find_content, + run: test_get_content, environments: None, test_data: test_data.clone(), clients: vec![client_a.clone(), client_b.clone()], @@ -246,10 +246,10 @@ dyn_async! { if let Some((optional_key, optional_value)) = test_data.get(1).cloned() { match client_b.rpc.store(optional_key, optional_value.encode()).await { Ok(result) => if !result { - panic!("Unable to store optional content for recursive find content"); + panic!("Unable to store optional content for get content"); }, Err(err) => { - panic!("Error storing optional content for recursive find content: {err:?}"); + panic!("Error storing optional content for get content: {err:?}"); } } } @@ -356,8 +356,8 @@ dyn_async! { } dyn_async! { - // test that a node will return a content via RECURSIVEFINDCONTENT template that it has stored locally - async fn test_recursive_find_content<'a>(clients: Vec, test_data: TestData) { + // test that a node will return a content via GETCONTENT template that it has stored locally + async fn test_get_content<'a>(clients: Vec, test_data: TestData) { let (client_a, client_b) = match clients.iter().collect_tuple() { Some((client_a, client_b)) => (client_a, client_b), None => { @@ -367,10 +367,10 @@ dyn_async! { if let Some((optional_key, optional_value)) = test_data.get(1).cloned() { match client_b.rpc.store(optional_key, optional_value.encode()).await { Ok(result) => if !result { - panic!("Unable to store optional content for recursive find content"); + panic!("Unable to store optional content for get content"); }, Err(err) => { - panic!("Error storing optional content for recursive find content: {err:?}"); + panic!("Error storing optional content for get content: {err:?}"); } } } @@ -378,7 +378,7 @@ dyn_async! { let (target_key, target_value) = test_data.first().cloned().expect("Target content is required for this test"); match client_b.rpc.store(target_key.clone(), target_value.encode()).await { Ok(result) => if !result { - panic!("Error storing target content for recursive find content"); + panic!("Error storing target content for get content"); }, Err(err) => { panic!("Error storing target content: {err:?}"); @@ -400,29 +400,29 @@ dyn_async! { Err(err) => panic!("{}", &err.to_string()), } - match client_a.rpc.recursive_find_content(target_key.clone()).await { + match client_a.rpc.get_content(target_key.clone()).await { Ok(result) => { match result { ContentInfo::Content{ content, utp_transfer } => { if content != target_value.encode() { - panic!("Error: Unexpected RECURSIVEFINDCONTENT response: didn't return expected target content"); + panic!("Error: Unexpected GETCONTENT response: didn't return expected target content"); } if target_value.encode().len() < MAX_PORTAL_CONTENT_PAYLOAD_SIZE { if utp_transfer { - panic!("Error: Unexpected RECURSIVEFINDCONTENT response: utp_transfer was supposed to be false"); + panic!("Error: Unexpected GETCONTENT response: utp_transfer was supposed to be false"); } } else if !utp_transfer { - panic!("Error: Unexpected RECURSIVEFINDCONTENT response: utp_transfer was supposed to be true"); + panic!("Error: Unexpected GETCONTENT response: utp_transfer was supposed to be true"); } }, other => { - panic!("Error: Unexpected RECURSIVEFINDCONTENT response: {other:?}"); + panic!("Error: Unexpected GETCONTENT response: {other:?}"); } } }, Err(err) => { - panic!("Error: Unable to get response from RECURSIVEFINDCONTENT request: {err:?}"); + panic!("Error: Unable to get response from GETCONTENT request: {err:?}"); } } } diff --git a/simulators/portal/src/suites/history/rpc_compat.rs b/simulators/portal/src/suites/history/rpc_compat.rs index 549f010006..510f6d2338 100644 --- a/simulators/portal/src/suites/history/rpc_compat.rs +++ b/simulators/portal/src/suites/history/rpc_compat.rs @@ -180,10 +180,10 @@ dyn_async! { test.run( NClientTestSpec { - name: "portal_historyRecursiveFindContent Content Absent".to_string(), + name: "portal_historyGetContent Content Absent".to_string(), description: "".to_string(), always_run: false, - run: test_recursive_find_content_content_absent, + run: test_get_content_content_absent, environments: None, test_data: (), clients: vec![client.clone()], @@ -505,8 +505,8 @@ dyn_async! { } dyn_async! { - // test that a node will return a AbsentContent via RecursiveFindContent when the data doesn't exist - async fn test_recursive_find_content_content_absent<'a>(clients: Vec, _: ()) { + // test that a node will return a AbsentContent via GetContent when the data doesn't exist + async fn test_get_content_content_absent<'a>(clients: Vec, _: ()) { let client = match clients.into_iter().next() { Some((client)) => client, None => { @@ -515,8 +515,8 @@ dyn_async! { }; let header_with_proof_key: HistoryContentKey = serde_json::from_value(json!(CONTENT_KEY)).unwrap(); - if let Ok(content) = HistoryNetworkApiClient::recursive_find_content(&client.rpc, header_with_proof_key).await { - panic!("Error: Unexpected RecursiveFindContent expected to not get the content and instead get an error: {content:?}"); + if let Ok(content) = HistoryNetworkApiClient::get_content(&client.rpc, header_with_proof_key).await { + panic!("Error: Unexpected GetContent expected to not get the content and instead get an error: {content:?}"); } } } diff --git a/simulators/portal/src/suites/state/interop.rs b/simulators/portal/src/suites/state/interop.rs index 1416770061..bfeca3d3fe 100644 --- a/simulators/portal/src/suites/state/interop.rs +++ b/simulators/portal/src/suites/state/interop.rs @@ -134,10 +134,10 @@ dyn_async! { test.run( NClientTestSpec { - name: format!("RecursiveFindContent {}: {} {} --> {}", content_type, identifier, client_a.name, client_b.name), + name: format!("GetContent {}: {} {} --> {}", content_type, identifier, client_a.name, client_b.name), description: "".to_string(), always_run: false, - run: test_recursive_find_content, + run: test_get_content, environments: environments.clone(), test_data: test_data.clone(), clients: vec![client_a.clone(), client_b.clone()], @@ -371,8 +371,8 @@ dyn_async! { } dyn_async! { - // test that a node will return a content via RECURSIVEFINDCONTENT template that it has stored locally - async fn test_recursive_find_content<'a>(clients: Vec, test_data: TestData) { + // test that a node will return a content via GETCONTENT template that it has stored locally + async fn test_get_content<'a>(clients: Vec, test_data: TestData) { let (client_a, client_b) = match clients.iter().collect_tuple() { Some((client_a, client_b)) => (client_a, client_b), None => { @@ -389,7 +389,7 @@ dyn_async! { match client_b.rpc.store(target_key.clone(), target_offer_value.encode()).await { Ok(result) => if !result { - panic!("Error storing target content for recursive find content"); + panic!("Error storing target content for get content"); }, Err(err) => { panic!("Error storing target content: {err:?}"); @@ -411,29 +411,29 @@ dyn_async! { Err(err) => panic!("{}", &err.to_string()), } - match client_a.rpc.recursive_find_content(target_key.clone()).await { + match client_a.rpc.get_content(target_key.clone()).await { Ok(result) => { match result { ContentInfo::Content{ content, utp_transfer } => { if content != target_lookup_value.encode() { - panic!("Error: Unexpected RECURSIVEFINDCONTENT response: didn't return expected target content"); + panic!("Error: Unexpected GETCONTENT response: didn't return expected target content"); } if target_lookup_value.encode().len() < MAX_PORTAL_CONTENT_PAYLOAD_SIZE { if utp_transfer { - panic!("Error: Unexpected RECURSIVEFINDCONTENT response: utp_transfer was supposed to be false"); + panic!("Error: Unexpected GETCONTENT response: utp_transfer was supposed to be false"); } } else if !utp_transfer { - panic!("Error: Unexpected RECURSIVEFINDCONTENT response: utp_transfer was supposed to be true"); + panic!("Error: Unexpected GETCONTENT response: utp_transfer was supposed to be true"); } }, other => { - panic!("Error: Unexpected RECURSIVEFINDCONTENT response: {other:?}"); + panic!("Error: Unexpected GETCONTENT response: {other:?}"); } } }, Err(err) => { - panic!("Error: Unable to get response from RECURSIVEFINDCONTENT request: {err:?}"); + panic!("Error: Unable to get response from GETCONTENT request: {err:?}"); } } } diff --git a/simulators/portal/src/suites/state/rpc_compat.rs b/simulators/portal/src/suites/state/rpc_compat.rs index a4d7ca92fe..4a978c49f6 100644 --- a/simulators/portal/src/suites/state/rpc_compat.rs +++ b/simulators/portal/src/suites/state/rpc_compat.rs @@ -183,10 +183,10 @@ dyn_async! { test.run( NClientTestSpec { - name: "portal_stateRecursiveFindContent Content Absent".to_string(), + name: "portal_stateGetContent Content Absent".to_string(), description: "".to_string(), always_run: false, - run: test_recursive_find_content_content_absent, + run: test_get_content_content_absent, environments: environments.clone(), test_data: (), clients: vec![client.clone()], @@ -509,8 +509,8 @@ dyn_async! { } dyn_async! { - // test that a node will return a AbsentContent via RecursiveFindContent when the data doesn't exist - async fn test_recursive_find_content_content_absent<'a>(clients: Vec, _: ()) { + // test that a node will return a AbsentContent via GetContent when the data doesn't exist + async fn test_get_content_content_absent<'a>(clients: Vec, _: ()) { let client = match clients.into_iter().next() { Some((client)) => client, None => { @@ -519,8 +519,8 @@ dyn_async! { }; let header_with_proof_key: StateContentKey = serde_json::from_value(json!(CONTENT_KEY)).unwrap(); - if let Ok(content) = StateNetworkApiClient::recursive_find_content(&client.rpc, header_with_proof_key).await { - panic!("Error: Unexpected RecursiveFindContent expected to not get the content and instead get an error: {content:?}"); + if let Ok(content) = StateNetworkApiClient::get_content(&client.rpc, header_with_proof_key).await { + panic!("Error: Unexpected GetContent expected to not get the content and instead get an error: {content:?}"); } } } From ce76272198d82c7ebd9653b52748f8be124e83f1 Mon Sep 17 00:00:00 2001 From: Kolby Moroz Liebl <31669092+KolbyML@users.noreply.github.com> Date: Sat, 19 Oct 2024 10:06:15 -0700 Subject: [PATCH 344/387] simulators/portal: update ethportal-api for cleaner return types for ContentInfo (#1176) --- simulators/portal/Cargo.lock | 4 +- simulators/portal/Cargo.toml | 2 +- .../portal/src/suites/beacon/interop.rs | 140 ++++--------- simulators/portal/src/suites/beacon/mesh.rs | 74 ++----- .../portal/src/suites/beacon/rpc_compat.rs | 100 +++------ .../portal/src/suites/history/interop.rs | 197 ++++++------------ simulators/portal/src/suites/history/mesh.rs | 77 ++----- .../portal/src/suites/history/rpc_compat.rs | 68 ++---- .../portal/src/suites/history/trin_bridge.rs | 12 +- simulators/portal/src/suites/state/interop.rs | 162 ++++---------- .../portal/src/suites/state/rpc_compat.rs | 68 ++---- 11 files changed, 258 insertions(+), 646 deletions(-) diff --git a/simulators/portal/Cargo.lock b/simulators/portal/Cargo.lock index 818743e395..2f441966bf 100644 --- a/simulators/portal/Cargo.lock +++ b/simulators/portal/Cargo.lock @@ -1423,7 +1423,7 @@ dependencies = [ [[package]] name = "ethportal-api" version = "0.2.2" -source = "git+https://github.com/ethereum/trin?rev=72f144e8e63751eac5c667753b47a4eda9cb9fea#72f144e8e63751eac5c667753b47a4eda9cb9fea" +source = "git+https://github.com/ethereum/trin?rev=4b212d4f3e8afa7b3298eebd4b4b6e3ec04d680f#4b212d4f3e8afa7b3298eebd4b4b6e3ec04d680f" dependencies = [ "alloy", "alloy-rlp", @@ -4092,7 +4092,7 @@ dependencies = [ [[package]] name = "trin-utils" version = "0.1.1-alpha.1" -source = "git+https://github.com/ethereum/trin?rev=72f144e8e63751eac5c667753b47a4eda9cb9fea#72f144e8e63751eac5c667753b47a4eda9cb9fea" +source = "git+https://github.com/ethereum/trin?rev=4b212d4f3e8afa7b3298eebd4b4b6e3ec04d680f#4b212d4f3e8afa7b3298eebd4b4b6e3ec04d680f" dependencies = [ "ansi_term", "atty", diff --git a/simulators/portal/Cargo.toml b/simulators/portal/Cargo.toml index 72851565e6..b84feca476 100755 --- a/simulators/portal/Cargo.toml +++ b/simulators/portal/Cargo.toml @@ -7,7 +7,7 @@ edition = "2021" [dependencies] alloy-rlp = "0.3.8" alloy-primitives = "0.8.3" -ethportal-api = { git = "https://github.com/ethereum/trin", rev = "72f144e8e63751eac5c667753b47a4eda9cb9fea" } +ethportal-api = { git = "https://github.com/ethereum/trin", rev = "4b212d4f3e8afa7b3298eebd4b4b6e3ec04d680f" } futures = "0.3.25" hivesim = { git = "https://github.com/ethereum/hive", rev = "4408fc1de3fee3ac23acd25a812c117756af2f39" } itertools = "0.10.5" diff --git a/simulators/portal/src/suites/beacon/interop.rs b/simulators/portal/src/suites/beacon/interop.rs index da481e974a..509b21ed87 100644 --- a/simulators/portal/src/suites/beacon/interop.rs +++ b/simulators/portal/src/suites/beacon/interop.rs @@ -4,7 +4,7 @@ use std::str::FromStr; use crate::suites::beacon::constants::{TEST_DATA_FILE_PATH, TRIN_BRIDGE_CLIENT_TYPE}; use crate::suites::environment::PortalNetwork; use alloy_primitives::Bytes; -use ethportal_api::types::portal::ContentInfo; +use ethportal_api::types::portal::{FindContentInfo, GetContentInfo}; use ethportal_api::types::portal_wire::MAX_PORTAL_CONTENT_PAYLOAD_SIZE; use ethportal_api::utils::bytes::hex_encode; use ethportal_api::{ @@ -162,40 +162,21 @@ dyn_async! { async fn test_find_content_non_present<'a>(clients: Vec, _: ()) { let (client_a, client_b) = match clients.iter().collect_tuple() { Some((client_a, client_b)) => (client_a, client_b), - None => { - panic!("Unable to get expected amount of clients from NClientTestSpec"); - } + None => panic!("Unable to get expected amount of clients from NClientTestSpec"), }; let header_with_proof_key: BeaconContentKey = serde_json::from_value(json!(BOOTSTRAP_KEY)).unwrap(); let target_enr = match client_b.rpc.node_info().await { Ok(node_info) => node_info.enr, - Err(err) => { - panic!("Error getting node info: {err:?}"); - } + Err(err) => panic!("Error getting node info: {err:?}"), }; - let result = client_a.rpc.find_content(target_enr, header_with_proof_key.clone()).await; - - match result { - Ok(result) => { - match result { - ContentInfo::Enrs{ enrs: val } => { - if !val.is_empty() { - panic!("Error: Unexpected FINDCONTENT response: expected ContentInfo::Enrs length 0 got {}", val.len()); - } - }, - ContentInfo::Content{ content: _, .. } => { - panic!("Error: Unexpected FINDCONTENT response: wasn't supposed to return back content"); - }, - other => { - panic!("Error: Unexpected FINDCONTENT response: {other:?}"); - } - } + match client_a.rpc.find_content(target_enr, header_with_proof_key.clone()).await { + Ok(FindContentInfo::Enrs { enrs }) => if !enrs.is_empty() { + panic!("Error: Unexpected FINDCONTENT response: expected ContentInfo::Enrs length 0 got {}", enrs.len()); }, - Err(err) => { - panic!("Error: Unable to get response from FINDCONTENT request: {err:?}"); - } + Ok(FindContentInfo::Content { .. }) => panic!("Error: Unexpected FINDCONTENT response: wasn't supposed to return back content"), + Err(err) => panic!("Error: Unable to get response from FINDCONTENT request: {err:?}"), } } } @@ -204,30 +185,24 @@ dyn_async! { async fn test_ping<'a>(clients: Vec, _: ()) { let (client_a, client_b) = match clients.iter().collect_tuple() { Some((client_a, client_b)) => (client_a, client_b), - None => { - panic!("Unable to get expected amount of clients from NClientTestSpec"); - } + None => panic!("Unable to get expected amount of clients from NClientTestSpec"), }; let target_enr = match client_b.rpc.node_info().await { Ok(node_info) => node_info.enr, - Err(err) => { - panic!("Error getting node info: {err:?}"); - } + Err(err) => panic!("Error getting node info: {err:?}"), }; let pong = client_a.rpc.ping(target_enr).await; if let Err(err) = pong { - panic!("Unable to receive pong info: {err:?}"); + panic!("Unable to receive pong info: {err:?}"); } // Verify that client_b stored client_a its ENR through the base layer // handshake mechanism. let stored_enr = match client_a.rpc.node_info().await { Ok(node_info) => node_info.enr, - Err(err) => { - panic!("Error getting node info: {err:?}"); - } + Err(err) => panic!("Error getting node info: {err:?}"), }; match BeaconNetworkApiClient::get_enr(&client_b.rpc, stored_enr.node_id()).await { @@ -245,15 +220,11 @@ dyn_async! { async fn test_find_nodes_zero_distance<'a>(clients: Vec, _: ()) { let (client_a, client_b) = match clients.iter().collect_tuple() { Some((client_a, client_b)) => (client_a, client_b), - None => { - panic!("Unable to get expected amount of clients from NClientTestSpec"); - } + None => panic!("Unable to get expected amount of clients from NClientTestSpec"), }; let target_enr = match client_b.rpc.node_info().await { Ok(node_info) => node_info.enr, - Err(err) => { - panic!("Error getting node info: {err:?}"); - } + Err(err) => panic!("Error getting node info: {err:?}"), }; match client_a.rpc.find_nodes(target_enr.clone(), vec![0]).await { @@ -281,25 +252,19 @@ dyn_async! { async fn test_get_content<'a>(clients: Vec, test_data: TestData) { let (client_a, client_b) = match clients.iter().collect_tuple() { Some((client_a, client_b)) => (client_a, client_b), - None => { - panic!("Unable to get expected amount of clients from NClientTestSpec"); - } + None => panic!("Unable to get expected amount of clients from NClientTestSpec"), }; let (target_key, target_value) = test_data; match client_b.rpc.store(target_key.clone(), target_value.encode()).await { Ok(result) => if !result { panic!("Error storing target content for get content"); }, - Err(err) => { - panic!("Error storing target content: {err:?}"); - } + Err(err) => panic!("Error storing target content: {err:?}"), } let target_enr = match client_b.rpc.node_info().await { Ok(node_info) => node_info.enr, - Err(err) => { - panic!("Error getting node info: {err:?}"); - } + Err(err) => panic!("Error getting node info: {err:?}"), }; match BeaconNetworkApiClient::add_enr(&client_a.rpc, target_enr.clone()).await { @@ -311,29 +276,20 @@ dyn_async! { } match client_a.rpc.get_content(target_key.clone()).await { - Ok(result) => { - match result { - ContentInfo::Content{ content, utp_transfer } => { - if content != target_value.encode() { - panic!("Error: Unexpected GETCONTENT response: didn't return expected target content"); - } + Ok(GetContentInfo{ content, utp_transfer }) => { + if content != target_value.encode() { + panic!("Error: Unexpected GETCONTENT response: didn't return expected target content"); + } - if target_value.encode().len() < MAX_PORTAL_CONTENT_PAYLOAD_SIZE { - if utp_transfer { - panic!("Error: Unexpected GETCONTENT response: utp_transfer was supposed to be false"); - } - } else if !utp_transfer { - panic!("Error: Unexpected GETCONTENT response: utp_transfer was supposed to be true"); - } - }, - other => { - panic!("Error: Unexpected GETCONTENT response: {other:?}"); + if target_value.encode().len() < MAX_PORTAL_CONTENT_PAYLOAD_SIZE { + if utp_transfer { + panic!("Error: Unexpected GETCONTENT response: utp_transfer was supposed to be false"); } + } else if !utp_transfer { + panic!("Error: Unexpected GETCONTENT response: utp_transfer was supposed to be true"); } }, - Err(err) => { - panic!("Error: Unable to get response from GETCONTENT request: {err:?}"); - } + Err(err) => panic!("Error: Unable to get response from GETCONTENT request: {err:?}"), } } } @@ -343,51 +299,37 @@ dyn_async! { async fn test_find_content<'a> (clients: Vec, test_data: TestData) { let (client_a, client_b) = match clients.iter().collect_tuple() { Some((client_a, client_b)) => (client_a, client_b), - None => { - panic!("Unable to get expected amount of clients from NClientTestSpec"); - } + None => panic!("Unable to get expected amount of clients from NClientTestSpec"), }; let (target_key, target_value) = test_data; match client_b.rpc.store(target_key.clone(), target_value.encode()).await { Ok(result) => if !result { panic!("Error storing target content for find content"); }, - Err(err) => { - panic!("Error storing target content: {err:?}"); - } + Err(err) => panic!("Error storing target content: {err:?}"), } let target_enr = match client_b.rpc.node_info().await { Ok(node_info) => node_info.enr, - Err(err) => { - panic!("Error getting node info: {err:?}"); - } + Err(err) => panic!("Error getting node info: {err:?}"), }; match client_a.rpc.find_content(target_enr, target_key.clone()).await { - Ok(result) => { - match result { - ContentInfo::Content{ content, utp_transfer } => { - if content != target_value.encode() { - panic!("Error: Unexpected FINDCONTENT response: didn't return expected block body"); - } + Ok(FindContentInfo::Content{ content, utp_transfer }) => { + if content != target_value.encode() { + panic!("Error: Unexpected FINDCONTENT response: didn't return expected block body"); + } - if target_value.encode().len() < MAX_PORTAL_CONTENT_PAYLOAD_SIZE { - if utp_transfer { - panic!("Error: Unexpected FINDCONTENT response: utp_transfer was supposed to be false"); - } - } else if !utp_transfer { - panic!("Error: Unexpected FINDCONTENT response: utp_transfer was supposed to be true"); - } - }, - other => { - panic!("Error: Unexpected FINDCONTENT response: {other:?}"); + if target_value.encode().len() < MAX_PORTAL_CONTENT_PAYLOAD_SIZE { + if utp_transfer { + panic!("Error: Unexpected FINDCONTENT response: utp_transfer was supposed to be false"); } + } else if !utp_transfer { + panic!("Error: Unexpected FINDCONTENT response: utp_transfer was supposed to be true"); } }, - Err(err) => { - panic!("Error: Unable to get response from FINDCONTENT request: {err:?}"); - } + Ok(FindContentInfo::Enrs { .. }) => panic!("Error: Unexpected FINDCONTENT received Enrs instead of Content"), + Err(err) => panic!("Error: Unable to get response from FINDCONTENT request: {err:?}"), } } } diff --git a/simulators/portal/src/suites/beacon/mesh.rs b/simulators/portal/src/suites/beacon/mesh.rs index 5da1dce1bf..cc2cba2bab 100644 --- a/simulators/portal/src/suites/beacon/mesh.rs +++ b/simulators/portal/src/suites/beacon/mesh.rs @@ -6,7 +6,7 @@ use crate::suites::environment::PortalNetwork; use alloy_primitives::Bytes; use ethportal_api::jsonrpsee::core::__reexports::serde_json; use ethportal_api::types::distance::{Metric, XorMetric}; -use ethportal_api::types::portal::ContentInfo; +use ethportal_api::types::portal::FindContentInfo; use ethportal_api::{BeaconContentKey, BeaconNetworkApiClient, Discv5ApiClient}; use hivesim::types::ClientDefinition; use hivesim::{dyn_async, Client, NClientTestSpec, Test}; @@ -85,9 +85,7 @@ dyn_async! { async fn test_find_content_two_jumps<'a> (clients: Vec, _: ()) { let (client_a, client_b, client_c) = match clients.iter().collect_tuple() { Some((client_a, client_b, client_c)) => (client_a, client_b, client_c), - None => { - panic!("Unable to get expected amount of clients from NClientTestSpec"); - } + None => panic!("Unable to get expected amount of clients from NClientTestSpec"), }; let content_key: BeaconContentKey = serde_json::from_value(json!(CONSTANT_CONTENT_KEY)).unwrap(); @@ -96,16 +94,12 @@ dyn_async! { // get enr for b and c to seed for the jumps let client_b_enr = match client_b.rpc.node_info().await { Ok(node_info) => node_info.enr, - Err(err) => { - panic!("Error getting node info: {err:?}"); - } + Err(err) => panic!("Error getting node info: {err:?}"), }; let client_c_enr = match client_c.rpc.node_info().await { Ok(node_info) => node_info.enr, - Err(err) => { - panic!("Error getting node info: {err:?}"); - } + Err(err) => panic!("Error getting node info: {err:?}"), }; // seed client_c_enr into routing table of client_b @@ -119,7 +113,7 @@ dyn_async! { // send a ping from client B to C to connect the clients if let Err(err) = client_b.rpc.ping(client_c_enr.clone()).await { - panic!("Unable to receive pong info: {err:?}"); + panic!("Unable to receive pong info: {err:?}"); } // seed the data into client_c @@ -127,25 +121,13 @@ dyn_async! { Ok(result) => if !result { panic!("Unable to store header with proof for find content immediate return test"); }, - Err(err) => { - panic!("Error storing header with proof for find content immediate return test: {err:?}"); - } + Err(err) => panic!("Error storing header with proof for find content immediate return test: {err:?}"), } let enrs = match client_a.rpc.find_content(client_b_enr.clone(), content_key.clone()).await { - Ok(result) => { - match result { - ContentInfo::Enrs{ enrs } => { - enrs - }, - other => { - panic!("Error: (Enrs) Unexpected FINDCONTENT response not: {other:?}"); - } - } - }, - Err(err) => { - panic!("Error: (Enrs) Unable to get response from FINDCONTENT request: {err:?}"); - } + Ok(FindContentInfo::Enrs{ enrs }) => enrs, + Ok(FindContentInfo::Content { .. }) => panic!("Error: Expected Enrs response, instead got Content response"), + Err(err) => panic!("Error: (Enrs) Unable to get response from FINDCONTENT request: {err:?}"), }; if enrs.len() != 1 { @@ -153,25 +135,17 @@ dyn_async! { } match client_a.rpc.find_content(enrs[0].clone(), content_key.clone()).await { - Ok(result) => { - match result { - ContentInfo::Content{ content, utp_transfer } => { - if content != raw_content_value { - panic!("Error: Unexpected FINDCONTENT response: didn't return expected header with proof value"); - } - - if !utp_transfer { - panic!("Error: Unexpected FINDCONTENT response: utp_transfer was supposed to be true"); - } - }, - other => { - panic!("Error: Unexpected FINDCONTENT response: {other:?}"); - } + Ok(FindContentInfo::Content { content, utp_transfer }) => { + if content != raw_content_value { + panic!("Error: Unexpected FINDCONTENT response: didn't return expected header with proof value"); + } + + if !utp_transfer { + panic!("Error: Unexpected FINDCONTENT response: utp_transfer was supposed to be false"); } }, - Err(err) => { - panic!("Error: Unable to get response from FINDCONTENT request: {err:?}"); - } + Ok(FindContentInfo::Enrs { .. }) => panic!("Error: Expected Content response, instead got Enrs response"), + Err(err) => panic!("Error: Unable to get response from FINDCONTENT request: {err:?}"), } } } @@ -180,24 +154,18 @@ dyn_async! { async fn test_find_nodes_distance_of_client_c<'a>(clients: Vec, _: ()) { let (client_a, client_b, client_c) = match clients.iter().collect_tuple() { Some((client_a, client_b, client_c)) => (client_a, client_b, client_c), - None => { - panic!("Unable to get expected amount of clients from NClientTestSpec"); - } + None => panic!("Unable to get expected amount of clients from NClientTestSpec"), }; let target_enr = match client_b.rpc.node_info().await { Ok(node_info) => node_info.enr, - Err(err) => { - panic!("Error getting node info: {err:?}"); - } + Err(err) => panic!("Error getting node info: {err:?}"), }; // We are adding client C to our list so we then can assume only one client per bucket let client_c_enr = match client_c.rpc.node_info().await { Ok(node_info) => node_info.enr, - Err(err) => { - panic!("Error getting node info: {err:?}"); - } + Err(err) => panic!("Error getting node info: {err:?}"), }; // seed enr into routing table diff --git a/simulators/portal/src/suites/beacon/rpc_compat.rs b/simulators/portal/src/suites/beacon/rpc_compat.rs index f6df0096d2..88ad7d856f 100644 --- a/simulators/portal/src/suites/beacon/rpc_compat.rs +++ b/simulators/portal/src/suites/beacon/rpc_compat.rs @@ -200,9 +200,7 @@ dyn_async! { async fn test_node_info<'a>(clients: Vec, _: ()) { let client = match clients.into_iter().next() { Some((client)) => client, - None => { - panic!("Unable to get expected amount of clients from NClientTestSpec"); - } + None => panic!("Unable to get expected amount of clients from NClientTestSpec"), }; if let Err(err) = Discv5ApiClient::node_info(&client.rpc).await { @@ -215,9 +213,7 @@ dyn_async! { async fn test_local_content_expect_content_absent<'a>(clients: Vec, _: ()) { let client = match clients.into_iter().next() { Some((client)) => client, - None => { - panic!("Unable to get expected amount of clients from NClientTestSpec"); - } + None => panic!("Unable to get expected amount of clients from NClientTestSpec"), }; let content_key: BeaconContentKey = serde_json::from_value(json!(CONSTANT_CONTENT_KEY)).unwrap(); @@ -231,9 +227,7 @@ dyn_async! { async fn test_store<'a>(clients: Vec, _: ()) { let client = match clients.into_iter().next() { Some((client)) => client, - None => { - panic!("Unable to get expected amount of clients from NClientTestSpec"); - } + None => panic!("Unable to get expected amount of clients from NClientTestSpec"), }; let content_key: BeaconContentKey = serde_json::from_value(json!(CONSTANT_CONTENT_KEY)).unwrap(); let raw_content_value = Bytes::from_str(CONSTANT_CONTENT_VALUE).expect("unable to convert content value to bytes"); @@ -248,9 +242,7 @@ dyn_async! { async fn test_local_content_expect_content_present<'a>(clients: Vec, _: ()) { let client = match clients.into_iter().next() { Some((client)) => client, - None => { - panic!("Unable to get expected amount of clients from NClientTestSpec"); - } + None => panic!("Unable to get expected amount of clients from NClientTestSpec"), }; let content_key: BeaconContentKey = serde_json::from_value(json!(CONSTANT_CONTENT_KEY)).unwrap(); let raw_content_value = Bytes::from_str(CONSTANT_CONTENT_VALUE).expect("unable to convert content value to bytes"); @@ -267,9 +259,7 @@ dyn_async! { panic!("Error receiving content: Expected content: {raw_content_value:?}, Received content: {possible_content:?}"); } } - Err(err) => { - panic!("Expected content returned from local_content to be present {}", &err.to_string()); - } + Err(err) => panic!("Expected content returned from local_content to be present {}", &err.to_string()), } } } @@ -278,9 +268,7 @@ dyn_async! { async fn test_add_enr_expect_true<'a>(clients: Vec, _: ()) { let client = match clients.into_iter().next() { Some((client)) => client, - None => { - panic!("Unable to get expected amount of clients from NClientTestSpec"); - } + None => panic!("Unable to get expected amount of clients from NClientTestSpec"), }; let (_, enr) = generate_random_remote_enr(); match BeaconNetworkApiClient::add_enr(&client.rpc, enr).await { @@ -297,9 +285,7 @@ dyn_async! { async fn test_get_enr_non_present<'a>(clients: Vec, _: ()) { let client = match clients.into_iter().next() { Some((client)) => client, - None => { - panic!("Unable to get expected amount of clients from NClientTestSpec"); - } + None => panic!("Unable to get expected amount of clients from NClientTestSpec"), }; let (_, enr) = generate_random_remote_enr(); @@ -313,24 +299,18 @@ dyn_async! { async fn test_get_enr_local_enr<'a>(clients: Vec, _: ()) { let client = match clients.into_iter().next() { Some((client)) => client, - None => { - panic!("Unable to get expected amount of clients from NClientTestSpec"); - } + None => panic!("Unable to get expected amount of clients from NClientTestSpec"), }; // get our local enr from NodeInfo let target_enr = match Discv5ApiClient::node_info(&client.rpc).await { Ok(node_info) => node_info.enr, - Err(err) => { - panic!("Error getting node info: {err:?}"); - } + Err(err) => panic!("Error getting node info: {err:?}"), }; // check if we can fetch data from routing table match BeaconNetworkApiClient::get_enr(&client.rpc, target_enr.node_id()).await { - Ok(response) => { - if response != target_enr { - panic!("Response from GetEnr didn't return expected Enr") - } + Ok(response) => if response != target_enr { + panic!("Response from GetEnr didn't return expected Enr") }, Err(err) => panic!("{}", &err.to_string()), } @@ -341,9 +321,7 @@ dyn_async! { async fn test_get_enr_enr_present<'a>(clients: Vec, _: ()) { let client = match clients.into_iter().next() { Some((client)) => client, - None => { - panic!("Unable to get expected amount of clients from NClientTestSpec"); - } + None => panic!("Unable to get expected amount of clients from NClientTestSpec"), }; let (_, enr) = generate_random_remote_enr(); @@ -358,11 +336,9 @@ dyn_async! { // check if we can fetch data from routing table match BeaconNetworkApiClient::get_enr(&client.rpc, enr.node_id()).await { - Ok(response) => { - if response != enr { - panic!("Response from GetEnr didn't return expected Enr") - } - }, + Ok(response) => if response != enr { + panic!("Response from GetEnr didn't return expected Enr"); + } Err(err) => panic!("{}", &err.to_string()), } } @@ -372,9 +348,7 @@ dyn_async! { async fn test_delete_enr_non_present<'a>(clients: Vec, _: ()) { let client = match clients.into_iter().next() { Some((client)) => client, - None => { - panic!("Unable to get expected amount of clients from NClientTestSpec"); - } + None => panic!("Unable to get expected amount of clients from NClientTestSpec"), }; let (_, enr) = generate_random_remote_enr(); match BeaconNetworkApiClient::delete_enr(&client.rpc, enr.node_id()).await { @@ -391,9 +365,7 @@ dyn_async! { async fn test_delete_enr_enr_present<'a>(clients: Vec, _: ()) { let client = match clients.into_iter().next() { Some((client)) => client, - None => { - panic!("Unable to get expected amount of clients from NClientTestSpec"); - } + None => panic!("Unable to get expected amount of clients from NClientTestSpec"), }; let (_, enr) = generate_random_remote_enr(); @@ -408,10 +380,8 @@ dyn_async! { // check if data was seeded into the table match BeaconNetworkApiClient::get_enr(&client.rpc, enr.node_id()).await { - Ok(response) => { - if response != enr { - panic!("Response from GetEnr didn't return expected Enr") - } + Ok(response) => if response != enr { + panic!("Response from GetEnr didn't return expected Enr") }, Err(err) => panic!("{}", &err.to_string()), } @@ -436,9 +406,7 @@ dyn_async! { async fn test_lookup_enr_non_present<'a>(clients: Vec, _: ()) { let client = match clients.into_iter().next() { Some((client)) => client, - None => { - panic!("Unable to get expected amount of clients from NClientTestSpec"); - } + None => panic!("Unable to get expected amount of clients from NClientTestSpec"), }; let (_, enr) = generate_random_remote_enr(); @@ -452,9 +420,7 @@ dyn_async! { async fn test_lookup_enr_enr_present<'a>(clients: Vec, _: ()) { let client = match clients.into_iter().next() { Some((client)) => client, - None => { - panic!("Unable to get expected amount of clients from NClientTestSpec"); - } + None => panic!("Unable to get expected amount of clients from NClientTestSpec"), }; let (_, enr) = generate_random_remote_enr(); @@ -469,10 +435,8 @@ dyn_async! { // check if we can fetch data from routing table match BeaconNetworkApiClient::lookup_enr(&client.rpc, enr.node_id()).await { - Ok(response) => { - if response != enr { - panic!("Response from LookupEnr didn't return expected Enr") - } + Ok(response) => if response != enr { + panic!("Response from LookupEnr didn't return expected Enr") }, Err(err) => panic!("{}", &err.to_string()), } @@ -483,24 +447,18 @@ dyn_async! { async fn test_lookup_enr_local_enr<'a>(clients: Vec, _: ()) { let client = match clients.into_iter().next() { Some((client)) => client, - None => { - panic!("Unable to get expected amount of clients from NClientTestSpec"); - } + None => panic!("Unable to get expected amount of clients from NClientTestSpec"), }; // get our local enr from NodeInfo let target_enr = match Discv5ApiClient::node_info(&client.rpc).await { Ok(node_info) => node_info.enr, - Err(err) => { - panic!("Error getting node info: {err:?}"); - } + Err(err) => panic!("Error getting node info: {err:?}"), }; // check if we can fetch data from routing table match BeaconNetworkApiClient::lookup_enr(&client.rpc, target_enr.node_id()).await { - Ok(response) => { - if response != target_enr { - panic!("Response from LookupEnr didn't return expected Enr") - } + Ok(response) => if response != target_enr { + panic!("Response from LookupEnr didn't return expected Enr") }, Err(err) => panic!("{}", &err.to_string()), } @@ -512,9 +470,7 @@ dyn_async! { async fn test_get_content_content_absent<'a>(clients: Vec, _: ()) { let client = match clients.into_iter().next() { Some((client)) => client, - None => { - panic!("Unable to get expected amount of clients from NClientTestSpec"); - } + None => panic!("Unable to get expected amount of clients from NClientTestSpec"), }; let header_with_proof_key: BeaconContentKey = serde_json::from_value(json!(CONSTANT_CONTENT_KEY)).unwrap(); diff --git a/simulators/portal/src/suites/history/interop.rs b/simulators/portal/src/suites/history/interop.rs index ea73dde858..ed927f21d0 100644 --- a/simulators/portal/src/suites/history/interop.rs +++ b/simulators/portal/src/suites/history/interop.rs @@ -1,9 +1,7 @@ use std::str::FromStr; -use crate::suites::history::constants::{TEST_DATA_FILE_PATH, TRIN_BRIDGE_CLIENT_TYPE}; -use crate::suites::utils::get_flair; use alloy_primitives::Bytes; -use ethportal_api::types::portal::ContentInfo; +use ethportal_api::types::portal::{FindContentInfo, GetContentInfo}; use ethportal_api::types::portal_wire::MAX_PORTAL_CONTENT_PAYLOAD_SIZE; use ethportal_api::{ ContentValue, Discv5ApiClient, HistoryContentKey, HistoryContentValue, HistoryNetworkApiClient, @@ -15,6 +13,9 @@ use serde_json::json; use serde_yaml::Value; use tokio::time::Duration; +use crate::suites::history::constants::{TEST_DATA_FILE_PATH, TRIN_BRIDGE_CLIENT_TYPE}; +use crate::suites::utils::get_flair; + // Header with proof for block number 14764013 const HEADER_WITH_PROOF_KEY: &str = "0x00720704f3aa11c53cf344ea069db95cecb81ad7453c8f276b2a1062979611f09c"; @@ -197,40 +198,23 @@ dyn_async! { async fn test_find_content_non_present<'a>(clients: Vec, _: ()) { let (client_a, client_b) = match clients.iter().collect_tuple() { Some((client_a, client_b)) => (client_a, client_b), - None => { - panic!("Unable to get expected amount of clients from NClientTestSpec"); - } + None => panic!("Unable to get expected amount of clients from NClientTestSpec"), }; let header_with_proof_key: HistoryContentKey = serde_json::from_value(json!(HEADER_WITH_PROOF_KEY)).unwrap(); let target_enr = match client_b.rpc.node_info().await { Ok(node_info) => node_info.enr, - Err(err) => { - panic!("Error getting node info: {err:?}"); - } + Err(err) => panic!("Error getting node info: {err:?}"), }; let result = client_a.rpc.find_content(target_enr, header_with_proof_key.clone()).await; match result { - Ok(result) => { - match result { - ContentInfo::Enrs{ enrs: val } => { - if !val.is_empty() { - panic!("Error: Unexpected FINDCONTENT response: expected ContentInfo::Enrs length 0 got {}", val.len()); - } - }, - ContentInfo::Content{ content: _, .. } => { - panic!("Error: Unexpected FINDCONTENT response: wasn't supposed to return back content"); - }, - other => { - panic!("Error: Unexpected FINDCONTENT response: {other:?}"); - } - } - }, - Err(err) => { - panic!("Error: Unable to get response from FINDCONTENT request: {err:?}"); + Ok(FindContentInfo::Enrs { enrs }) => if !enrs.is_empty() { + panic!("Error: Unexpected FINDCONTENT response: expected ContentInfo::Enrs length 0 got {}", enrs.len()); } + Ok(FindContentInfo::Content { .. }) => panic!("Error: Unexpected FINDCONTENT response: wasn't supposed to return back content"), + Err(err) => panic!("Error: Unable to get response from FINDCONTENT request: {err:?}"), } } } @@ -239,27 +223,21 @@ dyn_async! { async fn test_offer<'a>(clients: Vec, test_data: TestData) { let (client_a, client_b) = match clients.iter().collect_tuple() { Some((client_a, client_b)) => (client_a, client_b), - None => { - panic!("Unable to get expected amount of clients from NClientTestSpec"); - } + None => panic!("Unable to get expected amount of clients from NClientTestSpec"), }; if let Some((optional_key, optional_value)) = test_data.get(1).cloned() { match client_b.rpc.store(optional_key, optional_value.encode()).await { Ok(result) => if !result { panic!("Unable to store optional content for get content"); }, - Err(err) => { - panic!("Error storing optional content for get content: {err:?}"); - } + Err(err) => panic!("Error storing optional content for get content: {err:?}"), } } let (target_key, target_value) = test_data.first().cloned().expect("Target content is required for this test"); let target_enr = match client_b.rpc.node_info().await { Ok(node_info) => node_info.enr, - Err(err) => { - panic!("Error getting node info: {err:?}"); - } + Err(err) => panic!("Error getting node info: {err:?}"), }; let _ = client_a.rpc.offer(target_enr, vec![(target_key.clone(), target_value.encode())]).await; @@ -272,9 +250,7 @@ dyn_async! { panic!("Error receiving content: Expected content: {target_value:?}, Received content: {possible_content:?}"); } } - Err(err) => { - panic!("Unable to get received content: {err:?}"); - } + Err(err) => panic!("Unable to get received content: {err:?}"), } } } @@ -283,30 +259,24 @@ dyn_async! { async fn test_ping<'a>(clients: Vec, _: ()) { let (client_a, client_b) = match clients.iter().collect_tuple() { Some((client_a, client_b)) => (client_a, client_b), - None => { - panic!("Unable to get expected amount of clients from NClientTestSpec"); - } + None => panic!("Unable to get expected amount of clients from NClientTestSpec"), }; let target_enr = match client_b.rpc.node_info().await { Ok(node_info) => node_info.enr, - Err(err) => { - panic!("Error getting node info: {err:?}"); - } + Err(err) => panic!("Error getting node info: {err:?}"), }; let pong = client_a.rpc.ping(target_enr).await; if let Err(err) = pong { - panic!("Unable to receive pong info: {err:?}"); + panic!("Unable to receive pong info: {err:?}"); } // Verify that client_b stored client_a its ENR through the base layer // handshake mechanism. let stored_enr = match client_a.rpc.node_info().await { Ok(node_info) => node_info.enr, - Err(err) => { - panic!("Error getting node info: {err:?}"); - } + Err(err) => panic!("Error getting node info: {err:?}"), }; match HistoryNetworkApiClient::get_enr(&client_b.rpc, stored_enr.node_id()).await { @@ -324,15 +294,11 @@ dyn_async! { async fn test_find_nodes_zero_distance<'a>(clients: Vec, _: ()) { let (client_a, client_b) = match clients.iter().collect_tuple() { Some((client_a, client_b)) => (client_a, client_b), - None => { - panic!("Unable to get expected amount of clients from NClientTestSpec"); - } + None => panic!("Unable to get expected amount of clients from NClientTestSpec"), }; let target_enr = match client_b.rpc.node_info().await { Ok(node_info) => node_info.enr, - Err(err) => { - panic!("Error getting node info: {err:?}"); - } + Err(err) => panic!("Error getting node info: {err:?}"), }; match client_a.rpc.find_nodes(target_enr.clone(), vec![0]).await { @@ -342,10 +308,8 @@ dyn_async! { } match response.first() { - Some(response_enr) => { - if *response_enr != target_enr { - panic!("Response from FindNodes didn't return expected Enr"); - } + Some(response_enr) => if *response_enr != target_enr { + panic!("Response from FindNodes didn't return expected Enr"); }, None => panic!("Error find nodes zero distance wasn't supposed to return None"), } @@ -360,18 +324,14 @@ dyn_async! { async fn test_get_content<'a>(clients: Vec, test_data: TestData) { let (client_a, client_b) = match clients.iter().collect_tuple() { Some((client_a, client_b)) => (client_a, client_b), - None => { - panic!("Unable to get expected amount of clients from NClientTestSpec"); - } + None => panic!("Unable to get expected amount of clients from NClientTestSpec"), }; if let Some((optional_key, optional_value)) = test_data.get(1).cloned() { match client_b.rpc.store(optional_key, optional_value.encode()).await { Ok(result) => if !result { panic!("Unable to store optional content for get content"); }, - Err(err) => { - panic!("Error storing optional content for get content: {err:?}"); - } + Err(err) => panic!("Error storing optional content for get content: {err:?}"), } } @@ -380,16 +340,12 @@ dyn_async! { Ok(result) => if !result { panic!("Error storing target content for get content"); }, - Err(err) => { - panic!("Error storing target content: {err:?}"); - } + Err(err) => panic!("Error storing target content: {err:?}"), } let target_enr = match client_b.rpc.node_info().await { Ok(node_info) => node_info.enr, - Err(err) => { - panic!("Error getting node info: {err:?}"); - } + Err(err) => panic!("Error getting node info: {err:?}"), }; match HistoryNetworkApiClient::add_enr(&client_a.rpc, target_enr.clone()).await { @@ -401,29 +357,20 @@ dyn_async! { } match client_a.rpc.get_content(target_key.clone()).await { - Ok(result) => { - match result { - ContentInfo::Content{ content, utp_transfer } => { - if content != target_value.encode() { - panic!("Error: Unexpected GETCONTENT response: didn't return expected target content"); - } - - if target_value.encode().len() < MAX_PORTAL_CONTENT_PAYLOAD_SIZE { - if utp_transfer { - panic!("Error: Unexpected GETCONTENT response: utp_transfer was supposed to be false"); - } - } else if !utp_transfer { - panic!("Error: Unexpected GETCONTENT response: utp_transfer was supposed to be true"); - } - }, - other => { - panic!("Error: Unexpected GETCONTENT response: {other:?}"); + Ok(GetContentInfo { content, utp_transfer }) => { + if content != target_value.encode() { + panic!("Error: Unexpected GETCONTENT response: didn't return expected target content"); + } + + if target_value.encode().len() < MAX_PORTAL_CONTENT_PAYLOAD_SIZE { + if utp_transfer { + panic!("Error: Unexpected GETCONTENT response: utp_transfer was supposed to be false"); } + } else if !utp_transfer { + panic!("Error: Unexpected GETCONTENT response: utp_transfer was supposed to be true"); } }, - Err(err) => { - panic!("Error: Unable to get response from GETCONTENT request: {err:?}"); - } + Err(err) => panic!("Error: Unable to get response from GETCONTENT request: {err:?}"), } } } @@ -433,18 +380,14 @@ dyn_async! { async fn test_find_content<'a> (clients: Vec, test_data: TestData) { let (client_a, client_b) = match clients.iter().collect_tuple() { Some((client_a, client_b)) => (client_a, client_b), - None => { - panic!("Unable to get expected amount of clients from NClientTestSpec"); - } + None => panic!("Unable to get expected amount of clients from NClientTestSpec"), }; if let Some((optional_key, optional_value)) = test_data.get(1).cloned() { match client_b.rpc.store(optional_key, optional_value.encode()).await { Ok(result) => if !result { panic!("Unable to store optional content for find content"); }, - Err(err) => { - panic!("Error storing optional content for find content: {err:?}"); - } + Err(err) => panic!("Error storing optional content for find content: {err:?}"), } } @@ -453,42 +396,30 @@ dyn_async! { Ok(result) => if !result { panic!("Error storing target content for find content"); }, - Err(err) => { - panic!("Error storing target content: {err:?}"); - } + Err(err) => panic!("Error storing target content: {err:?}"), } let target_enr = match client_b.rpc.node_info().await { Ok(node_info) => node_info.enr, - Err(err) => { - panic!("Error getting node info: {err:?}"); - } + Err(err) => panic!("Error getting node info: {err:?}"), }; match client_a.rpc.find_content(target_enr, target_key.clone()).await { - Ok(result) => { - match result { - ContentInfo::Content{ content, utp_transfer } => { - if content != target_value.encode() { - panic!("Error: Unexpected FINDCONTENT response: didn't return expected block body"); - } - - if target_value.encode().len() < MAX_PORTAL_CONTENT_PAYLOAD_SIZE { - if utp_transfer { - panic!("Error: Unexpected FINDCONTENT response: utp_transfer was supposed to be false"); - } - } else if !utp_transfer { - panic!("Error: Unexpected FINDCONTENT response: utp_transfer was supposed to be true"); - } - }, - other => { - panic!("Error: Unexpected FINDCONTENT response: {other:?}"); + Ok(FindContentInfo::Content { content, utp_transfer }) => { + if content != target_value.encode() { + panic!("Error: Unexpected FINDCONTENT response: didn't return expected block body"); + } + + if target_value.encode().len() < MAX_PORTAL_CONTENT_PAYLOAD_SIZE { + if utp_transfer { + panic!("Error: Unexpected FINDCONTENT response: utp_transfer was supposed to be false"); } + } else if !utp_transfer { + panic!("Error: Unexpected FINDCONTENT response: utp_transfer was supposed to be true"); } - }, - Err(err) => { - panic!("Error: Unable to get response from FINDCONTENT request: {err:?}"); } + Ok(FindContentInfo::Enrs { .. }) => panic!("Error: Unexpected FINDCONTENT response: wasn't supposed to return back enrs"), + Err(err) => panic!("Error: Unable to get response from FINDCONTENT request: {err:?}"), } } } @@ -497,16 +428,12 @@ dyn_async! { async fn test_gossip_two_nodes<'a> (clients: Vec, test_data: TestData) { let (client_a, client_b) = match clients.iter().collect_tuple() { Some((client_a, client_b)) => (client_a, client_b), - None => { - panic!("Unable to get expected amount of clients from NClientTestSpec"); - } + None => panic!("Unable to get expected amount of clients from NClientTestSpec"), }; // connect clients let client_b_enr = match client_b.rpc.node_info().await { Ok(node_info) => node_info.enr, - Err(err) => { - panic!("Error getting node info: {err:?}"); - } + Err(err) => panic!("Error getting node info: {err:?}"), }; match HistoryNetworkApiClient::add_enr(&client_a.rpc, client_b_enr.clone()).await { Ok(response) => match response { @@ -524,9 +451,7 @@ dyn_async! { panic!("We expected to gossip to 1 node instead we gossiped to: {nodes_gossiped_to}"); } } - Err(err) => { - panic!("Unable to get received content: {err:?}"); - } + Err(err) => panic!("Unable to get received content: {err:?}"), } if let HistoryContentKey::BlockHeaderByHash(_) = content_key { @@ -563,14 +488,10 @@ dyn_async! { }; match client_b.rpc.local_content(content_key.clone()).await { - Ok(expected_value) => { - if expected_value != content_value.encode() { - result.push(format!("Error content received for block {content_details} was different then expected")); - } - } - Err(err) => { - result.push(format!("Error content for block {err} was absent")); + Ok(expected_value) => if expected_value != content_value.encode() { + result.push(format!("Error content received for block {content_details} was different then expected")); } + Err(err) => result.push(format!("Error content for block {err} was absent")), } } diff --git a/simulators/portal/src/suites/history/mesh.rs b/simulators/portal/src/suites/history/mesh.rs index 00761c1891..be8bb75095 100644 --- a/simulators/portal/src/suites/history/mesh.rs +++ b/simulators/portal/src/suites/history/mesh.rs @@ -1,8 +1,7 @@ -use crate::suites::history::constants::TRIN_BRIDGE_CLIENT_TYPE; use alloy_primitives::Bytes; use ethportal_api::jsonrpsee::core::__reexports::serde_json; use ethportal_api::types::distance::{Metric, XorMetric}; -use ethportal_api::types::portal::ContentInfo; +use ethportal_api::types::portal::FindContentInfo; use ethportal_api::{Discv5ApiClient, HistoryContentKey, HistoryNetworkApiClient}; use hivesim::types::ClientDefinition; use hivesim::{dyn_async, Client, NClientTestSpec, Test}; @@ -11,6 +10,8 @@ use serde_json::json; use std::collections::HashMap; use std::str::FromStr; +use crate::suites::history::constants::TRIN_BRIDGE_CLIENT_TYPE; + // Header with proof for block number 14764013 const HEADER_WITH_PROOF_KEY: &str = "0x00720704f3aa11c53cf344ea069db95cecb81ad7453c8f276b2a1062979611f09c"; @@ -75,9 +76,7 @@ dyn_async! { async fn test_find_content_two_jumps<'a> (clients: Vec, _: ()) { let (client_a, client_b, client_c) = match clients.iter().collect_tuple() { Some((client_a, client_b, client_c)) => (client_a, client_b, client_c), - None => { - panic!("Unable to get expected amount of clients from NClientTestSpec"); - } + None => panic!("Unable to get expected amount of clients from NClientTestSpec"), }; let header_with_proof_key: HistoryContentKey = serde_json::from_value(json!(HEADER_WITH_PROOF_KEY)).unwrap(); @@ -86,16 +85,12 @@ dyn_async! { // get enr for b and c to seed for the jumps let client_b_enr = match client_b.rpc.node_info().await { Ok(node_info) => node_info.enr, - Err(err) => { - panic!("Error getting node info: {err:?}"); - } + Err(err) => panic!("Error getting node info: {err:?}"), }; let client_c_enr = match client_c.rpc.node_info().await { Ok(node_info) => node_info.enr, - Err(err) => { - panic!("Error getting node info: {err:?}"); - } + Err(err) => panic!("Error getting node info: {err:?}"), }; // seed client_c_enr into routing table of client_b @@ -109,7 +104,7 @@ dyn_async! { // send a ping from client B to C to connect the clients if let Err(err) = client_b.rpc.ping(client_c_enr.clone()).await { - panic!("Unable to receive pong info: {err:?}"); + panic!("Unable to receive pong info: {err:?}"); } // seed the data into client_c @@ -117,25 +112,13 @@ dyn_async! { Ok(result) => if !result { panic!("Unable to store header with proof for find content immediate return test"); }, - Err(err) => { - panic!("Error storing header with proof for find content immediate return test: {err:?}"); - } + Err(err) => panic!("Error storing header with proof for find content immediate return test: {err:?}"), } let enrs = match client_a.rpc.find_content(client_b_enr.clone(), header_with_proof_key.clone()).await { - Ok(result) => { - match result { - ContentInfo::Enrs{ enrs } => { - enrs - }, - other => { - panic!("Error: (Enrs) Unexpected FINDCONTENT response not: {other:?}"); - } - } - }, - Err(err) => { - panic!("Error: (Enrs) Unable to get response from FINDCONTENT request: {err:?}"); - } + Ok(FindContentInfo::Enrs{ enrs }) => enrs, + Ok(FindContentInfo::Content{ .. }) => panic!("Error: Unexpected FINDCONTENT response: expected Enrs instead got Content"), + Err(err) => panic!("Error: Unable to get response from FINDCONTENT request: {err:?}"), }; if enrs.len() != 1 { @@ -143,25 +126,17 @@ dyn_async! { } match client_a.rpc.find_content(enrs[0].clone(), header_with_proof_key.clone()).await { - Ok(result) => { - match result { - ContentInfo::Content{ content, utp_transfer } => { - if content != raw_header_with_proof_value { - panic!("Error: Unexpected FINDCONTENT response: didn't return expected header with proof value"); - } - - if utp_transfer { - panic!("Error: Unexpected FINDCONTENT response: utp_transfer was supposed to be false"); - } - }, - other => { - panic!("Error: Unexpected FINDCONTENT response: {other:?}"); - } + Ok(FindContentInfo::Content { content, utp_transfer }) => { + if content != raw_header_with_proof_value { + panic!("Error: Unexpected FINDCONTENT response: didn't return expected header with proof value"); + } + + if utp_transfer { + panic!("Error: Unexpected FINDCONTENT response: utp_transfer was supposed to be false"); } }, - Err(err) => { - panic!("Error: Unable to get response from FINDCONTENT request: {err:?}"); - } + Ok(FindContentInfo::Enrs { .. }) => panic!("Error: Unexpected FINDCONTENT response: expected Content instead got Enrs"), + Err(err) => panic!("Error: Unable to get response from FINDCONTENT request: {err:?}"), } } } @@ -170,24 +145,18 @@ dyn_async! { async fn test_find_nodes_distance_of_client_c<'a>(clients: Vec, _: ()) { let (client_a, client_b, client_c) = match clients.iter().collect_tuple() { Some((client_a, client_b, client_c)) => (client_a, client_b, client_c), - None => { - panic!("Unable to get expected amount of clients from NClientTestSpec"); - } + None => panic!("Unable to get expected amount of clients from NClientTestSpec"), }; let target_enr = match client_b.rpc.node_info().await { Ok(node_info) => node_info.enr, - Err(err) => { - panic!("Error getting node info: {err:?}"); - } + Err(err) => panic!("Error getting node info: {err:?}"), }; // We are adding client C to our list so we then can assume only one client per bucket let client_c_enr = match client_c.rpc.node_info().await { Ok(node_info) => node_info.enr, - Err(err) => { - panic!("Error getting node info: {err:?}"); - } + Err(err) => panic!("Error getting node info: {err:?}"), }; // seed enr into routing table diff --git a/simulators/portal/src/suites/history/rpc_compat.rs b/simulators/portal/src/suites/history/rpc_compat.rs index 510f6d2338..2199003a66 100644 --- a/simulators/portal/src/suites/history/rpc_compat.rs +++ b/simulators/portal/src/suites/history/rpc_compat.rs @@ -197,9 +197,7 @@ dyn_async! { async fn test_node_info<'a>(clients: Vec, _: ()) { let client = match clients.into_iter().next() { Some((client)) => client, - None => { - panic!("Unable to get expected amount of clients from NClientTestSpec"); - } + None => panic!("Unable to get expected amount of clients from NClientTestSpec"), }; if let Err(err) = Discv5ApiClient::node_info(&client.rpc).await { @@ -212,9 +210,7 @@ dyn_async! { async fn test_local_content_expect_content_absent<'a>(clients: Vec, _: ()) { let client = match clients.into_iter().next() { Some((client)) => client, - None => { - panic!("Unable to get expected amount of clients from NClientTestSpec"); - } + None => panic!("Unable to get expected amount of clients from NClientTestSpec"), }; let content_key: HistoryContentKey = serde_json::from_value(json!(CONTENT_KEY)).unwrap(); @@ -228,9 +224,7 @@ dyn_async! { async fn test_store<'a>(clients: Vec, _: ()) { let client = match clients.into_iter().next() { Some((client)) => client, - None => { - panic!("Unable to get expected amount of clients from NClientTestSpec"); - } + None => panic!("Unable to get expected amount of clients from NClientTestSpec"), }; let content_key: HistoryContentKey = serde_json::from_value(json!(CONTENT_KEY)).unwrap(); let raw_content_value = Bytes::from_str(CONTENT_VALUE).expect("unable to convert content value to bytes"); @@ -245,9 +239,7 @@ dyn_async! { async fn test_local_content_expect_content_present<'a>(clients: Vec, _: ()) { let client = match clients.into_iter().next() { Some((client)) => client, - None => { - panic!("Unable to get expected amount of clients from NClientTestSpec"); - } + None => panic!("Unable to get expected amount of clients from NClientTestSpec"), }; let content_key: HistoryContentKey = serde_json::from_value(json!(CONTENT_KEY)).unwrap(); let raw_content_value = Bytes::from_str(CONTENT_VALUE).expect("unable to convert content value to bytes"); @@ -264,9 +256,7 @@ dyn_async! { panic!("Error receiving content: Expected content: {raw_content_value:?}, Received content: {possible_content:?}"); } } - Err(err) => { - panic!("Expected content returned from local_content to be present {}", &err.to_string()); - } + Err(err) => panic!("Expected content returned from local_content to be present {}", &err.to_string()), } } } @@ -275,9 +265,7 @@ dyn_async! { async fn test_add_enr_expect_true<'a>(clients: Vec, _: ()) { let client = match clients.into_iter().next() { Some((client)) => client, - None => { - panic!("Unable to get expected amount of clients from NClientTestSpec"); - } + None => panic!("Unable to get expected amount of clients from NClientTestSpec"), }; let (_, enr) = generate_random_remote_enr(); match HistoryNetworkApiClient::add_enr(&client.rpc, enr).await { @@ -294,9 +282,7 @@ dyn_async! { async fn test_get_enr_non_present<'a>(clients: Vec, _: ()) { let client = match clients.into_iter().next() { Some((client)) => client, - None => { - panic!("Unable to get expected amount of clients from NClientTestSpec"); - } + None => panic!("Unable to get expected amount of clients from NClientTestSpec"), }; let (_, enr) = generate_random_remote_enr(); @@ -310,16 +296,12 @@ dyn_async! { async fn test_get_enr_local_enr<'a>(clients: Vec, _: ()) { let client = match clients.into_iter().next() { Some((client)) => client, - None => { - panic!("Unable to get expected amount of clients from NClientTestSpec"); - } + None => panic!("Unable to get expected amount of clients from NClientTestSpec"), }; // get our local enr from NodeInfo let target_enr = match Discv5ApiClient::node_info(&client.rpc).await { Ok(node_info) => node_info.enr, - Err(err) => { - panic!("Error getting node info: {err:?}"); - } + Err(err) => panic!("Error getting node info: {err:?}"), }; // check if we can fetch data from routing table @@ -338,9 +320,7 @@ dyn_async! { async fn test_get_enr_enr_present<'a>(clients: Vec, _: ()) { let client = match clients.into_iter().next() { Some((client)) => client, - None => { - panic!("Unable to get expected amount of clients from NClientTestSpec"); - } + None => panic!("Unable to get expected amount of clients from NClientTestSpec"), }; let (_, enr) = generate_random_remote_enr(); @@ -369,9 +349,7 @@ dyn_async! { async fn test_delete_enr_non_present<'a>(clients: Vec, _: ()) { let client = match clients.into_iter().next() { Some((client)) => client, - None => { - panic!("Unable to get expected amount of clients from NClientTestSpec"); - } + None => panic!("Unable to get expected amount of clients from NClientTestSpec"), }; let (_, enr) = generate_random_remote_enr(); match HistoryNetworkApiClient::delete_enr(&client.rpc, enr.node_id()).await { @@ -388,9 +366,7 @@ dyn_async! { async fn test_delete_enr_enr_present<'a>(clients: Vec, _: ()) { let client = match clients.into_iter().next() { Some((client)) => client, - None => { - panic!("Unable to get expected amount of clients from NClientTestSpec"); - } + None => panic!("Unable to get expected amount of clients from NClientTestSpec"), }; let (_, enr) = generate_random_remote_enr(); @@ -433,9 +409,7 @@ dyn_async! { async fn test_lookup_enr_non_present<'a>(clients: Vec, _: ()) { let client = match clients.into_iter().next() { Some((client)) => client, - None => { - panic!("Unable to get expected amount of clients from NClientTestSpec"); - } + None => panic!("Unable to get expected amount of clients from NClientTestSpec"), }; let (_, enr) = generate_random_remote_enr(); @@ -449,9 +423,7 @@ dyn_async! { async fn test_lookup_enr_enr_present<'a>(clients: Vec, _: ()) { let client = match clients.into_iter().next() { Some((client)) => client, - None => { - panic!("Unable to get expected amount of clients from NClientTestSpec"); - } + None => panic!("Unable to get expected amount of clients from NClientTestSpec"), }; let (_, enr) = generate_random_remote_enr(); @@ -480,16 +452,12 @@ dyn_async! { async fn test_lookup_enr_local_enr<'a>(clients: Vec, _: ()) { let client = match clients.into_iter().next() { Some((client)) => client, - None => { - panic!("Unable to get expected amount of clients from NClientTestSpec"); - } + None => panic!("Unable to get expected amount of clients from NClientTestSpec"), }; // get our local enr from NodeInfo let target_enr = match Discv5ApiClient::node_info(&client.rpc).await { Ok(node_info) => node_info.enr, - Err(err) => { - panic!("Error getting node info: {err:?}"); - } + Err(err) => panic!("Error getting node info: {err:?}"), }; // check if we can fetch data from routing table @@ -509,9 +477,7 @@ dyn_async! { async fn test_get_content_content_absent<'a>(clients: Vec, _: ()) { let client = match clients.into_iter().next() { Some((client)) => client, - None => { - panic!("Unable to get expected amount of clients from NClientTestSpec"); - } + None => panic!("Unable to get expected amount of clients from NClientTestSpec"), }; let header_with_proof_key: HistoryContentKey = serde_json::from_value(json!(CONTENT_KEY)).unwrap(); diff --git a/simulators/portal/src/suites/history/trin_bridge.rs b/simulators/portal/src/suites/history/trin_bridge.rs index a9ca53b777..d261b75370 100644 --- a/simulators/portal/src/suites/history/trin_bridge.rs +++ b/simulators/portal/src/suites/history/trin_bridge.rs @@ -75,16 +75,12 @@ dyn_async! { async fn test_bridge<'a>(clients: Vec, _: ()) { let client = match clients.into_iter().next() { Some((client)) => client, - None => { - panic!("Unable to get expected amount of clients from NClientTestSpec"); - } + None => panic!("Unable to get expected amount of clients from NClientTestSpec"), }; let client_enr = match client.rpc.node_info().await { Ok(node_info) => node_info.enr, - Err(err) => { - panic!("Error getting node info: {err:?}"); - } + Err(err) => panic!("Error getting node info: {err:?}"), }; client.test.start_client(TRIN_BRIDGE_CLIENT_TYPE.to_string(), Some(HashMap::from([(BOOTNODES_ENVIRONMENT_VARIABLE.to_string(), client_enr.to_base64()), (HIVE_CHECK_LIVE_PORT.to_string(), 0.to_string())]))).await; @@ -112,9 +108,7 @@ dyn_async! { result.push(format!("Error content received for block {} was different then expected: Provided: {content:?} Expected: {content_value:?}", comments[index])); } } - Err(err) => { - panic!("Unable to get received content: {err:?}"); - } + Err(err) => panic!("Unable to get received content: {err:?}"), } } diff --git a/simulators/portal/src/suites/state/interop.rs b/simulators/portal/src/suites/state/interop.rs index bfeca3d3fe..1f5c846407 100644 --- a/simulators/portal/src/suites/state/interop.rs +++ b/simulators/portal/src/suites/state/interop.rs @@ -9,7 +9,7 @@ use ethportal_api::jsonrpsee::http_client::HttpClient; use ethportal_api::types::execution::header_with_proof::{ BlockHeaderProof, HeaderWithProof, SszNone, }; -use ethportal_api::types::portal::ContentInfo; +use ethportal_api::types::portal::{FindContentInfo, GetContentInfo}; use ethportal_api::types::portal_wire::MAX_PORTAL_CONTENT_PAYLOAD_SIZE; use ethportal_api::utils::bytes::hex_encode; use ethportal_api::{ @@ -214,40 +214,23 @@ dyn_async! { async fn test_find_content_non_present<'a>(clients: Vec, _: ()) { let (client_a, client_b) = match clients.iter().collect_tuple() { Some((client_a, client_b)) => (client_a, client_b), - None => { - panic!("Unable to get expected amount of clients from NClientTestSpec"); - } + None => panic!("Unable to get expected amount of clients from NClientTestSpec"), }; let header_with_proof_key: StateContentKey = serde_json::from_value(json!(CONTENT_KEY)).unwrap(); let target_enr = match client_b.rpc.node_info().await { Ok(node_info) => node_info.enr, - Err(err) => { - panic!("Error getting node info: {err:?}"); - } + Err(err) => panic!("Error getting node info: {err:?}"), }; let result = client_a.rpc.find_content(target_enr, header_with_proof_key.clone()).await; match result { - Ok(result) => { - match result { - ContentInfo::Enrs{ enrs: val } => { - if !val.is_empty() { - panic!("Error: Unexpected FINDCONTENT response: expected ContentInfo::Enrs length 0 got {}", val.len()); - } - }, - ContentInfo::Content{ content: _, .. } => { - panic!("Error: Unexpected FINDCONTENT response: wasn't supposed to return back content"); - }, - other => { - panic!("Error: Unexpected FINDCONTENT response: {other:?}"); - } - } + Ok(FindContentInfo::Enrs { enrs }) => if !enrs.is_empty() { + panic!("Error: Unexpected FINDCONTENT response: expected ContentInfo::Enrs length 0 got {}", enrs.len()); }, - Err(err) => { - panic!("Error: Unable to get response from FINDCONTENT request: {err:?}"); - } + Ok(FindContentInfo::Content { .. }) => panic!("Error: Unexpected FINDCONTENT response: expected Enrs got Content"), + Err(err) => panic!("Error: Unable to get response from FINDCONTENT request: {err:?}"), } } } @@ -256,9 +239,7 @@ dyn_async! { async fn test_offer<'a>(clients: Vec, test_data: TestData) { let (client_a, client_b) = match clients.iter().collect_tuple() { Some((client_a, client_b)) => (client_a, client_b), - None => { - panic!("Unable to get expected amount of clients from NClientTestSpec"); - } + None => panic!("Unable to get expected amount of clients from NClientTestSpec"), }; let TestData { @@ -270,9 +251,7 @@ dyn_async! { let target_enr = match client_b.rpc.node_info().await { Ok(node_info) => node_info.enr, - Err(err) => { - panic!("Error getting node info: {err:?}"); - } + Err(err) => panic!("Error getting node info: {err:?}"), }; store_header(header, &client_b.rpc).await; @@ -287,9 +266,7 @@ dyn_async! { panic!("Error receiving content: Expected content: {target_lookup_value:?}, Received content: {possible_content:?}"); } } - Err(err) => { - panic!("Unable to get received content: {err:?}"); - } + Err(err) => panic!("Unable to get received content: {err:?}"), } } } @@ -298,15 +275,11 @@ dyn_async! { async fn test_ping<'a>(clients: Vec, _: ()) { let (client_a, client_b) = match clients.iter().collect_tuple() { Some((client_a, client_b)) => (client_a, client_b), - None => { - panic!("Unable to get expected amount of clients from NClientTestSpec"); - } + None => panic!("Unable to get expected amount of clients from NClientTestSpec"), }; let target_enr = match client_b.rpc.node_info().await { Ok(node_info) => node_info.enr, - Err(err) => { - panic!("Error getting node info: {err:?}"); - } + Err(err) => panic!("Error getting node info: {err:?}"), }; let pong = client_a.rpc.ping(target_enr).await; @@ -319,9 +292,7 @@ dyn_async! { // handshake mechanism. let stored_enr = match client_a.rpc.node_info().await { Ok(node_info) => node_info.enr, - Err(err) => { - panic!("Error getting node info: {err:?}"); - } + Err(err) => panic!("Error getting node info: {err:?}"), }; match StateNetworkApiClient::get_enr(&client_b.rpc, stored_enr.node_id()).await { @@ -339,15 +310,11 @@ dyn_async! { async fn test_find_nodes_zero_distance<'a>(clients: Vec, _: ()) { let (client_a, client_b) = match clients.iter().collect_tuple() { Some((client_a, client_b)) => (client_a, client_b), - None => { - panic!("Unable to get expected amount of clients from NClientTestSpec"); - } + None => panic!("Unable to get expected amount of clients from NClientTestSpec"), }; let target_enr = match client_b.rpc.node_info().await { Ok(node_info) => node_info.enr, - Err(err) => { - panic!("Error getting node info: {err:?}"); - } + Err(err) => panic!("Error getting node info: {err:?}"), }; match client_a.rpc.find_nodes(target_enr.clone(), vec![0]).await { @@ -375,9 +342,7 @@ dyn_async! { async fn test_get_content<'a>(clients: Vec, test_data: TestData) { let (client_a, client_b) = match clients.iter().collect_tuple() { Some((client_a, client_b)) => (client_a, client_b), - None => { - panic!("Unable to get expected amount of clients from NClientTestSpec"); - } + None => panic!("Unable to get expected amount of clients from NClientTestSpec"), }; let TestData { @@ -391,16 +356,12 @@ dyn_async! { Ok(result) => if !result { panic!("Error storing target content for get content"); }, - Err(err) => { - panic!("Error storing target content: {err:?}"); - } + Err(err) => panic!("Error storing target content: {err:?}"), } let target_enr = match client_b.rpc.node_info().await { Ok(node_info) => node_info.enr, - Err(err) => { - panic!("Error getting node info: {err:?}"); - } + Err(err) => panic!("Error getting node info: {err:?}"), }; match StateNetworkApiClient::add_enr(&client_a.rpc, target_enr.clone()).await { @@ -412,29 +373,20 @@ dyn_async! { } match client_a.rpc.get_content(target_key.clone()).await { - Ok(result) => { - match result { - ContentInfo::Content{ content, utp_transfer } => { - if content != target_lookup_value.encode() { - panic!("Error: Unexpected GETCONTENT response: didn't return expected target content"); - } + Ok(GetContentInfo{ content, utp_transfer }) => { + if content != target_lookup_value.encode() { + panic!("Error: Unexpected GETCONTENT response: didn't return expected target content"); + } - if target_lookup_value.encode().len() < MAX_PORTAL_CONTENT_PAYLOAD_SIZE { - if utp_transfer { - panic!("Error: Unexpected GETCONTENT response: utp_transfer was supposed to be false"); - } - } else if !utp_transfer { - panic!("Error: Unexpected GETCONTENT response: utp_transfer was supposed to be true"); - } - }, - other => { - panic!("Error: Unexpected GETCONTENT response: {other:?}"); + if target_lookup_value.encode().len() < MAX_PORTAL_CONTENT_PAYLOAD_SIZE { + if utp_transfer { + panic!("Error: Unexpected GETCONTENT response: utp_transfer was supposed to be false"); } + } else if !utp_transfer { + panic!("Error: Unexpected GETCONTENT response: utp_transfer was supposed to be true"); } }, - Err(err) => { - panic!("Error: Unable to get response from GETCONTENT request: {err:?}"); - } + Err(err) => panic!("Error: Unable to get response from GETCONTENT request: {err:?}"), } } } @@ -444,9 +396,7 @@ dyn_async! { async fn test_find_content<'a> (clients: Vec, test_data: TestData) { let (client_a, client_b) = match clients.iter().collect_tuple() { Some((client_a, client_b)) => (client_a, client_b), - None => { - panic!("Unable to get expected amount of clients from NClientTestSpec"); - } + None => panic!("Unable to get expected amount of clients from NClientTestSpec"), }; let TestData { @@ -460,42 +410,30 @@ dyn_async! { Ok(result) => if !result { panic!("Error storing target content for find content"); }, - Err(err) => { - panic!("Error storing target content: {err:?}"); - } + Err(err) => panic!("Error storing target content: {err:?}"), } let target_enr = match client_b.rpc.node_info().await { Ok(node_info) => node_info.enr, - Err(err) => { - panic!("Error getting node info: {err:?}"); - } + Err(err) => panic!("Error getting node info: {err:?}"), }; match client_a.rpc.find_content(target_enr, target_key.clone()).await { - Ok(result) => { - match result { - ContentInfo::Content{ content, utp_transfer } => { - if content != target_lookup_value.encode() { - panic!("Error: Unexpected FINDCONTENT response: didn't return expected block body"); - } + Ok(FindContentInfo::Content { content, utp_transfer }) => { + if content != target_lookup_value.encode() { + panic!("Error: Unexpected FINDCONTENT response: didn't return expected block body"); + } - if target_lookup_value.encode().len() < MAX_PORTAL_CONTENT_PAYLOAD_SIZE { - if utp_transfer { - panic!("Error: Unexpected FINDCONTENT response: utp_transfer was supposed to be false"); - } - } else if !utp_transfer { - panic!("Error: Unexpected FINDCONTENT response: utp_transfer was supposed to be true"); - } - }, - other => { - panic!("Error: Unexpected FINDCONTENT response: {other:?}"); + if target_lookup_value.encode().len() < MAX_PORTAL_CONTENT_PAYLOAD_SIZE { + if utp_transfer { + panic!("Error: Unexpected FINDCONTENT response: utp_transfer was supposed to be false"); } + } else if !utp_transfer { + panic!("Error: Unexpected FINDCONTENT response: utp_transfer was supposed to be true"); } }, - Err(err) => { - panic!("Error: Unable to get response from FINDCONTENT request: {err:?}"); - } + Ok(FindContentInfo::Enrs { .. }) => panic!("Error: Unexpected FINDCONTENT response: expected Content got Enrs"), + Err(err) => panic!("Error: Unable to get response from FINDCONTENT request: {err:?}"), } } } @@ -504,16 +442,12 @@ dyn_async! { async fn test_gossip_two_nodes<'a> (clients: Vec, test_data: Vec) { let (client_a, client_b) = match clients.iter().collect_tuple() { Some((client_a, client_b)) => (client_a, client_b), - None => { - panic!("Unable to get expected amount of clients from NClientTestSpec"); - } + None => panic!("Unable to get expected amount of clients from NClientTestSpec"), }; // connect clients let client_b_enr = match client_b.rpc.node_info().await { Ok(node_info) => node_info.enr, - Err(err) => { - panic!("Error getting node info: {err:?}"); - } + Err(err) => panic!("Error getting node info: {err:?}"), }; match StateNetworkApiClient::add_enr(&client_a.rpc, client_b_enr.clone()).await { Ok(response) => match response { @@ -533,9 +467,7 @@ dyn_async! { panic!("We expected to gossip to 1 node instead we gossiped to: {nodes_gossiped_to}"); } } - Err(err) => { - panic!("Unable to get received content: {err:?}"); - } + Err(err) => panic!("Unable to get received content: {err:?}"), } tokio::time::sleep(Duration::from_secs(1)).await; @@ -566,9 +498,7 @@ dyn_async! { result.push(format!("Error content received for block {content_details} was different then expected")); } } - Err(err) => { - result.push(format!("Error content for block {err} was absent")); - } + Err(err) => result.push(format!("Error content for block {err} was absent")), } } diff --git a/simulators/portal/src/suites/state/rpc_compat.rs b/simulators/portal/src/suites/state/rpc_compat.rs index 4a978c49f6..8498c1b335 100644 --- a/simulators/portal/src/suites/state/rpc_compat.rs +++ b/simulators/portal/src/suites/state/rpc_compat.rs @@ -200,9 +200,7 @@ dyn_async! { async fn test_node_info<'a>(clients: Vec, _: ()) { let client = match clients.into_iter().next() { Some((client)) => client, - None => { - panic!("Unable to get expected amount of clients from NClientTestSpec"); - } + None => panic!("Unable to get expected amount of clients from NClientTestSpec"), }; if let Err(err) = Discv5ApiClient::node_info(&client.rpc).await { @@ -215,9 +213,7 @@ dyn_async! { async fn test_local_content_expect_content_absent<'a>(clients: Vec, _: ()) { let client = match clients.into_iter().next() { Some((client)) => client, - None => { - panic!("Unable to get expected amount of clients from NClientTestSpec"); - } + None => panic!("Unable to get expected amount of clients from NClientTestSpec"), }; let content_key: StateContentKey = serde_json::from_value(json!(CONTENT_KEY)).unwrap(); @@ -231,9 +227,7 @@ dyn_async! { async fn test_store<'a>(clients: Vec, _: ()) { let client = match clients.into_iter().next() { Some((client)) => client, - None => { - panic!("Unable to get expected amount of clients from NClientTestSpec"); - } + None => panic!("Unable to get expected amount of clients from NClientTestSpec"), }; let content_key: StateContentKey = serde_json::from_value(json!(CONTENT_KEY)).unwrap(); let raw_content_offer_value = Bytes::from_str(CONTENT_OFFER_VALUE).unwrap(); @@ -248,9 +242,7 @@ dyn_async! { async fn test_local_content_expect_content_present<'a>(clients: Vec, _: ()) { let client = match clients.into_iter().next() { Some((client)) => client, - None => { - panic!("Unable to get expected amount of clients from NClientTestSpec"); - } + None => panic!("Unable to get expected amount of clients from NClientTestSpec"), }; let content_key: StateContentKey = serde_json::from_value(json!(CONTENT_KEY)).unwrap(); let raw_content_offer_value = Bytes::from_str(CONTENT_OFFER_VALUE).unwrap(); @@ -268,9 +260,7 @@ dyn_async! { panic!("Error receiving content: Expected content: {raw_content_lookup_value:?}, Received content: {possible_content:?}"); } } - Err(err) => { - panic!("Expected content returned from local_content to be present {}", &err.to_string()); - } + Err(err) => panic!("Expected content returned from local_content to be present {}", &err.to_string()), } } } @@ -279,9 +269,7 @@ dyn_async! { async fn test_add_enr_expect_true<'a>(clients: Vec, _: ()) { let client = match clients.into_iter().next() { Some((client)) => client, - None => { - panic!("Unable to get expected amount of clients from NClientTestSpec"); - } + None => panic!("Unable to get expected amount of clients from NClientTestSpec"), }; let (_, enr) = generate_random_remote_enr(); match StateNetworkApiClient::add_enr(&client.rpc, enr).await { @@ -298,9 +286,7 @@ dyn_async! { async fn test_get_enr_non_present<'a>(clients: Vec, _: ()) { let client = match clients.into_iter().next() { Some((client)) => client, - None => { - panic!("Unable to get expected amount of clients from NClientTestSpec"); - } + None => panic!("Unable to get expected amount of clients from NClientTestSpec"), }; let (_, enr) = generate_random_remote_enr(); @@ -314,16 +300,12 @@ dyn_async! { async fn test_get_enr_local_enr<'a>(clients: Vec, _: ()) { let client = match clients.into_iter().next() { Some((client)) => client, - None => { - panic!("Unable to get expected amount of clients from NClientTestSpec"); - } + None => panic!("Unable to get expected amount of clients from NClientTestSpec"), }; // get our local enr from NodeInfo let target_enr = match Discv5ApiClient::node_info(&client.rpc).await { Ok(node_info) => node_info.enr, - Err(err) => { - panic!("Error getting node info: {err:?}"); - } + Err(err) => panic!("Error getting node info: {err:?}"), }; // check if we can fetch data from routing table @@ -342,9 +324,7 @@ dyn_async! { async fn test_get_enr_enr_present<'a>(clients: Vec, _: ()) { let client = match clients.into_iter().next() { Some((client)) => client, - None => { - panic!("Unable to get expected amount of clients from NClientTestSpec"); - } + None => panic!("Unable to get expected amount of clients from NClientTestSpec"), }; let (_, enr) = generate_random_remote_enr(); @@ -373,9 +353,7 @@ dyn_async! { async fn test_delete_enr_non_present<'a>(clients: Vec, _: ()) { let client = match clients.into_iter().next() { Some((client)) => client, - None => { - panic!("Unable to get expected amount of clients from NClientTestSpec"); - } + None => panic!("Unable to get expected amount of clients from NClientTestSpec"), }; let (_, enr) = generate_random_remote_enr(); match StateNetworkApiClient::delete_enr(&client.rpc, enr.node_id()).await { @@ -392,9 +370,7 @@ dyn_async! { async fn test_delete_enr_enr_present<'a>(clients: Vec, _: ()) { let client = match clients.into_iter().next() { Some((client)) => client, - None => { - panic!("Unable to get expected amount of clients from NClientTestSpec"); - } + None => panic!("Unable to get expected amount of clients from NClientTestSpec"), }; let (_, enr) = generate_random_remote_enr(); @@ -437,9 +413,7 @@ dyn_async! { async fn test_lookup_enr_non_present<'a>(clients: Vec, _: ()) { let client = match clients.into_iter().next() { Some((client)) => client, - None => { - panic!("Unable to get expected amount of clients from NClientTestSpec"); - } + None => panic!("Unable to get expected amount of clients from NClientTestSpec"), }; let (_, enr) = generate_random_remote_enr(); @@ -453,9 +427,7 @@ dyn_async! { async fn test_lookup_enr_enr_present<'a>(clients: Vec, _: ()) { let client = match clients.into_iter().next() { Some((client)) => client, - None => { - panic!("Unable to get expected amount of clients from NClientTestSpec"); - } + None => panic!("Unable to get expected amount of clients from NClientTestSpec"), }; let (_, enr) = generate_random_remote_enr(); @@ -484,16 +456,12 @@ dyn_async! { async fn test_lookup_enr_local_enr<'a>(clients: Vec, _: ()) { let client = match clients.into_iter().next() { Some((client)) => client, - None => { - panic!("Unable to get expected amount of clients from NClientTestSpec"); - } + None => panic!("Unable to get expected amount of clients from NClientTestSpec"), }; // get our local enr from NodeInfo let target_enr = match Discv5ApiClient::node_info(&client.rpc).await { Ok(node_info) => node_info.enr, - Err(err) => { - panic!("Error getting node info: {err:?}"); - } + Err(err) => panic!("Error getting node info: {err:?}"), }; // check if we can fetch data from routing table @@ -513,9 +481,7 @@ dyn_async! { async fn test_get_content_content_absent<'a>(clients: Vec, _: ()) { let client = match clients.into_iter().next() { Some((client)) => client, - None => { - panic!("Unable to get expected amount of clients from NClientTestSpec"); - } + None => panic!("Unable to get expected amount of clients from NClientTestSpec"), }; let header_with_proof_key: StateContentKey = serde_json::from_value(json!(CONTENT_KEY)).unwrap(); From b510783c726e8056c9ae0f82ebaae56a1e5f6e8e Mon Sep 17 00:00:00 2001 From: Jochem Brouwer Date: Tue, 29 Oct 2024 15:35:00 +0100 Subject: [PATCH 345/387] clients/ethereumjs: Fix Dockerfile.local (#1174) hive/clients/ethereumjs: update local dockerfile to match trie -> mpt rename --- clients/ethereumjs/Dockerfile.local | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/clients/ethereumjs/Dockerfile.local b/clients/ethereumjs/Dockerfile.local index c0db8440e3..e62b6fa241 100644 --- a/clients/ethereumjs/Dockerfile.local +++ b/clients/ethereumjs/Dockerfile.local @@ -26,7 +26,7 @@ COPY ${local_path}/packages/evm/package.json ethereumjs-monorepo/packages/evm/pa COPY ${local_path}/packages/genesis/package.json ethereumjs-monorepo/packages/genesis/package.json COPY ${local_path}/packages/rlp/package.json ethereumjs-monorepo/packages/rlp/package.json COPY ${local_path}/packages/statemanager/package.json ethereumjs-monorepo/packages/statemanager/package.json -COPY ${local_path}/packages/trie/package.json ethereumjs-monorepo/packages/trie/package.json +COPY ${local_path}/packages/mpt/package.json ethereumjs-monorepo/packages/mpt/package.json COPY ${local_path}/packages/tx/package.json ethereumjs-monorepo/packages/tx/package.json COPY ${local_path}/packages/util/package.json ethereumjs-monorepo/packages/util/package.json COPY ${local_path}/packages/verkle/package.json ethereumjs-monorepo/packages/verkle/package.json @@ -49,7 +49,7 @@ COPY ${local_path}/packages/wallet ethereumjs-monorepo/packages/wallet COPY ${local_path}/packages/common ethereumjs-monorepo/packages/common COPY ${local_path}/packages/devp2p ethereumjs-monorepo/packages/devp2p COPY ${local_path}/packages/genesis ethereumjs-monorepo/packages/genesis -COPY ${local_path}/packages/trie ethereumjs-monorepo/packages/trie +COPY ${local_path}/packages/mpt ethereumjs-monorepo/packages/mpt COPY ${local_path}/packages/statemanager ethereumjs-monorepo/packages/statemanager COPY ${local_path}/packages/tx ethereumjs-monorepo/packages/tx COPY ${local_path}/packages/evm ethereumjs-monorepo/packages/evm From 7b0ce986d7dac79784247ca1fccfb1e4eb93bf0d Mon Sep 17 00:00:00 2001 From: spencer Date: Thu, 7 Nov 2024 23:45:40 +0700 Subject: [PATCH 346/387] simulators/ethereum: add eest consume engine/rlp and remove pyspec (#1178) * configs: remove cancun. * ethereum/simulators/pyspec: remove pyspec :(. * ethereum/simulators/eest: add consume engine and rlp. --- configs/cancun.yaml | 84 ----- .../ethereum/eest/consume-engine/Dockerfile | 16 + .../ethereum/eest/consume-rlp/Dockerfile | 16 + simulators/ethereum/pyspec/Dockerfile | 32 -- simulators/ethereum/pyspec/README.md | 40 --- simulators/ethereum/pyspec/forks.go | 75 ---- simulators/ethereum/pyspec/gen_gb.go | 100 ------ simulators/ethereum/pyspec/go.mod | 79 ----- simulators/ethereum/pyspec/go.sum | 333 ------------------ simulators/ethereum/pyspec/hive_context.txt | 1 - simulators/ethereum/pyspec/main.go | 129 ------- simulators/ethereum/pyspec/runner.go | 217 ------------ simulators/ethereum/pyspec/types.go | 258 -------------- 13 files changed, 32 insertions(+), 1348 deletions(-) delete mode 100644 configs/cancun.yaml create mode 100644 simulators/ethereum/eest/consume-engine/Dockerfile create mode 100644 simulators/ethereum/eest/consume-rlp/Dockerfile delete mode 100644 simulators/ethereum/pyspec/Dockerfile delete mode 100644 simulators/ethereum/pyspec/README.md delete mode 100644 simulators/ethereum/pyspec/forks.go delete mode 100644 simulators/ethereum/pyspec/gen_gb.go delete mode 100644 simulators/ethereum/pyspec/go.mod delete mode 100644 simulators/ethereum/pyspec/go.sum delete mode 100644 simulators/ethereum/pyspec/hive_context.txt delete mode 100644 simulators/ethereum/pyspec/main.go delete mode 100644 simulators/ethereum/pyspec/runner.go delete mode 100644 simulators/ethereum/pyspec/types.go diff --git a/configs/cancun.yaml b/configs/cancun.yaml deleted file mode 100644 index 7a063f3c83..0000000000 --- a/configs/cancun.yaml +++ /dev/null @@ -1,84 +0,0 @@ -- client: besu - nametag: cancun-git - dockerfile: git - build_args: - github: hyperledger/besu - tag: main - -- client: erigon - nametag: cancun-git - dockerfile: git - build_args: - github: ledgerwatch/erigon - tag: devel - -- client: ethereumjs - nametag: cancun-git - build_args: - github: ethereumjs/ethereumjs-monorepo - tag: master - -- client: go-ethereum - nametag: cancun-git - dockerfile: git - -- client: nethermind - nametag: cancun-git - dockerfile: git - build_args: - github: NethermindEth/nethermind - tag: master - -- client: reth - nametag: cancun-git - dockerfile: git - build_args: - github: paradigmxyz/reth - tag: main - -- client: teku-bn - nametag: deneb - build_args: - baseimage: ethpandaops/teku - tag: master -- client: teku-vc - nametag: deneb - build_args: - baseimage: ethpandaops/teku - tag: master - -- client: prysm-bn - nametag: deneb - build_args: - baseimage: ethpandaops/prysm - tag: develop-linux-amd64 -- client: prysm-vc - nametag: deneb - build_args: - baseimage: ethpandaops/prysm-validator - tag: develop-linux-amd64 - -- client: lighthouse-bn - nametag: deneb - build_args: - baseimage: ethpandaops/lighthouse - tag: unstable-linux-amd64 -- client: lighthouse-vc - nametag: deneb - build_args: - baseimage: ethpandaops/lighthouse - tag: unstable-linux-amd64 - -- client: lodestar-bn - nametag: deneb - build_args: - baseimage: ethpandaops/lodestar - tag: unstable-linux-amd64 -- client: lodestar-vc - nametag: deneb - build_args: - baseimage: ethpandaops/lodestar - tag: unstable-linux-amd64 - -- client: nimbus-bn -- client: nimbus-vc diff --git a/simulators/ethereum/eest/consume-engine/Dockerfile b/simulators/ethereum/eest/consume-engine/Dockerfile new file mode 100644 index 0000000000..77855b6ede --- /dev/null +++ b/simulators/ethereum/eest/consume-engine/Dockerfile @@ -0,0 +1,16 @@ +# Builds and runs the EEST (execution-spec-tests) consume engine simulator +FROM python:3.10-slim + +## Install dependencies +RUN apt-get update && \ + apt-get install -y git wget tar && \ + apt-get clean && \ + rm -rf /var/lib/apt/lists/* + +## Clone and install EEST +RUN git clone https://github.com/ethereum/execution-spec-tests.git --branch main --single-branch --depth 1 +WORKDIR execution-spec-tests +RUN pip install uv && uv sync + +## Define `consume engine` entry point using the local fixtures +ENTRYPOINT ["uv", "run", "consume", "engine", "-v", "--input", "latest-stable-release"] \ No newline at end of file diff --git a/simulators/ethereum/eest/consume-rlp/Dockerfile b/simulators/ethereum/eest/consume-rlp/Dockerfile new file mode 100644 index 0000000000..31a31fb85c --- /dev/null +++ b/simulators/ethereum/eest/consume-rlp/Dockerfile @@ -0,0 +1,16 @@ +# Builds and runs the EEST (execution-spec-tests) consume rlp simulator +FROM python:3.10-slim + +## Install dependencies +RUN apt-get update && \ + apt-get install -y git wget tar && \ + apt-get clean && \ + rm -rf /var/lib/apt/lists/* + +## Clone and install EEST +RUN git clone https://github.com/ethereum/execution-spec-tests.git --branch main --single-branch --depth 1 +WORKDIR execution-spec-tests +RUN pip install uv && uv sync + +## Define `consume rlp` entry point using the local fixtures +ENTRYPOINT ["uv", "run", "consume", "rlp", "-v", "--input", "latest-stable-release"] diff --git a/simulators/ethereum/pyspec/Dockerfile b/simulators/ethereum/pyspec/Dockerfile deleted file mode 100644 index d42e0070b2..0000000000 --- a/simulators/ethereum/pyspec/Dockerfile +++ /dev/null @@ -1,32 +0,0 @@ -# ---------------------------------------------------------------# -# This simulation runs the Ethereum python execution-spec-tests. # -# ---------------------------------------------------------------# - -# 1) Create pyspec builder container. -FROM golang:1.22-alpine as builder -RUN apk add --update git ca-certificates gcc musl-dev linux-headers - -# Build the pyspec simulator executable. -ADD . /source -WORKDIR /source/pyspec -RUN go build -v . - -# 2) Create the simulator container. -FROM alpine:latest as simulator -RUN apk add --update wget -ADD ./pyspec /pyspec -WORKDIR /pyspec -COPY --from=builder /source/pyspec/pyspec . - -# To run locally generated fixtures, comment the following RUN lines and -# uncomment the ADD line. -# Download the latest fixture release. -RUN wget https://github.com/ethereum/execution-spec-tests/releases/latest/download/fixtures_develop.tar.gz -RUN tar -xzvf fixtures_develop.tar.gz -RUN mv fixtures/blockchain_tests_engine /fixtures - -# ADD ./pyspec/fixtures /fixtures - -# Point to executable and test fixtures. -ENV TESTPATH /fixtures -ENTRYPOINT ["./pyspec"] diff --git a/simulators/ethereum/pyspec/README.md b/simulators/ethereum/pyspec/README.md deleted file mode 100644 index 9310c3991e..0000000000 --- a/simulators/ethereum/pyspec/README.md +++ /dev/null @@ -1,40 +0,0 @@ -# Hive Pyspec - -This is a `simulator` for running the python [execution-spec-tests](https://github.com/ethereum/execution-spec-tests) within [`hive`](https://github.com/ethereum/hive), based on the `consensus` simulator. It differs mostly by using the `Engine API` to feed blocks into clients. - -The simulator is only valid for post `Merge` forks (>= `Merge`). - -It can be run from the `hive` root directory simply: -```sh -./hive --client go-ethereum --sim ethereum/pyspec -``` - -The `pyspec simulator` uses the latest test fixtures from the -most recent execution-spec-tests [release](https://github.com/ethereum/execution-spec-tests/releases). - - -### Running Specific Test Fixtures - -By default all test fixtures will run. To run a specific test or set of test fixtures the regex `--sim-limit /` option can be used. - -This can utilised in `pyspec` for running tests exclusive to a specific fork. The pattern must match at least one hive simulation test name within the `pyspec` suite. - -Test names are of the type `_` omitting `fixtures` from the path. For example, the fixture test `000_push0_key_sstore_shanghai` within `push0.json` will have a hive test name of: `eips_eip3855_000_push0_key_sstore_shanghai`. - -1) To run only this test, an example pattern could be: - - `./hive --sim ethereum/pyspec --sim.limit /0_push0_key_sstore` - -2) To run every withdrawals test in the suite: - - `./hive --sim ethereum/pyspec --sim.limit /withdrawals` - -3) To run only tests exclusive to the `Shanghai` fork: - - `./hive --sim ethereum/pyspec --sim.limit /shanghai` - -For a better understand of how to utilise the regex pattern please browse the folder structure of the latest fixture [release](https://github.com/ethereum/execution-spec-tests/releases). - - -### Excluding Test Fixtures - -To exclude a file or set of files, partial paths can be added to `excludePaths := []string{"example/"}` within \ -the first code section of `runner.go/LoadFixtureTests()`. By default we exclude all files within the path `fixtures/example/example/*`. - diff --git a/simulators/ethereum/pyspec/forks.go b/simulators/ethereum/pyspec/forks.go deleted file mode 100644 index 422bd3444b..0000000000 --- a/simulators/ethereum/pyspec/forks.go +++ /dev/null @@ -1,75 +0,0 @@ -package main - -var envForks = map[string]map[string]int{ - "Merge": { - "HIVE_FORK_HOMESTEAD": 0, - "HIVE_FORK_TANGERINE": 0, - "HIVE_FORK_SPURIOUS": 0, - "HIVE_FORK_BYZANTIUM": 0, - "HIVE_FORK_CONSTANTINOPLE": 0, - "HIVE_FORK_PETERSBURG": 0, - "HIVE_FORK_ISTANBUL": 0, - "HIVE_FORK_BERLIN": 0, - "HIVE_FORK_LONDON": 0, - "HIVE_FORK_MERGE": 0, - "HIVE_TERMINAL_TOTAL_DIFFICULTY": 0, - }, - "Shanghai": { - "HIVE_FORK_HOMESTEAD": 0, - "HIVE_FORK_TANGERINE": 0, - "HIVE_FORK_SPURIOUS": 0, - "HIVE_FORK_BYZANTIUM": 0, - "HIVE_FORK_CONSTANTINOPLE": 0, - "HIVE_FORK_PETERSBURG": 0, - "HIVE_FORK_ISTANBUL": 0, - "HIVE_FORK_BERLIN": 0, - "HIVE_FORK_LONDON": 0, - "HIVE_FORK_MERGE": 0, - "HIVE_TERMINAL_TOTAL_DIFFICULTY": 0, - "HIVE_SHANGHAI_TIMESTAMP": 0, - }, - "MergeToShanghaiAtTime15k": { - "HIVE_FORK_HOMESTEAD": 0, - "HIVE_FORK_TANGERINE": 0, - "HIVE_FORK_SPURIOUS": 0, - "HIVE_FORK_BYZANTIUM": 0, - "HIVE_FORK_CONSTANTINOPLE": 0, - "HIVE_FORK_PETERSBURG": 0, - "HIVE_FORK_ISTANBUL": 0, - "HIVE_FORK_BERLIN": 0, - "HIVE_FORK_LONDON": 0, - "HIVE_FORK_MERGE": 0, - "HIVE_TERMINAL_TOTAL_DIFFICULTY": 0, - "HIVE_SHANGHAI_TIMESTAMP": 15000, - }, - "Cancun": { - "HIVE_FORK_HOMESTEAD": 0, - "HIVE_FORK_TANGERINE": 0, - "HIVE_FORK_SPURIOUS": 0, - "HIVE_FORK_BYZANTIUM": 0, - "HIVE_FORK_CONSTANTINOPLE": 0, - "HIVE_FORK_PETERSBURG": 0, - "HIVE_FORK_ISTANBUL": 0, - "HIVE_FORK_BERLIN": 0, - "HIVE_FORK_LONDON": 0, - "HIVE_FORK_MERGE": 0, - "HIVE_TERMINAL_TOTAL_DIFFICULTY": 0, - "HIVE_SHANGHAI_TIMESTAMP": 0, - "HIVE_CANCUN_TIMESTAMP": 0, - }, - "ShanghaiToCancunAtTime15k": { - "HIVE_FORK_HOMESTEAD": 0, - "HIVE_FORK_TANGERINE": 0, - "HIVE_FORK_SPURIOUS": 0, - "HIVE_FORK_BYZANTIUM": 0, - "HIVE_FORK_CONSTANTINOPLE": 0, - "HIVE_FORK_PETERSBURG": 0, - "HIVE_FORK_ISTANBUL": 0, - "HIVE_FORK_BERLIN": 0, - "HIVE_FORK_LONDON": 0, - "HIVE_FORK_MERGE": 0, - "HIVE_TERMINAL_TOTAL_DIFFICULTY": 0, - "HIVE_SHANGHAI_TIMESTAMP": 0, - "HIVE_CANCUN_TIMESTAMP": 15000, - }, -} diff --git a/simulators/ethereum/pyspec/gen_gb.go b/simulators/ethereum/pyspec/gen_gb.go deleted file mode 100644 index 09b9e4bea6..0000000000 --- a/simulators/ethereum/pyspec/gen_gb.go +++ /dev/null @@ -1,100 +0,0 @@ -// Code generated by github.com/fjl/gencodec. DO NOT EDIT. - -package main - -import ( - "encoding/json" - "math/big" - - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/common/hexutil" - "github.com/ethereum/go-ethereum/common/math" - "github.com/ethereum/go-ethereum/core/types" -) - -var _ = (*genesisBlockUnmarshaling)(nil) - -// MarshalJSON marshals as JSON. -func (g genesisBlock) MarshalJSON() ([]byte, error) { - type genesisBlock struct { - Coinbase common.Address `json:"coinbase"` - Difficulty *math.HexOrDecimal256 `json:"difficulty"` - GasLimit math.HexOrDecimal64 `json:"gasLimit"` - Timestamp *math.HexOrDecimal256 `json:"timestamp"` - ExtraData hexutil.Bytes `json:"extraData"` - MixHash common.Hash `json:"mixHash"` - Nonce types.BlockNonce `json:"nonce"` - BaseFee *math.HexOrDecimal256 `json:"baseFeePerGas"` - BlobGasUsed *math.HexOrDecimal64 `json:"blobGasUsed"` - ExcessBlobGas *math.HexOrDecimal64 `json:"excessBlobGas"` - Hash common.Hash `json:"hash"` - } - var enc genesisBlock - enc.Coinbase = g.Coinbase - enc.Difficulty = (*math.HexOrDecimal256)(g.Difficulty) - enc.GasLimit = math.HexOrDecimal64(g.GasLimit) - enc.Timestamp = (*math.HexOrDecimal256)(g.Timestamp) - enc.ExtraData = g.ExtraData - enc.MixHash = g.MixHash - enc.Nonce = g.Nonce - enc.BaseFee = (*math.HexOrDecimal256)(g.BaseFee) - enc.BlobGasUsed = (*math.HexOrDecimal64)(g.BlobGasUsed) - enc.ExcessBlobGas = (*math.HexOrDecimal64)(g.ExcessBlobGas) - enc.Hash = g.Hash - return json.Marshal(&enc) -} - -// UnmarshalJSON unmarshals from JSON. -func (g *genesisBlock) UnmarshalJSON(input []byte) error { - type genesisBlock struct { - Coinbase *common.Address `json:"coinbase"` - Difficulty *math.HexOrDecimal256 `json:"difficulty"` - GasLimit *math.HexOrDecimal64 `json:"gasLimit"` - Timestamp *math.HexOrDecimal256 `json:"timestamp"` - ExtraData *hexutil.Bytes `json:"extraData"` - MixHash *common.Hash `json:"mixHash"` - Nonce *types.BlockNonce `json:"nonce"` - BaseFee *math.HexOrDecimal256 `json:"baseFeePerGas"` - BlobGasUsed *math.HexOrDecimal64 `json:"blobGasUsed"` - ExcessBlobGas *math.HexOrDecimal64 `json:"excessBlobGas"` - Hash *common.Hash `json:"hash"` - } - var dec genesisBlock - if err := json.Unmarshal(input, &dec); err != nil { - return err - } - if dec.Coinbase != nil { - g.Coinbase = *dec.Coinbase - } - if dec.Difficulty != nil { - g.Difficulty = (*big.Int)(dec.Difficulty) - } - if dec.GasLimit != nil { - g.GasLimit = uint64(*dec.GasLimit) - } - if dec.Timestamp != nil { - g.Timestamp = (*big.Int)(dec.Timestamp) - } - if dec.ExtraData != nil { - g.ExtraData = *dec.ExtraData - } - if dec.MixHash != nil { - g.MixHash = *dec.MixHash - } - if dec.Nonce != nil { - g.Nonce = *dec.Nonce - } - if dec.BaseFee != nil { - g.BaseFee = (*big.Int)(dec.BaseFee) - } - if dec.BlobGasUsed != nil { - g.BlobGasUsed = (*uint64)(dec.BlobGasUsed) - } - if dec.ExcessBlobGas != nil { - g.ExcessBlobGas = (*uint64)(dec.ExcessBlobGas) - } - if dec.Hash != nil { - g.Hash = *dec.Hash - } - return nil -} diff --git a/simulators/ethereum/pyspec/go.mod b/simulators/ethereum/pyspec/go.mod deleted file mode 100644 index 8351fe3885..0000000000 --- a/simulators/ethereum/pyspec/go.mod +++ /dev/null @@ -1,79 +0,0 @@ -module github.com/ethereum/hive/simulators/ethereum/pyspec - -go 1.21 - -toolchain go1.22.1 - -require ( - github.com/ethereum/go-ethereum v1.14.7 - github.com/ethereum/hive v0.0.0-20240715150147-c87a99dccfce - github.com/ethereum/hive/simulators/ethereum/engine v0.0.0-20230919054339-322945164a97 -) - -require ( - github.com/DataDog/zstd v1.5.2 // indirect - github.com/Microsoft/go-winio v0.6.2 // indirect - github.com/VictoriaMetrics/fastcache v1.12.2 // indirect - github.com/beorn7/perks v1.0.1 // indirect - github.com/bits-and-blooms/bitset v1.10.0 // indirect - github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect - github.com/cespare/xxhash/v2 v2.3.0 // indirect - github.com/cockroachdb/errors v1.11.3 // indirect - github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce // indirect - github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect - github.com/cockroachdb/pebble v1.1.1 // indirect - github.com/cockroachdb/redact v1.1.5 // indirect - github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect - github.com/consensys/bavard v0.1.13 // indirect - github.com/consensys/gnark-crypto v0.12.1 // indirect - github.com/crate-crypto/go-ipa v0.0.0-20240223125850-b1e8a79f509c // indirect - github.com/crate-crypto/go-kzg-4844 v1.0.0 // indirect - github.com/deckarep/golang-set/v2 v2.6.0 // indirect - github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 // indirect - github.com/ethereum/c-kzg-4844 v1.0.0 // indirect - github.com/ethereum/go-verkle v0.1.1-0.20240306133620-7d920df305f0 // indirect - github.com/getsentry/sentry-go v0.27.0 // indirect - github.com/go-ole/go-ole v1.3.0 // indirect - github.com/go-stack/stack v1.8.1 // indirect - github.com/gofrs/flock v0.8.1 // indirect - github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang-jwt/jwt/v4 v4.5.0 // indirect - github.com/golang/protobuf v1.5.4 // indirect - github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect - github.com/gorilla/websocket v1.5.0 // indirect - github.com/holiman/bloomfilter/v2 v2.0.3 // indirect - github.com/holiman/uint256 v1.3.0 // indirect - github.com/klauspost/compress v1.16.0 // indirect - github.com/kr/pretty v0.3.1 // indirect - github.com/kr/text v0.2.0 // indirect - github.com/lithammer/dedent v1.1.0 // indirect - github.com/mattn/go-colorable v0.1.13 // indirect - github.com/mattn/go-isatty v0.0.20 // indirect - github.com/mattn/go-runewidth v0.0.14 // indirect - github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect - github.com/mmcloughlin/addchain v0.4.0 // indirect - github.com/olekukonko/tablewriter v0.0.5 // indirect - github.com/pkg/errors v0.9.1 // indirect - github.com/prometheus/client_golang v1.14.0 // indirect - github.com/prometheus/client_model v0.3.0 // indirect - github.com/prometheus/common v0.39.0 // indirect - github.com/prometheus/procfs v0.9.0 // indirect - github.com/rivo/uniseg v0.4.3 // indirect - github.com/rogpeppe/go-internal v1.9.0 // indirect - github.com/shirou/gopsutil v3.21.11+incompatible // indirect - github.com/supranational/blst v0.3.11 // indirect - github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a // indirect - github.com/tklauser/go-sysconf v0.3.12 // indirect - github.com/tklauser/numcpus v0.6.1 // indirect - github.com/yusufpapurcu/wmi v1.2.2 // indirect - golang.org/x/crypto v0.22.0 // indirect - golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa // indirect - golang.org/x/sync v0.7.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/text v0.14.0 // indirect - google.golang.org/protobuf v1.33.0 // indirect - gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1 // indirect - rsc.io/tmplfunc v0.0.3 // indirect -) - -replace github.com/ethereum/hive/simulators/ethereum/engine => ../engine diff --git a/simulators/ethereum/pyspec/go.sum b/simulators/ethereum/pyspec/go.sum deleted file mode 100644 index 36604a1877..0000000000 --- a/simulators/ethereum/pyspec/go.sum +++ /dev/null @@ -1,333 +0,0 @@ -github.com/DataDog/zstd v1.5.2 h1:vUG4lAyuPCXO0TLbXvPv7EB7cNK1QV/luu55UHLrrn8= -github.com/DataDog/zstd v1.5.2/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= -github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= -github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= -github.com/VictoriaMetrics/fastcache v1.12.2 h1:N0y9ASrJ0F6h0QaC3o6uJb3NIZ9VKLjCM7NQbSmF7WI= -github.com/VictoriaMetrics/fastcache v1.12.2/go.mod h1:AmC+Nzz1+3G2eCPapF6UcsnkThDcMsQicp4xDukwJYI= -github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= -github.com/allegro/bigcache v1.2.1 h1:hg1sY1raCwic3Vnsvje6TT7/pnZba83LeFck5NrFKSc= -github.com/allegro/bigcache v1.2.1/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= -github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= -github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bits-and-blooms/bitset v1.10.0 h1:ePXTeiPEazB5+opbv5fr8umg2R/1NlzgDsyepwsSr88= -github.com/bits-and-blooms/bitset v1.10.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= -github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U= -github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= -github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= -github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= -github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= -github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= -github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= -github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f h1:otljaYPt5hWxV3MUfO5dFPFiOXg9CyG5/kCfayTqsJ4= -github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= -github.com/cockroachdb/errors v1.11.3 h1:5bA+k2Y6r+oz/6Z/RFlNeVCesGARKuC6YymtcDrbC/I= -github.com/cockroachdb/errors v1.11.3/go.mod h1:m4UIW4CDjx+R5cybPsNrRbreomiFqt8o1h1wUVazSd8= -github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce h1:giXvy4KSc/6g/esnpM7Geqxka4WSqI1SZc7sMJFd3y4= -github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce/go.mod h1:9/y3cnZ5GKakj/H4y9r9GTjCvAFta7KLgSHPJJYc52M= -github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE= -github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= -github.com/cockroachdb/pebble v1.1.1 h1:XnKU22oiCLy2Xn8vp1re67cXg4SAasg/WDt1NtcRFaw= -github.com/cockroachdb/pebble v1.1.1/go.mod h1:4exszw1r40423ZsmkG/09AFEG83I0uDgfujJdbL6kYU= -github.com/cockroachdb/redact v1.1.5 h1:u1PMllDkdFfPWaNGMyLD1+so+aq3uUItthCFqzwPJ30= -github.com/cockroachdb/redact v1.1.5/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= -github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo= -github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ= -github.com/consensys/bavard v0.1.13 h1:oLhMLOFGTLdlda/kma4VOJazblc7IM5y5QPd2A/YjhQ= -github.com/consensys/bavard v0.1.13/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI= -github.com/consensys/gnark-crypto v0.12.1 h1:lHH39WuuFgVHONRl3J0LRBtuYdQTumFSDtJF7HpyG8M= -github.com/consensys/gnark-crypto v0.12.1/go.mod h1:v2Gy7L/4ZRosZ7Ivs+9SfUDr0f5UlG+EM5t7MPHiLuY= -github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= -github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/crate-crypto/go-ipa v0.0.0-20240223125850-b1e8a79f509c h1:uQYC5Z1mdLRPrZhHjHxufI8+2UG/i25QG92j0Er9p6I= -github.com/crate-crypto/go-ipa v0.0.0-20240223125850-b1e8a79f509c/go.mod h1:geZJZH3SzKCqnz5VT0q/DyIG/tvu/dZk+VIfXicupJs= -github.com/crate-crypto/go-kzg-4844 v1.0.0 h1:TsSgHwrkTKecKJ4kadtHi4b3xHW5dCFUDFnUp1TsawI= -github.com/crate-crypto/go-kzg-4844 v1.0.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/deckarep/golang-set/v2 v2.6.0 h1:XfcQbWM1LlMB8BsJ8N9vW5ehnnPVIw0je80NsVHagjM= -github.com/deckarep/golang-set/v2 v2.6.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= -github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0= -github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= -github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 h1:HbphB4TFFXpv7MNrT52FGrrgVXF1owhMVTHFZIlnvd4= -github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0/go.mod h1:DZGJHZMqrU4JJqFAWUS2UO1+lbSKsdiOoYi9Zzey7Fc= -github.com/ethereum/c-kzg-4844 v1.0.0 h1:0X1LBXxaEtYD9xsyj9B9ctQEZIpnvVDeoBx8aHEwTNA= -github.com/ethereum/c-kzg-4844 v1.0.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= -github.com/ethereum/go-ethereum v1.14.7 h1:EHpv3dE8evQmpVEQ/Ne2ahB06n2mQptdwqaMNhAT29g= -github.com/ethereum/go-ethereum v1.14.7/go.mod h1:Mq0biU2jbdmKSZoqOj29017ygFrMnB5/Rifwp980W4o= -github.com/ethereum/go-verkle v0.1.1-0.20240306133620-7d920df305f0 h1:KrE8I4reeVvf7C1tm8elRjj4BdscTYzz/WAbYyf/JI4= -github.com/ethereum/go-verkle v0.1.1-0.20240306133620-7d920df305f0/go.mod h1:D9AJLVXSyZQXJQVk8oh1EwjISE+sJTn2duYIZC0dy3w= -github.com/ethereum/hive v0.0.0-20240715150147-c87a99dccfce h1:wgH9mh3TFSd+LFSsXO6RdTEO3niapJRywO1Xl3/IoIE= -github.com/ethereum/hive v0.0.0-20240715150147-c87a99dccfce/go.mod h1:ghNXZW+/WQClcyiwZpbTzUCyxwql7YeMacYd44v+BJE= -github.com/fjl/memsize v0.0.2 h1:27txuSD9or+NZlnOWdKUxeBzTAUkWCVh+4Gf2dWFOzA= -github.com/fjl/memsize v0.0.2/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= -github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= -github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= -github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08 h1:f6D9Hr8xV8uYKlyuj8XIruxlh9WjVjdh1gIicAS7ays= -github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= -github.com/getsentry/sentry-go v0.27.0 h1:Pv98CIbtB3LkMWmXi4Joa5OOcwbmnX88sF5qbK3r3Ps= -github.com/getsentry/sentry-go v0.27.0/go.mod h1:lc76E2QywIyW8WuBnwl8Lc4bkmQH4+w1gwTf25trprY= -github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= -github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= -github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= -github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= -github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= -github.com/go-stack/stack v1.8.1 h1:ntEHSVwIt7PNXNpgPmVfMrNhLtgjlmnZha2kOpuRiDw= -github.com/go-stack/stack v1.8.1/go.mod h1:dcoOX6HbPZSZptuspn9bctJ+N/CnF5gGygcUP3XYfe4= -github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= -github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= -github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= -github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= -github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= -github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= -github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= -github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= -github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= -github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= -github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= -github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= -github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXiurYmW7fx4GZkL8feAMVq7nEjURHk= -github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= -github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= -github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= -github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= -github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= -github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= -github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/hashicorp/go-bexpr v0.1.11 h1:6DqdA/KBjurGby9yTY0bmkathya0lfwF2SeuubCI7dY= -github.com/hashicorp/go-bexpr v0.1.11/go.mod h1:f03lAo0duBlDIUMGCuad8oLcgejw4m7U+N8T+6Kz1AE= -github.com/holiman/billy v0.0.0-20240216141850-2abb0c79d3c4 h1:X4egAf/gcS1zATw6wn4Ej8vjuVGxeHdan+bRb2ebyv4= -github.com/holiman/billy v0.0.0-20240216141850-2abb0c79d3c4/go.mod h1:5GuXa7vkL8u9FkFuWdVvfR5ix8hRB7DbOAaYULamFpc= -github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao= -github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA= -github.com/holiman/uint256 v1.3.0 h1:4wdcm/tnd0xXdu7iS3ruNvxkWwrb4aeBQv19ayYn8F4= -github.com/holiman/uint256 v1.3.0/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXeiRV4ng7E= -github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/huin/goupnp v1.3.0 h1:UvLUlWDNpoUdYzb2TCn+MuTWtcjXKSza2n6CBdQ0xXc= -github.com/huin/goupnp v1.3.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8= -github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= -github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= -github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= -github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.16.0 h1:iULayQNOReoYUe+1qtKOqw9CwJv3aNQu8ivo7lw1HU4= -github.com/klauspost/compress v1.16.0/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= -github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= -github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= -github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= -github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= -github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c= -github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= -github.com/lithammer/dedent v1.1.0 h1:VNzHMVCBNG1j0fh3OrsFRkVUwStdDArbgBWoPAffktY= -github.com/lithammer/dedent v1.1.0/go.mod h1:jrXYCQtgg0nJiN+StA2KgR7w6CiQNv9Fd/Z9BP0jIOc= -github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= -github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= -github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= -github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= -github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-runewidth v0.0.14 h1:+xnbZSEeDbOIg5/mE6JF0w6n9duR1l3/WmbinWVwUuU= -github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= -github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= -github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= -github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= -github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/pointerstructure v1.2.1 h1:ZhBBeX8tSlRpu/FFhXH4RC4OJzFlqsQhoHZAz4x7TIw= -github.com/mitchellh/pointerstructure v1.2.1/go.mod h1:BRAsLI5zgXmw97Lf6s25bs8ohIXc3tViBH44KcwB2g4= -github.com/mmcloughlin/addchain v0.4.0 h1:SobOdjm2xLj1KkXN5/n0xTIWyZA2+s99UCY1iPfkHRY= -github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqkyU72HC5wJ4RlU= -github.com/mmcloughlin/profile v0.1.1/go.mod h1:IhHD7q1ooxgwTgjxQYkACGA77oFTDdFVejUS1/tS/qU= -github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= -github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= -github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= -github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= -github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= -github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= -github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= -github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= -github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= -github.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= -github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= -github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= -github.com/onsi/gomega v1.19.0 h1:4ieX6qQjPP/BfC3mpsAtIGGlxTWPeA3Inl/7DtXw1tw= -github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= -github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= -github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= -github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= -github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.14.0 h1:nJdhIvne2eSX/XRAFV9PcvFFRbrjbcTUj0VP62TMhnw= -github.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y= -github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4= -github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= -github.com/prometheus/common v0.39.0 h1:oOyhkDq05hPZKItWVBkJ6g6AtGxi+fy7F4JvUV8uhsI= -github.com/prometheus/common v0.39.0/go.mod h1:6XBZ7lYdLCbkAVhwRsWTZn+IN5AB9F/NXd5w0BbEX0Y= -github.com/prometheus/procfs v0.9.0 h1:wzCHvIvM5SxWqYvwgVL7yJY8Lz3PKn49KQtpgMYJfhI= -github.com/prometheus/procfs v0.9.0/go.mod h1:+pB4zwohETzFnmlpe6yd2lSc+0/46IYZRB/chUwxUZY= -github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= -github.com/rivo/uniseg v0.4.3 h1:utMvzDsuh3suAEnhH0RdHmoPbU648o6CvXxTx4SBMOw= -github.com/rivo/uniseg v0.4.3/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= -github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= -github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= -github.com/rs/cors v1.8.2 h1:KCooALfAYGs415Cwu5ABvv9n9509fSiG5SQJn/AQo4U= -github.com/rs/cors v1.8.2/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= -github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= -github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI= -github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= -github.com/status-im/keycard-go v0.2.0 h1:QDLFswOQu1r5jsycloeQh3bVU8n/NatHHaZobtDnDzA= -github.com/status-im/keycard-go v0.2.0/go.mod h1:wlp8ZLbsmrF6g6WjugPAx+IzoLrkdf9+mHxBEeo3Hbg= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -github.com/supranational/blst v0.3.11 h1:LyU6FolezeWAhvQk0k6O/d49jqgO52MSDDfYgbeoEm4= -github.com/supranational/blst v0.3.11/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= -github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a h1:1ur3QoCqvE5fl+nylMaIr9PVV1w343YRDtsy+Rwu7XI= -github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a/go.mod h1:RRCYJbIwD5jmqPI9XoAFR0OcDxqUctll6zUj/+B4S48= -github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= -github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= -github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= -github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= -github.com/tyler-smith/go-bip39 v1.1.0 h1:5eUemwrMargf3BSLRRCalXT93Ns6pQJIjYQN2nyfOP8= -github.com/tyler-smith/go-bip39 v1.1.0/go.mod h1:gUYDtqQw1JS3ZJ8UWVcGTGqqr6YIN3CWg+kkNaLt55U= -github.com/urfave/cli/v2 v2.25.7 h1:VAzn5oq403l5pHjc4OhD54+XGO9cdKVL/7lDjF+iKUs= -github.com/urfave/cli/v2 v2.25.7/go.mod h1:8qnjx1vcq5s2/wpsqoZFndg2CE5tNFyrTvS6SinrnYQ= -github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU= -github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8= -github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yusufpapurcu/wmi v1.2.2 h1:KBNDSne4vP5mbSWnJbO+51IMOXJB67QiYCSBrubbPRg= -github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30= -golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M= -golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa h1:FRnLl4eNAQl8hwxVVC17teOw8kdjVDVAiFMtgUdTSRQ= -golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa/go.mod h1:zk2irFbV9DP96SEBUUAy67IdHUaZuSnrz1n472HUCLE= -golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= -golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.24.0 h1:1PcaxkF854Fu3+lvBIx5SYn9wRlBzzcnHZSiaFFAb0w= -golang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= -golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= -golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= -golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= -google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= -google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= -google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= -google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= -google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1 h1:iiHuQZCNgYPmFQxd3BBN/Nc5+dAwzZuq5y40s20oQw0= -gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= -gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc= -gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= -gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= -gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= -gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -rsc.io/tmplfunc v0.0.3 h1:53XFQh69AfOa8Tw0Jm7t+GV7KZhOi6jzsCzTtKbMvzU= -rsc.io/tmplfunc v0.0.3/go.mod h1:AG3sTPzElb1Io3Yg4voV9AGZJuleGAwaVRxL9M49PhA= diff --git a/simulators/ethereum/pyspec/hive_context.txt b/simulators/ethereum/pyspec/hive_context.txt deleted file mode 100644 index a96aa0ea9d..0000000000 --- a/simulators/ethereum/pyspec/hive_context.txt +++ /dev/null @@ -1 +0,0 @@ -.. \ No newline at end of file diff --git a/simulators/ethereum/pyspec/main.go b/simulators/ethereum/pyspec/main.go deleted file mode 100644 index 72924f4e9c..0000000000 --- a/simulators/ethereum/pyspec/main.go +++ /dev/null @@ -1,129 +0,0 @@ -// ============================================================================== // -// Pyspec Hive Simulator: Ported/Altered directly from the Consensus Simulator. // -// -> https://github.com/ethereum/hive/tree/master/simulators/ethereum/consensus // -// ============================================================================== // - -package main - -import ( - "fmt" - "os" - "path/filepath" - "regexp" - "strconv" - "strings" - "sync" - - "github.com/ethereum/hive/hivesim" -) - -func main() { - suite := hivesim.Suite{ - Name: "pyspec", - Description: "The pyspec test suite runs every fixture from " + - "the execution-spec-tests repo (https://github.com/ethereum/execution-spec-tests) where the fork >= Merge. " + - "For each test clients are first fed the fixture genesis data followed by engine new payloads specific to the test.", - } - suite.Add(hivesim.TestSpec{ - Name: "pytest_fixture_runner", - Description: "This is a meta-test. It loads the test fixture files and " + - "launches the actual client tests. Any errors in test files will be reported " + - "through this test.", - Run: fixtureRunner, - AlwaysRun: true, - }) - hivesim.MustRunSuite(hivesim.New(), suite) -} - -// fixtureRunner loads the pyspec test files and spawns the client tests. -func fixtureRunner(t *hivesim.T) { - - // retrieve clients available for testing - clientTypes, err := t.Sim.ClientTypes() - if err != nil { - t.Fatal("can't get client types:", err) - } - - // use 16 for parallelism if env var is invalid - parallelism := 16 - if val, ok := os.LookupEnv("HIVE_PARALLELISM"); ok { - if p, err := strconv.Atoi(val); err != nil { - t.Logf("warning: invalid HIVE_PARALLELISM value %q", val) - } else { - parallelism = p - } - } - t.Log("parallelism set to:", parallelism) - - // find and set the fixtures directory as root - testPath, isset := os.LookupEnv("TESTPATH") - if !isset { - t.Fatal("$TESTPATH not set") - } - fileRoot := fmt.Sprintf("%s/", testPath) - t.Log("file root directory:", fileRoot) - - // to log all failing tests at the end of sim - failedTests := make(map[string]error) - - // spawn `parallelism` workers to run fixtures against clients - var wg sync.WaitGroup - var testCh = make(chan *TestCase) - wg.Add(parallelism) - for i := 0; i < parallelism; i++ { - go func() { - defer wg.Done() - for test := range testCh { - t.Run(hivesim.TestSpec{ - Name: test.Name, - Description: ("Test Link: " + - repoLink(test.FilePath)), - Run: test.run, - AlwaysRun: false, - }) - if test.FailedErr != nil { - failedTests[test.ClientType+"/"+test.Name] = test.FailedErr - } - } - }() - } - - _, testPattern := t.Sim.TestPattern() - re := regexp.MustCompile(testPattern) - - // deliver and run test cases against each client - loadFixtureTests(t, fileRoot, re, func(tc TestCase) { - for _, client := range clientTypes { - if !client.HasRole("eth1") { - continue - } - tc := tc // shallow copy - tc.ClientType = client.Name - testCh <- &tc - } - }) - close(testCh) - - // wait for all workers to finish - wg.Wait() - - // log all failed tests - if len(failedTests) > 0 { - t.Log("failing tests:") - for name, err := range failedTests { - t.Logf("%v: %v", name, err) - } - } -} - -// repoLink coverts a pyspec test path into a github repository link. -func repoLink(testPath string) string { - // Example: Converts '/fixtures/cancun/eip4844_blobs/blob_txs/invalid_normal_gas.json' - // into 'tests/cancun/eip4844_blobs/test_blob_txs.py', and appends onto main branch repo link. - filePath := strings.Replace(testPath, "/fixtures", "tests", -1) - fileDir := filepath.Dir(filePath) - fileBase := filepath.Base(fileDir) - fileName := filepath.Join(filepath.Dir(fileDir), "test_"+fileBase+".py") - repoLink := fmt.Sprintf("https://github.com/ethereum/execution-spec-tests/tree/main/%v", fileName) - return repoLink -} diff --git a/simulators/ethereum/pyspec/runner.go b/simulators/ethereum/pyspec/runner.go deleted file mode 100644 index 41e2946e63..0000000000 --- a/simulators/ethereum/pyspec/runner.go +++ /dev/null @@ -1,217 +0,0 @@ -package main - -import ( - "context" - "fmt" - "io/fs" - "math/big" - "path/filepath" - "regexp" - "strings" - "time" - - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/hive/hivesim" - "github.com/ethereum/hive/simulators/ethereum/engine/client/hive_rpc" - "github.com/ethereum/hive/simulators/ethereum/engine/globals" -) - -var ( - SyncTimeout = 10 * time.Second -) - -// loadFixtureTests extracts tests from fixture.json files in a given directory, -// creates a testcase for each test, and passes the testcase struct to fn. -func loadFixtureTests(t *hivesim.T, root string, re *regexp.Regexp, fn func(TestCase)) { - filepath.WalkDir(root, func(path string, d fs.DirEntry, err error) error { - // check file is actually a fixture - if err != nil { - t.Logf("unable to walk path: %s", err) - return err - } - if d.IsDir() || !strings.HasSuffix(d.Name(), ".json") { - return nil - } - excludePaths := []string{"example/"} // modify for tests to exclude - if strings.Contains(path, strings.Join(excludePaths, "")) { - return nil - } - - // extract fixture.json tests (multiple forks) into fixture structs - var fixtureTests map[string]*Fixture - if err := common.LoadJSON(path, &fixtureTests); err != nil { - t.Logf("invalid test file: %v, unable to load json", err) - return nil - } - - // create testcase structure from fixtureTests - for name, fixture := range fixtureTests { - // skip networks post merge or not supported - network := fixture.Fork - if _, exist := envForks[network]; !exist { - continue - } - // define testcase (tc) struct with initial fields - tc := TestCase{ - Name: path[10:len(path)-5] + "/" + name, - FilePath: path, - Fixture: fixture, - } - // match test case name against regex if provided - if !re.MatchString(tc.Name) { - continue - } - // feed tc to single worker within fixtureRunner() - fn(tc) - } - return nil - }) -} - -// run executes a testcase against the client, called within a test channel from -// fixtureRunner, all testcase payloads are sent and executed using the EngineAPI. for -// verification all fixture nonce, balance and storage values are checked against the -// response received from the lastest block. -func (tc *TestCase) run(t *hivesim.T) { - start := time.Now() - tc.FailCallback = t - - t.Log("setting variables required for starting client.") - engineStarter := hive_rpc.HiveRPCEngineStarter{ - ClientType: tc.ClientType, - EnginePort: globals.EnginePortHTTP, - EthPort: globals.EthPortHTTP, - JWTSecret: globals.DefaultJwtTokenSecretBytes, - } - ctx := context.Background() - env := hivesim.Params{ - "HIVE_FORK_DAO_VOTE": "1", - "HIVE_CHAIN_ID": "1", - "HIVE_NODETYPE": "full", - } - tc.updateEnv(env) - t0 := time.Now() - // If test is already failed, don't bother spinning up a client - if tc.FailedErr != nil { - t.Fatalf("test failed early: %v", tc.FailedErr) - } - // start client (also creates an engine RPC client internally) - t.Log("starting client with Engine API.") - engineClient, err := engineStarter.StartClient(t, ctx, tc.Genesis(), env, nil) - if err != nil { - tc.Fatalf("can't start client with Engine API: %v", err) - } - // verify genesis hash matches that of the fixture - genesisBlock, err := engineClient.BlockByNumber(ctx, big.NewInt(0)) - if err != nil { - tc.Fatalf("unable to get genesis block: %v", err) - } - if genesisBlock.Hash() != tc.GenesisBlock.Hash { - tc.Fatalf("genesis hash mismatch") - } - t1 := time.Now() - - // send payloads and check response - var latestValidPayload *EngineNewPayload - for _, engineNewPayload := range tc.EngineNewPayloads { - engineNewPayload := engineNewPayload - if syncing, err := engineNewPayload.ExecuteValidate( - ctx, - engineClient, - ); err != nil { - tc.Fatalf("Payload validation error: %v", err) - } else if syncing { - tc.Fatalf("Payload validation failed (not synced)") - } - // update latest valid block hash if payload status is VALID - if engineNewPayload.Valid() { - latestValidPayload = engineNewPayload - } - } - t2 := time.Now() - - // only update head of beacon chain if valid response occurred - if latestValidPayload != nil { - if syncing, err := latestValidPayload.ForkchoiceValidate(ctx, engineClient, tc.EngineFcuVersion); err != nil { - tc.Fatalf("unable to update head of chain: %v", err) - } else if syncing { - tc.Fatalf("forkchoice update failed (not synced)") - } - } - t3 := time.Now() - if err := tc.ValidatePost(ctx, engineClient); err != nil { - tc.Fatalf("unable to verify post allocation in test %s: %v", tc.Name, err) - } - - if tc.SyncPayload != nil { - // First send a new payload to the already running client - if syncing, err := tc.SyncPayload.ExecuteValidate( - ctx, - engineClient, - ); err != nil { - tc.Fatalf("unable to send sync payload: %v", err) - } else if syncing { - tc.Fatalf("sync payload failed (not synced)") - } - // Send a forkchoice update to the already running client to head to the sync payload - if syncing, err := tc.SyncPayload.ForkchoiceValidate(ctx, engineClient, tc.EngineFcuVersion); err != nil { - tc.Fatalf("unable to update head of chain: %v", err) - } else if syncing { - tc.Fatalf("forkchoice update failed (not synced)") - } - - // Spawn a second client connected to the already running client, - // send the forkchoice updated with the head hash and wait for sync. - // Then verify the post allocation. - // Add a timeout too. - secondEngineClient, err := engineStarter.StartClient(t, ctx, tc.Genesis(), env, nil, engineClient) - if err != nil { - tc.Fatalf("can't start client with Engine API: %v", err) - } - - if _, err := tc.SyncPayload.ExecuteValidate( - ctx, - secondEngineClient, - ); err != nil { - tc.Fatalf("unable to send sync payload: %v", err) - } // Don't check syncing here because some clients do sync immediately - - timeoutCtx, cancel := context.WithTimeout(ctx, SyncTimeout) - defer cancel() - for { - if syncing, err := tc.SyncPayload.ForkchoiceValidate(ctx, secondEngineClient, tc.EngineFcuVersion); err != nil { - tc.Fatalf("unable to update head of chain: %v", err) - } else if !syncing { - break - } - select { - case <-timeoutCtx.Done(): - tc.Fatalf("timeout waiting for sync of secondary client") - default: - } - time.Sleep(time.Second) - } - } - - end := time.Now() - - if false { // TODO: Activate only on --sim.loglevel > 3 - t.Logf(`test timing: - setupClientEnv %v - startClient %v - sendAllPayloads %v - setNewHeadOfChain %v - checkStorageValues %v - totalTestTime %v`, t0.Sub(start), t1.Sub(t0), t2.Sub(t1), t3.Sub(t2), end.Sub(t3), end.Sub(start)) - - } -} - -// updateEnv updates the environment variables against the fork rules -// defined in envForks, for the network specified in the testcase fixture. -func (tc *TestCase) updateEnv(env hivesim.Params) { - forkRules := envForks[tc.Fork] - for k, v := range forkRules { - env[k] = fmt.Sprintf("%d", v) - } -} diff --git a/simulators/ethereum/pyspec/types.go b/simulators/ethereum/pyspec/types.go deleted file mode 100644 index 1d763499c9..0000000000 --- a/simulators/ethereum/pyspec/types.go +++ /dev/null @@ -1,258 +0,0 @@ -package main - -import ( - "context" - "errors" - "fmt" - "math/big" - - api "github.com/ethereum/go-ethereum/beacon/engine" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/common/hexutil" - "github.com/ethereum/go-ethereum/common/math" - "github.com/ethereum/go-ethereum/core" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/rpc" - "github.com/ethereum/go-ethereum/tests" - - "github.com/ethereum/hive/simulators/ethereum/engine/client" - typ "github.com/ethereum/hive/simulators/ethereum/engine/types" -) - -type Fail interface { - Fatalf(format string, args ...interface{}) -} - -type TestCase struct { - // test meta data - Name string - FilePath string - ClientType string - FailedErr error - // test fixture data - *Fixture - FailCallback Fail -} - -func (tc *TestCase) Fatalf(format string, args ...interface{}) { - tc.FailedErr = fmt.Errorf(format, args...) - tc.FailCallback.Fatalf(format, args...) -} - -type Fixture struct { - Fork string `json:"network"` - GenesisBlock genesisBlock `json:"genesisBlockHeader"` - EngineNewPayloads []*EngineNewPayload `json:"engineNewPayloads"` - EngineFcuVersion int `json:"engineFcuVersion,string"` - Pre core.GenesisAlloc `json:"pre"` - PostAlloc core.GenesisAlloc `json:"postState"` - SyncPayload *EngineNewPayload `json:"syncPayload"` -} - -func (f *Fixture) Genesis() *core.Genesis { - return &core.Genesis{ - Config: tests.Forks[f.Fork], - Coinbase: f.GenesisBlock.Coinbase, - Difficulty: f.GenesisBlock.Difficulty, - GasLimit: f.GenesisBlock.GasLimit, - Timestamp: f.GenesisBlock.Timestamp.Uint64(), - ExtraData: f.GenesisBlock.ExtraData, - Mixhash: f.GenesisBlock.MixHash, - Nonce: f.GenesisBlock.Nonce.Uint64(), - BaseFee: f.GenesisBlock.BaseFee, - BlobGasUsed: f.GenesisBlock.BlobGasUsed, - ExcessBlobGas: f.GenesisBlock.ExcessBlobGas, - Alloc: f.Pre, - } -} - -func (f *Fixture) ValidatePost(ctx context.Context, engineClient client.EngineClient) error { - // check nonce, balance & storage of accounts in final block against fixture values - for address, account := range f.PostAlloc { - // get nonce & balance from last block (end of test execution) - gotNonce, errN := engineClient.NonceAt(ctx, address, nil) - gotBalance, errB := engineClient.BalanceAt(ctx, address, nil) - if errN != nil { - return fmt.Errorf("unable to call nonce from account: %v: %v", address, errN) - } else if errB != nil { - return fmt.Errorf("unable to call balance from account: %v: %v", address, errB) - } - // check final nonce & balance matches expected in fixture - if account.Nonce != gotNonce { - return fmt.Errorf(`nonce received from account %v doesn't match expected from fixture: - received from block: %v - expected in fixture: %v`, address, gotNonce, account.Nonce) - } - if account.Balance.Cmp(gotBalance) != 0 { - return fmt.Errorf(`balance received from account %v doesn't match expected from fixture: - received from block: %v - expected in fixture: %v`, address, gotBalance, account.Balance) - } - // check final storage - if len(account.Storage) > 0 { - // extract fixture storage keys - keys := make([]common.Hash, 0, len(account.Storage)) - for key := range account.Storage { - keys = append(keys, key) - } - // get storage values for account with keys: keys - gotStorage, errS := engineClient.StorageAtKeys(ctx, address, keys, nil) - if errS != nil { - return fmt.Errorf("unable to get storage values from account: %v: %v", address, errS) - } - // check values in storage match with fixture - for _, key := range keys { - if account.Storage[key] != *gotStorage[key] { - return fmt.Errorf(`storage received from account %v doesn't match expected from fixture: - received from block: %v - expected in fixture: %v`, address, gotStorage[key], account.Storage[key]) - } - } - } - } - return nil -} - -//go:generate go run github.com/fjl/gencodec -type genesisBlock -field-override genesisBlockUnmarshaling -out gen_gb.go -type genesisBlock struct { - Coinbase common.Address `json:"coinbase"` - Difficulty *big.Int `json:"difficulty"` - GasLimit uint64 `json:"gasLimit"` - Timestamp *big.Int `json:"timestamp"` - ExtraData []byte `json:"extraData"` - MixHash common.Hash `json:"mixHash"` - Nonce types.BlockNonce `json:"nonce"` - BaseFee *big.Int `json:"baseFeePerGas"` - BlobGasUsed *uint64 `json:"blobGasUsed"` - ExcessBlobGas *uint64 `json:"excessBlobGas"` - - Hash common.Hash `json:"hash"` -} - -type genesisBlockUnmarshaling struct { - Difficulty *math.HexOrDecimal256 `json:"difficulty"` - GasLimit math.HexOrDecimal64 `json:"gasLimit"` - Timestamp *math.HexOrDecimal256 `json:"timestamp"` - ExtraData hexutil.Bytes `json:"extraData"` - BaseFee *math.HexOrDecimal256 `json:"baseFeePerGas"` - BlobGasUsed *math.HexOrDecimal64 `json:"dataGasUsed"` - ExcessBlobGas *math.HexOrDecimal64 `json:"excessDataGas"` -} - -type EngineNewPayload struct { - ExecutionPayload *api.ExecutableData `json:"executionPayload"` - BlobVersionedHashes []common.Hash `json:"expectedBlobVersionedHashes"` - ParentBeaconBlockRoot *common.Hash `json:"parentBeaconBlockRoot"` - Version math.HexOrDecimal64 `json:"version"` - ValidationError *string `json:"validationError"` - ErrorCode int `json:"errorCode,string"` -} - -func (p *EngineNewPayload) ExecutableData() (*typ.ExecutableData, error) { - executableData, err := typ.FromBeaconExecutableData(p.ExecutionPayload) - if err != nil { - return nil, errors.New("executionPayload param within engineNewPayload is invalid") - } - executableData.VersionedHashes = &p.BlobVersionedHashes - executableData.ParentBeaconBlockRoot = p.ParentBeaconBlockRoot - return &executableData, nil -} - -func (p *EngineNewPayload) Valid() bool { - return p.ErrorCode == 0 && p.ValidationError == nil -} - -func (p *EngineNewPayload) ExpectedStatus() string { - if p.ValidationError != nil { - return "INVALID" - } - return "VALID" -} - -func (p *EngineNewPayload) Execute(ctx context.Context, engineClient client.EngineClient) (api.PayloadStatusV1, rpc.Error) { - executableData, err := p.ExecutableData() - if err != nil { - panic(err) - } - status, err := engineClient.NewPayload( - ctx, - int(p.Version), - executableData, - ) - return status, parseError(err) -} - -func (p *EngineNewPayload) ExecuteValidate(ctx context.Context, engineClient client.EngineClient) (bool, error) { - plStatus, plErr := p.Execute(ctx, engineClient) - if err := p.ValidateRPCError(plErr); err != nil { - return false, err - } else if plErr != nil { - // Got an expected error and is already validated in ValidateRPCError - return false, nil - } - if plStatus.Status == "SYNCING" { - return true, nil - } - // Check payload status matches expected - if plStatus.Status != p.ExpectedStatus() { - return false, fmt.Errorf("payload status mismatch: got %s, want %s", plStatus.Status, p.ExpectedStatus()) - } - return false, nil -} - -func (p *EngineNewPayload) ForkchoiceValidate(ctx context.Context, engineClient client.EngineClient, fcuVersion int) (bool, error) { - response, err := engineClient.ForkchoiceUpdated(ctx, fcuVersion, &api.ForkchoiceStateV1{HeadBlockHash: p.ExecutionPayload.BlockHash}, nil) - if err != nil { - return false, err - } - if response.PayloadStatus.Status == "SYNCING" { - return true, nil - } - if response.PayloadStatus.Status != p.ExpectedStatus() { - return false, fmt.Errorf("forkchoice update status mismatch: got %s, want %s", response.PayloadStatus.Status, p.ExpectedStatus()) - } - return false, nil -} - -type HTTPErrorWithCode struct { - rpc.HTTPError -} - -func (e HTTPErrorWithCode) ErrorCode() int { - return e.StatusCode -} - -func parseError(plErr interface{}) rpc.Error { - if plErr == nil { - return nil - } - rpcErr, isRpcErr := plErr.(rpc.Error) - if isRpcErr { - return rpcErr - } - httpErr, isHttpErr := plErr.(rpc.HTTPError) - if isHttpErr { - return HTTPErrorWithCode{httpErr} - } - panic("unable to parse") -} - -// checks for RPC errors and compares error codes if expected. -func (p *EngineNewPayload) ValidateRPCError(rpcErr rpc.Error) error { - if rpcErr == nil && p.ErrorCode == 0 { - return nil - } - if rpcErr == nil && p.ErrorCode != 0 { - return fmt.Errorf("expected error code %d but received no error", p.ErrorCode) - } - if rpcErr != nil && p.ErrorCode == 0 { - return fmt.Errorf("expected no error code but received %d", rpcErr.ErrorCode()) - } - if rpcErr != nil && p.ErrorCode != 0 { - plErrCode := rpcErr.ErrorCode() - if plErrCode != p.ErrorCode { - return fmt.Errorf("error code mismatch: got: %d, want: %d", plErrCode, p.ErrorCode) - } - } - return nil -} From a0ad3e1d529afa22ce9d913f83c5b5783f804f03 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Mon, 25 Nov 2024 11:51:22 +0100 Subject: [PATCH 347/387] cmd/hivechain: update contracts for geas v0.2 No changes to bytecode, just updating the source to remove warnings. --- cmd/hivechain/contracts/callenv.eas | 3 ++- cmd/hivechain/contracts/callme.eas | 24 +++++++++++++----------- cmd/hivechain/contracts/callrevert.eas | 18 +++++++++--------- cmd/hivechain/contracts/deployer.eas | 2 ++ cmd/hivechain/contracts/emit.eas | 4 +++- cmd/hivechain/contracts/gencode.eas | 11 ++++++----- cmd/hivechain/contracts/genlogs.eas | 3 ++- cmd/hivechain/contracts/genstorage.eas | 4 +++- cmd/hivechain/contracts/rng.eas | 2 +- 9 files changed, 41 insertions(+), 30 deletions(-) diff --git a/cmd/hivechain/contracts/callenv.eas b/cmd/hivechain/contracts/callenv.eas index 535f69a8a5..f4b4443eb7 100644 --- a/cmd/hivechain/contracts/callenv.eas +++ b/cmd/hivechain/contracts/callenv.eas @@ -1,6 +1,8 @@ ;;; -*- mode: asm -*- ;;; This contract returns EVM environment data. +#pragma target "london" + #define %store { ; [value, ptr] dup2 ; [ptr, value, ptr] mstore ; [ptr] @@ -8,7 +10,6 @@ add ; [newptr] } -.start: push 0 ; [ptr] number ; [v, ptr] diff --git a/cmd/hivechain/contracts/callme.eas b/cmd/hivechain/contracts/callme.eas index 5fc04060fa..4f9ca268e8 100644 --- a/cmd/hivechain/contracts/callme.eas +++ b/cmd/hivechain/contracts/callme.eas @@ -2,19 +2,11 @@ ;;; This contract returns value `theOutput` if calldata is exactly equal to `theInput`. ;;; Otherwise, reverts with an error message. -#define theInput 0xff01 -#define theOutput 0xffee +#pragma target "constantinople" -#define %revert(error) { ; [] - push $error ; [value] - push 0 ; [offset, value] - mstore ; [] - push .bytelen($error) ; [size] - push 32-.bytelen($error) ; [offset, size] - revert -} +#define theInput = 0xff01 +#define theOutput = 0xffee -.start: calldatasize ; [size] push .bytelen(theInput) ; [exp, iszero] eq ; [size==exp] @@ -38,3 +30,13 @@ return: push .bytelen(theOutput) ; [size] push 32-.bytelen(theInput) ; [offset, size] return ; [] + + +#define %revert(error) { ; [] + push $error ; [value] + push 0 ; [offset, value] + mstore ; [] + push .bytelen($error) ; [size] + push 32-.bytelen($error) ; [offset, size] + revert +} diff --git a/cmd/hivechain/contracts/callrevert.eas b/cmd/hivechain/contracts/callrevert.eas index 6f5d0b55fe..5f7be4d1a1 100644 --- a/cmd/hivechain/contracts/callrevert.eas +++ b/cmd/hivechain/contracts/callrevert.eas @@ -2,8 +2,9 @@ ;;; This contract is for testing two common Solidity revert encodings: ;;; Panic(uint) and Error(string). +#pragma target "constantinople" + ;;; Dispatch -.start: push 0 ; [offset] calldataload ; [word] @@ -13,15 +14,14 @@ jumpi @error ; [word] -#define s_panic .selector("Panic(uint256)") -#define panicv 0x01 ;; == assert(false) - ;;; Solidity ABI `Panic(17)` ;;; Revert data layout: ;;; ;;; selector :: 4 || value :: 32 ;;; -.panic: +#define s_panic = .selector("Panic(uint256)") +#define panicv = 0x01 ;; == assert(false) + push s_panic << (28*8) ; [sel] push 0 ; [offset, sel] mstore ; [] @@ -34,15 +34,15 @@ revert ; [] -#define s_error .selector("Error(string)") -#define errmsg "user error" -#define errmsg_word errmsg << (255-.bitlen(errmsg)) - ;;; Solidity ABI `Error(string)` ;;; Revert data layout: ;;; ;;; selector :: 4 || 0x20 :: 32 || len :: 32 || data :: len ;;; +#define s_error = .selector("Error(string)") +#define errmsg = "user error" +#define errmsg_word = errmsg << 255-.bitlen(errmsg) + error: push s_error << (28*8) ; [sel] push 0 ; [offset, sel] diff --git a/cmd/hivechain/contracts/deployer.eas b/cmd/hivechain/contracts/deployer.eas index 90e62b81de..23bcff6643 100644 --- a/cmd/hivechain/contracts/deployer.eas +++ b/cmd/hivechain/contracts/deployer.eas @@ -1,6 +1,8 @@ ;;; -*- mode: asm -*- ;;; puts any data after @.end into new contract +#pragma target "frontier" + push @.end ; [end] codesize ; [codesize, end] sub ; [size] diff --git a/cmd/hivechain/contracts/emit.eas b/cmd/hivechain/contracts/emit.eas index a3da393480..7750494b7c 100644 --- a/cmd/hivechain/contracts/emit.eas +++ b/cmd/hivechain/contracts/emit.eas @@ -3,7 +3,9 @@ ;;; The storage entry uses the hash of calldata as the value. ;;; In the log, the same hash is used as the second topic. -#define s_counter 0 +#pragma target "frontier" + +#define s_counter = 0 ;; hash calldata calldatasize ; [size] diff --git a/cmd/hivechain/contracts/gencode.eas b/cmd/hivechain/contracts/gencode.eas index b323ff83f2..f8de99c8bb 100644 --- a/cmd/hivechain/contracts/gencode.eas +++ b/cmd/hivechain/contracts/gencode.eas @@ -1,15 +1,16 @@ ;;; -*- mode: asm -*- ;;; creates a contract with code based on block number. +#pragma target "frontier" + #include "rng.eas" -#define outputSize 256 +#define outputSize = 256 -#define p_rng 0 -#define p_output p_rng + RngSize -#define p_outputEnd p_output + outputSize +#define p_rng = 0 +#define p_output = p_rng + RngSize +#define p_outputEnd = p_output + outputSize -.start: %RngInit(p_rng) ; [] ;; loop to create the code using rng diff --git a/cmd/hivechain/contracts/genlogs.eas b/cmd/hivechain/contracts/genlogs.eas index 3ddb4d404e..879a2abaf4 100644 --- a/cmd/hivechain/contracts/genlogs.eas +++ b/cmd/hivechain/contracts/genlogs.eas @@ -1,9 +1,10 @@ ;;; -*- mode: asm -*- ;;; creates random logs until less than 10k gas remaining. +#pragma target "frontier" + #include "rng.eas" -.start: %RngInit(0) ; [] genlogs: diff --git a/cmd/hivechain/contracts/genstorage.eas b/cmd/hivechain/contracts/genstorage.eas index f90579332a..397330252a 100644 --- a/cmd/hivechain/contracts/genstorage.eas +++ b/cmd/hivechain/contracts/genstorage.eas @@ -1,7 +1,9 @@ ;;; -*- mode: asm -*- ;;; creates storage slots until less than 25k gas remaining. -#define minGas 25000 +#pragma target "frontier" + +#define minGas = 25000 number ; [block] genstorage: diff --git a/cmd/hivechain/contracts/rng.eas b/cmd/hivechain/contracts/rng.eas index 1a35ad7b6b..b13458e7f2 100644 --- a/cmd/hivechain/contracts/rng.eas +++ b/cmd/hivechain/contracts/rng.eas @@ -2,7 +2,7 @@ ;;; deterministic random data generator using block number. ;;; all macros take the memory location of an rng state as argument. -#define RngSize 64 +#define RngSize = 64 ;; initialize random generator #define %RngInit(ptr) { ; [] From c6f575928565e8f60e6a3a9b2366b1f69ed19236 Mon Sep 17 00:00:00 2001 From: Ruben Buniatyan Date: Thu, 28 Nov 2024 21:24:36 +0100 Subject: [PATCH 348/387] clients/nethermind: fix configuration settings (#1181) --- clients/nethermind/Dockerfile | 2 +- clients/nethermind/Dockerfile.git | 6 +++--- clients/nethermind/Dockerfile.local | 6 +++--- clients/nethermind/mkconfig.jq | 1 - clients/nethermind/test.cfg | 1 - 5 files changed, 7 insertions(+), 9 deletions(-) diff --git a/clients/nethermind/Dockerfile b/clients/nethermind/Dockerfile index 7939329f9c..494726b5ac 100644 --- a/clients/nethermind/Dockerfile +++ b/clients/nethermind/Dockerfile @@ -22,5 +22,5 @@ RUN chmod +x /nethermind.sh /hive-bin/enode.sh # Expose networking ports EXPOSE 8545 30303 30303/udp -ENV NETHERMIND_HIVE_ENABLED true +ENV NETHERMIND_HIVECONFIG_ENABLED true ENTRYPOINT ["/nethermind.sh"] diff --git a/clients/nethermind/Dockerfile.git b/clients/nethermind/Dockerfile.git index 0a94381c00..f559dac8de 100644 --- a/clients/nethermind/Dockerfile.git +++ b/clients/nethermind/Dockerfile.git @@ -1,7 +1,7 @@ ### Build Nethermind From Git: ## Builder stage: Compiles nethermind from a git repository -FROM mcr.microsoft.com/dotnet/sdk:8.0-jammy AS build +FROM mcr.microsoft.com/dotnet/sdk:9.0-jammy AS build ARG github=nethermindeth/nethermind ARG tag=master @@ -12,7 +12,7 @@ RUN echo "Cloning: $github - $tag" && \ dotnet build -c release ## Final stage: Sets up the environment for running nethermind -FROM mcr.microsoft.com/dotnet/aspnet:8.0 +FROM mcr.microsoft.com/dotnet/aspnet:9.0 # Copy compiled binary from builder COPY --from=build /nethermind/src/Nethermind/artifacts/bin/Nethermind.Runner/release /nethermind @@ -38,5 +38,5 @@ RUN chmod +x /nethermind.sh /hive-bin/enode.sh # Expose networking ports EXPOSE 8545 30303 30303/udp -ENV NETHERMIND_HIVE_ENABLED true +ENV NETHERMIND_HIVECONFIG_ENABLED true ENTRYPOINT ["/nethermind.sh"] diff --git a/clients/nethermind/Dockerfile.local b/clients/nethermind/Dockerfile.local index 935a58f2fb..275f0baa99 100644 --- a/clients/nethermind/Dockerfile.local +++ b/clients/nethermind/Dockerfile.local @@ -2,7 +2,7 @@ ### Requires a copy of nethermind/ -> hive/clients/nethermind/ ## Builder stage: Compiles nethermind from a local directory -FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build +FROM mcr.microsoft.com/dotnet/sdk:9.0 AS build # Default local client path: clients/nethermind/ ARG local_path=nethermind @@ -11,7 +11,7 @@ ADD $local_path /nethermind RUN cd /nethermind/src/Nethermind/Nethermind.Runner && dotnet build -c release ## Final stage: Sets up the environment for running nethermind -FROM mcr.microsoft.com/dotnet/aspnet:8.0 +FROM mcr.microsoft.com/dotnet/aspnet:9.0 # Copy compiled binary from builder COPY --from=build /nethermind/src/Nethermind/artifacts/bin/Nethermind.Runner/release /nethermind @@ -36,5 +36,5 @@ RUN chmod +x /nethermind.sh /hive-bin/enode.sh # Expose networking ports EXPOSE 8545 30303 30303/udp -ENV NETHERMIND_HIVE_ENABLED true +ENV NETHERMIND_HIVECONFIG_ENABLED true ENTRYPOINT ["/nethermind.sh"] diff --git a/clients/nethermind/mkconfig.jq b/clients/nethermind/mkconfig.jq index 6a4661bfa2..4af30c7b6c 100644 --- a/clients/nethermind/mkconfig.jq +++ b/clients/nethermind/mkconfig.jq @@ -84,7 +84,6 @@ def txpool_config: def base_config: { "Init": { - "PubSubEnabled": true, "WebSocketsEnabled": true, "IsMining": (env.HIVE_MINER != null), "UseMemDb": true, diff --git a/clients/nethermind/test.cfg b/clients/nethermind/test.cfg index 2873be96c7..f81eaded55 100644 --- a/clients/nethermind/test.cfg +++ b/clients/nethermind/test.cfg @@ -1,6 +1,5 @@ { "Init": { - "PubSubEnabled": false, "WebSocketsEnabled": false, "IsMining": false, "UseMemDb": true, From 96daf48e8a31ca23a6d6b55553511978ef78c451 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Fri, 29 Nov 2024 15:17:56 +0100 Subject: [PATCH 349/387] clients/go-ethereum: ensure terminalTotalDifficulty is always set Geth no longer launches without this setting. --- clients/go-ethereum/mapper.jq | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clients/go-ethereum/mapper.jq b/clients/go-ethereum/mapper.jq index 569b74ac0f..cd0bbf731a 100644 --- a/clients/go-ethereum/mapper.jq +++ b/clients/go-ethereum/mapper.jq @@ -53,7 +53,7 @@ def to_bool: "arrowGlacierBlock": env.HIVE_FORK_ARROW_GLACIER|to_int, "grayGlacierBlock": env.HIVE_FORK_GRAY_GLACIER|to_int, "mergeNetsplitBlock": env.HIVE_MERGE_BLOCK_ID|to_int, - "terminalTotalDifficulty": env.HIVE_TERMINAL_TOTAL_DIFFICULTY|to_int, + "terminalTotalDifficulty": (env.HIVE_TERMINAL_TOTAL_DIFFICULTY|to_int // 0), "shanghaiTime": env.HIVE_SHANGHAI_TIMESTAMP|to_int, "cancunTime": env.HIVE_CANCUN_TIMESTAMP|to_int, "pragueTime": env.HIVE_PRAGUE_TIMESTAMP|to_int, From fe958735eb6ec51ebd4b3179d84ef07bf024666b Mon Sep 17 00:00:00 2001 From: Mario Vega Date: Tue, 3 Dec 2024 16:01:13 -0600 Subject: [PATCH 350/387] hive: add --sim.buildarg flag (#1179) Adds --sim.buildarg flag for setting build arguments to the simulator Dockerfile. --------- Co-authored-by: Felix Lange --- hive.go | 28 +++++++++++++++++++++++++++- internal/fakes/builder.go | 6 +++--- internal/libdocker/builder.go | 31 ++++++++++++++++++++----------- internal/libhive/dockerface.go | 2 +- internal/libhive/run.go | 8 ++++---- internal/libhive/run_test.go | 11 ++++++----- internal/libhive/testmanager.go | 1 + 7 files changed, 62 insertions(+), 25 deletions(-) diff --git a/hive.go b/hive.go index b6bda9a755..f5d9a38c2e 100644 --- a/hive.go +++ b/hive.go @@ -8,6 +8,7 @@ import ( "os" "os/signal" "regexp" + "sort" "strings" "time" @@ -16,6 +17,27 @@ import ( "gopkg.in/inconshreveable/log15.v2" ) +type buildArgs map[string]string + +func (args *buildArgs) String() string { + var kv []string + for k, v := range *args { + kv = append(kv, k+"="+v) + } + sort.Strings(kv) + return strings.Join(kv, ",") +} + +// Set implements flag.Value. +func (args *buildArgs) Set(value string) error { + parts := strings.SplitN(value, "=", 2) + if len(parts) != 2 { + return errors.New("invalid build argument format, expected ARG=VALUE") + } + (*args)[parts[0]] = parts[1] + return nil +} + func main() { var ( testResultsRoot = flag.String("results-root", "workspace/logs", "Target `directory` for results files and logs.") @@ -49,6 +71,10 @@ func main() { "never opens the RPC port.") ) + // Add the sim.buildarg flag multiple times to allow multiple build arguments. + var simBuildArgs buildArgs + flag.Var(&simBuildArgs, "sim.buildarg", "Argument to pass to the docker engine when building the simulator image, in the form of ARGNAME=VALUE.") + // Parse the flags and configure the logger. flag.Parse() log15.Root().SetHandler(log15.LvlFilterHandler(log15.Lvl(*loglevelFlag), log15.StreamHandler(os.Stderr, log15.TerminalFormat()))) @@ -138,7 +164,7 @@ func main() { } // Build clients and simulators. - if err := runner.Build(ctx, clientList, simList); err != nil { + if err := runner.Build(ctx, clientList, simList, simBuildArgs); err != nil { fatal(err) } if *simDevMode { diff --git a/internal/fakes/builder.go b/internal/fakes/builder.go index dc79c9dd59..8a7422639c 100644 --- a/internal/fakes/builder.go +++ b/internal/fakes/builder.go @@ -10,7 +10,7 @@ import ( // BuilderHooks can be used to override the behavior of the fake builder. type BuilderHooks struct { BuildClientImage func(context.Context, libhive.ClientDesignator) (string, error) - BuildSimulatorImage func(context.Context, string) (string, error) + BuildSimulatorImage func(context.Context, string, map[string]string) (string, error) ReadFile func(ctx context.Context, image string, file string) ([]byte, error) } @@ -35,9 +35,9 @@ func (b *fakeBuilder) BuildClientImage(ctx context.Context, client libhive.Clien return "fakebuild/client/" + client.Client + ":latest", nil } -func (b *fakeBuilder) BuildSimulatorImage(ctx context.Context, sim string) (string, error) { +func (b *fakeBuilder) BuildSimulatorImage(ctx context.Context, sim string, buildArgs map[string]string) (string, error) { if b.hooks.BuildSimulatorImage != nil { - return b.hooks.BuildSimulatorImage(ctx, sim) + return b.hooks.BuildSimulatorImage(ctx, sim, buildArgs) } return "fakebuild/simulator/" + sim + ":latest", nil } diff --git a/internal/libdocker/builder.go b/internal/libdocker/builder.go index 4731c9d415..bc8e431d3b 100644 --- a/internal/libdocker/builder.go +++ b/internal/libdocker/builder.go @@ -9,6 +9,7 @@ import ( "io/fs" "os" "path/filepath" + "slices" "strings" "github.com/ethereum/hive/internal/libhive" @@ -42,20 +43,16 @@ func (b *Builder) BuildClientImage(ctx context.Context, client libhive.ClientDes dir := b.config.Inventory.ClientDirectory(client) tag := fmt.Sprintf("hive/clients/%s:latest", client.Name()) dockerFile := client.Dockerfile() - buildArgs := make([]docker.BuildArg, 0) - for key, value := range client.BuildArgs { - buildArgs = append(buildArgs, docker.BuildArg{Name: key, Value: value}) - } - - err := b.buildImage(ctx, dir, dockerFile, tag, buildArgs) + err := b.buildImage(ctx, dir, dockerFile, tag, client.BuildArgs) return tag, err } // BuildSimulatorImage builds a docker image of a simulator. -func (b *Builder) BuildSimulatorImage(ctx context.Context, name string) (string, error) { +func (b *Builder) BuildSimulatorImage(ctx context.Context, name string, buildArgs map[string]string) (string, error) { dir := b.config.Inventory.SimulatorDirectory(name) buildContextPath := dir buildDockerfile := "Dockerfile" + // build context dir of simulator can be overridden with "hive_context.txt" file containing the desired build path if contextPathBytes, err := os.ReadFile(filepath.Join(filepath.FromSlash(dir), "hive_context.txt")); err == nil { buildContextPath = filepath.Join(dir, strings.TrimSpace(string(contextPathBytes))) @@ -69,7 +66,7 @@ func (b *Builder) BuildSimulatorImage(ctx context.Context, name string) (string, } } tag := fmt.Sprintf("hive/simulators/%s:latest", name) - err := b.buildImage(ctx, buildContextPath, buildDockerfile, tag, nil) + err := b.buildImage(ctx, buildContextPath, buildDockerfile, tag, buildArgs) return tag, err } @@ -213,7 +210,7 @@ func (b *Builder) ReadFile(ctx context.Context, image, path string) ([]byte, err // buildImage builds a single docker image from the specified context. // branch specifes a build argument to use a specific base image branch or github source branch. -func (b *Builder) buildImage(ctx context.Context, contextDir, dockerFile, imageTag string, buildArgs []docker.BuildArg) error { +func (b *Builder) buildImage(ctx context.Context, contextDir, dockerFile, imageTag string, buildArgs map[string]string) error { logger := b.logger.New("image", imageTag) context, err := filepath.Abs(contextDir) if err != nil { @@ -226,10 +223,11 @@ func (b *Builder) buildImage(ctx context.Context, contextDir, dockerFile, imageT opts.Dockerfile = dockerFile logctx := []interface{}{"dir", contextDir, "nocache", opts.NoCache, "pull", opts.Pull} if len(buildArgs) > 0 { - for _, arg := range buildArgs { + args := convertBuildArgs(buildArgs) + for _, arg := range args { logctx = append(logctx, arg.Name, arg.Value) } - opts.BuildArgs = buildArgs + opts.BuildArgs = args } logger.Info("building image", logctx...) @@ -239,3 +237,14 @@ func (b *Builder) buildImage(ctx context.Context, contextDir, dockerFile, imageT } return nil } + +func convertBuildArgs(m map[string]string) []docker.BuildArg { + args := make([]docker.BuildArg, 0, len(m)) + for key, value := range m { + args = append(args, docker.BuildArg{Name: key, Value: value}) + } + slices.SortFunc(args, func(a, b docker.BuildArg) int { + return strings.Compare(a.Name, b.Name) + }) + return args +} diff --git a/internal/libhive/dockerface.go b/internal/libhive/dockerface.go index a5ae1dab8b..6c0aecc23f 100644 --- a/internal/libhive/dockerface.go +++ b/internal/libhive/dockerface.go @@ -81,7 +81,7 @@ type ContainerInfo struct { // Builder can build docker images of clients and simulators. type Builder interface { BuildClientImage(ctx context.Context, client ClientDesignator) (string, error) - BuildSimulatorImage(ctx context.Context, name string) (string, error) + BuildSimulatorImage(ctx context.Context, name string, buildArgs map[string]string) (string, error) BuildImage(ctx context.Context, name string, fsys fs.FS) error // ReadFile returns the content of a file in the given image. diff --git a/internal/libhive/run.go b/internal/libhive/run.go index e3dec9a25b..a50cbbf21a 100644 --- a/internal/libhive/run.go +++ b/internal/libhive/run.go @@ -42,14 +42,14 @@ func NewRunner(inv Inventory, b Builder, cb ContainerBackend) *Runner { } // Build builds client and simulator images. -func (r *Runner) Build(ctx context.Context, clientList []ClientDesignator, simList []string) error { +func (r *Runner) Build(ctx context.Context, clientList []ClientDesignator, simList []string, simBuildArgs map[string]string) error { if err := r.container.Build(ctx, r.builder); err != nil { return err } if err := r.buildClients(ctx, clientList); err != nil { return err } - return r.buildSimulators(ctx, simList) + return r.buildSimulators(ctx, simList, simBuildArgs) } // buildClients builds client images. @@ -86,12 +86,12 @@ func (r *Runner) buildClients(ctx context.Context, clientList []ClientDesignator } // buildSimulators builds simulator images. -func (r *Runner) buildSimulators(ctx context.Context, simList []string) error { +func (r *Runner) buildSimulators(ctx context.Context, simList []string, buildArgs map[string]string) error { r.simImages = make(map[string]string) log15.Info(fmt.Sprintf("building %d simulators...", len(simList))) for _, sim := range simList { - image, err := r.builder.BuildSimulatorImage(ctx, sim) + image, err := r.builder.BuildSimulatorImage(ctx, sim, buildArgs) if err != nil { return err } diff --git a/internal/libhive/run_test.go b/internal/libhive/run_test.go index ce57217cf5..31899cb5ea 100644 --- a/internal/libhive/run_test.go +++ b/internal/libhive/run_test.go @@ -43,12 +43,13 @@ func TestRunner(t *testing.T) { }) var ( - runner = libhive.NewRunner(inv, b, cb) - simList = []string{"sim-1"} - simOpt = libhive.SimEnv{LogDir: t.TempDir(), ClientList: simClients} - ctx = context.Background() + runner = libhive.NewRunner(inv, b, cb) + simList = []string{"sim-1"} + simOpt = libhive.SimEnv{LogDir: t.TempDir(), ClientList: simClients} + ctx = context.Background() + buildArgs = map[string]string{"SomeArg": "SomeValue"} ) - if err := runner.Build(ctx, allClients, simList); err != nil { + if err := runner.Build(ctx, allClients, simList, buildArgs); err != nil { t.Fatal("Build() failed:", err) } if _, err := runner.Run(context.Background(), "sim-1", simOpt); err != nil { diff --git a/internal/libhive/testmanager.go b/internal/libhive/testmanager.go index fe7bc6a0cf..addeb3ddfe 100644 --- a/internal/libhive/testmanager.go +++ b/internal/libhive/testmanager.go @@ -36,6 +36,7 @@ type SimEnv struct { SimParallelism int SimRandomSeed int SimTestPattern string + SimBuildArgs []string // This is the time limit for the simulation run. // There is no default limit. From 992af5097ffa686929765c1f973af17779b3a794 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Wed, 4 Dec 2024 00:29:43 +0100 Subject: [PATCH 351/387] all: use log/slog instead of log15 (#1182) --- go.mod | 5 +-- go.sum | 20 ++-------- hive.go | 34 ++++++++++++++--- hivesim/docs.go | 4 +- internal/libdocker/builder.go | 8 ++-- internal/libdocker/container.go | 16 ++++---- internal/libdocker/docker.go | 6 +-- internal/libdocker/proxy.go | 6 +-- internal/libhive/api.go | 68 ++++++++++++++++----------------- internal/libhive/inventory.go | 8 ++-- internal/libhive/run.go | 41 ++++++++++---------- internal/libhive/testmanager.go | 9 ++--- 12 files changed, 115 insertions(+), 110 deletions(-) diff --git a/go.mod b/go.mod index 9e97b090c5..ec89bcf54b 100644 --- a/go.mod +++ b/go.mod @@ -14,9 +14,9 @@ require ( github.com/gorilla/mux v1.8.1 github.com/holiman/uint256 v1.2.4 github.com/lithammer/dedent v1.1.0 + github.com/lmittmann/tint v1.0.5 golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa golang.org/x/net v0.24.0 - gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1 gopkg.in/yaml.v3 v3.0.1 ) @@ -50,7 +50,6 @@ require ( github.com/ethereum/go-verkle v0.1.1-0.20240306133620-7d920df305f0 // indirect github.com/getsentry/sentry-go v0.18.0 // indirect github.com/go-ole/go-ole v1.3.0 // indirect - github.com/go-stack/stack v1.8.1 // indirect github.com/gofrs/flock v0.8.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/protobuf v1.5.4 // indirect @@ -61,8 +60,6 @@ require ( github.com/klauspost/compress v1.15.15 // indirect github.com/kr/pretty v0.3.1 // indirect github.com/kr/text v0.2.0 // indirect - github.com/mattn/go-colorable v0.1.13 // indirect - github.com/mattn/go-isatty v0.0.20 // indirect github.com/mattn/go-runewidth v0.0.14 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect github.com/mmcloughlin/addchain v0.4.0 // indirect diff --git a/go.sum b/go.sum index ee3fc834dc..82467817fa 100644 --- a/go.sum +++ b/go.sum @@ -80,8 +80,6 @@ github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4 github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= -github.com/fsouza/go-dockerclient v1.11.0 h1:4ZAk6W7rPAtPXm7198EFqA5S68rwnNQORxlOA5OurCA= -github.com/fsouza/go-dockerclient v1.11.0/go.mod h1:0I3TQCRseuPTzqlY4Y3ajfsg2VAdMQoazrkxJTiJg8s= github.com/fsouza/go-dockerclient v1.11.2 h1:Wos4OMUwIjOW2rt8Z10TZSJHxgQH0KcYyf3O86dqFII= github.com/fsouza/go-dockerclient v1.11.2/go.mod h1:HZN6ky2Mg5mfZO/WZBFDe6XCricqTnDJntfXHZTYnQQ= github.com/getsentry/sentry-go v0.18.0 h1:MtBW5H9QgdcJabtZcuJG80BMOwaBpkRDZkxRkNC1sN0= @@ -91,8 +89,6 @@ github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3Bop github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= -github.com/go-stack/stack v1.8.1 h1:ntEHSVwIt7PNXNpgPmVfMrNhLtgjlmnZha2kOpuRiDw= -github.com/go-stack/stack v1.8.1/go.mod h1:dcoOX6HbPZSZptuspn9bctJ+N/CnF5gGygcUP3XYfe4= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= @@ -149,11 +145,8 @@ github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7 github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= github.com/lithammer/dedent v1.1.0 h1:VNzHMVCBNG1j0fh3OrsFRkVUwStdDArbgBWoPAffktY= github.com/lithammer/dedent v1.1.0/go.mod h1:jrXYCQtgg0nJiN+StA2KgR7w6CiQNv9Fd/Z9BP0jIOc= -github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= -github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= -github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= -github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/lmittmann/tint v1.0.5 h1:NQclAutOfYsqs2F1Lenue6OoWCajs5wJcP3DfWVpePw= +github.com/lmittmann/tint v1.0.5/go.mod h1:HIS3gSy7qNwGCj+5oRjAutErFBl4BzdQP6cJZ0NfMwE= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.14 h1:+xnbZSEeDbOIg5/mE6JF0w6n9duR1l3/WmbinWVwUuU= github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= @@ -286,21 +279,16 @@ golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.22.0 h1:RI27ohtqKCnwULzJLqkv897zojh5/DwS/ENaMzUOaWI= golang.org/x/sys v0.22.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.19.0 h1:+ThwsDv+tYfnJFhF4L8jITxu1tdTWRTZpdsWgEgjL6Q= -golang.org/x/term v0.19.0/go.mod h1:2CuTdWZ7KHSQwUzKva0cbMg6q2DMI3Mmxp+gKJbskEk= golang.org/x/term v0.22.0 h1:BbsgPEJULsl2fV/AT3v15Mjva5yXKQDyKf+TbDz7QJk= +golang.org/x/term v0.22.0/go.mod h1:F3qCibpT5AMpCRfhfT53vVJwhLtIVHhB9XDjfFvnMI4= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= @@ -332,8 +320,6 @@ gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8 gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1 h1:iiHuQZCNgYPmFQxd3BBN/Nc5+dAwzZuq5y40s20oQw0= -gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/hive.go b/hive.go index f5d9a38c2e..6925458da8 100644 --- a/hive.go +++ b/hive.go @@ -5,6 +5,7 @@ import ( "errors" "flag" "fmt" + "log/slog" "os" "os/signal" "regexp" @@ -14,7 +15,7 @@ import ( "github.com/ethereum/hive/internal/libdocker" "github.com/ethereum/hive/internal/libhive" - "gopkg.in/inconshreveable/log15.v2" + "github.com/lmittmann/tint" ) type buildArgs map[string]string @@ -77,10 +78,15 @@ func main() { // Parse the flags and configure the logger. flag.Parse() - log15.Root().SetHandler(log15.LvlFilterHandler(log15.Lvl(*loglevelFlag), log15.StreamHandler(os.Stderr, log15.TerminalFormat()))) + terminal := os.Getenv("TERM") + tintHandler := tint.NewHandler(os.Stderr, &tint.Options{ + Level: convertLogLevel(*loglevelFlag), + NoColor: terminal == "" || terminal == "dumb", + }) + slog.SetDefault(slog.New(tintHandler)) if *simTestLimit > 0 { - log15.Warn("Option --sim.testlimit is deprecated and will have no effect.") + slog.Warn("Option --sim.testlimit is deprecated and will have no effect.") } // Get the list of simulators. @@ -96,7 +102,7 @@ func main() { fatal("no simulators for pattern", *simPattern) } if *simPattern != "" && *simDevMode { - log15.Warn("--sim is ignored when using --dev mode") + slog.Warn("--sim is ignored when using --dev mode") simList = nil } @@ -180,7 +186,7 @@ func main() { fatal(err) } failCount += result.TestsFailed - log15.Info(fmt.Sprintf("simulation %s finished", sim), "suites", result.Suites, "tests", result.Tests, "failed", result.TestsFailed) + slog.Info(fmt.Sprintf("simulation %s finished", sim), "suites", result.Suites, "tests", result.Tests, "failed", result.TestsFailed) } switch failCount { @@ -215,3 +221,21 @@ func flagIsSet(name string) bool { }) return found } + +// convertLogLevel maps log level from range 0-5 to the range used by package slog. +// Input levels are ordered in increasing amounts of messages, i.e. level zero is silent +// and level 5 means everything is printed. +func convertLogLevel(level int) slog.Level { + switch level { + case 0: + return 99 + case 1: + return slog.LevelError + case 2: + return slog.LevelWarn + case 3: + return slog.LevelInfo + default: + return slog.LevelDebug + } +} diff --git a/hivesim/docs.go b/hivesim/docs.go index 7b1d90a9fd..1479b1a857 100644 --- a/hivesim/docs.go +++ b/hivesim/docs.go @@ -3,6 +3,7 @@ package hivesim import ( "fmt" "io" + "log/slog" "os" "path/filepath" "sort" @@ -10,7 +11,6 @@ import ( "github.com/ethereum/hive/internal/simapi" "github.com/lithammer/dedent" - "gopkg.in/inconshreveable/log15.v2" ) // Converts a string to a valid markdown link. @@ -333,7 +333,7 @@ func (docs *docsCollector) EndSuite(testSuite SuiteID) error { if !docs.AnyRunning() { // Generate markdown files when all suites are done. if err := docs.genSimulatorMarkdownFiles(NewFileWriter(docs.outputDir)); err != nil { - log15.Error("can't generate markdown files", "err", err) + slog.Error("can't generate markdown files", "err", err) } } return nil diff --git a/internal/libdocker/builder.go b/internal/libdocker/builder.go index bc8e431d3b..e4bf99b690 100644 --- a/internal/libdocker/builder.go +++ b/internal/libdocker/builder.go @@ -7,6 +7,7 @@ import ( "fmt" "io" "io/fs" + "log/slog" "os" "path/filepath" "slices" @@ -14,14 +15,13 @@ import ( "github.com/ethereum/hive/internal/libhive" docker "github.com/fsouza/go-dockerclient" - "gopkg.in/inconshreveable/log15.v2" ) // Builder takes care of building docker images. type Builder struct { client *docker.Client config *Config - logger log15.Logger + logger *slog.Logger authenticator Authenticator } @@ -33,7 +33,7 @@ func NewBuilder(client *docker.Client, cfg *Config, auth Authenticator) *Builder authenticator: auth, } if b.logger == nil { - b.logger = log15.Root() + b.logger = slog.Default() } return b } @@ -211,7 +211,7 @@ func (b *Builder) ReadFile(ctx context.Context, image, path string) ([]byte, err // buildImage builds a single docker image from the specified context. // branch specifes a build argument to use a specific base image branch or github source branch. func (b *Builder) buildImage(ctx context.Context, contextDir, dockerFile, imageTag string, buildArgs map[string]string) error { - logger := b.logger.New("image", imageTag) + logger := b.logger.With("image", imageTag) context, err := filepath.Abs(contextDir) if err != nil { logger.Error("can't find path to context directory", "err", err) diff --git a/internal/libdocker/container.go b/internal/libdocker/container.go index ef723b8428..cc976e8499 100644 --- a/internal/libdocker/container.go +++ b/internal/libdocker/container.go @@ -7,6 +7,7 @@ import ( "errors" "fmt" "io" + "log/slog" "mime/multipart" "net" "os" @@ -17,13 +18,12 @@ import ( "github.com/ethereum/hive/hiveproxy" "github.com/ethereum/hive/internal/libhive" docker "github.com/fsouza/go-dockerclient" - "gopkg.in/inconshreveable/log15.v2" ) type ContainerBackend struct { client *docker.Client config *Config - logger log15.Logger + logger *slog.Logger proxy *hiveproxy.Proxy } @@ -31,7 +31,7 @@ type ContainerBackend struct { func NewContainerBackend(c *docker.Client, cfg *Config) *ContainerBackend { b := &ContainerBackend{client: c, config: cfg, logger: cfg.Logger} if b.logger == nil { - b.logger = log15.Root() + b.logger = slog.Default() } return b } @@ -103,7 +103,7 @@ func (b *ContainerBackend) CreateContainer(ctx context.Context, imageName string if err != nil { return "", err } - logger := b.logger.New("image", imageName, "container", c.ID[:8]) + logger := b.logger.With("image", imageName, "container", c.ID[:8]) // Now upload files. if err := b.uploadFiles(ctx, c.ID, opt.Files); err != nil { @@ -122,7 +122,7 @@ func (b *ContainerBackend) StartContainer(ctx context.Context, containerID strin } info := &libhive.ContainerInfo{ID: containerID[:8], LogFile: opt.LogFile} - logger := b.logger.New("container", info.ID) + logger := b.logger.With("container", info.ID) // Run the container. var startTime = time.Now() @@ -350,7 +350,7 @@ func (b *ContainerBackend) uploadFiles(ctx context.Context, id string, files map // runContainer attaches to the output streams of an existing container, then // starts executing the container and returns the CloseWaiter to allow the caller // to wait for termination. -func (b *ContainerBackend) runContainer(ctx context.Context, logger log15.Logger, id string, opts libhive.ContainerOptions) (docker.CloseWaiter, error) { +func (b *ContainerBackend) runContainer(ctx context.Context, logger *slog.Logger, id string, opts libhive.ContainerOptions) (docker.CloseWaiter, error) { var ( outStream io.Writer errStream io.Writer @@ -435,12 +435,12 @@ func (b *ContainerBackend) runContainer(ctx context.Context, logger log15.Logger // after it is done waiting. type fileCloser struct { w docker.CloseWaiter - logger log15.Logger + logger *slog.Logger closers []io.Closer closeOnce sync.Once } -func newFileCloser(logger log15.Logger) *fileCloser { +func newFileCloser(logger *slog.Logger) *fileCloser { return &fileCloser{logger: logger} } diff --git a/internal/libdocker/docker.go b/internal/libdocker/docker.go index 64becf39a5..cecd0313e6 100644 --- a/internal/libdocker/docker.go +++ b/internal/libdocker/docker.go @@ -3,11 +3,11 @@ package libdocker import ( "fmt" "io" + "log/slog" "regexp" "github.com/ethereum/hive/internal/libhive" docker "github.com/fsouza/go-dockerclient" - "gopkg.in/inconshreveable/log15.v2" ) const apiVersion = "1.25" @@ -16,7 +16,7 @@ const apiVersion = "1.25" type Config struct { Inventory libhive.Inventory - Logger log15.Logger + Logger *slog.Logger // When building containers, any client or simulator image build matching the pattern // will avoid the docker cache. @@ -36,7 +36,7 @@ type Config struct { func Connect(dockerEndpoint string, cfg *Config) (*Builder, *ContainerBackend, error) { logger := cfg.Logger if logger == nil { - logger = log15.Root() + logger = slog.Default() } var client *docker.Client var err error diff --git a/internal/libdocker/proxy.go b/internal/libdocker/proxy.go index a53e5afe46..d3a14ae628 100644 --- a/internal/libdocker/proxy.go +++ b/internal/libdocker/proxy.go @@ -3,13 +3,13 @@ package libdocker import ( "context" "io" + "log/slog" "net" "net/http" "sync" "github.com/ethereum/hive/hiveproxy" "github.com/ethereum/hive/internal/libhive" - "gopkg.in/inconshreveable/log15.v2" ) const hiveproxyTag = "hive/hiveproxy" @@ -39,7 +39,7 @@ func (cb *ContainerBackend) ServeAPI(ctx context.Context, h http.Handler) (libhi var err error proxy, err = hiveproxy.RunBackend(outR, inW, h) if err != nil { - log15.Error("proxy backend startup failed", "err", err) + slog.Error("proxy backend startup failed", "err", err) } proxyErrC <- err }() @@ -75,7 +75,7 @@ func (cb *ContainerBackend) ServeAPI(ctx context.Context, h http.Handler) (libhi // Register proxy in ContainerBackend, so it can be used for CheckLive. cb.proxy = proxy - log15.Info("hiveproxy started", "container", id[:12], "addr", srv.Addr()) + slog.Info("hiveproxy started", "container", id[:12], "addr", srv.Addr()) return srv, nil } diff --git a/internal/libhive/api.go b/internal/libhive/api.go index 06c89876d7..3bbbbbf647 100644 --- a/internal/libhive/api.go +++ b/internal/libhive/api.go @@ -6,6 +6,7 @@ import ( "errors" "fmt" "io" + "log/slog" "mime/multipart" "net/http" "path" @@ -16,7 +17,6 @@ import ( "github.com/ethereum/hive/internal/simapi" "github.com/gorilla/mux" - "gopkg.in/inconshreveable/log15.v2" ) // hiveEnvvarPrefix is the prefix of the environment variables names that should @@ -77,10 +77,10 @@ func (api *simAPI) startSuite(w http.ResponseWriter, r *http.Request) { suiteID, err := api.tm.StartTestSuite(suite.Name, suite.Description) if err != nil { - log15.Error("API: StartTestSuite failed", "error", err) + slog.Error("API: StartTestSuite failed", "error", err) serveError(w, err, http.StatusInternalServerError) } - log15.Info("API: suite started", "suite", suiteID, "name", suite.Name) + slog.Info("API: suite started", "suite", suiteID, "name", suite.Name) serveJSON(w, suiteID) } @@ -92,11 +92,11 @@ func (api *simAPI) endSuite(w http.ResponseWriter, r *http.Request) { return } if err := api.tm.EndTestSuite(suiteID); err != nil { - log15.Error("API: EndTestSuite failed", "suite", suiteID, "error", err) + slog.Error("API: EndTestSuite failed", "suite", suiteID, "error", err) serveError(w, err, http.StatusInternalServerError) return } - log15.Info("API: suite ended", "suite", suiteID) + slog.Info("API: suite ended", "suite", suiteID) serveOK(w) } @@ -123,7 +123,7 @@ func (api *simAPI) startTest(w http.ResponseWriter, r *http.Request) { serveError(w, err, http.StatusInternalServerError) return } - log15.Info("API: test started", "suite", suiteID, "test", testID, "name", test.Name) + slog.Info("API: test started", "suite", suiteID, "test", testID, "name", test.Name) serveJSON(w, testID) } @@ -138,7 +138,7 @@ func (api *simAPI) endTest(w http.ResponseWriter, r *http.Request) { var result TestResult if err := json.NewDecoder(r.Body).Decode(&result); err != nil { - log15.Error("API: invalid result data in endTest", "suite", suiteID, "test", testID, "error", err) + slog.Error("API: invalid result data in endTest", "suite", suiteID, "test", testID, "error", err) err := fmt.Errorf("can't unmarshal result: %v", err) serveError(w, err, http.StatusBadRequest) return @@ -146,13 +146,13 @@ func (api *simAPI) endTest(w http.ResponseWriter, r *http.Request) { err = api.tm.EndTest(suiteID, testID, &result) if err != nil { - log15.Error("API: EndTest failed", "suite", suiteID, "test", testID, "error", err) + slog.Error("API: EndTest failed", "suite", suiteID, "test", testID, "error", err) err := fmt.Errorf("can't end test case: %v", err) serveError(w, err, http.StatusInternalServerError) return } - log15.Info("API: test ended", "suite", suiteID, "test", testID, "pass", result.Pass) + slog.Info("API: test ended", "suite", suiteID, "test", testID, "pass", result.Pass) serveOK(w) } @@ -167,7 +167,7 @@ func (api *simAPI) startClient(w http.ResponseWriter, r *http.Request) { // Client launch parameters are given as multipart/form-data. const maxMemory = 8 * 1024 * 1024 if err := r.ParseMultipartForm(maxMemory); err != nil { - log15.Error("API: could not parse node request", "error", err) + slog.Error("API: could not parse node request", "error", err) err := fmt.Errorf("could not parse node request") serveError(w, err, http.StatusBadRequest) return @@ -175,14 +175,14 @@ func (api *simAPI) startClient(w http.ResponseWriter, r *http.Request) { defer r.MultipartForm.RemoveAll() if !r.Form.Has("config") { - log15.Error("API: missing 'config' parameter in node request", "error", err) + slog.Error("API: missing 'config' parameter in node request", "error", err) err := fmt.Errorf("missing 'config' parameter in node request") serveError(w, err, http.StatusBadRequest) return } var clientConfig simapi.NodeConfig if err := json.Unmarshal([]byte(r.Form.Get("config")), &clientConfig); err != nil { - log15.Error("API: invalid 'config' parameter in node request", "error", err) + slog.Error("API: invalid 'config' parameter in node request", "error", err) err := fmt.Errorf("invalid 'config' parameter in node request") serveError(w, err, http.StatusBadRequest) return @@ -191,14 +191,14 @@ func (api *simAPI) startClient(w http.ResponseWriter, r *http.Request) { // Get the client name. clientDef, err := api.checkClient(&clientConfig) if err != nil { - log15.Error("API: " + err.Error()) + slog.Error("API: " + err.Error()) serveError(w, err, http.StatusBadRequest) return } // Get the network names, if any, for the container to be connected to at start. networks, err := api.checkClientNetworks(&clientConfig, suiteID) if err != nil { - log15.Error("API: "+err.Error(), "client", clientDef.Name) + slog.Error("API: "+err.Error(), "client", clientDef.Name) serveError(w, err, http.StatusBadRequest) return } @@ -242,7 +242,7 @@ func (api *simAPI) startClient(w http.ResponseWriter, r *http.Request) { options := ContainerOptions{Env: env, Files: files} containerID, err := api.backend.CreateContainer(ctx, clientDef.Image, options) if err != nil { - log15.Error("API: client container create failed", "client", clientDef.Name, "error", err) + slog.Error("API: client container create failed", "client", clientDef.Name, "error", err) err := fmt.Errorf("client container create failed (%v)", err) serveError(w, err, http.StatusInternalServerError) return @@ -256,7 +256,7 @@ func (api *simAPI) startClient(w http.ResponseWriter, r *http.Request) { // Connect to the networks if requested, so it is started already joined to each one. for _, network := range networks { if err := api.tm.ConnectContainer(suiteID, network, containerID); err != nil { - log15.Error("API: failed to connect container", "network", network, "container", containerID, "error", err) + slog.Error("API: failed to connect container", "network", network, "container", containerID, "error", err) serveError(w, err, http.StatusInternalServerError) return } @@ -267,7 +267,7 @@ func (api *simAPI) startClient(w http.ResponseWriter, r *http.Request) { if portStr := env["HIVE_CHECK_LIVE_PORT"]; portStr != "" { v, err := strconv.ParseUint(portStr, 10, 16) if err != nil { - log15.Error("API: could not parse check-live port", "error", err) + slog.Error("API: could not parse check-live port", "error", err) serveError(w, err, http.StatusBadRequest) return } @@ -298,14 +298,14 @@ func (api *simAPI) startClient(w http.ResponseWriter, r *http.Request) { api.tm.RegisterNode(testID, info.ID, clientInfo) } if err != nil { - log15.Error("API: could not start client", "client", clientDef.Name, "container", containerID[:8], "error", err) + slog.Error("API: could not start client", "client", clientDef.Name, "container", containerID[:8], "error", err) err := fmt.Errorf("client did not start: %v", err) serveError(w, err, http.StatusInternalServerError) return } // It's started. - log15.Info("API: client "+clientDef.Name+" started", "suite", suiteID, "test", testID, "container", containerID[:8]) + slog.Info("API: client "+clientDef.Name+" started", "suite", suiteID, "test", testID, "container", containerID[:8]) serveJSON(w, &simapi.StartNodeResponse{ID: info.ID, IP: info.IP}) } @@ -413,7 +413,7 @@ func (api *simAPI) getNodeStatus(w http.ResponseWriter, r *http.Request) { node := mux.Vars(r)["node"] nodeInfo, err := api.tm.GetNodeInfo(suiteID, testID, node) if err != nil { - log15.Error("API: can't find node", "node", node, "error", err) + slog.Error("API: can't find node", "node", node, "error", err) serveError(w, err, http.StatusNotFound) return } @@ -431,7 +431,7 @@ func (api *simAPI) execInClient(w http.ResponseWriter, r *http.Request) { node := mux.Vars(r)["node"] nodeInfo, err := api.tm.GetNodeInfo(suiteID, testID, node) if err != nil { - log15.Error("API: can't find node", "node", node, "error", err) + slog.Error("API: can't find node", "node", node, "error", err) serveError(w, err, http.StatusNotFound) return } @@ -439,13 +439,13 @@ func (api *simAPI) execInClient(w http.ResponseWriter, r *http.Request) { // Parse and validate the exec request. commandline, err := parseExecRequest(r.Body) if err != nil { - log15.Error("API: invalid exec request", "node", node, "error", err) + slog.Error("API: invalid exec request", "node", node, "error", err) serveError(w, err, http.StatusBadRequest) return } info, err := api.backend.RunProgram(r.Context(), nodeInfo.ID, commandline) if err != nil { - log15.Error("API: client script exec error", "node", node, "error", err) + slog.Error("API: client script exec error", "node", node, "error", err) serveError(w, err, http.StatusInternalServerError) return } @@ -480,11 +480,11 @@ func (api *simAPI) networkCreate(w http.ResponseWriter, r *http.Request) { networkName := mux.Vars(r)["network"] err = api.tm.CreateNetwork(suiteID, networkName) if err != nil { - log15.Error("API: failed to create network", "network", networkName, "error", err) + slog.Error("API: failed to create network", "network", networkName, "error", err) serveError(w, err, http.StatusBadRequest) return } - log15.Info("API: network created", "name", networkName) + slog.Info("API: network created", "name", networkName) serveOK(w) } @@ -499,11 +499,11 @@ func (api *simAPI) networkRemove(w http.ResponseWriter, r *http.Request) { network := mux.Vars(r)["network"] err = api.tm.RemoveNetwork(suiteID, network) if err != nil { - log15.Error("API: failed to remove network", "network", network, "error", err) + slog.Error("API: failed to remove network", "network", network, "error", err) serveError(w, err, http.StatusInternalServerError) return } - log15.Info("API: docker network removed", "network", network) + slog.Info("API: docker network removed", "network", network) serveOK(w) } @@ -519,11 +519,11 @@ func (api *simAPI) networkIPGet(w http.ResponseWriter, r *http.Request) { network := mux.Vars(r)["network"] ipAddr, err := api.tm.ContainerIP(suiteID, network, node) if err != nil { - log15.Error("API: failed to get container IP", "container", node, "error", err) + slog.Error("API: failed to get container IP", "container", node, "error", err) serveError(w, err, http.StatusInternalServerError) return } - log15.Info("API: container IP requested", "network", network, "container", node, "ip", ipAddr) + slog.Info("API: container IP requested", "network", network, "container", node, "ip", ipAddr) serveJSON(w, ipAddr) } @@ -538,11 +538,11 @@ func (api *simAPI) networkConnect(w http.ResponseWriter, r *http.Request) { name := mux.Vars(r)["network"] containerID := mux.Vars(r)["node"] if err := api.tm.ConnectContainer(suiteID, name, containerID); err != nil { - log15.Error("API: failed to connect container", "network", name, "container", containerID, "error", err) + slog.Error("API: failed to connect container", "network", name, "container", containerID, "error", err) serveError(w, err, http.StatusInternalServerError) return } - log15.Info("API: container connected to network", "network", name, "container", containerID) + slog.Info("API: container connected to network", "network", name, "container", containerID) serveOK(w) } @@ -557,11 +557,11 @@ func (api *simAPI) networkDisconnect(w http.ResponseWriter, r *http.Request) { network := mux.Vars(r)["network"] containerID := mux.Vars(r)["node"] if err := api.tm.DisconnectContainer(suiteID, network, containerID); err != nil { - log15.Error("API: disconnecting container failed", "network", network, "container", containerID, "error", err) + slog.Error("API: disconnecting container failed", "network", network, "container", containerID, "error", err) serveError(w, err, http.StatusInternalServerError) return } - log15.Info("API: container disconnected", "network", network, "container", containerID) + slog.Info("API: container disconnected", "network", network, "container", containerID) serveOK(w) } @@ -610,7 +610,7 @@ func (api *simAPI) requestSuiteAndTest(r *http.Request) (TestSuiteID, TestID, er func serveJSON(w http.ResponseWriter, value interface{}) { resp, err := json.Marshal(value) if err != nil { - log15.Error("API: internal error while encoding response", "error", err) + slog.Error("API: internal error while encoding response", "error", err) serveError(w, errors.New("internal error"), http.StatusInternalServerError) return } diff --git a/internal/libhive/inventory.go b/internal/libhive/inventory.go index d9019fda6d..42302dfa79 100644 --- a/internal/libhive/inventory.go +++ b/internal/libhive/inventory.go @@ -3,6 +3,7 @@ package libhive import ( "fmt" "io" + "log/slog" "os" "path/filepath" "regexp" @@ -11,7 +12,6 @@ import ( "golang.org/x/exp/maps" "golang.org/x/exp/slices" - "gopkg.in/inconshreveable/log15.v2" "gopkg.in/yaml.v3" ) @@ -141,7 +141,7 @@ func findClients(dir string) (map[string]InventoryClient, error) { case strings.HasPrefix(file, "Dockerfile."): client, ok := clients[clientName] if !ok { - log15.Warn(fmt.Sprintf("found %s in directory without Dockerfile", file), "path", filepath.Dir(path)) + slog.Warn(fmt.Sprintf("found %s in directory without Dockerfile", file), "path", filepath.Dir(path)) return nil } client.Dockerfiles = append(client.Dockerfiles, strings.TrimPrefix(file, "Dockerfile.")) @@ -149,7 +149,7 @@ func findClients(dir string) (map[string]InventoryClient, error) { case file == "hive.yaml": client, ok := clients[clientName] if !ok { - log15.Warn("found hive.yaml in directory without Dockerfile", "path", filepath.Dir(path)) + slog.Warn("found hive.yaml in directory without Dockerfile", "path", filepath.Dir(path)) return nil } md, err := loadClientMetadata(path) @@ -333,7 +333,7 @@ func validateClients(inv *Inventory, list []ClientDesignator) error { // Check build arguments. for key := range c.BuildArgs { if _, ok := knownBuildArgs[key]; !ok { - log15.Warn(fmt.Sprintf("unknown build arg %q in clients.yaml file", key)) + slog.Warn(fmt.Sprintf("unknown build arg %q in clients.yaml file", key)) } } clientTags[c.Client] = clientTags[c.Client].add(c.BuildArgs["tag"]) diff --git a/internal/libhive/run.go b/internal/libhive/run.go index a50cbbf21a..7e4270d863 100644 --- a/internal/libhive/run.go +++ b/internal/libhive/run.go @@ -5,6 +5,7 @@ import ( "encoding/json" "errors" "fmt" + "log/slog" "net" "net/http" "os" @@ -13,8 +14,6 @@ import ( "strconv" "strings" "time" - - "gopkg.in/inconshreveable/log15.v2" ) var ( @@ -61,7 +60,7 @@ func (r *Runner) buildClients(ctx context.Context, clientList []ClientDesignator r.clientDefs = make([]*ClientDefinition, 0, len(clientList)) var anyBuilt bool - log15.Info(fmt.Sprintf("building %d clients...", len(clientList))) + slog.Info(fmt.Sprintf("building %d clients...", len(clientList))) for _, client := range clientList { image, err := r.builder.BuildClientImage(ctx, client) if err != nil { @@ -70,7 +69,7 @@ func (r *Runner) buildClients(ctx context.Context, clientList []ClientDesignator anyBuilt = true version, err := r.builder.ReadFile(ctx, image, "/version.txt") if err != nil { - log15.Warn("can't read version info of "+client.Client, "image", image, "err", err) + slog.Warn("can't read version info of "+client.Client, "image", image, "err", err) } r.clientDefs = append(r.clientDefs, &ClientDefinition{ Name: client.Name(), @@ -89,7 +88,7 @@ func (r *Runner) buildClients(ctx context.Context, clientList []ClientDesignator func (r *Runner) buildSimulators(ctx context.Context, simList []string, buildArgs map[string]string) error { r.simImages = make(map[string]string) - log15.Info(fmt.Sprintf("building %d simulators...", len(simList))) + slog.Info(fmt.Sprintf("building %d simulators...", len(simList))) for _, sim := range simList { image, err := r.builder.BuildSimulatorImage(ctx, sim, buildArgs) if err != nil { @@ -124,22 +123,22 @@ func (r *Runner) RunDevMode(ctx context.Context, env SimEnv, endpoint string) er tm := NewTestManager(env, r.container, clientDefs) defer func() { if err := tm.Terminate(); err != nil { - log15.Error("could not terminate test manager", "error", err) + slog.Error("could not terminate test manager", "error", err) } }() - log15.Debug("starting simulator API proxy") + slog.Debug("starting simulator API proxy") proxy, err := r.container.ServeAPI(ctx, tm.API()) if err != nil { - log15.Error("can't start proxy", "err", err) + slog.Error("can't start proxy", "err", err) return err } defer shutdownServer(proxy) - log15.Debug("starting local API server") + slog.Debug("starting local API server") listener, err := net.Listen("tcp", endpoint) if err != nil { - log15.Error("can't start TCP server", "err", err) + slog.Error("can't start TCP server", "err", err) return err } httpsrv := &http.Server{Handler: tm.API()} @@ -160,7 +159,7 @@ HIVE_SIMULATOR=http://%v // run runs one simulation. func (r *Runner) run(ctx context.Context, sim string, env SimEnv) (SimResult, error) { - log15.Info(fmt.Sprintf("running simulation: %s", sim)) + slog.Info(fmt.Sprintf("running simulation: %s", sim)) clientDefs := make([]*ClientDefinition, 0) if env.ClientList == nil { @@ -186,14 +185,14 @@ func (r *Runner) run(ctx context.Context, sim string, env SimEnv) (SimResult, er tm := NewTestManager(env, r.container, clientDefs) defer func() { if err := tm.Terminate(); err != nil { - log15.Error("could not terminate test manager", "error", err) + slog.Error("could not terminate test manager", "error", err) } }() - log15.Debug("starting simulator API server") + slog.Debug("starting simulator API server") server, err := r.container.ServeAPI(ctx, tm.API()) if err != nil { - log15.Error("can't start API server", "err", err) + slog.Error("can't start API server", "err", err) return SimResult{}, err } defer shutdownServer(server) @@ -218,12 +217,12 @@ func (r *Runner) run(ctx context.Context, sim string, env SimEnv) (SimResult, er opts.LogFile = filepath.Join(env.LogDir, logbasename) tm.SetSimContainerInfo(containerID, logbasename) - log15.Debug("starting simulator container") + slog.Debug("starting simulator container") sc, err := r.container.StartContainer(ctx, containerID, opts) if err != nil { return SimResult{}, err } - slogger := log15.New("sim", sim, "container", sc.ID[:8]) + slogger := slog.With("sim", sim, "container", sc.ID[:8]) slogger.Debug("started simulator container") defer func() { slogger.Debug("deleting simulator container") @@ -278,9 +277,9 @@ func (r *Runner) run(ctx context.Context, sim string, env SimEnv) (SimResult, er // shutdownServer gracefully terminates the HTTP server. func shutdownServer(server APIServer) { - log15.Debug("terminating simulator API server") + slog.Debug("terminating simulator API server") if err := server.Close(); err != nil { - log15.Debug("API server shutdown failed", "err", err) + slog.Debug("API server shutdown failed", "err", err) } } @@ -289,10 +288,10 @@ func createWorkspace(logdir string) error { stat, err := os.Stat(logdir) if err != nil { if os.IsNotExist(err) { - log15.Info("creating output directory", "folder", logdir) + slog.Info("creating output directory", "folder", logdir) err = os.MkdirAll(logdir, 0755) if err != nil { - log15.Crit("failed to create output directory", "err", err) + slog.Error("failed to create output directory", "err", err) } } return err @@ -314,7 +313,7 @@ func writeInstanceInfo(logdir string) { enc, _ := json.Marshal(&obj) err := os.WriteFile(filepath.Join(logdir, "hive.json"), enc, 0644) if err != nil { - log15.Warn("can't write hive.json", "err", err) + slog.Warn("can't write hive.json", "err", err) } } diff --git a/internal/libhive/testmanager.go b/internal/libhive/testmanager.go index addeb3ddfe..4f54052d64 100644 --- a/internal/libhive/testmanager.go +++ b/internal/libhive/testmanager.go @@ -5,13 +5,12 @@ import ( "encoding/json" "errors" "fmt" + "log/slog" "net/http" "os" "path/filepath" "sync" "time" - - "gopkg.in/inconshreveable/log15.v2" ) var ( @@ -230,7 +229,7 @@ func (manager *TestManager) RemoveNetwork(testSuite TestSuiteID, network string) func (manager *TestManager) PruneNetworks(testSuite TestSuiteID) []error { var errs []error for name := range manager.networks[testSuite] { - log15.Info("removing docker network", "name", name) + slog.Info("removing docker network", "name", name) if err := manager.RemoveNetwork(testSuite, name); err != nil { errs = append(errs, err) } @@ -361,7 +360,7 @@ func (manager *TestManager) doEndSuite(testSuite TestSuiteID) error { // remove the test suite's left-over docker networks. if errs := manager.PruneNetworks(testSuite); len(errs) > 0 { for _, err := range errs { - log15.Error("could not remove network", "err", err) + slog.Error("could not remove network", "err", err) } } // Move the suite to results. @@ -489,7 +488,7 @@ func (manager *TestManager) writeTestDetails(suite *TestSuite, testCase *TestCas suite.testLogOffset += int64(n) if err != nil { - log15.Error("could not write details file", "err", err) + slog.Error("could not write details file", "err", err) // Write was incomplete, so play it safe with the offsets. offsets.Begin = begin offsets.End = begin + int64(n) From 04965aa898251edac39a787debe3eb52595237ad Mon Sep 17 00:00:00 2001 From: spencer Date: Wed, 4 Dec 2024 22:36:02 +0700 Subject: [PATCH 352/387] simulators/eth/eest: use `--sim.buildarg` for consume (#1180) simulators/eth/eest: use `--sim.buildarg` for consume. --- simulators/ethereum/eest/consume-engine/Dockerfile | 6 +++++- simulators/ethereum/eest/consume-rlp/Dockerfile | 6 +++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/simulators/ethereum/eest/consume-engine/Dockerfile b/simulators/ethereum/eest/consume-engine/Dockerfile index 77855b6ede..05b91bb06b 100644 --- a/simulators/ethereum/eest/consume-engine/Dockerfile +++ b/simulators/ethereum/eest/consume-engine/Dockerfile @@ -1,6 +1,10 @@ # Builds and runs the EEST (execution-spec-tests) consume engine simulator FROM python:3.10-slim +## Default fixtures +ARG fixtures=latest-stable-release +ENV INPUT=${fixtures} + ## Install dependencies RUN apt-get update && \ apt-get install -y git wget tar && \ @@ -13,4 +17,4 @@ WORKDIR execution-spec-tests RUN pip install uv && uv sync ## Define `consume engine` entry point using the local fixtures -ENTRYPOINT ["uv", "run", "consume", "engine", "-v", "--input", "latest-stable-release"] \ No newline at end of file +ENTRYPOINT uv run consume engine -v --input "$INPUT" diff --git a/simulators/ethereum/eest/consume-rlp/Dockerfile b/simulators/ethereum/eest/consume-rlp/Dockerfile index 31a31fb85c..fab0766685 100644 --- a/simulators/ethereum/eest/consume-rlp/Dockerfile +++ b/simulators/ethereum/eest/consume-rlp/Dockerfile @@ -1,6 +1,10 @@ # Builds and runs the EEST (execution-spec-tests) consume rlp simulator FROM python:3.10-slim +## Default fixtures +ARG fixtures=latest-stable-release +ENV INPUT=${fixtures} + ## Install dependencies RUN apt-get update && \ apt-get install -y git wget tar && \ @@ -13,4 +17,4 @@ WORKDIR execution-spec-tests RUN pip install uv && uv sync ## Define `consume rlp` entry point using the local fixtures -ENTRYPOINT ["uv", "run", "consume", "rlp", "-v", "--input", "latest-stable-release"] +ENTRYPOINT uv run consume rlp -v --input "$INPUT" From 204c2007a83435000313cec84979385f926ab0ae Mon Sep 17 00:00:00 2001 From: Somnath Date: Thu, 5 Dec 2024 13:43:16 +0400 Subject: [PATCH 353/387] clients/erigon: update github repo name in git Dockerfile (#1183) --- clients/erigon/Dockerfile.git | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clients/erigon/Dockerfile.git b/clients/erigon/Dockerfile.git index 2ef82ed2e1..7eb406a9bd 100644 --- a/clients/erigon/Dockerfile.git +++ b/clients/erigon/Dockerfile.git @@ -3,7 +3,7 @@ ## Builder stage: Compiles erigon from a git repository FROM golang:1.22-alpine as builder -ARG github=ledgerwatch/erigon +ARG github=erigontech/erigon ARG tag=main RUN echo "Cloning: $github - $tag" \ From fd863988907165a27efaf8b721a9b3662b4f20ef Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Thu, 5 Dec 2024 15:09:00 +0100 Subject: [PATCH 354/387] hive: fix --sim.buildarg --- hive.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hive.go b/hive.go index 6925458da8..a423f7b862 100644 --- a/hive.go +++ b/hive.go @@ -73,7 +73,7 @@ func main() { ) // Add the sim.buildarg flag multiple times to allow multiple build arguments. - var simBuildArgs buildArgs + simBuildArgs := make(buildArgs) flag.Var(&simBuildArgs, "sim.buildarg", "Argument to pass to the docker engine when building the simulator image, in the form of ARGNAME=VALUE.") // Parse the flags and configure the logger. From 09898e60045a1b656f7438c17cbc1e7f543ca946 Mon Sep 17 00:00:00 2001 From: Rohit Ranjan Date: Fri, 6 Dec 2024 17:56:35 +0530 Subject: [PATCH 355/387] nethermind: fix dotnet9 docker image tag (#1184) --- clients/nethermind/Dockerfile.git | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clients/nethermind/Dockerfile.git b/clients/nethermind/Dockerfile.git index f559dac8de..889b1a4ee8 100644 --- a/clients/nethermind/Dockerfile.git +++ b/clients/nethermind/Dockerfile.git @@ -1,7 +1,7 @@ ### Build Nethermind From Git: ## Builder stage: Compiles nethermind from a git repository -FROM mcr.microsoft.com/dotnet/sdk:9.0-jammy AS build +FROM mcr.microsoft.com/dotnet/sdk:9.0-noble AS build ARG github=nethermindeth/nethermind ARG tag=master From 97e808a30db3050456b11dc799ed5d45dc44d912 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Mon, 16 Dec 2024 16:45:14 +0100 Subject: [PATCH 356/387] cmd/hivechain: add support for generating PoS-only chain (#1187) Here I'm adding the -pos flag to hivechain, which configures it to schedule the merge at block zero. Since clique block creation is not supported by upstream go-ethereum anymore, the -clique flag had to be removed. * cmd/hivechain: add -pos flag for merge at genesis * go.mod: upgrade to go-ethereum v1.14.12 * cmd/hivechain: remove clique support --- cmd/hivechain/generate.go | 55 ++------------------------------ cmd/hivechain/genesis.go | 66 ++++++++++++++++----------------------- cmd/hivechain/main.go | 2 +- go.mod | 34 ++++++-------------- go.sum | 64 +++++++++++++++---------------------- 5 files changed, 66 insertions(+), 155 deletions(-) diff --git a/cmd/hivechain/generate.go b/cmd/hivechain/generate.go index 6d68680b91..d0246272d0 100644 --- a/cmd/hivechain/generate.go +++ b/cmd/hivechain/generate.go @@ -8,18 +8,14 @@ import ( "math/rand" "strings" - "github.com/ethereum/go-ethereum/accounts" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/consensus" "github.com/ethereum/go-ethereum/consensus/beacon" - "github.com/ethereum/go-ethereum/consensus/clique" "github.com/ethereum/go-ethereum/consensus/ethash" "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/core/rawdb" - "github.com/ethereum/go-ethereum/core/state" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/core/vm" - "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/ethdb" "github.com/ethereum/go-ethereum/triedb" "golang.org/x/exp/slices" @@ -30,7 +26,7 @@ type generatorConfig struct { // genesis options forkInterval int // number of blocks between forks lastFork string // last enabled fork - clique bool // create a clique chain + merged bool // create a proof-of-stake chain // chain options txInterval int // frequency of blocks containing transactions @@ -133,18 +129,7 @@ func (g *generator) run() error { } func (g *generator) createConsensusEngine(db ethdb.Database) consensus.Engine { - var inner consensus.Engine - if g.genesis.Config.Clique != nil { - cliqueEngine := clique.New(g.genesis.Config.Clique, db) - cliqueEngine.Authorize(cliqueSignerAddr, func(signer accounts.Account, mimeType string, message []byte) ([]byte, error) { - sig, err := crypto.Sign(crypto.Keccak256(message), cliqueSignerKey) - return sig, err - }) - inner = instaSeal{cliqueEngine} - } else { - inner = ethash.NewFaker() - } - return beacon.New(inner) + return beacon.New(ethash.NewFaker()) } func (g *generator) importChain(engine consensus.Engine, chain []*types.Block) (*core.BlockChain, error) { @@ -152,7 +137,7 @@ func (g *generator) importChain(engine consensus.Engine, chain []*types.Block) ( cacheconfig := core.DefaultCacheConfigWithScheme("hash") cacheconfig.Preimages = true vmconfig := vm.Config{EnablePreimageRecording: true} - blockchain, err := core.NewBlockChain(db, cacheconfig, g.genesis, nil, engine, vmconfig, nil, nil) + blockchain, err := core.NewBlockChain(db, cacheconfig, g.genesis, nil, engine, vmconfig, nil) if err != nil { return nil, fmt.Errorf("can't create blockchain: %v", err) } @@ -167,27 +152,11 @@ func (g *generator) importChain(engine consensus.Engine, chain []*types.Block) ( func (g *generator) modifyBlock(i int, gen *core.BlockGen) { fmt.Println("generating block", gen.Number()) - if g.genesis.Config.Clique != nil { - g.setClique(i, gen) - } g.setDifficulty(i, gen) g.setParentBeaconRoot(i, gen) g.runModifiers(i, gen) } -func (g *generator) setClique(i int, gen *core.BlockGen) { - mergeblock := g.genesis.Config.MergeNetsplitBlock - if mergeblock != nil && gen.Number().Cmp(mergeblock) >= 0 { - return - } - - gen.SetCoinbase(cliqueSignerAddr) - // Add a positive vote to keep the signer in the set. - gen.SetNonce(types.BlockNonce{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}) - // The clique engine requires the block to have blank extra-data of the correct length before sealing. - gen.SetExtra(make([]byte, 32+65)) -} - func (g *generator) setDifficulty(i int, gen *core.BlockGen) { chaincfg := g.genesis.Config mergeblock := chaincfg.MergeNetsplitBlock @@ -256,21 +225,3 @@ func (g *generator) runModifiers(i int, gen *core.BlockGen) { g.modOffset++ } } - -// instaSeal wraps a consensus engine with instant block sealing. When a block is produced -// using FinalizeAndAssemble, it also applies Seal. -type instaSeal struct{ consensus.Engine } - -// FinalizeAndAssemble implements consensus.Engine, accumulating the block and uncle rewards, -// setting the final state and assembling the block. -func (e instaSeal) FinalizeAndAssemble(chain consensus.ChainHeaderReader, header *types.Header, state *state.StateDB, body *types.Body, receipts []*types.Receipt) (*types.Block, error) { - block, err := e.Engine.FinalizeAndAssemble(chain, header, state, body, receipts) - if err != nil { - return nil, err - } - sealedBlock := make(chan *types.Block, 1) - if err = e.Engine.Seal(chain, block, sealedBlock, nil); err != nil { - return nil, err - } - return <-sealedBlock, nil -} diff --git a/cmd/hivechain/genesis.go b/cmd/hivechain/genesis.go index f96bbdefe9..5470f38420 100644 --- a/cmd/hivechain/genesis.go +++ b/cmd/hivechain/genesis.go @@ -1,14 +1,13 @@ package main import ( - "crypto/ecdsa" "fmt" "math/big" "strings" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core" - "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/params" "golang.org/x/exp/slices" ) @@ -18,20 +17,15 @@ var initialBalance, _ = new(big.Int).SetString("10000000000000000000000000000000 const ( genesisBaseFee = params.InitialBaseFee blocktimeSec = 10 // hard-coded in core.GenerateChain - cliqueEpoch = 30000 -) - -var ( - cliqueSignerKey = knownAccounts[8].key - cliqueSignerAddr = crypto.PubkeyToAddress(cliqueSignerKey.PublicKey) ) // Ethereum mainnet forks in order of introduction. var ( - allForkNames = append(numberBasedForkNames, timeBasedForkNames...) + allForkNames = append(preMergeForkNames, posForkNames...) lastFork = allForkNames[len(allForkNames)-1] - numberBasedForkNames = []string{ + // these are block-number based: + preMergeForkNames = []string{ "homestead", "tangerinewhistle", "spuriousdragon", @@ -47,7 +41,8 @@ var ( "merge", } - timeBasedForkNames = []string{ + // forks after the merge are timestamp-based: + posForkNames = []string{ "shanghai", "cancun", "prague", @@ -62,14 +57,7 @@ func (cfg *generatorConfig) createChainConfig() *params.ChainConfig { chaincfg.ChainID = chainid // Set consensus algorithm. - if cfg.clique { - chaincfg.Clique = ¶ms.CliqueConfig{ - Period: blocktimeSec, - Epoch: cliqueEpoch, - } - } else { - chaincfg.Ethash = new(params.EthashConfig) - } + chaincfg.Ethash = new(params.EthashConfig) // Apply forks. forks := cfg.forkBlocks() @@ -105,7 +93,6 @@ func (cfg *generatorConfig) createChainConfig() *params.ChainConfig { chaincfg.GrayGlacierBlock = new(big.Int).SetUint64(b) case "merge": chaincfg.MergeNetsplitBlock = new(big.Int).SetUint64(b) - chaincfg.TerminalTotalDifficultyPassed = true // time-based forks case "shanghai": chaincfg.ShanghaiTime = ×tamp @@ -128,9 +115,6 @@ func (cfg *generatorConfig) createChainConfig() *params.ChainConfig { } func (cfg *generatorConfig) genesisDifficulty() *big.Int { - if cfg.clique { - return big.NewInt(1) - } return new(big.Int).Set(params.MinimumDifficulty) } @@ -141,11 +125,7 @@ func (cfg *generatorConfig) createGenesis() *core.Genesis { // Block attributes. g.Difficulty = cfg.genesisDifficulty() - if cfg.clique { - g.ExtraData = cliqueInit(cliqueSignerKey) - } else { - g.ExtraData = []byte("hivechain") - } + g.ExtraData = []byte("hivechain") g.GasLimit = params.GenesisGasLimit * 8 zero := new(big.Int) if g.Config.IsLondon(zero) { @@ -154,9 +134,9 @@ func (cfg *generatorConfig) createGenesis() *core.Genesis { // Initialize allocation. // Here we add balance to known accounts and initialize built-in contracts. - g.Alloc = make(core.GenesisAlloc) + g.Alloc = make(types.GenesisAlloc) for _, acc := range knownAccounts { - g.Alloc[acc.addr] = core.GenesisAccount{Balance: initialBalance} + g.Alloc[acc.addr] = types.Account{Balance: initialBalance} } add4788Contract(g.Alloc) addSnapTestContract(g.Alloc) @@ -203,12 +183,29 @@ func (cfg *generatorConfig) forkBlocks() map[string]uint64 { lastIndex := cfg.lastForkIndex() forks := allForkNames[:lastIndex+1] forkBlocks := make(map[string]uint64) + + // If merged chain is specified, schedule all pre-merge forks at block zero. + if cfg.merged { + for _, fork := range preMergeForkNames { + if len(forks) == 0 { + break + } + forkBlocks[fork] = 0 + if forks[0] != fork { + panic("unexpected fork in allForkNames: " + forks[0]) + } + forks = forks[1:] + } + } + // Schedule remaining forks according to interval. for block := 0; block <= cfg.chainLength && len(forks) > 0; { fork := forks[0] forks = forks[1:] forkBlocks[fork] = uint64(block) block += cfg.forkInterval } + // If the chain length cannot accomodate the spread of forks with the chosen + // interval, schedule the remaining forks at the last block. for _, f := range forks { forkBlocks[f] = uint64(cfg.chainLength) } @@ -230,12 +227,3 @@ func (cfg *generatorConfig) lastForkIndex() int { func (cfg *generatorConfig) blockTimestamp(num uint64) uint64 { return num * blocktimeSec } - -// cliqueInit creates the genesis extradata for a clique network with one signer. -func cliqueInit(signer *ecdsa.PrivateKey) []byte { - vanity := make([]byte, 32) - copy(vanity, "hivechain") - d := append(vanity, cliqueSignerAddr[:]...) - d = append(d, make([]byte, 65)...) // signature - return d -} diff --git a/cmd/hivechain/main.go b/cmd/hivechain/main.go index e7890c1f83..4ac1f4381c 100644 --- a/cmd/hivechain/main.go +++ b/cmd/hivechain/main.go @@ -67,7 +67,7 @@ func generateCommand(args []string) { flag.IntVar(&cfg.forkInterval, "fork-interval", 0, "Number of blocks between fork activations") flag.StringVar(&cfg.outputDir, "outdir", ".", "Destination directory") flag.StringVar(&cfg.lastFork, "lastfork", "", "Name of the last fork to activate") - flag.BoolVar(&cfg.clique, "clique", false, "Create a clique chain") + flag.BoolVar(&cfg.merged, "pos", false, "Create a PoS (merged) chain") flag.CommandLine.Parse(args) if *outlist != "" { diff --git a/go.mod b/go.mod index ec89bcf54b..c580349461 100644 --- a/go.mod +++ b/go.mod @@ -1,18 +1,18 @@ module github.com/ethereum/hive -go 1.21 +go 1.22 -toolchain go1.22.1 +toolchain go1.23.4 require ( github.com/davecgh/go-spew v1.1.1 - github.com/ethereum/go-ethereum v1.14.5 + github.com/ethereum/go-ethereum v1.14.12 github.com/ethereum/hive/hiveproxy v0.0.0-20240610172618-786a798a0cfe github.com/evanw/esbuild v0.18.11 github.com/fsouza/go-dockerclient v1.11.2 - github.com/golang-jwt/jwt/v4 v4.5.0 + github.com/golang-jwt/jwt/v4 v4.5.1 github.com/gorilla/mux v1.8.1 - github.com/holiman/uint256 v1.2.4 + github.com/holiman/uint256 v1.3.1 github.com/lithammer/dedent v1.1.0 github.com/lmittmann/tint v1.0.5 golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa @@ -26,15 +26,8 @@ require ( github.com/Microsoft/go-winio v0.6.2 // indirect github.com/VictoriaMetrics/fastcache v1.12.2 // indirect github.com/allegro/bigcache v1.2.1 // indirect - github.com/beorn7/perks v1.0.1 // indirect - github.com/bits-and-blooms/bitset v1.10.0 // indirect - github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect + github.com/bits-and-blooms/bitset v1.13.0 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect - github.com/cockroachdb/errors v1.11.1 // indirect - github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect - github.com/cockroachdb/pebble v1.1.0 // indirect - github.com/cockroachdb/redact v1.1.5 // indirect - github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect github.com/consensys/bavard v0.1.13 // indirect github.com/consensys/gnark-crypto v0.12.1 // indirect github.com/containerd/containerd v1.6.26 // indirect @@ -47,21 +40,16 @@ require ( github.com/docker/go-connections v0.4.0 // indirect github.com/docker/go-units v0.5.0 // indirect github.com/ethereum/c-kzg-4844 v1.0.0 // indirect - github.com/ethereum/go-verkle v0.1.1-0.20240306133620-7d920df305f0 // indirect - github.com/getsentry/sentry-go v0.18.0 // indirect + github.com/ethereum/go-verkle v0.1.1-0.20240829091221-dffa7562dbe9 // indirect github.com/go-ole/go-ole v1.3.0 // indirect github.com/gofrs/flock v0.8.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang/protobuf v1.5.4 // indirect github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect github.com/gorilla/websocket v1.5.0 // indirect github.com/hashicorp/yamux v0.1.1 // indirect github.com/holiman/bloomfilter/v2 v2.0.3 // indirect - github.com/klauspost/compress v1.15.15 // indirect - github.com/kr/pretty v0.3.1 // indirect - github.com/kr/text v0.2.0 // indirect + github.com/klauspost/compress v1.16.0 // indirect github.com/mattn/go-runewidth v0.0.14 // indirect - github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect github.com/mmcloughlin/addchain v0.4.0 // indirect github.com/moby/docker-image-spec v1.3.1 // indirect github.com/moby/patternmatcher v0.6.0 // indirect @@ -74,14 +62,12 @@ require ( github.com/opencontainers/image-spec v1.1.0-rc2.0.20221005185240-3a7f492d3f1b // indirect github.com/pkg/errors v0.9.1 // indirect github.com/prometheus/client_golang v1.14.0 // indirect - github.com/prometheus/client_model v0.3.0 // indirect github.com/prometheus/common v0.39.0 // indirect github.com/prometheus/procfs v0.9.0 // indirect github.com/rivo/uniseg v0.4.3 // indirect - github.com/rogpeppe/go-internal v1.9.0 // indirect github.com/shirou/gopsutil v3.21.11+incompatible // indirect github.com/sirupsen/logrus v1.9.3 // indirect - github.com/supranational/blst v0.3.11 // indirect + github.com/supranational/blst v0.3.13 // indirect github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a // indirect github.com/tklauser/go-sysconf v0.3.12 // indirect github.com/tklauser/numcpus v0.6.1 // indirect @@ -89,8 +75,6 @@ require ( golang.org/x/crypto v0.22.0 // indirect golang.org/x/sync v0.7.0 // indirect golang.org/x/sys v0.22.0 // indirect - golang.org/x/text v0.14.0 // indirect - google.golang.org/protobuf v1.33.0 // indirect rsc.io/tmplfunc v0.0.3 // indirect ) diff --git a/go.sum b/go.sum index 82467817fa..44909dcced 100644 --- a/go.sum +++ b/go.sum @@ -13,26 +13,22 @@ github.com/allegro/bigcache v1.2.1 h1:hg1sY1raCwic3Vnsvje6TT7/pnZba83LeFck5NrFKS github.com/allegro/bigcache v1.2.1/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bits-and-blooms/bitset v1.10.0 h1:ePXTeiPEazB5+opbv5fr8umg2R/1NlzgDsyepwsSr88= -github.com/bits-and-blooms/bitset v1.10.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= -github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U= -github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= -github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= -github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= +github.com/bits-and-blooms/bitset v1.13.0 h1:bAQ9OPNFYbGHV6Nez0tmNI0RiEu7/hxlYJRUA0wFAVE= +github.com/bits-and-blooms/bitset v1.13.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f h1:otljaYPt5hWxV3MUfO5dFPFiOXg9CyG5/kCfayTqsJ4= -github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= -github.com/cockroachdb/errors v1.11.1 h1:xSEW75zKaKCWzR3OfxXUxgrk/NtT4G1MiOv5lWZazG8= -github.com/cockroachdb/errors v1.11.1/go.mod h1:8MUxA3Gi6b25tYlFEBGLf+D8aISL+M4MIpiWMSNRfxw= +github.com/cockroachdb/errors v1.11.3 h1:5bA+k2Y6r+oz/6Z/RFlNeVCesGARKuC6YymtcDrbC/I= +github.com/cockroachdb/errors v1.11.3/go.mod h1:m4UIW4CDjx+R5cybPsNrRbreomiFqt8o1h1wUVazSd8= +github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce h1:giXvy4KSc/6g/esnpM7Geqxka4WSqI1SZc7sMJFd3y4= +github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce/go.mod h1:9/y3cnZ5GKakj/H4y9r9GTjCvAFta7KLgSHPJJYc52M= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= -github.com/cockroachdb/pebble v1.1.0 h1:pcFh8CdCIt2kmEpK0OIatq67Ln9uGDYY3d5XnE0LJG4= -github.com/cockroachdb/pebble v1.1.0/go.mod h1:sEHm5NOXxyiAoKWhoFxT8xMgd/f3RA6qUqQ1BXKrh2E= +github.com/cockroachdb/pebble v1.1.2 h1:CUh2IPtR4swHlEj48Rhfzw6l/d0qA31fItcIszQVIsA= +github.com/cockroachdb/pebble v1.1.2/go.mod h1:4exszw1r40423ZsmkG/09AFEG83I0uDgfujJdbL6kYU= github.com/cockroachdb/redact v1.1.5 h1:u1PMllDkdFfPWaNGMyLD1+so+aq3uUItthCFqzwPJ30= github.com/cockroachdb/redact v1.1.5/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo= @@ -49,7 +45,6 @@ github.com/crate-crypto/go-ipa v0.0.0-20240223125850-b1e8a79f509c h1:uQYC5Z1mdLR github.com/crate-crypto/go-ipa v0.0.0-20240223125850-b1e8a79f509c/go.mod h1:geZJZH3SzKCqnz5VT0q/DyIG/tvu/dZk+VIfXicupJs= github.com/crate-crypto/go-kzg-4844 v1.0.0 h1:TsSgHwrkTKecKJ4kadtHi4b3xHW5dCFUDFnUp1TsawI= github.com/crate-crypto/go-kzg-4844 v1.0.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/creack/pty v1.1.11 h1:07n33Z8lZxZ2qwegKbObQohDhXDQxiMMz1NOUGYlesw= github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -69,10 +64,10 @@ github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4 github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/ethereum/c-kzg-4844 v1.0.0 h1:0X1LBXxaEtYD9xsyj9B9ctQEZIpnvVDeoBx8aHEwTNA= github.com/ethereum/c-kzg-4844 v1.0.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= -github.com/ethereum/go-ethereum v1.14.5 h1:szuFzO1MhJmweXjoM5nSAeDvjNUH3vIQoMzzQnfvjpw= -github.com/ethereum/go-ethereum v1.14.5/go.mod h1:VEDGGhSxY7IEjn98hJRFXl/uFvpRgbIIf2PpXiyGGgc= -github.com/ethereum/go-verkle v0.1.1-0.20240306133620-7d920df305f0 h1:KrE8I4reeVvf7C1tm8elRjj4BdscTYzz/WAbYyf/JI4= -github.com/ethereum/go-verkle v0.1.1-0.20240306133620-7d920df305f0/go.mod h1:D9AJLVXSyZQXJQVk8oh1EwjISE+sJTn2duYIZC0dy3w= +github.com/ethereum/go-ethereum v1.14.12 h1:8hl57x77HSUo+cXExrURjU/w1VhL+ShCTJrTwcCQSe4= +github.com/ethereum/go-ethereum v1.14.12/go.mod h1:RAC2gVMWJ6FkxSPESfbshrcKpIokgQKsVKmAuqdekDY= +github.com/ethereum/go-verkle v0.1.1-0.20240829091221-dffa7562dbe9 h1:8NfxH2iXvJ60YRB8ChToFTUzl8awsc3cJ8CbLjGIl/A= +github.com/ethereum/go-verkle v0.1.1-0.20240829091221-dffa7562dbe9/go.mod h1:M3b90YRnzqKyyzBEWJGqj8Qff4IDeXnzFw0P9bFw3uk= github.com/evanw/esbuild v0.18.11 h1:Mb0qb9KyJQraob0Y7LA0DOdD8ijJs2TxhqgqrDeGq4w= github.com/evanw/esbuild v0.18.11/go.mod h1:iINY06rn799hi48UqEnaQvVfZWe6W9bET78LbvN8VWk= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= @@ -82,10 +77,8 @@ github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4 github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= github.com/fsouza/go-dockerclient v1.11.2 h1:Wos4OMUwIjOW2rt8Z10TZSJHxgQH0KcYyf3O86dqFII= github.com/fsouza/go-dockerclient v1.11.2/go.mod h1:HZN6ky2Mg5mfZO/WZBFDe6XCricqTnDJntfXHZTYnQQ= -github.com/getsentry/sentry-go v0.18.0 h1:MtBW5H9QgdcJabtZcuJG80BMOwaBpkRDZkxRkNC1sN0= -github.com/getsentry/sentry-go v0.18.0/go.mod h1:Kgon4Mby+FJ7ZWHFUAZgVaIa8sxHtnRJRLTXZr51aKQ= -github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= -github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= +github.com/getsentry/sentry-go v0.27.0 h1:Pv98CIbtB3LkMWmXi4Joa5OOcwbmnX88sF5qbK3r3Ps= +github.com/getsentry/sentry-go v0.27.0/go.mod h1:lc76E2QywIyW8WuBnwl8Lc4bkmQH4+w1gwTf25trprY= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= @@ -94,10 +87,9 @@ github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= -github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= +github.com/golang-jwt/jwt/v4 v4.5.1 h1:JdqV9zKUdtaa9gdPlywC3aeoEsR681PlKC+4F5gQgeo= +github.com/golang-jwt/jwt/v4 v4.5.1/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= @@ -127,14 +119,14 @@ github.com/hashicorp/yamux v0.1.1 h1:yrQxtgseBDrq9Y652vSRDvsKCJKOUD+GzTS4Y0Y8pvE github.com/hashicorp/yamux v0.1.1/go.mod h1:CtWFDAQgb7dxtzFs4tWbplKIe2jSi3+5vKbgIO0SLnQ= github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao= github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA= -github.com/holiman/uint256 v1.2.4 h1:jUc4Nk8fm9jZabQuqr2JzednajVmBpC+oiTiXZJEApU= -github.com/holiman/uint256 v1.2.4/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXeiRV4ng7E= +github.com/holiman/uint256 v1.3.1 h1:JfTzmih28bittyHM8z360dCjIA9dbPIBlcTI6lmctQs= +github.com/holiman/uint256 v1.3.1/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXeiRV4ng7E= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.15.15 h1:EF27CXIuDsYJ6mmvtBRlEuB2UVOqHG1tAXgZ7yIO+lw= -github.com/klauspost/compress v1.15.15/go.mod h1:ZcK2JAFqKOpnBlxcLsJzYfrS9X1akm9fHZNnD9+Vo/4= +github.com/klauspost/compress v1.16.0 h1:iULayQNOReoYUe+1qtKOqw9CwJv3aNQu8ivo7lw1HU4= +github.com/klauspost/compress v1.16.0/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= @@ -187,9 +179,6 @@ github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8 github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opencontainers/image-spec v1.1.0-rc2.0.20221005185240-3a7f492d3f1b h1:YWuSjZCQAPM8UUBLkYUk1e+rZcvWHJmFb6i6rM44Xs8= github.com/opencontainers/image-spec v1.1.0-rc2.0.20221005185240-3a7f492d3f1b/go.mod h1:3OVijpioIKYWTqjiG0zfF6wvoJ4fAXGbjdZuI2NgsRQ= -github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= -github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= -github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= @@ -218,10 +207,10 @@ github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UV github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= -github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= -github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/supranational/blst v0.3.11 h1:LyU6FolezeWAhvQk0k6O/d49jqgO52MSDDfYgbeoEm4= -github.com/supranational/blst v0.3.11/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/supranational/blst v0.3.13 h1:AYeSxdOMacwu7FBmpfloBz5pbFXDmJL33RuwnKtmTjk= +github.com/supranational/blst v0.3.13/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a h1:1ur3QoCqvE5fl+nylMaIr9PVV1w343YRDtsy+Rwu7XI= github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a/go.mod h1:RRCYJbIwD5jmqPI9XoAFR0OcDxqUctll6zUj/+B4S48= github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= @@ -254,7 +243,6 @@ golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug golang.org/x/net v0.24.0 h1:1PcaxkF854Fu3+lvBIx5SYn9wRlBzzcnHZSiaFFAb0w= golang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -314,8 +302,8 @@ google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzi google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= -google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg= +google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= From 3d058ddb3dc5fe4e507f8b1c483b2dcda12e5eeb Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Tue, 17 Dec 2024 16:24:02 +0100 Subject: [PATCH 357/387] cmd/hivechain: add support for prague fork concepts (#1188) Here I'm adding some prague-specific interactions to the test chain: - There is a new block modifier that sends a EIP-7702 SetCode transaction, creating a delegation to a test contract. - New system contracts are deployed in genesis. - A withdrawal request (EIP-7002) is raised to the withdrawals system contract. - The engine API output now supports the engine_newPayloadV4 method with requests. --- cmd/hivechain/accounts.go | 5 +- cmd/hivechain/bytecode/7702account.bin | 1 + cmd/hivechain/compile.sh | 17 +-- cmd/hivechain/contracts.go | 3 + cmd/hivechain/contracts/7702account.eas | 22 +++ cmd/hivechain/contracts/gencode.eas | 2 +- cmd/hivechain/contracts/genlogs.eas | 2 +- cmd/hivechain/contracts/{ => lib}/rng.eas | 0 cmd/hivechain/generate.go | 31 ++--- cmd/hivechain/genesis.go | 25 ++-- cmd/hivechain/mod.go | 2 +- cmd/hivechain/mod_7702.go | 159 ++++++++++++++++++++++ cmd/hivechain/mod_deploy.go | 16 ++- cmd/hivechain/mod_requests.go | 62 +++++++++ cmd/hivechain/output_engine.go | 12 +- go.mod | 24 ++-- go.sum | 64 ++++----- 17 files changed, 351 insertions(+), 96 deletions(-) create mode 100644 cmd/hivechain/bytecode/7702account.bin create mode 100644 cmd/hivechain/contracts/7702account.eas rename cmd/hivechain/contracts/{ => lib}/rng.eas (100%) create mode 100644 cmd/hivechain/mod_7702.go create mode 100644 cmd/hivechain/mod_requests.go diff --git a/cmd/hivechain/accounts.go b/cmd/hivechain/accounts.go index 8d995aef0b..ef5b3edfb7 100644 --- a/cmd/hivechain/accounts.go +++ b/cmd/hivechain/accounts.go @@ -84,10 +84,7 @@ var knownAccounts = []genAccount{ key: mustParseKey("25e6ce8611cefb5cd338aeaa9292ed2139714668d123a4fb156cabb42051b5b7"), addr: common.HexToAddress("0x1F5BDe34B4afC686f136c7a3CB6EC376F7357759"), }, - { - key: mustParseKey("14cdde09d1640eb8c3cda063891b0453073f57719583381ff78811efa6d4199f"), - addr: common.HexToAddress("0xedA8645bA6948855E3B3cD596bbB07596d59c603"), - }, + mod7702Account, } func mustParseKey(s string) *ecdsa.PrivateKey { diff --git a/cmd/hivechain/bytecode/7702account.bin b/cmd/hivechain/bytecode/7702account.bin new file mode 100644 index 0000000000..742bc9bf26 --- /dev/null +++ b/cmd/hivechain/bytecode/7702account.bin @@ -0,0 +1 @@ +6` W_5_U[0_R_T` R \ No newline at end of file diff --git a/cmd/hivechain/compile.sh b/cmd/hivechain/compile.sh index 554fa952df..e2d3d0a071 100755 --- a/cmd/hivechain/compile.sh +++ b/cmd/hivechain/compile.sh @@ -1,12 +1,9 @@ -#!/bin/sh +#!/bin/env bash -set -xe +set -e -geas -bin -no-push0 contracts/deployer.eas > bytecode/deployer.bin -geas -bin -no-push0 contracts/callenv.eas > bytecode/callenv.bin -geas -bin -no-push0 contracts/callme.eas > bytecode/callme.bin -geas -bin -no-push0 contracts/callrevert.eas > bytecode/callrevert.bin -geas -bin -no-push0 contracts/emit.eas > bytecode/emit.bin -geas -bin -no-push0 contracts/genlogs.eas > bytecode/genlogs.bin -geas -bin -no-push0 contracts/gencode.eas > bytecode/gencode.bin -geas -bin -no-push0 contracts/genstorage.eas > bytecode/genstorage.bin +for contract in contracts/*.eas; do + output=bytecode/$(basename ${contract%.*}).bin + echo $contract "->" $output + geas -a -bin -o $output $contract +done diff --git a/cmd/hivechain/contracts.go b/cmd/hivechain/contracts.go index e171b9e4d0..9d2703224c 100644 --- a/cmd/hivechain/contracts.go +++ b/cmd/hivechain/contracts.go @@ -26,6 +26,9 @@ var callrevertCode []byte //go:embed bytecode/emit.bin var emitCode []byte +//go:embed bytecode/7702account.bin +var mod7702AccountCode []byte + // //go:embed bytecode/deposit.bin // var depositCode []byte // diff --git a/cmd/hivechain/contracts/7702account.eas b/cmd/hivechain/contracts/7702account.eas new file mode 100644 index 0000000000..8ee332f652 --- /dev/null +++ b/cmd/hivechain/contracts/7702account.eas @@ -0,0 +1,22 @@ +;;; This code is installed as a delegation destination for testing EIP-7702. + +#pragma target "prague" + + calldatasize ; [size] + iszero ; [size == 0] + jumpi @return ; [] + + push 0 ; [offset] + calldataload ; [input] + push 0 ; [slot, input] + sstore ; [] + +return: + address ; [addr] + push 0 ; [ptr, addr] + mstore ; [] + + push 0 ; [slot] + sload ; [value] + push 32 ; [ptr, value] + mstore ; [] diff --git a/cmd/hivechain/contracts/gencode.eas b/cmd/hivechain/contracts/gencode.eas index f8de99c8bb..95ad119f24 100644 --- a/cmd/hivechain/contracts/gencode.eas +++ b/cmd/hivechain/contracts/gencode.eas @@ -3,7 +3,7 @@ #pragma target "frontier" -#include "rng.eas" +#include "lib/rng.eas" #define outputSize = 256 diff --git a/cmd/hivechain/contracts/genlogs.eas b/cmd/hivechain/contracts/genlogs.eas index 879a2abaf4..003fa66b66 100644 --- a/cmd/hivechain/contracts/genlogs.eas +++ b/cmd/hivechain/contracts/genlogs.eas @@ -3,7 +3,7 @@ #pragma target "frontier" -#include "rng.eas" +#include "lib/rng.eas" %RngInit(0) ; [] diff --git a/cmd/hivechain/contracts/rng.eas b/cmd/hivechain/contracts/lib/rng.eas similarity index 100% rename from cmd/hivechain/contracts/rng.eas rename to cmd/hivechain/contracts/lib/rng.eas diff --git a/cmd/hivechain/generate.go b/cmd/hivechain/generate.go index d0246272d0..a2c060966a 100644 --- a/cmd/hivechain/generate.go +++ b/cmd/hivechain/generate.go @@ -16,7 +16,6 @@ import ( "github.com/ethereum/go-ethereum/core/rawdb" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/core/vm" - "github.com/ethereum/go-ethereum/ethdb" "github.com/ethereum/go-ethereum/triedb" "golang.org/x/exp/slices" ) @@ -67,6 +66,7 @@ type generator struct { // for write/export blockchain *core.BlockChain + clRequests map[uint64][][]byte } type modifierInstance struct { @@ -82,12 +82,13 @@ type genAccount struct { func newGenerator(cfg generatorConfig) *generator { genesis := cfg.createGenesis() return &generator{ - cfg: cfg, - genesis: genesis, - rand: rand.New(rand.NewSource(10)), - td: new(big.Int).Set(genesis.Difficulty), - virgins: cfg.createBlockModifiers(), - accounts: slices.Clone(knownAccounts), + cfg: cfg, + genesis: genesis, + rand: rand.New(rand.NewSource(10)), + td: new(big.Int).Set(genesis.Difficulty), + virgins: cfg.createBlockModifiers(), + accounts: slices.Clone(knownAccounts), + clRequests: make(map[uint64][][]byte), } } @@ -107,13 +108,14 @@ func (cfg *generatorConfig) createBlockModifiers() (list []*modifierInstance) { // run produces a chain and writes it. func (g *generator) run() error { db := rawdb.NewMemoryDatabase() - engine := g.createConsensusEngine(db) + engine := beacon.New(ethash.NewFaker()) // Init genesis block. trieconfig := *triedb.HashDefaults trieconfig.Preimages = true triedb := triedb.NewDatabase(db, &trieconfig) genesis := g.genesis.MustCommit(db, triedb) + g.clRequests[0] = [][]byte{} // Create the blocks. chain, _ := core.GenerateChain(g.genesis.Config, genesis, engine, db, g.cfg.chainLength, g.modifyBlock) @@ -128,10 +130,6 @@ func (g *generator) run() error { return g.write() } -func (g *generator) createConsensusEngine(db ethdb.Database) consensus.Engine { - return beacon.New(ethash.NewFaker()) -} - func (g *generator) importChain(engine consensus.Engine, chain []*types.Block) (*core.BlockChain, error) { db := rawdb.NewMemoryDatabase() cacheconfig := core.DefaultCacheConfigWithScheme("hash") @@ -152,12 +150,13 @@ func (g *generator) importChain(engine consensus.Engine, chain []*types.Block) ( func (g *generator) modifyBlock(i int, gen *core.BlockGen) { fmt.Println("generating block", gen.Number()) - g.setDifficulty(i, gen) - g.setParentBeaconRoot(i, gen) + g.setDifficulty(gen) + g.setParentBeaconRoot(gen) g.runModifiers(i, gen) + g.clRequests[gen.Number().Uint64()] = gen.ConsensusLayerRequests() } -func (g *generator) setDifficulty(i int, gen *core.BlockGen) { +func (g *generator) setDifficulty(gen *core.BlockGen) { chaincfg := g.genesis.Config mergeblock := chaincfg.MergeNetsplitBlock if mergeblock == nil { @@ -174,7 +173,7 @@ func (g *generator) setDifficulty(i int, gen *core.BlockGen) { } } -func (g *generator) setParentBeaconRoot(i int, gen *core.BlockGen) { +func (g *generator) setParentBeaconRoot(gen *core.BlockGen) { if g.genesis.Config.IsCancun(gen.Number(), gen.Timestamp()) { var h common.Hash g.rand.Read(h[:]) diff --git a/cmd/hivechain/genesis.go b/cmd/hivechain/genesis.go index 5470f38420..6fa2ee49eb 100644 --- a/cmd/hivechain/genesis.go +++ b/cmd/hivechain/genesis.go @@ -138,24 +138,31 @@ func (cfg *generatorConfig) createGenesis() *core.Genesis { for _, acc := range knownAccounts { g.Alloc[acc.addr] = types.Account{Balance: initialBalance} } - add4788Contract(g.Alloc) + addCancunSystemContracts(g.Alloc) + addPragueSystemContracts(g.Alloc) addSnapTestContract(g.Alloc) addEmitContract(g.Alloc) return &g } -func add4788Contract(ga core.GenesisAlloc) { - ga[params.BeaconRootsAddress] = core.GenesisAccount{ +func addCancunSystemContracts(ga types.GenesisAlloc) { + ga[params.BeaconRootsAddress] = types.Account{ Balance: big.NewInt(42), - Code: common.FromHex("0x3373fffffffffffffffffffffffffffffffffffffffe14604d57602036146024575f5ffd5b5f35801560495762001fff810690815414603c575f5ffd5b62001fff01545f5260205ff35b5f5ffd5b62001fff42064281555f359062001fff015500"), + Code: params.BeaconRootsCode, } } -func addSnapTestContract(ga core.GenesisAlloc) { +func addPragueSystemContracts(ga types.GenesisAlloc) { + ga[params.HistoryStorageAddress] = types.Account{Balance: big.NewInt(1), Code: params.HistoryStorageCode} + ga[params.WithdrawalQueueAddress] = types.Account{Balance: big.NewInt(1), Code: params.WithdrawalQueueCode} + ga[params.ConsolidationQueueAddress] = types.Account{Balance: big.NewInt(1), Code: params.ConsolidationQueueCode} +} + +func addSnapTestContract(ga types.GenesisAlloc) { addr := common.HexToAddress("0x8bebc8ba651aee624937e7d897853ac30c95a067") h := common.HexToHash - ga[addr] = core.GenesisAccount{ + ga[addr] = types.Account{ Balance: big.NewInt(1), Nonce: 1, Storage: map[common.Hash]common.Hash{ @@ -168,11 +175,11 @@ func addSnapTestContract(ga core.GenesisAlloc) { const emitAddr = "0x7dcd17433742f4c0ca53122ab541d0ba67fc27df" -func addEmitContract(ga core.GenesisAlloc) { +func addEmitContract(ga types.GenesisAlloc) { addr := common.HexToAddress(emitAddr) - ga[addr] = core.GenesisAccount{ - Balance: new(big.Int), + ga[addr] = types.Account{ Code: emitCode, + Balance: new(big.Int), } } diff --git a/cmd/hivechain/mod.go b/cmd/hivechain/mod.go index d39df135b2..b0e3883614 100644 --- a/cmd/hivechain/mod.go +++ b/cmd/hivechain/mod.go @@ -73,7 +73,7 @@ func (ctx *genBlockContext) TxCreateIntrinsicGas(data []byte) uint64 { isHomestead := genesis.Config.IsHomestead(ctx.block.Number()) isEIP2028 := genesis.Config.IsIstanbul(ctx.block.Number()) isEIP3860 := genesis.Config.IsShanghai(ctx.block.Number(), ctx.block.Timestamp()) - igas, err := core.IntrinsicGas(data, nil, true, isHomestead, isEIP2028, isEIP3860) + igas, err := core.IntrinsicGas(data, nil, nil, true, isHomestead, isEIP2028, isEIP3860) if err != nil { panic(err) } diff --git a/cmd/hivechain/mod_7702.go b/cmd/hivechain/mod_7702.go new file mode 100644 index 0000000000..0c55576b03 --- /dev/null +++ b/cmd/hivechain/mod_7702.go @@ -0,0 +1,159 @@ +package main + +import ( + "fmt" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" + "github.com/holiman/uint256" +) + +// mod7702 creates an EIP-7702 interaction in the chain. +// +// It's a multi-step process: +// +// - (1) a contract that will later serve as the account code is deployed. +// - (2) Then a SetCode transaction is added which creates a delegation from the +// EOA to the deployed code. +// - (3) Finally, a contract call to the EOA is published, which triggers the +// delegated code. +// +// The account contract (contracts/7702account.eas) writes to storage when invoked with +// input. For no input, it returns the current address and the storage value. + +func init() { + register("tx-eip7702", func() blockModifier { + return &mod7702{} + }) +} + +type mod7702TxInfo struct { + Account common.Address `json:"account"` + ProxyAddr common.Address `json:"proxyAddr"` + AuthorizeTx common.Hash `json:"authorizeTx"` +} + +type mod7702 struct { + stage int + proxyAddr common.Address + authorizeTx common.Hash +} + +const ( + mod7702stageDeploy = iota + mod7702stageAuthorize + mod7702stageInvoke + mod7702stageDone +) + +func (m *mod7702) apply(ctx *genBlockContext) bool { + if !ctx.ChainConfig().IsPrague(ctx.Number(), ctx.Timestamp()) { + return false + } + + prevStage := m.stage + for ; m.stage < mod7702stageDone; m.stage++ { + switch m.stage { + case mod7702stageDeploy: + if err := m.deployAccountCode(ctx); err != nil { + return false + } + case mod7702stageAuthorize: + if err := m.authorizeCode(ctx); err != nil { + return false + } + case mod7702stageInvoke: + if err := m.invokeAccount(ctx); err != nil { + return false + } + } + } + return m.stage > prevStage +} + +func (m *mod7702) deployAccountCode(ctx *genBlockContext) error { + code, gas := codeToDeploy(ctx, mod7702AccountCode) + if !ctx.HasGas(gas) { + return fmt.Errorf("not enough gas to deploy") + } + + sender := ctx.TxSenderAccount() + nonce := ctx.AccountNonce(sender.addr) + ctx.AddNewTx(sender, &types.LegacyTx{ + Nonce: nonce, + Gas: gas, + GasPrice: ctx.TxGasFeeCap(), + Data: code, + }) + m.proxyAddr = crypto.CreateAddress(sender.addr, nonce) + return nil +} + +func (m *mod7702) authorizeCode(ctx *genBlockContext) error { + auth := types.Authorization{ + ChainID: ctx.ChainConfig().ChainID.Uint64(), + Address: m.proxyAddr, + Nonce: ctx.AccountNonce(mod7702Account.addr), + } + signedAuth, err := types.SignAuth(auth, mod7702Account.key) + if err != nil { + panic(err) + } + + sender := ctx.TxSenderAccount() + txdata := &types.SetCodeTx{ + ChainID: ctx.ChainConfig().ChainID.Uint64(), + Nonce: ctx.AccountNonce(sender.addr), + GasTipCap: uint256.MustFromDecimal("1"), + GasFeeCap: uint256.MustFromBig(ctx.TxGasFeeCap()), + To: common.Address{}, + AuthList: []types.Authorization{signedAuth}, + } + gas, err := core.IntrinsicGas(txdata.Data, txdata.AccessList, txdata.AuthList, false, true, true, true) + if err != nil { + panic(err) + } + txdata.Gas = gas + if !ctx.HasGas(gas) { + return fmt.Errorf("not enough gas to authorize") + } + tx := ctx.AddNewTx(sender, txdata) + m.authorizeTx = tx.Hash() + + return nil +} + +func (m *mod7702) invokeAccount(ctx *genBlockContext) error { + const gas = 70000 + if !ctx.HasGas(gas) { + return fmt.Errorf("not enough gas to invoke") + } + + sender := ctx.TxSenderAccount() + ctx.AddNewTx(sender, &types.LegacyTx{ + Nonce: ctx.AccountNonce(sender.addr), + GasPrice: ctx.TxGasFeeCap(), + Gas: 70000, + To: &mod7702Account.addr, + Data: []byte("invoked"), + }) + return nil +} + +func (m *mod7702) txInfo() any { + if m.stage < mod7702stageDone { + return nil + } + return &mod7702TxInfo{ + Account: mod7702Account.addr, + ProxyAddr: m.proxyAddr, + AuthorizeTx: m.authorizeTx, + } +} + +var mod7702Account = genAccount{ + key: mustParseKey("14cdde09d1640eb8c3cda063891b0453073f57719583381ff78811efa6d4199f"), + addr: common.HexToAddress("0xedA8645bA6948855E3B3cD596bbB07596d59c603"), +} diff --git a/cmd/hivechain/mod_deploy.go b/cmd/hivechain/mod_deploy.go index ecac168481..8782e1af5f 100644 --- a/cmd/hivechain/mod_deploy.go +++ b/cmd/hivechain/mod_deploy.go @@ -35,12 +35,7 @@ func (m *modDeploy) apply(ctx *genBlockContext) bool { return false // already deployed } - var code []byte - code = append(code, deployerCode...) - code = append(code, m.code...) - gas := ctx.TxCreateIntrinsicGas(code) - gas += uint64(len(m.code)) * params.CreateDataGas - gas += 15000 // extra gas for constructor execution + code, gas := codeToDeploy(ctx, m.code) if !ctx.HasGas(gas) { return false } @@ -63,3 +58,12 @@ func (m *modDeploy) apply(ctx *genBlockContext) bool { func (m *modDeploy) txInfo() any { return m.info } + +func codeToDeploy(ctx *genBlockContext, code []byte) (constructor []byte, gas uint64) { + constructor = append(constructor, deployerCode...) + constructor = append(constructor, code...) + gas = ctx.TxCreateIntrinsicGas(code) + gas += uint64(len(code)) * params.CreateDataGas + gas += 15000 // extra gas for constructor execution + return +} diff --git a/cmd/hivechain/mod_requests.go b/cmd/hivechain/mod_requests.go new file mode 100644 index 0000000000..2e36919e70 --- /dev/null +++ b/cmd/hivechain/mod_requests.go @@ -0,0 +1,62 @@ +package main + +import ( + "math/big" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/params" +) + +func init() { + register("tx-request-eip7002", func() blockModifier { + return &modRequestWithdrawal{} + }) +} + +// modRequestWithdrawal creates an EIP-7002 withdrawal request. +type modRequestWithdrawal struct { + info *modRequestWithdrawalInfo +} + +type modRequestWithdrawalInfo struct { + TxHash common.Hash `json:"txhash"` + Block hexutil.Uint64 `json:"block"` +} + +func (m *modRequestWithdrawal) apply(ctx *genBlockContext) bool { + if m.info != nil { + return false // run only once + } + if !ctx.ChainConfig().IsPrague(ctx.Number(), ctx.Timestamp()) { + return false + } + + const gas = 150_000 + if !ctx.HasGas(gas) { + return false + } + + sender := ctx.TxSenderAccount() + input := common.FromHex("b917cfdc0d25b72d55cf94db328e1629b7f4fde2c30cdacf873b664416f76a0c7f7cc50c9f72a3cb84be88144cde91250000000000000d80") + tx := ctx.AddNewTx(sender, &types.DynamicFeeTx{ + ChainID: ctx.ChainConfig().ChainID, + Nonce: ctx.AccountNonce(sender.addr), + Value: big.NewInt(1000000000), + To: ¶ms.WithdrawalQueueAddress, + Data: input, + GasFeeCap: ctx.TxGasFeeCap(), + GasTipCap: big.NewInt(2), + Gas: gas, + }) + m.info = &modRequestWithdrawalInfo{ + TxHash: tx.Hash(), + Block: hexutil.Uint64(ctx.Number().Uint64()), + } + return true +} + +func (m *modRequestWithdrawal) txInfo() any { + return m.info +} diff --git a/cmd/hivechain/output_engine.go b/cmd/hivechain/output_engine.go index 67d4815e9a..c869f6f4b6 100644 --- a/cmd/hivechain/output_engine.go +++ b/cmd/hivechain/output_engine.go @@ -82,17 +82,21 @@ func (g *generator) block2newpayload(b *types.Block) *rpcRequest { panic(err) } ed.Transactions = append(ed.Transactions, bin) - // Collect blob hashes for post-Cancun blocks. - for _, bh := range tx.BlobHashes() { - blobHashes = append(blobHashes, bh) - } + blobHashes = append(blobHashes, tx.BlobHashes()...) } var method string var params = []any{ed} cfg := g.genesis.Config switch { + case cfg.IsPrague(b.Number(), b.Time()): + method = "engine_newPayloadV4" + requests, ok := g.clRequests[b.NumberU64()] + if !ok { + panic(fmt.Sprintf("missing execution requests for block %d", b.NumberU64())) + } + params = append(params, blobHashes, b.BeaconRoot(), requests) case cfg.IsCancun(b.Number(), b.Time()): method = "engine_newPayloadV3" params = append(params, blobHashes, b.BeaconRoot()) diff --git a/go.mod b/go.mod index c580349461..4f1f62f1cd 100644 --- a/go.mod +++ b/go.mod @@ -6,17 +6,17 @@ toolchain go1.23.4 require ( github.com/davecgh/go-spew v1.1.1 - github.com/ethereum/go-ethereum v1.14.12 + github.com/ethereum/go-ethereum v1.14.6-0.20241217141617-71c28d8d2b20 github.com/ethereum/hive/hiveproxy v0.0.0-20240610172618-786a798a0cfe github.com/evanw/esbuild v0.18.11 github.com/fsouza/go-dockerclient v1.11.2 github.com/golang-jwt/jwt/v4 v4.5.1 github.com/gorilla/mux v1.8.1 - github.com/holiman/uint256 v1.3.1 + github.com/holiman/uint256 v1.3.2 github.com/lithammer/dedent v1.1.0 github.com/lmittmann/tint v1.0.5 golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa - golang.org/x/net v0.24.0 + golang.org/x/net v0.25.0 gopkg.in/yaml.v3 v3.0.1 ) @@ -26,21 +26,21 @@ require ( github.com/Microsoft/go-winio v0.6.2 // indirect github.com/VictoriaMetrics/fastcache v1.12.2 // indirect github.com/allegro/bigcache v1.2.1 // indirect - github.com/bits-and-blooms/bitset v1.13.0 // indirect + github.com/bits-and-blooms/bitset v1.17.0 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect - github.com/consensys/bavard v0.1.13 // indirect - github.com/consensys/gnark-crypto v0.12.1 // indirect + github.com/consensys/bavard v0.1.22 // indirect + github.com/consensys/gnark-crypto v0.14.0 // indirect github.com/containerd/containerd v1.6.26 // indirect github.com/containerd/log v0.1.0 // indirect - github.com/crate-crypto/go-ipa v0.0.0-20240223125850-b1e8a79f509c // indirect - github.com/crate-crypto/go-kzg-4844 v1.0.0 // indirect + github.com/crate-crypto/go-ipa v0.0.0-20240724233137-53bbb0ceb27a // indirect + github.com/crate-crypto/go-kzg-4844 v1.1.0 // indirect github.com/deckarep/golang-set/v2 v2.6.0 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 // indirect github.com/docker/docker v27.1.1+incompatible // indirect github.com/docker/go-connections v0.4.0 // indirect github.com/docker/go-units v0.5.0 // indirect github.com/ethereum/c-kzg-4844 v1.0.0 // indirect - github.com/ethereum/go-verkle v0.1.1-0.20240829091221-dffa7562dbe9 // indirect + github.com/ethereum/go-verkle v0.2.2 // indirect github.com/go-ole/go-ole v1.3.0 // indirect github.com/gofrs/flock v0.8.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect @@ -72,9 +72,9 @@ require ( github.com/tklauser/go-sysconf v0.3.12 // indirect github.com/tklauser/numcpus v0.6.1 // indirect github.com/yusufpapurcu/wmi v1.2.2 // indirect - golang.org/x/crypto v0.22.0 // indirect - golang.org/x/sync v0.7.0 // indirect - golang.org/x/sys v0.22.0 // indirect + golang.org/x/crypto v0.26.0 // indirect + golang.org/x/sync v0.10.0 // indirect + golang.org/x/sys v0.28.0 // indirect rsc.io/tmplfunc v0.0.3 // indirect ) diff --git a/go.sum b/go.sum index 44909dcced..859ca5e081 100644 --- a/go.sum +++ b/go.sum @@ -13,8 +13,8 @@ github.com/allegro/bigcache v1.2.1 h1:hg1sY1raCwic3Vnsvje6TT7/pnZba83LeFck5NrFKS github.com/allegro/bigcache v1.2.1/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bits-and-blooms/bitset v1.13.0 h1:bAQ9OPNFYbGHV6Nez0tmNI0RiEu7/hxlYJRUA0wFAVE= -github.com/bits-and-blooms/bitset v1.13.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= +github.com/bits-and-blooms/bitset v1.17.0 h1:1X2TS7aHz1ELcC0yU1y2stUs/0ig5oMU6STFZGrhvHI= +github.com/bits-and-blooms/bitset v1.17.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= @@ -33,18 +33,18 @@ github.com/cockroachdb/redact v1.1.5 h1:u1PMllDkdFfPWaNGMyLD1+so+aq3uUItthCFqzwP github.com/cockroachdb/redact v1.1.5/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo= github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ= -github.com/consensys/bavard v0.1.13 h1:oLhMLOFGTLdlda/kma4VOJazblc7IM5y5QPd2A/YjhQ= -github.com/consensys/bavard v0.1.13/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI= -github.com/consensys/gnark-crypto v0.12.1 h1:lHH39WuuFgVHONRl3J0LRBtuYdQTumFSDtJF7HpyG8M= -github.com/consensys/gnark-crypto v0.12.1/go.mod h1:v2Gy7L/4ZRosZ7Ivs+9SfUDr0f5UlG+EM5t7MPHiLuY= +github.com/consensys/bavard v0.1.22 h1:Uw2CGvbXSZWhqK59X0VG/zOjpTFuOMcPLStrp1ihI0A= +github.com/consensys/bavard v0.1.22/go.mod h1:k/zVjHHC4B+PQy1Pg7fgvG3ALicQw540Crag8qx+dZs= +github.com/consensys/gnark-crypto v0.14.0 h1:DDBdl4HaBtdQsq/wfMwJvZNE80sHidrK3Nfrefatm0E= +github.com/consensys/gnark-crypto v0.14.0/go.mod h1:CU4UijNPsHawiVGNxe9co07FkzCeWHHrb1li/n1XoU0= github.com/containerd/containerd v1.6.26 h1:VVfrE6ZpyisvB1fzoY8Vkiq4sy+i5oF4uk7zu03RaHs= github.com/containerd/containerd v1.6.26/go.mod h1:I4TRdsdoo5MlKob5khDJS2EPT1l1oMNaE2MBm6FrwxM= github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I= github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo= -github.com/crate-crypto/go-ipa v0.0.0-20240223125850-b1e8a79f509c h1:uQYC5Z1mdLRPrZhHjHxufI8+2UG/i25QG92j0Er9p6I= -github.com/crate-crypto/go-ipa v0.0.0-20240223125850-b1e8a79f509c/go.mod h1:geZJZH3SzKCqnz5VT0q/DyIG/tvu/dZk+VIfXicupJs= -github.com/crate-crypto/go-kzg-4844 v1.0.0 h1:TsSgHwrkTKecKJ4kadtHi4b3xHW5dCFUDFnUp1TsawI= -github.com/crate-crypto/go-kzg-4844 v1.0.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= +github.com/crate-crypto/go-ipa v0.0.0-20240724233137-53bbb0ceb27a h1:W8mUrRp6NOVl3J+MYp5kPMoUZPp7aOYHtaua31lwRHg= +github.com/crate-crypto/go-ipa v0.0.0-20240724233137-53bbb0ceb27a/go.mod h1:sTwzHBvIzm2RfVCGNEBZgRyjwK40bVoun3ZnGOCafNM= +github.com/crate-crypto/go-kzg-4844 v1.1.0 h1:EN/u9k2TF6OWSHrCCDBBU6GLNMq88OspHHlMnHfoyU4= +github.com/crate-crypto/go-kzg-4844 v1.1.0/go.mod h1:JolLjpSff1tCCJKaJx4psrlEdlXuJEC996PL3tTAFks= github.com/creack/pty v1.1.11 h1:07n33Z8lZxZ2qwegKbObQohDhXDQxiMMz1NOUGYlesw= github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -64,10 +64,10 @@ github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4 github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/ethereum/c-kzg-4844 v1.0.0 h1:0X1LBXxaEtYD9xsyj9B9ctQEZIpnvVDeoBx8aHEwTNA= github.com/ethereum/c-kzg-4844 v1.0.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= -github.com/ethereum/go-ethereum v1.14.12 h1:8hl57x77HSUo+cXExrURjU/w1VhL+ShCTJrTwcCQSe4= -github.com/ethereum/go-ethereum v1.14.12/go.mod h1:RAC2gVMWJ6FkxSPESfbshrcKpIokgQKsVKmAuqdekDY= -github.com/ethereum/go-verkle v0.1.1-0.20240829091221-dffa7562dbe9 h1:8NfxH2iXvJ60YRB8ChToFTUzl8awsc3cJ8CbLjGIl/A= -github.com/ethereum/go-verkle v0.1.1-0.20240829091221-dffa7562dbe9/go.mod h1:M3b90YRnzqKyyzBEWJGqj8Qff4IDeXnzFw0P9bFw3uk= +github.com/ethereum/go-ethereum v1.14.6-0.20241217141617-71c28d8d2b20 h1:88utmwvqPhZLwrmladevgwJdjhcK1DUVY9h+KDzz4Cw= +github.com/ethereum/go-ethereum v1.14.6-0.20241217141617-71c28d8d2b20/go.mod h1:lkyApCmymXMsDEh1RIagBWIViBVx2A21v7cBUycE7GM= +github.com/ethereum/go-verkle v0.2.2 h1:I2W0WjnrFUIzzVPwm8ykY+7pL2d4VhlsePn4j7cnFk8= +github.com/ethereum/go-verkle v0.2.2/go.mod h1:M3b90YRnzqKyyzBEWJGqj8Qff4IDeXnzFw0P9bFw3uk= github.com/evanw/esbuild v0.18.11 h1:Mb0qb9KyJQraob0Y7LA0DOdD8ijJs2TxhqgqrDeGq4w= github.com/evanw/esbuild v0.18.11/go.mod h1:iINY06rn799hi48UqEnaQvVfZWe6W9bET78LbvN8VWk= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= @@ -119,8 +119,8 @@ github.com/hashicorp/yamux v0.1.1 h1:yrQxtgseBDrq9Y652vSRDvsKCJKOUD+GzTS4Y0Y8pvE github.com/hashicorp/yamux v0.1.1/go.mod h1:CtWFDAQgb7dxtzFs4tWbplKIe2jSi3+5vKbgIO0SLnQ= github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao= github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA= -github.com/holiman/uint256 v1.3.1 h1:JfTzmih28bittyHM8z360dCjIA9dbPIBlcTI6lmctQs= -github.com/holiman/uint256 v1.3.1/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXeiRV4ng7E= +github.com/holiman/uint256 v1.3.2 h1:a9EgMPSC1AAaj1SZL5zIQD3WbwTuHrMGOerLjGmM/TA= +github.com/holiman/uint256 v1.3.2/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXeiRV4ng7E= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= @@ -133,8 +133,8 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c= -github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= +github.com/leanovate/gopter v0.2.11 h1:vRjThO1EKPb/1NsDXuDrzldR28RLkBflWYcU9CvzWu4= +github.com/leanovate/gopter v0.2.11/go.mod h1:aK3tzZP/C+p1m3SPRE4SYZFGP7jjkuSI4f7Xvpt0S9c= github.com/lithammer/dedent v1.1.0 h1:VNzHMVCBNG1j0fh3OrsFRkVUwStdDArbgBWoPAffktY= github.com/lithammer/dedent v1.1.0/go.mod h1:jrXYCQtgg0nJiN+StA2KgR7w6CiQNv9Fd/Z9BP0jIOc= github.com/lmittmann/tint v1.0.5 h1:NQclAutOfYsqs2F1Lenue6OoWCajs5wJcP3DfWVpePw= @@ -195,8 +195,8 @@ github.com/prometheus/procfs v0.9.0/go.mod h1:+pB4zwohETzFnmlpe6yd2lSc+0/46IYZRB github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.3 h1:utMvzDsuh3suAEnhH0RdHmoPbU648o6CvXxTx4SBMOw= github.com/rivo/uniseg v0.4.3/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= -github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= -github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI= github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= @@ -224,8 +224,8 @@ github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQ golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30= -golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M= +golang.org/x/crypto v0.26.0 h1:RrRspgV4mU+YwB4FYnuBoKsUapNIL5cohGAmSH3azsw= +golang.org/x/crypto v0.26.0/go.mod h1:GY7jblb9wI+FOo5y8/S2oY4zWP07AkOJ4+jxCqdqn54= golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa h1:FRnLl4eNAQl8hwxVVC17teOw8kdjVDVAiFMtgUdTSRQ= golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa/go.mod h1:zk2irFbV9DP96SEBUUAy67IdHUaZuSnrz1n472HUCLE= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= @@ -240,14 +240,14 @@ golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwY golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.24.0 h1:1PcaxkF854Fu3+lvBIx5SYn9wRlBzzcnHZSiaFFAb0w= -golang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8= +golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= +golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= -golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ= +golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -271,18 +271,18 @@ golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.22.0 h1:RI27ohtqKCnwULzJLqkv897zojh5/DwS/ENaMzUOaWI= -golang.org/x/sys v0.22.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.22.0 h1:BbsgPEJULsl2fV/AT3v15Mjva5yXKQDyKf+TbDz7QJk= -golang.org/x/term v0.22.0/go.mod h1:F3qCibpT5AMpCRfhfT53vVJwhLtIVHhB9XDjfFvnMI4= +golang.org/x/term v0.23.0 h1:F6D4vR+EHoL9/sWAWgAR1H2DcHr4PareCbAaCo1RpuU= +golang.org/x/term v0.23.0/go.mod h1:DgV24QBUrK6jhZXl+20l6UWznPlwAHm1Q1mGHtydmSk= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= -golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.17.0 h1:XtiM5bkSOt+ewxlOE/aE/AKEHibwj/6gvWMl9Rsh0Qc= +golang.org/x/text v0.17.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= From 34dd8b536ba8b8590028790ee70ffd8c3e0f88a6 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Wed, 18 Dec 2024 19:22:00 +0100 Subject: [PATCH 358/387] cmd/hivechain: update for upstream EIP-7702 API changes --- cmd/hivechain/mod_7702.go | 7 +++---- go.mod | 4 ++-- go.sum | 16 ++++++++-------- 3 files changed, 13 insertions(+), 14 deletions(-) diff --git a/cmd/hivechain/mod_7702.go b/cmd/hivechain/mod_7702.go index 0c55576b03..883033ae99 100644 --- a/cmd/hivechain/mod_7702.go +++ b/cmd/hivechain/mod_7702.go @@ -92,12 +92,11 @@ func (m *mod7702) deployAccountCode(ctx *genBlockContext) error { } func (m *mod7702) authorizeCode(ctx *genBlockContext) error { - auth := types.Authorization{ + auth, err := types.SignSetCode(mod7702Account.key, types.SetCodeAuthorization{ ChainID: ctx.ChainConfig().ChainID.Uint64(), Address: m.proxyAddr, Nonce: ctx.AccountNonce(mod7702Account.addr), - } - signedAuth, err := types.SignAuth(auth, mod7702Account.key) + }) if err != nil { panic(err) } @@ -109,7 +108,7 @@ func (m *mod7702) authorizeCode(ctx *genBlockContext) error { GasTipCap: uint256.MustFromDecimal("1"), GasFeeCap: uint256.MustFromBig(ctx.TxGasFeeCap()), To: common.Address{}, - AuthList: []types.Authorization{signedAuth}, + AuthList: []types.SetCodeAuthorization{auth}, } gas, err := core.IntrinsicGas(txdata.Data, txdata.AccessList, txdata.AuthList, false, true, true, true) if err != nil { diff --git a/go.mod b/go.mod index 4f1f62f1cd..be155cdd40 100644 --- a/go.mod +++ b/go.mod @@ -6,7 +6,7 @@ toolchain go1.23.4 require ( github.com/davecgh/go-spew v1.1.1 - github.com/ethereum/go-ethereum v1.14.6-0.20241217141617-71c28d8d2b20 + github.com/ethereum/go-ethereum v1.14.6-0.20241218181053-9d4b29f29165 github.com/ethereum/hive/hiveproxy v0.0.0-20240610172618-786a798a0cfe github.com/evanw/esbuild v0.18.11 github.com/fsouza/go-dockerclient v1.11.2 @@ -72,7 +72,7 @@ require ( github.com/tklauser/go-sysconf v0.3.12 // indirect github.com/tklauser/numcpus v0.6.1 // indirect github.com/yusufpapurcu/wmi v1.2.2 // indirect - golang.org/x/crypto v0.26.0 // indirect + golang.org/x/crypto v0.31.0 // indirect golang.org/x/sync v0.10.0 // indirect golang.org/x/sys v0.28.0 // indirect rsc.io/tmplfunc v0.0.3 // indirect diff --git a/go.sum b/go.sum index 859ca5e081..4b610209cb 100644 --- a/go.sum +++ b/go.sum @@ -64,8 +64,8 @@ github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4 github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/ethereum/c-kzg-4844 v1.0.0 h1:0X1LBXxaEtYD9xsyj9B9ctQEZIpnvVDeoBx8aHEwTNA= github.com/ethereum/c-kzg-4844 v1.0.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= -github.com/ethereum/go-ethereum v1.14.6-0.20241217141617-71c28d8d2b20 h1:88utmwvqPhZLwrmladevgwJdjhcK1DUVY9h+KDzz4Cw= -github.com/ethereum/go-ethereum v1.14.6-0.20241217141617-71c28d8d2b20/go.mod h1:lkyApCmymXMsDEh1RIagBWIViBVx2A21v7cBUycE7GM= +github.com/ethereum/go-ethereum v1.14.6-0.20241218181053-9d4b29f29165 h1:Aqg1T2mFc5qyD1nvUqvBPMlErcScCFLQX4ovFOFuue0= +github.com/ethereum/go-ethereum v1.14.6-0.20241218181053-9d4b29f29165/go.mod h1:xmF8maAZYhsXfnZpq2FW75t1UwhBtxnmNhbR91pCPug= github.com/ethereum/go-verkle v0.2.2 h1:I2W0WjnrFUIzzVPwm8ykY+7pL2d4VhlsePn4j7cnFk8= github.com/ethereum/go-verkle v0.2.2/go.mod h1:M3b90YRnzqKyyzBEWJGqj8Qff4IDeXnzFw0P9bFw3uk= github.com/evanw/esbuild v0.18.11 h1:Mb0qb9KyJQraob0Y7LA0DOdD8ijJs2TxhqgqrDeGq4w= @@ -224,8 +224,8 @@ github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQ golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.26.0 h1:RrRspgV4mU+YwB4FYnuBoKsUapNIL5cohGAmSH3azsw= -golang.org/x/crypto v0.26.0/go.mod h1:GY7jblb9wI+FOo5y8/S2oY4zWP07AkOJ4+jxCqdqn54= +golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U= +golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa h1:FRnLl4eNAQl8hwxVVC17teOw8kdjVDVAiFMtgUdTSRQ= golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa/go.mod h1:zk2irFbV9DP96SEBUUAy67IdHUaZuSnrz1n472HUCLE= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= @@ -275,14 +275,14 @@ golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.23.0 h1:F6D4vR+EHoL9/sWAWgAR1H2DcHr4PareCbAaCo1RpuU= -golang.org/x/term v0.23.0/go.mod h1:DgV24QBUrK6jhZXl+20l6UWznPlwAHm1Q1mGHtydmSk= +golang.org/x/term v0.27.0 h1:WP60Sv1nlK1T6SupCHbXzSaN0b9wUmsPoRS9b61A23Q= +golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.17.0 h1:XtiM5bkSOt+ewxlOE/aE/AKEHibwj/6gvWMl9Rsh0Qc= -golang.org/x/text v0.17.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= From 653b8f24cbb0a993a8922c1cc641f2f004a3bc6a Mon Sep 17 00:00:00 2001 From: meldsun0 <160340597+meldsun0@users.noreply.github.com> Date: Thu, 19 Dec 2024 15:13:45 -0300 Subject: [PATCH 359/387] clients/samba: add samba portal network client definition (#1189) * adding samba config files * add suggested changes * Adding changes * Update Dockerfile --- clients/samba/Dockerfile | 14 ++++++++++++++ clients/samba/hive.yaml | 2 ++ clients/samba/samba.sh | 25 +++++++++++++++++++++++++ 3 files changed, 41 insertions(+) create mode 100644 clients/samba/Dockerfile create mode 100644 clients/samba/hive.yaml create mode 100755 clients/samba/samba.sh diff --git a/clients/samba/Dockerfile b/clients/samba/Dockerfile new file mode 100644 index 0000000000..0c01c0ae34 --- /dev/null +++ b/clients/samba/Dockerfile @@ -0,0 +1,14 @@ +ARG baseimage=meldsun/samba +ARG tag=latest +FROM $baseimage:$tag +RUN echo "latest" > /version.txt + +ENTRYPOINT ["samba-entry.sh"] + + +USER root + +ADD samba.sh /opt/samba/bin/samba.sh +RUN chmod +x /opt/samba/bin/samba.sh +ENTRYPOINT ["/opt/samba/bin/samba.sh"] + diff --git a/clients/samba/hive.yaml b/clients/samba/hive.yaml new file mode 100644 index 0000000000..a7a54e4224 --- /dev/null +++ b/clients/samba/hive.yaml @@ -0,0 +1,2 @@ +roles: + - portal diff --git a/clients/samba/samba.sh b/clients/samba/samba.sh new file mode 100755 index 0000000000..5dd02e6320 --- /dev/null +++ b/clients/samba/samba.sh @@ -0,0 +1,25 @@ +#!/bin/bash + +# Immediately abort the script on any error encountered +set -e + +IP_ADDR=$(hostname -i | awk '{print $1}') +FLAGS="" + +if [ "$HIVE_CLIENT_PRIVATE_KEY" != "" ]; then + FLAGS="$FLAGS --unsafe-private-key=0x$HIVE_CLIENT_PRIVATE_KEY" +fi + +if [ "$HIVE_PORTAL_NETWORKS_SELECTED" != "" ]; then + FLAGS="$FLAGS --portal-subnetworks=$HIVE_PORTAL_NETWORKS_SELECTED" +else + FLAGS="$FLAGS --portal-subnetworks=history" +fi + +/opt/samba/bin/samba \ + --jsonrpc-port=8545 \ + --jsonrpc-host="${IP_ADDR}" \ + --p2p-ip="${IP_ADDR}" \ + --use-default-bootnodes=false \ + $FLAGS + From 788ef171ddc5cea49e0f4632129801c4618e765d Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Fri, 20 Dec 2024 14:55:59 +0100 Subject: [PATCH 360/387] go.mod: update go-ethereum for new system contract addresses --- go.mod | 2 +- go.sum | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/go.mod b/go.mod index be155cdd40..c141b6ba50 100644 --- a/go.mod +++ b/go.mod @@ -6,7 +6,7 @@ toolchain go1.23.4 require ( github.com/davecgh/go-spew v1.1.1 - github.com/ethereum/go-ethereum v1.14.6-0.20241218181053-9d4b29f29165 + github.com/ethereum/go-ethereum v1.14.6-0.20241219150305-341647f1865d github.com/ethereum/hive/hiveproxy v0.0.0-20240610172618-786a798a0cfe github.com/evanw/esbuild v0.18.11 github.com/fsouza/go-dockerclient v1.11.2 diff --git a/go.sum b/go.sum index 4b610209cb..a4673bcebf 100644 --- a/go.sum +++ b/go.sum @@ -66,6 +66,8 @@ github.com/ethereum/c-kzg-4844 v1.0.0 h1:0X1LBXxaEtYD9xsyj9B9ctQEZIpnvVDeoBx8aHE github.com/ethereum/c-kzg-4844 v1.0.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= github.com/ethereum/go-ethereum v1.14.6-0.20241218181053-9d4b29f29165 h1:Aqg1T2mFc5qyD1nvUqvBPMlErcScCFLQX4ovFOFuue0= github.com/ethereum/go-ethereum v1.14.6-0.20241218181053-9d4b29f29165/go.mod h1:xmF8maAZYhsXfnZpq2FW75t1UwhBtxnmNhbR91pCPug= +github.com/ethereum/go-ethereum v1.14.6-0.20241219150305-341647f1865d h1:6ANvowlmL7EuPryw0ZcfW1h2lYS6cykclFl9m9ivOys= +github.com/ethereum/go-ethereum v1.14.6-0.20241219150305-341647f1865d/go.mod h1:xmF8maAZYhsXfnZpq2FW75t1UwhBtxnmNhbR91pCPug= github.com/ethereum/go-verkle v0.2.2 h1:I2W0WjnrFUIzzVPwm8ykY+7pL2d4VhlsePn4j7cnFk8= github.com/ethereum/go-verkle v0.2.2/go.mod h1:M3b90YRnzqKyyzBEWJGqj8Qff4IDeXnzFw0P9bFw3uk= github.com/evanw/esbuild v0.18.11 h1:Mb0qb9KyJQraob0Y7LA0DOdD8ijJs2TxhqgqrDeGq4w= From 6ba739777799f80dc92d8cdf004edc94963cf420 Mon Sep 17 00:00:00 2001 From: lightclient <14004106+lightclient@users.noreply.github.com> Date: Fri, 20 Dec 2024 15:03:27 -0700 Subject: [PATCH 361/387] cmd/hivechain: add return op to 7702 contract code (#1191) --- cmd/hivechain/bytecode/7702account.bin | 2 +- cmd/hivechain/compile.sh | 2 +- cmd/hivechain/contracts/7702account.eas | 3 +++ 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/cmd/hivechain/bytecode/7702account.bin b/cmd/hivechain/bytecode/7702account.bin index 742bc9bf26..b0f1eab4e4 100644 --- a/cmd/hivechain/bytecode/7702account.bin +++ b/cmd/hivechain/bytecode/7702account.bin @@ -1 +1 @@ -6` W_5_U[0_R_T` R \ No newline at end of file +6` W_5_U[0_R_T` R`@_ó \ No newline at end of file diff --git a/cmd/hivechain/compile.sh b/cmd/hivechain/compile.sh index e2d3d0a071..5615f8c516 100755 --- a/cmd/hivechain/compile.sh +++ b/cmd/hivechain/compile.sh @@ -1,4 +1,4 @@ -#!/bin/env bash +#!/usr/bin/env bash set -e diff --git a/cmd/hivechain/contracts/7702account.eas b/cmd/hivechain/contracts/7702account.eas index 8ee332f652..777d022558 100644 --- a/cmd/hivechain/contracts/7702account.eas +++ b/cmd/hivechain/contracts/7702account.eas @@ -20,3 +20,6 @@ return: sload ; [value] push 32 ; [ptr, value] mstore ; [] + push 64 ; [64] + push 0 ; [0, 64] + return From 2e54a962203d15fb21500f1bcf5e358234446955 Mon Sep 17 00:00:00 2001 From: Mario Vega Date: Mon, 23 Dec 2024 12:33:01 -0600 Subject: [PATCH 362/387] simulators/ethereum/eest: Add `branch` buildarg (#1192) --- simulators/ethereum/eest/consume-engine/Dockerfile | 4 +++- simulators/ethereum/eest/consume-rlp/Dockerfile | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/simulators/ethereum/eest/consume-engine/Dockerfile b/simulators/ethereum/eest/consume-engine/Dockerfile index 05b91bb06b..57f25aa334 100644 --- a/simulators/ethereum/eest/consume-engine/Dockerfile +++ b/simulators/ethereum/eest/consume-engine/Dockerfile @@ -4,6 +4,8 @@ FROM python:3.10-slim ## Default fixtures ARG fixtures=latest-stable-release ENV INPUT=${fixtures} +ARG branch=main +ENV BRANCH=${branch} ## Install dependencies RUN apt-get update && \ @@ -12,7 +14,7 @@ RUN apt-get update && \ rm -rf /var/lib/apt/lists/* ## Clone and install EEST -RUN git clone https://github.com/ethereum/execution-spec-tests.git --branch main --single-branch --depth 1 +RUN git clone https://github.com/ethereum/execution-spec-tests.git --branch "$BRANCH" --single-branch --depth 1 WORKDIR execution-spec-tests RUN pip install uv && uv sync diff --git a/simulators/ethereum/eest/consume-rlp/Dockerfile b/simulators/ethereum/eest/consume-rlp/Dockerfile index fab0766685..2991cc4ce7 100644 --- a/simulators/ethereum/eest/consume-rlp/Dockerfile +++ b/simulators/ethereum/eest/consume-rlp/Dockerfile @@ -4,6 +4,8 @@ FROM python:3.10-slim ## Default fixtures ARG fixtures=latest-stable-release ENV INPUT=${fixtures} +ARG branch=main +ENV BRANCH=${branch} ## Install dependencies RUN apt-get update && \ @@ -12,7 +14,7 @@ RUN apt-get update && \ rm -rf /var/lib/apt/lists/* ## Clone and install EEST -RUN git clone https://github.com/ethereum/execution-spec-tests.git --branch main --single-branch --depth 1 +RUN git clone https://github.com/ethereum/execution-spec-tests.git --branch "$BRANCH" --single-branch --depth 1 WORKDIR execution-spec-tests RUN pip install uv && uv sync From 1e01f7e99c8b7f3435493fadaa35e8a7bfbb236e Mon Sep 17 00:00:00 2001 From: Kolby Moroz Liebl <31669092+KolbyML@users.noreply.github.com> Date: Wed, 1 Jan 2025 22:27:46 -0700 Subject: [PATCH 363/387] simulators/portal: update gossip to put content tests (#1196) --- simulators/portal/Cargo.lock | 135 ++---------------- simulators/portal/Cargo.toml | 2 +- .../portal/src/suites/history/interop.rs | 16 +-- simulators/portal/src/suites/state/interop.rs | 16 +-- 4 files changed, 29 insertions(+), 140 deletions(-) diff --git a/simulators/portal/Cargo.lock b/simulators/portal/Cargo.lock index 2f441966bf..7c022e5fe6 100644 --- a/simulators/portal/Cargo.lock +++ b/simulators/portal/Cargo.lock @@ -388,15 +388,6 @@ dependencies = [ "libc", ] -[[package]] -name = "ansi_term" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2" -dependencies = [ - "winapi", -] - [[package]] name = "anstream" version = "0.6.15" @@ -599,17 +590,6 @@ version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" -[[package]] -name = "atty" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" -dependencies = [ - "hermit-abi 0.1.19", - "libc", - "winapi", -] - [[package]] name = "auto_impl" version = "1.2.0" @@ -1189,26 +1169,6 @@ dependencies = [ "subtle", ] -[[package]] -name = "directories" -version = "3.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e69600ff1703123957937708eb27f7a564e48885c537782722ed0ba3189ce1d7" -dependencies = [ - "dirs-sys", -] - -[[package]] -name = "dirs-sys" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b1d1d91c932ef41c0f2663aa8b0ca0342d444d842c06914aa0a7e352d0bada6" -dependencies = [ - "libc", - "redox_users", - "winapi", -] - [[package]] name = "discv5" version = "0.4.1" @@ -1362,8 +1322,9 @@ dependencies = [ [[package]] name = "eth_trie" -version = "0.4.0" -source = "git+https://github.com/ethereum/eth-trie.rs?tag=v0.1.0-alpha.2#46da867d8a7eace0a9e912271b236b2007e4cd41" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7ffb0d2fa42ad87f02c0683c04b31cb41bf3853f2327d037738345bc5b56671" dependencies = [ "alloy-primitives", "alloy-rlp", @@ -1422,8 +1383,8 @@ dependencies = [ [[package]] name = "ethportal-api" -version = "0.2.2" -source = "git+https://github.com/ethereum/trin?rev=4b212d4f3e8afa7b3298eebd4b4b6e3ec04d680f#4b212d4f3e8afa7b3298eebd4b4b6e3ec04d680f" +version = "0.4.0" +source = "git+https://github.com/ethereum/trin?rev=5ae01c3ad2c69b4b003e0c206a961f2cf09f3be9#5ae01c3ad2c69b4b003e0c206a961f2cf09f3be9" dependencies = [ "alloy", "alloy-rlp", @@ -1457,13 +1418,13 @@ dependencies = [ "serde_json", "sha2", "sha3 0.9.1", + "shadow-rs", "ssz_types", "superstruct", "thiserror", "tokio", "tree_hash", "tree_hash_derive", - "trin-utils", "ureq", "url", "validator", @@ -1820,15 +1781,6 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" -[[package]] -name = "hermit-abi" -version = "0.1.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" -dependencies = [ - "libc", -] - [[package]] name = "hermit-abi" version = "0.3.9" @@ -2422,16 +2374,6 @@ version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" -[[package]] -name = "libredox" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" -dependencies = [ - "bitflags 2.6.0", - "libc", -] - [[package]] name = "libz-sys" version = "1.1.20" @@ -2475,15 +2417,6 @@ dependencies = [ "hashbrown 0.15.0", ] -[[package]] -name = "matchers" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" -dependencies = [ - "regex-automata 0.1.10", -] - [[package]] name = "matches" version = "0.1.10" @@ -2527,7 +2460,7 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec" dependencies = [ - "hermit-abi 0.3.9", + "hermit-abi", "libc", "wasi", "windows-sys 0.52.0", @@ -2596,7 +2529,7 @@ version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" dependencies = [ - "hermit-abi 0.3.9", + "hermit-abi", "libc", ] @@ -2920,7 +2853,7 @@ dependencies = [ "rand", "rand_chacha", "rand_xorshift", - "regex-syntax 0.8.5", + "regex-syntax", "rusty-fork", "tempfile", "unarray", @@ -3016,17 +2949,6 @@ dependencies = [ "bitflags 2.6.0", ] -[[package]] -name = "redox_users" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" -dependencies = [ - "getrandom", - "libredox", - "thiserror", -] - [[package]] name = "regex" version = "1.11.0" @@ -3035,17 +2957,8 @@ checksum = "38200e5ee88914975b69f657f0801b6f6dccafd44fd9326302a4aaeecfacb1d8" dependencies = [ "aho-corasick", "memchr", - "regex-automata 0.4.8", - "regex-syntax 0.8.5", -] - -[[package]] -name = "regex-automata" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" -dependencies = [ - "regex-syntax 0.6.29", + "regex-automata", + "regex-syntax", ] [[package]] @@ -3056,15 +2969,9 @@ checksum = "368758f23274712b504848e9d5a6f010445cc8b87a7cdb4d7cbee666c1288da3" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.8.5", + "regex-syntax", ] -[[package]] -name = "regex-syntax" -version = "0.6.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" - [[package]] name = "regex-syntax" version = "0.8.5" @@ -4054,14 +3961,10 @@ version = "0.3.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" dependencies = [ - "matchers", "nu-ansi-term", - "once_cell", - "regex", "sharded-slab", "smallvec", "thread_local", - "tracing", "tracing-core", "tracing-log", ] @@ -4089,20 +3992,6 @@ dependencies = [ "syn 2.0.79", ] -[[package]] -name = "trin-utils" -version = "0.1.1-alpha.1" -source = "git+https://github.com/ethereum/trin?rev=4b212d4f3e8afa7b3298eebd4b4b6e3ec04d680f#4b212d4f3e8afa7b3298eebd4b4b6e3ec04d680f" -dependencies = [ - "ansi_term", - "atty", - "directories", - "shadow-rs", - "tempfile", - "tracing", - "tracing-subscriber", -] - [[package]] name = "try-lock" version = "0.2.5" diff --git a/simulators/portal/Cargo.toml b/simulators/portal/Cargo.toml index b84feca476..ccedebec7e 100755 --- a/simulators/portal/Cargo.toml +++ b/simulators/portal/Cargo.toml @@ -7,7 +7,7 @@ edition = "2021" [dependencies] alloy-rlp = "0.3.8" alloy-primitives = "0.8.3" -ethportal-api = { git = "https://github.com/ethereum/trin", rev = "4b212d4f3e8afa7b3298eebd4b4b6e3ec04d680f" } +ethportal-api = { git = "https://github.com/ethereum/trin", rev = "5ae01c3ad2c69b4b003e0c206a961f2cf09f3be9" } futures = "0.3.25" hivesim = { git = "https://github.com/ethereum/hive", rev = "4408fc1de3fee3ac23acd25a812c117756af2f39" } itertools = "0.10.5" diff --git a/simulators/portal/src/suites/history/interop.rs b/simulators/portal/src/suites/history/interop.rs index ed927f21d0..bda00ae82d 100644 --- a/simulators/portal/src/suites/history/interop.rs +++ b/simulators/portal/src/suites/history/interop.rs @@ -1,7 +1,7 @@ use std::str::FromStr; use alloy_primitives::Bytes; -use ethportal_api::types::portal::{FindContentInfo, GetContentInfo}; +use ethportal_api::types::portal::{FindContentInfo, GetContentInfo, PutContentInfo}; use ethportal_api::types::portal_wire::MAX_PORTAL_CONTENT_PAYLOAD_SIZE; use ethportal_api::{ ContentValue, Discv5ApiClient, HistoryContentKey, HistoryContentValue, HistoryNetworkApiClient, @@ -180,10 +180,10 @@ dyn_async! { // Test gossiping a collection of blocks to node B (B will gossip back to A) test.run( NClientTestSpec { - name: format!("GOSSIP blocks from A:{} --> B:{}", client_a.name, client_b.name), + name: format!("PUT CONTENT blocks from A:{} --> B:{}", client_a.name, client_b.name), description: "".to_string(), always_run: false, - run: test_gossip_two_nodes, + run: test_put_content_two_nodes, environments: None, test_data: content.clone(), clients: vec![client_a.clone(), client_b.clone()], @@ -425,7 +425,7 @@ dyn_async! { } dyn_async! { - async fn test_gossip_two_nodes<'a> (clients: Vec, test_data: TestData) { + async fn test_put_content_two_nodes<'a> (clients: Vec, test_data: TestData) { let (client_a, client_b) = match clients.iter().collect_tuple() { Some((client_a, client_b)) => (client_a, client_b), None => panic!("Unable to get expected amount of clients from NClientTestSpec"), @@ -445,10 +445,10 @@ dyn_async! { // With default node settings nodes should be storing all content for (content_key, content_value) in test_data.clone() { - match client_a.rpc.gossip(content_key.clone(), content_value.encode()).await { - Ok(nodes_gossiped_to) => { - if nodes_gossiped_to != 1 { - panic!("We expected to gossip to 1 node instead we gossiped to: {nodes_gossiped_to}"); + match client_a.rpc.put_content(content_key.clone(), content_value.encode()).await { + Ok(PutContentInfo { peer_count, .. }) => { + if peer_count != 1 { + panic!("We expected to gossip to 1 node instead we gossiped to: {peer_count}"); } } Err(err) => panic!("Unable to get received content: {err:?}"), diff --git a/simulators/portal/src/suites/state/interop.rs b/simulators/portal/src/suites/state/interop.rs index 1f5c846407..5c4511a7d4 100644 --- a/simulators/portal/src/suites/state/interop.rs +++ b/simulators/portal/src/suites/state/interop.rs @@ -9,7 +9,7 @@ use ethportal_api::jsonrpsee::http_client::HttpClient; use ethportal_api::types::execution::header_with_proof::{ BlockHeaderProof, HeaderWithProof, SszNone, }; -use ethportal_api::types::portal::{FindContentInfo, GetContentInfo}; +use ethportal_api::types::portal::{FindContentInfo, GetContentInfo, PutContentInfo}; use ethportal_api::types::portal_wire::MAX_PORTAL_CONTENT_PAYLOAD_SIZE; use ethportal_api::utils::bytes::hex_encode; use ethportal_api::{ @@ -196,10 +196,10 @@ dyn_async! { // Test gossiping a collection of blocks to node B (B will gossip back to A) test.run( NClientTestSpec { - name: format!("GOSSIP blocks from A:{} --> B:{}", client_a.name, client_b.name), + name: format!("PUT CONTENT blocks from A:{} --> B:{}", client_a.name, client_b.name), description: "".to_string(), always_run: false, - run: test_gossip_two_nodes, + run: test_put_content_two_nodes, environments: environments.clone(), test_data: content.clone(), clients: vec![client_a.clone(), client_b.clone()], @@ -439,7 +439,7 @@ dyn_async! { } dyn_async! { - async fn test_gossip_two_nodes<'a> (clients: Vec, test_data: Vec) { + async fn test_put_content_two_nodes<'a> (clients: Vec, test_data: Vec) { let (client_a, client_b) = match clients.iter().collect_tuple() { Some((client_a, client_b)) => (client_a, client_b), None => panic!("Unable to get expected amount of clients from NClientTestSpec"), @@ -461,10 +461,10 @@ dyn_async! { for TestData { header, key: content_key, offer_value: content_offer_value, .. } in test_data.clone() { store_header(header, &client_b.rpc).await; - match client_a.rpc.gossip(content_key.clone(), content_offer_value.encode()).await { - Ok(nodes_gossiped_to) => { - if nodes_gossiped_to != 1 { - panic!("We expected to gossip to 1 node instead we gossiped to: {nodes_gossiped_to}"); + match client_a.rpc.put_content(content_key.clone(), content_offer_value.encode()).await { + Ok(PutContentInfo { peer_count, .. }) => { + if peer_count != 1 { + panic!("We expected to gossip to 1 node instead we gossiped to: {peer_count}"); } } Err(err) => panic!("Unable to get received content: {err:?}"), From c30dd4246d025ff52dc5542f19db1ab0b8439333 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Fri, 3 Jan 2025 21:00:02 +0100 Subject: [PATCH 364/387] simulators/ethereum/engine: remove terminal total difficulty (#1186) * simulators/ethereum/engine: WIP removing terminal total difficulty * simulators/ethereum/engine: upgrade to go-ethereum v1.14.12 * simulators/ethereum/engine: WIP removing ttd * simulators/ethereum/engine: call InitChain at start of test * simulators/ethereum/engine: remove ttd in main * simulators/ethereum/engine: remove configurability of london and merge fork * simulators/ethereum/engine: fixup * simulators/ethereum/engine: fixup genesis * simulators/ethereum/engine: add comment * simulators/ethereum/engine: change difficulty check * simulators/ethereum/engine/config/cancun: fix deprecation warning * simulators/ethereum/engine/config: remove even more config support --- simulators/ethereum/engine/client/engine.go | 4 - .../engine/client/hive_rpc/hive_rpc.go | 65 ++----------- .../ethereum/engine/client/node/node.go | 95 ++++--------------- simulators/ethereum/engine/clmock/clmock.go | 61 ++---------- .../ethereum/engine/config/cancun/genesis.go | 3 +- simulators/ethereum/engine/config/fork.go | 2 - simulators/ethereum/engine/config/genesis.go | 19 +--- simulators/ethereum/engine/go.mod | 27 +++--- simulators/ethereum/engine/go.sum | 46 ++++----- simulators/ethereum/engine/helper/helper.go | 89 ----------------- simulators/ethereum/engine/init/genesis.json | 3 +- simulators/ethereum/engine/main.go | 26 ++--- .../ethereum/engine/suites/auth/tests.go | 2 +- .../ethereum/engine/suites/cancun/config.go | 3 - .../ethereum/engine/suites/engine/bad_hash.go | 6 -- .../ethereum/engine/suites/engine/fork_id.go | 9 -- .../engine/suites/engine/forkchoice.go | 6 -- .../engine/suites/engine/invalid_ancestor.go | 7 -- .../engine/suites/engine/invalid_payload.go | 9 -- .../ethereum/engine/suites/engine/misc.go | 50 ---------- .../suites/engine/payload_attributes.go | 3 - .../engine/suites/engine/payload_execution.go | 15 --- .../engine/suites/engine/payload_id.go | 3 - .../engine/suites/engine/prev_randao.go | 2 - .../ethereum/engine/suites/engine/reorg.go | 18 ---- .../ethereum/engine/suites/engine/rpc.go | 3 - .../suites/engine/suggested_fee_recipient.go | 3 - .../ethereum/engine/suites/engine/tests.go | 10 -- .../engine/suites/engine/versioning.go | 3 - .../ethereum/engine/suites/sync/tests.go | 16 +--- .../engine/suites/withdrawals/tests.go | 14 --- simulators/ethereum/engine/test/env.go | 14 ++- simulators/ethereum/engine/test/spec.go | 11 --- simulators/ethereum/engine/types/types.go | 2 +- 34 files changed, 92 insertions(+), 557 deletions(-) delete mode 100644 simulators/ethereum/engine/suites/engine/misc.go diff --git a/simulators/ethereum/engine/client/engine.go b/simulators/ethereum/engine/client/engine.go index a330511c6c..370995a971 100644 --- a/simulators/ethereum/engine/client/engine.go +++ b/simulators/ethereum/engine/client/engine.go @@ -72,10 +72,6 @@ type EngineClient interface { GetNextAccountNonce(testCtx context.Context, account common.Address, head *types.Header) (uint64, error) UpdateNonce(testCtx context.Context, account common.Address, newNonce uint64) error - // TTD Methods - TerminalTotalDifficulty() *big.Int - GetTotalDifficulty(context.Context) (*big.Int, error) - // Test Methods PostRunVerifications() error diff --git a/simulators/ethereum/engine/client/hive_rpc/hive_rpc.go b/simulators/ethereum/engine/client/hive_rpc/hive_rpc.go index 7d1c79a630..fe037ff8fc 100644 --- a/simulators/ethereum/engine/client/hive_rpc/hive_rpc.go +++ b/simulators/ethereum/engine/client/hive_rpc/hive_rpc.go @@ -2,7 +2,6 @@ package hive_rpc import ( "context" - "encoding/json" "fmt" "math/big" "net" @@ -30,12 +29,11 @@ import ( type HiveRPCEngineStarter struct { // Client parameters used to launch the default client - ClientType string - ChainFile string - TerminalTotalDifficulty *big.Int - EnginePort int - EthPort int - JWTSecret []byte + ClientType string + ChainFile string + EnginePort int + EthPort int + JWTSecret []byte } var _ client.EngineStarter = (*HiveRPCEngineStarter)(nil) @@ -46,7 +44,6 @@ func (s HiveRPCEngineStarter) StartClient(T *hivesim.T, testContext context.Cont enginePort = s.EnginePort ethPort = s.EthPort jwtSecret = s.JWTSecret - ttd = s.TerminalTotalDifficulty ) if clientType == "" { cs, err := T.Sim.ClientTypes() @@ -70,20 +67,6 @@ func (s HiveRPCEngineStarter) StartClient(T *hivesim.T, testContext context.Cont if s.ChainFile != "" { ClientFiles = ClientFiles.Set("/chain.rlp", "./chains/"+s.ChainFile) } - if ttd == nil { - if ttdStr, ok := ClientParams["HIVE_TERMINAL_TOTAL_DIFFICULTY"]; ok { - // Retrieve TTD from parameters - ttd, ok = new(big.Int).SetString(ttdStr, 10) - if !ok { - return nil, fmt.Errorf("unable to parse TTD from parameters") - } - } - } else { - // Real TTD must be calculated adding the genesis difficulty - ttdInt := helper.CalculateRealTTD(genesis, ttd.Int64()) - ClientParams = ClientParams.Set("HIVE_TERMINAL_TOTAL_DIFFICULTY", fmt.Sprintf("%d", ttdInt)) - ttd = big.NewInt(ttdInt) - } if len(bootClients) > 0 { var ( enodes = make([]string, len(bootClients)) @@ -108,7 +91,7 @@ func (s HiveRPCEngineStarter) StartClient(T *hivesim.T, testContext context.Cont if err := CheckEthEngineLive(c); err != nil { return nil, fmt.Errorf("Engine/Eth ports were never open for client: %v", err) } - ec := NewHiveRPCEngineClient(c, enginePort, ethPort, jwtSecret, ttd, &helper.LoggingRoundTrip{ + ec := NewHiveRPCEngineClient(c, enginePort, ethPort, jwtSecret, &helper.LoggingRoundTrip{ Logger: T, ID: c.Container, Inner: http.DefaultTransport, @@ -154,7 +137,6 @@ type HiveRPCEngineClient struct { h *hivesim.Client c *rpc.Client cEth *rpc.Client - ttd *big.Int JWTSecretBytes []byte // Engine updates info @@ -173,7 +155,7 @@ type HiveRPCEngineClient struct { var _ client.EngineClient = (*HiveRPCEngineClient)(nil) // NewClient creates a engine client that uses the given RPC client. -func NewHiveRPCEngineClient(h *hivesim.Client, enginePort int, ethPort int, jwtSecretBytes []byte, ttd *big.Int, transport http.RoundTripper) *HiveRPCEngineClient { +func NewHiveRPCEngineClient(h *hivesim.Client, enginePort int, ethPort int, jwtSecretBytes []byte, transport http.RoundTripper) *HiveRPCEngineClient { // Prepare HTTP Client httpClient := rpc.WithHTTPClient(&http.Client{Transport: transport}) @@ -193,7 +175,6 @@ func NewHiveRPCEngineClient(h *hivesim.Client, enginePort int, ethPort int, jwtS c: engineRpcClient, Client: eth, cEth: ethRpcClient, - ttd: ttd, JWTSecretBytes: jwtSecretBytes, accTxInfoMap: make(map[common.Address]*AccountTransactionInfo), } @@ -207,10 +188,6 @@ func (ec *HiveRPCEngineClient) EnodeURL() (string, error) { return ec.h.EnodeURL() } -func (ec *HiveRPCEngineClient) TerminalTotalDifficulty() *big.Int { - return ec.ttd -} - var ( Head *big.Int // Nil Pending = big.NewInt(-2) @@ -275,34 +252,6 @@ func (ec *HiveRPCEngineClient) HeaderByNumber(ctx context.Context, number *big.I return header, err } -// Helper structs to fetch the TotalDifficulty -type TD struct { - TotalDifficulty *hexutil.Big `json:"totalDifficulty"` -} -type TotalDifficultyHeader struct { - types.Header - TD -} - -func (tdh *TotalDifficultyHeader) UnmarshalJSON(data []byte) error { - if err := json.Unmarshal(data, &tdh.Header); err != nil { - return err - } - if err := json.Unmarshal(data, &tdh.TD); err != nil { - return err - } - return nil -} - -func (ec *HiveRPCEngineClient) GetTotalDifficulty(ctx context.Context) (*big.Int, error) { - var td *TotalDifficultyHeader - if err := ec.cEth.CallContext(ctx, &td, "eth_getBlockByNumber", "latest", false); err == nil { - return td.TotalDifficulty.ToInt(), nil - } else { - return nil, err - } -} - func (ec *HiveRPCEngineClient) Close() error { ec.c.Close() ec.Client.Close() diff --git a/simulators/ethereum/engine/client/node/node.go b/simulators/ethereum/engine/client/node/node.go index 75f88952af..3acdd10cd3 100644 --- a/simulators/ethereum/engine/client/node/node.go +++ b/simulators/ethereum/engine/client/node/node.go @@ -27,12 +27,10 @@ import ( "github.com/ethereum/go-ethereum/node" "github.com/ethereum/go-ethereum/p2p" "github.com/ethereum/go-ethereum/p2p/enode" - "github.com/ethereum/go-ethereum/params" "github.com/ethereum/go-ethereum/rlp" "github.com/ethereum/go-ethereum/rpc" "github.com/ethereum/hive/hivesim" "github.com/ethereum/hive/simulators/ethereum/engine/client" - "github.com/ethereum/hive/simulators/ethereum/engine/helper" typ "github.com/ethereum/hive/simulators/ethereum/engine/types" "github.com/pkg/errors" ) @@ -53,8 +51,7 @@ type GethNodeTestConfiguration struct { } type GethNodeEngineStarter struct { // Client parameters used to launch the default client - ChainFile string - TerminalTotalDifficulty *big.Int + ChainFile string // Test specific configuration Config GethNodeTestConfiguration @@ -69,29 +66,7 @@ func (s GethNodeEngineStarter) StartClient(T *hivesim.T, testContext context.Con } func (s GethNodeEngineStarter) StartGethNode(T *hivesim.T, testContext context.Context, genesis *core.Genesis, ClientParams hivesim.Params, ClientFiles hivesim.Params, bootClients ...client.EngineClient) (*GethNode, error) { - var ( - ttd = s.TerminalTotalDifficulty - err error - ) - - if ttd == nil { - if ttdStr, ok := ClientParams["HIVE_TERMINAL_TOTAL_DIFFICULTY"]; ok { - // Retrieve TTD from parameters - ttd, ok = new(big.Int).SetString(ttdStr, 10) - if !ok { - return nil, fmt.Errorf("Unable to parse TTD from parameters") - } - } - } else { - ttd = big.NewInt(helper.CalculateRealTTD(genesis, ttd.Int64())) - ClientParams = ClientParams.Set("HIVE_TERMINAL_TOTAL_DIFFICULTY", fmt.Sprintf("%d", ttd)) - } - - // Not sure if this hack works - genesisCopy := *genesis - configCopy := *genesisCopy.Config - configCopy.TerminalTotalDifficulty = ttd - genesisCopy.Config = &configCopy + var err error var enodes []string if bootClients != nil && len(bootClients) > 0 { @@ -116,7 +91,7 @@ func (s GethNodeEngineStarter) StartGethNode(T *hivesim.T, testContext context.C } } - g, err := newNode(s.Config, enodes, &genesisCopy) + g, err := newNode(s.Config, enodes, genesis) if err != nil { return nil, err } @@ -138,6 +113,7 @@ type AccountTransactionInfo struct { PreviousBlock common.Hash PreviousNonce uint64 } + type GethNode struct { node *node.Node eth *eth.Ethereum @@ -146,7 +122,6 @@ type GethNode struct { datadir string genesis *core.Genesis - ttd *big.Int api *ethcatalyst.ConsensusAPI running context.Context closing context.CancelFunc @@ -183,7 +158,6 @@ func restart(startConfig GethNodeTestConfiguration, bootnodes []string, datadir } config := &node.Config{ Name: startConfig.Name, - Version: params.Version, DataDir: datadir, P2P: p2p.Config{ ListenAddr: "0.0.0.0:0", @@ -200,22 +174,16 @@ func restart(startConfig GethNodeTestConfiguration, bootnodes []string, datadir if genesis == nil || genesis.Config == nil { return nil, fmt.Errorf("genesis configuration is nil") } - if genesis.Config.TerminalTotalDifficultyPassed == false { - return nil, fmt.Errorf("genesis configuration is has not passed terminal total difficulty") - } econfig := ðconfig.Config{ - Genesis: genesis, - NetworkId: genesis.Config.ChainID.Uint64(), - SyncMode: downloader.FullSync, - DatabaseCache: 256, - DatabaseHandles: 256, - StateScheme: rawdb.PathScheme, - TxPool: ethconfig.Defaults.TxPool, - GPO: ethconfig.Defaults.GPO, - Miner: ethconfig.Defaults.Miner, - LightServ: 100, - LightPeers: int(startConfig.MaxPeers.Int64()) - 1, - LightNoSyncServe: true, + Genesis: genesis, + NetworkId: genesis.Config.ChainID.Uint64(), + SyncMode: downloader.FullSync, + DatabaseCache: 256, + DatabaseHandles: 256, + StateScheme: rawdb.PathScheme, + TxPool: ethconfig.Defaults.TxPool, + GPO: ethconfig.Defaults.GPO, + Miner: ethconfig.Defaults.Miner, } ethBackend, err := eth.New(stack, econfig) if err != nil { @@ -248,7 +216,6 @@ func restart(startConfig GethNodeTestConfiguration, bootnodes []string, datadir eth: ethBackend, datadir: datadir, genesis: genesis, - ttd: genesis.Config.TerminalTotalDifficulty, api: ethcatalyst.NewConsensusAPI(ethBackend), accTxInfoMap: make(map[common.Address]*AccountTransactionInfo), // Test related configuration @@ -352,7 +319,7 @@ type validator struct{} func (v *validator) ValidateBody(block *types.Block) error { return nil } -func (v *validator) ValidateState(block *types.Block, state *state.StateDB, receipts types.Receipts, usedGas uint64, stateless bool) error { +func (v *validator) ValidateState(block *types.Block, state *state.StateDB, result *core.ProcessResult, stateless bool) error { return nil } func (v *validator) ValidateWitness(witness *stateless.Witness, receiptRoot common.Hash, stateRoot common.Hash) error { @@ -361,8 +328,8 @@ func (v *validator) ValidateWitness(witness *stateless.Witness, receiptRoot comm type processor struct{} -func (p *processor) Process(block *types.Block, statedb *state.StateDB, cfg vm.Config) (types.Receipts, []*types.Log, uint64, error) { - return types.Receipts{}, []*types.Log{}, 21000, nil +func (p *processor) Process(block *types.Block, statedb *state.StateDB, cfg vm.Config) (*core.ProcessResult, error) { + return &core.ProcessResult{GasUsed: 21000}, nil } var headerPrefix = []byte("h") // headerPrefix + num (uint64 big endian) + hash -> header @@ -396,17 +363,17 @@ func (n *GethNode) SetBlock(block *types.Block, parentNumber uint64, parentRoot bc := n.eth.BlockChain() bc.SetBlockValidatorAndProcessorForTesting(new(validator), n.eth.BlockChain().Processor()) - statedb, err := state.New(parentRoot, bc.StateCache(), bc.Snapshots()) + statedb, err := state.New(parentRoot, bc.StateCache()) if err != nil { return errors.Wrap(err, "failed to create state db") } statedb.StartPrefetcher("chain", nil) var failedProcessing bool - receipts, _, _, err := n.eth.BlockChain().Processor().Process(block, statedb, *n.eth.BlockChain().GetVMConfig()) + result, err := n.eth.BlockChain().Processor().Process(block, statedb, *n.eth.BlockChain().GetVMConfig()) if err != nil { failedProcessing = true } - rawdb.WriteReceipts(db, block.Hash(), block.NumberU64(), receipts) + rawdb.WriteReceipts(db, block.Hash(), block.NumberU64(), result.Receipts) root, err := statedb.Commit(block.NumberU64(), false) if err != nil { return errors.Wrap(err, "failed to commit state") @@ -681,7 +648,7 @@ func (n *GethNode) getStateDB(ctx context.Context, blockNumber *big.Int) (*state if err != nil { return nil, err } - return state.New(b.Root(), n.eth.BlockChain().StateCache(), n.eth.BlockChain().Snapshots()) + return state.New(b.Root(), n.eth.BlockChain().StateCache()) } func (n *GethNode) BalanceAt(ctx context.Context, account common.Address, blockNumber *big.Int) (*big.Int, error) { @@ -724,28 +691,6 @@ func (n *GethNode) PendingTransactionCount(ctx context.Context) (uint, error) { panic("NOT IMPLEMENTED") } -func (n *GethNode) GetBlockTotalDifficulty(ctx context.Context, hash common.Hash) (*big.Int, error) { - block := n.eth.BlockChain().GetBlockByHash(hash) - if block == nil { - return big.NewInt(0), nil - } - return n.eth.BlockChain().GetTd(hash, block.NumberU64()), nil -} - -func (n *GethNode) GetTotalDifficulty(ctx context.Context) (*big.Int, error) { - if n.mustHeadBlock != nil { - return n.GetBlockTotalDifficulty(ctx, n.mustHeadBlock.Hash()) - } - return n.GetBlockTotalDifficulty(ctx, n.eth.BlockChain().CurrentHeader().Hash()) -} - -func (n *GethNode) TerminalTotalDifficulty() *big.Int { - if n.ttd != nil { - return n.ttd - } - return n.genesis.Config.TerminalTotalDifficulty -} - func (n *GethNode) EnodeURL() (string, error) { return n.node.Server().NodeInfo().Enode, nil } diff --git a/simulators/ethereum/engine/clmock/clmock.go b/simulators/ethereum/engine/clmock/clmock.go index b58c5aa18a..f66f1673b7 100644 --- a/simulators/ethereum/engine/clmock/clmock.go +++ b/simulators/ethereum/engine/clmock/clmock.go @@ -4,7 +4,6 @@ import ( "context" "crypto/sha256" "encoding/binary" - "encoding/json" "fmt" "math/big" "math/rand" @@ -18,7 +17,6 @@ import ( "github.com/ethereum/hive/simulators/ethereum/engine/config" "github.com/ethereum/hive/simulators/ethereum/engine/config/cancun" "github.com/ethereum/hive/simulators/ethereum/engine/globals" - "github.com/ethereum/hive/simulators/ethereum/engine/helper" typ "github.com/ethereum/hive/simulators/ethereum/engine/types" "github.com/ethereum/go-ethereum/common" @@ -67,6 +65,7 @@ func (h ExecutableDataHistory) LatestWithdrawalsIndex() uint64 { // Consensus Layer Client Mock used to sync the Execution Clients once the TTD has been reached type CLMocker struct { *hivesim.T + // List of Engine Clients being served by the CL Mocker EngineClients []client.EngineClient // Lock required so no client is offboarded during block production. @@ -111,7 +110,6 @@ type CLMocker struct { // Merge related FirstPoSBlockNumber *big.Int - TTDReached bool TransitionPayloadTimestamp *big.Int SafeSlotsToImportOptimistically *big.Int ChainTotalDifficulty *big.Int @@ -148,18 +146,16 @@ func NewCLMocker(t *hivesim.T, genesis *core.Genesis, forkConfig *config.ForkCon LatestHeader: nil, FirstPoSBlockNumber: nil, LatestHeadNumber: nil, - TTDReached: false, NextFeeRecipient: common.Address{}, LatestForkchoice: api.ForkchoiceStateV1{ HeadBlockHash: common.Hash{}, SafeBlockHash: common.Hash{}, FinalizedBlockHash: common.Hash{}, }, - ChainTotalDifficulty: genesis.Difficulty, - ForkConfig: forkConfig, - Genesis: genesis, - TestContext: context.Background(), - Rand: randSource, + ForkConfig: forkConfig, + Genesis: genesis, + TestContext: context.Background(), + Rand: randSource, } // Create header history @@ -180,6 +176,7 @@ func (cl *CLMocker) GenesisBlock() *types.Block { func (cl *CLMocker) AddEngineClient(ec client.EngineClient) { cl.EngineClientsLock.Lock() defer cl.EngineClientsLock.Unlock() + cl.Logf("CLMocker: Adding engine client %v", ec.ID()) cl.EngineClients = append(cl.EngineClients, ec) } @@ -261,8 +258,8 @@ func (cl *CLMocker) GetHeaders(amount uint64, originHash common.Hash, originNumb return headers, nil } -// Sets the specified client's chain head as Terminal PoW block by sending the initial forkchoiceUpdated. -func (cl *CLMocker) SetTTDBlockClient(ec client.EngineClient) { +// InitChain sets the test chain head block and initial forkchoiceUpdated. +func (cl *CLMocker) InitChain(ec client.EngineClient) { var err error ctx, cancel := context.WithTimeout(cl.TestContext, globals.RPCTimeout) defer cancel() @@ -273,22 +270,10 @@ func (cl *CLMocker) SetTTDBlockClient(ec client.EngineClient) { } cl.HeaderHistory[cl.LatestHeader.Number.Uint64()] = cl.LatestHeader - ctx, cancel = context.WithTimeout(cl.TestContext, globals.RPCTimeout) - defer cancel() - - if td, err := ec.GetTotalDifficulty(ctx); err != nil { - cl.Fatalf("CLMocker: Error getting total difficulty from engine client: %v", err) - } else if td.Cmp(ec.TerminalTotalDifficulty()) < 0 { - cl.Fatalf("CLMocker: Attempted to set TTD Block when TTD had not been reached: %d > %d", ec.TerminalTotalDifficulty(), td) - } else { - cl.Logf("CLMocker: TTD has been reached at block %d (%d>=%d)\n", cl.LatestHeader.Number, td, ec.TerminalTotalDifficulty()) - jsH, _ := json.MarshalIndent(cl.LatestHeader, "", " ") - cl.Logf("CLMocker: Client: %s, Block %d: %s\n", ec.ID(), cl.LatestHeader.Number, jsH) - cl.ChainTotalDifficulty = td + if cl.LatestHeader.Difficulty.Cmp(cl.Genesis.Difficulty) != 0 { + cl.Fatalf("CLMocker: invalid difficulty %d on latest header, expected", cl.LatestHeader.Difficulty, cl.Genesis.Difficulty) } - cl.TTDReached = true - // Reset transition values cl.LatestHeadNumber = cl.LatestHeader.Number cl.HeadHashHistory = []common.Hash{} @@ -297,26 +282,6 @@ func (cl *CLMocker) SetTTDBlockClient(ec client.EngineClient) { // Prepare initial forkchoice, to be sent to the transition payload producer cl.LatestForkchoice = api.ForkchoiceStateV1{} cl.LatestForkchoice.HeadBlockHash = cl.LatestHeader.Hash() - -} - -// This method waits for TTD in at least one of the clients, then sends the -// initial forkchoiceUpdated with the info obtained from the client. -func (cl *CLMocker) WaitForTTD() { - ec, err := helper.WaitAnyClientForTTD(cl.EngineClients, cl.TestContext) - if ec == nil || err != nil { - cl.Fatalf("CLMocker: Error while waiting for TTD: %v", err) - } - // One of the clients has reached TTD, send the initial fcU with this client as head - cl.SetTTDBlockClient(ec) -} - -// Check whether a block number is a PoS block -func (cl *CLMocker) IsBlockPoS(bn *big.Int) bool { - if cl.FirstPoSBlockNumber == nil || cl.FirstPoSBlockNumber.Cmp(bn) > 0 { - return false - } - return true } // Return the per-block timestamp value increment @@ -521,7 +486,6 @@ func (cl *CLMocker) GetNextPayload() { } func (cl *CLMocker) broadcastNextNewPayload() { - // Broadcast the executePayload to all clients version := cl.ForkConfig.NewPayloadVersion(cl.LatestPayloadBuilt.Timestamp) validations := 0 @@ -599,11 +563,6 @@ type BlockProcessCallbacks struct { } func (cl *CLMocker) ProduceSingleBlock(callbacks BlockProcessCallbacks) { - - if !cl.TTDReached { - cl.Fatalf("CLMocker: Attempted to create a block when the TTD had not yet been reached") - } - // Lock needed to ensure EngineClients is not modified mid block production cl.EngineClientsLock.Lock() defer cl.EngineClientsLock.Unlock() diff --git a/simulators/ethereum/engine/config/cancun/genesis.go b/simulators/ethereum/engine/config/cancun/genesis.go index d7f0dd607d..d3171a165a 100644 --- a/simulators/ethereum/engine/config/cancun/genesis.go +++ b/simulators/ethereum/engine/config/cancun/genesis.go @@ -6,6 +6,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/types" ) // ConfigGenesis configures the genesis block for the Cancun fork. @@ -67,7 +68,7 @@ func ConfigTestAccounts(genesis *core.Genesis) error { if _, ok := genesis.Alloc[address]; ok { panic(fmt.Errorf("reused address %s during genesis configuration for cancun", address.Hex())) } - genesis.Alloc[address] = core.GenesisAccount{ + genesis.Alloc[address] = types.Account{ Code: datahashCode, Balance: common.Big0, } diff --git a/simulators/ethereum/engine/config/fork.go b/simulators/ethereum/engine/config/fork.go index a02147f3db..04fe580245 100644 --- a/simulators/ethereum/engine/config/fork.go +++ b/simulators/ethereum/engine/config/fork.go @@ -30,8 +30,6 @@ func (f Fork) PreviousFork() Fork { } type ForkConfig struct { - LondonNumber *big.Int - ParisNumber *big.Int ShanghaiTimestamp *big.Int CancunTimestamp *big.Int } diff --git a/simulators/ethereum/engine/config/genesis.go b/simulators/ethereum/engine/config/genesis.go index 3436e2e44d..51444940c7 100644 --- a/simulators/ethereum/engine/config/genesis.go +++ b/simulators/ethereum/engine/config/genesis.go @@ -2,25 +2,17 @@ package config import ( "fmt" + "math/big" - "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core" "github.com/ethereum/hive/simulators/ethereum/engine/config/cancun" ) func (f *ForkConfig) ConfigGenesis(genesis *core.Genesis) error { - if f.ParisNumber != nil { - genesis.Config.MergeNetsplitBlock = f.ParisNumber - if genesis.Number >= f.ParisNumber.Uint64() { - removePoW(genesis) - } - } + genesis.Config.MergeNetsplitBlock = big.NewInt(0) if f.ShanghaiTimestamp != nil { shanghaiTime := f.ShanghaiTimestamp.Uint64() genesis.Config.ShanghaiTime = &shanghaiTime - if genesis.Timestamp >= shanghaiTime { - removePoW(genesis) - } } if f.CancunTimestamp != nil { if err := cancun.ConfigGenesis(genesis, f.CancunTimestamp.Uint64()); err != nil { @@ -29,10 +21,3 @@ func (f *ForkConfig) ConfigGenesis(genesis *core.Genesis) error { } return nil } - -func removePoW(genesis *core.Genesis) { - genesis.Difficulty = common.Big0 - genesis.Config.TerminalTotalDifficulty = common.Big0 - genesis.Config.Clique = nil - genesis.ExtraData = []byte{} -} diff --git a/simulators/ethereum/engine/go.mod b/simulators/ethereum/engine/go.mod index 424e90d3e0..bc1ad87e13 100644 --- a/simulators/ethereum/engine/go.mod +++ b/simulators/ethereum/engine/go.mod @@ -1,16 +1,16 @@ module github.com/ethereum/hive/simulators/ethereum/engine -go 1.21 +go 1.22 -toolchain go1.22.1 +toolchain go1.23.4 require ( github.com/crate-crypto/go-kzg-4844 v1.0.0 github.com/davecgh/go-spew v1.1.1 - github.com/ethereum/go-ethereum v1.14.7 + github.com/ethereum/go-ethereum v1.14.12 github.com/ethereum/hive v0.0.0-20240715150147-c87a99dccfce - github.com/golang-jwt/jwt/v4 v4.5.0 - github.com/holiman/uint256 v1.3.0 + github.com/golang-jwt/jwt/v4 v4.5.1 + github.com/holiman/uint256 v1.3.1 github.com/pkg/errors v0.9.1 golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa ) @@ -21,14 +21,13 @@ require ( github.com/VictoriaMetrics/fastcache v1.12.2 // indirect github.com/apapsch/go-jsonmerge/v2 v2.0.0 // indirect github.com/beorn7/perks v1.0.1 // indirect - github.com/bits-and-blooms/bitset v1.10.0 // indirect - github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect + github.com/bits-and-blooms/bitset v1.13.0 // indirect github.com/cespare/cp v1.1.1 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/cockroachdb/errors v1.11.3 // indirect github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce // indirect github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect - github.com/cockroachdb/pebble v1.1.1 // indirect + github.com/cockroachdb/pebble v1.1.2 // indirect github.com/cockroachdb/redact v1.1.5 // indirect github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect github.com/consensys/bavard v0.1.13 // indirect @@ -39,9 +38,8 @@ require ( github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 // indirect github.com/deepmap/oapi-codegen v1.12.4 // indirect github.com/ethereum/c-kzg-4844 v1.0.0 // indirect - github.com/ethereum/go-verkle v0.1.1-0.20240306133620-7d920df305f0 // indirect + github.com/ethereum/go-verkle v0.1.1-0.20240829091221-dffa7562dbe9 // indirect github.com/ferranbt/fastssz v0.1.2 // indirect - github.com/fjl/memsize v0.0.2 // indirect github.com/fsnotify/fsnotify v1.6.0 // indirect github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08 // indirect github.com/getsentry/sentry-go v0.27.0 // indirect @@ -87,24 +85,23 @@ require ( github.com/rs/cors v1.8.2 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect github.com/shirou/gopsutil v3.21.11+incompatible // indirect - github.com/status-im/keycard-go v0.2.0 // indirect - github.com/supranational/blst v0.3.11 // indirect + github.com/supranational/blst v0.3.13 // indirect github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a // indirect github.com/tklauser/go-sysconf v0.3.12 // indirect github.com/tklauser/numcpus v0.6.1 // indirect - github.com/tyler-smith/go-bip39 v1.1.0 // indirect github.com/urfave/cli/v2 v2.25.7 // indirect github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 // indirect github.com/yusufpapurcu/wmi v1.2.2 // indirect golang.org/x/crypto v0.22.0 // indirect golang.org/x/net v0.24.0 // indirect golang.org/x/sync v0.7.0 // indirect - golang.org/x/sys v0.20.0 // indirect + golang.org/x/sys v0.22.0 // indirect golang.org/x/text v0.14.0 // indirect golang.org/x/time v0.5.0 // indirect - google.golang.org/protobuf v1.33.0 // indirect + google.golang.org/protobuf v1.34.2 // indirect gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1 // indirect gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect rsc.io/tmplfunc v0.0.3 // indirect ) diff --git a/simulators/ethereum/engine/go.sum b/simulators/ethereum/engine/go.sum index 26c9231dbc..afc335249d 100644 --- a/simulators/ethereum/engine/go.sum +++ b/simulators/ethereum/engine/go.sum @@ -12,13 +12,9 @@ github.com/apapsch/go-jsonmerge/v2 v2.0.0 h1:axGnT1gRIfimI7gJifB699GoE/oq+F2MU7D github.com/apapsch/go-jsonmerge/v2 v2.0.0/go.mod h1:lvDnEdqiQrp0O42VQGgmlKpxL1AP2+08jFMw88y4klk= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bits-and-blooms/bitset v1.10.0 h1:ePXTeiPEazB5+opbv5fr8umg2R/1NlzgDsyepwsSr88= -github.com/bits-and-blooms/bitset v1.10.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= +github.com/bits-and-blooms/bitset v1.13.0 h1:bAQ9OPNFYbGHV6Nez0tmNI0RiEu7/hxlYJRUA0wFAVE= +github.com/bits-and-blooms/bitset v1.13.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= github.com/bmatcuk/doublestar v1.1.1/go.mod h1:UD6OnuiIn0yFxxA2le/rnRU1G4RaI4UvFv1sNto9p6w= -github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U= -github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= -github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= -github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= github.com/cespare/cp v1.1.1 h1:nCb6ZLdB7NRaqsm91JtQTAme2SKJzXVsdPIPkyJr1MU= github.com/cespare/cp v1.1.1/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= @@ -35,8 +31,8 @@ github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce h1:giXvy4KSc/6g/e github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce/go.mod h1:9/y3cnZ5GKakj/H4y9r9GTjCvAFta7KLgSHPJJYc52M= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= -github.com/cockroachdb/pebble v1.1.1 h1:XnKU22oiCLy2Xn8vp1re67cXg4SAasg/WDt1NtcRFaw= -github.com/cockroachdb/pebble v1.1.1/go.mod h1:4exszw1r40423ZsmkG/09AFEG83I0uDgfujJdbL6kYU= +github.com/cockroachdb/pebble v1.1.2 h1:CUh2IPtR4swHlEj48Rhfzw6l/d0qA31fItcIszQVIsA= +github.com/cockroachdb/pebble v1.1.2/go.mod h1:4exszw1r40423ZsmkG/09AFEG83I0uDgfujJdbL6kYU= github.com/cockroachdb/redact v1.1.5 h1:u1PMllDkdFfPWaNGMyLD1+so+aq3uUItthCFqzwPJ30= github.com/cockroachdb/redact v1.1.5/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo= @@ -65,16 +61,14 @@ github.com/deepmap/oapi-codegen v1.12.4 h1:pPmn6qI9MuOtCz82WY2Xaw46EQjgvxednXXrP github.com/deepmap/oapi-codegen v1.12.4/go.mod h1:3lgHGMu6myQ2vqbbTXH2H1o4eXFTGnFiDaOaKKl5yas= github.com/ethereum/c-kzg-4844 v1.0.0 h1:0X1LBXxaEtYD9xsyj9B9ctQEZIpnvVDeoBx8aHEwTNA= github.com/ethereum/c-kzg-4844 v1.0.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= -github.com/ethereum/go-ethereum v1.14.7 h1:EHpv3dE8evQmpVEQ/Ne2ahB06n2mQptdwqaMNhAT29g= -github.com/ethereum/go-ethereum v1.14.7/go.mod h1:Mq0biU2jbdmKSZoqOj29017ygFrMnB5/Rifwp980W4o= -github.com/ethereum/go-verkle v0.1.1-0.20240306133620-7d920df305f0 h1:KrE8I4reeVvf7C1tm8elRjj4BdscTYzz/WAbYyf/JI4= -github.com/ethereum/go-verkle v0.1.1-0.20240306133620-7d920df305f0/go.mod h1:D9AJLVXSyZQXJQVk8oh1EwjISE+sJTn2duYIZC0dy3w= +github.com/ethereum/go-ethereum v1.14.12 h1:8hl57x77HSUo+cXExrURjU/w1VhL+ShCTJrTwcCQSe4= +github.com/ethereum/go-ethereum v1.14.12/go.mod h1:RAC2gVMWJ6FkxSPESfbshrcKpIokgQKsVKmAuqdekDY= +github.com/ethereum/go-verkle v0.1.1-0.20240829091221-dffa7562dbe9 h1:8NfxH2iXvJ60YRB8ChToFTUzl8awsc3cJ8CbLjGIl/A= +github.com/ethereum/go-verkle v0.1.1-0.20240829091221-dffa7562dbe9/go.mod h1:M3b90YRnzqKyyzBEWJGqj8Qff4IDeXnzFw0P9bFw3uk= github.com/ethereum/hive v0.0.0-20240715150147-c87a99dccfce h1:wgH9mh3TFSd+LFSsXO6RdTEO3niapJRywO1Xl3/IoIE= github.com/ethereum/hive v0.0.0-20240715150147-c87a99dccfce/go.mod h1:ghNXZW+/WQClcyiwZpbTzUCyxwql7YeMacYd44v+BJE= github.com/ferranbt/fastssz v0.1.2 h1:Dky6dXlngF6Qjc+EfDipAkE83N5I5DE68bY6O0VLNPk= github.com/ferranbt/fastssz v0.1.2/go.mod h1:X5UPrE2u1UJjxHA8X54u04SBwdAQjG2sFtWs39YxyWs= -github.com/fjl/memsize v0.0.2 h1:27txuSD9or+NZlnOWdKUxeBzTAUkWCVh+4Gf2dWFOzA= -github.com/fjl/memsize v0.0.2/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= @@ -99,8 +93,8 @@ github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= -github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= +github.com/golang-jwt/jwt/v4 v4.5.1 h1:JdqV9zKUdtaa9gdPlywC3aeoEsR681PlKC+4F5gQgeo= +github.com/golang-jwt/jwt/v4 v4.5.1/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= @@ -141,8 +135,8 @@ github.com/holiman/billy v0.0.0-20240216141850-2abb0c79d3c4 h1:X4egAf/gcS1zATw6w github.com/holiman/billy v0.0.0-20240216141850-2abb0c79d3c4/go.mod h1:5GuXa7vkL8u9FkFuWdVvfR5ix8hRB7DbOAaYULamFpc= github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao= github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA= -github.com/holiman/uint256 v1.3.0 h1:4wdcm/tnd0xXdu7iS3ruNvxkWwrb4aeBQv19ayYn8F4= -github.com/holiman/uint256 v1.3.0/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXeiRV4ng7E= +github.com/holiman/uint256 v1.3.1 h1:JfTzmih28bittyHM8z360dCjIA9dbPIBlcTI6lmctQs= +github.com/holiman/uint256 v1.3.1/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXeiRV4ng7E= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/huin/goupnp v1.3.0 h1:UvLUlWDNpoUdYzb2TCn+MuTWtcjXKSza2n6CBdQ0xXc= github.com/huin/goupnp v1.3.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8= @@ -242,8 +236,6 @@ github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQD github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI= github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= github.com/spkg/bom v0.0.0-20160624110644-59b7046e48ad/go.mod h1:qLr4V1qq6nMqFKkMo8ZTx3f+BZEkzsRUY10Xsm2mwU0= -github.com/status-im/keycard-go v0.2.0 h1:QDLFswOQu1r5jsycloeQh3bVU8n/NatHHaZobtDnDzA= -github.com/status-im/keycard-go v0.2.0/go.mod h1:wlp8ZLbsmrF6g6WjugPAx+IzoLrkdf9+mHxBEeo3Hbg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= @@ -252,16 +244,14 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -github.com/supranational/blst v0.3.11 h1:LyU6FolezeWAhvQk0k6O/d49jqgO52MSDDfYgbeoEm4= -github.com/supranational/blst v0.3.11/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= +github.com/supranational/blst v0.3.13 h1:AYeSxdOMacwu7FBmpfloBz5pbFXDmJL33RuwnKtmTjk= +github.com/supranational/blst v0.3.13/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a h1:1ur3QoCqvE5fl+nylMaIr9PVV1w343YRDtsy+Rwu7XI= github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a/go.mod h1:RRCYJbIwD5jmqPI9XoAFR0OcDxqUctll6zUj/+B4S48= github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= -github.com/tyler-smith/go-bip39 v1.1.0 h1:5eUemwrMargf3BSLRRCalXT93Ns6pQJIjYQN2nyfOP8= -github.com/tyler-smith/go-bip39 v1.1.0/go.mod h1:gUYDtqQw1JS3ZJ8UWVcGTGqqr6YIN3CWg+kkNaLt55U= github.com/urfave/cli/v2 v2.25.7 h1:VAzn5oq403l5pHjc4OhD54+XGO9cdKVL/7lDjF+iKUs= github.com/urfave/cli/v2 v2.25.7/go.mod h1:8qnjx1vcq5s2/wpsqoZFndg2CE5tNFyrTvS6SinrnYQ= github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU= @@ -325,8 +315,8 @@ golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.22.0 h1:RI27ohtqKCnwULzJLqkv897zojh5/DwS/ENaMzUOaWI= +golang.org/x/sys v0.22.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -355,8 +345,8 @@ google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzi google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= -google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg= +google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= diff --git a/simulators/ethereum/engine/helper/helper.go b/simulators/ethereum/engine/helper/helper.go index 349a732b4c..9f01716c83 100644 --- a/simulators/ethereum/engine/helper/helper.go +++ b/simulators/ethereum/engine/helper/helper.go @@ -2,8 +2,6 @@ package helper import ( "context" - "sync" - "time" "bytes" "encoding/json" @@ -15,9 +13,6 @@ import ( "github.com/pkg/errors" - "github.com/ethereum/hive/simulators/ethereum/engine/client" - "github.com/ethereum/hive/simulators/ethereum/engine/globals" - gokzg4844 "github.com/crate-crypto/go-kzg-4844" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core" @@ -265,87 +260,3 @@ func CalculateTotalDifficulty(genesis core.Genesis, chain types.Blocks, lastBloc func CalculateRealTTD(g *core.Genesis, ttdValue int64) int64 { return g.Difficulty.Int64() + ttdValue } - -var ( - // Time between checks of a client reaching Terminal Total Difficulty - TTDCheckPeriod = time.Second * 1 -) - -// TTD Check Methods -func CheckTTD(ec client.EngineClient, ctx context.Context) (bool, error) { - ctx, cancel := context.WithTimeout(ctx, globals.RPCTimeout) - defer cancel() - td, err := ec.GetTotalDifficulty(ctx) - if err == nil { - return td.Cmp(ec.TerminalTotalDifficulty()) >= 0, nil - } - return false, err -} - -type WaitTTDResponse struct { - ec client.EngineClient - err error -} - -// Wait until the TTD is reached by a single client. -func WaitForTTD(ec client.EngineClient, wg *sync.WaitGroup, done chan<- WaitTTDResponse, ctx context.Context) { - defer wg.Done() - for { - select { - case <-time.After(TTDCheckPeriod): - ttdReached, err := CheckTTD(ec, ctx) - if err == nil && ttdReached { - select { - case done <- WaitTTDResponse{ - ec: ec, - err: err, - }: - case <-ctx.Done(): - } - return - } - case <-ctx.Done(): - return - } - } -} - -// Wait until the TTD is reached by a single client with a timeout. -// Returns true if the TTD has been reached, false when timeout occurred. -func WaitForTTDWithTimeout(ec client.EngineClient, ctx context.Context) error { - for { - select { - case <-time.After(TTDCheckPeriod): - ttdReached, err := CheckTTD(ec, ctx) - if err != nil { - return err - } - if ttdReached { - return nil - } - case <-ctx.Done(): - return fmt.Errorf("timeout reached") - } - } -} - -// Wait until the TTD is reached by any of the engine clients -func WaitAnyClientForTTD(ecs []client.EngineClient, testCtx context.Context) (client.EngineClient, error) { - var wg sync.WaitGroup - defer wg.Wait() - done := make(chan WaitTTDResponse) - cancel := make(chan interface{}) - defer close(cancel) - for _, ec := range ecs { - wg.Add(1) - ctx, cancel := context.WithCancel(testCtx) - defer cancel() - go WaitForTTD(ec, &wg, done, ctx) - } - select { - case r := <-done: - return r.ec, r.err - case <-testCtx.Done(): - return nil, testCtx.Err() - } -} diff --git a/simulators/ethereum/engine/init/genesis.json b/simulators/ethereum/engine/init/genesis.json index 9c0fd6b75a..a4d85e1dbe 100644 --- a/simulators/ethereum/engine/init/genesis.json +++ b/simulators/ethereum/engine/init/genesis.json @@ -14,7 +14,8 @@ "berlinBlock": 0, "yolov2Block": 0, "yolov3Block": 0, - "londonBlock": 0 + "londonBlock": 0, + "parisBlock": 0 }, "coinbase": "0x0000000000000000000000000000000000000000", "difficulty": "0x30000", diff --git a/simulators/ethereum/engine/main.go b/simulators/ethereum/engine/main.go index 115a3bc51d..45ee598ab6 100644 --- a/simulators/ethereum/engine/main.go +++ b/simulators/ethereum/engine/main.go @@ -2,7 +2,6 @@ package main import ( "fmt" - "math/big" "math/rand" "os" "strconv" @@ -147,34 +146,25 @@ func makeRunner(tests []test.Spec, nodeType string) func(t *hivesim.T) { panic("unable to inject genmsis") } - // Calculate and set the TTD for this test - ttd := genesis.Config.TerminalTotalDifficulty - - // Configure Forks - newParams := globals.DefaultClientEnv.Set("HIVE_TERMINAL_TOTAL_DIFFICULTY", fmt.Sprintf("%d", ttd)) - if forkConfig.LondonNumber != nil { - newParams = newParams.Set("HIVE_FORK_LONDON", fmt.Sprintf("%d", forkConfig.LondonNumber)) - } - if forkConfig.ParisNumber != nil { - newParams = newParams.Set("HIVE_MERGE_BLOCK_ID", fmt.Sprintf("%d", forkConfig.ParisNumber)) - } + // Configure Forks. + // Note merge is hard-coded at genesis. + newParams := globals.DefaultClientEnv.Set("HIVE_TERMINAL_TOTAL_DIFFICULTY_PASSED", "1") + newParams = newParams.Set("HIVE_TERMINAL_TOTAL_DIFFICULTY", fmt.Sprintf("%d", genesis.Difficulty)) + newParams = newParams.Set("HIVE_MERGE_BLOCK_ID", "0") if forkConfig.ShanghaiTimestamp != nil { newParams = newParams.Set("HIVE_SHANGHAI_TIMESTAMP", fmt.Sprintf("%d", forkConfig.ShanghaiTimestamp)) - // Ensure merge transition is activated before shanghai if not already - if forkConfig.ParisNumber == nil { - newParams = newParams.Set("HIVE_MERGE_BLOCK_ID", "0") - } if forkConfig.CancunTimestamp != nil { newParams = newParams.Set("HIVE_CANCUN_TIMESTAMP", fmt.Sprintf("%d", forkConfig.CancunTimestamp)) } } + // Configure node type. if nodeType != "" { newParams = newParams.Set("HIVE_NODETYPE", nodeType) } testFiles := hivesim.Params{} - if genesis.Difficulty.Cmp(ttd) < 0 { + if genesis.Difficulty.Sign() > 0 { if currentTest.GetChainFile() != "" { // We are using a Proof of Work chain file, remove all clique-related settings // TODO: Nethermind still requires HIVE_MINER for the Engine API @@ -192,7 +182,6 @@ func makeRunner(tests []test.Spec, nodeType string) func(t *hivesim.T) { delete(newParams, "HIVE_CLIQUE_PRIVATEKEY") delete(newParams, "HIVE_CLIQUE_PERIOD") delete(newParams, "HIVE_MINER") - newParams = newParams.Set("HIVE_POST_MERGE_GENESIS", "true") } if clientTypes, err := t.Sim.ClientTypes(); err == nil { @@ -220,7 +209,6 @@ func makeRunner(tests []test.Spec, nodeType string) func(t *hivesim.T) { // Run the test case test.Run( currentTest, - new(big.Int).Set(ttd), timeout, t, c, diff --git a/simulators/ethereum/engine/suites/auth/tests.go b/simulators/ethereum/engine/suites/auth/tests.go index ac9ae537a2..884ccd716c 100644 --- a/simulators/ethereum/engine/suites/auth/tests.go +++ b/simulators/ethereum/engine/suites/auth/tests.go @@ -90,7 +90,7 @@ func (authTestSpec AuthTestSpec) Execute(t *test.Env) { var ( // All test cases send a simple TransitionConfigurationV1 to check the Authentication mechanism (JWT) tConf = api.TransitionConfigurationV1{ - TerminalTotalDifficulty: (*hexutil.Big)(t.MainTTD()), + TerminalTotalDifficulty: new(hexutil.Big), // zero TerminalBlockHash: common.Hash{}, TerminalBlockNumber: 0, } diff --git a/simulators/ethereum/engine/suites/cancun/config.go b/simulators/ethereum/engine/suites/cancun/config.go index c29fcdf67f..321acd189a 100644 --- a/simulators/ethereum/engine/suites/cancun/config.go +++ b/simulators/ethereum/engine/suites/cancun/config.go @@ -16,9 +16,6 @@ type CancunBaseSpec struct { // Base test case execution procedure for blobs tests. func (cs *CancunBaseSpec) Execute(t *test.Env) { - - t.CLMock.WaitForTTD() - blobTestCtx := NewTestContext(t) defer blobTestCtx.Close() diff --git a/simulators/ethereum/engine/suites/engine/bad_hash.go b/simulators/ethereum/engine/suites/engine/bad_hash.go index 478f68097f..234a9f15a5 100644 --- a/simulators/ethereum/engine/suites/engine/bad_hash.go +++ b/simulators/ethereum/engine/suites/engine/bad_hash.go @@ -55,9 +55,6 @@ func (b BadHashOnNewPayload) GetName() string { } func (b BadHashOnNewPayload) Execute(t *test.Env) { - // Wait until TTD is reached by this client - t.CLMock.WaitForTTD() - // Produce blocks before starting the test t.CLMock.ProduceBlocks(5, clmock.BlockProcessCallbacks{}) @@ -163,9 +160,6 @@ func (p ParentHashOnNewPayload) GetName() string { // Copy the parentHash into the blockHash, client should reject the payload // (from Kintsugi Incident Report: https://notes.ethereum.org/@ExXcnR0-SJGthjz1dwkA1A/BkkdHWXTY) func (b ParentHashOnNewPayload) Execute(t *test.Env) { - // Wait until TTD is reached by this client - t.CLMock.WaitForTTD() - // Produce blocks before starting the test t.CLMock.ProduceBlocks(5, clmock.BlockProcessCallbacks{}) diff --git a/simulators/ethereum/engine/suites/engine/fork_id.go b/simulators/ethereum/engine/suites/engine/fork_id.go index 1cb92acde4..b20967d501 100644 --- a/simulators/ethereum/engine/suites/engine/fork_id.go +++ b/simulators/ethereum/engine/suites/engine/fork_id.go @@ -5,7 +5,6 @@ import ( "strings" "time" - "github.com/ethereum/go-ethereum/common" "github.com/ethereum/hive/simulators/ethereum/engine/clmock" "github.com/ethereum/hive/simulators/ethereum/engine/config" "github.com/ethereum/hive/simulators/ethereum/engine/devp2p" @@ -40,18 +39,10 @@ func (s ForkIDSpec) GetForkConfig() *config.ForkConfig { if forkConfig == nil { return nil } - // Merge fork happen at block 0 - mainFork := s.GetMainFork() - if mainFork == config.Paris { - forkConfig.ParisNumber = common.Big0 - } return forkConfig } func (ft ForkIDSpec) Execute(t *test.Env) { - // Wait until TTD is reached by this client - t.CLMock.WaitForTTD() - // Produce blocks before starting the test if required t.CLMock.ProduceBlocks(ft.ProduceBlocksBeforePeering, clmock.BlockProcessCallbacks{}) diff --git a/simulators/ethereum/engine/suites/engine/forkchoice.go b/simulators/ethereum/engine/suites/engine/forkchoice.go index bc90020733..d77b319b99 100644 --- a/simulators/ethereum/engine/suites/engine/forkchoice.go +++ b/simulators/ethereum/engine/suites/engine/forkchoice.go @@ -38,9 +38,6 @@ func (tc InconsistentForkchoiceTest) GetName() string { // Send an inconsistent ForkchoiceState with a known payload that belongs to a side chain as head, safe or finalized. func (tc InconsistentForkchoiceTest) Execute(t *test.Env) { - // Wait until TTD is reached by this client - t.CLMock.WaitForTTD() - canonicalPayloads := make([]*typ.ExecutableData, 0) alternativePayloads := make([]*typ.ExecutableData, 0) // Produce blocks before starting the test @@ -104,9 +101,6 @@ func (tc ForkchoiceUpdatedUnknownBlockHashTest) GetName() string { // Send an inconsistent ForkchoiceState with a known payload that belongs to a side chain as head, safe or finalized. func (tc ForkchoiceUpdatedUnknownBlockHashTest) Execute(t *test.Env) { - // Wait until TTD is reached by this client - t.CLMock.WaitForTTD() - // Produce blocks before starting the test t.CLMock.ProduceBlocks(5, clmock.BlockProcessCallbacks{}) diff --git a/simulators/ethereum/engine/suites/engine/invalid_ancestor.go b/simulators/ethereum/engine/suites/engine/invalid_ancestor.go index be0c378e30..701ab9f950 100644 --- a/simulators/ethereum/engine/suites/engine/invalid_ancestor.go +++ b/simulators/ethereum/engine/suites/engine/invalid_ancestor.go @@ -52,10 +52,6 @@ func (tc InvalidMissingAncestorReOrgTest) GetName() string { } func (tc InvalidMissingAncestorReOrgTest) Execute(t *test.Env) { - - // Wait until TTD is reached by this client - t.CLMock.WaitForTTD() - // Produce blocks before starting the test t.CLMock.ProduceBlocks(5, clmock.BlockProcessCallbacks{}) @@ -250,9 +246,6 @@ func (tc InvalidMissingAncestorReOrgSyncTest) Execute(t *test.Env) { t.CLMock.RemoveEngineClient(t.Engine) } - // Wait until TTD is reached by this client - t.CLMock.WaitForTTD() - // Produce blocks before starting the test // Default is to produce 5 PoS blocks before the common ancestor cAHeight := 5 diff --git a/simulators/ethereum/engine/suites/engine/invalid_payload.go b/simulators/ethereum/engine/suites/engine/invalid_payload.go index 7ea39e8ea5..7f96a60209 100644 --- a/simulators/ethereum/engine/suites/engine/invalid_payload.go +++ b/simulators/ethereum/engine/suites/engine/invalid_payload.go @@ -73,9 +73,6 @@ func (tc InvalidPayloadTestCase) Execute(t *test.Env) { t.CLMock.AddEngineClient(secondaryClient) } - // Wait until TTD is reached by all clients - t.CLMock.WaitForTTD() - txFunc := func() { if !tc.EmptyTransactions { // Function to send at least one transaction each block produced @@ -339,9 +336,6 @@ func (tc PayloadBuildAfterInvalidPayloadTest) Execute(t *test.Env) { secondaryEngineTest := test.NewTestEngineClient(t, secondaryEngine) t.CLMock.AddEngineClient(secondaryEngine) - // Wait until TTD is reached by this client - t.CLMock.WaitForTTD() - // Produce blocks before starting the test t.CLMock.ProduceBlocks(5, clmock.BlockProcessCallbacks{}) @@ -420,9 +414,6 @@ func (s InvalidTxChainIDTest) GetName() string { // Attempt to produce a payload after a transaction with an invalid Chain ID was sent to the client // using `eth_sendRawTransaction`. func (spec InvalidTxChainIDTest) Execute(t *test.Env) { - // Wait until TTD is reached by this client - t.CLMock.WaitForTTD() - // Produce blocks before starting the test t.CLMock.ProduceBlocks(5, clmock.BlockProcessCallbacks{}) diff --git a/simulators/ethereum/engine/suites/engine/misc.go b/simulators/ethereum/engine/suites/engine/misc.go deleted file mode 100644 index cfb569dfb0..0000000000 --- a/simulators/ethereum/engine/suites/engine/misc.go +++ /dev/null @@ -1,50 +0,0 @@ -package suite_engine - -import ( - "math/big" - - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/hive/simulators/ethereum/engine/clmock" - "github.com/ethereum/hive/simulators/ethereum/engine/config" - "github.com/ethereum/hive/simulators/ethereum/engine/test" -) - -// Runs a sanity test on a post Merge fork where a previous fork's (London) number is not zero -type NonZeroPreMergeFork struct { - test.BaseSpec -} - -func (s NonZeroPreMergeFork) WithMainFork(fork config.Fork) test.Spec { - specCopy := s - specCopy.MainFork = fork - return specCopy -} - -func (b NonZeroPreMergeFork) GetName() string { - return "Pre-Merge Fork Number > 0" -} - -func (s NonZeroPreMergeFork) GetForkConfig() *config.ForkConfig { - forkConfig := s.BaseSpec.GetForkConfig() - if forkConfig == nil { - return nil - } - // Merge fork & pre-merge happen at block 1 - forkConfig.LondonNumber = common.Big1 - forkConfig.ParisNumber = common.Big1 - // Post-merge fork happens at block 2 - mainFork := s.GetMainFork() - if mainFork == config.Cancun { - forkConfig.ShanghaiTimestamp = new(big.Int).Set(forkConfig.CancunTimestamp) - } - return forkConfig -} - -func (b NonZeroPreMergeFork) Execute(t *test.Env) { - // Wait until TTD is reached by this client - t.CLMock.WaitForTTD() - - // Simply produce a couple of blocks without transactions (if London is not active at genesis - // we can't send type-2 transactions) and check that the chain progresses without issues - t.CLMock.ProduceBlocks(5, clmock.BlockProcessCallbacks{}) -} diff --git a/simulators/ethereum/engine/suites/engine/payload_attributes.go b/simulators/ethereum/engine/suites/engine/payload_attributes.go index 540159b2a1..1ceeed3b40 100644 --- a/simulators/ethereum/engine/suites/engine/payload_attributes.go +++ b/simulators/ethereum/engine/suites/engine/payload_attributes.go @@ -34,9 +34,6 @@ func (tc InvalidPayloadAttributesTest) GetName() string { } func (tc InvalidPayloadAttributesTest) Execute(t *test.Env) { - // Wait until TTD is reached by this client - t.CLMock.WaitForTTD() - // Produce blocks before starting the test t.CLMock.ProduceBlocks(5, clmock.BlockProcessCallbacks{}) diff --git a/simulators/ethereum/engine/suites/engine/payload_execution.go b/simulators/ethereum/engine/suites/engine/payload_execution.go index a86c4e253b..b7d1be6b46 100644 --- a/simulators/ethereum/engine/suites/engine/payload_execution.go +++ b/simulators/ethereum/engine/suites/engine/payload_execution.go @@ -32,9 +32,6 @@ func (s ReExecutePayloadTest) GetName() string { // Consecutive Payload Execution: Secondary client should be able to set the forkchoiceUpdated to payloads received consecutively func (spec ReExecutePayloadTest) Execute(t *test.Env) { - // Wait until this client catches up with latest PoS - t.CLMock.WaitForTTD() - // How many Payloads we are going to re-execute var payloadReExecCount = 10 @@ -105,9 +102,6 @@ func (s InOrderPayloadExecutionTest) GetName() string { // Consecutive Payload Execution: Secondary client should be able to set the forkchoiceUpdated to payloads received consecutively func (spec InOrderPayloadExecutionTest) Execute(t *test.Env) { - // Wait until this client catches up with latest PoS - t.CLMock.WaitForTTD() - // Send a single block to allow sending newer transaction types on the payloads t.CLMock.ProduceSingleBlock(clmock.BlockProcessCallbacks{}) @@ -232,9 +226,6 @@ func (s MultiplePayloadsExtendingCanonicalChainTest) GetName() string { // Consecutive Payload Execution: Secondary client should be able to set the forkchoiceUpdated to payloads received consecutively func (spec MultiplePayloadsExtendingCanonicalChainTest) Execute(t *test.Env) { - // Wait until this client catches up with latest PoS - t.CLMock.WaitForTTD() - // Produce blocks before starting the test t.CLMock.ProduceBlocks(5, clmock.BlockProcessCallbacks{}) @@ -338,9 +329,6 @@ func (spec NewPayloadOnSyncingClientTest) Execute(t *test.Env) { t.CLMock.AddEngineClient(secondaryClient) } - // Wait until TTD is reached by all clients - t.CLMock.WaitForTTD() - // Produce blocks before starting the test t.CLMock.ProduceBlocks(5, clmock.BlockProcessCallbacks{}) @@ -473,9 +461,6 @@ func (s NewPayloadWithMissingFcUTest) GetName() string { // Send a valid `newPayload` in correct order but skip `forkchoiceUpdated` until the last payload func (spec NewPayloadWithMissingFcUTest) Execute(t *test.Env) { - // Wait until TTD is reached by this client - t.CLMock.WaitForTTD() - // Get last genesis block hash genesisHash := t.TestEngine.TestHeaderByNumber(Head).Header.Hash() diff --git a/simulators/ethereum/engine/suites/engine/payload_id.go b/simulators/ethereum/engine/suites/engine/payload_id.go index e2afe766bc..e5c4f993be 100644 --- a/simulators/ethereum/engine/suites/engine/payload_id.go +++ b/simulators/ethereum/engine/suites/engine/payload_id.go @@ -42,9 +42,6 @@ func (tc UniquePayloadIDTest) GetName() string { // Check that the payload id returned on a forkchoiceUpdated call is different // when the attributes change func (tc UniquePayloadIDTest) Execute(t *test.Env) { - // Wait until TTD is reached by this client - t.CLMock.WaitForTTD() - t.CLMock.ProduceSingleBlock(clmock.BlockProcessCallbacks{ OnPayloadAttributesGenerated: func() { payloadAttributes := t.CLMock.LatestPayloadAttributes diff --git a/simulators/ethereum/engine/suites/engine/prev_randao.go b/simulators/ethereum/engine/suites/engine/prev_randao.go index 6b6906f01d..79a0a7f523 100644 --- a/simulators/ethereum/engine/suites/engine/prev_randao.go +++ b/simulators/ethereum/engine/suites/engine/prev_randao.go @@ -29,8 +29,6 @@ func (t PrevRandaoTransactionTest) GetName() string { } func (tc PrevRandaoTransactionTest) Execute(t *test.Env) { - t.CLMock.WaitForTTD() - // Create a single block to not having to build on top of genesis t.CLMock.ProduceSingleBlock(clmock.BlockProcessCallbacks{}) diff --git a/simulators/ethereum/engine/suites/engine/reorg.go b/simulators/ethereum/engine/suites/engine/reorg.go index 05a96ee58c..1461d1c4f1 100644 --- a/simulators/ethereum/engine/suites/engine/reorg.go +++ b/simulators/ethereum/engine/suites/engine/reorg.go @@ -34,9 +34,6 @@ func (s SidechainReOrgTest) GetName() string { // Reorg to a Sidechain using ForkchoiceUpdated func (spec SidechainReOrgTest) Execute(t *test.Env) { - // Wait until this client catches up with latest PoS - t.CLMock.WaitForTTD() - // Produce blocks before starting the test t.CLMock.ProduceBlocks(5, clmock.BlockProcessCallbacks{}) @@ -146,9 +143,6 @@ func (s TransactionReOrgTest) GetName() string { // Test transaction status after a forkchoiceUpdated re-orgs to an alternative hash where a transaction is not present func (spec TransactionReOrgTest) Execute(t *test.Env) { - // Wait until this client catches up with latest PoS - t.CLMock.WaitForTTD() - // Produce blocks before starting the test (So we don't try to reorg back to the genesis block) t.CLMock.ProduceBlocks(5, clmock.BlockProcessCallbacks{}) @@ -442,9 +436,6 @@ func (s ReOrgBackToCanonicalTest) GetDepth() uint64 { // Test that performing a re-org back into a previous block of the canonical chain does not produce errors and the chain // is still capable of progressing. func (spec ReOrgBackToCanonicalTest) Execute(t *test.Env) { - // Wait until this client catches up with latest PoS - t.CLMock.WaitForTTD() - // Check the CLMock configured safe and finalized if t.CLMock.SlotsToSafe.Cmp(new(big.Int).SetUint64(spec.ReOrgDepth)) <= 0 { t.Fatalf("FAIL (%s): [TEST ISSUE] CLMock configured slots to safe less than re-org depth: %v <= %v", t.TestName, t.CLMock.SlotsToSafe, spec.ReOrgDepth) @@ -566,9 +557,6 @@ func (s ReOrgBackFromSyncingTest) GetName() string { // Test that performs a re-org back to the canonical chain after re-org to syncing/unavailable chain. func (spec ReOrgBackFromSyncingTest) Execute(t *test.Env) { - // Wait until this client catches up with latest PoS - t.CLMock.WaitForTTD() - // Produce an alternative chain sidechainPayloads := make([]*typ.ExecutableData, 0) t.CLMock.ProduceBlocks(10, clmock.BlockProcessCallbacks{ @@ -655,9 +643,6 @@ func (s ReOrgPrevValidatedPayloadOnSideChainTest) GetName() string { // Test that performs a re-org to a previously validated payload on a side chain. func (spec ReOrgPrevValidatedPayloadOnSideChainTest) Execute(t *test.Env) { - // Wait until this client catches up with latest PoS - t.CLMock.WaitForTTD() - // Produce blocks before starting the test t.CLMock.ProduceBlocks(5, clmock.BlockProcessCallbacks{}) @@ -772,9 +757,6 @@ func (s SafeReOrgToSideChainTest) GetName() string { // Test that performs a re-org of the safe block to a side chain. func (s SafeReOrgToSideChainTest) Execute(t *test.Env) { - // Wait until this client catches up with latest PoS - t.CLMock.WaitForTTD() - // Produce an alternative chain sidechainPayloads := make([]*typ.ExecutableData, 0) diff --git a/simulators/ethereum/engine/suites/engine/rpc.go b/simulators/ethereum/engine/suites/engine/rpc.go index 9d9ab22f35..5bcffb5229 100644 --- a/simulators/ethereum/engine/suites/engine/rpc.go +++ b/simulators/ethereum/engine/suites/engine/rpc.go @@ -38,9 +38,6 @@ func (b BlockStatus) GetName() string { // Test to verify Block information available at the Eth RPC after NewPayload/ForkchoiceUpdated func (b BlockStatus) Execute(t *test.Env) { - // Wait until this client catches up with latest PoS Block - t.CLMock.WaitForTTD() - switch b.CheckType { case SafeOnSafeBlockHash, FinalizedOnFinalizedBlockHash: var number *big.Int diff --git a/simulators/ethereum/engine/suites/engine/suggested_fee_recipient.go b/simulators/ethereum/engine/suites/engine/suggested_fee_recipient.go index 0c604fd87a..d00fdd2d14 100644 --- a/simulators/ethereum/engine/suites/engine/suggested_fee_recipient.go +++ b/simulators/ethereum/engine/suites/engine/suggested_fee_recipient.go @@ -29,9 +29,6 @@ func (t SuggestedFeeRecipientTest) GetName() string { } func (tc SuggestedFeeRecipientTest) Execute(t *test.Env) { - // Wait until this client catches up with latest PoS - t.CLMock.WaitForTTD() - // Create a single block to not having to build on top of genesis t.CLMock.ProduceSingleBlock(clmock.BlockProcessCallbacks{}) diff --git a/simulators/ethereum/engine/suites/engine/tests.go b/simulators/ethereum/engine/suites/engine/tests.go index e90c12158f..8ad1a1be2a 100644 --- a/simulators/ethereum/engine/suites/engine/tests.go +++ b/simulators/ethereum/engine/suites/engine/tests.go @@ -415,14 +415,4 @@ func init() { } } } - - // Misc Tests - Tests = append(Tests, - // Pre-merge & merge fork occur at block 1, post-merge forks occur at block 2 - NonZeroPreMergeFork{ - BaseSpec: test.BaseSpec{ - ForkHeight: 2, - }, - }, - ) } diff --git a/simulators/ethereum/engine/suites/engine/versioning.go b/simulators/ethereum/engine/suites/engine/versioning.go index a28517a72b..4b0080db92 100644 --- a/simulators/ethereum/engine/suites/engine/versioning.go +++ b/simulators/ethereum/engine/suites/engine/versioning.go @@ -37,9 +37,6 @@ func (tc ForkchoiceUpdatedOnPayloadRequestTest) GetName() string { } func (tc ForkchoiceUpdatedOnPayloadRequestTest) Execute(t *test.Env) { - // Wait until TTD is reached by this client - t.CLMock.WaitForTTD() - t.CLMock.ProduceSingleBlock(clmock.BlockProcessCallbacks{ OnPayloadAttributesGenerated: func() { var ( diff --git a/simulators/ethereum/engine/suites/sync/tests.go b/simulators/ethereum/engine/suites/sync/tests.go index 73c34d3294..0416c6d16d 100644 --- a/simulators/ethereum/engine/suites/sync/tests.go +++ b/simulators/ethereum/engine/suites/sync/tests.go @@ -22,17 +22,17 @@ var Tests = []test.BaseSpec{ Run: postMergeSync, TimeoutSeconds: 180, ChainFile: "blocks_1024_td_135112316.rlp", - TTD: 135112316, }, { Name: "Incremental Post Merge Sync", Run: incrementalPostMergeSync, TimeoutSeconds: 180, ChainFile: "blocks_1024_td_135112316.rlp", - TTD: 135112316, }, } +const syncTestsTD = 135112316 + // Routine that adds all sync tests to a test suite func AddSyncTestsToSuite(sim *hivesim.Simulation, suite *hivesim.Suite, tests []test.BaseSpec) { clientDefs, err := sim.ClientTypes() @@ -54,7 +54,7 @@ func AddSyncTestsToSuite(sim *hivesim.Simulation, suite *hivesim.Suite, tests [] testFiles := hivesim.Params{"/genesis.json": genesisPath} // Calculate and set the TTD for this test genesis := helper.LoadGenesis(genesisPath) - ttd := helper.CalculateRealTTD(&genesis, currentTest.TTD) + ttd := helper.CalculateRealTTD(&genesis, syncTestsTD) newParams := globals.DefaultClientEnv.Set("HIVE_TERMINAL_TOTAL_DIFFICULTY", fmt.Sprintf("%d", ttd)) if currentTest.ChainFile != "" { // We are using a Proof of Work chain file, remove all clique-related settings @@ -100,7 +100,7 @@ func AddSyncTestsToSuite(sim *hivesim.Simulation, suite *hivesim.Suite, tests [] } // Run the test case - test.Run(¤tTest, big.NewInt(ttd), timeout, t, c, &genesis, rand.New(rand.NewSource(0)), syncClientParams, testFiles.Copy()) + test.Run(¤tTest, timeout, t, c, &genesis, rand.New(rand.NewSource(0)), syncClientParams, testFiles.Copy()) }, }) } @@ -111,10 +111,6 @@ func AddSyncTestsToSuite(sim *hivesim.Simulation, suite *hivesim.Suite, tests [] // Client Sync tests func postMergeSync(t *test.Env) { - // Launch another client after the PoS transition has happened in the main client. - // Sync should eventually happen without issues. - t.CLMock.WaitForTTD() - // Speed up block production t.CLMock.PayloadProductionClientDelay = 0 @@ -162,10 +158,6 @@ func postMergeSync(t *test.Env) { // Performs a test where sync is done incrementally by sending incremental newPayload/fcU calls func incrementalPostMergeSync(t *test.Env) { - // Launch another client after the PoS transition has happened in the main client. - // Sync should eventually happen without issues. - t.CLMock.WaitForTTD() - var ( N uint64 = 500 // Total number of PoS blocks S uint64 = 5 // Number of incremental steps to sync diff --git a/simulators/ethereum/engine/suites/withdrawals/tests.go b/simulators/ethereum/engine/suites/withdrawals/tests.go index db9cd35197..253e19f441 100644 --- a/simulators/ethereum/engine/suites/withdrawals/tests.go +++ b/simulators/ethereum/engine/suites/withdrawals/tests.go @@ -19,7 +19,6 @@ import ( "github.com/ethereum/hive/simulators/ethereum/engine/config" "github.com/ethereum/hive/simulators/ethereum/engine/globals" "github.com/ethereum/hive/simulators/ethereum/engine/helper" - suite_engine "github.com/ethereum/hive/simulators/ethereum/engine/suites/engine" "github.com/ethereum/hive/simulators/ethereum/engine/test" typ "github.com/ethereum/hive/simulators/ethereum/engine/types" ) @@ -815,14 +814,6 @@ var Tests = []test.Spec{ }, }, }, - - // TODO: Remove since this will be automatically inherited when this test suite is refactored - suite_engine.NonZeroPreMergeFork{ - BaseSpec: test.BaseSpec{ - MainFork: config.Shanghai, - ForkHeight: 1, - }, - }, } // Helper types to convert gwei into wei more easily @@ -1125,8 +1116,6 @@ func (ws *WithdrawalsBaseSpec) Execute(t *test.Env) { // Create the withdrawals history object ws.WithdrawalsHistory = make(WithdrawalsHistory) - t.CLMock.WaitForTTD() - // Check if we have pre-Shanghai blocks if ws.GetWithdrawalsForkTime() > uint64(globals.GenesisTimestamp) { // Check `latest` during all pre-shanghai blocks, none should @@ -1554,8 +1543,6 @@ func (ws *WithdrawalsReorgSpec) Execute(t *test.Env) { // Create the withdrawals history object ws.WithdrawalsHistory = make(WithdrawalsHistory) - t.CLMock.WaitForTTD() - // Spawn a secondary client which will produce the sidechain secondaryEngine, err := hive_rpc.HiveRPCEngineStarter{}.StartClient(t.T, t.TestContext, t.Genesis, t.ClientParams, t.ClientFiles, t.Engine) if err != nil { @@ -1821,7 +1808,6 @@ type MaxInitcodeSizeSpec struct { } func (s *MaxInitcodeSizeSpec) Execute(t *test.Env) { - t.CLMock.WaitForTTD() invalidTxSender := globals.TestAccounts[0] invalidTxCreator := &helper.BigInitcodeTransactionCreator{ InitcodeLength: MAX_INITCODE_SIZE + 1, diff --git a/simulators/ethereum/engine/test/env.go b/simulators/ethereum/engine/test/env.go index 4fb48e5e59..d52e75a2c8 100644 --- a/simulators/ethereum/engine/test/env.go +++ b/simulators/ethereum/engine/test/env.go @@ -2,7 +2,6 @@ package test import ( "context" - "math/big" "math/rand" "net/http" "time" @@ -55,7 +54,7 @@ type Env struct { TestTransactionType helper.TestTransactionType } -func Run(testSpec Spec, ttd *big.Int, timeout time.Duration, t *hivesim.T, c *hivesim.Client, genesis *core.Genesis, randSource *rand.Rand, cParams hivesim.Params, cFiles hivesim.Params) { +func Run(testSpec Spec, timeout time.Duration, t *hivesim.T, c *hivesim.Client, genesis *core.Genesis, randSource *rand.Rand, cParams hivesim.Params, cFiles hivesim.Params) { // Setup the CL Mocker for this test forkConfig := testSpec.GetForkConfig() clMocker := clmock.NewCLMocker( @@ -74,7 +73,7 @@ func Run(testSpec Spec, ttd *big.Int, timeout time.Duration, t *hivesim.T, c *hi }() // Create Engine client from main hivesim.Client to be used by tests - ec := hive_rpc.NewHiveRPCEngineClient(c, globals.EnginePortHTTP, globals.EthPortHTTP, globals.DefaultJwtTokenSecretBytes, ttd, &helper.LoggingRoundTrip{ + ec := hive_rpc.NewHiveRPCEngineClient(c, globals.EnginePortHTTP, globals.EthPortHTTP, globals.DefaultJwtTokenSecretBytes, &helper.LoggingRoundTrip{ Logger: t, ID: c.Container, Inner: http.DefaultTransport, @@ -109,6 +108,9 @@ func Run(testSpec Spec, ttd *big.Int, timeout time.Duration, t *hivesim.T, c *hi t.Fatalf("FAIL (%s): Ports were never open for client: %v", env.TestName, err) } + // Setup clMocker with client head. + clMocker.InitChain(ec) + // Full test context has a few more seconds to finish up after timeout happens ctx, cancel := context.WithTimeout(context.Background(), timeout+(time.Second*10)) defer cancel() @@ -127,7 +129,7 @@ func Run(testSpec Spec, ttd *big.Int, timeout time.Duration, t *hivesim.T, c *hi // Defer producing one last block to verify Execution client did not break after the test defer func() { // Only run if the TTD was reached during test, and test had not failed at this point. - if clMocker.TTDReached && !t.Failed() { + if !t.Failed() { clMocker.ProduceSingleBlock(clmock.BlockProcessCallbacks{}) } }() @@ -136,10 +138,6 @@ func Run(testSpec Spec, ttd *big.Int, timeout time.Duration, t *hivesim.T, c *hi testSpec.Execute(env) } -func (t *Env) MainTTD() *big.Int { - return t.Engine.TerminalTotalDifficulty() -} - func (t *Env) HandleClientPostRunVerification(ec client.EngineClient) { if err := ec.PostRunVerifications(); err != nil { t.Fatalf("FAIL (%s): Client failed post-run verification: %v", t.TestName, err) diff --git a/simulators/ethereum/engine/test/spec.go b/simulators/ethereum/engine/test/spec.go index 52d6df775d..368cc48fd4 100644 --- a/simulators/ethereum/engine/test/spec.go +++ b/simulators/ethereum/engine/test/spec.go @@ -53,11 +53,6 @@ type BaseSpec struct { // Test procedure to execute the test Run func(*Env) - // TerminalTotalDifficulty delta value. - // Actual TTD is genesis.Difficulty + this value - // Default: 0 - TTD int64 - // CL Mocker configuration for time increments BlockTimestampIncrement uint64 @@ -202,12 +197,6 @@ func (s BaseSpec) GetGenesis() *core.Genesis { } genesis := helper.LoadGenesis(genesisPath) - // Set the terminal total difficulty - genesis.Config.TerminalTotalDifficulty = big.NewInt(genesis.Difficulty.Int64() + s.TTD) - if genesis.Difficulty.Cmp(genesis.Config.TerminalTotalDifficulty) <= 0 { - genesis.Config.TerminalTotalDifficultyPassed = true - } - // Set the genesis timestamp if provided if s.GenesisTimestamp != nil { genesis.Timestamp = *s.GenesisTimestamp diff --git a/simulators/ethereum/engine/types/types.go b/simulators/ethereum/engine/types/types.go index dc61e76d44..c8e14ab2eb 100644 --- a/simulators/ethereum/engine/types/types.go +++ b/simulators/ethereum/engine/types/types.go @@ -223,5 +223,5 @@ func ExecutableDataToBlock(ed ExecutableData) (*types.Block, error) { if ed.VersionedHashes != nil { versionedHashes = *ed.VersionedHashes } - return geth_beacon.ExecutableDataToBlock(gethEd, versionedHashes, ed.ParentBeaconBlockRoot) + return geth_beacon.ExecutableDataToBlock(gethEd, versionedHashes, ed.ParentBeaconBlockRoot, nil) } From 5ccd05760d2c3510c9671c7ba86e795f13238bc5 Mon Sep 17 00:00:00 2001 From: alingse Date: Mon, 6 Jan 2025 17:12:27 +0800 Subject: [PATCH 365/387] internal/libdocker: return context error correctly in archiveFS (#1190) --- internal/libdocker/builder.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/libdocker/builder.go b/internal/libdocker/builder.go index e4bf99b690..9294da7e1f 100644 --- a/internal/libdocker/builder.go +++ b/internal/libdocker/builder.go @@ -115,7 +115,7 @@ func (b *Builder) archiveFS(ctx context.Context, out io.WriteCloser, fsys fs.FS) if err != nil { return err } - if ctx.Err() != nil { + if err := ctx.Err(); err != nil { return err } From 3b1b11703f4264784a39ecfa96fcfccee771429b Mon Sep 17 00:00:00 2001 From: King Date: Mon, 6 Jan 2025 10:13:35 +0100 Subject: [PATCH 366/387] simulators/ethereum/engine: fix typo in comment (#1195) --- simulators/ethereum/engine/suites/engine/payload_attributes.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/simulators/ethereum/engine/suites/engine/payload_attributes.go b/simulators/ethereum/engine/suites/engine/payload_attributes.go index 1ceeed3b40..c01c05ba73 100644 --- a/simulators/ethereum/engine/suites/engine/payload_attributes.go +++ b/simulators/ethereum/engine/suites/engine/payload_attributes.go @@ -64,7 +64,7 @@ func (tc InvalidPayloadAttributesTest) Execute(t *test.Env) { // 3) Check payloadAttributes, if invalid respond with error: code: Invalid payload attributes // 4) Start payload build process and respond with VALID if tc.Syncing { - // If we are SYNCING, the outcome should be SYNCING regardless of the validity of the payload atttributes + // If we are SYNCING, the outcome should be SYNCING regardless of the validity of the payload attributes r := t.TestEngine.TestEngineForkchoiceUpdated(&fcu, attr, t.CLMock.LatestPayloadBuilt.Timestamp) r.ExpectPayloadStatus(test.Syncing) r.ExpectPayloadID(nil) From e44fca6c0feaf5b7a281657a18c65b72d1030718 Mon Sep 17 00:00:00 2001 From: chloefeal <188809157+chloefeal@users.noreply.github.com> Date: Mon, 6 Jan 2025 17:14:17 +0800 Subject: [PATCH 367/387] cmd/hive, internal/simapi: fix typos in comments (#1193) --- cmd/hivechain/genesis.go | 2 +- internal/simapi/simapi.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/cmd/hivechain/genesis.go b/cmd/hivechain/genesis.go index 6fa2ee49eb..a341c29ed8 100644 --- a/cmd/hivechain/genesis.go +++ b/cmd/hivechain/genesis.go @@ -211,7 +211,7 @@ func (cfg *generatorConfig) forkBlocks() map[string]uint64 { forkBlocks[fork] = uint64(block) block += cfg.forkInterval } - // If the chain length cannot accomodate the spread of forks with the chosen + // If the chain length cannot accommodate the spread of forks with the chosen // interval, schedule the remaining forks at the last block. for _, f := range forks { forkBlocks[f] = uint64(cfg.chainLength) diff --git a/internal/simapi/simapi.go b/internal/simapi/simapi.go index af189d0510..59a173f6fa 100644 --- a/internal/simapi/simapi.go +++ b/internal/simapi/simapi.go @@ -16,7 +16,7 @@ type NodeConfig struct { Environment map[string]string `json:"environment"` } -// StartNodeReponse is returned by the client startup endpoint. +// StartNodeResponse is returned by the client startup endpoint. type StartNodeResponse struct { ID string `json:"id"` // Container ID. IP string `json:"ip"` // IP address in bridge network From 57886d9f4ac40a07eb0d4f49ab2b371e58293cdd Mon Sep 17 00:00:00 2001 From: CODe <71spates.bravest@icloud.com> Date: Mon, 6 Jan 2025 10:15:03 +0100 Subject: [PATCH 368/387] simulators/ethereum/engine: fix typo in README.md (#1197) --- simulators/ethereum/engine/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/simulators/ethereum/engine/README.md b/simulators/ethereum/engine/README.md index 7933a2917c..ed37e2f1c5 100644 --- a/simulators/ethereum/engine/README.md +++ b/simulators/ethereum/engine/README.md @@ -78,7 +78,7 @@ Verify the Block returned by the Eth RPC using the `finalized` keyword after a n Verify the Block returned by the Eth RPC using the `finalized`/`safe` keyword after following the canonical chain is correctly updated to the canonical values set by `forkchoiceUpdated` calls. - `latest` Block after Reorg: -Verify the Block returned by the Eth RPC after a forkchoiceUpdated reorgs HeadBlockHash/SafeBlockHash to a sidechain and back. Eth RPC should return the appropriate block everytime. +Verify the Block returned by the Eth RPC after a forkchoiceUpdated reorgs HeadBlockHash/SafeBlockHash to a sidechain and back. Eth RPC should return the appropriate block every time. ### Payload Execution - Re-Execute Payload: @@ -227,4 +227,4 @@ Engine API call where the `iat` claim contains a positive time drift smaller tha No error is expected. ## Engine API Shanghai Upgrade Tests: -See [withdrawals](suites/withdrawals/README.md). \ No newline at end of file +See [withdrawals](suites/withdrawals/README.md). From e2012825d63ed44840eef8b63f5ce2116fd10ecf Mon Sep 17 00:00:00 2001 From: Mario Vega Date: Tue, 7 Jan 2025 03:28:52 -0600 Subject: [PATCH 369/387] simulators/ethereum/engine: TTD related fixes (#1199) --- .../ethereum/engine/client/node/node.go | 5 ++-- simulators/ethereum/engine/config/genesis.go | 1 + simulators/ethereum/engine/devp2p/conn.go | 3 --- simulators/ethereum/engine/globals/globals.go | 4 ---- simulators/ethereum/engine/main.go | 24 +------------------ .../ethereum/engine/suites/auth/tests.go | 2 +- 6 files changed, 6 insertions(+), 33 deletions(-) diff --git a/simulators/ethereum/engine/client/node/node.go b/simulators/ethereum/engine/client/node/node.go index 3acdd10cd3..3b070876bc 100644 --- a/simulators/ethereum/engine/client/node/node.go +++ b/simulators/ethereum/engine/client/node/node.go @@ -370,10 +370,11 @@ func (n *GethNode) SetBlock(block *types.Block, parentNumber uint64, parentRoot statedb.StartPrefetcher("chain", nil) var failedProcessing bool result, err := n.eth.BlockChain().Processor().Process(block, statedb, *n.eth.BlockChain().GetVMConfig()) - if err != nil { + if err != nil || result == nil { failedProcessing = true + } else { + rawdb.WriteReceipts(db, block.Hash(), block.NumberU64(), result.Receipts) } - rawdb.WriteReceipts(db, block.Hash(), block.NumberU64(), result.Receipts) root, err := statedb.Commit(block.NumberU64(), false) if err != nil { return errors.Wrap(err, "failed to commit state") diff --git a/simulators/ethereum/engine/config/genesis.go b/simulators/ethereum/engine/config/genesis.go index 51444940c7..6ff8ef06d5 100644 --- a/simulators/ethereum/engine/config/genesis.go +++ b/simulators/ethereum/engine/config/genesis.go @@ -9,6 +9,7 @@ import ( ) func (f *ForkConfig) ConfigGenesis(genesis *core.Genesis) error { + genesis.Config.TerminalTotalDifficulty = genesis.Difficulty genesis.Config.MergeNetsplitBlock = big.NewInt(0) if f.ShanghaiTimestamp != nil { shanghaiTime := f.ShanghaiTimestamp.Uint64() diff --git a/simulators/ethereum/engine/devp2p/conn.go b/simulators/ethereum/engine/devp2p/conn.go index b5d1aa6d18..5ca7184281 100644 --- a/simulators/ethereum/engine/devp2p/conn.go +++ b/simulators/ethereum/engine/devp2p/conn.go @@ -361,9 +361,6 @@ loop: return nil, fmt.Errorf("wrong head block in status, want: %#x (block %d) have %#x", want, c.consensusEngine.LatestHeader.Number.Uint64(), have) } - if have, want := msg.TD.Cmp(c.consensusEngine.ChainTotalDifficulty), 0; have != want { - return nil, fmt.Errorf("wrong TD in status: have %d want %d", have, want) - } if have, want := msg.ForkID, localForkID; !reflect.DeepEqual(have, want) { return nil, fmt.Errorf("wrong fork ID in status: have (hash=%#x, next=%d), want (hash=%#x, next=%d)", have.Hash, have.Next, want.Hash, want.Next) } diff --git a/simulators/ethereum/engine/globals/globals.go b/simulators/ethereum/engine/globals/globals.go index 43aca349ad..b3ace56960 100644 --- a/simulators/ethereum/engine/globals/globals.go +++ b/simulators/ethereum/engine/globals/globals.go @@ -88,10 +88,6 @@ var ( "HIVE_FORK_MUIR_GLACIER": "0", "HIVE_FORK_BERLIN": "0", "HIVE_FORK_LONDON": "0", - // Tests use clique PoA to mine new blocks until the TTD is reached, then PoS takes over. - "HIVE_CLIQUE_PERIOD": "1", - "HIVE_CLIQUE_PRIVATEKEY": MinerPKHex, - "HIVE_MINER": MinerAddrHex, // Merge related "HIVE_MERGE_BLOCK_ID": "100", } diff --git a/simulators/ethereum/engine/main.go b/simulators/ethereum/engine/main.go index 45ee598ab6..f4040ce000 100644 --- a/simulators/ethereum/engine/main.go +++ b/simulators/ethereum/engine/main.go @@ -163,27 +163,6 @@ func makeRunner(tests []test.Spec, nodeType string) func(t *hivesim.T) { newParams = newParams.Set("HIVE_NODETYPE", nodeType) } - testFiles := hivesim.Params{} - if genesis.Difficulty.Sign() > 0 { - if currentTest.GetChainFile() != "" { - // We are using a Proof of Work chain file, remove all clique-related settings - // TODO: Nethermind still requires HIVE_MINER for the Engine API - // delete(newParams, "HIVE_MINER") - delete(newParams, "HIVE_CLIQUE_PRIVATEKEY") - delete(newParams, "HIVE_CLIQUE_PERIOD") - // Add the new file to be loaded as chain.rlp - testFiles = testFiles.Set("/chain.rlp", "./chains/"+currentTest.GetChainFile()) - } - if currentTest.IsMiningDisabled() { - delete(newParams, "HIVE_MINER") - } - } else { - // This is a post-merge test - delete(newParams, "HIVE_CLIQUE_PRIVATEKEY") - delete(newParams, "HIVE_CLIQUE_PERIOD") - delete(newParams, "HIVE_MINER") - } - if clientTypes, err := t.Sim.ClientTypes(); err == nil { for _, clientType := range clientTypes { test := hivesim.TestSpec{ @@ -195,7 +174,6 @@ func makeRunner(tests []test.Spec, nodeType string) func(t *hivesim.T) { clientType.Name, newParams, genesisStartOption, - hivesim.WithStaticFiles(testFiles), ) t.Logf("Start test (%s): %s", c.Type, currentTestName) defer func() { @@ -215,7 +193,7 @@ func makeRunner(tests []test.Spec, nodeType string) func(t *hivesim.T) { genesis, rand.New(rand.NewSource(random_seed)), newParams, - testFiles, + hivesim.Params{}, ) }, } diff --git a/simulators/ethereum/engine/suites/auth/tests.go b/simulators/ethereum/engine/suites/auth/tests.go index 884ccd716c..1036c9ebe9 100644 --- a/simulators/ethereum/engine/suites/auth/tests.go +++ b/simulators/ethereum/engine/suites/auth/tests.go @@ -90,7 +90,7 @@ func (authTestSpec AuthTestSpec) Execute(t *test.Env) { var ( // All test cases send a simple TransitionConfigurationV1 to check the Authentication mechanism (JWT) tConf = api.TransitionConfigurationV1{ - TerminalTotalDifficulty: new(hexutil.Big), // zero + TerminalTotalDifficulty: (*hexutil.Big)(t.Genesis.Config.TerminalTotalDifficulty), TerminalBlockHash: common.Hash{}, TerminalBlockNumber: 0, } From 40cc97b21db3f3763175418e1504654745dff9b2 Mon Sep 17 00:00:00 2001 From: Sina M <1591639+s1na@users.noreply.github.com> Date: Thu, 9 Jan 2025 09:38:56 +0100 Subject: [PATCH 370/387] clients/go-ethereum: hardcode deposit contract address (#1202) --- clients/go-ethereum/mapper.jq | 1 + 1 file changed, 1 insertion(+) diff --git a/clients/go-ethereum/mapper.jq b/clients/go-ethereum/mapper.jq index cd0bbf731a..88f0646317 100644 --- a/clients/go-ethereum/mapper.jq +++ b/clients/go-ethereum/mapper.jq @@ -58,5 +58,6 @@ def to_bool: "cancunTime": env.HIVE_CANCUN_TIMESTAMP|to_int, "pragueTime": env.HIVE_PRAGUE_TIMESTAMP|to_int, "terminalTotalDifficultyPassed": true, + "depositContractAddress": "0x00000000219ab540356cBB839Cbe05303d7705Fa" }|remove_empty } From 860c11185d462e8a305516d6bb015cc6773e52ad Mon Sep 17 00:00:00 2001 From: Sina M <1591639+s1na@users.noreply.github.com> Date: Thu, 9 Jan 2025 09:43:42 +0100 Subject: [PATCH 371/387] hive: fix too large multipart request (#1201) --- hive.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/hive.go b/hive.go index a423f7b862..12750a15ef 100644 --- a/hive.go +++ b/hive.go @@ -84,7 +84,10 @@ func main() { NoColor: terminal == "" || terminal == "dumb", }) slog.SetDefault(slog.New(tintHandler)) - + // See: https://github.com/ethereum/hive/issues/1200. + if err := os.Setenv("GODEBUG", "multipartmaxparts=20000"); err != nil { + fatal(err) + } if *simTestLimit > 0 { slog.Warn("Option --sim.testlimit is deprecated and will have no effect.") } From 34e03c6e69f674cc7228200747441d674ff5a2d9 Mon Sep 17 00:00:00 2001 From: Rafael Matias Date: Fri, 10 Jan 2025 13:14:25 +0100 Subject: [PATCH 372/387] cmd/hiveview: enable asset loading with relative paths (#1203) --- cmd/hiveview/assets/index.html | 8 ++++---- cmd/hiveview/assets/lib/routes.js | 10 +++++----- cmd/hiveview/assets/suite.html | 8 ++++---- cmd/hiveview/assets/viewer.html | 10 +++++----- 4 files changed, 18 insertions(+), 18 deletions(-) diff --git a/cmd/hiveview/assets/index.html b/cmd/hiveview/assets/index.html index 1b0451fe31..f58f17d5d2 100644 --- a/cmd/hiveview/assets/index.html +++ b/cmd/hiveview/assets/index.html @@ -4,15 +4,15 @@ hive - - + + - +
    - +
    diff --git a/cmd/hiveview/deploy.go b/cmd/hiveview/deploy.go index 49641d0cfb..a811e284cb 100644 --- a/cmd/hiveview/deploy.go +++ b/cmd/hiveview/deploy.go @@ -29,8 +29,8 @@ func hiveviewBundler(fsys fs.FS) *bundler { // moduleAliases maps ES module names to files. var moduleAliases = map[string]string{ "jquery": "./extlib/jquery-3.6.3.esm.js", - "@popper/core": "./extlib/popper-2.9.2.js", - "bootstrap": "./extlib/bootstrap-5.2.3.mjs", + "@popperjs/core": "./extlib/popper-2.9.2.js", + "bootstrap": "./extlib/bootstrap-5.3.3.mjs", "datatables.net": "./extlib/dataTables-1.13.1.mjs", "datatables.net-bs5": "./extlib/dataTables-1.13.1.bootstrap5.mjs", "datatables.net-responsive": "./extlib/responsive-2.4.0.mjs", From f0486e0003eb12cb160f96498a349af0a4e4a2c2 Mon Sep 17 00:00:00 2001 From: Parithosh Jayanthi Date: Tue, 14 Jan 2025 17:32:13 +0100 Subject: [PATCH 375/387] clients: add blob schedule to genesis files (#1207) * adding blob schedule * update jq default * update nethermind jq function * reverting hivechain change --- clients/besu/mapper.jq | 6 + clients/erigon/mapper.jq | 6 + clients/ethereumjs/mapper.jq | 6 + clients/go-ethereum/mapper.jq | 6 + clients/nethermind/mapper.jq | 7 + clients/nimbus-el/mapper.jq | 6 + clients/reth/mapper.jq | 6 + simulators/eth2/go.work.sum | 652 ++++++++++++++++++++++++++++++++++ 8 files changed, 695 insertions(+) diff --git a/clients/besu/mapper.jq b/clients/besu/mapper.jq index 4e21e497cb..1dccaddae9 100644 --- a/clients/besu/mapper.jq +++ b/clients/besu/mapper.jq @@ -50,5 +50,11 @@ def to_int: "shanghaiTime": env.HIVE_SHANGHAI_TIMESTAMP|to_int, "cancunTime": env.HIVE_CANCUN_TIMESTAMP|to_int, "pragueTime": env.HIVE_PRAGUE_TIMESTAMP|to_int, + "blobSchedule": { + "prague": { + "target": (if env.HIVE_PRAGUE_BLOB_TARGET then env.HIVE_PRAGUE_BLOB_TARGET|to_int else 6 end), + "max": (if env.HIVE_PRAGUE_BLOB_MAX then env.HIVE_PRAGUE_BLOB_MAX|to_int else 9 end) + } + }, }|remove_empty } diff --git a/clients/erigon/mapper.jq b/clients/erigon/mapper.jq index 7576d83079..9a2394491f 100644 --- a/clients/erigon/mapper.jq +++ b/clients/erigon/mapper.jq @@ -58,5 +58,11 @@ def to_bool: "shanghaiTime": env.HIVE_SHANGHAI_TIMESTAMP|to_int, "cancunTime": env.HIVE_CANCUN_TIMESTAMP|to_int, "pragueTime": env.HIVE_PRAGUE_TIMESTAMP|to_int, + "blobSchedule": { + "prague": { + "target": (if env.HIVE_PRAGUE_BLOB_TARGET then env.HIVE_PRAGUE_BLOB_TARGET|to_int else 6 end), + "max": (if env.HIVE_PRAGUE_BLOB_MAX then env.HIVE_PRAGUE_BLOB_MAX|to_int else 9 end) + } + }, }|remove_empty } diff --git a/clients/ethereumjs/mapper.jq b/clients/ethereumjs/mapper.jq index 1eee477af1..5a76e56aa4 100644 --- a/clients/ethereumjs/mapper.jq +++ b/clients/ethereumjs/mapper.jq @@ -73,5 +73,11 @@ def pad_storage_keys: "shanghaiTime": env.HIVE_SHANGHAI_TIMESTAMP|to_int, "cancunTime": env.HIVE_CANCUN_TIMESTAMP|to_int, "pragueTime": env.HIVE_PRAGUE_TIMESTAMP|to_int, + "blobSchedule": { + "prague": { + "target": (if env.HIVE_PRAGUE_BLOB_TARGET then env.HIVE_PRAGUE_BLOB_TARGET|to_int else 6 end), + "max": (if env.HIVE_PRAGUE_BLOB_MAX then env.HIVE_PRAGUE_BLOB_MAX|to_int else 9 end) + } + }, } } | pad_storage_keys | remove_empty diff --git a/clients/go-ethereum/mapper.jq b/clients/go-ethereum/mapper.jq index 88f0646317..3b6fa2819e 100644 --- a/clients/go-ethereum/mapper.jq +++ b/clients/go-ethereum/mapper.jq @@ -58,6 +58,12 @@ def to_bool: "cancunTime": env.HIVE_CANCUN_TIMESTAMP|to_int, "pragueTime": env.HIVE_PRAGUE_TIMESTAMP|to_int, "terminalTotalDifficultyPassed": true, + "blobSchedule": { + "prague": { + "target": (if env.HIVE_PRAGUE_BLOB_TARGET then env.HIVE_PRAGUE_BLOB_TARGET|to_int else 6 end), + "max": (if env.HIVE_PRAGUE_BLOB_MAX then env.HIVE_PRAGUE_BLOB_MAX|to_int else 9 end) + } + }, "depositContractAddress": "0x00000000219ab540356cBB839Cbe05303d7705Fa" }|remove_empty } diff --git a/clients/nethermind/mapper.jq b/clients/nethermind/mapper.jq index 142d365686..641f0d7246 100644 --- a/clients/nethermind/mapper.jq +++ b/clients/nethermind/mapper.jq @@ -163,6 +163,13 @@ def clique_engine: # Other chain parameters "networkID": env.HIVE_NETWORK_ID|to_hex, "chainID": env.HIVE_CHAIN_ID|to_hex, + + "blobSchedule": { + "prague": { + "target": (if env.HIVE_PRAGUE_BLOB_TARGET then env.HIVE_PRAGUE_BLOB_TARGET|to_hex else "0x6" end), + "max": (if env.HIVE_PRAGUE_BLOB_MAX then env.HIVE_PRAGUE_BLOB_MAX|to_hex else "0x9" end) + } + }, }, "genesis": { "seal": { diff --git a/clients/nimbus-el/mapper.jq b/clients/nimbus-el/mapper.jq index 11f4f607b5..7e5b3d378c 100644 --- a/clients/nimbus-el/mapper.jq +++ b/clients/nimbus-el/mapper.jq @@ -78,6 +78,12 @@ def to_bool: "shanghaiTime": env.HIVE_SHANGHAI_TIMESTAMP|to_int, "cancunTime": env.HIVE_CANCUN_TIMESTAMP|to_int, "pragueTime": env.HIVE_PRAGUE_TIMESTAMP|to_int, + "blobSchedule": { + "prague": { + "target": (if env.HIVE_PRAGUE_BLOB_TARGET then env.HIVE_PRAGUE_BLOB_TARGET|to_int else 6 end), + "max": (if env.HIVE_PRAGUE_BLOB_MAX then env.HIVE_PRAGUE_BLOB_MAX|to_int else 9 end) + } + }, "terminalTotalDifficultyPassed": true, }|remove_empty } diff --git a/clients/reth/mapper.jq b/clients/reth/mapper.jq index 3a9b2ead87..97571131b1 100644 --- a/clients/reth/mapper.jq +++ b/clients/reth/mapper.jq @@ -58,5 +58,11 @@ def to_bool: "shanghaiTime": env.HIVE_SHANGHAI_TIMESTAMP|to_int, "cancunTime": env.HIVE_CANCUN_TIMESTAMP|to_int, "pragueTime": env.HIVE_PRAGUE_TIMESTAMP|to_int, + "blobSchedule": { + "prague": { + "target": (if env.HIVE_PRAGUE_BLOB_TARGET then env.HIVE_PRAGUE_BLOB_TARGET|to_int else 6 end), + "max": (if env.HIVE_PRAGUE_BLOB_MAX then env.HIVE_PRAGUE_BLOB_MAX|to_int else 9 end) + } + }, }|remove_empty } diff --git a/simulators/eth2/go.work.sum b/simulators/eth2/go.work.sum index 648795a475..3beef2f971 100644 --- a/simulators/eth2/go.work.sum +++ b/simulators/eth2/go.work.sum @@ -29,80 +29,107 @@ cloud.google.com/go v0.105.0/go.mod h1:PrLgOJNe5nfE9UMxKxgXj4mD3voiP+YQ6gdt6KMFO cloud.google.com/go v0.107.0/go.mod h1:wpc2eNrD7hXUTy8EKS10jkxpZBjASrORK7goS+3YX2I= cloud.google.com/go v0.110.0/go.mod h1:SJnCLqQ0FCFGSZMUNUf84MV3Aia54kn7pi8st7tMzaY= cloud.google.com/go v0.110.2/go.mod h1:k04UEeEtb6ZBRTv3dZz4CeJC3jKGxyhl0sAiVVquxiw= +cloud.google.com/go v0.110.4 h1:1JYyxKMN9hd5dR2MYTPWkGUgcoxVVhg0LKNKEo0qvmk= cloud.google.com/go v0.110.4/go.mod h1:+EYjdK8e5RME/VY/qLCAtuyALQ9q67dvuum8i+H5xsI= cloud.google.com/go/accessapproval v1.5.0/go.mod h1:HFy3tuiGvMdcd/u+Cu5b9NkO1pEICJ46IR82PoUdplw= cloud.google.com/go/accessapproval v1.6.0/go.mod h1:R0EiYnwV5fsRFiKZkPHr6mwyk2wxUJ30nL4j2pcFY2E= +cloud.google.com/go/accessapproval v1.7.1 h1:/5YjNhR6lzCvmJZAnByYkfEgWjfAKwYP6nkuTk6nKFE= cloud.google.com/go/accessapproval v1.7.1/go.mod h1:JYczztsHRMK7NTXb6Xw+dwbs/WnOJxbo/2mTI+Kgg68= cloud.google.com/go/accesscontextmanager v1.4.0/go.mod h1:/Kjh7BBu/Gh83sv+K60vN9QE5NJcd80sU33vIe2IFPE= cloud.google.com/go/accesscontextmanager v1.7.0/go.mod h1:CEGLewx8dwa33aDAZQujl7Dx+uYhS0eay198wB/VumQ= +cloud.google.com/go/accesscontextmanager v1.8.1 h1:WIAt9lW9AXtqw/bnvrEUaE8VG/7bAAeMzRCBGMkc4+w= cloud.google.com/go/accesscontextmanager v1.8.1/go.mod h1:JFJHfvuaTC+++1iL1coPiG1eu5D24db2wXCDWDjIrxo= cloud.google.com/go/aiplatform v1.27.0/go.mod h1:Bvxqtl40l0WImSb04d0hXFU7gDOiq9jQmorivIiWcKg= cloud.google.com/go/aiplatform v1.37.0/go.mod h1:IU2Cv29Lv9oCn/9LkFiiuKfwrRTq+QQMbW+hPCxJGZw= +cloud.google.com/go/aiplatform v1.45.0 h1:FLTOQdXDqigyOPYrGGE5AiTpDyRROIZrPU1eXfKzKTY= cloud.google.com/go/aiplatform v1.45.0/go.mod h1:Iu2Q7sC7QGhXUeOhAj/oCK9a+ULz1O4AotZiqjQ8MYA= cloud.google.com/go/analytics v0.12.0/go.mod h1:gkfj9h6XRf9+TS4bmuhPEShsh3hH8PAZzm/41OOhQd4= cloud.google.com/go/analytics v0.19.0/go.mod h1:k8liqf5/HCnOUkbawNtrWWc+UAzyDlW89doe8TtoDsE= +cloud.google.com/go/analytics v0.21.2 h1:T400N/hkELka6OsgK20JYoit0xvKnZtWoe36ft4wGBs= cloud.google.com/go/analytics v0.21.2/go.mod h1:U8dcUtmDmjrmUTnnnRnI4m6zKn/yaA5N9RlEkYFHpQo= cloud.google.com/go/apigateway v1.4.0/go.mod h1:pHVY9MKGaH9PQ3pJ4YLzoj6U5FUDeDFBllIz7WmzJoc= cloud.google.com/go/apigateway v1.5.0/go.mod h1:GpnZR3Q4rR7LVu5951qfXPJCHquZt02jf7xQx7kpqN8= +cloud.google.com/go/apigateway v1.6.1 h1:aBSwCQPcp9rZ0zVEUeJbR623palnqtvxJlUyvzsKGQc= cloud.google.com/go/apigateway v1.6.1/go.mod h1:ufAS3wpbRjqfZrzpvLC2oh0MFlpRJm2E/ts25yyqmXA= cloud.google.com/go/apigeeconnect v1.4.0/go.mod h1:kV4NwOKqjvt2JYR0AoIWo2QGfoRtn/pkS3QlHp0Ni04= cloud.google.com/go/apigeeconnect v1.5.0/go.mod h1:KFaCqvBRU6idyhSNyn3vlHXc8VMDJdRmwDF6JyFRqZ8= +cloud.google.com/go/apigeeconnect v1.6.1 h1:6u/jj0P2c3Mcm+H9qLsXI7gYcTiG9ueyQL3n6vCmFJM= cloud.google.com/go/apigeeconnect v1.6.1/go.mod h1:C4awq7x0JpLtrlQCr8AzVIzAaYgngRqWf9S5Uhg+wWs= cloud.google.com/go/apigeeregistry v0.6.0/go.mod h1:BFNzW7yQVLZ3yj0TKcwzb8n25CFBri51GVGOEUcgQsc= +cloud.google.com/go/apigeeregistry v0.7.1 h1:hgq0ANLDx7t2FDZDJQrCMtCtddR/pjCqVuvQWGrQbXw= cloud.google.com/go/apigeeregistry v0.7.1/go.mod h1:1XgyjZye4Mqtw7T9TsY4NW10U7BojBvG4RMD+vRDrIw= +cloud.google.com/go/apikeys v0.5.0 h1:+77+/BhFuU476/s78kYiWHObxaYBHsC6Us+Gd7W9pJ4= +cloud.google.com/go/apikeys v0.5.0/go.mod h1:5aQfwY4D+ewMMWScd3hm2en3hCj+BROlyrt3ytS7KLI= cloud.google.com/go/apikeys v0.6.0/go.mod h1:kbpXu5upyiAlGkKrJgQl8A0rKNNJ7dQ377pdroRSSi8= cloud.google.com/go/appengine v1.5.0/go.mod h1:TfasSozdkFI0zeoxW3PTBLiNqRmzraodCWatWI9Dmak= cloud.google.com/go/appengine v1.7.1/go.mod h1:IHLToyb/3fKutRysUlFO0BPt5j7RiQ45nrzEJmKTo6E= +cloud.google.com/go/appengine v1.8.1 h1:J+aaUZ6IbTpBegXbmEsh8qZZy864ZVnOoWyfa1XSNbI= cloud.google.com/go/appengine v1.8.1/go.mod h1:6NJXGLVhZCN9aQ/AEDvmfzKEfoYBlfB80/BHiKVputY= cloud.google.com/go/area120 v0.6.0/go.mod h1:39yFJqWVgm0UZqWTOdqkLhjoC7uFfgXRC8g/ZegeAh0= cloud.google.com/go/area120 v0.7.1/go.mod h1:j84i4E1RboTWjKtZVWXPqvK5VHQFJRF2c1Nm69pWm9k= +cloud.google.com/go/area120 v0.8.1 h1:wiOq3KDpdqXmaHzvZwKdpoM+3lDcqsI2Lwhyac7stss= cloud.google.com/go/area120 v0.8.1/go.mod h1:BVfZpGpB7KFVNxPiQBuHkX6Ed0rS51xIgmGyjrAfzsg= cloud.google.com/go/artifactregistry v1.9.0/go.mod h1:2K2RqvA2CYvAeARHRkLDhMDJ3OXy26h3XW+3/Jh2uYc= cloud.google.com/go/artifactregistry v1.13.0/go.mod h1:uy/LNfoOIivepGhooAUpL1i30Hgee3Cu0l4VTWHUC08= +cloud.google.com/go/artifactregistry v1.14.1 h1:k6hNqab2CubhWlGcSzunJ7kfxC7UzpAfQ1UPb9PDCKI= cloud.google.com/go/artifactregistry v1.14.1/go.mod h1:nxVdG19jTaSTu7yA7+VbWL346r3rIdkZ142BSQqhn5E= cloud.google.com/go/asset v1.10.0/go.mod h1:pLz7uokL80qKhzKr4xXGvBQXnzHn5evJAEAtZiIb0wY= cloud.google.com/go/asset v1.13.0/go.mod h1:WQAMyYek/b7NBpYq/K4KJWcRqzoalEsxz/t/dTk4THw= +cloud.google.com/go/asset v1.14.1 h1:vlHdznX70eYW4V1y1PxocvF6tEwxJTTarwIGwOhFF3U= cloud.google.com/go/asset v1.14.1/go.mod h1:4bEJ3dnHCqWCDbWJ/6Vn7GVI9LerSi7Rfdi03hd+WTQ= cloud.google.com/go/assuredworkloads v1.9.0/go.mod h1:kFuI1P78bplYtT77Tb1hi0FMxM0vVpRC7VVoJC3ZoT0= cloud.google.com/go/assuredworkloads v1.10.0/go.mod h1:kwdUQuXcedVdsIaKgKTp9t0UJkE5+PAVNhdQm4ZVq2E= +cloud.google.com/go/assuredworkloads v1.11.1 h1:yaO0kwS+SnhVSTF7BqTyVGt3DTocI6Jqo+S3hHmCwNk= cloud.google.com/go/assuredworkloads v1.11.1/go.mod h1:+F04I52Pgn5nmPG36CWFtxmav6+7Q+c5QyJoL18Lry0= cloud.google.com/go/automl v1.8.0/go.mod h1:xWx7G/aPEe/NP+qzYXktoBSDfjO+vnKMGgsApGJJquM= cloud.google.com/go/automl v1.12.0/go.mod h1:tWDcHDp86aMIuHmyvjuKeeHEGq76lD7ZqfGLN6B0NuU= +cloud.google.com/go/automl v1.13.1 h1:iP9iQurb0qbz+YOOMfKSEjhONA/WcoOIjt6/m+6pIgo= cloud.google.com/go/automl v1.13.1/go.mod h1:1aowgAHWYZU27MybSCFiukPO7xnyawv7pt3zK4bheQE= cloud.google.com/go/baremetalsolution v0.4.0/go.mod h1:BymplhAadOO/eBa7KewQ0Ppg4A4Wplbn+PsFKRLo0uI= +cloud.google.com/go/baremetalsolution v0.5.0 h1:2AipdYXL0VxMboelTTw8c1UJ7gYu35LZYUbuRv9Q28s= cloud.google.com/go/baremetalsolution v0.5.0/go.mod h1:dXGxEkmR9BMwxhzBhV0AioD0ULBmuLZI8CdwalUxuss= cloud.google.com/go/batch v0.4.0/go.mod h1:WZkHnP43R/QCGQsZ+0JyG4i79ranE2u8xvjq/9+STPE= +cloud.google.com/go/batch v0.7.0 h1:YbMt0E6BtqeD5FvSv1d56jbVsWEzlGm55lYte+M6Mzs= cloud.google.com/go/batch v0.7.0/go.mod h1:vLZN95s6teRUqRQ4s3RLDsH8PvboqBK+rn1oevL159g= cloud.google.com/go/beyondcorp v0.3.0/go.mod h1:E5U5lcrcXMsCuoDNyGrpyTm/hn7ne941Jz2vmksAxW8= cloud.google.com/go/beyondcorp v0.5.0/go.mod h1:uFqj9X+dSfrheVp7ssLTaRHd2EHqSL4QZmH4e8WXGGU= +cloud.google.com/go/beyondcorp v0.6.1 h1:doSatyJyIY1ffqsHuv5DiPSYoXZRIUrJYLArWLZqE/E= cloud.google.com/go/beyondcorp v0.6.1/go.mod h1:YhxDWw946SCbmcWo3fAhw3V4XZMSpQ/VYfcKGAEU8/4= cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= cloud.google.com/go/bigquery v1.44.0/go.mod h1:0Y33VqXTEsbamHJvJHdFmtqHvMIY28aK1+dFsvaChGc= cloud.google.com/go/bigquery v1.50.0/go.mod h1:YrleYEh2pSEbgTBZYMJ5SuSr0ML3ypjRB1zgf7pvQLU= +cloud.google.com/go/bigquery v1.52.0 h1:JKLNdxI0N+TIUWD6t9KN646X27N5dQWq9dZbbTWZ8hc= cloud.google.com/go/bigquery v1.52.0/go.mod h1:3b/iXjRQGU4nKa87cXeg6/gogLjO8C6PmuM8i5Bi/u4= cloud.google.com/go/bigtable v1.2.0/go.mod h1:JcVAOl45lrTmQfLj7T6TxyMzIN/3FGGcFm+2xVAli2o= cloud.google.com/go/billing v1.7.0/go.mod h1:q457N3Hbj9lYwwRbnlD7vUpyjq6u5U1RAOArInEiD5Y= cloud.google.com/go/billing v1.13.0/go.mod h1:7kB2W9Xf98hP9Sr12KfECgfGclsH3CQR0R08tnRlRbc= +cloud.google.com/go/billing v1.16.0 h1:1iktEAIZ2uA6KpebC235zi/rCXDdDYQ0bTXTNetSL80= cloud.google.com/go/billing v1.16.0/go.mod h1:y8vx09JSSJG02k5QxbycNRrN7FGZB6F3CAcgum7jvGA= cloud.google.com/go/binaryauthorization v1.4.0/go.mod h1:tsSPQrBd77VLplV70GUhBf/Zm3FsKmgSqgm4UmiDItk= cloud.google.com/go/binaryauthorization v1.5.0/go.mod h1:OSe4OU1nN/VswXKRBmciKpo9LulY41gch5c68htf3/Q= +cloud.google.com/go/binaryauthorization v1.6.1 h1:cAkOhf1ic92zEN4U1zRoSupTmwmxHfklcp1X7CCBKvE= cloud.google.com/go/binaryauthorization v1.6.1/go.mod h1:TKt4pa8xhowwffiBmbrbcxijJRZED4zrqnwZ1lKH51U= cloud.google.com/go/certificatemanager v1.4.0/go.mod h1:vowpercVFyqs8ABSmrdV+GiFf2H/ch3KyudYQEMM590= cloud.google.com/go/certificatemanager v1.6.0/go.mod h1:3Hh64rCKjRAX8dXgRAyOcY5vQ/fE1sh8o+Mdd6KPgY8= +cloud.google.com/go/certificatemanager v1.7.1 h1:uKsohpE0hiobx1Eak9jNcPCznwfB6gvyQCcS28Ah9E8= cloud.google.com/go/certificatemanager v1.7.1/go.mod h1:iW8J3nG6SaRYImIa+wXQ0g8IgoofDFRp5UMzaNk1UqI= cloud.google.com/go/channel v1.9.0/go.mod h1:jcu05W0my9Vx4mt3/rEHpfxc9eKi9XwsdDL8yBMbKUk= cloud.google.com/go/channel v1.12.0/go.mod h1:VkxCGKASi4Cq7TbXxlaBezonAYpp1GCnKMY6tnMQnLU= +cloud.google.com/go/channel v1.16.0 h1:dqRkK2k7Ll/HHeYGxv18RrfhozNxuTJRkspW0iaFZoY= cloud.google.com/go/channel v1.16.0/go.mod h1:eN/q1PFSl5gyu0dYdmxNXscY/4Fi7ABmeHCJNf/oHmc= cloud.google.com/go/cloudbuild v1.4.0/go.mod h1:5Qwa40LHiOXmz3386FrjrYM93rM/hdRr7b53sySrTqA= cloud.google.com/go/cloudbuild v1.9.0/go.mod h1:qK1d7s4QlO0VwfYn5YuClDGg2hfmLZEb4wQGAbIgL1s= +cloud.google.com/go/cloudbuild v1.10.1 h1:N6Tl7Xhi0+GWGdt0i2WwaLZKgKeGP4m9A/cERzZcU5k= cloud.google.com/go/cloudbuild v1.10.1/go.mod h1:lyJg7v97SUIPq4RC2sGsz/9tNczhyv2AjML/ci4ulzU= cloud.google.com/go/clouddms v1.4.0/go.mod h1:Eh7sUGCC+aKry14O1NRljhjyrr0NFC0G2cjwX0cByRk= cloud.google.com/go/clouddms v1.5.0/go.mod h1:QSxQnhikCLUw13iAbffF2CZxAER3xDGNHjsTAkQJcQA= +cloud.google.com/go/clouddms v1.6.1 h1:rjR1nV6oVf2aNNB7B5uz1PDIlBjlOiBgR+q5n7bbB7M= cloud.google.com/go/clouddms v1.6.1/go.mod h1:Ygo1vL52Ov4TBZQquhz5fiw2CQ58gvu+PlS6PVXCpZI= cloud.google.com/go/cloudtasks v1.8.0/go.mod h1:gQXUIwCSOI4yPVK7DgTVFiiP0ZW/eQkydWzwVMdHxrI= cloud.google.com/go/cloudtasks v1.10.0/go.mod h1:NDSoTLkZ3+vExFEWu2UJV1arUyzVDAiZtdWcsUyNwBs= +cloud.google.com/go/cloudtasks v1.11.1 h1:zyF35LjQyVQQnWbglmVDbsgOHqkbkaxTeRDisEJsXtE= cloud.google.com/go/cloudtasks v1.11.1/go.mod h1:a9udmnou9KO2iulGscKR0qBYjreuX8oHwpmFsKspEvM= cloud.google.com/go/compute v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= @@ -120,240 +147,327 @@ cloud.google.com/go/compute v1.19.0/go.mod h1:rikpw2y+UMidAe9tISo04EHNOIf42RLYF/ cloud.google.com/go/compute v1.19.1/go.mod h1:6ylj3a05WF8leseCdIf77NK0g1ey+nj5IKd5/kvShxE= cloud.google.com/go/compute v1.19.3/go.mod h1:qxvISKp/gYnXkSAD1ppcSOveRAmzxicEv/JlizULFrI= cloud.google.com/go/compute v1.20.1/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM= +cloud.google.com/go/compute v1.21.0 h1:JNBsyXVoOoNJtTQcnEY5uYpZIbeCTYIeDe0Xh1bySMk= cloud.google.com/go/compute v1.21.0/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM= cloud.google.com/go/compute/metadata v0.2.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= cloud.google.com/go/compute/metadata v0.2.1/go.mod h1:jgHgmJd2RKBGzXqF5LR2EZMGxBkeanZ9wwa75XHJgOM= +cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= cloud.google.com/go/contactcenterinsights v1.4.0/go.mod h1:L2YzkGbPsv+vMQMCADxJoT9YiTTnSEd6fEvCeHTYVck= cloud.google.com/go/contactcenterinsights v1.6.0/go.mod h1:IIDlT6CLcDoyv79kDv8iWxMSTZhLxSCofVV5W6YFM/w= +cloud.google.com/go/contactcenterinsights v1.9.1 h1:hy4L0bc3fQNZZrhPjuoH62RiisD5B71/S1OZNunsTRk= cloud.google.com/go/contactcenterinsights v1.9.1/go.mod h1:bsg/R7zGLYMVxFFzfh9ooLTruLRCG9fnzhH9KznHhbM= cloud.google.com/go/container v1.7.0/go.mod h1:Dp5AHtmothHGX3DwwIHPgq45Y8KmNsgN3amoYfxVkLo= cloud.google.com/go/container v1.15.0/go.mod h1:ft+9S0WGjAyjDggg5S06DXj+fHJICWg8L7isCQe9pQA= +cloud.google.com/go/container v1.22.1 h1:WKBegIfJJc+CL2PIgNpQuvLgGW/CoGJjge5Yjpc0YuU= cloud.google.com/go/container v1.22.1/go.mod h1:lTNExE2R7f+DLbAN+rJiKTisauFCaoDq6NURZ83eVH4= cloud.google.com/go/containeranalysis v0.6.0/go.mod h1:HEJoiEIu+lEXM+k7+qLCci0h33lX3ZqoYFdmPcoO7s4= cloud.google.com/go/containeranalysis v0.9.0/go.mod h1:orbOANbwk5Ejoom+s+DUCTTJ7IBdBQJDcSylAx/on9s= +cloud.google.com/go/containeranalysis v0.10.1 h1:SM/ibWHWp4TYyJMwrILtcBtYKObyupwOVeceI9pNblw= cloud.google.com/go/containeranalysis v0.10.1/go.mod h1:Ya2jiILITMY68ZLPaogjmOMNkwsDrWBSTyBubGXO7j0= cloud.google.com/go/datacatalog v1.8.0/go.mod h1:KYuoVOv9BM8EYz/4eMFxrr4DUKhGIOXxZoKYF5wdISM= cloud.google.com/go/datacatalog v1.13.0/go.mod h1:E4Rj9a5ZtAxcQJlEBTLgMTphfP11/lNaAshpoBgemX8= +cloud.google.com/go/datacatalog v1.14.1 h1:cFPBt8V5V2T3mu/96tc4nhcMB+5cYcpwjBfn79bZDI8= cloud.google.com/go/datacatalog v1.14.1/go.mod h1:d2CevwTG4yedZilwe+v3E3ZBDRMobQfSG/a6cCCN5R4= cloud.google.com/go/dataflow v0.7.0/go.mod h1:PX526vb4ijFMesO1o202EaUmouZKBpjHsTlCtB4parQ= cloud.google.com/go/dataflow v0.8.0/go.mod h1:Rcf5YgTKPtQyYz8bLYhFoIV/vP39eL7fWNcSOyFfLJE= +cloud.google.com/go/dataflow v0.9.1 h1:VzG2tqsk/HbmOtq/XSfdF4cBvUWRK+S+oL9k4eWkENQ= cloud.google.com/go/dataflow v0.9.1/go.mod h1:Wp7s32QjYuQDWqJPFFlnBKhkAtiFpMTdg00qGbnIHVw= cloud.google.com/go/dataform v0.5.0/go.mod h1:GFUYRe8IBa2hcomWplodVmUx/iTL0FrsauObOM3Ipr0= cloud.google.com/go/dataform v0.7.0/go.mod h1:7NulqnVozfHvWUBpMDfKMUESr+85aJsC/2O0o3jWPDE= +cloud.google.com/go/dataform v0.8.1 h1:xcWso0hKOoxeW72AjBSIp/UfkvpqHNzzS0/oygHlcqY= cloud.google.com/go/dataform v0.8.1/go.mod h1:3BhPSiw8xmppbgzeBbmDvmSWlwouuJkXsXsb8UBih9M= cloud.google.com/go/datafusion v1.5.0/go.mod h1:Kz+l1FGHB0J+4XF2fud96WMmRiq/wj8N9u007vyXZ2w= cloud.google.com/go/datafusion v1.6.0/go.mod h1:WBsMF8F1RhSXvVM8rCV3AeyWVxcC2xY6vith3iw3S+8= +cloud.google.com/go/datafusion v1.7.1 h1:eX9CZoyhKQW6g1Xj7+RONeDj1mV8KQDKEB9KLELX9/8= cloud.google.com/go/datafusion v1.7.1/go.mod h1:KpoTBbFmoToDExJUso/fcCiguGDk7MEzOWXUsJo0wsI= cloud.google.com/go/datalabeling v0.6.0/go.mod h1:WqdISuk/+WIGeMkpw/1q7bK/tFEZxsrFJOJdY2bXvTQ= cloud.google.com/go/datalabeling v0.7.0/go.mod h1:WPQb1y08RJbmpM3ww0CSUAGweL0SxByuW2E+FU+wXcM= +cloud.google.com/go/datalabeling v0.8.1 h1:zxsCD/BLKXhNuRssen8lVXChUj8VxF3ofN06JfdWOXw= cloud.google.com/go/datalabeling v0.8.1/go.mod h1:XS62LBSVPbYR54GfYQsPXZjTW8UxCK2fkDciSrpRFdY= cloud.google.com/go/dataplex v1.4.0/go.mod h1:X51GfLXEMVJ6UN47ESVqvlsRplbLhcsAt0kZCCKsU0A= cloud.google.com/go/dataplex v1.6.0/go.mod h1:bMsomC/aEJOSpHXdFKFGQ1b0TDPIeL28nJObeO1ppRs= +cloud.google.com/go/dataplex v1.8.1 h1:RvUH/k3Qi5AOXUAmQVsNCcND9qwJJq3biMSPngO0TQY= cloud.google.com/go/dataplex v1.8.1/go.mod h1:7TyrDT6BCdI8/38Uvp0/ZxBslOslP2X2MPDucliyvSE= cloud.google.com/go/dataproc v1.8.0/go.mod h1:5OW+zNAH0pMpw14JVrPONsxMQYMBqJuzORhIBfBn9uI= +cloud.google.com/go/dataproc v1.12.0 h1:W47qHL3W4BPkAIbk4SWmIERwsWBaNnWm0P2sdx3YgGU= cloud.google.com/go/dataproc v1.12.0/go.mod h1:zrF3aX0uV3ikkMz6z4uBbIKyhRITnxvr4i3IjKsKrw4= cloud.google.com/go/dataqna v0.6.0/go.mod h1:1lqNpM7rqNLVgWBJyk5NF6Uen2PHym0jtVJonplVsDA= cloud.google.com/go/dataqna v0.7.0/go.mod h1:Lx9OcIIeqCrw1a6KdO3/5KMP1wAmTc0slZWwP12Qq3c= +cloud.google.com/go/dataqna v0.8.1 h1:ITpUJep04hC9V7C+gcK390HO++xesQFSUJ7S4nSnF3U= cloud.google.com/go/dataqna v0.8.1/go.mod h1:zxZM0Bl6liMePWsHA8RMGAfmTG34vJMapbHAxQ5+WA8= cloud.google.com/go/datastore v1.10.0/go.mod h1:PC5UzAmDEkAmkfaknstTYbNpgE49HAgW2J1gcgUfmdM= cloud.google.com/go/datastore v1.11.0/go.mod h1:TvGxBIHCS50u8jzG+AW/ppf87v1of8nwzFNgEZU1D3c= +cloud.google.com/go/datastore v1.12.1 h1:i8HMKsqg/Sl3ZlOTGl471Z8j2uKtbRDT9VXJUIVlMik= cloud.google.com/go/datastore v1.12.1/go.mod h1:KjdB88W897MRITkvWWJrg2OUtrR5XVj1EoLgSp6/N70= cloud.google.com/go/datastream v1.5.0/go.mod h1:6TZMMNPwjUqZHBKPQ1wwXpb0d5VDVPl2/XoS5yi88q4= cloud.google.com/go/datastream v1.7.0/go.mod h1:uxVRMm2elUSPuh65IbZpzJNMbuzkcvu5CjMqVIUHrww= +cloud.google.com/go/datastream v1.9.1 h1:BxAt9Tvi1hoEqI4fvyXh/Oc8vd7b5aCZb3bzewh8Dvg= cloud.google.com/go/datastream v1.9.1/go.mod h1:hqnmr8kdUBmrnk65k5wNRoHSCYksvpdZIcZIEl8h43Q= cloud.google.com/go/deploy v1.5.0/go.mod h1:ffgdD0B89tToyW/U/D2eL0jN2+IEV/3EMuXHA0l4r+s= cloud.google.com/go/deploy v1.8.0/go.mod h1:z3myEJnA/2wnB4sgjqdMfgxCA0EqC3RBTNcVPs93mtQ= +cloud.google.com/go/deploy v1.11.0 h1:rp+Sf2bWuqJYBuygQl6diFAdvlR8kklhD+stDvyl1zM= cloud.google.com/go/deploy v1.11.0/go.mod h1:tKuSUV5pXbn67KiubiUNUejqLs4f5cxxiCNCeyl0F2g= cloud.google.com/go/dialogflow v1.19.0/go.mod h1:JVmlG1TwykZDtxtTXujec4tQ+D8SBFMoosgy+6Gn0s0= cloud.google.com/go/dialogflow v1.32.0/go.mod h1:jG9TRJl8CKrDhMEcvfcfFkkpp8ZhgPz3sBGmAUYJ2qE= +cloud.google.com/go/dialogflow v1.38.0 h1:kP0t9SX0w3Fbs1q36mSZ3GQuyOgauVhdNXw0wK4cmOI= cloud.google.com/go/dialogflow v1.38.0/go.mod h1:L7jnH+JL2mtmdChzAIcXQHXMvQkE3U4hTaNltEuxXn4= cloud.google.com/go/dlp v1.7.0/go.mod h1:68ak9vCiMBjbasxeVD17hVPxDEck+ExiHavX8kiHG+Q= cloud.google.com/go/dlp v1.9.0/go.mod h1:qdgmqgTyReTz5/YNSSuueR8pl7hO0o9bQ39ZhtgkWp4= +cloud.google.com/go/dlp v1.10.1 h1:tF3wsJ2QulRhRLWPzWVkeDz3FkOGVoMl6cmDUHtfYxw= cloud.google.com/go/dlp v1.10.1/go.mod h1:IM8BWz1iJd8njcNcG0+Kyd9OPnqnRNkDV8j42VT5KOI= cloud.google.com/go/documentai v1.10.0/go.mod h1:vod47hKQIPeCfN2QS/jULIvQTugbmdc0ZvxxfQY1bg4= cloud.google.com/go/documentai v1.18.0/go.mod h1:F6CK6iUH8J81FehpskRmhLq/3VlwQvb7TvwOceQ2tbs= +cloud.google.com/go/documentai v1.20.0 h1:DK9nDulPQgdy3pJIYjMIRrFSAe/Ch3TpfHVn83aV/Gk= cloud.google.com/go/documentai v1.20.0/go.mod h1:yJkInoMcK0qNAEdRnqY/D5asy73tnPe88I1YTZT+a8E= cloud.google.com/go/domains v0.7.0/go.mod h1:PtZeqS1xjnXuRPKE/88Iru/LdfoRyEHYA9nFQf4UKpg= cloud.google.com/go/domains v0.8.0/go.mod h1:M9i3MMDzGFXsydri9/vW+EWz9sWb4I6WyHqdlAk0idE= +cloud.google.com/go/domains v0.9.1 h1:rqz6KY7mEg7Zs/69U6m6LMbB7PxFDWmT3QWNXIqhHm0= cloud.google.com/go/domains v0.9.1/go.mod h1:aOp1c0MbejQQ2Pjf1iJvnVyT+z6R6s8pX66KaCSDYfE= cloud.google.com/go/edgecontainer v0.2.0/go.mod h1:RTmLijy+lGpQ7BXuTDa4C4ssxyXT34NIuHIgKuP4s5w= cloud.google.com/go/edgecontainer v1.0.0/go.mod h1:cttArqZpBB2q58W/upSG++ooo6EsblxDIolxa3jSjbY= +cloud.google.com/go/edgecontainer v1.1.1 h1:zhHWnLzg6AqzE+I3gzJqiIwHfjEBhWctNQEzqb+FaRo= cloud.google.com/go/edgecontainer v1.1.1/go.mod h1:O5bYcS//7MELQZs3+7mabRqoWQhXCzenBu0R8bz2rwk= +cloud.google.com/go/errorreporting v0.3.0 h1:kj1XEWMu8P0qlLhm3FwcaFsUvXChV/OraZwA70trRR0= cloud.google.com/go/errorreporting v0.3.0/go.mod h1:xsP2yaAp+OAW4OIm60An2bbLpqIhKXdWR/tawvl7QzU= cloud.google.com/go/essentialcontacts v1.4.0/go.mod h1:8tRldvHYsmnBCHdFpvU+GL75oWiBKl80BiqlFh9tp+8= cloud.google.com/go/essentialcontacts v1.5.0/go.mod h1:ay29Z4zODTuwliK7SnX8E86aUF2CTzdNtvv42niCX0M= +cloud.google.com/go/essentialcontacts v1.6.2 h1:OEJ0MLXXCW/tX1fkxzEZOsv/wRfyFsvDVNaHWBAvoV0= cloud.google.com/go/essentialcontacts v1.6.2/go.mod h1:T2tB6tX+TRak7i88Fb2N9Ok3PvY3UNbUsMag9/BARh4= cloud.google.com/go/eventarc v1.8.0/go.mod h1:imbzxkyAU4ubfsaKYdQg04WS1NvncblHEup4kvF+4gw= cloud.google.com/go/eventarc v1.11.0/go.mod h1:PyUjsUKPWoRBCHeOxZd/lbOOjahV41icXyUY5kSTvVY= +cloud.google.com/go/eventarc v1.12.1 h1:8ZAkv7MTnAhix5kSw+Cm/xVzG8+OhC+flZGL9iRdpQA= cloud.google.com/go/eventarc v1.12.1/go.mod h1:mAFCW6lukH5+IZjkvrEss+jmt2kOdYlN8aMx3sRJiAI= cloud.google.com/go/filestore v1.4.0/go.mod h1:PaG5oDfo9r224f8OYXURtAsY+Fbyq/bLYoINEK8XQAI= cloud.google.com/go/filestore v1.6.0/go.mod h1:di5unNuss/qfZTw2U9nhFqo8/ZDSc466dre85Kydllg= +cloud.google.com/go/filestore v1.7.1 h1:Eiz8xZzMJc5ppBWkuaod/PUdUZGCFR8ku0uS+Ah2fRw= cloud.google.com/go/filestore v1.7.1/go.mod h1:y10jsorq40JJnjR/lQ8AfFbbcGlw3g+Dp8oN7i7FjV4= cloud.google.com/go/firestore v1.9.0/go.mod h1:HMkjKHNTtRyZNiMzu7YAsLr9K3X2udY2AMwDaMEQiiE= +cloud.google.com/go/firestore v1.11.0 h1:PPgtwcYUOXV2jFe1bV3nda3RCrOa8cvBjTOn2MQVfW8= cloud.google.com/go/firestore v1.11.0/go.mod h1:b38dKhgzlmNNGTNZZwe7ZRFEuRab1Hay3/DBsIGKKy4= cloud.google.com/go/functions v1.9.0/go.mod h1:Y+Dz8yGguzO3PpIjhLTbnqV1CWmgQ5UwtlpzoyquQ08= cloud.google.com/go/functions v1.13.0/go.mod h1:EU4O007sQm6Ef/PwRsI8N2umygGqPBS/IZQKBQBcJ3c= +cloud.google.com/go/functions v1.15.1 h1:LtAyqvO1TFmNLcROzHZhV0agEJfBi+zfMZsF4RT/a7U= cloud.google.com/go/functions v1.15.1/go.mod h1:P5yNWUTkyU+LvW/S9O6V+V423VZooALQlqoXdoPz5AE= cloud.google.com/go/gaming v1.8.0/go.mod h1:xAqjS8b7jAVW0KFYeRUxngo9My3f33kFmua++Pi+ggM= cloud.google.com/go/gaming v1.9.0/go.mod h1:Fc7kEmCObylSWLO334NcO+O9QMDyz+TKC4v1D7X+Bc0= +cloud.google.com/go/gaming v1.10.1 h1:5qZmZEWzMf8GEFgm9NeC3bjFRpt7x4S6U7oLbxaf7N8= +cloud.google.com/go/gaming v1.10.1/go.mod h1:XQQvtfP8Rb9Rxnxm5wFVpAp9zCQkJi2bLIb7iHGwB3s= cloud.google.com/go/gkebackup v0.3.0/go.mod h1:n/E671i1aOQvUxT541aTkCwExO/bTer2HDlj4TsBRAo= +cloud.google.com/go/gkebackup v0.4.0 h1:za3QZvw6ujR0uyqkhomKKKNoXDyqYGPJies3voUK8DA= cloud.google.com/go/gkebackup v0.4.0/go.mod h1:byAyBGUwYGEEww7xsbnUTBHIYcOPy/PgUWUtOeRm9Vg= cloud.google.com/go/gkeconnect v0.6.0/go.mod h1:Mln67KyU/sHJEBY8kFZ0xTeyPtzbq9StAVvEULYK16A= cloud.google.com/go/gkeconnect v0.7.0/go.mod h1:SNfmVqPkaEi3bF/B3CNZOAYPYdg7sU+obZ+QTky2Myw= +cloud.google.com/go/gkeconnect v0.8.1 h1:a1ckRvVznnuvDWESM2zZDzSVFvggeBaVY5+BVB8tbT0= cloud.google.com/go/gkeconnect v0.8.1/go.mod h1:KWiK1g9sDLZqhxB2xEuPV8V9NYzrqTUmQR9shJHpOZw= cloud.google.com/go/gkehub v0.10.0/go.mod h1:UIPwxI0DsrpsVoWpLB0stwKCP+WFVG9+y977wO+hBH0= cloud.google.com/go/gkehub v0.12.0/go.mod h1:djiIwwzTTBrF5NaXCGv3mf7klpEMcST17VBTVVDcuaw= +cloud.google.com/go/gkehub v0.14.1 h1:2BLSb8i+Co1P05IYCKATXy5yaaIw/ZqGvVSBTLdzCQo= cloud.google.com/go/gkehub v0.14.1/go.mod h1:VEXKIJZ2avzrbd7u+zeMtW00Y8ddk/4V9511C9CQGTY= cloud.google.com/go/gkemulticloud v0.4.0/go.mod h1:E9gxVBnseLWCk24ch+P9+B2CoDFJZTyIgLKSalC7tuI= cloud.google.com/go/gkemulticloud v0.5.0/go.mod h1:W0JDkiyi3Tqh0TJr//y19wyb1yf8llHVto2Htf2Ja3Y= +cloud.google.com/go/gkemulticloud v0.6.1 h1:vg81EW3GQ4RO4PT1MdNHE8aF87EiohZp/WwMWfUTTR0= cloud.google.com/go/gkemulticloud v0.6.1/go.mod h1:kbZ3HKyTsiwqKX7Yw56+wUGwwNZViRnxWK2DVknXWfw= cloud.google.com/go/grafeas v0.2.0/go.mod h1:KhxgtF2hb0P191HlY5besjYm6MqTSTj3LSI+M+ByZHc= +cloud.google.com/go/grafeas v0.3.0 h1:oyTL/KjiUeBs9eYLw/40cpSZglUC+0F7X4iu/8t7NWs= +cloud.google.com/go/grafeas v0.3.0/go.mod h1:P7hgN24EyONOTMyeJH6DxG4zD7fwiYa5Q6GUgyFSOU8= cloud.google.com/go/gsuiteaddons v1.4.0/go.mod h1:rZK5I8hht7u7HxFQcFei0+AtfS9uSushomRlg+3ua1o= cloud.google.com/go/gsuiteaddons v1.5.0/go.mod h1:TFCClYLd64Eaa12sFVmUyG62tk4mdIsI7pAnSXRkcFo= +cloud.google.com/go/gsuiteaddons v1.6.1 h1:mi9jxZpzVjLQibTS/XfPZvl+Jr6D5Bs8pGqUjllRb00= cloud.google.com/go/gsuiteaddons v1.6.1/go.mod h1:CodrdOqRZcLp5WOwejHWYBjZvfY0kOphkAKpF/3qdZY= cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= cloud.google.com/go/iam v0.6.0/go.mod h1:+1AH33ueBne5MzYccyMHtEKqLE4/kJOibtffMHDMFMc= cloud.google.com/go/iam v0.8.0/go.mod h1:lga0/y3iH6CX7sYqypWJ33hf7kkfXJag67naqGESjkE= cloud.google.com/go/iam v0.13.0/go.mod h1:ljOg+rcNfzZ5d6f1nAUJ8ZIxOaZUVoS14bKCtaLZ/D0= +cloud.google.com/go/iam v1.1.1 h1:lW7fzj15aVIXYHREOqjRBV9PsH0Z6u8Y46a1YGvQP4Y= cloud.google.com/go/iam v1.1.1/go.mod h1:A5avdyVL2tCppe4unb0951eI9jreack+RJ0/d+KUZOU= cloud.google.com/go/iap v1.5.0/go.mod h1:UH/CGgKd4KyohZL5Pt0jSKE4m3FR51qg6FKQ/z/Ix9A= cloud.google.com/go/iap v1.7.1/go.mod h1:WapEwPc7ZxGt2jFGB/C/bm+hP0Y6NXzOYGjpPnmMS74= +cloud.google.com/go/iap v1.8.1 h1:X1tcp+EoJ/LGX6cUPt3W2D4H2Kbqq0pLAsldnsCjLlE= cloud.google.com/go/iap v1.8.1/go.mod h1:sJCbeqg3mvWLqjZNsI6dfAtbbV1DL2Rl7e1mTyXYREQ= cloud.google.com/go/ids v1.2.0/go.mod h1:5WXvp4n25S0rA/mQWAg1YEEBBq6/s+7ml1RDCW1IrcY= cloud.google.com/go/ids v1.3.0/go.mod h1:JBdTYwANikFKaDP6LtW5JAi4gubs57SVNQjemdt6xV4= +cloud.google.com/go/ids v1.4.1 h1:khXYmSoDDhWGEVxHl4c4IgbwSRR+qE/L4hzP3vaU9Hc= cloud.google.com/go/ids v1.4.1/go.mod h1:np41ed8YMU8zOgv53MMMoCntLTn2lF+SUzlM+O3u/jw= cloud.google.com/go/iot v1.4.0/go.mod h1:dIDxPOn0UvNDUMD8Ger7FIaTuvMkj+aGk94RPP0iV+g= cloud.google.com/go/iot v1.6.0/go.mod h1:IqdAsmE2cTYYNO1Fvjfzo9po179rAtJeVGUvkLN3rLE= +cloud.google.com/go/iot v1.7.1 h1:yrH0OSmicD5bqGBoMlWG8UltzdLkYzNUwNVUVz7OT54= cloud.google.com/go/iot v1.7.1/go.mod h1:46Mgw7ev1k9KqK1ao0ayW9h0lI+3hxeanz+L1zmbbbk= cloud.google.com/go/kms v1.6.0/go.mod h1:Jjy850yySiasBUDi6KFUwUv2n1+o7QZFyuUJg6OgjA0= cloud.google.com/go/kms v1.10.1/go.mod h1:rIWk/TryCkR59GMC3YtHtXeLzd634lBbKenvyySAyYI= +cloud.google.com/go/kms v1.12.1 h1:xZmZuwy2cwzsocmKDOPu4BL7umg8QXagQx6fKVmf45U= cloud.google.com/go/kms v1.12.1/go.mod h1:c9J991h5DTl+kg7gi3MYomh12YEENGrf48ee/N/2CDM= cloud.google.com/go/language v1.8.0/go.mod h1:qYPVHf7SPoNNiCL2Dr0FfEFNil1qi3pQEyygwpgVKB8= cloud.google.com/go/language v1.9.0/go.mod h1:Ns15WooPM5Ad/5no/0n81yUetis74g3zrbeJBE+ptUY= +cloud.google.com/go/language v1.10.1 h1:3MXeGEv8AlX+O2LyV4pO4NGpodanc26AmXwOuipEym0= cloud.google.com/go/language v1.10.1/go.mod h1:CPp94nsdVNiQEt1CNjF5WkTcisLiHPyIbMhvR8H2AW0= cloud.google.com/go/lifesciences v0.6.0/go.mod h1:ddj6tSX/7BOnhxCSd3ZcETvtNr8NZ6t/iPhY2Tyfu08= cloud.google.com/go/lifesciences v0.8.0/go.mod h1:lFxiEOMqII6XggGbOnKiyZ7IBwoIqA84ClvoezaA/bo= +cloud.google.com/go/lifesciences v0.9.1 h1:axkANGx1wiBXHiPcJZAE+TDjjYoJRIDzbHC/WYllCBU= cloud.google.com/go/lifesciences v0.9.1/go.mod h1:hACAOd1fFbCGLr/+weUKRAJas82Y4vrL3O5326N//Wc= cloud.google.com/go/logging v1.6.1/go.mod h1:5ZO0mHHbvm8gEmeEUHrmDlTDSu5imF6MUP9OfilNXBw= +cloud.google.com/go/logging v1.7.0 h1:CJYxlNNNNAMkHp9em/YEXcfJg+rPDg7YfwoRpMU+t5I= cloud.google.com/go/logging v1.7.0/go.mod h1:3xjP2CjkM3ZkO73aj4ASA5wRPGGCRrPIAeNqVNkzY8M= cloud.google.com/go/longrunning v0.3.0/go.mod h1:qth9Y41RRSUE69rDcOn6DdK3HfQfsUI0YSmW3iIlLJc= cloud.google.com/go/longrunning v0.4.1/go.mod h1:4iWDqhBZ70CvZ6BfETbvam3T8FMvLK+eFj0E6AaRQTo= cloud.google.com/go/longrunning v0.5.0/go.mod h1:0JNuqRShmscVAhIACGtskSAWtqtOoPkwP0YF1oVEchc= +cloud.google.com/go/longrunning v0.5.1 h1:Fr7TXftcqTudoyRJa113hyaqlGdiBQkp0Gq7tErFDWI= cloud.google.com/go/longrunning v0.5.1/go.mod h1:spvimkwdz6SPWKEt/XBij79E9fiTkHSQl/fRUUQJYJc= cloud.google.com/go/managedidentities v1.4.0/go.mod h1:NWSBYbEMgqmbZsLIyKvxrYbtqOsxY1ZrGM+9RgDqInM= cloud.google.com/go/managedidentities v1.5.0/go.mod h1:+dWcZ0JlUmpuxpIDfyP5pP5y0bLdRwOS4Lp7gMni/LA= +cloud.google.com/go/managedidentities v1.6.1 h1:2/qZuOeLgUHorSdxSQGtnOu9xQkBn37+j+oZQv/KHJY= cloud.google.com/go/managedidentities v1.6.1/go.mod h1:h/irGhTN2SkZ64F43tfGPMbHnypMbu4RB3yl8YcuEak= cloud.google.com/go/maps v0.1.0/go.mod h1:BQM97WGyfw9FWEmQMpZ5T6cpovXXSd1cGmFma94eubI= +cloud.google.com/go/maps v0.7.0 h1:mv9YaczD4oZBZkM5XJl6fXQ984IkJNHPwkc8MUsdkBo= cloud.google.com/go/maps v0.7.0/go.mod h1:3GnvVl3cqeSvgMcpRlQidXsPYuDGQ8naBis7MVzpXsY= cloud.google.com/go/mediatranslation v0.6.0/go.mod h1:hHdBCTYNigsBxshbznuIMFNe5QXEowAuNmmC7h8pu5w= cloud.google.com/go/mediatranslation v0.7.0/go.mod h1:LCnB/gZr90ONOIQLgSXagp8XUW1ODs2UmUMvcgMfI2I= +cloud.google.com/go/mediatranslation v0.8.1 h1:50cF7c1l3BanfKrpnTCaTvhf+Fo6kdF21DG0byG7gYU= cloud.google.com/go/mediatranslation v0.8.1/go.mod h1:L/7hBdEYbYHQJhX2sldtTO5SZZ1C1vkapubj0T2aGig= cloud.google.com/go/memcache v1.7.0/go.mod h1:ywMKfjWhNtkQTxrWxCkCFkoPjLHPW6A7WOTVI8xy3LY= cloud.google.com/go/memcache v1.9.0/go.mod h1:8oEyzXCu+zo9RzlEaEjHl4KkgjlNDaXbCQeQWlzNFJM= +cloud.google.com/go/memcache v1.10.1 h1:7lkLsF0QF+Mre0O/NvkD9Q5utUNwtzvIYjrOLOs0HO0= cloud.google.com/go/memcache v1.10.1/go.mod h1:47YRQIarv4I3QS5+hoETgKO40InqzLP6kpNLvyXuyaA= cloud.google.com/go/metastore v1.8.0/go.mod h1:zHiMc4ZUpBiM7twCIFQmJ9JMEkDSyZS9U12uf7wHqSI= cloud.google.com/go/metastore v1.10.0/go.mod h1:fPEnH3g4JJAk+gMRnrAnoqyv2lpUCqJPWOodSaf45Eo= +cloud.google.com/go/metastore v1.11.1 h1:sF2yYgo2P4b3hJP2LlIZoafZixtabF/fnORDDMkFeqQ= cloud.google.com/go/metastore v1.11.1/go.mod h1:uZuSo80U3Wd4zi6C22ZZliOUJ3XeM/MlYi/z5OAOWRA= cloud.google.com/go/monitoring v1.8.0/go.mod h1:E7PtoMJ1kQXWxPjB6mv2fhC5/15jInuulFdYYtlcvT4= cloud.google.com/go/monitoring v1.13.0/go.mod h1:k2yMBAB1H9JT/QETjNkgdCGD9bPF712XiLTVr+cBrpw= +cloud.google.com/go/monitoring v1.15.1 h1:65JhLMd+JiYnXr6j5Z63dUYCuOg770p8a/VC+gil/58= cloud.google.com/go/monitoring v1.15.1/go.mod h1:lADlSAlFdbqQuwwpaImhsJXu1QSdd3ojypXrFSMr2rM= cloud.google.com/go/networkconnectivity v1.7.0/go.mod h1:RMuSbkdbPwNMQjB5HBWD5MpTBnNm39iAVpC3TmsExt8= cloud.google.com/go/networkconnectivity v1.11.0/go.mod h1:iWmDD4QF16VCDLXUqvyspJjIEtBR/4zq5hwnY2X3scM= +cloud.google.com/go/networkconnectivity v1.12.1 h1:LnrYM6lBEeTq+9f2lR4DjBhv31EROSAQi/P5W4Q0AEc= cloud.google.com/go/networkconnectivity v1.12.1/go.mod h1:PelxSWYM7Sh9/guf8CFhi6vIqf19Ir/sbfZRUwXh92E= cloud.google.com/go/networkmanagement v1.5.0/go.mod h1:ZnOeZ/evzUdUsnvRt792H0uYEnHQEMaz+REhhzJRcf4= cloud.google.com/go/networkmanagement v1.6.0/go.mod h1:5pKPqyXjB/sgtvB5xqOemumoQNB7y95Q7S+4rjSOPYY= +cloud.google.com/go/networkmanagement v1.8.0 h1:/3xP37eMxnyvkfLrsm1nv1b2FbMMSAEAOlECTvoeCq4= cloud.google.com/go/networkmanagement v1.8.0/go.mod h1:Ho/BUGmtyEqrttTgWEe7m+8vDdK74ibQc+Be0q7Fof0= cloud.google.com/go/networksecurity v0.6.0/go.mod h1:Q5fjhTr9WMI5mbpRYEbiexTzROf7ZbDzvzCrNl14nyU= cloud.google.com/go/networksecurity v0.8.0/go.mod h1:B78DkqsxFG5zRSVuwYFRZ9Xz8IcQ5iECsNrPn74hKHU= +cloud.google.com/go/networksecurity v0.9.1 h1:TBLEkMp3AE+6IV/wbIGRNTxnqLXHCTEQWoxRVC18TzY= cloud.google.com/go/networksecurity v0.9.1/go.mod h1:MCMdxOKQ30wsBI1eI659f9kEp4wuuAueoC9AJKSPWZQ= cloud.google.com/go/notebooks v1.5.0/go.mod h1:q8mwhnP9aR8Hpfnrc5iN5IBhrXUy8S2vuYs+kBJ/gu0= cloud.google.com/go/notebooks v1.8.0/go.mod h1:Lq6dYKOYOWUCTvw5t2q1gp1lAp0zxAxRycayS0iJcqQ= +cloud.google.com/go/notebooks v1.9.1 h1:CUqMNEtv4EHFnbogV+yGHQH5iAQLmijOx191innpOcs= cloud.google.com/go/notebooks v1.9.1/go.mod h1:zqG9/gk05JrzgBt4ghLzEepPHNwE5jgPcHZRKhlC1A8= cloud.google.com/go/optimization v1.2.0/go.mod h1:Lr7SOHdRDENsh+WXVmQhQTrzdu9ybg0NecjHidBq6xs= cloud.google.com/go/optimization v1.3.1/go.mod h1:IvUSefKiwd1a5p0RgHDbWCIbDFgKuEdB+fPPuP0IDLI= +cloud.google.com/go/optimization v1.4.1 h1:pEwOAmO00mxdbesCRSsfj8Sd4rKY9kBrYW7Vd3Pq7cA= cloud.google.com/go/optimization v1.4.1/go.mod h1:j64vZQP7h9bO49m2rVaTVoNM0vEBEN5eKPUPbZyXOrk= cloud.google.com/go/orchestration v1.4.0/go.mod h1:6W5NLFWs2TlniBphAViZEVhrXRSMgUGDfW7vrWKvsBk= cloud.google.com/go/orchestration v1.6.0/go.mod h1:M62Bevp7pkxStDfFfTuCOaXgaaqRAga1yKyoMtEoWPQ= +cloud.google.com/go/orchestration v1.8.1 h1:KmN18kE/xa1n91cM5jhCh7s1/UfIguSCisw7nTMUzgE= cloud.google.com/go/orchestration v1.8.1/go.mod h1:4sluRF3wgbYVRqz7zJ1/EUNc90TTprliq9477fGobD8= cloud.google.com/go/orgpolicy v1.5.0/go.mod h1:hZEc5q3wzwXJaKrsx5+Ewg0u1LxJ51nNFlext7Tanwc= cloud.google.com/go/orgpolicy v1.10.0/go.mod h1:w1fo8b7rRqlXlIJbVhOMPrwVljyuW5mqssvBtU18ONc= +cloud.google.com/go/orgpolicy v1.11.1 h1:I/7dHICQkNwym9erHqmlb50LRU588NPCvkfIY0Bx9jI= cloud.google.com/go/orgpolicy v1.11.1/go.mod h1:8+E3jQcpZJQliP+zaFfayC2Pg5bmhuLK755wKhIIUCE= cloud.google.com/go/osconfig v1.10.0/go.mod h1:uMhCzqC5I8zfD9zDEAfvgVhDS8oIjySWh+l4WK6GnWw= cloud.google.com/go/osconfig v1.11.0/go.mod h1:aDICxrur2ogRd9zY5ytBLV89KEgT2MKB2L/n6x1ooPw= +cloud.google.com/go/osconfig v1.12.1 h1:dgyEHdfqML6cUW6/MkihNdTVc0INQst0qSE8Ou1ub9c= cloud.google.com/go/osconfig v1.12.1/go.mod h1:4CjBxND0gswz2gfYRCUoUzCm9zCABp91EeTtWXyz0tE= cloud.google.com/go/oslogin v1.7.0/go.mod h1:e04SN0xO1UNJ1M5GP0vzVBFicIe4O53FOfcixIqTyXo= cloud.google.com/go/oslogin v1.9.0/go.mod h1:HNavntnH8nzrn8JCTT5fj18FuJLFJc4NaZJtBnQtKFs= +cloud.google.com/go/oslogin v1.10.1 h1:LdSuG3xBYu2Sgr3jTUULL1XCl5QBx6xwzGqzoDUw1j0= cloud.google.com/go/oslogin v1.10.1/go.mod h1:x692z7yAue5nE7CsSnoG0aaMbNoRJRXO4sn73R+ZqAs= cloud.google.com/go/phishingprotection v0.6.0/go.mod h1:9Y3LBLgy0kDTcYET8ZH3bq/7qni15yVUoAxiFxnlSUA= cloud.google.com/go/phishingprotection v0.7.0/go.mod h1:8qJI4QKHoda/sb/7/YmMQ2omRLSLYSu9bU0EKCNI+Lk= +cloud.google.com/go/phishingprotection v0.8.1 h1:aK/lNmSd1vtbft/vLe2g7edXK72sIQbqr2QyrZN/iME= cloud.google.com/go/phishingprotection v0.8.1/go.mod h1:AxonW7GovcA8qdEk13NfHq9hNx5KPtfxXNeUxTDxB6I= cloud.google.com/go/policytroubleshooter v1.4.0/go.mod h1:DZT4BcRw3QoO8ota9xw/LKtPa8lKeCByYeKTIf/vxdE= cloud.google.com/go/policytroubleshooter v1.6.0/go.mod h1:zYqaPTsmfvpjm5ULxAyD/lINQxJ0DDsnWOP/GZ7xzBc= +cloud.google.com/go/policytroubleshooter v1.7.1 h1:AZ2n6dw6OnYpDZAUk6WK1drupzTWNMRk/uatXEIDAsU= cloud.google.com/go/policytroubleshooter v1.7.1/go.mod h1:0NaT5v3Ag1M7U5r0GfDCpUFkWd9YqpubBWsQlhanRv0= cloud.google.com/go/privatecatalog v0.6.0/go.mod h1:i/fbkZR0hLN29eEWiiwue8Pb+GforiEIBnV9yrRUOKI= cloud.google.com/go/privatecatalog v0.8.0/go.mod h1:nQ6pfaegeDAq/Q5lrfCQzQLhubPiZhSaNhIgfJlnIXs= +cloud.google.com/go/privatecatalog v0.9.1 h1:B/18xGo+E0EMS9LOEQ0zXz7F2asMgmVgTYGSI89MHOA= cloud.google.com/go/privatecatalog v0.9.1/go.mod h1:0XlDXW2unJXdf9zFz968Hp35gl/bhF4twwpXZAW50JA= cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= cloud.google.com/go/pubsub v1.27.1/go.mod h1:hQN39ymbV9geqBnfQq6Xf63yNhUAhv9CZhzp5O6qsW0= cloud.google.com/go/pubsub v1.30.0/go.mod h1:qWi1OPS0B+b5L+Sg6Gmc9zD1Y+HaM0MdUr7LsupY1P4= +cloud.google.com/go/pubsub v1.32.0 h1:JOEkgEYBuUTHSyHS4TcqOFuWr+vD6qO/imsFqShUCp4= cloud.google.com/go/pubsub v1.32.0/go.mod h1:f+w71I33OMyxf9VpMVcZbnG5KSUkCOUHYpFd5U1GdRc= cloud.google.com/go/pubsublite v1.5.0/go.mod h1:xapqNQ1CuLfGi23Yda/9l4bBCKz/wC3KIJ5gKcxveZg= cloud.google.com/go/pubsublite v1.7.0/go.mod h1:8hVMwRXfDfvGm3fahVbtDbiLePT3gpoiJYJY+vxWxVM= +cloud.google.com/go/pubsublite v1.8.1 h1:pX+idpWMIH30/K7c0epN6V703xpIcMXWRjKJsz0tYGY= cloud.google.com/go/pubsublite v1.8.1/go.mod h1:fOLdU4f5xldK4RGJrBMm+J7zMWNj/k4PxwEZXy39QS0= cloud.google.com/go/recaptchaenterprise v1.3.1/go.mod h1:OdD+q+y4XGeAlxRaMn1Y7/GveP6zmq76byL6tjPE7d4= cloud.google.com/go/recaptchaenterprise/v2 v2.5.0/go.mod h1:O8LzcHXN3rz0j+LBC91jrwI3R+1ZSZEWrfL7XHgNo9U= cloud.google.com/go/recaptchaenterprise/v2 v2.7.0/go.mod h1:19wVj/fs5RtYtynAPJdDTb69oW0vNHYDBTbB4NvMD9c= +cloud.google.com/go/recaptchaenterprise/v2 v2.7.2 h1:IGkbudobsTXAwmkEYOzPCQPApUCsN4Gbq3ndGVhHQpI= cloud.google.com/go/recaptchaenterprise/v2 v2.7.2/go.mod h1:kR0KjsJS7Jt1YSyWFkseQ756D45kaYNTlDPPaRAvDBU= cloud.google.com/go/recommendationengine v0.6.0/go.mod h1:08mq2umu9oIqc7tDy8sx+MNJdLG0fUi3vaSVbztHgJ4= cloud.google.com/go/recommendationengine v0.7.0/go.mod h1:1reUcE3GIu6MeBz/h5xZJqNLuuVjNg1lmWMPyjatzac= +cloud.google.com/go/recommendationengine v0.8.1 h1:nMr1OEVHuDambRn+/y4RmNAmnR/pXCuHtH0Y4tCgGRQ= cloud.google.com/go/recommendationengine v0.8.1/go.mod h1:MrZihWwtFYWDzE6Hz5nKcNz3gLizXVIDI/o3G1DLcrE= cloud.google.com/go/recommender v1.8.0/go.mod h1:PkjXrTT05BFKwxaUxQmtIlrtj0kph108r02ZZQ5FE70= cloud.google.com/go/recommender v1.9.0/go.mod h1:PnSsnZY7q+VL1uax2JWkt/UegHssxjUVVCrX52CuEmQ= +cloud.google.com/go/recommender v1.10.1 h1:UKp94UH5/Lv2WXSQe9+FttqV07x/2p1hFTMMYVFtilg= cloud.google.com/go/recommender v1.10.1/go.mod h1:XFvrE4Suqn5Cq0Lf+mCP6oBHD/yRMA8XxP5sb7Q7gpA= cloud.google.com/go/redis v1.10.0/go.mod h1:ThJf3mMBQtW18JzGgh41/Wld6vnDDc/F/F35UolRZPM= cloud.google.com/go/redis v1.11.0/go.mod h1:/X6eicana+BWcUda5PpwZC48o37SiFVTFSs0fWAJ7uQ= +cloud.google.com/go/redis v1.13.1 h1:YrjQnCC7ydk+k30op7DSjSHw1yAYhqYXFcOq1bSXRYA= cloud.google.com/go/redis v1.13.1/go.mod h1:VP7DGLpE91M6bcsDdMuyCm2hIpB6Vp2hI090Mfd1tcg= cloud.google.com/go/resourcemanager v1.4.0/go.mod h1:MwxuzkumyTX7/a3n37gmsT3py7LIXwrShilPh3P1tR0= cloud.google.com/go/resourcemanager v1.7.0/go.mod h1:HlD3m6+bwhzj9XCouqmeiGuni95NTrExfhoSrkC/3EI= +cloud.google.com/go/resourcemanager v1.9.1 h1:QIAMfndPOHR6yTmMUB0ZN+HSeRmPjR/21Smq5/xwghI= cloud.google.com/go/resourcemanager v1.9.1/go.mod h1:dVCuosgrh1tINZ/RwBufr8lULmWGOkPS8gL5gqyjdT8= cloud.google.com/go/resourcesettings v1.4.0/go.mod h1:ldiH9IJpcrlC3VSuCGvjR5of/ezRrOxFtpJoJo5SmXg= cloud.google.com/go/resourcesettings v1.5.0/go.mod h1:+xJF7QSG6undsQDfsCJyqWXyBwUoJLhetkRMDRnIoXA= +cloud.google.com/go/resourcesettings v1.6.1 h1:Fdyq418U69LhvNPFdlEO29w+DRRjwDA4/pFamm4ksAg= cloud.google.com/go/resourcesettings v1.6.1/go.mod h1:M7mk9PIZrC5Fgsu1kZJci6mpgN8o0IUzVx3eJU3y4Jw= cloud.google.com/go/retail v1.11.0/go.mod h1:MBLk1NaWPmh6iVFSz9MeKG/Psyd7TAgm6y/9L2B4x9Y= cloud.google.com/go/retail v1.12.0/go.mod h1:UMkelN/0Z8XvKymXFbD4EhFJlYKRx1FGhQkVPU5kF14= +cloud.google.com/go/retail v1.14.1 h1:gYBrb9u/Hc5s5lUTFXX1Vsbc/9BEvgtioY6ZKaK0DK8= cloud.google.com/go/retail v1.14.1/go.mod h1:y3Wv3Vr2k54dLNIrCzenyKG8g8dhvhncT2NcNjb/6gE= cloud.google.com/go/run v0.3.0/go.mod h1:TuyY1+taHxTjrD0ZFk2iAR+xyOXEA0ztb7U3UNA0zBo= +cloud.google.com/go/run v0.9.0 h1:ydJQo+k+MShYnBfhaRHSZYeD/SQKZzZLAROyfpeD9zw= cloud.google.com/go/run v0.9.0/go.mod h1:Wwu+/vvg8Y+JUApMwEDfVfhetv30hCG4ZwDR/IXl2Qg= cloud.google.com/go/scheduler v1.7.0/go.mod h1:jyCiBqWW956uBjjPMMuX09n3x37mtyPJegEWKxRsn44= cloud.google.com/go/scheduler v1.9.0/go.mod h1:yexg5t+KSmqu+njTIh3b7oYPheFtBWGcbVUYF1GGMIc= +cloud.google.com/go/scheduler v1.10.1 h1:yoZbZR8880KgPGLmACOMCiY2tPk+iX4V/dkxqTirlz8= cloud.google.com/go/scheduler v1.10.1/go.mod h1:R63Ldltd47Bs4gnhQkmNDse5w8gBRrhObZ54PxgR2Oo= cloud.google.com/go/secretmanager v1.9.0/go.mod h1:b71qH2l1yHmWQHt9LC80akm86mX8AL6X1MA01dW8ht4= cloud.google.com/go/secretmanager v1.10.0/go.mod h1:MfnrdvKMPNra9aZtQFvBcvRU54hbPD8/HayQdlUgJpU= +cloud.google.com/go/secretmanager v1.11.1 h1:cLTCwAjFh9fKvU6F13Y4L9vPcx9yiWPyWXE4+zkuEQs= cloud.google.com/go/secretmanager v1.11.1/go.mod h1:znq9JlXgTNdBeQk9TBW/FnR/W4uChEKGeqQWAJ8SXFw= cloud.google.com/go/security v1.10.0/go.mod h1:QtOMZByJVlibUT2h9afNDWRZ1G96gVywH8T5GUSb9IA= cloud.google.com/go/security v1.13.0/go.mod h1:Q1Nvxl1PAgmeW0y3HTt54JYIvUdtcpYKVfIB8AOMZ+0= +cloud.google.com/go/security v1.15.1 h1:jR3itwycg/TgGA0uIgTItcVhA55hKWiNJxaNNpQJaZE= cloud.google.com/go/security v1.15.1/go.mod h1:MvTnnbsWnehoizHi09zoiZob0iCHVcL4AUBj76h9fXA= cloud.google.com/go/securitycenter v1.16.0/go.mod h1:Q9GMaLQFUD+5ZTabrbujNWLtSLZIZF7SAR0wWECrjdk= cloud.google.com/go/securitycenter v1.19.0/go.mod h1:LVLmSg8ZkkyaNy4u7HCIshAngSQ8EcIRREP3xBnyfag= +cloud.google.com/go/securitycenter v1.23.0 h1:XOGJ9OpnDtqg8izd7gYk/XUhj8ytjIalyjjsR6oyG0M= cloud.google.com/go/securitycenter v1.23.0/go.mod h1:8pwQ4n+Y9WCWM278R8W3nF65QtY172h4S8aXyI9/hsQ= cloud.google.com/go/servicecontrol v1.5.0/go.mod h1:qM0CnXHhyqKVuiZnGKrIurvVImCs8gmqWsDoqe9sU1s= +cloud.google.com/go/servicecontrol v1.10.0 h1:P1OiVugNQtWVM3hVJSzaAmye48pExx1VPX2SKT8Z4Yg= +cloud.google.com/go/servicecontrol v1.10.0/go.mod h1:pQvyvSRh7YzUF2efw7H87V92mxU8FnFDawMClGCNuAA= cloud.google.com/go/servicecontrol v1.11.1/go.mod h1:aSnNNlwEFBY+PWGQ2DoM0JJ/QUXqV5/ZD9DOLB7SnUk= cloud.google.com/go/servicedirectory v1.7.0/go.mod h1:5p/U5oyvgYGYejufvxhgwjL8UVXjkuw7q5XcG10wx1U= cloud.google.com/go/servicedirectory v1.9.0/go.mod h1:29je5JjiygNYlmsGz8k6o+OZ8vd4f//bQLtvzkPPT/s= +cloud.google.com/go/servicedirectory v1.10.1 h1:J/0csas97yAQ+dcc7i8HqbaOA4KOfPu7BPhJdxYRhCk= cloud.google.com/go/servicedirectory v1.10.1/go.mod h1:Xv0YVH8s4pVOwfM/1eMTl0XJ6bzIOSLDt8f8eLaGOxQ= cloud.google.com/go/servicemanagement v1.5.0/go.mod h1:XGaCRe57kfqu4+lRxaFEAuqmjzF0r+gWHjWqKqBvKFo= +cloud.google.com/go/servicemanagement v1.6.0 h1:flWoX0eJy21+34I/7HPUbpr6xTHPVzws1xnecLFlUm0= +cloud.google.com/go/servicemanagement v1.6.0/go.mod h1:aWns7EeeCOtGEX4OvZUWCCJONRZeFKiptqKf1D0l/Jc= cloud.google.com/go/servicemanagement v1.8.0/go.mod h1:MSS2TDlIEQD/fzsSGfCdJItQveu9NXnUniTrq/L8LK4= cloud.google.com/go/serviceusage v1.4.0/go.mod h1:SB4yxXSaYVuUBYUml6qklyONXNLt83U0Rb+CXyhjEeU= +cloud.google.com/go/serviceusage v1.5.0 h1:fl1AGgOx7E2eyBmH5ofDXT9w8xGvEaEnHYyNYGkxaqg= +cloud.google.com/go/serviceusage v1.5.0/go.mod h1:w8U1JvqUqwJNPEOTQjrMHkw3IaIFLoLsPLvsE3xueec= cloud.google.com/go/serviceusage v1.6.0/go.mod h1:R5wwQcbOWsyuOfbP9tGdAnCAc6B9DRwPG1xtWMDeuPA= cloud.google.com/go/shell v1.4.0/go.mod h1:HDxPzZf3GkDdhExzD/gs8Grqk+dmYcEjGShZgYa9URw= cloud.google.com/go/shell v1.6.0/go.mod h1:oHO8QACS90luWgxP3N9iZVuEiSF84zNyLytb+qE2f9A= +cloud.google.com/go/shell v1.7.1 h1:aHbwH9LSqs4r2rbay9f6fKEls61TAjT63jSyglsw7sI= cloud.google.com/go/shell v1.7.1/go.mod h1:u1RaM+huXFaTojTbW4g9P5emOrrmLE69KrxqQahKn4g= cloud.google.com/go/spanner v1.41.0/go.mod h1:MLYDBJR/dY4Wt7ZaMIQ7rXOTLjYrmxLE/5ve9vFfWos= cloud.google.com/go/spanner v1.45.0/go.mod h1:FIws5LowYz8YAE1J8fOS7DJup8ff7xJeetWEo5REA2M= +cloud.google.com/go/spanner v1.47.0 h1:aqiMP8dhsEXgn9K5EZBWxPG7dxIiyM2VaikqeU4iteg= cloud.google.com/go/spanner v1.47.0/go.mod h1:IXsJwVW2j4UKs0eYDqodab6HgGuA1bViSqW4uH9lfUI= cloud.google.com/go/speech v1.9.0/go.mod h1:xQ0jTcmnRFFM2RfX/U+rk6FQNUF6DQlydUSyoooSpco= cloud.google.com/go/speech v1.15.0/go.mod h1:y6oH7GhqCaZANH7+Oe0BhgIogsNInLlz542tg3VqeYI= +cloud.google.com/go/speech v1.17.1 h1:KIV99afoYTJqA2qi8Cjbl5DpjSRzvqFgKcptGXg6kxw= cloud.google.com/go/speech v1.17.1/go.mod h1:8rVNzU43tQvxDaGvqOhpDqgkJTFowBpDvCJ14kGlJYo= cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= @@ -361,95 +475,144 @@ cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3f cloud.google.com/go/storage v1.22.1/go.mod h1:S8N1cAStu7BOeFfE8KAQzmyyLkK8p/vmRq6kuBTW58Y= cloud.google.com/go/storage v1.27.0/go.mod h1:x9DOL8TK/ygDUMieqwfhdpQryTeEkhGKMi80i/iqR2s= cloud.google.com/go/storage v1.29.0/go.mod h1:4puEjyTKnku6gfKoTfNOU/W+a9JyuVNxjpS5GBrB8h4= +cloud.google.com/go/storage v1.30.1 h1:uOdMxAs8HExqBlnLtnQyP0YkvbiDpdGShGKtx6U/oNM= cloud.google.com/go/storage v1.30.1/go.mod h1:NfxhC0UJE1aXSx7CIIbCf7y9HKT7BiccwkR7+P7gN8E= cloud.google.com/go/storagetransfer v1.6.0/go.mod h1:y77xm4CQV/ZhFZH75PLEXY0ROiS7Gh6pSKrM8dJyg6I= cloud.google.com/go/storagetransfer v1.8.0/go.mod h1:JpegsHHU1eXg7lMHkvf+KE5XDJ7EQu0GwNJbbVGanEw= +cloud.google.com/go/storagetransfer v1.10.0 h1:+ZLkeXx0K0Pk5XdDmG0MnUVqIR18lllsihU/yq39I8Q= cloud.google.com/go/storagetransfer v1.10.0/go.mod h1:DM4sTlSmGiNczmV6iZyceIh2dbs+7z2Ayg6YAiQlYfA= cloud.google.com/go/talent v1.4.0/go.mod h1:ezFtAgVuRf8jRsvyE6EwmbTK5LKciD4KVnHuDEFmOOA= cloud.google.com/go/talent v1.5.0/go.mod h1:G+ODMj9bsasAEJkQSzO2uHQWXHHXUomArjWQQYkqK6c= +cloud.google.com/go/talent v1.6.2 h1:j46ZgD6N2YdpFPux9mc7OAf4YK3tiBCsbLKc8rQx+bU= cloud.google.com/go/talent v1.6.2/go.mod h1:CbGvmKCG61mkdjcqTcLOkb2ZN1SrQI8MDyma2l7VD24= cloud.google.com/go/texttospeech v1.5.0/go.mod h1:oKPLhR4n4ZdQqWKURdwxMy0uiTS1xU161C8W57Wkea4= cloud.google.com/go/texttospeech v1.6.0/go.mod h1:YmwmFT8pj1aBblQOI3TfKmwibnsfvhIBzPXcW4EBovc= +cloud.google.com/go/texttospeech v1.7.1 h1:S/pR/GZT9p15R7Y2dk2OXD/3AufTct/NSxT4a7nxByw= cloud.google.com/go/texttospeech v1.7.1/go.mod h1:m7QfG5IXxeneGqTapXNxv2ItxP/FS0hCZBwXYqucgSk= cloud.google.com/go/tpu v1.4.0/go.mod h1:mjZaX8p0VBgllCzF6wcU2ovUXN9TONFLd7iz227X2Xg= cloud.google.com/go/tpu v1.5.0/go.mod h1:8zVo1rYDFuW2l4yZVY0R0fb/v44xLh3llq7RuV61fPM= +cloud.google.com/go/tpu v1.6.1 h1:kQf1jgPY04UJBYYjNUO+3GrZtIb57MfGAW2bwgLbR3A= cloud.google.com/go/tpu v1.6.1/go.mod h1:sOdcHVIgDEEOKuqUoi6Fq53MKHJAtOwtz0GuKsWSH3E= cloud.google.com/go/trace v1.4.0/go.mod h1:UG0v8UBqzusp+z63o7FK74SdFE+AXpCLdFb1rshXG+Y= cloud.google.com/go/trace v1.9.0/go.mod h1:lOQqpE5IaWY0Ixg7/r2SjixMuc6lfTFeO4QGM4dQWOk= +cloud.google.com/go/trace v1.10.1 h1:EwGdOLCNfYOOPtgqo+D2sDLZmRCEO1AagRTJCU6ztdg= cloud.google.com/go/trace v1.10.1/go.mod h1:gbtL94KE5AJLH3y+WVpfWILmqgc6dXcqgNXdOPAQTYk= cloud.google.com/go/translate v1.4.0/go.mod h1:06Dn/ppvLD6WvA5Rhdp029IX2Mi3Mn7fpMRLPvXT5Wg= cloud.google.com/go/translate v1.7.0/go.mod h1:lMGRudH1pu7I3n3PETiOB2507gf3HnfLV8qlkHZEyos= +cloud.google.com/go/translate v1.8.1 h1:7P75urEfnR/gU+7oYn5GuMsV9tJAiBGLJv06G10mM/E= cloud.google.com/go/translate v1.8.1/go.mod h1:d1ZH5aaOA0CNhWeXeC8ujd4tdCFw8XoNWRljklu5RHs= cloud.google.com/go/video v1.9.0/go.mod h1:0RhNKFRF5v92f8dQt0yhaHrEuH95m068JYOvLZYnJSw= cloud.google.com/go/video v1.15.0/go.mod h1:SkgaXwT+lIIAKqWAJfktHT/RbgjSuY6DobxEp0C5yTQ= +cloud.google.com/go/video v1.17.1 h1:gWi0caJILQb9VwZPq28R1Wrg5YMsoLIvtvKDSglcQL8= cloud.google.com/go/video v1.17.1/go.mod h1:9qmqPqw/Ib2tLqaeHgtakU+l5TcJxCJbhFXM7UJjVzU= cloud.google.com/go/videointelligence v1.9.0/go.mod h1:29lVRMPDYHikk3v8EdPSaL8Ku+eMzDljjuvRs105XoU= cloud.google.com/go/videointelligence v1.10.0/go.mod h1:LHZngX1liVtUhZvi2uNS0VQuOzNi2TkY1OakiuoUOjU= +cloud.google.com/go/videointelligence v1.11.1 h1:MBMWnkQ78GQnRz5lfdTAbBq/8QMCF3wahgtHh3s/J+k= cloud.google.com/go/videointelligence v1.11.1/go.mod h1:76xn/8InyQHarjTWsBR058SmlPCwQjgcvoW0aZykOvo= cloud.google.com/go/vision v1.2.0/go.mod h1:SmNwgObm5DpFBme2xpyOyasvBc1aPdjvMk2bBk0tKD0= cloud.google.com/go/vision/v2 v2.5.0/go.mod h1:MmaezXOOE+IWa+cS7OhRRLK2cNv1ZL98zhqFFZaaH2E= cloud.google.com/go/vision/v2 v2.7.0/go.mod h1:H89VysHy21avemp6xcf9b9JvZHVehWbET0uT/bcuY/0= +cloud.google.com/go/vision/v2 v2.7.2 h1:ccK6/YgPfGHR/CyESz1mvIbsht5Y2xRsWCPqmTNydEw= cloud.google.com/go/vision/v2 v2.7.2/go.mod h1:jKa8oSYBWhYiXarHPvP4USxYANYUEdEsQrloLjrSwJU= cloud.google.com/go/vmmigration v1.3.0/go.mod h1:oGJ6ZgGPQOFdjHuocGcLqX4lc98YQ7Ygq8YQwHh9A7g= cloud.google.com/go/vmmigration v1.6.0/go.mod h1:bopQ/g4z+8qXzichC7GW1w2MjbErL54rk3/C843CjfY= +cloud.google.com/go/vmmigration v1.7.1 h1:gnjIclgqbEMc+cF5IJuPxp53wjBIlqZ8h9hE8Rkwp7A= cloud.google.com/go/vmmigration v1.7.1/go.mod h1:WD+5z7a/IpZ5bKK//YmT9E047AD+rjycCAvyMxGJbro= cloud.google.com/go/vmwareengine v0.1.0/go.mod h1:RsdNEf/8UDvKllXhMz5J40XxDrNJNN4sagiox+OI208= cloud.google.com/go/vmwareengine v0.3.0/go.mod h1:wvoyMvNWdIzxMYSpH/R7y2h5h3WFkx6d+1TIsP39WGY= +cloud.google.com/go/vmwareengine v0.4.1 h1:roQrCAkaysVvXxFMuK26lORi+gablOY54htDtDDow0w= cloud.google.com/go/vmwareengine v0.4.1/go.mod h1:Px64x+BvjPZwWuc4HdmVhoygcXqEkGHXoa7uyfTgSI0= cloud.google.com/go/vpcaccess v1.5.0/go.mod h1:drmg4HLk9NkZpGfCmZ3Tz0Bwnm2+DKqViEpeEpOq0m8= cloud.google.com/go/vpcaccess v1.6.0/go.mod h1:wX2ILaNhe7TlVa4vC5xce1bCnqE3AeH27RV31lnmZes= +cloud.google.com/go/vpcaccess v1.7.1 h1:ram0GzjNWElmbxXMIzeOZUkQ9J8ZAahD6V8ilPGqX0Y= cloud.google.com/go/vpcaccess v1.7.1/go.mod h1:FogoD46/ZU+JUBX9D606X21EnxiszYi2tArQwLY4SXs= cloud.google.com/go/webrisk v1.7.0/go.mod h1:mVMHgEYH0r337nmt1JyLthzMr6YxwN1aAIEc2fTcq7A= cloud.google.com/go/webrisk v1.8.0/go.mod h1:oJPDuamzHXgUc+b8SiHRcVInZQuybnvEW72PqTc7sSg= +cloud.google.com/go/webrisk v1.9.1 h1:Ssy3MkOMOnyRV5H2bkMQ13Umv7CwB/kugo3qkAX83Fk= cloud.google.com/go/webrisk v1.9.1/go.mod h1:4GCmXKcOa2BZcZPn6DCEvE7HypmEJcJkr4mtM+sqYPc= cloud.google.com/go/websecurityscanner v1.4.0/go.mod h1:ebit/Fp0a+FWu5j4JOmJEV8S8CzdTkAS77oDsiSqYWQ= cloud.google.com/go/websecurityscanner v1.5.0/go.mod h1:Y6xdCPy81yi0SQnDY1xdNTNpfY1oAgXUlcfN3B3eSng= +cloud.google.com/go/websecurityscanner v1.6.1 h1:CfEF/vZ+xXyAR3zC9iaC/QRdf1MEgS20r5UR17Q4gOg= cloud.google.com/go/websecurityscanner v1.6.1/go.mod h1:Njgaw3rttgRHXzwCB8kgCYqv5/rGpFCsBOvPbYgszpg= cloud.google.com/go/workflows v1.9.0/go.mod h1:ZGkj1aFIOd9c8Gerkjjq7OW7I5+l6cSvT3ujaO/WwSA= cloud.google.com/go/workflows v1.10.0/go.mod h1:fZ8LmRmZQWacon9UCX1r/g/DfAXx5VcPALq2CxzdePw= +cloud.google.com/go/workflows v1.11.1 h1:2akeQ/PgtRhrNuD/n1WvJd5zb7YyuDZrlOanBj2ihPg= cloud.google.com/go/workflows v1.11.1/go.mod h1:Z+t10G1wF7h8LgdY/EmRcQY8ptBD/nvofaL6FqlET6g= collectd.org v0.3.0/go.mod h1:A/8DzQBkF6abtvrT2j/AU/4tiBgJWYyh0y/oB/4MlWE= +dmitri.shuralyov.com/app/changes v0.0.0-20180602232624-0a106ad413e3 h1:hJiie5Bf3QucGRa4ymsAUOxyhYwGEz1xrsVk0P8erlw= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9 h1:VpgP7xuJadIUuKccphEpTJnWhS2jkQyMt6Y7pJCD7fY= +dmitri.shuralyov.com/html/belt v0.0.0-20180602232347-f7d459c86be0 h1:SPOUaucgtVls75mg+X7CXigS71EnsfVUK/2CgVrwqgw= +dmitri.shuralyov.com/service/change v0.0.0-20181023043359-a85b471d5412 h1:GvWw74lx5noHocd+f6HBMXK6DuggBB1dhVkuGZbv7qM= +dmitri.shuralyov.com/state v0.0.0-20180228185332-28bcc343414c h1:ivON6cwHK1OH26MZyWDCnbTRZZf0IhNsENoNAKFS1g4= +gioui.org v0.0.0-20210308172011-57750fc8a0a6 h1:K72hopUosKG3ntOPNG4OzzbuhxGuVf06fa2la1/H/Ho= gioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8= +git.apache.org/thrift.git v0.0.0-20180902110319-2566ecd5d999 h1:OR8VhtwhcAI3U48/rzBsVOuHi0zDPzYI1xASVcdSgR8= +github.com/AdaLogics/go-fuzz-headers v0.0.0-20210715213245-6c3934b029d8 h1:V8krnnfGj4pV65YLUm3C0/8bl7V5Nry2Pwvy3ru/wLc= github.com/AdaLogics/go-fuzz-headers v0.0.0-20210715213245-6c3934b029d8/go.mod h1:CzsSbkDixRphAF5hS6wbMKq0eI6ccJRb7/A0M6JBnwg= github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= +github.com/AndreasBriese/bbloom v0.0.0-20190825152654-46b345b51c96 h1:cTp8I5+VIoKjsnZuH8vjyaysT/ses3EvZeaV/1UkF2M= github.com/AndreasBriese/bbloom v0.0.0-20190825152654-46b345b51c96/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= github.com/Azure/azure-sdk-for-go v16.2.1+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= github.com/Azure/azure-sdk-for-go/sdk/azcore v1.0.0/go.mod h1:uGG2W01BaETf0Ozp+QxxKJdMBNRWPdstHG0Fmdwn1/U= github.com/Azure/azure-sdk-for-go/sdk/azcore v1.6.0/go.mod h1:bjGvMhVMb+EEm3VRNQawDMUyMMjo+S5ewNjflkep/0Q= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.0 h1:8q4SaHjFsClSvuVne0ID/5Ka8u3fcIHyqkLjcFpNRHQ= github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.0/go.mod h1:bjGvMhVMb+EEm3VRNQawDMUyMMjo+S5ewNjflkep/0Q= github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.0.0/go.mod h1:+6sju8gk8FRmSajX3Oz4G5Gm7P+mbqE9FVaXXFYTkCM= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.0 h1:vcYCAze6p19qBW7MhZybIsqD8sMV8js0NyQM8JDnVtg= github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.0/go.mod h1:OQeznEEkTZ9OrhHJoDD8ZDq51FHgXjqtP9z6bEwBq9U= github.com/Azure/azure-sdk-for-go/sdk/internal v1.0.0/go.mod h1:eWRD7oawr1Mu1sLCawqVc0CUiF43ia3qQMxLscsKQ9w= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0 h1:sXr+ck84g/ZlZUOZiNELInmMgOsuGwdjjVkEIde0OtY= github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0/go.mod h1:okt5dMMTOFjX/aovMlrjvvXoPMBVSPzk9185BT0+eZM= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/internal v1.0.0/go.mod h1:ceIuwmxDWptoW3eCqSXlnPsZFKh4X+R38dWPv7GS9Vs= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.0.0/go.mod h1:s1tW/At+xHqjNFvWU4G0c0Qv33KOhvbGNj0RCTQDV8s= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.2.0 h1:Ma67P/GGprNwsslzEH6+Kb8nybI8jpDTm4Wmzu2ReK8= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.2.0/go.mod h1:c+Lifp3EDEamAkPVzMooRNOK6CZjNSdEnf1A7jsI9u4= +github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.2.0 h1:gggzg0SUMs6SQbEw+3LoSsYf9YMjkupeAnHMX8O9mmY= github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.2.0/go.mod h1:+6KLcKIVgxoBDMqMO/Nvy7bZ9a0nbU3I1DtFQK3YvB4= github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= +github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8= github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= github.com/Azure/go-autorest v10.8.1+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= +github.com/Azure/go-autorest v14.2.0+incompatible h1:V5VMDjClD3GiElqLWO7mz2MxNAK/vTfRHdAubSIPRgs= github.com/Azure/go-autorest/autorest v0.11.1/go.mod h1:JFgpikqFJ/MleTTxwepExTKnFUKKszPS8UavbQYUMuw= +github.com/Azure/go-autorest/autorest v0.11.18 h1:90Y4srNYrwOtAgVo3ndrQkTYn6kf1Eg/AjTFJ8Is2aM= github.com/Azure/go-autorest/autorest/adal v0.9.0/go.mod h1:/c022QCutn2P7uY+/oQWWNcK9YU+MH96NgK+jErpbcg= github.com/Azure/go-autorest/autorest/adal v0.9.5/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A= +github.com/Azure/go-autorest/autorest/adal v0.9.13 h1:Mp5hbtOePIzM8pJVRa3YLrWWmZtoxRXqUEzCfJt3+/Q= +github.com/Azure/go-autorest/autorest/date v0.3.0 h1:7gUk1U5M/CQbp9WoqinNzJar+8KY+LPI6wiWrP/myHw= github.com/Azure/go-autorest/autorest/mocks v0.4.0/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= +github.com/Azure/go-autorest/autorest/mocks v0.4.1 h1:K0laFcLE6VLTOwNgSxaGbUcLPuGXlNkbVvq4cW4nIHk= github.com/Azure/go-autorest/logger v0.2.0/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= +github.com/Azure/go-autorest/logger v0.2.1 h1:IG7i4p/mDa2Ce4TRyAO8IHnVhAVF3RFU+ZtXWSmf4Tg= +github.com/Azure/go-autorest/tracing v0.6.0 h1:TYi4+3m5t6K48TGI9AUdb+IzbnSxvnvUMfuitfgcfuo= github.com/AzureAD/microsoft-authentication-library-for-go v0.4.0/go.mod h1:Vt9sXTKwMyGcOxSmLDMnGPgqsUg7m8pe215qMLrDXw4= +github.com/AzureAD/microsoft-authentication-library-for-go v1.0.0 h1:OBhqkivkhkMqLPymWEppkm7vgPQY2XsHoEkaMQ0AdZY= github.com/AzureAD/microsoft-authentication-library-for-go v1.0.0/go.mod h1:kgDmCTgBzIEPFElEF+FK0SdjAor06dRq2Go927dnQ6o= github.com/BurntSushi/toml v1.2.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802 h1:1BDTz0u9nC3//pOCMdNH+CiXJVYJh5UQNCOBG7jbELc= github.com/CloudyKit/fastprinter v0.0.0-20170127035650-74b38d55f37a/go.mod h1:EFZQ978U7x8IRnstaskI3IysnWY5Ao3QgZUKOXlsAdw= +github.com/CloudyKit/fastprinter v0.0.0-20200109182630-33d98a066a53 h1:sR+/8Yb4slttB4vD+b9btVEnWgL3Q00OBTzVT8B9C0c= github.com/CloudyKit/fastprinter v0.0.0-20200109182630-33d98a066a53/go.mod h1:+3IMCy2vIlbG1XG/0ggNQv0SvxCAIpPM5b1nCz56Xno= github.com/CloudyKit/jet v2.1.3-0.20180809161101-62edd43e4f88+incompatible/go.mod h1:HPYO+50pSWkPoj9Q/eq0aRGByCL6ScRlUmiEX5Zgm+w= +github.com/CloudyKit/jet/v3 v3.0.0 h1:1PwO5w5VCtlUUl+KTOBsTGZlhjWkcybsGaAau52tOy8= github.com/CloudyKit/jet/v3 v3.0.0/go.mod h1:HKQPgSJmdK8hdoAbKUUWajkHyHo4RaU5rMdUywE7VMo= +github.com/CloudyKit/jet/v6 v6.2.0 h1:EpcZ6SR9n28BUGtNJSvlBqf90IpjeFr36Tizxhn/oME= github.com/CloudyKit/jet/v6 v6.2.0/go.mod h1:d3ypHeIRNo2+XyqnGA8s+aphtcVpjP5hPwP/Lzo7Ro4= github.com/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= github.com/DataDog/zstd v1.4.5/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo= +github.com/GoogleCloudPlatform/cloudsql-proxy v0.0.0-20190129172621-c8b1d7a94ddf h1:8F6fjL5iQP6sArGtPuXh0l6hggdcIpAm4ChjVJE4oTs= github.com/GoogleCloudPlatform/cloudsql-proxy v0.0.0-20190129172621-c8b1d7a94ddf/go.mod h1:aJ4qN3TfrelA6NZ6AXsXRfmEVaYin3EDbSPJrKS8OXo= +github.com/HdrHistogram/hdrhistogram-go v1.1.2 h1:5IcZpTvzydCQeHzK4Ef/D5rrSqwxob0t8PQPMybUNFM= github.com/HdrHistogram/hdrhistogram-go v1.1.2/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo= +github.com/Joker/hpp v1.0.0 h1:65+iuJYdRXv/XyN62C1uEmmOx3432rNG/rKlX6V7Kkc= github.com/Joker/hpp v1.0.0/go.mod h1:8x5n+M1Hp5hC0g8okX3sR3vFQwynaX/UgSOM9MeBKzY= github.com/Joker/jade v1.0.1-0.20190614124447-d475f43051e7/go.mod h1:6E6s8o2AE4KhCrqr6GRJjdC/gNfTdxkIXvuGZZda2VM= +github.com/Joker/jade v1.1.3 h1:Qbeh12Vq6BxURXT1qZBRHsDxeURB8ztcL6f3EXSGeHk= github.com/Joker/jade v1.1.3/go.mod h1:T+2WLyt7VH6Lp0TRxQrUYEs64nRc83wkMQrfeIQKduM= github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= +github.com/MariusVanDerWijden/FuzzyVM v0.0.0-20221202121132-bd37e8fb1d0d h1:DyFNUJjW7jX3w+QPsDw4cdwZ2j6BapkuQpiUg5IefzE= github.com/MariusVanDerWijden/FuzzyVM v0.0.0-20221202121132-bd37e8fb1d0d/go.mod h1:BSKhCg8phwi9taTm849mjagbJqs5fpFFXCc6uH4qaT4= +github.com/MariusVanDerWijden/tx-fuzz v1.0.2 h1:H/C75+C305sWTF2ZoC4wZlJrMOpQ1YIdUBPL48ILIWI= github.com/MariusVanDerWijden/tx-fuzz v1.0.2/go.mod h1:jrK+Lr2mr1+6Pm3LlQ6rGHgK3WRQ9VMTiX+2mPMe6ys= github.com/Microsoft/go-winio v0.4.11/go.mod h1:VhR8bwka0BXejwEJY73c50VrPtXAaKcyvVC4A4RozmA= github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= @@ -470,48 +633,70 @@ github.com/Microsoft/hcsshim v0.8.15/go.mod h1:x38A4YbHbdxJtc0sF6oIz+RG0npwSCAvn github.com/Microsoft/hcsshim v0.8.16/go.mod h1:o5/SZqmR7x9JNKsW3pu+nqHm0MF8vbA+VxGOoXdC600= github.com/Microsoft/hcsshim v0.8.21/go.mod h1:+w2gRZ5ReXQhFOrvSQeNfhrYB/dg3oDwTOcER2fw4I4= github.com/Microsoft/hcsshim v0.9.6/go.mod h1:7pLA8lDk46WKDWlVsENo92gC0XFa8rbKfyFRBqxEbCc= +github.com/Microsoft/hcsshim v0.9.10 h1:TxXGNmcbQxBKVWvjvTocNb6jrPyeHlk5EiDhhgHgggs= +github.com/Microsoft/hcsshim v0.9.10/go.mod h1:7pLA8lDk46WKDWlVsENo92gC0XFa8rbKfyFRBqxEbCc= github.com/Microsoft/hcsshim/test v0.0.0-20201218223536-d3e5debf77da/go.mod h1:5hlzMzRKMLyo42nCZ9oml8AdTlq/0cvIaBv6tK1RehU= github.com/Microsoft/hcsshim/test v0.0.0-20210227013316-43a75bb4edd3/go.mod h1:mw7qgWloBUl75W/gVH3cQszUg1+gUITj7D6NY7ywVnY= +github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46 h1:lsxEuwrXEAokXB9qhlbKWPpo3KMLZQ5WB5WLQRW1uq0= github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= +github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI= github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= +github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M= +github.com/RaveNoX/go-jsoncommentstrip v1.0.0 h1:t527LHHE3HmiHrq74QMpNPZpGCIJzTx+apLkMKt4HC0= github.com/RaveNoX/go-jsoncommentstrip v1.0.0/go.mod h1:78ihd09MekBnJnxpICcwzCMzGrKSKYe4AqU6PDYYpjk= github.com/Shopify/goreferrer v0.0.0-20181106222321-ec9c9a553398/go.mod h1:a1uqRtAwp2Xwc6WNPJEufxJ7fx3npB4UV/JOLmbu5I0= +github.com/Shopify/goreferrer v0.0.0-20220729165902-8cddb4f5de06 h1:KkH3I3sJuOLP3TjA/dfr4NAY8bghDwnXiU7cTKxQqo0= github.com/Shopify/goreferrer v0.0.0-20220729165902-8cddb4f5de06/go.mod h1:7erjKLwalezA0k99cWs5L11HWOAPNjdUZ6RxH1BXbbM= github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d/go.mod h1:HI8ITrYtUY+O+ZhtlqUnD8+KwNPOyugEhfP9fdUIaEQ= github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= github.com/Shopify/sarama v1.26.1/go.mod h1:NbSGBSSndYaIhRcBtY9V0U7AyH+x71bG668AuWys/yU= github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= +github.com/StackExchange/wmi v1.2.1 h1:VIkavFPXSjcnS+O8yTq7NI32k0R5Aj+v39y29VYDOSA= github.com/StackExchange/wmi v1.2.1/go.mod h1:rcmrprowKIVzvc+NUiLncP2uuArMWLCbu9SBzvHz7e8= github.com/VictoriaMetrics/fastcache v1.6.0/go.mod h1:0qHz5QP0GMX4pfmMA/zt5RgfNuXJrTP0zS7DqpHGGTw= github.com/VictoriaMetrics/fastcache v1.10.0/go.mod h1:tjiYeEfYXCqacuvYw/7UoDIeJaNxq6132xHICNP77w8= github.com/VictoriaMetrics/fastcache v1.12.1/go.mod h1:tX04vaqcNoQeGLD+ra5pU5sWkuxnzWhEzLwhP9w653o= github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= +github.com/aclements/go-gg v0.0.0-20170118225347-6dbb4e4fefb0 h1:E5Dzlk3akC+T2Zj1LBHgfPK1y8YWgLDnNDRmG+tpSKw= github.com/aclements/go-gg v0.0.0-20170118225347-6dbb4e4fefb0/go.mod h1:55qNq4vcpkIuHowELi5C8e+1yUHtoLoOUR9QU5j7Tes= +github.com/aclements/go-moremath v0.0.0-20210112150236-f10218a38794 h1:xlwdaKcTNVW4PtpQb8aKA4Pjy0CdJHEqvFbAnvR5m2g= github.com/aclements/go-moremath v0.0.0-20210112150236-f10218a38794/go.mod h1:7e+I0LQFUI9AXWxOfsQROs9xPhoJtbsyWcjJqDd4KPY= github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= +github.com/ajg/form v1.5.1 h1:t9c7v8JUKu/XxOGBU0yjNpaMloxGEJhUkqFRq0ibGeU= github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY= github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= +github.com/ajstarks/svgo v0.0.0-20210923152817-c3b6e2f0c527 h1:NImof/JkF93OVWZY+PINgl6fPtQyF6f+hNUtZ0QZA1c= github.com/ajstarks/svgo v0.0.0-20210923152817-c3b6e2f0c527/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= github.com/alecthomas/kingpin/v2 v2.3.1/go.mod h1:oYL5vtsvEHZGHxU7DMp32Dvx+qL+ptGn6lWaot2vCNE= +github.com/alecthomas/kingpin/v2 v2.4.0 h1:f48lwail6p8zpO1bC4TxtqACaGqHYA22qkHjHpqDjYY= github.com/alecthomas/kingpin/v2 v2.4.0/go.mod h1:0gyi0zQnjuFk8xrkNKamJoyUo382HRL7ATRpFZCw6tE= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 h1:JYp7IbQjafoB+tBA3gMyHYHrpOtNuDiK/uB5uXxq5wM= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= +github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137 h1:s6gZFSlWYmbqAuRjVTiNNhvNRfY2Wxp9nhfyel4rklc= github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE= github.com/alexflint/go-filemutex v0.0.0-20171022225611-72bdc8eae2ae/go.mod h1:CgnQgUtFrFz9mxFNtED3jI5tLDjKlOM+oUF/sTk6ps0= github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= +github.com/andybalholm/brotli v1.0.5 h1:8uQZIdzKmjc/iuPu7O2ioW48L81FgatrcpfFmiq/cCs= github.com/andybalholm/brotli v1.0.5/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= +github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239 h1:kFOfPq6dUM1hTo4JG6LR5AXSUEsOjtdm0kw0FtQtMJA= +github.com/antihax/optional v1.0.0 h1:xK2lYat7ZLaVVcIuj82J8kIro4V6kDe0AUDFboUCwcg= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/apache/arrow/go/arrow v0.0.0-20191024131854-af6fa24be0db/go.mod h1:VTxUBvSJ3s3eHAg65PNgrsn5BtqCRPdmyXh6rAfdxN0= github.com/apache/arrow/go/v11 v11.0.0/go.mod h1:Eg5OsL5H+e299f7u5ssuXsuHQVEGC4xei5aX110hRiI= +github.com/apache/arrow/go/v12 v12.0.0 h1:xtZE63VWl7qLdB0JObIXvvhGjoVNrQ9ciIHG2OK5cmc= +github.com/apache/arrow/go/v12 v12.0.0/go.mod h1:d+tV/eHZZ7Dz7RPrFKtPK02tpr+c9/PEd/zm8mDS9Vg= github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= +github.com/apache/thrift v0.16.0 h1:qEy6UW60iVOlUy+b9ZR0d5WzUWYGOo4HfopoyBaNmoY= github.com/apache/thrift v0.16.0/go.mod h1:PHK3hniurgQaNMZYaCLEqXKsYK8upmhPbmdP2FXSqgU= +github.com/apapsch/go-jsonmerge/v2 v2.0.0 h1:axGnT1gRIfimI7gJifB699GoE/oq+F2MU7Dml6nw9rQ= github.com/apapsch/go-jsonmerge/v2 v2.0.0/go.mod h1:lvDnEdqiQrp0O42VQGgmlKpxL1AP2+08jFMw88y4klk= github.com/aristanetworks/fsnotify v1.4.2/go.mod h1:D/rtu7LpjYM8tRJphJ0hUBYpjai8SfX+aSNsWDTq/Ks= github.com/aristanetworks/glog v0.0.0-20191112221043-67e8567f59f3/go.mod h1:KASm+qXFKs/xjSoWn30NrWBBvdTTQq+UjkhjEJHfSFA= @@ -519,28 +704,45 @@ github.com/aristanetworks/goarista v0.0.0-20200805130819-fd197cf57d96 h1:XJH0YfV github.com/aristanetworks/goarista v0.0.0-20200805130819-fd197cf57d96/go.mod h1:QZe5Yh80Hp1b6JxQdpfSEEe8X7hTyTEZSosSrFf/oJE= github.com/aristanetworks/splunk-hec-go v0.3.3/go.mod h1:1VHO9r17b0K7WmOlLb9nTk/2YanvOEnLMUgsFrxBROc= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= +github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6 h1:G1bPvciwNyF7IUmKXNt9Ak3m6u9DE1rF+RmtIkBpVdA= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= +github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a h1:idn718Q4B6AGu/h5Sxe66HYVdqdGu2l9Iebqhi/AEoA= github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= github.com/aws/aws-sdk-go v1.15.11/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= +github.com/aws/aws-sdk-go-v2 v1.21.2 h1:+LXZ0sgo8quN9UOKXXzAWRT3FWd4NxeXWOZom9pE7GA= github.com/aws/aws-sdk-go-v2 v1.21.2/go.mod h1:ErQhvNuEMhJjweavOYhxVkn2RUx7kQXVATHrjKtxIpM= +github.com/aws/aws-sdk-go-v2/config v1.18.45 h1:Aka9bI7n8ysuwPeFdm77nfbyHCAKQ3z9ghB3S/38zes= github.com/aws/aws-sdk-go-v2/config v1.18.45/go.mod h1:ZwDUgFnQgsazQTnWfeLWk5GjeqTQTL8lMkoE1UXzxdE= +github.com/aws/aws-sdk-go-v2/credentials v1.13.43 h1:LU8vo40zBlo3R7bAvBVy/ku4nxGEyZe9N8MqAeFTzF8= github.com/aws/aws-sdk-go-v2/credentials v1.13.43/go.mod h1:zWJBz1Yf1ZtX5NGax9ZdNjhhI4rgjfgsyk6vTY1yfVg= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.13 h1:PIktER+hwIG286DqXyvVENjgLTAwGgoeriLDD5C+YlQ= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.13/go.mod h1:f/Ib/qYjhV2/qdsf79H3QP/eRE4AkVyEf6sk7XfZ1tg= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.43 h1:nFBQlGtkbPzp/NjZLuFxRqmT91rLJkgvsEQs68h962Y= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.43/go.mod h1:auo+PiyLl0n1l8A0e8RIeR8tOzYPfZZH/JNlrJ8igTQ= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.37 h1:JRVhO25+r3ar2mKGP7E0LDl8K9/G36gjlqca5iQbaqc= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.37/go.mod h1:Qe+2KtKml+FEsQF/DHmDV+xjtche/hwoF75EG4UlHW8= +github.com/aws/aws-sdk-go-v2/internal/ini v1.3.45 h1:hze8YsjSh8Wl1rYa1CJpRmXP21BvOBuc76YhW0HsuQ4= github.com/aws/aws-sdk-go-v2/internal/ini v1.3.45/go.mod h1:lD5M20o09/LCuQ2mE62Mb/iSdSlCNuj6H5ci7tW7OsE= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.37 h1:WWZA/I2K4ptBS1kg0kV1JbBtG/umed0vwHRrmcr9z7k= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.37/go.mod h1:vBmDnwWXWxNPFRMmG2m/3MKOe+xEcMDo1tanpaWCcck= +github.com/aws/aws-sdk-go-v2/service/route53 v1.30.2 h1:/RPQNjh1sDIezpXaFIkZb7MlXnSyAqjVdAwcJuGYTqg= github.com/aws/aws-sdk-go-v2/service/route53 v1.30.2/go.mod h1:TQZBt/WaQy+zTHoW++rnl8JBrmZ0VO6EUbVua1+foCA= +github.com/aws/aws-sdk-go-v2/service/sso v1.15.2 h1:JuPGc7IkOP4AaqcZSIcyqLpFSqBWK32rM9+a1g6u73k= github.com/aws/aws-sdk-go-v2/service/sso v1.15.2/go.mod h1:gsL4keucRCgW+xA85ALBpRFfdSLH4kHOVSnLMSuBECo= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.17.3 h1:HFiiRkf1SdaAmV3/BHOFZ9DjFynPHj8G/UIO1lQS+fk= github.com/aws/aws-sdk-go-v2/service/ssooidc v1.17.3/go.mod h1:a7bHA82fyUXOm+ZSWKU6PIoBxrjSprdLoM8xPYvzYVg= +github.com/aws/aws-sdk-go-v2/service/sts v1.23.2 h1:0BkLfgeDjfZnZ+MhB3ONb01u9pwFYTCZVhlsSSBvlbU= github.com/aws/aws-sdk-go-v2/service/sts v1.23.2/go.mod h1:Eows6e1uQEsc4ZaHANmsPRzAKcVDrcmjjWiih2+HUUQ= +github.com/aws/smithy-go v1.15.0 h1:PS/durmlzvAFpQHDs4wi4sNNP9ExsqZh6IlfdHXgKK8= github.com/aws/smithy-go v1.15.0/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= +github.com/aymerick/douceur v0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuPk= github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4= +github.com/aymerick/raymond v2.0.3-0.20180322193309-b565731e1464+incompatible h1:Ppm0npCCsmuR9oQaBtRuZcmILVE74aXE+AmrJj8L2ns= github.com/aymerick/raymond v2.0.3-0.20180322193309-b565731e1464+incompatible/go.mod h1:osfaiScAUVup+UC9Nfq76eWqDhXlp+4UYaA8uhTBO6g= github.com/beorn7/perks v0.0.0-20160804104726-4c0e84591b9a/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= @@ -550,18 +752,24 @@ github.com/bits-and-blooms/bitset v1.2.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edY github.com/bits-and-blooms/bitset v1.5.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= github.com/bits-and-blooms/bitset v1.7.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= github.com/blang/semver v3.1.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= +github.com/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdnnjpJbkM4JQ= github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= +github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM= github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= +github.com/bmatcuk/doublestar v1.1.1 h1:YroD6BJCZBYx06yYFEWvUuKVWQn3vLLQAVmDmvTSaiQ= github.com/bmatcuk/doublestar v1.1.1/go.mod h1:UD6OnuiIn0yFxxA2le/rnRU1G4RaI4UvFv1sNto9p6w= github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= github.com/bmizerany/pat v0.0.0-20170815010413-6226ea591a40/go.mod h1:8rLXio+WjiTceGBHIoTvn60HIbs7Hm7bcHjyrSqYB9c= github.com/boltdb/bolt v1.3.1/go.mod h1:clJnj/oiGkjum5o1McbSZDSLxVThjynRyGBgiAx27Ps= github.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= +github.com/boombuler/barcode v1.0.1 h1:NDBbPmhS+EqABEs5Kg3n/5ZNjy73Pz7SIV+KCeqyXcs= github.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= +github.com/bradfitz/go-smtpd v0.0.0-20170404230938-deb6d6237625 h1:ckJgFhFWywOx+YLEMIJsTb+NV6NexWICk5+AMSuz3ss= github.com/bradfitz/gomemcache v0.0.0-20170208213004-1952afaa557d/go.mod h1:PmM6Mmwb0LSuEubjR8N7PtNe1KxZLtOUHtbeikc5h60= github.com/bshuster-repo/logrus-logstash-hook v0.4.1/go.mod h1:zsTqEiSzDgAa/8GZR7E1qaXrhYNDKBYy5/dWPTIflbk= github.com/btcsuite/btcd/btcec/v2 v2.2.0/go.mod h1:U7MHm051Al6XmscBQ0BoNydpOTsFAn707034b5nY8zU= github.com/buger/jsonparser v0.0.0-20180808090653-f4dd9f5a6b44/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s= +github.com/buger/jsonparser v0.0.0-20181115193947-bf1c66bbce23 h1:D21IyuvjDCshj1/qq+pCNd3VZOAEI9jy6Bi131YlXgI= github.com/bugsnag/bugsnag-go v0.0.0-20141110184014-b1d153021fcd/go.mod h1:2oa8nejYd4cQ/b0hMIopN0lCRxU0bueqREvZLWFrtK8= github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b/go.mod h1:obH5gd0BsqsP2LwDJ9aOkm/6J86V6lyAXCoQWGw3K50= github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0/go.mod h1:D/8v3kj0zr8ZAKg1AQ6crr+5VwKN5eIywRkfhyM/+dE= @@ -569,8 +777,10 @@ github.com/c-bata/go-prompt v0.2.2/go.mod h1:VzqtzE2ksDBcdln8G7mk2RX9QyGjH+OVqOC github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= +github.com/cenkalti/backoff/v4 v4.1.2 h1:6Yo7N8UP2K6LWZnW94DLVSSrbobcWdVzAYOisuDPIFo= github.com/cenkalti/backoff/v4 v4.1.2/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/census-instrumentation/opencensus-proto v0.4.1 h1:iKLQ0xPNFxR/2hzXZMrBo8f1j86j5WHzznCCQxV/b8g= github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw= github.com/cespare/cp v0.1.0/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s= github.com/cespare/cp v1.1.1 h1:nCb6ZLdB7NRaqsm91JtQTAme2SKJzXVsdPIPkyJr1MU= @@ -582,28 +792,39 @@ github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XL github.com/checkpoint-restore/go-criu/v4 v4.1.0/go.mod h1:xUQBLp4RLc5zJtWY++yjOoMoB5lihDt7fai+75m+rGw= github.com/checkpoint-restore/go-criu/v5 v5.0.0/go.mod h1:cfwC0EG7HMUenopBsUf9d89JlCLQIfgVcNsNN0t6T2M= github.com/checkpoint-restore/go-criu/v5 v5.3.0/go.mod h1:E/eQpaFtUKGOOSEBZgmKAcn+zUUwWxqcaKZlF54wK8E= +github.com/cheekybits/is v0.0.0-20150225183255-68e9c0620927 h1:SKI1/fuSdodxmNNyVBR8d7X/HuLnRpvvFO0AgyQk764= github.com/cheekybits/is v0.0.0-20150225183255-68e9c0620927/go.mod h1:h/aW8ynjgkuj+NQRlZcDbAbM1ORAbXjXX77sX7T289U= +github.com/chromedp/cdproto v0.0.0-20230802225258-3cf4e6d46a89 h1:aPflPkRFkVwbW6dmcVqfgwp1i+UWGFH6VgR1Jim5Ygc= github.com/chromedp/cdproto v0.0.0-20230802225258-3cf4e6d46a89/go.mod h1:GKljq0VrfU4D5yc+2qA6OVr8pmO/MBbPEWqWQ/oqGEs= +github.com/chromedp/chromedp v0.9.2 h1:dKtNz4kApb06KuSXoTQIyUC2TrA0fhGDwNZf3bcgfKw= github.com/chromedp/chromedp v0.9.2/go.mod h1:LkSXJKONWTCHAfQasKFUZI+mxqS4tZqhmtGzzhLsnLs= +github.com/chromedp/sysutil v1.0.0 h1:+ZxhTpfpZlmchB58ih/LBHX52ky7w2VhQVKQMucy3Ic= github.com/chromedp/sysutil v1.0.0/go.mod h1:kgWmDdq8fTzXYcKIBqIYvRRTnYb9aNS9moAV0xufSww= github.com/chzyer/logex v1.2.0/go.mod h1:9+9sk7u7pGNWYMkh0hdiL++6OeibzJccyQU4p4MedaY= +github.com/chzyer/logex v1.2.1 h1:XHDu3E6q+gdHgsdTPH6ImJMIp436vR6MPtH8gP05QzM= github.com/chzyer/logex v1.2.1/go.mod h1:JLbx6lG2kDbNRFnfkgvh4eRJRPX1QCoOIWomwysCBrQ= github.com/chzyer/readline v1.5.0/go.mod h1:x22KAscuvRqlLoK9CsoYsmxoXZMMFVyOl86cAH8qUic= +github.com/chzyer/readline v1.5.1 h1:upd/6fQk4src78LMRzh5vItIt361/o4uq553V8B5sGI= github.com/chzyer/readline v1.5.1/go.mod h1:Eh+b79XXUwfKfcPLepksvw2tcLE/Ct21YObkaSkeBlk= github.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/chzyer/test v1.0.0 h1:p3BQDXSxOhOG0P9z6/hGnII4LGiEPOYBhs8asl/fC04= github.com/chzyer/test v1.0.0/go.mod h1:2JlltgoNkt4TW/z9V/IzDdFaMTM2JPIi26O1pF38GC8= github.com/cilium/ebpf v0.0.0-20200110133405-4032b1d8aae3/go.mod h1:MA5e5Lr8slmEg9bt0VpxxWqJlO4iwu3FBdHUzV7wQVg= github.com/cilium/ebpf v0.0.0-20200702112145-1c8d4c9ef775/go.mod h1:7cR51M8ViRLIdUjrmSXlK9pkrsDlLHbO8jiB8X8JnOc= github.com/cilium/ebpf v0.4.0/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs= github.com/cilium/ebpf v0.6.2/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs= github.com/cilium/ebpf v0.7.0/go.mod h1:/oI2+1shJiTGAMgl6/RgJr36Eo1jzrRcAWbcXO2usCA= +github.com/cilium/ebpf v0.9.1 h1:64sn2K3UKw8NbP/blsixRpF3nXuyhz/VjRlRzvlBRu4= github.com/cilium/ebpf v0.9.1/go.mod h1:+OhNOIXx/Fnu1IE8bJz2dzOA+VSfyTfdNUVdlQnxUFY= github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= +github.com/client9/misspell v0.3.4 h1:ta993UF76GwbvJcIo3Y68y/M3WxlpEHPWIGDkJYwzJI= +github.com/cloudflare/cloudflare-go v0.79.0 h1:ErwCYDjFCYppDJlDJ/5WhsSmzegAUe2+K9qgFyQDg3M= github.com/cloudflare/cloudflare-go v0.79.0/go.mod h1:gkHQf9xEubaQPEuerBuoinR9P8bf8a05Lq0X6WKy1Oc= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= +github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe h1:QQ3GSy+MqSHxm/d8nCtnAiZdYFd45cYZPs8vOOIYKfk= github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= @@ -612,10 +833,12 @@ github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWH github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20220314180256-7f1daf1720fc/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20230105202645-06c439db220b/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4 h1:/inchEIKaYC1Akx+H+gqO04wryn5h75LSazbRlnya1k= github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= github.com/cockroachdb/datadriven v1.0.0/go.mod h1:5Ib8Meh+jk1RlHIXej6Pzevx/NLlNvQB9pmSBZErGA4= github.com/cockroachdb/datadriven v1.0.2/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= +github.com/cockroachdb/datadriven v1.0.3-0.20230801171734-e384cf455877 h1:1MLK4YpFtIEo3ZtMA5C795Wtv5VuUnrXX7mQG+aHg6o= github.com/cockroachdb/datadriven v1.0.3-0.20230801171734-e384cf455877/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= github.com/cockroachdb/errors v1.6.1/go.mod h1:tm6FTP5G81vwJ5lC0SizQo374JNCOPrHyXGitRJoDqM= github.com/cockroachdb/errors v1.8.1/go.mod h1:qGwQn6JmZ+oMjuLwjWzUNqblqk0xl4CVV3SQbGwK7Ac= @@ -627,17 +850,21 @@ github.com/cockroachdb/pebble v0.0.0-20230906160148-46873a6a7a06/go.mod h1:bynZ3 github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593/go.mod h1:6hk1eMY/u5t+Cf18q5lFMUA1Rc+Sm5I6Ra1QuPyxXCo= github.com/cockroachdb/redact v1.0.8/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= github.com/cockroachdb/redact v1.1.3/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= +github.com/cockroachdb/sentry-go v0.6.1-cockroachdb.2 h1:IKgmqgMQlVJIZj19CdocBeSfSaiCbEBZGKODaixqtHM= github.com/cockroachdb/sentry-go v0.6.1-cockroachdb.2/go.mod h1:8BT+cPK6xvFOcRlk0R8eg+OTkcqI6baNH4xAkpiYVvQ= github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= +github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0 h1:sDMmm+q/3+BukdIpxwO365v/Rbspp2Nt5XntgQRXq8Q= github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0/go.mod h1:4Zcjuz89kmFXt9morQgcfYZAYZ5n8WHjt81YYWIwtTM= github.com/consensys/gnark-crypto v0.9.1-0.20230105202408-1a7a29904a7c/go.mod h1:CkbdF9hbRidRJYMRzmfX8TMOr95I2pYXRHF18MzRrvA= github.com/consensys/gnark-crypto v0.10.0/go.mod h1:Iq/P3HHl0ElSjsg2E1gsMwhAyxnxoKK5nVyZKd+/KhU= github.com/containerd/aufs v0.0.0-20200908144142-dab0cbea06f4/go.mod h1:nukgQABAEopAHvB6j7cnP5zJ+/3aVcE7hCYqvIwAHyE= github.com/containerd/aufs v0.0.0-20201003224125-76a6863f2989/go.mod h1:AkGGQs9NM2vtYHaUen+NljV0/baGCAPELGm2q9ZXpWU= github.com/containerd/aufs v0.0.0-20210316121734-20793ff83c97/go.mod h1:kL5kd6KM5TzQjR79jljyi4olc1Vrx6XBlcyj3gNv2PU= +github.com/containerd/aufs v1.0.0 h1:2oeJiwX5HstO7shSrPZjrohJZLzK36wvpdmzDRkL/LY= github.com/containerd/aufs v1.0.0/go.mod h1:kL5kd6KM5TzQjR79jljyi4olc1Vrx6XBlcyj3gNv2PU= github.com/containerd/btrfs v0.0.0-20201111183144-404b9149801e/go.mod h1:jg2QkJcsabfHugurUvvPhS3E08Oxiuh5W/g1ybB4e0E= github.com/containerd/btrfs v0.0.0-20210316141732-918d888fb676/go.mod h1:zMcX3qkXTAi9GI50+0HOeuV8LU2ryCE/V2vG/ZBiTss= +github.com/containerd/btrfs v1.0.0 h1:osn1exbzdub9L5SouXO5swW4ea/xVdJZ3wokxN5GrnA= github.com/containerd/btrfs v1.0.0/go.mod h1:zMcX3qkXTAi9GI50+0HOeuV8LU2ryCE/V2vG/ZBiTss= github.com/containerd/cgroups v0.0.0-20190717030353-c4b9ac5c7601/go.mod h1:X9rLEHIqSf/wfK8NsPqxJmeZgW4pcfzdXITDrUSJ6uI= github.com/containerd/cgroups v0.0.0-20190919134610-bf292b21730f/go.mod h1:OApqhQ4XNSNC13gXIwDjhOQxjWa/NxkwZXJ1EvqT0ko= @@ -652,6 +879,7 @@ github.com/containerd/console v0.0.0-20181022165439-0650fd9eeb50/go.mod h1:Tj/on github.com/containerd/console v0.0.0-20191206165004-02ecf6a7291e/go.mod h1:8Pf4gM6VEbTNRIT26AyyU7hxdQU3MvAvxVI0sc00XBE= github.com/containerd/console v1.0.1/go.mod h1:XUsP6YE/mKtz6bxc+I8UiKKTP04qjQL4qcS3XoQ5xkw= github.com/containerd/console v1.0.2/go.mod h1:ytZPjGgY2oeTkAONYafi2kSj0aYggsf8acV1PGKCbzQ= +github.com/containerd/console v1.0.3 h1:lIr7SlA5PxZyMV30bDW0MGbiOPXwc63yRuCP0ARubLw= github.com/containerd/console v1.0.3/go.mod h1:7LqA/THxQ86k76b8c/EMSiaJ3h1eZkMkXar0TQ1gf3U= github.com/containerd/containerd v1.2.10/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= github.com/containerd/containerd v1.3.0-beta.2.0.20190828155532-0293cbd26c69/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= @@ -668,6 +896,7 @@ github.com/containerd/containerd v1.5.0-rc.0/go.mod h1:V/IXoMqNGgBlabz3tHD2TWDoT github.com/containerd/containerd v1.5.1/go.mod h1:0DOxVqwDy2iZvrZp2JUx/E+hS0UNTVn7dJnIOwtYR4g= github.com/containerd/containerd v1.5.7/go.mod h1:gyvv6+ugqY25TiXxcZC3L5yOeYgEw0QMhscqVp1AR9c= github.com/containerd/containerd v1.6.18/go.mod h1:1RdCUu95+gc2v9t3IL+zIlpClSmew7/0YS8O5eQZrOw= +github.com/containerd/containerd v1.6.26 h1:VVfrE6ZpyisvB1fzoY8Vkiq4sy+i5oF4uk7zu03RaHs= github.com/containerd/containerd v1.6.26/go.mod h1:I4TRdsdoo5MlKob5khDJS2EPT1l1oMNaE2MBm6FrwxM= github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= github.com/containerd/continuity v0.0.0-20190815185530-f2a389ac0a02/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= @@ -676,30 +905,38 @@ github.com/containerd/continuity v0.0.0-20200710164510-efbc4488d8fe/go.mod h1:cE github.com/containerd/continuity v0.0.0-20201208142359-180525291bb7/go.mod h1:kR3BEg7bDFaEddKm54WSmrol1fKWDU1nKYkgrcgZT7Y= github.com/containerd/continuity v0.0.0-20210208174643-50096c924a4e/go.mod h1:EXlVlkqNba9rJe3j7w3Xa924itAMLgZH4UD/Q4PExuQ= github.com/containerd/continuity v0.1.0/go.mod h1:ICJu0PwR54nI0yPEnJ6jcS+J7CZAUXrLh8lPo2knzsM= +github.com/containerd/continuity v0.3.0 h1:nisirsYROK15TAMVukJOUyGJjz4BNQJBVsNvAXZJ/eg= github.com/containerd/continuity v0.3.0/go.mod h1:wJEAIwKOm/pBZuBd0JmeTvnLquTB1Ag8espWhkykbPM= github.com/containerd/fifo v0.0.0-20180307165137-3d5202aec260/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI= github.com/containerd/fifo v0.0.0-20190226154929-a9fb20d87448/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI= github.com/containerd/fifo v0.0.0-20200410184934-f15a3290365b/go.mod h1:jPQ2IAeZRCYxpS/Cm1495vGFww6ecHmMk1YJH2Q5ln0= github.com/containerd/fifo v0.0.0-20201026212402-0724c46b320c/go.mod h1:jPQ2IAeZRCYxpS/Cm1495vGFww6ecHmMk1YJH2Q5ln0= github.com/containerd/fifo v0.0.0-20210316144830-115abcc95a1d/go.mod h1:ocF/ME1SX5b1AOlWi9r677YJmCPSwwWnQ9O123vzpE4= +github.com/containerd/fifo v1.0.0 h1:6PirWBr9/L7GDamKr+XM0IeUFXu5mf3M/BPpH9gaLBU= github.com/containerd/fifo v1.0.0/go.mod h1:ocF/ME1SX5b1AOlWi9r677YJmCPSwwWnQ9O123vzpE4= github.com/containerd/go-cni v1.0.1/go.mod h1:+vUpYxKvAF72G9i1WoDOiPGRtQpqsNW/ZHtSlv++smU= github.com/containerd/go-cni v1.0.2/go.mod h1:nrNABBHzu0ZwCug9Ije8hL2xBCYh/pjfMb1aZGrrohk= +github.com/containerd/go-cni v1.1.6 h1:el5WPymG5nRRLQF1EfB97FWob4Tdc8INg8RZMaXWZlo= github.com/containerd/go-cni v1.1.6/go.mod h1:BWtoWl5ghVymxu6MBjg79W9NZrCRyHIdUtk4cauMe34= github.com/containerd/go-runc v0.0.0-20180907222934-5a6d9f37cfa3/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0= github.com/containerd/go-runc v0.0.0-20190911050354-e029b79d8cda/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0= github.com/containerd/go-runc v0.0.0-20200220073739-7016d3ce2328/go.mod h1:PpyHrqVs8FTi9vpyHwPwiNEGaACDxT/N/pLcvMSRA9g= github.com/containerd/go-runc v0.0.0-20201020171139-16b287bc67d0/go.mod h1:cNU0ZbCgCQVZK4lgG3P+9tn9/PaJNmoDXPpoJhDR+Ok= +github.com/containerd/go-runc v1.0.0 h1:oU+lLv1ULm5taqgV/CJivypVODI4SUz1znWjv3nNYS0= github.com/containerd/go-runc v1.0.0/go.mod h1:cNU0ZbCgCQVZK4lgG3P+9tn9/PaJNmoDXPpoJhDR+Ok= github.com/containerd/imgcrypt v1.0.1/go.mod h1:mdd8cEPW7TPgNG4FpuP3sGBiQ7Yi/zak9TYCG3juvb0= github.com/containerd/imgcrypt v1.0.4-0.20210301171431-0ae5c75f59ba/go.mod h1:6TNsg0ctmizkrOgXRNQjAPFWpMYRWuiB6dSF4Pfa5SA= github.com/containerd/imgcrypt v1.1.1-0.20210312161619-7ed62a527887/go.mod h1:5AZJNI6sLHJljKuI9IHnw1pWqo/F0nGDOuR9zgTs7ow= github.com/containerd/imgcrypt v1.1.1/go.mod h1:xpLnwiQmEUJPvQoAapeb2SNCxz7Xr6PJrXQb0Dpc4ms= +github.com/containerd/imgcrypt v1.1.4 h1:iKTstFebwy3Ak5UF0RHSeuCTahC5OIrPJa6vjMAM81s= github.com/containerd/imgcrypt v1.1.4/go.mod h1:LorQnPtzL/T0IyCeftcsMEO7AqxUDbdO8j/tSUpgxvo= +github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I= github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo= github.com/containerd/nri v0.0.0-20201007170849-eb1350a75164/go.mod h1:+2wGSDGFYfE5+So4M5syatU0N0f0LbWpuqyMi4/BE8c= github.com/containerd/nri v0.0.0-20210316161719-dbaa18c31c14/go.mod h1:lmxnXF6oMkbqs39FiCt1s0R2HSMhcLel9vNL3m4AaeY= github.com/containerd/nri v0.1.0/go.mod h1:lmxnXF6oMkbqs39FiCt1s0R2HSMhcLel9vNL3m4AaeY= +github.com/containerd/nri v0.1.1 h1:uYbQkQiH8f1zGhqn5SgxoZ8wNfZYqTCWfWs65TaFy40= +github.com/containerd/nri v0.1.1/go.mod h1:ZoFbxeZjXxrY3TpGxRjz/naxN16QK9n1Mx2YV2vJoLU= github.com/containerd/stargz-snapshotter/estargz v0.4.1/go.mod h1:x7Q9dg9QYb4+ELgxmo4gBUeJB0tl5dqH1Sdz0nJU1QM= github.com/containerd/ttrpc v0.0.0-20190828154514-0e0f228740de/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o= github.com/containerd/ttrpc v0.0.0-20190828172938-92c8520ef9f8/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o= @@ -707,32 +944,44 @@ github.com/containerd/ttrpc v0.0.0-20191028202541-4f1b8fe65a5c/go.mod h1:LPm1u0x github.com/containerd/ttrpc v1.0.1/go.mod h1:UAxOpgT9ziI0gJrmKvgcZivgxOp8iFPSk8httJEt98Y= github.com/containerd/ttrpc v1.0.2/go.mod h1:UAxOpgT9ziI0gJrmKvgcZivgxOp8iFPSk8httJEt98Y= github.com/containerd/ttrpc v1.1.0/go.mod h1:XX4ZTnoOId4HklF4edwc4DcqskFZuvXB1Evzy5KFQpQ= +github.com/containerd/ttrpc v1.1.2 h1:4jH6OQDQqjfVD2b5TJS5TxmGuLGmp5WW7KtW2TWOP7c= +github.com/containerd/ttrpc v1.1.2/go.mod h1:XX4ZTnoOId4HklF4edwc4DcqskFZuvXB1Evzy5KFQpQ= github.com/containerd/typeurl v0.0.0-20180627222232-a93fcdb778cd/go.mod h1:Cm3kwCdlkCfMSHURc+r6fwoGH6/F1hH3S4sg0rLFWPc= github.com/containerd/typeurl v0.0.0-20190911142611-5eb25027c9fd/go.mod h1:GeKYzf2pQcqv7tJ0AoCuuhtnqhva5LNU3U+OyKxxJpk= github.com/containerd/typeurl v1.0.1/go.mod h1:TB1hUtrpaiO88KEK56ijojHS1+NeF0izUACaJW2mdXg= +github.com/containerd/typeurl v1.0.2 h1:Chlt8zIieDbzQFzXzAeBEF92KhExuE4p9p92/QmY7aY= github.com/containerd/typeurl v1.0.2/go.mod h1:9trJWW2sRlGub4wZJRTW83VtbOLS6hwcDZXTn6oPz9s= github.com/containerd/zfs v0.0.0-20200918131355-0a33824f23a2/go.mod h1:8IgZOBdv8fAgXddBT4dBXJPtxyRsejFIpXoklgxgEjw= github.com/containerd/zfs v0.0.0-20210301145711-11e8f1707f62/go.mod h1:A9zfAbMlQwE+/is6hi0Xw8ktpL+6glmqZYtevJgaB8Y= github.com/containerd/zfs v0.0.0-20210315114300-dde8f0fda960/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY= github.com/containerd/zfs v0.0.0-20210324211415-d5c4544f0433/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY= github.com/containerd/zfs v1.0.0/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY= +github.com/containerd/zfs v1.1.0 h1:n7OZ7jZumLIqNJqXrEc/paBM840mORnmGdJDmAmJZHM= +github.com/containerd/zfs v1.1.0/go.mod h1:oZF9wBnrnQjpWLaPKEinrx3TQ9a+W/RJO7Zb41d8YLE= github.com/containernetworking/cni v0.7.1/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= github.com/containernetworking/cni v0.8.0/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= github.com/containernetworking/cni v0.8.1/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= +github.com/containernetworking/cni v1.1.1 h1:ky20T7c0MvKvbMOwS/FrlbNwjEoqJEUUYfsL4b0mc4k= github.com/containernetworking/cni v1.1.1/go.mod h1:sDpYKmGVENF3s6uvMvGgldDWeG8dMxakj/u+i9ht9vw= github.com/containernetworking/plugins v0.8.6/go.mod h1:qnw5mN19D8fIwkqW7oHHYDHVlzhJpcY6TQxn/fUyDDM= github.com/containernetworking/plugins v0.9.1/go.mod h1:xP/idU2ldlzN6m4p5LmGiwRDjeJr6FLK6vuiUwoH7P8= +github.com/containernetworking/plugins v1.1.1 h1:+AGfFigZ5TiQH00vhR8qPeSatj53eNGz0C1d3wVYlHE= github.com/containernetworking/plugins v1.1.1/go.mod h1:Sr5TH/eBsGLXK/h71HeLfX19sZPp3ry5uHSkI4LPxV8= github.com/containers/ocicrypt v1.0.1/go.mod h1:MeJDzk1RJHv89LjsH0Sp5KTY3ZYkjXO/C+bKAeWFIrc= github.com/containers/ocicrypt v1.1.0/go.mod h1:b8AOe0YR67uU8OqfVNcznfFpAzu3rdgUV4GP9qXPfu4= github.com/containers/ocicrypt v1.1.1/go.mod h1:Dm55fwWm1YZAjYRaJ94z2mfZikIyIN4B0oB3dj3jFxY= +github.com/containers/ocicrypt v1.1.3 h1:uMxn2wTb4nDR7GqG3rnZSfpJXqWURfzZ7nKydzIeKpA= github.com/containers/ocicrypt v1.1.3/go.mod h1:xpdkbVAuaH3WzbEabUd5yDsl9SwJA5pABH85425Es2g= +github.com/coreos/bbolt v1.3.2 h1:wZwiHHUieZCquLkDL0B8UhzreNWsPHooDAG3q34zk0s= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= +github.com/coreos/etcd v3.3.10+incompatible h1:jFneRYjIvLMLhDLCzuTuU4rSJUjRplcJQ7pD7MnhC04= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/go-etcd v2.0.0+incompatible h1:bXhRBIXoTm9BYHS3gE0TtQuyNZyeEMux2sDi4oo5YOo= github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= github.com/coreos/go-iptables v0.4.5/go.mod h1:/mVI274lEDI2ns62jHCDnCyBF9Iwsmekav8Dbxlm1MU= github.com/coreos/go-iptables v0.5.0/go.mod h1:/mVI274lEDI2ns62jHCDnCyBF9Iwsmekav8Dbxlm1MU= github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= +github.com/coreos/go-semver v0.2.0 h1:3Jm3tLmsgAYcjC+4Up7hJrFBPr+n7rAqYeSw/SZazuY= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-systemd v0.0.0-20161114122254-48702e0da86b/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= @@ -743,7 +992,9 @@ github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf/go.mod h1:F5haX7 github.com/coreos/go-systemd/v22 v22.0.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= +github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f h1:lBNOc5arjvs8E5mO2tbpBpLoyyu8B6e44T7hJy6potg= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= +github.com/cpuguy83/go-md2man v1.0.10 h1:BSKMNlYxDvnunlTymqtgONjNnaRV1sTpcovwwjF22jk= github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= github.com/crate-crypto/go-ipa v0.0.0-20220523130400-f11357ae11c7/go.mod h1:gFnFS95y8HstDP6P9pPwzrxOOC5TRDkwbM+ao15ChAI= github.com/crate-crypto/go-ipa v0.0.0-20230601170251-1830d0757c80/go.mod h1:gzbVz57IDJgQ9rLQwfSk696JGWof8ftznEL9GoAv3NI= @@ -752,7 +1003,9 @@ github.com/crate-crypto/go-kzg-4844 v0.3.0/go.mod h1:SBP7ikXEgDnUPONgm33HtuDZEDt github.com/crate-crypto/go-kzg-4844 v0.6.1-0.20231019121413-3621cc59f0c7/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= github.com/crate-crypto/go-kzg-4844 v0.7.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= +github.com/creack/pty v1.1.11 h1:07n33Z8lZxZ2qwegKbObQohDhXDQxiMMz1NOUGYlesw= github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/cyberdelia/templates v0.0.0-20141128023046-ca7fffd4298c h1:/ovYnF02fwL0kvspmy9AuyKg1JhdTRUgPw4nUxd9oZM= github.com/cyberdelia/templates v0.0.0-20141128023046-ca7fffd4298c/go.mod h1:GyV+0YP4qX0UQ7r2MoYZ+AvYDp12OF5yg4q8rGnyNh4= github.com/cyphar/filepath-securejoin v0.2.2/go.mod h1:FpkQEhXnPnOthhzymB7CGsFk2G9VLXONKD9G7QGMM+4= github.com/cyphar/filepath-securejoin v0.2.3/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= @@ -762,32 +1015,42 @@ github.com/d2g/dhcp4server v0.0.0-20181031114812-7d4a0a7f59a5/go.mod h1:Eo87+Kg/ github.com/d2g/hardwareaddr v0.0.0-20190221164911-e7d9fbe030e4/go.mod h1:bMl4RjIciD2oAxI7DmWRx6gbeqrkoLqv3MV0vzNad+I= github.com/dave/jennifer v1.2.0/go.mod h1:fIb+770HOpJ2fmN9EPPKOqm1vMGhB+TwXKMZhrIygKg= github.com/deckarep/golang-set v1.8.0 h1:sk9/l/KqpunDwP7pSjUg0keiOOLEnOBHzykLrsPppp4= +github.com/deckarep/golang-set v1.8.0/go.mod h1:5nI87KwE7wgsBU1F4GKAw2Qod7p5kyS383rP6+o6qqo= github.com/deckarep/golang-set/v2 v2.1.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.0-20210816181553-5444fa50b93d/go.mod h1:tmAIfUFEirG/Y8jhZ9M+h36obRZAk/1fcSpXwAVlfqE= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs= github.com/deepmap/oapi-codegen v1.6.0/go.mod h1:ryDa9AgbELGeB+YEXE1dR53yAjHwFvE9iAUlWl9Al3M= github.com/deepmap/oapi-codegen v1.8.2/go.mod h1:YLgSKSDv/bZQB7N4ws6luhozi3cEdRktEqrX88CvjIw= +github.com/deepmap/oapi-codegen v1.12.4 h1:pPmn6qI9MuOtCz82WY2Xaw46EQjgvxednXXrP7g5Q2s= github.com/deepmap/oapi-codegen v1.12.4/go.mod h1:3lgHGMu6myQ2vqbbTXH2H1o4eXFTGnFiDaOaKKl5yas= github.com/denverdino/aliyungo v0.0.0-20190125010748-a747050bb1ba/go.mod h1:dV8lFg6daOBZbT6/BDGIz6Y3WFGn8juu6G+CQ6LHtl0= github.com/dgraph-io/badger v1.6.0/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6psNgSztDR4= +github.com/dgraph-io/badger v1.6.2 h1:mNw0qs90GVgGGWylh0umH5iag1j6n/PeJtNvL6KY/x8= github.com/dgraph-io/badger v1.6.2/go.mod h1:JW2yswe3V058sS0kZ2h/AXeDSqFjxnZcRrVH//y2UQE= +github.com/dgraph-io/badger/v2 v2.2007.4 h1:TRWBQg8UrlUhaFdco01nO2uXwzKS7zd+HVdwV/GHc4o= github.com/dgraph-io/badger/v2 v2.2007.4/go.mod h1:vSw/ax2qojzbN6eXHIx6KPKtCSHJN/Uz0X0VPruTIhk= github.com/dgraph-io/ristretto v0.0.2/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= github.com/dgraph-io/ristretto v0.0.3-0.20200630154024-f66de99634de/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= github.com/dgraph-io/ristretto v0.0.4-0.20210318174700-74754f61e018 h1:cNcG4c2n5xanQzp2hMyxDxPYVQmZ91y4WN6fJFlndLo= github.com/dgraph-io/ristretto v0.0.4-0.20210318174700-74754f61e018/go.mod h1:MIonLggsKgZLUSt414ExgwNtlOL5MuEoAJP514mwGe8= github.com/dgrijalva/jwt-go v0.0.0-20170104182250-a601269ab70c/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/go-bitstream v0.0.0-20180413035011-3522498ce2c8/go.mod h1:VMaSuZ+SZcx/wljOQKvp5srsbCiKDEb6K2wC4+PiBmQ= github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2 h1:tdlZCpZ/P9DhczCTSixgIKmwPv6+wP5DGjqLYw5SUiA= github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= +github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954 h1:RMLoZVzv4GliuWafOuPuQDKSm1SJph7uCRnnS61JAn4= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= +github.com/djherbis/atime v1.1.0 h1:rgwVbP/5by8BvvjBNrbh64Qz33idKT3pSnMSJsxhi0g= github.com/djherbis/atime v1.1.0/go.mod h1:28OF6Y8s3NQWwacXc5eZTsEsiMzp7LF8MbXE+XJPdBE= github.com/dlclark/regexp2 v1.4.1-0.20201116162257-a2a8dda75c91/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= +github.com/dlclark/regexp2 v1.7.0 h1:7lJfhqlPssTb1WQx4yvTHN0uElPEv52sbaECrAQxjAo= github.com/dlclark/regexp2 v1.7.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E= github.com/dnaeon/go-vcr v1.1.0/go.mod h1:M7tiix8f0r6mKKJ3Yq/kqU1OYf3MnfmBWVbPx/yU9ko= +github.com/dnaeon/go-vcr v1.2.0 h1:zHCHvJYTMh1N7xnV7zf1m1GPBF9Ad0Jk/whtQ1663qI= github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= github.com/docker/cli v0.0.0-20191017083524-a8ff7f821017/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= github.com/docker/distribution v0.0.0-20190905152932-14b96e55d84c/go.mod h1:0+TTO4EOBfRPhZXAeF1Vu+W3hHZ8eLp8PgKVZlcvtFY= @@ -800,22 +1063,30 @@ github.com/docker/docker v20.10.17+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05 github.com/docker/docker v24.0.5+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/docker v24.0.7+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/docker v25.0.4+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v25.0.5+incompatible h1:UmQydMduGkrD5nQde1mecF/YnSbTOaPeFIeP5C4W+DE= github.com/docker/docker v25.0.5+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/docker-credential-helpers v0.6.3/go.mod h1:WRaJzqw3CTB9bk10avuGsjVBZsD05qeibJ1/TYlvc0Y= +github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= github.com/docker/go-events v0.0.0-20170721190031-9461782956ad/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA= +github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c h1:+pKlWGMw7gf6bQ+oDZB4KHQFypsfjYlq/C4rfL7D3g8= github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA= github.com/docker/go-metrics v0.0.0-20180209012529-399ea8c73916/go.mod h1:/u0gXw0Gay3ceNrsHubL3BtdOL2fHf93USgMTe0W5dI= +github.com/docker/go-metrics v0.0.1 h1:AgB/0SvBxihN0X8OR4SjsblXkbMvalQ8cjmtKQ2rQV8= github.com/docker/go-metrics v0.0.1/go.mod h1:cG1hvH2utMXtqgqqYE9plW6lDxS3/5ayHzueweSI3Vw= github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw= github.com/docker/libtrust v0.0.0-20150114040149-fa567046d9b1/go.mod h1:cyGadeNEkKy96OOhEzfZl+yxihPEzKnqJwvfuSUqbZE= github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= +github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815 h1:bWDMxwH3px2JBh6AyO7hdCn/PkvCZXii8TGj7sbtEbQ= +github.com/donovanhide/eventsource v0.0.0-20210830082556-c59027999da0 h1:C7t6eeMaEQVy6e8CarIhscYQlNmw5e3G36y7l7Y21Ao= github.com/donovanhide/eventsource v0.0.0-20210830082556-c59027999da0/go.mod h1:56wL82FO0bfMU5RvfXoIwSOP2ggqqxT+tAfNEIyxuHw= github.com/dop251/goja v0.0.0-20211022113120-dc8c55024d06/go.mod h1:R9ET47fwRVRPZnOGvHxxhuZcbrMCuiqOz3Rlrh4KSnk= github.com/dop251/goja v0.0.0-20230122112309-96b1610dd4f7/go.mod h1:yRkwfj0CBpOGre+TwBsqPV0IH0Pk73e4PXJOeNDboGs= github.com/dop251/goja v0.0.0-20230605162241-28ee0ee714f3/go.mod h1:QMWlm50DNe14hD7t24KEqZuUdC9sOTy8W6XbCU1mlw4= +github.com/dop251/goja v0.0.0-20230806174421-c933cf95e127 h1:qwcF+vdFrvPSEUDSX5RVoRccG8a5DhOdWdQ4zN62zzo= github.com/dop251/goja v0.0.0-20230806174421-c933cf95e127/go.mod h1:QMWlm50DNe14hD7t24KEqZuUdC9sOTy8W6XbCU1mlw4= github.com/dop251/goja_nodejs v0.0.0-20210225215109-d91c329300e7/go.mod h1:hn7BA7c8pLvoGndExHudxTDKZ84Pyvv+90pbBjbTz0Y= +github.com/dop251/goja_nodejs v0.0.0-20211022123610-8dd9abb0616d h1:W1n4DvpzZGOISgp7wWNtraLcHtnmnTwBlJidqtMIuwQ= github.com/dop251/goja_nodejs v0.0.0-20211022123610-8dd9abb0616d/go.mod h1:DngW8aVqWbuLRMHItjPUyqdj+HWPvnQe8V8y1nDpIbM= github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= @@ -826,10 +1097,18 @@ github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1 github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= github.com/eclipse/paho.mqtt.golang v1.2.0/go.mod h1:H9keYFcgq3Qr5OUJm/JZI/i6U7joQ8SYLhZwfeOo6Ts= github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= +github.com/edsrzf/mmap-go v1.1.0 h1:6EUwBLQ/Mcr1EYLE4Tn1VdW1A4ckqCQWZBw8Hr0kjpQ= github.com/edsrzf/mmap-go v1.1.0/go.mod h1:19H/e8pUPLicwkyNgOykDXkJ9F0MHE+Z52B8EIth78Q= +github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385 h1:clC1lXBpe2kTj2VHdaIu9ajZQe4kcEY9j0NsnDDBZ3o= github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385/go.mod h1:0vRUJqYpeSZifjYj7uP3BG/gKcuzL9xWVV/Y+cK33KM= +github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153 h1:yUdfgN0XgIJw7foRItutHYUIhlcKzcSf5vDpdhQAKTc= +github.com/emicklei/dot v0.11.0 h1:Ase39UD9T9fRBOb5ptgpixrxfx8abVzNWZi2+lr53PI= github.com/emicklei/dot v0.11.0/go.mod h1:DeV7GvQtIw4h2u73RKBkkFdvVAz0D9fzeJrgPW6gy/s= github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= +github.com/emicklei/go-restful v2.16.0+incompatible h1:rgqiKNjTnFQA6kkhFe16D8epTksy9HQ1MyrbDXSdYhM= +github.com/emicklei/go-restful v2.16.0+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= +github.com/emicklei/go-restful/v3 v3.10.1 h1:rc42Y5YTp7Am7CS630D7JmhRjq4UlEUuEKfrDac4bSQ= +github.com/emicklei/go-restful/v3 v3.10.1/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= @@ -842,11 +1121,14 @@ github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go. github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= github.com/envoyproxy/go-control-plane v0.10.3/go.mod h1:fJJn/j26vwOu972OllsvAgJJM//w9BV6Fxbg2LuVd34= github.com/envoyproxy/go-control-plane v0.11.1-0.20230524094728-9239064ad72f/go.mod h1:sfYdkwUW4BA3PbKjySwjJy+O4Pu0h62rlqCMHNk+K+Q= +github.com/envoyproxy/go-control-plane v0.11.1 h1:wSUXTlLfiAQRWs2F+p+EKOY9rUyis1MyGqJ2DIk5HpM= github.com/envoyproxy/go-control-plane v0.11.1/go.mod h1:uhMcXKCQMEJHiAb0w+YGefQLaTEw+YhGluxZkrTmD0g= github.com/envoyproxy/protoc-gen-validate v0.6.7/go.mod h1:dyJXwwfPK2VSqiB9Klm1J6romD608Ba7Hij42vrOBCo= github.com/envoyproxy/protoc-gen-validate v0.9.1/go.mod h1:OKNgG7TCp5pF4d6XftA0++PMirau2/yoOwVac3AbF2w= github.com/envoyproxy/protoc-gen-validate v0.10.1/go.mod h1:DRjgyB0I43LtJapqN6NiRwroiAU2PaFuvk/vjgh61ss= +github.com/envoyproxy/protoc-gen-validate v1.0.2 h1:QkIBuU5k+x7/QXPvPPnWXWlCdaBFApVqftFV6k087DA= github.com/envoyproxy/protoc-gen-validate v1.0.2/go.mod h1:GpiZQP3dDbg4JouG/NNS7QWXpgx6x8QiMKdmN72jogE= +github.com/etcd-io/bbolt v1.3.3 h1:gSJmxrs37LgTqR/oyJBWok6k6SvXEUerFTbltIhXkBM= github.com/etcd-io/bbolt v1.3.3/go.mod h1:ZF2nL25h33cCyBtcyWeZ2/I3HQOfTP+0PIEvHjkjCrw= github.com/ethereum/c-kzg-4844 v0.3.0/go.mod h1:WI2Nd82DMZAAZI1wV2neKGost9EKjvbpQR9OqE5Qqa8= github.com/ethereum/c-kzg-4844 v0.3.1/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= @@ -857,25 +1139,37 @@ github.com/ethereum/go-ethereum v1.13.1/go.mod h1:xHQKzwkHSl0gnSjZK1mWa06XEdm968 github.com/ethereum/go-ethereum v1.13.5-0.20231127143928-5b57727d6de2/go.mod h1:iogCB+O7R3eFmlyiEKRDqjmJbSgOsDHTjxE0PU6CYC8= github.com/ethereum/hive v0.0.0-20230401205547-71595beab31d/go.mod h1:zKL2DscVzRusnGVpseAvLrXGJ3qrGHuSfOIrv4JfnRk= github.com/ethereum/hive v0.0.0-20240319152821-ae224371b4e5/go.mod h1:MGwUXPGco6YS3brOf5WEILfUnnUL/XuX1224ab3D7XA= +github.com/ethereum/hive v0.0.0-20240610172825-2430a68c753a/go.mod h1:ghNXZW+/WQClcyiwZpbTzUCyxwql7YeMacYd44v+BJE= github.com/ethereum/hive/hiveproxy v0.0.0-20230313101845-c7dfe88c8138 h1:Y74Ksk90DLCMWnpOfOEWRLxVjsf/67vY+hX5kWu9UY0= github.com/ethereum/hive/hiveproxy v0.0.0-20230313101845-c7dfe88c8138/go.mod h1:1LWNU6/EYsIOXZGa2KdklD1ET77gLTeEyhq+WTZ+37o= github.com/ethereum/hive/hiveproxy v0.0.0-20230919105823-37cbbe1ef86d/go.mod h1:0tWUtPhJgk9z3K41wqHV0IYY6/jJWOlfo4rI4v3Mr1E= +github.com/ethereum/hive/hiveproxy v0.0.0-20240610172618-786a798a0cfe h1:GOjkt54Ha+wbJETjhGYUuxbW18MDj1NwsE3BsTu07SI= github.com/ethereum/hive/hiveproxy v0.0.0-20240610172618-786a798a0cfe/go.mod h1:H5dh/7x2Mf5SR7cKLXDZLWRMtolNhvb3uKR1Gy3aF60= github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= +github.com/evanphx/json-patch v4.11.0+incompatible h1:glyUF9yIYtMHzn8xaKw5rMhdWcwsYV8dZHIq5567/xs= github.com/evanw/esbuild v0.17.6/go.mod h1:iINY06rn799hi48UqEnaQvVfZWe6W9bET78LbvN8VWk= +github.com/evanw/esbuild v0.18.11 h1:Mb0qb9KyJQraob0Y7LA0DOdD8ijJs2TxhqgqrDeGq4w= github.com/evanw/esbuild v0.18.11/go.mod h1:iINY06rn799hi48UqEnaQvVfZWe6W9bET78LbvN8VWk= +github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072 h1:DddqAaWDpywytcG8w/qoQ5sAN8X12d3Z3koB0C3Rxsc= github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072/go.mod h1:duJ4Jxv5lDcvg4QuQr0oowTf7dz4/CR8NtyCooz9HL8= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= +github.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM= github.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE= +github.com/fatih/structs v1.1.0 h1:Q7juDM0QtcnhCpeyLGQKyg4TOIghuNXrkL32pHAUMxo= github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= github.com/ferranbt/fastssz v0.0.0-20210120143747-11b9eff30ea9/go.mod h1:DyEu2iuLBnb/T51BlsiO3yLYdJC6UbGMrIkqK1KmQxM= github.com/fjl/gencodec v0.0.0-20220412091415-8bb9e558978c/go.mod h1:AzA8Lj6YtixmJWL+wkKoBGsLWy9gFrAzi4g+5bCKwpY= +github.com/fjl/gencodec v0.0.0-20230517082657-f9840df7b83e h1:bBLctRc7kr01YGvaDfgLbTwjFNW5jdp5y5rj8XXBHfY= github.com/fjl/gencodec v0.0.0-20230517082657-f9840df7b83e/go.mod h1:AzA8Lj6YtixmJWL+wkKoBGsLWy9gFrAzi4g+5bCKwpY= github.com/fjl/memsize v0.0.1/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= github.com/flosch/pongo2 v0.0.0-20190707114632-bbf5a6c351f4/go.mod h1:T9YF2M40nIgbVgp3rreNmTged+9HrbNTIQf1PsaIiTA= +github.com/flosch/pongo2/v4 v4.0.2 h1:gv+5Pe3vaSVmiJvh/BZa82b7/00YUGm0PIyVVLop0Hw= github.com/flosch/pongo2/v4 v4.0.2/go.mod h1:B5ObFANs/36VwxxlgKpdchIJHMvHB562PW+BWPhwZD8= +github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568 h1:BHsljHzVlRcyQhjrss6TZTdY2VfCqZPbv5k3iBFa2ZQ= github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= +github.com/fogleman/gg v1.3.0 h1:/7zJX8F6AaYQc57WQCyN9cAIz+4bCJGO9B+dyW29am8= github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= +github.com/form3tech-oss/jwt-go v3.2.3+incompatible h1:7ZaBxOI7TMoYBfyA3cQHErNNyAWIKUMIwqxEtgHOs5c= github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= @@ -885,25 +1179,32 @@ github.com/fsnotify/fsnotify v1.4.3-0.20170329110642-4da3e2cfbabc/go.mod h1:jwhs github.com/fsouza/go-dockerclient v1.8.1 h1:a27vHYqNSZz88nUAurI1o6W5PgEt63nAWilOI+j63RE= github.com/fsouza/go-dockerclient v1.8.1/go.mod h1:zmA2ogSxRnXmbZcy0Aq7yhRoCdP/bDns/qghCK9SWtM= github.com/fsouza/go-dockerclient v1.9.8/go.mod h1:74lNReDQxrOaogajs51IvZgkDME4qe9yPJAUEUTJtHw= +github.com/fsouza/go-dockerclient v1.11.0 h1:4ZAk6W7rPAtPXm7198EFqA5S68rwnNQORxlOA5OurCA= github.com/fsouza/go-dockerclient v1.11.0/go.mod h1:0I3TQCRseuPTzqlY4Y3ajfsg2VAdMQoazrkxJTiJg8s= github.com/fullsailor/pkcs7 v0.0.0-20190404230743-d7302db945fa/go.mod h1:KnogPXtdwXqoenmZCw6S+25EAm2MkxbG0deNDu4cbSA= +github.com/garslo/gogen v0.0.0-20170306192744-1d203ffc1f61 h1:IZqZOB2fydHte3kUgxrzK5E1fW7RQGeDwE8F/ZZnUYc= github.com/garslo/gogen v0.0.0-20170306192744-1d203ffc1f61/go.mod h1:Q0X6pkwTILDlzrGEckF6HKjXe48EgsY/l7K7vhY4MW8= github.com/garyburd/redigo v0.0.0-20150301180006-535138d7bcd7/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY= github.com/garyburd/redigo v1.1.1-0.20170914051019-70e1b1943d4f/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY= github.com/garyburd/redigo v1.6.0/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY= +github.com/gavv/httpexpect v2.0.0+incompatible h1:1X9kcRshkSKEjNJJxX9Y9mQ5BRfbxU5kORdjhlA1yX8= github.com/gavv/httpexpect v2.0.0+incompatible/go.mod h1:x+9tiU1YnrOvnB725RkpoLv1M62hOWzwo5OXotisrKc= github.com/gballet/go-verkle v0.0.0-20220902153445-097bd83b7732/go.mod h1:o/XfIXWi4/GqbQirfRm5uTbXMG5NpqxkxblnbZ+QM9I= github.com/gballet/go-verkle v0.0.0-20230607174250-df487255f46b/go.mod h1:CDncRYVRSDqwakm282WEkjfaAj1hxU/v5RXxk5nXOiI= +github.com/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46 h1:BAIP2GihuqhwdILrV+7GJel5lyPV3u1+PgzrWLc0TkE= github.com/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46/go.mod h1:QNpY22eby74jVhqH4WhDLDwxc/vqsern6pW+u2kbkpc= github.com/gdamore/encoding v1.0.0/go.mod h1:alR0ol34c49FCSBLjhosxzcPHQbf2trDkoo5dl+VrEg= github.com/gdamore/tcell/v2 v2.4.1-0.20210905002822-f057f0a857a1/go.mod h1:Az6Jt+M5idSED2YPGtwnfJV0kXohgdCBPmHGSYc1r04= github.com/gdamore/tcell/v2 v2.5.3/go.mod h1:wSkrPaXoiIWZqW/g7Px4xc79di6FTcpB8tvaKJ6uGBo= github.com/getkin/kin-openapi v0.53.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW6yheSwk8Yi4= github.com/getkin/kin-openapi v0.61.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW6yheSwk8Yi4= +github.com/getkin/kin-openapi v0.107.0 h1:bxhL6QArW7BXQj8NjXfIJQy680NsMKd25nwhvpCXchg= github.com/getkin/kin-openapi v0.107.0/go.mod h1:9Dhr+FasATJZjS4iOLvB0hkaxgYdulrNYm2e9epLWOo= github.com/getsentry/sentry-go v0.12.0/go.mod h1:NSap0JBYWzHND8oMbyi0+XZhUalc1TBdRL1M71JZW2c= +github.com/ghemawat/stream v0.0.0-20171120220530-696b145b53b9 h1:r5GgOLGbza2wVHRzK7aAj6lWZjfbAwiu/RDCVOKjRyM= github.com/ghemawat/stream v0.0.0-20171120220530-696b145b53b9/go.mod h1:106OIgooyS7OzLDOpUGgm9fA3bQENb/cFSyyBmMoJDs= github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3/go.mod h1:VJ0WA2NBN22VlZ2dKZQPAPnyWw5XTlK1KymzLKsr59s= github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= @@ -911,50 +1212,70 @@ github.com/gin-gonic/gin v1.4.0/go.mod h1:OW2EZn3DO8Ln9oIKOvM++LBO+5UPHJJDH72/q/ github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M= github.com/gin-gonic/gin v1.8.1 h1:4+fr/el88TOO3ewCmQr8cx/CtZ/umlIRIs5M4NTNjf8= github.com/gin-gonic/gin v1.8.1/go.mod h1:ji8BvRH1azfM+SYow9zQ6SZMvR8qOMZHmsCuWR9tTTk= +github.com/gliderlabs/ssh v0.1.1 h1:j3L6gSLQalDETeEg/Jg0mGY0/y/N6zI2xX1978P0Uqw= github.com/glycerine/go-unsnap-stream v0.0.0-20180323001048-9f0cb55181dd/go.mod h1:/20jfyN9Y5QPEAprSgKAUr+glWDY39ZiUEAYOEv5dsE= github.com/glycerine/goconvey v0.0.0-20190410193231-58a59202ab31/go.mod h1:Ogl1Tioa0aV7gstGFO7KhffUsb9M4ydbEbbxpcEDc24= +github.com/go-check/check v0.0.0-20180628173108-788fd7840127 h1:0gkP6mzaMqkmpcJYCFOLkIBwI7xFExG03bbkOkCvUPI= github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= github.com/go-chi/chi/v5 v5.0.0/go.mod h1:BBug9lr0cqtdAhsu6R4AAdvufI0/XBzAQSsUqJpoZOs= +github.com/go-chi/chi/v5 v5.0.7 h1:rDTPXLDHGATaeHvVlLcR4Qe0zftYethFucbjVQ1PxU8= github.com/go-chi/chi/v5 v5.0.7/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= +github.com/go-fonts/dejavu v0.1.0 h1:JSajPXURYqpr+Cu8U9bt8K+XcACIHWqWrvWCKyeFmVQ= github.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g= +github.com/go-fonts/latin-modern v0.2.0 h1:5/Tv1Ek/QCr20C6ZOz15vw3g7GELYL98KWr8Hgo+3vk= github.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks= github.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= +github.com/go-fonts/liberation v0.2.0 h1:jAkAWJP4S+OsrPLZM4/eC9iW7CtHy+HBXrEwZXWo5VM= github.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= +github.com/go-fonts/stix v0.1.0 h1:UlZlgrvvmT/58o573ot7NFw0vZasZ5I6bcIft/oMdgg= github.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY= +github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1 h1:QbL/5oDUmRBzO9/Z7Seo6zf912W/a6Sr4Eu0G/3Jho0= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4 h1:WtGNWLvXpe6ZudgnXrq0barxBImvnnJoMEhXAzcbM0I= github.com/go-ini/ini v1.25.4/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/kit v0.9.0 h1:wDJmvq38kDhkVxi50ni9ykkdUr1PKgqKOoi01fa0Mdk= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o= github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= github.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= +github.com/go-kit/log v0.2.1 h1:MRVx0/zhvdseW+Gza6N9rVzU/IVzaeE1SFI4raAhmBU= github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= github.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U= +github.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81 h1:6zl3BbBhdnMkpSj2YY30qV3gDcVBGtFgVsV3+/i+mKQ= github.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= +github.com/go-logfmt/logfmt v0.5.1 h1:otpy5pqBCBZ1ng9RQ0dPu4PN7ba75Y/aA+UpowDyNVA= github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab h1:xveKWz2iaueeTaUgdetzel+U7exyigDYBryyVfV/rZk= github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab/go.mod h1:/P9AEU963A2AYjv4d1V5eVL1CQbEJq6aCNHDDjibzu8= github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8= github.com/go-ole/go-ole v1.2.5/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0= github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= +github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY= github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9/go.mod h1:W3Z9FmVs9qj+KR4zFKmDPGiLdk1D9Rlm7cyMvf57TTg= github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= +github.com/go-openapi/jsonreference v0.19.3 h1:5cxNfTy0UVC3X8JL5ymxzyoUZmo8iZb+jeTWn7tUa8o= github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501/go.mod h1:J8+jY1nAiCcj+friV/PDoE1/3eeccG9LYBs0tYvLOWc= github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87/go.mod h1:DXUve3Dpr1UfpPtxFw+EFuQ41HhCWZfha5jSVRG7C7I= github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= +github.com/go-openapi/swag v0.21.1 h1:wm0rhTb5z7qpJRHBdPOMuY4QjVUMbF6/kwoYeRAOrKU= github.com/go-openapi/swag v0.21.1/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= +github.com/go-pdf/fpdf v0.5.0 h1:GHpcYsiDV2hdo77VTOuTF9k1sN8F8IY7NjnCo9x+NPY= github.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M= github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= +github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= github.com/go-playground/locales v0.14.0/go.mod h1:sawfccIbzZTqEDETgFXqTho0QybSa7l++s0DH+LDiLs= @@ -968,9 +1289,12 @@ github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GO github.com/go-playground/validator/v10 v10.11.1/go.mod h1:i+3WkQ1FvaUjjxh1kSvIA4dMGDBiPU55YFDl0WbKdWU= github.com/go-playground/validator/v10 v10.13.0 h1:cFRQdfaSMCOSfGCCLB20MHvuoHb/s5G8L5pu2ppK5AQ= github.com/go-playground/validator/v10 v10.13.0/go.mod h1:dwu7+CG8/CtBiJFZDz4e+5Upb6OLw04gtBYw0mcG/z4= +github.com/go-redis/redis/v8 v8.11.5 h1:AcZZR7igkdvfVmQTPnu9WE37LRrO/YrBH5zWyjDC0oI= github.com/go-redis/redis/v8 v8.11.5/go.mod h1:gREzHqY1hg6oD9ngVRbLStwAWKhA0FEgq8Jd4h5lpwo= +github.com/go-sourcemap/sourcemap v2.1.3+incompatible h1:W1iEw64niKVGogNgBN3ePyLFfuisuzeidWPMPWmECqU= github.com/go-sourcemap/sourcemap v2.1.3+incompatible/go.mod h1:F8jJfvm2KbVjc5NqelyYJmf/v5J0dwNLS2mL4sNA1Jg= github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= +github.com/go-sql-driver/mysql v1.4.1 h1:g24URVg0OFbNUTx9qqY1IRZ9D9z3iPyi5zKhQZpNwpA= github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-stack/stack v1.6.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= @@ -988,6 +1312,7 @@ github.com/gobwas/ws v1.2.1 h1:F2aeBZrm2NDsc7vbovKrWSogd4wvfAxg0FQ89/iqOTk= github.com/gobwas/ws v1.2.1/go.mod h1:hRKAFb8wOxFROYNsT1bqfWnhX+b5MFeJM9r2ZSwg/KY= github.com/goccy/go-json v0.9.7/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= github.com/goccy/go-json v0.9.11/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= github.com/godbus/dbus v0.0.0-20151105175453-c7fdd8b5cd55/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= github.com/godbus/dbus v0.0.0-20180201030542-885f9cc04c9c/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= @@ -998,29 +1323,36 @@ github.com/gogo/googleapis v0.0.0-20180223154316-0cd9801be74a/go.mod h1:gf4bu3Q8 github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= github.com/gogo/googleapis v1.2.0/go.mod h1:Njal3psf3qN6dwBtQfUmBZh2ybovJ0tlu3o/AC7HYjU= github.com/gogo/googleapis v1.4.0/go.mod h1:5YRNX2z1oM5gXdAkurHa942MDgEJyk02w4OecKY87+c= +github.com/gogo/googleapis v1.4.1 h1:1Yx4Myt7BxzvUr5ldGSbwYiZG6t9wGBZ+8/fX3Wvtq0= github.com/gogo/googleapis v1.4.1/go.mod h1:2lpHqI5OcWCtVElxXnPt+s8oJvMpySlOyM6xDCrzib4= github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.0/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= +github.com/gogo/status v1.1.0 h1:+eIkrewn5q6b30y+g/BJINVVdi2xH7je5MPJ3ZPK3JA= github.com/gogo/status v1.1.0/go.mod h1:BFv9nrluPLmrS0EmGVvLaPNmRosr9KapBYd5/hpY1WM= github.com/golang-jwt/jwt v3.2.1+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY= github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= github.com/golang-jwt/jwt/v4 v4.2.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= github.com/golang-jwt/jwt/v4 v4.4.3/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= +github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= +github.com/golang/gddo v0.0.0-20200528160355-8d077c1d8f4c h1:HoqgYR60VYu5+0BuG6pjeGp7LKEPZnHt+dUClx9PeIs= github.com/golang/gddo v0.0.0-20200528160355-8d077c1d8f4c/go.mod h1:sam69Hju0uq+5uvLJUMDlsKlQ21Vrs1Kd/1YFPNYdOU= github.com/golang/geo v0.0.0-20190916061304-5b978397cfec/go.mod h1:QZ0nwyI2jOfgRAoBvP+ab5aRr7c9x7lhGEJrKvBwjWI= github.com/golang/glog v1.0.0 h1:nfP3RFugxnNRyKgeWd4oI1nYvXpxrx8ck8ZrcizshdQ= github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= +github.com/golang/glog v1.1.0 h1:/d3pCKDPWNnvIWe0vVUpNP32qc8U3PDVxySP/y360qE= github.com/golang/glog v1.1.0/go.mod h1:pfYeQZ3JWZoXTV5sFc986z3HTpwQs9At6P4ImfuP3NQ= github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/lint v0.0.0-20170918230701-e5d664eb928e/go.mod h1:tluoj9z5200jBnyusfRPU2LqT6J+DAorxEvtC7LHB+E= +github.com/golang/lint v0.0.0-20180702182130-06c8688daad7 h1:2hRPrmiwPrp3fQX967rNJIhQPtiGXdlQWAxKbKw3VHA= github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= +github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= @@ -1029,14 +1361,23 @@ github.com/golang/snappy v0.0.0-20170215233205-553a64147049/go.mod h1:/XxbfmMg8l github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golangci/lint-1 v0.0.0-20181222135242-d2cdd8c08219 h1:utua3L2IbQJmauC5IXdEA547bcoU5dozgQAfc8Onsg4= github.com/golangci/lint-1 v0.0.0-20181222135242-d2cdd8c08219/go.mod h1:/X8TswGSh1pIozq4ZwCfxS0WA5JGXguxk94ar/4c87Y= +github.com/gomodule/redigo v1.7.1-0.20190724094224-574c33c3df38 h1:y0Wmhvml7cGnzPa9nocn/fMraMH/lMDdeG+rkx4VgYY= github.com/gomodule/redigo v1.7.1-0.20190724094224-574c33c3df38/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4= +github.com/gonum/blas v0.0.0-20181208220705-f22b278b28ac h1:Q0Jsdxl5jbxouNs1TQYt0gxesYMU4VXRbsTlgDloZ50= github.com/gonum/blas v0.0.0-20181208220705-f22b278b28ac/go.mod h1:P32wAyui1PQ58Oce/KYkOqQv8cVw1zAapXOl+dRFGbc= +github.com/gonum/floats v0.0.0-20181209220543-c233463c7e82 h1:EvokxLQsaaQjcWVWSV38221VAK7qc2zhaO17bKys/18= github.com/gonum/floats v0.0.0-20181209220543-c233463c7e82/go.mod h1:PxC8OnwL11+aosOB5+iEPoV3picfs8tUpkVd0pDo+Kg= +github.com/gonum/internal v0.0.0-20181124074243-f884aa714029 h1:8jtTdc+Nfj9AR+0soOeia9UZSvYBvETVHZrugUowJ7M= github.com/gonum/internal v0.0.0-20181124074243-f884aa714029/go.mod h1:Pu4dmpkhSyOzRwuXkOgAvijx4o+4YMUJJo9OvPYMkks= +github.com/gonum/lapack v0.0.0-20181123203213-e4cdc5a0bff9 h1:7qnwS9+oeSiOIsiUMajT+0R7HR6hw5NegnKPmn/94oI= github.com/gonum/lapack v0.0.0-20181123203213-e4cdc5a0bff9/go.mod h1:XA3DeT6rxh2EAE789SSiSJNqxPaC0aE9J8NTOI0Jo/A= +github.com/gonum/matrix v0.0.0-20181209220409-c518dec07be9 h1:V2IgdyerlBa/MxaEFRbV5juy/C3MGdj4ePi+g6ePIp4= github.com/gonum/matrix v0.0.0-20181209220409-c518dec07be9/go.mod h1:0EXg4mc1CNP0HCqCz+K4ts155PXIlUywf0wqN+GfPZw= +github.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4= github.com/google/flatbuffers v1.11.0/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= +github.com/google/flatbuffers v2.0.8+incompatible h1:ivUb1cGomAB101ZM1T0nOiWz9pSrTMoa9+EiY7igmkM= github.com/google/flatbuffers v2.0.8+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= github.com/google/go-cmp v0.1.1-0.20171103154506-982329095285/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= @@ -1049,11 +1390,15 @@ github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8 github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-containerregistry v0.5.1/go.mod h1:Ct15B4yir3PLOP5jsy0GNeYVaIZs/MK/Jz5any1wFW0= +github.com/google/go-github v17.0.0+incompatible h1:N0LgJ1j65A7kfXrZnUDaYCs/Sf4rEjNlfyDHW9dolSY= +github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8= github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= github.com/google/gofuzz v1.1.1-0.20200604201612-c04b05f3adfa/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPgecwXBIDzw5no= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= +github.com/google/martian/v3 v3.3.2 h1:IqNFLAmvJOgVlpdEBiQbDc2EwKW77amAycfTuWKdfvw= github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= @@ -1068,9 +1413,13 @@ github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLe github.com/google/pprof v0.0.0-20230207041349-798e818bf904/go.mod h1:uglQLonpP8qtYCYyzA+8c/9qtqgA3qsXGYqCPKARAFg= github.com/google/pprof v0.0.0-20230821062121-407c9e7a662f/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik= github.com/google/pprof v0.0.0-20231023181126-ff6d637d2a7b/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik= +github.com/google/renameio v0.1.0 h1:GOZbcHa3HfsPKPlmyPyN2KEohoMXOhdMbHrvbpl2QaA= github.com/google/s2a-go v0.1.0/go.mod h1:OJpEgntRZo8ugHpF9hkoLJbS5dSI20XZeXJ9JVywLlM= +github.com/google/s2a-go v0.1.4 h1:1kZ/sQM3srePvKs3tXAvQzo66XfcReoqFpIpIccE7Oc= github.com/google/s2a-go v0.1.4/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A= +github.com/google/safehtml v0.0.2 h1:ZOt2VXg4x24bW0m2jtzAOkhoXV0iM8vNKc0paByCZqM= github.com/google/safehtml v0.0.2/go.mod h1:L4KWwDsUJdECRAEpZoBn3O64bQaywRscowZjJAzjHnU= +github.com/google/subcommands v1.2.0 h1:vWQspBTo2nEqTUFita5/KeEWlUL8kQObDFbub/EN9oE= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -1079,8 +1428,10 @@ github.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99 github.com/googleapis/enterprise-certificate-proxy v0.1.0/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= github.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg= github.com/googleapis/enterprise-certificate-proxy v0.2.1/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= +github.com/googleapis/enterprise-certificate-proxy v0.2.3 h1:yk9/cqRKtT9wXZSsRH9aurXEpJX+U6FLtpYTdC3R06k= github.com/googleapis/enterprise-certificate-proxy v0.2.3/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= github.com/googleapis/gax-go v0.0.0-20161107002406-da06d194a00e/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY= +github.com/googleapis/gax-go v2.0.0+incompatible h1:j0GKcs05QVmm7yesiZq2+9cxHkNK9YM6zKx4D2qucQU= github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= @@ -1091,30 +1442,40 @@ github.com/googleapis/gax-go/v2 v2.6.0/go.mod h1:1mjbznJAPHFpesgE5ucqfYEscaz5kMd github.com/googleapis/gax-go/v2 v2.7.0/go.mod h1:TEop28CZZQ2y+c0VxMUmu1lV+fQx57QpBWsYpwqHJx8= github.com/googleapis/gax-go/v2 v2.8.0/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI= github.com/googleapis/gax-go/v2 v2.10.0/go.mod h1:4UOEnMCrxsSqQ940WnTiD6qJ63le2ev3xfyagutxiPw= +github.com/googleapis/gax-go/v2 v2.11.0 h1:9V9PWXEsWnPpQhu/PeQIkS4eGzMlTLGgt80cUUI8Ki4= github.com/googleapis/gax-go/v2 v2.11.0/go.mod h1:DxmR61SGKkGLa2xigwuZIQpkCI2S5iydzRfb3peWZJI= github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= +github.com/googleapis/gnostic v0.5.5 h1:9fHAtK0uDfpveeqqo1hkEZJcFvYXAiCN3UutL8F9xHw= github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= +github.com/gorilla/css v1.0.0 h1:BQqNyPTi50JCFMTw/b67hByjMVXZRwGha6wxVGkeihY= github.com/gorilla/css v1.0.0/go.mod h1:Dn721qIggHpt4+EFCcTLTU/vk5ySda2ReITrtgBl60c= github.com/gorilla/handlers v0.0.0-20150720190736-60c7bfde3e33/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.7.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= +github.com/gorilla/securecookie v1.1.1 h1:miw7JPhV+b/lAHSXz4qd/nN9jRiAFV5FwjeKyCS8BvQ= github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/gostaticanalysis/comment v1.4.2 h1:hlnx5+S2fY9Zo9ePo4AhgYsYHbM2+eAv8m/s1JiCd6Q= github.com/gostaticanalysis/comment v1.4.2/go.mod h1:KLUTGDv6HOCotCH8h2erHKmpci2ZoR8VPu34YA2uzdM= github.com/gostaticanalysis/testutil v0.3.1-0.20210208050101-bfb5c8eec0e4/go.mod h1:D+FIZ+7OahH3ePw/izIEeH5I06eKs1IKI4Xr64/Am3M= github.com/graph-gophers/graphql-go v1.3.0/go.mod h1:9CQHMSxwO4MprSdzoIEobiHpoLtHm77vfxsvsIN5Vuc= +github.com/graph-gophers/graphql-go v1.4.0 h1:JE9wveRTSXwJyjdRd6bOQ7Ob5bewTUQ58Jv4OiVdpdE= github.com/graph-gophers/graphql-go v1.4.0/go.mod h1:YtmJZDLbF1YYNrlNAuiO5zAStUWc3XZT07iGsVqe1Os= github.com/gregjones/httpcache v0.0.0-20170920190843-316c5e0ff04e/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= +github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7 h1:pdN6V1QBWetyv/0+wjACpqVH+eVULgEjkurDLq3goeM= github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-middleware v1.2.2/go.mod h1:EaizFBKfUKtMIF5iaDEhniwNedqGo9FuLFzppDr3uwI= +github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 h1:+9834+KizmvFV7pXQGSXQTsaWhq2GjuNUt0aUU0YBYw= github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= +github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= @@ -1123,21 +1484,27 @@ github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFb github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0/go.mod h1:hgWBS7lorOAVIJEQMi4ZsPv9hVvWI6+ch50m39Pf2Ks= github.com/grpc-ecosystem/grpc-gateway/v2 v2.11.3 h1:lLT7ZLSzGLI08vc9cpd+tYmNWjdKDqyr/2L+f6U12Fk= github.com/grpc-ecosystem/grpc-gateway/v2 v2.11.3/go.mod h1:o//XUCC/F+yRGJoPO/VU0GSB0f8Nhgmxx0VIRUvaC0w= +github.com/guptarohit/asciigraph v0.5.5 h1:ccFnUF8xYIOUPPY3tmdvRyHqmn1MYI9iv1pLKX+/ZkQ= github.com/guptarohit/asciigraph v0.5.5/go.mod h1:dYl5wwK4gNsnFf9Zp+l06rFiDZ5YtXM6x7SRWZ3KGag= github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= github.com/hashicorp/errwrap v0.0.0-20141028054710-7554cd9344ce/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= github.com/hashicorp/go-hclog v0.9.2/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= +github.com/hashicorp/go-hclog v1.2.0 h1:La19f8d7WIlm4ogzNHB0JGqs5AUDAZ2UfCY4sJXcJdM= github.com/hashicorp/go-hclog v1.2.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= github.com/hashicorp/go-multierror v0.0.0-20161216184304-ed905158d874/go.mod h1:JMRHfdO9jKNzS/+BTlxCjKNQHg/jZAft8U7LloJvN7I= github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= +github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= +github.com/hashicorp/go-retryablehttp v0.7.4 h1:ZQgVdpTdAL7WpMIwLzCfbalOcSUdkDZnpUv3/+BxzFA= github.com/hashicorp/go-retryablehttp v0.7.4/go.mod h1:Jy/gPYAdjqffZ/yFGCFV2doI5wjtH1ewM9u8iYVjtX8= github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= @@ -1145,131 +1512,186 @@ github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdv github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-version v1.2.0 h1:3vNe/fWF5CBgRIguda1meWhsZHy3m8gCJ5wx+dIzX/E= github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= +github.com/hashicorp/golang-lru/arc/v2 v2.0.5 h1:l2zaLDubNhW4XO3LnliVj0GXO3+/CGNJAg1dcN2Fpfw= github.com/hashicorp/golang-lru/arc/v2 v2.0.5/go.mod h1:ny6zBSQZi2JxIeYcv7kt2sH2PXJtirBN7RDhRpxPkxU= github.com/hashicorp/hcl v0.0.0-20170914154624-68e816d1c783/go.mod h1:oZtUIOe8dh44I2q6ScRibXws4Ajl+d+nod3AaR9vL5w= +github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= +github.com/hashicorp/yamux v0.1.1 h1:yrQxtgseBDrq9Y652vSRDvsKCJKOUD+GzTS4Y0Y8pvE= github.com/hashicorp/yamux v0.1.1/go.mod h1:CtWFDAQgb7dxtzFs4tWbplKIe2jSi3+5vKbgIO0SLnQ= github.com/herumi/bls-eth-go-binary v0.0.0-20210130185500-57372fb27371/go.mod h1:luAnRm3OsMQeokhGzpYmc0ZKwawY7o87PUEP11Z7r7U= github.com/herumi/bls-eth-go-binary v0.0.0-20210917013441-d37c07cfda4e/go.mod h1:luAnRm3OsMQeokhGzpYmc0ZKwawY7o87PUEP11Z7r7U= github.com/holiman/billy v0.0.0-20230718173358-1c7e68d277a7/go.mod h1:5GuXa7vkL8u9FkFuWdVvfR5ix8hRB7DbOAaYULamFpc= github.com/holiman/goevmlab v0.0.0-20221201133036-b31966a5267d/go.mod h1:tQJ4EfAokPShVDyEwKslIWKyt0qA/z8u+iK3kAwO424= github.com/holiman/goevmlab v0.0.0-20221207202144-89074274e1b7/go.mod h1:t5n9hEKnVqrEclta+MoEDjI2D9X7bi8OiWGmyYuNhMk= +github.com/holiman/goevmlab v0.0.0-20230917164918-f3777d0b880b h1:K56eEHgH3CcQma/sZnZi9apLYD1gsUVTK9xc9QWVaac= github.com/holiman/goevmlab v0.0.0-20230917164918-f3777d0b880b/go.mod h1:Xf54jEqUJ0PwTEF9Z6e8FSLpnLpyB0QUfdHA3you/sw= github.com/holiman/uint256 v1.2.3/go.mod h1:SC8Ryt4n+UBbPbIBKaG9zbbDlp4jOru9xFZmPzLUTxw= +github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= github.com/huin/goupnp v1.0.3/go.mod h1:ZxNlw5WqJj6wSsRK5+YfflQGXYfccj5VgQsMNixHM7Y= github.com/huin/goupnp v1.2.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8= github.com/hydrogen18/memlistener v0.0.0-20141126152155-54553eb933fb/go.mod h1:qEIFzExnS6016fRpRfxrExeVn2gbClQA99gQhnIcdhE= github.com/hydrogen18/memlistener v0.0.0-20200120041712-dcc25e7acd91/go.mod h1:qEIFzExnS6016fRpRfxrExeVn2gbClQA99gQhnIcdhE= +github.com/hydrogen18/memlistener v1.0.0 h1:JR7eDj8HD6eXrc5fWLbSUnfcQFL06PYvCc0DKQnWfaU= github.com/hydrogen18/memlistener v1.0.0/go.mod h1:qEIFzExnS6016fRpRfxrExeVn2gbClQA99gQhnIcdhE= +github.com/iancoleman/strcase v0.2.0 h1:05I4QRnGpI0m37iZQRuskXh+w77mr6Z41lwQzuHLwW0= github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= +github.com/ianlancetaylor/cgosymbolizer v0.0.0-20200424224625-be1b05b0b279 h1:IpTHAzWv1pKDDWeJDY5VOHvqc2T9d3C8cPKEf2VPqHE= github.com/ianlancetaylor/cgosymbolizer v0.0.0-20200424224625-be1b05b0b279/go.mod h1:a5aratAVTWyz+nJMmDsN8O4XTfaLfdAsB1ysCmZX5Bw= github.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w= github.com/ianlancetaylor/demangle v0.0.0-20220517205856-0058ec4f073c/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w= +github.com/ianlancetaylor/demangle v0.0.0-20230524184225-eabc099b10ab h1:BA4a7pe6ZTd9F8kXETBoijjFJ/ntaa//1wiH9BZu4zU= github.com/ianlancetaylor/demangle v0.0.0-20230524184225-eabc099b10ab/go.mod h1:gx7rwoVhcfuVKG5uya9Hs3Sxj7EIvldVofAWIUtGouw= github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.10/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= +github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU= github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= +github.com/imkira/go-interpol v1.1.0 h1:KIiKr0VSG2CUW1hl1jpiyuzuJeKUUpC8iM1AIE7N1Vk= github.com/imkira/go-interpol v1.1.0/go.mod h1:z0h2/2T3XF8kyEPpRgJ3kmNv+C43p+I/CoI+jC3w2iA= github.com/inconshreveable/log15 v0.0.0-20170622235902-74a0988b5f80/go.mod h1:cOaXtrgN4ScfRrD9Bre7U1thNq5RtJ8ZoP4iXVGRj6o= +github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/influxdata/flux v0.65.1/go.mod h1:J754/zds0vvpfwuq7Gc2wRdVwEodfpCFM7mYlOw2LqY= github.com/influxdata/influxdb v1.8.3/go.mod h1:JugdFhsvvI8gadxOI6noqNeeBHvWNTbfYGtiAn+2jhI= github.com/influxdata/influxdb-client-go/v2 v2.4.0/go.mod h1:vLNHdxTJkIf2mSLvGrpj8TCcISApPoXkaxP8g9uRlW8= +github.com/influxdata/influxdb-client-go/v2 v2.12.1 h1:RrjoDNyBGFYvjKfjmtIyYAn6GY/SrtocSo4RPlt+Lng= github.com/influxdata/influxdb-client-go/v2 v2.12.1/go.mod h1:YteV91FiQxRdccyJ2cHvj2f/5sq4y4Njqu1fQzsQCOU= github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= +github.com/influxdata/influxdb1-client v0.0.0-20220302092344-a9ab5670611c h1:qSHzRbhzK8RdXOsAdfDgO49TtqC1oZ+acxPrkfTxcCs= github.com/influxdata/influxdb1-client v0.0.0-20220302092344-a9ab5670611c/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= github.com/influxdata/influxql v1.1.1-0.20200828144457-65d3ef77d385/go.mod h1:gHp9y86a/pxhjJ+zMjNXiQAA197Xk9wLxaz+fGG+kWk= github.com/influxdata/line-protocol v0.0.0-20180522152040-32c6aa80de5e/go.mod h1:4kt73NQhadE3daL3WhR5EJ/J2ocX0PZzwxQ0gXJ7oFE= github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo= github.com/influxdata/line-protocol v0.0.0-20210311194329-9aa0e372d097/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo= +github.com/influxdata/line-protocol v0.0.0-20210922203350-b1ad95c89adf h1:7JTmneyiNEwVBOHSjoMxiWAqB992atOeepeFYegn5RU= github.com/influxdata/line-protocol v0.0.0-20210922203350-b1ad95c89adf/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo= github.com/influxdata/promql/v2 v2.12.0/go.mod h1:fxOPu+DY0bqCTCECchSRtWfc+0X19ybifQhZoQNF5D8= github.com/influxdata/roaring v0.4.13-0.20180809181101-fc520f41fab6/go.mod h1:bSgUQ7q5ZLSO+bKBGqJiCBGAl+9DxyW63zLTujjUlOE= github.com/influxdata/tdigest v0.0.0-20181121200506-bf2b5ad3c0a9/go.mod h1:Js0mqiSBE6Ffsg94weZZ2c+v/ciT8QRHFOap7EKDrR0= github.com/influxdata/usage-client v0.0.0-20160829180054-6d3895376368/go.mod h1:Wbbw6tYNvwa5dlB6304Sd+82Z3f7PmVZHVKU637d4po= +github.com/intel/goresctrl v0.2.0 h1:JyZjdMQu9Kl/wLXe9xA6s1X+tF6BWsQPFGJMEeCfWzE= github.com/intel/goresctrl v0.2.0/go.mod h1:+CZdzouYFn5EsxgqAQTEzMfwKwuc0fVdMrT9FCCAVRQ= +github.com/invopop/yaml v0.1.0 h1:YW3WGUoJEXYfzWBjn00zIlrw7brGVD0fUKRYDPAPhrc= github.com/invopop/yaml v0.1.0/go.mod h1:2XuRLgs/ouIrW3XNzuNj7J3Nvu/Dig5MXvbCEdiBN3Q= github.com/ipfs/go-cid v0.0.7/go.mod h1:6Ux9z5e+HpkQdckYoX1PG/6xqKspzlEIR5SDmgqgC/I= github.com/ipfs/go-datastore v0.5.0/go.mod h1:9zhEApYMTl17C8YDp7JmU7sQZi2/wqiYh73hakZ90Bk= +github.com/ipfs/go-datastore v0.6.0 h1:JKyz+Gvz1QEZw0LsX1IBn+JFCJQH4SJVFtM4uWU0Myk= github.com/ipfs/go-datastore v0.6.0/go.mod h1:rt5M3nNbSO/8q1t4LNkLyUwRs8HupMeN/8O4Vn9YAT8= github.com/ipfs/go-detect-race v0.0.1/go.mod h1:8BNT7shDZPo99Q74BpGMK+4D8Mn4j46UU0LZ723meps= +github.com/ipfs/go-ds-badger v0.3.0 h1:xREL3V0EH9S219kFFueOYJJTcjgNSZ2HY1iSvN7U1Ro= github.com/ipfs/go-ds-badger v0.3.0/go.mod h1:1ke6mXNqeV8K3y5Ak2bAA0osoTfmxUdupVCGm4QUIek= +github.com/ipfs/go-ds-leveldb v0.5.0 h1:s++MEBbD3ZKc9/8/njrn4flZLnCuY9I79v94gBUNumo= github.com/ipfs/go-ds-leveldb v0.5.0/go.mod h1:d3XG9RUDzQ6V4SHi8+Xgj9j1XuEk1z82lquxrVbml/Q= github.com/ipfs/go-ipfs-delay v0.0.0-20181109222059-70721b86a9a8/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG9QfXmbRPrw= github.com/ipfs/go-ipfs-util v0.0.2/go.mod h1:CbPtkWJzjLdEcezDns2XYaehFVNXG9zrdrtMecczcsQ= github.com/ipfs/go-log/v2 v2.0.5/go.mod h1:eZs4Xt4ZUJQFM3DlanGhy7TkwwawCZcSByscwkWG+dw= +github.com/iris-contrib/blackfriday v2.0.0+incompatible h1:o5sHQHHm0ToHUlAJSTjW9UWicjJSDDauOOQ2AHuIVp4= github.com/iris-contrib/blackfriday v2.0.0+incompatible/go.mod h1:UzZ2bDEoaSGPbkg6SAB4att1aAwTmVIx/5gCVqeyUdI= +github.com/iris-contrib/go.uuid v2.0.0+incompatible h1:XZubAYg61/JwnJNbZilGjf3b3pB80+OQg2qf6c8BfWE= github.com/iris-contrib/go.uuid v2.0.0+incompatible/go.mod h1:iz2lgM/1UnEf1kP0L/+fafWORmlnuysV2EMP8MW+qe0= +github.com/iris-contrib/httpexpect/v2 v2.12.1 h1:3cTZSyBBen/kfjCtgNFoUKi1u0FVXNaAjyRJOo6AVS4= github.com/iris-contrib/httpexpect/v2 v2.12.1/go.mod h1:7+RB6W5oNClX7PTwJgJnsQP3ZuUUYB3u61KCqeSgZ88= github.com/iris-contrib/i18n v0.0.0-20171121225848-987a633949d0/go.mod h1:pMCz62A0xJL6I+umB2YTlFRwWXaDFA0jy+5HzGiJjqI= github.com/iris-contrib/jade v1.1.3/go.mod h1:H/geBymxJhShH5kecoiOCSssPX7QWYH7UaeZTSWddIk= +github.com/iris-contrib/jade v1.1.4 h1:WoYdfyJFfZIUgqNAeOyRfTNQZOksSlZ6+FnXR3AEpX0= github.com/iris-contrib/jade v1.1.4/go.mod h1:EDqR+ur9piDl6DUgs6qRrlfzmlx/D5UybogqrXvJTBE= +github.com/iris-contrib/pongo2 v0.0.1 h1:zGP7pW51oi5eQZMIlGA3I+FHY9/HOQWDB+572yin0to= github.com/iris-contrib/pongo2 v0.0.1/go.mod h1:Ssh+00+3GAZqSQb30AvBRNxBx7rf0GqwkjqxNd0u65g= github.com/iris-contrib/schema v0.0.1/go.mod h1:urYA3uvUNG1TIIjOSCzHr9/LmbQo8LrOcOqfqxa4hXw= +github.com/iris-contrib/schema v0.0.6 h1:CPSBLyx2e91H2yJzPuhGuifVRnZBBJ3pCOMbOvPZaTw= github.com/iris-contrib/schema v0.0.6/go.mod h1:iYszG0IOsuIsfzjymw1kMzTL8YQcCWlm65f3wX8J5iA= github.com/j-keck/arping v0.0.0-20160618110441-2cf9dc699c56/go.mod h1:ymszkNOg6tORTn+6F6j+Jc8TOr5osrynvN6ivFWZ2GA= github.com/jbenet/go-cienv v0.1.0/go.mod h1:TqNnHUmJgXau0nCzC7kXWeotg3J9W34CUv5Djy1+FlA= +github.com/jbenet/goprocess v0.1.4 h1:DRGOFReOMqqDNXwW70QkacFW0YN9QnwLV0Vqk+3oU0o= github.com/jbenet/goprocess v0.1.4/go.mod h1:5yspPrukOVuOLORacaBi858NqyClJPQxYZlqdZVfqY4= github.com/jcmturner/gofork v1.0.0/go.mod h1:MK8+TM0La+2rjBD4jE12Kj1pCCxK7d2LK/UM3ncEo0o= +github.com/jedisct1/go-minisign v0.0.0-20230811132847-661be99b8267 h1:TMtDYDHKYY15rFihtRfck/bfFqNfvcabqvXAFQfAUpY= github.com/jedisct1/go-minisign v0.0.0-20230811132847-661be99b8267/go.mod h1:h1nSAbGFqGVzn6Jyl1R/iCcBUHN4g+gW1u9CoBTrb9E= +github.com/jellevandenhooff/dkim v0.0.0-20150330215556-f50fe3d243e1 h1:ujPKutqRlJtcfWk6toYVYagwra7HQHbXOaS171b4Tg8= github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmespath/go-jmespath v0.0.0-20160803190731-bd40a432e4c7/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= +github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= +github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= github.com/joefitzgerald/rainbow-reporter v0.1.0/go.mod h1:481CNgqmVHQZzdIbN52CupLJyoVwB10FQ/IQlF1pdL8= +github.com/jonboulle/clockwork v0.1.0 h1:VKV+ZcuP6l3yW9doeqz6ziZGgcynBVQO+obU0+0hcPo= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/joonix/log v0.0.0-20200409080653-9c1d2ceb5f1d h1:k+SfYbN66Ev/GDVq39wYOXVW5RNd5kzzairbCe9dK5Q= github.com/joonix/log v0.0.0-20200409080653-9c1d2ceb5f1d/go.mod h1:fS54ONkjDV71zS9CDx3V9K21gJg7byKSvI4ajuWFNJw= +github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= +github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2EA= github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/jstemmer/go-junit-report v0.9.1 h1:6QPYqodiu3GuPL+7mfx+NwDdp2eTkp9IfEUpgAwUN0o= github.com/jsternberg/zap-logfmt v1.0.0/go.mod h1:uvPs/4X51zdkcm5jXl5SYoN+4RK21K8mysFmDaM/h+o= +github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= +github.com/juju/ansiterm v0.0.0-20180109212912-720a0952cc2a h1:FaWFmfWdAUKbSCtOU2QjDaorUexogfaMgbipgYATUMU= github.com/juju/ansiterm v0.0.0-20180109212912-720a0952cc2a/go.mod h1:UJSiEoRfvx3hP73CvoARgeLjaIOjybY9vj8PUPPFGeU= github.com/juju/errors v0.0.0-20181118221551-089d3ea4e4d5/go.mod h1:W54LbzXuIE0boCoNJfwqpmkKJ1O4TCTZMetAt6jGk7Q= +github.com/juju/gnuflag v0.0.0-20171113085948-2ce1bb71843d h1:c93kUJDtVAXFEhsCh5jSxyOJmFHuzcihnslQiX8Urwo= github.com/juju/gnuflag v0.0.0-20171113085948-2ce1bb71843d/go.mod h1:2PavIy+JPciBPrBUjwbNvtwB6RQlve+hkpll6QSNmOE= github.com/juju/loggo v0.0.0-20180524022052-584905176618/go.mod h1:vgyd7OREkbtVEN/8IXZe5Ooef3LQePvuBm9UWj6ZL8U= github.com/juju/testing v0.0.0-20180920084828-472a3e8b2073/go.mod h1:63prj8cnj0tU0S9OHjGJn+b1h0ZghCndfnbQolrYTwA= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= +github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5 h1:PJr+ZMXIecYc1Ey2zucXdR73SMBtgjPgwa31099IMv0= github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= github.com/jwilder/encoding v0.0.0-20170811194829-b4e1701a28ef/go.mod h1:Ct9fl0F6iIOGgxJ5npU/IUOhOhqlVrGjyIZc8/MagT0= +github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88 h1:uC1QfSlInpQF+M0ao65imhwqKnz3Q2z/d8PWZRMQvDM= github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88/go.mod h1:3w7q1U84EfirKl04SVQ/s7nPm1ZPhiXd34z40TNz36k= github.com/k0kubun/go-ansi v0.0.0-20180517002512-3bf9e2903213 h1:qGQQKEcAR99REcMpsXCp3lJ03zYT1PkRd3kQGPn9GVg= github.com/k0kubun/go-ansi v0.0.0-20180517002512-3bf9e2903213/go.mod h1:vNUNkEQ1e29fT/6vq2aBdFsgNPmy8qMdSay1npru+Sw= +github.com/karalabe/hid v1.0.1-0.20240306101548-573246063e52 h1:msKODTL1m0wigztaqILOtla9HeW1ciscYG4xjLtvk5I= github.com/karalabe/hid v1.0.1-0.20240306101548-573246063e52/go.mod h1:qk1sX/IBgppQNcGCRoj90u6EGC056EBoIc1oEjCWla8= github.com/karalabe/usb v0.0.2/go.mod h1:Od972xHfMJowv7NGVDiWVxk2zxnWgjLlJzE+F4F7AGU= +github.com/karalabe/usb v0.0.3-0.20230711191512-61db3e06439c h1:AqsttAyEyIEsNz5WLRwuRwjiT5CMDUfLk6cFJDVPebs= github.com/karalabe/usb v0.0.3-0.20230711191512-61db3e06439c/go.mod h1:Od972xHfMJowv7NGVDiWVxk2zxnWgjLlJzE+F4F7AGU= +github.com/kataras/blocks v0.0.7 h1:cF3RDY/vxnSRezc7vLFlQFTYXG/yAr1o7WImJuZbzC4= github.com/kataras/blocks v0.0.7/go.mod h1:UJIU97CluDo0f+zEjbnbkeMRlvYORtmc1304EeyXf4I= github.com/kataras/golog v0.0.9/go.mod h1:12HJgwBIZFNGL0EJnMRhmvGA0PQGx8VFwrZtM4CqbAk= github.com/kataras/golog v0.0.10/go.mod h1:yJ8YKCmyL+nWjERB90Qwn+bdyBZsaQwU3bTVFgkFIp8= +github.com/kataras/golog v0.1.8 h1:isP8th4PJH2SrbkciKnylaND9xoTtfxv++NB+DF0l9g= github.com/kataras/golog v0.1.8/go.mod h1:rGPAin4hYROfk1qT9wZP6VY2rsb4zzc37QpdPjdkqVw= github.com/kataras/iris/v12 v12.0.1/go.mod h1:udK4vLQKkdDqMGJJVd/msuMtN6hpYJhg/lSzuxjhO+U= github.com/kataras/iris/v12 v12.1.8/go.mod h1:LMYy4VlP67TQ3Zgriz8RE2h2kMZV2SgMYbq3UhfoFmE= +github.com/kataras/iris/v12 v12.2.0 h1:WzDY5nGuW/LgVaFS5BtTkW3crdSKJ/FEgWnxPnIVVLI= github.com/kataras/iris/v12 v12.2.0/go.mod h1:BLzBpEunc41GbE68OUaQlqX4jzi791mx5HU04uPb90Y= +github.com/kataras/jwt v0.1.8 h1:u71baOsYD22HWeSOg32tCHbczPjdCk7V4MMeJqTtmGk= github.com/kataras/jwt v0.1.8/go.mod h1:Q5j2IkcIHnfwy+oNY3TVWuEBJNw0ADgCcXK9CaZwV4o= github.com/kataras/neffos v0.0.10/go.mod h1:ZYmJC07hQPW67eKuzlfY7SO3bC0mw83A3j6im82hfqw= github.com/kataras/neffos v0.0.14/go.mod h1:8lqADm8PnbeFfL7CLXh1WHw53dG27MC3pgi2R1rmoTE= +github.com/kataras/neffos v0.0.21 h1:UwN/F44jlqdtgFI29y3VhA7IlJ4JbK3UjCbTDg1pYoo= github.com/kataras/neffos v0.0.21/go.mod h1:FeGka8lu8cjD2H+0OpBvW8c6xXawy3fj5VX6xcIJ1Fg= github.com/kataras/pio v0.0.0-20190103105442-ea782b38602d/go.mod h1:NV88laa9UiiDuX9AhMbDPkGYSPugBOV6yTZB1l2K9Z0= github.com/kataras/pio v0.0.2/go.mod h1:hAoW0t9UmXi4R5Oyq5Z4irTbaTsOemSrDGUtaTl7Dro= +github.com/kataras/pio v0.0.11 h1:kqreJ5KOEXGMwHAWHDwIl+mjfNCPhAwZPa8gK7MKlyw= github.com/kataras/pio v0.0.11/go.mod h1:38hH6SWH6m4DKSYmRhlrCJ5WItwWgCVrTNU62XZyUvI= github.com/kataras/sitemap v0.0.5/go.mod h1:KY2eugMKiPwsJgx7+U103YZehfvNGOXURubcGyk0Bz8= +github.com/kataras/sitemap v0.0.6 h1:w71CRMMKYMJh6LR2wTgnk5hSgjVNB9KL60n5e2KHvLY= github.com/kataras/sitemap v0.0.6/go.mod h1:dW4dOCNs896OR1HmG+dMLdT7JjDk7mYBzoIRwuj5jA4= +github.com/kataras/tunnel v0.0.4 h1:sCAqWuJV7nPzGrlb0os3j49lk2JhILT0rID38NHNLpA= github.com/kataras/tunnel v0.0.4/go.mod h1:9FkU4LaeifdMWqZu7o20ojmW4B7hdhv2CMLwfnHGpYw= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= +github.com/kisielk/errcheck v1.5.0 h1:e8esj/e4R+SAOwFwN+n3zr0nYeCyeweozKfO23MvHzY= +github.com/kisielk/gotool v1.0.0 h1:AV2c/EiW3KqPNT9ZKl07ehoAGi4C5/01Cfbblndcapg= +github.com/klauspost/asmfmt v1.3.2 h1:4Ri7ox3EwapiOjCki+hw14RyKk201CN4rzyCJRFLpK4= github.com/klauspost/asmfmt v1.3.2/go.mod h1:AG8TuvYojzulgDAMCnYn50l/5QV3Bs/tp6j0HLHbNSE= github.com/klauspost/compress v1.4.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= github.com/klauspost/compress v1.8.2/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= @@ -1297,36 +1719,49 @@ github.com/klauspost/pgzip v1.0.2-0.20170402124221-0bf5dcad4ada/go.mod h1:Ch1tH6 github.com/klauspost/reedsolomon v1.9.3/go.mod h1:CwCi+NUr9pqSVktrkN+Ondf06rkhYZ/pcNv7fu+8Un4= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.3 h1:CE8S1cTafDpPvMhIxNJKvHsGVBgn1xWYf1NbHQhywc8= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/korovkin/limiter v0.0.0-20221015170604-22eb1ceceddc/go.mod h1:mM0lzivCxB6c8msz/LOP9lJgZxy92GXwGcNG1A7UZEE= github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= +github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515 h1:T+h1c/A9Gawja4Y9mFVWj2vyii2bbUNDw3kt9VxK2EY= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= +github.com/kr/pty v1.1.3 h1:/Um6a/ZmD5tF7peoOJ5oN5KMQ0DrGVQSXLNwyckutPk= github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= github.com/kylelemons/godebug v0.0.0-20170224010052-a616ab194758/go.mod h1:B69LEHPfb2qLo0BaaOLcbitczOKLWTsrBG9LczfCD4k= github.com/labstack/echo/v4 v4.1.11/go.mod h1:i541M3Fj6f76NZtHSj7TXnyM8n2gaodfvfxNnFqi74g= github.com/labstack/echo/v4 v4.2.1/go.mod h1:AA49e0DZ8kk5jTOOCKNuPR6oTnBS0dYiM4FW1e6jwpg= github.com/labstack/echo/v4 v4.5.0/go.mod h1:czIriw4a0C1dFun+ObrXp7ok03xON0N1awStJ6ArI7Y= github.com/labstack/echo/v4 v4.9.1/go.mod h1:Pop5HLc+xoc4qhTZ1ip6C0RtP7Z+4VzRLWZZFKqbbjo= +github.com/labstack/echo/v4 v4.10.0 h1:5CiyngihEO4HXsz3vVsJn7f8xAlWwRr3aY6Ih280ZKA= github.com/labstack/echo/v4 v4.10.0/go.mod h1:S/T/5fy/GigaXnHTkh0ZGe4LpkkQysvRjFMSUTkDRNQ= github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= +github.com/labstack/gommon v0.4.0 h1:y7cvthEAEbU0yHOf4axH8ZG2NH8knB9iNSoTO8dyIk8= github.com/labstack/gommon v0.4.0/go.mod h1:uW6kP17uPlLJsD3ijUYn3/M5bAxtlZhMI6m3MFxTMTM= +github.com/ledongthuc/pdf v0.0.0-20220302134840-0c2507a12d80 h1:6Yzfa6GP0rIo/kULo2bwGEkFvCePZ3qHDDTC3/J9Swo= github.com/ledongthuc/pdf v0.0.0-20220302134840-0c2507a12d80/go.mod h1:imJHygn/1yfhB7XSJJKlFZKl/J+dCPAknuiaGOshXAs= github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY= github.com/leodido/go-urn v1.2.3 h1:6BE2vPT0lqoz3fmOesHZiaiFh7889ssCo2GMvLCfiuA= github.com/leodido/go-urn v1.2.3/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNaVckg+4= +github.com/lestrrat-go/backoff/v2 v2.0.8 h1:oNb5E5isby2kiro9AgdHLv5N5tint1AnDVVf2E2un5A= github.com/lestrrat-go/backoff/v2 v2.0.8/go.mod h1:rHP/q/r9aT27n24JQLa7JhSQZCKBBOiM/uP402WwN8Y= +github.com/lestrrat-go/blackmagic v1.0.0 h1:XzdxDbuQTz0RZZEmdU7cnQxUtFUzgCSPq8RCz4BxIi4= github.com/lestrrat-go/blackmagic v1.0.0/go.mod h1:TNgH//0vYSs8VXDCfkZLgIrVTTXQELZffUV0tz3MtdQ= +github.com/lestrrat-go/httpcc v1.0.1 h1:ydWCStUeJLkpYyjLDHihupbn2tYmZ7m22BGkcvZZrIE= github.com/lestrrat-go/httpcc v1.0.1/go.mod h1:qiltp3Mt56+55GPVCbTdM9MlqhvzyuL6W/NMDA8vA5E= +github.com/lestrrat-go/iter v1.0.1 h1:q8faalr2dY6o8bV45uwrxq12bRa1ezKrB6oM9FUgN4A= github.com/lestrrat-go/iter v1.0.1/go.mod h1:zIdgO1mRKhn8l9vrZJZz9TUMMFbQbLeTsbqPDrJ/OJc= +github.com/lestrrat-go/jwx v1.2.25 h1:tAx93jN2SdPvFn08fHNAhqFJazn5mBBOB8Zli0g0otA= github.com/lestrrat-go/jwx v1.2.25/go.mod h1:zoNuZymNl5lgdcu6P7K6ie2QRll5HVfF4xwxBBK1NxY= +github.com/lestrrat-go/option v1.0.0 h1:WqAWL8kh8VcSoD6xjSH34/1m8yxluXQbDeKNfvFeEO4= github.com/lestrrat-go/option v1.0.0/go.mod h1:5ZHFbivi4xwXxhxY9XHDe2FHo6/Z7WWmtT7T5nBBp3I= github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/libp2p/go-buffer-pool v0.0.2/go.mod h1:MvaB6xw5vOrDl8rYZGLFdKAuk/hRoRZd1Vi32+RXyFM= github.com/libp2p/go-cidranger v1.1.0/go.mod h1:KWZTfSr+r9qEo9OkI9/SIEeAtw+NNoU0dXIXt15Okic= github.com/libp2p/go-libp2p v0.32.0/go.mod h1:hXXC3kXPlBZ1eu8Q2hptGrMB4mZ3048JUoS4EKaHW5c= github.com/libp2p/go-libp2p v0.32.1/go.mod h1:hXXC3kXPlBZ1eu8Q2hptGrMB4mZ3048JUoS4EKaHW5c= +github.com/libp2p/zeroconf/v2 v2.2.0 h1:Cup06Jv6u81HLhIj1KasuNM/RHHrJ8T7wOTS4+Tv53Q= github.com/libp2p/zeroconf/v2 v2.2.0/go.mod h1:fuJqLnUwZTshS3U/bMRJ3+ow/v9oid1n0DmyYyNO1Xs= github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= @@ -1334,19 +1769,27 @@ github.com/linuxkit/virtsock v0.0.0-20201010232012-f8cee7dfc7a3/go.mod h1:3r6x7q github.com/logrusorgru/aurora v2.0.3+incompatible h1:tOpm7WcpBTn4fjmVfgpQq0EfczGlG91VSDkswnjF5A8= github.com/logrusorgru/aurora v2.0.3+incompatible/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4= github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= +github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ81pIr0yLvtUWk2if982qA3F3QD6H4= github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= github.com/lunixbochs/vtclean v0.0.0-20180621232353-2d01aacdc34a/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI= +github.com/lunixbochs/vtclean v1.0.0 h1:xu2sLAri4lGiovBDQKxl5mrXyESr3gUr5m5SM5+LVb8= github.com/lyft/protoc-gen-star v0.6.0/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA= github.com/lyft/protoc-gen-star v0.6.1/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA= github.com/lyft/protoc-gen-star/v2 v2.0.1/go.mod h1:RcCdONR2ScXaYnQC5tUzxzlpA3WVYF7/opLeUgcQs/o= +github.com/lyft/protoc-gen-star/v2 v2.0.3 h1:/3+/2sWyXeMLzKd1bX+ixWKgEMsULrIivpDsuaF441o= +github.com/lyft/protoc-gen-star/v2 v2.0.3/go.mod h1:amey7yeodaJhXSbf/TlLvWiqQfLOSpEk//mLlc+axEk= github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= github.com/magiconair/properties v1.7.4-0.20170902060319-8d7837e64d3c/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/magiconair/properties v1.8.0 h1:LLgXmsheXeRoUOBOjtwPQCWIYqM/LU1ayDtDePerRcY= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/mailgun/raymond/v2 v2.0.48 h1:5dmlB680ZkFG2RN/0lvTAghrSxIESeu9/2aeDqACtjw= github.com/mailgun/raymond/v2 v2.0.48/go.mod h1:lsgvL50kgt1ylcFJYZiULi5fjPBkkhNfj4KA0W54Z18= github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/manifoldco/promptui v0.7.0 h1:3l11YT8tm9MnwGFQ4kETwkzpAwY2Jt9lCrumCUW4+z4= github.com/manifoldco/promptui v0.7.0/go.mod h1:n4zTdgP0vr0S3w7/O/g98U+e0gwLScEXGwov2nIKuGQ= github.com/marioevz/eth-clients v0.0.0-20230823175101-fdc85382188d/go.mod h1:LZb4HPhmomFs5C3Rxj57X83yp3qzQHgB/xDAsvrFmDw= github.com/marioevz/eth-clients v0.0.0-20231018141729-9f6835ddc56b/go.mod h1:YVrdn57Q3rAzm3wus4T9tg1vMPca4csVbzorPhkGCW0= @@ -1354,7 +1797,9 @@ github.com/marioevz/zrnt v0.26.2-0.20230828220330-2bd62bc28aed h1:sXvMvzGd7Q28Bc github.com/marioevz/zrnt v0.26.2-0.20230828220330-2bd62bc28aed/go.mod h1:qcdX9CXFeVNCQK/q0nswpzhd+31RHMk2Ax/2lMsJ4Jw= github.com/marstr/guid v1.1.0/go.mod h1:74gB1z2wpxxInTG6yaqA7KrtM0NZ+RbrcqDvYHefzho= github.com/matryer/moq v0.0.0-20190312154309-6cfb0558e1bd/go.mod h1:9ELz6aaclSIGnZBoaSLZ3NAl1VTufbOrXBPvtcy6WiQ= +github.com/matryer/moq v0.2.7 h1:RtpiPUM8L7ZSCbSwK+QcZH/E9tgqAkFjKQxsRs25b4w= github.com/matryer/moq v0.2.7/go.mod h1:kITsx543GOENm48TUAQyJ9+SAvFSr7iGQXPoth/VUBk= +github.com/matryer/try v0.0.0-20161228173917-9ac251b645a2 h1:JAEbJn3j/FrhdWA9jW8B5ajsLIjeuEHLi8xE4fk997o= github.com/matryer/try v0.0.0-20161228173917-9ac251b645a2/go.mod h1:0KeJpeMD6o+O4hW7qJOT7vyQPKrWmj26uf5wMc/IiIs= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.0.10-0.20170816031813-ad5389df28cd/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= @@ -1380,35 +1825,49 @@ github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh github.com/mattn/go-shellwords v1.0.3/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o= github.com/mattn/go-shellwords v1.0.6/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o= github.com/mattn/go-sqlite3 v1.11.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= +github.com/mattn/go-sqlite3 v1.14.5 h1:1IdxlwTNazvbKJQSxoJ5/9ECbEeaTTyeU7sEAZ5KKTQ= github.com/mattn/go-sqlite3 v1.14.5/go.mod h1:WVKg1VTActs4Qso6iwGbiFih2UIHo0ENGwNd0Lj+XmI= github.com/mattn/go-tty v0.0.0-20180907095812-13ff1204f104/go.mod h1:XPvLUNfbS4fJH25nqRHfWLMa1ONC8Amw+mIA639KxkE= +github.com/mattn/goveralls v0.0.2 h1:7eJB6EqsPhRVxvwEXGnqdO2sJI0PTsrWoTMXEk9/OQc= github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw= github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= +github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 h1:jWpvCLoY8Z/e3VKvlsiIGKtc+UG6U5vzxaoagmhXfyg= github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0/go.mod h1:QUyp042oQthUoa9bqDv0ER0wrtXnBruoNd7aNjkbP+k= github.com/maxbrunsfeld/counterfeiter/v6 v6.2.2/go.mod h1:eD9eIE7cdwcMi9rYluz88Jz2VyhSmden33/aXg4oVIY= github.com/mediocregopher/mediocre-go-lib v0.0.0-20181029021733-cb65787f37ed/go.mod h1:dSsfyI2zABAdhcbvkXqgxOxrCsbYeHCPgrZkku60dSg= github.com/mediocregopher/radix/v3 v3.3.0/go.mod h1:EmfVyvspXz1uZEyPBMyGK+kjWiKQGvsUt6O3Pj+LDCQ= github.com/mediocregopher/radix/v3 v3.4.2/go.mod h1:8FL3F6UQRXHXIBSPUs5h0RybMF8i4n7wVopoX3x7Bv8= +github.com/mediocregopher/radix/v3 v3.8.1 h1:rOkHflVuulFKlwsLY01/M2cM2tWCjDoETcMqKbAWu1M= github.com/mediocregopher/radix/v3 v3.8.1/go.mod h1:8FL3F6UQRXHXIBSPUs5h0RybMF8i4n7wVopoX3x7Bv8= +github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b h1:j7+1HpAFS1zy5+Q4qx1fWh90gTKwiN4QCGoY9TWyyO4= github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= github.com/microcosm-cc/bluemonday v1.0.2/go.mod h1:iVP4YcDBq+n/5fb23BhYFvIMq/leAFZyRl6bYmGDlGc= +github.com/microcosm-cc/bluemonday v1.0.23 h1:SMZe2IGa0NuHvnVNAZ+6B38gsTbi5e4sViiWJyDDqFY= github.com/microcosm-cc/bluemonday v1.0.23/go.mod h1:mN70sk7UkkF8TUr2IGBpNN0jAgStuPzlK76QuruE/z4= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/miekg/dns v1.1.43/go.mod h1:+evo5L0630/F6ca/Z9+GAqzhjGyn8/c+TBaOyfEl0V4= github.com/miekg/dns v1.1.56/go.mod h1:cRm6Oo2C8TY9ZS/TqsSrseAcncm74lfK5G+ikN2SWWY= github.com/miekg/pkcs11 v1.0.3/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= +github.com/miekg/pkcs11 v1.1.1 h1:Ugu9pdy6vAYku5DEpVWVFPYnzV+bxB+iRdbuFSu7TvU= github.com/miekg/pkcs11 v1.1.1/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= +github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8 h1:AMFGa4R4MiIpspGNG7Z948v4n35fFGB3RR3G/ry4FWs= github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8/go.mod h1:mC1jAcsrzbxHt8iiaC+zU4b1ylILSosueou12R++wfY= +github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 h1:lYpkrQH5ajf0OXOcUbGjvZxxijuBwbbmlSxLiuofa+g= +github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3 h1:+n/aFZefKZp7spd8DFdX7uMikMLXX4oubIzJF4kv/wI= github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3/go.mod h1:RagcQ7I8IeTMnF8JTXieKnO4Z6JCsikNEzj0DwauVzE= github.com/minio/sha256-simd v0.1.0/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= github.com/minio/sha256-simd v0.1.1/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM= github.com/mistifyio/go-zfs v2.1.2-0.20190413222219-f784269be439+incompatible/go.mod h1:8AuVvqP/mXw1px98n46wfvcGfQ4ci2FwoAjKYxuo3Z4= +github.com/mistifyio/go-zfs/v3 v3.0.1 h1:YaoXgBePoMA12+S1u/ddkv+QqxcfiZK4prI6HPnkFiU= +github.com/mistifyio/go-zfs/v3 v3.0.1/go.mod h1:CzVgeB0RvF2EGzQnytKVvVSDwmKJXxkOTUGbNrTja/k= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db h1:62I3jR2EmQ4l5rM/4FEfDWcRD+abF5XlKShorW5LRoQ= github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db/go.mod h1:l0dey0ia/Uv7NcFFVbCLtqEBQbrT4OCwCSKTEv6enCw= github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= +github.com/mitchellh/go-wordwrap v1.0.1 h1:TLuKupo69TCn6TQSyGxwI1EblZZEsQ0vMlAFQflz0v0= github.com/mitchellh/go-wordwrap v1.0.1/go.mod h1:R62XHJLzvMFRBbcrT7m7WgmE1eOyTSsCt+hzestvNj0= github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= @@ -1416,8 +1875,12 @@ github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:F github.com/mitchellh/mapstructure v0.0.0-20170523030023-d0303fe80992/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.3.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/osext v0.0.0-20151018003038-5e2d6d41470f/go.mod h1:OkQIRizQZAeMln+1tSwduZz7+Af5oFlKirV/MSYes2A= +github.com/mmcloughlin/profile v0.1.1 h1:jhDmAqPyebOsVDOCICJoINoLb/AnLBaUw58nFzxWS2w= +github.com/moby/locker v1.0.1 h1:fOXqR41zeveg4fFODix+1Ch4mj/gT0NE1XJbp/epuBg= github.com/moby/locker v1.0.1/go.mod h1:S7SDdo5zpBK84bzzVlKr2V0hz+7x9hWbYC/kq7oQppc= +github.com/moby/patternmatcher v0.6.0 h1:GmP9lR19aU5GqSSFko+5pRqHi+Ohk1O69aFiKkVGiPk= github.com/moby/patternmatcher v0.6.0/go.mod h1:hDPoyOpDY7OrrMDLaYoY3hf52gNCR/YOUYxkhApJIxc= +github.com/moby/spdystream v0.2.0 h1:cjW1zVyyoiM0T7b6UoySUFqzXMoqRckQtXwGPiBhOM8= github.com/moby/sys/mount v0.3.3 h1:fX1SVkXFJ47XWDoeFW4Sq7PdQJnV2QIDZAqjNqgEjUs= github.com/moby/sys/mount v0.3.3/go.mod h1:PBaEorSNTLG5t/+4EgukEQVlAvVEc6ZjTySwKdqp5K0= github.com/moby/sys/mountinfo v0.4.0/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2JI+6q0qou+A= @@ -1425,17 +1888,24 @@ github.com/moby/sys/mountinfo v0.4.1/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2J github.com/moby/sys/mountinfo v0.5.0/go.mod h1:3bMD3Rg+zkqx8MRYPi7Pyb0Ie97QEBmdxbhnCLlSvSU= github.com/moby/sys/mountinfo v0.6.2 h1:BzJjoreD5BMFNmD9Rus6gdd1pLuecOFPt8wC+Vygl78= github.com/moby/sys/mountinfo v0.6.2/go.mod h1:IJb6JQeOklcdMU9F5xQ8ZALD+CUr5VlGpwtX+VE0rpI= +github.com/moby/sys/sequential v0.5.0 h1:OPvI35Lzn9K04PBbCLW0g4LcFAJgHsvXsRyewg5lXtc= github.com/moby/sys/sequential v0.5.0/go.mod h1:tH2cOOs5V9MlPiXcQzRC+eEyab644PWKGRYaaV5ZZlo= +github.com/moby/sys/signal v0.6.0 h1:aDpY94H8VlhTGa9sNYUFCFsMZIUh5wm0B6XkIoJj/iY= github.com/moby/sys/signal v0.6.0/go.mod h1:GQ6ObYZfqacOwTtlXvcmh9A26dVRul/hbOZn88Kg8Tg= github.com/moby/sys/symlink v0.1.0/go.mod h1:GGDODQmbFOjFsXvfLVn3+ZRxkch54RkSiGqsZeMYowQ= +github.com/moby/sys/symlink v0.2.0 h1:tk1rOM+Ljp0nFmfOIBtlV3rTDlWOwFRhjEeAhZB0nZc= github.com/moby/sys/symlink v0.2.0/go.mod h1:7uZVF2dqJjG/NsClqul95CqKOBRQyYSNnJ6BMgR/gFs= +github.com/moby/sys/user v0.1.0 h1:WmZ93f5Ux6het5iituh9x2zAG7NFY9Aqi49jjE1PaQg= github.com/moby/sys/user v0.1.0/go.mod h1:fKJhFOnsCN6xZ5gSfbM6zaHGgDJMrqt9/reuj4T7MmU= github.com/moby/term v0.0.0-20200312100748-672ec06f55cd/go.mod h1:DdlQx2hp0Ss5/fLikoLlEeIYiATotOjgB//nb973jeo= +github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6 h1:dcztxKSvZ4Id8iPpHERQBbIJfabdt4wUm5qy3wOL2Zc= github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6/go.mod h1:E2VnQOmVuvZB6UYnnDB0qG5Nq/1tD9acaOpo6xmt0Kw= github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5/go.mod h1:caMODM3PzxT8aQXRPkAt8xlV/e7d7w8GM5g0fa5F0D8= github.com/montanaflynn/stats v0.6.6/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= github.com/montanaflynn/stats v0.7.0/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= +github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= +github.com/moul/http2curl v1.0.0 h1:dRMWoAtb+ePxMlLkrCbAqh4TlPHXvoGUSQ323/9Zahs= github.com/moul/http2curl v1.0.0/go.mod h1:8UbvGypXm98wA/IqH45anm5Y2Z6ep6O31QGOAZ3H0fQ= github.com/mr-tron/base58 v1.1.0/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= github.com/mr-tron/base58 v1.1.3/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= @@ -1450,26 +1920,40 @@ github.com/multiformats/go-multihash v0.0.13/go.mod h1:VdAWLKTwram9oKAatUcLxBNUj github.com/multiformats/go-multihash v0.0.15/go.mod h1:D6aZrWNLFTV/ynMpKsNtB40mJzmCl4jb1alC0OvHiHg= github.com/multiformats/go-varint v0.0.5/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= github.com/multiformats/go-varint v0.0.6/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= +github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d h1:7PxY7LVfSZm7PEeBTyK1rj1gABdCO2mbri6GKO1cMDs= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f h1:KUppIJq7/+SVif2QVs3tOP0zanoHgBEVAwHxUSIzRqU= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f h1:y5//uYreIhSUg3J1GEMiLbxo1LJaP8RfCpH6pymGZus= +github.com/naoina/go-stringutil v0.1.0 h1:rCUeRUHjBjGTSHl0VC00jUPLz8/F9dDzYI70Hzifhks= github.com/naoina/go-stringutil v0.1.0/go.mod h1:XJ2SJL9jCtBh+P9q5btrd/Ylo8XwT/h1USek5+NqSA0= +github.com/naoina/toml v0.1.2-0.20170918210437-9fafd6967416 h1:shk/vn9oCoOTmwcouEdwIeOtOGA/ELRUw/GwvxwfT+0= github.com/naoina/toml v0.1.2-0.20170918210437-9fafd6967416/go.mod h1:NBIhNtsFMo3G2szEBne+bO4gS192HuIYRqfvOWb4i1E= +github.com/nats-io/jwt v0.3.0 h1:xdnzwFETV++jNc4W1mw//qFyJGb2ABOombmZJQS4+Qo= github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= github.com/nats-io/jwt v0.3.2/go.mod h1:/euKqTS1ZD+zzjYrY7pseZrTtWQSjujC7xjPc8wL6eU= +github.com/nats-io/jwt/v2 v2.3.0 h1:z2mA1a7tIf5ShggOFlR1oBPgd6hGqcDYsISxZByUzdI= github.com/nats-io/jwt/v2 v2.3.0/go.mod h1:0tqz9Hlu6bCBFLWAASKhE5vUA4c24L9KPUUgvwumE/k= github.com/nats-io/nats-server/v2 v2.1.2/go.mod h1:Afk+wRZqkMQs/p45uXdrVLuab3gwv3Z8C4HTBu8GD/k= github.com/nats-io/nats.go v1.8.1/go.mod h1:BrFz9vVn0fU3AcH9Vn4Kd7W0NpJ651tD5omQ3M8LwxM= github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= +github.com/nats-io/nats.go v1.23.0 h1:lR28r7IX44WjYgdiKz9GmUeW0uh/m33uD3yEjLZ2cOE= github.com/nats-io/nats.go v1.23.0/go.mod h1:ki/Scsa23edbh8IRZbCuNXR9TDcbvfaSijKtaqQgw+Q= github.com/nats-io/nkeys v0.0.2/go.mod h1:dab7URMsZm6Z/jp9Z5UGa87Uutgc2mVpXLC4B7TDb/4= github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= +github.com/nats-io/nkeys v0.3.0 h1:cgM5tL53EvYRU+2YLXIK0G2mJtK12Ft9oeooSZMA2G8= github.com/nats-io/nkeys v0.3.0/go.mod h1:gvUNGjVcM2IPr5rCsRsC6Wb3Hr2CQAm08dsxtV6A5y4= +github.com/nats-io/nuid v1.0.1 h1:5iA8DT8V7q8WK2EScv2padNa/rTESc1KdnPw4TC2paw= github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= github.com/ncw/swift v1.0.47/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= +github.com/neelance/astrewrite v0.0.0-20160511093645-99348263ae86 h1:D6paGObi5Wud7xg83MaEFyjxQB1W5bz5d0IFppr+ymk= +github.com/neelance/sourcemap v0.0.0-20151028013722-8c68805598ab h1:eFXv9Nu1lGbrNbj619aWwZfVF5HBrm9Plte8aNptuTI= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= +github.com/oklog/ulid v1.3.1 h1:EGfNDEx6MqHz8B3uNV6QAib1UR2Lm97sHi3ocA6ESJ4= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= github.com/onsi/ginkgo v0.0.0-20151202141238-7f8ab55aaf3b/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= @@ -1502,10 +1986,12 @@ github.com/opencontainers/go-digest v0.0.0-20170106003457-a6d0ee40d420/go.mod h1 github.com/opencontainers/go-digest v0.0.0-20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= github.com/opencontainers/go-digest v1.0.0-rc1.0.20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= +github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opencontainers/image-spec v1.0.0/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= github.com/opencontainers/image-spec v1.0.3-0.20211202183452-c5a74bcca799/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= +github.com/opencontainers/image-spec v1.1.0-rc2.0.20221005185240-3a7f492d3f1b h1:YWuSjZCQAPM8UUBLkYUk1e+rZcvWHJmFb6i6rM44Xs8= github.com/opencontainers/image-spec v1.1.0-rc2.0.20221005185240-3a7f492d3f1b/go.mod h1:3OVijpioIKYWTqjiG0zfF6wvoJ4fAXGbjdZuI2NgsRQ= github.com/opencontainers/runc v0.0.0-20190115041553-12f6a991201f/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= github.com/opencontainers/runc v0.1.1/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= @@ -1513,6 +1999,7 @@ github.com/opencontainers/runc v1.0.0-rc8.0.20190926000215-3e425f80a8c9/go.mod h github.com/opencontainers/runc v1.0.0-rc9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= github.com/opencontainers/runc v1.0.0-rc93/go.mod h1:3NOsor4w32B2tC0Zbl8Knk4Wg84SM2ImC1fxBuqJ/H0= github.com/opencontainers/runc v1.0.2/go.mod h1:aTaHFFwQXuA71CiyxOdFFIorAoemI04suvGRQFzWTD0= +github.com/opencontainers/runc v1.1.5 h1:L44KXEpKmfWDcS02aeGm8QNTFXTo2D+8MYGDIJ/GDEs= github.com/opencontainers/runc v1.1.5/go.mod h1:1J5XiS+vdZ3wCyZybsuxXZWGrgSr8fFJHLXuG2PsnNg= github.com/opencontainers/runtime-spec v0.1.2-0.20190507144316-5b71a03e2700/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opencontainers/runtime-spec v1.0.1/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= @@ -1525,17 +2012,21 @@ github.com/opencontainers/selinux v1.6.0/go.mod h1:VVGKuOLlE7v4PJyT6h7mNWvq1rzqi github.com/opencontainers/selinux v1.8.0/go.mod h1:RScLhm78qiWa2gbVCcGkC7tCGdgk3ogry1nUQF8Evvo= github.com/opencontainers/selinux v1.8.2/go.mod h1:MUIHuUEvKB1wtJjQdOyYRgOnLD2xAPP8dBsCoU0KuF8= github.com/opencontainers/selinux v1.10.0/go.mod h1:2i0OySw99QjzBBQByd1Gr9gSjvuho1lHsJxIJ3gGbJI= +github.com/opencontainers/selinux v1.10.1 h1:09LIPVRP3uuZGQvgR+SgMSNBd1Eb3vlRbGqQpoHsF8w= github.com/opencontainers/selinux v1.10.1/go.mod h1:2i0OySw99QjzBBQByd1Gr9gSjvuho1lHsJxIJ3gGbJI= github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis= github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74= github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/opentracing/opentracing-go v1.0.3-0.20180606204148-bd9c31933947/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs= github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.5/go.mod h1:/wsWhb9smxSfWAKL3wpBW7V8scJMt8N8gnaMCS9E/cA= +github.com/openzipkin/zipkin-go v0.1.1 h1:A/ADD6HaPnAKj3yS7HjGHRK77qi41Hi0DirOOIQAeIw= github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= +github.com/orisano/pixelmatch v0.0.0-20220722002657-fb0b55479cde h1:x0TT0RDC7UhAVbbWWBzr41ElhJx5tXPWkIHA2HWPRuw= github.com/orisano/pixelmatch v0.0.0-20220722002657-fb0b55479cde/go.mod h1:nZgzbfBr3hhjoZnS66nKrHmduYNpc34ny7RK4z5/HM0= github.com/otiai10/copy v1.2.0/go.mod h1:rrF5dJ5F0t/EWSYODDu4j9/vEeYHMkc8jt0zJChqQWw= github.com/otiai10/curr v0.0.0-20150429015615-9b4961190c95/go.mod h1:9qAhocn7zKJG+0mI8eUu6xqkFDYS2kb2saOteoSB3cE= @@ -1544,8 +2035,10 @@ github.com/otiai10/mint v1.3.0/go.mod h1:F5AjcsTsWUqX+Na9fpHb52P8pcRX2CI6A3ctIT9 github.com/otiai10/mint v1.3.1/go.mod h1:/yxELlJQ0ufhjUwhshSj+wFjZ78CnZ48/1wtmBH1OTc= github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/paulbellamy/ratecounter v0.2.0 h1:2L/RhJq+HA8gBQImDXtLPrDXK5qAj6ozWVK/zFXVJGs= github.com/paulbellamy/ratecounter v0.2.0/go.mod h1:Hfx1hDpSGoqxkVVpBi/IlYD7kChlfo5C6hzIHwPqfFE= github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= +github.com/pborman/uuid v1.2.1 h1:+ZZIw58t/ozdjRaXh/3awHfmWRbzYxJoAdNJxe/3pvw= github.com/pborman/uuid v1.2.1/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= github.com/pelletier/go-toml v1.0.1-0.20170904195809-1d6b12b7cb29/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= @@ -1555,49 +2048,72 @@ github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCko github.com/pelletier/go-toml/v2 v2.0.5 h1:ipoSadvV8oGUjnUbMub59IDPPwfxF694nG/jwbMiyQg= github.com/pelletier/go-toml/v2 v2.0.5/go.mod h1:OMHamSCAODeSsVrwwvcJOaoN0LIUIaFVNZzmWyNfXas= github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= +github.com/peterbourgon/diskv v2.0.1+incompatible h1:UBdAOUP5p4RWqPBg048CAvpKN+vxiaj6gdUUzhl4XmI= github.com/peterh/liner v1.0.1-0.20180619022028-8c1271fcf47f/go.mod h1:xIteQHvHuaLYG9IFj6mSxM0fCKrs34IrEQUhOYuGPHc= github.com/peterh/liner v1.1.1-0.20190123174540-a2c9a5303de7/go.mod h1:CRroGNssyjTd/qIG2FyxByd2S8JEAZXBl4qUrZf8GS0= github.com/peterh/liner v1.2.0/go.mod h1:CRroGNssyjTd/qIG2FyxByd2S8JEAZXBl4qUrZf8GS0= +github.com/peterh/liner v1.2.2 h1:aJ4AOodmL+JxOZZEL2u9iJf8omNRpqHc/EbrK+3mAXw= github.com/peterh/liner v1.2.2/go.mod h1:xFwJyiKIXJZUKItq5dGHZSTBRAuG/CpeNpWLyiNRNwI= github.com/philhofer/fwd v1.0.0/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU= +github.com/phpdave11/gofpdf v1.4.2 h1:KPKiIbfwbvC/wOncwhrpRdXVj2CZTCFlw4wnoyjtHfQ= github.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY= github.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= +github.com/phpdave11/gofpdi v1.0.13 h1:o61duiW8M9sMlkVXWlvP92sZJtGKENvW3VExs6dZukQ= github.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pierrec/lz4 v2.4.1+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= +github.com/pierrec/lz4/v4 v4.1.15 h1:MO0/ucJhngq7299dKLwIMtgTfbkoSPF6AoMYDd8Q4q0= github.com/pierrec/lz4/v4 v4.1.15/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= +github.com/pion/datachannel v1.5.5 h1:10ef4kwdjije+M9d7Xm9im2Y3O6A6ccQb0zcqZcJew8= github.com/pion/datachannel v1.5.5/go.mod h1:iMz+lECmfdCMqFRhXhcA/219B0SQlbpoR2V118yimL0= github.com/pion/dtls/v2 v2.2.7/go.mod h1:8WiMkebSHFD0T+dIU+UeBaoV7kDhOW5oDCzZ7WZ/F9s= +github.com/pion/dtls/v2 v2.2.8 h1:BUroldfiIbV9jSnC6cKOMnyiORRWrWWpV11JUyEu5OA= github.com/pion/dtls/v2 v2.2.8/go.mod h1:8WiMkebSHFD0T+dIU+UeBaoV7kDhOW5oDCzZ7WZ/F9s= +github.com/pion/ice/v2 v2.3.11 h1:rZjVmUwyT55cmN8ySMpL7rsS8KYsJERsrxJLLxpKhdw= github.com/pion/ice/v2 v2.3.11/go.mod h1:hPcLC3kxMa+JGRzMHqQzjoSj3xtE9F+eoncmXLlCL4E= +github.com/pion/interceptor v0.1.25 h1:pwY9r7P6ToQ3+IF0bajN0xmk/fNw/suTgaTdlwTDmhc= github.com/pion/interceptor v0.1.25/go.mod h1:wkbPYAak5zKsfpVDYMtEfWEy8D4zL+rpxCxPImLOg3Y= +github.com/pion/logging v0.2.2 h1:M9+AIj/+pxNsDfAT64+MAVgJO0rsyLnoJKCqf//DoeY= github.com/pion/logging v0.2.2/go.mod h1:k0/tDVsRCX2Mb2ZEmTqNa7CWsQPc+YYCB7Q+5pahoms= github.com/pion/mdns v0.0.8/go.mod h1:hYE72WX8WDveIhg7fmXgMKivD3Puklk0Ymzog0lSyaI= +github.com/pion/mdns v0.0.9 h1:7Ue5KZsqq8EuqStnpPWV33vYYEH0+skdDN5L7EiEsI4= github.com/pion/mdns v0.0.9/go.mod h1:2JA5exfxwzXiCihmxpTKgFUpiQws2MnipoPK09vecIc= +github.com/pion/randutil v0.1.0 h1:CFG1UdESneORglEsnimhUjf33Rwjubwj6xfiOXBa3mA= github.com/pion/randutil v0.1.0/go.mod h1:XcJrSMMbbMRhASFVOlj/5hQial/Y8oH/HVo7TBZq+j8= github.com/pion/rtcp v1.2.10/go.mod h1:ztfEwXZNLGyF1oQDttz/ZKIBaeeg/oWbRYqzBM9TL1I= github.com/pion/rtcp v1.2.12/go.mod h1:sn6qjxvnwyAkkPzPULIbVqSKI5Dv54Rv7VG0kNxh9L4= +github.com/pion/rtcp v1.2.13 h1:+EQijuisKwm/8VBs8nWllr0bIndR7Lf7cZG200mpbNo= github.com/pion/rtcp v1.2.13/go.mod h1:sn6qjxvnwyAkkPzPULIbVqSKI5Dv54Rv7VG0kNxh9L4= github.com/pion/rtp v1.8.2/go.mod h1:pBGHaFt/yW7bf1jjWAoUjpSNoDnw98KTMg+jWWvziqU= +github.com/pion/rtp v1.8.3 h1:VEHxqzSVQxCkKDSHro5/4IUUG1ea+MFdqR2R3xSpNU8= github.com/pion/rtp v1.8.3/go.mod h1:pBGHaFt/yW7bf1jjWAoUjpSNoDnw98KTMg+jWWvziqU= github.com/pion/sctp v1.8.5/go.mod h1:SUFFfDpViyKejTAdwD1d/HQsCu+V/40cCs2nZIvC3s0= github.com/pion/sctp v1.8.8/go.mod h1:igF9nZBrjh5AtmKc7U30jXltsFHicFCXSmWA2GWRaWs= +github.com/pion/sctp v1.8.9 h1:TP5ZVxV5J7rz7uZmbyvnUvsn7EJ2x/5q9uhsTtXbI3g= github.com/pion/sctp v1.8.9/go.mod h1:cMLT45jqw3+jiJCrtHVwfQLnfR0MGZ4rgOJwUOIqLkI= +github.com/pion/sdp/v3 v3.0.6 h1:WuDLhtuFUUVpTfus9ILC4HRyHsW6TdugjEX/QY9OiUw= github.com/pion/sdp/v3 v3.0.6/go.mod h1:iiFWFpQO8Fy3S5ldclBkpXqmWy02ns78NOKoLLL0YQw= +github.com/pion/srtp/v2 v2.0.18 h1:vKpAXfawO9RtTRKZJbG4y0v1b11NZxQnxRl85kGuUlo= github.com/pion/srtp/v2 v2.0.18/go.mod h1:0KJQjA99A6/a0DOVTu1PhDSw0CXF2jTkqOoMg3ODqdA= +github.com/pion/stun v0.6.1 h1:8lp6YejULeHBF8NmV8e2787BogQhduZugh5PdhDyyN4= github.com/pion/stun v0.6.1/go.mod h1:/hO7APkX4hZKu/D0f2lHzNyvdkTGtIy3NDmLR7kSz/8= github.com/pion/transport v0.14.1/go.mod h1:4tGmbk00NeYA3rUa9+n+dzCCoKkcy3YlYb99Jn2fNnI= github.com/pion/transport/v2 v2.2.1/go.mod h1:cXXWavvCnFF6McHTft3DWS9iic2Mftcz1Aq29pGcU5g= github.com/pion/transport/v2 v2.2.2/go.mod h1:OJg3ojoBJopjEeECq2yJdXH9YVrUJ1uQ++NjXLOUorc= github.com/pion/transport/v2 v2.2.3/go.mod h1:q2U/tf9FEfnSBGSW6w5Qp5PFWRLRj3NjLhCCgpRK4p0= +github.com/pion/transport/v2 v2.2.4 h1:41JJK6DZQYSeVLxILA2+F4ZkKb4Xd/tFJZRFZQ9QAlo= github.com/pion/transport/v2 v2.2.4/go.mod h1:q2U/tf9FEfnSBGSW6w5Qp5PFWRLRj3NjLhCCgpRK4p0= github.com/pion/transport/v3 v3.0.1/go.mod h1:UY7kiITrlMv7/IKgd5eTUcaahZx5oUN3l9SzK5f5xE0= github.com/pion/turn/v2 v2.1.3/go.mod h1:huEpByKKHix2/b9kmTAM3YoX6MKP+/D//0ClgUYR2fY= +github.com/pion/turn/v2 v2.1.4 h1:2xn8rduI5W6sCZQkEnIUDAkrBQNl2eYIBCHMZ3QMmP8= github.com/pion/turn/v2 v2.1.4/go.mod h1:huEpByKKHix2/b9kmTAM3YoX6MKP+/D//0ClgUYR2fY= +github.com/pion/webrtc/v3 v3.2.23 h1:GbqEuxBbVLFhXk0GwxKAoaIJYiEa9TyoZPEZC+2HZxM= github.com/pion/webrtc/v3 v3.2.23/go.mod h1:1CaT2fcZzZ6VZA+O1i9yK2DU4EOcXVvSbWG9pr5jefs= github.com/pkg/browser v0.0.0-20210115035449-ce105d075bb4/go.mod h1:N6UoU20jOqggOuDwUaBQpluzLNDqif3kq9z2wpdYEfQ= +github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8 h1:KoWmjvw+nsYOo29YJK9vDA65RGE3NrOnUtO7a+RF9HU= github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e h1:aoZm08cpOy4WuID//EZDgcC4zIxODThtZNPirFr42+A= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1-0.20171018195549-f15c970de5b7/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA= @@ -1605,8 +2121,10 @@ github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZ github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= github.com/pkg/term v0.0.0-20180730021639-bffc007b7fd5/go.mod h1:eCbImbZ95eXtAUIbLAuAVnBnwf83mjf6QIVH8SHYwqQ= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= +github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF4JjgDlrVEn3C11VoGHZN7m8qihwgMEtzYw= github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= +github.com/prashantv/gostub v1.1.0 h1:BTyx3RfQjRHnUWaGF9oQos79AlQ5k8WNktv7VGvVH4g= github.com/prashantv/gostub v1.1.0/go.mod h1:A5zLQHz7ieHGG7is6LLXLz7I8+3LZzsrV0P1IAHhP5U= github.com/prometheus/client_golang v0.0.0-20180209125602-c332b6f63c06/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= @@ -1660,6 +2178,7 @@ github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1 github.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4= github.com/prometheus/prom2json v1.3.0 h1:BlqrtbT9lLH3ZsOVhXPsHzFrApCTKRifB7gjJuypu6Y= github.com/prometheus/prom2json v1.3.0/go.mod h1:rMN7m0ApCowcoDlypBHlkNbp5eJQf/+1isKykIP5ZnM= +github.com/prometheus/tsdb v0.7.1 h1:YZcsG11NqnK4czYLrWd9mpEuAJIHVQLwdrleYfszMAA= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= github.com/prometheus/tsdb v0.10.0/go.mod h1:oi49uRhEe9dPUTlS3JRZOwJuVi6tmh10QSgwXEyGCt4= github.com/protolambda/bls12-381-util v0.0.0-20210720105258-a772f2aac13e/go.mod h1:MPZvj2Pr0N8/dXyTPS5REeg2sdLG7t8DRzC1rLv925w= @@ -1669,6 +2188,7 @@ github.com/protolambda/messagediff v1.4.0/go.mod h1:LboJp0EwIbJsePYpzh5Op/9G1/4m github.com/prysmaticlabs/go-bitfield v0.0.0-20210108222456-8e92c3709aa0/go.mod h1:hCwmef+4qXWjv0jLDbQdWnL0Ol7cS7/lCSS26WR+u6s= github.com/prysmaticlabs/prombbolt v0.0.0-20210126082820-9b7adba6db7c h1:9PHRCuO/VN0s9k+RmLykho7AjDxblNYI5bYKed16NPU= github.com/prysmaticlabs/prombbolt v0.0.0-20210126082820-9b7adba6db7c/go.mod h1:ZRws458tYHS/Zs936OQ6oCrL+Ict5O4Xpwve1UQ6C9M= +github.com/prysmaticlabs/protoc-gen-go-cast v0.0.0-20230228205207-28762a7b9294 h1:q9wE0ZZRdTUAAeyFP/w0SwBEnCqlVy2+on6X2/e+eAU= github.com/prysmaticlabs/protoc-gen-go-cast v0.0.0-20230228205207-28762a7b9294/go.mod h1:ZVEbRdnMkGhp/pu35zq4SXxtvUwWK0J1MATtekZpH2Y= github.com/quic-go/qtls-go1-18 v0.2.0/go.mod h1:moGulGHK7o6O8lSPSZNoOwcLvJKJ85vVNc7oJFD65bc= github.com/quic-go/qtls-go1-19 v0.3.3/go.mod h1:ySOI96ew8lnoKPtSqx2BlI5wCpUVPT05RMAlajtnyOI= @@ -1685,19 +2205,26 @@ github.com/rivo/tview v0.0.0-20221117065207-09f052e6ca98/go.mod h1:YX2wUZOcJGOIy github.com/rivo/uniseg v0.4.2/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/rjeczalik/notify v0.9.1/go.mod h1:rKwnCoCGeuQnwBtTSPL9Dad03Vh2n40ePRrjvIXnJho= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= +github.com/rogpeppe/fastuuid v1.2.0 h1:Ppwyp6VYCF1nvBTXL3trRso7mXMlRrw9ooo375wvi2s= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= github.com/rogpeppe/go-internal v1.8.1/go.mod h1:JeRgkft04UBgHMgCIwADu4Pn6Mtm5d4nPKWu0nJ5d+o= github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= +github.com/russross/blackfriday v1.6.0 h1:KqfZb0pUVN2lYqZUYRddxF4OR8ZMURnJIG5Y3VRLtww= +github.com/russross/blackfriday v1.6.0/go.mod h1:ti0ldHuxg49ri4ksnFxlkCfN+hvslNlmVHqNRXXJNAY= github.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w= +github.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245 h1:K1Xf3bKttbF+koVGaX5xngRIZ5bVjbmPnaxE/dR08uY= github.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/ryanuber/columnize v2.1.0+incompatible h1:j1Wcmh8OrK4Q7GXY+V7SVSY8nUWQxHW5TkBe7YUl+2s= github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/safchain/ethtool v0.0.0-20190326074333-42ed695e3de8/go.mod h1:Z0q5wiBQGYcxhMZ6gUqHn6pYNLypFAvaL3UvgZLR0U4= github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= +github.com/sanity-io/litter v1.5.5 h1:iE+sBxPBzoK6uaEP5Lt3fHNgpKcHXc/A2HGETy0uJQo= github.com/sanity-io/litter v1.5.5/go.mod h1:9gzJgR2i4ZpjZHsKvUXIRQVk7P+yM3e+jAF7bU2UI5U= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= +github.com/schollz/closestmatch v2.1.0+incompatible h1:Uel2GXEpJqOWBrlyI+oY9LTiyyjYS17cCYRqP13/SHk= github.com/schollz/closestmatch v2.1.0+incompatible/go.mod h1:RtP1ddjLong6gTkbtmuhtR2uUrrJOpYzYRvbcPAid+g= github.com/schollz/progressbar/v3 v3.3.4 h1:nMinx+JaEm/zJz4cEyClQeAw5rsYSB5th3xv+5lV6Vg= github.com/schollz/progressbar/v3 v3.3.4/go.mod h1:Rp5lZwpgtYmlvmGo1FyDwXMqagyRBQYSDwzlP9QDu84= @@ -1708,9 +2235,33 @@ github.com/seccomp/libseccomp-golang v0.9.1/go.mod h1:GbW5+tmTXfcxTToHLXlScSlAvW github.com/seccomp/libseccomp-golang v0.9.2-0.20220502022130-f33da4d89646/go.mod h1:JA8cRccbGaA1s33RQf7Y1+q9gHmZX1yB/z9WDN1C6fg= github.com/segmentio/kafka-go v0.1.0/go.mod h1:X6itGqS9L4jDletMsxZ7Dz+JFWxM6JHfPOCvTvk+EJo= github.com/segmentio/kafka-go v0.2.0/go.mod h1:X6itGqS9L4jDletMsxZ7Dz+JFWxM6JHfPOCvTvk+EJo= +github.com/sergi/go-diff v1.0.0 h1:Kpca3qRNrduNnOQeazBd0ysaKrUJiIuISHxogkT9RPQ= github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= +github.com/shirou/gopsutil/v3 v3.23.2 h1:PAWSuiAszn7IhPMBtXsbSCafej7PqUOvY6YywlQUExU= github.com/shirou/gopsutil/v3 v3.23.2/go.mod h1:gv0aQw33GLo3pG8SiWKiQrbDzbRY1K80RyZJ7V4Th1M= +github.com/shurcooL/component v0.0.0-20170202220835-f88ec8f54cc4 h1:Fth6mevc5rX7glNLpbAMJnqKlfIkcTjZCSHEeqvKbcI= +github.com/shurcooL/events v0.0.0-20181021180414-410e4ca65f48 h1:vabduItPAIz9px5iryD5peyx7O3Ya8TBThapgXim98o= +github.com/shurcooL/github_flavored_markdown v0.0.0-20181002035957-2122de532470 h1:qb9IthCFBmROJ6YBS31BEMeSYjOscSiG+EO+JVNTz64= +github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e h1:MZM7FHLqUHYI0Y/mQAt3d2aYa0SiNms/hFqC9qJYolM= +github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041 h1:llrF3Fs4018ePo4+G/HV/uQUqEI1HMDjCeOf2V6puPc= +github.com/shurcooL/gofontwoff v0.0.0-20180329035133-29b52fc0a18d h1:Yoy/IzG4lULT6qZg62sVC+qyBL8DQkmD2zv6i7OImrc= +github.com/shurcooL/gopherjslib v0.0.0-20160914041154-feb6d3990c2c h1:UOk+nlt1BJtTcH15CT7iNO7YVWTfTv/DNwEAQHLIaDQ= +github.com/shurcooL/highlight_diff v0.0.0-20170515013008-09bb4053de1b h1:vYEG87HxbU6dXj5npkeulCS96Dtz5xg3jcfCgpcvbIw= +github.com/shurcooL/highlight_go v0.0.0-20181028180052-98c3abbbae20 h1:7pDq9pAMCQgRohFmd25X8hIH8VxmT3TaDm+r9LHxgBk= +github.com/shurcooL/home v0.0.0-20181020052607-80b7ffcb30f9 h1:MPblCbqA5+z6XARjScMfz1TqtJC7TuTRj0U9VqIBs6k= +github.com/shurcooL/htmlg v0.0.0-20170918183704-d01228ac9e50 h1:crYRwvwjdVh1biHzzciFHe8DrZcYrVcZFlJtykhRctg= +github.com/shurcooL/httperror v0.0.0-20170206035902-86b7830d14cc h1:eHRtZoIi6n9Wo1uR+RU44C247msLWwyA89hVKwRLkMk= +github.com/shurcooL/httpfs v0.0.0-20171119174359-809beceb2371 h1:SWV2fHctRpRrp49VXJ6UZja7gU9QLHwRpIPBN89SKEo= +github.com/shurcooL/httpgzip v0.0.0-20180522190206-b1c53ac65af9 h1:fxoFD0in0/CBzXoyNhMTjvBZYW6ilSnTw7N7y/8vkmM= +github.com/shurcooL/issues v0.0.0-20181008053335-6292fdc1e191 h1:T4wuULTrzCKMFlg3HmKHgXAF8oStFb/+lOIupLV2v+o= +github.com/shurcooL/issuesapp v0.0.0-20180602232740-048589ce2241 h1:Y+TeIabU8sJD10Qwd/zMty2/LEaT9GNDaA6nyZf+jgo= +github.com/shurcooL/notifications v0.0.0-20181007000457-627ab5aea122 h1:TQVQrsyNaimGwF7bIhzoVC9QkKm4KsWd8cECGzFx8gI= +github.com/shurcooL/octicon v0.0.0-20181028054416-fa4f57f9efb2 h1:bu666BQci+y4S0tVRVjsHUeRon6vUXmsGBwdowgMrg4= +github.com/shurcooL/reactions v0.0.0-20181006231557-f2e0b4ca5b82 h1:LneqU9PHDsg/AkPDU3AkqMxnMYL+imaqkpflHu73us8= +github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo= +github.com/shurcooL/users v0.0.0-20180125191416-49c67e49c537 h1:YGaxtkYjb8mnTvtufv2LKLwCQu2/C7qFB7UtrOlTWOY= +github.com/shurcooL/webdavfs v0.0.0-20170829043945-18c3829fa133 h1:JtcyT0rk/9PKOdnKQzuDR+FSjh7SGtJwpgVpfZBRKlQ= github.com/sirupsen/logrus v1.0.4-0.20170822132746-89742aefa4b2/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= github.com/sirupsen/logrus v1.0.6/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= @@ -1719,26 +2270,35 @@ github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6Mwd github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/soheilhy/cmux v0.1.4 h1:0HKaf1o97UwFjHH9o5XsHUOF+tqmdA7KEzXLpiyaw0E= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= +github.com/sourcegraph/annotate v0.0.0-20160123013949-f4cad6c6324d h1:yKm7XZV6j9Ev6lojP2XaIshpT4ymkqhMeSghO5Ps00E= +github.com/sourcegraph/syntaxhighlight v0.0.0-20170531221838-bd320f5d308e h1:qpG93cPwA5f7s/ZPBJnGOYQNK/vKsaDaseuKT5Asee8= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v0.0.0-20170901052352-ee1bd8ee15a1/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/afero v1.3.3/go.mod h1:5KUK8ByomD5Ti5Artl0RtHeI5pTF7MIDuXL3yY520V4= github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= github.com/spf13/afero v1.9.2/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y= +github.com/spf13/afero v1.10.0 h1:EaGW2JJh15aKOejeuJ+wpFSHnbd7GE6Wvp3TsNhb6LY= github.com/spf13/afero v1.10.0/go.mod h1:UBogFpq8E9Hx+xc5CNTTEpTnuHVmXDwZcZcE1eb/UhQ= github.com/spf13/cast v1.1.0/go.mod h1:r2rcYCSwa1IExKTDiTfzaxqT2FNHs8hODu4LnUfgKEg= +github.com/spf13/cast v1.3.0 h1:oget//CVOEoFewqQxwr0Ej5yjygnqGkvggSE/gB35Q8= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cobra v0.0.2-0.20171109065643-2da4a54c5cee/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= +github.com/spf13/cobra v1.5.0 h1:X+jTBEBqF0bHN+9cSMgmfuvv2VHJ9ezmFNf9Y/XstYU= github.com/spf13/cobra v1.5.0/go.mod h1:dWXEIy2H428czQCjInthrTRUg7yKbok+2Qi/yBIJoUM= github.com/spf13/jwalterweatherman v0.0.0-20170901151539-12bd96e66386/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= +github.com/spf13/jwalterweatherman v1.0.0 h1:XHEdyB+EcvlqZamSM4ZOMGlc93t6AcsBEu9Gc1vn7yk= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/pflag v1.0.1-0.20170901120850-7aff26db30c1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.1-0.20171106142849-4c012f6dcd95/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= @@ -1747,10 +2307,14 @@ github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnIn github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/viper v1.0.0/go.mod h1:A8kyI5cUJhb8N+3pkfONlcEcZbueH6nhAm0Fq7SrnBM= github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= +github.com/spf13/viper v1.4.0 h1:yXHLWeravcrgGyFSyCgdYpXQ9dR9c/WED3pg1RhxqEU= github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= +github.com/spkg/bom v0.0.0-20160624110644-59b7046e48ad h1:fiWzISvDn0Csy5H0iwgAuJGQTUpVfEMJJd4nRFXogbc= github.com/spkg/bom v0.0.0-20160624110644-59b7046e48ad/go.mod h1:qLr4V1qq6nMqFKkMo8ZTx3f+BZEkzsRUY10Xsm2mwU0= github.com/status-im/keycard-go v0.0.0-20190316090335-8537d3370df4/go.mod h1:RZLeN1LMWmRsyYjvAu+I6Dm9QmlDaIIt+Y+4Kd7Tp+Q= +github.com/stefanberger/go-pkcs11uri v0.0.0-20201008174630-78d3cae3a980 h1:lIOOHPEbXzO3vnmx2gok1Tfs31Q8GQqKLc8vVqyQq/I= github.com/stefanberger/go-pkcs11uri v0.0.0-20201008174630-78d3cae3a980/go.mod h1:AO3tvPzVZ/ayst6UlUKUv6rcPQInYe3IknH3jYhAKu8= +github.com/stoewer/go-strcase v1.2.0 h1:Z2iHWqGXH00XYgqDmNgQbIBxf3wrNq0F3feEy0ainaU= github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= @@ -1758,6 +2322,7 @@ github.com/stretchr/objx v0.0.0-20180129172003-8a3f7159479f/go.mod h1:HFkY916IF+ github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v0.0.0-20180303142811-b89eecf5ca5d/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.0/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= @@ -1772,9 +2337,14 @@ github.com/syndtr/gocapability v0.0.0-20180916011248-d98352740cb2/go.mod h1:hkRG github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ= github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc= +github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07 h1:UyzmZLoiDWMRywV4DUYb9Fbt8uiOSooupjTq10vpvnU= +github.com/tchap/go-patricia v2.2.6+incompatible h1:JvoDL7JSoIP2HDE8AbDH3zC8QBPxmzYe32HHy5yQ+Ck= github.com/tchap/go-patricia v2.2.6+incompatible/go.mod h1:bmLyhP68RS6kStMGxByiQ23RP/odRBOTVjwp2cDyi6I= +github.com/tdewolff/minify/v2 v2.12.4 h1:kejsHQMM17n6/gwdw53qsi6lg0TGddZADVyQOz1KMdE= github.com/tdewolff/minify/v2 v2.12.4/go.mod h1:h+SRvSIX3kwgwTFOpSckvSxgax3uy8kZTSF1Ojrr3bk= +github.com/tdewolff/parse/v2 v2.6.4 h1:KCkDvNUMof10e3QExio9OPZJT8SbdKojLBumw8YZycQ= github.com/tdewolff/parse/v2 v2.6.4/go.mod h1:woz0cgbLwFdtbjJu8PIKxhW05KplTFQkOdX78o+Jgrs= +github.com/tdewolff/test v1.0.7 h1:8Vs0142DmPFW/bQeHRP3MV19m1gvndjUb1sn8yy74LM= github.com/tdewolff/test v1.0.7/go.mod h1:6DAvZliBAAnD7rhVgwaM7DE5/d9NMOAJ09SqYqeK4QE= github.com/templexxx/cpufeat v0.0.0-20180724012125-cef66df7f161/go.mod h1:wM7WEvslTq+iOEAMDLSzhVuOt5BRZ05WirO+b09GHQU= github.com/templexxx/xor v0.0.0-20191217153810-f85b25db303b/go.mod h1:5XA7W9S6mni3h5uvOC75dA3m9CCCaS83lltmc0ukdi4= @@ -1788,6 +2358,7 @@ github.com/tklauser/numcpus v0.2.2/go.mod h1:x3qojaO3uyYt0i56EW/VUYs7uBvdl2fkfZF github.com/tklauser/numcpus v0.4.0/go.mod h1:1+UI3pD8NW14VMwdgJNJ1ESk2UnwhAnz5hMwiKKqXCQ= github.com/tklauser/numcpus v0.5.0/go.mod h1:OGzpTxpcIMNGYQdit2BYL1pvk/dSOaJWjKoflh+RQjo= github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5 h1:LnC5Kc/wtumK+WB441p7ynQJzVuNRJiqddSIE3IlSEQ= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/trailofbits/go-mutexasserts v0.0.0-20230328101604-8cdbc5f3d279 h1:+LynomhWB+14Plp/bOONEAZCtvCZk4leRbTvNzNVkL0= github.com/trailofbits/go-mutexasserts v0.0.0-20230328101604-8cdbc5f3d279/go.mod h1:GA3+Mq3kt3tYAfM0WZCu7ofy+GW9PuGysHfhr+6JX7s= @@ -1808,29 +2379,42 @@ github.com/urfave/cli/v2 v2.17.2-0.20221006022127-8f469abc00aa/go.mod h1:1CNUng3 github.com/urfave/cli/v2 v2.23.5/go.mod h1:GHupkWPMM0M/sj1a2b4wUrWBPzazNrIjouW6fmdJLxc= github.com/urfave/cli/v2 v2.23.7/go.mod h1:GHupkWPMM0M/sj1a2b4wUrWBPzazNrIjouW6fmdJLxc= github.com/urfave/cli/v2 v2.24.1/go.mod h1:GHupkWPMM0M/sj1a2b4wUrWBPzazNrIjouW6fmdJLxc= +github.com/urfave/negroni v1.0.0 h1:kIimOitoypq34K7TG7DUaJ9kq/N4Ofuwi1sjz0KipXc= github.com/urfave/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4= +github.com/uudashr/gocognit v1.0.5 h1:rrSex7oHr3/pPLQ0xoWq108XMU8s678FJcQ+aSfOHa4= github.com/uudashr/gocognit v1.0.5/go.mod h1:wgYz0mitoKOTysqxTDMOUXg+Jb5SvtihkfmugIZYpEA= +github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/valyala/fasthttp v1.6.0/go.mod h1:FstJa9V+Pj9vQ7OJie2qMHdwemEDaDiSdBnvPM1Su9w= +github.com/valyala/fasthttp v1.40.0 h1:CRq/00MfruPGFLTQKY8b+8SfdK60TxNztjRMnH0t1Yc= github.com/valyala/fasthttp v1.40.0/go.mod h1:t/G+3rLek+CyY9bnIE+YlMRddxVAAGjhxndDB4i4C0I= github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= +github.com/valyala/fasttemplate v1.2.2 h1:lxLXG0uE3Qnshl9QyaK6XJxMXlQZELvChBOCmQD0Loo= github.com/valyala/fasttemplate v1.2.2/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio= +github.com/valyala/tcplisten v1.0.0 h1:rBHj/Xf+E1tRGZyWIWwJDiRY0zc1Js+CV5DqwacVSA8= github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc= +github.com/viant/assertly v0.4.8 h1:5x1GzBaRteIwTr5RAGFVG14uNeRFxVNbXPWrK2qAgpc= +github.com/viant/toolbox v0.24.0 h1:6TteTDQ68CjgcCe8wH3D3ZhUQQOJXMTbj/D9rkk2a1k= github.com/vishvananda/netlink v0.0.0-20181108222139-023a6dafdcdf/go.mod h1:+SR5DhBJrl6ZM7CoCKvpw5BKroDKQ+PJqOg65H/2ktk= github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE= github.com/vishvananda/netlink v1.1.1-0.20201029203352-d40f9887b852/go.mod h1:twkDnbuQxJYemMlGd4JFIcuhgX83tXhKS2B/PRMpOho= +github.com/vishvananda/netlink v1.1.1-0.20210330154013-f5de75959ad5 h1:+UB2BJA852UkGH42H+Oee69djmxS3ANzl2b/JtT1YiA= github.com/vishvananda/netlink v1.1.1-0.20210330154013-f5de75959ad5/go.mod h1:twkDnbuQxJYemMlGd4JFIcuhgX83tXhKS2B/PRMpOho= github.com/vishvananda/netns v0.0.0-20180720170159-13995c7128cc/go.mod h1:ZjcWmFBXmLKZu9Nxj3WKYEafiSqer2rnvPr0en9UNpI= github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU= github.com/vishvananda/netns v0.0.0-20200728191858-db3c7e526aae/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= +github.com/vishvananda/netns v0.0.0-20210104183010-2eb08e3e575f h1:p4VB7kIXpOQvVn1ZaTIVp+3vuYAXFe3OJEvjbUYJLaA= github.com/vishvananda/netns v0.0.0-20210104183010-2eb08e3e575f/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= +github.com/vmihailenco/msgpack/v5 v5.3.5 h1:5gO0H1iULLWGhs2H5tbAHIZTV8/cYafcFOr9znI5mJU= github.com/vmihailenco/msgpack/v5 v5.3.5/go.mod h1:7xyJ9e+0+9SaZT0Wt1RGleJXzli6Q/V5KbhBonMG9jc= +github.com/vmihailenco/tagparser/v2 v2.0.0 h1:y09buUbR+b5aycVFQs/g70pqKVZNBmxwAhO7/IwNM9g= github.com/vmihailenco/tagparser/v2 v2.0.0/go.mod h1:Wri+At7QHww0WTrCBeu4J6bNtoV6mEfg5OIWRZA9qds= github.com/wealdtech/go-bytesutil v1.1.1/go.mod h1:jENeMqeTEU8FNZyDFRVc7KqBdRKSnJ9CCh26TcuNb9s= github.com/wealdtech/go-eth2-types/v2 v2.5.2/go.mod h1:8lkNUbgklSQ4LZ2oMSuxSdR7WwJW3L9ge1dcoCVyzws= github.com/wealdtech/go-eth2-util v1.6.3/go.mod h1:0hFMj/qtio288oZFHmAbCnPQ9OB3c4WFzs5NVPKTY4k= +github.com/wealdtech/go-eth2-wallet-encryptor-keystorev4 v1.1.3 h1:SxrDVSr+oXuT1x8kZt4uWqNCvv5xXEGV9zd7cuSrZS8= github.com/wealdtech/go-eth2-wallet-encryptor-keystorev4 v1.1.3/go.mod h1:qiIimacW5NhVRy8o+YxWo9YrecXqDAKKbL0+sOa0SJ4= github.com/wealdtech/go-eth2-wallet-types/v2 v2.8.2/go.mod h1:k6kmiKWSWBTd4OxFifTEkPaBLhZspnO2KFD5XJY9nqg= github.com/willf/bitset v1.1.3/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4= @@ -1838,29 +2422,43 @@ github.com/willf/bitset v1.1.11-0.20200630133818-d5bec3311243/go.mod h1:RjeCKbqT github.com/willf/bitset v1.1.11/go.mod h1:83CECat5yLh5zVOf4P1ErAgKA5UDvKtgyUABdr3+MjI= github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c/go.mod h1:lB8K/P019DLNhemzwFU4jHLhdvlE6uDZjXFejJXr49I= github.com/xdg/stringprep v1.0.0/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y= +github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f h1:J9EGpcZtP0E/raorCMxlFGSTBrsSlaDGf3jU/qvAE2c= github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0= github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= github.com/xeipuuv/gojsonschema v0.0.0-20180618132009-1d523034197f/go.mod h1:5yf86TLmAcydyeJq5YvxkGPE2fm/u4myDekKRoLuqhs= +github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74= github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= +github.com/xhit/go-str2duration v1.2.0 h1:BcV5u025cITWxEQKGWr1URRzrcXtu7uk8+luz3Yuhwc= github.com/xhit/go-str2duration v1.2.0/go.mod h1:3cPSlfZlUHVlneIVfePFWcJZsuwf+P1v2SRTV4cUmp4= +github.com/xhit/go-str2duration/v2 v2.1.0 h1:lxklc02Drh6ynqX+DdPyp5pCKLUQpRT8bp8Ydu2Bstc= github.com/xhit/go-str2duration/v2 v2.1.0/go.mod h1:ohY8p+0f07DiV6Em5LKB0s2YpLtXVyJfNt1+BlmyAsU= +github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2 h1:eY9dn8+vbi4tKz5Qo6v2eYzo7kUS51QINcR5jNpbZS8= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xlab/treeprint v0.0.0-20180616005107-d6fb6747feb6/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg= +github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77 h1:ESFSdwYZvkeru3RtdrYueztKhOBCSAAzS4Gf+k0tEow= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= github.com/xtaci/kcp-go v5.4.20+incompatible/go.mod h1:bN6vIwHQbfHaHtFpEssmWsN45a+AZwO7eyRCmEIbtvE= github.com/xtaci/lossyconn v0.0.0-20190602105132-8df528c0c9ae/go.mod h1:gXtu8J62kEgmN++bm9BVICuT/e8yiLI2KFobd/TRFsE= +github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0 h1:6fRhSjgLCkTD3JnJxvaJ4Sj+TYblw757bqYgZaOq5ZY= github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0/go.mod h1:/LWChgwKmvncFJFHJ7Gvn9wZArjbV5/FppcK2fKk/tI= +github.com/yosssi/ace v0.0.5 h1:tUkIP/BLdKqrlrPwcmH0shwEEhTRHoGnc1wFIWmaBUA= github.com/yosssi/ace v0.0.5/go.mod h1:ALfIzm2vT7t5ZE7uoIZqF3TQ7SAOyupFZnkrF5id+K0= +github.com/yudai/gojsondiff v1.0.0 h1:27cbfqXLVEJ1o8I6v3y9lg8Ydm53EKqHXAOMxEGlCOA= github.com/yudai/gojsondiff v1.0.0/go.mod h1:AY32+k2cwILAkW1fbgxQ5mUmMiZFgLIV+FBNExI05xg= +github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82 h1:BHyfKlQyqbsFN5p3IfnEUduWvb9is428/nNb5L3U01M= github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82/go.mod h1:lgjkn3NuSvDfVJdfcVVdX+jpBxNmX4rDAzaS45IcYoM= +github.com/yudai/pp v2.0.1+incompatible h1:Q4//iY4pNF6yPLZIigmvcl7k/bPgrcTPIFIcmawg5bI= github.com/yudai/pp v2.0.1+incompatible/go.mod h1:PuxR/8QJ7cyCkFp/aUDS+JY727OFEZkTdatxwunjIkc= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.13 h1:fVcFKWvrslecOb/tg+Cc05dkeYx540o0FuFt3nUVDoE= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/yvasiyarov/go-metrics v0.0.0-20140926110328-57bccd1ccd43/go.mod h1:aX5oPXxHm3bOH+xeAttToC8pqch2ScQN/JoXYupl6xs= github.com/yvasiyarov/gorelic v0.0.0-20141212073537-a9bba5b9ab50/go.mod h1:NUSPSUX/bi6SeDMUh6brw0nXpxHnc96TguQh0+r/ssA= github.com/yvasiyarov/newrelic_platform_go v0.0.0-20140908184405-b21fdbd4370f/go.mod h1:GlGEuHIJweS1mbCqG+7vt2nvWLzLLnRHbXz5JKd/Qbg= +github.com/zeebo/xxh3 v1.0.2 h1:xZmwmqxHZA8AI603jOQ0tMqmBr9lPeFwGg6d+xy9DC0= github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= @@ -1871,28 +2469,39 @@ go.etcd.io/bbolt v1.3.7/go.mod h1:N9Mkw9X8x5fupy0IKsmuqVtoGDyxsaDlbk4Rd05IAQw= go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= go.etcd.io/etcd v0.5.0-alpha.5.0.20200910180754-dd1b699fc489/go.mod h1:yVHk9ub3CSBatqGNg7GRmsnfLWtoW60w4eDYfh7vHDg= go.etcd.io/gofail v0.1.0/go.mod h1:VZBCXYGZhHAinaBiiqYvuDynvahNsAyLFwB3kEHKz1M= +go.mozilla.org/pkcs7 v0.0.0-20200128120323-432b2356ecb1 h1:A/5uWzF44DlIgdm/PQFwfMkW0JX+cIcQi/SwLAmZP5M= go.mozilla.org/pkcs7 v0.0.0-20200128120323-432b2356ecb1/go.mod h1:SNgMg+EgDFwmvSmLRTNKC5fegJjB7v23qTQ0XLGUNHk= go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.28.0 h1:Ky1MObd188aGbgb5OgNnwGuEEwI9MVIcc7rBW6zk5Ak= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.28.0/go.mod h1:vEhqr0m4eTc+DWxfsXoXue2GBgV2uUwVznkGIHW/e5w= +go.opentelemetry.io/otel v1.6.3 h1:FLOfo8f9JzFVFVyU+MSRJc2HdEAXQgm7pIv2uFKRSZE= go.opentelemetry.io/otel v1.6.3/go.mod h1:7BgNga5fNlF/iZjG06hM3yofffp0ofKCDwSXx1GC4dI= +go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.3.0 h1:R/OBkMoGgfy2fLhs2QhkCI1w4HLEQX92GCcJB6SSdNk= go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.3.0/go.mod h1:VpP4/RMn8bv8gNo9uK7/IMY4mtWLELsS+JIP0inH0h4= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.3.0 h1:giGm8w67Ja7amYNfYMdme7xSp2pIxThWopw8+QP51Yk= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.3.0/go.mod h1:hO1KLR7jcKaDDKDkvI9dP/FIhpmna5lkqPUQdEjFAM8= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.3.0 h1:VQbUHoJqytHHSJ1OZodPH9tvZZSVzUHjPHpkO85sT6k= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.3.0/go.mod h1:keUU7UfnwWTWpJ+FWnyqmogPa82nuU5VUANFq49hlMY= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.3.0 h1:Ydage/P0fRrSPpZeCVxzjqGcI6iVmG2xb43+IR8cjqM= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.3.0/go.mod h1:QNX1aly8ehqqX1LEa6YniTU7VY9I6R3X/oPxhGdTceE= +go.opentelemetry.io/otel/sdk v1.3.0 h1:3278edCoH89MEJ0Ky8WQXVmDQv3FX4ZJ3Pp+9fJreAI= go.opentelemetry.io/otel/sdk v1.3.0/go.mod h1:rIo4suHNhQwBIPg9axF8V9CA72Wz2mKF1teNrup8yzs= +go.opentelemetry.io/otel/trace v1.6.3 h1:IqN4L+5b0mPNjdXIiZ90Ni4Bl5BRkDQywePLWemd9bc= go.opentelemetry.io/otel/trace v1.6.3/go.mod h1:GNJQusJlUgZl9/TQBPKU/Y/ty+0iVB5fjhKeJGZPGFs= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.opentelemetry.io/proto/otlp v0.11.0/go.mod h1:QpEjXPrNQzrFDZgoTo49dgHR9RYRSrg3NAKnUGl9YpQ= go.opentelemetry.io/proto/otlp v0.15.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= +go.opentelemetry.io/proto/otlp v0.19.0 h1:IVN6GR+mhC4s5yfcTbmzHYODqvWAp3ZedA2SJPI1Nnw= go.opentelemetry.io/proto/otlp v0.19.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= +go.uber.org/automaxprocs v1.5.2 h1:2LxUOGiR3O6tw8ui5sZa2LAaHnsviZdVOUZw4fvbnME= go.uber.org/automaxprocs v1.5.2/go.mod h1:eRbA25aqJrxAbsLO0xy5jVwPt7FQnRgjW+efnwa1WM0= go.uber.org/dig v1.17.0/go.mod h1:rTxpf7l5I0eBTlE6/9RL+lDybC7WFwY2QH55ZSjy1mU= go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= @@ -1909,6 +2518,8 @@ go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= go.uber.org/zap v1.14.1/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc= go.uber.org/zap v1.23.0/go.mod h1:D+nX8jyLsMHMYrln8A0rJjFt/T/9/bGgIhAqxv5URuY= go.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so= +go4.org v0.0.0-20180809161055-417644f6feb5 h1:+hE86LblG4AyDgwMCLTE6FOlM9+qjHSYS+rKqxUVdsM= +golang.org/x/build v0.0.0-20190111050920-041ab4dc3f9d h1:E2M5QgjZ/Jg+ObCQAudsXxuTsLj7Nl5RV/lZcQZmKSo= golang.org/x/crypto v0.0.0-20171113213409-9f005a07e0d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181009213950-7c1a557ab941/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= @@ -1966,6 +2577,7 @@ golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63/go.mod h1:0v4NqG35kSWCMzLaMe golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k= golang.org/x/exp v0.0.0-20231006140011-7918f672742d/go.mod h1:ldy0pHrwJyGW56pPQzzkH36rKxoZW1tw7ZJpeKx+hdo= golang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611/go.mod h1:iRJReGqOEeBhDZGkGbynYwcHlctCvnjTYIamk7uXpHI= +golang.org/x/exp/typeparams v0.0.0-20231108232855-2478ac86f678 h1:1P7xPZEwZMoBoz0Yze5Nx2/4pxj6nw9ZqHWXqP0iRgQ= golang.org/x/exp/typeparams v0.0.0-20231108232855-2478ac86f678/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= golang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= @@ -1975,9 +2587,12 @@ golang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+o golang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= +golang.org/x/image v0.0.0-20210628002857-a66eb6448b8d h1:RNPAfi2nHY7C2srAV8A49jpsYr0ADedCk1wq6fTMTvs= golang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 h1:VLliZ0d+/avPrXXH+OakdXhpJuEoBZuwh1m2j7U6Iug= golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028 h1:4+4C/Iv2U4fMZBiMCc98MG1In4gJY5YRhtpDNeDeHWs= golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= @@ -2087,6 +2702,7 @@ golang.org/x/oauth2 v0.7.0/go.mod h1:hPLQkd9LyjfXTiRohC/41GhcFqxisoUQ99sCUOHO9x4 golang.org/x/oauth2 v0.8.0/go.mod h1:yr7u4HXZRm1R1kBWqr/xKNqewf0plRYoB7sla+BCIXE= golang.org/x/oauth2 v0.10.0/go.mod h1:kTpgurOux7LqtuxjuyZa4Gj2gdezIt/jQtGnNFfypQI= golang.org/x/oauth2 v0.12.0/go.mod h1:A74bZ3aGXgCY0qaIC9Ahg6Lglin4AMAco8cIv9baba4= +golang.org/x/perf v0.0.0-20230113213139-801c7ef9e5c5 h1:ObuXPmIgI4ZMyQLIz48cJYgSyWdjUXc2SZAdyJMwEAU= golang.org/x/perf v0.0.0-20230113213139-801c7ef9e5c5/go.mod h1:UBKtEnL8aqnd+0JHqZ+2qoMDwtuy6cYhhKNoHLBiTQc= golang.org/x/sync v0.0.0-20170517211232-f52d1811a629/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -2219,6 +2835,7 @@ golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/telemetry v0.0.0-20240208230135-b75ee8823808/go.mod h1:KG1lNk5ZFNssSZLrpVb4sMXKMpGwGXOxSG3rnu2gZQQ= +golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2 h1:IRJeR9r1pYWsHKTRe/IInb7lYvbBVIqOgsX/u0mbOWY= golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2/go.mod h1:TeRTkGYfJXctD9OcfyVLyj2J3IxLnKwHJR8f4D8a3YE= golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= @@ -2319,16 +2936,20 @@ golang.org/x/tools v0.17.0/go.mod h1:xsh6VxdV005rRVaS6SSAf9oiAqljS7UZUacMZ8Bnsps golang.org/x/tools v0.18.0/go.mod h1:GL7B4CwcLLeo59yx/9UWWuNOW1n3VZ4f5axWfML7Lcg= golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 h1:H2TDz8ibqkAF6YGhCdN3jS9O0/s90v0rJh3X/OLHEUk= golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= gonum.org/v1/gonum v0.0.0-20181121035319-3f7ecaa7e8ca/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= gonum.org/v1/gonum v0.6.0/go.mod h1:9mxDZsDKxgMAuccQkewq682L+0eCu4dCN2yonUJTCLU= gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0= +gonum.org/v1/gonum v0.9.3 h1:DnoIG+QAMaF5NvxnGe/oKsgKcAc6PcUyl8q0VetfQ8s= gonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0= gonum.org/v1/netlib v0.0.0-20181029234149-ec6d1f5cefe6/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= +gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0 h1:OE9mWmgKkjJyEmDAAtGMPjXu+YNeGvK9VTSHY6+Qihc= gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= gonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY= +gonum.org/v1/plot v0.10.0 h1:ymLukg4XJlQnYUJCp+coQq5M7BsUJFk6XQE4HPflwdw= gonum.org/v1/plot v0.10.0/go.mod h1:JWIHJ7U20drSQb/aDpTetJzfC1KlAPldJLpkSy88dvQ= google.golang.org/api v0.0.0-20160322025152-9bf6e6e569ff/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= google.golang.org/api v0.0.0-20170206182103-3d017632ea10/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= @@ -2371,6 +2992,7 @@ google.golang.org/api v0.103.0/go.mod h1:hGtW6nK1AC+d9si/UBhw8Xli+QMOf6xyNAyJw4q google.golang.org/api v0.106.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= google.golang.org/api v0.110.0/go.mod h1:7FC4Vvx1Mooxh8C5HWjzZHcavuS2f6pmJpZx60ca7iI= google.golang.org/api v0.118.0/go.mod h1:76TtD3vkgmZ66zZzp72bUUklpmQmKlhh6sYtIjYK+5E= +google.golang.org/api v0.126.0 h1:q4GJq+cAdMAC7XP7njvQ4tvohGLiSlytuL4BQxbIZ+o= google.golang.org/api v0.126.0/go.mod h1:mBwVAtz+87bEN6CbA1GtZPDOqY2R5ONPqJeIlvyo4Aw= google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/cloud v0.0.0-20151119220103-975617b05ea8/go.mod h1:0H1ncTHf11KCFhTc/+EFRbzSCOZx+VUbRMk55Yv5MYk= @@ -2465,6 +3087,7 @@ google.golang.org/genproto v0.0.0-20230706204954-ccb25ca9f130/go.mod h1:O9kGHb51 google.golang.org/genproto/googleapis/api v0.0.0-20230526203410-71b5a4ffd15e/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= google.golang.org/genproto/googleapis/api v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= google.golang.org/genproto/googleapis/api v0.0.0-20230706204954-ccb25ca9f130/go.mod h1:mPBs5jNgx2GuQGvFwUvVKqtn6HsUw9nP64BedgvqEsQ= +google.golang.org/genproto/googleapis/bytestream v0.0.0-20230530153820-e85fd2cbaebc h1:g3hIDl0jRNd9PPTs2uBzYuaD5mQuwOkZY0vSc0LR32o= google.golang.org/genproto/googleapis/bytestream v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:ylj+BE99M198VPbBh6A8d9n3w8fChvyLK3wwBOjXBFA= google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234030-28d5490b6b19/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= google.golang.org/genproto/googleapis/rpc v0.0.0-20230526203410-71b5a4ffd15e/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= @@ -2513,6 +3136,7 @@ google.golang.org/grpc v1.54.0/go.mod h1:PUSEXI6iWghWaB6lXM4knEgpJNu2qUcKfDtNci3 google.golang.org/grpc v1.55.0/go.mod h1:iYEXKGkEBhg1PjZQvoYEVPTDkHo1/bjTnfwTeGONTY8= google.golang.org/grpc v1.56.2/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.0.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= +google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0 h1:M1YKkFIboKNieVO5DLUEVzQfGwJD30Nv2jfUgzb5UcE= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= @@ -2523,30 +3147,42 @@ google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqw google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U= +gopkg.in/alecthomas/kingpin.v2 v2.2.6 h1:jMFz6MfLP0/4fUyZle81rXUoxOBFi19VUFKVDOQfozc= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/bsm/ratelimit.v1 v1.0.0-20160220154919-db14e161995a/go.mod h1:KF9sEfUPAXdG8Oev9e99iLGnl2uJMjc5B+4y3O7x610= gopkg.in/cenkalti/backoff.v1 v1.1.0/go.mod h1:J6Vskwqd+OMVJl8C33mmtxTBs2gyzfv7UDAkHu8BrjI= gopkg.in/check.v1 v1.0.0-20141024133853-64131543e789/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= +gopkg.in/d4l3k/messagediff.v1 v1.2.1 h1:70AthpjunwzUiarMHyED52mj9UwtAnE89l1Gmrt3EU0= gopkg.in/d4l3k/messagediff.v1 v1.2.1/go.mod h1:EUzikiKadqXWcD1AzJLagx0j/BeeWGtn++04Xniyg44= +gopkg.in/errgo.v2 v2.1.0 h1:0vLT13EuvQ0hNvakwLuFZ/jYrLp5F3kcWHXdRggjCE8= +gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo= +gopkg.in/go-playground/assert.v1 v1.2.1 h1:xoYuJVE7KT85PYWrN730RguIQO0ePzVRfFMXadIrXTM= gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= +gopkg.in/go-playground/validator.v8 v8.18.2 h1:lFB4DoMU6B626w8ny76MV7VX6W2VHct2GVOI3xgiMrQ= gopkg.in/go-playground/validator.v8 v8.18.2/go.mod h1:RX2a/7Ha8BgOhfk7j780h4/u/RRjR0eouCJSH80/M2Y= gopkg.in/ini.v1 v1.51.1/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/jcmturner/aescts.v1 v1.0.1/go.mod h1:nsR8qBOg+OucoIW+WMhB3GspUQXq9XorLnQb9XtvcOo= gopkg.in/jcmturner/dnsutils.v1 v1.0.1/go.mod h1:m3v+5svpVOhtFAP/wSz+yzh4Mc0Fg7eRhxkJMWSIz9Q= gopkg.in/jcmturner/goidentity.v3 v3.0.0/go.mod h1:oG2kH0IvSYNIu80dVAyu/yoefjq1mNfM5bm88whjWx4= gopkg.in/jcmturner/gokrb5.v7 v7.5.0/go.mod h1:l8VISx+WGYp+Fp7KRbsiUuXTTOnxIc3Tuvyavf11/WM= gopkg.in/jcmturner/rpc.v1 v1.1.0/go.mod h1:YIdkC4XfD6GXbzje11McwsDuOlZQSb9W4vfLvuNnlv8= +gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce h1:xcEWjVhvbDy+nHP67nPDDpbYrY+ILlfndk4bRioVHaU= gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= +gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce h1:+JknDZhAj8YMt7GC73Ei8pv4MzjDUNPHgQWJdtMAaDU= +gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:5AcXVHNjg+BDxry382+8OKon8SEWiKktQR07RKPsv1c= gopkg.in/redis.v4 v4.2.4/go.mod h1:8KREHdypkCEojGKQcjMqAODMICIVwZAONWq8RowTITA= +gopkg.in/resty.v1 v1.12.0 h1:CuXP0Pjfw9rOuY6EP+UvtNvt5DSqHpIxILZKT/quCZI= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/square/go-jose.v2 v2.3.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= +gopkg.in/square/go-jose.v2 v2.5.1 h1:7odma5RETjNHWJnR32wx8t+Io4djHE1PqxCFx3iiZ2w= gopkg.in/square/go-jose.v2 v2.5.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= @@ -2557,20 +3193,25 @@ gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8= +gotest.tools/v3 v3.5.0 h1:Ljk6PdHdOhAb5aDMWXjDLMMhph+BpztA4v1QdqEW2eY= gotest.tools/v3 v3.5.0/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= gotest.tools/v3 v3.5.1/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= +grpc.go4.org v0.0.0-20170609214715-11d0a25b4919 h1:tmXTu+dfa+d9Evp8NpJdgOy6+rt8/x4yG7qPBrtNfLY= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +honnef.co/go/tools v0.5.0-0.dev.0.20231205170804-aef76f4feee2 h1:VUeHARd+9362HPYyFWjsRa6jBIAf2xWbDv6QXMRztbQ= honnef.co/go/tools v0.5.0-0.dev.0.20231205170804-aef76f4feee2/go.mod h1:J8YyqAvNy0yWpeKUOCONA1m2G4hH2CqUSo/5ZO2/5UA= k8s.io/api v0.20.0/go.mod h1:HyLC5l5eoS/ygQYl1BXBgFzWNlkHiAuyNAbevIn+FKg= k8s.io/api v0.20.1/go.mod h1:KqwcCVogGxQY3nBlRpwt+wpAMF/KjaCc7RpywacvqUo= k8s.io/api v0.20.4/go.mod h1:++lNL1AJMkDymriNniQsWRkMDzRaX2Y/POTUi8yvqYQ= k8s.io/api v0.20.6/go.mod h1:X9e8Qag6JV/bL5G6bU8sdVRltWKmdHsFUGS3eVndqE8= +k8s.io/api v0.22.5 h1:xk7C+rMjF/EGELiD560jdmwzrB788mfcHiNbMQLIVI8= k8s.io/apimachinery v0.20.1/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= k8s.io/apimachinery v0.20.4/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= k8s.io/apimachinery v0.20.6/go.mod h1:ejZXtW1Ra6V1O5H8xPBGz+T3+4gfkTCeExAHKU57MAc= k8s.io/apiserver v0.20.1/go.mod h1:ro5QHeQkgMS7ZGpvf4tSMx6bBOgPfE+f52KwvXfScaU= k8s.io/apiserver v0.20.4/go.mod h1:Mc80thBKOyy7tbvFtB4kJv1kbdD0eIH8k8vianJcbFM= k8s.io/apiserver v0.20.6/go.mod h1:QIJXNt6i6JB+0YQRNcS0hdRHJlMhflFmsBDeSgT1r8Q= +k8s.io/apiserver v0.22.5 h1:71krQxCUz218ecb+nPhfDsNB6QgP1/4EMvi1a2uYBlg= k8s.io/apiserver v0.22.5/go.mod h1:s2WbtgZAkTKt679sYtSudEQrTGWUSQAPe6MupLnlmaQ= k8s.io/client-go v0.20.1/go.mod h1:/zcHdt1TeWSd5HoUe6elJmHSQ6uLLgp4bIJHVEuy+/Y= k8s.io/client-go v0.20.4/go.mod h1:LiMv25ND1gLUdBeYxBIwKpkSC5IsozMMmOOeSJboP+k= @@ -2579,12 +3220,15 @@ k8s.io/code-generator v0.19.7/go.mod h1:lwEq3YnLYb/7uVXLorOJfxg+cUu2oihFhHZ0n9NI k8s.io/component-base v0.20.1/go.mod h1:guxkoJnNoh8LNrbtiQOlyp2Y2XFCZQmrcg2n/DeYNLk= k8s.io/component-base v0.20.4/go.mod h1:t4p9EdiagbVCJKrQ1RsA5/V4rFQNDfRlevJajlGwgjI= k8s.io/component-base v0.20.6/go.mod h1:6f1MPBAeI+mvuts3sIdtpjljHWBQ2cIy38oBIWMYnrM= +k8s.io/component-base v0.22.5 h1:U0eHqZm7mAFE42hFwYhY6ze/MmVaW00JpMrzVsQmzYE= k8s.io/component-base v0.22.5/go.mod h1:VK3I+TjuF9eaa+Ln67dKxhGar5ynVbwnGrUiNF4MqCI= k8s.io/cri-api v0.17.3/go.mod h1:X1sbHmuXhwaHs9xxYffLqJogVsnI+f6cPRcgPel7ywM= k8s.io/cri-api v0.20.1/go.mod h1:2JRbKt+BFLTjtrILYVqQK5jqhI+XNdF6UiGMgczeBCI= k8s.io/cri-api v0.20.4/go.mod h1:2JRbKt+BFLTjtrILYVqQK5jqhI+XNdF6UiGMgczeBCI= k8s.io/cri-api v0.20.6/go.mod h1:ew44AjNXwyn1s0U4xCKGodU7J1HzBeZ1MpGrpa5r8Yc= +k8s.io/cri-api v0.25.0 h1:INwdXsCDSA/0hGNdPxdE2dQD6ft/5K1EaKXZixvSQxg= k8s.io/cri-api v0.25.0/go.mod h1:J1rAyQkSJ2Q6I+aBMOVgg2/cbbebso6FNa0UagiR0kc= +k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac h1:sAvhNk5RRuc6FNYGqe7Ygz3PSo/2wGWbulskmzRX8Vs= k8s.io/gengo v0.0.0-20200428234225-8167cfdcfc14/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= k8s.io/gengo v0.0.0-20201113003025-83324d819ded/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= @@ -2592,14 +3236,22 @@ k8s.io/klog/v2 v2.4.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= k8s.io/klog/v2 v2.30.0/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= k8s.io/kube-openapi v0.0.0-20200805222855-6aeccd4b50c6/go.mod h1:UuqjUnNftUyPE5H64/qeyjQoUZhGpeFDVdxjTeEVN2o= k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd/go.mod h1:WOJ3KddDSol4tAGcJo0Tvi+dK12EcqSLqcWsryKMpfM= +k8s.io/kube-openapi v0.0.0-20211109043538-20434351676c h1:jvamsI1tn9V0S8jicyX82qaFC0H/NKxv2e5mbqsgR80= k8s.io/kubernetes v1.13.0/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk= lukechampine.com/blake3 v1.1.6/go.mod h1:tkKEOtDkNtklkXtLNEOGNq5tcV90tJiA1vAA12R78LA= +moul.io/http2curl/v2 v2.3.0 h1:9r3JfDzWPcbIklMOs2TnIFzDYvfAZvjeavG6EzP7jYs= moul.io/http2curl/v2 v2.3.0/go.mod h1:RW4hyBjTWSYDOxapodpNEtX0g5Eb16sxklBqmd2RHcE= nhooyr.io/websocket v1.8.7/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0= +rsc.io/binaryregexp v0.2.0 h1:HfqmD5MEmC0zvwBuF187nq9mdnXjXsSivRiXN7SmRkE= +rsc.io/pdf v0.1.1 h1:k1MczvYDUvJBe93bYd7wrZLLUEcLZAuF824/I4e5Xr4= rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= +rsc.io/quote/v3 v3.1.0 h1:9JKUTTIUgS6kzR9mK1YuGKv6Nl+DijDNIc0ghT58FaY= +rsc.io/sampler v1.3.0 h1:7uVkIFmeBqHfdjD+gZwtXXI+RODJ2Wc4O7MPEh/QiW4= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.14/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.15/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= sigs.k8s.io/structured-merge-diff/v4 v4.0.1/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= sigs.k8s.io/structured-merge-diff/v4 v4.0.3/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU= +sourcegraph.com/sourcegraph/go-diff v0.5.0 h1:eTiIR0CoWjGzJcnQ3OkhIl/b9GJovq4lSAVRt0ZFEG8= +sourcegraph.com/sqs/pbtypes v0.0.0-20180604144634-d3ebe8f20ae4 h1:JPJh2pk3+X4lXAkZIk2RuE/7/FoK9maXw+TNPJhVS/c= From daef1bb928b3ee137dd0df0d44b4e1c5d13294f5 Mon Sep 17 00:00:00 2001 From: Tanishq Jasoria Date: Wed, 15 Jan 2025 13:00:02 +0530 Subject: [PATCH 376/387] clients/nethermind: add 7623 transition timestamp to prague (#1209) --- clients/nethermind/mapper.jq | 1 + 1 file changed, 1 insertion(+) diff --git a/clients/nethermind/mapper.jq b/clients/nethermind/mapper.jq index 641f0d7246..3d6be5bfba 100644 --- a/clients/nethermind/mapper.jq +++ b/clients/nethermind/mapper.jq @@ -159,6 +159,7 @@ def clique_engine: "eip7251TransitionTimestamp": env.HIVE_PRAGUE_TIMESTAMP|to_hex, "eip7685TransitionTimestamp": env.HIVE_PRAGUE_TIMESTAMP|to_hex, "eip7702TransitionTimestamp": env.HIVE_PRAGUE_TIMESTAMP|to_hex, + "eip7623TransitionTimestamp": env.HIVE_PRAGUE_TIMESTAMP|to_hex, # Other chain parameters "networkID": env.HIVE_NETWORK_ID|to_hex, From 5beaebbc8c8287f29b6dcfc72e27c847608f2469 Mon Sep 17 00:00:00 2001 From: zhen peng <505380967@qq.com> Date: Thu, 16 Jan 2025 23:07:20 +0800 Subject: [PATCH 377/387] client/shisui: change docker image repo (#1210) feat: change shisui image repo --- clients/shisui/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clients/shisui/Dockerfile b/clients/shisui/Dockerfile index b97d5d8194..c17325a1a2 100644 --- a/clients/shisui/Dockerfile +++ b/clients/shisui/Dockerfile @@ -1,4 +1,4 @@ -ARG baseimage=ghcr.io/optimism-java/shisui +ARG baseimage=ghcr.io/zen-eth/shisui ARG tag=latest FROM $baseimage:$tag From 26f762e102c5b30ee77c2b6e3368d5e7f2914a13 Mon Sep 17 00:00:00 2001 From: Rafael Matias Date: Fri, 17 Jan 2025 20:28:03 +0100 Subject: [PATCH 378/387] hive: add flag to enable just docker build outputs to stderr (#1211) --- hive.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/hive.go b/hive.go index 12750a15ef..9747c395f0 100644 --- a/hive.go +++ b/hive.go @@ -47,6 +47,7 @@ func main() { dockerNoCache = flag.String("docker.nocache", "", "Regular `expression` selecting the docker images to forcibly rebuild.") dockerPull = flag.Bool("docker.pull", false, "Refresh base images when building images.") dockerOutput = flag.Bool("docker.output", false, "Relay all docker output to stderr.") + dockerBuildOutput = flag.Bool("docker.buildoutput", false, "Relay only docker build output to stderr.") simPattern = flag.String("sim", "", "Regular `expression` selecting the simulators to run.") simTestPattern = flag.String("sim.limit", "", "Regular `expression` selecting tests/suites (interpreted by simulators).") simParallelism = flag.Int("sim.parallelism", 1, "Max `number` of parallel clients/containers (interpreted by simulators).") @@ -125,6 +126,8 @@ func main() { if *dockerOutput { dockerConfig.ContainerOutput = os.Stderr dockerConfig.BuildOutput = os.Stderr + } else if *dockerBuildOutput { + dockerConfig.BuildOutput = os.Stderr } builder, cb, err := libdocker.Connect(*dockerEndpoint, dockerConfig) if err != nil { From c53209a0a72bf6a1e1359f2257e9858494394034 Mon Sep 17 00:00:00 2001 From: Parithosh Jayanthi Date: Mon, 20 Jan 2025 14:08:15 +0100 Subject: [PATCH 379/387] clients: add baseFeeUpdateFraction to the genesis files (#1215) --- clients/besu/mapper.jq | 3 ++- clients/erigon/mapper.jq | 3 ++- clients/ethereumjs/mapper.jq | 3 ++- clients/go-ethereum/mapper.jq | 3 ++- clients/nethermind/mapper.jq | 3 ++- clients/nimbus-el/mapper.jq | 3 ++- clients/reth/mapper.jq | 3 ++- 7 files changed, 14 insertions(+), 7 deletions(-) diff --git a/clients/besu/mapper.jq b/clients/besu/mapper.jq index 1dccaddae9..ca048f32f3 100644 --- a/clients/besu/mapper.jq +++ b/clients/besu/mapper.jq @@ -53,7 +53,8 @@ def to_int: "blobSchedule": { "prague": { "target": (if env.HIVE_PRAGUE_BLOB_TARGET then env.HIVE_PRAGUE_BLOB_TARGET|to_int else 6 end), - "max": (if env.HIVE_PRAGUE_BLOB_MAX then env.HIVE_PRAGUE_BLOB_MAX|to_int else 9 end) + "max": (if env.HIVE_PRAGUE_BLOB_MAX then env.HIVE_PRAGUE_BLOB_MAX|to_int else 9 end), + "baseFeeUpdateFraction": (if env.HIVE_PRAGUE_BLOB_BASE_FEE_UPDATE_FRACTION then env.HIVE_PRAGUE_BLOB_BASE_FEE_UPDATE_FRACTION|to_int else 5007716 end) } }, }|remove_empty diff --git a/clients/erigon/mapper.jq b/clients/erigon/mapper.jq index 9a2394491f..6bee6a8f6a 100644 --- a/clients/erigon/mapper.jq +++ b/clients/erigon/mapper.jq @@ -61,7 +61,8 @@ def to_bool: "blobSchedule": { "prague": { "target": (if env.HIVE_PRAGUE_BLOB_TARGET then env.HIVE_PRAGUE_BLOB_TARGET|to_int else 6 end), - "max": (if env.HIVE_PRAGUE_BLOB_MAX then env.HIVE_PRAGUE_BLOB_MAX|to_int else 9 end) + "max": (if env.HIVE_PRAGUE_BLOB_MAX then env.HIVE_PRAGUE_BLOB_MAX|to_int else 9 end), + "baseFeeUpdateFraction": (if env.HIVE_PRAGUE_BLOB_BASE_FEE_UPDATE_FRACTION then env.HIVE_PRAGUE_BLOB_BASE_FEE_UPDATE_FRACTION|to_int else 5007716 end) } }, }|remove_empty diff --git a/clients/ethereumjs/mapper.jq b/clients/ethereumjs/mapper.jq index 5a76e56aa4..21e8ecd469 100644 --- a/clients/ethereumjs/mapper.jq +++ b/clients/ethereumjs/mapper.jq @@ -76,7 +76,8 @@ def pad_storage_keys: "blobSchedule": { "prague": { "target": (if env.HIVE_PRAGUE_BLOB_TARGET then env.HIVE_PRAGUE_BLOB_TARGET|to_int else 6 end), - "max": (if env.HIVE_PRAGUE_BLOB_MAX then env.HIVE_PRAGUE_BLOB_MAX|to_int else 9 end) + "max": (if env.HIVE_PRAGUE_BLOB_MAX then env.HIVE_PRAGUE_BLOB_MAX|to_int else 9 end), + "baseFeeUpdateFraction": (if env.HIVE_PRAGUE_BLOB_BASE_FEE_UPDATE_FRACTION then env.HIVE_PRAGUE_BLOB_BASE_FEE_UPDATE_FRACTION|to_int else 5007716 end) } }, } diff --git a/clients/go-ethereum/mapper.jq b/clients/go-ethereum/mapper.jq index 3b6fa2819e..3fb306b104 100644 --- a/clients/go-ethereum/mapper.jq +++ b/clients/go-ethereum/mapper.jq @@ -61,7 +61,8 @@ def to_bool: "blobSchedule": { "prague": { "target": (if env.HIVE_PRAGUE_BLOB_TARGET then env.HIVE_PRAGUE_BLOB_TARGET|to_int else 6 end), - "max": (if env.HIVE_PRAGUE_BLOB_MAX then env.HIVE_PRAGUE_BLOB_MAX|to_int else 9 end) + "max": (if env.HIVE_PRAGUE_BLOB_MAX then env.HIVE_PRAGUE_BLOB_MAX|to_int else 9 end), + "baseFeeUpdateFraction": (if env.HIVE_PRAGUE_BLOB_BASE_FEE_UPDATE_FRACTION then env.HIVE_PRAGUE_BLOB_BASE_FEE_UPDATE_FRACTION|to_int else 5007716 end) } }, "depositContractAddress": "0x00000000219ab540356cBB839Cbe05303d7705Fa" diff --git a/clients/nethermind/mapper.jq b/clients/nethermind/mapper.jq index 3d6be5bfba..f23ffd4655 100644 --- a/clients/nethermind/mapper.jq +++ b/clients/nethermind/mapper.jq @@ -168,7 +168,8 @@ def clique_engine: "blobSchedule": { "prague": { "target": (if env.HIVE_PRAGUE_BLOB_TARGET then env.HIVE_PRAGUE_BLOB_TARGET|to_hex else "0x6" end), - "max": (if env.HIVE_PRAGUE_BLOB_MAX then env.HIVE_PRAGUE_BLOB_MAX|to_hex else "0x9" end) + "max": (if env.HIVE_PRAGUE_BLOB_MAX then env.HIVE_PRAGUE_BLOB_MAX|to_hex else "0x9" end), + "baseFeeUpdateFraction": (if env.HIVE_PRAGUE_BLOB_BASE_FEE_UPDATE_FRACTION then env.HIVE_PRAGUE_BLOB_BASE_FEE_UPDATE_FRACTION|to_hex else "0x4c6964" end) } }, }, diff --git a/clients/nimbus-el/mapper.jq b/clients/nimbus-el/mapper.jq index 7e5b3d378c..9fa27ccf46 100644 --- a/clients/nimbus-el/mapper.jq +++ b/clients/nimbus-el/mapper.jq @@ -81,7 +81,8 @@ def to_bool: "blobSchedule": { "prague": { "target": (if env.HIVE_PRAGUE_BLOB_TARGET then env.HIVE_PRAGUE_BLOB_TARGET|to_int else 6 end), - "max": (if env.HIVE_PRAGUE_BLOB_MAX then env.HIVE_PRAGUE_BLOB_MAX|to_int else 9 end) + "max": (if env.HIVE_PRAGUE_BLOB_MAX then env.HIVE_PRAGUE_BLOB_MAX|to_int else 9 end), + "baseFeeUpdateFraction": (if env.HIVE_PRAGUE_BLOB_BASE_FEE_UPDATE_FRACTION then env.HIVE_PRAGUE_BLOB_BASE_FEE_UPDATE_FRACTION|to_int else 5007716 end) } }, "terminalTotalDifficultyPassed": true, diff --git a/clients/reth/mapper.jq b/clients/reth/mapper.jq index 97571131b1..aa9c6e0633 100644 --- a/clients/reth/mapper.jq +++ b/clients/reth/mapper.jq @@ -61,7 +61,8 @@ def to_bool: "blobSchedule": { "prague": { "target": (if env.HIVE_PRAGUE_BLOB_TARGET then env.HIVE_PRAGUE_BLOB_TARGET|to_int else 6 end), - "max": (if env.HIVE_PRAGUE_BLOB_MAX then env.HIVE_PRAGUE_BLOB_MAX|to_int else 9 end) + "max": (if env.HIVE_PRAGUE_BLOB_MAX then env.HIVE_PRAGUE_BLOB_MAX|to_int else 9 end), + "baseFeeUpdateFraction": (if env.HIVE_PRAGUE_BLOB_BASE_FEE_UPDATE_FRACTION then env.HIVE_PRAGUE_BLOB_BASE_FEE_UPDATE_FRACTION|to_int else 5007716 end) } }, }|remove_empty From 7910caeacba62a7172fd98dbe73322724c146297 Mon Sep 17 00:00:00 2001 From: MaxweLL22-22 Date: Mon, 20 Jan 2025 14:21:51 +0100 Subject: [PATCH 380/387] internal/libdocker: fix typo in comment (#1212) --- internal/libdocker/builder.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/libdocker/builder.go b/internal/libdocker/builder.go index 9294da7e1f..135ce715c0 100644 --- a/internal/libdocker/builder.go +++ b/internal/libdocker/builder.go @@ -209,7 +209,7 @@ func (b *Builder) ReadFile(ctx context.Context, image, path string) ([]byte, err } // buildImage builds a single docker image from the specified context. -// branch specifes a build argument to use a specific base image branch or github source branch. +// branch specifies a build argument to use a specific base image branch or github source branch. func (b *Builder) buildImage(ctx context.Context, contextDir, dockerFile, imageTag string, buildArgs map[string]string) error { logger := b.logger.With("image", imageTag) context, err := filepath.Abs(contextDir) From 54fb5697e0fcafcf6ba9f87fdc8b557b2bea0231 Mon Sep 17 00:00:00 2001 From: Kolby Moroz Liebl <31669092+KolbyML@users.noreply.github.com> Date: Mon, 20 Jan 2025 22:27:29 -0700 Subject: [PATCH 381/387] clients/trin: add Dockerfile support to build Trin from git (#1217) --- clients/trin/Dockerfile | 3 ++- clients/trin/Dockerfile.git | 37 ++++++++++++++++++++++++++++++++++++ clients/trin/trin_version.sh | 7 ------- 3 files changed, 39 insertions(+), 8 deletions(-) create mode 100644 clients/trin/Dockerfile.git delete mode 100644 clients/trin/trin_version.sh diff --git a/clients/trin/Dockerfile b/clients/trin/Dockerfile index 7b3424019e..ab901d2061 100644 --- a/clients/trin/Dockerfile +++ b/clients/trin/Dockerfile @@ -9,7 +9,8 @@ RUN chmod +x /trin.sh ADD trin_version.sh /trin_version.sh RUN chmod +x /trin_version.sh -RUN /trin_version.sh > /version.txt +# Create version.txt +RUN /usr/bin/trin --version | head -1 > /version.txt # Export the usual networking ports to allow outside access to the node EXPOSE 8545 9009/udp diff --git a/clients/trin/Dockerfile.git b/clients/trin/Dockerfile.git new file mode 100644 index 0000000000..3ecbe4b85a --- /dev/null +++ b/clients/trin/Dockerfile.git @@ -0,0 +1,37 @@ + +### Build Trin From Git: +## Pulls trin from a git repository and builds it from source. + +## Builder stage: Compiles trin from a git repository +FROM rust:latest AS builder + +ARG github=ethereum/trin +ARG tag=master + +RUN apt-get update && apt-get install -y libclang-dev pkg-config build-essential \ + && echo "Cloning: $github - $tag" \ + && git clone https://github.com/$github trin \ + && cd trin \ + && git checkout $tag \ + && cargo build --release \ + && cp target/release/trin /usr/local/bin/trin + +## Final stage: Sets up the environment for running trin +FROM debian:latest +RUN apt-get update && apt-get install -y bash curl jq \ + && apt-get clean && rm -rf /var/lib/apt/lists/* + +# Copy compiled binary from builder +COPY --from=builder /usr/local/bin/trin /usr/local/bin/trin + +# Inject the startup script. +COPY trin.sh /trin.sh +RUN chmod +x /trin.sh + +# Create version.txt +RUN /usr/local/bin/trin --version | head -1 > /version.txt + +# Export the usual networking ports to allow outside access to the node +EXPOSE 8545 9009/udp + +ENTRYPOINT ["/trin.sh"] diff --git a/clients/trin/trin_version.sh b/clients/trin/trin_version.sh deleted file mode 100644 index b29ff5a658..0000000000 --- a/clients/trin/trin_version.sh +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/bash - -# Immediately abort the script on any error encountered -set -e - -#trin --version | tail -1 | sed "s/ /\//g" -echo "latest" From 17e0070313feb5f6e449ea783480150c4c918046 Mon Sep 17 00:00:00 2001 From: Somnath Date: Tue, 21 Jan 2025 22:51:58 +0400 Subject: [PATCH 382/387] clients/erigon: Add deposit contract to mapper jq (#1221) --- clients/erigon/mapper.jq | 1 + 1 file changed, 1 insertion(+) diff --git a/clients/erigon/mapper.jq b/clients/erigon/mapper.jq index 6bee6a8f6a..97d65ffa2d 100644 --- a/clients/erigon/mapper.jq +++ b/clients/erigon/mapper.jq @@ -65,5 +65,6 @@ def to_bool: "baseFeeUpdateFraction": (if env.HIVE_PRAGUE_BLOB_BASE_FEE_UPDATE_FRACTION then env.HIVE_PRAGUE_BLOB_BASE_FEE_UPDATE_FRACTION|to_int else 5007716 end) } }, + "depositContractAddress": "0x00000000219ab540356cBB839Cbe05303d7705Fa" }|remove_empty } From 34ee7d306dac791b86dff5e75db614a4339cf89a Mon Sep 17 00:00:00 2001 From: Mario Vega Date: Tue, 21 Jan 2025 15:20:03 -0600 Subject: [PATCH 383/387] internal/libhive: add instance information endpoint to simulation API (#1198) --- hive.go | 8 ++++++-- hivesim/hive_test.go | 5 ++++- internal/libhive/api.go | 12 ++++++++++-- internal/libhive/inventory.go | 8 ++++---- internal/libhive/run.go | 12 ++++++------ internal/libhive/run_test.go | 2 +- internal/libhive/testmanager.go | 17 +++++++++++++++-- 7 files changed, 46 insertions(+), 18 deletions(-) diff --git a/hive.go b/hive.go index 9747c395f0..7e228e353a 100644 --- a/hive.go +++ b/hive.go @@ -174,20 +174,24 @@ func main() { clientList = libhive.FilterClients(clientList, filter) } } + hiveInfo := libhive.HiveInfo{ + Command: os.Args, + ClientFile: clientList, + } // Build clients and simulators. if err := runner.Build(ctx, clientList, simList, simBuildArgs); err != nil { fatal(err) } if *simDevMode { - runner.RunDevMode(ctx, env, *simDevModeAPIEndpoint) + runner.RunDevMode(ctx, env, *simDevModeAPIEndpoint, hiveInfo) return } // Run simulators. var failCount int for _, sim := range simList { - result, err := runner.Run(ctx, sim, env) + result, err := runner.Run(ctx, sim, env, hiveInfo) if err != nil { fatal(err) } diff --git a/hivesim/hive_test.go b/hivesim/hive_test.go index 0a76b6f491..c959ee395e 100644 --- a/hivesim/hive_test.go +++ b/hivesim/hive_test.go @@ -407,7 +407,10 @@ func newFakeAPI(hooks *fakes.BackendHooks) (*libhive.TestManager, *httptest.Serv } env := libhive.SimEnv{} backend := fakes.NewContainerBackend(hooks) - tm := libhive.NewTestManager(env, backend, defs) + hiveInfo := libhive.HiveInfo{ + Command: []string{"/hive"}, + } + tm := libhive.NewTestManager(env, backend, defs, hiveInfo) srv := httptest.NewServer(tm.API()) return tm, srv } diff --git a/internal/libhive/api.go b/internal/libhive/api.go index 3bbbbbf647..62fecbb00e 100644 --- a/internal/libhive/api.go +++ b/internal/libhive/api.go @@ -27,11 +27,12 @@ const hiveEnvvarPrefix = "HIVE_" const defaultStartTimeout = time.Duration(60 * time.Second) // newSimulationAPI creates handlers for the simulation API. -func newSimulationAPI(b ContainerBackend, env SimEnv, tm *TestManager) http.Handler { - api := &simAPI{backend: b, env: env, tm: tm} +func newSimulationAPI(b ContainerBackend, env SimEnv, tm *TestManager, hive HiveInfo) http.Handler { + api := &simAPI{backend: b, env: env, tm: tm, hive: hive} // API routes. router := mux.NewRouter() + router.HandleFunc("/hive", api.getHiveInfo).Methods("GET") router.HandleFunc("/clients", api.getClientTypes).Methods("GET") router.HandleFunc("/testsuite/{suite}/test/{test}/node/{node}/exec", api.execInClient).Methods("POST") router.HandleFunc("/testsuite/{suite}/test/{test}/node/{node}", api.getNodeStatus).Methods("GET") @@ -56,6 +57,13 @@ type simAPI struct { backend ContainerBackend env SimEnv tm *TestManager + hive HiveInfo +} + +// getHiveInfo returns information about the hive server instance. +func (api *simAPI) getHiveInfo(w http.ResponseWriter, r *http.Request) { + slog.Info("API: hive info requested") + serveJSON(w, api.hive) } // getClientTypes returns all known client types. diff --git a/internal/libhive/inventory.go b/internal/libhive/inventory.go index 42302dfa79..3376d665a8 100644 --- a/internal/libhive/inventory.go +++ b/internal/libhive/inventory.go @@ -183,19 +183,19 @@ func loadClientMetadata(path string) (m ClientMetadata, err error) { type ClientDesignator struct { // Client is the client name. // This must refer to a subdirectory of clients/ - Client string `yaml:"client"` + Client string `yaml:"client" json:"client"` // Nametag is used in the name of the client image. // This is for assigning meaningful names to different builds of the same client. // If unspecified, a default value is chosen to make client names unique. - Nametag string `yaml:"nametag,omitempty"` + Nametag string `yaml:"nametag,omitempty" json:"nametag,omitempty"` // DockerfileExt is the extension of the Docker that should be used to build the // client. Example: setting this to "git" will build using "Dockerfile.git". - DockerfileExt string `yaml:"dockerfile,omitempty"` + DockerfileExt string `yaml:"dockerfile,omitempty" json:"dockerfile,omitempty"` // Arguments passed to the docker build. - BuildArgs map[string]string `yaml:"build_args,omitempty"` + BuildArgs map[string]string `yaml:"build_args,omitempty" json:"build_args,omitempty"` } func (c ClientDesignator) buildString() string { diff --git a/internal/libhive/run.go b/internal/libhive/run.go index 7e4270d863..daa6b6099d 100644 --- a/internal/libhive/run.go +++ b/internal/libhive/run.go @@ -99,12 +99,12 @@ func (r *Runner) buildSimulators(ctx context.Context, simList []string, buildArg return nil } -func (r *Runner) Run(ctx context.Context, sim string, env SimEnv) (SimResult, error) { +func (r *Runner) Run(ctx context.Context, sim string, env SimEnv, hiveInfo HiveInfo) (SimResult, error) { if err := createWorkspace(env.LogDir); err != nil { return SimResult{}, err } writeInstanceInfo(env.LogDir) - return r.run(ctx, sim, env) + return r.run(ctx, sim, env, hiveInfo) } // RunDevMode starts simulator development mode. In this mode, the simulator is not @@ -112,7 +112,7 @@ func (r *Runner) Run(ctx context.Context, sim string, env SimEnv) (SimResult, er // on the docker network. // // Note: Sim* options in env are ignored, but Client* options and LogDir still apply. -func (r *Runner) RunDevMode(ctx context.Context, env SimEnv, endpoint string) error { +func (r *Runner) RunDevMode(ctx context.Context, env SimEnv, endpoint string, hiveInfo HiveInfo) error { if err := createWorkspace(env.LogDir); err != nil { return err } @@ -120,7 +120,7 @@ func (r *Runner) RunDevMode(ctx context.Context, env SimEnv, endpoint string) er for _, def := range r.clientDefs { clientDefs = append(clientDefs, def) } - tm := NewTestManager(env, r.container, clientDefs) + tm := NewTestManager(env, r.container, clientDefs, hiveInfo) defer func() { if err := tm.Terminate(); err != nil { slog.Error("could not terminate test manager", "error", err) @@ -158,7 +158,7 @@ HIVE_SIMULATOR=http://%v } // run runs one simulation. -func (r *Runner) run(ctx context.Context, sim string, env SimEnv) (SimResult, error) { +func (r *Runner) run(ctx context.Context, sim string, env SimEnv, hiveInfo HiveInfo) (SimResult, error) { slog.Info(fmt.Sprintf("running simulation: %s", sim)) clientDefs := make([]*ClientDefinition, 0) @@ -182,7 +182,7 @@ func (r *Runner) run(ctx context.Context, sim string, env SimEnv) (SimResult, er } // Start the simulation API. - tm := NewTestManager(env, r.container, clientDefs) + tm := NewTestManager(env, r.container, clientDefs, hiveInfo) defer func() { if err := tm.Terminate(); err != nil { slog.Error("could not terminate test manager", "error", err) diff --git a/internal/libhive/run_test.go b/internal/libhive/run_test.go index 31899cb5ea..374ae5fd66 100644 --- a/internal/libhive/run_test.go +++ b/internal/libhive/run_test.go @@ -52,7 +52,7 @@ func TestRunner(t *testing.T) { if err := runner.Build(ctx, allClients, simList, buildArgs); err != nil { t.Fatal("Build() failed:", err) } - if _, err := runner.Run(context.Background(), "sim-1", simOpt); err != nil { + if _, err := runner.Run(context.Background(), "sim-1", simOpt, libhive.HiveInfo{}); err != nil { t.Fatal("Run() failed:", err) } diff --git a/internal/libhive/testmanager.go b/internal/libhive/testmanager.go index 4f54052d64..347f29058f 100644 --- a/internal/libhive/testmanager.go +++ b/internal/libhive/testmanager.go @@ -58,11 +58,20 @@ type SimResult struct { TestsFailed int } +// HiveInfo contains information about the hive instance running the simulation. +type HiveInfo struct { + Command []string `json:"command"` + ClientFile []ClientDesignator `json:"clientFile"` + Commit string `json:"commit"` + Date string `json:"date"` +} + // TestManager collects test results during a simulation run. type TestManager struct { config SimEnv backend ContainerBackend clientDefs []*ClientDefinition + hiveInfo HiveInfo simContainerID string simLogFile string @@ -81,11 +90,15 @@ type TestManager struct { results map[TestSuiteID]*TestSuite } -func NewTestManager(config SimEnv, b ContainerBackend, clients []*ClientDefinition) *TestManager { +func NewTestManager(config SimEnv, b ContainerBackend, clients []*ClientDefinition, hiveInfo HiveInfo) *TestManager { + if hiveInfo.Commit == "" && hiveInfo.Date == "" { + hiveInfo.Commit, hiveInfo.Date = hiveVersion() + } return &TestManager{ clientDefs: clients, config: config, backend: b, + hiveInfo: hiveInfo, runningTestSuites: make(map[TestSuiteID]*TestSuite), runningTestCases: make(map[TestID]*TestCase), results: make(map[TestSuiteID]*TestSuite), @@ -115,7 +128,7 @@ func (manager *TestManager) Results() map[TestSuiteID]*TestSuite { // API returns the simulation API handler. func (manager *TestManager) API() http.Handler { - return newSimulationAPI(manager.backend, manager.config, manager) + return newSimulationAPI(manager.backend, manager.config, manager, manager.hiveInfo) } // IsTestSuiteRunning checks if the test suite is still running and returns it if so From 49fefe2c78ed34398644862086828ca435bd52e3 Mon Sep 17 00:00:00 2001 From: Kolby Moroz Liebl <31669092+KolbyML@users.noreply.github.com> Date: Tue, 21 Jan 2025 18:06:56 -0700 Subject: [PATCH 384/387] clients/fluffy: add Dockerfile support to build Fluffy from git (#1218) --- clients/fluffy/Dockerfile.git | 45 +++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 clients/fluffy/Dockerfile.git diff --git a/clients/fluffy/Dockerfile.git b/clients/fluffy/Dockerfile.git new file mode 100644 index 0000000000..bd9b53759c --- /dev/null +++ b/clients/fluffy/Dockerfile.git @@ -0,0 +1,45 @@ +### Build Fluffy From Git: +## Pulls fluffy from a git repository and builds it from source. + +## Builder stage: Compiles fluffy from a git repository +FROM debian:buster-slim AS builder + +ARG github=status-im/nimbus-eth1 +ARG tag=master +ENV NPROC=2 +ENV NIMFLAGS_COMMON="-d:disableMarchNative --gcc.options.debug:'-g1' --clang.options.debug:'-gline-tables-only'" + +RUN apt-get update \ + && apt-get install -y --fix-missing build-essential make git \ + && apt-get clean \ + && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* + +RUN echo "Cloning: $github - $tag" \ + && git clone https://github.com/$github nimbus-eth1 \ + && cd nimbus-eth1 \ + && git checkout $tag \ + && make -j${NPROC} NIMFLAGS="${NIMFLAGS_COMMON} --parallelBuild:${NPROC}" V=1 update + +RUN cd nimbus-eth1 && \ + make -j${NPROC} NIMFLAGS="${NIMFLAGS_COMMON} --parallelBuild:${NPROC}" fluffy && \ + mv build/fluffy /usr/bin/ + +## Final stage: Sets up the environment for running fluffy +FROM debian:buster-slim +RUN apt-get update && apt-get install -y bash curl jq \ + && apt-get clean && rm -rf /var/lib/apt/lists/* + +# Copy compiled binary from builder +COPY --from=builder /usr/bin/fluffy /usr/bin/fluffy + +# Inject the startup script. +ADD fluffy.sh /fluffy.sh +RUN chmod +x /fluffy.sh + +# Create version.txt +RUN echo "latest" > /version.txt + +# Export the usual networking ports to allow outside access to the node +EXPOSE 8545 9009/udp + +ENTRYPOINT ["/fluffy.sh"] From d25a713c88151a8805b513453a11ed4c3c97ff84 Mon Sep 17 00:00:00 2001 From: Kolby Moroz Liebl <31669092+KolbyML@users.noreply.github.com> Date: Tue, 21 Jan 2025 18:07:06 -0700 Subject: [PATCH 385/387] clients/ultralight: add Dockerfile support to build Ultralight from git (#1219) --- clients/trin/Dockerfile.git | 4 ++-- clients/ultralight/Dockerfile.git | 32 +++++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 2 deletions(-) create mode 100644 clients/ultralight/Dockerfile.git diff --git a/clients/trin/Dockerfile.git b/clients/trin/Dockerfile.git index 3ecbe4b85a..f400a91dcc 100644 --- a/clients/trin/Dockerfile.git +++ b/clients/trin/Dockerfile.git @@ -22,14 +22,14 @@ RUN apt-get update && apt-get install -y bash curl jq \ && apt-get clean && rm -rf /var/lib/apt/lists/* # Copy compiled binary from builder -COPY --from=builder /usr/local/bin/trin /usr/local/bin/trin +COPY --from=builder /usr/local/bin/trin /usr/bin/trin # Inject the startup script. COPY trin.sh /trin.sh RUN chmod +x /trin.sh # Create version.txt -RUN /usr/local/bin/trin --version | head -1 > /version.txt +RUN /usr/bin/trin --version | head -1 > /version.txt # Export the usual networking ports to allow outside access to the node EXPOSE 8545 9009/udp diff --git a/clients/ultralight/Dockerfile.git b/clients/ultralight/Dockerfile.git new file mode 100644 index 0000000000..deba7e3c0d --- /dev/null +++ b/clients/ultralight/Dockerfile.git @@ -0,0 +1,32 @@ + +### Build Ultralight From Git: +## Pulls ultralight from a git repository and builds it from source. + +## Builder stage: Compiles ultralight from a git repository +FROM node:20-alpine + +RUN apk update && apk add --no-cache bash g++ make git python3 && rm -rf /var/cache/apk/* +RUN apk add --virtual .build-deps alpine-sdk jq + +RUN ln -s /lib/libc.musl-x86_64.so.1 /lib/ld-linux-x86-64.so.2 + +ARG github=ethereumjs/ultralight +ARG tag=master + +RUN echo "Cloning: $github - $tag" \ + && git clone https://github.com/$github ultralight \ + && cd ultralight \ + && git checkout $tag \ + && npm i + +# Inject the startup script. +COPY ultralight.sh /ultralight.sh +RUN chmod +x /ultralight.sh + +# Create version.txt +RUN echo "latest" > /version.txt + +# Export the usual networking ports to allow outside access to the node +EXPOSE 8545 9000/udp + +ENTRYPOINT ["/ultralight.sh"] From dbc4dd781d0d01758220c00ba26105abee524e2e Mon Sep 17 00:00:00 2001 From: Kolby Moroz Liebl <31669092+KolbyML@users.noreply.github.com> Date: Tue, 21 Jan 2025 18:07:14 -0700 Subject: [PATCH 386/387] clients/shisui: add Dockerfile support to build Shisui from git (#1220) --- clients/shisui/Dockerfile | 2 ++ clients/shisui/Dockerfile.git | 36 +++++++++++++++++++++++++++++++++++ clients/shisui/shisui.sh | 2 +- 3 files changed, 39 insertions(+), 1 deletion(-) create mode 100644 clients/shisui/Dockerfile.git diff --git a/clients/shisui/Dockerfile b/clients/shisui/Dockerfile index c17325a1a2..eccd8ccdbe 100644 --- a/clients/shisui/Dockerfile +++ b/clients/shisui/Dockerfile @@ -5,6 +5,8 @@ FROM $baseimage:$tag RUN echo "latest" > /version.txt +RUN mv /usr/local/bin/app /usr/local/bin/shisui + ADD shisui.sh /shisui.sh RUN chmod +x /shisui.sh diff --git a/clients/shisui/Dockerfile.git b/clients/shisui/Dockerfile.git new file mode 100644 index 0000000000..b7167814cc --- /dev/null +++ b/clients/shisui/Dockerfile.git @@ -0,0 +1,36 @@ +### Build Shisui From Git: +## Pulls shisui from a git repository and builds it from source. + +## Builder stage: Compiles shisui from a git repository +FROM golang:1.23 AS builder + +ARG github=zen-eth/shisui +ARG tag=main + +RUN apt-get update && apt-get install -y libclang-dev pkg-config build-essential \ + && echo "Cloning: $github - $tag" \ + && git clone https://github.com/$github shisui \ + && cd shisui \ + && git checkout $tag \ + && make shisui \ + && cp build/bin/shisui /usr/local/bin/shisui + +## Final stage: Sets up the environment for running shisui +FROM debian:latest +RUN apt-get update && apt-get install -y bash curl jq \ + && apt-get clean && rm -rf /var/lib/apt/lists/* + +# Copy compiled binary from builder +COPY --from=builder /usr/local/bin/shisui /usr/bin/shisui + +# Inject the startup script. +ADD shisui.sh /shisui.sh +RUN chmod +x /shisui.sh + +# Create version.txt +RUN echo "latest" > /version.txt + +# Export the usual networking ports to allow outside access to the node +EXPOSE 8545 9009/udp + +ENTRYPOINT ["/shisui.sh"] diff --git a/clients/shisui/shisui.sh b/clients/shisui/shisui.sh index acc7f12cf5..231688f156 100644 --- a/clients/shisui/shisui.sh +++ b/clients/shisui/shisui.sh @@ -28,5 +28,5 @@ fi FLAGS="$FLAGS --nat extip:$IP_ADDR" -app $FLAGS +shisui $FLAGS From 1e9ba28ba6989070dd60ed506167011e495a9a5a Mon Sep 17 00:00:00 2001 From: Kolby Moroz Liebl <31669092+KolbyML@users.noreply.github.com> Date: Wed, 22 Jan 2025 06:31:20 -0700 Subject: [PATCH 387/387] clients/trin-bridge: add Dockerfile support to build Trin Bridge from git (#1222) --- clients/trin-bridge/Dockerfile | 5 +-- clients/trin-bridge/Dockerfile.git | 45 ++++++++++++++++++++++ clients/trin-bridge/trin_bridge_version.sh | 7 ---- 3 files changed, 46 insertions(+), 11 deletions(-) create mode 100644 clients/trin-bridge/Dockerfile.git delete mode 100644 clients/trin-bridge/trin_bridge_version.sh diff --git a/clients/trin-bridge/Dockerfile b/clients/trin-bridge/Dockerfile index 4a5a468330..f9daa64144 100644 --- a/clients/trin-bridge/Dockerfile +++ b/clients/trin-bridge/Dockerfile @@ -7,10 +7,7 @@ ADD https://raw.githubusercontent.com/ethereum/portal-spec-tests/master/tests/ma ADD trin_bridge.sh /trin_bridge.sh RUN chmod +x /trin_bridge.sh -ADD trin_bridge_version.sh /trin_bridge_version.sh -RUN chmod +x /trin_bridge_version.sh - -RUN /trin_bridge_version.sh > /version.txt +RUN echo "latest" > /version.txt # Export the usual networking ports to allow outside access to the node EXPOSE 8545 9009/udp diff --git a/clients/trin-bridge/Dockerfile.git b/clients/trin-bridge/Dockerfile.git new file mode 100644 index 0000000000..90a96eb8c7 --- /dev/null +++ b/clients/trin-bridge/Dockerfile.git @@ -0,0 +1,45 @@ + +### Build Trin Bridge From Git: +## Pulls trin bridge from a git repository and builds it from source. + +## Builder stage: Compiles trin bridge from a git repository +FROM rust:latest AS builder + +ARG github=ethereum/trin +ARG tag=master + +RUN apt-get update && apt-get install -y libclang-dev pkg-config build-essential \ + && echo "Cloning: $github - $tag" \ + && git clone https://github.com/$github trin \ + && cd trin \ + && git checkout $tag \ + && cargo build -p trin -p portal-bridge --release \ + && cp target/release/trin /usr/local/bin/trin \ + && cp target/release/portal-bridge /usr/local/bin/portal-bridge + +## Final stage: Sets up the environment for running trin +FROM debian:latest +RUN apt-get update && apt-get install -y bash curl jq \ + && apt-get clean && rm -rf /var/lib/apt/lists/* + +# Copy compiled binary from builder +COPY --from=builder /usr/local/bin/trin /usr/bin/trin +COPY --from=builder /usr/local/bin/portal-bridge /usr/bin/portal-bridge +COPY --from=builder /trin/bin/trin-execution/resources /resources + +# Inject the startup script. +ADD https://raw.githubusercontent.com/ethereum/portal-spec-tests/master/tests/mainnet/history/hive/test_data_collection_of_forks_blocks.yaml /test_data_collection_of_forks_blocks.yaml +COPY trin_bridge.sh /trin_bridge.sh +RUN chmod +x /trin_bridge.sh + +# Create version.txt +RUN echo "latest" > /version.txt + +# Export the usual networking ports to allow outside access to the node +EXPOSE 8545 9009/udp + +# add fake secrets for bridge activation +ENV PANDAOPS_CLIENT_ID=xxx +ENV PANDAOPS_CLIENT_SECRET=xxx + +ENTRYPOINT ["/trin_bridge.sh"] diff --git a/clients/trin-bridge/trin_bridge_version.sh b/clients/trin-bridge/trin_bridge_version.sh deleted file mode 100644 index b29ff5a658..0000000000 --- a/clients/trin-bridge/trin_bridge_version.sh +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/bash - -# Immediately abort the script on any error encountered -set -e - -#trin --version | tail -1 | sed "s/ /\//g" -echo "latest"
  • ->bWBx$>8aMB|t+hnqG7nEgb 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%0AFUF8G^Yj!M;;PI0UG&g3 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